{"ok":true,"version":"0d88346362d2","files":{"runtime/package-lock.json":"{\n  \"name\": \"bottly-bot-runtime\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"bottly-bot-runtime\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"@napi-rs/canvas\": \"0.1.80\",\n        \"discord.js\": \"14.27.0\",\n        \"pg\": \"8.23.1\",\n        \"quickjs-emscripten\": \"0.31.0\"\n      },\n      \"devDependencies\": {\n        \"@types/node\": \"22.16.5\",\n        \"@types/pg\": \"8.23.1\",\n        \"typescript\": \"5.8.3\"\n      },\n      \"engines\": {\n        \"node\": \">=20.11.0\"\n      }\n    },\n    \"node_modules/@discordjs/builders\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/@discordjs/builders/-/builders-1.14.1.tgz\",\n      \"integrity\": \"sha512-gSKkhXLqs96TCzk66VZuHHl8z2bQMJFGwrXC0f33ngK+FLNau4hU1PYny3DNJfNdSH+gVMzE85/d5FQ2BpcNwQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@discordjs/formatters\": \"^0.6.2\",\n        \"@discordjs/util\": \"^1.2.0\",\n        \"@sapphire/shapeshift\": \"^4.0.0\",\n        \"discord-api-types\": \"^0.38.40\",\n        \"fast-deep-equal\": \"^3.1.3\",\n        \"ts-mixer\": \"^6.0.4\",\n        \"tslib\": \"^2.6.3\"\n      },\n      \"engines\": {\n        \"node\": \">=16.11.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/discordjs/discord.js?sponsor\"\n      }\n    },\n    \"node_modules/@discordjs/collection\": {\n      \"version\": \"1.5.3\",\n      \"resolved\": \"https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz\",\n      \"integrity\": \"sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"node\": \">=16.11.0\"\n      }\n    },\n    \"node_modules/@discordjs/formatters\": {\n      \"version\": \"0.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.2.tgz\",\n      \"integrity\": \"sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"discord-api-types\": \"^0.38.33\"\n      },\n      \"engines\": {\n        \"node\": \">=16.11.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/discordjs/discord.js?sponsor\"\n      }\n    },\n    \"node_modules/@discordjs/rest\": {\n      \"version\": \"2.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/@discordjs/rest/-/rest-2.6.3.tgz\",\n      \"integrity\": \"sha512-wvOylxNYJkwKjctS/Mn5GP1w9r3/rzyH+ThD1JlAca6zEdlHs8QWBBUQJpU5Q+W6DoIj/Ljh1IPlZs7hTU+UAg==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@discordjs/collection\": \"^2.1.1\",\n        \"@discordjs/util\": \"^1.2.0\",\n        \"@sapphire/async-queue\": \"^1.5.3\",\n        \"@sapphire/snowflake\": \"^3.5.5\",\n        \"@vladfrangu/async_event_emitter\": \"^2.4.6\",\n        \"discord-api-types\": \"^0.38.50\",\n        \"magic-bytes.js\": \"^1.13.0\",\n        \"tslib\": \"^2.6.3\",\n        \"undici\": \"^6.27.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/discordjs/discord.js?sponsor\"\n      }\n    },\n    \"node_modules/@discordjs/rest/node_modules/@discordjs/collection\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz\",\n      \"integrity\": \"sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/discordjs/discord.js?sponsor\"\n      }\n    },\n    \"node_modules/@discordjs/util\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@discordjs/util/-/util-1.2.0.tgz\",\n      \"integrity\": \"sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"discord-api-types\": \"^0.38.33\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/discordjs/discord.js?sponsor\"\n      }\n    },\n    \"node_modules/@discordjs/ws\": {\n      \"version\": \"1.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.3.tgz\",\n      \"integrity\": \"sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@discordjs/collection\": \"^2.1.0\",\n        \"@discordjs/rest\": \"^2.5.1\",\n        \"@discordjs/util\": \"^1.1.0\",\n        \"@sapphire/async-queue\": \"^1.5.2\",\n        \"@types/ws\": \"^8.5.10\",\n        \"@vladfrangu/async_event_emitter\": \"^2.2.4\",\n        \"discord-api-types\": \"^0.38.1\",\n        \"tslib\": \"^2.6.2\",\n        \"ws\": \"^8.17.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16.11.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/discordjs/discord.js?sponsor\"\n      }\n    },\n    \"node_modules/@discordjs/ws/node_modules/@discordjs/collection\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz\",\n      \"integrity\": \"sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/discordjs/discord.js?sponsor\"\n      }\n    },\n    \"node_modules/@jitl/quickjs-ffi-types\": {\n      \"version\": \"0.31.0\",\n      \"resolved\": \"https://registry.npmjs.org/@jitl/quickjs-ffi-types/-/quickjs-ffi-types-0.31.0.tgz\",\n      \"integrity\": \"sha512-1yrgvXlmXH2oNj3eFTrkwacGJbmM0crwipA3ohCrjv52gBeDaD7PsTvFYinlAnqU8iPME3LGP437yk05a2oejw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@jitl/quickjs-wasmfile-debug-asyncify\": {\n      \"version\": \"0.31.0\",\n      \"resolved\": \"https://registry.npmjs.org/@jitl/quickjs-wasmfile-debug-asyncify/-/quickjs-wasmfile-debug-asyncify-0.31.0.tgz\",\n      \"integrity\": \"sha512-YkdzQdr1uaftFhgEnTRjTTZHk2SFZdpWO7XhOmRVbi6CEVsH9g5oNF8Ta1q3OuSJHRwwT8YsuR1YzEiEIJEk6w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jitl/quickjs-ffi-types\": \"0.31.0\"\n      }\n    },\n    \"node_modules/@jitl/quickjs-wasmfile-debug-sync\": {\n      \"version\": \"0.31.0\",\n      \"resolved\": \"https://registry.npmjs.org/@jitl/quickjs-wasmfile-debug-sync/-/quickjs-wasmfile-debug-sync-0.31.0.tgz\",\n      \"integrity\": \"sha512-8XvloaaWBONqcHXYs5tWOjdhQVxzULilIfB2hvZfS6S+fI4m2+lFiwQy7xeP8ExHmiZ7D8gZGChNkdLgjGfknw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jitl/quickjs-ffi-types\": \"0.31.0\"\n      }\n    },\n    \"node_modules/@jitl/quickjs-wasmfile-release-asyncify\": {\n      \"version\": \"0.31.0\",\n      \"resolved\": \"https://registry.npmjs.org/@jitl/quickjs-wasmfile-release-asyncify/-/quickjs-wasmfile-release-asyncify-0.31.0.tgz\",\n      \"integrity\": \"sha512-uz0BbQYTxNsFkvkurd7vk2dOg57ElTBLCuvNtRl4rgrtbC++NIndD5qv2+AXb6yXDD3Uy1O2PCwmoaH0eXgEOg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jitl/quickjs-ffi-types\": \"0.31.0\"\n      }\n    },\n    \"node_modules/@jitl/quickjs-wasmfile-release-sync\": {\n      \"version\": \"0.31.0\",\n      \"resolved\": \"https://registry.npmjs.org/@jitl/quickjs-wasmfile-release-sync/-/quickjs-wasmfile-release-sync-0.31.0.tgz\",\n      \"integrity\": \"sha512-hYduecOByj9AsAfsJhZh5nA6exokmuFC8cls39+lYmTCGY51bgjJJJwReEu7Ff7vBWaQCL6TeDdVlnp2WYz0jw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jitl/quickjs-ffi-types\": \"0.31.0\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz\",\n      \"integrity\": \"sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==\",\n      \"license\": \"MIT\",\n      \"workspaces\": [\n        \"e2e/*\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      },\n      \"optionalDependencies\": {\n        \"@napi-rs/canvas-android-arm64\": \"0.1.80\",\n        \"@napi-rs/canvas-darwin-arm64\": \"0.1.80\",\n        \"@napi-rs/canvas-darwin-x64\": \"0.1.80\",\n        \"@napi-rs/canvas-linux-arm-gnueabihf\": \"0.1.80\",\n        \"@napi-rs/canvas-linux-arm64-gnu\": \"0.1.80\",\n        \"@napi-rs/canvas-linux-arm64-musl\": \"0.1.80\",\n        \"@napi-rs/canvas-linux-riscv64-gnu\": \"0.1.80\",\n        \"@napi-rs/canvas-linux-x64-gnu\": \"0.1.80\",\n        \"@napi-rs/canvas-linux-x64-musl\": \"0.1.80\",\n        \"@napi-rs/canvas-win32-x64-msvc\": \"0.1.80\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas-android-arm64\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz\",\n      \"integrity\": \"sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas-darwin-arm64\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz\",\n      \"integrity\": \"sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas-darwin-x64\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz\",\n      \"integrity\": \"sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas-linux-arm-gnueabihf\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz\",\n      \"integrity\": \"sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas-linux-arm64-gnu\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz\",\n      \"integrity\": \"sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas-linux-arm64-musl\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz\",\n      \"integrity\": \"sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas-linux-riscv64-gnu\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz\",\n      \"integrity\": \"sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas-linux-x64-gnu\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz\",\n      \"integrity\": \"sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas-linux-x64-musl\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz\",\n      \"integrity\": \"sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@napi-rs/canvas-win32-x64-msvc\": {\n      \"version\": \"0.1.80\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz\",\n      \"integrity\": \"sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@sapphire/async-queue\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz\",\n      \"integrity\": \"sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=v14.0.0\",\n        \"npm\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/@sapphire/shapeshift\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz\",\n      \"integrity\": \"sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.3\",\n        \"lodash\": \"^4.17.21\"\n      },\n      \"engines\": {\n        \"node\": \">=v16\"\n      }\n    },\n    \"node_modules/@sapphire/snowflake\": {\n      \"version\": \"3.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.5.tgz\",\n      \"integrity\": \"sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=v14.0.0\",\n        \"npm\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"22.16.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.16.5.tgz\",\n      \"integrity\": \"sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/@types/pg\": {\n      \"version\": \"8.23.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/pg/-/pg-8.23.1.tgz\",\n      \"integrity\": \"sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\",\n        \"pg-protocol\": \"*\",\n        \"pg-types\": \"^2.2.0\"\n      }\n    },\n    \"node_modules/@types/ws\": {\n      \"version\": \"8.18.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/ws/-/ws-8.18.2.tgz\",\n      \"integrity\": \"sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@vladfrangu/async_event_emitter\": {\n      \"version\": \"2.4.7\",\n      \"resolved\": \"https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.7.tgz\",\n      \"integrity\": \"sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=v14.0.0\",\n        \"npm\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/discord-api-types\": {\n      \"version\": \"0.38.56\",\n      \"resolved\": \"https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.56.tgz\",\n      \"integrity\": \"sha512-Hti4RZsGvF5C7SM8rF2MDHtIm0Hyfrlk84GpEA29nj91tvVVMvX+oQSCodu10t2ZcjFGofq8TX0YyC04B2E69Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/discord.js\": {\n      \"version\": \"14.27.0\",\n      \"resolved\": \"https://registry.npmjs.org/discord.js/-/discord.js-14.27.0.tgz\",\n      \"integrity\": \"sha512-qHbFlFG2N7y3LjPySYsL6A1+BnX6bkTVgo842EX0CqVPk/KTMwZkojPHEXKsQUpWZNyz5BISNHK1cPpQw0+m4A==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@discordjs/builders\": \"^1.14.1\",\n        \"@discordjs/collection\": \"1.5.3\",\n        \"@discordjs/formatters\": \"^0.6.2\",\n        \"@discordjs/rest\": \"^2.6.2\",\n        \"@discordjs/util\": \"^1.2.0\",\n        \"@discordjs/ws\": \"^1.2.3\",\n        \"@sapphire/snowflake\": \"3.5.5\",\n        \"discord-api-types\": \"^0.38.49\",\n        \"fast-deep-equal\": \"3.1.3\",\n        \"lodash.snakecase\": \"4.1.1\",\n        \"magic-bytes.js\": \"^1.13.0\",\n        \"tslib\": \"^2.6.3\",\n        \"undici\": \"^6.27.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/discordjs/discord.js?sponsor\"\n      }\n    },\n    \"node_modules/fast-deep-equal\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz\",\n      \"integrity\": \"sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/lodash\": {\n      \"version\": \"4.18.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz\",\n      \"integrity\": \"sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/lodash.snakecase\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz\",\n      \"integrity\": \"sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/magic-bytes.js\": {\n      \"version\": \"1.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.13.1.tgz\",\n      \"integrity\": \"sha512-x5sn4UX2k5gCWlcfmoFwG4TPie8+dctESyqOBdhB5p6MsgWXdBKGmt9nXPObj/JI50TTL928lc5Yt1WntMn1bw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/pg\": {\n      \"version\": \"8.23.1\",\n      \"resolved\": \"https://registry.npmjs.org/pg/-/pg-8.23.1.tgz\",\n      \"integrity\": \"sha512-aL96AHANtWjPLDOLqnhx+ngp9+UK7ETEU8VJrDCGvsSSi/mGLcWYsS6Herg7lmaBJe4uwrfqsa7gTEFaSizDoQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"pg-connection-string\": \"^2.14.1\",\n        \"pg-pool\": \"^3.14.0\",\n        \"pg-protocol\": \"^1.16.1\",\n        \"pg-types\": \"2.2.0\",\n        \"pgpass\": \"1.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"pg-cloudflare\": \"^1.4.1\"\n      },\n      \"peerDependencies\": {\n        \"pg-native\": \">=3.0.1\"\n      },\n      \"peerDependenciesMeta\": {\n        \"pg-native\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/pg-cloudflare\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.1.tgz\",\n      \"integrity\": \"sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/pg-connection-string\": {\n      \"version\": \"2.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.1.tgz\",\n      \"integrity\": \"sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/pg-int8\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz\",\n      \"integrity\": \"sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=4.0.0\"\n      }\n    },\n    \"node_modules/pg-pool\": {\n      \"version\": \"3.14.0\",\n      \"resolved\": \"https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz\",\n      \"integrity\": \"sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==\",\n      \"license\": \"MIT\",\n      \"peerDependencies\": {\n        \"pg\": \">=8.0\"\n      }\n    },\n    \"node_modules/pg-protocol\": {\n      \"version\": \"1.16.1\",\n      \"resolved\": \"https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.1.tgz\",\n      \"integrity\": \"sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/pg-types\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz\",\n      \"integrity\": \"sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"pg-int8\": \"1.0.1\",\n        \"postgres-array\": \"~2.0.0\",\n        \"postgres-bytea\": \"~1.0.0\",\n        \"postgres-date\": \"~1.0.4\",\n        \"postgres-interval\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/pgpass\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz\",\n      \"integrity\": \"sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"split2\": \"^4.1.0\"\n      }\n    },\n    \"node_modules/postgres-array\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz\",\n      \"integrity\": \"sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/postgres-bytea\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz\",\n      \"integrity\": \"sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/postgres-date\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz\",\n      \"integrity\": \"sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/postgres-interval\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz\",\n      \"integrity\": \"sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"xtend\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/quickjs-emscripten\": {\n      \"version\": \"0.31.0\",\n      \"resolved\": \"https://registry.npmjs.org/quickjs-emscripten/-/quickjs-emscripten-0.31.0.tgz\",\n      \"integrity\": \"sha512-K7Yt78aRPLjPcqv3fIuLW1jW3pvwO21B9pmFOolsjM/57ZhdVXBr51GqJpalgBlkPu9foAvhEAuuQPnvIGvLvQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jitl/quickjs-wasmfile-debug-asyncify\": \"0.31.0\",\n        \"@jitl/quickjs-wasmfile-debug-sync\": \"0.31.0\",\n        \"@jitl/quickjs-wasmfile-release-asyncify\": \"0.31.0\",\n        \"@jitl/quickjs-wasmfile-release-sync\": \"0.31.0\",\n        \"quickjs-emscripten-core\": \"0.31.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16.0.0\"\n      }\n    },\n    \"node_modules/quickjs-emscripten-core\": {\n      \"version\": \"0.31.0\",\n      \"resolved\": \"https://registry.npmjs.org/quickjs-emscripten-core/-/quickjs-emscripten-core-0.31.0.tgz\",\n      \"integrity\": \"sha512-oQz8p0SiKDBc1TC7ZBK2fr0GoSHZKA0jZIeXxsnCyCs4y32FStzCW4d1h6E1sE0uHDMbGITbk2zhNaytaoJwXQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jitl/quickjs-ffi-types\": \"0.31.0\"\n      }\n    },\n    \"node_modules/split2\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/split2/-/split2-4.2.0.tgz\",\n      \"integrity\": \"sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">= 10.x\"\n      }\n    },\n    \"node_modules/ts-mixer\": {\n      \"version\": \"6.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz\",\n      \"integrity\": \"sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/tslib\": {\n      \"version\": \"2.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n      \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n      \"license\": \"0BSD\"\n    },\n    \"node_modules/typescript\": {\n      \"version\": \"5.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz\",\n      \"integrity\": \"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==\",\n      \"dev\": true,\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"tsc\": \"bin/tsc\",\n        \"tsserver\": \"bin/tsserver\"\n      },\n      \"engines\": {\n        \"node\": \">=14.17\"\n      }\n    },\n    \"node_modules/undici\": {\n      \"version\": \"6.29.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici/-/undici-6.29.0.tgz\",\n      \"integrity\": \"sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18.17\"\n      }\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"6.21.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n      \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/ws\": {\n      \"version\": \"8.22.0\",\n      \"resolved\": \"https://registry.npmjs.org/ws/-/ws-8.22.0.tgz\",\n      \"integrity\": \"sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      },\n      \"peerDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \">=5.0.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bufferutil\": {\n          \"optional\": true\n        },\n        \"utf-8-validate\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/xtend\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz\",\n      \"integrity\": \"sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.4\"\n      }\n    }\n  }\n}\n","runtime/package.json":"{\n  \"name\": \"bottly-bot-runtime\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"description\": \"Long-lived Discord gateway runtime for Bottly. Owns the bot connections; the web app is only its control plane.\",\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=20.11.0\"\n  },\n  \"main\": \"dist/index.js\",\n  \"scripts\": {\n    \"sync:contract\": \"node scripts/sync-contract.mjs && node scripts/sync-studio.mjs\",\n    \"build\": \"npm run sync:contract && tsc -p tsconfig.json\",\n    \"typecheck\": \"npm run sync:contract && tsc -p tsconfig.json --noEmit\",\n    \"start\": \"node dist/index.js\",\n    \"watch\": \"tsc -p tsconfig.json --watch\",\n    \"dev\": \"node --watch dist/index.js\",\n    \"typecheck:next\": \"npm run sync:contract && npm i --no-save discord.js@dev && tsc -p tsconfig.json --noEmit; npm i --no-save discord.js@14.27.0\"\n  },\n  \"dependencies\": {\n    \"@napi-rs/canvas\": \"0.1.80\",\n    \"discord.js\": \"14.27.0\",\n    \"pg\": \"8.23.1\",\n    \"quickjs-emscripten\": \"0.31.0\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"22.16.5\",\n    \"@types/pg\": \"8.23.1\",\n    \"typescript\": \"5.8.3\"\n  }\n}\n","runtime/scripts/sync-contract.mjs":"/**\n * Copies the shared flow contract from the web app into the runtime.\n *\n * The contract is the single source of truth for flow semantics; it must be\n * byte-identical on both sides, so it is generated instead of hand-maintained.\n * Run automatically by `npm run build` / `npm run typecheck` in this package.\n */\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst source = resolve(here, \"../../src/lib/flow/contract.ts\");\nconst target = resolve(here, \"../src/flow-contract.ts\");\n\nconst banner =\n  \"/* AUTO-GENERATED FILE — do not edit.\\n\" +\n  \" * Source: src/lib/flow/contract.ts (web app)\\n\" +\n  \" * Regenerate: npm run sync:contract (inside runtime/)\\n\" +\n  \" */\\n\";\n\nconst body = readFileSync(source, \"utf8\");\nwriteFileSync(target, banner + body, \"utf8\");\nconsole.log(`Synced flow contract -> ${target}`);\n\n// The AI Chat helpers are shared too: the standalone export (src/standalone.ts)\n// calls the owner's own AI provider directly, without Bottly's control plane.\nfor (const [from, to] of [\n  [\"../../src/lib/ai-providers.ts\", \"../src/ai-providers.ts\"],\n  [\"../../src/lib/ai-chat.ts\", \"../src/ai-chat.ts\"],\n]) {\n  const src = resolve(here, from);\n  const dst = resolve(here, to);\n  const header = banner.replace(\"src/lib/flow/contract.ts\", from.replace(\"../../\", \"\"));\n  writeFileSync(dst, header + readFileSync(src, \"utf8\"), \"utf8\");\n  console.log(`Synced ${from.replace(\"../../\", \"\")} -> ${dst}`);\n}\n","runtime/scripts/sync-studio.mjs":"/**\n * Copies the Graphics Studio renderer from the web app into the runtime, so a\n * design saved to a bot (welcome cards…) renders exactly as in the studio.\n * Like the flow contract it is generated, never edited by hand; run by\n * `npm run build` / `npm run typecheck` in this package.\n *\n * With the web app's node_modules present it also copies the studio fonts\n * (latin + latin-ext, so Polish letters render) into runtime/fonts.\n */\nimport { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst web = resolve(here, \"../..\");\nconst out = resolve(here, \"../src/studio\");\nmkdirSync(out, { recursive: true });\n\nconst banner = (source) =>\n  `/* AUTO-GENERATED FILE — do not edit.\\n * Source: ${source} (web app)\\n * Regenerate: npm run sync:contract (inside runtime/)\\n */\\n`;\n\nconst files = [\n  [\"src/lib/studio/render.ts\", \"render.ts\", '/// <reference lib=\"dom\" />\\n'],\n  [\"src/lib/studio/font-list.ts\", \"font-list.ts\", \"\"],\n  [\"src/lib/studio/variables.ts\", \"variables.ts\", \"\"],\n  [\"src/data/studio-icons.ts\", \"studio-icons.ts\", \"\"],\n];\nfor (const [source, target, prefix] of files) {\n  const body = readFileSync(resolve(web, source), \"utf8\")\n    .replace('from \"@/data/studio-icons\"', 'from \"./studio-icons.js\"')\n    .replace('from \"./font-list\"', 'from \"./font-list.js\"')\n    .replace('from \"./render\"', 'from \"./render.js\"');\n  writeFileSync(resolve(out, target), prefix + banner(source) + body, \"utf8\");\n}\nconsole.log(`Synced studio renderer -> ${out}`);\n\nconst fontsource = resolve(web, \"node_modules/@fontsource\");\nif (existsSync(fontsource)) {\n  const fontsDir = resolve(here, \"../fonts\");\n  mkdirSync(fontsDir, { recursive: true });\n  const list = readFileSync(resolve(web, \"src/lib/studio/font-list.ts\"), \"utf8\");\n  let copied = 0;\n  for (const m of list.matchAll(/weight:\\s*(\\d+),\\s*style:\\s*\"\\w+\",\\s*pkg:\\s*\"([a-z0-9-]+)\"/g)) {\n    const [, weight, pkg] = m;\n    for (const subset of [\"latin\", \"latin-ext\"]) {\n      const name = `${pkg}-${subset}-${weight}-normal.woff2`;\n      const from = resolve(fontsource, pkg, \"files\", name);\n      if (existsSync(from)) {\n        copyFileSync(from, resolve(fontsDir, name));\n        copied++;\n      }\n    }\n  }\n  // Licensed fonts bought for Bottly (StudioFont.file).\n  const own = resolve(web, \"public/studio/fonts\");\n  if (existsSync(own))\n    for (const name of readdirSync(own).filter((f) => f.endsWith(\".woff2\"))) {\n      copyFileSync(resolve(own, name), resolve(fontsDir, name));\n      copied++;\n    }\n  console.log(`Copied ${copied} studio font files -> ${fontsDir}`);\n}\n","runtime/src/ai-chat.ts":"/* AUTO-GENERATED FILE — do not edit.\n * Source: src/lib/ai-chat.ts (web app)\n * Regenerate: npm run sync:contract (inside runtime/)\n */\n/**\n * AI Chat plugin (block \"ai-chat\"): the prompt the control plane sends to\n * Bottly's AI and the memory it keeps. Pure, tested (ai-chat.test.ts); the\n * route is /api/internal/bots/$botId/ai.\n */\nexport interface ChatTurn {\n  role: \"user\" | \"assistant\";\n  content: string;\n}\n\nexport const MEMORY_TURNS = 6;\n/** Bottly storage values hold up to 2000 characters. */\nexport const MEMORY_CHARS = 1900;\n\n/** `json`: Bottly's AI answers as {\"reply\"}; the owner's own provider answers plain text. */\nexport function systemPrompt(botName: string, personality: string, maxLength: number, json = true): string {\n  return [\n    `You are ${botName}, a Discord bot. You speak as the bot, never as a person.`,\n    personality.trim() ? `Instructions from the bot owner:\\n${personality.trim()}` : \"\",\n    `Answer in the language of the last message. Use Discord markdown only when it helps. Keep the answer under ${maxLength} characters.`,\n    \"Never mention @everyone or @here, never write role or member mentions, and never claim you did something in Discord you cannot do.\",\n    json ? 'Reply as JSON: {\"reply\": \"your answer\"}.' : \"\",\n  ]\n    .filter(Boolean)\n    .join(\"\\n\\n\");\n}\n\n/** The answer made safe for Discord: no mass pings, cut to the limit. */\nexport function cleanReply(reply: string, maxLength: number): string {\n  const safe = reply\n    .replace(/@(everyone|here)/gi, \"@​$1\")\n    .replace(/<@&(\\d+)>/g, \"@role\")\n    .trim();\n  if (safe.length <= maxLength) return safe || \"…\";\n  return `${safe.slice(0, Math.max(1, maxLength - 1)).trimEnd()}…`;\n}\n\n/** Stored memory → turns (bad data is forgotten, never an error). */\nexport function readMemory(raw: string | undefined | null): ChatTurn[] {\n  if (!raw) return [];\n  try {\n    const list = JSON.parse(raw) as unknown;\n    if (!Array.isArray(list)) return [];\n    return list\n      .filter(\n        (t): t is ChatTurn =>\n          !!t && typeof t === \"object\" && (t.role === \"user\" || t.role === \"assistant\") && typeof t.content === \"string\",\n      )\n      .slice(-MEMORY_TURNS);\n  } catch {\n    return [];\n  }\n}\n\n/** The newest turns that fit one storage value. */\nexport function writeMemory(turns: ChatTurn[]): string {\n  let kept = turns.slice(-MEMORY_TURNS).map((t) => ({ role: t.role, content: t.content.slice(0, 600) }));\n  while (kept.length > 0 && JSON.stringify(kept).length > MEMORY_CHARS) kept = kept.slice(1);\n  return JSON.stringify(kept);\n}\n","runtime/src/ai-providers.ts":"/* AUTO-GENERATED FILE — do not edit.\n * Source: src/lib/ai-providers.ts (web app)\n * Regenerate: npm run sync:contract (inside runtime/)\n */\n/**\n * AI Chat plugin with the owner's own API key ({env.AI_PROVIDER},\n * {env.AI_API_KEY}, {env.AI_MODEL}): one chat request per provider, built and\n * read here for /api/internal/bots/$botId/ai. Hosts are fixed per provider, never\n * taken from the flow. Pure, tested (ai-providers.test.ts).\n */\nexport interface ChatTurn {\n  role: \"user\" | \"assistant\";\n  content: string;\n}\n\nexport const AI_PROVIDERS = {\n  openai: { label: \"OpenAI\", model: \"gpt-4o-mini\", url: \"https://api.openai.com/v1/chat/completions\" },\n  gemini: { label: \"Google Gemini\", model: \"gemini-flash-latest\", url: \"https://generativelanguage.googleapis.com/v1beta/models\" },\n  anthropic: { label: \"Anthropic Claude\", model: \"claude-haiku-5-5\", url: \"https://api.anthropic.com/v1/messages\" },\n  groq: { label: \"Groq\", model: \"llama-3.3-70b-versatile\", url: \"https://api.groq.com/openai/v1/chat/completions\" },\n  openrouter: { label: \"OpenRouter\", model: \"openai/gpt-4o-mini\", url: \"https://openrouter.ai/api/v1/chat/completions\" },\n  mistral: { label: \"Mistral\", model: \"mistral-small-latest\", url: \"https://api.mistral.ai/v1/chat/completions\" },\n  deepseek: { label: \"DeepSeek\", model: \"deepseek-chat\", url: \"https://api.deepseek.com/chat/completions\" },\n  xai: { label: \"xAI Grok\", model: \"grok-3-mini\", url: \"https://api.x.ai/v1/chat/completions\" },\n} as const;\n\nexport type AiProvider = keyof typeof AI_PROVIDERS;\n\n/** \"OpenAI\", \"open-ai\", \" Claude \" → provider id; \"\" or \"bottly\" → null (Bottly's AI). */\nexport function providerOf(raw: string): AiProvider | \"bottly\" | \"unknown\" {\n  const v = raw.trim().toLowerCase().replace(/[\\s_-]+/g, \"\");\n  if (v === \"\" || v === \"bottly\") return \"bottly\";\n  if (v === \"openai\" || v === \"chatgpt\" || v === \"gpt\") return \"openai\";\n  if (v === \"gemini\" || v === \"google\") return \"gemini\";\n  if (v === \"anthropic\" || v === \"claude\") return \"anthropic\";\n  if (v === \"groq\") return \"groq\";\n  if (v === \"openrouter\") return \"openrouter\";\n  if (v === \"mistral\") return \"mistral\";\n  if (v === \"deepseek\") return \"deepseek\";\n  if (v === \"xai\" || v === \"grok\") return \"xai\";\n  return \"unknown\";\n}\n\nexport function buildProviderRequest(\n  provider: AiProvider,\n  input: { apiKey: string; model: string; system: string; turns: ChatTurn[]; maxTokens: number },\n): { url: string; headers: Record<string, string>; body: string } {\n  const p = AI_PROVIDERS[provider];\n  const model = input.model.trim() || p.model;\n  const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n  if (provider === \"gemini\") {\n    headers[\"x-goog-api-key\"] = input.apiKey;\n    return {\n      url: `${p.url}/${encodeURIComponent(model)}:generateContent`,\n      headers,\n      body: JSON.stringify({\n        systemInstruction: { parts: [{ text: input.system }] },\n        contents: input.turns.map((t) => ({ role: t.role === \"assistant\" ? \"model\" : \"user\", parts: [{ text: t.content }] })),\n        generationConfig: { maxOutputTokens: input.maxTokens },\n      }),\n    };\n  }\n  if (provider === \"anthropic\") {\n    headers[\"x-api-key\"] = input.apiKey;\n    headers[\"anthropic-version\"] = \"2023-06-01\";\n    return {\n      url: p.url,\n      headers,\n      body: JSON.stringify({ model, system: input.system, messages: input.turns, max_tokens: input.maxTokens }),\n    };\n  }\n  headers[\"authorization\"] = `Bearer ${input.apiKey}`;\n  if (provider === \"openrouter\") {\n    headers[\"http-referer\"] = \"https://bottly.xyz\";\n    headers[\"x-title\"] = \"Bottly\";\n  }\n  return {\n    url: p.url,\n    headers,\n    body: JSON.stringify({\n      model,\n      messages: [{ role: \"system\", content: input.system }, ...input.turns],\n      max_tokens: input.maxTokens,\n    }),\n  };\n}\n\n/** The answer text from a provider's JSON, or null. */\nexport function readProviderReply(provider: AiProvider, json: unknown): string | null {\n  const j = json as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n  let text: unknown;\n  if (provider === \"gemini\")\n    text = (j?.candidates?.[0]?.content?.parts ?? []).map((part: { text?: string }) => part.text ?? \"\").join(\"\");\n  else if (provider === \"anthropic\")\n    text = (j?.content ?? []).filter((c: { type?: string }) => c.type === \"text\").map((c: { text?: string }) => c.text ?? \"\").join(\"\");\n  else text = j?.choices?.[0]?.message?.content;\n  return typeof text === \"string\" && text.trim() ? text.trim() : null;\n}\n\n/** A short reason for the member, never the key or the raw provider answer. */\nexport function providerError(provider: AiProvider, status: number): string {\n  const name = AI_PROVIDERS[provider].label;\n  if (status === 401 || status === 403) return `${name} refused the API key (check AI_API_KEY).`;\n  if (status === 404) return `${name} does not know that model (check AI_MODEL).`;\n  if (status === 429) return `${name} says the limit or credits are used up. Try again later.`;\n  if (status === 400) return `${name} refused the request (check AI_MODEL).`;\n  return `${name} did not answer (${status}). Try again in a moment.`;\n}\n","runtime/src/commands.ts":"/**\n * Slash-command registration.\n *\n * Commands are registered GLOBALLY (Application#commands.set). The control\n * plane registers exactly the same payload over REST the moment a flow is\n * published, so both writers must agree byte for byte — otherwise Discord ends\n * up with two different command sets fighting each other.\n *\n * set() is a full overwrite, so removing a Slash Command node and publishing\n * again removes it from Discord too.\n *\n * Guild-scoped registration only happens as a FALLBACK when the global write is\n * refused. As soon as a global write succeeds again, the stale guild-scoped\n * copies are cleared — otherwise Discord shows every command twice.\n */\nimport {\n  ApplicationCommandOptionType,\n  Client,\n  Events,\n  type ApplicationCommandDataResolvable,\n  type ApplicationCommandOptionData,\n  type Guild,\n} from \"discord.js\";\nimport { logger } from \"./logger.js\";\nimport { describeError } from \"./redact.js\";\nimport { commandScope, type CompiledCommand, type CompiledFlow } from \"./flow-contract.js\";\n\nconst OPTION_TYPES: Record<string, ApplicationCommandOptionType> = {\n  string: ApplicationCommandOptionType.String,\n  integer: ApplicationCommandOptionType.Integer,\n  number: ApplicationCommandOptionType.Number,\n  boolean: ApplicationCommandOptionType.Boolean,\n  user: ApplicationCommandOptionType.User,\n  role: ApplicationCommandOptionType.Role,\n  channel: ApplicationCommandOptionType.Channel,\n  mentionable: ApplicationCommandOptionType.Mentionable,\n  attachment: ApplicationCommandOptionType.Attachment,\n};\n\n/** Discord's own rule for command and option names. Mirrors the control plane. */\nconst NAME_PATTERN = /^[-_\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}]{1,32}$/u;\n\nconst MAX_COMMANDS = 100;\nconst MAX_OPTIONS = 25;\n/** Guilds inspected when clearing stale guild-scoped duplicates. */\nconst MAX_CLEANUP_GUILDS = 50;\n\nconst AUTOCOMPLETE_TYPES = new Set<ApplicationCommandOptionType>([\n  ApplicationCommandOptionType.String,\n  ApplicationCommandOptionType.Integer,\n  ApplicationCommandOptionType.Number,\n]);\n\n/**\n * Builds one command's options.\n *\n * Discord rejects the WHOLE batch with a 400 when a single option is invalid,\n * so bad names are dropped and required options are forced in front of the\n * optional ones instead of letting one typo unregister every command.\n */\nfunction optionsPayload(options: CompiledCommand[\"options\"]): ApplicationCommandOptionData[] {\n  const seen = new Set<string>();\n  const built: { required: boolean; option: ApplicationCommandOptionData }[] = [];\n\n  for (const option of options ?? []) {\n    const name = (option?.name ?? \"\").trim().toLowerCase();\n    if (!NAME_PATTERN.test(name) || seen.has(name)) continue;\n    seen.add(name);\n\n    const type = OPTION_TYPES[option.type] ?? ApplicationCommandOptionType.String;\n    const required = option.required === true;\n    const base = {\n      name,\n      description: (option.description || name).slice(0, 100),\n      required,\n      type,\n    };\n\n    built.push({\n      required,\n      option: (option.autocomplete && AUTOCOMPLETE_TYPES.has(type)\n        ? { ...base, autocomplete: true }\n        : base) as ApplicationCommandOptionData,\n    });\n  }\n\n  return [...built.filter((entry) => entry.required), ...built.filter((entry) => !entry.required)]\n    .slice(0, MAX_OPTIONS)\n    .map((entry) => entry.option);\n}\n\nexport function commandPayload(flows: CompiledFlow[]): ApplicationCommandDataResolvable[] {\n  const seen = new Set<string>();\n  const payload: ApplicationCommandDataResolvable[] = [];\n\n  for (const flow of flows ?? []) {\n    for (const command of flow?.commands ?? []) {\n      const name = (command?.name ?? \"\").trim().toLowerCase();\n      if (!NAME_PATTERN.test(name) || seen.has(name)) continue;\n      seen.add(name);\n\n      const scope = commandScope(command);\n      payload.push({\n        name,\n        description: (command.description || \"A Bottly command\").slice(0, 100),\n        options: optionsPayload(command.options ?? []),\n        ...(scope.contexts ? { contexts: scope.contexts } : {}),\n        ...(scope.default_member_permissions\n          ? { defaultMemberPermissions: BigInt(scope.default_member_permissions) }\n          : {}),\n      });\n\n      if (payload.length >= MAX_COMMANDS) return payload;\n    }\n  }\n  return payload;\n}\n\nexport interface SyncResult {\n  commands: number;\n  /** Guilds that received a guild-scoped fallback copy. 0 when global worked. */\n  guilds: number;\n  failures: number;\n  /** True when the live command set already matched and nothing was sent. */\n  skipped: boolean;\n  scope: \"global\" | \"guild\" | \"none\";\n}\n\ninterface ClientSyncState {\n  /** Latest payload, read by the GuildCreate fallback listener. */\n  payload: ApplicationCommandDataResolvable[];\n  /** Signature of the last SUCCESSFULLY written payload. */\n  written: string | null;\n  /** A GuildCreate fallback listener is already attached to this client. */\n  fallbackAttached: boolean;\n  /** Guild-scoped copies exist and must be cleared after a global success. */\n  guildScoped: boolean;\n  /** Stale guild-scoped leftovers were already swept for this client. */\n  swept: boolean;\n}\n\nconst states = new WeakMap<Client, ClientSyncState>();\n\nfunction stateFor(client: Client): ClientSyncState {\n  let state = states.get(client);\n  if (!state) {\n    state = { payload: [], written: null, fallbackAttached: false, guildScoped: false, swept: false };\n    states.set(client, state);\n  }\n  return state;\n}\n\nfunction signatureOf(payload: ApplicationCommandDataResolvable[]): string {\n  return JSON.stringify(payload);\n}\n\n/**\n * Removes guild-scoped command copies left behind by an earlier fallback run.\n * Best effort and fire-and-forget: a failure here only means a duplicate stays\n * visible, never that the bot stops working.\n */\nasync function clearGuildScoped(client: Client<true>, state: ClientSyncState): Promise<void> {\n  const guilds = [...client.guilds.cache.values()].slice(0, MAX_CLEANUP_GUILDS);\n  let cleared = 0;\n\n  for (const guild of guilds) {\n    try {\n      const existing = await guild.commands.fetch();\n      if (existing.size === 0) continue;\n      await guild.commands.set([]);\n      cleared += 1;\n    } catch (error) {\n      logger.debug(`Could not clear guild commands in ${guild.id}: ${describeError(error)}`);\n    }\n  }\n\n  state.guildScoped = false;\n  state.swept = true;\n  if (cleared > 0) {\n    logger.info(`Cleared duplicate guild-scoped commands in ${cleared} server(s).`);\n  }\n}\n\n/** Registers the published command set, globally when Discord allows it. */\nexport async function syncCommands(\n  client: Client<true>,\n  flows: CompiledFlow[],\n): Promise<SyncResult> {\n  const payload = commandPayload(flows);\n  const signature = signatureOf(payload);\n  const state = stateFor(client);\n  state.payload = payload;\n\n  if (state.written === signature) {\n    return { commands: payload.length, guilds: 0, failures: 0, skipped: true, scope: \"global\" };\n  }\n\n  try {\n    await client.application.commands.set(payload);\n    state.written = signature;\n\n    // Sweep leftovers once per connection: either from a fallback earlier in\n    // this process, or from a previous process that had to fall back.\n    if (state.guildScoped || !state.swept) {\n      void clearGuildScoped(client, state);\n    }\n\n    return { commands: payload.length, guilds: 0, failures: 0, skipped: false, scope: \"global\" };\n  } catch (error) {\n    logger.warn(`Could not register global commands: ${describeError(error)}`);\n  }\n\n  // Fallback: per-guild registration still works when the application-level\n  // write is refused (for example while Discord rate limits it).\n  let guilds = 0;\n  let failures = 0;\n  // Guild-scoped copies take no install contexts.\n  const guildPayload = payload.map((command) => {\n    const { contexts: _contexts, ...rest } = command as { contexts?: unknown };\n    return rest as ApplicationCommandDataResolvable;\n  });\n  for (const guild of client.guilds.cache.values()) {\n    try {\n      await guild.commands.set(guildPayload);\n      guilds += 1;\n    } catch (error) {\n      failures += 1;\n      logger.warn(`Could not register commands in guild ${guild.id}: ${describeError(error)}`);\n    }\n  }\n\n  state.guildScoped = guilds > 0;\n  state.swept = false;\n  // Not marked as written: the next sync retries the global write.\n  state.written = null;\n\n  if (!state.fallbackAttached) {\n    state.fallbackAttached = true;\n    client.on(Events.GuildCreate, (guild: Guild) => {\n      const current = states.get(client);\n      if (!current || current.payload.length === 0) return;\n      const forGuild = current.payload.map((command) => {\n        const { contexts: _contexts, ...rest } = command as { contexts?: unknown };\n        return rest as ApplicationCommandDataResolvable;\n      });\n      void guild.commands.set(forGuild).catch((error: unknown) => {\n        logger.warn(`Could not register commands in new guild ${guild.id}: ${describeError(error)}`);\n      });\n    });\n  }\n\n  return {\n    commands: payload.length,\n    guilds,\n    failures,\n    skipped: false,\n    scope: guilds > 0 ? \"guild\" : \"none\",\n  };\n}\n","runtime/src/community.ts":"/**\n * Discord side of the community plugins: Leveling, Economy (wallets, shop and\n * casino games, with interactive blackjack and video poker), Giveaways Plus,\n * Suggestions and ticket transcripts. Flow blocks call in here; the runtime's\n * own buttons use the \"bx:\" custom-id prefix and are answered here directly.\n * Records live in Bottly storage through BotStore (per-key locks).\n */\nimport {\n  AttachmentBuilder,\n  ButtonInteraction,\n  ModalSubmitInteraction,\n  PermissionFlagsBits,\n  type Client,\n  type Guild,\n  type GuildMember,\n  type Message,\n  type TextBasedChannel,\n  type User,\n} from \"discord.js\";\nimport { randomInt } from \"node:crypto\";\nimport { IS_COMPONENTS_V2 } from \"./components.js\";\nimport {\n  blackjackDouble,\n  blackjackHit,\n  blackjackStand,\n  blackjackStart,\n  blackjackValue,\n  cardText,\n  coinflip,\n  diceDuel,\n  handText,\n  levelFromXp,\n  parseDuration,\n  parseLevelRewards,\n  pokerDraw,\n  pokerStart,\n  POKER_PAYTABLE,\n  progressBar,\n  rouletteBet,\n  rouletteSpin,\n  slotsSpin,\n  xpAtLevel,\n  type BlackjackGame,\n  type PokerGame,\n} from \"./games.js\";\nimport { logger } from \"./logger.js\";\nimport { describeError } from \"./redact.js\";\nimport type { BotStore, Row } from \"./store.js\";\n\nexport const PLUGIN_BUTTON_PREFIX = \"bx:\";\n\n/* ------------------------------------------------------------------ *\n * Raw Components V2 helpers\n * ------------------------------------------------------------------ */\n\ntype Raw = Record<string, unknown>;\nconst text = (content: string): Raw => ({ type: 10, content: content.slice(0, 4000) });\nconst separator = (divider = true): Raw => ({ type: 14, divider, spacing: 1 });\nconst row = (...buttons: Raw[]): Raw => ({ type: 1, components: buttons });\nconst button = (\n  label: string,\n  customId: string,\n  style = 2,\n  emoji?: string,\n  disabled = false,\n): Raw => ({\n  type: 2,\n  style,\n  label,\n  custom_id: customId,\n  ...(emoji ? { emoji: { name: emoji } } : {}),\n  ...(disabled ? { disabled: true } : {}),\n});\nconst section = (content: string, thumbnail: string): Raw =>\n  /^https?:\\/\\//.test(thumbnail)\n    ? { type: 9, components: [text(content)], accessory: { type: 11, media: { url: thumbnail } } }\n    : text(content);\nconst container = (accent: number, components: Raw[]): Raw => ({\n  type: 17,\n  accent_color: accent,\n  components,\n});\nconst v2 = (...components: Raw[]) => ({\n  components,\n  flags: IS_COMPONENTS_V2,\n  allowedMentions: { parse: [] as never[] },\n});\n\nexport function hexColor(raw: string, fallback: number): number {\n  const m = /^#?([0-9a-f]{6})$/i.exec(raw.trim());\n  return m ? parseInt(m[1]!, 16) : fallback;\n}\n\nconst n = (raw: string | undefined, fallback = 0) => {\n  const v = Number(raw);\n  return Number.isFinite(v) ? v : fallback;\n};\nconst fmt = (value: number) => Math.round(value).toLocaleString(\"en-US\");\n\nexport interface CommunityHost {\n  client(): Client;\n  store: BotStore;\n  env(): Record<string, string>;\n  /** Runs flows whose trigger is `type`, with these variables. */\n  dispatch(\n    type: string,\n    vars: Record<string, string>,\n    seed: {\n      guild?: Guild | null;\n      channel?: TextBasedChannel | null;\n      user?: User | null;\n      member?: GuildMember | null;\n    },\n    match?: (config: Record<string, unknown>) => boolean,\n  ): Promise<void>;\n}\n\n/* ------------------------------------------------------------------ *\n * Engine\n * ------------------------------------------------------------------ */\n\nexport class CommunityPlugins {\n  private readonly xpCooldowns = new Map<string, number>();\n  private readonly blackjack = new Map<\n    string,\n    { game: BlackjackGame; user: string; guild: string; at: number }\n  >();\n  private readonly poker = new Map<\n    string,\n    { game: PokerGame; user: string; guild: string; at: number }\n  >();\n  private readonly giveaways = new Map<string, Row>();\n  private giveawayTimer: NodeJS.Timeout | null = null;\n  private giveawaysLoaded = false;\n  private readonly countEdits = new Map<string, NodeJS.Timeout>();\n\n  constructor(private readonly host: CommunityHost) {}\n\n  private currency(): { name: string; emoji: string } {\n    const env = this.host.env();\n    return { name: env[\"ECONOMY_CURRENCY\"] || \"coins\", emoji: env[\"ECONOMY_EMOJI\"] || \"🪙\" };\n  }\n\n  private money(amount: number): string {\n    const c = this.currency();\n    return `${c.emoji} **${fmt(amount)}** ${c.name}`;\n  }\n\n  /* =============================== Leveling ============================== */\n\n  /** Gives message XP (with a cooldown); \"levelup\" when a new level is reached. */\n  async xpGain(\n    member: GuildMember,\n    opts: { min: number; max: number; cooldown: number },\n  ): Promise<{ handle: \"levelup\" | \"out\"; vars: Record<string, string> }> {\n    const key = `${member.guild.id}:${member.id}`;\n    const now = Date.now();\n    const last = this.xpCooldowns.get(key) ?? 0;\n    if (now - last < opts.cooldown * 1000) return { handle: \"out\", vars: { \"level.gained\": \"0\" } };\n    this.xpCooldowns.set(key, now);\n    if (this.xpCooldowns.size > 20000)\n      this.xpCooldowns.delete(this.xpCooldowns.keys().next().value as string);\n    const lo = Math.max(0, Math.min(opts.min, opts.max));\n    const hi = Math.max(lo, opts.max);\n    const gained = randomInt(lo, hi + 1);\n    return this.host.store.lock(`levels:${key}`, async () => {\n      const row = await this.host.store.get(\"levels\", \"key\", key);\n      const before = n(row?.[\"xp\"]);\n      const xp = before + gained;\n      const oldLevel = levelFromXp(before).level;\n      const info = levelFromXp(xp);\n      await this.host.store.put(\n        \"levels\",\n        \"key\",\n        key,\n        {\n          guild: member.guild.id,\n          user: member.id,\n          name: member.user.username,\n          xp: String(xp),\n          level: String(info.level),\n          messages: String(n(row?.[\"messages\"]) + 1),\n        },\n        row,\n      );\n      return {\n        handle: info.level > oldLevel ? \"levelup\" : \"out\",\n        vars: this.levelVars(\"level\", xp, {\n          \"level.old\": String(oldLevel),\n          \"level.gained\": String(gained),\n        }),\n      };\n    });\n  }\n\n  private levelVars(\n    prefix: string,\n    xp: number,\n    extra: Record<string, string> = {},\n  ): Record<string, string> {\n    const info = levelFromXp(xp);\n    return {\n      [prefix]: String(info.level),\n      [`${prefix}.level`]: String(info.level),\n      [`${prefix}.xp`]: fmt(xp),\n      [`${prefix}.into`]: fmt(info.into),\n      [`${prefix}.needed`]: fmt(info.needed),\n      [`${prefix}.percent`]: String(Math.floor((info.into / info.needed) * 100)),\n      [`${prefix}.bar`]: progressBar(info.into, info.needed),\n      ...extra,\n    };\n  }\n\n  async xpRank(\n    guild: Guild,\n    userId: string,\n    prefix: string,\n  ): Promise<Record<string, string> | null> {\n    const row = await this.host.store.get(\"levels\", \"key\", `${guild.id}:${userId}`);\n    if (!row) return null;\n    const all = await this.host.store.list(\"levels\", {\n      where: { field: \"guild\", value: guild.id },\n      sort: { field: \"xp\" },\n      limit: 1000,\n    });\n    const position = all.findIndex((r) => r[\"user\"] === userId) + 1;\n    return this.levelVars(prefix, n(row[\"xp\"]), {\n      [`${prefix}.position`]: position > 0 ? String(position) : \"?\",\n      [`${prefix}.members`]: String(all.length),\n      [`${prefix}.messages`]: fmt(n(row[\"messages\"])),\n      [`${prefix}.user`]: `<@${userId}>`,\n    });\n  }\n\n  async xpLeaderboard(\n    guild: Guild,\n    limit: number,\n    prefix: string,\n  ): Promise<Record<string, string>> {\n    const rows = await this.host.store.list(\"levels\", {\n      where: { field: \"guild\", value: guild.id },\n      sort: { field: \"xp\" },\n      limit: Math.min(25, Math.max(1, limit)),\n    });\n    const medals = [\"🥇\", \"🥈\", \"🥉\"];\n    const lines = rows.map(\n      (r, i) =>\n        `${medals[i] ?? `**${i + 1}.**`} <@${r[\"user\"]}> — Level **${levelFromXp(n(r[\"xp\"])).level}** · ${fmt(n(r[\"xp\"]))} XP`,\n    );\n    return {\n      [`${prefix}.text`]: lines.join(\"\\n\") || \"Nobody has XP yet — start chatting!\",\n      [`${prefix}.count`]: String(rows.length),\n    };\n  }\n\n  async xpEdit(member: GuildMember, mode: string, amount: number): Promise<Record<string, string>> {\n    const key = `${member.guild.id}:${member.id}`;\n    return this.host.store.lock(`levels:${key}`, async () => {\n      const row = await this.host.store.get(\"levels\", \"key\", key);\n      const current = n(row?.[\"xp\"]);\n      const xp = Math.max(\n        0,\n        mode === \"remove\"\n          ? current - amount\n          : mode === \"set-xp\"\n            ? amount\n            : mode === \"set-level\"\n              ? xpAtLevel(Math.max(0, Math.floor(amount)))\n              : mode === \"reset\"\n                ? 0\n                : current + amount,\n      );\n      await this.host.store.put(\n        \"levels\",\n        \"key\",\n        key,\n        {\n          guild: member.guild.id,\n          user: member.id,\n          name: member.user.username,\n          xp: String(xp),\n          level: String(levelFromXp(xp).level),\n        },\n        row,\n      );\n      return this.levelVars(\"level\", xp);\n    });\n  }\n\n  /** Gives the reward roles for every level reached; without stacking, only the highest. */\n  async levelRewards(\n    member: GuildMember,\n    rewards: string,\n    stack: boolean,\n    resolveRole: (raw: string) => Promise<{ id: string } | null>,\n  ): Promise<Record<string, string>> {\n    const row = await this.host.store.get(\"levels\", \"key\", `${member.guild.id}:${member.id}`);\n    const level = levelFromXp(n(row?.[\"xp\"])).level;\n    const list = parseLevelRewards(rewards);\n    const earned = list.filter(([l]) => l <= level);\n    const keep = stack ? earned : earned.slice(-1);\n    const given: string[] = [];\n    for (const [, raw] of list) {\n      const role = await resolveRole(raw);\n      if (!role) continue;\n      const should = keep.some(([, r]) => r === raw);\n      const has = member.roles.cache.has(role.id);\n      if (should && !has) {\n        await member.roles.add(role.id, `Level ${level} reward`);\n        given.push(`<@&${role.id}>`);\n      } else if (!should && has && !stack)\n        await member.roles.remove(role.id, \"Replaced by a higher level reward\");\n    }\n    return { \"rewards.given\": given.join(\", \"), \"rewards.count\": String(given.length) };\n  }\n\n  /* =============================== Economy =============================== */\n\n  private walletKey(guildId: string, userId: string) {\n    return `${guildId}:${userId}`;\n  }\n\n  async balance(guildId: string, userId: string): Promise<number> {\n    const row = await this.host.store.get(\"wallets\", \"key\", this.walletKey(guildId, userId));\n    return n(row?.[\"balance\"]);\n  }\n\n  /** Changes a balance under its lock; `fn` returns the new balance or throws. */\n  private async changeBalance(\n    guildId: string,\n    userId: string,\n    name: string,\n    fn: (balance: number, row: Row | null) => { balance: number; extra?: Row },\n  ): Promise<{ before: number; after: number; row: Row | null }> {\n    const key = this.walletKey(guildId, userId);\n    return this.host.store.lock(`wallets:${key}`, async () => {\n      const row = await this.host.store.get(\"wallets\", \"key\", key);\n      const before = n(row?.[\"balance\"]);\n      const next = fn(before, row);\n      if (!Number.isFinite(next.balance) || next.balance < 0) throw new Error(\"Not enough money.\");\n      await this.host.store.put(\n        \"wallets\",\n        \"key\",\n        key,\n        {\n          guild: guildId,\n          user: userId,\n          name,\n          balance: String(Math.floor(next.balance)),\n          ...(next.extra ?? {}),\n        },\n        row,\n      );\n      return { before, after: Math.floor(next.balance), row };\n    });\n  }\n\n  /** Bet text (\"100\", \"all\", \"half\") → coins, checked against the balance. */\n  private async stake(guildId: string, userId: string, raw: string): Promise<number> {\n    const balance = await this.balance(guildId, userId);\n    const t = raw.trim().toLowerCase();\n    const bet =\n      t === \"all\" || t === \"max\"\n        ? balance\n        : t === \"half\"\n          ? Math.floor(balance / 2)\n          : Math.floor(Number(t.replace(/[,_\\s]/g, \"\")));\n    if (!Number.isFinite(bet) || bet < 1) throw new Error(\"Bet at least 1.\");\n    if (bet > balance) throw new Error(`You only have ${this.money(balance)}.`);\n    const max = n(this.host.env()[\"ECONOMY_MAX_BET\"], 0);\n    if (max > 0 && bet > max) throw new Error(`The maximum bet is ${this.money(max)}.`);\n    return bet;\n  }\n\n  async economy(\n    op: string,\n    params: {\n      guild: Guild;\n      member: GuildMember;\n      target: GuildMember | null;\n      amount: string;\n      item: string;\n      cooldown: number;\n      prefix: string;\n    },\n  ): Promise<Record<string, string>> {\n    const { guild, member, target, prefix } = params;\n    const out: Record<string, string> = {};\n    const set = (k: string, v: string) => (out[k ? `${prefix}.${k}` : prefix] = v);\n    const amount = Math.floor(n(params.amount.replace(/[,_\\s]/g, \"\"), Number.NaN));\n    const name = member.user.username;\n    const now = Date.now();\n    const wait = (until: number) => `<t:${Math.floor(until / 1000)}:R>`;\n\n    switch (op) {\n      case \"balance\": {\n        const who = target ?? member;\n        const balance = await this.balance(guild.id, who.id);\n        set(\"balance\", fmt(balance));\n        set(\"text\", `${who} has ${this.money(balance)}.`);\n        break;\n      }\n      case \"add\":\n      case \"remove\":\n      case \"set\": {\n        const who = target ?? member;\n        if (!Number.isFinite(amount) || amount < 0) throw new Error(\"Give a positive amount.\");\n        const r = await this.changeBalance(guild.id, who.id, who.user.username, (b) => ({\n          balance: op === \"add\" ? b + amount : op === \"remove\" ? Math.max(0, b - amount) : amount,\n        }));\n        set(\"balance\", fmt(r.after));\n        set(\"text\", `${who} now has ${this.money(r.after)}.`);\n        break;\n      }\n      case \"pay\": {\n        if (!target) throw new Error(\"Pick who to pay.\");\n        if (target.id === member.id) throw new Error(\"You can't pay yourself.\");\n        if (target.user.bot) throw new Error(\"Bots don't need money.\");\n        if (!Number.isFinite(amount) || amount < 1) throw new Error(\"Pay at least 1.\");\n        const r = await this.changeBalance(guild.id, member.id, name, (b) => {\n          if (b < amount) throw new Error(`You only have ${this.money(b)}.`);\n          return { balance: b - amount };\n        });\n        await this.changeBalance(guild.id, target.id, target.user.username, (b) => ({\n          balance: b + amount,\n        }));\n        set(\"balance\", fmt(r.after));\n        set(\"amount\", fmt(amount));\n        set(\"text\", `💸 ${member} sent ${this.money(amount)} to ${target}.`);\n        break;\n      }\n      case \"daily\":\n      case \"work\": {\n        const cooldown = (op === \"daily\" ? 86_400 : Math.max(10, params.cooldown)) * 1000;\n        const field = op === \"daily\" ? \"last_daily\" : \"last_work\";\n        const range = /^(\\d+)\\s*-\\s*(\\d+)$/.exec(params.amount.trim());\n        const reward = range\n          ? randomInt(Number(range[1]), Number(range[2]) + 1)\n          : Number.isFinite(amount) && amount > 0\n            ? amount\n            : op === \"daily\"\n              ? 250\n              : randomInt(50, 201);\n        const jobs = [\n          \"fixed a bug\",\n          \"delivered pizza\",\n          \"streamed for 3 hours\",\n          \"moderated the server\",\n          \"sold handmade stickers\",\n          \"walked a dragon\",\n          \"built a Discord bot\",\n          \"mined some crypto\",\n          \"won a meme contest\",\n        ];\n        const job = jobs[randomInt(jobs.length)]!;\n        const r = await this.changeBalance(guild.id, member.id, name, (b, row) => {\n          const last = n(row?.[field]);\n          if (now - last < cooldown) throw new Error(`Come back ${wait(last + cooldown)}.`);\n          return { balance: b + reward, extra: { [field]: String(now) } };\n        });\n        set(\"amount\", fmt(reward));\n        set(\"balance\", fmt(r.after));\n        set(\"next\", wait(now + cooldown));\n        set(\"job\", job);\n        set(\n          \"text\",\n          op === \"daily\"\n            ? `🎁 You claimed your daily ${this.money(reward)}!`\n            : `💼 You ${job} and earned ${this.money(reward)}.`,\n        );\n        break;\n      }\n      case \"leaderboard\": {\n        const rows = await this.host.store.list(\"wallets\", {\n          where: { field: \"guild\", value: guild.id },\n          sort: { field: \"balance\" },\n          limit: 10,\n        });\n        const medals = [\"🥇\", \"🥈\", \"🥉\"];\n        set(\n          \"text\",\n          rows\n            .map(\n              (r, i) =>\n                `${medals[i] ?? `**${i + 1}.**`} <@${r[\"user\"]}> — ${this.money(n(r[\"balance\"]))}`,\n            )\n            .join(\"\\n\") || \"Nobody has money yet.\",\n        );\n        set(\"count\", String(rows.length));\n        break;\n      }\n      case \"shop\": {\n        const items = await this.host.store.list(\"eco_shop\", {\n          where: { field: \"guild\", value: guild.id },\n          sort: { field: \"price\", asc: true },\n          limit: 25,\n        });\n        set(\n          \"text\",\n          items\n            .map(\n              (i) =>\n                `**${i[\"item\"]}** — ${this.money(n(i[\"price\"]))}${i[\"role\"] ? ` · gives <@&${i[\"role\"]}>` : \"\"}${i[\"description\"] ? `\\n> ${i[\"description\"]}` : \"\"}`,\n            )\n            .join(\"\\n\") || \"The shop is empty. Admins add items with /shop-add.\",\n        );\n        set(\"count\", String(items.length));\n        break;\n      }\n      case \"shop-remove\": {\n        const item = params.item.trim();\n        await this.host.store.remove(\"eco_shop\", \"key\", `${guild.id}:${item.toLowerCase()}`);\n        set(\"text\", `🗑️ **${item}** was removed from the shop.`);\n        break;\n      }\n      case \"buy\": {\n        const item = params.item.trim();\n        const shopItem = await this.host.store.get(\n          \"eco_shop\",\n          \"key\",\n          `${guild.id}:${item.toLowerCase()}`,\n        );\n        if (!shopItem) throw new Error(`There is no \"${item}\" in the shop.`);\n        const price = n(shopItem[\"price\"]);\n        const r = await this.changeBalance(guild.id, member.id, name, (b) => {\n          if (b < price)\n            throw new Error(\n              `${shopItem[\"item\"]} costs ${this.money(price)}; you have ${this.money(b)}.`,\n            );\n          return { balance: b - price };\n        });\n        if (shopItem[\"role\"])\n          await member.roles\n            .add(shopItem[\"role\"], `Bought ${shopItem[\"item\"]}`)\n            .catch(() => undefined);\n        await this.host.store.add(\"eco_inventory\", {\n          guild: guild.id,\n          user: member.id,\n          owner: `${guild.id}:${member.id}`,\n          item: shopItem[\"item\"]!,\n        });\n        set(\"item\", shopItem[\"item\"]!);\n        set(\"balance\", fmt(r.after));\n        set(\n          \"text\",\n          `🛍️ You bought **${shopItem[\"item\"]}** for ${this.money(price)}.${shopItem[\"role\"] ? ` You got <@&${shopItem[\"role\"]}>!` : \"\"}`,\n        );\n        break;\n      }\n      case \"inventory\": {\n        const who = target ?? member;\n        const rows = await this.host.store.list(\"eco_inventory\", {\n          where: { field: \"owner\", value: `${guild.id}:${who.id}` },\n          limit: 200,\n        });\n        const counts = new Map<string, number>();\n        for (const r of rows) counts.set(r[\"item\"] ?? \"?\", (counts.get(r[\"item\"] ?? \"?\") ?? 0) + 1);\n        set(\n          \"text\",\n          [...counts].map(([i, c]) => `• **${i}**${c > 1 ? ` ×${c}` : \"\"}`).join(\"\\n\") ||\n            `${who} has no items yet.`,\n        );\n        set(\"count\", String(rows.length));\n        break;\n      }\n      default:\n        throw new Error(`Unknown economy action \"${op}\".`);\n    }\n    return out;\n  }\n\n  /** Shop item with a role (admins). Kept apart so the role is resolved by the caller. */\n  async shopAdd(\n    guild: Guild,\n    item: string,\n    price: number,\n    roleId: string,\n    description: string,\n  ): Promise<Record<string, string>> {\n    const name = item.trim().slice(0, 60);\n    if (!name) throw new Error(\"Name the item.\");\n    if (!Number.isFinite(price) || price < 0) throw new Error(\"Give the item a price.\");\n    await this.host.store.put(\"eco_shop\", \"key\", `${guild.id}:${name.toLowerCase()}`, {\n      guild: guild.id,\n      item: name,\n      price: String(Math.floor(price)),\n      role: roleId,\n      description: description.slice(0, 200),\n    });\n    return {\n      \"eco.item\": name,\n      \"eco.text\": `🛒 **${name}** is in the shop for ${this.money(price)}${roleId ? ` and gives <@&${roleId}>` : \"\"}.`,\n    };\n  }\n\n  /* ================================ Casino =============================== */\n\n  /** Instant games. Returns vars; the interactive ones return a payload to send. */\n  async casino(\n    game: string,\n    params: { guild: Guild; member: GuildMember; bet: string; choice: string; prefix: string },\n  ): Promise<{ vars: Record<string, string>; payload?: Raw }> {\n    const { guild, member, prefix } = params;\n    const name = member.user.username;\n    const bet = await this.stake(guild.id, member.id, params.bet);\n    const vars: Record<string, string> = { [`${prefix}.bet`]: fmt(bet) };\n    const settle = async (multiplier: number, describe: string) => {\n      const payout = Math.floor(bet * multiplier);\n      const r = await this.changeBalance(guild.id, member.id, name, (b) => ({\n        balance: b - bet + payout,\n      }));\n      const net = payout - bet;\n      vars[`${prefix}.payout`] = fmt(payout);\n      vars[`${prefix}.net`] = (net >= 0 ? \"+\" : \"-\") + fmt(Math.abs(net));\n      vars[`${prefix}.balance`] = fmt(r.after);\n      vars[`${prefix}.won`] = net > 0 ? \"yes\" : net === 0 ? \"push\" : \"no\";\n      vars[`${prefix}.text`] =\n        `${describe}\\n${net > 0 ? `**You won ${this.money(net)}!**` : net === 0 ? \"**Push — your bet is back.**\" : `**You lost ${this.money(bet)}.**`}\\nBalance: ${this.money(r.after)}`;\n    };\n\n    switch (game) {\n      case \"coinflip\": {\n        const r = coinflip(params.choice || \"heads\");\n        if (!r) throw new Error('Pick \"heads\" or \"tails\".');\n        await settle(r.won ? 2 : 0, `🪙 The coin landed on **${r.side}**.`);\n        return { vars };\n      }\n      case \"dice\": {\n        const r = diceDuel();\n        await settle(\n          r.outcome === \"win\" ? 2 : r.outcome === \"push\" ? 1 : 0,\n          `🎲 You rolled **${r.player[0]} + ${r.player[1]} = ${r.player[0] + r.player[1]}**\\n🤖 Bot rolled **${r.bot[0]} + ${r.bot[1]} = ${r.bot[0] + r.bot[1]}**`,\n        );\n        return { vars };\n      }\n      case \"slots\": {\n        const r = slotsSpin();\n        await settle(r.multiplier, `🎰 | ${r.reels.join(\" | \")} |`);\n        return { vars };\n      }\n      case \"roulette\": {\n        const choice = rouletteBet(params.choice || \"red\");\n        if (!choice)\n          throw new Error(\n            \"Bet on red, black, green, even, odd, low (1-18), high (19-36), a dozen (1-12, 13-24, 25-36) or a number 0-36.\",\n          );\n        const r = rouletteSpin(choice);\n        const dot = r.color === \"red\" ? \"🔴\" : r.color === \"black\" ? \"⚫\" : \"🟢\";\n        await settle(\n          r.multiplier,\n          `🎡 The ball landed on ${dot} **${r.number}** (you bet on **${choice}**).`,\n        );\n        return { vars };\n      }\n      case \"blackjack\": {\n        await this.changeBalance(guild.id, member.id, name, (b) => ({ balance: b - bet }));\n        const g = blackjackStart(bet);\n        const id = Math.random().toString(36).slice(2, 10);\n        this.blackjack.set(id, { game: g, user: member.id, guild: guild.id, at: Date.now() });\n        if (g.done) await this.finishBlackjack(id);\n        vars[`${prefix}.text`] = \"Blackjack started.\";\n        return { vars, payload: this.blackjackView(id, g) };\n      }\n      case \"poker\": {\n        await this.changeBalance(guild.id, member.id, name, (b) => ({ balance: b - bet }));\n        const g = pokerStart(bet);\n        const id = Math.random().toString(36).slice(2, 10);\n        this.poker.set(id, { game: g, user: member.id, guild: guild.id, at: Date.now() });\n        vars[`${prefix}.text`] = \"Video poker started.\";\n        return { vars, payload: this.pokerView(id, g) };\n      }\n      default:\n        throw new Error(`Unknown game \"${game}\".`);\n    }\n  }\n\n  private blackjackView(id: string, g: BlackjackGame, balance?: number): Raw {\n    const dealer = g.done\n      ? `${handText(g.dealer)} (**${blackjackValue(g.dealer)}**)`\n      : `\\`${cardText(g.dealer[0]!)}\\` \\`??\\``;\n    const outcome: Record<string, string> = {\n      blackjack: `🃏 **Blackjack!** You won ${this.money(g.payout - g.bet)}.`,\n      win: `✅ **You win** ${this.money(g.payout - g.bet)}!`,\n      \"dealer-bust\": `✅ **Dealer busts — you win** ${this.money(g.payout - g.bet)}!`,\n      push: \"🤝 **Push** — your bet is back.\",\n      lose: `❌ **Dealer wins.** You lost ${this.money(g.bet)}.`,\n      bust: `💥 **Bust!** You lost ${this.money(g.bet)}.`,\n    };\n    const status = g.done\n      ? `${outcome[g.outcome] ?? \"\"}${balance !== undefined ? `\\nBalance: ${this.money(balance)}` : \"\"}`\n      : `Bet: ${this.money(g.bet)}`;\n    const color = !g.done\n      ? 0x5865f2\n      : g.payout > g.bet\n        ? 0x23a55a\n        : g.payout === g.bet\n          ? 0xf0b232\n          : 0xed4245;\n    return v2(\n      container(color, [\n        text(\"## 🃏 Blackjack\"),\n        text(\n          `**Dealer:** ${dealer}\\n**You:** ${handText(g.player)} (**${blackjackValue(g.player)}**)`,\n        ),\n        separator(),\n        text(status),\n        ...(g.done\n          ? []\n          : [\n              row(\n                button(\"Hit\", `bx:bj:${id}:hit`, 1, \"👊\"),\n                button(\"Stand\", `bx:bj:${id}:stand`, 2, \"✋\"),\n                button(\"Double\", `bx:bj:${id}:double`, 3, \"💰\", g.player.length !== 2),\n              ),\n            ]),\n      ]),\n    );\n  }\n\n  private async finishBlackjack(id: string): Promise<number | undefined> {\n    const s = this.blackjack.get(id);\n    if (!s || !s.game.done) return undefined;\n    this.blackjack.delete(id);\n    const r = await this.changeBalance(s.guild, s.user, \"\", (b) => ({\n      balance: b + s.game.payout,\n    }));\n    return r.after;\n  }\n\n  private pokerView(id: string, g: PokerGame, balance?: number): Raw {\n    const cards = g.hand\n      .map((c, i) => `${g.held[i] && !g.done ? \"🔒\" : \"\"}\\`${cardText(c)}\\``)\n      .join(\"  \");\n    const table = POKER_PAYTABLE.map(([name, m]) => `${name} ×${m}`).join(\" · \");\n    const result = g.done\n      ? g.payout > 0\n        ? `✅ **${g.result}!** You won ${this.money(g.payout - g.bet)}.`\n        : `❌ **${g.result}.** You lost ${this.money(g.bet)}.`\n      : \"Hold the cards you want to keep, then **Draw**.\";\n    const color = !g.done ? 0x5865f2 : g.payout > 0 ? 0x23a55a : 0xed4245;\n    return v2(\n      container(color, [\n        text(\"## 🂡 Video Poker — Jacks or Better\"),\n        text(`# ${cards}`),\n        separator(),\n        text(\n          `${result}${balance !== undefined ? `\\nBalance: ${this.money(balance)}` : `\\nBet: ${this.money(g.bet)}`}`,\n        ),\n        ...(g.done\n          ? [text(`-# ${table}`)]\n          : [\n              row(\n                ...g.hand.map((c, i) =>\n                  button(\n                    g.held[i] ? `Held ${cardText(c)}` : `Hold ${cardText(c)}`,\n                    `bx:vp:${id}:h${i}`,\n                    g.held[i] ? 3 : 2,\n                  ),\n                ),\n              ),\n              row(button(\"Draw\", `bx:vp:${id}:draw`, 1, \"🎴\")),\n              text(`-# ${table}`),\n            ]),\n      ]),\n    );\n  }\n\n  /* ============================== Giveaways ============================== */\n\n  /** Loads running giveaways once and checks every 20 s which ones are due. */\n  startGiveaways(): void {\n    if (this.giveawayTimer !== null) return;\n    this.giveawayTimer = setInterval(() => void this.tickGiveaways(), 20_000);\n    this.giveawayTimer.unref();\n    void this.tickGiveaways();\n  }\n\n  stop(): void {\n    if (this.giveawayTimer !== null) clearInterval(this.giveawayTimer);\n    this.giveawayTimer = null;\n  }\n\n  private async tickGiveaways(): Promise<void> {\n    try {\n      if (!this.giveawaysLoaded) {\n        const rows = await this.host.store.list(\"giveaways\", {\n          where: { field: \"status\", value: \"running\" },\n          limit: 500,\n        });\n        for (const r of rows) if (r[\"message\"]) this.giveaways.set(r[\"message\"], r);\n        this.giveawaysLoaded = true;\n      }\n      for (const [id, g] of this.giveaways) {\n        if (n(g[\"ends\"]) <= Date.now())\n          await this.endGiveaway(id).catch((e) =>\n            logger.warn(`Giveaway ${id}: ${describeError(e)}`),\n          );\n      }\n    } catch (error) {\n      logger.debug(`Giveaways not loaded yet: ${describeError(error)}`);\n    }\n  }\n\n  private giveawayView(g: Row, entries: number, ended = false, winners: string[] = []): Raw {\n    const ends = Math.floor(n(g[\"ends\"]) / 1000);\n    const reqs = [\n      g[\"role\"] ? `• Role <@&${g[\"role\"]}>` : \"\",\n      n(g[\"minDays\"]) > 0 ? `• In the server for ${g[\"minDays\"]}+ days` : \"\",\n      n(g[\"minLevel\"]) > 0 ? `• Level ${g[\"minLevel\"]}+` : \"\",\n    ].filter(Boolean);\n    const body = [\n      g[\"description\"] ? `${g[\"description\"]}\\n` : \"\",\n      ended ? `**Ended** <t:${ends}:R>` : `**Ends** <t:${ends}:R> (<t:${ends}:f>)`,\n      `**Winners:** ${ended ? winners.map((w) => `<@${w}>`).join(\", \") || \"nobody entered\" : g[\"winners\"]}`,\n      `**Hosted by:** <@${g[\"host\"]}>`,\n      `**Entries:** ${fmt(entries)}`,\n      reqs.length ? `\\n**Requirements**\\n${reqs.join(\"\\n\")}` : \"\",\n    ].filter(Boolean);\n    return v2(\n      container(ended ? 0x4e5058 : hexColor(g[\"color\"] ?? \"\", 0xf47fff), [\n        text(`## 🎉 ${g[\"prize\"]}`),\n        text(body.join(\"\\n\")),\n        separator(),\n        row(\n          button(ended ? \"Giveaway ended\" : \"Enter\", \"bx:gw:enter\", ended ? 2 : 3, \"🎉\", ended),\n          ...(ended ? [] : [button(\"Leave\", \"bx:gw:leave\", 2)]),\n        ),\n      ]),\n    );\n  }\n\n  async startGiveaway(params: {\n    channel: TextBasedChannel;\n    guild: Guild;\n    host: User;\n    prize: string;\n    duration: string;\n    winners: number;\n    roleId: string;\n    minDays: number;\n    minLevel: number;\n    description: string;\n    color: string;\n  }): Promise<Record<string, string>> {\n    const ms = parseDuration(params.duration);\n    if (!ms) throw new Error(`\"${params.duration}\" is not a duration. Use 30m, 2h, 1d 12h…`);\n    if (ms > 60 * 86_400_000) throw new Error(\"Giveaways can run for at most 60 days.\");\n    if (!(\"send\" in params.channel)) throw new Error(\"Giveaways need a text channel.\");\n    const g: Row = {\n      prize: params.prize.slice(0, 200) || \"A mystery prize\",\n      winners: String(Math.min(20, Math.max(1, Math.floor(params.winners) || 1))),\n      ends: String(Date.now() + ms),\n      host: params.host.id,\n      role: params.roleId,\n      minDays: String(Math.max(0, params.minDays)),\n      minLevel: String(Math.max(0, params.minLevel)),\n      description: params.description.slice(0, 1000),\n      color: params.color,\n      channel: params.channel.id,\n      guild: params.guild.id,\n      status: \"running\",\n    };\n    const sent = await params.channel.send(this.giveawayView(g, 0) as never);\n    g[\"message\"] = sent.id;\n    await this.host.store.add(\"giveaways\", g);\n    this.giveaways.set(sent.id, g);\n    this.startGiveaways();\n    return {\n      \"giveaway.id\": sent.id,\n      \"giveaway.url\": sent.url,\n      \"giveaway.ends\": `<t:${Math.floor(n(g[\"ends\"]) / 1000)}:R>`,\n      \"giveaway.prize\": g[\"prize\"]!,\n    };\n  }\n\n  private async drawWinners(\n    g: Row,\n    count: number,\n    exclude: string[] = [],\n  ): Promise<{ winners: string[]; entries: number }> {\n    const rows = await this.host.store.list(\"giveaway_entries\", {\n      where: { field: \"giveaway\", value: g[\"message\"]! },\n      limit: 1000,\n    });\n    const pool = [...new Set(rows.map((r) => r[\"user\"]!).filter((u) => u && !exclude.includes(u)))];\n    const guild = this.host.client().guilds.cache.get(g[\"guild\"] ?? \"\");\n    const winners: string[] = [];\n    while (winners.length < count && pool.length > 0) {\n      const [pick] = pool.splice(randomInt(pool.length), 1);\n      // Winners who left the server are skipped.\n      const still = guild ? await guild.members.fetch(pick!).catch(() => null) : true;\n      if (still) winners.push(pick!);\n    }\n    return { winners, entries: rows.length };\n  }\n\n  async endGiveaway(messageId: string): Promise<Record<string, string>> {\n    return this.host.store.lock(`giveaway:${messageId}`, async () => {\n      const g =\n        this.giveaways.get(messageId) ??\n        (await this.host.store.get(\"giveaways\", \"message\", messageId));\n      if (!g) throw new Error(\"No giveaway with that message ID.\");\n      if (g[\"status\"] === \"ended\")\n        throw new Error(\"That giveaway already ended. Use reroll for new winners.\");\n      this.giveaways.delete(messageId);\n      const { winners, entries } = await this.drawWinners(g, n(g[\"winners\"], 1));\n      await this.host.store.put(\n        \"giveaways\",\n        \"message\",\n        messageId,\n        { status: \"ended\", winnerIds: winners.join(\",\"), ended: String(Date.now()) },\n        g,\n      );\n      const channel = await this.host\n        .client()\n        .channels.fetch(g[\"channel\"] ?? \"\")\n        .catch(() => null);\n      let url = \"\";\n      if (channel && channel.isTextBased() && \"messages\" in channel) {\n        const msg = await channel.messages.fetch(messageId).catch(() => null);\n        url = msg?.url ?? \"\";\n        await msg\n          ?.edit(\n            this.giveawayView({ ...g, ends: String(Date.now()) }, entries, true, winners) as never,\n          )\n          .catch(() => undefined);\n        if (\"send\" in channel)\n          await channel\n            .send({\n              content: winners.length\n                ? `🎉 Congratulations ${winners.map((w) => `<@${w}>`).join(\", \")}! You won **${g[\"prize\"]}**!`\n                : `😢 Nobody entered the giveaway for **${g[\"prize\"]}**.`,\n              allowedMentions: { users: winners },\n              ...(msg ? { reply: { messageReference: messageId, failIfNotExists: false } } : {}),\n            })\n            .catch(() => undefined);\n      }\n      const vars = {\n        \"giveaway.id\": messageId,\n        \"giveaway.prize\": g[\"prize\"] ?? \"\",\n        \"giveaway.winners\": winners.map((w) => `<@${w}>`).join(\", \") || \"nobody\",\n        \"giveaway.winnerIds\": winners.join(\",\"),\n        \"giveaway.entries\": String(entries),\n        \"giveaway.host\": `<@${g[\"host\"]}>`,\n        \"giveaway.url\": url,\n      };\n      const guild = this.host.client().guilds.cache.get(g[\"guild\"] ?? \"\") ?? null;\n      await this.host.dispatch(\"giveaway-ended\", vars, {\n        guild,\n        channel: channel && channel.isTextBased() ? channel : null,\n      });\n      return vars;\n    });\n  }\n\n  async rerollGiveaway(messageId: string, count: number): Promise<Record<string, string>> {\n    const g = await this.host.store.get(\"giveaways\", \"message\", messageId);\n    if (!g) throw new Error(\"No giveaway with that message ID.\");\n    if (g[\"status\"] !== \"ended\") throw new Error(\"That giveaway is still running.\");\n    const previous = (g[\"winnerIds\"] ?? \"\").split(\",\").filter(Boolean);\n    const { winners } = await this.drawWinners(g, Math.max(1, count || 1), previous);\n    if (!winners.length) throw new Error(\"No other entries left to pick from.\");\n    await this.host.store.put(\n      \"giveaways\",\n      \"message\",\n      messageId,\n      { winnerIds: [...previous, ...winners].join(\",\") },\n      g,\n    );\n    return {\n      \"giveaway.winners\": winners.map((w) => `<@${w}>`).join(\", \"),\n      \"giveaway.winnerIds\": winners.join(\",\"),\n      \"giveaway.prize\": g[\"prize\"] ?? \"\",\n    };\n  }\n\n  private scheduleCountEdit(message: Message, g: Row): void {\n    if (this.countEdits.has(message.id)) return;\n    const timer = setTimeout(async () => {\n      this.countEdits.delete(message.id);\n      const entries = await this.host.store.count(\"giveaway_entries\", {\n        field: \"giveaway\",\n        value: message.id,\n      });\n      const current = this.giveaways.get(message.id) ?? g;\n      if (current[\"status\"] === \"running\")\n        await message.edit(this.giveawayView(current, entries) as never).catch(() => undefined);\n    }, 4000);\n    timer.unref();\n    this.countEdits.set(message.id, timer);\n  }\n\n  /* ============================= Suggestions ============================= */\n\n  private suggestionView(s: Row): Raw {\n    const status = s[\"status\"] ?? \"pending\";\n    const up = n(s[\"up\"]);\n    const down = n(s[\"down\"]);\n    const total = up + down;\n    const pct = total ? Math.round((up / total) * 100) : 0;\n    const look: Record<string, [number, string]> = {\n      pending: [0x5865f2, \"🕐 **Pending review**\"],\n      accepted: [0x23a55a, \"✅ **Accepted**\"],\n      denied: [0xed4245, \"❌ **Denied**\"],\n      considering: [0xf0b232, \"🤔 **Under consideration**\"],\n    };\n    const [color, label] = look[status] ?? look[\"pending\"]!;\n    const decided = status === \"accepted\" || status === \"denied\";\n    return v2(\n      container(color, [\n        section(`## 💡 Suggestion #${s[\"number\"]}\\n${s[\"text\"]}`, s[\"avatar\"] ?? \"\"),\n        text(`-# Suggested by <@${s[\"author\"]}>`),\n        separator(),\n        text(\n          `👍 **${up}** · 👎 **${down}**${total ? ` · ${pct}% in favour` : \"\"}\\n${label}${s[\"reviewer\"] ? ` by <@${s[\"reviewer\"]}>` : \"\"}${s[\"reason\"] ? `\\n> ${s[\"reason\"]}` : \"\"}`,\n        ),\n        row(\n          button(`Upvote`, \"bx:sg:up\", 3, \"👍\", decided),\n          button(`Downvote`, \"bx:sg:down\", 4, \"👎\", decided),\n          button(\"Accept\", \"bx:sg:accept\", 2, \"✅\", decided),\n          button(\"Consider\", \"bx:sg:consider\", 2, \"🤔\", decided),\n          button(\"Deny\", \"bx:sg:deny\", 2, \"❌\", decided),\n        ),\n      ]),\n    );\n  }\n\n  async postSuggestion(params: {\n    channel: TextBasedChannel;\n    guild: Guild;\n    author: User;\n    text: string;\n    original: Message | null;\n    deleteOriginal: boolean;\n    thread: boolean;\n    staffRole: string;\n  }): Promise<Record<string, string>> {\n    const body = params.text.trim();\n    if (body.length < 3) throw new Error(\"The suggestion is too short.\");\n    if (!(\"send\" in params.channel)) throw new Error(\"Suggestions need a text channel.\");\n    const number =\n      (await this.host.store.count(\"suggestions\", { field: \"guild\", value: params.guild.id })) + 1;\n    const s: Row = {\n      guild: params.guild.id,\n      channel: params.channel.id,\n      author: params.author.id,\n      avatar: params.author.displayAvatarURL({ size: 128 }),\n      text: body.slice(0, 1800),\n      number: String(number),\n      up: \"0\",\n      down: \"0\",\n      status: \"pending\",\n      staff: params.staffRole,\n    };\n    const sent = await params.channel.send(this.suggestionView(s) as never);\n    s[\"message\"] = sent.id;\n    if (params.deleteOriginal && params.original?.deletable)\n      await params.original.delete().catch(() => undefined);\n    let threadId = \"\";\n    if (params.thread) {\n      const thread = await sent\n        .startThread({\n          name: `💬 Suggestion #${number}: ${body.replace(/\\s+/g, \" \").slice(0, 60)}`.slice(0, 100),\n          autoArchiveDuration: 10080,\n        })\n        .catch(() => null);\n      threadId = thread?.id ?? \"\";\n    }\n    s[\"thread\"] = threadId;\n    await this.host.store.add(\"suggestions\", s);\n    return {\n      \"suggestion.id\": sent.id,\n      \"suggestion.number\": String(number),\n      \"suggestion.url\": sent.url,\n      \"suggestion.thread\": threadId ? `<#${threadId}>` : \"\",\n    };\n  }\n\n  private async isStaff(member: GuildMember, staffRole: string): Promise<boolean> {\n    if (member.permissions.has(PermissionFlagsBits.ManageGuild)) return true;\n    const id = /(\\d{5,25})/.exec(staffRole)?.[1];\n    if (id) return member.roles.cache.has(id);\n    const name = staffRole.replace(/^@/, \"\").trim().toLowerCase();\n    return name !== \"\" && member.roles.cache.some((r) => r.name.toLowerCase() === name);\n  }\n\n  /* ========================= Ticket transcripts ========================== */\n\n  async transcript(\n    channel: TextBasedChannel,\n    target: TextBasedChannel | null,\n    title: string,\n  ): Promise<Record<string, string>> {\n    if (!(\"messages\" in channel)) throw new Error(\"This channel has no messages to save.\");\n    const all: Message[] = [];\n    let before: string | undefined;\n    for (let page = 0; page < 10; page++) {\n      const batch = await channel.messages.fetch({ limit: 100, ...(before ? { before } : {}) });\n      all.push(...batch.values());\n      if (batch.size < 100) break;\n      before = batch.last()?.id;\n    }\n    all.reverse();\n    const esc = (v: string) =>\n      v.replace(/[&<>\"]/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" })[c]!);\n    const name = \"name\" in channel ? String(channel.name ?? \"ticket\") : \"ticket\";\n    const items = all\n      .map((m) => {\n        const files = [...m.attachments.values()]\n          .map((a) => `<a href=\"${esc(a.url)}\">📎 ${esc(a.name ?? \"file\")}</a>`)\n          .join(\" \");\n        const embeds = m.embeds\n          .map(\n            (e) =>\n              `<div class=\"embed\">${e.title ? `<b>${esc(e.title)}</b><br>` : \"\"}${esc(e.description ?? \"\")}</div>`,\n          )\n          .join(\"\");\n        const body = esc(m.content || (m.components.length ? \"[panel]\" : \"\")).replace(\n          /\\n/g,\n          \"<br>\",\n        );\n        return `<div class=\"msg\"><img src=\"${esc(m.author.displayAvatarURL({ size: 64 }))}\"><div><div class=\"meta\"><b>${esc(m.member?.displayName ?? m.author.username)}</b>${m.author.bot ? '<span class=\"bot\">BOT</span>' : \"\"}<time>${m.createdAt.toISOString().replace(\"T\", \" \").slice(0, 16)} UTC</time></div><div class=\"body\">${body}</div>${embeds}${files}</div></div>`;\n      })\n      .join(\"\\n\");\n    const html = `<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>${esc(title || name)}</title><style>body{background:#313338;color:#dbdee1;font:15px/1.4 system-ui,sans-serif;margin:0;padding:24px}h1{font-size:20px;color:#f2f3f5}.sub{color:#949ba4;margin-bottom:20px}.msg{display:flex;gap:12px;padding:8px 0}.msg img{width:40px;height:40px;border-radius:50%}.meta b{color:#f2f3f5}.meta time{color:#949ba4;font-size:12px;margin-left:8px}.bot{background:#5865f2;color:#fff;font-size:10px;border-radius:3px;padding:1px 4px;margin-left:6px}.embed{border-left:4px solid #5865f2;background:#2b2d31;border-radius:4px;padding:8px 12px;margin-top:4px}a{color:#00a8fc}</style></head><body><h1>#${esc(name)}</h1><div class=\"sub\">${all.length} messages · saved ${new Date().toISOString().slice(0, 16).replace(\"T\", \" \")} UTC by Bottly</div>${items}</body></html>`;\n    const file = new AttachmentBuilder(Buffer.from(html, \"utf8\"), {\n      name: `transcript-${name}.html`,\n    });\n    const participants = [\n      ...new Set(all.filter((m) => !m.author.bot).map((m) => `<@${m.author.id}>`)),\n    ];\n    let url = \"\";\n    if (target && \"send\" in target) {\n      const sent = await target.send({\n        content: `📄 Transcript of **#${name}** — ${all.length} messages${participants.length ? ` · ${participants.slice(0, 10).join(\" \")}` : \"\"}`,\n        files: [file],\n        allowedMentions: { parse: [] },\n      });\n      url = sent.attachments.first()?.url ?? \"\";\n    }\n    return {\n      \"transcript.count\": String(all.length),\n      \"transcript.url\": url,\n      \"transcript.participants\": participants.join(\" \"),\n      \"transcript.name\": name,\n    };\n  }\n\n  /* ======================== Runtime-owned buttons ========================= */\n\n  async onInteraction(interaction: ButtonInteraction | ModalSubmitInteraction): Promise<void> {\n    const [, kind, ...rest] = interaction.customId.split(\":\");\n    try {\n      if (kind === \"bj\" && interaction.isButton())\n        return await this.onBlackjack(interaction, rest[0]!, rest[1]!);\n      if (kind === \"vp\" && interaction.isButton())\n        return await this.onPoker(interaction, rest[0]!, rest[1]!);\n      if (kind === \"gw\" && interaction.isButton())\n        return await this.onGiveaway(interaction, rest[0]!);\n      if (kind === \"sg\" && interaction.isButton())\n        return await this.onSuggestion(interaction, rest[0]!);\n      if (kind === \"sgm\" && interaction.isModalSubmit())\n        return await this.onSuggestionReason(interaction, rest[0]!, rest[1]!);\n    } catch (error) {\n      const message = `❌ ${describeError(error, 200)}`;\n      if (interaction.replied || interaction.deferred)\n        await interaction.followUp({ content: message, ephemeral: true }).catch(() => undefined);\n      else await interaction.reply({ content: message, ephemeral: true }).catch(() => undefined);\n    }\n  }\n\n  private async onBlackjack(i: ButtonInteraction, id: string, action: string): Promise<void> {\n    const s = this.blackjack.get(id);\n    if (!s) return void (await i.reply({ content: \"This game has ended.\", ephemeral: true }));\n    if (s.user !== i.user.id)\n      return void (await i.reply({ content: \"This isn't your game.\", ephemeral: true }));\n    s.at = Date.now();\n    if (action === \"double\") {\n      // Doubling takes the second stake from the wallet first.\n      await this.changeBalance(s.guild, s.user, i.user.username, (b) => {\n        if (b < s.game.bet) throw new Error(`Doubling needs another ${this.money(s.game.bet)}.`);\n        return { balance: b - s.game.bet };\n      });\n      blackjackDouble(s.game);\n    } else if (action === \"hit\") blackjackHit(s.game);\n    else blackjackStand(s.game);\n    const balance = s.game.done ? await this.finishBlackjack(id) : undefined;\n    await i.update(this.blackjackView(id, s.game, balance) as never);\n  }\n\n  private async onPoker(i: ButtonInteraction, id: string, action: string): Promise<void> {\n    const s = this.poker.get(id);\n    if (!s) return void (await i.reply({ content: \"This game has ended.\", ephemeral: true }));\n    if (s.user !== i.user.id)\n      return void (await i.reply({ content: \"This isn't your game.\", ephemeral: true }));\n    s.at = Date.now();\n    if (action.startsWith(\"h\")) {\n      const index = Number(action.slice(1));\n      if (index >= 0 && index < 5) s.game.held[index] = !s.game.held[index];\n      return void (await i.update(this.pokerView(id, s.game) as never));\n    }\n    pokerDraw(s.game);\n    this.poker.delete(id);\n    const r = await this.changeBalance(s.guild, s.user, i.user.username, (b) => ({\n      balance: b + s.game.payout,\n    }));\n    await i.update(this.pokerView(id, s.game, r.after) as never);\n  }\n\n  /** Games left untouched for 10 minutes: blackjack stands, poker draws. */\n  sweepGames(): void {\n    const stale = Date.now() - 10 * 60_000;\n    for (const [id, s] of this.blackjack)\n      if (s.at < stale) {\n        blackjackStand(s.game);\n        void this.finishBlackjack(id);\n      }\n    for (const [id, s] of this.poker)\n      if (s.at < stale) {\n        pokerDraw(s.game);\n        this.poker.delete(id);\n        void this.changeBalance(s.guild, s.user, \"\", (b) => ({ balance: b + s.game.payout }));\n      }\n  }\n\n  private async onGiveaway(i: ButtonInteraction, action: string): Promise<void> {\n    const g =\n      this.giveaways.get(i.message.id) ??\n      (await this.host.store.get(\"giveaways\", \"message\", i.message.id));\n    if (!g || g[\"status\"] !== \"running\" || n(g[\"ends\"]) <= Date.now())\n      return void (await i.reply({ content: \"This giveaway has ended.\", ephemeral: true }));\n    const key = `${i.message.id}:${i.user.id}`;\n    await this.host.store.lock(`gw:${key}`, async () => {\n      const entry = await this.host.store.get(\"giveaway_entries\", \"key\", key);\n      if (action === \"leave\") {\n        if (!entry)\n          return void (await i.reply({\n            content: \"You haven't entered this giveaway.\",\n            ephemeral: true,\n          }));\n        await this.host.store.remove(\"giveaway_entries\", \"key\", key);\n        await i.reply({ content: \"You left the giveaway.\", ephemeral: true });\n      } else {\n        if (entry)\n          return void (await i.reply({\n            content: \"✅ You're already in! Good luck.\",\n            ephemeral: true,\n          }));\n        const member = i.guild ? await i.guild.members.fetch(i.user.id).catch(() => null) : null;\n        if (!member)\n          return void (await i.reply({ content: \"Join the server to enter.\", ephemeral: true }));\n        if (g[\"role\"] && !member.roles.cache.has(g[\"role\"]))\n          return void (await i.reply({\n            content: `You need the <@&${g[\"role\"]}> role to enter.`,\n            ephemeral: true,\n            allowedMentions: { parse: [] },\n          }));\n        const days = n(g[\"minDays\"]);\n        if (days > 0 && (member.joinedTimestamp ?? Date.now()) > Date.now() - days * 86_400_000)\n          return void (await i.reply({\n            content: `You need to be in the server for ${days} days to enter.`,\n            ephemeral: true,\n          }));\n        const minLevel = n(g[\"minLevel\"]);\n        if (minLevel > 0) {\n          const lv = await this.host.store.get(\"levels\", \"key\", `${member.guild.id}:${member.id}`);\n          const level = levelFromXp(n(lv?.[\"xp\"])).level;\n          if (level < minLevel)\n            return void (await i.reply({\n              content: `You need level ${minLevel} to enter (you're level ${level}).`,\n              ephemeral: true,\n            }));\n        }\n        await this.host.store.add(\"giveaway_entries\", {\n          key,\n          giveaway: i.message.id,\n          user: i.user.id,\n        });\n        await i.reply({\n          content: `🎉 You entered the giveaway for **${g[\"prize\"]}**. Good luck!`,\n          ephemeral: true,\n        });\n      }\n    });\n    this.scheduleCountEdit(i.message, g);\n  }\n\n  private async onSuggestion(i: ButtonInteraction, action: string): Promise<void> {\n    const s = await this.host.store.get(\"suggestions\", \"message\", i.message.id);\n    if (!s)\n      return void (await i.reply({\n        content: \"This suggestion is no longer tracked.\",\n        ephemeral: true,\n      }));\n    if (action === \"up\" || action === \"down\") {\n      if (s[\"status\"] === \"accepted\" || s[\"status\"] === \"denied\")\n        return void (await i.reply({ content: \"Voting is closed.\", ephemeral: true }));\n      const key = `${i.message.id}:${i.user.id}`;\n      await this.host.store.lock(`sg:${i.message.id}`, async () => {\n        const fresh = (await this.host.store.get(\"suggestions\", \"message\", i.message.id)) ?? s;\n        const vote = await this.host.store.get(\"suggestion_votes\", \"key\", key);\n        let up = n(fresh[\"up\"]);\n        let down = n(fresh[\"down\"]);\n        let note: string;\n        if (vote?.[\"vote\"] === action) {\n          await this.host.store.remove(\"suggestion_votes\", \"key\", key);\n          if (action === \"up\") up -= 1;\n          else down -= 1;\n          note = \"Your vote was removed.\";\n        } else {\n          if (vote?.[\"vote\"] === \"up\") up -= 1;\n          if (vote?.[\"vote\"] === \"down\") down -= 1;\n          if (action === \"up\") up += 1;\n          else down += 1;\n          await this.host.store.put(\n            \"suggestion_votes\",\n            \"key\",\n            key,\n            { message: i.message.id, user: i.user.id, vote: action },\n            vote,\n          );\n          note = action === \"up\" ? \"👍 Upvoted!\" : \"👎 Downvoted.\";\n        }\n        const next = { ...fresh, up: String(Math.max(0, up)), down: String(Math.max(0, down)) };\n        await this.host.store.put(\n          \"suggestions\",\n          \"message\",\n          i.message.id,\n          { up: next.up, down: next.down },\n          fresh,\n        );\n        await i.update(this.suggestionView(next) as never);\n        await i.followUp({ content: note, ephemeral: true }).catch(() => undefined);\n      });\n      return;\n    }\n    const member = i.guild ? await i.guild.members.fetch(i.user.id).catch(() => null) : null;\n    if (\n      !member ||\n      !(await this.isStaff(member, s[\"staff\"] ?? this.host.env()[\"SUGGESTIONS_STAFF_ROLE\"] ?? \"\"))\n    )\n      return void (await i.reply({\n        content: \"Only staff can review suggestions.\",\n        ephemeral: true,\n      }));\n    const labels: Record<string, string> = { accept: \"Accept\", deny: \"Deny\", consider: \"Consider\" };\n    await i.showModal({\n      custom_id: `bx:sgm:${action}:${i.message.id}`,\n      title: `${labels[action] ?? \"Review\"} suggestion #${s[\"number\"]}`,\n      components: [\n        {\n          type: 18,\n          label: \"Reason (optional)\",\n          component: {\n            type: 4,\n            custom_id: \"reason\",\n            style: 2,\n            required: false,\n            max_length: 500,\n            placeholder: \"Shown on the suggestion and in its thread\",\n          },\n        },\n      ],\n    } as never);\n  }\n\n  private async onSuggestionReason(\n    i: ModalSubmitInteraction,\n    action: string,\n    messageId: string,\n  ): Promise<void> {\n    const s = await this.host.store.get(\"suggestions\", \"message\", messageId);\n    if (!s)\n      return void (await i.reply({\n        content: \"This suggestion is no longer tracked.\",\n        ephemeral: true,\n      }));\n    let reason = \"\";\n    try {\n      reason = i.fields.getTextInputValue(\"reason\").trim();\n    } catch {\n      reason = \"\";\n    }\n    const status = action === \"accept\" ? \"accepted\" : action === \"deny\" ? \"denied\" : \"considering\";\n    const next = { ...s, status, reason, reviewer: i.user.id };\n    await this.host.store.put(\n      \"suggestions\",\n      \"message\",\n      messageId,\n      { status, reason, reviewer: i.user.id },\n      s,\n    );\n    const channel = i.channel;\n    const message =\n      channel && \"messages\" in channel\n        ? await channel.messages.fetch(messageId).catch(() => null)\n        : null;\n    if (message) await message.edit(this.suggestionView(next) as never).catch(() => undefined);\n    const word =\n      status === \"accepted\"\n        ? \"✅ Accepted\"\n        : status === \"denied\"\n          ? \"❌ Denied\"\n          : \"🤔 Under consideration\";\n    if (s[\"thread\"]) {\n      const thread = await this.host\n        .client()\n        .channels.fetch(s[\"thread\"])\n        .catch(() => null);\n      if (thread && thread.isTextBased() && \"send\" in thread)\n        await thread\n          .send({\n            content: `${word} by ${i.user}${reason ? `: ${reason}` : \".\"}`,\n            allowedMentions: { parse: [] },\n          })\n          .catch(() => undefined);\n    }\n    await i.reply({ content: `${word}. The suggestion was updated.`, ephemeral: true });\n    await this.host.dispatch(\n      \"suggestion-reviewed\",\n      {\n        \"suggestion.status\": status,\n        \"suggestion.reason\": reason,\n        \"suggestion.text\": s[\"text\"] ?? \"\",\n        \"suggestion.number\": s[\"number\"] ?? \"\",\n        \"suggestion.author\": `<@${s[\"author\"]}>`,\n        \"suggestion.authorId\": s[\"author\"] ?? \"\",\n        \"suggestion.reviewer\": `${i.user}`,\n        \"suggestion.url\": message?.url ?? \"\",\n        \"suggestion.up\": s[\"up\"] ?? \"0\",\n        \"suggestion.down\": s[\"down\"] ?? \"0\",\n      },\n      { guild: i.guild, channel: i.channel as TextBasedChannel | null, user: i.user },\n    );\n  }\n}\n","runtime/src/components.test.ts":"import { test } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { buildComponentsV2, buildMessageComponents, isComponentsV2 } from \"./components.js\";\n\nconst id = (v: string) => v.replace(\"{user}\", \"Ana\");\n\ntest(\"V2 container with text, section, separator, gallery and buttons\", () => {\n  const raw = [\n    {\n      type: \"container\",\n      accentColor: \"#5865F2\",\n      children: [\n        { type: \"text-display\", content: \"## Shop\" },\n        {\n          type: \"section\",\n          content: \"Hi {user}\",\n          accessoryKind: \"thumbnail\",\n          accessoryUrl: \"https://x.y/a.png\",\n        },\n        { type: \"separator\", divider: true, spacing: \"large\" },\n        { type: \"media-gallery\", items: [{ url: \"https://x.y/b.png\" }, { url: \"not-a-url\" }] },\n        { type: \"button\", label: \"Buy\", style: \"success\", action: \"buy\" },\n        { type: \"link-button\", label: \"Site\", url: \"https://bottly.xyz\" },\n      ],\n    },\n  ];\n  assert.equal(isComponentsV2(raw), true);\n  const [container] = buildComponentsV2(raw, id).map((c) => c.toJSON());\n  assert.equal(container![\"type\"], 17);\n  assert.equal(container![\"accent_color\"], 0x5865f2);\n  const kids = container![\"components\"] as Record<string, unknown>[];\n  assert.deepEqual(\n    kids.map((k) => k[\"type\"]),\n    [10, 9, 14, 12, 1],\n  );\n  assert.equal((kids[1]![\"components\"] as { content: string }[])[0]!.content, \"Hi Ana\");\n  assert.equal(kids[2]![\"spacing\"], 2);\n  assert.equal((kids[3]![\"items\"] as unknown[]).length, 1);\n  assert.equal((kids[4]![\"components\"] as unknown[]).length, 2);\n});\n\ntest(\"content becomes the first text block; classic lists are not V2\", () => {\n  const out = buildComponentsV2([{ type: \"separator\" }], id, \"Hello {user}\").map((c) => c.toJSON());\n  assert.deepEqual(out[0], { type: 10, content: \"Hello Ana\" });\n  assert.equal(isComponentsV2([{ type: \"button\" }]), false);\n});\n\ntest(\"string selects: generated custom_id, option actions as values, emojis and limits\", () => {\n  const raw = [\n    {\n      id: \"cmp_menu\",\n      type: \"string-select\",\n      placeholder: \"Pick {user}\",\n      maxValues: 2,\n      options: [\n        { label: \"Support\", action: \"open_support\", emoji: \"<:help:123456789012345678>\" },\n        { label: \"Bug\", action: \"open_support\", description: \"Broken\", emoji: \"🐛\" },\n        { label: \"Legacy\", value: \"legacy_value\" },\n        { label: \"Bad emoji\", action: \"x\", emoji: \"not an emoji\" },\n      ],\n    },\n  ];\n  const [row] = buildMessageComponents(raw, id).map((r) => r.toJSON());\n  const menu = (row as unknown as { components: Record<string, unknown>[] }).components[0]!;\n  assert.equal(menu[\"custom_id\"], \"sel_cmp_menu\");\n  assert.equal(menu[\"placeholder\"], \"Pick Ana\");\n  assert.equal(menu[\"min_values\"], 1);\n  assert.equal(menu[\"max_values\"], 2);\n  const options = menu[\"options\"] as Record<string, unknown>[];\n  assert.deepEqual(\n    options.map((o) => o[\"value\"]),\n    [\"open_support\", \"open_support~2\", \"legacy_value\", \"x\"],\n  );\n  assert.deepEqual(options[0]![\"emoji\"], { id: \"123456789012345678\", name: \"help\" });\n  assert.deepEqual(options[1]![\"emoji\"], { name: \"🐛\" });\n  assert.equal(options[1]![\"description\"], \"Broken\");\n  assert.equal(options[3]![\"emoji\"], undefined);\n});\n\ntest(\"legacy string selects keep their saved menu ID\", () => {\n  const raw = [\n    {\n      id: \"cmp_x\",\n      type: \"string-select\",\n      action: \"panel_menu\",\n      options: [{ label: \"A\", value: \"A\" }],\n    },\n  ];\n  const [row] = buildMessageComponents(raw, id).map((r) => r.toJSON());\n  const menu = (row as unknown as { components: Record<string, unknown>[] }).components[0]!;\n  assert.equal(menu[\"custom_id\"], \"panel_menu\");\n  assert.equal((menu[\"options\"] as { value: string }[])[0]!.value, \"A\");\n});\n","runtime/src/components.ts":"/**\n * Converts Bottly's stored component payload (src/types/bot.ts -> BotComponent)\n * into real discord.js builders.\n *\n * Supported (classic message components, one component per action row):\n *   button, link-button, string-select, user-select, role-select,\n *   channel-select, mentionable-select\n *\n * Components V2 (containers, sections, text displays, separators, media\n * galleries) are built by buildComponentsV2 below and sent with the\n * IsComponentsV2 flag when a message node is in \"components\" mode. File\n * components are skipped: flows cannot upload attachments yet.\n */\nimport {\n  ActionRowBuilder,\n  ButtonBuilder,\n  ButtonStyle,\n  ChannelSelectMenuBuilder,\n  MentionableSelectMenuBuilder,\n  RoleSelectMenuBuilder,\n  StringSelectMenuBuilder,\n  StringSelectMenuOptionBuilder,\n  UserSelectMenuBuilder,\n} from \"discord.js\";\nimport {\n  parseComponentEmoji,\n  SELECT_LIMITS,\n  selectMenuCustomId,\n  selectOptionValues,\n  selectValueRange,\n} from \"./flow-contract.js\";\n\nconst MAX_ROWS = 5;\n\nexport type MessageRow = ActionRowBuilder<\n  | ButtonBuilder\n  | StringSelectMenuBuilder\n  | UserSelectMenuBuilder\n  | RoleSelectMenuBuilder\n  | ChannelSelectMenuBuilder\n  | MentionableSelectMenuBuilder\n>;\n\ninterface RawOption {\n  label?: string;\n  value?: string;\n  action?: string;\n  description?: string;\n  emoji?: string;\n}\n\ninterface RawComponent {\n  id?: string;\n  type?: string;\n  label?: string;\n  style?: string;\n  emoji?: string;\n  action?: string;\n  url?: string;\n  disabled?: boolean;\n  placeholder?: string;\n  options?: RawOption[];\n  minValues?: number;\n  maxValues?: number;\n}\n\nconst BUTTON_STYLES: Record<string, ButtonStyle> = {\n  primary: ButtonStyle.Primary,\n  secondary: ButtonStyle.Secondary,\n  success: ButtonStyle.Success,\n  danger: ButtonStyle.Danger,\n};\n\nfunction customIdFor(component: RawComponent, index: number): string {\n  const raw = (component.action ?? \"\").trim();\n  const fallback = `bottly_${index}`;\n  return (raw === \"\" ? fallback : raw).slice(0, 100);\n}\n\nfunction buildButton(\n  component: RawComponent,\n  index: number,\n  resolve: (value: string) => string,\n): ButtonBuilder | null {\n  const label = resolve(component.label ?? \"\").slice(0, 80);\n  const button = new ButtonBuilder();\n\n  if (component.type === \"link-button\" || component.style === \"link\") {\n    const url = resolve(component.url ?? \"\");\n    if (!/^https?:\\/\\//.test(url)) return null; // Discord rejects non-http links\n    button.setStyle(ButtonStyle.Link).setURL(url);\n  } else {\n    button\n      .setStyle(BUTTON_STYLES[component.style ?? \"primary\"] ?? ButtonStyle.Primary)\n      .setCustomId(customIdFor(component, index));\n  }\n\n  if (label !== \"\") button.setLabel(label);\n  else if (parseComponentEmoji(component.emoji) === null) button.setLabel(\"Button\");\n\n  const emoji = parseComponentEmoji(component.emoji);\n  if (emoji !== null) {\n    try {\n      button.setEmoji(emoji);\n    } catch {\n      /* an invalid emoji must not sink the whole message */\n    }\n  }\n  if (component.disabled === true) button.setDisabled(true);\n\n  return button;\n}\n\nfunction buildSelect(\n  component: RawComponent,\n  index: number,\n  resolve: (value: string) => string,\n):\n  | StringSelectMenuBuilder\n  | UserSelectMenuBuilder\n  | RoleSelectMenuBuilder\n  | ChannelSelectMenuBuilder\n  | MentionableSelectMenuBuilder\n  | null {\n  const customId = customIdFor(component, index);\n  const placeholder = resolve(component.placeholder ?? \"\").slice(0, SELECT_LIMITS.placeholder);\n  const range = selectValueRange(component);\n\n  switch (component.type) {\n    case \"string-select\": {\n      // The menu itself has no user-facing ID: each option sends its own\n      // action ID as its value, and the executor runs the matching trigger.\n      const raw = (component.options ?? []).slice(0, SELECT_LIMITS.options);\n      const values = selectOptionValues(raw);\n      const options = raw.map((option, i) => {\n        const built = new StringSelectMenuOptionBuilder()\n          .setLabel((resolve(option.label ?? \"\") || \"Option\").slice(0, SELECT_LIMITS.label))\n          .setValue(values[i]!);\n        const description = resolve(option.description ?? \"\").slice(0, SELECT_LIMITS.description);\n        if (description !== \"\") built.setDescription(description);\n        const emoji = parseComponentEmoji(option.emoji);\n        if (emoji !== null) {\n          try {\n            built.setEmoji(emoji);\n          } catch {\n            /* an invalid emoji must not sink the whole message */\n          }\n        }\n        return built;\n      });\n      if (options.length === 0) return null; // Discord requires >= 1 option\n      const { min, max } = selectValueRange(component, options.length);\n      const menu = new StringSelectMenuBuilder()\n        .setCustomId(selectMenuCustomId(component, index))\n        .addOptions(options)\n        .setMinValues(min)\n        .setMaxValues(max);\n      if (placeholder !== \"\") menu.setPlaceholder(placeholder);\n      if (component.disabled === true) menu.setDisabled(true);\n      return menu;\n    }\n    case \"user-select\": {\n      const menu = new UserSelectMenuBuilder()\n        .setCustomId(customId)\n        .setMinValues(range.min)\n        .setMaxValues(range.max);\n      if (placeholder !== \"\") menu.setPlaceholder(placeholder);\n      if (component.disabled === true) menu.setDisabled(true);\n      return menu;\n    }\n    case \"role-select\": {\n      const menu = new RoleSelectMenuBuilder()\n        .setCustomId(customId)\n        .setMinValues(range.min)\n        .setMaxValues(range.max);\n      if (placeholder !== \"\") menu.setPlaceholder(placeholder);\n      if (component.disabled === true) menu.setDisabled(true);\n      return menu;\n    }\n    case \"channel-select\": {\n      const menu = new ChannelSelectMenuBuilder()\n        .setCustomId(customId)\n        .setMinValues(range.min)\n        .setMaxValues(range.max);\n      if (placeholder !== \"\") menu.setPlaceholder(placeholder);\n      if (component.disabled === true) menu.setDisabled(true);\n      return menu;\n    }\n    case \"mentionable-select\": {\n      const menu = new MentionableSelectMenuBuilder()\n        .setCustomId(customId)\n        .setMinValues(range.min)\n        .setMaxValues(range.max);\n      if (placeholder !== \"\") menu.setPlaceholder(placeholder);\n      if (component.disabled === true) menu.setDisabled(true);\n      return menu;\n    }\n    default:\n      return null;\n  }\n}\n\n/** Flattens action rows/containers so nested buttons are still emitted. */\nfunction flatten(raw: unknown, depth = 0): RawComponent[] {\n  if (!Array.isArray(raw) || depth > 3) return [];\n  const out: RawComponent[] = [];\n  for (const entry of raw) {\n    if (typeof entry !== \"object\" || entry === null) continue;\n    const component = entry as RawComponent & { children?: unknown };\n    if (component.type === \"action-row\" || component.type === \"container\") {\n      out.push(...flatten(component.children, depth + 1));\n      continue;\n    }\n    out.push(component);\n  }\n  return out;\n}\n\nexport function buildMessageComponents(\n  raw: unknown,\n  resolve: (value: string) => string,\n): MessageRow[] {\n  const components = flatten(raw);\n  if (components.length === 0) return [];\n\n  const rows: MessageRow[] = [];\n  let buttonRow: MessageRow | null = null;\n  let buttonsInRow = 0;\n\n  for (const [index, component] of components.entries()) {\n    if (rows.length >= MAX_ROWS) break;\n\n    if (component.type === \"button\" || component.type === \"link-button\") {\n      const button = buildButton(component, index, resolve);\n      if (button === null) continue;\n      if (buttonRow === null || buttonsInRow >= 5) {\n        buttonRow = new ActionRowBuilder();\n        rows.push(buttonRow);\n        buttonsInRow = 0;\n      }\n      buttonRow.addComponents(button);\n      buttonsInRow += 1;\n      continue;\n    }\n\n    const select = buildSelect(component, index, resolve);\n    if (select === null) continue;\n    // A select menu must be alone in its row.\n    const row: MessageRow = new ActionRowBuilder();\n    row.addComponents(select);\n    rows.push(row);\n    buttonRow = null;\n    buttonsInRow = 0;\n  }\n\n  return rows.slice(0, MAX_ROWS);\n}\n\n/* ------------------------------------------------------------------ *\n * Components V2 (containers, sections, text, separators, galleries)\n * ------------------------------------------------------------------ */\n\n/** Discord's IsComponentsV2 message flag (1 << 15). */\nexport const IS_COMPONENTS_V2 = 1 << 15;\n\nconst V2_TYPES = new Set([\n  \"container\",\n  \"text-display\",\n  \"section\",\n  \"separator\",\n  \"media-gallery\",\n  \"file\",\n]);\nconst INTERACTIVE = new Set([\n  \"button\",\n  \"link-button\",\n  \"string-select\",\n  \"user-select\",\n  \"role-select\",\n  \"channel-select\",\n  \"mentionable-select\",\n]);\n/** Discord allows 40 components (nested ones included) per V2 message. */\nconst MAX_V2_COMPONENTS = 40;\n\ninterface RawV2 extends RawComponent {\n  content?: string;\n  items?: { url?: string; description?: string; spoiler?: boolean }[];\n  divider?: boolean;\n  spacing?: string;\n  accentColor?: string;\n  spoiler?: boolean;\n  children?: unknown;\n  accessory?: RawV2 | null;\n  accessoryUrl?: string;\n  accessoryKind?: string;\n}\n\ntype ApiComponent = Record<string, unknown>;\n\n/** Raw API JSON that discord.js passes through untouched (it calls toJSON()). */\nexport interface RawJson {\n  toJSON(): ApiComponent;\n}\nconst asJson = (data: ApiComponent): RawJson => ({ toJSON: () => data });\n\nexport function isComponentsV2(raw: unknown): boolean {\n  return (\n    Array.isArray(raw) &&\n    raw.some((c) => typeof c === \"object\" && c !== null && V2_TYPES.has(String((c as RawV2).type)))\n  );\n}\n\nfunction colorInt(color: string | undefined): number | undefined {\n  const m = /^#?([0-9a-f]{6})$/i.exec((color ?? \"\").trim());\n  return m ? Number.parseInt(m[1]!, 16) : undefined;\n}\n\n/** Web links, or a file sent with the message (a bot image: attachment://welcome.png). */\nconst isHttp = (url: string) => /^(https?|attachment):\\/\\//.test(url);\n\n/**\n * Builds a Components V2 message body. `leadingText` (the node's content) is\n * shown as the first text block, since V2 messages cannot carry content.\n */\nexport function buildComponentsV2(\n  raw: unknown,\n  resolve: (value: string) => string,\n  leadingText = \"\",\n): RawJson[] {\n  let count = 0;\n  let index = 0;\n  const take = () => count < MAX_V2_COMPONENTS && ++count > 0;\n\n  const text = (content: string): ApiComponent | null => {\n    const value = resolve(content).slice(0, 4000);\n    return value.trim() !== \"\" && take() ? { type: 10, content: value } : null;\n  };\n\n  /** Consecutive buttons share a row (max 5); each select gets its own row. */\n  const rows = (list: RawV2[]): ApiComponent[] => {\n    const out: ApiComponent[] = [];\n    let buttons: ApiComponent[] = [];\n    const flush = () => {\n      if (buttons.length && take()) out.push({ type: 1, components: buttons });\n      buttons = [];\n    };\n    for (const c of list) {\n      if (c.type === \"button\" || c.type === \"link-button\") {\n        const button = buildButton(c, index++, resolve);\n        if (button === null || !take()) continue;\n        buttons.push(button.toJSON() as unknown as ApiComponent);\n        if (buttons.length === 5) flush();\n      } else {\n        flush();\n        const select = buildSelect(c, index++, resolve);\n        if (select !== null && take() && take())\n          out.push({ type: 1, components: [select.toJSON() as unknown as ApiComponent] });\n      }\n    }\n    flush();\n    return out;\n  };\n\n  const one = (c: RawV2, depth: number): ApiComponent[] => {\n    switch (c.type) {\n      case \"text-display\": {\n        const t = text(c.content ?? c.label ?? \"\");\n        return t ? [t] : [];\n      }\n      case \"separator\":\n        return take()\n          ? [{ type: 14, divider: c.divider !== false, spacing: c.spacing === \"large\" ? 2 : 1 }]\n          : [];\n      case \"media-gallery\": {\n        const items = (c.items ?? [])\n          .map((item) => ({ ...item, url: resolve(item.url ?? \"\") }))\n          .filter((item) => isHttp(item.url))\n          .slice(0, 10)\n          .map((item) => ({\n            media: { url: item.url },\n            ...(item.description ? { description: resolve(item.description).slice(0, 1024) } : {}),\n            ...(item.spoiler ? { spoiler: true } : {}),\n          }));\n        return items.length && take() ? [{ type: 12, items }] : [];\n      }\n      case \"section\": {\n        const body = text(c.content ?? c.label ?? \"\");\n        if (!body) return [];\n        let accessory: ApiComponent | null = null;\n        const thumb = resolve(c.accessoryUrl ?? \"\");\n        if (c.accessoryKind !== \"button\" && isHttp(thumb)) {\n          accessory = { type: 11, media: { url: thumb } };\n        } else if (\n          c.accessory &&\n          (c.accessory.type === \"button\" || c.accessory.type === \"link-button\")\n        ) {\n          const button = buildButton(c.accessory, index++, resolve);\n          if (button !== null) accessory = button.toJSON() as unknown as ApiComponent;\n        }\n        // A section needs an accessory; without one it is just text.\n        if (accessory === null || !take()) return [body];\n        return [{ type: 9, components: [body], accessory }];\n      }\n      case \"container\": {\n        if (depth > 0 || !take()) return [];\n        const children = walk(Array.isArray(c.children) ? (c.children as RawV2[]) : [], depth + 1);\n        if (!children.length) return [];\n        const accent = colorInt(c.accentColor);\n        return [\n          {\n            type: 17,\n            components: children,\n            ...(accent !== undefined ? { accent_color: accent } : {}),\n            ...(c.spoiler ? { spoiler: true } : {}),\n          },\n        ];\n      }\n      case \"action-row\":\n        return rows(Array.isArray(c.children) ? (c.children as RawV2[]) : []);\n      default:\n        return []; // \"file\" needs an uploaded attachment, which flows cannot provide yet.\n    }\n  };\n\n  const walk = (list: RawV2[], depth: number): ApiComponent[] => {\n    const out: ApiComponent[] = [];\n    let pending: RawV2[] = [];\n    for (const c of list) {\n      if (typeof c !== \"object\" || c === null) continue;\n      if (INTERACTIVE.has(String(c.type))) {\n        pending.push(c);\n        continue;\n      }\n      if (pending.length) out.push(...rows(pending));\n      pending = [];\n      out.push(...one(c, depth));\n    }\n    if (pending.length) out.push(...rows(pending));\n    return out;\n  };\n\n  const lead = leadingText ? text(leadingText) : null;\n  const body = walk(Array.isArray(raw) ? (raw as RawV2[]) : [], 0);\n  return [...(lead ? [lead] : []), ...body].map(asJson);\n}\n","runtime/src/config.ts":"/**\n * Environment configuration. Anything invalid throws at boot: a runtime that\n * cannot authenticate or decrypt tokens should fail loudly, not half-work.\n */\nimport { GatewayIntentBits } from \"discord.js\";\nimport { logger } from \"./logger.js\";\n\n/** Both shared secrets are the entire security perimeter of this service. */\nconst MIN_SECRET_LENGTH = 32;\n\n/**\n * Non-privileged intents that are always requested. Guilds is required for the\n * guild cache (guild_count); GuildMessages is what message-triggered flows need.\n * Privileged intents (GuildMembers, GuildPresences, MessageContent) must be\n * enabled in the Discord developer portal AND listed in DISCORD_EXTRA_INTENTS.\n */\nconst DEFAULT_INTENT_NAMES = [\"Guilds\", \"GuildMessages\"] as const;\n\nexport interface RuntimeConfig {\n  host: string;\n  port: number;\n  /** Inbound: control plane → runtime (BOT_RUNTIME_SHARED_SECRET). */\n  inboundSecret: string;\n  /** Outbound: runtime → control plane (BOT_RUNTIME_CALLBACK_SECRET). */\n  callbackSecret: string;\n  /** Origin of the web app, no trailing slash. */\n  controlPlaneUrl: string;\n  intents: number[];\n  maxConcurrentBots: number;\n  /**\n   * Exported bot (src/standalone.ts, BOTTLY_STANDALONE=1): one bot from local\n   * files, no control plane. Storage is a local file and AI Chat calls the\n   * owner's provider directly.\n   */\n  standalone: boolean;\n}\n\nfunction requireEnv(name: string): string {\n  const value = process.env[name]?.trim();\n  if (!value) throw new Error(`Missing required environment variable ${name}.`);\n  return value;\n}\n\nfunction requireSecret(name: string): string {\n  const value = requireEnv(name);\n  if (value.length < MIN_SECRET_LENGTH) {\n    throw new Error(\n      `${name} must be at least ${MIN_SECRET_LENGTH} characters. ` +\n        `Generate one with: node -e \"console.log(require('node:crypto').randomBytes(32).toString('base64url'))\"`,\n    );\n  }\n  return value;\n}\n\nfunction parsePort(raw: string | undefined, fallback: number): number {\n  if (!raw) return fallback;\n  const port = Number.parseInt(raw, 10);\n  if (!Number.isInteger(port) || port < 1 || port > 65535) {\n    throw new Error(`BOT_RUNTIME_PORT must be a port number between 1 and 65535, got \"${raw}\".`);\n  }\n  return port;\n}\n\nfunction parsePositiveInt(name: string, raw: string | undefined, fallback: number): number {\n  if (!raw) return fallback;\n  const value = Number.parseInt(raw, 10);\n  if (!Number.isInteger(value) || value < 1) {\n    throw new Error(`${name} must be a positive integer, got \"${raw}\".`);\n  }\n  return value;\n}\n\nfunction parseControlPlaneUrl(raw: string): string {\n  let parsed: URL;\n  try {\n    parsed = new URL(raw);\n  } catch {\n    throw new Error(`CONTROL_PLANE_URL must be an absolute URL, got \"${raw}\".`);\n  }\n  if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n    throw new Error(`CONTROL_PLANE_URL must use http or https, got \"${parsed.protocol}\".`);\n  }\n  const isLocal = parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\";\n  if (parsed.protocol === \"http:\" && !isLocal) {\n    // The callback secret and encrypted tokens travel over this connection.\n    logger.warn(\n      `CONTROL_PLANE_URL uses plain http (${parsed.origin}). Use https outside local development.`,\n    );\n  }\n  return parsed.origin + parsed.pathname.replace(/\\/+$/, \"\");\n}\n\n/**\n * Resolves intent names against discord.js's own enum, so no intent name is\n * hardcoded (and typos fail at boot instead of at identify time).\n */\nfunction parseIntents(raw: string | undefined): number[] {\n  const extra = (raw ?? \"\")\n    .split(\",\")\n    .map((part) => part.trim())\n    .filter((part) => part.length > 0);\n\n  const table = GatewayIntentBits as unknown as Record<string, number | string | undefined>;\n  const bits: number[] = [];\n\n  for (const name of [...DEFAULT_INTENT_NAMES, ...extra]) {\n    const bit = table[name];\n    if (typeof bit !== \"number\") {\n      throw new Error(\n        `Unknown gateway intent \"${name}\" in DISCORD_EXTRA_INTENTS. ` +\n          \"Use the discord.js GatewayIntentBits names, e.g. GuildMembers,MessageContent.\",\n      );\n    }\n    if (!bits.includes(bit)) bits.push(bit);\n  }\n\n  return bits;\n}\n\nfunction load(): RuntimeConfig {\n  if (process.env[\"BOTTLY_STANDALONE\"] === \"1\") {\n    return {\n      host: \"127.0.0.1\",\n      port: 0,\n      inboundSecret: \"\",\n      callbackSecret: \"\",\n      controlPlaneUrl: \"http://localhost\",\n      intents: parseIntents(process.env[\"DISCORD_EXTRA_INTENTS\"]),\n      maxConcurrentBots: 1,\n      standalone: true,\n    };\n  }\n  return {\n    standalone: false,\n    host: process.env[\"BOT_RUNTIME_HOST\"]?.trim() || \"0.0.0.0\",\n    port: parsePort(process.env[\"BOT_RUNTIME_PORT\"], 8787),\n    inboundSecret: requireSecret(\"BOT_RUNTIME_SHARED_SECRET\"),\n    callbackSecret: requireSecret(\"BOT_RUNTIME_CALLBACK_SECRET\"),\n    controlPlaneUrl: parseControlPlaneUrl(requireEnv(\"CONTROL_PLANE_URL\")),\n    intents: parseIntents(process.env[\"DISCORD_EXTRA_INTENTS\"]),\n    maxConcurrentBots: parsePositiveInt(\n      \"MAX_CONCURRENT_BOTS\",\n      process.env[\"MAX_CONCURRENT_BOTS\"],\n      50,\n    ),\n  };\n}\n\nexport const config: RuntimeConfig = load();\n","runtime/src/control-plane.ts":"/**\n * Outbound calls to the web app's internal API.\n *\n * Auth: Authorization: Bearer ${BOT_RUNTIME_CALLBACK_SECRET} — see\n * src/lib/internal-api-auth.server.ts in the web app. The runtime never touches\n * Supabase directly; the control plane owns all database access.\n */\nimport { config } from \"./config.js\";\nimport { logger } from \"./logger.js\";\nimport { describeError } from \"./redact.js\";\nimport type { EncryptedBotToken, RuntimeReport } from \"./types.js\";\n\nconst TOKEN_TIMEOUT_MS = 8_000;\nconst REPORT_TIMEOUT_MS = 8_000;\nconst REPORT_RETRY_DELAY_MS = 750;\n\n/** Caps mirroring the control plane's zod schema, so a report is never rejected. */\nconst MAX_EVENTS = 50;\nconst MAX_EVENT_NAME = 120;\nconst MAX_DESCRIPTION = 2_000;\nconst MAX_USERNAME = 120;\n\nexport type ControlPlaneErrorKind = \"missing\" | \"unauthorized\" | \"unavailable\" | \"invalid\";\n\nexport class ControlPlaneError extends Error {\n  readonly kind: ControlPlaneErrorKind;\n  readonly status: number | undefined;\n\n  constructor(kind: ControlPlaneErrorKind, message: string, status?: number) {\n    super(message);\n    this.name = \"ControlPlaneError\";\n    this.kind = kind;\n    this.status = status;\n  }\n}\n\nfunction authHeaders(extra?: Record<string, string>): Record<string, string> {\n  return {\n    Authorization: `Bearer ${config.callbackSecret}`,\n    accept: \"application/json\",\n    ...extra,\n  };\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => {\n    setTimeout(resolve, ms);\n  });\n}\n\n/**\n * Fetches the token record for one bot.\n *\n * Managed runtimes hold BOT_TOKEN_ENCRYPTION_KEY and get a sealed record.\n * Self-hosted nodes never hold that key (it would decrypt every user's token),\n * so the control plane decrypts server-side and returns the plaintext of this\n * one bot over TLS instead.\n */\nexport async function fetchBotToken(\n  botId: string,\n  userId: string,\n): Promise<{ plaintext: string } | EncryptedBotToken> {\n  const url =\n    `${config.controlPlaneUrl}/api/internal/bots/${encodeURIComponent(botId)}/token` +\n    `?userId=${encodeURIComponent(userId)}`;\n\n  let response: Response;\n  try {\n    response = await fetch(url, {\n      method: \"GET\",\n      headers: authHeaders(),\n      signal: AbortSignal.timeout(TOKEN_TIMEOUT_MS),\n    });\n  } catch (error) {\n    throw new ControlPlaneError(\n      \"unavailable\",\n      `Could not reach the control plane for a token: ${describeError(error)}`,\n    );\n  }\n\n  if (response.status === 404) {\n    throw new ControlPlaneError(\"missing\", \"No token is stored for this bot.\", 404);\n  }\n  if (response.status === 401 || response.status === 403) {\n    throw new ControlPlaneError(\n      \"unauthorized\",\n      \"The control plane rejected the runtime callback secret.\",\n      response.status,\n    );\n  }\n  if (!response.ok) {\n    throw new ControlPlaneError(\n      \"unavailable\",\n      `The control plane returned ${response.status} for a token lookup.`,\n      response.status,\n    );\n  }\n\n  const body: unknown = await response.json().catch(() => null);\n  if (typeof body !== \"object\" || body === null) {\n    throw new ControlPlaneError(\"invalid\", \"Token lookup returned a non-JSON body.\");\n  }\n\n  const record = body as {\n    ok?: unknown;\n    token?: unknown;\n    ciphertext?: unknown;\n    iv?: unknown;\n    keyVersion?: unknown;\n    applicationId?: unknown;\n  };\n\n  if (record.ok === true && typeof record.token === \"string\" && record.token.length > 0) {\n    return { plaintext: record.token };\n  }\n\n  if (\n    record.ok !== true ||\n    typeof record.ciphertext !== \"string\" ||\n    typeof record.iv !== \"string\" ||\n    typeof record.keyVersion !== \"number\"\n  ) {\n    throw new ControlPlaneError(\"invalid\", \"Token lookup returned an unexpected payload.\");\n  }\n\n  return {\n    ciphertext: record.ciphertext,\n    iv: record.iv,\n    keyVersion: record.keyVersion,\n    applicationId: typeof record.applicationId === \"string\" ? record.applicationId : null,\n  };\n}\n\nfunction clampReport(report: RuntimeReport): RuntimeReport {\n  return {\n    botId: report.botId,\n    userId: report.userId,\n    state: report.state,\n    startedAt: report.startedAt,\n    lastError: report.lastError === null ? null : report.lastError.slice(0, MAX_DESCRIPTION),\n    guildCount: report.guildCount === null ? null : Math.max(0, Math.trunc(report.guildCount)),\n    username: report.username === null ? null : report.username.slice(0, MAX_USERNAME),\n    events: report.events.slice(0, MAX_EVENTS).map((entry) => ({\n      event: entry.event.slice(0, MAX_EVENT_NAME),\n      level: entry.level,\n      description: entry.description.slice(0, MAX_DESCRIPTION),\n      at: entry.at,\n      ...(entry.flowId ? { flowId: entry.flowId.slice(0, 120) } : {}),\n      ...(entry.nodeId ? { nodeId: entry.nodeId.slice(0, 120) } : {}),\n    })),\n  };\n}\n\nasync function postReport(body: RuntimeReport): Promise<{ ok: boolean; retryable: boolean }> {\n  try {\n    const response = await fetch(`${config.controlPlaneUrl}/api/internal/runtime/events`, {\n      method: \"POST\",\n      headers: authHeaders({ \"content-type\": \"application/json\" }),\n      body: JSON.stringify(body),\n      signal: AbortSignal.timeout(REPORT_TIMEOUT_MS),\n    });\n\n    if (response.ok) return { ok: true, retryable: false };\n\n    // 400 means our payload is wrong — retrying cannot help.\n    const retryable = response.status >= 500 || response.status === 429;\n    logger.warn(\n      `Control plane rejected a runtime report for bot ${body.botId} (${response.status}).`,\n    );\n    return { ok: false, retryable };\n  } catch (error) {\n    logger.warn(`Runtime report for bot ${body.botId} failed: ${describeError(error)}`);\n    return { ok: false, retryable: true };\n  }\n}\n\n/**\n * Pushes state + activity to the control plane. Never throws: a reporting\n * failure must not tear down a working gateway connection. The dashboard's own\n * status probe re-reads live state, so a dropped report is self-healing.\n */\nexport async function reportRuntimeState(report: RuntimeReport): Promise<boolean> {\n  if (config.standalone) return true; // an exported bot only logs\n  const body = clampReport(report);\n\n  const first = await postReport(body);\n  if (first.ok) return true;\n  if (!first.retryable) return false;\n\n  await sleep(REPORT_RETRY_DELAY_MS);\n  const second = await postReport(body);\n  if (!second.ok) {\n    logger.error(`Giving up on runtime report for bot ${body.botId} (state: ${body.state}).`);\n  }\n  return second.ok;\n}\n\n/** Bottly storage call for one bot (control plane owns the data + limits). */\nexport async function storageRequest(\n  botId: string,\n  userId: string,\n  body: Record<string, unknown>,\n): Promise<{ ok: boolean; rows?: Record<string, unknown>[]; count?: number; groups?: { key: string; value: number | null }[]; error?: string }> {\n  if (config.standalone) {\n    const { localStorage } = await import(\"./local-storage.js\");\n    return localStorage().run(body);\n  }\n  try {\n    const response = await fetch(\n      `${config.controlPlaneUrl}/api/internal/bots/${encodeURIComponent(botId)}/storage?userId=${encodeURIComponent(userId)}`,\n      {\n        method: \"POST\",\n        headers: { ...authHeaders(), \"content-type\": \"application/json\" },\n        body: JSON.stringify(body),\n        signal: AbortSignal.timeout(10_000),\n      },\n    );\n    const json = (await response.json().catch(() => null)) as {\n      ok?: boolean;\n      rows?: Record<string, unknown>[];\n      count?: number;\n      groups?: { key: string; value: number | null }[];\n      error?: string;\n    } | null;\n    if (!response.ok || !json?.ok) return { ok: false, error: json?.error ?? `HTTP ${response.status}` };\n    return {\n      ok: true,\n      ...(json.rows ? { rows: json.rows } : {}),\n      ...(typeof json.count === \"number\" ? { count: json.count } : {}),\n      ...(Array.isArray(json.groups) ? { groups: json.groups } : {}),\n    };\n  } catch (error) {\n    return { ok: false, error: describeError(error) };\n  }\n}\n\n/** AI Chat plugin: one answer from Bottly's AI, counted on the bot owner's daily AI requests. */\nexport async function aiChatRequest(\n  botId: string,\n  userId: string,\n  body: {\n    prompt: string;\n    personality: string;\n    memoryKey: string | null;\n    maxLength: number;\n    botName: string;\n    /** The owner's own provider and key ({env.AI_PROVIDER}, {env.AI_API_KEY}); \"\" = Bottly's AI. */\n    provider: string;\n    apiKey: string;\n    model: string;\n  },\n): Promise<{ ok: true; reply: string } | { ok: false; error: string }> {\n  if (config.standalone) return standaloneAiChat(botId, userId, body);\n  try {\n    const response = await fetch(\n      `${config.controlPlaneUrl}/api/internal/bots/${encodeURIComponent(botId)}/ai?userId=${encodeURIComponent(userId)}`,\n      {\n        method: \"POST\",\n        headers: { ...authHeaders(), \"content-type\": \"application/json\" },\n        body: JSON.stringify(body),\n        signal: AbortSignal.timeout(60_000),\n      },\n    );\n    const json = (await response.json().catch(() => null)) as { ok?: boolean; reply?: string; error?: string } | null;\n    if (!response.ok || !json?.ok || typeof json.reply !== \"string\")\n      return { ok: false, error: json?.error ?? `HTTP ${response.status}` };\n    return { ok: true, reply: json.reply };\n  } catch (error) {\n    return { ok: false, error: describeError(error) };\n  }\n}\n\n/**\n * Forwards a server-agent mention or button press. The control plane answers\n * only when it is done (AI plus every Discord change), hence the long timeout.\n */\nexport async function agentRequest(\n  botId: string,\n  userId: string,\n  body: Record<string, unknown>,\n): Promise<{ ok: boolean; error?: string }> {\n  if (config.standalone) return { ok: false, error: \"The AI server agent only runs on Bottly hosting.\" };\n  try {\n    const response = await fetch(\n      `${config.controlPlaneUrl}/api/internal/bots/${encodeURIComponent(botId)}/agent?userId=${encodeURIComponent(userId)}`,\n      {\n        method: \"POST\",\n        headers: { ...authHeaders(), \"content-type\": \"application/json\" },\n        body: JSON.stringify(body),\n        signal: AbortSignal.timeout(300_000),\n      },\n    );\n    const json = (await response.json().catch(() => null)) as { ok?: boolean; error?: string } | null;\n    if (!response.ok || !json?.ok) return { ok: false, error: json?.error ?? `HTTP ${response.status}` };\n    return { ok: true };\n  } catch (error) {\n    return { ok: false, error: describeError(error) };\n  }\n}\n\n/**\n * AI Chat in an exported bot: the owner's own provider and key, called\n * directly (same prompt, cleaning and memory as the control plane's\n * /api/internal/bots/$botId/ai). Bottly's own AI needs Bottly hosting.\n */\nasync function standaloneAiChat(\n  botId: string,\n  userId: string,\n  body: { prompt: string; personality: string; memoryKey: string | null; maxLength: number; botName: string; provider: string; apiKey: string; model: string },\n): Promise<{ ok: true; reply: string } | { ok: false; error: string }> {\n  const providers = await import(\"./ai-providers.js\");\n  const chat = await import(\"./ai-chat.js\");\n  const provider = providers.providerOf(body.provider);\n  if (provider === \"bottly\" || provider === \"unknown\")\n    return { ok: false, error: \"Set AI_PROVIDER and AI_API_KEY in .env: Bottly's own AI only runs on Bottly hosting.\" };\n  if (!body.apiKey.trim()) return { ok: false, error: \"Set AI_API_KEY in .env.\" };\n  const where = body.memoryKey ? { field: \"key\", value: body.memoryKey } : null;\n  let history: { role: \"user\" | \"assistant\"; content: string }[] = [];\n  if (where) {\n    const found = await storageRequest(botId, userId, { op: \"find\", table: \"ai_memory\", where });\n    const turns = found.rows?.[0]?.[\"turns\"];\n    history = chat.readMemory(typeof turns === \"string\" ? turns : null);\n  }\n  try {\n    const req = providers.buildProviderRequest(provider, {\n      apiKey: body.apiKey.trim(),\n      model: body.model,\n      system: chat.systemPrompt(body.botName, body.personality, body.maxLength, false),\n      turns: [...history, { role: \"user\", content: body.prompt }],\n      maxTokens: Math.ceil(body.maxLength / 2) + 200,\n    });\n    const res = await fetch(req.url, { method: \"POST\", headers: req.headers, body: req.body, signal: AbortSignal.timeout(45_000) });\n    if (!res.ok) return { ok: false, error: providers.providerError(provider, res.status) };\n    const text = providers.readProviderReply(provider, await res.json().catch(() => null));\n    if (!text) return { ok: false, error: \"The AI sent an empty answer. Try again.\" };\n    const reply = chat.cleanReply(text, body.maxLength);\n    if (where) {\n      const turns = chat.writeMemory([...history, { role: \"user\", content: body.prompt }, { role: \"assistant\", content: reply }]);\n      const updated = await storageRequest(botId, userId, { op: \"update\", table: \"ai_memory\", where, data: { turns } });\n      if (updated.ok && updated.count === 0)\n        await storageRequest(botId, userId, { op: \"save\", table: \"ai_memory\", data: { key: where.value, turns } });\n    }\n    return { ok: true, reply };\n  } catch (error) {\n    return { ok: false, error: `The AI could not answer: ${describeError(error, 200)}` };\n  }\n}\n","runtime/src/cron.test.ts":"import test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { cronProblem } from \"./flow-contract.js\";\n\n// The executor reads the runtime config on import.\nprocess.env[\"BOT_RUNTIME_SHARED_SECRET\"] ??= \"test-secret-test-secret-test-secret\";\nprocess.env[\"CONTROL_PLANE_URL\"] ??= \"https://example.com\";\nprocess.env[\"BOT_RUNTIME_CALLBACK_SECRET\"] ??= \"test-callback-test-callback-test-callback\";\nconst { cronMatches, matchesEmoji } = await import(\"./executor.js\");\n\ntest(\"cron: lists, ranges, steps and time zones\", () => {\n  const d = new Date(\"2026-10-19T07:45:00Z\"); // Monday 07:45 UTC = 09:45 Warsaw (CEST)\n  assert.equal(cronMatches(\"45 7 * * 1\", d), true);\n  assert.equal(cronMatches(\"*/15 * * * *\", d), true);\n  assert.equal(cronMatches(\"*/20 * * * *\", d), false);\n  assert.equal(cronMatches(\"0-50/15 6-8 * * 1-5\", d), true);\n  assert.equal(cronMatches(\"45 9 * * 1\", d, \"Europe/Warsaw\"), true);\n  assert.equal(cronMatches(\"45 7 * * 1\", d, \"Europe/Warsaw\"), false);\n  assert.equal(cronMatches(\"45 7 19,20 10 *\", d), true);\n  assert.equal(cronMatches(\"45 7 * * 0,7\", new Date(\"2026-10-18T07:45:00Z\")), true);\n  assert.equal(cronMatches(\"45 7 * * 1\", d, \"Not/AZone\"), false);\n  assert.equal(cronProblem(\"61 * * * *\"), '\"61\" is outside 0-59.');\n  assert.equal(cronProblem(\"* * *\"), \"A schedule needs 5 fields: minute hour day month weekday.\");\n  assert.equal(cronProblem(\"*/5 9-17 * * 1-5\"), null);\n});\n\ntest(\"reaction emoji matching\", () => {\n  assert.equal(matchesEmoji(\"\", \"✅\"), true);\n  assert.equal(matchesEmoji(\"✅\", \"\"), false);\n  assert.equal(matchesEmoji(\"✅ ❌\", \"❌\"), true);\n  assert.equal(matchesEmoji(\"<:ok:123456789012345678>\", \"ok\", \"123456789012345678\"), true);\n  assert.equal(matchesEmoji(\"<:ok:123456789012345678>\", \"\", \"999999999999999999\"), false);\n});\n","runtime/src/crypto-tools.test.ts":"import { test } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { chainOf, detectChain, money, parsePrice } from \"./crypto-tools.js\";\n\ntest(\"detects the chain of an address\", () => {\n  assert.equal(detectChain(\"bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh\"), \"btc\");\n  assert.equal(detectChain(\"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa\"), \"btc\");\n  assert.equal(detectChain(\"LQ3B36Yv2rBTxdgAdYpU2UcEZsaNwXeATk\"), \"ltc\");\n  assert.equal(\n    detectChain(\"ltc1qzvcgmntglcuv4smv3lzj6k8szcvsrmvk0phrr9wfq8w493r096ssm2fgsw\"),\n    \"ltc\",\n  );\n  assert.equal(detectChain(\"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\"), \"eth\");\n  assert.equal(detectChain(\"TLa2f6VPqDgRE67v1736s7bJ8Ray5wYjU7\"), \"trx\");\n  assert.equal(detectChain(\"9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM\"), \"sol\");\n  assert.equal(detectChain(\"hello world\"), null);\n  assert.equal(detectChain(\"0x123\"), null);\n});\n\ntest(\"chain names and symbols\", () => {\n  assert.equal(chainOf(\"Bitcoin\"), \"btc\");\n  assert.equal(chainOf(\"LTC\"), \"ltc\");\n  assert.equal(chainOf(\"tron\"), \"trx\");\n  assert.equal(chainOf(\"\"), null);\n  assert.equal(chainOf(\"auto\"), null);\n  assert.equal(chainOf(\"doge\"), null);\n});\n\ntest(\"parses target prices\", () => {\n  assert.equal(parsePrice(\"70000\"), 70000);\n  assert.equal(parsePrice(\"70k\"), 70000);\n  assert.equal(parsePrice(\"1.5M\"), 1_500_000);\n  assert.equal(parsePrice(\"$65,000\"), 65000);\n  assert.ok(Number.isNaN(parsePrice(\"soon\")));\n});\n\ntest(\"formats money\", () => {\n  assert.equal(money(80634.123, \"usd\"), \"$80,634.12\");\n  assert.equal(money(4.5, \"PLN\"), \"4.50 PLN\");\n  assert.ok(money(0.000123, \"USD\").startsWith(\"$0.000123\"));\n});\n","runtime/src/crypto-tools.ts":"/**\n * Crypto Tools plugin: prices, market data and the Fear & Greed index, wallet\n * balances, transaction status and network fees on BTC, LTC, ETH, SOL and\n * TRON from keyless public APIs (fixed hosts only, short timeouts, caches),\n * plus price alerts, watched wallets and per-member portfolios kept in Bottly\n * storage and checked by the runtime. Read-only: it never holds or moves funds.\n */\nimport type { Client, Guild, TextBasedChannel, User } from \"discord.js\";\nimport { formatAmount } from \"./flow-contract.js\";\nimport type { BotStore } from \"./store.js\";\n\nconst TIMEOUT = 12_000;\nconst UA = \"BottlyBot/1.0 (+https://bottly.xyz)\";\n\nconst cache = new Map<string, { at: number; value: unknown }>();\nconst STALE_MS = 3_600_000;\n\nasync function getJson<T>(url: string, ttlMs = 0, init: RequestInit = {}): Promise<T> {\n  const key = `${init.method ?? \"GET\"} ${url} ${typeof init.body === \"string\" ? init.body : \"\"}`;\n  const hit = ttlMs > 0 ? cache.get(key) : undefined;\n  if (hit && Date.now() - hit.at < ttlMs) return hit.value as T;\n  const res = await fetch(url, {\n    ...init,\n    headers: {\n      Accept: \"application/json\",\n      \"User-Agent\": UA,\n      ...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n      ...(init.headers ?? {}),\n    },\n    signal: AbortSignal.timeout(TIMEOUT),\n  }).catch((error: unknown) => {\n    if (hit && Date.now() - hit.at < STALE_MS) return null;\n    throw error;\n  });\n  if (res === null) return hit!.value as T;\n  if (res.status === 404 || res.status === 400)\n    throw new NotFound(`${new URL(url).host} answered ${res.status}`);\n  // Rate limited or down: an answer from the last hour beats an error.\n  if (!res.ok && hit && Date.now() - hit.at < STALE_MS) return hit.value as T;\n  if (!res.ok) throw new Error(`${new URL(url).host} answered ${res.status}`);\n  const value = (await res.json()) as T;\n  if (ttlMs > 0) {\n    cache.set(key, { at: Date.now(), value });\n    if (cache.size > 500) cache.delete(cache.keys().next().value as string);\n  }\n  return value;\n}\n\nclass NotFound extends Error {}\n\nasync function rpc<T>(url: string, method: string, params: unknown[], ttlMs = 0): Promise<T> {\n  const body = await getJson<{ result?: T; error?: { message?: string } }>(url, ttlMs, {\n    method: \"POST\",\n    body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params }),\n  });\n  if (body.error) throw new Error(body.error.message ?? `${method} failed`);\n  return body.result as T;\n}\n\n/* ------------------------------------------------------------------ *\n * Chains\n * ------------------------------------------------------------------ */\n\nexport type Chain = \"btc\" | \"ltc\" | \"eth\" | \"sol\" | \"trx\";\n\nexport const CHAINS: Record<\n  Chain,\n  { name: string; symbol: string; decimals: number; explorer: string; tx: string }\n> = {\n  btc: {\n    name: \"Bitcoin\",\n    symbol: \"BTC\",\n    decimals: 8,\n    explorer: \"https://mempool.space/address/\",\n    tx: \"https://mempool.space/tx/\",\n  },\n  ltc: {\n    name: \"Litecoin\",\n    symbol: \"LTC\",\n    decimals: 8,\n    explorer: \"https://litecoinspace.org/address/\",\n    tx: \"https://litecoinspace.org/tx/\",\n  },\n  eth: {\n    name: \"Ethereum\",\n    symbol: \"ETH\",\n    decimals: 18,\n    explorer: \"https://etherscan.io/address/\",\n    tx: \"https://etherscan.io/tx/\",\n  },\n  sol: {\n    name: \"Solana\",\n    symbol: \"SOL\",\n    decimals: 9,\n    explorer: \"https://solscan.io/account/\",\n    tx: \"https://solscan.io/tx/\",\n  },\n  trx: {\n    name: \"TRON\",\n    symbol: \"TRX\",\n    decimals: 6,\n    explorer: \"https://tronscan.org/#/address/\",\n    tx: \"https://tronscan.org/#/transaction/\",\n  },\n};\n\nconst MEMPOOL: Partial<Record<Chain, string>> = {\n  btc: \"https://mempool.space/api\",\n  ltc: \"https://litecoinspace.org/api\",\n};\nconst ETH_RPC = \"https://ethereum-rpc.publicnode.com\";\nconst SOL_RPC = \"https://api.mainnet-beta.solana.com\";\nconst TRON = \"https://api.trongrid.io\";\nconst USDT_TRC20 = \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\";\nconst B58 = \"[1-9A-HJ-NP-Za-km-z]\";\n\n/** Which chain an address belongs to (null when it looks like none). */\nexport function detectChain(raw: string): Chain | null {\n  const a = raw.trim();\n  if (/^0x[0-9a-fA-F]{40}$/.test(a)) return \"eth\";\n  if (/^(bc1[02-9ac-hj-np-z]{11,71}|[13][a-km-zA-HJ-NP-Z1-9]{25,34})$/.test(a)) return \"btc\";\n  if (/^(ltc1[02-9ac-hj-np-z]{11,71}|[LM][a-km-zA-HJ-NP-Z1-9]{26,33})$/.test(a)) return \"ltc\";\n  if (new RegExp(`^T${B58}{33}$`).test(a)) return \"trx\";\n  if (new RegExp(`^${B58}{32,44}$`).test(a)) return \"sol\";\n  return null;\n}\n\n/** A chain from a name or symbol (\"bitcoin\", \"LTC\"), or null. */\nexport function chainOf(raw: string): Chain | null {\n  const v = raw.trim().toLowerCase();\n  if (!v || v === \"auto\") return null;\n  for (const [id, c] of Object.entries(CHAINS) as [Chain, (typeof CHAINS)[Chain]][])\n    if (v === id || v === c.symbol.toLowerCase() || v === c.name.toLowerCase()) return id;\n  if (v === \"tron\" || v === \"usdt-trc20\") return \"trx\";\n  return null;\n}\n\nfunction units(raw: bigint | number, decimals: number): number {\n  return typeof raw === \"bigint\" ? Number(raw) / 10 ** decimals : raw / 10 ** decimals;\n}\n\n/* ------------------------------------------------------------------ *\n * Prices\n * ------------------------------------------------------------------ */\n\ninterface GeckoCoin {\n  id: string;\n  symbol: string;\n  name: string;\n  image?: string;\n  current_price?: number;\n  market_cap?: number;\n  market_cap_rank?: number;\n  total_volume?: number;\n  high_24h?: number;\n  low_24h?: number;\n  price_change_percentage_24h?: number;\n}\n\nconst GECKO = \"https://api.coingecko.com/api/v3\";\n\n/** \"$80,634.12\" for USD, \"80,634.12 EUR\" otherwise. */\nexport function money(value: number, currency: string): string {\n  const cur = currency.toUpperCase();\n  const digits = Math.abs(value) >= 1 ? 2 : undefined;\n  const text =\n    digits === undefined\n      ? formatAmount(value)\n      : value.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n  return cur === \"USD\" ? `$${text}` : `${text} ${cur}`;\n}\n\nfunction compact(value: number, currency: string): string {\n  const cur = currency.toUpperCase();\n  const text = Intl.NumberFormat(\"en-US\", { notation: \"compact\", maximumFractionDigits: 2 }).format(\n    value,\n  );\n  return cur === \"USD\" ? `$${text}` : `${text} ${cur}`;\n}\n\nconst pct = (v: number | undefined) =>\n  v === undefined || !Number.isFinite(v) ? \"\" : `${v >= 0 ? \"+\" : \"\"}${v.toFixed(2)}%`;\n\n/** Spot price of a coin from Coinbase (cached a minute). */\nexport async function spotPrice(coin: string, currency = \"USD\"): Promise<number> {\n  const body = await getJson<{ data?: { rates?: Record<string, string> } }>(\n    `https://api.coinbase.com/v2/exchange-rates?currency=${encodeURIComponent(coin.toUpperCase())}`,\n    60_000,\n  ).catch(() => null);\n  const rate = Number(body?.data?.rates?.[currency.toUpperCase()]);\n  if (!Number.isFinite(rate) || rate <= 0)\n    throw new Error(`No ${currency.toUpperCase()} price for \"${coin}\".`);\n  return rate;\n}\n\nasync function geckoCoin(symbol: string, currency: string): Promise<GeckoCoin | null> {\n  const list = await getJson<GeckoCoin[]>(\n    `${GECKO}/coins/markets?vs_currency=${encodeURIComponent(currency.toLowerCase())}&symbols=${encodeURIComponent(symbol.toLowerCase())}`,\n    60_000,\n  ).catch(() => []);\n  if (Array.isArray(list) && list.length > 0)\n    return (\n      [...list].sort((a, b) => (a.market_cap_rank ?? 1e9) - (b.market_cap_rank ?? 1e9))[0] ?? null\n    );\n  const fallback = await paprikaCoins(currency).catch(() => []);\n  return fallback.find((c) => c.symbol === symbol.toLowerCase()) ?? null;\n}\n\ninterface PaprikaTicker {\n  name: string;\n  symbol: string;\n  rank: number;\n  quotes?: {\n    USD?: { price?: number; volume_24h?: number; market_cap?: number; percent_change_24h?: number };\n  };\n}\n\n/** CoinGecko's free API rate-limits busy IPs; CoinPaprika's top 500 is the fallback. */\nasync function paprikaCoins(currency: string): Promise<GeckoCoin[]> {\n  const list = await getJson<PaprikaTicker[]>(\n    \"https://api.coinpaprika.com/v1/tickers?limit=500\",\n    300_000,\n  );\n  const rate = currency.toUpperCase() === \"USD\" ? 1 : await spotPrice(\"USD\", currency);\n  return list.map((t) => {\n    const q = t.quotes?.USD ?? {};\n    return {\n      id: t.symbol.toLowerCase(),\n      symbol: t.symbol.toLowerCase(),\n      name: t.name,\n      market_cap_rank: t.rank,\n      ...(q.price !== undefined ? { current_price: q.price * rate } : {}),\n      ...(q.market_cap !== undefined ? { market_cap: q.market_cap * rate } : {}),\n      ...(q.volume_24h !== undefined ? { total_volume: q.volume_24h * rate } : {}),\n      ...(q.percent_change_24h !== undefined\n        ? { price_change_percentage_24h: q.percent_change_24h }\n        : {}),\n    };\n  });\n}\n\n/* ------------------------------------------------------------------ *\n * Wallets, transactions, fees\n * ------------------------------------------------------------------ */\n\ninterface Balance {\n  chain: Chain;\n  /** Coin units. */\n  balance: number;\n  received?: number;\n  sent?: number;\n  txCount?: number;\n  usdt?: number;\n  /** Changes whenever something moves (watched wallets). */\n  fingerprint: string;\n}\n\nasync function balanceOf(address: string, chain: Chain): Promise<Balance> {\n  const c = CHAINS[chain];\n  switch (chain) {\n    case \"btc\":\n    case \"ltc\": {\n      const s = await getJson<{\n        chain_stats: { funded_txo_sum: number; spent_txo_sum: number; tx_count: number };\n        mempool_stats: { funded_txo_sum: number; spent_txo_sum: number; tx_count: number };\n      }>(`${MEMPOOL[chain]}/address/${encodeURIComponent(address)}`, 20_000);\n      const received = s.chain_stats.funded_txo_sum + s.mempool_stats.funded_txo_sum;\n      const sent = s.chain_stats.spent_txo_sum + s.mempool_stats.spent_txo_sum;\n      const txCount = s.chain_stats.tx_count + s.mempool_stats.tx_count;\n      return {\n        chain,\n        balance: units(received - sent, c.decimals),\n        received: units(received, c.decimals),\n        sent: units(sent, c.decimals),\n        txCount,\n        fingerprint: `${received - sent}:${txCount}`,\n      };\n    }\n    case \"eth\": {\n      const [wei, nonce] = await Promise.all([\n        rpc<string>(ETH_RPC, \"eth_getBalance\", [address, \"latest\"], 20_000),\n        rpc<string>(ETH_RPC, \"eth_getTransactionCount\", [address, \"latest\"], 20_000),\n      ]);\n      return {\n        chain,\n        balance: units(BigInt(wei), c.decimals),\n        txCount: Number(BigInt(nonce)),\n        fingerprint: `${BigInt(wei)}:${BigInt(nonce)}`,\n      };\n    }\n    case \"sol\": {\n      const r = await rpc<{ value: number }>(SOL_RPC, \"getBalance\", [address], 20_000);\n      return { chain, balance: units(r.value, c.decimals), fingerprint: String(r.value) };\n    }\n    case \"trx\": {\n      const body = await getJson<{\n        data?: { balance?: number; trc20?: Record<string, string>[] }[];\n      }>(`${TRON}/v1/accounts/${encodeURIComponent(address)}`, 20_000);\n      const acc = body.data?.[0];\n      const sun = acc?.balance ?? 0;\n      const usdtRaw = (acc?.trc20 ?? []).find((t) => USDT_TRC20 in t)?.[USDT_TRC20] ?? \"0\";\n      return {\n        chain,\n        balance: units(sun, c.decimals),\n        usdt: units(Number(usdtRaw), 6),\n        fingerprint: `${sun}:${usdtRaw}`,\n      };\n    }\n  }\n}\n\nasync function walletVars(address: string, chainRaw: string): Promise<Record<string, string>> {\n  const a = address.trim();\n  const chain = chainOf(chainRaw) ?? detectChain(a);\n  if (!chain) throw new Error(`\"${a.slice(0, 64)}\" is not a BTC, LTC, ETH, SOL or TRON address.`);\n  const c = CHAINS[chain];\n  const b = await balanceOf(a, chain).catch((e: unknown) => {\n    throw e instanceof NotFound ? new Error(`That is not a valid ${c.name} address.`) : e;\n  });\n  const price = await spotPrice(c.symbol).catch(() => 0);\n  const usd = b.balance * price + (b.usdt ?? 0);\n  const vars: Record<string, string> = {\n    chain: c.name,\n    symbol: c.symbol,\n    address: a,\n    balance: `${formatAmount(b.balance)} ${c.symbol}`,\n    balanceRaw: String(b.balance),\n    usd: price ? money(usd, \"USD\") : \"\",\n    received: b.received === undefined ? \"\" : `${formatAmount(b.received)} ${c.symbol}`,\n    sent: b.sent === undefined ? \"\" : `${formatAmount(b.sent)} ${c.symbol}`,\n    txCount: b.txCount === undefined ? \"\" : String(b.txCount),\n    usdt: b.usdt === undefined ? \"\" : `${formatAmount(b.usdt)} USDT`,\n    url: `${c.explorer}${a}`,\n  };\n  vars[\"text\"] = [\n    `**${c.name}** wallet \\`${a}\\``,\n    `Balance: **${vars[\"balance\"]}**${vars[\"usd\"] ? ` (≈ ${vars[\"usd\"]})` : \"\"}`,\n    vars[\"usdt\"] ? `USDT (TRC20): **${vars[\"usdt\"]}**` : \"\",\n    vars[\"received\"] ? `Received: ${vars[\"received\"]} · Sent: ${vars[\"sent\"]}` : \"\",\n    vars[\"txCount\"] ? `Transactions: ${vars[\"txCount\"]}` : \"\",\n  ]\n    .filter(Boolean)\n    .join(\"\\n\");\n  return vars;\n}\n\nconst ts = (unix: number) => (unix > 0 ? `<t:${Math.floor(unix)}:R>` : \"\");\n\nasync function txOn(chain: Chain, hash: string): Promise<Record<string, string>> {\n  const c = CHAINS[chain];\n  const base = { chain: c.name, hash, url: `${c.tx}${hash}` };\n  switch (chain) {\n    case \"btc\":\n    case \"ltc\": {\n      const api = MEMPOOL[chain]!;\n      const tx = await getJson<{\n        fee?: number;\n        vout?: { value?: number }[];\n        status?: { confirmed?: boolean; block_height?: number; block_time?: number };\n      }>(`${api}/tx/${hash}`, 15_000);\n      const height = tx.status?.confirmed ? tx.status.block_height : undefined;\n      const tip =\n        height !== undefined ? await getJson<number>(`${api}/blocks/tip/height`, 15_000) : 0;\n      const conf = height !== undefined ? tip - height + 1 : 0;\n      const out = (tx.vout ?? []).reduce((s, v) => s + (v.value ?? 0), 0);\n      return {\n        ...base,\n        status: tx.status?.confirmed ? \"Confirmed\" : \"Pending\",\n        confirmations: String(Math.max(0, conf)),\n        block: height !== undefined ? String(height) : \"\",\n        time: ts(tx.status?.block_time ?? 0),\n        amount: `${formatAmount(units(out, c.decimals))} ${c.symbol}`,\n        fee: tx.fee === undefined ? \"\" : `${formatAmount(units(tx.fee, c.decimals))} ${c.symbol}`,\n        from: \"\",\n        to: \"\",\n      };\n    }\n    case \"eth\": {\n      const tx = await rpc<{\n        value: string;\n        blockNumber: string | null;\n        from: string;\n        to: string | null;\n      } | null>(ETH_RPC, \"eth_getTransactionByHash\", [hash], 15_000);\n      if (!tx) throw new NotFound(\"not found\");\n      const [receipt, head] = await Promise.all([\n        tx.blockNumber\n          ? rpc<{ status: string; gasUsed: string; effectiveGasPrice: string } | null>(\n              ETH_RPC,\n              \"eth_getTransactionReceipt\",\n              [hash],\n              15_000,\n            )\n          : Promise.resolve(null),\n        rpc<string>(ETH_RPC, \"eth_blockNumber\", [], 15_000),\n      ]);\n      const block = tx.blockNumber ? Number(BigInt(tx.blockNumber)) : 0;\n      const fee = receipt ? BigInt(receipt.gasUsed) * BigInt(receipt.effectiveGasPrice) : 0n;\n      return {\n        ...base,\n        status: !tx.blockNumber ? \"Pending\" : receipt?.status === \"0x1\" ? \"Confirmed\" : \"Failed\",\n        confirmations: block ? String(Number(BigInt(head)) - block + 1) : \"0\",\n        block: block ? String(block) : \"\",\n        time: \"\",\n        amount: `${formatAmount(units(BigInt(tx.value), 18))} ETH`,\n        fee: receipt ? `${formatAmount(units(fee, 18))} ETH` : \"\",\n        from: tx.from,\n        to: tx.to ?? \"\",\n      };\n    }\n    case \"sol\": {\n      const r = await rpc<{\n        value: ({\n          slot: number;\n          confirmations: number | null;\n          confirmationStatus?: string;\n          err: unknown;\n        } | null)[];\n      }>(SOL_RPC, \"getSignatureStatuses\", [[hash], { searchTransactionHistory: true }], 15_000);\n      const s = r.value[0];\n      if (!s) throw new NotFound(\"not found\");\n      return {\n        ...base,\n        status: s.err ? \"Failed\" : s.confirmationStatus === \"finalized\" ? \"Confirmed\" : \"Pending\",\n        confirmations: s.confirmations === null ? \"finalized\" : String(s.confirmations),\n        block: String(s.slot),\n        time: \"\",\n        amount: \"\",\n        fee: \"\",\n        from: \"\",\n        to: \"\",\n      };\n    }\n    case \"trx\": {\n      const info = await getJson<{\n        blockNumber?: number;\n        blockTimeStamp?: number;\n        fee?: number;\n        receipt?: { result?: string };\n      }>(`${TRON}/wallet/gettransactioninfobyid`, 15_000, {\n        method: \"POST\",\n        body: JSON.stringify({ value: hash }),\n      });\n      if (!info.blockNumber) throw new NotFound(\"not found\");\n      return {\n        ...base,\n        status: info.receipt?.result && info.receipt.result !== \"SUCCESS\" ? \"Failed\" : \"Confirmed\",\n        confirmations: \"\",\n        block: String(info.blockNumber),\n        time: ts((info.blockTimeStamp ?? 0) / 1000),\n        amount: \"\",\n        fee: info.fee ? `${formatAmount(units(info.fee, 6))} TRX` : \"\",\n        from: \"\",\n        to: \"\",\n      };\n    }\n  }\n}\n\nasync function txVars(hashRaw: string, chainRaw: string): Promise<Record<string, string>> {\n  const hash = hashRaw.trim();\n  const chosen = chainOf(chainRaw);\n  let order: Chain[];\n  if (chosen) order = [chosen];\n  else if (/^0x[0-9a-fA-F]{64}$/.test(hash)) order = [\"eth\"];\n  else if (/^[0-9a-fA-F]{64}$/.test(hash)) order = [\"btc\", \"ltc\", \"trx\"];\n  else if (new RegExp(`^${B58}{64,90}$`).test(hash)) order = [\"sol\"];\n  else throw new Error(\"That does not look like a transaction hash.\");\n  for (const chain of order) {\n    try {\n      const vars = await txOn(chain, chain === \"trx\" ? hash.toLowerCase() : hash);\n      vars[\"text\"] = [\n        `**${vars[\"chain\"]}** transaction — **${vars[\"status\"]}**`,\n        vars[\"confirmations\"] ? `Confirmations: ${vars[\"confirmations\"]}` : \"\",\n        vars[\"amount\"] ? `Amount: ${vars[\"amount\"]}` : \"\",\n        vars[\"fee\"] ? `Fee: ${vars[\"fee\"]}` : \"\",\n        vars[\"time\"] ? `Mined ${vars[\"time\"]}` : \"\",\n      ]\n        .filter(Boolean)\n        .join(\"\\n\");\n      return vars;\n    } catch (error) {\n      if (!(error instanceof NotFound)) throw error;\n    }\n  }\n  throw new Error(\"Transaction not found (it may not be broadcast yet).\");\n}\n\nasync function feeVars(chainRaw: string): Promise<Record<string, string>> {\n  const chain = chainOf(chainRaw) ?? \"btc\";\n  if (chain === \"btc\" || chain === \"ltc\") {\n    const f = await getJson<{ fastestFee: number; halfHourFee: number; hourFee: number }>(\n      `${MEMPOOL[chain]}/v1/fees/recommended`,\n      60_000,\n    );\n    const v = {\n      chain: CHAINS[chain].name,\n      fast: String(f.fastestFee),\n      medium: String(f.halfHourFee),\n      slow: String(f.hourFee),\n      unit: \"sat/vB\",\n    };\n    return {\n      ...v,\n      text: `**${v.chain} fees** (sat/vB)\\nFast: **${v.fast}** · 30 min: **${v.medium}** · 1 h: **${v.slow}**`,\n    };\n  }\n  if (chain === \"eth\") {\n    const [gas, tip] = await Promise.all([\n      rpc<string>(ETH_RPC, \"eth_gasPrice\", [], 30_000),\n      rpc<string>(ETH_RPC, \"eth_maxPriorityFeePerGas\", [], 30_000).catch(() => \"0x0\"),\n    ]);\n    const gwei = (h: string) => formatAmount(Number(BigInt(h)) / 1e9);\n    const base = Number(BigInt(gas)) / 1e9;\n    const v = {\n      chain: \"Ethereum\",\n      fast: formatAmount(base * 1.25),\n      medium: gwei(gas),\n      slow: formatAmount(base * 0.9),\n      unit: \"gwei\",\n      tip: gwei(tip),\n    };\n    return {\n      ...v,\n      text: `**Ethereum gas** (gwei)\\nFast: **${v.fast}** · Normal: **${v.medium}** · Slow: **${v.slow}**`,\n    };\n  }\n  throw new Error(`Fees are available for BTC, LTC and ETH.`);\n}\n\n/* ------------------------------------------------------------------ *\n * The Crypto block\n * ------------------------------------------------------------------ */\n\n/** Runs one lookup of the Crypto block; `extra` is the currency or the chain. */\nexport async function cryptoLookup(\n  operation: string,\n  query: string,\n  extra: string,\n): Promise<Record<string, string>> {\n  const currency = (\n    /^[a-z]{3,5}$/i.test(extra.trim()) && !chainOf(extra) ? extra.trim() : \"USD\"\n  ).toUpperCase();\n  switch (operation) {\n    case \"price\": {\n      const symbol = query.trim().replace(/^\\$/, \"\").toUpperCase() || \"BTC\";\n      const coin = await geckoCoin(symbol, currency);\n      const price = coin?.current_price ?? (await spotPrice(symbol, currency));\n      const change = coin?.price_change_percentage_24h;\n      const vars: Record<string, string> = {\n        coin: symbol,\n        name: coin?.name ?? symbol,\n        currency,\n        price: money(price, currency),\n        priceRaw: String(price),\n        change: pct(change),\n        trend: change === undefined ? \"\" : change >= 0 ? \"📈\" : \"📉\",\n        high: coin?.high_24h ? money(coin.high_24h, currency) : \"\",\n        low: coin?.low_24h ? money(coin.low_24h, currency) : \"\",\n        marketCap: coin?.market_cap ? compact(coin.market_cap, currency) : \"\",\n        volume: coin?.total_volume ? compact(coin.total_volume, currency) : \"\",\n        rank: coin?.market_cap_rank ? String(coin.market_cap_rank) : \"\",\n        image: coin?.image ?? \"\",\n      };\n      vars[\"text\"] = [\n        `${vars[\"trend\"] ? `${vars[\"trend\"]} ` : \"\"}**${vars[\"name\"]}**${vars[\"name\"] === symbol ? \"\" : ` (${symbol})`}: **${vars[\"price\"]}**${vars[\"change\"] ? ` (${vars[\"change\"]} 24h)` : \"\"}`,\n        vars[\"high\"] ? `24h high ${vars[\"high\"]} · low ${vars[\"low\"]}` : \"\",\n        vars[\"marketCap\"]\n          ? `Market cap ${vars[\"marketCap\"]} · volume ${vars[\"volume\"]}${vars[\"rank\"] ? ` · rank #${vars[\"rank\"]}` : \"\"}`\n          : \"\",\n      ]\n        .filter(Boolean)\n        .join(\"\\n\");\n      return vars;\n    }\n    case \"market\": {\n      const count = Math.min(25, Math.max(1, Number.parseInt(query, 10) || 10));\n      const list = await getJson<GeckoCoin[]>(\n        `${GECKO}/coins/markets?vs_currency=${currency.toLowerCase()}&order=market_cap_desc&per_page=${count}&page=1`,\n        120_000,\n      ).catch(async () => (await paprikaCoins(currency)).slice(0, count));\n      const lines = list.map(\n        (c, i) =>\n          `\\`${String(i + 1).padStart(2)}.\\` **${c.name}** (${c.symbol.toUpperCase()}) — ${money(c.current_price ?? 0, currency)} ${pct(c.price_change_percentage_24h)}`,\n      );\n      return {\n        count: String(list.length),\n        currency,\n        list: lines.join(\"\\n\"),\n        text: `**Top ${list.length} by market cap**\\n${lines.join(\"\\n\")}`,\n      };\n    }\n    case \"trending\": {\n      const body = await getJson<{\n        coins?: { item: { name: string; symbol: string; market_cap_rank?: number } }[];\n      }>(`${GECKO}/search/trending`, 300_000);\n      const lines = (body.coins ?? [])\n        .slice(0, 10)\n        .map(\n          (c, i) =>\n            `\\`${i + 1}.\\` **${c.item.name}** (${c.item.symbol})${c.item.market_cap_rank ? ` · #${c.item.market_cap_rank}` : \"\"}`,\n        );\n      return {\n        count: String(lines.length),\n        list: lines.join(\"\\n\"),\n        text: `🔥 **Trending coins**\\n${lines.join(\"\\n\")}`,\n      };\n    }\n    case \"feargreed\": {\n      const body = await getJson<{\n        data?: { value: string; value_classification: string; timestamp: string }[];\n      }>(\"https://api.alternative.me/fng/\", 600_000);\n      const d = body.data?.[0];\n      if (!d) throw new Error(\"The Fear & Greed index is unavailable right now.\");\n      const value = Number(d.value);\n      const emoji =\n        value < 25 ? \"😱\" : value < 45 ? \"😟\" : value < 56 ? \"😐\" : value < 76 ? \"😀\" : \"🤑\";\n      return {\n        value: d.value,\n        label: d.value_classification,\n        emoji,\n        updated: ts(Number(d.timestamp)),\n        text: `${emoji} **Fear & Greed: ${d.value}/100** — ${d.value_classification}`,\n      };\n    }\n    case \"fees\":\n      return feeVars(query || extra);\n    case \"wallet\":\n      return walletVars(query, extra);\n    case \"tx\":\n      return txVars(query, extra);\n    case \"address\": {\n      const chain = detectChain(query);\n      return {\n        valid: chain ? \"yes\" : \"no\",\n        chain: chain ? CHAINS[chain].name : \"\",\n        symbol: chain ? CHAINS[chain].symbol : \"\",\n        text: chain\n          ? `✅ Valid **${CHAINS[chain].name}** address`\n          : \"❌ Not a BTC, LTC, ETH, SOL or TRON address\",\n      };\n    }\n    default:\n      throw new Error(`Unknown crypto operation \"${operation}\".`);\n  }\n}\n\n/* ------------------------------------------------------------------ *\n * Alerts, watched wallets and portfolios\n * ------------------------------------------------------------------ */\n\nexport interface CryptoHost {\n  client(): Client;\n  store: BotStore;\n  dispatch(\n    type: string,\n    vars: Record<string, string>,\n    seed: { guild?: Guild | null; channel?: TextBasedChannel | null; user?: User | null },\n  ): Promise<void>;\n}\n\nconst ALERTS = \"crypto_alerts\";\nconst WATCHES = \"crypto_watches\";\nconst PORTFOLIO = \"crypto_portfolio\";\nconst MAX_ALERTS_PER_USER = 10;\nconst MAX_WATCHES_PER_GUILD = 20;\nconst MAX_WALLETS_PER_USER = 10;\n\nconst newId = () => `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`;\n\n/** \"70000\", \"70k\", \"1.2m\", \"$65,000\" → number. */\nexport function parsePrice(raw: string): number {\n  const m = /^\\$?\\s*([\\d.,]+)\\s*([km])?$/i.exec(raw.trim().replace(/\\s/g, \"\"));\n  if (!m) return Number.NaN;\n  const base = Number(m[1]!.replace(/,/g, \"\"));\n  return base * (m[2]?.toLowerCase() === \"k\" ? 1e3 : m[2]?.toLowerCase() === \"m\" ? 1e6 : 1);\n}\n\nexport class CryptoTools {\n  private alertTimer: NodeJS.Timeout | null = null;\n  private watchTimer: NodeJS.Timeout | null = null;\n  private watching = false;\n\n  constructor(private readonly host: CryptoHost) {}\n\n  start(alerts: boolean, watches: boolean): void {\n    if (alerts && this.alertTimer === null) {\n      this.alertTimer = setInterval(() => void this.checkAlerts().catch(() => undefined), 60_000);\n      this.alertTimer.unref();\n    }\n    if (watches && this.watchTimer === null) {\n      this.watchTimer = setInterval(() => void this.checkWatches().catch(() => undefined), 180_000);\n      this.watchTimer.unref();\n    }\n  }\n\n  stop(): void {\n    if (this.alertTimer !== null) clearInterval(this.alertTimer);\n    if (this.watchTimer !== null) clearInterval(this.watchTimer);\n    this.alertTimer = null;\n    this.watchTimer = null;\n  }\n\n  /* ------------------------------ Alerts ------------------------------ */\n\n  async alert(\n    action: string,\n    o: {\n      guild: string;\n      channel: string;\n      user: string;\n      coin: string;\n      direction: string;\n      price: string;\n      currency: string;\n      id: string;\n    },\n  ): Promise<Record<string, string>> {\n    const store = this.host.store;\n    const mine = async () =>\n      (await store.list(ALERTS, { where: { field: \"user\", value: o.user }, limit: 100 })).filter(\n        (r) => r[\"guild\"] === o.guild,\n      );\n    if (action === \"add\") {\n      const coin = o.coin.trim().replace(/^\\$/, \"\").toUpperCase();\n      const currency = (o.currency.trim() || \"USD\").toUpperCase();\n      const target = parsePrice(o.price);\n      if (!coin) throw new Error(\"Say which coin, e.g. BTC.\");\n      if (!Number.isFinite(target) || target <= 0) throw new Error(`\"${o.price}\" is not a price.`);\n      if ((await mine()).length >= MAX_ALERTS_PER_USER)\n        throw new Error(`You can have ${MAX_ALERTS_PER_USER} alerts at once. Remove one first.`);\n      const now = await spotPrice(coin, currency);\n      const dir = /below|under|<|down/i.test(o.direction)\n        ? \"below\"\n        : /above|over|>|up/i.test(o.direction)\n          ? \"above\"\n          : target >= now\n            ? \"above\"\n            : \"below\";\n      const id = newId();\n      await store.add(ALERTS, {\n        id,\n        guild: o.guild,\n        channel: o.channel,\n        user: o.user,\n        coin,\n        currency,\n        direction: dir,\n        target: String(target),\n        created: String(Date.now()),\n      });\n      return {\n        id,\n        coin,\n        direction: dir,\n        target: money(target, currency),\n        current: money(now, currency),\n        text: `🔔 Alert set: **${coin}** ${dir} **${money(target, currency)}** (now ${money(now, currency)}). ID \\`${id}\\``,\n      };\n    }\n    if (action === \"list\") {\n      const rows = await mine();\n      const lines = rows.map(\n        (r) =>\n          `\\`${r[\"id\"]}\\` **${r[\"coin\"]}** ${r[\"direction\"]} ${money(Number(r[\"target\"]), r[\"currency\"] || \"USD\")}`,\n      );\n      return {\n        count: String(rows.length),\n        list: lines.join(\"\\n\") || \"No alerts.\",\n        text: lines.length\n          ? `🔔 **Your alerts**\\n${lines.join(\"\\n\")}`\n          : \"You have no price alerts.\",\n      };\n    }\n    if (action === \"remove\") {\n      const rows = await mine();\n      const hit = rows.filter((r) =>\n        o.id ? r[\"id\"] === o.id.trim() : o.coin && r[\"coin\"] === o.coin.trim().toUpperCase(),\n      );\n      for (const r of hit) await store.remove(ALERTS, \"id\", r[\"id\"]!);\n      return {\n        count: String(hit.length),\n        text: hit.length\n          ? `Removed ${hit.length} alert${hit.length === 1 ? \"\" : \"s\"}.`\n          : \"No matching alert.\",\n      };\n    }\n    throw new Error(`Unknown alert action \"${action}\".`);\n  }\n\n  async checkAlerts(): Promise<void> {\n    const rows = await this.host.store.list(ALERTS, { limit: 1000 });\n    const prices = new Map<string, number>();\n    for (const r of rows) {\n      const pair = `${r[\"coin\"]}:${r[\"currency\"] || \"USD\"}`;\n      if (!prices.has(pair)) {\n        const p = await spotPrice(r[\"coin\"]!, r[\"currency\"] || \"USD\").catch(() => Number.NaN);\n        prices.set(pair, p);\n      }\n      const price = prices.get(pair)!;\n      const target = Number(r[\"target\"]);\n      if (!Number.isFinite(price) || !Number.isFinite(target)) continue;\n      const hit = r[\"direction\"] === \"below\" ? price <= target : price >= target;\n      if (!hit) continue;\n      await this.host.store.remove(ALERTS, \"id\", r[\"id\"]!);\n      const cur = r[\"currency\"] || \"USD\";\n      await this.host.dispatch(\n        \"crypto-alert-hit\",\n        {\n          \"alert.id\": r[\"id\"] ?? \"\",\n          \"alert.coin\": r[\"coin\"] ?? \"\",\n          \"alert.direction\": r[\"direction\"] ?? \"\",\n          \"alert.target\": money(target, cur),\n          \"alert.price\": money(price, cur),\n          \"alert.user\": `<@${r[\"user\"]}>`,\n          \"alert.userId\": r[\"user\"] ?? \"\",\n          \"alert.text\": `🔔 <@${r[\"user\"]}> **${r[\"coin\"]}** is ${r[\"direction\"]} ${money(target, cur)}: now **${money(price, cur)}**`,\n        },\n        await this.seed(r[\"channel\"] ?? \"\", r[\"user\"] ?? \"\"),\n      );\n    }\n  }\n\n  /* ------------------------------ Watches ----------------------------- */\n\n  async watch(\n    action: string,\n    o: {\n      guild: string;\n      channel: string;\n      user: string;\n      address: string;\n      chain: string;\n      label: string;\n    },\n  ): Promise<Record<string, string>> {\n    const store = this.host.store;\n    const all = () =>\n      store.list(WATCHES, { where: { field: \"guild\", value: o.guild }, limit: 100 });\n    if (action === \"add\") {\n      const address = o.address.trim();\n      const chain = chainOf(o.chain) ?? detectChain(address);\n      if (!chain) throw new Error(\"That is not a BTC, LTC, ETH, SOL or TRON address.\");\n      const rows = await all();\n      if (rows.some((r) => r[\"address\"] === address))\n        throw new Error(\"That wallet is already watched here.\");\n      if (rows.length >= MAX_WATCHES_PER_GUILD)\n        throw new Error(`A server can watch ${MAX_WATCHES_PER_GUILD} wallets.`);\n      const b = await balanceOf(address, chain);\n      const id = newId();\n      const label = o.label.trim().slice(0, 50) || `${address.slice(0, 6)}…${address.slice(-4)}`;\n      await store.add(WATCHES, {\n        id,\n        guild: o.guild,\n        channel: o.channel,\n        user: o.user,\n        chain,\n        address,\n        label,\n        last: String(b.balance),\n        lastUsdt: String(b.usdt ?? 0),\n        fingerprint: b.fingerprint,\n      });\n      return {\n        id,\n        chain: CHAINS[chain].name,\n        label,\n        text: `👀 Watching **${label}** (${CHAINS[chain].name}): balance ${formatAmount(b.balance)} ${CHAINS[chain].symbol}.`,\n      };\n    }\n    if (action === \"list\") {\n      const rows = await all();\n      const lines = rows.map(\n        (r) =>\n          `\\`${r[\"id\"]}\\` **${r[\"label\"]}** · ${CHAINS[r[\"chain\"] as Chain]?.symbol ?? r[\"chain\"]} · \\`${r[\"address\"]}\\``,\n      );\n      return {\n        count: String(rows.length),\n        list: lines.join(\"\\n\") || \"No watched wallets.\",\n        text: lines.length\n          ? `👀 **Watched wallets**\\n${lines.join(\"\\n\")}`\n          : \"No wallets are watched here.\",\n      };\n    }\n    if (action === \"remove\") {\n      const key = o.address.trim();\n      const hit = (await all()).filter(\n        (r) => r[\"id\"] === key || r[\"address\"] === key || r[\"label\"] === key,\n      );\n      for (const r of hit) await store.remove(WATCHES, \"id\", r[\"id\"]!);\n      return {\n        count: String(hit.length),\n        text: hit.length\n          ? `Stopped watching ${hit.length} wallet${hit.length === 1 ? \"\" : \"s\"}.`\n          : \"No matching wallet.\",\n      };\n    }\n    throw new Error(`Unknown watch action \"${action}\".`);\n  }\n\n  async checkWatches(): Promise<void> {\n    if (this.watching) return;\n    this.watching = true;\n    try {\n      const rows = await this.host.store.list(WATCHES, { limit: 500 });\n      for (const r of rows) {\n        const chain = r[\"chain\"] as Chain;\n        if (!CHAINS[chain]) continue;\n        const b = await balanceOf(r[\"address\"]!, chain).catch(() => null);\n        if (!b || b.fingerprint === r[\"fingerprint\"]) continue;\n        const c = CHAINS[chain];\n        const before = Number(r[\"last\"]) || 0;\n        const diff = b.balance - before;\n        const usdtDiff = (b.usdt ?? 0) - (Number(r[\"lastUsdt\"]) || 0);\n        await this.host.store.put(\n          WATCHES,\n          \"id\",\n          r[\"id\"]!,\n          { last: String(b.balance), lastUsdt: String(b.usdt ?? 0), fingerprint: b.fingerprint },\n          r,\n        );\n        const moved =\n          Math.abs(usdtDiff) > 1e-9 && Math.abs(diff) < 1e-12\n            ? { amount: usdtDiff, symbol: \"USDT\" }\n            : { amount: diff, symbol: c.symbol };\n        const price = moved.symbol === \"USDT\" ? 1 : await spotPrice(c.symbol).catch(() => 0);\n        const direction = moved.amount > 0 ? \"received\" : moved.amount < 0 ? \"sent\" : \"moved\";\n        const amount = `${formatAmount(Math.abs(moved.amount))} ${moved.symbol}`;\n        await this.host.dispatch(\n          \"crypto-wallet-activity\",\n          {\n            \"wallet.label\": r[\"label\"] ?? \"\",\n            \"wallet.address\": r[\"address\"] ?? \"\",\n            \"wallet.chain\": c.name,\n            \"wallet.direction\": direction,\n            \"wallet.amount\": amount,\n            \"wallet.usd\": price ? money(Math.abs(moved.amount) * price, \"USD\") : \"\",\n            \"wallet.balance\": `${formatAmount(b.balance)} ${c.symbol}`,\n            \"wallet.url\": `${c.explorer}${r[\"address\"]}`,\n            \"wallet.text\": `${direction === \"received\" ? \"📥\" : direction === \"sent\" ? \"📤\" : \"🔄\"} **${r[\"label\"]}** ${direction} **${amount}**${price ? ` (≈ ${money(Math.abs(moved.amount) * price, \"USD\")})` : \"\"}. Balance: ${formatAmount(b.balance)} ${c.symbol}`,\n          },\n          await this.seed(r[\"channel\"] ?? \"\", r[\"user\"] ?? \"\"),\n        );\n        await new Promise((resolve) => setTimeout(resolve, 1500));\n      }\n    } finally {\n      this.watching = false;\n    }\n  }\n\n  /* ----------------------------- Portfolio ---------------------------- */\n\n  async portfolio(\n    action: string,\n    o: { user: string; address: string; chain: string; label: string; currency: string },\n  ): Promise<Record<string, string>> {\n    const store = this.host.store;\n    const mine = () =>\n      store.list(PORTFOLIO, { where: { field: \"user\", value: o.user }, limit: 50 });\n    if (action === \"add\") {\n      const address = o.address.trim();\n      const chain = chainOf(o.chain) ?? detectChain(address);\n      if (!chain) throw new Error(\"That is not a BTC, LTC, ETH, SOL or TRON address.\");\n      const rows = await mine();\n      if (rows.some((r) => r[\"address\"] === address))\n        throw new Error(\"That wallet is already in your portfolio.\");\n      if (rows.length >= MAX_WALLETS_PER_USER)\n        throw new Error(`A portfolio holds ${MAX_WALLETS_PER_USER} wallets.`);\n      await balanceOf(address, chain);\n      const label =\n        o.label.trim().slice(0, 50) ||\n        `${CHAINS[chain].symbol} ${address.slice(0, 6)}…${address.slice(-4)}`;\n      await store.add(PORTFOLIO, { id: newId(), user: o.user, chain, address, label });\n      return { label, chain: CHAINS[chain].name, text: `Added **${label}** to your portfolio.` };\n    }\n    if (action === \"remove\") {\n      const key = o.address.trim();\n      const hit = (await mine()).filter(\n        (r) => r[\"id\"] === key || r[\"address\"] === key || r[\"label\"] === key,\n      );\n      for (const r of hit) await store.remove(PORTFOLIO, \"id\", r[\"id\"]!);\n      return {\n        count: String(hit.length),\n        text: hit.length ? \"Removed from your portfolio.\" : \"No matching wallet in your portfolio.\",\n      };\n    }\n    if (action === \"show\") {\n      const currency = (o.currency.trim() || \"USD\").toUpperCase();\n      const rows = await mine();\n      if (rows.length === 0)\n        return {\n          count: \"0\",\n          total: money(0, currency),\n          list: \"\",\n          text: \"Your portfolio is empty. Add a wallet first.\",\n        };\n      let total = 0;\n      const lines: string[] = [];\n      for (const r of rows) {\n        const chain = r[\"chain\"] as Chain;\n        const c = CHAINS[chain];\n        if (!c) continue;\n        const b = await balanceOf(r[\"address\"]!, chain).catch(() => null);\n        if (!b) {\n          lines.push(`**${r[\"label\"]}** — unavailable right now`);\n          continue;\n        }\n        const price = await spotPrice(c.symbol, currency).catch(() => 0);\n        const usdt = b.usdt ? b.usdt * (await spotPrice(\"USDT\", currency).catch(() => 1)) : 0;\n        const value = b.balance * price + usdt;\n        total += value;\n        lines.push(\n          `**${r[\"label\"]}** — ${formatAmount(b.balance)} ${c.symbol}${b.usdt ? ` + ${formatAmount(b.usdt)} USDT` : \"\"} ≈ ${money(value, currency)}`,\n        );\n      }\n      return {\n        count: String(rows.length),\n        total: money(total, currency),\n        list: lines.join(\"\\n\"),\n        text: `💼 **Portfolio: ${money(total, currency)}**\\n${lines.join(\"\\n\")}`,\n      };\n    }\n    throw new Error(`Unknown portfolio action \"${action}\".`);\n  }\n\n  private async seed(channelId: string, userId: string) {\n    const client = this.host.client();\n    const channel = channelId ? await client.channels.fetch(channelId).catch(() => null) : null;\n    const user = userId ? await client.users.fetch(userId).catch(() => null) : null;\n    const text = channel && channel.isTextBased() ? (channel as TextBasedChannel) : null;\n    const guild = text && \"guild\" in text ? (text.guild as Guild) : null;\n    return { channel: text, user, guild };\n  }\n}\n","runtime/src/crypto.ts":"/**\n * AES-256-GCM decryption for stored bot tokens.\n *\n * Mirror of src/lib/bot-token-crypto.server.ts in the web app: the control\n * plane encrypts, the runtime decrypts, and BOT_TOKEN_ENCRYPTION_KEY must be\n * byte-identical in both environments. Plaintext tokens exist only inside this\n * process, only long enough to call client.login().\n */\nimport { webcrypto } from \"node:crypto\";\n\nconst KEY_BYTES = 32;\nconst IV_BYTES = 12;\n\n/** Key version this build understands. Bump in lockstep with the web app. */\nexport const BOT_TOKEN_KEY_VERSION = 1;\n\ntype AesKey = Awaited<ReturnType<typeof webcrypto.subtle.importKey>>;\n\nlet cachedKey: Promise<AesKey> | undefined;\n\n/** Returns an ArrayBuffer-backed view, required by Web Crypto's BufferSource. */\nfunction base64ToBytes(value: string): Uint8Array<ArrayBuffer> {\n  const decoded = Buffer.from(value.trim(), \"base64\");\n  const bytes = new Uint8Array(decoded.byteLength);\n  bytes.set(decoded);\n  return bytes;\n}\n\nasync function importEncryptionKey(): Promise<AesKey> {\n  const raw = process.env[\"BOT_TOKEN_ENCRYPTION_KEY\"];\n  if (!raw) {\n    throw new Error(\n      \"Missing BOT_TOKEN_ENCRYPTION_KEY. It must match the value used by the web app.\",\n    );\n  }\n\n  const trimmed = raw.trim();\n  let keyBytes: Uint8Array<ArrayBuffer>;\n  try {\n    keyBytes = base64ToBytes(trimmed);\n  } catch {\n    keyBytes = new Uint8Array(0);\n  }\n  if (keyBytes.length !== KEY_BYTES) {\n    // Also accept any long random string: hash it to a stable 32-byte key.\n    // Keep in sync with src/lib/bot-token-crypto.server.ts in the web app.\n    keyBytes = new Uint8Array(\n      await webcrypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(trimmed)),\n    );\n  }\n\n  return webcrypto.subtle.importKey(\"raw\", keyBytes, { name: \"AES-GCM\" }, false, [\"decrypt\"]);\n}\n\nfunction getEncryptionKey(): Promise<AesKey> {\n  if (!cachedKey) {\n    cachedKey = importEncryptionKey().catch((error: unknown) => {\n      // Never cache a rejection: fixing the env var should recover on next use.\n      cachedKey = undefined;\n      throw error;\n    });\n  }\n  return cachedKey;\n}\n\nexport async function decryptBotToken(record: {\n  ciphertext: string;\n  iv: string;\n  keyVersion: number;\n}): Promise<string> {\n  if (record.keyVersion !== BOT_TOKEN_KEY_VERSION) {\n    throw new Error(\n      `Token was encrypted with key version ${record.keyVersion}, this runtime only handles ${BOT_TOKEN_KEY_VERSION}.`,\n    );\n  }\n\n  const iv = base64ToBytes(record.iv);\n  if (iv.length !== IV_BYTES) {\n    throw new Error(`Token nonce must decode to ${IV_BYTES} bytes, got ${iv.length}.`);\n  }\n\n  const key = await getEncryptionKey();\n  const opened = await webcrypto.subtle.decrypt(\n    { name: \"AES-GCM\", iv },\n    key,\n    base64ToBytes(record.ciphertext),\n  );\n\n  const token = new TextDecoder().decode(opened);\n  if (!token) throw new Error(\"Decrypted token is empty.\");\n  return token;\n}\n\n/** True when the failure is a bad key / tampered ciphertext rather than config. */\nexport function isDecryptionFailure(error: unknown): boolean {\n  return error instanceof Error && /operation|decrypt|tag/i.test(error.message);\n}\n","runtime/src/deployment.ts":"/**\n * Fetches the PUBLISHED, server-compiled flow for a bot.\n *\n * The runtime never reads Supabase and never compiles a builder graph itself:\n * the control plane validates and compiles, and hands over the executable form\n * (see src/lib/flow/contract.ts -> CompiledFlow).\n */\nimport { config } from \"./config.js\";\nimport { ControlPlaneError } from \"./control-plane.js\";\nimport { describeError } from \"./redact.js\";\nimport { FLOW_CONTRACT_VERSION, type CompiledFlow } from \"./flow-contract.js\";\nimport { isDesign, type BotImage } from \"./studio-image.js\";\n\nconst TIMEOUT_MS = 8_000;\n\nexport interface BotPresenceConfig {\n  status?: string;\n  activityType?: string;\n  activityName?: string;\n  activityState?: string;\n  streamUrl?: string;\n}\n\nexport interface BotDeployment {\n  version: number;\n  flows: CompiledFlow[];\n  /** Union of every flow's intents, computed by the control plane. */\n  intents: string[];\n  /** Owner-configured Discord presence, applied once the bot is ready. */\n  presence: BotPresenceConfig | null;\n  /** Restart automatically after an unexpected disconnect (plan + owner setting). */\n  autoRestart: boolean;\n  /** Owner/buyer-provided settings, readable in flows as {env.NAME}. */\n  env: Record<string, string>;\n  /** Enabled plugin settings, e.g. plugins.sellauth = { apiKey, shopId }. */\n  plugins: Record<string, Record<string, string>>;\n  /**\n   * The owner (Pro / Ultimate) connected a server to this bot on Bottly's Servers\n   * page: mentioning the bot there runs the AI server agent.\n   */\n  serverAgent: boolean;\n  /** Text prefixes (\"!\", \"?\") that also run the bot's slash commands. */\n  prefixes: string[];\n  /** Graphics Studio designs saved to the bot, by id (attached to messages). */\n  images: Record<string, BotImage>;\n}\n\nfunction botImages(value: unknown): Record<string, BotImage> {\n  const out: Record<string, BotImage> = {};\n  if (typeof value !== \"object\" || value === null) return out;\n  for (const [id, raw] of Object.entries(value)) {\n    const image = raw as { name?: unknown; design?: unknown } | null;\n    if (image && typeof image.name === \"string\" && isDesign(image.design))\n      out[id] = { name: image.name, design: image.design };\n  }\n  return out;\n}\n\nfunction stringMap(value: unknown): Record<string, string> {\n  const out: Record<string, string> = {};\n  if (typeof value !== \"object\" || value === null) return out;\n  for (const [k, v] of Object.entries(value)) if (typeof v === \"string\") out[k] = v;\n  return out;\n}\n\nfunction isCompiledFlow(value: unknown): value is CompiledFlow {\n  if (typeof value !== \"object\" || value === null) return false;\n  const flow = value as Partial<CompiledFlow>;\n  return (\n    flow.contractVersion === FLOW_CONTRACT_VERSION &&\n    typeof flow.flowId === \"string\" &&\n    Array.isArray(flow.triggers) &&\n    Array.isArray(flow.commands) &&\n    typeof flow.nodes === \"object\" &&\n    flow.nodes !== null\n  );\n}\n\n/**\n * Returns `null` when the bot has no published flow — that is a valid state\n * (the bot connects and simply does nothing), not an error.\n */\nexport async function fetchDeployment(\n  botId: string,\n  userId: string,\n): Promise<BotDeployment | null> {\n  const url =\n    `${config.controlPlaneUrl}/api/internal/bots/${encodeURIComponent(botId)}/deployment` +\n    `?userId=${encodeURIComponent(userId)}`;\n\n  let response: Response;\n  try {\n    response = await fetch(url, {\n      method: \"GET\",\n      headers: {\n        Authorization: `Bearer ${config.callbackSecret}`,\n        accept: \"application/json\",\n      },\n      signal: AbortSignal.timeout(TIMEOUT_MS),\n    });\n  } catch (error) {\n    throw new ControlPlaneError(\n      \"unavailable\",\n      `Could not reach the control plane for the published flow: ${describeError(error)}`,\n    );\n  }\n\n  if (response.status === 404) return null;\n  if (response.status === 401 || response.status === 403) {\n    throw new ControlPlaneError(\n      \"unauthorized\",\n      \"The control plane rejected the runtime callback secret.\",\n      response.status,\n    );\n  }\n  if (!response.ok) {\n    throw new ControlPlaneError(\n      \"unavailable\",\n      `The control plane returned ${response.status} for a deployment lookup.`,\n      response.status,\n    );\n  }\n\n  const body: unknown = await response.json().catch(() => null);\n  if (typeof body !== \"object\" || body === null) {\n    throw new ControlPlaneError(\"invalid\", \"Deployment lookup returned a non-JSON body.\");\n  }\n\n  const record = body as { ok?: unknown; version?: unknown; flows?: unknown; intents?: unknown };\n  if (record.ok !== true || !Array.isArray(record.flows)) {\n    throw new ControlPlaneError(\"invalid\", \"Deployment lookup returned an unexpected payload.\");\n  }\n\n  const flows = record.flows.filter(isCompiledFlow);\n  if (flows.length !== record.flows.length) {\n    throw new ControlPlaneError(\n      \"invalid\",\n      \"The published deployment was built by an incompatible Bottly version. Publish the flow again.\",\n    );\n  }\n\n  const intents = Array.isArray(record.intents)\n    ? record.intents.filter((value): value is string => typeof value === \"string\")\n    : [];\n\n  const rawPresence = (record as { presence?: unknown }).presence;\n  const presence =\n    typeof rawPresence === \"object\" && rawPresence !== null\n      ? (rawPresence as BotPresenceConfig)\n      : null;\n\n  return {\n    version: typeof record.version === \"number\" ? record.version : 0,\n    flows,\n    intents,\n    presence,\n    autoRestart: (record as { autoRestart?: unknown }).autoRestart === true,\n    serverAgent: (record as { serverAgent?: unknown }).serverAgent === true,\n    prefixes: Array.isArray((record as { prefixes?: unknown }).prefixes)\n      ? ((record as { prefixes: unknown[] }).prefixes.filter((p) => typeof p === \"string\") as string[]).slice(0, 5)\n      : [],\n    env: stringMap((record as { env?: unknown }).env),\n    images: botImages((record as { images?: unknown }).images),\n    plugins: Object.fromEntries(\n      Object.entries(\n        ((record as { plugins?: unknown }).plugins ?? {}) as Record<string, unknown>,\n      ).map(([k, v]) => [k, stringMap(v)]),\n    ),\n  };\n}\n","runtime/src/executor.ts":"/**\n * FLOW EXECUTOR — the layer that turns a CompiledFlow into real discord.js calls.\n *\n * Nothing here invents Discord behaviour: every node maps onto the discord.js\n * API documented in flow-contract.ts (NODE_SPECS[...].discord). Nodes whose\n * spec says \"unsupported\" are stripped by the compiler and never reach here.\n *\n * One FlowRunner is attached to one Client (one bot). It owns:\n *   - the gateway event listeners that start flow runs,\n *   - the per-run variable scope,\n *   - the in-memory cooldown map,\n *   - the minute ticker for scheduled triggers.\n */\nimport {\n  ActivityType,\n  ApplicationCommandOptionType,\n  AttachmentBuilder,\n  AuditLogEvent,\n  ChannelType,\n  Client,\n  EmbedBuilder,\n  Events,\n  MessageFlags,\n  OverwriteType,\n  PermissionFlagsBits,\n  type AnySelectMenuInteraction,\n  type ButtonInteraction,\n  type Guild,\n  type GuildBasedChannel,\n  type ForumChannel,\n  type GuildMember,\n  type GuildScheduledEvent,\n  type PartialGuildScheduledEvent,\n  type MediaChannel,\n  type PresenceStatusData,\n  type Interaction,\n  type Message,\n  type MessageReaction,\n  type PartialMessageReaction,\n  type PartialUser,\n  type MessageCreateOptions,\n  type MessageEditOptions,\n  type InteractionReplyOptions,\n  type ModalSubmitInteraction,\n  type RepliableInteraction,\n  type Role,\n  type TextBasedChannel,\n  type User,\n  type OverwriteResolvable,\n  type Webhook,\n  type WebhookMessageCreateOptions,\n} from \"discord.js\";\nimport { runInNewContext } from \"node:vm\";\nimport { logger } from \"./logger.js\";\nimport { runSandboxed } from \"./sandbox.js\";\nimport { safeDownload, safeFetch } from \"./safe-fetch.js\";\nimport { aiChatRequest, storageRequest } from \"./control-plane.js\";\nimport { pgQuery, pgRecords, pgStorage } from \"./postgres.js\";\nimport { rowVariables, scrubPgError, sqlParams } from \"./postgres-sql.js\";\nimport { config } from \"./config.js\";\nimport { CommunityPlugins, PLUGIN_BUTTON_PREFIX } from \"./community.js\";\nimport { CryptoTools, cryptoLookup } from \"./crypto-tools.js\";\nimport { BotStore } from \"./store.js\";\nimport {\n  blueskyPosts,\n  conversionText,\n  convert,\n  fetchRss,\n  robloxOperation,\n  twitchStreams,\n  youtubeVideos,\n  type FeedItem,\n} from \"./plugin-apis.js\";\nimport { AGENT_BUTTON_PREFIX, handleAgentButton, handleAgentMention } from \"./server-agent.js\";\nimport { describeError } from \"./redact.js\";\nimport { imageFileName, renderBotImage, type BotImage } from \"./studio-image.js\";\nimport { ordinal } from \"./studio/variables.js\";\nimport {\n  buildComponentsV2,\n  buildMessageComponents,\n  IS_COMPONENTS_V2,\n  isComponentsV2,\n  type MessageRow,\n  type RawJson,\n} from \"./components.js\";\n\n/** What a message-producing node builds, before it is cast to a discord.js payload. */\ninterface FlowPayload {\n  allowedMentions?: { parse: (\"users\" | \"roles\" | \"everyone\")[]; repliedUser?: boolean };\n  content?: string;\n  embeds?: EmbedBuilder[];\n  components?: (MessageRow | RawJson)[];\n  /** IS_COMPONENTS_V2 for container/section messages (no content or embeds allowed). */\n  flags?: number;\n  /** Bot images rendered for this message. */\n  files?: AttachmentBuilder[];\n}\n\n/** Fields for editing a message into this payload (V2 edits must not send content/embeds). */\nfunction editBody(payload: FlowPayload) {\n  const mentions = payload.allowedMentions ? { allowedMentions: payload.allowedMentions } : {};\n  const files = payload.files ? { files: payload.files } : {};\n  return payload.flags\n    ? { components: payload.components ?? [], flags: payload.flags, ...mentions, ...files }\n    : {\n        content: payload.content ?? null,\n        embeds: payload.embeds ?? [],\n        components: payload.components ?? [],\n        ...mentions,\n        ...files,\n      };\n}\nimport type { CompiledFlow, CompiledNode, CompiledTrigger, ConfigValue } from \"./flow-contract.js\";\nimport {\n  buildSellAuthRequest,\n  cronFieldsMatch,\n  isGeneratedSelectId,\n  modalFieldIssues,\n  modalPayload,\n  evaluatePlainRule,\n  matchPrefixCommand,\n  prefixOptionValues,\n  splitArgs,\n  formatAmount,\n  NODE_SPECS,\n  parseConditionBranches,\n  optionActionId,\n  parseModalFields,\n  SELLAUTH_OPERATIONS,\n  usesOwnDatabase,\n  parseServerTemplate,\n  splitTargets,\n  textFileName,\n  TEXT_FILE_MAX_BYTES,\n  aggregateVariables,\n  recordListVariables,\n  recordText,\n  storageBlockRequest,\n  type ServerTemplateChannel,\n} from \"./flow-contract.js\";\nimport { nowIso, type RuntimeEvent } from \"./types.js\";\n\n/** Hard stop so a cycle in the graph can never spin the process. */\nconst MAX_STEPS = 200;\n/**\n * Discord invalidates an interaction token 3s after it was CREATED, not after\n * the runtime received it. Gateway delivery plus the round trip of the defer\n * call itself eat into that budget, so fire well before the deadline.\n */\nconst AUTO_DEFER_AFTER_MS = 1_500;\n/** Nodes that answer an interaction; used to predict the reply's visibility. */\nconst ACK_NODE_TYPES = new Set([\n  \"reply\",\n  \"send-message\",\n  \"send-embed\",\n  \"defer-reply\",\n  \"show-modal\",\n  \"component-modal\",\n]);\nconst MODAL_NODE_TYPES = new Set([\"show-modal\", \"component-modal\"]);\n/** How long a Show Modal with a \"Submitted\" output waits for the form. */\nconst MODAL_WAIT_MS = 15 * 60_000;\nconst MAX_DELAY_SECONDS = 900;\n/** Discord's upload limit without server boosts. */\nconst MAX_FILE_BYTES = 10_000_000;\n\n/**\n * Values shared between runs of the same bot process (\"Save Shared Value\").\n * In-memory only: they reset when the bot restarts.\n */\nconst GLOBALS = new Map<string, string>();\n\n/**\n * Count in Time Window: bot user id + key → recent run times. In-memory like\n * GLOBALS, so counters reset when the bot restarts.\n */\nconst RATE_HITS = new Map<string, { hits: number[]; windowMs: number }>();\nlet rateSweepAt = 0;\n\n/** One run of Count in Time Window: runs with this key inside the window, this one included. */\nfunction countRateHit(key: string, windowMs: number, now = Date.now()): number {\n  if (now - rateSweepAt > 60_000) {\n    rateSweepAt = now;\n    for (const [k, entry] of RATE_HITS)\n      if (now - (entry.hits[entry.hits.length - 1] ?? 0) >= entry.windowMs) RATE_HITS.delete(k);\n  }\n  const hits = (RATE_HITS.get(key)?.hits ?? []).filter((at) => now - at < windowMs);\n  hits.push(now);\n  if (hits.length > 1000) hits.splice(0, hits.length - 1000);\n  RATE_HITS.set(key, { hits, windowMs });\n  return hits.length;\n}\n\nexport type EventSink = (event: RuntimeEvent) => void;\n\ninterface RunContext {\n  client: Client;\n  flow: CompiledFlow;\n  vars: Map<string, string>;\n  interaction: RepliableInteraction | null;\n  message: Message | null;\n  member: GuildMember | null;\n  user: User | null;\n  guild: Guild | null;\n  channel: TextBasedChannel | null;\n  /** Set once we have replied/deferred, so follow-ups use followUp(). */\n  acknowledged: boolean;\n  /** The interaction was answered with a modal: it has no message to follow up. */\n  modalShown?: boolean;\n  /** Send Message posted to a channel: the interaction is closed with a quiet \"Done.\" */\n  sentToChannel?: boolean;\n  /** Deferred with deferUpdate(): editReply() edits the component's own message. */\n  updating?: boolean;\n  /** Why the run stopped early, shown to the user if nothing answered them. */\n  failure?: string;\n  steps: number;\n}\n\n/** Anti-Nuke plugin: audit log type per watched action. */\nconst ANTINUKE_AUDIT: Record<string, AuditLogEvent> = {\n  \"channel-delete\": AuditLogEvent.ChannelDelete,\n  \"channel-create\": AuditLogEvent.ChannelCreate,\n  \"role-delete\": AuditLogEvent.RoleDelete,\n  \"role-create\": AuditLogEvent.RoleCreate,\n  \"member-ban\": AuditLogEvent.MemberBanAdd,\n  \"member-kick\": AuditLogEvent.MemberKick,\n};\n/** guild:action:executor → timestamps of recent actions (sliding window). */\nconst antinukeHits = new Map<string, number[]>();\n/** Audit log entries pushed by the gateway, per guild (newest last, 30 s). */\nconst auditEntries = new Map<\n  string,\n  { action: AuditLogEvent; targetId: string | null; executorId: string | null; at: number }[]\n>();\n\nfunction recentAudit(guildId: string, type: AuditLogEvent, targetId: string | null) {\n  const now = Date.now();\n  const list = (auditEntries.get(guildId) ?? []).filter((e) => now - e.at < 30_000);\n  auditEntries.set(guildId, list);\n  return (\n    [...list]\n      .reverse()\n      .find((e) => e.action === type && (targetId === null || e.targetId === targetId)) ?? null\n  );\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => {\n    setTimeout(resolve, ms);\n  });\n}\n\nfunction text(value: ConfigValue | undefined): string {\n  return value === undefined || value === null ? \"\" : String(value);\n}\n\nfunction num(value: ConfigValue | undefined, fallback: number): number {\n  const parsed = Number(value);\n  return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction truthy(value: ConfigValue | undefined): boolean {\n  return value === true || value === \"true\";\n}\n\n/** \"true\"/\"false\" from a Yes/No/No change select; anything else = no change. */\nfunction triState(value: ConfigValue | undefined): boolean | null {\n  if (value === true || value === \"true\") return true;\n  if (value === \"false\") return false;\n  return null;\n}\n\n/* ------------------------------------------------------------------ *\n * Variables\n * ------------------------------------------------------------------ */\n\nfunction builtinVariable(name: string, ctx: RunContext): string | null {\n  const user = ctx.user;\n  const guild = ctx.guild;\n\n  switch (name) {\n    case \"user\":\n      return user ? `<@${user.id}>` : \"\";\n    case \"user.id\":\n      return user?.id ?? \"\";\n    case \"username\":\n      return user?.username ?? \"\";\n    case \"user.displayName\":\n      return ctx.member?.displayName ?? user?.displayName ?? user?.username ?? \"\";\n    case \"user.avatar\":\n      return user?.displayAvatarURL() ?? \"\";\n    case \"user.tag\":\n      return user?.tag ?? \"\";\n    // Always the person who ran the command or clicked, even when a user\n    // option has replaced {user} with the chosen member.\n    case \"author\":\n      return user ? `<@${user.id}>` : \"\";\n    case \"author.id\":\n      return user?.id ?? \"\";\n    case \"author.username\":\n      return user?.username ?? \"\";\n    case \"server\":\n    case \"server.name\":\n      return guild?.name ?? \"\";\n    case \"server.id\":\n      return guild?.id ?? \"\";\n    case \"server.memberCount\":\n      return guild ? String(guild.memberCount) : \"\";\n    case \"channel\":\n      return ctx.channel ? `<#${ctx.channel.id}>` : \"\";\n    case \"channel.id\":\n      return ctx.channel?.id ?? \"\";\n    case \"channel.name\":\n      return ctx.channel && \"name\" in ctx.channel ? String(ctx.channel.name ?? \"\") : \"\";\n    case \"message.id\":\n      return ctx.message?.id ?? \"\";\n    case \"message.content\":\n      return ctx.message?.content ?? \"\";\n    case \"command\":\n      return ctx.interaction?.isChatInputCommand() ? ctx.interaction.commandName : \"\";\n    case \"timestamp\":\n      return new Date().toISOString();\n    default:\n      return null;\n  }\n}\n\n/** Replaces every {token} with its resolved value. Unknown tokens become \"\". */\nfunction interpolate(input: string, ctx: RunContext): string {\n  if (input === \"\") return \"\";\n  return input.replace(/\\{([a-zA-Z0-9_.-]+)\\}/g, (_match, token: string) => {\n    const stored = ctx.vars.get(token);\n    if (stored !== undefined) return stored;\n    const builtin = builtinVariable(token, ctx);\n    return builtin ?? \"\";\n  });\n}\n\n/**\n * Every answer of a submitted modal by field ID: typed text, picked dropdown\n * values, users/roles/channels as mentions, uploaded files as links.\n */\nfunction modalAnswers(\n  modal: ModalSubmitInteraction,\n): Map<string, { text: string; values?: string[] }> {\n  const out = new Map<string, { text: string; values?: string[] }>();\n  for (const field of modal.fields.fields.values()) {\n    const f = field as {\n      type: number;\n      customId: string;\n      value?: unknown;\n      values?: readonly string[];\n      attachments?: { values(): IterableIterator<{ url: string }> };\n    };\n    if (typeof f.value === \"string\") {\n      out.set(f.customId, { text: f.value });\n      continue;\n    }\n    if (typeof f.value === \"boolean\") {\n      out.set(f.customId, { text: f.value ? \"yes\" : \"no\" });\n      continue;\n    }\n    const values = [...(f.values ?? [])];\n    let shown = values;\n    if (f.type === 5) shown = values.map((v) => `<@${v}>`);\n    else if (f.type === 6) shown = values.map((v) => `<@&${v}>`);\n    else if (f.type === 8) shown = values.map((v) => `<#${v}>`);\n    else if (f.type === 7)\n      shown = values.map((v) => (modal.guild?.roles.cache.has(v) ? `<@&${v}>` : `<@${v}>`));\n    else if (f.type === 19 && f.attachments) shown = [...f.attachments.values()].map((a) => a.url);\n    out.set(f.customId, { text: shown.join(\", \"), values });\n  }\n  return out;\n}\n\nfunction cfg(node: CompiledNode, key: string, ctx: RunContext): string {\n  return interpolate(text(node.config[key]), ctx).trim();\n}\n\n/* ------------------------------------------------------------------ *\n * Discord resolvers\n * ------------------------------------------------------------------ */\n\nconst SNOWFLAKE = /(\\d{15,25})/;\n\nfunction extractId(raw: string): string | null {\n  const match = SNOWFLAKE.exec(raw);\n  return match ? (match[1] as string) : null;\n}\n\n/**\n * A member of this server by username, display name or nickname (exact,\n * case-insensitive) from the cache. Never guesses: no match, or more than\n * one, is null.\n */\nfunction memberByName(raw: string, ctx: RunContext): GuildMember | null {\n  if (ctx.guild === null) return null;\n  const name = raw.replace(/^@/, \"\").trim().toLowerCase();\n  if (name === \"\") return null;\n  const found = ctx.guild.members.cache.filter(\n    (m) =>\n      m.user.username.toLowerCase() === name ||\n      m.displayName.toLowerCase() === name ||\n      (m.user.globalName ?? \"\").toLowerCase() === name,\n  );\n  return found.size === 1 ? (found.first() ?? null) : null;\n}\n\n/**\n * The user a field names. Only an EMPTY field means \"the person who started\n * the flow\": a name or variable that does not resolve is null, so Ban/Kick\n * never hit the person who ran the command by accident.\n */\nasync function resolveUser(raw: string, ctx: RunContext): Promise<User | null> {\n  if (raw === \"\") return ctx.user;\n  const id = extractId(raw);\n  if (id === null) return memberByName(raw, ctx)?.user ?? null;\n  try {\n    return await ctx.client.users.fetch(id);\n  } catch {\n    return null;\n  }\n}\n\nasync function resolveMember(raw: string, ctx: RunContext): Promise<GuildMember | null> {\n  if (ctx.guild === null) return null;\n  if (raw === \"\") return ctx.member;\n  const id = extractId(raw);\n  if (id === null) return memberByName(raw, ctx);\n  try {\n    return await ctx.guild.members.fetch(id);\n  } catch {\n    return null;\n  }\n}\n\nasync function resolveChannel(raw: string, ctx: RunContext): Promise<TextBasedChannel | null> {\n  if (raw === \"\") return ctx.channel;\n\n  const id = extractId(raw);\n  if (id !== null) {\n    try {\n      const channel = await ctx.client.channels.fetch(id);\n      return channel !== null && channel.isTextBased() ? channel : null;\n    } catch {\n      return null;\n    }\n  }\n\n  // \"#general\" / \"general\" — resolve by name inside the current guild. Events\n  // without a server (SellAuth orders, schedules) look through the bot's servers.\n  const name = raw.replace(/^#/, \"\").toLowerCase();\n  const guilds = ctx.guild ? [ctx.guild] : [...ctx.client.guilds.cache.values()];\n  for (const guild of guilds) {\n    const found = guild.channels.cache.find(\n      (channel) => channel.name.toLowerCase() === name && channel.isTextBased(),\n    );\n    if (found && found.isTextBased()) return found;\n  }\n  return null;\n}\n\nasync function resolveVoiceChannelId(raw: string, ctx: RunContext): Promise<string | null> {\n  const id = extractId(raw);\n  if (id !== null) return id;\n  const name = raw.replace(/^#/, \"\").toLowerCase();\n  const found = ctx.guild?.channels.cache.find(\n    (channel) =>\n      channel.name.toLowerCase() === name &&\n      (channel.type === ChannelType.GuildVoice || channel.type === ChannelType.GuildStageVoice),\n  );\n  return found?.id ?? null;\n}\n\nasync function resolveRole(raw: string, ctx: RunContext): Promise<Role | null> {\n  if (ctx.guild === null || raw === \"\") return null;\n  const id = extractId(raw);\n  if (id !== null) {\n    try {\n      return await ctx.guild.roles.fetch(id);\n    } catch {\n      return null;\n    }\n  }\n  const name = raw.replace(/^@/, \"\").toLowerCase();\n  return ctx.guild.roles.cache.find((role) => role.name.toLowerCase() === name) ?? null;\n}\n\n/* ------------------------------------------------------------------ *\n * Payload builders\n * ------------------------------------------------------------------ */\n\ninterface RawEmbed {\n  author?: { name?: string; icon?: string; url?: string };\n  title?: string;\n  description?: string;\n  url?: string;\n  color?: string;\n  thumbnail?: string;\n  image?: string;\n  fields?: { name?: string; value?: string; inline?: boolean }[];\n  footer?: { text?: string; icon?: string };\n  timestamp?: boolean;\n}\n\nfunction buildEmbed(raw: unknown, ctx: RunContext): EmbedBuilder | null {\n  if (typeof raw !== \"object\" || raw === null) return null;\n  const source = raw as RawEmbed;\n  const embed = new EmbedBuilder();\n  let filled = false;\n\n  const title = interpolate(source.title ?? \"\", ctx);\n  if (title !== \"\") {\n    embed.setTitle(title.slice(0, 256));\n    filled = true;\n  }\n\n  const description = interpolate(source.description ?? \"\", ctx);\n  if (description !== \"\") {\n    embed.setDescription(description.slice(0, 4096));\n    filled = true;\n  }\n\n  const url = interpolate(source.url ?? \"\", ctx);\n  if (/^https?:\\/\\//.test(url)) embed.setURL(url);\n\n  if (source.color && /^#?[0-9a-fA-F]{6}$/.test(source.color)) {\n    embed.setColor(Number.parseInt(source.color.replace(\"#\", \"\"), 16));\n    filled = true;\n  }\n\n  const authorName = interpolate(source.author?.name ?? \"\", ctx);\n  if (authorName !== \"\") {\n    const authorIcon = interpolate(source.author?.icon ?? \"\", ctx);\n    const authorUrl = interpolate(source.author?.url ?? \"\", ctx);\n    embed.setAuthor({\n      name: authorName.slice(0, 256),\n      ...(/^https?:\\/\\//.test(authorIcon) ? { iconURL: authorIcon } : {}),\n      ...(/^https?:\\/\\//.test(authorUrl) ? { url: authorUrl } : {}),\n    });\n    filled = true;\n  }\n\n  const thumbnail = interpolate(source.thumbnail ?? \"\", ctx);\n  if (/^(https?|attachment):\\/\\//.test(thumbnail)) {\n    embed.setThumbnail(thumbnail);\n    filled = true;\n  }\n\n  const image = interpolate(source.image ?? \"\", ctx);\n  if (/^(https?|attachment):\\/\\//.test(image)) {\n    embed.setImage(image);\n    filled = true;\n  }\n\n  const fields = (source.fields ?? [])\n    .map((field) => ({\n      name: interpolate(field.name ?? \"\", ctx).slice(0, 256),\n      value: interpolate(field.value ?? \"\", ctx).slice(0, 1024),\n      inline: field.inline === true,\n    }))\n    .filter((field) => field.name !== \"\" && field.value !== \"\")\n    .slice(0, 25);\n  if (fields.length > 0) {\n    embed.addFields(fields);\n    filled = true;\n  }\n\n  const footer = interpolate(source.footer?.text ?? \"\", ctx);\n  if (footer !== \"\") {\n    const footerIcon = interpolate(source.footer?.icon ?? \"\", ctx);\n    embed.setFooter({\n      text: footer.slice(0, 2048),\n      ...(/^https?:\\/\\//.test(footerIcon) ? { iconURL: footerIcon } : {}),\n    });\n    filled = true;\n  }\n\n  if (source.timestamp === true) {\n    embed.setTimestamp(new Date());\n    filled = true;\n  }\n\n  return filled ? embed : null;\n}\n\n/**\n * Who a message may ping. Members are always fine; @everyone, @here and role\n * pings only when the block allows them, so text typed by users\n * ({message.content}, modal answers, command options) can never mass-ping.\n */\nfunction mentionsFor(node: CompiledNode): NonNullable<FlowPayload[\"allowedMentions\"]> {\n  return truthy(node.config[\"allowPings\"])\n    ? { parse: [\"users\", \"roles\", \"everyone\"], repliedUser: true }\n    : { parse: [\"users\"], repliedUser: true };\n}\n\nfunction buildPayload(node: CompiledNode, ctx: RunContext): FlowPayload {\n  const content = cfg(node, \"content\", ctx);\n  const allowedMentions = mentionsFor(node);\n  if (node.messageType === \"components\" && isComponentsV2(node.components)) {\n    const components = buildComponentsV2(node.components, (value) => interpolate(value, ctx), content);\n    if (components.length > 0) return { components, flags: IS_COMPONENTS_V2, allowedMentions };\n  }\n  // Standard messages carry up to 10 embeds; older nodes have a single `embed`.\n  const sources = Array.isArray(node.embeds) ? node.embeds : [node.embed];\n  const embeds = sources\n    .slice(0, 10)\n    .map((source) => buildEmbed(source, ctx))\n    .filter((embed): embed is EmbedBuilder => embed !== null);\n  const components = buildMessageComponents(node.components, (value) => interpolate(value, ctx));\n\n  const payload: FlowPayload = { allowedMentions };\n  if (content !== \"\") payload.content = content.slice(0, 2000);\n  if (embeds.length > 0) payload.embeds = embeds;\n  if (components.length > 0) payload.components = components;\n  if (payload.content === undefined && payload.embeds === undefined && components.length === 0) {\n    payload.content = \"\\u200b\";\n  }\n  return payload;\n}\n\n/**\n * Walks the graph from a trigger to the first node that answers the\n * interaction and reports whether that answer is ephemeral.\n *\n * Discord locks a reply's visibility at defer time, so the automatic defer has\n * to know up front — otherwise a flow whose Reply node is \"only visible to\n * you\" posts publicly whenever it takes longer than the defer window.\n */\nfunction firstAnswer(\n  flow: CompiledFlow,\n  triggerNodeId: string,\n): { ephemeral: boolean; modal: boolean } {\n  const seen = new Set<string>([triggerNodeId]);\n  let frontier = [triggerNodeId];\n\n  while (frontier.length > 0) {\n    const next: string[] = [];\n    for (const id of frontier) {\n      const node = flow.nodes[id];\n      if (node === undefined) continue;\n      for (const targets of Object.values(node.next)) {\n        for (const targetId of targets) {\n          if (seen.has(targetId)) continue;\n          seen.add(targetId);\n          const target = flow.nodes[targetId];\n          if (target === undefined) continue;\n          if (ACK_NODE_TYPES.has(target.type))\n            return {\n              ephemeral: truthy(target.config[\"ephemeral\"]),\n              // A modal must be the interaction's first answer: never defer before it.\n              modal: MODAL_NODE_TYPES.has(target.type),\n            };\n          next.push(targetId);\n        }\n      }\n    }\n    frontier = next;\n  }\n  return { ephemeral: false, modal: false };\n}\n\n/** Discord's most common refusals in words the bot owner can act on. */\nfunction friendlyDiscordError(error: unknown): unknown {\n  const code = (error as { code?: unknown } | null)?.code;\n  switch (code) {\n    case 50013:\n      return new Error(\n        \"Missing permissions: give the bot the permission this block needs, and put the bot's role above the member's or role's highest role.\",\n      );\n    case 50001:\n      return new Error(\"Missing access: the bot cannot see that channel.\");\n    case 10008:\n      return new Error(\"That message does not exist (deleted, or the ID is from another channel).\");\n    case 10007:\n      return new Error(\"That member is not on this server.\");\n    case 40032:\n      return new Error(\"The member is not in a voice channel.\");\n    case 30003:\n      return new Error(\"This channel already has 250 pinned messages.\");\n    case 50035:\n      return new Error(`Discord rejected the request: ${error instanceof Error ? error.message.slice(0, 300) : \"invalid form body\"}`);\n    default:\n      return error;\n  }\n}\n\n/** A block's error, tagged with the block so the dashboard can point at it. */\nclass NodeFailure extends Error {\n  readonly nodeId: string;\n  readonly nodeTitle: string;\n  override readonly cause: unknown;\n  constructor(node: CompiledNode, cause: unknown) {\n    super(cause instanceof Error ? cause.message : String(cause));\n    this.nodeId = node.id;\n    this.nodeTitle = node.title || node.type;\n    this.cause = cause;\n  }\n}\n\n/* ------------------------------------------------------------------ *\n * FlowRunner\n * ------------------------------------------------------------------ */\n\nexport class FlowRunner {\n  private readonly client: Client;\n  private flows: CompiledFlow[];\n  private readonly emit: EventSink;\n  private readonly cooldowns = new Map<string, number>();\n  private cronTimer: NodeJS.Timeout | null = null;\n  private lastCronMinute = \"\";\n  /** Trigger kinds whose gateway listener is already wired to this client. */\n  private readonly attachedKinds = new Set<string>();\n  private interactionsAttached = false;\n  private agentAttached = false;\n  private auditAttached = false;\n  /** Mentions run the AI server agent (see server-agent.ts). */\n  serverAgent = false;\n  private botId = \"\";\n  private userId = \"\";\n  private env: Record<string, string> = {};\n  private plugins: Record<string, Record<string, string>> = {};\n  private sellauthTimer: NodeJS.Timeout | null = null;\n  private sellauthSeen: Set<string> | null = null;\n  /** Feed trigger type → its poll timer (YouTube, Twitch, Bluesky, RSS plugins). */\n  private readonly feedTimers = new Map<string, NodeJS.Timeout>();\n  /** \"type|source\" → ids already seen; the first poll only remembers. */\n  private readonly feedSeen = new Map<string, Set<string>>();\n  /** Channel id → newest Sticky Message call, so a burst reposts once. */\n  private readonly stickyGeneration = new Map<string, number>();\n  /** Channel id → the sticky repost in progress (one at a time per channel). */\n  private readonly stickyLocks = new Map<string, Promise<unknown>>();\n  /** Channel id → id of the sticky message the bot last posted there. */\n  private readonly stickyIds = new Map<string, string>();\n  /** Leveling, Economy, Giveaways, Suggestions and ticket transcripts. */\n  private readonly community: CommunityPlugins;\n  private readonly crypto: CryptoTools;\n  private gameSweep: NodeJS.Timeout | null = null;\n  /** \"!\", \"?\"…: messages starting with one run the matching slash command's flow. */\n  private prefixes: string[] = [];\n  private prefixAttached = false;\n  /** Graphics Studio designs saved to the bot, by id. */\n  private images: Record<string, BotImage> = {};\n\n  /**\n   * Show Modal blocks waiting for their form (\"Submitted\" output), by\n   * user + modal ID. The submit continues that run instead of a trigger.\n   */\n  private waitingModals = new Map<string, (modal: ModalSubmitInteraction) => void>();\n\n  constructor(client: Client, flows: CompiledFlow[], emit: EventSink) {\n    this.client = client;\n    this.flows = flows;\n    this.emit = emit;\n    this.community = new CommunityPlugins({\n      client: () => this.client,\n      store: new BotStore(\n        () => this.botId,\n        () => this.userId,\n      ),\n      env: () => this.env,\n      dispatch: async (type, vars, seed) => {\n        await this.dispatch(\n          (trigger) => trigger.type === type,\n          (ctx) => {\n            for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n          },\n          seed,\n        );\n      },\n    });\n    this.crypto = new CryptoTools({\n      client: () => this.client,\n      store: new BotStore(\n        () => this.botId,\n        () => this.userId,\n      ),\n      dispatch: async (type, vars, seed) => {\n        await this.dispatch(\n          (trigger) => trigger.type === type,\n          (ctx) => {\n            for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n          },\n          seed,\n        );\n      },\n    });\n  }\n\n  /**\n   * Swaps in a freshly published deployment without reconnecting the gateway.\n   *\n   * Listeners read `this.flows` at dispatch time, so replacing the array is\n   * enough for everything already wired; only genuinely new trigger kinds need\n   * an extra listener, and each kind is attached at most once.\n   */\n  setFlows(flows: CompiledFlow[]): void {\n    this.flows = flows;\n    this.attach();\n  }\n\n  /** Bot identity + owner settings (env, plugins) from the published deployment. */\n  setContext(next: {\n    botId: string;\n    userId: string;\n    env: Record<string, string>;\n    plugins: Record<string, Record<string, string>>;\n    serverAgent?: boolean;\n    prefixes?: string[];\n    images?: Record<string, BotImage>;\n  }): void {\n    this.images = next.images ?? {};\n    this.botId = next.botId;\n    this.userId = next.userId;\n    this.env = next.env;\n    this.plugins = next.plugins;\n    this.serverAgent = next.serverAgent ?? false;\n    this.prefixes = next.prefixes ?? [];\n    this.attach();\n  }\n\n  /** Registers gateway listeners for every trigger present in the deployment. */\n  attach(): void {\n    const requested = new Set<string>();\n    for (const flow of this.flows) for (const trigger of flow.triggers) requested.add(trigger.type);\n\n    // Only wire what is not wired yet: attach() runs again on every hot reload.\n    const kinds = new Set<string>();\n    for (const kind of requested) {\n      if (this.attachedKinds.has(kind)) continue;\n      kinds.add(kind);\n      this.attachedKinds.add(kind);\n    }\n\n    // Interactions arrive for every bot regardless of intents, and the set of\n    // commands changes between publishes. The listener is therefore attached\n    // unconditionally and exactly once — a bot with no published flow still\n    // answers instead of leaving Discord to show \"did not respond\".\n    if (!this.interactionsAttached) {\n      this.interactionsAttached = true;\n      this.client.on(Events.InteractionCreate, (interaction: Interaction) => {\n        void this.onInteraction(interaction).catch((error: unknown) => {\n          logger.error(`Interaction handling failed: ${describeError(error)}`);\n        });\n      });\n    }\n\n\n    // Messages only arrive with the GuildMessages intent, which the control\n    // plane adds for bots with the server agent; the flag is read per message.\n    if (!this.agentAttached) {\n      this.agentAttached = true;\n      this.client.on(Events.MessageCreate, (message: Message) => {\n        if (!this.serverAgent) return;\n        void handleAgentMention(this.client, { botId: this.botId, userId: this.userId }, message).catch(\n          (error: unknown) => logger.error(`AI agent mention failed: ${describeError(error)}`),\n        );\n      });\n    }\n\n    if (kinds.has(\"message-received\")) {\n      this.client.on(Events.MessageCreate, (message: Message) => {\n        if (message.author.bot) return;\n        void this.onMessage(message).catch((error: unknown) => {\n          logger.error(`Message handling failed: ${describeError(error)}`);\n        });\n      });\n    }\n\n    if (kinds.has(\"member-joined\")) {\n      this.client.on(Events.GuildMemberAdd, (member: GuildMember) => {\n        void this.runTriggers(\"member-joined\", () => true, {\n          member,\n          guild: member.guild,\n          user: member.user,\n        });\n      });\n    }\n\n    if (kinds.has(\"member-left\")) {\n      this.client.on(Events.GuildMemberRemove, (member) => {\n        void this.runTriggers(\"member-left\", () => true, {\n          member: member.partial ? null : (member as GuildMember),\n          guild: member.guild,\n          user: member.user,\n        });\n      });\n    }\n\n    if (kinds.has(\"reaction-added\") || kinds.has(\"reaction-removed\")) {\n      if (kinds.has(\"reaction-added\")) {\n        this.client.on(Events.MessageReactionAdd, (reaction, user) => {\n          void this.onReaction(\"reaction-added\", reaction, user).catch((error: unknown) => {\n            logger.warn(`Reaction handling failed: ${describeError(error)}`);\n          });\n        });\n      }\n      if (kinds.has(\"reaction-removed\")) {\n        this.client.on(Events.MessageReactionRemove, (reaction, user) => {\n          void this.onReaction(\"reaction-removed\", reaction, user).catch((error: unknown) => {\n            logger.warn(`Reaction handling failed: ${describeError(error)}`);\n          });\n        });\n      }\n    }\n\n    if (kinds.has(\"dm-received\")) {\n      this.client.on(Events.MessageCreate, (message: Message) => {\n        if (message.author.bot || message.guild !== null) return;\n        void this.runTriggers(\"dm-received\", () => true, {\n          message,\n          user: message.author,\n          channel: message.channel,\n        });\n      });\n    }\n\n    if (kinds.has(\"message-edited\")) {\n      this.client.on(Events.MessageUpdate, (old, updated) => {\n        void (async () => {\n          const message = updated.partial ? await updated.fetch().catch(() => null) : (updated as Message);\n          if (message === null || message.author.bot) return;\n          // Link previews unfolding also fire MessageUpdate: only real edits count.\n          if (!old.partial && old.content === message.content) return;\n          await this.runTriggers(\n            \"message-edited\",\n            (trigger) => messageChannelMatches(text(trigger.config[\"channel\"]), message),\n            {\n              message,\n              guild: message.guild,\n              member: message.member,\n              user: message.author,\n              channel: message.channel,\n            },\n            { \"message.oldContent\": old.partial ? \"\" : (old.content ?? \"\") },\n          );\n        })().catch((error: unknown) => logger.warn(`Message edit handling failed: ${describeError(error)}`));\n      });\n    }\n\n    if (kinds.has(\"message-deleted\")) {\n      this.client.on(Events.MessageDelete, (deleted) => {\n        if (deleted.partial) return;\n        const message = deleted as Message;\n        void this.runTriggers(\n          \"message-deleted\",\n          (trigger) => messageChannelMatches(text(trigger.config[\"channel\"]), message),\n          {\n            message,\n            guild: message.guild,\n            member: message.member,\n            user: message.author,\n            channel: message.channel,\n          },\n        );\n      });\n    }\n\n    if (kinds.has(\"voice-join\") || kinds.has(\"voice-leave\") || kinds.has(\"voice-move\")) {\n      // One VoiceStateUpdate listener covers all three; mark the siblings as\n      // wired so a later hot reload cannot attach a second copy.\n      for (const kind of [\"voice-join\", \"voice-leave\", \"voice-move\"]) {\n        this.attachedKinds.add(kind);\n      }\n      this.client.on(Events.VoiceStateUpdate, (before, after) => {\n        const member = after.member ?? before.member;\n        const guild = after.guild;\n        const seed = {\n          member,\n          guild,\n          ...(member === null ? {} : { user: member.user }),\n        };\n\n        if (before.channelId === null && after.channelId !== null) {\n          void this.runTriggers(\n            \"voice-join\",\n            (trigger) => voiceChannelMatches(text(trigger.config[\"channel\"]), after.channel),\n            seed,\n          );\n        } else if (before.channelId !== null && after.channelId === null) {\n          void this.runTriggers(\n            \"voice-leave\",\n            (trigger) => voiceChannelMatches(text(trigger.config[\"channel\"]), before.channel),\n            seed,\n          );\n        } else if (before.channelId !== after.channelId) {\n          void this.runTriggers(\"voice-move\", () => true, seed, {\n            \"voice.from\": before.channelId ? `<#${before.channelId}>` : \"\",\n            \"voice.from.id\": before.channelId ?? \"\",\n            \"voice.from.name\": before.channel?.name ?? \"\",\n            \"voice.to\": after.channelId ? `<#${after.channelId}>` : \"\",\n            \"voice.to.id\": after.channelId ?? \"\",\n            \"voice.to.name\": after.channel?.name ?? \"\",\n          });\n        }\n      });\n    }\n\n    if (kinds.has(\"channel-created\")) {\n      this.client.on(Events.ChannelCreate, (channel) => {\n        void this.runTriggers(\n          \"channel-created\",\n          () => true,\n          { guild: channel.guild, ...(channel.isTextBased() ? { channel } : {}) },\n          channelVars(channel),\n        );\n      });\n    }\n\n    if (kinds.has(\"channel-deleted\")) {\n      this.client.on(Events.ChannelDelete, (channel) => {\n        if (channel.isDMBased()) return;\n        void this.runTriggers(\"channel-deleted\", () => true, { guild: channel.guild }, channelVars(channel));\n      });\n    }\n\n    if (kinds.has(\"thread-created\")) {\n      this.client.on(Events.ThreadCreate, (thread, newlyCreated) => {\n        // Also fires when the bot is added to an existing thread.\n        if (!newlyCreated) return;\n        void this.runTriggers(\n          \"thread-created\",\n          () => true,\n          { guild: thread.guild, channel: thread },\n          {\n            ...channelVars(thread),\n            \"thread.parent\": thread.parentId ? `<#${thread.parentId}>` : \"\",\n            \"thread.parent.id\": thread.parentId ?? \"\",\n            \"thread.owner\": thread.ownerId ? `<@${thread.ownerId}>` : \"\",\n          },\n        );\n      });\n    }\n\n    if (kinds.has(\"role-created\")) {\n      this.client.on(Events.GuildRoleCreate, (role) => {\n        void this.runTriggers(\"role-created\", () => true, { guild: role.guild }, roleVars(role));\n      });\n    }\n\n    if (kinds.has(\"role-deleted\")) {\n      this.client.on(Events.GuildRoleDelete, (role) => {\n        void this.runTriggers(\"role-deleted\", () => true, { guild: role.guild }, roleVars(role));\n      });\n    }\n\n    if (kinds.has(\"member-banned\")) {\n      this.client.on(Events.GuildBanAdd, (ban) => {\n        void this.runTriggers(\n          \"member-banned\",\n          () => true,\n          { guild: ban.guild, user: ban.user },\n          { reason: ban.reason ?? \"\" },\n        );\n      });\n    }\n\n    if (kinds.has(\"member-unbanned\")) {\n      this.client.on(Events.GuildBanRemove, (ban) => {\n        void this.runTriggers(\"member-unbanned\", () => true, {\n          guild: ban.guild,\n          user: ban.user,\n        });\n      });\n    }\n\n    if (kinds.has(\"member-updated\")) {\n      this.client.on(Events.GuildMemberUpdate, (before, after) => {\n        const added = before.partial\n          ? []\n          : after.roles.cache.filter((r) => !before.roles.cache.has(r.id)).map((r) => r);\n        const removed = before.partial\n          ? []\n          : before.roles.cache.filter((r) => !after.roles.cache.has(r.id)).map((r) => r);\n        void this.runTriggers(\n          \"member-updated\",\n          () => true,\n          { member: after, guild: after.guild, user: after.user },\n          {\n            \"member.oldNick\": before.partial ? \"\" : (before.nickname ?? \"\"),\n            \"member.nick\": after.nickname ?? \"\",\n            \"roles.added\": added.map((r) => `<@&${r.id}>`).join(\", \"),\n            \"roles.added.names\": added.map((r) => r.name).join(\", \"),\n            \"roles.removed\": removed.map((r) => `<@&${r.id}>`).join(\", \"),\n            \"roles.removed.names\": removed.map((r) => r.name).join(\", \"),\n            \"member.timedOutUntil\": after.communicationDisabledUntil?.toISOString() ?? \"\",\n          },\n        );\n      });\n    }\n\n    if (kinds.has(\"invite-created\")) {\n      this.client.on(Events.InviteCreate, (invite) => {\n        void this.runTriggers(\n          \"invite-created\",\n          () => true,\n          {\n            ...(invite.guild !== null && \"id\" in invite.guild ? { guild: invite.guild as Guild } : {}),\n            ...(invite.inviter === null ? {} : { user: invite.inviter }),\n          },\n          {\n            invite: invite.url,\n            \"invite.code\": invite.code,\n            \"invite.url\": invite.url,\n            \"invite.channel\": invite.channelId ? `<#${invite.channelId}>` : \"\",\n            \"invite.maxUses\": String(invite.maxUses ?? 0),\n            \"invite.maxAge\": String(invite.maxAge ?? 0),\n          },\n        );\n      });\n    }\n\n    if (kinds.has(\"typing-start\")) {\n      this.client.on(Events.TypingStart, (typing) => {\n        void this.runTriggers(\"typing-start\", () => true, {\n          ...(typing.guild === null ? {} : { guild: typing.guild }),\n          ...(typing.user.partial ? {} : { user: typing.user as User }),\n          ...(typing.channel.isTextBased() ? { channel: typing.channel } : {}),\n        });\n      });\n    }\n\n    if (kinds.has(\"guild-joined\")) {\n      this.client.on(Events.GuildCreate, (guild) => {\n        void this.runTriggers(\"guild-joined\", () => true, { guild });\n      });\n    }\n\n    if (kinds.has(\"server-event-created\")) {\n      this.client.on(Events.GuildScheduledEventCreate, (event) => {\n        if (!event.guild) return;\n        void this.runTriggers(\n          \"server-event-created\",\n          () => true,\n          { guild: event.guild, ...(event.creator ? { user: event.creator } : {}) },\n          guildEventVars(event),\n        );\n      });\n    }\n\n    if (kinds.has(\"server-event-started\")) {\n      this.client.on(Events.GuildScheduledEventUpdate, (before, after) => {\n        if (!after.guild || !after.isActive() || before?.isActive()) return;\n        void this.runTriggers(\"server-event-started\", () => true, { guild: after.guild }, guildEventVars(after));\n      });\n    }\n\n    if (kinds.has(\"server-event-interested\")) {\n      this.client.on(Events.GuildScheduledEventUserAdd, (event, user) => {\n        if (!event.guild) return;\n        const guild = event.guild;\n        void (async () => {\n          const member = await guild.members.fetch(user.id).catch(() => null);\n          await this.runTriggers(\n            \"server-event-interested\",\n            () => true,\n            { guild, user, member },\n            guildEventVars(event),\n          );\n        })();\n      });\n    }\n\n    if (kinds.has(\"automod-action\")) {\n      this.client.on(Events.AutoModerationActionExecution, (execution) => {\n        const guild = execution.guild;\n        void (async () => {\n          const member = execution.member ?? (await guild.members.fetch(execution.userId).catch(() => null));\n          const channel = execution.channel && execution.channel.isTextBased() ? execution.channel : null;\n          await this.runTriggers(\n            \"automod-action\",\n            () => true,\n            {\n              guild,\n              member,\n              ...(member ? { user: member.user } : {}),\n              ...(channel ? { channel } : {}),\n            },\n            {\n              \"automod.rule\": execution.autoModerationRule?.name ?? execution.ruleId,\n              \"automod.ruleId\": execution.ruleId,\n              \"automod.keyword\": execution.matchedKeyword ?? \"\",\n              \"automod.matched\": execution.matchedContent ?? \"\",\n              \"automod.content\": execution.content ?? \"\",\n              \"automod.action\": String(execution.action.type),\n            },\n          );\n        })();\n      });\n    }\n\n    if (kinds.has(\"bot-ready\")) {\n      // attach() runs BEFORE login, so firing straight away would run the flow\n      // against a client with no user, guilds or cache.\n      if (this.client.isReady()) {\n        void this.runTriggers(\"bot-ready\", () => true, {});\n      } else {\n        this.client.once(Events.ClientReady, () => {\n          void this.runTriggers(\"bot-ready\", () => true, {});\n        });\n      }\n    }\n\n    // Anti-Nuke: audit log entries arrive as they happen (GuildModeration\n    // intent), so the guard does not have to poll the audit log in a raid.\n    if (\n      !this.auditAttached &&\n      this.flows.some((flow) => Object.values(flow.nodes).some((n) => n.type === \"antinuke-guard\"))\n    ) {\n      this.auditAttached = true;\n      this.client.on(Events.GuildAuditLogEntryCreate, (entry, guild) => {\n        const list = auditEntries.get(guild.id) ?? [];\n        list.push({\n          action: entry.action,\n          targetId: entry.targetId ?? null,\n          executorId: entry.executorId ?? null,\n          at: Date.now(),\n        });\n        if (list.length > 100) list.splice(0, list.length - 100);\n        auditEntries.set(guild.id, list);\n      });\n    }\n\n    if (kinds.has(\"scheduled-event\") && this.cronTimer === null) this.startCron();\n    if (kinds.has(\"sellauth-new-order\") && this.sellauthTimer === null) this.startSellAuthPoll();\n    this.startFeeds(requested);\n    if (this.prefixes.length > 0 && !this.prefixAttached) {\n      this.prefixAttached = true;\n      this.client.on(Events.MessageCreate, (message) => {\n        void this.onPrefixMessage(message).catch((error) => logger.warn(`Prefix command failed: ${describeError(error)}`));\n      });\n    }\n    const nodeTypes = new Set(this.flows.flatMap((f) => Object.values(f.nodes).map((n) => n.type)));\n    if (requested.has(\"giveaway-ended\") || nodeTypes.has(\"giveaway-start\") || nodeTypes.has(\"giveaway-end\"))\n      this.community.startGiveaways();\n    this.crypto.start(\n      requested.has(\"crypto-alert-hit\") || nodeTypes.has(\"crypto-alert\"),\n      requested.has(\"crypto-wallet-activity\") || nodeTypes.has(\"crypto-watch\"),\n    );\n    if (nodeTypes.has(\"casino\") && this.gameSweep === null) {\n      this.gameSweep = setInterval(() => this.community.sweepGames(), 60_000);\n      this.gameSweep.unref();\n    }\n  }\n\n  detach(): void {\n    this.community.stop();\n    this.crypto.stop();\n    if (this.gameSweep !== null) clearInterval(this.gameSweep);\n    this.gameSweep = null;\n    for (const timer of this.feedTimers.values()) clearInterval(timer);\n    this.feedTimers.clear();\n    if (this.cronTimer !== null) {\n      clearInterval(this.cronTimer);\n      this.cronTimer = null;\n    }\n    if (this.sellauthTimer !== null) {\n      clearInterval(this.sellauthTimer);\n      this.sellauthTimer = null;\n    }\n  }\n\n  /** Reaction triggers: fetch what Discord sent partially, then seed the run. */\n  private async onReaction(\n    kind: \"reaction-added\" | \"reaction-removed\",\n    rawReaction: MessageReaction | PartialMessageReaction,\n    rawUser: User | PartialUser,\n  ): Promise<void> {\n    const reaction = rawReaction.partial ? await rawReaction.fetch().catch(() => null) : rawReaction;\n    if (reaction === null) return;\n    const message = reaction.message.partial\n      ? await reaction.message.fetch().catch(() => null)\n      : (reaction.message as Message);\n    const user = rawUser.partial ? await rawUser.fetch().catch(() => null) : (rawUser as User);\n    if (user === null || user.bot) return;\n    const guild = reaction.message.guild;\n    const member = guild ? await guild.members.fetch(user.id).catch(() => null) : null;\n    const emoji = reaction.emoji;\n    await this.runTriggers(\n      kind,\n      (trigger) => matchesEmoji(text(trigger.config[\"emoji\"]), emoji.name ?? \"\", emoji.id),\n      {\n        message,\n        guild,\n        member,\n        user,\n        channel: message?.channel ?? (reaction.message.channel as TextBasedChannel),\n      },\n      {\n        emoji: emoji.id ? `<${emoji.animated ? \"a\" : \"\"}:${emoji.name ?? \"_\"}:${emoji.id}>` : (emoji.name ?? \"\"),\n        \"emoji.name\": emoji.name ?? \"\",\n        \"emoji.id\": emoji.id ?? \"\",\n        \"reaction.count\": String(reaction.count ?? 0),\n      },\n    );\n  }\n\n  /* ------------------------- prefix commands ------------------------ */\n\n  /** \"!ban @x spam\" → the /ban flow, with its options filled in order. */\n  private async onPrefixMessage(message: Message): Promise<void> {\n    if (message.author.bot || this.prefixes.length === 0 || !message.content) return;\n    const hit = matchPrefixCommand(message.content, this.prefixes);\n    if (!hit) return;\n    const owner = this.flows.find((flow) =>\n      flow.triggers.some(\n        (t) =>\n          t.type === \"slash-command\" &&\n          text(t.config[\"name\"]).toLowerCase() === hit.name &&\n          t.config[\"noPrefix\"] !== true &&\n          t.config[\"noPrefix\"] !== \"true\",\n      ),\n    );\n    const command = owner?.commands.find((c) => c.name.toLowerCase() === hit.name);\n    if (!owner || !command) return;\n    if (command.guildOnly && !message.guild) return;\n    if (command.memberPermissions && message.member) {\n      const needed = BigInt(command.memberPermissions);\n      if (!message.member.permissions.has(needed)) {\n        await message.reply({ content: \"You don't have permission to use this command.\", allowedMentions: { repliedUser: false } }).catch(() => undefined);\n        return;\n      }\n    }\n    const { values, missing } = prefixOptionValues(hit.rest, command.options);\n    if (missing.length) {\n      const usage = command.options.map((o) => (o.required ? `<${o.name}>` : `[${o.name}]`)).join(\" \");\n      await message\n        .reply({ content: `Usage: \\`${hit.prefix}${command.name} ${usage}\\`\\nMissing: ${missing.join(\", \")}`, allowedMentions: { repliedUser: false } })\n        .catch(() => undefined);\n      return;\n    }\n    await this.dispatch(\n      (trigger) => trigger.type === \"slash-command\" && text(trigger.config[\"name\"]).toLowerCase() === hit.name,\n      (ctx) => {\n        ctx.vars.set(\"prefix\", hit.prefix);\n        ctx.vars.set(\"args\", hit.rest);\n        splitArgs(hit.rest).forEach((arg, i) => ctx.vars.set(`arg${i + 1}`, arg));\n        for (const [name, value] of Object.entries(values)) {\n          ctx.vars.set(`option.${name}`, value);\n          ctx.vars.set(name, value);\n        }\n        if (values[\"reason\"] !== undefined) ctx.vars.set(\"reason\", values[\"reason\"]);\n        const userOption = command.options.find((o) => o.type === \"user\" && values[o.name]);\n        if (userOption) {\n          const id = values[userOption.name]!;\n          const known = message.mentions.users.get(id) ?? this.client.users.cache.get(id);\n          ctx.vars.set(\"user\", `<@${id}>`);\n          ctx.vars.set(\"user.id\", id);\n          if (known) ctx.vars.set(\"username\", known.username);\n        }\n      },\n      {\n        message,\n        member: message.member,\n        user: message.author,\n        guild: message.guild,\n        channel: message.channel as TextBasedChannel,\n      },\n      { stopAfterFirst: true },\n    );\n    this.emit({\n      event: \"command.used\",\n      level: \"info\",\n      description: `${hit.prefix}${command.name} used by ${message.author.username}`,\n      at: nowIso(),\n    });\n  }\n\n  /* ---------------------------- dispatch ---------------------------- */\n\n  private async onInteraction(interaction: Interaction): Promise<void> {\n    if ((interaction.isButton() || interaction.isModalSubmit()) && interaction.customId.startsWith(PLUGIN_BUTTON_PREFIX)) {\n      await this.community.onInteraction(interaction);\n      return;\n    }\n    if (interaction.isButton() && interaction.customId.startsWith(AGENT_BUTTON_PREFIX)) {\n      await handleAgentButton({ botId: this.botId, userId: this.userId }, interaction);\n      return;\n    }\n    if (interaction.isAutocomplete()) {\n      // Suggestions come from the option's list in the builder, filtered by\n      // what the user typed so far (Discord shows at most 25).\n      const focused = interaction.options.getFocused(true);\n      const typed = String(focused.value ?? \"\").toLowerCase();\n      const option = this.flows\n        .flatMap((flow) => flow.commands)\n        .find((command) => command.name === interaction.commandName)\n        ?.options.find((o) => o.name === focused.name);\n      const numeric = focused.type !== ApplicationCommandOptionType.String;\n      const choices = (option?.suggestions ?? [])\n        .filter((value) => value.toLowerCase().includes(typed))\n        .filter((value) => !numeric || Number.isFinite(Number(value)))\n        .slice(0, 25)\n        .map((value) => ({ name: value, value: numeric ? Number(value) : value }));\n      await interaction.respond(choices).catch(() => undefined);\n      return;\n    }\n    if (interaction.isChatInputCommand()) {\n      const name = interaction.commandName;\n      const matched = await this.dispatch(\n        (trigger) =>\n          trigger.type === \"slash-command\" &&\n          text(trigger.config[\"name\"]).toLowerCase() === name.toLowerCase(),\n        (ctx) => {\n          for (const option of interaction.options.data) {\n            const value = option.value === undefined ? \"\" : String(option.value);\n            ctx.vars.set(`option.${option.name}`, value);\n            ctx.vars.set(option.name, value);\n          }\n          const reason = interaction.options.data.find((option) => option.name === \"reason\");\n          if (reason) ctx.vars.set(\"reason\", String(reason.value ?? \"\"));\n          const target = interaction.options.data.find((option) => option.user !== undefined);\n          if (target?.user) {\n            ctx.vars.set(\"user\", `<@${target.user.id}>`);\n            ctx.vars.set(\"user.id\", target.user.id);\n            ctx.vars.set(\"username\", target.user.username);\n          }\n        },\n        interactionContext(interaction),\n        // Discord allows one command per name, so only the first flow that\n        // claims it may answer. A second run would fight over the same token.\n        { stopAfterFirst: true },\n      );\n\n      if (matched > 0) {\n        this.emit({\n          event: \"command.used\",\n          level: \"info\",\n          description: `/${name} used by ${interaction.user.username}`,\n          at: nowIso(),\n        });\n      }\n\n      if (matched === 0 && !interaction.replied && !interaction.deferred) {\n        await interaction\n          .reply({\n            content: `\\`/${name}\\` has no published flow on this bot yet. Publish it in the Bottly flow builder.`,\n            flags: MessageFlags.Ephemeral,\n          })\n          .catch(() => undefined);\n      }\n      return;\n    }\n\n    if (interaction.isButton()) {\n      const button = interaction as ButtonInteraction;\n      const matched = await this.dispatch(\n        (trigger) =>\n          trigger.type === \"button-click\" && text(trigger.config[\"customId\"]) === button.customId,\n        () => undefined,\n        interactionContext(button),\n        { stopAfterFirst: true },\n      );\n      await this.answerUnhandled(\n        button,\n        matched,\n        \"This button is not connected to a published flow on this bot.\",\n      );\n      return;\n    }\n\n    if (\n      interaction.isStringSelectMenu() ||\n      interaction.isUserSelectMenu() ||\n      interaction.isRoleSelectMenu() ||\n      interaction.isChannelSelectMenu() ||\n      interaction.isMentionableSelectMenu()\n    ) {\n      const select = interaction as AnySelectMenuInteraction;\n      const values: string[] = \"values\" in select ? select.values : [];\n      const stringSelect = select.isStringSelectMenu();\n      const labelOf = new Map<string, string>();\n      if (stringSelect) {\n        const options = (select.component as { options?: { label?: string; value?: string }[] })\n          .options;\n        for (const option of options ?? []) {\n          if (option.value !== undefined) labelOf.set(option.value, option.label ?? option.value);\n        }\n      }\n      const labels = values.map((v) => labelOf.get(v) ?? v);\n      // Menus built by the current editor (generated custom_id) expose the\n      // option labels; older menus keep exposing their raw values.\n      const shown = stringSelect && isGeneratedSelectId(select.customId) ? labels : values;\n      const seedSelected = (ctx: RunContext) => {\n        ctx.vars.set(\"selected\", shown.join(\", \"));\n        ctx.vars.set(\"selected.first\", shown[0] ?? \"\");\n        ctx.vars.set(\"selected.values\", values.join(\", \"));\n        ctx.vars.set(\"selected.labels\", labels.join(\", \"));\n      };\n      const seed = interactionContext(select);\n\n      // Each string-select option carries its own action ID (sent as its\n      // value): run the Button Click / Dropdown Select trigger listening for\n      // the first picked option that has one. An interaction can only be\n      // answered once, so a single flow runs per pick.\n      let matched = 0;\n      if (stringSelect) {\n        const actionIds = [...new Set(values.flatMap((v) => [v, optionActionId(v)]))];\n        for (const actionId of actionIds) {\n          if (actionId === \"\") continue;\n          matched = await this.dispatch(\n            (trigger) =>\n              (trigger.type === \"dropdown-select\" || trigger.type === \"button-click\") &&\n              text(trigger.config[\"customId\"]) === actionId,\n            seedSelected,\n            seed,\n            { stopAfterFirst: true },\n          );\n          if (matched > 0) break;\n        }\n      }\n      // Legacy: a Dropdown Select trigger on the menu's own custom_id.\n      if (matched === 0) {\n        matched = await this.dispatch(\n          (trigger) =>\n            trigger.type === \"dropdown-select\" &&\n            text(trigger.config[\"customId\"]) === select.customId,\n          seedSelected,\n          seed,\n          { stopAfterFirst: true },\n        );\n      }\n      await this.answerUnhandled(\n        select,\n        matched,\n        \"This menu is not connected to a published flow on this bot.\",\n      );\n      return;\n    }\n\n    if (interaction.isModalSubmit()) {\n      const modal = interaction as ModalSubmitInteraction;\n      const waiting = this.waitingModals.get(`${modal.user.id}:${modal.customId}`);\n      if (waiting) {\n        this.waitingModals.delete(`${modal.user.id}:${modal.customId}`);\n        waiting(modal);\n        return;\n      }\n      const matched = await this.dispatch(\n        (trigger) =>\n          trigger.type === \"modal-submit\" && text(trigger.config[\"customId\"]) === modal.customId,\n        (ctx) => {\n          for (const [id, answer] of modalAnswers(modal)) {\n            ctx.vars.set(`field.${id}`, answer.text);\n            ctx.vars.set(id, answer.text);\n            if (answer.values) {\n              ctx.vars.set(`${id}.values`, answer.values.join(\", \"));\n              ctx.vars.set(`${id}.count`, String(answer.values.length));\n            }\n          }\n        },\n        interactionContext(modal),\n        { stopAfterFirst: true },\n      );\n      await this.answerUnhandled(\n        modal,\n        matched,\n        \"This form is not connected to a published flow on this bot.\",\n      );\n    }\n  }\n\n  /**\n   * Closes an interaction nothing answered.\n   *\n   * An unanswered component shows Discord's red \"This interaction failed\" to\n   * everyone in the channel, which looks like the bot crashed; a quiet\n   * ephemeral note says what actually happened.\n   */\n  private async answerUnhandled(\n    interaction: RepliableInteraction,\n    matched: number,\n    message: string,\n  ): Promise<void> {\n    if (matched > 0 || interaction.replied || interaction.deferred) return;\n    await interaction.reply({ content: message, flags: MessageFlags.Ephemeral }).catch(() => undefined);\n  }\n\n  private async onMessage(message: Message): Promise<void> {\n    await this.dispatch(\n      (trigger) => {\n        if (trigger.type !== \"message-received\") return false;\n        const filter = text(trigger.config[\"channel\"]).trim();\n        if (filter === \"\") return true;\n        const id = extractId(filter);\n        if (id !== null) return message.channelId === id;\n        const name = filter.replace(/^#/, \"\").toLowerCase();\n        return (\n          \"name\" in message.channel && String(message.channel.name ?? \"\").toLowerCase() === name\n        );\n      },\n      () => undefined,\n      {\n        message,\n        guild: message.guild,\n        member: message.member,\n        user: message.author,\n        channel: message.channel,\n      },\n    );\n  }\n\n  private async runTriggers(\n    type: string,\n    matches: (trigger: CompiledTrigger) => boolean,\n    seed: Partial<Omit<RunContext, \"client\" | \"flow\" | \"vars\" | \"steps\" | \"acknowledged\">>,\n    vars: Record<string, string> = {},\n  ): Promise<void> {\n    await this.dispatch(\n      (trigger) => trigger.type === type && matches(trigger),\n      (ctx) => {\n        for (const [key, value] of Object.entries(vars)) ctx.vars.set(key, value);\n      },\n      seed,\n    );\n  }\n\n  private async dispatch(\n    matches: (trigger: CompiledTrigger) => boolean,\n    seedVars: (ctx: RunContext) => void,\n    seed: Partial<Omit<RunContext, \"client\" | \"flow\" | \"vars\" | \"steps\" | \"acknowledged\">>,\n    options: { stopAfterFirst?: boolean } = {},\n  ): Promise<number> {\n    let matched = 0;\n    for (const flow of this.flows) {\n      for (const trigger of flow.triggers) {\n        if (!matches(trigger)) continue;\n        matched += 1;\n\n        const ctx: RunContext = {\n          client: this.client,\n          flow,\n          vars: new Map<string, string>([\n            ...Object.entries(this.env).map(([k, v]) => [`env.${k}`, v] as [string, string]),\n          ]),\n          interaction: seed.interaction ?? null,\n          message: seed.message ?? null,\n          member: seed.member ?? null,\n          user: seed.user ?? null,\n          guild: seed.guild ?? null,\n          channel: seed.channel ?? null,\n          acknowledged: false,\n          steps: 0,\n        };\n        seedVars(ctx);\n\n        // Match the visibility the flow's own first answer would use, so the\n        // automatic defer cannot turn an ephemeral reply into a public one.\n        const first = firstAnswer(flow, trigger.nodeId);\n        const deferTimer =\n          ctx.interaction !== null && !first.modal\n            ? setTimeout(() => {\n                void this.autoDefer(ctx, first.ephemeral);\n              }, AUTO_DEFER_AFTER_MS)\n            : null;\n\n        try {\n          await this.walk(flow, trigger.nodeId, \"out\", ctx);\n        } catch (error) {\n          const failed = error instanceof NodeFailure ? error : null;\n          const description = describeError(failed ? failed.cause : error, 300);\n          logger.warn(`Flow ${flow.flowId} failed: ${description}`);\n          ctx.failure = failed ? `\"${failed.nodeTitle}\" failed: ${description}` : description;\n          this.emit({\n            event: \"flow.error\",\n            level: \"error\",\n            description: failed\n              ? `Flow \"${flow.flowName}\" stopped at \"${failed.nodeTitle}\": ${description}`\n              : `Flow \"${flow.flowName}\" stopped: ${description}`,\n            at: nowIso(),\n            flowId: flow.flowId,\n            ...(failed ? { nodeId: failed.nodeId } : {}),\n          });\n        } finally {\n          if (deferTimer !== null) clearTimeout(deferTimer);\n          await this.settleInteraction(ctx);\n        }\n\n        if (options.stopAfterFirst === true) return matched;\n      }\n    }\n    return matched;\n  }\n\n  /**\n   * Discord shows \"the application did not respond\" whenever an interaction is\n   * never acknowledged. A flow that produced no reply still has to close it.\n   */\n  private async settleInteraction(ctx: RunContext): Promise<void> {\n    const interaction = ctx.interaction;\n    if (interaction === null || ctx.modalShown) return;\n    try {\n      if (ctx.updating) return; // deferUpdate() needs no answer\n      // A failed run says why instead of a generic \"Done.\", so the owner can\n      // fix it without digging through the hosting logs.\n      const failure = ctx.failure ? `⚠️ This command stopped: ${ctx.failure}`.slice(0, 2000) : null;\n      if (interaction.deferred && !interaction.replied) {\n        await interaction.editReply({ content: failure ?? \"Done.\" });\n      } else if (!interaction.deferred && !interaction.replied) {\n        await interaction.reply({\n          content: failure ?? (ctx.sentToChannel ? \"Done.\" : \"This flow finished without a reply step.\"),\n          flags: MessageFlags.Ephemeral,\n        });\n      }\n    } catch (error) {\n      logger.debug(`Could not settle interaction: ${describeError(error)}`);\n    }\n  }\n\n  /** Keeps the interaction alive when the flow is slower than Discord's 3s window. */\n  private async autoDefer(ctx: RunContext, ephemeral = false): Promise<void> {\n    const interaction = ctx.interaction;\n    if (interaction === null || ctx.acknowledged) return;\n    if (interaction.replied || interaction.deferred) {\n      ctx.acknowledged = true;\n      return;\n    }\n    try {\n      await interaction.deferReply(ephemeral ? { flags: MessageFlags.Ephemeral } : {});\n      ctx.acknowledged = true;\n    } catch (error) {\n      logger.debug(`Auto-defer failed: ${describeError(error)}`);\n    }\n  }\n\n  /* ------------------------------ walk ------------------------------ */\n\n  private async walk(\n    flow: CompiledFlow,\n    fromNodeId: string,\n    handle: string,\n    ctx: RunContext,\n  ): Promise<void> {\n    const source = flow.nodes[fromNodeId];\n    const targets = source?.next[handle] ?? [];\n\n    for (const targetId of targets) {\n      const node = flow.nodes[targetId];\n      if (node === undefined) continue;\n      // A trigger only starts its own run (e.g. a button click); a line drawn\n      // into it from a message is a visual hint, never a step.\n      if (NODE_SPECS[node.type]?.kind === \"trigger\") continue;\n\n      ctx.steps += 1;\n      if (ctx.steps > MAX_STEPS) {\n        throw new Error(`Flow exceeded ${MAX_STEPS} steps — check for a loop.`);\n      }\n\n      let nextHandle: string | null;\n      try {\n        nextHandle = await this.execute(node, ctx);\n      } catch (error) {\n        // Remember the innermost failing block; outer walks pass it through.\n        throw error instanceof NodeFailure ? error : new NodeFailure(node, friendlyDiscordError(error));\n      }\n      if (nextHandle === null) continue; // node stops this branch\n      await this.walk(flow, node.id, nextHandle, ctx);\n    }\n  }\n\n  /**\n   * Runs one node. Returns the handle to continue on, or null to stop the branch.\n   */\n  private async execute(node: CompiledNode, ctx: RunContext): Promise<string | null> {\n    switch (node.type) {\n      /* ---------------------------- messages --------------------------- */\n      case \"send-message\":\n      case \"send-embed\": {\n        const payload = await this.withImages(buildPayload(node, ctx), node, ctx);\n        const ephemeral = truthy(node.config[\"ephemeral\"]);\n        const targetRaw = cfg(node, \"channel\", ctx);\n\n        if (ephemeral && ctx.interaction !== null) {\n          await this.respond(ctx, payload, true);\n          return \"out\";\n        }\n\n        const channel = await resolveChannel(targetRaw, ctx);\n        if (channel === null || !(\"send\" in channel)) {\n          throw new Error(`Channel \"${targetRaw || \"current\"}\" could not be resolved.`);\n        }\n        const sent = await channel.send(payload as MessageCreateOptions);\n        ctx.vars.set(\"lastMessage.id\", sent.id);\n        ctx.sentToChannel = true;\n        return \"out\";\n      }\n\n      case \"reply\": {\n        const payload = await this.withImages(buildPayload(node, ctx), node, ctx);\n        const interaction = ctx.interaction;\n        // \"Update the clicked message\": edit the button's / menu's own message.\n        if (truthy(node.config[\"updateMessage\"]) && interaction?.isMessageComponent()) {\n          if (interaction.deferred || interaction.replied) {\n            if (ctx.updating) await interaction.editReply(editBody(payload) as MessageEditOptions);\n            else await interaction.message.edit(editBody(payload) as MessageEditOptions);\n          } else {\n            await interaction.update(editBody(payload) as MessageEditOptions);\n          }\n          ctx.acknowledged = true;\n          return \"out\";\n        }\n        await this.respond(ctx, payload, truthy(node.config[\"ephemeral\"]));\n        return \"out\";\n      }\n\n      case \"edit-message\": {\n        const messageId = cfg(node, \"messageId\", ctx);\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !(\"messages\" in channel)) {\n          throw new Error(\"Edit Message needs a text channel.\");\n        }\n        const target = await channel.messages.fetch(messageId);\n        if (target.author.id !== ctx.client.user?.id) {\n          throw new Error(\"Discord only lets a bot edit its own messages.\");\n        }\n        const payload = buildPayload(node, ctx);\n        try {\n          await target.edit(editBody(payload) as MessageEditOptions);\n        } catch (error) {\n          // A classic message turned into a Components V2 layout must lose its\n          // text and embeds; retry once with them cleared.\n          if (!payload.flags || target.flags.has(IS_COMPONENTS_V2)) throw error;\n          await target.edit({ ...editBody(payload), content: \"\", embeds: [] } as MessageEditOptions);\n        }\n        return \"out\";\n      }\n\n      case \"delete-message\": {\n        const messageId = cfg(node, \"messageId\", ctx);\n        const delay = Math.min(Math.max(num(node.config[\"delay\"], 0), 0), MAX_DELAY_SECONDS);\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !(\"messages\" in channel)) {\n          throw new Error(\"Delete Message needs a text channel.\");\n        }\n        if (delay > 0) await sleep(delay * 1000);\n        const target = await channel.messages.fetch(messageId);\n        await target.delete();\n        return \"out\";\n      }\n\n      case \"send-dm\": {\n        const user = await resolveUser(cfg(node, \"user\", ctx), ctx);\n        if (user === null) throw new Error(\"Send DM could not resolve the target user.\");\n        try {\n          await user.send((await this.withImages(buildPayload(node, ctx), node, ctx)) as MessageCreateOptions);\n        } catch (error) {\n          // Closed DMs (50007) are a normal Discord outcome, not a flow failure;\n          // anything else (a bad message, missing access) is a real error.\n          if ((error as { code?: unknown }).code !== 50007) throw error;\n          this.emit({\n            event: \"flow.dm-blocked\",\n            level: \"warning\",\n            description: `${user.tag} does not accept direct messages from this bot.`,\n            at: nowIso(),\n          });\n        }\n        return \"out\";\n      }\n\n      /* --------------------------- moderation -------------------------- */\n      case \"ban-user\": {\n        const guild = this.requireGuild(ctx, \"Ban User\");\n        const user = await resolveUser(cfg(node, \"user\", ctx), ctx);\n        if (user === null) throw new Error(\"Ban User could not resolve the target user.\");\n        const seconds = deleteHistorySeconds(text(node.config[\"deleteHistory\"]));\n        const banReason = cfg(node, \"reason\", ctx);\n        await guild.members.ban(user.id, {\n          ...(banReason === \"\" ? {} : { reason: banReason }),\n          deleteMessageSeconds: seconds,\n        });\n        return \"out\";\n      }\n\n      case \"kick-user\": {\n        const member = await this.requireMember(node, ctx, \"Kick User\");\n        await member.kick(cfg(node, \"reason\", ctx) || undefined);\n        return \"out\";\n      }\n\n      case \"timeout-user\": {\n        const member = await this.requireMember(node, ctx, \"Timeout User\");\n        const reason = cfg(node, \"reason\", ctx) || undefined;\n        if (text(node.config[\"duration\"]) === \"remove\") {\n          await member.timeout(null, reason);\n          return \"out\";\n        }\n        const ms = durationToMs(text(node.config[\"duration\"]));\n        if (ms === null) throw new Error(\"Timeout User has an unsupported duration.\");\n        if (member.permissions.has(PermissionFlagsBits.Administrator)) {\n          throw new Error(\"Discord does not allow timing out an administrator.\");\n        }\n        // Discord's maximum is 28 days.\n        await member.timeout(Math.min(ms, 28 * 86_400_000), reason);\n        return \"out\";\n      }\n\n      case \"warn-user\": {\n        const user = await resolveUser(cfg(node, \"user\", ctx), ctx);\n        const reason = cfg(node, \"reason\", ctx);\n        if (user !== null && truthy(node.config[\"notify\"])) {\n          try {\n            await user.send(\n              `You have been warned in **${ctx.guild?.name ?? \"this server\"}**${reason ? `: ${reason}` : \".\"}`,\n            );\n          } catch {\n            /* closed DMs */\n          }\n        }\n        this.emit({\n          event: \"flow.warn\",\n          level: \"warning\",\n          description: `Warned ${user?.tag ?? \"unknown user\"}${reason ? `: ${reason}` : \"\"}`,\n          at: nowIso(),\n        });\n        return \"out\";\n      }\n\n      case \"delete-messages\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !(\"bulkDelete\" in channel)) {\n          throw new Error(\"Delete Messages needs a guild text channel.\");\n        }\n        const amount = Math.min(Math.max(Math.trunc(num(node.config[\"amount\"], 10)), 1), 100);\n        await channel.bulkDelete(amount, true);\n        return \"out\";\n      }\n\n      case \"add-role\":\n      case \"remove-role\": {\n        const member = await this.requireMember(node, ctx, \"Role change\");\n        const role = await resolveRole(cfg(node, \"role\", ctx), ctx);\n        if (role === null) throw new Error(`Role \"${cfg(node, \"role\", ctx)}\" was not found.`);\n        const reason = cfg(node, \"reason\", ctx) || undefined;\n        if (role.managed) throw new Error(`\"${role.name}\" belongs to an integration and cannot be given or removed.`);\n        if (node.type === \"add-role\") await member.roles.add(role, reason);\n        else await member.roles.remove(role, reason);\n        return \"out\";\n      }\n\n      case \"move-member\": {\n        const member = await this.requireMember(node, ctx, \"Move Member\");\n        const channelId = await resolveVoiceChannelId(cfg(node, \"channel\", ctx), ctx);\n        if (channelId === null) throw new Error(\"Move Member could not find that voice channel.\");\n        await member.voice.setChannel(channelId);\n        return \"out\";\n      }\n\n      /* ----------------------------- logic ----------------------------- */\n      case \"if-else\":\n        return (await this.evaluateIf(node, ctx)) ? \"true\" : \"false\";\n\n      case \"check-permission\": {\n        const member = await resolveMember(cfg(node, \"user\", ctx), ctx);\n        const name = text(node.config[\"permission\"]) as keyof typeof PermissionFlagsBits;\n        const bit = PermissionFlagsBits[name];\n        if (member === null || bit === undefined) return \"false\";\n        return member.permissions.has(bit) ? \"true\" : \"false\";\n      }\n\n      case \"check-role\": {\n        const member = await resolveMember(cfg(node, \"user\", ctx), ctx);\n        const role = await resolveRole(cfg(node, \"role\", ctx), ctx);\n        if (member === null || role === null) return \"false\";\n        return member.roles.cache.has(role.id) ? \"true\" : \"false\";\n      }\n\n      case \"check-channel\": {\n        const wanted = cfg(node, \"channel\", ctx);\n        const id = extractId(wanted);\n        if (ctx.channel === null) return \"false\";\n        if (id !== null) return ctx.channel.id === id ? \"true\" : \"false\";\n        const name = wanted.replace(/^#/, \"\").toLowerCase();\n        const actual = \"name\" in ctx.channel ? String(ctx.channel.name ?? \"\").toLowerCase() : \"\";\n        return actual === name ? \"true\" : \"false\";\n      }\n\n      case \"compare\": {\n        const left = Number(cfg(node, \"left\", ctx));\n        const right = Number(cfg(node, \"right\", ctx));\n        if (!Number.isFinite(left) || !Number.isFinite(right)) return \"false\";\n        switch (text(node.config[\"operator\"])) {\n          case \"gte\":\n            return left >= right ? \"true\" : \"false\";\n          case \"lt\":\n            return left < right ? \"true\" : \"false\";\n          case \"lte\":\n            return left <= right ? \"true\" : \"false\";\n          case \"gt\":\n          default:\n            return left > right ? \"true\" : \"false\";\n        }\n      }\n\n      case \"contains\":\n        return cfg(node, \"text\", ctx)\n          .toLowerCase()\n          .includes(cfg(node, \"value\", ctx).toLowerCase())\n          ? \"true\"\n          : \"false\";\n\n      case \"equals\":\n        return cfg(node, \"left\", ctx) === cfg(node, \"right\", ctx) ? \"true\" : \"false\";\n\n      case \"random\":\n        return Math.random() * 100 < num(node.config[\"chance\"], 50) ? \"a\" : \"b\";\n\n      case \"delay\": {\n        const seconds = Math.min(Math.max(num(node.config[\"seconds\"], 0), 0), MAX_DELAY_SECONDS);\n        if (seconds > 0) await sleep(seconds * 1000);\n        return \"out\";\n      }\n\n      case \"cooldown\": {\n        const seconds = Math.max(num(node.config[\"seconds\"], 0), 0);\n        const scope = text(node.config[\"scope\"]) || \"user\";\n        const subject =\n          scope === \"channel\" ? ctx.channel?.id : scope === \"server\" ? ctx.guild?.id : ctx.user?.id;\n        const key = `${node.id}:${scope}:${subject ?? \"global\"}`;\n        const now = Date.now();\n        const until = this.cooldowns.get(key) ?? 0;\n        if (until > now) return \"blocked\";\n        this.cooldowns.set(key, now + seconds * 1000);\n        return \"out\";\n      }\n\n      case \"rate-counter\": {\n        const windowMs = Math.min(Math.max(num(node.config[\"windowSeconds\"], 10), 1), 86_400) * 1000;\n        const threshold = Math.max(Math.trunc(num(node.config[\"threshold\"], 5)), 1);\n        const key = `${ctx.client.user?.id ?? \"\"}:${cfg(node, \"key\", ctx) || node.id}`;\n        const count = countRateHit(key, windowMs);\n        ctx.vars.set(\"rate.count\", String(count));\n        return count > threshold ? \"over\" : \"under\";\n      }\n\n      /* -------------------------- discord data -------------------------- */\n      case \"get-user\": {\n        const user = await resolveUser(cfg(node, \"user\", ctx), ctx);\n        if (user === null) throw new Error(\"Get User could not resolve that user.\");\n        const key = cfg(node, \"storeAs\", ctx) || \"targetUser\";\n        ctx.vars.set(key, `<@${user.id}>`);\n        ctx.vars.set(`${key}.id`, user.id);\n        ctx.vars.set(`${key}.username`, user.username);\n        ctx.vars.set(`${key}.tag`, user.tag);\n        ctx.vars.set(`${key}.avatar`, user.displayAvatarURL());\n        return \"out\";\n      }\n\n      case \"get-member\": {\n        const member = await resolveMember(cfg(node, \"user\", ctx), ctx);\n        if (member === null) throw new Error(\"Get Member could not resolve that member.\");\n        const key = cfg(node, \"storeAs\", ctx) || \"member\";\n        ctx.vars.set(key, `<@${member.id}>`);\n        ctx.vars.set(`${key}.id`, member.id);\n        ctx.vars.set(`${key}.displayName`, member.displayName);\n        ctx.vars.set(`${key}.joinedAt`, member.joinedAt?.toISOString() ?? \"\");\n        ctx.vars.set(`${key}.roles`, member.roles.cache.map((role) => role.name).join(\", \"));\n        return \"out\";\n      }\n\n      case \"get-server\": {\n        const guild = this.requireGuild(ctx, \"Get Server\");\n        const key = cfg(node, \"storeAs\", ctx) || \"server\";\n        ctx.vars.set(key, guild.name);\n        ctx.vars.set(`${key}.id`, guild.id);\n        ctx.vars.set(`${key}.name`, guild.name);\n        ctx.vars.set(`${key}.memberCount`, String(guild.memberCount));\n        return \"out\";\n      }\n\n      case \"get-channel\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null) throw new Error(\"Get Channel could not resolve that channel.\");\n        const key = cfg(node, \"storeAs\", ctx) || \"channel\";\n        ctx.vars.set(key, `<#${channel.id}>`);\n        ctx.vars.set(`${key}.id`, channel.id);\n        ctx.vars.set(`${key}.name`, \"name\" in channel ? String(channel.name ?? \"\") : \"\");\n        return \"out\";\n      }\n\n      case \"get-role\": {\n        const role = await resolveRole(cfg(node, \"role\", ctx), ctx);\n        if (role === null) throw new Error(\"Get Role could not resolve that role.\");\n        const key = cfg(node, \"storeAs\", ctx) || \"role\";\n        ctx.vars.set(key, `<@&${role.id}>`);\n        ctx.vars.set(`${key}.id`, role.id);\n        ctx.vars.set(`${key}.name`, role.name);\n        return \"out\";\n      }\n\n      /* ---------------------------- variables --------------------------- */\n      case \"set-variable\":\n        ctx.vars.set(cfg(node, \"name\", ctx), cfg(node, \"value\", ctx));\n        return \"out\";\n\n      case \"run-code\": {\n        const prefix = cfg(node, \"storeAs\", ctx) || \"code\";\n        const options: Record<string, unknown> = {};\n        const raw = ctx.interaction as unknown as { options?: { data?: { name: string; value?: unknown }[] } } | null;\n        for (const option of raw?.options?.data ?? []) options[option.name] = option.value ?? null;\n        // Custom plugin blocks pass their fields as \"in.<key>\" config, with variables filled in.\n        const inputs: Record<string, string> = {};\n        for (const key of Object.keys(node.config)) if (key.startsWith(\"in.\")) inputs[key.slice(3)] = cfg(node, key, ctx);\n        try {\n          const out = await runSandboxed(text(node.config[\"source\"]), text(node.config[\"fn\"]), {\n            user: ctx.user ? { id: ctx.user.id, username: ctx.user.username } : null,\n            guild: ctx.guild ? { id: ctx.guild.id, name: ctx.guild.name } : null,\n            options,\n            inputs,\n            vars: Object.fromEntries(ctx.vars),\n          }, async (op, args) => {\n            if (op === \"fetch\") return safeFetch(args);\n            if (!this.botId || !this.userId) throw new Error(\"Storage is not available for this bot.\");\n            const body = (args ?? {}) as Record<string, unknown>;\n            const res = await storageRequest(this.botId, this.userId, { op: body[\"op\"], table: body[\"table\"], ...(body[\"where\"] ? { where: body[\"where\"] } : {}), ...(body[\"data\"] ? { data: body[\"data\"] } : {}) });\n            if (!res.ok) throw new Error(res.error ?? \"Storage request failed.\");\n            return res;\n          });\n          for (const [key, value] of Object.entries(out)) ctx.vars.set(`${prefix}.${key}`, value);\n          return \"out\";\n        } catch (error) {\n          ctx.vars.set(`${prefix}.error`, error instanceof Error ? error.message.slice(0, 300) : \"Code failed.\");\n          return \"error\";\n        }\n      }\n\n      case \"get-variable\":\n        ctx.vars.set(\"value\", ctx.vars.get(cfg(node, \"name\", ctx)) ?? \"\");\n        return \"out\";\n\n      case \"increment\":\n      case \"decrement\": {\n        const name = cfg(node, \"name\", ctx);\n        const step = num(node.config[\"amount\"], 1) * (node.type === \"increment\" ? 1 : -1);\n        const current = Number(ctx.vars.get(name) ?? 0);\n        ctx.vars.set(name, String((Number.isFinite(current) ? current : 0) + step));\n        return \"out\";\n      }\n\n      case \"format-text\":\n        ctx.vars.set(cfg(node, \"storeAs\", ctx) || \"text\", cfg(node, \"template\", ctx));\n        return \"out\";\n\n      case \"global-set\":\n        GLOBALS.set(cfg(node, \"name\", ctx), cfg(node, \"value\", ctx));\n        return \"out\";\n\n      case \"global-get\":\n        ctx.vars.set(\n          cfg(node, \"storeAs\", ctx) || \"shared\",\n          GLOBALS.get(cfg(node, \"name\", ctx)) ?? \"\",\n        );\n        return \"out\";\n\n      /* ------------------------ extra message actions ------------------- */\n      case \"add-reaction\": {\n        const target = await this.resolveTargetMessage(node, ctx, \"Add Reaction\");\n        await target.react(cfg(node, \"emoji\", ctx));\n        return \"out\";\n      }\n\n      case \"remove-reactions\": {\n        const target = await this.resolveTargetMessage(node, ctx, \"Remove Reactions\");\n        const emoji = cfg(node, \"emoji\", ctx);\n        if (emoji === \"\") await target.reactions.removeAll();\n        else {\n          const reaction = target.reactions.cache.find((r) =>\n            matchesEmoji(emoji, r.emoji.name ?? \"\", r.emoji.id),\n          );\n          if (reaction !== undefined) await reaction.remove();\n        }\n        return \"out\";\n      }\n\n      case \"pin-message\": {\n        const target = await this.resolveTargetMessage(node, ctx, \"Pin Message\");\n        await target.pin();\n        return \"out\";\n      }\n\n      case \"unpin-message\": {\n        const target = await this.resolveTargetMessage(node, ctx, \"Unpin Message\");\n        await target.unpin();\n        return \"out\";\n      }\n\n      case \"publish-message\": {\n        const target = await this.resolveTargetMessage(node, ctx, \"Publish Announcement\");\n        if (target.crosspostable) await target.crosspost();\n        return \"out\";\n      }\n\n      case \"get-message\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !(\"messages\" in channel)) {\n          throw new Error(\"Get Message needs a text channel.\");\n        }\n        const target = await channel.messages.fetch(cfg(node, \"messageId\", ctx));\n        const key = cfg(node, \"storeAs\", ctx) || \"fetched\";\n        ctx.vars.set(key, target.content);\n        ctx.vars.set(`${key}.id`, target.id);\n        ctx.vars.set(`${key}.author`, target.author.tag);\n        ctx.vars.set(`${key}.authorId`, target.author.id);\n        ctx.vars.set(`${key}.url`, target.url);\n        return \"out\";\n      }\n\n      case \"send-file\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !(\"send\" in channel)) throw new Error(\"Send File needs a channel.\");\n        const url = cfg(node, \"url\", ctx);\n        if (url === \"\") throw new Error(\"Send File needs a file URL.\");\n        const content = cfg(node, \"content\", ctx);\n        // Downloaded here with the same public-https rules as HTTP Request, so\n        // discord.js never fetches an arbitrary URL from the bot host.\n        const file = await safeDownload(url, MAX_FILE_BYTES);\n        await channel.send({\n          ...(content === \"\" ? {} : { content: content.slice(0, 2000) }),\n          files: [new AttachmentBuilder(file.data, { name: file.name })],\n          allowedMentions: mentionsFor(node),\n        } as MessageCreateOptions);\n        return \"out\";\n      }\n\n      case \"file-from-text\": {\n        const name = textFileName(cfg(node, \"fileName\", ctx));\n        if (name === null) {\n          throw new Error(\"Send Text as File: the file name must end in .txt, .json, .csv or .md.\");\n        }\n        const data = Buffer.from(interpolate(text(node.config[\"fileContent\"]), ctx), \"utf8\");\n        if (data.length > TEXT_FILE_MAX_BYTES) throw new Error(\"Send Text as File: the file is over 1 MB.\");\n        await this.sendFile(node, ctx, data, name, \"Send Text as File\");\n        return \"out\";\n      }\n\n      case \"webhook-send\": {\n        const guild = this.requireGuild(ctx, \"Send as Webhook\");\n        const raw = cfg(node, \"channel\", ctx);\n        const target = raw === \"\" ? currentGuildChannel(guild, ctx) : findGuildChannel(guild, raw);\n        if (target === null) throw new Error(\"Send as Webhook could not find that channel.\");\n        const thread = target.isThread() ? target : null;\n        const host = thread !== null ? thread.parent : target;\n        if (host === null || !(\"fetchWebhooks\" in host)) {\n          throw new Error(\"Send as Webhook needs a text, voice or forum channel (or a thread in one).\");\n        }\n        const avatar = cfg(node, \"avatarUrl\", ctx);\n        if (avatar !== \"\" && !/^https:\\/\\/\\S+$/i.test(avatar)) {\n          throw new Error(\"Send as Webhook: the avatar URL must start with https://.\");\n        }\n        const payload = await this.withImages(buildPayload(node, ctx), node, ctx);\n        const username = cfg(node, \"username\", ctx).slice(0, 80);\n        const body = {\n          ...payload,\n          ...(username === \"\" ? {} : { username }),\n          ...(avatar === \"\" ? {} : { avatarURL: avatar }),\n          ...(thread !== null ? { threadId: thread.id } : {}),\n          ...(payload.flags ? { withComponents: true } : {}),\n        } as WebhookMessageCreateOptions;\n        let sent: Message;\n        try {\n          sent = await (await this.channelWebhook(host, ctx)).send(body);\n        } catch (error) {\n          // Someone deleted the webhook: make a new one once.\n          if ((error as { code?: number }).code !== 10015) throw error;\n          this.webhooks.delete(host.id);\n          sent = await (await this.channelWebhook(host, ctx)).send(body);\n        }\n        ctx.vars.set(\"webhook.messageId\", sent.id);\n        ctx.vars.set(\"lastMessage.id\", sent.id);\n        ctx.sentToChannel = true;\n        return \"out\";\n      }\n\n      case \"fetch-channel-messages\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !(\"messages\" in channel)) {\n          throw new Error(\"Read Recent Messages needs a text channel.\");\n        }\n        const limit = Math.min(Math.max(Math.trunc(num(node.config[\"limit\"], 20)), 1), 50);\n        const userRaw = cfg(node, \"user\", ctx);\n        // A member that cannot be found matches nobody (never \"everyone\").\n        const onlyFrom =\n          userRaw === \"\" ? null : ((await resolveUser(userRaw, ctx))?.id ?? extractId(userRaw) ?? \"-\");\n        const includeBots = truthy(node.config[\"includeBots\"]);\n        const fetched = await channel.messages.fetch({ limit: onlyFrom === null && includeBots ? limit : 100 });\n        const list = [...fetched.values()]\n          .filter((m) => (includeBots || !m.author.bot) && (onlyFrom === null || m.author.id === onlyFrom))\n          .sort((a, b) => a.createdTimestamp - b.createdTimestamp)\n          .slice(-limit);\n        const lines = list.map((m) => {\n          const name = m.member?.displayName ?? m.author.globalName ?? m.author.username;\n          const body =\n            m.content.trim() !== \"\"\n              ? m.content.replace(/\\s*\\r?\\n\\s*/g, \" \")\n              : m.attachments.size > 0\n                ? \"[attachment]\"\n                : m.embeds.length > 0\n                  ? \"[embed]\"\n                  : \"[no text]\";\n          return `${name}: ${body}`;\n        });\n        ctx.vars.set(\"history.text\", historyText(lines));\n        ctx.vars.set(\"history.count\", String(list.length));\n        const last = list[list.length - 1];\n        ctx.vars.set(\"history.lastAuthorId\", last?.author.id ?? \"\");\n        ctx.vars.set(\"history.lastAt\", last ? String(Math.floor(last.createdTimestamp / 1000)) : \"\");\n        return \"out\";\n      }\n\n      case \"create-poll\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !(\"send\" in channel)) throw new Error(\"Create Poll needs a text channel.\");\n        const answers = cfg(node, \"answers\", ctx)\n          .split(/\\r?\\n/)\n          .map((a) => a.trim())\n          .filter(Boolean)\n          .slice(0, 10)\n          .map((a) => ({ text: a.slice(0, 55) }));\n        if (answers.length === 0) throw new Error(\"Create Poll needs at least one answer.\");\n        const hours = Math.min(Math.max(Math.trunc(num(node.config[\"hours\"], 24)), 1), 768);\n        const sent = await channel.send({\n          poll: {\n            question: { text: cfg(node, \"question\", ctx).slice(0, 300) || \"Poll\" },\n            answers,\n            duration: hours,\n            allowMultiselect: truthy(node.config[\"multiselect\"]),\n          },\n        } as MessageCreateOptions);\n        const key = cfg(node, \"storeAs\", ctx) || \"poll\";\n        ctx.vars.set(key, sent.url);\n        ctx.vars.set(`${key}.id`, sent.id);\n        ctx.vars.set(\"lastMessage.id\", sent.id);\n        return \"out\";\n      }\n\n      case \"start-typing\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel !== null && \"sendTyping\" in channel) await channel.sendTyping();\n        return \"out\";\n      }\n\n      case \"defer-reply\": {\n        const interaction = ctx.interaction;\n        if (interaction === null) throw new Error(\"Defer Reply needs an interaction trigger.\");\n        if (!interaction.replied && !interaction.deferred) {\n          // \"Update the message\": a button or menu edits its own message later\n          // (the next Reply with Update on) instead of posting a new one.\n          if (text(node.config[\"mode\"]) === \"update\" && interaction.isMessageComponent()) {\n            await interaction.deferUpdate();\n            ctx.updating = true;\n          } else {\n            await interaction.deferReply(\n              truthy(node.config[\"ephemeral\"]) ? { flags: MessageFlags.Ephemeral } : {},\n            );\n          }\n        }\n        ctx.acknowledged = true;\n        return \"out\";\n      }\n\n      case \"show-modal\":\n      case \"component-modal\": {\n        const fields = parseModalFields(node.config);\n        // The older Modal block did nothing before: without fields it still does nothing.\n        if (node.type === \"component-modal\" && !fields.some((f) => f.kind !== \"text\")) return \"out\";\n        const interaction = ctx.interaction;\n        if (interaction === null) throw new Error(\"Show Modal needs an interaction trigger.\");\n        if (interaction.replied || interaction.deferred) {\n          throw new Error(\"Show Modal must run before the interaction is answered or deferred.\");\n        }\n        const problems = modalFieldIssues(fields);\n        if (problems.length > 0) throw new Error(`Show Modal: ${problems[0]}`);\n        if (!(\"showModal\" in interaction)) {\n          throw new Error(\"Show Modal cannot run on a modal submit interaction.\");\n        }\n        const payload = modalPayload(\n          cfg(node, \"customId\", ctx) || \"modal\",\n          cfg(node, \"title\", ctx),\n          fields,\n          (value) => interpolate(value, ctx),\n        );\n        // Raw API payload: Label fields (dropdowns, pickers, uploads) as Discord takes them.\n        const continues = (ctx.flow.nodes[node.id]?.next[\"submitted\"] ?? []).length > 0;\n        const key = `${interaction.user.id}:${payload.custom_id}`;\n        // Register before showing, so a fast submit is never missed.\n        const submitted = continues\n          ? new Promise<ModalSubmitInteraction | null>((resolve) => {\n              const timer = setTimeout(() => {\n                if (this.waitingModals.get(key) === done) this.waitingModals.delete(key);\n                resolve(null);\n              }, MODAL_WAIT_MS);\n              timer.unref?.();\n              const done = (modal: ModalSubmitInteraction) => {\n                clearTimeout(timer);\n                resolve(modal);\n              };\n              this.waitingModals.set(key, done);\n            })\n          : null;\n        try {\n          await interaction.showModal({ toJSON: () => payload } as never);\n        } catch (error) {\n          if (continues) this.waitingModals.delete(key);\n          throw error;\n        }\n        ctx.acknowledged = true;\n        ctx.modalShown = true;\n        if (!submitted) return \"out\";\n        // Blocks on \"Shown\" run now; \"Submitted\" waits for the form.\n        await this.walk(ctx.flow, node.id, \"out\", ctx);\n        const modal = await submitted;\n        if (!modal) return null; // closed or never sent within 15 minutes\n        ctx.interaction = modal;\n        ctx.acknowledged = false;\n        ctx.modalShown = false;\n        ctx.updating = false;\n        delete ctx.sentToChannel;\n        delete ctx.failure;\n        for (const [id, answer] of modalAnswers(modal)) {\n          ctx.vars.set(`field.${id}`, answer.text);\n          ctx.vars.set(id, answer.text);\n          if (answer.values) {\n            ctx.vars.set(`${id}.values`, answer.values.join(\", \"));\n            ctx.vars.set(`${id}.count`, String(answer.values.length));\n          }\n        }\n        // The submit must be answered within 3 seconds too.\n        setTimeout(() => void this.autoDefer(ctx), AUTO_DEFER_AFTER_MS).unref?.();\n        return \"submitted\";\n      }\n\n      /* ------------------------- server management ---------------------- */\n      case \"create-channel\": {\n        const guild = this.requireGuild(ctx, \"Create Channel\");\n        const parentRaw = cfg(node, \"parent\", ctx);\n        const parent =\n          parentRaw === \"\"\n            ? null\n            : (guild.channels.cache.find(\n                (channel) =>\n                  channel.id === extractId(parentRaw) ||\n                  channel.name.toLowerCase() === parentRaw.toLowerCase(),\n              ) ?? null);\n        const topic = cfg(node, \"topic\", ctx);\n        const created = await guild.channels.create({\n          name: cfg(node, \"name\", ctx),\n          type: channelTypeFor(text(node.config[\"channelType\"])),\n          ...(parent === null ? {} : { parent: parent.id }),\n          ...(topic === \"\" ? {} : { topic }),\n        });\n        const key = cfg(node, \"storeAs\", ctx) || \"created\";\n        ctx.vars.set(key, `<#${created.id}>`);\n        ctx.vars.set(`${key}.id`, created.id);\n        ctx.vars.set(`${key}.name`, created.name);\n        return \"out\";\n      }\n\n      case \"delete-channel\": {\n        const guild = this.requireGuild(ctx, \"Delete Channel\");\n        const target = findGuildChannel(guild, cfg(node, \"channel\", ctx));\n        if (target === null) throw new Error(\"Delete Channel could not find that channel.\");\n        await target.delete(cfg(node, \"reason\", ctx) || undefined);\n        return \"out\";\n      }\n\n      case \"rename-channel\": {\n        const guild = this.requireGuild(ctx, \"Rename Channel\");\n        const raw = cfg(node, \"channel\", ctx);\n        const target = raw === \"\" ? currentGuildChannel(guild, ctx) : findGuildChannel(guild, raw);\n        if (target === null) throw new Error(\"Rename Channel could not find that channel.\");\n        await target.setName(cfg(node, \"name\", ctx));\n        return \"out\";\n      }\n\n      case \"set-channel-topic\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !(\"setTopic\" in channel)) {\n          throw new Error(\"Set Channel Topic needs a text channel.\");\n        }\n        await channel.setTopic(cfg(node, \"topic\", ctx));\n        return \"out\";\n      }\n\n      case \"set-slowmode\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !(\"setRateLimitPerUser\" in channel)) {\n          throw new Error(\"Set Slowmode needs a text channel.\");\n        }\n        const seconds = Math.min(Math.max(Math.trunc(num(node.config[\"seconds\"], 0)), 0), 21600);\n        await channel.setRateLimitPerUser(seconds);\n        return \"out\";\n      }\n\n      case \"set-channel-permission\": {\n        const guild = this.requireGuild(ctx, \"Set Channel Permission\");\n        const raw = cfg(node, \"channel\", ctx);\n        const target = raw === \"\" ? currentGuildChannel(guild, ctx) : findGuildChannel(guild, raw);\n        if (target === null || !(\"permissionOverwrites\" in target)) {\n          throw new Error(\"Set Channel Permission could not find that channel.\");\n        }\n        const subjectRaw = cfg(node, \"target\", ctx);\n        const role = await resolveRole(subjectRaw, ctx);\n        const member = role === null ? await resolveMember(subjectRaw, ctx) : null;\n        const subjectId = role?.id ?? member?.id;\n        if (subjectId === undefined) {\n          throw new Error(\"Set Channel Permission could not resolve that role or member.\");\n        }\n        const permission = text(node.config[\"permission\"]) as keyof typeof PermissionFlagsBits;\n        if (PermissionFlagsBits[permission] === undefined) {\n          throw new Error(`\"${permission}\" is not a Discord permission name.`);\n        }\n        const mode = text(node.config[\"mode\"]) || \"deny\";\n        await target.permissionOverwrites.edit(\n          subjectId,\n          { [permission]: mode === \"allow\" ? true : mode === \"reset\" ? null : false },\n          { type: role !== null ? OverwriteType.Role : OverwriteType.Member },\n        );\n        return \"out\";\n      }\n\n      case \"create-private-channel\": {\n        const guild = this.requireGuild(ctx, \"Create Private Channel\");\n        const key = cfg(node, \"storeAs\", ctx) || \"privateChannel\";\n        try {\n          const parentRaw = cfg(node, \"parent\", ctx);\n          const parent = parentRaw === \"\" ? null : findCategory(guild, parentRaw);\n          if (parentRaw !== \"\" && parent === null) throw new Error(`the category \"${parentRaw}\" was not found.`);\n          const voice = text(node.config[\"channelType\"]) === \"voice\";\n          const P = PermissionFlagsBits;\n          const access = voice\n            ? [P.ViewChannel, P.Connect, P.Speak, P.SendMessages, P.ReadMessageHistory]\n            : [P.ViewChannel, P.SendMessages, P.ReadMessageHistory, P.AttachFiles, P.EmbedLinks];\n          const overwrites: OverwriteResolvable[] = [\n            { id: guild.roles.everyone.id, deny: [P.ViewChannel], type: OverwriteType.Role },\n          ];\n          const botId = ctx.client.user?.id;\n          if (botId !== undefined) {\n            overwrites.push({\n              id: botId,\n              allow: [P.ViewChannel, P.SendMessages, P.ReadMessageHistory, P.AttachFiles, P.EmbedLinks],\n              type: OverwriteType.Member,\n            });\n          }\n          const seen = new Set<string>(botId === undefined ? [] : [botId]);\n          for (const entry of splitTargets(cfg(node, \"members\", ctx))) {\n            const member = await resolveMember(entry, ctx);\n            if (member === null || seen.has(member.id)) continue;\n            seen.add(member.id);\n            overwrites.push({ id: member.id, allow: access, type: OverwriteType.Member });\n          }\n          for (const entry of splitTargets(cfg(node, \"roles\", ctx))) {\n            const role = await resolveRole(entry, ctx);\n            if (role === null || role.id === guild.id || seen.has(role.id)) continue;\n            seen.add(role.id);\n            overwrites.push({ id: role.id, allow: access, type: OverwriteType.Role });\n          }\n          const topic = cfg(node, \"topic\", ctx).slice(0, 1024);\n          const created = await guild.channels.create({\n            name: cfg(node, \"name\", ctx).slice(0, 100) || \"private\",\n            type: voice ? ChannelType.GuildVoice : ChannelType.GuildText,\n            ...(parent === null ? {} : { parent: parent.id }),\n            ...(topic === \"\" || voice ? {} : { topic }),\n            permissionOverwrites: overwrites,\n          });\n          ctx.vars.set(key, `<#${created.id}>`);\n          ctx.vars.set(`${key}.id`, created.id);\n          ctx.vars.set(`${key}.name`, created.name);\n          return \"out\";\n        } catch (error) {\n          ctx.vars.set(`${key}.error`, describeError(error, 200));\n          return \"failed\";\n        }\n      }\n\n      case \"lockdown-channels\": {\n        const guild = this.requireGuild(ctx, \"Lock/Unlock Channels\");\n        const lock = text(node.config[\"mode\"]) !== \"unlock\";\n        const raw = cfg(node, \"channels\", ctx);\n        const targets =\n          raw === \"\"\n            ? [...guild.channels.cache.values()].filter(\n                (c) => c.type === ChannelType.GuildText || c.type === ChannelType.GuildAnnouncement,\n              )\n            : splitTargets(raw)\n                .map((entry) => findGuildChannel(guild, entry))\n                .filter((c): c is GuildBasedChannel => c !== null);\n        if (targets.length === 0) throw new Error(\"Lock/Unlock Channels found no channels to change.\");\n        const reasonText = cfg(node, \"reason\", ctx);\n        const reason = reasonText === \"\" ? {} : { reason: reasonText };\n        const botId = ctx.client.user?.id;\n        let count = 0;\n        let lastError: unknown = null;\n        for (const channel of targets.slice(0, 200)) {\n          if (!(\"permissionOverwrites\" in channel)) continue; // threads follow their channel\n          try {\n            await channel.permissionOverwrites.edit(\n              guild.roles.everyone,\n              { SendMessages: lock ? false : null, SendMessagesInThreads: lock ? false : null },\n              reason,\n            );\n            // The @everyone deny would silence the bot too.\n            if (lock && botId !== undefined) {\n              await channel.permissionOverwrites.edit(\n                botId,\n                { SendMessages: true },\n                { ...reason, type: OverwriteType.Member },\n              );\n            }\n            count += 1;\n          } catch (error) {\n            lastError = error;\n          }\n        }\n        ctx.vars.set(\"lockdown.count\", String(count));\n        if (count === 0 && lastError !== null) throw lastError;\n        return \"out\";\n      }\n\n      case \"apply-server-template\": {\n        const guild = this.requireGuild(ctx, \"Apply Server Template\");\n        const { template, error } = parseServerTemplate(cfg(node, \"structure\", ctx));\n        let created = 0;\n        let skipped = 0;\n        let failed = 0;\n        let firstError = error ?? \"\";\n        const done = () => {\n          ctx.vars.set(\"template.created\", String(created));\n          ctx.vars.set(\"template.skipped\", String(skipped));\n          ctx.vars.set(\"template.failed\", String(failed));\n          ctx.vars.set(\"template.error\", firstError);\n          return failed > 0 || template === null ? \"failed\" : \"out\";\n        };\n        if (template === null) return done();\n        const attempt = async <T>(label: string, run: () => Promise<T>): Promise<T | null> => {\n          try {\n            const result = await run();\n            created += 1;\n            await sleep(350); // stay well inside Discord's create rate limits\n            return result;\n          } catch (err) {\n            failed += 1;\n            if (firstError === \"\") firstError = `${label}: ${describeError(err, 200)}`;\n            return null;\n          }\n        };\n        const same = (a: string, b: string) => a.trim().toLowerCase() === b.trim().toLowerCase();\n        const slug = (name: string) => name.trim().toLowerCase().replace(/\\s+/g, \"-\");\n        for (const role of template.roles) {\n          if (guild.roles.cache.some((r) => same(r.name, role.name))) {\n            skipped += 1;\n            continue;\n          }\n          await attempt(`role \"${role.name}\"`, () =>\n            guild.roles.create({\n              name: role.name,\n              hoist: role.hoist,\n              mentionable: role.mentionable,\n              ...(role.color === \"\" ? {} : { colors: { primaryColor: role.color as `#${string}` } }),\n              reason: \"Apply Server Template\",\n            }),\n          );\n        }\n        const botId = ctx.client.user?.id;\n        const P = PermissionFlagsBits;\n        const overwritesFor = (\n          entry: { private: boolean; allowRoles: string[] },\n          voice: boolean,\n        ): OverwriteResolvable[] | undefined => {\n          if (!entry.private) return undefined;\n          const see = voice ? [P.ViewChannel, P.Connect] : [P.ViewChannel];\n          const list: OverwriteResolvable[] = [\n            { id: guild.roles.everyone.id, deny: [P.ViewChannel], type: OverwriteType.Role },\n          ];\n          if (botId !== undefined) list.push({ id: botId, allow: see, type: OverwriteType.Member });\n          for (const name of entry.allowRoles) {\n            const id = extractId(name);\n            const role = guild.roles.cache.find((r) => r.id === id || same(r.name, name.replace(/^@/, \"\")));\n            if (role !== undefined && role.id !== guild.id) {\n              list.push({ id: role.id, allow: see, type: OverwriteType.Role });\n            }\n          }\n          return list;\n        };\n        const makeChannel = async (channel: ServerTemplateChannel, parentId: string | null): Promise<void> => {\n          const exists = guild.channels.cache.some(\n            (c) =>\n              !c.isThread() &&\n              c.type !== ChannelType.GuildCategory &&\n              (c.parentId ?? null) === parentId &&\n              (same(c.name, channel.name) || same(c.name, slug(channel.name))),\n          );\n          if (exists) {\n            skipped += 1;\n            return;\n          }\n          const voice = channel.type === \"voice\" || channel.type === \"stage\";\n          const overwrites = overwritesFor(channel, voice);\n          await attempt(`channel \"${channel.name}\"`, () =>\n            guild.channels.create({\n              name: channel.name,\n              type: channelTypeFor(channel.type),\n              ...(parentId === null ? {} : { parent: parentId }),\n              ...(channel.topic === \"\" || voice ? {} : { topic: channel.topic }),\n              ...(overwrites === undefined ? {} : { permissionOverwrites: overwrites }),\n              reason: \"Apply Server Template\",\n            }),\n          );\n        };\n        for (const category of template.categories) {\n          let parentId =\n            guild.channels.cache.find((c) => c.type === ChannelType.GuildCategory && same(c.name, category.name))\n              ?.id ?? null;\n          if (parentId !== null) skipped += 1;\n          else {\n            const overwrites = overwritesFor(category, false);\n            const made = await attempt(`category \"${category.name}\"`, () =>\n              guild.channels.create({\n                name: category.name,\n                type: ChannelType.GuildCategory,\n                ...(overwrites === undefined ? {} : { permissionOverwrites: overwrites }),\n                reason: \"Apply Server Template\",\n              }),\n            );\n            if (made === null) {\n              failed += category.channels.length;\n              continue;\n            }\n            parentId = made.id;\n          }\n          for (const channel of category.channels) await makeChannel(channel, parentId);\n        }\n        for (const channel of template.channels) await makeChannel(channel, null);\n        return done();\n      }\n\n      case \"server-backup\": {\n        const guild = this.requireGuild(ctx, \"Back Up Server\");\n        const data = Buffer.from(JSON.stringify(serverBackup(guild), null, 2), \"utf8\");\n        const slug = guild.name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\") || \"server\";\n        const name = `backup-${slug.slice(0, 40)}-${new Date().toISOString().slice(0, 10)}.json`;\n        if (data.length > MAX_FILE_BYTES) throw new Error(\"Back Up Server: the backup is over 10 MB.\");\n        await this.sendFile(node, ctx, data, name, \"Back Up Server\");\n        ctx.vars.set(\"backup.size\", String(data.length));\n        return \"out\";\n      }\n\n      case \"create-thread\": {\n        const name = cfg(node, \"name\", ctx).slice(0, 100);\n        const messageId = cfg(node, \"messageId\", ctx);\n        const content = cfg(node, \"content\", ctx).slice(0, 2000);\n        const archive = Number(text(node.config[\"autoArchive\"]) || 1440);\n        const autoArchiveDuration = ([60, 1440, 4320, 10080].includes(archive) ? archive : 1440) as\n          | 60\n          | 1440\n          | 4320\n          | 10080;\n        const raw = cfg(node, \"channel\", ctx);\n        const guildChannel =\n          raw !== \"\" && ctx.guild ? findGuildChannel(ctx.guild, raw) : null;\n        let thread: { id: string };\n        if (\n          guildChannel !== null &&\n          (guildChannel.type === ChannelType.GuildForum || guildChannel.type === ChannelType.GuildMedia)\n        ) {\n          // Forum / media channel: a post with its first message.\n          thread = await (guildChannel as ForumChannel | MediaChannel).threads.create({\n            name,\n            autoArchiveDuration,\n            message: { content: content || name, allowedMentions: mentionsFor(node) },\n          });\n        } else {\n          const channel = await resolveChannel(raw, ctx);\n          if (channel === null || !(\"threads\" in channel)) {\n            throw new Error(\"Create Thread needs a text, announcement or forum channel.\");\n          }\n          const created =\n            messageId === \"\"\n              ? text(node.config[\"threadType\"]) === \"private\" && channel.type === ChannelType.GuildText\n                ? await channel.threads.create({\n                    name,\n                    autoArchiveDuration,\n                    type: ChannelType.PrivateThread,\n                    invitable: false,\n                  })\n                : await channel.threads.create({ name, autoArchiveDuration })\n              : await (await channel.messages.fetch(messageId)).startThread({ name, autoArchiveDuration });\n          if (content !== \"\") await created.send({ content, allowedMentions: mentionsFor(node) });\n          thread = created;\n        }\n        const key = cfg(node, \"storeAs\", ctx) || \"thread\";\n        ctx.vars.set(key, `<#${thread.id}>`);\n        ctx.vars.set(`${key}.id`, thread.id);\n        return \"out\";\n      }\n\n      case \"archive-thread\":\n      case \"lock-thread\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !channel.isThread()) {\n          throw new Error(\"This node needs a thread channel.\");\n        }\n        if (node.type === \"archive-thread\") await channel.setArchived(true);\n        else await channel.setLocked(truthy(node.config[\"locked\"]));\n        return \"out\";\n      }\n\n      case \"create-invite\": {\n        const guild = this.requireGuild(ctx, \"Create Invite\");\n        const raw = cfg(node, \"channel\", ctx);\n        const target = raw === \"\" ? currentGuildChannel(guild, ctx) : findGuildChannel(guild, raw);\n        if (target === null || !(\"createInvite\" in target)) {\n          throw new Error(\"Create Invite could not find an invitable channel.\");\n        }\n        const invite = await target.createInvite({\n          maxAge: Math.min(Math.max(Math.trunc(num(node.config[\"maxAge\"], 0)), 0), 604_800),\n          maxUses: Math.min(Math.max(Math.trunc(num(node.config[\"maxUses\"], 0)), 0), 100),\n        });\n        const key = cfg(node, \"storeAs\", ctx) || \"invite\";\n        ctx.vars.set(key, invite.url);\n        ctx.vars.set(`${key}.code`, invite.code);\n        return \"out\";\n      }\n\n      case \"create-role\": {\n        const guild = this.requireGuild(ctx, \"Create Role\");\n        const colour = cfg(node, \"color\", ctx);\n        const role = await guild.roles.create({\n          name: cfg(node, \"name\", ctx).slice(0, 100),\n          hoist: truthy(node.config[\"hoist\"]),\n          mentionable: truthy(node.config[\"mentionable\"]),\n          ...(colour === \"\" ? {} : { colors: { primaryColor: colour as `#${string}` } }),\n        });\n        const key = cfg(node, \"storeAs\", ctx) || \"role\";\n        ctx.vars.set(key, `<@&${role.id}>`);\n        ctx.vars.set(`${key}.id`, role.id);\n        ctx.vars.set(`${key}.name`, role.name);\n        return \"out\";\n      }\n\n      case \"edit-role\": {\n        const role = await resolveRole(cfg(node, \"role\", ctx), ctx);\n        if (role === null) throw new Error(\"Edit Role could not find that role.\");\n        const name = cfg(node, \"name\", ctx);\n        const colour = cfg(node, \"color\", ctx);\n        // \"\" / false (older flows' default) = leave as it is; only an explicit\n        // Yes / No changes it, so renaming a role never un-hoists it.\n        const hoist = triState(node.config[\"hoist\"]);\n        const mentionable = triState(node.config[\"mentionable\"]);\n        await role.edit({\n          ...(name === \"\" ? {} : { name: name.slice(0, 100) }),\n          ...(colour === \"\" ? {} : { colors: { primaryColor: colour as `#${string}` } }),\n          ...(hoist === null ? {} : { hoist }),\n          ...(mentionable === null ? {} : { mentionable }),\n        });\n        return \"out\";\n      }\n\n      case \"delete-role\": {\n        const role = await resolveRole(cfg(node, \"role\", ctx), ctx);\n        if (role === null) throw new Error(\"Delete Role could not find that role.\");\n        await role.delete();\n        return \"out\";\n      }\n\n      case \"set-nickname\": {\n        const member = await this.requireMember(node, ctx, \"Set Nickname\");\n        const nickname = cfg(node, \"nickname\", ctx);\n        const nick = nickname === \"\" ? null : nickname.slice(0, 32);\n        if (member.id === member.guild.ownerId) {\n          throw new Error(\"Discord does not let bots change the server owner's nickname.\");\n        }\n        if (member.id === ctx.client.user?.id) await member.guild.members.editMe({ nick });\n        else await member.setNickname(nick);\n        return \"out\";\n      }\n\n      case \"unban-user\": {\n        const guild = this.requireGuild(ctx, \"Unban User\");\n        const id = extractId(cfg(node, \"user\", ctx));\n        if (id === null) throw new Error(\"Unban User needs a user ID.\");\n        await guild.bans.remove(id, cfg(node, \"reason\", ctx) || undefined);\n        return \"out\";\n      }\n\n      case \"set-presence\": {\n        const activityText = cfg(node, \"activityText\", ctx).slice(0, 128);\n        const type = activityTypeFor(text(node.config[\"activityType\"]));\n        const streamUrl = cfg(node, \"streamUrl\", ctx);\n        const activity =\n          type === ActivityType.Custom\n            ? { name: \"Custom Status\", state: activityText, type }\n            : {\n                name: activityText,\n                type,\n                ...(type === ActivityType.Streaming && /^https:\\/\\/(www\\.)?(twitch\\.tv|youtube\\.com)\\//.test(streamUrl)\n                  ? { url: streamUrl }\n                  : {}),\n              };\n        try {\n          await Promise.resolve(\n            ctx.client.user?.setPresence({\n              status: presenceStatus(text(node.config[\"status\"])),\n              activities: activityText === \"\" ? [] : [activity],\n            }),\n          );\n        } catch (error) {\n          throw new Error(`Discord refused the presence: ${describeError(error, 200)}`);\n        }\n        return \"out\";\n      }\n\n      /* ------------------------------- voice ---------------------------- */\n      case \"voice-mute\": {\n        const member = await this.requireMember(node, ctx, \"Server Mute\");\n        await member.voice.setMute(\n          truthy(node.config[\"muted\"]),\n          cfg(node, \"reason\", ctx) || undefined,\n        );\n        return \"out\";\n      }\n\n      case \"voice-deafen\": {\n        const member = await this.requireMember(node, ctx, \"Server Deafen\");\n        await member.voice.setDeaf(\n          truthy(node.config[\"deafened\"]),\n          cfg(node, \"reason\", ctx) || undefined,\n        );\n        return \"out\";\n      }\n\n      case \"disconnect-member\": {\n        const member = await this.requireMember(node, ctx, \"Disconnect From Voice\");\n        await member.voice.disconnect();\n        return \"out\";\n      }\n\n      /* ---------------------------- extra logic ------------------------- */\n      case \"condition\": {\n        for (const branch of parseConditionBranches(node.config)) {\n          if (branch.rules.length === 0) continue;\n          let matched = branch.match === \"all\";\n          for (const rule of branch.rules) {\n            const ok = await this.evaluateRule(rule, ctx);\n            if (branch.match === \"all\" && !ok) {\n              matched = false;\n              break;\n            }\n            if (branch.match === \"any\" && ok) {\n              matched = true;\n              break;\n            }\n          }\n          if (matched) return branch.id;\n        }\n        return \"else\";\n      }\n\n      case \"switch\": {\n        const value = cfg(node, \"value\", ctx);\n        for (const index of [1, 2, 3, 4]) {\n          const candidate = cfg(node, `case${index}`, ctx);\n          if (candidate !== \"\" && candidate === value) return `case${index}`;\n        }\n        return \"default\";\n      }\n\n      case \"regex-match\": {\n        const pattern = text(node.config[\"pattern\"]);\n        const flags = text(node.config[\"flags\"]).replace(/[^gimsuy]/g, \"\");\n        if (pattern.length > 300) throw new Error(\"Regex patterns are limited to 300 characters.\");\n        let regex: RegExp;\n        try {\n          regex = new RegExp(pattern, flags);\n        } catch {\n          throw new Error(`\"${pattern}\" is not a valid pattern.`);\n        }\n        // Runs with a time limit, so a catastrophic pattern on user text can\n        // never freeze every bot in this process.\n        let match: RegExpExecArray | null;\n        try {\n          match = runInNewContext(\"regex.exec(input)\", {\n            regex,\n            input: cfg(node, \"text\", ctx).slice(0, 4000),\n          }, { timeout: 50 }) as RegExpExecArray | null;\n        } catch {\n          throw new Error(\"The pattern took too long on this text. Simplify the regex.\");\n        }\n        if (match === null) return \"false\";\n        ctx.vars.set(cfg(node, \"storeAs\", ctx) || \"match\", match[0]);\n        return \"true\";\n      }\n\n      case \"check-bot-permission\": {\n        const guild = this.requireGuild(ctx, \"Bot Has Permission?\");\n        const name = text(node.config[\"permission\"]) as keyof typeof PermissionFlagsBits;\n        const bit = PermissionFlagsBits[name];\n        if (bit === undefined) return \"false\";\n        const me = guild.members.me ?? (await guild.members.fetchMe());\n        return me.permissions.has(bit) ? \"true\" : \"false\";\n      }\n\n      case \"check-context\": {\n        const wantsGuild = text(node.config[\"context\"]) !== \"dm\";\n        return (ctx.guild !== null) === wantsGuild ? \"true\" : \"false\";\n      }\n\n      case \"is-bot\": {\n        const user = await resolveUser(cfg(node, \"user\", ctx), ctx);\n        return user?.bot === true ? \"true\" : \"false\";\n      }\n\n      case \"has-attachment\":\n        return (ctx.message?.attachments.size ?? 0) > 0 ? \"true\" : \"false\";\n\n      case \"for-each\": {\n        // \"\\n\" typed in the field means a new line (Find Many Records' {records.list}).\n        const separator = (text(node.config[\"separator\"]) || \",\").replace(/\\\\n/g, \"\\n\");\n        const itemVar = cfg(node, \"itemVar\", ctx) || \"item\";\n        const items = cfg(node, \"list\", ctx)\n          .split(separator)\n          .map((entry) => entry.trim())\n          .filter((entry) => entry !== \"\");\n        for (const item of items) {\n          ctx.vars.set(itemVar, item);\n          await this.walk(ctx.flow, node.id, \"each\", ctx);\n        }\n        return \"out\";\n      }\n\n      case \"stop-flow\":\n        return null;\n\n      /* -------------------------- utility and web ----------------------- */\n      /* ------------------------- Bottly storage ------------------------- */\n      case \"storage-save\":\n      case \"storage-update\":\n      case \"storage-delete\":\n      case \"storage-find\":\n      case \"storage-count\": {\n        const ownDatabase = usesOwnDatabase(node.config);\n        if (!ownDatabase && (!this.botId || !this.userId)) throw new Error(\"Storage is not available for this bot.\");\n        const table = cfg(node, \"table\", ctx);\n        const field = cfg(node, \"field\", ctx);\n        const value = cfg(node, \"value\", ctx);\n        const fields = parseFields(text(node.config[\"fields\"]), ctx);\n        const op = node.type.slice(\"storage-\".length) as \"save\" | \"find\" | \"update\" | \"delete\" | \"count\";\n        const request = {\n          ...(field ? { where: { field, value } } : {}),\n          ...(op === \"save\" || op === \"update\" ? { data: fields } : {}),\n        };\n        // \"Your PostgreSQL\": the owner's own database, same outputs and variables.\n        const res = ownDatabase\n          ? await pgStorage(cfg(node, \"connection\", ctx) || (ctx.vars.get(\"env.DATABASE_URL\") ?? \"\"), op, table, request)\n          : await storageRequest(this.botId!, this.userId!, { op, table, ...request });\n        if (op === \"find\") {\n          const row = res.ok ? res.rows?.[0] : undefined;\n          if (!row) return \"missing\";\n          const key = cfg(node, \"storeAs\", ctx) || \"record\";\n          for (const [k, v] of Object.entries(row)) ctx.vars.set(`${key}.${k}`, String(v ?? \"\"));\n          ctx.vars.set(key, JSON.stringify(row));\n          return \"found\";\n        }\n        if (op === \"count\") {\n          ctx.vars.set(cfg(node, \"storeAs\", ctx) || \"count\", String(res.count ?? 0));\n          return \"out\";\n        }\n        if (!res.ok) ctx.vars.set(\"storage.error\", res.error ?? \"Storage failed\");\n        return res.ok ? \"out\" : \"failed\";\n      }\n\n      /* ---- Find Many Records / Take One Item / Sum-Average Records ---- */\n      case \"storage-query\":\n      case \"storage-take\":\n      case \"storage-aggregate\": {\n        const op = node.type.slice(\"storage-\".length) as \"query\" | \"take\" | \"aggregate\";\n        const key = cfg(node, \"storeAs\", ctx) || (op === \"query\" ? \"records\" : op === \"take\" ? \"item\" : \"agg\");\n        const empty = op === \"aggregate\" ? \"out\" : \"empty\";\n        const ownDatabase = usesOwnDatabase(node.config);\n        let res: { ok: boolean; rows?: Record<string, unknown>[]; groups?: { key: string; value: number | null }[]; error?: string };\n        let req: ReturnType<typeof storageBlockRequest> | null = null;\n        try {\n          req = storageBlockRequest(node.type, node.config, (v) => interpolate(v, ctx));\n          if (!ownDatabase && (!this.botId || !this.userId)) throw new Error(\"Storage is not available for this bot.\");\n          if (!req.table) throw new Error(\"Pick a table.\");\n          res = ownDatabase\n            ? await pgRecords(cfg(node, \"connection\", ctx) || (ctx.vars.get(\"env.DATABASE_URL\") ?? \"\"), op, req.table, {\n                filters: req.filters,\n                sort: req.sort,\n                limit: req.limit,\n                offset: req.offset,\n                marks: req.marks,\n                aggregate: req.aggregate,\n              })\n            : await storageRequest(this.botId!, this.userId!, {\n                op,\n                table: req.table,\n                filters: req.filters,\n                ...(op === \"aggregate\" ? { aggregate: req.aggregate } : { sort: req.sort }),\n                ...(op === \"query\" ? { limit: req.limit, offset: req.offset } : {}),\n                ...(op === \"take\" ? { data: req.marks } : {}),\n              });\n        } catch (error) {\n          res = { ok: false, error: error instanceof Error ? error.message : \"Storage failed\" };\n        }\n        if (!res.ok) {\n          ctx.vars.set(`${key}.error`, (res.error ?? \"Storage failed\").slice(0, 300));\n          ctx.vars.set(\"storage.error\", (res.error ?? \"Storage failed\").slice(0, 300));\n          if (op === \"query\") ctx.vars.set(`${key}.count`, \"0\");\n          if (op === \"aggregate\") {\n            for (const [k, v] of Object.entries(aggregateVariables(key, req?.aggregate.op ?? \"count\", [], false))) ctx.vars.set(k, v);\n          }\n          return empty;\n        }\n        ctx.vars.delete(`${key}.error`);\n        if (op === \"aggregate\" && req) {\n          const grouped = req.aggregate.groupBy !== \"\";\n          for (const [k, v] of Object.entries(aggregateVariables(key, req.aggregate.op, res.groups ?? [], grouped))) ctx.vars.set(k, v);\n          return \"out\";\n        }\n        const rows = (res.rows ?? []).map(recordText);\n        if (op === \"take\") {\n          const row = rows[0];\n          if (!row) return \"empty\";\n          for (const [k, v] of Object.entries(row)) ctx.vars.set(`${key}.${k}`, v);\n          ctx.vars.set(key, JSON.stringify(row));\n          return \"taken\";\n        }\n        const template = text(node.config[\"lineTemplate\"]);\n        const vars = recordListVariables(key, rows, template, (name) => ctx.vars.get(name) ?? builtinVariable(name, ctx) ?? undefined);\n        for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n        return rows.length ? \"found\" : \"empty\";\n      }\n\n      /* ----------------------- Your PostgreSQL: SQL ---------------------- */\n      case \"sql-query\": {\n        const key = cfg(node, \"storeAs\", ctx) || \"sql\";\n        // The SQL text is used as written; only parameters are interpolated.\n        const query = text(node.config[\"sql\"]).trim();\n        try {\n          if (!query) throw new Error(\"The SQL Query block has no SQL.\");\n          const lines = text(node.config[\"sqlParams\"]).split(\"\\n\").map((line) => interpolate(line.trim(), ctx));\n          const res = await pgQuery(cfg(node, \"connection\", ctx), query, sqlParams(query, lines));\n          for (const [k, v] of Object.entries(rowVariables(key, res.rows, res.rowCount))) ctx.vars.set(k, v);\n          ctx.vars.delete(`${key}.error`);\n          return \"out\";\n        } catch (error) {\n          ctx.vars.set(`${key}.error`, scrubPgError(error instanceof Error ? error.message : \"The query failed.\", cfg(node, \"connection\", ctx)));\n          ctx.vars.set(`${key}.count`, \"0\");\n          return \"failed\";\n        }\n      }\n\n      /* ------------------------- Plugin: Leveling ------------------------ */\n      case \"xp-gain\": {\n        const member = await this.requireMember(node, ctx, \"Give XP\");\n        if (member.user.bot) return \"out\";\n        const r = await this.community.xpGain(member, {\n          min: num(node.config[\"minXp\"], 15),\n          max: num(node.config[\"maxXp\"], 25),\n          cooldown: num(node.config[\"cooldownSeconds\"], 60),\n        });\n        for (const [k, v] of Object.entries(r.vars)) ctx.vars.set(k, v);\n        return r.handle;\n      }\n\n      case \"xp-rank\": {\n        const guild = this.requireGuild(ctx, \"Rank\");\n        const user = await resolveUser(cfg(node, \"user\", ctx), ctx);\n        if (user === null) return \"missing\";\n        const vars = await this.community.xpRank(guild, user.id, cfg(node, \"storeAs\", ctx) || \"rank\");\n        if (vars === null) return \"missing\";\n        for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n        return \"found\";\n      }\n\n      case \"xp-leaderboard\": {\n        const guild = this.requireGuild(ctx, \"Leaderboard\");\n        const vars = await this.community.xpLeaderboard(guild, num(node.config[\"limit\"], 10), cfg(node, \"storeAs\", ctx) || \"top\");\n        for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n        return \"out\";\n      }\n\n      case \"xp-edit\": {\n        const member = await this.requireMember(node, ctx, \"Edit XP\");\n        const vars = await this.community.xpEdit(member, text(node.config[\"mode\"]) || \"add\", Math.max(0, Number(cfg(node, \"amount\", ctx)) || 0));\n        for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n        return \"out\";\n      }\n\n      case \"level-rewards\": {\n        const member = await this.requireMember(node, ctx, \"Level Rewards\");\n        const vars = await this.community.levelRewards(member, cfg(node, \"rewards\", ctx), node.config[\"stack\"] !== false && node.config[\"stack\"] !== \"false\", (raw) => resolveRole(raw, ctx));\n        for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n        return \"out\";\n      }\n\n      /* ------------------------- Plugin: Economy ------------------------- */\n      case \"economy\": {\n        const key = cfg(node, \"storeAs\", ctx) || \"eco\";\n        try {\n          const guild = this.requireGuild(ctx, \"Economy\");\n          const member = await this.requireMember(node, ctx, \"Economy\");\n          const op = text(node.config[\"operation\"]) || \"balance\";\n          const targetRaw = cfg(node, \"target\", ctx);\n          const target = targetRaw ? await resolveMember(targetRaw, ctx) : null;\n          if (targetRaw && target === null) throw new Error(\"That member is not in this server.\");\n          const vars =\n            op === \"shop-add\"\n              ? await this.community.shopAdd(\n                  guild,\n                  cfg(node, \"item\", ctx),\n                  Number(cfg(node, \"amount\", ctx)),\n                  cfg(node, \"role\", ctx) ? ((await resolveRole(cfg(node, \"role\", ctx), ctx))?.id ?? \"\") : \"\",\n                  cfg(node, \"description\", ctx),\n                )\n              : await this.community.economy(op, {\n                  guild,\n                  member,\n                  target,\n                  amount: cfg(node, \"amount\", ctx),\n                  item: cfg(node, \"item\", ctx),\n                  cooldown: num(node.config[\"cooldownSeconds\"], 3600),\n                  prefix: key,\n                });\n          for (const [k, v] of Object.entries(vars)) ctx.vars.set(k.startsWith(\"eco.\") && key !== \"eco\" ? key + k.slice(3) : k, v);\n          return \"ok\";\n        } catch (error) {\n          ctx.vars.set(`${key}.error`, describeError(error));\n          return \"failed\";\n        }\n      }\n\n      case \"casino\": {\n        const key = cfg(node, \"storeAs\", ctx) || \"casino\";\n        try {\n          const guild = this.requireGuild(ctx, \"Casino\");\n          const member = await this.requireMember(node, ctx, \"Casino\");\n          const r = await this.community.casino(text(node.config[\"game\"]) || \"coinflip\", {\n            guild,\n            member,\n            bet: cfg(node, \"bet\", ctx),\n            choice: cfg(node, \"choice\", ctx),\n            prefix: key,\n          });\n          for (const [k, v] of Object.entries(r.vars)) ctx.vars.set(k, v);\n          if (r.payload) {\n            await this.respond(ctx, r.payload as unknown as FlowPayload, false);\n            return \"started\";\n          }\n          return \"ok\";\n        } catch (error) {\n          ctx.vars.set(`${key}.error`, describeError(error));\n          return \"failed\";\n        }\n      }\n\n      /* ------------------------- Plugin: Giveaways ----------------------- */\n      case \"giveaway-start\": {\n        try {\n          const guild = this.requireGuild(ctx, \"Giveaway\");\n          const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n          if (channel === null) throw new Error(\"The giveaway channel could not be found.\");\n          const roleRaw = cfg(node, \"requiredRole\", ctx);\n          const role = roleRaw ? await resolveRole(roleRaw, ctx) : null;\n          if (roleRaw && role === null) throw new Error(`Role \"${roleRaw}\" was not found.`);\n          const vars = await this.community.startGiveaway({\n            channel,\n            guild,\n            host: ctx.user ?? this.client.user!,\n            prize: cfg(node, \"prize\", ctx),\n            duration: cfg(node, \"duration\", ctx),\n            winners: Number(cfg(node, \"winners\", ctx)) || 1,\n            roleId: role?.id ?? \"\",\n            minDays: Number(cfg(node, \"minDays\", ctx)) || 0,\n            minLevel: Number(cfg(node, \"minLevel\", ctx)) || 0,\n            description: cfg(node, \"description\", ctx),\n            color: cfg(node, \"color\", ctx),\n          });\n          for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n          return \"out\";\n        } catch (error) {\n          ctx.vars.set(\"giveaway.error\", describeError(error));\n          return \"failed\";\n        }\n      }\n\n      case \"giveaway-end\":\n      case \"giveaway-reroll\": {\n        try {\n          const id = extractId(cfg(node, \"messageId\", ctx)) ?? cfg(node, \"messageId\", ctx).split(\"/\").pop() ?? \"\";\n          const vars =\n            node.type === \"giveaway-end\"\n              ? await this.community.endGiveaway(id)\n              : await this.community.rerollGiveaway(id, Number(cfg(node, \"count\", ctx)) || 1);\n          for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n          return \"out\";\n        } catch (error) {\n          ctx.vars.set(\"giveaway.error\", describeError(error));\n          return \"failed\";\n        }\n      }\n\n      /* ------------------------ Plugin: Suggestions ---------------------- */\n      case \"suggestion-post\": {\n        try {\n          const guild = this.requireGuild(ctx, \"Suggestion\");\n          const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n          if (channel === null) throw new Error(\"The suggestions channel could not be found.\");\n          const author = (await resolveUser(cfg(node, \"author\", ctx), ctx)) ?? ctx.user;\n          if (author === null) throw new Error(\"Who made the suggestion?\");\n          const vars = await this.community.postSuggestion({\n            channel,\n            guild,\n            author,\n            text: cfg(node, \"text\", ctx),\n            original: ctx.message,\n            deleteOriginal: truthy(node.config[\"deleteOriginal\"]),\n            thread: node.config[\"thread\"] !== false && node.config[\"thread\"] !== \"false\",\n            staffRole: cfg(node, \"staffRole\", ctx),\n          });\n          for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n          return \"out\";\n        } catch (error) {\n          ctx.vars.set(\"suggestion.error\", describeError(error));\n          return \"failed\";\n        }\n      }\n\n      /* -------------------------- Plugin: Tickets ------------------------ */\n      case \"ticket-transcript\": {\n        try {\n          const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n          if (channel === null) throw new Error(\"The ticket channel could not be found.\");\n          const targetRaw = cfg(node, \"sendTo\", ctx);\n          const target = targetRaw ? await resolveChannel(targetRaw, ctx) : null;\n          const vars = await this.community.transcript(channel, target, cfg(node, \"title\", ctx));\n          for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n          return \"out\";\n        } catch (error) {\n          ctx.vars.set(\"transcript.error\", describeError(error));\n          return \"failed\";\n        }\n      }\n\n      /* ------------------------ Plugin: Converter ----------------------- */\n      /* --------------------------- Plugin: AI Chat ----------------------- */\n      case \"ai-chat\": {\n        const key = cfg(node, \"storeAs\", ctx) || \"ai\";\n        const prompt = cfg(node, \"prompt\", ctx);\n        if (prompt === \"\") {\n          ctx.vars.set(`${key}.error`, \"There is no message to answer.\");\n          return \"failed\";\n        }\n        const memory = text(node.config[\"memory\"]);\n        const scope =\n          memory === \"channel\" ? ctx.channel?.id : memory === \"off\" ? null : (ctx.user?.id ?? null);\n        const result = await aiChatRequest(this.botId, this.userId, {\n          prompt: prompt.slice(0, 4000),\n          personality: cfg(node, \"personality\", ctx).slice(0, 2000),\n          memoryKey: scope ? `${memory}:${ctx.guild?.id ?? \"dm\"}:${scope}` : null,\n          maxLength: Math.min(1900, Math.max(50, num(node.config[\"maxLength\"], 1500))),\n          botName: this.client.user?.username ?? \"Bot\",\n          provider: cfg(node, \"provider\", ctx),\n          apiKey: cfg(node, \"apiKey\", ctx),\n          model: cfg(node, \"model\", ctx),\n        });\n        if (!result.ok) {\n          ctx.vars.set(`${key}.error`, result.error);\n          return \"failed\";\n        }\n        ctx.vars.set(key, result.reply);\n        ctx.vars.set(`${key}.reply`, result.reply);\n        return \"out\";\n      }\n\n      case \"convert\": {\n        const key = cfg(node, \"storeAs\", ctx) || \"conv\";\n        const amount = cfg(node, \"amount\", ctx);\n        try {\n          const result = await convert(amount, cfg(node, \"from\", ctx), cfg(node, \"to\", ctx));\n          ctx.vars.set(`${key}.result`, formatAmount(result.result));\n          ctx.vars.set(`${key}.raw`, String(result.result));\n          ctx.vars.set(`${key}.rate`, formatAmount(result.rate));\n          ctx.vars.set(`${key}.from`, result.from);\n          ctx.vars.set(`${key}.to`, result.to);\n          ctx.vars.set(`${key}.amount`, amount);\n          ctx.vars.set(`${key}.text`, conversionText(amount, result));\n          return \"out\";\n        } catch (error) {\n          ctx.vars.set(`${key}.error`, describeError(error));\n          return \"failed\";\n        }\n      }\n\n      /* ---------------------- Plugin: Sticky Message --------------------- */\n      case \"sticky-message\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null || !(\"send\" in channel)) {\n          ctx.vars.set(\"sticky.error\", \"The sticky channel could not be found.\");\n          return \"failed\";\n        }\n        // A burst of messages moves the sticky once: only the newest call\n        // still waiting after the quiet delay reposts it.\n        const generation = (this.stickyGeneration.get(channel.id) ?? 0) + 1;\n        this.stickyGeneration.set(channel.id, generation);\n        await sleep(Math.min(30, Math.max(0, num(node.config[\"delaySeconds\"], 3))) * 1000);\n        if (this.stickyGeneration.get(channel.id) !== generation) return \"out\";\n        const previous = this.stickyLocks.get(channel.id) ?? Promise.resolve();\n        const run = previous.catch(() => undefined).then(() => this.repostSticky(channel, buildPayload(node, ctx)));\n        this.stickyLocks.set(channel.id, run);\n        try {\n          const id = await run;\n          ctx.vars.set(\"sticky.id\", id);\n          return \"out\";\n        } catch (error) {\n          ctx.vars.set(\"sticky.error\", describeError(error));\n          return \"failed\";\n        } finally {\n          if (this.stickyLocks.get(channel.id) === run) this.stickyLocks.delete(channel.id);\n        }\n      }\n\n      case \"sticky-clear\": {\n        const channel = await resolveChannel(cfg(node, \"channel\", ctx), ctx);\n        if (channel === null) throw new Error(\"The sticky channel could not be found.\");\n        this.stickyGeneration.set(channel.id, (this.stickyGeneration.get(channel.id) ?? 0) + 1);\n        const id = this.stickyIds.get(channel.id) ?? (await this.storedStickyId(channel.id));\n        if (id) await channel.messages.delete(id).catch(() => undefined);\n        this.stickyIds.delete(channel.id);\n        if (this.botId && this.userId)\n          await storageRequest(this.botId, this.userId, { op: \"delete\", table: \"sticky_messages\", where: { field: \"channel\", value: channel.id } });\n        return \"out\";\n      }\n\n      /* -------------------------- Plugin: Roblox ------------------------- */\n      case \"roblox-api\": {\n        const key = cfg(node, \"storeAs\", ctx) || \"roblox\";\n        try {\n          const vars = await robloxOperation(text(node.config[\"operation\"]) || \"user\", cfg(node, \"query\", ctx));\n          for (const [k, v] of Object.entries(vars)) ctx.vars.set(`${key}.${k}`, v);\n          return \"ok\";\n        } catch (error) {\n          ctx.vars.set(`${key}.error`, describeError(error));\n          return \"failed\";\n        }\n      }\n\n      /* ----------------------- Plugin: Crypto Tools ---------------------- */\n      case \"crypto-api\":\n      case \"crypto-alert\":\n      case \"crypto-watch\":\n      case \"crypto-portfolio\": {\n        const fallback = { \"crypto-api\": \"crypto\", \"crypto-alert\": \"alert\", \"crypto-watch\": \"watch\", \"crypto-portfolio\": \"portfolio\" }[node.type]!;\n        const key = cfg(node, \"storeAs\", ctx) || fallback;\n        const action = text(node.config[\"operation\"] ?? node.config[\"action\"]);\n        try {\n          let vars: Record<string, string>;\n          if (node.type === \"crypto-api\") {\n            vars = await cryptoLookup(action || \"price\", cfg(node, \"query\", ctx), cfg(node, \"extra\", ctx));\n          } else if (node.type === \"crypto-portfolio\") {\n            vars = await this.crypto.portfolio(action || \"show\", {\n              user: cfg(node, \"user\", ctx).replace(/\\D/g, \"\") || ctx.user?.id || \"\",\n              address: cfg(node, \"address\", ctx),\n              chain: cfg(node, \"chain\", ctx),\n              label: cfg(node, \"label\", ctx),\n              currency: cfg(node, \"currency\", ctx),\n            });\n          } else {\n            const guild = this.requireGuild(ctx, node.type === \"crypto-alert\" ? \"Price alerts\" : \"Wallet watching\");\n            const channelRaw = cfg(node, \"channel\", ctx);\n            const channel = channelRaw ? await resolveChannel(channelRaw, ctx) : ctx.channel;\n            const base = { guild: guild.id, channel: channel?.id ?? \"\", user: ctx.user?.id ?? \"\" };\n            vars =\n              node.type === \"crypto-alert\"\n                ? await this.crypto.alert(action || \"add\", {\n                    ...base,\n                    coin: cfg(node, \"coin\", ctx),\n                    direction: cfg(node, \"direction\", ctx),\n                    price: cfg(node, \"price\", ctx),\n                    currency: cfg(node, \"currency\", ctx),\n                    id: cfg(node, \"alertId\", ctx),\n                  })\n                : await this.crypto.watch(action || \"add\", {\n                    ...base,\n                    address: cfg(node, \"address\", ctx),\n                    chain: cfg(node, \"chain\", ctx),\n                    label: cfg(node, \"label\", ctx),\n                  });\n          }\n          for (const [k, v] of Object.entries(vars)) ctx.vars.set(`${key}.${k}`, v);\n          return \"ok\";\n        } catch (error) {\n          ctx.vars.set(`${key}.error`, describeError(error));\n          return \"failed\";\n        }\n      }\n\n      /* ------------------------- Plugin: SellAuth ------------------------ */\n      case \"sellauth-get-invoice\":\n      case \"sellauth-verify-purchase\": {\n        const inv = await this.sellauth(`/invoices/${encodeURIComponent(cfg(node, \"invoiceId\", ctx))}`);\n        if (node.type === \"sellauth-get-invoice\") {\n          if (!inv) return \"missing\";\n          for (const [k, v] of Object.entries(invoiceVars(cfg(node, \"storeAs\", ctx) || \"invoice\", inv))) ctx.vars.set(k, v);\n          return \"found\";\n        }\n        if (!inv || String(inv[\"status\"] ?? \"\") !== \"completed\") return \"no\";\n        const productId = cfg(node, \"productId\", ctx);\n        const email = cfg(node, \"email\", ctx).toLowerCase();\n        if (productId && !JSON.stringify(inv).includes(`\"product_id\":${Number(productId)}`) && String(inv[\"product_id\"] ?? \"\") !== productId) return \"no\";\n        if (email && String(inv[\"email\"] ?? \"\").toLowerCase() !== email) return \"no\";\n        return \"yes\";\n      }\n\n      case \"sellauth-api\": {\n        const key = cfg(node, \"storeAs\", ctx) || \"sa\";\n        const operation = text(node.config[\"operation\"]) || \"invoices.get\";\n        let req: ReturnType<typeof buildSellAuthRequest>;\n        try {\n          req = buildSellAuthRequest(operation, {\n            id: cfg(node, \"id\", ctx),\n            id2: cfg(node, \"id2\", ctx),\n            params: text(node.config[\"params\"]),\n            method: cfg(node, \"method\", ctx),\n            path: cfg(node, \"path\", ctx),\n          }, (token) => interpolate(token, ctx));\n        } catch (error) {\n          ctx.vars.set(`${key}.error`, describeError(error));\n          return \"failed\";\n        }\n        let res: Awaited<ReturnType<typeof this.sellauthRaw>>;\n        try {\n          res = await this.sellauthRaw(req.method, req.path, req.body);\n        } catch (error) {\n          // Missing plugin settings, a timeout or a network error: take the\n          // flow's own \"failed\" branch so its error reply explains it.\n          ctx.vars.set(`${key}.error`, describeError(error));\n          return \"failed\";\n        }\n        const isList = SELLAUTH_OPERATIONS.find((o) => o.id === operation)?.list === true;\n        for (const [k, v] of Object.entries(sellauthVars(key, res.status, res.body, isList))) ctx.vars.set(k, v);\n        if (!res.ok) {\n          ctx.vars.set(`${key}.error`, sellauthError(res.status, res.body));\n          return \"failed\";\n        }\n        return \"ok\";\n      }\n\n      case \"sellauth-product-stock\": {\n        const product = await this.sellauth(`/products/${encodeURIComponent(cfg(node, \"productId\", ctx))}`);\n        if (!product) return \"failed\";\n        const key = cfg(node, \"storeAs\", ctx) || \"product\";\n        ctx.vars.set(`${key}.name`, String(product[\"name\"] ?? \"\"));\n        ctx.vars.set(`${key}.stock`, String(product[\"stock_count\"] ?? product[\"stock\"] ?? \"\"));\n        ctx.vars.set(`${key}.price`, String(product[\"price\"] ?? \"\"));\n        return \"out\";\n      }\n\n      /* ------------------------ Plugin: Anti-Nuke ------------------------ */\n      case \"antinuke-guard\": {\n        const guild = this.requireGuild(ctx, \"Anti-Nuke Guard\");\n        const action = text(node.config[\"action\"]) || \"channel-delete\";\n        const type = ANTINUKE_AUDIT[action];\n        if (type === undefined) throw new Error(\"Anti-Nuke Guard has an unknown watched action.\");\n        ctx.vars.set(\"antinuke.action\", action);\n        // The entry for exactly this channel / role / member: two people acting\n        // at once are never mixed up. Pushed entries first, the audit log as a\n        // fallback (entries can land shortly after the gateway event).\n        const targetId =\n          action === \"member-kick\" || action === \"member-ban\"\n            ? (ctx.user?.id ?? null)\n            : action.startsWith(\"channel-\")\n              ? (ctx.vars.get(\"channel.id\") ?? null) || null\n              : action.startsWith(\"role-\")\n                ? (ctx.vars.get(\"role.id\") ?? null) || null\n                : null;\n        let entry = null as null | { executorId: string | null };\n        for (let attempt = 0; attempt < 4 && entry === null; attempt++) {\n          if (attempt > 0) await sleep(500);\n          entry = recentAudit(guild.id, type, targetId);\n          if (entry === null && attempt === 2) {\n            const logs = await guild.fetchAuditLogs({ type, limit: 5 }).catch(() => null);\n            entry =\n              logs?.entries.find(\n                (e) =>\n                  Date.now() - e.createdTimestamp < 20_000 &&\n                  (targetId === null || e.targetId === targetId),\n              ) ?? null;\n          }\n        }\n        const executorId = entry?.executorId ?? null;\n        if (executorId === null) return \"safe\";\n        const executor = await ctx.client.users.fetch(executorId).catch(() => null);\n        ctx.vars.set(\"executor\", `<@${executorId}>`);\n        ctx.vars.set(\"executor.id\", executorId);\n        ctx.vars.set(\"executor.tag\", executor?.tag ?? executorId);\n        if (executorId === ctx.client.user?.id || executorId === guild.ownerId) return \"safe\";\n        const whitelist = new Set(cfg(node, \"whitelist\", ctx).split(/[\\s,]+/).map((v) => v.replace(/[<@&!>]/g, \"\")).filter(Boolean));\n        if (whitelist.has(executorId)) return \"safe\";\n        const member = await guild.members.fetch(executorId).catch(() => null);\n        if (member?.roles.cache.some((r) => whitelist.has(r.id))) return \"safe\";\n        const windowMs = Math.max(1, num(node.config[\"windowSeconds\"], 10)) * 1000;\n        const limit = Math.max(1, num(node.config[\"limit\"], 3));\n        const key = `${guild.id}:${action}:${executorId}`;\n        const now = Date.now();\n        const hits = (antinukeHits.get(key) ?? []).filter((t) => now - t < windowMs);\n        hits.push(now);\n        antinukeHits.set(key, hits);\n        ctx.vars.set(\"antinuke.count\", String(hits.length));\n        if (hits.length >= limit) {\n          antinukeHits.delete(key); // fire once per burst\n          return \"triggered\";\n        }\n        return \"safe\";\n      }\n\n      case \"antinuke-punish\": {\n        const guild = this.requireGuild(ctx, \"Anti-Nuke Punish\");\n        const id = extractId(cfg(node, \"user\", ctx));\n        if (id === null) throw new Error(\"Anti-Nuke Punish could not resolve the user.\");\n        const reason = cfg(node, \"reason\", ctx) || \"Anti-Nuke\";\n        const mode = text(node.config[\"mode\"]) || \"strip-roles\";\n        try {\n          if (mode === \"ban\") {\n            await guild.members.ban(id, { reason });\n          } else {\n            const member = await guild.members.fetch(id);\n            if (mode === \"kick\") await member.kick(reason);\n            else await member.roles.set(member.roles.cache.filter((r) => r.managed).map((r) => r.id), reason);\n          }\n          return \"out\";\n        } catch (error) {\n          ctx.vars.set(\"antinuke.error\", describeError(error));\n          return \"failed\";\n        }\n      }\n\n      case \"http-request\": {\n        const url = cfg(node, \"url\", ctx);\n        const key = cfg(node, \"storeAs\", ctx) || \"response\";\n        let headers: Record<string, string> = {};\n        const rawHeaders = cfg(node, \"headers\", ctx);\n        if (rawHeaders !== \"\") {\n          try {\n            headers = JSON.parse(rawHeaders) as Record<string, string>;\n          } catch {\n            throw new Error(\"HTTP Request headers must be valid JSON.\");\n          }\n        }\n        const method = (text(node.config[\"method\"]) || \"GET\").toUpperCase();\n        const body = cfg(node, \"body\", ctx);\n        try {\n          // Public https addresses only: never the bot host, a private network\n          // or a cloud metadata server.\n          const response = await safeFetch(\n            {\n              url,\n              method,\n              headers,\n              ...(method === \"GET\" || method === \"DELETE\" || body === \"\" ? {} : { body }),\n            },\n            { maxBody: 20_000, timeoutMs: 10_000 },\n          );\n          ctx.vars.set(key, response.body);\n          ctx.vars.set(`${key}.body`, response.body);\n          ctx.vars.set(`${key}.status`, String(response.status));\n          return response.ok ? \"out\" : \"failed\";\n        } catch (error) {\n          ctx.vars.set(`${key}.error`, describeError(error, 200));\n          return \"failed\";\n        }\n      }\n\n      case \"parse-json\": {\n        const path = text(node.config[\"path\"]);\n        let value: unknown;\n        try {\n          value = JSON.parse(cfg(node, \"source\", ctx));\n        } catch {\n          throw new Error(\"Read JSON Value received text that is not valid JSON.\");\n        }\n        for (const part of path.split(\".\").filter((segment) => segment !== \"\")) {\n          if (value === null || typeof value !== \"object\") {\n            value = undefined;\n            break;\n          }\n          value = (value as Record<string, unknown>)[part];\n        }\n        ctx.vars.set(\n          cfg(node, \"storeAs\", ctx) || \"value\",\n          value === undefined || value === null\n            ? \"\"\n            : typeof value === \"object\"\n              ? JSON.stringify(value)\n              : String(value),\n        );\n        return \"out\";\n      }\n\n      case \"random-number\": {\n        const min = Math.trunc(num(node.config[\"min\"], 1));\n        const max = Math.trunc(num(node.config[\"max\"], 100));\n        const low = Math.min(min, max);\n        const high = Math.max(min, max);\n        const value = low + Math.floor(Math.random() * (high - low + 1));\n        ctx.vars.set(cfg(node, \"storeAs\", ctx) || \"number\", String(value));\n        return \"out\";\n      }\n\n      case \"random-choice\": {\n        const separator = text(node.config[\"separator\"]) || \",\";\n        const items = cfg(node, \"list\", ctx)\n          .split(separator)\n          .map((entry) => entry.trim())\n          .filter((entry) => entry !== \"\");\n        const picked =\n          items.length === 0 ? \"\" : (items[Math.floor(Math.random() * items.length)] as string);\n        ctx.vars.set(cfg(node, \"storeAs\", ctx) || \"choice\", picked);\n        return \"out\";\n      }\n\n      case \"math\": {\n        const left = Number(cfg(node, \"left\", ctx)) || 0;\n        const right = Number(cfg(node, \"right\", ctx)) || 0;\n        let result: number;\n        switch (text(node.config[\"operator\"])) {\n          case \"subtract\":\n            result = left - right;\n            break;\n          case \"multiply\":\n            result = left * right;\n            break;\n          case \"divide\":\n            result = right === 0 ? 0 : left / right;\n            break;\n          case \"modulo\":\n            result = right === 0 ? 0 : left % right;\n            break;\n          case \"round\":\n            result = Math.round(left);\n            break;\n          default:\n            result = left + right;\n        }\n        ctx.vars.set(cfg(node, \"storeAs\", ctx) || \"result\", String(result));\n        return \"out\";\n      }\n\n      case \"string-op\": {\n        const source = cfg(node, \"text\", ctx);\n        const value = cfg(node, \"value\", ctx);\n        const extra = cfg(node, \"extra\", ctx);\n        let result: string;\n        switch (text(node.config[\"operation\"])) {\n          case \"lowercase\":\n            result = source.toLowerCase();\n            break;\n          case \"trim\":\n            result = source.trim();\n            break;\n          case \"replace\":\n            result = value === \"\" ? source : source.split(value).join(extra);\n            break;\n          case \"slice\":\n            result = source.slice(Number(value) || 0, extra === \"\" ? undefined : Number(extra));\n            break;\n          case \"length\":\n            result = String(source.length);\n            break;\n          default:\n            result = source.toUpperCase();\n        }\n        ctx.vars.set(cfg(node, \"storeAs\", ctx) || \"text\", result);\n        return \"out\";\n      }\n\n      case \"timestamp-format\": {\n        const offset = Math.trunc(num(node.config[\"offsetSeconds\"], 0));\n        const style = text(node.config[\"style\"]) || \"R\";\n        const unix = Math.floor(Date.now() / 1000) + offset;\n        ctx.vars.set(cfg(node, \"storeAs\", ctx) || \"time\", `<t:${unix}:${style}>`);\n        return \"out\";\n      }\n\n      case \"log-event\": {\n        const level = text(node.config[\"level\"]);\n        this.emit({\n          event: \"flow.log\",\n          level: level === \"error\" ? \"error\" : level === \"warning\" ? \"warning\" : \"info\",\n          description: cfg(node, \"message\", ctx),\n          at: nowIso(),\n        });\n        return \"out\";\n      }\n\n      /* ------------------------ extra discord data ---------------------- */\n      case \"count-members\": {\n        const guild = this.requireGuild(ctx, \"Count Members\");\n        const roleRaw = cfg(node, \"role\", ctx);\n        const key = cfg(node, \"storeAs\", ctx) || \"memberCount\";\n        if (roleRaw === \"\") {\n          ctx.vars.set(key, String(guild.memberCount));\n          return \"out\";\n        }\n        const role = await resolveRole(roleRaw, ctx);\n        if (role === null) throw new Error(\"Count Members could not find that role.\");\n        ctx.vars.set(key, String(await this.roleMemberCount(guild, role)));\n        return \"out\";\n      }\n\n      case \"list-roles\": {\n        const guild = this.requireGuild(ctx, \"List Roles\");\n        ctx.vars.set(\n          cfg(node, \"storeAs\", ctx) || \"roles\",\n          guild.roles.cache.map((role) => role.name).join(\", \"),\n        );\n        return \"out\";\n      }\n\n      case \"list-channels\": {\n        const guild = this.requireGuild(ctx, \"List Channels\");\n        ctx.vars.set(\n          cfg(node, \"storeAs\", ctx) || \"channels\",\n          guild.channels.cache.map((channel) => channel.name).join(\", \"),\n        );\n        return \"out\";\n      }\n\n      default:\n        // The compiler strips unsupported nodes, so this only fires when a new\n        // node type ships in the builder before the runtime learns it. Silently\n        // continuing on \"out\" would dead-end blocks whose outputs are named\n        // differently (ok/failed, true/false), so stop with a clear reason.\n        throw new Error(\n          `this bot's runtime does not know the \"${node.type}\" block yet. Update the runtime in Bottly (Hosting → Update runtime) and restart the bot.`,\n        );\n    }\n  }\n\n  private async evaluateIf(node: CompiledNode, ctx: RunContext): Promise<boolean> {\n    const operator = text(node.config[\"operator\"]);\n    const left = cfg(node, \"variable\", ctx);\n    const right = cfg(node, \"value\", ctx);\n\n    if (operator === \"has-role\" || operator === \"not-has-role\") {\n      const member = await resolveMember(left, ctx);\n      const role = await resolveRole(right, ctx);\n      const has = member !== null && role !== null && member.roles.cache.has(role.id);\n      return operator === \"has-role\" ? has : !has;\n    }\n\n    switch (operator) {\n      case \"not-equals\":\n        return left !== right;\n      case \"contains\":\n        return left.toLowerCase().includes(right.toLowerCase());\n      case \"not-contains\":\n        return !left.toLowerCase().includes(right.toLowerCase());\n      case \"gt\":\n        return Number(left) > Number(right);\n      case \"lt\":\n        return Number(left) < Number(right);\n      case \"equals\":\n      default:\n        return left === right;\n    }\n  }\n\n  /** One rule of a Condition branch. Unknown members, roles or values never match. */\n  private async evaluateRule(\n    rule: { left: string; op: string; right: string },\n    ctx: RunContext,\n  ): Promise<boolean> {\n    const left = interpolate(rule.left, ctx);\n    const right = interpolate(rule.right, ctx);\n    if (rule.op === \"matches\") {\n      if (right.length > 300) throw new Error(\"Regex patterns are limited to 300 characters.\");\n      let regex: RegExp;\n      try {\n        regex = new RegExp(right, \"i\");\n      } catch {\n        throw new Error(`\"${right}\" is not a valid pattern.`);\n      }\n      try {\n        // Same time limit as Regex Match: a catastrophic pattern cannot freeze the process.\n        return runInNewContext(\"regex.test(input)\", { regex, input: left }, { timeout: 50 }) === true;\n      } catch {\n        return false;\n      }\n    }\n    const plain = evaluatePlainRule(rule.op, left, right);\n    if (plain !== null) return plain;\n\n    if (rule.op === \"in-channel\") {\n      if (ctx.channel === null) return false;\n      const target = left.trim() === \"\" ? ctx.channel.id : (extractId(left) ?? ctx.channel.id);\n      const id = extractId(right);\n      if (id !== null) return target === id;\n      const channel = target === ctx.channel.id ? ctx.channel : await resolveChannel(target, ctx);\n      const name = channel !== null && \"name\" in channel ? String(channel.name ?? \"\").toLowerCase() : \"\";\n      return name === right.replace(/^#/, \"\").toLowerCase();\n    }\n    if (rule.op === \"is-bot\" || rule.op === \"is-human\" || rule.op === \"account-older-than\") {\n      const user = await resolveUser(left, ctx);\n      if (user === null) return false;\n      if (rule.op === \"is-bot\") return user.bot;\n      if (rule.op === \"is-human\") return !user.bot;\n      return Date.now() - user.createdTimestamp > Number(right) * 86_400_000;\n    }\n    const member = await resolveMember(left, ctx);\n    if (member === null) return false;\n    switch (rule.op) {\n      case \"has-role\":\n      case \"not-has-role\": {\n        const role = await resolveRole(right, ctx);\n        const has = role !== null && member.roles.cache.has(role.id);\n        return rule.op === \"has-role\" ? has : !has;\n      }\n      case \"has-permission\":\n      case \"not-has-permission\": {\n        const bit = PermissionFlagsBits[right.trim() as keyof typeof PermissionFlagsBits];\n        if (bit === undefined) return false;\n        const has = member.permissions.has(bit);\n        return rule.op === \"has-permission\" ? has : !has;\n      }\n      case \"is-owner\":\n        return member.guild.ownerId === member.id;\n      case \"is-booster\":\n        return member.premiumSince !== null;\n      case \"joined-more-than\":\n        return member.joinedTimestamp !== null && Date.now() - member.joinedTimestamp > Number(right) * 86_400_000;\n      default:\n        return false;\n    }\n  }\n\n  /* ---------------------------- helpers ----------------------------- */\n\n  /** channel id → the \"Bottly\" webhook this bot owns there (Send as Webhook). */\n  private webhooks = new Map<string, Webhook>();\n\n  private async channelWebhook(\n    channel: Extract<GuildBasedChannel, { fetchWebhooks: unknown }>,\n    ctx: RunContext,\n  ): Promise<Webhook> {\n    const cached = this.webhooks.get(channel.id);\n    if (cached !== undefined) return cached;\n    const botId = ctx.client.user?.id;\n    const hooks = await channel.fetchWebhooks();\n    const existing = hooks.find(\n      (hook) => hook.name === \"Bottly\" && hook.owner?.id === botId && hook.token !== null,\n    ) as Webhook | undefined;\n    const hook =\n      existing ?? ((await channel.createWebhook({ name: \"Bottly\", reason: \"Send as Webhook block\" })) as Webhook);\n    this.webhooks.set(channel.id, hook);\n    return hook;\n  }\n\n  /** Sends a generated file: to the block's channel, or as the answer when it is blank. */\n  private async sendFile(\n    node: CompiledNode,\n    ctx: RunContext,\n    data: Buffer,\n    name: string,\n    label: string,\n  ): Promise<void> {\n    const content = cfg(node, \"content\", ctx).slice(0, 2000);\n    const payload: FlowPayload = {\n      ...(content === \"\" ? {} : { content }),\n      files: [new AttachmentBuilder(data, { name })],\n      allowedMentions: mentionsFor(node),\n    };\n    const raw = cfg(node, \"channel\", ctx);\n    if (raw === \"\") {\n      await this.respond(ctx, payload, false);\n      return;\n    }\n    const channel = await resolveChannel(raw, ctx);\n    if (channel === null || !(\"send\" in channel)) throw new Error(`${label} could not find that channel.`);\n    await channel.send(payload as MessageCreateOptions);\n    ctx.sentToChannel = true;\n  }\n\n  /** guild id → when the full member list was last fetched. */\n  private readonly membersFetchedAt = new Map<string, number>();\n\n  /**\n   * Members with a role. The full list is fetched (gateway opcode 8, which\n   * Discord rate-limits) at most every 10 minutes per server; the member\n   * cache, kept up to date by the GuildMembers intent, answers in between.\n   */\n  private async roleMemberCount(guild: Guild, role: Role): Promise<number> {\n    const last = this.membersFetchedAt.get(guild.id) ?? 0;\n    if (Date.now() - last > 10 * 60_000 && guild.members.cache.size < guild.memberCount) {\n      try {\n        await guild.members.fetch();\n        this.membersFetchedAt.set(guild.id, Date.now());\n      } catch (error) {\n        logger.debug(`Member list fetch skipped: ${describeError(error)}`);\n      }\n    }\n    return role.members.size;\n  }\n\n  private requireGuild(ctx: RunContext, label: string): Guild {\n    if (ctx.guild === null) throw new Error(`${label} can only run inside a server.`);\n    return ctx.guild;\n  }\n\n  private async requireMember(\n    node: CompiledNode,\n    ctx: RunContext,\n    label: string,\n  ): Promise<GuildMember> {\n    this.requireGuild(ctx, label);\n    const member = await resolveMember(cfg(node, \"user\", ctx), ctx);\n    if (member === null) throw new Error(`${label} could not resolve that member.`);\n    return member;\n  }\n\n  /** The message a node acts on: an explicit ID, or the message that triggered the run. */\n  private async resolveTargetMessage(\n    node: CompiledNode,\n    ctx: RunContext,\n    label: string,\n  ): Promise<Message> {\n    const id = cfg(node, \"messageId\", ctx);\n    if (id === \"\") {\n      if (ctx.message === null)\n        throw new Error(`${label} needs a message context or a message ID.`);\n      return ctx.message;\n    }\n    const channel = ctx.channel ?? ctx.message?.channel ?? null;\n    if (channel === null || !(\"messages\" in channel)) {\n      throw new Error(`${label} needs a text channel context.`);\n    }\n    return await channel.messages.fetch(id);\n  }\n\n  /** reply → followUp → channel.send, matching what Discord allows at that point. */\n  /* ----------------------------- Bot images ----------------------------- */\n\n  /**\n   * Renders the bot images a message block attaches (config \"images\": ids,\n   * comma separated) with this run's variables and adds them as files.\n   * Components V2 messages only show files they reference, so images not\n   * already used as attachment://name get a media gallery at the end.\n   */\n  private async withImages(\n    payload: FlowPayload,\n    node: CompiledNode,\n    ctx: RunContext,\n  ): Promise<FlowPayload> {\n    const ids = String(node.config[\"images\"] ?? \"\")\n      .split(\",\")\n      .map((id) => id.trim())\n      .filter(Boolean)\n      .slice(0, 4);\n    if (ids.length === 0) return payload;\n    const files: AttachmentBuilder[] = [];\n    const names = new Set<string>();\n    for (const id of ids) {\n      const image = this.images[id];\n      if (!image) throw new Error(\"An attached bot image was deleted. Pick it again in the message block.\");\n      let name = imageFileName(image.name);\n      for (let i = 2; names.has(name); i++) name = imageFileName(`${image.name} ${i}`);\n      names.add(name);\n      const png = await renderBotImage(\n        image.design,\n        (token) => this.imageText(token, ctx),\n        (token) => this.imagePicture(token, ctx),\n        async (url) => (await safeDownload(url, 8_000_000)).data,\n        (path) => new URL(path, config.controlPlaneUrl).toString(),\n      );\n      files.push(new AttachmentBuilder(png, { name }));\n    }\n    const out: FlowPayload = { ...payload, files };\n    if (payload.flags && (payload.flags & IS_COMPONENTS_V2) !== 0) {\n      const used = JSON.stringify(payload.components ?? []);\n      const unused = [...names].filter((n) => !used.includes(`attachment://${n}`));\n      if (unused.length > 0)\n        out.components = [\n          ...(payload.components ?? []),\n          {\n            toJSON: () => ({\n              type: 12,\n              items: unused.map((n) => ({ media: { url: `attachment://${n}` } })),\n            }),\n          } as RawJson,\n        ];\n    } else if (out.content === \"\\u200b\") {\n      delete out.content;\n    }\n    return out;\n  }\n\n  /** A text variable as it should read on a picture: names, not mentions. */\n  private imageText(token: string, ctx: RunContext): string {\n    const stored = ctx.vars.get(token);\n    if (stored !== undefined) return stored;\n    const user = ctx.user;\n    switch (token) {\n      case \"user\":\n      case \"user.displayName\":\n        return ctx.member?.displayName ?? user?.displayName ?? user?.username ?? \"\";\n      case \"author\":\n        return user?.displayName ?? user?.username ?? \"\";\n      case \"server\":\n        return ctx.guild?.name ?? \"\";\n      case \"server.memberCount\":\n        return ctx.guild ? ctx.guild.memberCount.toLocaleString(\"en-US\") : \"\";\n      case \"server.memberOrdinal\":\n        return ctx.guild ? ordinal(ctx.guild.memberCount) : \"\";\n      case \"channel\":\n        return ctx.channel && \"name\" in ctx.channel ? `#${String(ctx.channel.name ?? \"\")}` : \"\";\n      case \"date\":\n        return new Date().toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\", year: \"numeric\" });\n      default:\n        return builtinVariable(token, ctx) ?? \"\";\n    }\n  }\n\n  /** A picture variable's URL (PNG, so the renderer can decode it). */\n  private imagePicture(token: string, ctx: RunContext): string {\n    switch (token) {\n      case \"user.avatar\": {\n        const member = ctx.member;\n        if (member) return member.displayAvatarURL({ extension: \"png\", size: 256 });\n        return ctx.user?.displayAvatarURL({ extension: \"png\", size: 256 }) ?? \"\";\n      }\n      case \"server.icon\":\n        return ctx.guild?.iconURL({ extension: \"png\", size: 256 }) ?? \"\";\n      default: {\n        const value = ctx.vars.get(token) ?? builtinVariable(token, ctx) ?? \"\";\n        return /^https:\\/\\//.test(value) ? value : \"\";\n      }\n    }\n  }\n\n  private async respond(ctx: RunContext, payload: FlowPayload, ephemeral: boolean): Promise<void> {\n    const interaction = ctx.interaction;\n\n    if (interaction !== null) {\n      if (ctx.modalShown) {\n        throw new Error(\n          \"This interaction was answered with a modal. Reply in the flow of its Modal Submit trigger instead.\",\n        );\n      }\n      const body = {\n        ...payload,\n        flags: (payload.flags ?? 0) | (ephemeral ? MessageFlags.Ephemeral : 0),\n      } as InteractionReplyOptions;\n      if (interaction.deferred && !interaction.replied && !ctx.updating) {\n        await interaction.editReply(editBody(payload) as MessageEditOptions);\n      } else if (interaction.replied || ctx.acknowledged) {\n        await interaction.followUp(body);\n      } else {\n        await interaction.reply(body);\n      }\n      ctx.acknowledged = true;\n      return;\n    }\n\n    if (ctx.message !== null) {\n      await ctx.message.reply(payload as MessageCreateOptions);\n      return;\n    }\n\n    if (ctx.channel !== null && \"send\" in ctx.channel) {\n      await ctx.channel.send(payload as MessageCreateOptions);\n      return;\n    }\n\n    throw new Error(\"Reply has no interaction, message or channel to answer in.\");\n  }\n\n  /* --------------------------- Sticky Message --------------------------- */\n\n  private async storedStickyId(channelId: string): Promise<string | null> {\n    if (!this.botId || !this.userId) return null;\n    const res = await storageRequest(this.botId, this.userId, {\n      op: \"find\",\n      table: \"sticky_messages\",\n      where: { field: \"channel\", value: channelId },\n    });\n    const id = res.ok ? res.rows?.[0]?.[\"message\"] : undefined;\n    return typeof id === \"string\" && id ? id : null;\n  }\n\n  /** Deletes the channel's previous sticky, posts the new one and remembers its id. */\n  private async repostSticky(channel: TextBasedChannel, payload: FlowPayload): Promise<string> {\n    if (!(\"send\" in channel)) throw new Error(\"Stickies need a text channel.\");\n    const previous = this.stickyIds.get(channel.id) ?? (await this.storedStickyId(channel.id));\n    if (previous) await channel.messages.delete(previous).catch(() => undefined);\n    const sent = await channel.send(payload as MessageCreateOptions);\n    this.stickyIds.set(channel.id, sent.id);\n    if (this.stickyIds.size > 5000) this.stickyIds.delete(this.stickyIds.keys().next().value as string);\n    if (this.botId && this.userId) {\n      const where = { field: \"channel\", value: channel.id };\n      const updated = previous\n        ? await storageRequest(this.botId, this.userId, { op: \"update\", table: \"sticky_messages\", where, data: { message: sent.id } })\n        : { ok: false };\n      if (!updated.ok)\n        await storageRequest(this.botId, this.userId, {\n          op: \"save\",\n          table: \"sticky_messages\",\n          data: { channel: channel.id, message: sent.id },\n        });\n    }\n    return sent.id;\n  }\n\n  /* ------------------------------ Feeds ------------------------------ */\n\n  /** Starts a poll per feed trigger type in the deployment, stops the unused ones. */\n  private startFeeds(requested: Set<string>): void {\n    const periods: Record<string, number> = {\n      \"youtube-new-video\": 5 * 60_000,\n      \"twitch-live\": 2 * 60_000,\n      \"bluesky-new-post\": 3 * 60_000,\n      \"rss-new-item\": 10 * 60_000,\n    };\n    for (const [type, period] of Object.entries(periods)) {\n      const timer = this.feedTimers.get(type);\n      if (!requested.has(type)) {\n        if (timer) clearInterval(timer);\n        this.feedTimers.delete(type);\n        continue;\n      }\n      if (timer) continue;\n      const tick = () => void this.pollFeed(type).catch((error) => logger.warn(`${type} poll failed: ${describeError(error)}`));\n      const next = setInterval(tick, period);\n      next.unref();\n      this.feedTimers.set(type, next);\n      // Seed soon after start, so items published from now on are announced.\n      setTimeout(tick, 5_000).unref();\n    }\n  }\n\n  /** \"{env.X}\" in a feed trigger's source, then one source per comma or line. */\n  private feedSources(trigger: CompiledTrigger): string[] {\n    const raw = text(trigger.config[\"source\"]).replace(/\\{env\\.([A-Za-z0-9_]+)\\}/g, (_, k: string) => this.env[k] ?? \"\");\n    return [...new Set(raw.split(/[,\\n]+/).map((v) => v.trim()).filter(Boolean))].slice(0, 25);\n  }\n\n  private async pollFeed(type: string): Promise<void> {\n    const triggers = this.flows.flatMap((f) => f.triggers).filter((t) => t.type === type);\n    const sources = [...new Set(triggers.flatMap((t) => this.feedSources(t)))];\n    if (sources.length === 0) return;\n    const prefix = { \"youtube-new-video\": \"video\", \"twitch-live\": \"stream\", \"bluesky-new-post\": \"post\", \"rss-new-item\": \"item\" }[type] ?? \"item\";\n\n    const batches: { source: string; items: FeedItem[]; extra?: Record<string, string> }[] = [];\n    if (type === \"twitch-live\") {\n      const keys = this.plugins[\"twitch\"];\n      if (!keys?.[\"clientId\"] || !keys[\"clientSecret\"]) {\n        logger.warn(\"Twitch plugin: add your Client ID and secret in the plugin settings.\");\n        return;\n      }\n      const live = await twitchStreams(sources, keys[\"clientId\"], keys[\"clientSecret\"]);\n      for (const source of sources) {\n        const login = source.toLowerCase().replace(/^https?:\\/\\/(www\\.)?twitch\\.tv\\//, \"\").replace(/^@/, \"\").split(/[/?]/)[0]!;\n        batches.push({ source, items: live.filter((s) => s.vars[\"login\"] === login) });\n      }\n    } else {\n      for (const source of sources) {\n        try {\n          if (type === \"youtube-new-video\") batches.push({ source, items: await youtubeVideos(source) });\n          else if (type === \"bluesky-new-post\") batches.push({ source, items: await blueskyPosts(source) });\n          else {\n            const feed = await fetchRss(source);\n            batches.push({ source, items: feed.items, extra: { \"feed.title\": feed.title } });\n          }\n        } catch (error) {\n          logger.warn(`${type} ${source}: ${describeError(error)}`);\n        }\n      }\n    }\n\n    for (const { source, items, extra } of batches) {\n      const key = `${type}|${source}`;\n      const seen = this.feedSeen.get(key);\n      if (seen === undefined) {\n        // First look: remember what exists, never replay it.\n        this.feedSeen.set(key, new Set(items.map((i) => i.id)));\n        continue;\n      }\n      // Oldest first, at most 5 per poll so a returning feed cannot flood a channel.\n      const fresh = items.filter((i) => !seen.has(i.id)).reverse().slice(-5);\n      for (const item of items) seen.add(item.id);\n      while (seen.size > 500) seen.delete(seen.values().next().value as string);\n      for (const item of fresh) {\n        await this.dispatch(\n          (trigger) => trigger.type === type && this.feedSources(trigger).includes(source),\n          (ctx) => {\n            for (const [k, v] of Object.entries(item.vars)) ctx.vars.set(`${prefix}.${k}`, v);\n            for (const [k, v] of Object.entries(extra ?? {})) ctx.vars.set(k, v);\n            ctx.vars.set(`${prefix}.source`, source);\n          },\n          {},\n        );\n      }\n    }\n  }\n\n  /* --------------------------- SellAuth API --------------------------- */\n\n  private async sellauth(path: string): Promise<Record<string, unknown> | null> {\n    const sa = this.plugins[\"sellauth\"];\n    if (!sa?.[\"apiKey\"] || !sa[\"shopId\"]) {\n      throw new Error(\"Turn on the SellAuth plugin and add your API key + shop ID.\");\n    }\n    const res = await fetch(`https://api.sellauth.com/v1/shops/${encodeURIComponent(sa[\"shopId\"])}${path}`, {\n      headers: { Authorization: `Bearer ${sa[\"apiKey\"]}`, Accept: \"application/json\" },\n      signal: AbortSignal.timeout(15_000),\n    });\n    if (!res.ok) {\n      // A wrong key or an outage must not look like \"invoice not found\" in the logs.\n      if (res.status !== 404) logger.warn(`SellAuth ${path} failed: ${sellauthError(res.status, await res.text().catch(() => \"\"))}`);\n      return null;\n    }\n    const body = (await res.json().catch(() => null)) as Record<string, unknown> | null;\n    if (!body) return null;\n    const inner = body[\"data\"];\n    return typeof inner === \"object\" && inner !== null && !Array.isArray(inner)\n      ? (inner as Record<string, unknown>)\n      : body;\n  }\n\n  private async sellauthRaw(method: string, path: string, body?: Record<string, unknown>): Promise<{ ok: boolean; status: number; body: unknown }> {\n    const sa = this.plugins[\"sellauth\"];\n    if (!sa?.[\"apiKey\"] || !sa[\"shopId\"]) {\n      throw new Error(\"Turn on the SellAuth plugin and add your API key + shop ID.\");\n    }\n    const res = await fetch(`https://api.sellauth.com/v1/shops/${encodeURIComponent(sa[\"shopId\"])}${path}`, {\n      method,\n      headers: {\n        Authorization: `Bearer ${sa[\"apiKey\"]}`,\n        Accept: \"application/json\",\n        ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n      },\n      ...(body ? { body: JSON.stringify(body) } : {}),\n      signal: AbortSignal.timeout(15_000),\n    });\n    const raw = await res.text();\n    let parsed: unknown = raw;\n    try { parsed = raw ? JSON.parse(raw) : null; } catch { /* keep text */ }\n    return { ok: res.ok, status: res.status, body: parsed };\n  }\n\n  /* --------------------------- SellAuth poll --------------------------- */\n\n  private startSellAuthPoll(): void {\n    const tick = async () => {\n      const sa = this.plugins[\"sellauth\"];\n      if (!sa?.[\"apiKey\"] || !sa[\"shopId\"]) return;\n      try {\n        const res = await fetch(\n          `https://api.sellauth.com/v1/shops/${encodeURIComponent(sa[\"shopId\"])}/invoices?perPage=20&orderColumn=id&orderDirection=desc`,\n          { headers: { Authorization: `Bearer ${sa[\"apiKey\"]}`, Accept: \"application/json\" }, signal: AbortSignal.timeout(15_000) },\n        );\n        if (!res.ok) return;\n        const body = (await res.json()) as { data?: Record<string, unknown>[] } | Record<string, unknown>[];\n        const list = Array.isArray(body) ? body : (body.data ?? []);\n        const completed = list.filter((i) => String(i[\"status\"] ?? \"\") === \"completed\");\n        if (this.sellauthSeen === null) {\n          // First run: remember existing invoices, never replay old orders.\n          this.sellauthSeen = new Set(completed.map((i) => String(i[\"id\"])));\n          return;\n        }\n        for (const inv of completed.reverse()) {\n          const id = String(inv[\"id\"]);\n          if (this.sellauthSeen.has(id)) continue;\n          this.sellauthSeen.add(id);\n          // Only the latest 20 invoices are polled; keep memory bounded on long-running bots.\n          if (this.sellauthSeen.size > 1000) this.sellauthSeen.delete(this.sellauthSeen.values().next().value as string);\n          const vars = invoiceVars(\"invoice\", inv);\n          await this.dispatch(\n            (trigger) => trigger.type === \"sellauth-new-order\",\n            (ctx) => {\n              for (const [k, v] of Object.entries(vars)) ctx.vars.set(k, v);\n            },\n            {},\n          );\n        }\n      } catch (error) {\n        logger.warn(`SellAuth poll failed: ${describeError(error)}`);\n      }\n    };\n    void tick();\n    this.sellauthTimer = setInterval(() => void tick(), 60_000);\n    this.sellauthTimer.unref();\n  }\n\n  /* ------------------------------ cron ------------------------------ */\n\n  private startCron(): void {\n    this.cronTimer = setInterval(() => {\n      const now = new Date();\n      const minute = `${now.getUTCFullYear()}-${now.getUTCMonth()}-${now.getUTCDate()}-${now.getUTCHours()}-${now.getUTCMinutes()}`;\n      if (minute === this.lastCronMinute) return;\n      this.lastCronMinute = minute;\n\n      void this.runTriggers(\n        \"scheduled-event\",\n        (trigger) => cronMatches(text(trigger.config[\"cron\"]), now, text(trigger.config[\"timezone\"]).trim()),\n        {},\n      );\n    }, 30_000);\n    this.cronTimer.unref();\n  }\n}\n\n/* ------------------------------------------------------------------ *\n * Small pure helpers\n * ------------------------------------------------------------------ */\n\nfunction channelTypeFor(\n  value: string,\n):\n  | ChannelType.GuildText\n  | ChannelType.GuildVoice\n  | ChannelType.GuildCategory\n  | ChannelType.GuildAnnouncement\n  | ChannelType.GuildStageVoice\n  | ChannelType.GuildForum {\n  switch (value) {\n    case \"voice\":\n      return ChannelType.GuildVoice;\n    case \"category\":\n      return ChannelType.GuildCategory;\n    case \"announcement\":\n      return ChannelType.GuildAnnouncement;\n    case \"stage\":\n      return ChannelType.GuildStageVoice;\n    case \"forum\":\n      return ChannelType.GuildForum;\n    default:\n      return ChannelType.GuildText;\n  }\n}\n\nfunction presenceStatus(value: string): PresenceStatusData {\n  switch (value) {\n    case \"idle\":\n      return \"idle\";\n    case \"dnd\":\n      return \"dnd\";\n    case \"invisible\":\n      return \"invisible\";\n    default:\n      return \"online\";\n  }\n}\n\nfunction activityTypeFor(\n  value: string,\n):\n  | ActivityType.Playing\n  | ActivityType.Streaming\n  | ActivityType.Watching\n  | ActivityType.Listening\n  | ActivityType.Competing\n  | ActivityType.Custom {\n  switch (value) {\n    case \"streaming\":\n      return ActivityType.Streaming;\n    case \"watching\":\n      return ActivityType.Watching;\n    case \"listening\":\n      return ActivityType.Listening;\n    case \"competing\":\n      return ActivityType.Competing;\n    case \"custom\":\n      return ActivityType.Custom;\n    default:\n      return ActivityType.Playing;\n  }\n}\n\nfunction findGuildChannel(guild: Guild, raw: string): GuildBasedChannel | null {\n  const id = extractId(raw);\n  if (id !== null) return guild.channels.cache.get(id) ?? null;\n  const name = raw.replace(/^#/, \"\").toLowerCase();\n  return guild.channels.cache.find((channel) => channel.name.toLowerCase() === name) ?? null;\n}\n\nfunction currentGuildChannel(guild: Guild, ctx: RunContext): GuildBasedChannel | null {\n  const id = ctx.channel?.id;\n  return id === undefined ? null : (guild.channels.cache.get(id) ?? null);\n}\n\nfunction findCategory(guild: Guild, raw: string): GuildBasedChannel | null {\n  const id = extractId(raw);\n  const name = raw.replace(/^#/, \"\").trim().toLowerCase();\n  return (\n    guild.channels.cache.find(\n      (channel) =>\n        channel.type === ChannelType.GuildCategory && (channel.id === id || channel.name.toLowerCase() === name),\n    ) ?? null\n  );\n}\n\n/** Read Recent Messages: the newest lines win when the text is over 4000 characters. */\nfunction historyText(lines: string[]): string {\n  const kept: string[] = [];\n  let size = 0;\n  for (let i = lines.length - 1; i >= 0; i--) {\n    const line = lines[i] as string;\n    if (size + line.length + 1 > 4000) {\n      if (kept.length === 0) kept.unshift(line.slice(-4000));\n      break;\n    }\n    kept.unshift(line);\n    size += line.length + 1;\n  }\n  return kept.join(\"\\n\");\n}\n\n/** Back Up Server: roles and channels with permissions by role name (Apply Server Template reads it back). */\nfunction serverBackup(guild: Guild) {\n  const roleName = (id: string) => (id === guild.id ? \"@everyone\" : (guild.roles.cache.get(id)?.name ?? null));\n  const overwrites = (channel: GuildBasedChannel) =>\n    \"permissionOverwrites\" in channel\n      ? [...channel.permissionOverwrites.cache.values()]\n          .filter((o) => o.type === OverwriteType.Role && roleName(o.id) !== null)\n          .map((o) => ({ role: roleName(o.id) as string, allow: o.allow.toArray(), deny: o.deny.toArray() }))\n      : [];\n  const visibility = (list: ReturnType<typeof overwrites>) => {\n    const hidden = list.find((o) => o.role === \"@everyone\")?.deny.includes(\"ViewChannel\") ?? false;\n    return {\n      private: hidden,\n      allowRoles: hidden\n        ? list.filter((o) => o.role !== \"@everyone\" && o.allow.includes(\"ViewChannel\")).map((o) => o.role)\n        : [],\n    };\n  };\n  const typeName = (type: ChannelType) =>\n    type === ChannelType.GuildVoice\n      ? \"voice\"\n      : type === ChannelType.GuildAnnouncement\n        ? \"announcement\"\n        : type === ChannelType.GuildForum\n          ? \"forum\"\n          : type === ChannelType.GuildStageVoice\n            ? \"stage\"\n            : \"text\";\n  const position = (channel: GuildBasedChannel) => (\"rawPosition\" in channel ? channel.rawPosition : 0);\n  const all = [...guild.channels.cache.values()]\n    .filter((c) => !c.isThread())\n    .sort((a, b) => position(a) - position(b));\n  const entry = (channel: GuildBasedChannel) => {\n    const list = overwrites(channel);\n    return {\n      name: channel.name,\n      type: typeName(channel.type),\n      topic: \"topic\" in channel && typeof channel.topic === \"string\" ? channel.topic : \"\",\n      ...visibility(list),\n      overwrites: list,\n    };\n  };\n  return {\n    format: \"bottly-server-backup\",\n    version: 1,\n    server: { id: guild.id, name: guild.name },\n    createdAt: new Date().toISOString(),\n    everyonePermissions: guild.roles.everyone.permissions.toArray(),\n    roles: [...guild.roles.cache.values()]\n      .filter((role) => role.id !== guild.id && !role.managed)\n      .sort((a, b) => b.position - a.position)\n      .map((role) => ({\n        name: role.name,\n        color: role.hexColor === \"#000000\" ? \"\" : role.hexColor,\n        hoist: role.hoist,\n        mentionable: role.mentionable,\n        permissions: role.permissions.toArray(),\n      })),\n    categories: all\n      .filter((c) => c.type === ChannelType.GuildCategory)\n      .map((category) => {\n        const list = overwrites(category);\n        return {\n          name: category.name,\n          ...visibility(list),\n          overwrites: list,\n          channels: all\n            .filter((c) => c.type !== ChannelType.GuildCategory && c.parentId === category.id)\n            .map(entry),\n        };\n      }),\n    channels: all.filter((c) => c.type !== ChannelType.GuildCategory && c.parentId === null).map(entry),\n  };\n}\n\nfunction messageChannelMatches(filter: string, message: Message): boolean {\n  const wanted = filter.trim();\n  if (wanted === \"\") return true;\n  const id = extractId(wanted);\n  if (id !== null) return message.channelId === id;\n  const name = wanted.replace(/^#/, \"\").toLowerCase();\n  return \"name\" in message.channel && String(message.channel.name ?? \"\").toLowerCase() === name;\n}\n\nfunction voiceChannelMatches(\n  filter: string,\n  channel: { id: string; name: string } | null,\n): boolean {\n  const wanted = filter.trim();\n  if (wanted === \"\") return true;\n  if (channel === null) return false;\n  const id = extractId(wanted);\n  if (id !== null) return channel.id === id;\n  return channel.name.toLowerCase() === wanted.replace(/^#/, \"\").toLowerCase();\n}\n\nfunction interactionContext(\n  interaction: RepliableInteraction,\n): Partial<Omit<RunContext, \"client\" | \"flow\" | \"vars\" | \"steps\" | \"acknowledged\">> {\n  return {\n    interaction,\n    guild: interaction.guild,\n    member:\n      interaction.member instanceof Object && \"roles\" in interaction.member\n        ? (interaction.member as GuildMember)\n        : null,\n    user: interaction.user,\n    channel: interaction.channel,\n    message: \"message\" in interaction ? ((interaction.message as Message | null) ?? null) : null,\n  };\n}\n\n/**\n * Does a reaction match the configured emoji(s)? \"\" matches every reaction;\n * several emojis may be listed; custom emojis match by name or ID.\n */\nexport function matchesEmoji(configured: string, actual: string, actualId: string | null = null): boolean {\n  const wanted = configured.trim();\n  if (wanted === \"\") return true;\n  if (actualId && wanted.includes(actualId)) return true;\n  if (actual === \"\") return false;\n  return wanted === actual || wanted.includes(actual);\n}\n\nfunction channelVars(channel: { id: string; type: number; name?: string | null }): Record<string, string> {\n  return {\n    channel: `<#${channel.id}>`,\n    \"channel.id\": channel.id,\n    \"channel.name\": channel.name ?? \"\",\n    \"channel.type\": ChannelType[channel.type] ?? String(channel.type),\n  };\n}\n\nfunction guildEventVars(event: GuildScheduledEvent | PartialGuildScheduledEvent): Record<string, string> {\n  const start = event.scheduledStartTimestamp ? Math.floor(event.scheduledStartTimestamp / 1000) : null;\n  return {\n    \"event.id\": event.id,\n    \"event.name\": event.name ?? \"\",\n    \"event.description\": event.description ?? \"\",\n    \"event.url\": event.url,\n    \"event.start\": start ? `<t:${start}:F>` : \"\",\n    \"event.startRelative\": start ? `<t:${start}:R>` : \"\",\n    \"event.location\": event.entityMetadata?.location ?? (event.channelId ? `<#${event.channelId}>` : \"\"),\n  };\n}\n\nfunction roleVars(role: Role): Record<string, string> {\n  return {\n    role: `<@&${role.id}>`,\n    \"role.id\": role.id,\n    \"role.name\": role.name,\n    \"role.color\": role.hexColor,\n  };\n}\n\nfunction durationToMs(value: string): number | null {\n  const match = /^(\\d+)(s|m|h|d)$/.exec(value.trim());\n  if (match === null) return null;\n  const amount = Number(match[1]);\n  switch (match[2]) {\n    case \"s\":\n      return amount * 1_000;\n    case \"m\":\n      return amount * 60_000;\n    case \"h\":\n      return amount * 3_600_000;\n    case \"d\":\n      return amount * 86_400_000;\n    default:\n      return null;\n  }\n}\n\nfunction deleteHistorySeconds(value: string): number {\n  switch (value) {\n    case \"1h\":\n      return 3_600;\n    case \"1d\":\n      return 86_400;\n    case \"7d\":\n      return 604_800;\n    default:\n      return 0;\n  }\n}\n\n/**\n * Cron matcher: `minute hour day month weekday` with *, numbers, lists,\n * ranges and steps, evaluated in UTC or in an IANA time zone.\n */\nexport function cronMatches(expression: string, date: Date, timeZone = \"\"): boolean {\n  let parts = {\n    minute: date.getUTCMinutes(),\n    hour: date.getUTCHours(),\n    day: date.getUTCDate(),\n    month: date.getUTCMonth() + 1,\n    weekday: date.getUTCDay(),\n  };\n  if (timeZone !== \"\") {\n    try {\n      const fmt = new Intl.DateTimeFormat(\"en-US\", {\n        timeZone,\n        hourCycle: \"h23\",\n        minute: \"numeric\",\n        hour: \"numeric\",\n        day: \"numeric\",\n        month: \"numeric\",\n        weekday: \"short\",\n      }).formatToParts(date);\n      const get = (type: string) => fmt.find((p) => p.type === type)?.value ?? \"\";\n      parts = {\n        minute: Number(get(\"minute\")),\n        hour: Number(get(\"hour\")) % 24,\n        day: Number(get(\"day\")),\n        month: Number(get(\"month\")),\n        weekday: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].indexOf(get(\"weekday\")),\n      };\n    } catch {\n      return false; // unknown time zone\n    }\n  }\n  return cronFieldsMatch(expression, [parts.minute, parts.hour, parts.day, parts.month, parts.weekday]);\n}\n\n/** \"key=value\" lines -> record, values interpolated. */\nfunction parseFields(raw: string, ctx: RunContext): Record<string, string> {\n  const out: Record<string, string> = {};\n  for (const line of raw.split(\"\\n\")) {\n    const i = line.indexOf(\"=\");\n    if (i <= 0) continue;\n    const key = line.slice(0, i).trim();\n    if (!/^[a-zA-Z0-9_]{1,40}$/.test(key)) continue;\n    out[key] = interpolate(line.slice(i + 1).trim(), ctx);\n  }\n  return out;\n}\n\n/** Flattens a SellAuth invoice into {prefix.*} flow variables. */\n\nfunction saText(value: unknown): string {\n  if (value === null || value === undefined) return \"\";\n  if (typeof value === \"object\") return JSON.stringify(value).slice(0, 1800);\n  return String(value);\n}\n\nfunction saFlatten(prefix: string, obj: Record<string, unknown>, out: Record<string, string>, depth = 0): void {\n  for (const [k, v] of Object.entries(obj)) {\n    out[`${prefix}.${k}`] = saText(v);\n    if (depth < 1 && v && typeof v === \"object\" && !Array.isArray(v)) saFlatten(`${prefix}.${k}`, v as Record<string, unknown>, out, depth + 1);\n  }\n}\n\nfunction saLabel(item: Record<string, unknown>): string {\n  const id = item[\"id\"] ?? item[\"unique_id\"] ?? \"\";\n  const name = item[\"name\"] ?? item[\"code\"] ?? item[\"email\"] ?? item[\"subject\"] ?? (item[\"product\"] as { name?: string } | undefined)?.name ?? \"\";\n  const extra = item[\"status\"] ?? item[\"price\"] ?? item[\"stock_count\"] ?? item[\"balance\"] ?? \"\";\n  return [id !== \"\" ? `#${id}` : \"\", name, extra].filter((p) => String(p) !== \"\").join(\" · \");\n}\n\n/** Expose a SellAuth response as flow variables, matching the API body 1:1. */\nexport function sellauthVars(key: string, status: number, body: unknown, isList: boolean): Record<string, string> {\n  const out: Record<string, string> = { [`${key}.status`]: String(status), [`${key}.json`]: saText(body), [`${key}.error`]: \"\" };\n  if (!body || typeof body !== \"object\") return out;\n  const root = body as Record<string, unknown>;\n  const data = Array.isArray(body) ? body : root[\"data\"];\n  if (Array.isArray(data) || isList) {\n    const list = (Array.isArray(data) ? data : []) as Record<string, unknown>[];\n    out[`${key}.count`] = String(list.length);\n    out[`${key}.total`] = String(root[\"total\"] ?? (root[\"meta\"] as { total?: number } | undefined)?.total ?? list.length);\n    out[`${key}.list`] = list.slice(0, 15).map((i) => `• ${saLabel(i)}`).join(\"\\n\") || \"Nothing found.\";\n    if (list[0]) saFlatten(`${key}.first`, list[0], out);\n    if (!Array.isArray(body)) saFlatten(key, Object.fromEntries(Object.entries(root).filter(([k]) => k !== \"data\")), out);\n    return out;\n  }\n  const obj = data && typeof data === \"object\" ? (data as Record<string, unknown>) : root;\n  saFlatten(key, obj, out);\n  if (obj !== root) saFlatten(key, Object.fromEntries(Object.entries(root).filter(([k]) => k !== \"data\")), out);\n  return out;\n}\n\nfunction sellauthError(status: number, body: unknown): string {\n  // SellAuth answers { message } (most errors), { error } (e.g. invoice processing) or { errors: { field: [..] } }.\n  const obj = body && typeof body === \"object\" ? (body as { message?: unknown; error?: unknown; errors?: Record<string, unknown> }) : null;\n  const firstError = obj?.errors && typeof obj.errors === \"object\" ? Object.values(obj.errors).flat()[0] : undefined;\n  const msg = obj\n    ? [obj.message, obj.error, firstError].find((v): v is string => typeof v === \"string\" && v !== \"\") ?? \"\"\n    : typeof body === \"string\" ? body.slice(0, 200) : \"\";\n  if (status === 401) return \"SellAuth rejected the API key.\";\n  if (status === 404) return msg || \"Not found on SellAuth.\";\n  if (status === 429) return \"SellAuth rate limit — try again shortly.\";\n  return msg || `SellAuth request failed (${status}).`;\n}\n\nfunction invoiceVars(prefix: string, inv: Record<string, unknown>): Record<string, string> {\n  const product =\n    (inv[\"product\"] as { name?: string } | undefined)?.name ??\n    ((inv[\"items\"] as { product?: { name?: string } }[] | undefined)?.[0]?.product?.name ?? \"\");\n  return {\n    [prefix]: String(inv[\"id\"] ?? \"\"),\n    [`${prefix}.id`]: String(inv[\"id\"] ?? \"\"),\n    [`${prefix}.status`]: String(inv[\"status\"] ?? \"\"),\n    [`${prefix}.email`]: String(inv[\"email\"] ?? \"\"),\n    [`${prefix}.total`]: String(inv[\"price\"] ?? inv[\"total\"] ?? \"\"),\n    [`${prefix}.product`]: String(product),\n  };\n}\n","runtime/src/flow-contract.ts":"/* AUTO-GENERATED FILE — do not edit.\n * Source: src/lib/flow/contract.ts (web app)\n * Regenerate: npm run sync:contract (inside runtime/)\n */\n/**\n * SHARED FLOW CONTRACT — single source of truth for what a Bottly flow means.\n *\n * This file is deliberately dependency-free (no imports at all) because it is\n * copied verbatim into the bot runtime as `runtime/src/flow-contract.ts` by\n * `runtime/scripts/sync-contract.mjs`. Web app and runtime therefore validate\n * and interpret the exact same graph semantics.\n *\n * Pipeline:\n *   Flow Builder → Flow JSON → validateFlow() → compileFlow() → CompiledFlow\n *   → runtime executor → discord.js → Discord API\n *\n * Every node's discord.js mapping, required gateway intents and required bot\n * permissions are declared in NODE_SPECS below. Nodes marked \"unsupported\" are\n * NOT executed by the runtime and are reported as validation warnings — they\n * are never silently faked.\n */\n\nexport const FLOW_CONTRACT_VERSION = 1 as const;\n\n/* ------------------------------------------------------------------ *\n * Graph shapes (structurally identical to src/types/flow.ts)\n * ------------------------------------------------------------------ */\n\nexport type ConfigValue = string | number | boolean;\n\nexport interface RawFlowNode {\n  id: string;\n  /** Canvas position: several blocks on one output run left to right. */\n  position?: { x: number; y: number } | undefined;\n  data: {\n    type: string;\n    title?: string;\n    enabled?: boolean;\n    config?: Record<string, ConfigValue>;\n    embed?: unknown;\n    embeds?: unknown;\n    components?: unknown;\n    messageType?: \"embed\" | \"components\";\n    options?: unknown;\n  };\n}\n\nexport interface RawFlowEdge {\n  id: string;\n  source: string;\n  target: string;\n  sourceHandle?: string | null | undefined;\n  targetHandle?: string | null | undefined;\n}\n\nexport interface RawFlow {\n  id: string;\n  name: string;\n  description?: string;\n  nodes: RawFlowNode[];\n  edges: RawFlowEdge[];\n}\n\n/* ------------------------------------------------------------------ *\n * Node specifications\n * ------------------------------------------------------------------ */\n\n/** How faithfully the runtime implements a node against discord.js. */\nexport type NodeSupport = \"full\" | \"partial\" | \"unsupported\";\n\nexport type NodeKind = \"trigger\" | \"action\" | \"condition\";\n\n/**\n * Context a node needs from the event that started the flow.\n *  interaction  — a repliable interaction (slash/button/select/modal)\n *  message      — a Message object\n *  guild        — the event happened in a guild, not a DM\n *  member       — a GuildMember for the acting user\n */\nexport type ContextKind = \"interaction\" | \"message\" | \"guild\" | \"member\";\n\nexport interface NodeSpec {\n  kind: NodeKind;\n  support: NodeSupport;\n  /** The discord.js API this node actually calls. Documentation, not code. */\n  discord: string;\n  /** GatewayIntentBits names required for this node to work. */\n  intents: string[];\n  /** PermissionFlagsBits names the BOT needs in the guild. */\n  permissions: string[];\n  /** Context the node reads from the trigger. */\n  requires: ContextKind[];\n  /** Context a trigger provides to everything downstream. */\n  provides?: ContextKind[];\n  /** True when the node acknowledges a Discord interaction. */\n  acknowledges?: boolean;\n  /** Output handles, in the order the builder draws them. */\n  outputs: string[];\n  /** Config keys that must be non-empty. */\n  required?: string[];\n  /** Why the node is partial/unsupported. Surfaced in the builder. */\n  note?: string;\n}\n\nconst INTERACTION_CTX: ContextKind[] = [\"interaction\"];\n\nexport const NODE_SPECS: Record<string, NodeSpec> = {\n  /* ----------------------------- Triggers ---------------------------- */\n  \"slash-command\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord:\n      \"Client#on(Events.InteractionCreate) filtered by ChatInputCommandInteraction#commandName; registered through REST Routes.applicationCommands()\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"interaction\", \"guild\", \"member\"],\n    outputs: [\"out\"],\n    required: [\"name\", \"description\"],\n  },\n  \"button-click\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Events.InteractionCreate + ButtonInteraction#customId\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"interaction\", \"guild\", \"member\", \"message\"],\n    outputs: [\"out\"],\n    required: [\"customId\"],\n  },\n  \"dropdown-select\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord:\n      \"Events.InteractionCreate + AnySelectMenuInteraction#customId (string/user/role/channel/mentionable)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"interaction\", \"guild\", \"member\", \"message\"],\n    outputs: [\"out\"],\n    required: [\"customId\"],\n  },\n  \"modal-submit\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Events.InteractionCreate + ModalSubmitInteraction#customId\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"interaction\", \"guild\", \"member\"],\n    outputs: [\"out\"],\n    required: [\"customId\"],\n  },\n  \"message-received\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Client#on(Events.MessageCreate)\",\n    intents: [\"Guilds\", \"GuildMessages\", \"MessageContent\"],\n    permissions: [],\n    requires: [],\n    provides: [\"message\", \"guild\", \"member\"],\n    outputs: [\"out\"],\n  },\n  \"member-joined\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Client#on(Events.GuildMemberAdd)\",\n    intents: [\"Guilds\", \"GuildMembers\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\", \"member\"],\n    outputs: [\"out\"],\n  },\n  \"member-left\": {\n    kind: \"trigger\",\n    support: \"partial\",\n    discord: \"Client#on(Events.GuildMemberRemove)\",\n    intents: [\"Guilds\", \"GuildMembers\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\", \"member\"],\n    outputs: [\"out\"],\n    note: \"The member has already left: {user} always works, but member details (roles, nickname) are only there when Discord still had them cached.\",\n  },\n  \"reaction-added\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Client#on(Events.MessageReactionAdd)\",\n    intents: [\"Guilds\", \"GuildMessageReactions\"],\n    permissions: [],\n    requires: [],\n    provides: [\"message\", \"guild\", \"member\"],\n    outputs: [\"out\"],\n  },\n  \"reaction-removed\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Client#on(Events.MessageReactionRemove)\",\n    intents: [\"Guilds\", \"GuildMessageReactions\"],\n    permissions: [],\n    requires: [],\n    provides: [\"message\", \"guild\", \"member\"],\n    outputs: [\"out\"],\n  },\n  \"bot-ready\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Client#once(Events.ClientReady)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [],\n    outputs: [\"out\"],\n  },\n  \"scheduled-event\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord:\n      \"setInterval inside the runtime — 5-field cron with *, numbers, lists, ranges and steps, in UTC or the chosen time zone\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [],\n    outputs: [\"out\"],\n    required: [\"cron\"],\n    note: \"Runs at minute resolution while the bot is online.\",\n  },\n\n  /* ----------------------------- Messages ---------------------------- */\n  \"send-message\": {\n    kind: \"action\",\n    support: \"full\",\n    discord:\n      \"TextChannel#send() — or Interaction#reply({ flags: Ephemeral }) when Ephemeral is on (only possible from an interaction)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\", \"SendMessages\", \"EmbedLinks\"],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"content\"],\n  },\n  reply: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Interaction#reply()/followUp() or Message#reply()\",\n    intents: [\"Guilds\"],\n    permissions: [\"SendMessages\", \"EmbedLinks\", \"ReadMessageHistory\"],\n    requires: [],\n    acknowledges: true,\n    outputs: [\"out\"],\n    required: [\"content\"],\n  },\n  \"send-embed\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"EmbedBuilder + TextChannel#send({ embeds, components })\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\", \"SendMessages\", \"EmbedLinks\"],\n    requires: [],\n    outputs: [\"out\"],\n  },\n  \"edit-message\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"TextChannel#messages.fetch() then Message#edit() — only messages the bot sent\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\", \"ReadMessageHistory\"],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"messageId\"],\n  },\n  \"delete-message\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Message#delete()\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageMessages\", \"ReadMessageHistory\"],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"messageId\"],\n  },\n  \"send-dm\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"User#createDM() then DMChannel#send()\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"user\"],\n  },\n\n  /* ---------------------------- Components --------------------------- */\n  // Components are authored on the message nodes themselves (the Components\n  // editor writes node.data.components). The standalone component nodes are\n  // builder-only scaffolding and are skipped by the runtime.\n  \"component-button\": componentNode(\"ButtonBuilder / ActionRowBuilder\"),\n  \"component-dropdown\": componentNode(\"StringSelectMenuBuilder\"),\n  \"component-string-select\": componentNode(\"StringSelectMenuBuilder\"),\n  \"component-user-select\": componentNode(\"UserSelectMenuBuilder\"),\n  \"component-role-select\": componentNode(\"RoleSelectMenuBuilder\"),\n  \"component-channel-select\": componentNode(\"ChannelSelectMenuBuilder\"),\n  \"component-mentionable-select\": componentNode(\"MentionableSelectMenuBuilder\"),\n  // Older \"Modal\" block: now opens the same form as Show Modal.\n  \"component-modal\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Interaction#showModal() — answer it with a Modal Submit trigger\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: INTERACTION_CTX,\n    acknowledges: true,\n    outputs: [\"out\"],\n    required: [\"title\"],\n  },\n  \"component-text-input\": {\n    kind: \"action\",\n    support: \"unsupported\",\n    discord: \"TextInputBuilder (modal field)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    note: \"Modal fields belong to a modal; standalone text-input nodes are skipped at runtime.\",\n  },\n\n  /* ---------------------------- Moderation --------------------------- */\n  \"ban-user\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMemberManager#ban({ reason, deleteMessageSeconds })\",\n    intents: [\"Guilds\"],\n    permissions: [\"BanMembers\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\"],\n  },\n  \"kick-user\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMember#kick(reason)\",\n    intents: [\"Guilds\"],\n    permissions: [\"KickMembers\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\"],\n  },\n  \"timeout-user\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMember#timeout(ms, reason)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ModerateMembers\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\", \"duration\"],\n  },\n  \"warn-user\": {\n    kind: \"action\",\n    support: \"partial\",\n    discord: \"User#send() for the DM — Bottly has no warning store, so nothing is persisted\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\"],\n    note: \"Sends the warning DM (when enabled) and logs a runtime event. Warnings are not counted or stored.\",\n  },\n  \"delete-messages\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"TextChannel#bulkDelete(amount, true)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageMessages\", \"ReadMessageHistory\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"amount\"],\n  },\n  \"add-role\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMemberRoleManager#add(role)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\", \"role\"],\n  },\n  \"remove-role\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMemberRoleManager#remove(role)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\", \"role\"],\n  },\n  \"move-member\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMember#voice.setChannel(channel)\",\n    intents: [\"Guilds\", \"GuildVoiceStates\"],\n    permissions: [\"MoveMembers\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\", \"channel\"],\n  },\n\n  /* ------------------------------- Logic ----------------------------- */\n  \"if-else\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Pure runtime logic on resolved variables\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"true\", \"false\"],\n  },\n  \"check-permission\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"GuildMember#permissions.has(PermissionFlagsBits[...])\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"true\", \"false\"],\n    required: [\"permission\"],\n  },\n  \"check-role\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"GuildMemberRoleManager#cache lookup by id or name\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"true\", \"false\"],\n    required: [\"role\"],\n  },\n  \"check-channel\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Compares the event channel id/name\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    outputs: [\"true\", \"false\"],\n    required: [\"channel\"],\n  },\n  compare: {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Numeric comparison of resolved values\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"true\", \"false\"],\n  },\n  contains: {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"String comparison of resolved values\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"true\", \"false\"],\n  },\n  equals: {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"String comparison of resolved values\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"true\", \"false\"],\n  },\n  random: {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Math.random() branch\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"a\", \"b\"],\n  },\n  delay: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"await setTimeout(ms) inside the flow run\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n  },\n  cooldown: {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"In-memory per user/channel/guild rate limit inside the runtime\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"blocked\"],\n    note: \"The cooldown map lives in the runtime process and resets when the bot restarts.\",\n  },\n  \"rate-counter\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"In-memory sliding-window counter per key inside the runtime\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"under\", \"over\"],\n    required: [\"key\"],\n    note: \"Counts runs per key (e.g. spam:{user.id}) in the last N seconds and sets {rate.count}. The counter lives in the bot process and resets when the bot restarts.\",\n  },\n\n  /* ---------------------------- Discord data -------------------------- */\n  \"get-user\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"UserManager#fetch(id)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"user\", \"storeAs\"],\n  },\n  \"get-member\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMemberManager#fetch(id)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\", \"storeAs\"],\n  },\n  \"get-server\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Interaction/Message#guild\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"storeAs\"],\n  },\n  \"get-channel\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"ChannelManager#fetch(id)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\"],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"channel\", \"storeAs\"],\n  },\n  \"get-role\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"RoleManager#fetch() / cache lookup\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"role\", \"storeAs\"],\n  },\n\n  /* ----------------------------- Variables ---------------------------- */\n  \"set-variable\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime-local flow variable (per run)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\"],\n    note: \"Variables live for the duration of one flow run; they are not persisted between events.\",\n  },\n  \"run-code\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Sandboxed QuickJS call to a function exported by the flow's code file\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"error\"],\n    required: [\"fn\"],\n    note: \"Runs in an isolated sandbox (5 s, 16 MB, 20 db/fetch calls). Only bot storage and public HTTPS are reachable. Returned keys become {code.key} variables.\",\n  },\n  \"get-variable\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime-local flow variable (per run)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\"],\n  },\n  increment: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime-local flow variable (per run)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\"],\n  },\n  decrement: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime-local flow variable (per run)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\"],\n  },\n  \"format-text\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Template interpolation of flow variables\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"storeAs\"],\n  },\n\n  /* --------------------------- Extra triggers -------------------------- */\n  \"message-edited\": trg(\n    \"Client#on(Events.MessageUpdate)\",\n    [\"GuildMessages\", \"MessageContent\"],\n    [\"message\", \"guild\", \"member\"],\n  ),\n  \"message-deleted\": {\n    ...trg(\n      \"Client#on(Events.MessageDelete)\",\n      [\"GuildMessages\", \"MessageContent\"],\n      [\"message\", \"guild\", \"member\"],\n    ),\n    support: \"partial\",\n    note: \"Discord only says which message was deleted: its text and author are known only for messages the bot saw since it started.\",\n  },\n  // Message content of DMs needs no privileged intent.\n  \"dm-received\": trg(\n    \"Client#on(Events.MessageCreate) filtered to DM channels\",\n    [\"DirectMessages\"],\n    [\"message\"],\n  ),\n  \"voice-join\": trg(\n    \"Client#on(Events.VoiceStateUpdate) — joined a channel\",\n    [\"GuildVoiceStates\"],\n    [\"guild\", \"member\"],\n  ),\n  \"voice-leave\": trg(\n    \"Client#on(Events.VoiceStateUpdate) — left a channel\",\n    [\"GuildVoiceStates\"],\n    [\"guild\", \"member\"],\n  ),\n  \"voice-move\": trg(\n    \"Client#on(Events.VoiceStateUpdate) — moved channel\",\n    [\"GuildVoiceStates\"],\n    [\"guild\", \"member\"],\n  ),\n  \"channel-created\": trg(\"Client#on(Events.ChannelCreate)\", [], [\"guild\"]),\n  \"channel-deleted\": trg(\"Client#on(Events.ChannelDelete)\", [], [\"guild\"]),\n  \"thread-created\": trg(\"Client#on(Events.ThreadCreate)\", [], [\"guild\"]),\n  \"role-created\": trg(\"Client#on(Events.GuildRoleCreate)\", [], [\"guild\"]),\n  \"role-deleted\": trg(\"Client#on(Events.GuildRoleDelete)\", [], [\"guild\"]),\n  \"member-banned\": trg(\"Client#on(Events.GuildBanAdd)\", [\"GuildModeration\"], [\"guild\"]),\n  \"member-unbanned\": trg(\"Client#on(Events.GuildBanRemove)\", [\"GuildModeration\"], [\"guild\"]),\n  \"member-updated\": trg(\n    \"Client#on(Events.GuildMemberUpdate)\",\n    [\"GuildMembers\"],\n    [\"guild\", \"member\"],\n  ),\n  \"invite-created\": {\n    ...trg(\"Client#on(Events.InviteCreate)\", [\"GuildInvites\"], [\"guild\"]),\n    // Discord only sends INVITE_CREATE to bots that can manage the channel.\n    permissions: [\"ManageChannels\"],\n  },\n  \"typing-start\": trg(\"Client#on(Events.TypingStart)\", [\"GuildMessageTyping\"], [\"guild\", \"member\"]),\n  \"guild-joined\": trg(\"Client#on(Events.GuildCreate)\", [], [\"guild\"]),\n  \"server-event-created\": trg(\n    \"Client#on(Events.GuildScheduledEventCreate)\",\n    [\"GuildScheduledEvents\"],\n    [\"guild\"],\n  ),\n  \"server-event-started\": trg(\n    \"Client#on(Events.GuildScheduledEventUpdate) when the status becomes Active\",\n    [\"GuildScheduledEvents\"],\n    [\"guild\"],\n  ),\n  \"server-event-interested\": trg(\n    \"Client#on(Events.GuildScheduledEventUserAdd)\",\n    [\"GuildScheduledEvents\"],\n    [\"guild\", \"member\"],\n  ),\n  \"automod-action\": {\n    ...trg(\"Client#on(Events.AutoModerationActionExecution)\", [\"AutoModerationExecution\"], [\"guild\", \"member\"]),\n    permissions: [\"ManageGuild\"],\n  },\n\n  /* --------------------------- Extra messages -------------------------- */\n  \"add-reaction\": act(\"Message#react()\", {\n    permissions: [\"AddReactions\", \"ReadMessageHistory\"],\n    required: [\"emoji\"],\n  }),\n  \"remove-reactions\": act(\"MessageReaction#remove() / Message#reactions.removeAll()\", {\n    permissions: [\"ManageMessages\"],\n  }),\n  \"pin-message\": act(\"Message#pin()\", {\n    permissions: [\"PinMessages\", \"ReadMessageHistory\"],\n    note: \"A channel holds at most 250 pinned messages.\",\n  }),\n  \"unpin-message\": act(\"Message#unpin()\", { permissions: [\"PinMessages\", \"ReadMessageHistory\"] }),\n  \"publish-message\": act(\"Message#crosspost()\", {\n    permissions: [\"SendMessages\", \"ManageMessages\"],\n    note: \"Only in announcement channels; Discord allows 10 publishes per hour per channel.\",\n  }),\n  \"get-message\": act(\"TextChannel#messages.fetch()\", {\n    permissions: [\"ReadMessageHistory\"],\n    required: [\"messageId\", \"storeAs\"],\n  }),\n  \"send-file\": act(\"TextChannel#send({ files: [url] })\", {\n    permissions: [\"ViewChannel\", \"SendMessages\", \"AttachFiles\"],\n    required: [\"url\"],\n  }),\n  \"file-from-text\": act(\"TextChannel#send({ files: [AttachmentBuilder(text)] }) / interaction reply\", {\n    permissions: [\"ViewChannel\", \"SendMessages\", \"AttachFiles\"],\n    required: [\"fileName\", \"fileContent\"],\n    note: \"File names end in .txt, .json, .csv or .md; the file holds at most 1 MB of text.\",\n  }),\n  \"webhook-send\": act(\"TextChannel#fetchWebhooks()/createWebhook() + Webhook#send({ username, avatarURL })\", {\n    permissions: [\"ViewChannel\", \"ManageWebhooks\"],\n    requires: [\"guild\"],\n    note: 'Reuses (or creates) one webhook named \"Bottly\" per channel. Sets {webhook.messageId}.',\n  }),\n  \"fetch-channel-messages\": act(\"TextChannel#messages.fetch({ limit })\", {\n    intents: [\"Guilds\", \"GuildMessages\", \"MessageContent\"],\n    permissions: [\"ViewChannel\", \"ReadMessageHistory\"],\n    note: \"Reads up to 50 recent messages. Sets {history.text} (\\\"name: content\\\" lines, at most 4000 characters), {history.count}, {history.lastAuthorId} and {history.lastAt} (unix seconds).\",\n  }),\n  \"create-poll\": act(\"TextChannel#send({ poll })\", {\n    permissions: [\"ViewChannel\", \"SendMessages\", \"SendPolls\"],\n    required: [\"question\", \"answers\"],\n  }),\n  \"start-typing\": act(\"TextChannel#sendTyping()\", { permissions: [\"ViewChannel\", \"SendMessages\"] }),\n  \"defer-reply\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"RepliableInteraction#deferReply()\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: INTERACTION_CTX,\n    acknowledges: true,\n    outputs: [\"out\"],\n  },\n  \"show-modal\": {\n    kind: \"action\",\n    support: \"full\",\n    discord:\n      \"Interaction#showModal() with Label fields (text, dropdowns, pickers, file upload) — answer it on the Submitted output (awaitModalSubmit) or with a Modal Submit trigger\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: INTERACTION_CTX,\n    acknowledges: true,\n    outputs: [\"out\", \"submitted\"],\n    required: [\"customId\", \"title\"],\n    note: 'Fields go in config \"modalFields\" as a JSON array (max 5) of {id, kind: \"short\"|\"paragraph\"|\"select\"|\"user-select\"|\"role-select\"|\"channel-select\"|\"mentionable-select\"|\"file\"|\"radio\"|\"checkbox-group\"|\"checkbox\"|\"text\", label, description?, placeholder?, required?, minLength?, maxLength?, value?, options?: [{label, value, description?, emoji?, default?}], minValues?, maxValues?, content? (for \"text\")}. Radio buttons take 2-10 options, checkboxes 1-10; a single checkbox answers \"yes\"/\"no\" (value \"true\" = checked by default). Blocks on the \"submitted\" output run in the same flow when the form is sent (waits up to 15 minutes; the submit is a new interaction to reply to, earlier variables are kept), and a Modal Submit trigger with the same customId also works. Each answer is {id} (pickers: mentions, files: links) plus {id.values} and {id.count}. \"out\" runs right after the form is shown and cannot reply.',\n  },\n\n  /* -------------------------- Server management ------------------------ */\n  \"create-channel\": act(\"Guild#channels.create()\", {\n    permissions: [\"ManageChannels\"],\n    requires: [\"guild\"],\n    required: [\"name\"],\n  }),\n  \"delete-channel\": act(\"GuildChannel#delete()\", {\n    permissions: [\"ManageChannels\"],\n    requires: [\"guild\"],\n    required: [\"channel\"],\n  }),\n  \"rename-channel\": act(\"GuildChannel#setName()\", {\n    permissions: [\"ManageChannels\"],\n    requires: [\"guild\"],\n    required: [\"name\"],\n    note: \"Discord allows 2 name or topic changes per channel every 10 minutes; more wait in a queue.\",\n  }),\n  \"set-channel-topic\": act(\"TextChannel#setTopic()\", {\n    permissions: [\"ManageChannels\"],\n    requires: [\"guild\"],\n    note: \"Discord allows 2 name or topic changes per channel every 10 minutes; more wait in a queue.\",\n  }),\n  \"set-slowmode\": act(\"TextChannel#setRateLimitPerUser()\", {\n    permissions: [\"ManageChannels\"],\n    requires: [\"guild\"],\n  }),\n  \"set-channel-permission\": act(\"GuildChannel#permissionOverwrites.edit()\", {\n    permissions: [\"ManageRoles\", \"ManageChannels\"],\n    requires: [\"guild\"],\n    required: [\"target\", \"permission\"],\n  }),\n  \"create-private-channel\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Guild#channels.create({ permissionOverwrites }) — @everyone denied ViewChannel\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageChannels\", \"ManageRoles\"],\n    requires: [\"guild\"],\n    outputs: [\"out\", \"failed\"],\n    required: [\"name\"],\n    note: \"Only the listed members and roles (and the bot) can see the channel. Sets {name}, {name.id} and {name.name} (default prefix privateChannel); failures land in {name.error}.\",\n  },\n  \"lockdown-channels\": act(\"GuildChannel#permissionOverwrites.edit(@everyone, { SendMessages })\", {\n    permissions: [\"ManageRoles\", \"ManageChannels\"],\n    requires: [\"guild\"],\n    note: \"Lock denies Send Messages (and in threads) to @everyone; unlock resets them. Sets {lockdown.count}.\",\n  }),\n  \"apply-server-template\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Guild#roles.create() + Guild#channels.create() for every missing role, category and channel\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageRoles\", \"ManageChannels\"],\n    requires: [\"guild\"],\n    outputs: [\"out\", \"failed\"],\n    required: [\"structure\"],\n    note: 'Config \"structure\" is JSON: {roles: [{name, color?, hoist?, mentionable?}], categories: [{name, private?, allowRoles?, channels: [{name, type?: \"text\"|\"voice\"|\"announcement\"|\"forum\"|\"stage\", topic?, private?, allowRoles?}]}], channels?: [...]}. Roles, categories and channels that already exist (same name) are reused. At most 50 roles and 100 categories and channels. Sets {template.created}, {template.skipped}, {template.failed}, {template.error}.',\n  },\n  \"server-backup\": act(\"Guild#roles + Guild#channels → JSON file sent with TextChannel#send({ files })\", {\n    permissions: [\"ViewChannel\", \"SendMessages\", \"AttachFiles\"],\n    requires: [\"guild\"],\n    note: \"Sends roles (permissions, colours) and categories/channels (overwrites by role name) as a JSON file and sets {backup.size}. Apply Server Template can recreate the structure from it.\",\n  }),\n  \"create-thread\": act(\"TextChannel#threads.create() / Message#startThread() / ForumChannel#threads.create()\", {\n    permissions: [\"CreatePublicThreads\", \"CreatePrivateThreads\", \"SendMessagesInThreads\"],\n    requires: [\"guild\"],\n    required: [\"name\"],\n  }),\n  \"archive-thread\": act(\"ThreadChannel#setArchived(true)\", {\n    permissions: [\"ManageThreads\"],\n    requires: [\"guild\"],\n  }),\n  \"lock-thread\": act(\"ThreadChannel#setLocked()\", {\n    permissions: [\"ManageThreads\"],\n    requires: [\"guild\"],\n  }),\n  \"create-invite\": act(\"GuildChannel#createInvite()\", {\n    permissions: [\"CreateInstantInvite\"],\n    requires: [\"guild\"],\n    required: [\"storeAs\"],\n  }),\n  \"create-role\": act(\"Guild#roles.create()\", {\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    required: [\"name\", \"storeAs\"],\n  }),\n  \"edit-role\": act(\"Role#edit()\", {\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    required: [\"role\"],\n  }),\n  \"delete-role\": act(\"Role#delete()\", {\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    required: [\"role\"],\n  }),\n  \"set-nickname\": act(\"GuildMember#setNickname()\", {\n    permissions: [\"ManageNicknames\"],\n    requires: [\"guild\"],\n    required: [\"user\"],\n  }),\n  \"unban-user\": act(\"Guild#bans.remove()\", {\n    permissions: [\"BanMembers\"],\n    requires: [\"guild\"],\n    required: [\"user\"],\n  }),\n  \"set-presence\": act(\"Client#user.setPresence()\", { intents: [] }),\n\n  /* -------------------------------- Voice ------------------------------ */\n  \"voice-mute\": act(\"GuildMember#voice.setMute()\", {\n    permissions: [\"MuteMembers\"],\n    intents: [\"GuildVoiceStates\"],\n    requires: [\"guild\"],\n    required: [\"user\"],\n  }),\n  \"voice-deafen\": act(\"GuildMember#voice.setDeaf()\", {\n    permissions: [\"DeafenMembers\"],\n    intents: [\"GuildVoiceStates\"],\n    requires: [\"guild\"],\n    required: [\"user\"],\n  }),\n  \"disconnect-member\": act(\"GuildMember#voice.disconnect()\", {\n    permissions: [\"MoveMembers\"],\n    intents: [\"GuildVoiceStates\"],\n    requires: [\"guild\"],\n    required: [\"user\"],\n  }),\n\n  /* ----------------------------- Extra logic --------------------------- */\n  condition: cond(\n    \"Runtime checks (text, numbers, lists, roles, permissions, users) per branch; first match wins\",\n    [\"else\"],\n    {\n      note: 'Branches go in config \"branches\" as a JSON array of {id (\"b_\" + up to 16 lowercase letters/digits), label, match: \"all\"|\"any\", rules: [{left, op, right}]}. Each branch id is also its output handle; \"else\" runs when no branch matches. Operators: see CONDITION_OPERATORS.',\n    },\n  ),\n  switch: cond(\"Runtime string comparison\", [\"case1\", \"case2\", \"case3\", \"case4\", \"default\"], {\n    required: [\"value\"],\n  }),\n  \"regex-match\": cond(\"RegExp#exec() inside the runtime\", [\"true\", \"false\"], {\n    required: [\"pattern\"],\n  }),\n  \"check-bot-permission\": cond(\n    \"GuildMember#permissions.has() for the bot member\",\n    [\"true\", \"false\"],\n    { requires: [\"guild\"], required: [\"permission\"] },\n  ),\n  \"check-context\": cond(\"Checks whether the event carries a Guild\", [\"true\", \"false\"], {}),\n  \"is-bot\": cond(\"User#bot\", [\"true\", \"false\"], {}),\n  \"has-attachment\": cond(\"Message#attachments.size\", [\"true\", \"false\"], { requires: [\"message\"] }),\n  \"for-each\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime loop over a split string; the 'each' branch runs once per item\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"each\", \"out\"],\n    required: [\"list\", \"itemVar\"],\n    note: \"Loops are capped by the runtime step limit (200 steps per run).\",\n  },\n  \"stop-flow\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime control — ends this branch\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [],\n  },\n\n  /* ------------------------ Bottly storage ------------------------- */\n  // Each storage block has config \"database\": \"\" (Bottly storage, default) or\n  // \"postgres\" (the owner's own PostgreSQL at config \"connection\"; empty means\n  // {env.DATABASE_URL}); the outputs and variables are the same.\n  \"storage-save\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) — inserts one record\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"table\", \"fields\"],\n  },\n  \"storage-find\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) — first record where field = value\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"found\", \"missing\"],\n    required: [\"table\", \"field\", \"storeAs\"],\n  },\n  \"storage-update\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) — updates records where field = value\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"table\", \"field\", \"fields\"],\n  },\n  \"storage-delete\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) — deletes records where field = value\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"table\", \"field\"],\n  },\n  \"storage-count\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) — counts records (optionally where field = value)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"table\", \"storeAs\"],\n  },\n  \"storage-query\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) or your PostgreSQL — records matching filter lines, sorted, with limit/offset\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"found\", \"empty\"],\n    required: [\"table\", \"storeAs\"],\n    note: \"Config filters (lines field = value; = != > < >= <= contains; numbers compare as numbers), sortField + sortOrder (asc/desc, default newest first), limit 1-100 (default 25), offset, lineTemplate. Exposes {records.count}, {records.list} (one line per record; For Each reads it with the separator \\\\n), {records.json} and {records.N.field} for the first 25.\",\n  },\n  \"storage-take\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) or your PostgreSQL — atomically picks one matching record and sets the mark fields (UPDATE … FOR UPDATE SKIP LOCKED)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"taken\", \"empty\"],\n    required: [\"table\", \"mark\", \"storeAs\"],\n    note: \"Config filters, sortField + sortOrder (default oldest first) and mark (lines field = value). Two runs never take the same record. Exposes {item.field} and {item} (JSON).\",\n  },\n  \"storage-aggregate\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) or your PostgreSQL — count/sum/avg/min/max of a field, optionally grouped\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"table\", \"operation\", \"storeAs\"],\n    note: \"Config filters, operation, field, groupBy, top (1-25). Exposes {agg.result}; grouped also {agg.top} (lines value: result), {agg.count} and {agg.N.key}/{agg.N.value}.\",\n  },\n  \"sql-query\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"The owner's own PostgreSQL (pg, from the runtime) — one statement with $1..$n parameters\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"connection\", \"sql\"],\n    note: \"Config sql (the statement) and sqlParams (one value per line). Values only travel as parameters ($1..$20, one line each in Parameters); variables are never put into the SQL text. The database host must be public (private, local and metadata addresses are refused); TLS is used unless sslmode=disable; 10 s statement timeout. Exposes {sql} and {sql.rows} (JSON, first 100 rows), {sql.count}, {sql.affected}, {sql.0.column} per row, {sql.column} for the first row and {sql.error}.\",\n  },\n\n  /* --------------------------- Plugins: SellAuth ------------------------ */\n  \"sellauth-new-order\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"SellAuth API polled every 60 s by the runtime (plugin keys)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [],\n    outputs: [\"out\"],\n    note: \"Runs once per newly completed SellAuth invoice. Exposes {invoice.id}, {invoice.email}, {invoice.product}, {invoice.total}.\",\n  },\n  \"sellauth-get-invoice\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"GET api.sellauth.com/v1/shops/{shop}/invoices/{id}\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"found\", \"missing\"],\n    required: [\"invoiceId\", \"storeAs\"],\n  },\n  \"sellauth-verify-purchase\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"GET api.sellauth.com invoice, checks status=completed (+ product / email)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"yes\", \"no\"],\n    required: [\"invoiceId\"],\n  },\n  \"sellauth-product-stock\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GET api.sellauth.com/v1/shops/{shop}/products/{id}\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"productId\", \"storeAs\"],\n  },\n\n  \"sellauth-api\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord:\n      \"Any SellAuth API v1 endpoint (api.sellauth.com/v1/shops/{shop}/...) with the plugin's API key\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"operation\", \"storeAs\"],\n    note: \"Stores {sa.status}, {sa.json}, every top-level field as {sa.<field>}; lists also get {sa.count}, {sa.total}, {sa.list} and {sa.first.<field>}. Errors land in {sa.error}.\",\n  },\n\n  /* --------------------------- Plugins: Anti-Nuke ----------------------- */\n  \"antinuke-guard\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord:\n      \"Events.GuildAuditLogEntryCreate (fallback Guild#fetchAuditLogs()) → executor; per-executor sliding-window counter in the bot process\",\n    intents: [\"GuildModeration\"],\n    permissions: [\"ViewAuditLog\"],\n    requires: [\"guild\"],\n    outputs: [\"triggered\", \"safe\"],\n    required: [\"action\", \"limit\", \"windowSeconds\"],\n    note: \"Exposes {executor}, {executor.id}, {executor.tag}, {antinuke.count}, {antinuke.action}. The server owner, the bot itself and whitelisted users/roles are always safe.\",\n  },\n  \"antinuke-punish\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMemberManager#ban() / GuildMember#kick() / GuildMemberRoleManager#set()\",\n    intents: [],\n    permissions: [\"BanMembers\", \"KickMembers\", \"ManageRoles\"],\n    requires: [\"guild\"],\n    outputs: [\"out\", \"failed\"],\n    required: [\"user\", \"mode\"],\n  },\n\n  /* ------------------------- Plugin: Converter ------------------------ */\n  convert: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Exchange rates from open.er-api.com (currencies) and api.coinbase.com (crypto), cached; unit maths in the runtime\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"amount\", \"from\", \"to\", \"storeAs\"],\n    note: \"Currencies (USD, PLN, EUR…), crypto (BTC, ETH…) or units (km, mi, kg, lb, C, F, GB…). Exposes {name.result}, {name.rate}, {name.text}, {name.from}, {name.to}, {name.amount}, {name.error}.\",\n  },\n\n  /* ----------------------- Plugin: Sticky Message ---------------------- */\n  \"sticky-message\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"TextChannel#send() after deleting the channel's previous sticky (Message#delete()); debounced per channel, ids kept in Bottly storage\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\", \"SendMessages\", \"EmbedLinks\", \"ReadMessageHistory\"],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"channel\"],\n    note: \"Waits the quiet delay so a burst of messages moves the sticky once.\",\n  },\n  \"sticky-clear\": act(\"Message#delete() for the channel's sticky message\", {\n    permissions: [\"ViewChannel\", \"ReadMessageHistory\"],\n    required: [\"channel\"],\n  }),\n\n  /* --------------------------- Plugin: Roblox -------------------------- */\n  \"roblox-api\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Public Roblox web APIs (users, thumbnails, groups, games, presence) — no key\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"operation\", \"query\", \"storeAs\"],\n    note: \"See ROBLOX_OPERATIONS for the variables each operation exposes under {name.…}.\",\n  },\n\n  /* ------------------------ Plugin: Crypto Tools ----------------------- */\n  \"crypto-api\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Keyless public APIs: CoinGecko, Coinbase, alternative.me, mempool.space, litecoinspace.org, Ethereum/Solana RPC, TronGrid\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"operation\", \"storeAs\"],\n    note: \"See CRYPTO_OPERATIONS for the variables each operation exposes under {name.…}; every operation also sets {name.text}, a ready-made summary.\",\n  },\n  \"crypto-alert\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Price alerts kept in Bottly storage (crypto_alerts); the runtime checks prices every minute and runs Crypto Price Alert flows\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"action\"],\n    note: \"Actions add (coin, direction above/below/auto, price like 70000 or 70k, currency), list, remove (alertId or coin). Exposes {alert.text}, {alert.id}, {alert.target}, {alert.current}, {alert.list}, {alert.count}, {alert.error}. Max 10 alerts per member.\",\n  },\n  \"crypto-watch\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Watched wallets kept in Bottly storage (crypto_watches); the runtime checks them every 3 minutes and runs Crypto Wallet Activity flows\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"action\"],\n    note: \"Actions add (address, chain auto, label, channel), list, remove (id, address or label). Exposes {watch.text}, {watch.list}, {watch.count}, {watch.error}. Max 20 wallets per server.\",\n  },\n  \"ai-chat\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Asks Bottly's AI (the bot owner's daily AI requests) through the control plane; the answer is plain text for a reply\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"prompt\"],\n    note: \"Provider empty/bottly = Bottly's AI on the owner's daily requests; or the owner's own key (openai, gemini, anthropic, groq, openrouter, mistral, deepseek, xai) with an optional model. Memory off, per member or per channel (last 6 turns, kept in Bottly storage). Exposes {ai.reply} and {ai.error}. AI Chat plugin.\",\n  },\n  \"crypto-portfolio\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"A member's wallets kept in Bottly storage (crypto_portfolio), valued at live prices\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"action\"],\n    note: \"Actions add (address, chain auto, label), remove, show (currency). Exposes {portfolio.text}, {portfolio.total}, {portfolio.list}, {portfolio.count}, {portfolio.error}. Max 10 wallets per member.\",\n  },\n  \"crypto-alert-hit\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Runs when a price alert set with Crypto Price Alert is reached (the alert is then removed)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\"],\n    outputs: [\"out\"],\n    note: \"The channel is where the alert was set. Exposes {alert.text}, {alert.coin}, {alert.direction}, {alert.target}, {alert.price}, {alert.user} (mention), {alert.userId}, {alert.id}.\",\n  },\n  \"crypto-wallet-activity\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Runs when a watched wallet's balance changes\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\"],\n    outputs: [\"out\"],\n    note: \"The channel is the one chosen when the wallet was watched. Exposes {wallet.text}, {wallet.label}, {wallet.address}, {wallet.chain}, {wallet.direction} (received/sent), {wallet.amount}, {wallet.usd}, {wallet.balance}, {wallet.url}.\",\n  },\n\n  /* -------------------------- Plugin: Leveling ------------------------- */\n  \"xp-gain\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"XP per message with a per-member cooldown, kept in Bottly storage (levels table)\",\n    intents: [\"Guilds\", \"GuildMessages\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"levelup\", \"out\"],\n    note: \"Exposes {level} (new level), {level.old}, {level.xp}, {level.into}, {level.needed}, {level.bar}, {level.percent}, {level.gained}. Level-up when the XP curve (5L²+50L+100) is crossed.\",\n  },\n  \"xp-rank\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Reads the member's XP and their place on the server leaderboard\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"found\", \"missing\"],\n    note: \"Exposes {rank.level}, {rank.xp}, {rank.into}, {rank.needed}, {rank.bar}, {rank.percent}, {rank.position}, {rank.members}, {rank.messages}.\",\n  },\n  \"xp-leaderboard\": act(\"Top members by XP from Bottly storage\", { requires: [\"guild\"], note: \"Exposes {top.text} (one line per member) and {top.count}.\" }),\n  \"xp-edit\": act(\"Adds, removes or sets a member's XP or level\", { requires: [\"guild\"], required: [\"user\", \"mode\"] }),\n  \"level-rewards\": act(\"GuildMemberRoleManager#add() for every reward level reached\", {\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    required: [\"rewards\"],\n  }),\n\n  /* -------------------------- Plugin: Economy -------------------------- */\n  economy: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Server wallets, daily/work rewards, payments, shop and inventory in Bottly storage (locked per wallet)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"operation\"],\n    note: \"Exposes {eco.text} (ready-made answer), {eco.balance}, {eco.amount}, {eco.next}, {eco.item}, {eco.error}. Currency name and emoji come from ECONOMY_CURRENCY / ECONOMY_EMOJI.\",\n  },\n  casino: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Coin flip, dice, slots and roulette settle at once; blackjack and video poker reply with buttons the runtime handles\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"ok\", \"started\", \"failed\"],\n    required: [\"game\", \"bet\"],\n    note: \"ok: {casino.text}, {casino.won} (yes/no/push), {casino.payout}, {casino.net}, {casino.balance}. started: blackjack / poker already answered with its game. failed: {casino.error}.\",\n  },\n\n  /* ------------------------- Plugin: Giveaways ------------------------- */\n  \"giveaway-start\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Posts a Components V2 giveaway with Enter / Leave buttons; the runtime checks requirements, counts entries and ends it on time\",\n    intents: [\"Guilds\", \"GuildMembers\"],\n    permissions: [\"ViewChannel\", \"SendMessages\"],\n    requires: [\"guild\"],\n    outputs: [\"out\", \"failed\"],\n    required: [\"prize\", \"duration\"],\n    note: \"Exposes {giveaway.id} (message id), {giveaway.url}, {giveaway.ends}, {giveaway.error}.\",\n  },\n  \"giveaway-end\": act(\"Ends a giveaway now and draws its winners\", { required: [\"messageId\"] }),\n  \"giveaway-reroll\": act(\"Draws new winners for an ended giveaway\", { required: [\"messageId\"] }),\n  \"giveaway-ended\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Runs when the runtime ends a giveaway (on time or with End Giveaway)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\"],\n    outputs: [\"out\"],\n    note: \"Exposes {giveaway.prize}, {giveaway.winners}, {giveaway.winnerIds}, {giveaway.entries}, {giveaway.host}, {giveaway.url}.\",\n  },\n\n  /* ------------------------ Plugin: Suggestions ------------------------ */\n  \"suggestion-post\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Posts the suggestion as a Components V2 card with votes and staff review buttons the runtime handles, then opens a discussion thread\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\", \"SendMessages\", \"ManageMessages\", \"CreatePublicThreads\"],\n    requires: [\"guild\"],\n    outputs: [\"out\", \"failed\"],\n    required: [\"text\"],\n    note: \"Exposes {suggestion.id}, {suggestion.number}, {suggestion.url}, {suggestion.thread}, {suggestion.error}.\",\n  },\n  \"suggestion-reviewed\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Runs when staff accept, deny or consider a suggestion\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\"],\n    outputs: [\"out\"],\n    note: \"Exposes {suggestion.status}, {suggestion.reason}, {suggestion.text}, {suggestion.number}, {suggestion.author}, {suggestion.authorId}, {suggestion.reviewer}, {suggestion.url}, {suggestion.up}, {suggestion.down}.\",\n  },\n\n  /* -------------------------- Plugin: Tickets -------------------------- */\n  \"ticket-transcript\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"TextChannel#messages.fetch() (up to 1000) → HTML transcript file sent to a channel\",\n    intents: [\"Guilds\", \"GuildMessages\"],\n    permissions: [\"ViewChannel\", \"ReadMessageHistory\", \"AttachFiles\", \"SendMessages\"],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    note: \"Exposes {transcript.count}, {transcript.url}, {transcript.participants}, {transcript.name}, {transcript.error}.\",\n  },\n\n  /* ------------------------ Plugins: social feeds ---------------------- */\n  \"youtube-new-video\": feedTrigger(\n    \"YouTube channel RSS feed polled every 5 minutes\",\n    \"Exposes {video.title}, {video.url}, {video.id}, {video.thumbnail}, {video.author}, {video.published}, {video.isShort}.\",\n  ),\n  \"twitch-live\": feedTrigger(\n    \"Twitch Helix GET /streams polled every 2 minutes (plugin keys: Client ID + secret)\",\n    \"Exposes {stream.user}, {stream.login}, {stream.title}, {stream.game}, {stream.viewers}, {stream.url}, {stream.thumbnail}, {stream.avatar}.\",\n  ),\n  \"bluesky-new-post\": feedTrigger(\n    \"Bluesky public API app.bsky.feed.getAuthorFeed polled every 3 minutes\",\n    \"Exposes {post.text}, {post.url}, {post.author}, {post.handle}, {post.avatar}, {post.image}, {post.published}.\",\n  ),\n  \"rss-new-item\": feedTrigger(\n    \"RSS / Atom feed polled every 10 minutes\",\n    \"Exposes {item.title}, {item.url}, {item.summary}, {item.author}, {item.image}, {item.published}, {feed.title}.\",\n  ),\n\n  /* --------------------------- Utility and web ------------------------- */\n  \"http-request\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Node fetch() from the bot process; response stored as {name.status}/{name.body}\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"url\", \"storeAs\"],\n  },\n  \"parse-json\": act(\"JSON.parse() + dotted path lookup\", { required: [\"source\", \"storeAs\"] }),\n  \"random-number\": act(\"Runtime Math.random()\", { required: [\"storeAs\"] }),\n  \"random-choice\": act(\"Runtime Math.random() over a split list\", {\n    required: [\"list\", \"storeAs\"],\n  }),\n  math: act(\"Runtime arithmetic\", { required: [\"storeAs\"] }),\n  \"string-op\": act(\"Runtime string transform\", { required: [\"storeAs\"] }),\n  \"timestamp-format\": act(\"Discord <t:unix:style> markdown\", { required: [\"storeAs\"] }),\n  \"log-event\": act(\"Runtime log stream shown in the Bottly console\", { required: [\"message\"] }),\n  \"global-set\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime key/value store shared across runs of this bot process\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\"],\n    note: \"Shared values live in the running bot process; they reset when the bot restarts.\",\n  },\n  \"global-get\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime key/value store shared across runs of this bot process\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\", \"storeAs\"],\n  },\n\n  /* -------------------------- Extra Discord data ----------------------- */\n  \"count-members\": act(\"Role#members (member list refreshed at most every 10 minutes)\", {\n    intents: [\"GuildMembers\"],\n    requires: [\"guild\"],\n    required: [\"storeAs\"],\n  }),\n  \"list-roles\": act(\"Guild#roles.cache\", { requires: [\"guild\"], required: [\"storeAs\"] }),\n  \"list-channels\": act(\"Guild#channels.cache\", { requires: [\"guild\"], required: [\"storeAs\"] }),\n};\n\ninterface SpecOptions {\n  intents?: string[];\n  permissions?: string[];\n  requires?: ContextKind[];\n  required?: string[];\n  note?: string;\n}\n\nfunction act(discord: string, options: SpecOptions = {}): NodeSpec {\n  return {\n    kind: \"action\",\n    support: \"full\",\n    discord,\n    intents: options.intents ?? [\"Guilds\"],\n    permissions: options.permissions ?? [],\n    requires: options.requires ?? [],\n    outputs: [\"out\"],\n    ...(options.required ? { required: options.required } : {}),\n    ...(options.note ? { note: options.note } : {}),\n  };\n}\n\n/** A plugin trigger the runtime polls; \"source\" may list several, comma separated. */\nfunction feedTrigger(discord: string, note: string): NodeSpec {\n  return {\n    kind: \"trigger\",\n    support: \"full\",\n    discord,\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [],\n    outputs: [\"out\"],\n    required: [\"source\"],\n    note: `Runs once per new item; existing items are never replayed. ${note}`,\n  };\n}\n\nfunction cond(discord: string, outputs: string[], options: SpecOptions): NodeSpec {\n  return {\n    kind: \"condition\",\n    support: \"full\",\n    discord,\n    intents: options.intents ?? [],\n    permissions: [],\n    requires: options.requires ?? [],\n    outputs,\n    ...(options.required ? { required: options.required } : {}),\n  };\n}\n\nfunction trg(discord: string, intents: string[], provides: ContextKind[]): NodeSpec {\n  return {\n    kind: \"trigger\",\n    support: \"full\",\n    discord,\n    intents: [\"Guilds\", ...intents],\n    permissions: [],\n    requires: [],\n    provides,\n    outputs: [\"out\"],\n  };\n}\n\nfunction componentNode(discord: string): NodeSpec {\n  return {\n    kind: \"action\",\n    support: \"unsupported\",\n    discord,\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    note: \"Standalone component nodes are builder scaffolding. Attach components with the Components editor on a Send Message / Send Embed / Reply node — those are sent for real.\",\n  };\n}\n\nexport function getNodeSpec(type: string): NodeSpec | null {\n  return Object.prototype.hasOwnProperty.call(NODE_SPECS, type)\n    ? (NODE_SPECS[type] as NodeSpec)\n    : null;\n}\n\n/* ------------------------------------------------------------------ *\n * Compiled flow — exactly what the runtime executes\n * ------------------------------------------------------------------ */\n\nexport interface CompiledCommandOption {\n  name: string;\n  description: string;\n  type: string;\n  required: boolean;\n  autocomplete: boolean;\n  /** Autocomplete suggestions (max 25), filtered by what the user types. */\n  suggestions?: string[];\n}\n\nexport interface CompiledCommand {\n  name: string;\n  description: string;\n  nodeId: string;\n  options: CompiledCommandOption[];\n  /** Only offered inside servers (the flow needs one), not in DMs. */\n  guildOnly?: boolean;\n  /** default_member_permissions: who sees the command (decimal bit string). */\n  memberPermissions?: string;\n}\n\n/** Permissions a command can require of the member (PermissionFlagsBits bit). */\nexport const COMMAND_PERMISSION_BITS: Record<string, number> = {\n  Administrator: 3,\n  ManageGuild: 5,\n  ManageRoles: 28,\n  ManageChannels: 4,\n  ManageMessages: 13,\n  KickMembers: 1,\n  BanMembers: 2,\n  ModerateMembers: 40,\n  ManageNicknames: 27,\n  ManageEvents: 33,\n  ManageThreads: 34,\n  ViewAuditLog: 7,\n  MentionEveryone: 17,\n  ManageWebhooks: 29,\n};\n\n/** Discord's command payload extras for one compiled command (identical on both registration paths). */\nexport function commandScope(command: CompiledCommand): {\n  contexts?: number[];\n  default_member_permissions?: string;\n} {\n  return {\n    ...(command.guildOnly ? { contexts: [0] } : {}),\n    ...(command.memberPermissions ? { default_member_permissions: command.memberPermissions } : {}),\n  };\n}\n\nexport interface CompiledNode {\n  id: string;\n  type: string;\n  title: string;\n  config: Record<string, ConfigValue>;\n  embed: unknown;\n  /** Standard messages: up to 10 embeds (null = use `embed`). */\n  embeds?: unknown;\n  components: unknown;\n  /** \"components\" = a Components V2 message (containers, sections…); otherwise classic. */\n  messageType?: \"embed\" | \"components\" | null;\n  /** handle -> ordered target node ids */\n  next: Record<string, string[]>;\n}\n\nexport interface CompiledTrigger {\n  nodeId: string;\n  type: string;\n  config: Record<string, ConfigValue>;\n}\n\nexport interface CompiledFlow {\n  contractVersion: typeof FLOW_CONTRACT_VERSION;\n  flowId: string;\n  flowName: string;\n  /** GatewayIntentBits names the runtime must request. */\n  intents: string[];\n  triggers: CompiledTrigger[];\n  commands: CompiledCommand[];\n  nodes: Record<string, CompiledNode>;\n}\n\n/* ------------------------------------------------------------------ *\n * Validation\n * ------------------------------------------------------------------ */\n\nexport type IssueLevel = \"error\" | \"warning\";\n\nexport interface FlowIssue {\n  level: IssueLevel;\n  code: string;\n  message: string;\n  nodeId?: string;\n}\n\nconst CONTEXT_LABEL: Record<ContextKind, string> = {\n  interaction: \"a slash command, button, select menu or modal trigger\",\n  message: \"a message context (Message Received, Reaction or a component trigger)\",\n  guild: \"a server (guild) context — it cannot run in DMs\",\n  member: \"a member context\",\n};\n\nconst COMMAND_NAME_PATTERN = /^[-_\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}]{1,32}$/u;\n\nfunction str(value: ConfigValue | undefined): string {\n  return value === undefined || value === null ? \"\" : String(value).trim();\n}\n\nfunction nodeLabel(node: RawFlowNode): string {\n  return str(node.data.title as ConfigValue) || node.data.type;\n}\n\n/** Handles that leave a node, mapped to their targets. */\nfunction outgoing(edges: RawFlowEdge[], nodeId: string): Record<string, string[]> {\n  const out: Record<string, string[]> = {};\n  for (const edge of edges) {\n    if (edge.source !== nodeId) continue;\n    const handle = edge.sourceHandle ?? \"out\";\n    const list = out[handle] ?? [];\n    list.push(edge.target);\n    out[handle] = list;\n  }\n  return out;\n}\n\n/**\n * Full static analysis of a flow: structure, required fields, intents,\n * permissions, interaction-acknowledgement and trigger-context reachability.\n */\ninterface RawSelect {\n  type?: unknown;\n  options?: { label?: unknown; action?: unknown }[];\n  children?: unknown;\n  accessory?: unknown;\n}\n\n/** Every string select in a message's components, however deeply nested. */\nfunction stringSelects(raw: unknown, depth = 0): RawSelect[] {\n  if (!Array.isArray(raw) || depth > 3) return [];\n  return raw.flatMap((entry): RawSelect[] => {\n    if (typeof entry !== \"object\" || entry === null) return [];\n    const c = entry as RawSelect;\n    if (c.type === \"string-select\") return [c];\n    return stringSelects(c.children, depth + 1);\n  });\n}\n\n/** Discord's limits the builder checks before publishing. */\nexport const DISCORD_LIMITS = {\n  content: 2000,\n  embedTitle: 256,\n  embedDescription: 4096,\n  embedFields: 25,\n  embedFooter: 2048,\n  embedTotal: 6000,\n  v2Text: 4000,\n  name: 100,\n  nickname: 32,\n  topic: 1024,\n  inviteMaxAge: 604800,\n  inviteMaxUses: 100,\n} as const;\n\ninterface MessageComponentsInfo {\n  customIds: string[];\n  duplicateOptionValues: string[];\n  text: number;\n}\n\n/** Custom IDs, select option values and text length of a message's components. */\nexport function componentsInfo(raw: unknown): MessageComponentsInfo {\n  const info: MessageComponentsInfo = { customIds: [], duplicateOptionValues: [], text: 0 };\n  const walk = (list: unknown, depth: number) => {\n    if (!Array.isArray(list) || depth > 4) return;\n    for (const entry of list) {\n      if (typeof entry !== \"object\" || entry === null) continue;\n      const c = entry as Record<string, unknown>;\n      const type = String(c[\"type\"] ?? \"\");\n      const action = typeof c[\"action\"] === \"string\" ? c[\"action\"].trim() : \"\";\n      if (typeof c[\"content\"] === \"string\") info.text += c[\"content\"].length;\n      if (type === \"button\" && c[\"style\"] !== \"link\" && action !== \"\") info.customIds.push(action);\n      if (/^(user|role|channel|mentionable)-select$/.test(type) && action !== \"\")\n        info.customIds.push(action);\n      if (type === \"string-select\" && Array.isArray(c[\"options\"])) {\n        const seen = new Set<string>();\n        for (const option of c[\"options\"] as Record<string, unknown>[]) {\n          const value = String(option?.[\"action\"] ?? option?.[\"value\"] ?? \"\").trim();\n          if (value === \"\") continue;\n          if (seen.has(value)) info.duplicateOptionValues.push(value);\n          seen.add(value);\n        }\n      }\n      if (c[\"accessory\"]) walk([c[\"accessory\"]], depth + 1);\n      walk(c[\"children\"], depth + 1);\n    }\n  };\n  walk(raw, 0);\n  return info;\n}\n\n/** Characters an embed adds to Discord's 6000-per-message total. */\nfunction embedSize(raw: unknown): number {\n  if (typeof raw !== \"object\" || raw === null) return 0;\n  const e = raw as Record<string, unknown>;\n  const s = (v: unknown) => (typeof v === \"string\" ? v.length : 0);\n  const fields = Array.isArray(e[\"fields\"]) ? (e[\"fields\"] as Record<string, unknown>[]) : [];\n  return (\n    s(e[\"title\"]) +\n    s(e[\"description\"]) +\n    s((e[\"footer\"] as Record<string, unknown> | undefined)?.[\"text\"]) +\n    s((e[\"author\"] as Record<string, unknown> | undefined)?.[\"name\"]) +\n    fields.reduce((n, f) => n + s(f?.[\"name\"]) + s(f?.[\"value\"]), 0)\n  );\n}\n\n/** Storage blocks that can use the owner's PostgreSQL instead of Bottly storage. */\nexport const DATABASE_STORAGE_TYPES = [\n  \"storage-save\",\n  \"storage-find\",\n  \"storage-update\",\n  \"storage-delete\",\n  \"storage-count\",\n  \"storage-query\",\n  \"storage-take\",\n  \"storage-aggregate\",\n];\n\n/** True when a storage block is set to the owner's own PostgreSQL. */\nexport function usesOwnDatabase(config: Record<string, ConfigValue> | undefined): boolean {\n  return String(config?.[\"database\"] ?? \"\") === \"postgres\";\n}\n\n/**\n * Problems with \"Your PostgreSQL\" storage blocks and the SQL Query block:\n * names Postgres would not accept as written, parameters the query needs,\n * and {variables} typed into SQL text (they are never put there). An empty\n * connection on a storage block means {env.DATABASE_URL}; the SQL Query block\n * requires its connection (spec `required`).\n */\nexport function databaseIssues(type: string, config: Record<string, ConfigValue>): { level: \"error\" | \"warning\"; message: string }[] {\n  const out: { level: \"error\" | \"warning\"; message: string }[] = [];\n  const value = (key: string) => String(config[key] ?? \"\").trim();\n  const name = /^[A-Za-z_][A-Za-z0-9_]{0,62}$/;\n  if (DATABASE_STORAGE_TYPES.includes(type) && usesOwnDatabase(config)) {\n    const table = value(\"table\");\n    const parts = table.split(\".\");\n    if (table && !table.includes(\"{\") && (parts.length > 2 || !parts.every((part) => name.test(part))))\n      out.push({ level: \"error\", message: `\"${table}\" is not a valid PostgreSQL table name: use letters, numbers and _ (optionally schema.table).` });\n    const field = value(\"field\");\n    if (field && !field.includes(\"{\") && !name.test(field))\n      out.push({ level: \"error\", message: `\"${field}\" is not a valid PostgreSQL column name: use letters, numbers and _.` });\n  }\n  if (type === \"sql-query\") {\n    const query = value(\"sql\");\n    if (/\\{[A-Za-z][\\w.-]*\\}/.test(query))\n      out.push({ level: \"warning\", message: \"variables in the SQL text are not filled in. Write $1, $2… and put the values in Parameters, one per line.\" });\n    const max = Math.max(0, ...[...query.matchAll(/\\$(\\d{1,3})(?!\\d)/g)].map((m) => Number(m[1])));\n    if (max > 20) out.push({ level: \"error\", message: \"a query can use at most 20 parameters ($1-$20).\" });\n    const lines = String(config[\"sqlParams\"] ?? \"\").split(\"\\n\").length;\n    if (max > 0 && (String(config[\"sqlParams\"] ?? \"\") === \"\" || lines < max))\n      out.push({ level: \"error\", message: `the query uses $${max}, so Parameters needs ${max} line${max === 1 ? \"\" : \"s\"}.` });\n  }\n  return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Find Many Records / Take One Item / Sum-Average Records\n * (storage-query, storage-take, storage-aggregate). The same filter,\n * sort and aggregate rules run in Bottly storage (SQL functions in\n * database/migrations/20261102170000_storage_take.sql), the owner's\n * PostgreSQL (runtime/src/postgres-sql.ts) and the Live Preview\n * (matchesStorageFilters / sortStorageRecords / aggregateStorageRecords).\n * ------------------------------------------------------------------ */\n\nexport type StorageFilterOp = \"=\" | \"!=\" | \">\" | \"<\" | \">=\" | \"<=\" | \"contains\";\nexport const STORAGE_FILTER_OPS: StorageFilterOp[] = [\"=\", \"!=\", \">\", \"<\", \">=\", \"<=\", \"contains\"];\n\nexport interface StorageFilter {\n  field: string;\n  op: StorageFilterOp;\n  value: string;\n}\n\nexport type StorageAggregateOp = \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\";\nexport const STORAGE_AGGREGATE_OPS: StorageAggregateOp[] = [\"count\", \"sum\", \"avg\", \"min\", \"max\"];\n\n/** Filters per block, record lines kept as {key.N.field}, rows per query. */\nexport const STORAGE_MAX_FILTERS = 10;\nexport const STORAGE_INDEXED_RECORDS = 25;\nexport const STORAGE_QUERY_MAX = 100;\nexport const STORAGE_OFFSET_MAX = 10_000;\nexport const STORAGE_TOP_MAX = 25;\n\nconst STORAGE_FIELD_NAME = /^[A-Za-z0-9_]{1,40}$/;\n\n/**\n * Filter lines \"field = value\" (operators = != > < >= <= and \"contains\").\n * Empty lines are skipped; values keep {variables} for the caller to fill.\n */\nexport function parseStorageFilters(raw: string): { filters: StorageFilter[]; problems: string[] } {\n  const filters: StorageFilter[] = [];\n  const problems: string[] = [];\n  for (const line of String(raw ?? \"\").split(/\\r?\\n/)) {\n    const trimmed = line.trim();\n    if (!trimmed) continue;\n    const word = /^([^\\s=!<>]+)\\s+contains\\s+(.*)$/i.exec(trimmed);\n    const symbol = word ? null : /^([^\\s=!<>]+)\\s*(>=|<=|!=|=|>|<)\\s*(.*)$/.exec(trimmed);\n    if (!word && !symbol) {\n      problems.push(`\"${trimmed.slice(0, 40)}\" is not a filter: write field = value (or != > < >= <= contains).`);\n      continue;\n    }\n    const field = ((word ?? symbol)?.[1] ?? \"\").trim();\n    if (!STORAGE_FIELD_NAME.test(field)) {\n      problems.push(`\"${field.slice(0, 40)}\" is not a valid field name: use letters, numbers and _.`);\n      continue;\n    }\n    if (word) filters.push({ field, op: \"contains\", value: (word[2] ?? \"\").trim() });\n    else if (symbol) filters.push({ field, op: symbol[2] as StorageFilterOp, value: (symbol[3] ?? \"\").trim() });\n  }\n  if (filters.length > STORAGE_MAX_FILTERS) problems.push(`use at most ${STORAGE_MAX_FILTERS} filter lines.`);\n  return { filters, problems };\n}\n\n/** \"field = value\" mark lines of Take One Item (what is set on the taken record). */\nexport function parseStorageMarks(raw: string): { marks: Record<string, string>; problems: string[] } {\n  const marks: Record<string, string> = {};\n  const problems: string[] = [];\n  for (const line of String(raw ?? \"\").split(/\\r?\\n/)) {\n    const trimmed = line.trim();\n    if (!trimmed) continue;\n    const at = trimmed.indexOf(\"=\");\n    const key = at > 0 ? trimmed.slice(0, at).trim() : \"\";\n    if (!STORAGE_FIELD_NAME.test(key)) {\n      problems.push(`\"${trimmed.slice(0, 40)}\" is not a mark line: write field = value, e.g. sold = yes.`);\n      continue;\n    }\n    marks[key] = trimmed.slice(at + 1).trim();\n  }\n  return { marks, problems };\n}\n\nconst STORAGE_NUMBER = /^\\s*-?[0-9]+(\\.[0-9]+)?\\s*$/;\n\n/** A stored value as a number when it is one (\"12\", \"-3.5\"), else null. Same rule as the SQL side. */\nexport function storageNumber(value: string | undefined): number | null {\n  return value !== undefined && STORAGE_NUMBER.test(value) ? Number(value) : null;\n}\n\n/** True when a record passes every filter (missing fields count as \"\"). */\nexport function matchesStorageFilters(row: Record<string, string>, filters: StorageFilter[]): boolean {\n  return filters.every((filter) => {\n    const have = String(row[filter.field] ?? \"\");\n    const want = filter.value;\n    switch (filter.op) {\n      case \"=\":\n        return have === want;\n      case \"!=\":\n        return have !== want;\n      case \"contains\":\n        return have.toLowerCase().includes(want.toLowerCase());\n      default: {\n        const a = storageNumber(have);\n        const b = storageNumber(want);\n        const cmp = a !== null && b !== null ? a - b : have < want ? -1 : have > want ? 1 : 0;\n        if (filter.op === \">\") return cmp > 0;\n        if (filter.op === \"<\") return cmp < 0;\n        if (filter.op === \">=\") return cmp >= 0;\n        return cmp <= 0;\n      }\n    }\n  });\n}\n\n/**\n * Records sorted by a field: numbers first (by value), then text, then\n * records without the field; ties keep their saved order. An empty field\n * keeps the saved order (oldest first), reversed when not ascending.\n */\nexport function sortStorageRecords<T extends Record<string, string>>(rows: T[], field: string, asc: boolean): T[] {\n  const indexed = rows.map((row, index) => ({ row, index }));\n  const dir = asc ? 1 : -1;\n  const rank = (value: string | undefined) => (value === undefined ? 2 : storageNumber(value) !== null ? 0 : 1);\n  indexed.sort((x, y) => {\n    if (field) {\n      const a = x.row[field];\n      const b = y.row[field];\n      const ra = rank(a);\n      const rb = rank(b);\n      if (ra !== rb) return ra - rb;\n      if (ra === 0) {\n        const d = (storageNumber(a) as number) - (storageNumber(b) as number);\n        if (d !== 0) return d * dir;\n      } else if (ra === 1 && a !== b) {\n        return ((a as string) < (b as string) ? -1 : 1) * dir;\n      }\n    }\n    return (x.index - y.index) * dir;\n  });\n  return indexed.map((entry) => entry.row);\n}\n\nexport interface StorageGroup {\n  /** Group value (\"\" for records without the field); \"\" when not grouped. */\n  key: string;\n  /** null when there was nothing to add up (no numbers). */\n  value: number | null;\n}\n\n/** Count / sum / average / min / max of a field, optionally per group (highest first, top N). */\nexport function aggregateStorageRecords(\n  rows: Record<string, string>[],\n  op: StorageAggregateOp,\n  field: string,\n  groupBy = \"\",\n  top = 10,\n): StorageGroup[] {\n  const groups = new Map<string, Record<string, string>[]>();\n  for (const row of rows) {\n    const key = groupBy ? String(row[groupBy] ?? \"\") : \"\";\n    const list = groups.get(key) ?? [];\n    list.push(row);\n    groups.set(key, list);\n  }\n  const out: StorageGroup[] = [];\n  for (const [key, list] of groups) {\n    const numbers = list.map((row) => storageNumber(row[field])).filter((n): n is number => n !== null);\n    let value: number | null;\n    if (op === \"count\") value = list.length;\n    else if (!numbers.length) value = null;\n    else if (op === \"sum\") value = numbers.reduce((a, b) => a + b, 0);\n    else if (op === \"avg\") value = numbers.reduce((a, b) => a + b, 0) / numbers.length;\n    else if (op === \"min\") value = Math.min(...numbers);\n    else value = Math.max(...numbers);\n    out.push({ key, value });\n  }\n  out.sort((a, b) => {\n    if (a.value === null || b.value === null) return a.value === null ? (b.value === null ? 0 : 1) : -1;\n    if (a.value !== b.value) return b.value - a.value;\n    return a.key < b.key ? -1 : a.key > b.key ? 1 : 0;\n  });\n  return groupBy ? out.slice(0, Math.min(STORAGE_TOP_MAX, Math.max(1, Math.round(top) || 10))) : out.slice(0, 1);\n}\n\n/** An aggregate as flow text: at most 2 decimals; nothing to add up is \"0\" for count/sum, else \"\". */\nexport function formatStorageAggregate(op: StorageAggregateOp, value: number | null | undefined): string {\n  if (value === null || value === undefined || !Number.isFinite(value)) return op === \"count\" || op === \"sum\" ? \"0\" : \"\";\n  return String(Math.round(value * 100) / 100);\n}\n\n/**\n * Flow variables of Sum / Average Records under `key`: {key.result} (and\n * {key}); grouped also {key.count} groups, {key.top} (\"value: result\" per\n * line) and {key.N.key} / {key.N.value}.\n */\nexport function aggregateVariables(key: string, op: StorageAggregateOp, groups: StorageGroup[], grouped: boolean): Record<string, string> {\n  const out: Record<string, string> = {};\n  const result = formatStorageAggregate(op, groups[0]?.value);\n  out[key] = result;\n  out[`${key}.result`] = result;\n  if (!grouped) return out;\n  const kept = groups.slice(0, STORAGE_TOP_MAX);\n  out[`${key}.count`] = String(kept.length);\n  out[`${key}.top`] = kept.map((g) => `${g.key || \"(none)\"}: ${formatStorageAggregate(op, g.value)}`).join(\"\\n\");\n  kept.forEach((g, i) => {\n    out[`${key}.${i}.key`] = g.key;\n    out[`${key}.${i}.value`] = formatStorageAggregate(op, g.value);\n  });\n  return out;\n}\n\n/** Fields that describe a record rather than its content (left out of default list lines). */\nconst RECORD_META = new Set([\"id\", \"created_at\", \"updated_at\"]);\n\n/**\n * One list line for a record: the template with {field} filled from the\n * record (other {names} go to `fallback`, e.g. flow variables; unknown ones\n * stay as written), or \"field: value, …\" without a template. One pass, so a\n * stored value is never filled in again.\n */\nexport function renderRecordLine(template: string, row: Record<string, string>, fallback?: (name: string) => string | undefined): string {\n  if (!template.trim()) {\n    return Object.entries(row)\n      .filter(([k]) => !RECORD_META.has(k))\n      .map(([k, v]) => `${k}: ${v}`)\n      .join(\", \");\n  }\n  return template.replace(/\\{([a-zA-Z0-9_.-]+)\\}/g, (match, name: string) => {\n    if (Object.prototype.hasOwnProperty.call(row, name)) return String(row[name] ?? \"\");\n    return fallback?.(name) ?? match;\n  });\n}\n\n/**\n * Flow variables of Find Many Records under `key`: {key} and {key.json}\n * (JSON array), {key.count}, {key.list} (one line per record; For Each reads\n * it with the separator \\n) and {key.N.field} for the first 25 records.\n */\nexport function recordListVariables(\n  key: string,\n  rows: Record<string, string>[],\n  template: string,\n  fallback?: (name: string) => string | undefined,\n): Record<string, string> {\n  const out: Record<string, string> = {};\n  let json = JSON.stringify(rows);\n  if (json.length > 20_000) json = json.slice(0, 20_000);\n  out[key] = json;\n  out[`${key}.json`] = json;\n  out[`${key}.count`] = String(rows.length);\n  out[`${key}.list`] = rows.map((row) => renderRecordLine(template, row, fallback).replace(/\\r?\\n/g, \" \")).join(\"\\n\");\n  rows.slice(0, STORAGE_INDEXED_RECORDS).forEach((row, i) => {\n    for (const [k, v] of Object.entries(row)) out[`${key}.${i}.${k}`] = v;\n  });\n  return out;\n}\n\n/** Text of a stored record field (\"\" for null). */\nexport function recordText(row: Record<string, unknown>): Record<string, string> {\n  const out: Record<string, string> = {};\n  for (const [k, v] of Object.entries(row)) out[k] = v === null || v === undefined ? \"\" : typeof v === \"object\" ? JSON.stringify(v) : String(v);\n  return out;\n}\n\n/** What a storage-query / storage-take / storage-aggregate block asks for, values filled with `fill`. */\nexport interface StorageBlockRequest {\n  table: string;\n  filters: StorageFilter[];\n  sort: { field: string; asc: boolean };\n  limit: number;\n  offset: number;\n  marks: Record<string, string>;\n  aggregate: { op: StorageAggregateOp; field: string; groupBy: string; top: number };\n}\n\nfunction intIn(value: ConfigValue | undefined, fallback: number, min: number, max: number): number {\n  const raw = String(value ?? \"\").trim();\n  const n = raw === \"\" ? fallback : Math.round(Number(raw));\n  return Number.isFinite(n) ? Math.min(max, Math.max(min, n)) : fallback;\n}\n\n/** Reads one of the three blocks' config; throws on bad filter or mark lines. */\nexport function storageBlockRequest(type: string, config: Record<string, ConfigValue>, fill: (value: string) => string): StorageBlockRequest {\n  const value = (key: string) => String(config[key] ?? \"\");\n  const parsed = parseStorageFilters(value(\"filters\"));\n  if (parsed.problems.length) throw new Error(parsed.problems[0]);\n  const marks = type === \"storage-take\" ? parseStorageMarks(value(\"mark\")) : { marks: {}, problems: [] };\n  if (marks.problems.length) throw new Error(marks.problems[0]);\n  const order = value(\"sortOrder\");\n  const op = value(\"operation\") as StorageAggregateOp;\n  return {\n    table: fill(value(\"table\")).trim(),\n    filters: parsed.filters.map((f) => ({ ...f, value: fill(f.value) })),\n    sort: { field: fill(value(\"sortField\")).trim(), asc: order ? order === \"asc\" : type === \"storage-take\" },\n    limit: intIn(config[\"limit\"], 25, 1, STORAGE_QUERY_MAX),\n    offset: intIn(fill(value(\"offset\")), 0, 0, STORAGE_OFFSET_MAX),\n    marks: Object.fromEntries(Object.entries(marks.marks).map(([k, v]) => [k, fill(v)])),\n    aggregate: {\n      op: STORAGE_AGGREGATE_OPS.includes(op) ? op : \"count\",\n      field: fill(value(\"field\")).trim(),\n      groupBy: fill(value(\"groupBy\")).trim(),\n      top: intIn(config[\"top\"], 10, 1, STORAGE_TOP_MAX),\n    },\n  };\n}\n\n/** Validator problems of the three blocks (filters, marks, ranges, names). */\nexport function storageBlockIssues(type: string, config: Record<string, ConfigValue>): string[] {\n  if (type !== \"storage-query\" && type !== \"storage-take\" && type !== \"storage-aggregate\") return [];\n  const out: string[] = [];\n  const value = (key: string) => String(config[key] ?? \"\").trim();\n  const filters = parseStorageFilters(value(\"filters\"));\n  out.push(...filters.problems);\n  const nameCheck = (key: string, label: string) => {\n    const v = value(key);\n    if (v && !v.includes(\"{\") && !STORAGE_FIELD_NAME.test(v)) out.push(`${label} \"${v.slice(0, 40)}\" is not a valid field name: use letters, numbers and _.`);\n  };\n  nameCheck(\"sortField\", \"sort field\");\n  const order = value(\"sortOrder\");\n  if (order && order !== \"asc\" && order !== \"desc\") out.push(`sort order must be asc or desc.`);\n  if (type === \"storage-query\") {\n    const limit = value(\"limit\");\n    if (limit && !(/^\\d+$/.test(limit) && Number(limit) >= 1 && Number(limit) <= STORAGE_QUERY_MAX))\n      out.push(`limit must be a whole number from 1 to ${STORAGE_QUERY_MAX}.`);\n    const offset = value(\"offset\");\n    if (offset && !offset.includes(\"{\") && !(/^\\d+$/.test(offset) && Number(offset) <= STORAGE_OFFSET_MAX))\n      out.push(`offset must be a whole number from 0 to ${STORAGE_OFFSET_MAX}.`);\n  }\n  let markNames: string[] = [];\n  if (type === \"storage-take\") {\n    const marks = parseStorageMarks(value(\"mark\"));\n    out.push(...marks.problems);\n    markNames = Object.keys(marks.marks);\n  }\n  if (type === \"storage-aggregate\") {\n    const op = value(\"operation\") || \"count\";\n    if (!STORAGE_AGGREGATE_OPS.includes(op as StorageAggregateOp)) out.push(`\"${op}\" is not an operation: use count, sum, avg, min or max.`);\n    else if (op !== \"count\" && !value(\"field\")) out.push(`${op} needs a field.`);\n    nameCheck(\"field\", \"field\");\n    nameCheck(\"groupBy\", \"group by\");\n    const top = value(\"top\");\n    if (top && !(/^\\d+$/.test(top) && Number(top) >= 1 && Number(top) <= STORAGE_TOP_MAX)) out.push(`top must be a whole number from 1 to ${STORAGE_TOP_MAX}.`);\n  }\n  if (usesOwnDatabase(config)) {\n    const pg = /^[A-Za-z_][A-Za-z0-9_]{0,62}$/;\n    const names = [\n      ...filters.filters.map((f) => f.field),\n      ...markNames,\n      ...[\"sortField\", \"field\", \"groupBy\"].map(value).filter((v) => v && !v.includes(\"{\")),\n    ];\n    for (const name of new Set(names)) {\n      if (STORAGE_FIELD_NAME.test(name) && !pg.test(name))\n        out.push(`\"${name}\" is not a valid PostgreSQL column name: use letters, numbers and _ (not starting with a number).`);\n    }\n  }\n  return out;\n}\n\n/**\n * Cron fields: \"*\", numbers, lists (1,3), ranges (1-5) and steps (star/15,\n * 0-30/5). Returns the problem with the expression, or null when it is valid.\n */\nexport function cronProblem(expression: string): string | null {\n  const parts = expression.trim().split(/\\s+/);\n  if (parts.length !== 5) return \"A schedule needs 5 fields: minute hour day month weekday.\";\n  const ranges: [number, number][] = [\n    [0, 59],\n    [0, 23],\n    [1, 31],\n    [1, 12],\n    [0, 7],\n  ];\n  for (let i = 0; i < 5; i++) {\n    const [min, max] = ranges[i] as [number, number];\n    for (const item of (parts[i] as string).split(\",\")) {\n      const m = /^(\\*|\\d+(?:-\\d+)?)(?:\\/(\\d+))?$/.exec(item);\n      if (!m) return `\"${item}\" is not a valid cron value.`;\n      if (m[1] !== \"*\") {\n        const [a, b = a] = (m[1] as string).split(\"-\").map(Number) as [number, number?];\n        if (a < min || (b as number) > max || a > (b as number))\n          return `\"${item}\" is outside ${min}-${max}.`;\n      }\n      if (m[2] !== undefined && Number(m[2]) < 1) return `\"${item}\" has a step below 1.`;\n    }\n  }\n  return null;\n}\n\n/** Does a valid cron expression match these clock values? */\nexport function cronFieldsMatch(\n  expression: string,\n  actual: [minute: number, hour: number, day: number, month: number, weekday: number],\n): boolean {\n  if (cronProblem(expression) !== null) return false;\n  const parts = expression.trim().split(/\\s+/);\n  const mins = [0, 0, 1, 1, 0];\n  const maxs = [59, 23, 31, 12, 7];\n  return parts.every((field, i) => {\n    const value = actual[i] as number;\n    return field.split(\",\").some((item) => {\n      const [rangePart, stepPart] = item.split(\"/\");\n      const step = stepPart === undefined ? 1 : Number(stepPart);\n      let from = mins[i] as number;\n      let to = maxs[i] as number;\n      if (rangePart !== \"*\") {\n        const [a, b] = (rangePart as string).split(\"-\").map(Number);\n        from = a as number;\n        to = b === undefined ? (stepPart === undefined ? (a as number) : (maxs[i] as number)) : b;\n      }\n      const matches = (v: number) => v >= from && v <= to && (v - from) % step === 0;\n      // Sunday is 0 or 7.\n      return i === 4 && value === 0 ? matches(0) || matches(7) : matches(value);\n    });\n  });\n}\n\nexport function validateFlow(flow: RawFlow): FlowIssue[] {\n  const issues: FlowIssue[] = [];\n  const nodes = (flow.nodes ?? []).filter((node) => node?.data && node.data.enabled !== false);\n  const byId = new Map<string, RawFlowNode>();\n  for (const node of nodes) byId.set(node.id, node);\n\n  const triggers = nodes.filter((node) => getNodeSpec(node.data.type)?.kind === \"trigger\");\n\n  if (nodes.length === 0) {\n    issues.push({ level: \"error\", code: \"empty\", message: \"This flow has no nodes yet.\" });\n    return issues;\n  }\n  if (triggers.length === 0) {\n    issues.push({\n      level: \"error\",\n      code: \"no-trigger\",\n      message: \"Add a trigger node — without one the bot has no reason to run this flow.\",\n    });\n  }\n\n  const seenCommands = new Set<string>();\n  let slashSeen = 0;\n  const seenCustomIds = new Set<string>();\n\n  for (const node of nodes) {\n    const spec = getNodeSpec(node.data.type);\n    const config = node.data.config ?? {};\n\n    if (!spec) {\n      issues.push({\n        level: \"error\",\n        code: \"unknown-node\",\n        nodeId: node.id,\n        message: `\"${node.data.type}\" is not a node this bot runtime knows how to run.`,\n      });\n      continue;\n    }\n\n    if (spec.support === \"unsupported\") {\n      issues.push({\n        level: \"warning\",\n        code: \"unsupported-node\",\n        nodeId: node.id,\n        message: `${nodeLabel(node)} is skipped at runtime. ${spec.note ?? \"\"}`.trim(),\n      });\n    } else if (spec.support === \"partial\" && spec.note) {\n      issues.push({\n        level: \"warning\",\n        code: \"partial-node\",\n        nodeId: node.id,\n        message: `${nodeLabel(node)}: ${spec.note}`,\n      });\n    }\n\n    // Discord accepts a message with only embeds or components.\n    const hasRichBody = Boolean(\n      node.data.embed ||\n      (Array.isArray(node.data.embeds) && node.data.embeds.length > 0) ||\n      (Array.isArray(node.data.components) && node.data.components.length > 0),\n    );\n    for (const key of spec.required ?? []) {\n      if (key === \"content\" && hasRichBody) continue;\n      if (str(config[key]) === \"\") {\n        issues.push({\n          level: \"error\",\n          code: \"missing-field\",\n          nodeId: node.id,\n          message: `${nodeLabel(node)} needs a value for \"${key}\".`,\n        });\n      }\n    }\n\n    if (node.data.type === \"condition\") {\n      for (const problem of conditionIssues(config)) {\n        issues.push({\n          level: \"error\",\n          code: \"bad-condition\",\n          nodeId: node.id,\n          message: `${nodeLabel(node)}: ${problem}`,\n        });\n      }\n    }\n\n    for (const problem of storageBlockIssues(node.data.type, config)) {\n      issues.push({\n        level: \"error\",\n        code: \"bad-storage\",\n        nodeId: node.id,\n        message: `${nodeLabel(node)}: ${problem}`,\n      });\n    }\n\n    for (const problem of databaseIssues(node.data.type, config)) {\n      issues.push({\n        level: problem.level,\n        code: \"database\",\n        nodeId: node.id,\n        message: `${nodeLabel(node)}: ${problem.message}`,\n      });\n    }\n\n    if (node.data.type === \"show-modal\" || node.data.type === \"component-modal\") {\n      // The older Modal block did nothing before, so it only warns (and is skipped\n      // at runtime) until it has fields.\n      for (const problem of modalFieldIssues(parseModalFields(config))) {\n        issues.push({\n          level: node.data.type === \"component-modal\" ? \"warning\" : \"error\",\n          code: \"bad-modal\",\n          nodeId: node.id,\n          message: `${nodeLabel(node)}: ${problem}`,\n        });\n      }\n    }\n\n    if (node.data.type === \"slash-command\") {\n      const name = str(config[\"name\"]).toLowerCase();\n      if (name !== \"\" && !COMMAND_NAME_PATTERN.test(name)) {\n        issues.push({\n          level: \"error\",\n          code: \"bad-command-name\",\n          nodeId: node.id,\n          message: `\"${name}\" is not a valid slash command name. Use 1-32 lowercase letters, numbers, - or _.`,\n        });\n      }\n      if (name !== \"\" && seenCommands.has(name)) {\n        issues.push({\n          level: \"error\",\n          code: \"duplicate-command\",\n          nodeId: node.id,\n          message: `Two triggers register /${name}. Discord only allows one command per name.`,\n        });\n      }\n      seenCommands.add(name);\n      slashSeen += 1;\n      if (slashSeen === 2) {\n        issues.push({\n          level: \"error\",\n          code: \"one-slash-command\",\n          nodeId: node.id,\n          message:\n            \"A command flow has one Slash Command trigger. Make another command for a second slash command; Button Click, Dropdown Select and Modal Submit triggers (or Show Modal's SUBMITTED output) can be added as often as you like.\",\n        });\n      }\n\n      if (str(config[\"description\"]).length > 100) {\n        issues.push({\n          level: \"error\",\n          code: \"long-description\",\n          nodeId: node.id,\n          message: \"Slash command descriptions are limited to 100 characters by Discord.\",\n        });\n      }\n\n      const rawOptions = Array.isArray(node.data.options) ? node.data.options : [];\n      const optionNames = new Set<string>();\n      for (const entry of rawOptions) {\n        if (typeof entry !== \"object\" || entry === null) continue;\n        const optionName = String((entry as Record<string, unknown>)[\"name\"] ?? \"\")\n          .trim()\n          .toLowerCase();\n        if (optionName === \"\" || !COMMAND_NAME_PATTERN.test(optionName)) {\n          issues.push({\n            level: \"error\",\n            code: \"bad-option-name\",\n            nodeId: node.id,\n            message: `Option \"${optionName}\" is not a valid name. Use 1-32 lowercase letters, numbers, - or _.`,\n          });\n          continue;\n        }\n        if (optionNames.has(optionName)) {\n          issues.push({\n            level: \"error\",\n            code: \"duplicate-option\",\n            nodeId: node.id,\n            message: `Two options are named \"${optionName}\". Discord rejects the command.`,\n          });\n        }\n        optionNames.add(optionName);\n      }\n      if (rawOptions.length > 25) {\n        issues.push({\n          level: \"error\",\n          code: \"too-many-options\",\n          nodeId: node.id,\n          message: \"Discord allows at most 25 options per slash command.\",\n        });\n      }\n    }\n\n    if (\n      node.data.type === \"button-click\" ||\n      node.data.type === \"dropdown-select\" ||\n      node.data.type === \"modal-submit\"\n    ) {\n      const customId = str(config[\"customId\"]);\n      if (customId.length > 100) {\n        issues.push({\n          level: \"error\",\n          code: \"long-custom-id\",\n          nodeId: node.id,\n          message: \"Discord custom IDs are limited to 100 characters.\",\n        });\n      }\n      if (customId !== \"\" && seenCustomIds.has(customId)) {\n        issues.push({\n          level: \"warning\",\n          code: \"duplicate-custom-id\",\n          nodeId: node.id,\n          message: `Another trigger already listens for \"${customId}\"; both will run.`,\n        });\n      }\n      seenCustomIds.add(customId);\n    }\n\n    for (const menu of stringSelects(node.data.components)) {\n      const options = Array.isArray(menu.options) ? menu.options : [];\n      if (options.length > SELECT_LIMITS.options) {\n        issues.push({\n          level: \"warning\",\n          code: \"too-many-select-options\",\n          nodeId: node.id,\n          message: `A select menu has ${options.length} options; Discord shows only the first ${SELECT_LIMITS.options}.`,\n        });\n      }\n      for (const option of options) {\n        const action = typeof option?.action === \"string\" ? option.action.trim() : \"\";\n        if (action.length > SELECT_LIMITS.value) {\n          issues.push({\n            level: \"error\",\n            code: \"long-option-action\",\n            nodeId: node.id,\n            message: `Select option \"${typeof option?.label === \"string\" ? option.label : \"\"}\" has an action ID over ${SELECT_LIMITS.value} characters.`,\n          });\n        }\n      }\n    }\n\n    // Discord limits that would make the API reject the request.\n    const limit = (code: string, message: string, level: FlowIssue[\"level\"] = \"error\") =>\n      issues.push({ level, code, nodeId: node.id, message: `${nodeLabel(node)}: ${message}` });\n    const literal = (key: string) => str(config[key]);\n    if (literal(\"content\").length > DISCORD_LIMITS.content && !literal(\"content\").includes(\"{\"))\n      limit(\"long-content\", `the message text is over ${DISCORD_LIMITS.content} characters.`);\n    const embeds = Array.isArray(node.data.embeds)\n      ? node.data.embeds\n      : node.data.embed\n        ? [node.data.embed]\n        : [];\n    if (node.data.messageType !== \"components\" && embeds.length > 0) {\n      const total = embeds.reduce((n: number, e) => n + embedSize(e), 0);\n      if (total > DISCORD_LIMITS.embedTotal)\n        limit(\"long-embeds\", `the embeds hold ${total} characters; Discord allows ${DISCORD_LIMITS.embedTotal} per message.`);\n      for (const e of embeds) {\n        const embed = (e ?? {}) as Record<string, unknown>;\n        if (str(embed[\"title\"] as ConfigValue).length > DISCORD_LIMITS.embedTitle)\n          limit(\"long-embed-title\", `an embed title is over ${DISCORD_LIMITS.embedTitle} characters.`, \"warning\");\n        if (str(embed[\"description\"] as ConfigValue).length > DISCORD_LIMITS.embedDescription)\n          limit(\"long-embed-description\", `an embed description is over ${DISCORD_LIMITS.embedDescription} characters.`, \"warning\");\n        if (Array.isArray(embed[\"fields\"]) && embed[\"fields\"].length > DISCORD_LIMITS.embedFields)\n          limit(\"too-many-embed-fields\", `an embed has more than ${DISCORD_LIMITS.embedFields} fields.`, \"warning\");\n      }\n    }\n    if (Array.isArray(node.data.components) && node.data.components.length > 0) {\n      const info = componentsInfo(node.data.components);\n      if (node.data.messageType === \"components\" && info.text > DISCORD_LIMITS.v2Text)\n        limit(\"long-v2-text\", `the layout holds ${info.text} characters of text; Discord allows ${DISCORD_LIMITS.v2Text} per message.`);\n      const dup = info.customIds.find((id, i) => info.customIds.indexOf(id) !== i);\n      if (dup)\n        limit(\"duplicate-component-id\", `two buttons or menus use the action \"${dup}\"; Discord rejects the whole message. Give each its own action.`);\n      if (info.duplicateOptionValues.length > 0)\n        limit(\"duplicate-option-value\", `a menu has two options with the action \"${info.duplicateOptionValues[0]}\".`);\n    }\n    const NAME_KEYS: Record<string, string> = {\n      \"create-channel\": \"name\",\n      \"rename-channel\": \"name\",\n      \"create-role\": \"name\",\n      \"edit-role\": \"name\",\n      \"create-thread\": \"name\",\n    };\n    const nameKey = NAME_KEYS[node.data.type];\n    if (nameKey && literal(nameKey).length > DISCORD_LIMITS.name && !literal(nameKey).includes(\"{\"))\n      limit(\"long-name\", `names are limited to ${DISCORD_LIMITS.name} characters.`);\n    if (node.data.type === \"set-nickname\" && literal(\"nickname\").length > DISCORD_LIMITS.nickname && !literal(\"nickname\").includes(\"{\"))\n      limit(\"long-nickname\", `nicknames are limited to ${DISCORD_LIMITS.nickname} characters.`);\n    if ((node.data.type === \"set-channel-topic\" || node.data.type === \"create-channel\") && literal(\"topic\").length > DISCORD_LIMITS.topic && !literal(\"topic\").includes(\"{\"))\n      limit(\"long-topic\", `channel topics are limited to ${DISCORD_LIMITS.topic} characters.`);\n    if (node.data.type === \"create-invite\") {\n      const age = Number(config[\"maxAge\"] ?? 0);\n      const uses = Number(config[\"maxUses\"] ?? 0);\n      if (age > DISCORD_LIMITS.inviteMaxAge)\n        limit(\"invite-max-age\", `invites can last at most ${DISCORD_LIMITS.inviteMaxAge} seconds (7 days); use 0 for never.`);\n      if (uses > DISCORD_LIMITS.inviteMaxUses)\n        limit(\"invite-max-uses\", `invites allow at most ${DISCORD_LIMITS.inviteMaxUses} uses; use 0 for unlimited.`);\n    }\n    if (node.data.type === \"create-poll\") {\n      const answers = literal(\"answers\").split(/\\r?\\n/).map((a) => a.trim()).filter(Boolean);\n      if (answers.length > 10) limit(\"poll-answers\", \"a poll has at most 10 answers.\");\n      if (answers.some((a) => a.length > 55 && !a.includes(\"{\")))\n        limit(\"poll-answer-length\", \"poll answers are limited to 55 characters.\");\n      if (literal(\"question\").length > 300 && !literal(\"question\").includes(\"{\"))\n        limit(\"poll-question-length\", \"poll questions are limited to 300 characters.\");\n      const hours = Number(config[\"hours\"] ?? 24);\n      if (!Number.isFinite(hours) || hours < 1 || hours > 768)\n        limit(\"poll-duration\", \"a poll stays open between 1 and 768 hours (32 days).\");\n    }\n    for (const problem of shopBlockIssues(node.data.type, config)) limit(\"block-config\", problem);\n    if (node.data.type === \"scheduled-event\" && literal(\"cron\") !== \"\") {\n      const problem = cronProblem(literal(\"cron\"));\n      if (problem) limit(\"bad-cron\", problem);\n    }\n\n    if (node.data.type === \"delete-messages\") {\n      const amount = Number(config[\"amount\"] ?? 0);\n      if (!Number.isFinite(amount) || amount < 1 || amount > 100) {\n        issues.push({\n          level: \"error\",\n          code: \"bulk-delete-range\",\n          nodeId: node.id,\n          message: \"Bulk delete accepts between 1 and 100 messages (Discord limit).\",\n        });\n      }\n    }\n\n    if (spec.permissions.length > 0) {\n      issues.push({\n        level: \"warning\",\n        code: \"needs-permission\",\n        nodeId: node.id,\n        message: `${nodeLabel(node)} requires the bot to have ${spec.permissions.join(\", \")} in the target channel/server.`,\n      });\n    }\n  }\n\n  // Reachability + context analysis per trigger.\n  for (const trigger of triggers) {\n    const triggerSpec = getNodeSpec(trigger.data.type);\n    if (!triggerSpec) continue;\n    const provided = new Set<ContextKind>(triggerSpec.provides ?? []);\n\n    let acknowledgedDepth = -1;\n    let delayDepth = -1;\n    let depth = 0;\n    let frontier = [trigger.id];\n    const visited = new Set<string>([trigger.id]);\n\n    while (frontier.length > 0) {\n      const nextFrontier: string[] = [];\n      depth += 1;\n\n      for (const id of frontier) {\n        const handles = outgoing(flow.edges, id);\n        for (const targets of Object.values(handles)) {\n          for (const targetId of targets) {\n            if (visited.has(targetId)) continue;\n            visited.add(targetId);\n            // Disabled and unknown nodes are skipped at runtime but the chain continues\n            // past them (see compileFlow), so keep walking without checking them.\n            nextFrontier.push(targetId);\n            const target = byId.get(targetId);\n            if (!target) continue;\n            const spec = getNodeSpec(target.data.type);\n            if (!spec || spec.support === \"unsupported\") continue;\n\n            for (const need of spec.requires) {\n              if (!provided.has(need)) {\n                issues.push({\n                  level: \"error\",\n                  code: \"missing-context\",\n                  nodeId: target.id,\n                  message: `${nodeLabel(target)} needs ${CONTEXT_LABEL[need]}, but \"${nodeLabel(trigger)}\" does not provide it.`,\n                });\n              }\n            }\n\n            if (\n              (target.data.type === \"send-message\" || target.data.type === \"send-embed\") &&\n              (target.data.config?.[\"ephemeral\"] === true || target.data.config?.[\"ephemeral\"] === \"true\")\n            ) {\n              if (!provided.has(\"interaction\")) {\n                issues.push({\n                  level: \"warning\",\n                  code: \"ephemeral-without-interaction\",\n                  nodeId: target.id,\n                  message: `${nodeLabel(target)} is set to ephemeral, but \"${nodeLabel(trigger)}\" is not an interaction, so everyone sees it.`,\n                });\n              } else if (str(target.data.config?.[\"channel\"]) !== \"\" && str(target.data.config?.[\"channel\"]) !== \"{channel}\") {\n                issues.push({\n                  level: \"warning\",\n                  code: \"ephemeral-ignores-channel\",\n                  nodeId: target.id,\n                  message: `${nodeLabel(target)} is ephemeral, so it answers the person privately and its Channel is ignored.`,\n                });\n              }\n            }\n\n            if (spec.acknowledges && acknowledgedDepth < 0) acknowledgedDepth = depth;\n            if (target.data.type === \"delay\" && delayDepth < 0) delayDepth = depth;\n          }\n        }\n      }\n      frontier = nextFrontier;\n    }\n\n    // Interaction triggers must be answered; Discord invalidates the token after 3s.\n    if (provided.has(\"interaction\")) {\n      const answered = [...visited].some((id) => {\n        const node = byId.get(id);\n        if (!node) return false;\n        const spec = getNodeSpec(node.data.type);\n        return Boolean(spec?.acknowledges) || node.data.type === \"send-message\";\n      });\n      if (!answered) {\n        issues.push({\n          level: \"warning\",\n          code: \"unacknowledged-interaction\",\n          nodeId: trigger.id,\n          message:\n            'This interaction is never answered. Discord shows \"The application did not respond\" unless a Reply node runs. The runtime defers the reply automatically, but add a Reply to control what the user sees.',\n        });\n      }\n      if (delayDepth >= 0 && (acknowledgedDepth < 0 || delayDepth < acknowledgedDepth)) {\n        issues.push({\n          level: \"warning\",\n          code: \"delay-before-ack\",\n          nodeId: trigger.id,\n          message:\n            \"A Delay runs before this interaction is answered. Discord's interaction token expires after 3 seconds, so reply (or defer) first.\",\n        });\n      }\n    }\n  }\n\n  // A modal has to be the interaction's first answer, and it has no message to\n  // follow up: answer it in the Modal Submit trigger's flow instead.\n  const PURE_BEFORE_MODAL = new Set([\n    \"if-else\",\n    \"check-permission\",\n    \"check-role\",\n    \"check-channel\",\n    \"check-context\",\n    \"is-bot\",\n    \"compare\",\n    \"contains\",\n    \"equals\",\n    \"random\",\n    \"switch\",\n    \"regex-match\",\n    \"set-variable\",\n    \"get-variable\",\n    \"format-text\",\n    \"math\",\n    \"string-op\",\n    \"random-number\",\n    \"random-choice\",\n    \"timestamp-format\",\n    \"increment\",\n    \"decrement\",\n    \"global-get\",\n    \"global-set\",\n    \"cooldown\",\n    \"rate-counter\",\n    \"log-event\",\n  ]);\n  for (const trigger of triggers) {\n    if (!(getNodeSpec(trigger.data.type)?.provides ?? []).includes(\"interaction\")) continue;\n    const before: RawFlowNode[] = [];\n    const seen = new Set<string>([trigger.id]);\n    let frontier = [trigger.id];\n    while (frontier.length > 0) {\n      const next: string[] = [];\n      for (const id of frontier) {\n        for (const targets of Object.values(outgoing(flow.edges, id))) {\n          for (const targetId of targets) {\n            if (seen.has(targetId)) continue;\n            seen.add(targetId);\n            const target = byId.get(targetId);\n            if (!target || getNodeSpec(target.data.type)?.kind === \"trigger\") continue;\n            const type = target.data.type;\n            if (type === \"show-modal\" || type === \"component-modal\") {\n              const slow = before.filter((n) => !PURE_BEFORE_MODAL.has(n.data.type));\n              if (slow.length > 0) {\n                issues.push({\n                  level: \"warning\",\n                  code: \"slow-before-modal\",\n                  nodeId: target.id,\n                  message: `${nodeLabel(target)} must be the first answer within 3 seconds; ${slow\n                    .slice(0, 3)\n                    .map(nodeLabel)\n                    .join(\", \")} run before it. Show the modal first.`,\n                });\n              }\n              // Anything that answers on SHOWN fails at runtime; SUBMITTED is a new interaction.\n              const after = new Set<string>([target.id]);\n              let walk = [target.id];\n              while (walk.length > 0) {\n                const more: string[] = [];\n                for (const from of walk) {\n                  const lists =\n                    from === target.id\n                      ? [outgoing(flow.edges, from)[\"out\"] ?? []]\n                      : Object.values(outgoing(flow.edges, from));\n                  for (const list of lists) {\n                    for (const to of list) {\n                      if (after.has(to)) continue;\n                      after.add(to);\n                      const node = byId.get(to);\n                      if (!node || getNodeSpec(node.data.type)?.kind === \"trigger\") continue;\n                      more.push(to);\n                      const answers =\n                        node.data.type === \"reply\" ||\n                        node.data.type === \"defer-reply\" ||\n                        ((node.data.type === \"send-message\" || node.data.type === \"send-embed\") &&\n                          (node.data.config?.[\"ephemeral\"] === true ||\n                            node.data.config?.[\"ephemeral\"] === \"true\"));\n                      if (answers) {\n                        issues.push({\n                          level: \"error\",\n                          code: \"answer-after-modal\",\n                          nodeId: node.id,\n                          message: `${nodeLabel(node)} runs after ${nodeLabel(target)}, but blocks on its SHOWN output run before the form is sent. Connect it to the SUBMITTED output (or a Modal Submit trigger) to answer the form.`,\n                        });\n                      }\n                    }\n                  }\n                }\n                walk = more;\n              }\n              continue;\n            }\n            before.push(target);\n            next.push(targetId);\n          }\n        }\n      }\n      frontier = next;\n    }\n  }\n\n  // Unreachable analysis runs once, across all triggers.\n  if (triggers.length > 0) {\n    for (const node of nodes) {\n      const spec = getNodeSpec(node.data.type);\n      if (spec?.kind === \"trigger\") continue;\n      if (!isReachableFromAnyTrigger(flow, triggers, node.id)) {\n        issues.push({\n          level: \"warning\",\n          code: \"unreachable\",\n          nodeId: node.id,\n          message: `${nodeLabel(node)} is not connected to any trigger, so it never runs.`,\n        });\n      }\n    }\n  }\n\n  return dedupeIssues(issues);\n}\n\nfunction isReachableFromAnyTrigger(\n  flow: RawFlow,\n  triggers: RawFlowNode[],\n  nodeId: string,\n): boolean {\n  for (const trigger of triggers) {\n    const visited = new Set<string>([trigger.id]);\n    const stack = [trigger.id];\n    while (stack.length > 0) {\n      const current = stack.pop() as string;\n      for (const targets of Object.values(outgoing(flow.edges, current))) {\n        for (const target of targets) {\n          if (target === nodeId) return true;\n          if (visited.has(target)) continue;\n          visited.add(target);\n          stack.push(target);\n        }\n      }\n    }\n  }\n  return false;\n}\n\nfunction dedupeIssues(issues: FlowIssue[]): FlowIssue[] {\n  const seen = new Set<string>();\n  const out: FlowIssue[] = [];\n  for (const issue of issues) {\n    const key = `${issue.level}|${issue.code}|${issue.nodeId ?? \"\"}|${issue.message}`;\n    if (seen.has(key)) continue;\n    seen.add(key);\n    out.push(issue);\n  }\n  return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Compilation\n * ------------------------------------------------------------------ */\n\nconst OPTION_TYPES = new Set([\n  \"string\",\n  \"integer\",\n  \"number\",\n  \"boolean\",\n  \"user\",\n  \"role\",\n  \"channel\",\n  \"mentionable\",\n  \"attachment\",\n]);\n\n/** \"a, b, c\" (or an array) → up to 25 unique suggestions of max 100 characters. */\nexport function suggestionList(raw: unknown): string[] {\n  const parts = Array.isArray(raw) ? raw.map(String) : String(raw ?? \"\").split(\",\");\n  const out: string[] = [];\n  for (const part of parts) {\n    const value = part.trim().slice(0, 100);\n    if (value !== \"\" && !out.includes(value)) out.push(value);\n    if (out.length >= 25) break;\n  }\n  return out;\n}\n\nfunction compileOptions(raw: unknown): CompiledCommandOption[] {\n  if (!Array.isArray(raw)) return [];\n  const options: CompiledCommandOption[] = [];\n  for (const entry of raw) {\n    if (typeof entry !== \"object\" || entry === null) continue;\n    const record = entry as Record<string, unknown>;\n    const name = String(record[\"name\"] ?? \"\")\n      .trim()\n      .toLowerCase();\n    if (name === \"\" || !COMMAND_NAME_PATTERN.test(name)) continue;\n    const type = String(record[\"type\"] ?? \"string\");\n    options.push({\n      name,\n      description: String(record[\"description\"] ?? \"\").slice(0, 100) || name,\n      type: OPTION_TYPES.has(type) ? type : \"string\",\n      required: record[\"required\"] === true,\n      autocomplete: record[\"autocomplete\"] === true,\n      ...(record[\"autocomplete\"] === true ? { suggestions: suggestionList(record[\"suggestions\"]) } : {}),\n    });\n  }\n  // Discord requires required options before optional ones.\n  return [...options.filter((o) => o.required), ...options.filter((o) => !o.required)];\n}\n\nexport interface CompileResult {\n  compiled: CompiledFlow | null;\n  issues: FlowIssue[];\n}\n\n/**\n * Turns a builder graph into the executable form. Returns `compiled: null`\n * when validation produced errors — the runtime must never receive a graph\n * that the control plane knows is broken.\n */\nexport function compileFlow(flow: RawFlow): CompileResult {\n  const issues = validateFlow(flow);\n  if (issues.some((issue) => issue.level === \"error\")) return { compiled: null, issues };\n\n  const enabled = (flow.nodes ?? []).filter((node) => node?.data && node.data.enabled !== false);\n  const known = enabled.filter((node) => {\n    const spec = getNodeSpec(node.data.type);\n    return spec !== null && spec.support !== \"unsupported\";\n  });\n  const keep = new Set(known.map((node) => node.id));\n\n  const nodes: Record<string, CompiledNode> = {};\n  for (const node of known) {\n    const handles = outgoing(flow.edges, node.id);\n    const next: Record<string, string[]> = {};\n    for (const [handle, targets] of Object.entries(handles)) {\n      // Skipped (unsupported) nodes are bridged over, so the rest of the chain\n      // still runs instead of silently dead-ending.\n      const resolved: string[] = [];\n      for (const target of targets) resolved.push(...resolveTarget(flow, keep, target, new Set()));\n      // A line into a trigger (message → its Button Click) is only a visual\n      // hint: the trigger starts its own run, it is never a step of this one.\n      const steps = resolved.filter((id) => {\n        const target = known.find((n) => n.id === id);\n        return getNodeSpec(target?.data.type ?? \"\")?.kind !== \"trigger\";\n      });\n      if (steps.length > 0) next[handle] = sortLeftToRight(steps, known);\n    }\n\n    nodes[node.id] = {\n      id: node.id,\n      type: node.data.type,\n      title: str(node.data.title as ConfigValue) || node.data.type,\n      config: node.data.config ?? {},\n      embed: node.data.embed ?? null,\n      embeds: node.data.embeds ?? null,\n      components: node.data.components ?? null,\n      messageType: node.data.messageType ?? null,\n      next,\n    };\n  }\n\n  const triggers: CompiledTrigger[] = [];\n  const commands: CompiledCommand[] = [];\n  const intents = new Set<string>([\"Guilds\"]);\n\n  for (const node of known) {\n    const spec = getNodeSpec(node.data.type) as NodeSpec;\n    for (const intent of spec.intents) intents.add(intent);\n\n    if (spec.kind !== \"trigger\") continue;\n    const config = node.data.config ?? {};\n    triggers.push({ nodeId: node.id, type: node.data.type, config });\n\n    if (node.data.type === \"slash-command\") {\n      const scope = str(config[\"scope\"]);\n      // \"auto\" (and older flows): server only when a block needs a server.\n      const needsGuild = known.some((n) =>\n        (getNodeSpec(n.data.type)?.requires ?? []).some((r) => r === \"guild\" || r === \"member\"),\n      );\n      const bit = COMMAND_PERMISSION_BITS[str(config[\"memberPermission\"])];\n      commands.push({\n        name: str(config[\"name\"]).toLowerCase(),\n        description: str(config[\"description\"]).slice(0, 100) || \"A Bottly command\",\n        nodeId: node.id,\n        options: compileOptions(node.data.options),\n        ...(scope === \"guild\" || (scope !== \"everywhere\" && needsGuild) ? { guildOnly: true } : {}),\n        ...(bit !== undefined ? { memberPermissions: (BigInt(1) << BigInt(bit)).toString() } : {}),\n      });\n    }\n  }\n\n  return {\n    compiled: {\n      contractVersion: FLOW_CONTRACT_VERSION,\n      flowId: flow.id,\n      flowName: flow.name,\n      intents: [...intents],\n      triggers,\n      commands,\n      nodes,\n    },\n    issues,\n  };\n}\n\n/**\n * Several blocks on one output run one after another, left to right as they\n * sit on the canvas (then top to bottom), so the order is the one people see.\n * Blocks without a position keep the order their connections were made.\n */\nexport function sortLeftToRight(ids: string[], nodes: RawFlowNode[]): string[] {\n  const pos = new Map(nodes.map((n) => [n.id, n.position]));\n  return ids\n    .map((id, index) => ({ id, index, p: pos.get(id) }))\n    .sort((a, b) => {\n      if (!a.p || !b.p) return a.index - b.index;\n      return a.p.x - b.p.x || a.p.y - b.p.y || a.index - b.index;\n    })\n    .map((t) => t.id);\n}\n\n/** Walks past skipped nodes to the first executable descendant(s). */\nfunction resolveTarget(\n  flow: RawFlow,\n  keep: Set<string>,\n  target: string,\n  seen: Set<string>,\n): string[] {\n  if (keep.has(target)) return [target];\n  if (seen.has(target)) return [];\n  seen.add(target);\n\n  const out: string[] = [];\n  for (const targets of Object.values(outgoing(flow.edges, target))) {\n    for (const next of targets) out.push(...resolveTarget(flow, keep, next, seen));\n  }\n  return out;\n}\n\n/** Node-support matrix, used by the docs page and the builder's help panel. */\nexport function supportMatrix(): {\n  type: string;\n  support: NodeSupport;\n  discord: string;\n  note: string;\n}[] {\n  return Object.entries(NODE_SPECS).map(([type, spec]) => ({\n    type,\n    support: spec.support,\n    discord: spec.discord,\n    note: spec.note ?? \"\",\n  }));\n}\n\n/* ------------------------------------------------------------------ *\n * SellAuth API operations (1:1 with https://docs.sellauth.com/openapi.yaml)\n * Shared by the builder (operation picker) and the runtime (request maker).\n * Paths are relative to /v1/shops/{shopId}; {id} / {id2} come from the node.\n * ------------------------------------------------------------------ */\n\nexport interface SellAuthOperation {\n  id: string;\n  label: string;\n  method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n  path: string;\n  /** Documented parameter names (query for GET, JSON body otherwise). */\n  params: string[];\n  /** Response is a (paginated) list. */\n  list?: boolean;\n}\n\nexport const SELLAUTH_OPERATIONS: SellAuthOperation[] = [\n  { id: \"shop.stats\", label: \"Shop: Get stats\", method: \"GET\", path: \"/stats\", params: [] },\n  {\n    id: \"invoices.list\",\n    label: \"Invoices: List\",\n    method: \"GET\",\n    path: \"/invoices\",\n    params: [\n      \"page\",\n      \"perPage\",\n      \"orderColumn\",\n      \"orderDirection\",\n      \"id\",\n      \"statuses\",\n      \"email\",\n      \"gateways\",\n    ],\n    list: true,\n  },\n  { id: \"invoices.get\", label: \"Invoices: Get\", method: \"GET\", path: \"/invoices/{id}\", params: [] },\n  {\n    id: \"invoices.process\",\n    label: \"Invoices: Process\",\n    method: \"GET\",\n    path: \"/invoices/{id}/process\",\n    params: [\"mark_as_paid\"],\n  },\n  {\n    id: \"invoices.status\",\n    label: \"Invoices: Update status\",\n    method: \"POST\",\n    path: \"/invoices/{id}/status\",\n    params: [\"status\"],\n  },\n  {\n    id: \"invoices.archive\",\n    label: \"Invoices: Archive\",\n    method: \"POST\",\n    path: \"/invoices/{id}/archive\",\n    params: [],\n  },\n  {\n    id: \"invoices.unarchive\",\n    label: \"Invoices: Unarchive\",\n    method: \"POST\",\n    path: \"/invoices/{id}/unarchive\",\n    params: [],\n  },\n  {\n    id: \"invoices.note\",\n    label: \"Invoices: Update dashboard note\",\n    method: \"PUT\",\n    path: \"/invoices/{id}/dashboard-note\",\n    params: [\"dashboard_note\"],\n  },\n  {\n    id: \"invoices.paid\",\n    label: \"Invoices: Update paid amount\",\n    method: \"PUT\",\n    path: \"/invoices/{id}/paid-amount\",\n    params: [\"paid\", \"paid_usd\"],\n  },\n  {\n    id: \"invoices.ship\",\n    label: \"Invoices: Mark as shipped\",\n    method: \"POST\",\n    path: \"/invoices/{id}/ship\",\n    params: [\"tracking_code\", \"tracking_link\"],\n  },\n  {\n    id: \"invoices.deliver\",\n    label: \"Invoices: Deliver\",\n    method: \"POST\",\n    path: \"/invoices/{id}/deliver\",\n    params: [],\n  },\n  {\n    id: \"invoices.replace\",\n    label: \"Invoices: Replace delivered\",\n    method: \"POST\",\n    path: \"/invoices/{id}/replace-delivered\",\n    params: [\"invoice_item_id\", \"replacements\"],\n  },\n  {\n    id: \"invoices.redo-dynamic\",\n    label: \"Invoices: Redo dynamic delivery\",\n    method: \"POST\",\n    path: \"/invoices/{id}/redo-dynamic-delivery\",\n    params: [\"invoice_item_id\"],\n  },\n  {\n    id: \"invoices.resend\",\n    label: \"Invoices: Resend email\",\n    method: \"POST\",\n    path: \"/invoices/{id}/resend-email\",\n    params: [\"email\"],\n  },\n  {\n    id: \"invoices.reverse-affiliate\",\n    label: \"Invoices: Reverse affiliate commission\",\n    method: \"POST\",\n    path: \"/invoices/{id}/reverse-affiliate-commission\",\n    params: [],\n  },\n  {\n    id: \"invoices.reverse-cashback\",\n    label: \"Invoices: Reverse cashback\",\n    method: \"POST\",\n    path: \"/invoices/{id}/reverse-cashback\",\n    params: [],\n  },\n  {\n    id: \"products.list\",\n    label: \"Products: List\",\n    method: \"GET\",\n    path: \"/products\",\n    params: [\"page\", \"perPage\", \"orderColumn\", \"orderDirection\", \"type\", \"ids\", \"name\"],\n    list: true,\n  },\n  { id: \"products.get\", label: \"Products: Get\", method: \"GET\", path: \"/products/{id}\", params: [] },\n  {\n    id: \"products.delete\",\n    label: \"Products: Delete\",\n    method: \"DELETE\",\n    path: \"/products/{id}\",\n    params: [],\n  },\n  {\n    id: \"products.clone\",\n    label: \"Products: Clone\",\n    method: \"POST\",\n    path: \"/products/{id}/clone\",\n    params: [],\n  },\n  {\n    id: \"products.stock\",\n    label: \"Products: Update stock (variant)\",\n    method: \"PUT\",\n    path: \"/products/{id}/stock/{id2}\",\n    params: [\"stock\"],\n  },\n  {\n    id: \"products.deliverables\",\n    label: \"Products: Get deliverables (variant)\",\n    method: \"GET\",\n    path: \"/products/{id}/deliverables/{id2}\",\n    params: [],\n  },\n  {\n    id: \"products.deliverables-append\",\n    label: \"Products: Append deliverables\",\n    method: \"PUT\",\n    path: \"/products/{id}/deliverables/append/{id2}\",\n    params: [\"deliverables\"],\n  },\n  {\n    id: \"products.deliverables-overwrite\",\n    label: \"Products: Overwrite deliverables\",\n    method: \"PUT\",\n    path: \"/products/{id}/deliverables/overwrite/{id2}\",\n    params: [\"deliverables\", \"confirm_empty\"],\n  },\n  {\n    id: \"coupons.list\",\n    label: \"Coupons: List\",\n    method: \"GET\",\n    path: \"/coupons\",\n    params: [\"page\", \"perPage\", \"code\", \"statuses\", \"type\"],\n    list: true,\n  },\n  { id: \"coupons.get\", label: \"Coupons: Get\", method: \"GET\", path: \"/coupons/{id}\", params: [] },\n  {\n    id: \"coupons.create\",\n    label: \"Coupons: Create\",\n    method: \"POST\",\n    path: \"/coupons\",\n    params: [\n      \"code\",\n      \"global\",\n      \"discount\",\n      \"type\",\n      \"max_uses\",\n      \"max_uses_per_customer\",\n      \"min_invoice_price\",\n      \"start_date\",\n      \"expiration_date\",\n      \"items\",\n    ],\n  },\n  {\n    id: \"coupons.update\",\n    label: \"Coupons: Update\",\n    method: \"PUT\",\n    path: \"/coupons/{id}/update\",\n    params: [\n      \"code\",\n      \"global\",\n      \"discount\",\n      \"type\",\n      \"max_uses\",\n      \"max_uses_per_customer\",\n      \"min_invoice_price\",\n      \"start_date\",\n      \"expiration_date\",\n    ],\n  },\n  {\n    id: \"coupons.delete\",\n    label: \"Coupons: Delete\",\n    method: \"DELETE\",\n    path: \"/coupons/{id}\",\n    params: [],\n  },\n  {\n    id: \"coupons.delete-used\",\n    label: \"Coupons: Delete used\",\n    method: \"DELETE\",\n    path: \"/coupons/used\",\n    params: [],\n  },\n  {\n    id: \"customers.list\",\n    label: \"Customers: List\",\n    method: \"GET\",\n    path: \"/customers\",\n    params: [\"page\", \"perPage\", \"id\", \"email\", \"discord_id\", \"discord_username\"],\n    list: true,\n  },\n  {\n    id: \"customers.get\",\n    label: \"Customers: Get\",\n    method: \"GET\",\n    path: \"/customers/{id}\",\n    params: [],\n  },\n  {\n    id: \"customers.create\",\n    label: \"Customers: Create\",\n    method: \"POST\",\n    path: \"/customers\",\n    params: [\"email\", \"newsletter\"],\n  },\n  {\n    id: \"customers.delete\",\n    label: \"Customers: Delete\",\n    method: \"DELETE\",\n    path: \"/customers/{id}\",\n    params: [],\n  },\n  {\n    id: \"customers.balance\",\n    label: \"Customers: Edit balance\",\n    method: \"PUT\",\n    path: \"/customers/{id}/balance\",\n    params: [\"amount\", \"description\", \"invoice_id\"],\n  },\n  {\n    id: \"customers.balance-history\",\n    label: \"Customers: Balance transactions\",\n    method: \"GET\",\n    path: \"/customers/{id}/balance-transactions\",\n    params: [],\n    list: true,\n  },\n  {\n    id: \"customers.newsletter\",\n    label: \"Customers: Set newsletter\",\n    method: \"PUT\",\n    path: \"/customers/{id}/newsletter\",\n    params: [\"newsletter\"],\n  },\n  {\n    id: \"customers.discord-revoke\",\n    label: \"Customers: Revoke Discord login\",\n    method: \"POST\",\n    path: \"/customers/{id}/discord/revoke\",\n    params: [],\n  },\n  {\n    id: \"customers.tfa-disable\",\n    label: \"Customers: Disable 2FA\",\n    method: \"POST\",\n    path: \"/customers/{id}/tfa/disable\",\n    params: [],\n  },\n  {\n    id: \"subscriptions.list\",\n    label: \"Subscriptions: List\",\n    method: \"GET\",\n    path: \"/subscriptions\",\n    params: [\"status\", \"product_id\", \"customer_id\", \"perPage\"],\n    list: true,\n  },\n  {\n    id: \"subscriptions.get\",\n    label: \"Subscriptions: Get\",\n    method: \"GET\",\n    path: \"/subscriptions/{id}\",\n    params: [],\n  },\n  {\n    id: \"subscriptions.cancel\",\n    label: \"Subscriptions: Cancel\",\n    method: \"POST\",\n    path: \"/subscriptions/{id}/cancel\",\n    params: [\"at_period_end\"],\n  },\n  {\n    id: \"checkout.create\",\n    label: \"Checkout: Create session\",\n    method: \"POST\",\n    path: \"/checkout\",\n    params: [\"cart\", \"email\", \"discord_user_id\", \"coupon\", \"gateway\", \"currency\"],\n  },\n  {\n    id: \"tickets.list\",\n    label: \"Tickets: List\",\n    method: \"GET\",\n    path: \"/tickets\",\n    params: [\"page\", \"perPage\", \"statuses\", \"customer_email\"],\n    list: true,\n  },\n  {\n    id: \"tickets.stats\",\n    label: \"Tickets: Stats\",\n    method: \"GET\",\n    path: \"/tickets/stats\",\n    params: [],\n  },\n  { id: \"tickets.get\", label: \"Tickets: Get\", method: \"GET\", path: \"/tickets/{id}\", params: [] },\n  {\n    id: \"tickets.create\",\n    label: \"Tickets: Create\",\n    method: \"POST\",\n    path: \"/tickets\",\n    params: [\"customer_id\", \"subject\", \"invoice_id\"],\n  },\n  {\n    id: \"tickets.close\",\n    label: \"Tickets: Close\",\n    method: \"POST\",\n    path: \"/tickets/{id}/close\",\n    params: [],\n  },\n  {\n    id: \"tickets.reopen\",\n    label: \"Tickets: Reopen\",\n    method: \"POST\",\n    path: \"/tickets/{id}/reopen\",\n    params: [],\n  },\n  {\n    id: \"tickets.message\",\n    label: \"Tickets: Send message\",\n    method: \"POST\",\n    path: \"/tickets/{id}/messages\",\n    params: [\"content\"],\n  },\n  {\n    id: \"feedbacks.list\",\n    label: \"Feedback: List\",\n    method: \"GET\",\n    path: \"/feedbacks\",\n    params: [\"page\", \"perPage\", \"statuses\", \"invoice_id\", \"rating\"],\n    list: true,\n  },\n  {\n    id: \"feedbacks.stats\",\n    label: \"Feedback: Stats\",\n    method: \"GET\",\n    path: \"/feedbacks/stats\",\n    params: [\"created_at_start\", \"created_at_end\"],\n  },\n  {\n    id: \"feedbacks.get\",\n    label: \"Feedback: Get\",\n    method: \"GET\",\n    path: \"/feedbacks/{id}\",\n    params: [],\n  },\n  {\n    id: \"feedbacks.reply\",\n    label: \"Feedback: Reply\",\n    method: \"POST\",\n    path: \"/feedbacks/{id}/reply\",\n    params: [\"reply\"],\n  },\n  {\n    id: \"feedbacks.dispute\",\n    label: \"Feedback: Dispute\",\n    method: \"POST\",\n    path: \"/feedbacks/{id}/dispute\",\n    params: [\"reason\"],\n  },\n  {\n    id: \"abandoned.list\",\n    label: \"Abandoned checkouts: List\",\n    method: \"GET\",\n    path: \"/abandoned-checkouts\",\n    params: [\"page\", \"perPage\", \"search\", \"date_from\", \"date_to\"],\n    list: true,\n  },\n  {\n    id: \"abandoned.stats\",\n    label: \"Abandoned checkouts: Stats\",\n    method: \"GET\",\n    path: \"/abandoned-checkouts/stats\",\n    params: [],\n  },\n  {\n    id: \"abandoned.recover\",\n    label: \"Abandoned checkouts: Send recovery\",\n    method: \"POST\",\n    path: \"/abandoned-checkouts/{id}/recover\",\n    params: [],\n  },\n  {\n    id: \"analytics.top-products\",\n    label: \"Analytics: Top products\",\n    method: \"GET\",\n    path: \"/analytics/top-products\",\n    params: [],\n    list: true,\n  },\n  {\n    id: \"analytics.top-customers\",\n    label: \"Analytics: Top customers\",\n    method: \"GET\",\n    path: \"/analytics/top-customers\",\n    params: [],\n    list: true,\n  },\n  {\n    id: \"analytics.traffic\",\n    label: \"Analytics: Traffic stats\",\n    method: \"GET\",\n    path: \"/analytics/traffic/stats\",\n    params: [],\n  },\n  { id: \"custom\", label: \"Custom endpoint\", method: \"GET\", path: \"\", params: [] },\n];\n\n/** Parameters the SellAuth API documents as text: never coerced to numbers or booleans. */\nconst SELLAUTH_TEXT_PARAMS = new Set([\n  \"code\",\n  \"content\",\n  \"coupon\",\n  \"created_at_end\",\n  \"created_at_start\",\n  \"currency\",\n  \"customer_email\",\n  \"dashboard_note\",\n  \"date_from\",\n  \"date_to\",\n  \"description\",\n  \"discord_id\",\n  \"discord_user_id\",\n  \"discord_username\",\n  \"email\",\n  \"expiration_date\",\n  \"gateway\",\n  \"id\",\n  \"name\",\n  \"orderColumn\",\n  \"orderDirection\",\n  \"reason\",\n  \"reply\",\n  \"search\",\n  \"start_date\",\n  \"status\",\n  \"subject\",\n  \"tracking_code\",\n  \"tracking_link\",\n  \"type\",\n]);\n\n/** Array parameters: a plain value is split on commas / new lines (e.g. keys=a,b,c). */\nconst SELLAUTH_LIST_PARAMS = new Set([\"deliverables\", \"ids\", \"statuses\"]);\n\nconst VARIABLE_TOKEN = /\\{([a-zA-Z0-9_.-]+)\\}/g;\n\n/**\n * Parse \"key=value\" lines into typed values (numbers, booleans, JSON arrays/objects).\n * `resolve` fills {variables} per value AFTER the line is split, so user input can\n * never add lines, change types of text fields or break out of a JSON value.\n */\nexport function parseSellAuthParams(\n  raw: string,\n  resolve: (token: string) => string = (t) => t,\n): Record<string, unknown> {\n  const out: Record<string, unknown> = {};\n  for (const line of raw.split(/\\r?\\n/)) {\n    const eq = line.indexOf(\"=\");\n    if (eq <= 0) continue;\n    const key = line.slice(0, eq).trim();\n    const template = line.slice(eq + 1).trim();\n    if (!key || template === \"\") continue;\n    if (/^(\\[|\\{\\s*[\"}])/.test(template)) {\n      // JSON array/object template: substituted values are JSON-escaped (quoted fields stay strings).\n      const json = template.replace(VARIABLE_TOKEN, (token) =>\n        JSON.stringify(resolve(token)).slice(1, -1),\n      );\n      try {\n        out[key] = JSON.parse(json);\n      } catch {\n        out[key] = json;\n      }\n      continue;\n    }\n    const value = template.replace(VARIABLE_TOKEN, (token) => resolve(token)).trim();\n    if (value === \"\") continue;\n    if (SELLAUTH_LIST_PARAMS.has(key))\n      out[key] = value\n        .split(/[\\n,]/)\n        .map((item) => item.trim())\n        .filter(Boolean);\n    else if (SELLAUTH_TEXT_PARAMS.has(key)) out[key] = value;\n    else if (/^-?(0|[1-9]\\d{0,14})(\\.\\d+)?$/.test(value)) out[key] = Number(value);\n    else if (value === \"true\" || value === \"false\") out[key] = value === \"true\";\n    else out[key] = value;\n  }\n  return out;\n}\n\n/** Build the SellAuth request (path relative to /v1/shops/{shop}) for an operation. */\nexport function buildSellAuthRequest(\n  operationId: string,\n  input: { id?: string; id2?: string; params?: string; method?: string; path?: string },\n  resolve?: (token: string) => string,\n): { method: string; path: string; body?: Record<string, unknown> } {\n  const op = SELLAUTH_OPERATIONS.find((o) => o.id === operationId);\n  if (!op) throw new Error(`Unknown SellAuth operation \"${operationId}\".`);\n  const method = op.id === \"custom\" ? (input.method || \"GET\").toUpperCase() : op.method;\n  let path = op.id === \"custom\" ? (input.path || \"\").trim() : op.path;\n  if (!path.startsWith(\"/\")) path = `/${path}`;\n  for (const [token, value] of [\n    [\"{id}\", input.id],\n    [\"{id2}\", input.id2],\n  ] as const) {\n    if (!path.includes(token)) continue;\n    if (!value)\n      throw new Error(\n        `SellAuth \"${op.label}\" needs ${token === \"{id}\" ? \"an ID\" : \"a second ID (variant)\"}.`,\n      );\n    path = path.replace(token, encodeURIComponent(value));\n  }\n  const params = parseSellAuthParams(input.params ?? \"\", resolve);\n  if (method === \"GET\" || method === \"DELETE\") {\n    const qs = new URLSearchParams();\n    for (const [k, v] of Object.entries(params)) {\n      if (Array.isArray(v)) for (const item of v) qs.append(`${k}[]`, String(item));\n      else qs.append(k, typeof v === \"object\" ? JSON.stringify(v) : String(v));\n    }\n    const q = qs.toString();\n    return { method, path: q ? `${path}?${q}` : path };\n  }\n  return { method, path, body: params };\n}\n\n/* ------------------------------------------------------------------ *\n * Message components shared by the editor, preview and runtime\n * ------------------------------------------------------------------ */\n\n/** Discord's limits for select menus (same rules Discohook enforces). */\nexport const SELECT_LIMITS = {\n  options: 25,\n  label: 100,\n  description: 100,\n  value: 100,\n  placeholder: 150,\n  customId: 100,\n} as const;\n\n/** A partial Discord emoji: unicode (`name` only) or custom (`id` + `name`). */\nexport interface ComponentEmoji {\n  id?: string;\n  name: string;\n  animated?: boolean;\n}\n\nconst EMOJI_CDN =\n  /^https?:\\/\\/(?:media\\.|cdn\\.)?discord(?:app)?\\.(?:com|net)\\/emojis\\/(\\d{17,20})\\.(png|webp|gif|jpe?g)(\\?[^\\s]*)?$/i;\nconst PICTOGRAPHIC = /\\p{Extended_Pictographic}|\\p{Regional_Indicator}/u;\n\n/**\n * Parses what a user typed in an emoji field: a unicode emoji (\"🔥\"), Discord's\n * custom emoji syntax (\"<:name:id>\", \"<a:name:id>\", \"name:id\"), a bare emoji ID\n * or an emoji CDN URL. Returns null when it is not a usable emoji.\n */\nexport function parseComponentEmoji(raw: string | null | undefined): ComponentEmoji | null {\n  const value = (raw ?? \"\").trim();\n  if (value === \"\") return null;\n  const custom =\n    /^<(a)?:([\\w~]{1,32}):(\\d{1,20})>$/.exec(value) ??\n    /^(?:(a):)?:?([\\w~]{1,32}):(\\d{17,20})$/.exec(value);\n  if (custom) return { id: custom[3]!, name: custom[2]!, ...(custom[1] ? { animated: true } : {}) };\n  if (/^\\d{17,20}$/.test(value)) return { id: value, name: \"emoji\" };\n  const url = EMOJI_CDN.exec(value);\n  if (url) {\n    const animated = url[2]!.toLowerCase() === \"gif\" || /[?&]animated=true/i.test(url[3] ?? \"\");\n    return { id: url[1]!, name: \"emoji\", ...(animated ? { animated: true } : {}) };\n  }\n  // A unicode emoji (with skin tones / ZWJ sequences) never contains plain text.\n  const bare = value.replace(/[0-9#*]\\ufe0f?\\u20e3/g, \"\\u{1f522}\"); // keycaps such as 1️⃣\n  if (value.length <= 32 && PICTOGRAPHIC.test(bare) && !/[\\s\\w<>:]/.test(bare))\n    return { name: value };\n  return null;\n}\n\n/** Image URL of a custom emoji, or null for unicode emojis. */\nexport function componentEmojiUrl(emoji: ComponentEmoji | null): string | null {\n  if (!emoji?.id) return null;\n  return `https://cdn.discordapp.com/emojis/${emoji.id}.webp?size=48${emoji.animated ? \"&animated=true\" : \"\"}`;\n}\n\n/**\n * custom_id of a select menu. String selects have no user-facing ID any more\n * (each option carries its own action ID), so it is derived from the stable\n * component id; an older menu keeps the action ID it was saved with.\n */\nexport function selectMenuCustomId(component: { id?: string; action?: string }, index = 0): string {\n  const legacy = (component.action ?? \"\").trim();\n  if (legacy !== \"\") return legacy.slice(0, SELECT_LIMITS.customId);\n  const id = (component.id ?? \"\").trim();\n  return (id !== \"\" ? `sel_${id}` : `bottly_${index}`).slice(0, SELECT_LIMITS.customId);\n}\n\n/** True for a custom_id generated by selectMenuCustomId (no legacy menu ID). */\nexport function isGeneratedSelectId(customId: string): boolean {\n  return customId.startsWith(\"sel_\");\n}\n\n/**\n * The value Discord sends back for each option: its action ID (falling back to\n * the legacy value or the label). Values must be unique within a menu, so a\n * repeated one gets a \"~2\", \"~3\"… suffix that optionActionId strips again.\n */\nexport function selectOptionValues(\n  options: { action?: string; value?: string; label?: string }[],\n): string[] {\n  const seen = new Set<string>();\n  return options.map((option, i) => {\n    const base = (\n      (option.action ?? \"\").trim() ||\n      (option.value ?? \"\").trim() ||\n      (option.label ?? \"\").trim() ||\n      `option_${i + 1}`\n    ).slice(0, SELECT_LIMITS.value);\n    let value = base;\n    for (let n = 2; seen.has(value); n++) {\n      const suffix = `~${n}`;\n      value = base.slice(0, SELECT_LIMITS.value - suffix.length) + suffix;\n    }\n    seen.add(value);\n    return value;\n  });\n}\n\n/** The action ID behind a selected option value (undoes the \"~n\" de-duplication). */\nexport function optionActionId(value: string): string {\n  return value.replace(/~\\d+$/, \"\");\n}\n\n/** Clamps a select menu's min/max values to what Discord accepts. */\nexport function selectValueRange(\n  component: { minValues?: number | undefined; maxValues?: number | undefined },\n  optionCount: number = SELECT_LIMITS.options,\n): { min: number; max: number } {\n  const cap = Math.max(1, Math.min(SELECT_LIMITS.options, optionCount));\n  const int = (v: unknown, fallback: number) =>\n    typeof v === \"number\" && Number.isFinite(v) ? Math.trunc(v) : fallback;\n  const min = Math.max(0, Math.min(cap, int(component.minValues, 1)));\n  const max = Math.max(Math.max(1, min), Math.min(cap, int(component.maxValues, 1)));\n  return { min, max };\n}\n\n/* ------------------------------------------------------------------ *\n * Modals (Show Modal): up to 5 fields — text inputs, dropdowns, user /\n * role / channel / mentionable pickers, file uploads and info text.\n * Stored as JSON in the node's `modalFields` config value.\n * ------------------------------------------------------------------ */\n\nexport const MODAL_LIMITS = {\n  fields: 5,\n  title: 45,\n  label: 45,\n  description: 100,\n  placeholder: 100,\n  textLength: 4000,\n  textDisplay: 4000,\n  files: 10,\n} as const;\n\nexport type ModalFieldKind =\n  | \"short\"\n  | \"paragraph\"\n  | \"select\"\n  | \"user-select\"\n  | \"role-select\"\n  | \"channel-select\"\n  | \"mentionable-select\"\n  | \"file\"\n  | \"radio\"\n  | \"checkbox-group\"\n  | \"checkbox\"\n  | \"text\";\n\n/** Choice fields with their own options list, and how many options they take. */\nexport const MODAL_OPTION_LIMITS: Partial<Record<ModalFieldKind, { min: number; max: number }>> = {\n  select: { min: 1, max: 25 },\n  radio: { min: 2, max: 10 },\n  \"checkbox-group\": { min: 1, max: 10 },\n};\n\nexport interface ModalFieldOption {\n  label: string;\n  value: string;\n  description?: string | undefined;\n  emoji?: string | undefined;\n  /** Picked when the form opens. */\n  default?: boolean | undefined;\n}\n\nexport interface ModalField {\n  /** The answer's variable name ({id} in the Modal Submit flow). */\n  id: string;\n  kind: ModalFieldKind;\n  label: string;\n  /** Small text under the label. */\n  description?: string | undefined;\n  placeholder?: string | undefined;\n  required?: boolean | undefined;\n  /** Text inputs. */\n  minLength?: number | undefined;\n  maxLength?: number | undefined;\n  /** Text inputs: text already filled in. */\n  value?: string | undefined;\n  /** Dropdowns. */\n  options?: ModalFieldOption[] | undefined;\n  /** Dropdowns, pickers and file uploads: how many may be chosen. */\n  minValues?: number | undefined;\n  maxValues?: number | undefined;\n  /** \"text\" fields: markdown shown in the form. */\n  content?: string | undefined;\n}\n\nexport const MODAL_FIELD_KINDS: { kind: ModalFieldKind; label: string }[] = [\n  { kind: \"short\", label: \"Short text\" },\n  { kind: \"paragraph\", label: \"Paragraph\" },\n  { kind: \"select\", label: \"Dropdown\" },\n  { kind: \"user-select\", label: \"User picker\" },\n  { kind: \"role-select\", label: \"Role picker\" },\n  { kind: \"channel-select\", label: \"Channel picker\" },\n  { kind: \"mentionable-select\", label: \"User or role picker\" },\n  { kind: \"file\", label: \"File upload\" },\n  { kind: \"radio\", label: \"Radio buttons (one choice)\" },\n  { kind: \"checkbox-group\", label: \"Checkboxes (several choices)\" },\n  { kind: \"checkbox\", label: \"Single checkbox (yes / no)\" },\n  { kind: \"text\", label: \"Info text (no answer)\" },\n];\n\nconst MODAL_KINDS = new Set(MODAL_FIELD_KINDS.map((k) => k.kind));\n\n/**\n * The fields of a Show Modal node: `modalFields` JSON, or the older\n * field1…field3 settings when there is none.\n */\nexport function parseModalFields(config: Record<string, ConfigValue | undefined>): ModalField[] {\n  const raw = config[\"modalFields\"];\n  if (typeof raw === \"string\" && raw.trim().startsWith(\"[\")) {\n    try {\n      const list = JSON.parse(raw) as unknown;\n      if (Array.isArray(list)) {\n        return list\n          .filter(\n            (f): f is ModalField =>\n              typeof f === \"object\" &&\n              f !== null &&\n              MODAL_KINDS.has((f as ModalField).kind) &&\n              typeof (f as ModalField).id === \"string\",\n          )\n          .slice(0, MODAL_LIMITS.fields);\n      }\n    } catch {\n      // fall back to the legacy fields\n    }\n  }\n  const out: ModalField[] = [];\n  for (const index of [1, 2, 3]) {\n    const id = str(config[`field${index}Id`]);\n    const label = str(config[`field${index}Label`]);\n    if (!id || !label) continue;\n    out.push({\n      id,\n      label,\n      kind: str(config[`field${index}Style`]) === \"paragraph\" ? \"paragraph\" : \"short\",\n      required:\n        index === 1\n          ? config[\"field1Required\"] === true || config[\"field1Required\"] === \"true\"\n          : false,\n    });\n  }\n  return out;\n}\n\n/** Problems that would make Discord reject the form, in plain words. */\nexport function modalFieldIssues(fields: ModalField[]): string[] {\n  const issues: string[] = [];\n  const answers = fields.filter((f) => f.kind !== \"text\");\n  if (!answers.length) issues.push(\"Add at least one field people can answer.\");\n  if (fields.length > MODAL_LIMITS.fields)\n    issues.push(`A modal holds at most ${MODAL_LIMITS.fields} fields.`);\n  const seen = new Set<string>();\n  for (const [i, f] of fields.entries()) {\n    const name = f.label?.trim() || `Field ${i + 1}`;\n    if (f.kind === \"text\") {\n      if (!f.content?.trim()) issues.push(`${name}: the info text is empty.`);\n      continue;\n    }\n    const id = f.id.trim();\n    if (!id) issues.push(`${name}: needs an ID.`);\n    else if (seen.has(id)) issues.push(`${name}: the ID \"${id}\" is used twice.`);\n    seen.add(id);\n    if (!f.label?.trim()) issues.push(`Field ${i + 1}: needs a label.`);\n    // Labels and descriptions are plain text in Discord: <:name:id> would show as code.\n    if (CUSTOM_EMOJI_MARKUP.test(`${f.label ?? \"\"} ${f.description ?? \"\"}`))\n      issues.push(`${name}: custom emojis only show in dropdown options and info text, not in labels or descriptions.`);\n    const limits = MODAL_OPTION_LIMITS[f.kind];\n    if (limits) {\n      const count = (f.options ?? []).filter((o) => o.label.trim()).length;\n      if (count < limits.min)\n        issues.push(`${name}: add at least ${limits.min} option${limits.min === 1 ? \"\" : \"s\"}.`);\n      if (count > limits.max) issues.push(`${name}: at most ${limits.max} options.`);\n      for (const [j, o] of (f.options ?? []).entries()) {\n        const label = o.label.trim() || `option ${j + 1}`;\n        if (CUSTOM_EMOJI_MARKUP.test(`${o.label} ${o.description ?? \"\"}`))\n          issues.push(`${name}: put the custom emoji of \"${label}\" in its emoji field, not in the text.`);\n        if (!o.emoji?.trim()) continue;\n        if (!MODAL_EMOJI_KINDS.has(f.kind))\n          issues.push(`${name}: Discord shows no emojis on radio buttons or checkboxes; remove the emoji of \"${label}\" or use a dropdown.`);\n        else if (!parseComponentEmoji(o.emoji))\n          issues.push(`${name}: the emoji of \"${label}\" must be like 🔥 or a custom one: <:name:id>, <a:name:id> or its ID.`);\n      }\n    }\n  }\n  return issues;\n}\n\n/**\n * Where Discord shows emojis in a modal (discord.js StringSelectMenuOptionBuilder.setEmoji):\n * only on dropdown options. Radio groups and checkboxes have no emoji field.\n */\nexport const MODAL_EMOJI_KINDS: ReadonlySet<ModalFieldKind> = new Set([\"select\"]);\nconst CUSTOM_EMOJI_MARKUP = /<a?:[\\w~]{1,32}:\\d{17,20}>/;\n\nconst clampInt = (v: unknown, lo: number, hi: number): number | undefined =>\n  typeof v === \"number\" && Number.isFinite(v)\n    ? Math.max(lo, Math.min(hi, Math.trunc(v)))\n    : undefined;\n\n/**\n * The Discord API modal (Label components, so dropdowns, pickers and file\n * uploads work). `fill` replaces {variables} in text.\n */\nexport function modalPayload(\n  customId: string,\n  title: string,\n  fields: ModalField[],\n  fill: (text: string) => string = (t) => t,\n): { custom_id: string; title: string; components: Record<string, unknown>[] } {\n  const components: Record<string, unknown>[] = [];\n  for (const f of fields.slice(0, MODAL_LIMITS.fields)) {\n    if (f.kind === \"text\") {\n      const content = fill(f.content ?? \"\").slice(0, MODAL_LIMITS.textDisplay);\n      if (content.trim()) components.push({ type: 10, content });\n      continue;\n    }\n    const label = fill(f.label).slice(0, MODAL_LIMITS.label) || \"Answer\";\n    const description = fill(f.description ?? \"\").slice(0, MODAL_LIMITS.description);\n    const placeholder = fill(f.placeholder ?? \"\").slice(0, MODAL_LIMITS.placeholder);\n    const required = f.required !== false;\n    const custom_id = f.id.trim().slice(0, SELECT_LIMITS.customId) || \"answer\";\n    let inner: Record<string, unknown>;\n    if (f.kind === \"short\" || f.kind === \"paragraph\") {\n      const min = clampInt(f.minLength, 0, MODAL_LIMITS.textLength);\n      const max = clampInt(f.maxLength, 1, MODAL_LIMITS.textLength);\n      const value = fill(f.value ?? \"\").slice(0, max ?? MODAL_LIMITS.textLength);\n      inner = {\n        type: 4,\n        custom_id,\n        style: f.kind === \"paragraph\" ? 2 : 1,\n        required,\n        ...(placeholder ? { placeholder } : {}),\n        ...(min !== undefined && min > 0 ? { min_length: Math.min(min, max ?? min) } : {}),\n        ...(max !== undefined ? { max_length: max } : {}),\n        ...(value ? { value } : {}),\n      };\n    } else if (f.kind === \"checkbox\") {\n      inner = { type: 23, custom_id, ...(f.value === \"true\" ? { default: true } : {}) };\n    } else if (f.kind === \"radio\" || f.kind === \"checkbox-group\") {\n      const max = MODAL_OPTION_LIMITS[f.kind]?.max ?? 10;\n      const options = (f.options ?? [])\n        .filter((o) => o.label.trim())\n        .slice(0, max)\n        .map((o, i) => ({\n          label: fill(o.label).slice(0, SELECT_LIMITS.label),\n          value: (o.value.trim() || o.label.trim() || `option_${i + 1}`).slice(0, SELECT_LIMITS.value),\n          ...(o.description\n            ? { description: fill(o.description).slice(0, SELECT_LIMITS.description) }\n            : {}),\n          ...(o.default ? { default: true } : {}),\n        }));\n      if (f.kind === \"radio\") {\n        inner = { type: 21, custom_id, required, options };\n      } else {\n        const hi = clampInt(f.maxValues, 1, options.length || 1) ?? options.length;\n        const lo = Math.min(clampInt(f.minValues, 0, 10) ?? (required ? 1 : 0), hi);\n        inner = {\n          type: 22,\n          custom_id,\n          required,\n          options,\n          min_values: required ? Math.max(1, lo) : lo,\n          max_values: Math.max(1, hi),\n        };\n      }\n    } else if (f.kind === \"file\") {\n      const max = clampInt(f.maxValues, 1, MODAL_LIMITS.files) ?? 1;\n      inner = {\n        type: 19,\n        custom_id,\n        required,\n        min_values: Math.min(\n          Math.max(clampInt(f.minValues, 0, MODAL_LIMITS.files) ?? 1, required ? 1 : 0),\n          max,\n        ),\n        max_values: max,\n      };\n    } else {\n      const options =\n        f.kind === \"select\"\n          ? (f.options ?? [])\n              .filter((o) => o.label.trim())\n              .slice(0, SELECT_LIMITS.options)\n              .map((o, i) => {\n                const emoji = o.emoji ? parseComponentEmoji(o.emoji) : null;\n                return {\n                  label: fill(o.label).slice(0, SELECT_LIMITS.label),\n                  value: (o.value.trim() || o.label.trim() || `option_${i + 1}`).slice(\n                    0,\n                    SELECT_LIMITS.value,\n                  ),\n                  ...(o.description\n                    ? { description: fill(o.description).slice(0, SELECT_LIMITS.description) }\n                    : {}),\n                  ...(emoji ? { emoji } : {}),\n                  ...(o.default ? { default: true } : {}),\n                };\n              })\n          : [];\n      const { min, max } = selectValueRange(\n        f,\n        f.kind === \"select\" ? Math.max(1, options.length) : SELECT_LIMITS.options,\n      );\n      inner = {\n        type:\n          { select: 3, \"user-select\": 5, \"role-select\": 6, \"channel-select\": 8 }[\n            f.kind as string\n          ] ?? 7,\n        custom_id,\n        required,\n        min_values: required ? Math.max(1, min) : min,\n        max_values: max,\n        ...(placeholder ? { placeholder } : {}),\n        ...(f.kind === \"select\" ? { options } : {}),\n      };\n    }\n    components.push({ type: 18, label, ...(description ? { description } : {}), component: inner });\n  }\n  return {\n    custom_id: customId.slice(0, SELECT_LIMITS.customId) || \"modal\",\n    title: title.slice(0, MODAL_LIMITS.title) || \"Form\",\n    components,\n  };\n}\n\n/* ------------------------------------------------------------------ *\n * Condition: several branches, each a list of rules\n * ------------------------------------------------------------------ */\n\nexport type ConditionOperatorGroup = \"text\" | \"number\" | \"list\" | \"discord\";\n\nexport interface ConditionOperator {\n  id: string;\n  label: string;\n  group: ConditionOperatorGroup;\n  /** False when the rule only reads its left value (e.g. \"is empty\"). */\n  needsRight: boolean;\n  /** Hint for the right-hand value in the builder. */\n  rightHint?: string;\n}\n\n/** Every rule operator, in the order the builder lists them. */\nexport const CONDITION_OPERATORS: ConditionOperator[] = [\n  { id: \"equals\", label: \"equals\", group: \"text\", needsRight: true },\n  { id: \"not-equals\", label: \"does not equal\", group: \"text\", needsRight: true },\n  { id: \"equals-ignore-case\", label: \"equals (ignore case)\", group: \"text\", needsRight: true },\n  { id: \"contains\", label: \"contains\", group: \"text\", needsRight: true },\n  { id: \"not-contains\", label: \"does not contain\", group: \"text\", needsRight: true },\n  { id: \"starts-with\", label: \"starts with\", group: \"text\", needsRight: true },\n  { id: \"ends-with\", label: \"ends with\", group: \"text\", needsRight: true },\n  {\n    id: \"matches\",\n    label: \"matches regex\",\n    group: \"text\",\n    needsRight: true,\n    rightHint: \"^hello|hi$\",\n  },\n  { id: \"is-empty\", label: \"is empty\", group: \"text\", needsRight: false },\n  { id: \"not-empty\", label: \"is not empty\", group: \"text\", needsRight: false },\n  {\n    id: \"longer-than\",\n    label: \"is longer than (chars)\",\n    group: \"text\",\n    needsRight: true,\n    rightHint: \"20\",\n  },\n  { id: \"gt\", label: \"is greater than\", group: \"number\", needsRight: true },\n  { id: \"gte\", label: \"is at least\", group: \"number\", needsRight: true },\n  { id: \"lt\", label: \"is less than\", group: \"number\", needsRight: true },\n  { id: \"lte\", label: \"is at most\", group: \"number\", needsRight: true },\n  { id: \"between\", label: \"is between\", group: \"number\", needsRight: true, rightHint: \"1-10\" },\n  { id: \"is-number\", label: \"is a number\", group: \"number\", needsRight: false },\n  {\n    id: \"in-list\",\n    label: \"is one of\",\n    group: \"list\",\n    needsRight: true,\n    rightHint: \"red, green, blue\",\n  },\n  {\n    id: \"not-in-list\",\n    label: \"is not one of\",\n    group: \"list\",\n    needsRight: true,\n    rightHint: \"red, green, blue\",\n  },\n  {\n    id: \"has-role\",\n    label: \"has role\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"@Moderator\",\n  },\n  {\n    id: \"not-has-role\",\n    label: \"does not have role\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"@Moderator\",\n  },\n  {\n    id: \"has-permission\",\n    label: \"has permission\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"BanMembers\",\n  },\n  {\n    id: \"not-has-permission\",\n    label: \"lacks permission\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"BanMembers\",\n  },\n  { id: \"is-bot\", label: \"is a bot\", group: \"discord\", needsRight: false },\n  { id: \"is-human\", label: \"is not a bot\", group: \"discord\", needsRight: false },\n  { id: \"is-owner\", label: \"is the server owner\", group: \"discord\", needsRight: false },\n  { id: \"is-booster\", label: \"boosts the server\", group: \"discord\", needsRight: false },\n  {\n    id: \"account-older-than\",\n    label: \"account is older than (days)\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"7\",\n  },\n  {\n    id: \"joined-more-than\",\n    label: \"joined more than (days) ago\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"3\",\n  },\n  {\n    id: \"in-channel\",\n    label: \"is in channel\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"#general\",\n  },\n];\n\nconst CONDITION_OPERATOR_IDS = new Set(CONDITION_OPERATORS.map((o) => o.id));\n\nexport interface ConditionRule {\n  left: string;\n  op: string;\n  right: string;\n}\n\nexport interface ConditionBranch {\n  /** Also the branch's output handle. */\n  id: string;\n  label: string;\n  match: \"all\" | \"any\";\n  rules: ConditionRule[];\n}\n\nexport const CONDITION_LIMITS = { branches: 10, rules: 10 } as const;\n\n/** Handle id rules: never \"else\" or \"out\", safe in a React Flow handle id. */\nconst BRANCH_ID = /^b_[a-z0-9]{1,16}$/;\n\n/** The branches of a Condition node (invalid entries dropped). */\nexport function parseConditionBranches(\n  config: Record<string, ConfigValue | undefined>,\n): ConditionBranch[] {\n  const raw = config[\"branches\"];\n  if (typeof raw !== \"string\" || !raw.trim().startsWith(\"[\")) return [];\n  let list: unknown;\n  try {\n    list = JSON.parse(raw);\n  } catch {\n    return [];\n  }\n  if (!Array.isArray(list)) return [];\n  const seen = new Set<string>();\n  const out: ConditionBranch[] = [];\n  for (const item of list) {\n    if (typeof item !== \"object\" || item === null) continue;\n    const b = item as Record<string, unknown>;\n    const id = typeof b[\"id\"] === \"string\" ? b[\"id\"] : \"\";\n    if (!BRANCH_ID.test(id) || seen.has(id)) continue;\n    seen.add(id);\n    const rules = Array.isArray(b[\"rules\"])\n      ? (b[\"rules\"] as unknown[])\n          .filter((r): r is Record<string, unknown> => typeof r === \"object\" && r !== null)\n          .map((r) => ({\n            left: typeof r[\"left\"] === \"string\" ? r[\"left\"] : \"\",\n            op: typeof r[\"op\"] === \"string\" ? r[\"op\"] : \"equals\",\n            right: typeof r[\"right\"] === \"string\" ? r[\"right\"] : \"\",\n          }))\n          .slice(0, CONDITION_LIMITS.rules)\n      : [];\n    out.push({\n      id,\n      label: typeof b[\"label\"] === \"string\" ? b[\"label\"].slice(0, 40) : \"\",\n      match: b[\"match\"] === \"any\" ? \"any\" : \"all\",\n      rules,\n    });\n    if (out.length >= CONDITION_LIMITS.branches) break;\n  }\n  return out;\n}\n\n/** Output handles of a Condition node: one per branch, then \"else\". */\nexport function conditionHandles(config: Record<string, ConfigValue | undefined>): string[] {\n  return [...parseConditionBranches(config).map((b) => b.id), \"else\"];\n}\n\n/** Problems that stop a Condition node from compiling. */\nexport function conditionIssues(config: Record<string, ConfigValue | undefined>): string[] {\n  const branches = parseConditionBranches(config);\n  if (branches.length === 0) return [\"add at least one branch.\"];\n  const problems: string[] = [];\n  branches.forEach((branch, i) => {\n    const name = branch.label || `Branch ${i + 1}`;\n    if (branch.rules.length === 0) problems.push(`\"${name}\" has no rules.`);\n    for (const rule of branch.rules) {\n      const op = CONDITION_OPERATORS.find((o) => o.id === rule.op);\n      if (!op || !CONDITION_OPERATOR_IDS.has(rule.op)) {\n        problems.push(`\"${name}\" uses an unknown operator \"${rule.op}\".`);\n        continue;\n      }\n      if (rule.left.trim() === \"\" && op.group !== \"discord\")\n        problems.push(`\"${name}\": a \"${op.label}\" rule needs a value to check.`);\n      if (op.needsRight && rule.right.trim() === \"\" && ![\"equals\", \"not-equals\"].includes(op.id))\n        problems.push(`\"${name}\": \"${op.label}\" needs a value to compare with.`);\n      if (op.id === \"matches\" && rule.right.length > 300)\n        problems.push(`\"${name}\": regex patterns are limited to 300 characters.`);\n    }\n  });\n  return problems;\n}\n\n/**\n * Rules that need no Discord data, evaluated the same way in the builder's\n * tests and the runtime. Returns null for Discord operators.\n */\nexport function evaluatePlainRule(op: string, left: string, right: string): boolean | null {\n  const l = left.trim();\n  const r = right.trim();\n  const list = () =>\n    r\n      .split(\",\")\n      .map((v) => v.trim().toLowerCase())\n      .filter(Boolean);\n  const n = (v: string) => (v === \"\" ? Number.NaN : Number(v));\n  switch (op) {\n    case \"equals\":\n      return left === right;\n    case \"not-equals\":\n      return left !== right;\n    case \"equals-ignore-case\":\n      return l.toLowerCase() === r.toLowerCase();\n    case \"contains\":\n      return left.toLowerCase().includes(right.toLowerCase());\n    case \"not-contains\":\n      return !left.toLowerCase().includes(right.toLowerCase());\n    case \"starts-with\":\n      return left.toLowerCase().startsWith(right.toLowerCase());\n    case \"ends-with\":\n      return left.toLowerCase().endsWith(right.toLowerCase());\n    case \"is-empty\":\n      return l === \"\";\n    case \"not-empty\":\n      return l !== \"\";\n    case \"longer-than\":\n      return Number.isFinite(n(r)) && left.length > n(r);\n    case \"gt\":\n      return n(l) > n(r);\n    case \"gte\":\n      return n(l) >= n(r);\n    case \"lt\":\n      return n(l) < n(r);\n    case \"lte\":\n      return n(l) <= n(r);\n    case \"between\": {\n      const m = /^\\s*(-?[\\d.]+)\\s*(?:-|\\.\\.|,|to)\\s*(-?[\\d.]+)\\s*$/i.exec(r);\n      if (!m) return false;\n      const value = n(l);\n      const a = Number(m[1]);\n      const b = Number(m[2]);\n      return value >= Math.min(a, b) && value <= Math.max(a, b);\n    }\n    case \"is-number\":\n      return l !== \"\" && Number.isFinite(Number(l));\n    case \"in-list\":\n      return list().includes(l.toLowerCase());\n    case \"not-in-list\":\n      return !list().includes(l.toLowerCase());\n    default:\n      return null;\n  }\n}\n\n/* ------------------------------------------------------------------ *\n * Converter: units (currencies and crypto are fetched by the runtime)\n * ------------------------------------------------------------------ */\n\n/** Units per dimension, as the factor to the dimension's base unit. */\nexport const UNIT_GROUPS: Record<string, Record<string, number>> = {\n  length: { mm: 0.001, cm: 0.01, m: 1, km: 1000, in: 0.0254, ft: 0.3048, yd: 0.9144, mi: 1609.344, nmi: 1852 },\n  mass: { mg: 1e-6, g: 0.001, kg: 1, t: 1000, oz: 0.028349523125, lb: 0.45359237, st: 6.35029318 },\n  volume: { ml: 0.001, cl: 0.01, l: 1, m3: 1000, tsp: 0.00492892, tbsp: 0.0147868, floz: 0.0295735, cup: 0.236588, pt: 0.473176, qt: 0.946353, gal: 3.78541 },\n  speed: { \"m/s\": 1, \"km/h\": 1 / 3.6, mph: 0.44704, kn: 0.514444 },\n  data: { b: 1, kb: 1000, mb: 1e6, gb: 1e9, tb: 1e12, kib: 1024, mib: 1024 ** 2, gib: 1024 ** 3, tib: 1024 ** 4 },\n  time: { ms: 0.001, s: 1, min: 60, h: 3600, d: 86400, wk: 604800, mo: 2629746, yr: 31556952 },\n  area: { \"m2\": 1, \"km2\": 1e6, ha: 10000, \"ft2\": 0.09290304, ac: 4046.8564224, \"mi2\": 2589988.110336 },\n};\n\nconst UNIT_ALIASES: Record<string, string> = {\n  meter: \"m\", meters: \"m\", metre: \"m\", kilometer: \"km\", kilometers: \"km\", mile: \"mi\", miles: \"mi\",\n  inch: \"in\", inches: \"in\", foot: \"ft\", feet: \"ft\", yard: \"yd\", yards: \"yd\",\n  gram: \"g\", grams: \"g\", kilogram: \"kg\", kilograms: \"kg\", kgs: \"kg\", pound: \"lb\", pounds: \"lb\", lbs: \"lb\", ounce: \"oz\", ounces: \"oz\", ton: \"t\", tonne: \"t\",\n  liter: \"l\", litre: \"l\", liters: \"l\", litres: \"l\", gallon: \"gal\", gallons: \"gal\",\n  kmh: \"km/h\", kph: \"km/h\", ms: \"ms\", mps: \"m/s\", knots: \"kn\", knot: \"kn\",\n  byte: \"b\", bytes: \"b\", sec: \"s\", second: \"s\", seconds: \"s\", minute: \"min\", minutes: \"min\", hour: \"h\", hours: \"h\", day: \"d\", days: \"d\", week: \"wk\", weeks: \"wk\", month: \"mo\", months: \"mo\", year: \"yr\", years: \"yr\",\n  c: \"c\", \"°c\": \"c\", celsius: \"c\", f: \"f\", \"°f\": \"f\", fahrenheit: \"f\", k: \"k\", kelvin: \"k\",\n};\n\nfunction unitKey(raw: string): string {\n  const key = raw.trim().toLowerCase().replace(/\\s+/g, \"\");\n  return UNIT_ALIASES[key] ?? key;\n}\n\n/**\n * Converts between units of the same kind (temperatures included). Returns\n * null when either unit is unknown or they measure different things.\n */\nexport function convertUnits(amount: number, from: string, to: string): number | null {\n  const a = unitKey(from);\n  const b = unitKey(to);\n  const temps = [\"c\", \"f\", \"k\"];\n  if (temps.includes(a) && temps.includes(b)) {\n    const celsius = a === \"c\" ? amount : a === \"f\" ? ((amount - 32) * 5) / 9 : amount - 273.15;\n    return b === \"c\" ? celsius : b === \"f\" ? (celsius * 9) / 5 + 32 : celsius + 273.15;\n  }\n  for (const units of Object.values(UNIT_GROUPS)) {\n    const fa = units[a];\n    const fb = units[b];\n    if (fa !== undefined && fb !== undefined) return (amount * fa) / fb;\n  }\n  return null;\n}\n\n/** True when the code names a unit (as opposed to a currency or coin). */\nexport function isUnit(raw: string): boolean {\n  const key = unitKey(raw);\n  return [\"c\", \"f\", \"k\"].includes(key) || Object.values(UNIT_GROUPS).some((u) => key in u);\n}\n\n/** Rounds for display: up to 2 decimals for money, more for small values. */\nexport function formatAmount(value: number): string {\n  if (!Number.isFinite(value)) return \"\";\n  const abs = Math.abs(value);\n  const digits = abs >= 100 ? 2 : abs >= 1 ? 4 : abs === 0 ? 0 : Math.min(10, 2 - Math.floor(Math.log10(abs)) + 2);\n  return Number(value.toFixed(digits)).toLocaleString(\"en-US\", { maximumFractionDigits: digits });\n}\n\n/* ------------------------------------------------------------------ *\n * Roblox: operations of the Roblox API block\n * ------------------------------------------------------------------ */\n\nexport interface RobloxOperation {\n  id: string;\n  label: string;\n  /** What the \"query\" field takes. */\n  query: string;\n  /** Variables set under {storeAs.…}. */\n  vars: string[];\n}\n\nexport const ROBLOX_OPERATIONS: RobloxOperation[] = [\n  {\n    id: \"user\",\n    label: \"User profile\",\n    query: \"Username or user ID\",\n    vars: [\"id\", \"name\", \"displayName\", \"description\", \"created\", \"createdUnix\", \"banned\", \"verified\", \"url\", \"avatar\", \"friends\", \"followers\", \"following\"],\n  },\n  { id: \"avatar\", label: \"Avatar images\", query: \"Username or user ID\", vars: [\"id\", \"name\", \"headshot\", \"bust\", \"fullBody\"] },\n  { id: \"presence\", label: \"Online status\", query: \"Username or user ID\", vars: [\"id\", \"name\", \"status\", \"lastLocation\", \"lastOnline\", \"gameId\"] },\n  { id: \"groups\", label: \"User's groups\", query: \"Username or user ID\", vars: [\"id\", \"name\", \"count\", \"list\"] },\n  { id: \"group\", label: \"Group info\", query: \"Group ID\", vars: [\"id\", \"name\", \"description\", \"owner\", \"ownerId\", \"members\", \"url\", \"icon\", \"verified\"] },\n  {\n    id: \"game\",\n    label: \"Game / experience\",\n    query: \"Place ID or game link\",\n    vars: [\"id\", \"placeId\", \"name\", \"description\", \"creator\", \"playing\", \"visits\", \"favorites\", \"maxPlayers\", \"created\", \"updated\", \"url\", \"icon\", \"genre\"],\n  },\n];\n\n/* ------------------------------------------------------------------ *\n * Crypto Tools: operations of the Crypto block\n * ------------------------------------------------------------------ */\n\nexport interface CryptoOperation {\n  id: string;\n  label: string;\n  /** What the \"query\" field takes (\"\" = not used). */\n  query: string;\n  /** What the \"extra\" field takes (\"\" = not used). */\n  extra: string;\n  /** Variables set under {storeAs.…} (besides text and error). */\n  vars: string[];\n}\n\nexport const CRYPTO_OPERATIONS: CryptoOperation[] = [\n  {\n    id: \"price\",\n    label: \"Coin price\",\n    query: \"Coin symbol, e.g. BTC\",\n    extra: \"Currency (USD, EUR, PLN…)\",\n    vars: [\"coin\", \"name\", \"currency\", \"price\", \"priceRaw\", \"change\", \"trend\", \"high\", \"low\", \"marketCap\", \"volume\", \"rank\", \"image\"],\n  },\n  { id: \"market\", label: \"Top coins by market cap\", query: \"How many (1-25)\", extra: \"Currency\", vars: [\"count\", \"currency\", \"list\"] },\n  { id: \"trending\", label: \"Trending coins\", query: \"\", extra: \"\", vars: [\"count\", \"list\"] },\n  { id: \"feargreed\", label: \"Fear & Greed index\", query: \"\", extra: \"\", vars: [\"value\", \"label\", \"emoji\", \"updated\"] },\n  { id: \"fees\", label: \"Network fees / gas\", query: \"Chain: BTC, LTC or ETH\", extra: \"\", vars: [\"chain\", \"fast\", \"medium\", \"slow\", \"unit\"] },\n  {\n    id: \"wallet\",\n    label: \"Wallet balance\",\n    query: \"Address (BTC, LTC, ETH, SOL, TRON)\",\n    extra: \"Chain (blank = detect)\",\n    vars: [\"chain\", \"symbol\", \"address\", \"balance\", \"balanceRaw\", \"usd\", \"received\", \"sent\", \"txCount\", \"usdt\", \"url\"],\n  },\n  {\n    id: \"tx\",\n    label: \"Transaction status\",\n    query: \"Transaction hash\",\n    extra: \"Chain (blank = detect)\",\n    vars: [\"chain\", \"hash\", \"status\", \"confirmations\", \"block\", \"time\", \"amount\", \"fee\", \"from\", \"to\", \"url\"],\n  },\n  { id: \"address\", label: \"Check an address\", query: \"Address\", extra: \"\", vars: [\"valid\", \"chain\", \"symbol\"] },\n];\n\n/* ------------------------------------------------------------------ *\n * Prefix commands: \"!ban @user spam\" runs the /ban flow\n * ------------------------------------------------------------------ */\n\n/** Bot prefixes from settings: trimmed, no spaces, at most 5 and 5 characters each. */\nexport function cleanPrefixes(raw: unknown): string[] {\n  const list = Array.isArray(raw) ? raw : typeof raw === \"string\" ? raw.split(/[\\s,]+/) : [];\n  const out: string[] = [];\n  for (const item of list) {\n    const p = String(item ?? \"\").trim();\n    if (p && p.length <= 5 && !/\\s/.test(p) && !p.startsWith(\"/\") && !out.includes(p)) out.push(p);\n    if (out.length >= 5) break;\n  }\n  return out;\n}\n\n/** \"?ban @x spam\" with prefixes [\"!\", \"?\"] → { prefix: \"?\", name: \"ban\", rest: \"@x spam\" }. */\nexport function matchPrefixCommand(\n  content: string,\n  prefixes: string[],\n): { prefix: string; name: string; rest: string } | null {\n  const text = content.trimStart();\n  // Longest first, so \"!!\" wins over \"!\".\n  for (const prefix of [...prefixes].sort((a, b) => b.length - a.length)) {\n    if (!text.toLowerCase().startsWith(prefix.toLowerCase())) continue;\n    const m = /^(\\S+)\\s*([\\s\\S]*)$/.exec(text.slice(prefix.length));\n    if (!m) return null;\n    return { prefix, name: m[1]!.toLowerCase(), rest: m[2]!.trim() };\n  }\n  return null;\n}\n\n/** Splits arguments on spaces, keeping \"quoted text\" together. */\nexport function splitArgs(rest: string): string[] {\n  const out: string[] = [];\n  for (const m of rest.matchAll(/\"([^\"]*)\"|'([^']*)'|(\\S+)/g)) out.push(m[1] ?? m[2] ?? m[3] ?? \"\");\n  return out;\n}\n\n/**\n * Maps prefix arguments onto a command's options in order. Mentions become\n * ids (like slash options); the last text option takes the rest of the line.\n * Returns the values and the required options that are missing.\n */\nexport function prefixOptionValues(\n  rest: string,\n  options: { name: string; type: string; required: boolean }[],\n): { values: Record<string, string>; missing: string[] } {\n  const args = splitArgs(rest);\n  const values: Record<string, string> = {};\n  const missing: string[] = [];\n  const lastString = [...options].reverse().find((o) => o.type === \"string\")?.name;\n  let i = 0;\n  for (const option of options) {\n    let value: string | undefined;\n    if (option.name === lastString && options[options.length - 1]?.name === option.name) {\n      value = args.slice(i).join(\" \");\n      i = args.length;\n    } else {\n      value = args[i];\n      i += 1;\n    }\n    if (value === undefined || value === \"\") {\n      if (option.required) missing.push(option.name);\n      continue;\n    }\n    if ([\"user\", \"role\", \"channel\", \"mentionable\"].includes(option.type)) value = /(\\d{5,25})/.exec(value)?.[1] ?? value;\n    if (option.type === \"boolean\") value = /^(yes|true|on|1|tak)$/i.test(value) ? \"true\" : \"false\";\n    values[option.name] = value;\n  }\n  return { values, missing };\n}\n\n/* ------------------------------------------------------------------ *\n * Shop / ticket blocks: shared parsing for runtime and preview\n * ------------------------------------------------------------------ */\n\n/**\n * Members or roles typed one per line (or comma separated). Several mentions\n * or IDs on one line are each their own entry; anything else is a name.\n */\nexport function splitTargets(raw: string): string[] {\n  const out: string[] = [];\n  for (const chunk of raw.split(/\\r?\\n|,/)) {\n    const value = chunk.trim();\n    if (value === \"\") continue;\n    const refs = value.match(/<[@#][!&]?\\d{15,25}>|\\d{15,25}/g);\n    if (refs && refs.join(\"\").length >= value.replace(/\\s+/g, \"\").length) out.push(...refs);\n    else out.push(value);\n  }\n  return [...new Set(out)];\n}\n\n/** Send Text as File: allowed extensions and size. */\nexport const TEXT_FILE_EXTENSIONS = [\"txt\", \"json\", \"csv\", \"md\"] as const;\nexport const TEXT_FILE_MAX_BYTES = 1_000_000;\n\n/** A safe attachment name ending in .txt/.json/.csv/.md, or null when the extension is not allowed. */\nexport function textFileName(raw: string): string | null {\n  const cleaned = raw\n    .trim()\n    .replace(/[^\\w.\\- ]+/g, \"_\")\n    .replace(/\\s+/g, \"-\")\n    .replace(/^\\.+/, \"\")\n    .slice(-100);\n  const ext = /\\.([a-z0-9]+)$/i.exec(cleaned)?.[1]?.toLowerCase() ?? \"\";\n  if (!(TEXT_FILE_EXTENSIONS as readonly string[]).includes(ext)) return null;\n  if (cleaned.length <= ext.length + 1) return null;\n  return cleaned;\n}\n\nexport const SERVER_TEMPLATE_LIMITS = { roles: 50, channels: 100 } as const;\nexport const SERVER_TEMPLATE_CHANNEL_TYPES = [\"text\", \"voice\", \"announcement\", \"forum\", \"stage\"] as const;\nexport type ServerTemplateChannelType = (typeof SERVER_TEMPLATE_CHANNEL_TYPES)[number];\n\nexport interface ServerTemplateRole {\n  name: string;\n  /** #rrggbb or \"\" */\n  color: string;\n  hoist: boolean;\n  mentionable: boolean;\n}\n\nexport interface ServerTemplateChannel {\n  name: string;\n  type: ServerTemplateChannelType;\n  topic: string;\n  /** Hidden from @everyone; allowRoles (and the bot) can see it. */\n  private: boolean;\n  allowRoles: string[];\n}\n\nexport interface ServerTemplateCategory {\n  name: string;\n  private: boolean;\n  allowRoles: string[];\n  channels: ServerTemplateChannel[];\n}\n\nexport interface ServerTemplate {\n  roles: ServerTemplateRole[];\n  categories: ServerTemplateCategory[];\n  /** Channels outside any category. */\n  channels: ServerTemplateChannel[];\n}\n\n/**\n * Apply Server Template's JSON. Unknown fields are ignored, so a Back Up\n * Server file can be pasted in as it is.\n */\nexport function parseServerTemplate(raw: string): { template: ServerTemplate | null; error: string | null } {\n  let value: unknown;\n  try {\n    value = JSON.parse(raw);\n  } catch {\n    return { template: null, error: \"the template is not valid JSON.\" };\n  }\n  if (typeof value !== \"object\" || value === null || Array.isArray(value))\n    return { template: null, error: 'the template must be a JSON object like {\"roles\": [], \"categories\": []}.' };\n  const obj = value as Record<string, unknown>;\n  const fail = (error: string) => ({ template: null, error });\n  const nameOf = (v: unknown) => (typeof v === \"string\" ? v.trim() : \"\");\n  const list = (v: unknown): unknown[] => (Array.isArray(v) ? v : []);\n  const record = (v: unknown): Record<string, unknown> =>\n    typeof v === \"string\" ? { name: v } : typeof v === \"object\" && v !== null ? (v as Record<string, unknown>) : {};\n  const strings = (v: unknown) =>\n    (Array.isArray(v) ? v : typeof v === \"string\" ? v.split(/\\r?\\n|,/) : [])\n      .filter((x): x is string => typeof x === \"string\")\n      .map((x) => x.trim())\n      .filter(Boolean)\n      .slice(0, 25);\n  for (const key of [\"roles\", \"categories\", \"channels\"])\n    if (obj[key] !== undefined && !Array.isArray(obj[key])) return fail(`\"${key}\" must be a list.`);\n\n  const roles: ServerTemplateRole[] = [];\n  for (const r of list(obj[\"roles\"])) {\n    const role = record(r);\n    const name = nameOf(role[\"name\"]);\n    if (name === \"\") return fail(\"every role needs a name.\");\n    if (name.length > 100) return fail(`the role name \"${name.slice(0, 20)}…\" is over 100 characters.`);\n    const color = nameOf(role[\"color\"]);\n    if (color !== \"\" && !/^#?[0-9a-f]{6}$/i.test(color))\n      return fail(`the role \"${name}\" has the colour \"${color}\"; use #rrggbb.`);\n    roles.push({\n      name,\n      color: color === \"\" ? \"\" : `#${color.replace(/^#/, \"\").toLowerCase()}`,\n      hoist: role[\"hoist\"] === true,\n      mentionable: role[\"mentionable\"] === true,\n    });\n  }\n  if (roles.length > SERVER_TEMPLATE_LIMITS.roles)\n    return fail(`a template holds at most ${SERVER_TEMPLATE_LIMITS.roles} roles.`);\n\n  const channel = (c: unknown): ServerTemplateChannel | string => {\n    const ch = record(c);\n    const name = nameOf(ch[\"name\"]);\n    if (name === \"\") return \"every channel needs a name.\";\n    if (name.length > 100) return `the channel name \"${name.slice(0, 20)}…\" is over 100 characters.`;\n    const type = (nameOf(ch[\"type\"]) || \"text\").toLowerCase();\n    if (!(SERVER_TEMPLATE_CHANNEL_TYPES as readonly string[]).includes(type))\n      return `the channel \"${name}\" has the type \"${type}\"; use ${SERVER_TEMPLATE_CHANNEL_TYPES.join(\", \")}.`;\n    return {\n      name,\n      type: type as ServerTemplateChannelType,\n      topic: nameOf(ch[\"topic\"]).slice(0, 1024),\n      private: ch[\"private\"] === true,\n      allowRoles: strings(ch[\"allowRoles\"]),\n    };\n  };\n  const categories: ServerTemplateCategory[] = [];\n  for (const c of list(obj[\"categories\"])) {\n    const cat = record(c);\n    const name = nameOf(cat[\"name\"]);\n    if (name === \"\") return fail(\"every category needs a name.\");\n    if (name.length > 100) return fail(`the category name \"${name.slice(0, 20)}…\" is over 100 characters.`);\n    if (cat[\"channels\"] !== undefined && !Array.isArray(cat[\"channels\"]))\n      return fail(`\"channels\" of the category \"${name}\" must be a list.`);\n    const channels: ServerTemplateChannel[] = [];\n    for (const ch of list(cat[\"channels\"])) {\n      const parsed = channel(ch);\n      if (typeof parsed === \"string\") return fail(parsed);\n      channels.push(parsed);\n    }\n    categories.push({ name, private: cat[\"private\"] === true, allowRoles: strings(cat[\"allowRoles\"]), channels });\n  }\n  const loose: ServerTemplateChannel[] = [];\n  for (const ch of list(obj[\"channels\"])) {\n    const parsed = channel(ch);\n    if (typeof parsed === \"string\") return fail(parsed);\n    loose.push(parsed);\n  }\n  const total = categories.length + categories.reduce((n, c) => n + c.channels.length, 0) + loose.length;\n  if (total > SERVER_TEMPLATE_LIMITS.channels)\n    return fail(\n      `a template holds at most ${SERVER_TEMPLATE_LIMITS.channels} categories and channels (this one has ${total}).`,\n    );\n  if (roles.length === 0 && total === 0) return fail(\"the template has no roles, categories or channels.\");\n  return { template: { roles, categories, channels: loose }, error: null };\n}\n\n/** A whole field that is one {variable} (filled in at run time, so not checked here). */\nconst ONLY_VARIABLE = /^\\{[a-zA-Z0-9_.-]+\\}$/;\n\n/** Validator checks for the shop/ticket blocks. */\nfunction shopBlockIssues(type: string, config: Record<string, ConfigValue>): string[] {\n  const value = (key: string) => (config[key] === undefined ? \"\" : String(config[key]).trim());\n  const out: string[] = [];\n  if (type === \"apply-server-template\") {\n    const raw = value(\"structure\");\n    if (raw !== \"\" && !ONLY_VARIABLE.test(raw)) {\n      const { error } = parseServerTemplate(raw);\n      if (error) out.push(error);\n    }\n  }\n  if (type === \"file-from-text\") {\n    const name = value(\"fileName\");\n    if (name !== \"\" && !name.includes(\"{\") && textFileName(name) === null)\n      out.push(`the file name must end in ${TEXT_FILE_EXTENSIONS.map((e) => `.${e}`).join(\", \")}.`);\n  }\n  if (type === \"fetch-channel-messages\") {\n    const limit = Number(config[\"limit\"] ?? 20);\n    if (!Number.isFinite(limit) || limit < 1 || limit > 50) out.push(\"read between 1 and 50 messages.\");\n  }\n  if (type === \"rate-counter\") {\n    const windowSeconds = Number(config[\"windowSeconds\"] ?? 10);\n    const threshold = Number(config[\"threshold\"] ?? 5);\n    if (!Number.isFinite(windowSeconds) || windowSeconds < 1 || windowSeconds > 86_400)\n      out.push(\"the time window is between 1 and 86400 seconds.\");\n    if (!Number.isFinite(threshold) || threshold < 1) out.push(\"the limit must be 1 or more.\");\n  }\n  return out;\n}\n\n","runtime/src/games.test.ts":"import { test } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport {\n  blackjackStand,\n  blackjackStart,\n  blackjackValue,\n  coinflip,\n  diceDuel,\n  levelFromXp,\n  parseDuration,\n  parseLevelRewards,\n  pokerHand,\n  progressBar,\n  rouletteBet,\n  rouletteSpin,\n  slotsSpin,\n  xpAtLevel,\n  type Card,\n} from \"./games.js\";\n\nconst c = (rank: number, suit = 0): Card => ({ rank, suit: suit as Card[\"suit\"] });\n\ntest(\"xp curve and progress\", () => {\n  assert.deepEqual(levelFromXp(0), { level: 0, into: 0, needed: 100 });\n  assert.deepEqual(levelFromXp(100), { level: 1, into: 0, needed: 155 });\n  assert.equal(levelFromXp(xpAtLevel(10) + 5).level, 10);\n  assert.equal(progressBar(5, 10, 10), \"▰▰▰▰▰▱▱▱▱▱\");\n  assert.deepEqual(parseLevelRewards(\"10=@Regular\\n5: 1234\"), [\n    [5, \"1234\"],\n    [10, \"@Regular\"],\n  ]);\n});\n\ntest(\"blackjack values, naturals and settling\", () => {\n  assert.equal(blackjackValue([c(14), c(13)]), 21);\n  assert.equal(blackjackValue([c(14), c(14), c(9)]), 21);\n  // deck pops from the end: player A, K then dealer 9, 7\n  const natural = blackjackStart(10, [c(7), c(9), c(13), c(14)]);\n  assert.equal(natural.outcome, \"blackjack\");\n  assert.equal(natural.payout, 25);\n  const game = blackjackStart(10, [c(5), c(10), c(7), c(10), c(9)]);\n  // player 9 + 10 = 19, dealer 10 + 7 = 17 → stands at 17\n  blackjackStand(game);\n  assert.equal(game.outcome, \"win\");\n  assert.equal(game.payout, 20);\n});\n\ntest(\"video poker hands\", () => {\n  assert.equal(pokerHand([c(10), c(11), c(12), c(13), c(14)]).name, \"Royal Flush\");\n  assert.equal(pokerHand([c(2, 1), c(3), c(4), c(5), c(14)]).name, \"Straight\");\n  assert.equal(pokerHand([c(9), c(9, 1), c(9, 2), c(4), c(4, 1)]).name, \"Full House\");\n  assert.equal(pokerHand([c(11), c(11, 1), c(2), c(5, 2), c(8)]).name, \"Jacks or Better\");\n  assert.equal(pokerHand([c(10), c(10, 1), c(2), c(5, 2), c(8)]).multiplier, 0);\n});\n\ntest(\"roulette, slots, coin and dice\", () => {\n  assert.equal(rouletteBet(\"Czerwone\"), \"red\");\n  assert.equal(rouletteBet(\"17\"), \"17\");\n  assert.equal(rouletteBet(\"37\"), null);\n  assert.equal(rouletteSpin(\"red\", 1).multiplier, 2);\n  assert.equal(rouletteSpin(\"red\", 0).multiplier, 0);\n  assert.equal(rouletteSpin(\"17\", 17).multiplier, 36);\n  assert.equal(rouletteSpin(\"dozen2\", 13).multiplier, 3);\n  assert.equal(slotsSpin([\"💎\", \"💎\", \"💎\"]).multiplier, 50);\n  assert.equal(slotsSpin([\"🍒\", \"🍋\", \"🍇\"]).multiplier, 0);\n  assert.deepEqual(coinflip(\"heads\", 0), { side: \"heads\", won: true });\n  assert.equal(coinflip(\"maybe\"), null);\n  assert.equal(diceDuel([6, 6, 1, 1]).outcome, \"win\");\n  assert.equal(parseDuration(\"1h 30m\"), 5_400_000);\n  assert.equal(parseDuration(\"2d\"), 172_800_000);\n  assert.equal(parseDuration(\"soon\"), null);\n});\n","runtime/src/games.ts":"/**\n * Pure game and level maths for the Leveling and Economy plugins: XP curve,\n * cards, blackjack, video poker (Jacks or Better), roulette, slots, coin flip\n * and dice. No Discord and no storage here, so it is easy to test.\n */\nimport { randomInt } from \"node:crypto\";\n\n/* ------------------------------ Levels ------------------------------ */\n\n/** XP needed to go from `level` to the next one (the classic MEE6 curve). */\nexport function xpForNext(level: number): number {\n  return 5 * level * level + 50 * level + 100;\n}\n\n/** Total XP → level, XP into that level and XP the level needs. */\nexport function levelFromXp(total: number): { level: number; into: number; needed: number } {\n  let level = 0;\n  let rest = Math.max(0, Math.floor(total));\n  while (rest >= xpForNext(level) && level < 1000) {\n    rest -= xpForNext(level);\n    level += 1;\n  }\n  return { level, into: rest, needed: xpForNext(level) };\n}\n\n/** Total XP at the start of `level`. */\nexport function xpAtLevel(level: number): number {\n  let total = 0;\n  for (let l = 0; l < level; l++) total += xpForNext(l);\n  return total;\n}\n\nexport function progressBar(into: number, needed: number, width = 12): string {\n  const filled = needed > 0 ? Math.max(0, Math.min(width, Math.round((into / needed) * width))) : 0;\n  return \"▰\".repeat(filled) + \"▱\".repeat(width - filled);\n}\n\n/** \"5=@Active\\n10=123456\" → [[5, \"@Active\"], [10, \"123456\"]], lowest level first. */\nexport function parseLevelRewards(raw: string): [number, string][] {\n  return raw\n    .split(/[\\n,;]+/)\n    .map((part) => /^\\s*(\\d{1,4})\\s*[=:]\\s*(.+?)\\s*$/.exec(part))\n    .filter((m): m is RegExpExecArray => m !== null)\n    .map((m) => [Number(m[1]), m[2]!] as [number, string])\n    .sort((a, b) => a[0] - b[0]);\n}\n\n/* ------------------------------- Cards ------------------------------ */\n\nexport interface Card {\n  rank: number; // 2-14 (11 J, 12 Q, 13 K, 14 A)\n  suit: 0 | 1 | 2 | 3;\n}\n\nconst SUITS = [\"♠\", \"♥\", \"♦\", \"♣\"] as const;\nconst RANKS: Record<number, string> = { 11: \"J\", 12: \"Q\", 13: \"K\", 14: \"A\" };\n\nexport function cardText(card: Card): string {\n  return `${RANKS[card.rank] ?? String(card.rank)}${SUITS[card.suit]}`;\n}\n\nexport function handText(cards: Card[]): string {\n  return cards.map((c) => `\\`${cardText(c)}\\``).join(\" \");\n}\n\n/** A shuffled 52-card deck (crypto randomness). */\nexport function newDeck(): Card[] {\n  const deck: Card[] = [];\n  for (let suit = 0; suit < 4; suit++)\n    for (let rank = 2; rank <= 14; rank++) deck.push({ rank, suit: suit as Card[\"suit\"] });\n  for (let i = deck.length - 1; i > 0; i--) {\n    const j = randomInt(i + 1);\n    [deck[i], deck[j]] = [deck[j]!, deck[i]!];\n  }\n  return deck;\n}\n\n/* ----------------------------- Blackjack ---------------------------- */\n\nexport function blackjackValue(cards: Card[]): number {\n  let total = 0;\n  let aces = 0;\n  for (const c of cards) {\n    if (c.rank === 14) {\n      aces += 1;\n      total += 11;\n    } else total += Math.min(10, c.rank);\n  }\n  while (total > 21 && aces > 0) {\n    total -= 10;\n    aces -= 1;\n  }\n  return total;\n}\n\nexport interface BlackjackGame {\n  deck: Card[];\n  player: Card[];\n  dealer: Card[];\n  bet: number;\n  done: boolean;\n  /** Set when done: what the player gets back (0 = lost the bet). */\n  payout: number;\n  outcome: \"\" | \"blackjack\" | \"win\" | \"lose\" | \"push\" | \"bust\" | \"dealer-bust\";\n}\n\nexport function blackjackStart(bet: number, deck = newDeck()): BlackjackGame {\n  const game: BlackjackGame = {\n    deck,\n    player: [],\n    dealer: [],\n    bet,\n    done: false,\n    payout: 0,\n    outcome: \"\",\n  };\n  game.player.push(deck.pop()!, deck.pop()!);\n  game.dealer.push(deck.pop()!, deck.pop()!);\n  const p = blackjackValue(game.player);\n  const d = blackjackValue(game.dealer);\n  if (p === 21 || d === 21) settleBlackjack(game, true);\n  return game;\n}\n\nexport function blackjackHit(game: BlackjackGame): void {\n  if (game.done) return;\n  game.player.push(game.deck.pop()!);\n  if (blackjackValue(game.player) > 21) {\n    game.done = true;\n    game.outcome = \"bust\";\n    game.payout = 0;\n  } else if (blackjackValue(game.player) === 21) blackjackStand(game);\n}\n\nexport function blackjackDouble(game: BlackjackGame): void {\n  if (game.done || game.player.length !== 2) return;\n  game.bet *= 2;\n  game.player.push(game.deck.pop()!);\n  if (blackjackValue(game.player) > 21) {\n    game.done = true;\n    game.outcome = \"bust\";\n    game.payout = 0;\n    return;\n  }\n  blackjackStand(game);\n}\n\nexport function blackjackStand(game: BlackjackGame): void {\n  if (game.done) return;\n  while (blackjackValue(game.dealer) < 17) game.dealer.push(game.deck.pop()!);\n  settleBlackjack(game, false);\n}\n\nfunction settleBlackjack(game: BlackjackGame, natural: boolean): void {\n  const p = blackjackValue(game.player);\n  const d = blackjackValue(game.dealer);\n  game.done = true;\n  if (natural) {\n    const playerBj = p === 21;\n    const dealerBj = d === 21;\n    if (playerBj && dealerBj) [game.outcome, game.payout] = [\"push\", game.bet];\n    else if (playerBj) [game.outcome, game.payout] = [\"blackjack\", Math.floor(game.bet * 2.5)];\n    else [game.outcome, game.payout] = [\"lose\", 0];\n    return;\n  }\n  if (d > 21) [game.outcome, game.payout] = [\"dealer-bust\", game.bet * 2];\n  else if (p > d) [game.outcome, game.payout] = [\"win\", game.bet * 2];\n  else if (p === d) [game.outcome, game.payout] = [\"push\", game.bet];\n  else [game.outcome, game.payout] = [\"lose\", 0];\n}\n\n/* ------------------------ Video poker (JoB) ------------------------ */\n\nexport const POKER_PAYTABLE: [string, number][] = [\n  [\"Royal Flush\", 250],\n  [\"Straight Flush\", 50],\n  [\"Four of a Kind\", 25],\n  [\"Full House\", 9],\n  [\"Flush\", 6],\n  [\"Straight\", 4],\n  [\"Three of a Kind\", 3],\n  [\"Two Pair\", 2],\n  [\"Jacks or Better\", 1],\n];\n\n/** The best Jacks-or-Better hand and its multiplier (0 = no win). */\nexport function pokerHand(cards: Card[]): { name: string; multiplier: number } {\n  const ranks = cards.map((c) => c.rank).sort((a, b) => a - b);\n  const counts = new Map<number, number>();\n  for (const r of ranks) counts.set(r, (counts.get(r) ?? 0) + 1);\n  const groups = [...counts.values()].sort((a, b) => b - a);\n  const flush = cards.every((c) => c.suit === cards[0]!.suit);\n  const unique = [...new Set(ranks)];\n  const wheel = unique.join(\",\") === \"2,3,4,5,14\";\n  const straight = unique.length === 5 && (ranks[4]! - ranks[0]! === 4 || wheel);\n  const pay = (name: string) => ({\n    name,\n    multiplier: POKER_PAYTABLE.find(([n]) => n === name)![1],\n  });\n  if (straight && flush && ranks[0] === 10) return pay(\"Royal Flush\");\n  if (straight && flush) return pay(\"Straight Flush\");\n  if (groups[0] === 4) return pay(\"Four of a Kind\");\n  if (groups[0] === 3 && groups[1] === 2) return pay(\"Full House\");\n  if (flush) return pay(\"Flush\");\n  if (straight) return pay(\"Straight\");\n  if (groups[0] === 3) return pay(\"Three of a Kind\");\n  if (groups[0] === 2 && groups[1] === 2) return pay(\"Two Pair\");\n  if (groups[0] === 2) {\n    const pair = [...counts.entries()].find(([, n]) => n === 2)![0];\n    if (pair >= 11) return pay(\"Jacks or Better\");\n  }\n  return { name: \"No win\", multiplier: 0 };\n}\n\nexport interface PokerGame {\n  deck: Card[];\n  hand: Card[];\n  held: boolean[];\n  bet: number;\n  done: boolean;\n  payout: number;\n  result: string;\n}\n\nexport function pokerStart(bet: number, deck = newDeck()): PokerGame {\n  return {\n    deck,\n    hand: [deck.pop()!, deck.pop()!, deck.pop()!, deck.pop()!, deck.pop()!],\n    held: [false, false, false, false, false],\n    bet,\n    done: false,\n    payout: 0,\n    result: \"\",\n  };\n}\n\nexport function pokerDraw(game: PokerGame): void {\n  if (game.done) return;\n  game.hand = game.hand.map((card, i) => (game.held[i] ? card : game.deck.pop()!));\n  const best = pokerHand(game.hand);\n  game.done = true;\n  game.result = best.name;\n  game.payout = best.multiplier > 0 ? game.bet * (best.multiplier + 1) : 0;\n}\n\n/* ------------------------------ Roulette ---------------------------- */\n\nconst RED = new Set([1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36]);\n\nexport function rouletteColor(n: number): \"red\" | \"black\" | \"green\" {\n  return n === 0 ? \"green\" : RED.has(n) ? \"red\" : \"black\";\n}\n\n/** Normalises a bet; null when it is not one. */\nexport function rouletteBet(raw: string): string | null {\n  const b = raw.trim().toLowerCase();\n  const aliases: Record<string, string> = {\n    czerwone: \"red\",\n    czerwony: \"red\",\n    r: \"red\",\n    czarne: \"black\",\n    czarny: \"black\",\n    b: \"black\",\n    zielone: \"green\",\n    g: \"green\",\n    parzyste: \"even\",\n    nieparzyste: \"odd\",\n    \"1-18\": \"low\",\n    \"19-36\": \"high\",\n    \"1st\": \"dozen1\",\n    \"2nd\": \"dozen2\",\n    \"3rd\": \"dozen3\",\n    \"1-12\": \"dozen1\",\n    \"13-24\": \"dozen2\",\n    \"25-36\": \"dozen3\",\n  };\n  const bet = aliases[b] ?? b;\n  if (\n    [\"red\", \"black\", \"green\", \"even\", \"odd\", \"low\", \"high\", \"dozen1\", \"dozen2\", \"dozen3\"].includes(\n      bet,\n    )\n  )\n    return bet;\n  if (/^\\d{1,2}$/.test(bet) && Number(bet) <= 36) return String(Number(bet));\n  return null;\n}\n\n/** Spins once; `multiplier` is what the stake is multiplied by (0 = lost). */\nexport function rouletteSpin(\n  bet: string,\n  spin = randomInt(37),\n): { number: number; color: string; multiplier: number } {\n  const color = rouletteColor(spin);\n  let multiplier = 0;\n  if (/^\\d+$/.test(bet)) multiplier = Number(bet) === spin ? 36 : 0;\n  else if (bet === \"green\") multiplier = spin === 0 ? 36 : 0;\n  else if (spin === 0) multiplier = 0;\n  else if (bet === \"red\" || bet === \"black\") multiplier = color === bet ? 2 : 0;\n  else if (bet === \"even\") multiplier = spin % 2 === 0 ? 2 : 0;\n  else if (bet === \"odd\") multiplier = spin % 2 === 1 ? 2 : 0;\n  else if (bet === \"low\") multiplier = spin <= 18 ? 2 : 0;\n  else if (bet === \"high\") multiplier = spin >= 19 ? 2 : 0;\n  else if (bet.startsWith(\"dozen\"))\n    multiplier = Math.ceil(spin / 12) === Number(bet.slice(5)) ? 3 : 0;\n  return { number: spin, color, multiplier };\n}\n\n/* ------------------------------- Slots ------------------------------ */\n\nconst SLOT_SYMBOLS: [string, number, number][] = [\n  // symbol, weight, payout multiplier for three in a row\n  [\"🍒\", 30, 3],\n  [\"🍋\", 25, 4],\n  [\"🍇\", 20, 6],\n  [\"🔔\", 13, 10],\n  [\"⭐\", 8, 20],\n  [\"💎\", 4, 50],\n];\n\nfunction slotSymbol(): string {\n  const total = SLOT_SYMBOLS.reduce((sum, [, w]) => sum + w, 0);\n  let roll = randomInt(total);\n  for (const [symbol, weight] of SLOT_SYMBOLS) {\n    if (roll < weight) return symbol;\n    roll -= weight;\n  }\n  return SLOT_SYMBOLS[0]![0];\n}\n\nexport function slotsSpin(reels: string[] = [slotSymbol(), slotSymbol(), slotSymbol()]): {\n  reels: string[];\n  multiplier: number;\n} {\n  const [a, b, c] = reels;\n  if (a === b && b === c) return { reels, multiplier: SLOT_SYMBOLS.find(([s]) => s === a)![2] };\n  if (a === b || b === c || a === c) {\n    const pair = a === b || a === c ? a : b;\n    return { reels, multiplier: pair === \"💎\" ? 5 : pair === \"🍒\" ? 2 : 1.5 };\n  }\n  return { reels, multiplier: 0 };\n}\n\n/* --------------------------- Coin and dice -------------------------- */\n\nexport function coinflip(\n  call: string,\n  flip = randomInt(2),\n): { side: \"heads\" | \"tails\"; won: boolean } | null {\n  const c = call.trim().toLowerCase();\n  const pick = [\"heads\", \"h\", \"orzeł\", \"orzel\"].includes(c)\n    ? \"heads\"\n    : [\"tails\", \"t\", \"reszka\"].includes(c)\n      ? \"tails\"\n      : null;\n  if (pick === null) return null;\n  const side = flip === 0 ? \"heads\" : \"tails\";\n  return { side, won: side === pick };\n}\n\n/** Player and bot each roll two dice; higher total wins, a tie returns the bet. */\nexport function diceDuel(\n  rolls = [randomInt(1, 7), randomInt(1, 7), randomInt(1, 7), randomInt(1, 7)],\n): {\n  player: [number, number];\n  bot: [number, number];\n  outcome: \"win\" | \"lose\" | \"push\";\n} {\n  const player: [number, number] = [rolls[0]!, rolls[1]!];\n  const bot: [number, number] = [rolls[2]!, rolls[3]!];\n  const p = player[0] + player[1];\n  const b = bot[0] + bot[1];\n  return { player, bot, outcome: p > b ? \"win\" : p < b ? \"lose\" : \"push\" };\n}\n\n/** \"1h\", \"30m\", \"2d 4h\", \"90\" (minutes) → milliseconds, or null. */\nexport function parseDuration(raw: string): number | null {\n  const text = raw.trim().toLowerCase();\n  if (/^\\d+$/.test(text)) return Number(text) * 60_000;\n  const units: Record<string, number> = {\n    s: 1000,\n    m: 60_000,\n    min: 60_000,\n    h: 3_600_000,\n    d: 86_400_000,\n    w: 604_800_000,\n  };\n  let total = 0;\n  let matched = false;\n  for (const m of text.matchAll(/(\\d+)\\s*(min|s|m|h|d|w)/g)) {\n    total += Number(m[1]) * units[m[2]!]!;\n    matched = true;\n  }\n  return matched && total > 0 ? total : null;\n}\n","runtime/src/http.ts":"/**\n * Control-plane facing HTTP API.\n *\n * Contract (see src/lib/runtime-client.server.ts in the web app):\n *   POST /v1/bots/:botId/start    body { botId, userId }  -> RuntimeStatusPayload\n *   POST /v1/bots/:botId/stop     body { botId, userId }  -> RuntimeStatusPayload\n *   POST /v1/bots/:botId/presence body { botId, userId }  -> + { applied }\n *   POST /v1/bots/:botId/reload   body { botId, userId }  -> + { applied }\n *   GET  /v1/bots/:botId?userId=  -> RuntimeStatusPayload\n *   GET  /healthz                 -> liveness\n *\n * SECURITY: /v1/* is authenticated ONLY by BOT_RUNTIME_SHARED_SECRET — there is\n * no user session here. Anyone who can reach this port and holds the secret can\n * start or stop any bot, so also restrict it at the network layer (private\n * network, security group, or an authenticating proxy) and rotate the secret if\n * it is ever exposed. /healthz is unauthenticated by design and reveals nothing\n * beyond liveness unless the caller presents the secret.\n */\nimport http from \"node:http\";\nimport { timingSafeEqual } from \"node:crypto\";\nimport { config } from \"./config.js\";\nimport { logger } from \"./logger.js\";\nimport { describeError } from \"./redact.js\";\nimport {\n  CapacityError,\n  refreshBotPresence,\n  reloadBot,\n  runtimeSnapshot,\n  startBot,\n  statusOf,\n  stopBot,\n} from \"./supervisor.js\";\nimport type { RuntimeStatusPayload } from \"./types.js\";\n\nconst MAX_BODY_BYTES = 64 * 1024;\nconst BEARER_PREFIX = \"Bearer \";\nconst BOT_ID_PATTERN = /^[A-Za-z0-9._:-]{1,64}$/;\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nclass HttpError extends Error {\n  readonly status: number;\n\n  constructor(status: number, message: string) {\n    super(message);\n    this.name = \"HttpError\";\n    this.status = status;\n  }\n}\n\nfunction sendJson(res: http.ServerResponse, status: number, body: unknown): void {\n  const payload = JSON.stringify(body);\n  res.writeHead(status, {\n    \"content-type\": \"application/json; charset=utf-8\",\n    \"cache-control\": \"no-store\",\n    \"content-length\": Buffer.byteLength(payload).toString(),\n  });\n  res.end(payload);\n}\n\n/** Length check first, then a constant-time compare of equal-length buffers. */\nfunction secretMatches(provided: string, expected: string): boolean {\n  const left = Buffer.from(provided, \"utf8\");\n  const right = Buffer.from(expected, \"utf8\");\n  if (left.byteLength !== right.byteLength) return false;\n  return timingSafeEqual(left, right);\n}\n\nfunction isAuthorized(req: http.IncomingMessage): boolean {\n  const header = req.headers[\"authorization\"];\n  if (typeof header !== \"string\" || !header.startsWith(BEARER_PREFIX)) return false;\n  return secretMatches(header.slice(BEARER_PREFIX.length), config.inboundSecret);\n}\n\nfunction requireAuth(req: http.IncomingMessage): void {\n  if (!isAuthorized(req)) throw new HttpError(401, \"Unauthorized.\");\n}\n\nasync function readJsonBody(req: http.IncomingMessage): Promise<Record<string, unknown>> {\n  const chunks: Buffer[] = [];\n  let size = 0;\n\n  for await (const chunk of req as AsyncIterable<Buffer>) {\n    size += chunk.byteLength;\n    if (size > MAX_BODY_BYTES) throw new HttpError(413, \"Request body is too large.\");\n    chunks.push(chunk);\n  }\n\n  if (size === 0) return {};\n\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\n  } catch {\n    throw new HttpError(400, \"Request body must be valid JSON.\");\n  }\n\n  if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n    throw new HttpError(400, \"Request body must be a JSON object.\");\n  }\n  return parsed as Record<string, unknown>;\n}\n\nfunction requireBotId(raw: string | undefined): string {\n  const botId = raw === undefined ? \"\" : decodeURIComponent(raw);\n  if (!BOT_ID_PATTERN.test(botId)) throw new HttpError(400, \"Invalid bot id.\");\n  return botId;\n}\n\nfunction requireUserId(raw: unknown): string {\n  if (typeof raw !== \"string\" || !UUID_PATTERN.test(raw)) {\n    throw new HttpError(400, \"A valid userId (UUID) is required.\");\n  }\n  return raw;\n}\n\nfunction withBotId(\n  botId: string,\n  status: RuntimeStatusPayload,\n): RuntimeStatusPayload & {\n  botId: string;\n} {\n  return { botId, ...status };\n}\n\nasync function handleCommand(\n  req: http.IncomingMessage,\n  botId: string,\n  action: \"start\" | \"stop\",\n): Promise<RuntimeStatusPayload> {\n  const body = await readJsonBody(req);\n  const userId = requireUserId(body[\"userId\"]);\n\n  // The body carries botId too; a mismatch means a malformed caller, not a bot.\n  const bodyBotId = body[\"botId\"];\n  if (typeof bodyBotId === \"string\" && bodyBotId !== botId) {\n    throw new HttpError(400, \"botId in the body does not match the URL.\");\n  }\n\n  logger.info(`${action} requested for bot ${botId}.`);\n  return action === \"start\" ? startBot(userId, botId) : stopBot(userId, botId);\n}\n\nasync function route(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\n  const method = req.method ?? \"GET\";\n  const url = new URL(req.url ?? \"/\", \"http://runtime.invalid\");\n  const segments = url.pathname.split(\"/\").filter((part) => part.length > 0);\n\n  if (segments.length === 1 && segments[0] === \"healthz\") {\n    if (method !== \"GET\") throw new HttpError(405, \"Method not allowed.\");\n    // Detail only for authenticated callers; bare liveness for load balancers.\n    const detail = isAuthorized(req)\n      ? { ...runtimeSnapshot(), uptimeSeconds: Math.round(process.uptime()) }\n      : {};\n    sendJson(res, 200, { ok: true, ...detail });\n    return;\n  }\n\n  if (segments[0] !== \"v1\" || segments[1] !== \"bots\") {\n    throw new HttpError(404, \"Not found.\");\n  }\n\n  requireAuth(req);\n\n  const botId = requireBotId(segments[2]);\n\n  // GET /v1/bots/:botId?userId=\n  if (segments.length === 3 && method === \"GET\") {\n    const userId = requireUserId(url.searchParams.get(\"userId\"));\n    sendJson(res, 200, withBotId(botId, statusOf(userId, botId)));\n    return;\n  }\n\n  // POST /v1/bots/:botId/start | /stop\n  if (segments.length === 4 && method === \"POST\") {\n    const action = segments[3];\n\n    // POST /v1/bots/:botId/presence — re-apply the saved presence live.\n    if (action === \"presence\") {\n      const body = await readJsonBody(req);\n      const userId = requireUserId(body[\"userId\"]);\n      const applied = await refreshBotPresence(userId, botId);\n      sendJson(res, 200, { ...withBotId(botId, statusOf(userId, botId)), applied });\n      return;\n    }\n\n    // POST /v1/bots/:botId/reload — pull the newly published flow into a\n    // running bot. `applied: false` simply means this runtime does not host\n    // the bot right now, which is not an error for the control plane.\n    if (action === \"reload\") {\n      const body = await readJsonBody(req);\n      const userId = requireUserId(body[\"userId\"]);\n      const applied = await reloadBot(userId, botId);\n      sendJson(res, 200, { ...withBotId(botId, statusOf(userId, botId)), applied });\n      return;\n    }\n\n    if (action !== \"start\" && action !== \"stop\") throw new HttpError(404, \"Not found.\");\n    const status = await handleCommand(req, botId, action);\n    sendJson(res, 200, withBotId(botId, status));\n    return;\n  }\n\n  if (segments.length === 3 || segments.length === 4) {\n    throw new HttpError(405, \"Method not allowed.\");\n  }\n  throw new HttpError(404, \"Not found.\");\n}\n\nexport function createRuntimeServer(): http.Server {\n  const server = http.createServer((req, res) => {\n    void route(req, res).catch((error: unknown) => {\n      if (res.headersSent) {\n        res.destroy();\n        return;\n      }\n      if (error instanceof HttpError) {\n        sendJson(res, error.status, { ok: false, error: error.message });\n        return;\n      }\n      if (error instanceof CapacityError) {\n        sendJson(res, 503, { ok: false, error: error.message });\n        return;\n      }\n      logger.error(`Unhandled request error: ${describeError(error)}`, error);\n      sendJson(res, 500, { ok: false, error: \"Internal runtime error.\" });\n    });\n  });\n\n  server.headersTimeout = 15_000;\n  server.requestTimeout = 30_000;\n  server.keepAliveTimeout = 20_000;\n  return server;\n}\n","runtime/src/index.ts":"/**\n * Entry point. Boots the HTTP API, then drains gateway connections on shutdown\n * so no bot is left reported as \"online\" after the process is gone.\n */\nimport { config } from \"./config.js\";\nimport { createRuntimeServer } from \"./http.js\";\nimport { logger } from \"./logger.js\";\nimport { describeError } from \"./redact.js\";\nimport { shutdownAll, startSweeper } from \"./supervisor.js\";\n\nconst SHUTDOWN_TIMEOUT_MS = 15_000;\n\nconst server = createRuntimeServer();\nconst stopSweeper = startSweeper();\n\nlet shuttingDown = false;\n\nasync function shutdown(signal: string, exitCode = 0): Promise<void> {\n  if (shuttingDown) return;\n  shuttingDown = true;\n  logger.info(`Received ${signal}, shutting down.`);\n\n  stopSweeper();\n  server.close();\n\n  const timeout = setTimeout(() => {\n    logger.error(\"Shutdown timed out; exiting anyway.\");\n    process.exit(exitCode || 1);\n  }, SHUTDOWN_TIMEOUT_MS);\n  timeout.unref();\n\n  try {\n    await shutdownAll();\n  } catch (error) {\n    logger.error(`Error during shutdown: ${describeError(error)}`);\n  }\n\n  clearTimeout(timeout);\n  process.exit(exitCode);\n}\n\nserver.on(\"error\", (error: Error) => {\n  logger.error(`HTTP server error: ${describeError(error)}`);\n  process.exit(1);\n});\n\nserver.listen(config.port, config.host, () => {\n  logger.info(\n    `Bot runtime listening on http://${config.host}:${config.port} ` +\n      `(control plane: ${config.controlPlaneUrl}, max bots: ${config.maxConcurrentBots}).`,\n  );\n});\n\nprocess.on(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\nprocess.on(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n\nprocess.on(\"unhandledRejection\", (reason: unknown) => {\n  // Reporting and gateway callbacks are fire-and-forget; log instead of dying.\n  logger.error(`Unhandled promise rejection: ${describeError(reason)}`, reason);\n});\n\nprocess.on(\"uncaughtException\", (error: Error) => {\n  logger.error(`Uncaught exception: ${describeError(error)}`, error);\n  void shutdown(\"uncaughtException\", 1);\n});\n","runtime/src/local-storage.ts":"/**\n * Bottly storage for an exported bot (src/standalone.ts): the same operations\n * the control plane runs (src/lib/bot-storage.server.ts in the web app), on a\n * JSON file instead of the database — data/storage.json next to the bot, or\n * BOTTLY_DATA_DIR. Writes are batched and atomic (temp file + rename).\n */\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n  aggregateStorageRecords,\n  matchesStorageFilters,\n  sortStorageRecords,\n  type StorageAggregateOp,\n  type StorageFilter,\n} from \"./flow-contract.js\";\n\ninterface Row {\n  id: string;\n  table: string;\n  created_at: string;\n  data: Record<string, unknown>;\n}\n\nconst NAME = /^[A-Za-z0-9_]{1,64}$/;\n/** Same cap per record as Bottly storage. */\nconst MAX_RECORD = 8000;\n\nexport interface LocalStorageResult {\n  ok: boolean;\n  rows?: Record<string, unknown>[];\n  count?: number;\n  groups?: { key: string; value: number | null }[];\n  error?: string;\n}\n\nexport class LocalStorage {\n  private rows: Row[] = [];\n  private loaded = false;\n  private timer: NodeJS.Timeout | null = null;\n  private seq = 0;\n  readonly file: string;\n\n  constructor(dir = process.env[\"BOTTLY_DATA_DIR\"] || \"data\") {\n    this.file = resolve(join(dir, \"storage.json\"));\n  }\n\n  private load() {\n    if (this.loaded) return;\n    this.loaded = true;\n    try {\n      const raw = JSON.parse(readFileSync(this.file, \"utf8\")) as { rows?: Row[] };\n      this.rows = Array.isArray(raw.rows) ? raw.rows : [];\n    } catch {\n      this.rows = [];\n    }\n  }\n\n  private persist() {\n    if (this.timer) return;\n    this.timer = setTimeout(() => this.flush(), 250);\n    this.timer.unref?.();\n  }\n\n  /** Writes the file now (also called on shutdown). */\n  flush() {\n    if (this.timer) clearTimeout(this.timer);\n    this.timer = null;\n    if (!this.loaded) return;\n    mkdirSync(dirname(this.file), { recursive: true });\n    const tmp = `${this.file}.tmp`;\n    writeFileSync(tmp, JSON.stringify({ rows: this.rows }), \"utf8\");\n    renameSync(tmp, this.file);\n  }\n\n  private id() {\n    this.seq += 1;\n    return `${Date.now().toString(36)}${this.seq.toString(36).padStart(4, \"0\")}`;\n  }\n\n  private view(row: Row): Record<string, unknown> {\n    return { id: row.id, created_at: row.created_at, ...row.data };\n  }\n\n  /** Field values as text, the way filters and sorting compare them. */\n  private flat(row: Row): Record<string, string> {\n    const out: Record<string, string> = { id: row.id, created_at: row.created_at };\n    for (const [k, v] of Object.entries(row.data)) out[k] = typeof v === \"string\" ? v : JSON.stringify(v ?? \"\");\n    return out;\n  }\n\n  run(body: Record<string, unknown>): LocalStorageResult {\n    this.load();\n    const op = String(body[\"op\"] ?? \"\");\n    const table = String(body[\"table\"] ?? \"\");\n    if (!NAME.test(table)) return { ok: false, error: \"Invalid table name.\" };\n    const where = body[\"where\"] as { field: string; value: string } | undefined;\n    if (where && !NAME.test(where.field)) return { ok: false, error: \"Invalid field name.\" };\n    const inTable = this.rows.filter((r) => r.table === table);\n    const matching = where ? inTable.filter((r) => String(r.data[where.field] ?? \"\") === String(where.value)) : inTable;\n    const data = (body[\"data\"] ?? {}) as Record<string, unknown>;\n    const filters = (body[\"filters\"] ?? []) as StorageFilter[];\n    const sort = (body[\"sort\"] ?? { field: \"\", asc: false }) as { field: string; asc?: boolean };\n\n    switch (op) {\n      case \"save\": {\n        if (JSON.stringify(data).length > MAX_RECORD) return { ok: false, error: \"Record is too large.\" };\n        this.rows.push({ id: this.id(), table, created_at: new Date().toISOString(), data: { ...data } });\n        this.persist();\n        return { ok: true };\n      }\n      case \"find\": {\n        const row = matching[matching.length - 1];\n        return { ok: true, rows: row ? [this.view(row)] : [] };\n      }\n      case \"list\": {\n        const limit = Math.min(1000, Math.max(1, Number(body[\"limit\"] ?? 50)));\n        const flat = matching.map((r) => ({ row: r, flat: this.flat(r) }));\n        const sorted = sort.field\n          ? sortStorageRecords(flat.map((f) => f.flat), sort.field, sort.asc === true).map((f) => flat.find((x) => x.flat === f)!.row)\n          : matching;\n        return { ok: true, rows: sorted.slice(0, limit).map((r) => this.view(r)), count: matching.length };\n      }\n      case \"count\":\n        return { ok: true, count: matching.length };\n      case \"update\": {\n        if (!where) return { ok: false, error: \"Update needs a where field.\" };\n        for (const r of matching) r.data = { ...r.data, ...data };\n        this.persist();\n        return { ok: true, count: matching.length };\n      }\n      case \"delete\": {\n        if (!where) return { ok: false, error: \"Delete needs a where field.\" };\n        const gone = new Set(matching);\n        this.rows = this.rows.filter((r) => !gone.has(r));\n        this.persist();\n        return { ok: true };\n      }\n      case \"query\":\n      case \"take\":\n      case \"aggregate\": {\n        const pairs = inTable.map((r) => ({ row: r, flat: this.flat(r) }));\n        const hits = pairs.filter((p) => matchesStorageFilters(p.flat, filters));\n        const byFlat = new Map(hits.map((p) => [p.flat, p.row]));\n        if (op === \"aggregate\") {\n          const agg = body[\"aggregate\"] as { op: StorageAggregateOp; field?: string; groupBy?: string; top?: number };\n          const groups = aggregateStorageRecords(hits.map((p) => p.flat), agg.op, agg.field ?? \"\", agg.groupBy ?? \"\", agg.top ?? 10);\n          return { ok: true, groups };\n        }\n        // Query: newest first unless asc; take: oldest first unless asc is false.\n        const asc = op === \"take\" ? sort.asc !== false : sort.asc === true;\n        const ordered = sortStorageRecords(hits.map((p) => p.flat), sort.field ?? \"\", asc).map((f) => byFlat.get(f)!);\n        if (op === \"query\") {\n          const offset = Math.max(0, Number(body[\"offset\"] ?? 0));\n          const limit = Math.min(100, Math.max(1, Number(body[\"limit\"] ?? 25)));\n          const rows = ordered.slice(offset, offset + limit).map((r) => this.view(r));\n          return { ok: true, rows, count: rows.length };\n        }\n        const picked = ordered[0];\n        if (!picked) return { ok: true, rows: [], count: 0 };\n        picked.data = { ...picked.data, ...data };\n        this.persist();\n        return { ok: true, rows: [this.view(picked)], count: 1 };\n      }\n      default:\n        return { ok: false, error: `Unknown storage operation \"${op}\".` };\n    }\n  }\n}\n\nlet shared: LocalStorage | null = null;\nexport function localStorage(): LocalStorage {\n  shared ??= new LocalStorage();\n  return shared;\n}\n","runtime/src/logger.ts":"/**\n * Minimal levelled logger.\n *\n * Reads its own env var so it has no dependency on config.ts (which logs while\n * validating). Never log a bot token, a decrypted secret, or a raw callback\n * secret — use scrubSecrets() from ./redact.ts for anything Discord-derived.\n */\ntype Level = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nconst ORDER: Record<Level, number> = { debug: 10, info: 20, warn: 30, error: 40 };\n\nfunction resolveThreshold(): number {\n  const raw = (process.env[\"BOT_RUNTIME_LOG_LEVEL\"] ?? \"info\").toLowerCase();\n  return ORDER[raw as Level] ?? ORDER.info;\n}\n\nconst threshold = resolveThreshold();\n\nfunction emit(level: Level, message: string, extra: unknown[]): void {\n  if (ORDER[level] < threshold) return;\n  const line = `${new Date().toISOString()} [${level.toUpperCase()}] ${message}`;\n  if (level === \"error\") console.error(line, ...extra);\n  else if (level === \"warn\") console.warn(line, ...extra);\n  else console.log(line, ...extra);\n}\n\nexport const logger = {\n  debug: (message: string, ...extra: unknown[]) => emit(\"debug\", message, extra),\n  info: (message: string, ...extra: unknown[]) => emit(\"info\", message, extra),\n  warn: (message: string, ...extra: unknown[]) => emit(\"warn\", message, extra),\n  error: (message: string, ...extra: unknown[]) => emit(\"error\", message, extra),\n};\n","runtime/src/plugin-apis.ts":"/**\n * Outside services used by the official plugins: exchange rates (Converter),\n * the public Roblox web APIs (Roblox) and the feeds behind the YouTube,\n * Twitch, Bluesky and RSS triggers. Fixed hosts only (never a user URL,\n * except RSS, which goes through safeFetch), short timeouts, small caches.\n */\nimport { convertUnits, formatAmount, isUnit } from \"./flow-contract.js\";\nimport { safeFetch } from \"./safe-fetch.js\";\n\nconst TIMEOUT = 12_000;\nconst UA = \"BottlyBot/1.0 (+https://bottly.xyz)\";\n\nasync function getJson<T>(url: string, init: RequestInit = {}): Promise<T> {\n  const res = await fetch(url, {\n    ...init,\n    headers: { Accept: \"application/json\", \"User-Agent\": UA, ...(init.headers ?? {}) },\n    signal: AbortSignal.timeout(TIMEOUT),\n  });\n  if (!res.ok) throw new Error(`${new URL(url).host} answered ${res.status}`);\n  return (await res.json()) as T;\n}\n\nasync function getText(url: string): Promise<string> {\n  const res = await fetch(url, {\n    headers: { \"User-Agent\": UA },\n    signal: AbortSignal.timeout(TIMEOUT),\n  });\n  if (!res.ok) throw new Error(`${new URL(url).host} answered ${res.status}`);\n  return res.text();\n}\n\n/* ------------------------------------------------------------------ *\n * Converter\n * ------------------------------------------------------------------ */\n\nlet fiatCache: { at: number; base: string; rates: Record<string, number> } | null = null;\nconst cryptoCache = new Map<string, { at: number; rates: Record<string, number> }>();\n\n/** USD-based fiat rates, refreshed hourly (the source updates daily). */\nasync function fiatRates(): Promise<Record<string, number>> {\n  if (fiatCache && Date.now() - fiatCache.at < 3_600_000) return fiatCache.rates;\n  const body = await getJson<{ result?: string; rates?: Record<string, number> }>(\n    \"https://open.er-api.com/v6/latest/USD\",\n  );\n  if (body.result !== \"success\" || !body.rates)\n    throw new Error(\"Exchange rates are unavailable right now.\");\n  fiatCache = { at: Date.now(), base: \"USD\", rates: body.rates };\n  return body.rates;\n}\n\n/** Rates from one coin (or currency) to everything Coinbase knows, cached 2 minutes. */\nasync function coinbaseRates(code: string): Promise<Record<string, number>> {\n  const hit = cryptoCache.get(code);\n  if (hit && Date.now() - hit.at < 120_000) return hit.rates;\n  const body = await getJson<{ data?: { rates?: Record<string, string> } }>(\n    `https://api.coinbase.com/v2/exchange-rates?currency=${encodeURIComponent(code)}`,\n  ).catch(() => null);\n  const raw = body?.data?.rates;\n  if (!raw) throw new Error(`\"${code}\" is not a currency, coin or unit I know.`);\n  const rates = Object.fromEntries(\n    Object.entries(raw).map(([k, v]) => [k.toUpperCase(), Number(v)]),\n  );\n  cryptoCache.set(code, { at: Date.now(), rates });\n  if (cryptoCache.size > 200) cryptoCache.delete(cryptoCache.keys().next().value as string);\n  return rates;\n}\n\nexport interface Conversion {\n  result: number;\n  rate: number;\n  from: string;\n  to: string;\n  kind: \"unit\" | \"currency\";\n}\n\n/** \"100\", \"usd\", \"pln\" → 402.15. Units first, then fiat, then crypto. */\nexport async function convert(\n  amountRaw: string,\n  fromRaw: string,\n  toRaw: string,\n): Promise<Conversion> {\n  const amount = Number(amountRaw.replace(/[\\s_]/g, \"\").replace(\",\", \".\"));\n  if (!Number.isFinite(amount)) throw new Error(`\"${amountRaw}\" is not a number.`);\n  const from = fromRaw.trim();\n  const to = toRaw.trim();\n  if (!from || !to) throw new Error(\"Say what to convert from and to.\");\n\n  if (isUnit(from) || isUnit(to)) {\n    const result = convertUnits(amount, from, to);\n    if (result === null)\n      throw new Error(`Cannot convert ${from} to ${to}: they measure different things.`);\n    return { result, rate: amount === 0 ? 0 : result / amount, from, to, kind: \"unit\" };\n  }\n\n  const a = from.toUpperCase();\n  const b = to.toUpperCase();\n  const fiat = await fiatRates().catch(() => null);\n  if (fiat && fiat[a] !== undefined && fiat[b] !== undefined) {\n    const rate = fiat[b]! / fiat[a]!;\n    return { result: amount * rate, rate, from: a, to: b, kind: \"currency\" };\n  }\n  // Crypto (or a fiat pair the first source lacks): Coinbase has both directions.\n  const rates = await coinbaseRates(a);\n  const rate = rates[b];\n  if (rate === undefined || !Number.isFinite(rate)) throw new Error(`No rate from ${a} to ${b}.`);\n  return { result: amount * rate, rate, from: a, to: b, kind: \"currency\" };\n}\n\nexport function conversionText(amount: string, c: Conversion): string {\n  return `${formatAmount(Number(amount.replace(\",\", \".\")))} ${c.from} = ${formatAmount(c.result)} ${c.to}`;\n}\n\n/* ------------------------------------------------------------------ *\n * Roblox\n * ------------------------------------------------------------------ */\n\ninterface RobloxUser {\n  id: number;\n  name: string;\n  displayName: string;\n  description?: string;\n  created?: string;\n  isBanned?: boolean;\n  hasVerifiedBadge?: boolean;\n}\n\n/** A username or numeric id → the user, or an error that says which. */\nasync function robloxUser(query: string): Promise<RobloxUser> {\n  const q = query.trim().replace(/^@/, \"\");\n  const fromUrl = /roblox\\.com\\/users\\/(\\d+)/i.exec(q)?.[1];\n  const id = fromUrl ?? (/^\\d{1,19}$/.test(q) ? q : null);\n  if (id !== null) {\n    const user = await getJson<RobloxUser>(`https://users.roblox.com/v1/users/${id}`).catch(\n      () => null,\n    );\n    if (!user) throw new Error(`No Roblox user with the ID ${id}.`);\n    return user;\n  }\n  const found = await getJson<{ data?: { id: number }[] }>(\n    \"https://users.roblox.com/v1/usernames/users\",\n    {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ usernames: [q], excludeBannedUsers: false }),\n    },\n  );\n  const hit = found.data?.[0];\n  if (!hit) throw new Error(`No Roblox user called \"${q}\".`);\n  return getJson<RobloxUser>(`https://users.roblox.com/v1/users/${hit.id}`);\n}\n\nasync function thumbnail(\n  kind: \"avatar-headshot\" | \"avatar-bust\" | \"avatar\",\n  id: number,\n  size: string,\n): Promise<string> {\n  const body = await getJson<{ data?: { imageUrl?: string }[] }>(\n    `https://thumbnails.roblox.com/v1/users/${kind}?userIds=${id}&size=${size}&format=Png&isCircular=false`,\n  ).catch(() => null);\n  return body?.data?.[0]?.imageUrl ?? \"\";\n}\n\nasync function count(url: string): Promise<string> {\n  const body = await getJson<{ count?: number }>(url).catch(() => null);\n  return body?.count === undefined ? \"\" : String(body.count);\n}\n\nconst PRESENCE = [\"Offline\", \"Online\", \"In game\", \"In Studio\", \"Invisible\"];\n\n/** Runs one Roblox operation; every value is a string, ready for {storeAs.key}. */\nexport async function robloxOperation(\n  operation: string,\n  query: string,\n): Promise<Record<string, string>> {\n  switch (operation) {\n    case \"user\": {\n      const u = await robloxUser(query);\n      const [avatar, friends, followers, following] = await Promise.all([\n        thumbnail(\"avatar-headshot\", u.id, \"420x420\"),\n        count(`https://friends.roblox.com/v1/users/${u.id}/friends/count`),\n        count(`https://friends.roblox.com/v1/users/${u.id}/followers/count`),\n        count(`https://friends.roblox.com/v1/users/${u.id}/followings/count`),\n      ]);\n      const created = u.created ? Date.parse(u.created) : Number.NaN;\n      return {\n        id: String(u.id),\n        name: u.name,\n        displayName: u.displayName,\n        description: (u.description ?? \"\").slice(0, 1000),\n        created: Number.isFinite(created) ? `<t:${Math.floor(created / 1000)}:D>` : \"\",\n        createdUnix: Number.isFinite(created) ? String(Math.floor(created / 1000)) : \"\",\n        banned: u.isBanned ? \"yes\" : \"no\",\n        verified: u.hasVerifiedBadge ? \"yes\" : \"no\",\n        url: `https://www.roblox.com/users/${u.id}/profile`,\n        avatar,\n        friends,\n        followers,\n        following,\n      };\n    }\n    case \"avatar\": {\n      const u = await robloxUser(query);\n      const [headshot, bust, fullBody] = await Promise.all([\n        thumbnail(\"avatar-headshot\", u.id, \"420x420\"),\n        thumbnail(\"avatar-bust\", u.id, \"420x420\"),\n        thumbnail(\"avatar\", u.id, \"720x720\"),\n      ]);\n      return { id: String(u.id), name: u.name, headshot, bust, fullBody };\n    }\n    case \"presence\": {\n      const u = await robloxUser(query);\n      const body = await getJson<{\n        userPresences?: {\n          userPresenceType?: number;\n          lastLocation?: string;\n          lastOnline?: string;\n          gameId?: string | null;\n        }[];\n      }>(\"https://presence.roblox.com/v1/presence/users\", {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ userIds: [u.id] }),\n      });\n      const p = body.userPresences?.[0];\n      const last = p?.lastOnline ? Date.parse(p.lastOnline) : Number.NaN;\n      return {\n        id: String(u.id),\n        name: u.name,\n        status: PRESENCE[p?.userPresenceType ?? 0] ?? \"Offline\",\n        lastLocation: p?.lastLocation ?? \"\",\n        lastOnline: Number.isFinite(last) ? `<t:${Math.floor(last / 1000)}:R>` : \"\",\n        gameId: p?.gameId ?? \"\",\n      };\n    }\n    case \"groups\": {\n      const u = await robloxUser(query);\n      const body = await getJson<{ data?: { group: { name: string }; role: { name: string } }[] }>(\n        `https://groups.roblox.com/v2/users/${u.id}/groups/roles`,\n      );\n      const list = body.data ?? [];\n      return {\n        id: String(u.id),\n        name: u.name,\n        count: String(list.length),\n        list:\n          list\n            .slice(0, 25)\n            .map((g) => `• ${g.group.name} — ${g.role.name}`)\n            .join(\"\\n\") || \"No groups\",\n      };\n    }\n    case \"group\": {\n      const id = /(\\d{1,19})/.exec(query)?.[1];\n      if (!id) throw new Error(\"Give a Roblox group ID.\");\n      const g = await getJson<{\n        id: number;\n        name: string;\n        description?: string;\n        owner?: { username?: string; userId?: number } | null;\n        memberCount?: number;\n        hasVerifiedBadge?: boolean;\n      }>(`https://groups.roblox.com/v1/groups/${id}`).catch(() => null);\n      if (!g) throw new Error(`No Roblox group with the ID ${id}.`);\n      const icon = await getJson<{ data?: { imageUrl?: string }[] }>(\n        `https://thumbnails.roblox.com/v1/groups/icons?groupIds=${g.id}&size=420x420&format=Png`,\n      ).catch(() => null);\n      return {\n        id: String(g.id),\n        name: g.name,\n        description: (g.description ?? \"\").slice(0, 1000),\n        owner: g.owner?.username ?? \"No owner\",\n        ownerId: g.owner?.userId ? String(g.owner.userId) : \"\",\n        members: String(g.memberCount ?? \"\"),\n        url: `https://www.roblox.com/groups/${g.id}`,\n        icon: icon?.data?.[0]?.imageUrl ?? \"\",\n        verified: g.hasVerifiedBadge ? \"yes\" : \"no\",\n      };\n    }\n    case \"game\": {\n      const placeId = /games\\/(\\d+)/.exec(query)?.[1] ?? /(\\d{1,19})/.exec(query)?.[1];\n      if (!placeId) throw new Error(\"Give a Roblox place ID or game link.\");\n      const universe = await getJson<{ universeId?: number }>(\n        `https://apis.roblox.com/universes/v1/places/${placeId}/universe`,\n      ).catch(() => null);\n      if (!universe?.universeId) throw new Error(`No Roblox game with the place ID ${placeId}.`);\n      const body = await getJson<{\n        data?: {\n          id: number;\n          rootPlaceId: number;\n          name: string;\n          description?: string;\n          creator?: { name?: string };\n          playing?: number;\n          visits?: number;\n          favoritedCount?: number;\n          maxPlayers?: number;\n          created?: string;\n          updated?: string;\n          genre?: string;\n        }[];\n      }>(`https://games.roblox.com/v1/games?universeIds=${universe.universeId}`);\n      const g = body.data?.[0];\n      if (!g) throw new Error(`No Roblox game with the place ID ${placeId}.`);\n      const icon = await getJson<{ data?: { imageUrl?: string }[] }>(\n        `https://thumbnails.roblox.com/v1/games/icons?universeIds=${g.id}&size=512x512&format=Png`,\n      ).catch(() => null);\n      const when = (iso?: string) => {\n        const t = iso ? Date.parse(iso) : Number.NaN;\n        return Number.isFinite(t) ? `<t:${Math.floor(t / 1000)}:D>` : \"\";\n      };\n      return {\n        id: String(g.id),\n        placeId: String(g.rootPlaceId),\n        name: g.name,\n        description: (g.description ?? \"\").slice(0, 1000),\n        creator: g.creator?.name ?? \"\",\n        playing: (g.playing ?? 0).toLocaleString(\"en-US\"),\n        visits: (g.visits ?? 0).toLocaleString(\"en-US\"),\n        favorites: (g.favoritedCount ?? 0).toLocaleString(\"en-US\"),\n        maxPlayers: String(g.maxPlayers ?? \"\"),\n        created: when(g.created),\n        updated: when(g.updated),\n        url: `https://www.roblox.com/games/${g.rootPlaceId}`,\n        icon: icon?.data?.[0]?.imageUrl ?? \"\",\n        genre: g.genre ?? \"\",\n      };\n    }\n    default:\n      throw new Error(`Unknown Roblox operation \"${operation}\".`);\n  }\n}\n\n/* ------------------------------------------------------------------ *\n * Feeds (RSS / Atom, YouTube, Bluesky, Twitch)\n * ------------------------------------------------------------------ */\n\nexport interface FeedItem {\n  /** Stable id used to remember what was already posted. */\n  id: string;\n  vars: Record<string, string>;\n}\n\nconst ENTITIES: Record<string, string> = {\n  amp: \"&\",\n  lt: \"<\",\n  gt: \">\",\n  quot: '\"',\n  apos: \"'\",\n  nbsp: \" \",\n};\n\nfunction decode(raw: string): string {\n  return raw\n    .replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, \"$1\")\n    .replace(/&#(\\d+);/g, (_, n: string) => String.fromCodePoint(Number(n)))\n    .replace(/&#x([0-9a-f]+);/gi, (_, n: string) => String.fromCodePoint(parseInt(n, 16)))\n    .replace(/&([a-z]+);/gi, (m, name: string) => ENTITIES[name.toLowerCase()] ?? m)\n    .trim();\n}\n\nfunction plain(html: string): string {\n  return decode(html)\n    .replace(/<br\\s*\\/?>/gi, \"\\n\")\n    .replace(/<[^>]+>/g, \"\")\n    .replace(/[ \\t]+/g, \" \")\n    .replace(/\\n{3,}/g, \"\\n\\n\")\n    .trim();\n}\n\nfunction tag(block: string, name: string): string {\n  const m = new RegExp(`<${name}(?:\\\\s[^>]*)?>([\\\\s\\\\S]*?)</${name}>`, \"i\").exec(block);\n  return m ? decode(m[1]!) : \"\";\n}\n\nfunction attr(block: string, name: string, attribute: string, where?: RegExp): string {\n  const re = new RegExp(`<${name}\\\\b([^>]*)/?>`, \"gi\");\n  let m: RegExpExecArray | null;\n  while ((m = re.exec(block)) !== null) {\n    const attrs = m[1]!;\n    if (where && !where.test(attrs)) continue;\n    const v = new RegExp(`${attribute}\\\\s*=\\\\s*\"([^\"]*)\"`, \"i\").exec(attrs)?.[1];\n    if (v) return decode(v);\n  }\n  return \"\";\n}\n\nfunction timestamp(raw: string): string {\n  const t = raw ? Date.parse(raw) : Number.NaN;\n  return Number.isFinite(t) ? `<t:${Math.floor(t / 1000)}:R>` : \"\";\n}\n\n/** RSS 2.0 and Atom, newest first as the feed lists them. */\nexport function parseFeed(xml: string): { title: string; items: FeedItem[] } {\n  const atom = /<feed[\\s>]/i.test(xml);\n  const blocks =\n    xml.match(atom ? /<entry[\\s>][\\s\\S]*?<\\/entry>/gi : /<item[\\s>][\\s\\S]*?<\\/item>/gi) ?? [];\n  const channel = atom ? xml : (/<channel[\\s>][\\s\\S]*?(?=<item[\\s>])/i.exec(xml)?.[0] ?? xml);\n  const feedTitle = plain(tag(atom ? xml.split(/<entry[\\s>]/i)[0]! : channel, \"title\"));\n  const items = blocks.slice(0, 30).map((block): FeedItem => {\n    const link = atom\n      ? attr(block, \"link\", \"href\", /rel\\s*=\\s*\"alternate\"/i) || attr(block, \"link\", \"href\")\n      : tag(block, \"link\") || attr(block, \"link\", \"href\");\n    const id = tag(block, \"guid\") || tag(block, \"id\") || tag(block, \"yt:videoId\") || link;\n    const summary = plain(\n      tag(block, \"media:description\") ||\n        tag(block, \"description\") ||\n        tag(block, \"summary\") ||\n        tag(block, \"content\"),\n    );\n    const image =\n      attr(block, \"media:thumbnail\", \"url\") ||\n      attr(block, \"media:content\", \"url\", /medium\\s*=\\s*\"image\"|type\\s*=\\s*\"image/i) ||\n      attr(block, \"enclosure\", \"url\", /type\\s*=\\s*\"image/i) ||\n      (/<img[^>]+src=\"([^\"]+)\"/i.exec(\n        decode(tag(block, \"description\") || tag(block, \"content\")),\n      )?.[1] ??\n        \"\");\n    return {\n      id,\n      vars: {\n        title: plain(tag(block, \"title\")).slice(0, 256),\n        url: link,\n        summary: summary.slice(0, 1500),\n        author: plain(\n          tag(tag(block, \"author\") ? block : \"\", \"name\") ||\n            tag(block, \"author\") ||\n            tag(block, \"dc:creator\"),\n        ),\n        image,\n        published: timestamp(\n          tag(block, \"pubDate\") ||\n            tag(block, \"published\") ||\n            tag(block, \"updated\") ||\n            tag(block, \"dc:date\"),\n        ),\n        videoId: tag(block, \"yt:videoId\"),\n      },\n    };\n  });\n  return { title: feedTitle, items };\n}\n\nexport async function fetchRss(url: string): Promise<{ title: string; items: FeedItem[] }> {\n  const res = await safeFetch(\n    {\n      url,\n      headers: {\n        \"User-Agent\": UA,\n        Accept: \"application/rss+xml, application/atom+xml, text/xml, */*\",\n      },\n    },\n    { maxBody: 400_000, timeoutMs: TIMEOUT },\n  );\n  if (!res.ok) throw new Error(`The feed answered ${res.status}.`);\n  return parseFeed(res.body);\n}\n\nconst youtubeIds = new Map<string, string>();\n\n/** \"@handle\", a channel URL or \"UC…\" → the channel id (\"UC…\"). */\nexport async function youtubeChannelId(input: string): Promise<string> {\n  const raw = input.trim();\n  const direct = /(UC[\\w-]{22})/.exec(raw)?.[1];\n  if (direct) return direct;\n  const cached = youtubeIds.get(raw.toLowerCase());\n  if (cached) return cached;\n  const handle =\n    /@([\\w.-]+)/.exec(raw)?.[1] ?? raw.replace(/^https?:\\/\\/(www\\.)?youtube\\.com\\//i, \"\");\n  const html = await getText(`https://www.youtube.com/@${encodeURIComponent(handle)}`);\n  const id =\n    /\"externalId\":\"(UC[\\w-]{22})\"/.exec(html)?.[1] ??\n    /<meta itemprop=\"(?:identifier|channelId)\" content=\"(UC[\\w-]{22})\"/.exec(html)?.[1] ??\n    /channel_id=(UC[\\w-]{22})/.exec(html)?.[1];\n  if (!id) throw new Error(`Could not find the YouTube channel \"${raw}\".`);\n  youtubeIds.set(raw.toLowerCase(), id);\n  return id;\n}\n\nexport async function youtubeVideos(input: string): Promise<FeedItem[]> {\n  const id = await youtubeChannelId(input);\n  const feed = parseFeed(\n    await getText(`https://www.youtube.com/feeds/videos.xml?channel_id=${id}`),\n  );\n  return feed.items.map((item) => {\n    const videoId = item.vars[\"videoId\"] || item.id.replace(/^yt:video:/, \"\");\n    return {\n      id: videoId,\n      vars: {\n        title: item.vars[\"title\"] ?? \"\",\n        url: item.vars[\"url\"] || `https://www.youtube.com/watch?v=${videoId}`,\n        id: videoId,\n        thumbnail: `https://i.ytimg.com/vi/${videoId}/hqdefault.jpg`,\n        author: item.vars[\"author\"] || feed.title,\n        published: item.vars[\"published\"] ?? \"\",\n        isShort: (item.vars[\"url\"] ?? \"\").includes(\"/shorts/\") ? \"yes\" : \"no\",\n        description: item.vars[\"summary\"] ?? \"\",\n      },\n    };\n  });\n}\n\nexport async function blueskyPosts(handle: string): Promise<FeedItem[]> {\n  const actor = handle\n    .trim()\n    .replace(/^@/, \"\")\n    .replace(/^https?:\\/\\/bsky\\.app\\/profile\\//i, \"\")\n    .split(\"/\")[0]!;\n  const body = await getJson<{\n    feed?: {\n      post: {\n        uri: string;\n        author: { handle: string; displayName?: string; avatar?: string };\n        record?: { text?: string; createdAt?: string };\n        embed?: { images?: { fullsize?: string }[]; external?: { thumb?: string } };\n      };\n      reason?: unknown;\n    }[];\n  }>(\n    `https://public.api.bsky.app/xrpc/app.bsky.feed.getAuthorFeed?actor=${encodeURIComponent(actor)}&limit=15&filter=posts_no_replies`,\n  );\n  return (body.feed ?? [])\n    .filter((entry) => !entry.reason)\n    .map(({ post }) => {\n      const rkey = post.uri.split(\"/\").pop() ?? \"\";\n      return {\n        id: post.uri,\n        vars: {\n          text: (post.record?.text ?? \"\").slice(0, 2000),\n          url: `https://bsky.app/profile/${post.author.handle}/post/${rkey}`,\n          author: post.author.displayName || post.author.handle,\n          handle: post.author.handle,\n          avatar: post.author.avatar ?? \"\",\n          image: post.embed?.images?.[0]?.fullsize ?? post.embed?.external?.thumb ?? \"\",\n          published: timestamp(post.record?.createdAt ?? \"\"),\n        },\n      };\n    });\n}\n\nlet twitchToken: { key: string; token: string; until: number } | null = null;\n\nasync function twitchAuth(clientId: string, secret: string): Promise<string> {\n  const key = `${clientId}:${secret}`;\n  if (twitchToken && twitchToken.key === key && Date.now() < twitchToken.until)\n    return twitchToken.token;\n  const res = await fetch(\n    `https://id.twitch.tv/oauth2/token?client_id=${encodeURIComponent(clientId)}&client_secret=${encodeURIComponent(secret)}&grant_type=client_credentials`,\n    { method: \"POST\", signal: AbortSignal.timeout(TIMEOUT) },\n  );\n  if (!res.ok) throw new Error(\"Twitch rejected the Client ID or secret.\");\n  const body = (await res.json()) as { access_token: string; expires_in: number };\n  twitchToken = {\n    key,\n    token: body.access_token,\n    until: Date.now() + (body.expires_in - 300) * 1000,\n  };\n  return body.access_token;\n}\n\n/** Live streams of these logins (offline ones are simply missing). */\nexport async function twitchStreams(\n  logins: string[],\n  clientId: string,\n  secret: string,\n): Promise<FeedItem[]> {\n  const names = [\n    ...new Set(\n      logins\n        .map(\n          (l) =>\n            l\n              .trim()\n              .toLowerCase()\n              .replace(/^https?:\\/\\/(www\\.)?twitch\\.tv\\//, \"\")\n              .replace(/^@/, \"\")\n              .split(/[/?]/)[0]!,\n        )\n        .filter(Boolean),\n    ),\n  ].slice(0, 100);\n  if (names.length === 0) return [];\n  const token = await twitchAuth(clientId, secret);\n  const headers = { \"Client-Id\": clientId, Authorization: `Bearer ${token}` };\n  const query = names.map((n) => `user_login=${encodeURIComponent(n)}`).join(\"&\");\n  const streams = await getJson<{\n    data?: {\n      id: string;\n      user_login: string;\n      user_name: string;\n      title: string;\n      game_name: string;\n      viewer_count: number;\n      thumbnail_url: string;\n    }[];\n  }>(`https://api.twitch.tv/helix/streams?${query}`, { headers });\n  const live = streams.data ?? [];\n  if (live.length === 0) return [];\n  const users = await getJson<{ data?: { login: string; profile_image_url: string }[] }>(\n    `https://api.twitch.tv/helix/users?${live.map((s) => `login=${encodeURIComponent(s.user_login)}`).join(\"&\")}`,\n    { headers },\n  ).catch(() => ({ data: [] }));\n  const avatars = new Map((users.data ?? []).map((u) => [u.login, u.profile_image_url]));\n  return live.map((s) => ({\n    id: s.id,\n    vars: {\n      user: s.user_name,\n      login: s.user_login,\n      title: s.title,\n      game: s.game_name || \"Just Chatting\",\n      viewers: String(s.viewer_count),\n      url: `https://www.twitch.tv/${s.user_login}`,\n      thumbnail: `${s.thumbnail_url.replace(\"{width}\", \"1280\").replace(\"{height}\", \"720\")}?t=${Date.now()}`,\n      avatar: avatars.get(s.user_login) ?? \"\",\n    },\n  }));\n}\n","runtime/src/postgres-sql.test.ts":"import test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport {\n  aggregateRecordsSql,\n  createTableSql,\n  filterConditions,\n  queryRecordsSql,\n  takeRecordSql,\n  highestPlaceholder,\n  parseConnectionString,\n  quoteIdent,\n  quoteTable,\n  rowVariables,\n  scrubPgError,\n  sqlParams,\n  storageSql,\n} from \"./postgres-sql.js\";\nimport { isPrivateAddress } from \"./safe-fetch.js\";\n\ntest(\"identifiers: only letters, numbers and _ are accepted, always quoted\", () => {\n  assert.equal(quoteIdent(\"warnings\"), '\"warnings\"');\n  assert.equal(quoteIdent(\"_User2\"), '\"_User2\"');\n  assert.equal(quoteTable(\"public.warnings\"), '\"public\".\"warnings\"');\n  for (const bad of ['a\"b', \"a b\", \"1abc\", \"\", \"drop;--\", \"a-b\", \"x\".repeat(64), \"a.b.c\", \"users)\"]) {\n    assert.throws(() => quoteTable(bad), Error, JSON.stringify(bad));\n  }\n});\n\ntest(\"storage ops become parameterised SQL with values never in the text\", () => {\n  const evil = \"'; DROP TABLE users; --\";\n  assert.deepEqual(storageSql(\"save\", \"warnings\", { data: { user: \"1\", reason: evil } }), {\n    text: 'INSERT INTO \"warnings\" (\"user\", \"reason\") VALUES ($1, $2)',\n    values: [\"1\", evil],\n  });\n  assert.deepEqual(storageSql(\"find\", \"warnings\", { where: { field: \"user\", value: evil }, newestFirst: true }), {\n    text: 'SELECT * FROM \"warnings\" WHERE \"user\" = $1 ORDER BY \"created_at\" DESC LIMIT 1',\n    values: [evil],\n  });\n  assert.deepEqual(storageSql(\"update\", \"warnings\", { where: { field: \"user\", value: \"1\" }, data: { status: \"done\" } }), {\n    text: 'UPDATE \"warnings\" SET \"status\" = $1 WHERE \"user\" = $2',\n    values: [\"done\", \"1\"],\n  });\n  assert.deepEqual(storageSql(\"delete\", \"warnings\", { where: { field: \"user\", value: \"1\" } }).text, 'DELETE FROM \"warnings\" WHERE \"user\" = $1');\n  assert.equal(storageSql(\"count\", \"warnings\", {}).text, 'SELECT count(*)::bigint AS n FROM \"warnings\"');\n  assert.throws(() => storageSql(\"delete\", \"warnings\", {}));\n  assert.throws(() => storageSql(\"save\", \"warnings\", { data: { 'a\"': \"x\" } }));\n  assert.equal(\n    createTableSql(\"warnings\", [\"user\"]),\n    'CREATE TABLE IF NOT EXISTS \"warnings\" (\"id\" bigserial PRIMARY KEY, \"created_at\" timestamptz NOT NULL DEFAULT now(), \"user\" text)',\n  );\n});\n\ntest(\"SQL Query parameters: one line per $n, exactly as many as used\", () => {\n  assert.equal(highestPlaceholder(\"SELECT $1, $2, $10\"), 10);\n  assert.equal(highestPlaceholder(\"SELECT 1\"), 0);\n  assert.deepEqual(sqlParams(\"SELECT * FROM t WHERE a = $1 AND b = $2\", [\"x\", \"y\", \"unused\"]), [\"x\", \"y\"]);\n  assert.deepEqual(sqlParams(\"SELECT 1\", [\"\"]), []);\n  assert.throws(() => sqlParams(\"SELECT $3\", [\"a\"]), /\\$3/);\n  assert.throws(() => sqlParams(\"SELECT $21\", Array(21).fill(\"a\")));\n});\n\ntest(\"query results become {key.count}, {key.N.column}, {key.column} and JSON\", () => {\n  const when = new Date(\"2026-10-31T12:00:00Z\");\n  const vars = rowVariables(\"sql\", [{ id: 1, name: \"Ann\", at: when, tags: [\"a\"], gone: null }, { id: 2, name: \"Bob\" }], null);\n  assert.equal(vars[\"sql.count\"], \"2\");\n  assert.equal(vars[\"sql.affected\"], \"2\");\n  assert.equal(vars[\"sql.0.name\"], \"Ann\");\n  assert.equal(vars[\"sql.1.id\"], \"2\");\n  assert.equal(vars[\"sql.name\"], \"Ann\");\n  assert.equal(vars[\"sql.0.at\"], \"2026-10-31T12:00:00.000Z\");\n  assert.equal(vars[\"sql.0.tags\"], '[\"a\"]');\n  assert.equal(vars[\"sql.0.gone\"], \"\");\n  assert.equal(JSON.parse(vars[\"sql\"]!).length, 2);\n  assert.equal(rowVariables(\"sql\", [], 5)[\"sql.affected\"], \"5\");\n});\n\ntest(\"connection strings: one TCP host, TLS by default, no socket or extra options\", () => {\n  const t = parseConnectionString(\"postgres://bot:p%40ss@db.example.com:6543/app\");\n  assert.deepEqual(t, { host: \"db.example.com\", port: 6543, database: \"app\", user: \"bot\", password: \"p@ss\", ssl: \"require\" });\n  assert.equal(parseConnectionString(\"postgresql://u:p@h/db?sslmode=disable\").ssl, \"disable\");\n  assert.equal(parseConnectionString(\"postgresql://u:p@h/db?sslmode=verify-full\").ssl, \"verify-full\");\n  assert.equal(parseConnectionString(\"postgresql://u:p@[2001:db8::1]/db\").host, \"2001:db8::1\");\n  assert.throws(() => parseConnectionString(\"\"));\n  assert.throws(() => parseConnectionString(\"mysql://u:p@h/db\"));\n  assert.throws(() => parseConnectionString(\"postgres://u:p@h/db?host=/var/run/postgresql\"));\n  assert.throws(() => parseConnectionString(\"postgres://u:p@h/db?options=-c%20x\"));\n});\n\ntest(\"private, loopback, link-local and metadata addresses are refused\", () => {\n  for (const ip of [\"127.0.0.1\", \"10.1.2.3\", \"172.16.0.1\", \"192.168.0.10\", \"169.254.169.254\", \"100.64.0.1\", \"0.0.0.0\", \"::1\", \"fe80::1\", \"fd00::1\", \"::ffff:10.0.0.1\"]) {\n    assert.equal(isPrivateAddress(ip), true, ip);\n  }\n  for (const ip of [\"8.8.8.8\", \"34.120.1.1\", \"2606:4700::1111\"]) assert.equal(isPrivateAddress(ip), false, ip);\n});\n\ntest(\"errors never carry the connection string or password\", () => {\n  const conn = \"postgres://bot:secret@db.example.com/app\";\n  assert.equal(scrubPgError(`could not connect to ${conn}`, conn), \"could not connect to [connection string]\");\n  assert.equal(scrubPgError(\"bad postgresql://x:y@z/db and password=hunter2\"), \"bad [connection string] and password=[redacted]\");\n});\n\ntest(\"Find Many Records: filters become $n parameters, numbers compare as numbers\", () => {\n  const evil = \"'; DROP TABLE orders; --\";\n  const s = queryRecordsSql(\"orders\", {\n    filters: [\n      { field: \"user\", op: \"=\", value: evil },\n      { field: \"price\", op: \">=\", value: \"5\" },\n      { field: \"name\", op: \"contains\", value: \"vip\" },\n      { field: \"paid_at\", op: \"<\", value: \"2026-01-01\" },\n    ],\n    sort: { field: \"price\", asc: false },\n    limit: 500,\n    offset: -1,\n  });\n  assert.ok(!s.text.includes(\"DROP\"));\n  assert.ok(s.text.startsWith(`SELECT * FROM \"orders\" WHERE coalesce(\"user\"::text, '') = $1 AND (CASE WHEN`));\n  assert.ok(s.text.includes(`END) >= $2::numeric ELSE coalesce(\"price\"::text, '') COLLATE \"C\" >= $3 END)`));\n  assert.ok(s.text.includes(`strpos(lower(coalesce(\"name\"::text, '')), lower($4)) > 0`));\n  assert.ok(s.text.includes(`\"paid_at\" < $5`));\n  assert.ok(s.text.includes(` DESC NULLS LAST, \"price\" DESC NULLS LAST LIMIT $6 OFFSET $7`));\n  assert.deepEqual(s.values, [evil, \"5\", \"5\", \"vip\", \"2026-01-01\", \"100\", \"0\"]);\n  assert.equal(queryRecordsSql(\"t\", { filters: [], sort: { field: \"\", asc: false }, limit: 25, offset: 0 }).text, `SELECT * FROM \"t\" ORDER BY \"created_at\" DESC LIMIT $1 OFFSET $2`);\n  assert.equal(queryRecordsSql(\"t\", { filters: [], sort: null, limit: 25, offset: 0 }).text, `SELECT * FROM \"t\" LIMIT $1 OFFSET $2`);\n  assert.throws(() => filterConditions([{ field: 'a\"b', op: \"=\", value: \"1\" }], () => \"$1\"));\n});\n\ntest(\"Take One Item: one UPDATE with FOR UPDATE SKIP LOCKED\", () => {\n  const s = takeRecordSql(\"stock\", {\n    filters: [{ field: \"sold\", op: \"!=\", value: \"yes\" }],\n    sort: { field: \"\", asc: true },\n    marks: { sold: \"yes\", buyer: \"42\" },\n  });\n  assert.equal(\n    s.text,\n    `UPDATE \"stock\" SET \"sold\" = $1, \"buyer\" = $2 WHERE ctid = (SELECT ctid FROM \"stock\" WHERE coalesce(\"sold\"::text, '') <> $3 ORDER BY \"created_at\" ASC LIMIT 1 FOR UPDATE SKIP LOCKED) RETURNING *`,\n  );\n  assert.deepEqual(s.values, [\"yes\", \"42\", \"yes\"]);\n  assert.throws(() => takeRecordSql(\"stock\", { filters: [], sort: null, marks: {} }));\n});\n\ntest(\"Sum / Average Records: plain and grouped\", () => {\n  const plain = aggregateRecordsSql(\"orders\", { filters: [], op: \"sum\", field: \"price\", groupBy: \"\", top: 10 });\n  assert.ok(plain.text.startsWith(`SELECT sum((CASE WHEN \"price\"::text ~`));\n  assert.ok(plain.text.endsWith(`END)) AS \"value\" FROM \"orders\"`));\n  const grouped = aggregateRecordsSql(\"orders\", { filters: [{ field: \"status\", op: \"=\", value: \"paid\" }], op: \"count\", field: \"\", groupBy: \"product\", top: 99 });\n  assert.equal(\n    grouped.text,\n    `SELECT coalesce(\"product\"::text, '') AS \"key\", count(*) AS \"value\" FROM \"orders\" WHERE coalesce(\"status\"::text, '') = $1 GROUP BY 1 ORDER BY 2 DESC NULLS LAST, 1 ASC LIMIT $2`,\n  );\n  assert.deepEqual(grouped.values, [\"paid\", \"25\"]);\n  assert.throws(() => aggregateRecordsSql(\"orders\", { filters: [], op: \"sum\", field: \"\", groupBy: \"\", top: 10 }));\n});\n","runtime/src/postgres-sql.ts":"/**\n * Pure helpers for the owner's own PostgreSQL (\"Your PostgreSQL\" on the\n * storage blocks, and the SQL Query block). No I/O here, so it is unit tested\n * without a database; the connection itself lives in postgres.ts.\n *\n * Safety rules:\n *  - table and column names are never taken as SQL: they must match\n *    [A-Za-z_][A-Za-z0-9_]* (optionally \"schema.table\") and are always quoted;\n *  - every value travels as a $n parameter, never inside the SQL text;\n *  - the connection string is parsed here so the host can be checked against\n *    private ranges before anything connects (see postgres.ts).\n */\n\nconst IDENT = /^[A-Za-z_][A-Za-z0-9_]{0,62}$/;\n\n/** `\"name\"` for a safe identifier, or throws. Names are case-sensitive once quoted. */\nexport function quoteIdent(name: string): string {\n  if (!IDENT.test(name)) {\n    throw new Error(`\"${name.slice(0, 40)}\" is not a valid name: use letters, numbers and _ (not starting with a number).`);\n  }\n  return `\"${name}\"`;\n}\n\n/** A table, optionally \"schema.table\", quoted part by part. */\nexport function quoteTable(name: string): string {\n  const parts = name.split(\".\");\n  if (parts.length > 2) throw new Error(`\"${name.slice(0, 40)}\" is not a valid table name.`);\n  return parts.map(quoteIdent).join(\".\");\n}\n\nexport type StorageSqlOp = \"save\" | \"find\" | \"update\" | \"delete\" | \"count\";\n\nexport interface SqlStatement {\n  text: string;\n  values: string[];\n}\n\n/**\n * The SQL for one storage block. Fields become columns (sent as text; Postgres\n * converts them to the column's type), `where` is `column = $n`.\n */\nexport function storageSql(\n  op: StorageSqlOp,\n  table: string,\n  options: { where?: { field: string; value: string }; data?: Record<string, string>; newestFirst?: boolean },\n): SqlStatement {\n  const t = quoteTable(table);\n  const values: string[] = [];\n  const param = (value: string) => {\n    values.push(value);\n    return `$${values.length}`;\n  };\n  const data = Object.entries(options.data ?? {});\n  const where = () => (options.where ? ` WHERE ${quoteIdent(options.where.field)} = ${param(options.where.value)}` : \"\");\n  switch (op) {\n    case \"save\": {\n      if (!data.length) throw new Error(\"Save Record needs at least one field.\");\n      const cols = data.map(([k]) => quoteIdent(k)).join(\", \");\n      const vals = data.map(([, v]) => param(v)).join(\", \");\n      return { text: `INSERT INTO ${t} (${cols}) VALUES (${vals})`, values };\n    }\n    case \"find\": {\n      if (!options.where) throw new Error(\"Find Record needs a field.\");\n      const text = `SELECT * FROM ${t}${where()}${options.newestFirst ? ` ORDER BY \"created_at\" DESC` : \"\"} LIMIT 1`;\n      return { text, values };\n    }\n    case \"update\": {\n      if (!options.where) throw new Error(\"Update Records needs a where field.\");\n      if (!data.length) throw new Error(\"Update Records needs at least one field to set.\");\n      const set = data.map(([k, v]) => `${quoteIdent(k)} = ${param(v)}`).join(\", \");\n      return { text: `UPDATE ${t} SET ${set}${where()}`, values };\n    }\n    case \"delete\": {\n      if (!options.where) throw new Error(\"Delete Records needs a where field.\");\n      return { text: `DELETE FROM ${t}${where()}`, values };\n    }\n    case \"count\":\n      return { text: `SELECT count(*)::bigint AS n FROM ${t}${where()}`, values };\n  }\n}\n\n/* -------- Find Many Records / Take One Item / Sum-Average Records -------- */\n\n/** Same number rule as Bottly storage (bot_storage_num) and the Live Preview. */\nconst NUMBER_RE = \"'^\\\\s*-?[0-9]+(\\\\.[0-9]+)?\\\\s*$'\";\nconst LOOKS_NUMERIC = /^\\s*-?[0-9]+(\\.[0-9]+)?\\s*$/;\n\n/** A column as a number when its text is one, else NULL (works for any column type). */\nfunction numericOf(column: string): string {\n  return `(CASE WHEN ${column}::text ~ ${NUMBER_RE} THEN trim(${column}::text)::numeric END)`;\n}\n\nexport interface SqlFilter {\n  field: string;\n  op: \"=\" | \"!=\" | \">\" | \"<\" | \">=\" | \"<=\" | \"contains\";\n  value: string;\n}\n\n/**\n * WHERE conditions for filter lines. =, != and contains compare the column\n * as text (a missing value counts as \"\"); > < >= <= compare as numbers when\n * both sides are numbers, as text when only the value is, and in the\n * column's own type (dates, text) when the value is not a number.\n */\nexport function filterConditions(filters: SqlFilter[], param: (value: string) => string): string[] {\n  return filters.map((filter) => {\n    const c = quoteIdent(filter.field);\n    const text = `coalesce(${c}::text, '')`;\n    switch (filter.op) {\n      case \"=\":\n        return `${text} = ${param(filter.value)}`;\n      case \"!=\":\n        return `${text} <> ${param(filter.value)}`;\n      case \"contains\":\n        return `strpos(lower(${text}), lower(${param(filter.value)})) > 0`;\n      case \">\":\n      case \"<\":\n      case \">=\":\n      case \"<=\":\n        // Like Bottly storage: number against number, otherwise as text.\n        return LOOKS_NUMERIC.test(filter.value)\n          ? `(CASE WHEN ${numericOf(c)} IS NOT NULL THEN ${numericOf(c)} ${filter.op} ${param(filter.value.trim())}::numeric ELSE ${text} COLLATE \"C\" ${filter.op} ${param(filter.value)} END)`\n          : `${c} ${filter.op} ${param(filter.value)}`;\n      default:\n        throw new Error(`\"${String((filter as { op: unknown }).op).slice(0, 20)}\" is not a filter operator.`);\n    }\n  });\n}\n\n/** ORDER BY: a field (numbers by value first, then the rest), or created_at; null = no order. */\nfunction orderSql(sort: { field: string; asc: boolean } | null): string {\n  if (!sort) return \"\";\n  const dir = sort.asc ? \"ASC\" : \"DESC\";\n  if (!sort.field) return ` ORDER BY \"created_at\" ${dir}`;\n  const c = quoteIdent(sort.field);\n  return ` ORDER BY ${numericOf(c)} ${dir} NULLS LAST, ${c} ${dir} NULLS LAST`;\n}\n\nfunction builder() {\n  const values: string[] = [];\n  const param = (value: string) => {\n    values.push(value);\n    return `$${values.length}`;\n  };\n  return { values, param };\n}\n\nfunction whereSql(conditions: string[]): string {\n  return conditions.length ? ` WHERE ${conditions.join(\" AND \")}` : \"\";\n}\n\n/** Find Many Records: SELECT * … WHERE filters ORDER BY … LIMIT/OFFSET. `sort: null` leaves the order out. */\nexport function queryRecordsSql(\n  table: string,\n  options: { filters: SqlFilter[]; sort: { field: string; asc: boolean } | null; limit: number; offset: number },\n): SqlStatement {\n  const { values, param } = builder();\n  const t = quoteTable(table);\n  const where = whereSql(filterConditions(options.filters, param));\n  const limit = Math.min(100, Math.max(1, Math.round(options.limit) || 25));\n  const offset = Math.min(10_000, Math.max(0, Math.round(options.offset) || 0));\n  return { text: `SELECT * FROM ${t}${where}${orderSql(options.sort)} LIMIT ${param(String(limit))} OFFSET ${param(String(offset))}`, values };\n}\n\n/**\n * Take One Item: one UPDATE that locks the first matching row with\n * FOR UPDATE SKIP LOCKED and sets the mark columns, so two runs never get\n * the same row. Rows are addressed by ctid, so the table needs no id column.\n */\nexport function takeRecordSql(\n  table: string,\n  options: { filters: SqlFilter[]; sort: { field: string; asc: boolean } | null; marks: Record<string, string> },\n): SqlStatement {\n  const marks = Object.entries(options.marks);\n  if (!marks.length) throw new Error(\"Take One Item needs at least one mark line (e.g. sold = yes).\");\n  const { values, param } = builder();\n  const t = quoteTable(table);\n  const set = marks.map(([k, v]) => `${quoteIdent(k)} = ${param(v)}`).join(\", \");\n  const where = whereSql(filterConditions(options.filters, param));\n  return {\n    text: `UPDATE ${t} SET ${set} WHERE ctid = (SELECT ctid FROM ${t}${where}${orderSql(options.sort)} LIMIT 1 FOR UPDATE SKIP LOCKED) RETURNING *`,\n    values,\n  };\n}\n\n/** Sum / Average Records: one row (\"value\"), or \"key\" + \"value\" per group, highest first. */\nexport function aggregateRecordsSql(\n  table: string,\n  options: { filters: SqlFilter[]; op: \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\"; field: string; groupBy: string; top: number },\n): SqlStatement {\n  const { values, param } = builder();\n  const t = quoteTable(table);\n  if (![\"count\", \"sum\", \"avg\", \"min\", \"max\"].includes(options.op)) throw new Error(\"Pick count, sum, avg, min or max.\");\n  if (options.op !== \"count\" && !options.field) throw new Error(`${options.op} needs a field.`);\n  const agg = options.op === \"count\" ? \"count(*)\" : `${options.op}(${numericOf(quoteIdent(options.field))})`;\n  const where = whereSql(filterConditions(options.filters, param));\n  if (!options.groupBy) return { text: `SELECT ${agg} AS \"value\" FROM ${t}${where}`, values };\n  const g = quoteIdent(options.groupBy);\n  const top = Math.min(25, Math.max(1, Math.round(options.top) || 10));\n  return {\n    text: `SELECT coalesce(${g}::text, '') AS \"key\", ${agg} AS \"value\" FROM ${t}${where} GROUP BY 1 ORDER BY 2 DESC NULLS LAST, 1 ASC LIMIT ${param(String(top))}`,\n    values,\n  };\n}\n\n/** Table Save Record creates when it is missing: id, created_at, then text columns. */\nexport function createTableSql(table: string, columns: string[]): string {\n  const cols = columns.map((c) => `, ${quoteIdent(c)} text`).join(\"\");\n  return `CREATE TABLE IF NOT EXISTS ${quoteTable(table)} (\"id\" bigserial PRIMARY KEY, \"created_at\" timestamptz NOT NULL DEFAULT now()${cols})`;\n}\n\n/** Adds a missing column as text. */\nexport function addColumnSql(table: string, column: string): string {\n  return `ALTER TABLE ${quoteTable(table)} ADD COLUMN IF NOT EXISTS ${quoteIdent(column)} text`;\n}\n\n/** Highest $n in a query (0 when it has none). */\nexport function highestPlaceholder(query: string): number {\n  let max = 0;\n  for (const m of query.matchAll(/\\$(\\d{1,3})(?!\\d)/g)) max = Math.max(max, Number(m[1]));\n  return max;\n}\n\nexport const MAX_SQL_PARAMS = 20;\n\n/**\n * Parameter values for the SQL Query block: one per line (already\n * interpolated by the caller), exactly as many as the query uses.\n */\nexport function sqlParams(query: string, lines: string[]): string[] {\n  const needed = highestPlaceholder(query);\n  if (needed > MAX_SQL_PARAMS) throw new Error(`A query can use at most ${MAX_SQL_PARAMS} parameters ($1-$${MAX_SQL_PARAMS}).`);\n  if (lines.length < needed) {\n    throw new Error(`The query uses $${needed} but only ${lines.length} parameter line${lines.length === 1 ? \"\" : \"s\"} ${lines.length === 1 ? \"is\" : \"are\"} set.`);\n  }\n  return lines.slice(0, needed);\n}\n\n/** A database value as flow text (dates as ISO, JSON/arrays as JSON, null as \"\"). */\nexport function sqlText(value: unknown): string {\n  if (value === null || value === undefined) return \"\";\n  if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"\" : value.toISOString();\n  if (Buffer.isBuffer(value)) return value.toString(\"base64\");\n  if (typeof value === \"object\") return JSON.stringify(value);\n  return String(value);\n}\n\n/** Rows kept as variables and in the JSON. */\nexport const MAX_SQL_ROWS = 100;\nconst MAX_JSON = 20_000;\n\n/**\n * Flow variables for a query result under `key`: {key} and {key.rows} (JSON),\n * {key.count}, {key.affected}, {key.N.column} per row and {key.column} for\n * the first row.\n */\nexport function rowVariables(key: string, rows: Record<string, unknown>[], affected: number | null): Record<string, string> {\n  const kept = rows.slice(0, MAX_SQL_ROWS).map((row) => Object.fromEntries(Object.entries(row).map(([k, v]) => [k, sqlText(v)])));\n  const out: Record<string, string> = {};\n  const json = JSON.stringify(kept);\n  out[key] = json.length > MAX_JSON ? json.slice(0, MAX_JSON) : json;\n  out[`${key}.rows`] = out[key];\n  out[`${key}.count`] = String(rows.length);\n  out[`${key}.affected`] = String(affected ?? rows.length);\n  kept.forEach((row, i) => {\n    for (const [k, v] of Object.entries(row)) {\n      out[`${key}.${i}.${k}`] = v;\n      if (i === 0) out[`${key}.${k}`] = v;\n    }\n  });\n  return out;\n}\n\nexport interface PgTarget {\n  host: string;\n  port: number;\n  database: string;\n  user: string;\n  password: string;\n  /** \"disable\" | \"require\" (encrypted, certificate not checked) | \"verify-full\". */\n  ssl: \"disable\" | \"require\" | \"verify-full\";\n}\n\n/**\n * Parses postgres://user:pass@host:port/db?sslmode=… . Unix sockets, several\n * hosts and other connection options are refused, so nothing can point the\n * client somewhere the host check did not see.\n */\nexport function parseConnectionString(raw: string): PgTarget {\n  const value = raw.trim();\n  if (!value) throw new Error(\"No connection string: set one (usually {env.DATABASE_URL}).\");\n  let url: URL;\n  try {\n    url = new URL(value);\n  } catch {\n    throw new Error(\"The connection string is not a postgres:// URL.\");\n  }\n  if (url.protocol !== \"postgres:\" && url.protocol !== \"postgresql:\") {\n    throw new Error(\"The connection string must start with postgres:// or postgresql://.\");\n  }\n  const host = url.hostname.replace(/^\\[|\\]$/g, \"\");\n  if (!host || host.includes(\",\")) throw new Error(\"The connection string needs one database host.\");\n  const port = url.port ? Number(url.port) : 5432;\n  if (!Number.isInteger(port) || port < 1 || port > 65535) throw new Error(\"The connection string has an invalid port.\");\n  for (const key of url.searchParams.keys()) {\n    if (![\"sslmode\", \"ssl\", \"connect_timeout\", \"application_name\", \"pgbouncer\", \"uselibpqcompat\"].includes(key)) {\n      throw new Error(`The connection option \"${key.slice(0, 30)}\" is not supported.`);\n    }\n  }\n  const mode = (url.searchParams.get(\"sslmode\") ?? (url.searchParams.get(\"ssl\") === \"false\" ? \"disable\" : \"require\")).toLowerCase();\n  const ssl = mode === \"disable\" || mode === \"allow\" ? \"disable\" : mode === \"verify-full\" || mode === \"verify-ca\" ? \"verify-full\" : \"require\";\n  const database = decodeURIComponent(url.pathname.replace(/^\\//, \"\")) || \"postgres\";\n  if (database.includes(\"/\")) throw new Error(\"The connection string has an invalid database name.\");\n  return {\n    host,\n    port,\n    database,\n    user: decodeURIComponent(url.username),\n    password: decodeURIComponent(url.password),\n    ssl,\n  };\n}\n\n/** Removes passwords and connection strings from an error text. */\nexport function scrubPgError(message: string, connection?: string): string {\n  let out = message;\n  if (connection) out = out.split(connection).join(\"[connection string]\");\n  return out\n    .replace(/postgres(?:ql)?:\\/\\/[^\\s\"']+/gi, \"[connection string]\")\n    .replace(/password=[^\\s&\"']+/gi, \"password=[redacted]\")\n    .replace(/\\s+/g, \" \")\n    .trim()\n    .slice(0, 300);\n}\n","runtime/src/postgres.ts":"/**\n * The bot owner's own PostgreSQL: small pools per connection string, TLS,\n * short timeouts, and the same public-address rule as safe-fetch.ts (the host\n * is resolved once per pool and must not be private, loopback, link-local or\n * a metadata address; the pool then connects to that exact address so DNS\n * cannot be switched to a private one afterwards).\n */\nimport { lookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\nimport pg from \"pg\";\nimport { isPrivateAddress } from \"./safe-fetch.js\";\nimport {\n  addColumnSql,\n  aggregateRecordsSql,\n  createTableSql,\n  queryRecordsSql,\n  takeRecordSql,\n  type SqlFilter,\n  parseConnectionString,\n  scrubPgError,\n  sqlText,\n  storageSql,\n  type StorageSqlOp,\n} from \"./postgres-sql.js\";\n\nconst MAX_POOLS = 100;\n/** Re-resolve the host (new pool) after this long. */\nconst POOL_TTL_MS = 10 * 60_000;\n\ninterface Entry {\n  pool: pg.Pool;\n  created: number;\n  used: number;\n}\n\nconst pools = new Map<string, Entry>();\n\nasync function resolvePublic(host: string): Promise<string> {\n  const addresses = isIP(host) ? [host] : (await lookup(host, { all: true })).map((a) => a.address);\n  if (!addresses.length || addresses.some(isPrivateAddress)) {\n    throw new Error(\"This database address is private or local, so bots cannot reach it. Use the database's public address.\");\n  }\n  return addresses[0]!;\n}\n\nasync function poolFor(connection: string): Promise<pg.Pool> {\n  const now = Date.now();\n  const cached = pools.get(connection);\n  if (cached && now - cached.created < POOL_TTL_MS) {\n    cached.used = now;\n    return cached.pool;\n  }\n  if (cached) {\n    pools.delete(connection);\n    void cached.pool.end().catch(() => undefined);\n  }\n  const target = parseConnectionString(connection);\n  const address = await resolvePublic(target.host);\n  const pool = new pg.Pool({\n    host: address,\n    port: target.port,\n    database: target.database,\n    user: target.user,\n    password: target.password,\n    ssl:\n      target.ssl === \"disable\"\n        ? false\n        : {\n            rejectUnauthorized: target.ssl === \"verify-full\",\n            ...(isIP(target.host) ? {} : { servername: target.host }),\n          },\n    max: 3,\n    idleTimeoutMillis: 30_000,\n    connectionTimeoutMillis: 5_000,\n    statement_timeout: 10_000,\n    query_timeout: 12_000,\n    application_name: \"bottly-bot\",\n  });\n  // An idle client losing its connection must not crash the process.\n  pool.on(\"error\", () => undefined);\n  if (pools.size >= MAX_POOLS) {\n    const oldest = [...pools.entries()].sort((a, b) => a[1].used - b[1].used)[0];\n    if (oldest) {\n      pools.delete(oldest[0]);\n      void oldest[1].pool.end().catch(() => undefined);\n    }\n  }\n  pools.set(connection, { pool, created: now, used: now });\n  return pool;\n}\n\nexport interface PgResult {\n  rows: Record<string, unknown>[];\n  rowCount: number | null;\n}\n\n/** One statement with $n parameters (extended protocol: never several statements). */\nexport async function pgQuery(connection: string, text: string, values: string[]): Promise<PgResult> {\n  const pool = await poolFor(connection);\n  try {\n    const res = await pool.query({ text, values, queryMode: \"extended\" } as pg.QueryConfig<string[]>);\n    return { rows: res.rows as Record<string, unknown>[], rowCount: res.rowCount };\n  } catch (error) {\n    throw new PgError(error, connection);\n  }\n}\n\nexport class PgError extends Error {\n  readonly code: string | undefined;\n  constructor(error: unknown, connection: string) {\n    const raw = error instanceof Error ? error.message : String(error);\n    super(scrubPgError(raw || \"The database refused the query.\", connection));\n    const code = (error as { code?: unknown } | null)?.code;\n    this.code = typeof code === \"string\" ? code : undefined;\n  }\n}\n\n/** Rows as flow text, like Bottly storage records. */\nfunction textRows(rows: Record<string, unknown>[]): Record<string, string>[] {\n  return rows.map((row) => Object.fromEntries(Object.entries(row).map(([k, v]) => [k, sqlText(v)])));\n}\n\n/** Same answers as the control plane's Bottly storage (ok/rows/count/error). */\nexport async function pgStorage(\n  connection: string,\n  op: StorageSqlOp,\n  table: string,\n  options: { where?: { field: string; value: string }; data?: Record<string, string> },\n): Promise<{ ok: boolean; rows?: Record<string, unknown>[]; count?: number; error?: string }> {\n  try {\n    if (op === \"find\") {\n      try {\n        const newest = storageSql(\"find\", table, { ...options, newestFirst: true });\n        return { ok: true, rows: textRows((await pgQuery(connection, newest.text, newest.values)).rows) };\n      } catch (error) {\n        // Tables made outside Bottly may have no created_at column.\n        if (!(error instanceof PgError) || error.code !== \"42703\") throw error;\n        const plain = storageSql(\"find\", table, options);\n        return { ok: true, rows: textRows((await pgQuery(connection, plain.text, plain.values)).rows) };\n      }\n    }\n    const statement = storageSql(op, table, options);\n    const run = () => pgQuery(connection, statement.text, statement.values);\n    let res: PgResult;\n    try {\n      res = await run();\n    } catch (error) {\n      if (!(error instanceof PgError) || (op !== \"save\" && op !== \"update\")) throw error;\n      const columns = Object.keys(options.data ?? {});\n      if (error.code === \"42P01\" && op === \"save\") {\n        // Save Record creates a missing table: id, created_at, then text columns.\n        await pgQuery(connection, createTableSql(table, columns), []);\n      } else if (error.code === \"42703\") {\n        for (const column of columns) await pgQuery(connection, addColumnSql(table, column), []);\n      } else {\n        throw error;\n      }\n      res = await run();\n    }\n    if (op === \"count\") return { ok: true, count: Number(res.rows[0]?.[\"n\"] ?? 0) };\n    return { ok: true, count: res.rowCount ?? 0 };\n  } catch (error) {\n    return { ok: false, error: error instanceof Error ? scrubPgError(error.message, connection) : \"The database refused the query.\" };\n  }\n}\n\nexport interface PgRecordsOptions {\n  filters: SqlFilter[];\n  sort: { field: string; asc: boolean };\n  limit?: number;\n  offset?: number;\n  marks?: Record<string, string>;\n  aggregate?: { op: \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\"; field: string; groupBy: string; top: number };\n}\n\n/**\n * Find Many Records / Take One Item / Sum-Average Records on the owner's\n * PostgreSQL, answering like Bottly storage: rows for query/take, groups for\n * aggregate. Without a sort field the order is created_at; tables without\n * that column are read unordered. Take adds missing mark columns as text\n * (like Update Records) and tries once more.\n */\nexport async function pgRecords(\n  connection: string,\n  op: \"query\" | \"take\" | \"aggregate\",\n  table: string,\n  options: PgRecordsOptions,\n): Promise<{ ok: boolean; rows?: Record<string, string>[]; groups?: { key: string; value: number | null }[]; error?: string }> {\n  const statement = (sort: { field: string; asc: boolean } | null) => {\n    if (op === \"query\") return queryRecordsSql(table, { filters: options.filters, sort, limit: options.limit ?? 25, offset: options.offset ?? 0 });\n    if (op === \"take\") return takeRecordSql(table, { filters: options.filters, sort, marks: options.marks ?? {} });\n    return aggregateRecordsSql(table, { filters: options.filters, ...(options.aggregate ?? { op: \"count\", field: \"\", groupBy: \"\", top: 10 }) });\n  };\n  const run = (sort: { field: string; asc: boolean } | null) => {\n    const s = statement(sort);\n    return pgQuery(connection, s.text, s.values);\n  };\n  try {\n    let res: PgResult;\n    const sort = op === \"aggregate\" ? null : options.sort;\n    try {\n      res = await run(sort);\n    } catch (error) {\n      if (!(error instanceof PgError) || error.code !== \"42703\") throw error;\n      if (op === \"take\") {\n        for (const column of Object.keys(options.marks ?? {})) await pgQuery(connection, addColumnSql(table, column), []);\n      }\n      try {\n        res = await run(sort);\n      } catch (again) {\n        // A table made outside Bottly may have no created_at column.\n        if (!(again instanceof PgError) || again.code !== \"42703\" || !sort || sort.field) throw again;\n        res = await run(null);\n      }\n    }\n    if (op === \"aggregate\") {\n      return {\n        ok: true,\n        groups: res.rows.map((row) => {\n          const raw = row[\"value\"];\n          const value = raw === null || raw === undefined ? null : Number(raw);\n          return { key: sqlText(row[\"key\"]), value: value !== null && Number.isFinite(value) ? value : null };\n        }),\n      };\n    }\n    return { ok: true, rows: textRows(res.rows) };\n  } catch (error) {\n    return { ok: false, error: error instanceof Error ? scrubPgError(error.message, connection) : \"The database refused the query.\" };\n  }\n}\n","runtime/src/redact.ts":"/**\n * Defence in depth for log lines and user-visible error text.\n *\n * discord.js error messages and HTTP bodies can echo back credentials, and\n * everything we report ends up in bot_runtime_events, which the dashboard shows\n * to the bot owner. Scrub anything token-shaped before it leaves the process.\n */\n\n/** Discord bot tokens: three base64url segments separated by dots. */\nconst DISCORD_TOKEN = /[A-Za-z0-9_-]{20,}\\.[A-Za-z0-9_-]{5,}\\.[A-Za-z0-9_-]{20,}/g;\n/** `Bot <token>` / `Bearer <token>` in copied headers. */\nconst AUTH_HEADER = /\\b(Bot|Bearer)\\s+[A-Za-z0-9._-]{8,}/gi;\n\nexport function scrubSecrets(value: string): string {\n  return value.replace(DISCORD_TOKEN, \"[redacted-token]\").replace(AUTH_HEADER, \"$1 [redacted]\");\n}\n\n/** Short, scrubbed, single-line description of an unknown thrown value. */\nexport function describeError(error: unknown, maxLength = 300): string {\n  const raw =\n    error instanceof Error\n      ? error.message || error.name\n      : typeof error === \"string\"\n        ? error\n        : \"Unknown error\";\n  return scrubSecrets(raw).replace(/\\s+/g, \" \").trim().slice(0, maxLength);\n}\n\n/** discord.js attaches stable string codes (TokenInvalid, DisallowedIntents, …). */\nexport function errorCode(error: unknown): string | null {\n  if (typeof error !== \"object\" || error === null) return null;\n  const code = (error as { code?: unknown }).code;\n  return typeof code === \"string\" ? code : null;\n}\n","runtime/src/safe-fetch.ts":"/**\n * HTTPS-only fetch for anything a flow points at (Run Code, HTTP Request,\n * Send File): public addresses only, no redirects, a timeout and a size cap,\n * so a flow can never reach the bot host, a private network or a cloud\n * metadata server.\n */\nimport { lookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\n\nconst MAX_BODY = 100_000;\n\nexport function isPrivateAddress(ip: string): boolean {\n  if (isIP(ip) === 6) {\n    const v = ip.toLowerCase();\n    if (v.startsWith(\"::ffff:\")) return isPrivateAddress(v.slice(7));\n    return v === \"::\" || v === \"::1\" || v.startsWith(\"fc\") || v.startsWith(\"fd\") || v.startsWith(\"fe8\") || v.startsWith(\"fe9\") || v.startsWith(\"fea\") || v.startsWith(\"feb\") || v.startsWith(\"ff\");\n  }\n  const [a = 0, b = 0] = ip.split(\".\").map(Number);\n  return a === 0 || a === 10 || a === 127 || a >= 224 || (a === 100 && b >= 64 && b <= 127) || (a === 169 && b === 254) || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168) || (a === 198 && (b === 18 || b === 19));\n}\n\n/** Throws unless `raw` is an https URL whose host resolves only to public addresses. */\nexport async function publicUrl(raw: unknown): Promise<URL> {\n  let url: URL;\n  try { url = new URL(String(raw)); } catch { throw new Error(\"Invalid URL.\"); }\n  if (url.protocol !== \"https:\") throw new Error(\"Only https:// URLs are allowed.\");\n  if (url.username || url.password) throw new Error(\"Credentials in URLs are not allowed.\");\n  const host = url.hostname.replace(/^\\[|\\]$/g, \"\");\n  const addresses = isIP(host) ? [host] : (await lookup(host, { all: true })).map((a) => a.address);\n  if (!addresses.length || addresses.some(isPrivateAddress)) throw new Error(\"This address is not reachable from bot code.\");\n  return url;\n}\n\nexport interface SafeFetchOptions {\n  /** Characters of the body kept (default 100 KB). */\n  maxBody?: number;\n  /** Milliseconds before giving up (default 5 s). */\n  timeoutMs?: number;\n}\n\nexport async function safeFetch(args: unknown, options: SafeFetchOptions = {}): Promise<{ status: number; ok: boolean; headers: Record<string, string>; body: string }> {\n  const req = (args ?? {}) as { url?: unknown; method?: unknown; headers?: unknown; body?: unknown };\n  const url = await publicUrl(req.url);\n  const maxBody = options.maxBody ?? MAX_BODY;\n  const method = typeof req.method === \"string\" ? req.method.toUpperCase() : \"GET\";\n  if (![\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) throw new Error(\"Unsupported method.\");\n  const headers: Record<string, string> = {};\n  if (req.headers && typeof req.headers === \"object\") for (const [k, v] of Object.entries(req.headers).slice(0, 20)) headers[k] = String(v);\n  const response = await fetch(url, { method, headers, redirect: \"error\", signal: AbortSignal.timeout(options.timeoutMs ?? 5000), ...(typeof req.body === \"string\" && method !== \"GET\" ? { body: req.body.slice(0, MAX_BODY) } : {}) });\n  const text = await readCapped(response, maxBody * 4).then((b) => b.toString(\"utf8\").slice(0, maxBody));\n  return { status: response.status, ok: response.ok, headers: { \"content-type\": response.headers.get(\"content-type\") ?? \"\" }, body: text };\n}\n\n/** Reads at most `max` bytes of a response, cancelling the rest of the download. */\nasync function readCapped(response: Response, max: number): Promise<Buffer> {\n  if (!response.body) return Buffer.alloc(0);\n  const reader = response.body.getReader();\n  const chunks: Buffer[] = [];\n  let size = 0;\n  for (;;) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    chunks.push(Buffer.from(value));\n    size += value.byteLength;\n    if (size >= max) {\n      await reader.cancel().catch(() => undefined);\n      break;\n    }\n  }\n  return Buffer.concat(chunks).subarray(0, max);\n}\n\n/** A whole file (Send File), refused when it is bigger than `maxBytes`. */\nexport async function safeDownload(raw: unknown, maxBytes: number): Promise<{ data: Buffer; contentType: string; name: string }> {\n  const url = await publicUrl(raw);\n  const response = await fetch(url, { redirect: \"error\", signal: AbortSignal.timeout(15_000) });\n  if (!response.ok) throw new Error(`The file URL answered ${response.status}.`);\n  const declared = Number(response.headers.get(\"content-length\") ?? 0);\n  if (declared > maxBytes) throw new Error(`The file is larger than ${Math.round(maxBytes / 1_000_000)} MB.`);\n  const data = await readCapped(response, maxBytes + 1);\n  if (data.length > maxBytes) throw new Error(`The file is larger than ${Math.round(maxBytes / 1_000_000)} MB.`);\n  const last = decodeURIComponent(url.pathname.split(\"/\").pop() ?? \"\").replace(/[^\\w.-]+/g, \"_\").slice(0, 80);\n  return { data, contentType: response.headers.get(\"content-type\") ?? \"\", name: last || \"file\" };\n}\n","runtime/src/sandbox.test.ts":"import { describe, it } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { runSandboxed } from \"./sandbox.js\";\nimport { isPrivateAddress, safeFetch } from \"./safe-fetch.js\";\n\ndescribe(\"code sandbox\", () => {\n  it(\"reads and writes bot storage through the bridge\", async () => {\n    const rows: Record<string, string>[] = [];\n    const host = async (_op: string, a: unknown) => {\n      const r = a as { op: string; data: Record<string, string>; where: { field: string; value: string } };\n      if (r.op === \"save\") { rows.push(r.data); return { ok: true }; }\n      return { ok: true, rows: rows.filter((row) => row[r.where.field] === r.where.value) };\n    };\n    const out = await runSandboxed('export async function f(){ await db.save(\"items\",{key:\"a\",stock:5}); return { stock: (await db.get(\"items\",\"a\")).stock }; }', \"f\", {}, host as never);\n    assert.equal(out[\"stock\"], \"5\");\n  });\n  it(\"stops endless loops\", { timeout: 15000 }, async () => {\n    await assert.rejects(runSandboxed(\"export function f(){ while(true){} }\", \"f\", {}));\n  });\n  it(\"caps db/fetch calls at 20 per run\", async () => {\n    await assert.rejects(runSandboxed('export async function f(){ for (let i=0;i<21;i++) await db.count(\"t\"); }', \"f\", {}, (async () => ({ ok: true, count: 1 })) as never), /max 20/);\n  });\n  it(\"blocks private addresses and plain http\", async () => {\n    assert.equal(isPrivateAddress(\"10.0.0.1\"), true);\n    assert.equal(isPrivateAddress(\"192.168.1.1\"), true);\n    assert.equal(isPrivateAddress(\"::ffff:127.0.0.1\"), true);\n    assert.equal(isPrivateAddress(\"8.8.8.8\"), false);\n    await assert.rejects(safeFetch({ url: \"https://127.0.0.1/\" }));\n    await assert.rejects(safeFetch({ url: \"http://example.com/\" }));\n  });\n});\n","runtime/src/sandbox.ts":"/**\n * Runs developer code from a flow's Code tab inside QuickJS (WebAssembly).\n * The guest has no Node, filesystem, process or secret access. The only way\n * out is the `host` bridge the executor passes in (bot storage and a guarded\n * HTTPS fetch). Limits: 5 s wall time, 16 MB memory, 20 host calls.\n */\nimport { getQuickJS, shouldInterruptAfterDeadline } from \"quickjs-emscripten\";\n\nconst TIME_LIMIT_MS = 5000;\nconst MEMORY_LIMIT = 16 * 1024 * 1024;\nconst MAX_HOST_CALLS = 20;\n\nexport type HostBridge = (op: \"db\" | \"fetch\", args: unknown) => Promise<unknown>;\n\nconst PRELUDE = `\nconst __call = (op, args) => __host(op, JSON.stringify(args === undefined ? null : args)).then((s) => JSON.parse(s));\nconst __where = (w) => { const k = w && Object.keys(w)[0]; return k ? { field: k, value: String(w[k]) } : undefined; };\nconst __str = (d) => Object.fromEntries(Object.entries(d || {}).map(([k, v]) => [k, typeof v === \"string\" ? v : JSON.stringify(v)]));\nglobalThis.db = {\n  save: (table, data) => __call(\"db\", { op: \"save\", table, data: __str(data) }),\n  find: (table, where) => __call(\"db\", { op: \"find\", table, where: __where(where) }).then((r) => (r.rows && r.rows[0]) || null),\n  get: (table, key) => globalThis.db.find(table, { key }),\n  count: (table, where) => __call(\"db\", { op: \"count\", table, where: __where(where) }).then((r) => r.count || 0),\n  update: (table, where, data) => __call(\"db\", { op: \"update\", table, where: __where(where), data: __str(data) }),\n  delete: (table, where) => __call(\"db\", { op: \"delete\", table, where: __where(where) }),\n};\nglobalThis.fetch = (url, init) => __call(\"fetch\", { url: String(url), method: init && init.method, headers: init && init.headers, body: init && init.body }).then((r) => ({\n  status: r.status, ok: r.ok, headers: r.headers,\n  text: async () => r.body,\n  json: async () => JSON.parse(r.body),\n}));\n`;\n\nexport function toScript(source: string): string {\n  return source\n    .replace(/^\\s*import\\s[^;\\n]*from\\s+[\"']bottly[\"'];?\\s*$/gm, \"\")\n    .replace(/\\bexport\\s+(async\\s+)?function\\b/g, \"$1function\");\n}\n\nexport async function runSandboxed(source: string, fn: string, input: unknown, host?: HostBridge): Promise<Record<string, string>> {\n  if (!/^[A-Za-z_$][\\w$]*$/.test(fn)) throw new Error(\"Invalid function name.\");\n  const quickjs = await getQuickJS();\n  const runtime = quickjs.newRuntime();\n  const deadline = Date.now() + TIME_LIMIT_MS;\n  runtime.setMemoryLimit(MEMORY_LIMIT);\n  runtime.setInterruptHandler(shouldInterruptAfterDeadline(deadline));\n  const ctx = runtime.newContext();\n  let disposed = false;\n  let pending = 0;\n  let calls = 0;\n  let wake: () => void = () => {};\n\n  const hostFn = ctx.newFunction(\"__host\", (opHandle, argsHandle) => {\n    const op = ctx.getString(opHandle);\n    const raw = ctx.getString(argsHandle);\n    const deferred = ctx.newPromise();\n    const settle = (ok: boolean, value: string) => void Promise.resolve().then(() => {\n      if (disposed) return;\n      const handle = ok ? ctx.newString(value) : ctx.newError(value);\n      if (ok) deferred.resolve(handle); else deferred.reject(handle);\n      handle.dispose();\n      deferred.dispose();\n      pending--;\n      runtime.executePendingJobs();\n      wake();\n    });\n    pending++;\n    if (!host || (op !== \"db\" && op !== \"fetch\")) settle(false, `${op} is not available here.`);\n    else if (++calls > MAX_HOST_CALLS) settle(false, \"Too many db/fetch calls in one run (max 20).\");\n    else {\n      let args: unknown = null;\n      try { args = JSON.parse(raw); } catch { /* null */ }\n      host(op, args).then(\n        (value) => settle(true, JSON.stringify(value ?? null)),\n        (error: unknown) => settle(false, error instanceof Error ? error.message : String(error)),\n      );\n    }\n    return deferred.handle;\n  });\n  ctx.setProp(ctx.global, \"__host\", hostFn);\n  hostFn.dispose();\n\n  const read = (name: string): unknown => { const h = ctx.getProp(ctx.global, name); const v = ctx.dump(h); h.dispose(); return v; };\n  try {\n    const script = `${PRELUDE}\n${toScript(source)}\n;globalThis.__input = ${JSON.stringify(JSON.stringify(input ?? {}))};\nglobalThis.vars = JSON.parse(globalThis.__input).vars || {};\nif (typeof ${fn} !== \"function\") throw new Error(\"Function ${fn} is not exported.\");\nPromise.resolve().then(() => ${fn}(JSON.parse(globalThis.__input))).then(\n  (v) => { globalThis.__out = JSON.stringify(v === undefined ? {} : v); },\n  (e) => { globalThis.__err = String((e && e.message) || e); }\n);`;\n    ctx.unwrapResult(ctx.evalCode(script)).dispose();\n    const jobs = runtime.executePendingJobs();\n    if (jobs.error) { const err = ctx.dump(jobs.error); jobs.error.dispose(); throw new Error(String(err?.message ?? err)); }\n    while (read(\"__out\") === undefined && read(\"__err\") === undefined && pending > 0) {\n      const remaining = deadline - Date.now();\n      if (remaining <= 0) throw new Error(\"Code took longer than 5 seconds.\");\n      await new Promise<void>((resolve) => { wake = resolve; setTimeout(resolve, remaining); });\n    }\n    const err = read(\"__err\");\n    if (typeof err === \"string\") throw new Error(err);\n    const out = read(\"__out\");\n    if (typeof out !== \"string\") throw new Error(\"Code did not return a value.\");\n    const parsed: unknown = JSON.parse(out);\n    const result: Record<string, string> = {};\n    if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n      for (const [key, value] of Object.entries(parsed).slice(0, 50)) {\n        result[key] = (typeof value === \"string\" ? value : JSON.stringify(value)).slice(0, 4000);\n      }\n    } else result[\"value\"] = String(parsed).slice(0, 4000);\n    return result;\n  } finally {\n    disposed = true;\n    ctx.dispose();\n    runtime.dispose();\n  }\n}\n","runtime/src/server-agent.ts":"/**\n * AI server agent in Discord (Pro / Ultimate). When the owner connected a server to\n * this bot on Bottly's Servers page, mentioning the bot there (\"@Bot delete the\n * old channels and make a ticket panel\") is forwarded to the control plane,\n * which runs the AI, applies the changes with this bot's token and keeps\n * editing one reply with live progress. Destructive plans wait for the\n * requester to press Apply; that button is forwarded here too.\n *\n * The runtime only forwards: the control plane checks the plan, who may ask\n * and what the AI may do.\n */\nimport {\n  PermissionFlagsBits,\n  type ButtonInteraction,\n  type Client,\n  type Message,\n} from \"discord.js\";\nimport { agentRequest } from \"./control-plane.js\";\nimport { logger } from \"./logger.js\";\nimport { describeError } from \"./redact.js\";\n\n/** custom_id prefix of the agent's Apply / Cancel buttons. */\nexport const AGENT_BUTTON_PREFIX = \"bottly-agent:\";\n\n/** Image attachments the AI may look at (Discord CDN only). */\nconst MAX_IMAGES = 4;\n\nfunction isAdmin(message: Message): boolean {\n  const perms = message.member?.permissions;\n  return Boolean(\n    perms?.has(PermissionFlagsBits.Administrator) || perms?.has(PermissionFlagsBits.ManageGuild),\n  );\n}\n\n/** True when the message @mentions this bot itself in its text (not a reply ping). */\nfunction mentionsBot(client: Client, message: Message): boolean {\n  const id = client.user?.id;\n  if (!id) return false;\n  return message.content.includes(`<@${id}>`) || message.content.includes(`<@!${id}>`);\n}\n\nexport async function handleAgentMention(\n  client: Client,\n  ctx: { botId: string; userId: string },\n  message: Message,\n): Promise<void> {\n  if (message.author.bot || !message.guild || !mentionsBot(client, message)) return;\n  const id = client.user!.id;\n  const content = message.content\n    .replaceAll(`<@${id}>`, \"\")\n    .replaceAll(`<@!${id}>`, \"\")\n    .trim()\n    .slice(0, 2000);\n  const images = [...message.attachments.values()]\n    .filter((a) => a.contentType?.startsWith(\"image/\") && a.size <= 8 * 1024 * 1024)\n    .slice(0, MAX_IMAGES)\n    .map((a) => a.url);\n\n  if (\"sendTyping\" in message.channel) void message.channel.sendTyping().catch(() => {});\n  const result = await agentRequest(ctx.botId, ctx.userId, {\n    type: \"mention\",\n    guildId: message.guild.id,\n    channelId: message.channelId,\n    messageId: message.id,\n    authorId: message.author.id,\n    authorIsAdmin: isAdmin(message),\n    content,\n    images,\n  });\n  if (!result.ok) logger.warn(`AI agent request failed: ${result.error ?? \"unknown error\"}`);\n}\n\nexport async function handleAgentButton(\n  ctx: { botId: string; userId: string },\n  interaction: ButtonInteraction,\n): Promise<void> {\n  const [, decision, requestId] = interaction.customId.split(\":\");\n  try {\n    // The control plane edits this message itself; acknowledge right away.\n    await interaction.deferUpdate();\n  } catch (error) {\n    logger.warn(`Could not acknowledge an agent button: ${describeError(error)}`);\n  }\n  const result = await agentRequest(ctx.botId, ctx.userId, {\n    type: \"button\",\n    guildId: interaction.guildId ?? \"\",\n    channelId: interaction.channelId,\n    messageId: interaction.message.id,\n    authorId: interaction.user.id,\n    decision: decision === \"apply\" ? \"apply\" : \"cancel\",\n    requestId: requestId ?? \"\",\n  });\n  if (!result.ok) logger.warn(`AI agent button failed: ${result.error ?? \"unknown error\"}`);\n}\n","runtime/src/session.ts":"/**\n * One bot = one BotSession = one Discord gateway connection.\n *\n * The session is the source of truth for that bot's state and pushes every\n * transition to the control plane, so the dashboard stays truthful without\n * anyone polling Discord. start()/stop() are serialised through a promise chain,\n * so double clicks and a stop landing mid-start cannot interleave.\n */\nimport { ActivityType, Client, Events, GatewayIntentBits, Partials } from \"discord.js\";\nimport type { BotPresenceConfig } from \"./deployment.js\";\n\n/**\n * How often a running bot re-reads its published deployment (flows, commands\n * and presence) from the control plane.\n *\n * Polling is what makes publishing work for bots the control plane cannot\n * reach — self-hosted VPS nodes sit behind NAT, so no push can arrive there.\n * Centrally hosted bots also get an instant push (POST /v1/bots/:id/reload).\n */\nconst DEPLOYMENT_POLL_INTERVAL_MS = 30_000;\n\n/** Applies the owner's configured status/activity to the live gateway client. */\nexport function applyPresence(client: Client, presence: BotPresenceConfig | null): void {\n  if (!client.user) return;\n\n  // No presence configured: fall back to a plain online status.\n  if (!presence) {\n    try {\n      void Promise.resolve(client.user.setPresence({ status: \"online\", activities: [] })).catch(\n        (error: unknown) => logger.warn(`Could not apply presence: ${describeError(error)}`),\n      );\n    } catch (error) {\n      logger.warn(`Could not apply presence: ${describeError(error)}`);\n    }\n    return;\n  }\n\n  const status =\n    presence.status === \"idle\" || presence.status === \"dnd\" || presence.status === \"invisible\"\n      ? presence.status\n      : \"online\";\n\n  const typeMap: Record<string, ActivityType> = {\n    playing: ActivityType.Playing,\n    streaming: ActivityType.Streaming,\n    listening: ActivityType.Listening,\n    watching: ActivityType.Watching,\n    competing: ActivityType.Competing,\n    custom: ActivityType.Custom,\n  };\n  const type = typeMap[presence.activityType ?? \"playing\"] ?? ActivityType.Playing;\n  const name =\n    (type === ActivityType.Custom ? presence.activityState : presence.activityName)?.trim() ?? \"\";\n\n  try {\n    if (name) {\n      // Discord custom activities require a non-empty placeholder name and put\n      // the user-visible text in `state`; other activity types use `name`.\n      const activity: { name: string; type: ActivityType; url?: string; state?: string } = {\n        name: type === ActivityType.Custom ? \"Custom Status\" : name,\n        type,\n      };\n      if (type === ActivityType.Streaming && presence.streamUrl) activity.url = presence.streamUrl;\n      if (type === ActivityType.Custom) activity.state = name;\n      // setPresence returns a Promise in discord.js v15.\n      void Promise.resolve(client.user.setPresence({ status, activities: [activity] })).catch(\n        (error: unknown) => logger.warn(`Could not apply presence: ${describeError(error)}`),\n      );\n    } else {\n      void Promise.resolve(client.user.setPresence({ status, activities: [] })).catch(\n        (error: unknown) => logger.warn(`Could not apply presence: ${describeError(error)}`),\n      );\n    }\n  } catch (error) {\n    logger.warn(`Could not apply presence: ${describeError(error)}`);\n  }\n}\nimport { config } from \"./config.js\";\nimport { syncCommands, type SyncResult } from \"./commands.js\";\nimport { ControlPlaneError, fetchBotToken, reportRuntimeState } from \"./control-plane.js\";\nimport { decryptBotToken, isDecryptionFailure } from \"./crypto.js\";\nimport { fetchDeployment, type BotDeployment } from \"./deployment.js\";\nimport { FlowRunner } from \"./executor.js\";\nimport { logger } from \"./logger.js\";\nimport { describeError, errorCode, scrubSecrets } from \"./redact.js\";\nimport {\n  nowIso,\n  type RuntimeEvent,\n  type RuntimeState,\n  type RuntimeStatusPayload,\n} from \"./types.js\";\n\n/**\n * Turns intent NAMES (as computed by the flow compiler) into gateway bits.\n * Unknown names are dropped with a warning instead of crashing the bot.\n */\nexport function intentBits(names: string[]): number[] {\n  const table = GatewayIntentBits as unknown as Record<string, number | string | undefined>;\n  const bits = new Set<number>(config.intents);\n  for (const name of names) {\n    const bit = table[name];\n    if (typeof bit === \"number\") bits.add(bit);\n    else logger.warn(`Ignoring unknown gateway intent \"${name}\" from the published flow.`);\n  }\n  return [...bits];\n}\n\n/** Plain-language summary of a command registration, for the bot's log. */\nfunction describeSync(result: SyncResult): string {\n  if (result.skipped) return \"Slash commands already matched the published version.\";\n  if (result.scope === \"global\") {\n    return `Registered ${result.commands} slash command(s) for every server this bot is in.`;\n  }\n  if (result.scope === \"guild\") {\n    return (\n      `Registered ${result.commands} slash command(s) in ${result.guilds} server(s)` +\n      (result.failures > 0 ? `; ${result.failures} server(s) refused (missing scope).` : \".\")\n    );\n  }\n  return \"Discord refused the slash command list. Check the bot's permissions and try publishing again.\";\n}\n\n/** Turns a token-acquisition failure into text that is safe to show the owner. */\nfunction describeTokenFailure(error: unknown): string {\n  if (error instanceof ControlPlaneError) {\n    switch (error.kind) {\n      case \"missing\":\n        return \"No verified bot token is stored for this bot. Add one in Settings, then start it again.\";\n      case \"unauthorized\":\n        // Operator misconfiguration: keep the detail in the logs only.\n        logger.error(`Control plane rejected the callback secret: ${error.message}`);\n        return \"Bot hosting is misconfigured on the server. Contact support.\";\n      case \"invalid\":\n        logger.error(`Malformed token payload from the control plane: ${error.message}`);\n        return \"The stored token could not be read. Save it again in Settings.\";\n      case \"unavailable\":\n      default:\n        return \"The runtime could not reach the control plane. Try again in a moment.\";\n    }\n  }\n\n  if (isDecryptionFailure(error)) {\n    logger.error(`Token decryption failed: ${describeError(error)}`);\n    return \"The stored token could not be decrypted. Save it again in Settings.\";\n  }\n\n  logger.error(`Unexpected token failure: ${describeError(error)}`);\n  return \"The runtime could not load this bot's token.\";\n}\n\n/** Same, for a failed gateway login. */\nfunction describeLoginFailure(error: unknown): string {\n  const code = errorCode(error);\n\n  if (code === \"TokenInvalid\") {\n    return \"Discord rejected the stored token. Reset it in the developer portal and save the new one.\";\n  }\n  if (code === \"DisallowedIntents\") {\n    return \"Discord refused the requested gateway intents. Enable the privileged intents for this application in the developer portal.\";\n  }\n  if (code === \"ShardingRequired\") {\n    return \"This bot is in too many servers for a single connection. Contact support to enable sharding.\";\n  }\n\n  return `Could not connect this bot to Discord: ${describeError(error, 200)}`;\n}\n\nexport class BotSession {\n  readonly botId: string;\n  readonly userId: string;\n\n  private state: RuntimeState = \"offline\";\n  private client: Client | null = null;\n  private startedAt: string | null = null;\n  private lastError: string | null = null;\n  private guildCount: number | null = null;\n  private username: string | null = null;\n\n  /** Published flow deployment this session is running, if any. */\n  private deployment: BotDeployment | null = null;\n  private runner: FlowRunner | null = null;\n  /** Gateway intents the live client identified with. */\n  private currentIntents: number[] = [];\n\n  /** Set while a deliberate stop is in flight, so close events stay quiet. */\n  private stopping = false;\n  /** Serialises start/stop. Rejections are absorbed so the chain never dies. */\n  private chain: Promise<unknown> = Promise.resolve();\n  /** Periodic deployment refresh, so publishing reaches VPS-hosted bots. */\n  private syncTimer: ReturnType<typeof setInterval> | null = null;\n  /** Guards against two overlapping deployment syncs. */\n  private syncing = false;\n  /** The owner presence last applied, so the deployment poll does not reapply it. */\n  private presenceKey = \"\";\n  /** Pending automatic restart after an unexpected disconnect. */\n  private restartTimer: ReturnType<typeof setTimeout> | null = null;\n  private restartAttempt = 0;\n\n  constructor(botId: string, userId: string) {\n    this.botId = botId;\n    this.userId = userId;\n  }\n\n  status(): RuntimeStatusPayload {\n    return {\n      state: this.state,\n      startedAt: this.startedAt,\n      lastError: this.lastError,\n      guildCount: this.guildCount,\n      username: this.username,\n    };\n  }\n\n  /** True when this session holds no connection and can be dropped from the map. */\n  isIdle(): boolean {\n    return (\n      this.client === null &&\n      this.restartTimer === null &&\n      (this.state === \"offline\" || this.state === \"error\")\n    );\n  }\n\n  isActive(): boolean {\n    return this.state !== \"offline\";\n  }\n\n  start(): Promise<RuntimeStatusPayload> {\n    return this.enqueue(() => this.startNow());\n  }\n\n  stop(reason: \"command\" | \"shutdown\" = \"command\"): Promise<RuntimeStatusPayload> {\n    // A manual stop always cancels any pending automatic restart.\n    this.cancelAutoRestart();\n    return this.enqueue(() => this.stopNow(reason));\n  }\n\n  /**\n   * Re-fetches the owner's saved presence from the control plane and applies\n   * it to the live gateway client — no restart needed. Returns false when the\n   * bot is not online or the refresh failed.\n   */\n  async refreshPresence(): Promise<boolean> {\n    return this.syncDeployment();\n  }\n\n  /**\n   * Picks up a freshly published deployment on a RUNNING bot.\n   *\n   * Called by the poll timer and by the control plane right after Publish.\n   * Without this a live bot keeps serving the flows it loaded at start time,\n   * which is exactly what makes a newly published command answer with\n   * \"The application did not respond\".\n   */\n  async reload(): Promise<boolean> {\n    return this.syncDeployment();\n  }\n\n  private async syncDeployment(): Promise<boolean> {\n    if (this.state !== \"online\" || this.client === null) return false;\n    if (this.syncing) return true;\n    this.syncing = true;\n\n    try {\n      const deployment = await fetchDeployment(this.botId, this.userId);\n      const previousVersion = this.deployment?.version ?? null;\n      this.deployment = deployment;\n\n      // Only when the owner's presence changed: a Set Bot Presence block's\n      // status must survive the 30-second deployment poll.\n      const presenceKey = JSON.stringify(deployment?.presence ?? null);\n      if (presenceKey !== this.presenceKey) {\n        this.presenceKey = presenceKey;\n        applyPresence(this.client, deployment?.presence ?? null);\n      }\n\n      const nextVersion = deployment?.version ?? null;\n      const agentChanged = (deployment?.serverAgent ?? false) !== (this.runner?.serverAgent ?? false);\n      if (nextVersion !== previousVersion || agentChanged) await this.applyFlows(deployment);\n      return true;\n    } catch (error) {\n      logger.warn(`Deployment refresh failed for bot ${this.botId}: ${describeError(error)}`);\n      return false;\n    } finally {\n      this.syncing = false;\n    }\n  }\n\n  /**\n   * Swaps the running flows for the ones in a newer deployment.\n   *\n   * Gateway intents are fixed at IDENTIFY time, so a deployment that needs an\n   * intent the live connection never asked for can only be applied by\n   * reconnecting. Everything else is a hot swap.\n   */\n  private async applyFlows(deployment: BotDeployment | null): Promise<void> {\n    const client = this.client;\n    if (client === null) return;\n\n    const required = intentBits(deployment?.intents ?? []);\n    const missing = required.filter((bit) => !this.currentIntents.includes(bit));\n\n    if (missing.length > 0) {\n      logger.info(`Bot ${this.botId} needs new gateway intents; reconnecting.`);\n      await this.report([\n        {\n          event: \"flow.reconnect\",\n          level: \"info\",\n          description:\n            \"The new published version needs extra Discord permissions to listen for its triggers, so the bot is reconnecting.\",\n          at: nowIso(),\n        },\n      ]);\n      await this.stop();\n      await this.start();\n      return;\n    }\n\n    const flows = deployment?.flows ?? [];\n    if (this.runner === null) {\n      const runner = new FlowRunner(client, flows, (event) => {\n        void this.report([event]);\n      });\n      runner.attach();\n      this.runner = runner;\n    } else {\n      this.runner.setFlows(flows);\n    }\n    this.runner.setContext({\n      botId: this.botId,\n      userId: this.userId,\n      env: deployment?.env ?? {},\n      plugins: deployment?.plugins ?? {},\n      serverAgent: deployment?.serverAgent ?? false,\n      prefixes: deployment?.prefixes ?? [],\n      images: deployment?.images ?? {},\n    });\n\n    const events: RuntimeEvent[] = [\n      {\n        event: \"flow.reloaded\",\n        level: \"success\",\n        description: `Picked up published version ${deployment?.version ?? 0} (${flows.length} flow(s)) without a restart.`,\n        at: nowIso(),\n      },\n    ];\n\n    if (flows.length > 0 && client.isReady()) {\n      try {\n        const result = await syncCommands(client, flows);\n        if (!result.skipped) {\n          events.push({\n            event: \"commands.registered\",\n            level: result.failures > 0 ? \"warning\" : \"info\",\n            description: describeSync(result),\n            at: nowIso(),\n          });\n        }\n      } catch (error) {\n        events.push({\n          event: \"commands.error\",\n          level: \"error\",\n          description: `Could not register slash commands: ${describeError(error, 200)}`,\n          at: nowIso(),\n        });\n      }\n    }\n\n    await this.report(events);\n  }\n\n  private startDeploymentPolling(): void {\n    this.stopDeploymentPolling();\n    this.syncTimer = setInterval(() => {\n      void this.syncDeployment();\n    }, DEPLOYMENT_POLL_INTERVAL_MS);\n    // Never keep the process alive just for polling.\n    this.syncTimer.unref?.();\n  }\n\n  private stopDeploymentPolling(): void {\n    if (this.syncTimer !== null) {\n      clearInterval(this.syncTimer);\n      this.syncTimer = null;\n    }\n  }\n\n\n  private enqueue(task: () => Promise<RuntimeStatusPayload>): Promise<RuntimeStatusPayload> {\n    // then(task, task): the next command runs whatever the previous one did.\n    const next = this.chain.then(task, task);\n    this.chain = next.catch(() => undefined);\n    return next;\n  }\n\n  private async startNow(): Promise<RuntimeStatusPayload> {\n    if (this.state === \"online\" || this.state === \"starting\") return this.status();\n\n    await this.teardownClient();\n    this.stopping = false;\n    this.state = \"starting\";\n    this.lastError = null;\n\n    await this.report([\n      {\n        event: \"runtime.starting\",\n        level: \"info\",\n        description: \"Runtime is connecting this bot to the Discord gateway.\",\n        at: nowIso(),\n      },\n    ]);\n\n    let token: string;\n    try {\n      const record = await fetchBotToken(this.botId, this.userId);\n      token = \"plaintext\" in record ? record.plaintext : await decryptBotToken(record);\n    } catch (error) {\n      return this.fail(describeTokenFailure(error));\n    }\n\n    // The published flow decides which gateway intents we must identify with,\n    // so it has to be loaded BEFORE the client is constructed.\n    try {\n      this.deployment = await fetchDeployment(this.botId, this.userId);\n    } catch (error) {\n      this.deployment = null;\n      logger.warn(\n        `Could not load the published flow for bot ${this.botId}: ${describeError(error)}`,\n      );\n      await this.report([\n        {\n          event: \"flow.load-failed\",\n          level: \"warning\",\n          description:\n            \"The published flow could not be loaded; the bot connects but will not respond. Publish the flow again.\",\n          at: nowIso(),\n        },\n      ]);\n    }\n\n    // Ask for a little more than today's flows need, so adding a trigger of a\n    // kind the bot can already hear does not force a reconnect.\n    this.currentIntents = intentBits(this.deployment?.intents ?? []);\n\n    const client = new Client({\n      intents: this.currentIntents,\n      // Members only by default: @everyone, @here and role pings need the\n      // block's \"Allow @everyone and role pings\" switch (executor mentionsFor).\n      allowedMentions: { parse: [\"users\"], repliedUser: true },\n      // Reactions and member removals frequently arrive uncached.\n      partials: [\n        Partials.Message,\n        Partials.Channel,\n        Partials.Reaction,\n        Partials.GuildMember,\n        Partials.User,\n        Partials.GuildScheduledEvent,\n      ],\n    });\n    this.client = client;\n    this.attach(client);\n\n    // Always create the runner, even with zero published flows: it owns the\n    // InteractionCreate listener, so a command registered on Discord before\n    // its flow is published still gets an answer instead of a dead interaction.\n    const runner = new FlowRunner(client, this.deployment?.flows ?? [], (event) => {\n      void this.report([event]);\n    });\n    runner.attach();\n    runner.setContext({\n      botId: this.botId,\n      userId: this.userId,\n      env: this.deployment?.env ?? {},\n      plugins: this.deployment?.plugins ?? {},\n      serverAgent: this.deployment?.serverAgent ?? false,\n      prefixes: this.deployment?.prefixes ?? [],\n      images: this.deployment?.images ?? {},\n    });\n    this.runner = runner;\n\n\n    try {\n      // Resolves once IDENTIFY is sent; ClientReady flips us to \"online\" after.\n      await client.login(token);\n    } catch (error) {\n      logger.error(`Login failed for bot ${this.botId}: ${describeError(error)}`);\n      await this.teardownClient();\n      return this.fail(describeLoginFailure(error));\n    } finally {\n      token = \"\";\n    }\n\n    logger.info(`Bot ${this.botId} identified with Discord, waiting for ready.`);\n    return this.status();\n  }\n\n  private async stopNow(reason: \"command\" | \"shutdown\"): Promise<RuntimeStatusPayload> {\n    if (this.client === null && this.state === \"offline\") return this.status();\n\n    this.stopping = true;\n    if (this.client !== null) this.state = \"stopping\";\n\n    await this.teardownClient();\n\n    this.state = \"offline\";\n    this.startedAt = null;\n    this.guildCount = null;\n    this.username = null;\n    this.lastError = null;\n    this.stopping = false;\n\n    await this.report([\n      reason === \"shutdown\"\n        ? {\n            event: \"runtime.shutdown\",\n            level: \"warning\",\n            description:\n              \"The runtime is restarting; this bot was disconnected and must be started again.\",\n            at: nowIso(),\n          }\n        : {\n            event: \"runtime.stop\",\n            level: \"warning\",\n            description: \"Runtime disconnected this bot from the Discord gateway.\",\n            at: nowIso(),\n          },\n    ]);\n\n    logger.info(`Bot ${this.botId} stopped (${reason}).`);\n    return this.status();\n  }\n\n  /** Moves to the error state, reports it, and returns the status to the caller. */\n  private async fail(message: string): Promise<RuntimeStatusPayload> {\n    this.state = \"error\";\n    this.startedAt = null;\n    this.guildCount = null;\n    this.username = null;\n    this.lastError = scrubSecrets(message);\n\n    await this.report([\n      {\n        event: \"runtime.error\",\n        level: \"error\",\n        description: this.lastError,\n        at: nowIso(),\n      },\n    ]);\n\n    return this.status();\n  }\n\n  private attach(client: Client): void {\n    client.once(Events.ClientReady, () => {\n      void this.onReady();\n    });\n\n    client.on(Events.Error, (error: Error) => {\n      void this.onClientError(error);\n    });\n\n    // discord.js v15 moves shard lifecycle events to @discordjs/ws\n    // (client.ws.on(WebSocketShardEvents.Closed / Resumed …)); they all live\n    // here so the upgrade touches one place.\n    client.on(Events.ShardDisconnect, (event: { code: number }, shardId: number) => {\n      void this.onShardDisconnect(event.code, shardId);\n    });\n\n    client.on(Events.ShardReconnecting, (shardId: number) => {\n      void this.onShardReconnecting(shardId);\n    });\n\n    client.on(Events.ShardResume, (shardId: number) => {\n      void this.onShardResume(shardId);\n    });\n\n    // Guild counts change often; refresh locally and let the next status probe\n    // or state change carry the new number instead of spamming callbacks.\n    client.on(Events.GuildCreate, () => this.syncGuildCount());\n    client.on(Events.GuildDelete, () => this.syncGuildCount());\n  }\n\n  private syncGuildCount(): void {\n    if (this.client === null) return;\n    this.guildCount = this.client.guilds.cache.size;\n  }\n\n  private async onReady(): Promise<void> {\n    const client = this.client;\n    if (client === null) return;\n\n    this.state = \"online\";\n    this.restartAttempt = 0;\n    this.startedAt = nowIso();\n    this.lastError = null;\n    this.username = client.user?.tag ?? null;\n    this.guildCount = client.guilds.cache.size;\n\n    logger.info(`Bot ${this.botId} online as ${this.username ?? \"unknown\"}.`);\n\n    this.presenceKey = JSON.stringify(this.deployment?.presence ?? null);\n    applyPresence(client, this.deployment?.presence ?? null);\n    this.startDeploymentPolling();\n\n    const events: RuntimeEvent[] = [\n      {\n        event: \"gateway.ready\",\n        level: \"success\",\n        description: `Connected to Discord as ${this.username ?? \"unknown\"} in ${this.guildCount} server(s).`,\n        at: nowIso(),\n      },\n    ];\n\n    // Slash commands are (re)published on every start, so Discord always shows\n    // exactly the commands the published flow defines.\n    const flows = this.deployment?.flows ?? [];\n    if (flows.length > 0 && client.isReady()) {\n      try {\n        const result = await syncCommands(client, flows);\n        events.push({\n          event: \"commands.registered\",\n          level: result.failures > 0 ? \"warning\" : \"info\",\n          description: describeSync(result),\n          at: nowIso(),\n        });\n      } catch (error) {\n        events.push({\n          event: \"commands.error\",\n          level: \"error\",\n          description: `Could not register slash commands: ${describeError(error, 200)}`,\n          at: nowIso(),\n        });\n      }\n\n      events.push({\n        event: \"flow.loaded\",\n        level: \"info\",\n        description: `Running published flow version ${this.deployment?.version ?? 0} (${flows.length} flow(s)).`,\n        at: nowIso(),\n      });\n    } else {\n      events.push({\n        event: \"flow.empty\",\n        level: \"warning\",\n        description:\n          \"This bot has no published flow yet, so its commands will answer that nothing is published. Hit Publish in the flow builder.\",\n        at: nowIso(),\n      });\n    }\n\n\n    await this.report(events);\n  }\n\n  private async onClientError(error: Error): Promise<void> {\n    const message = describeError(error, 200);\n    logger.warn(`Client error for bot ${this.botId}: ${message}`);\n    // discord.js recovers from most of these, so the state is left alone.\n    this.lastError = message;\n\n    await this.report([\n      {\n        event: \"gateway.error\",\n        level: \"error\",\n        description: message,\n        at: nowIso(),\n      },\n    ]);\n  }\n\n  private async onShardDisconnect(code: number, shardId: number): Promise<void> {\n    // A deliberate stop reports its own terminal state.\n    if (this.stopping) return;\n\n    logger.warn(`Bot ${this.botId} shard ${shardId} closed with code ${code} and will not resume.`);\n    await this.teardownClient();\n    // 4004 = invalid token, 4013/4014 = invalid/disallowed intents: retrying cannot help.\n    const fatal = code === 4004 || code === 4013 || code === 4014;\n    await this.fail(\n      `Discord closed the gateway connection (code ${code}) and it cannot be resumed.` +\n        (fatal || !this.deployment?.autoRestart ? \" Start the bot again.\" : \"\"),\n    );\n    if (!fatal) this.scheduleAutoRestart();\n  }\n\n  private cancelAutoRestart(): void {\n    if (this.restartTimer !== null) {\n      clearTimeout(this.restartTimer);\n      this.restartTimer = null;\n    }\n    this.restartAttempt = 0;\n  }\n\n  /** Brings the bot back after an unexpected drop (Pro / Ultimate, owner-enabled). */\n  private scheduleAutoRestart(): void {\n    if (!this.deployment?.autoRestart || this.restartTimer !== null) return;\n    const delays = [5_000, 15_000, 60_000, 300_000];\n    const delay = delays[Math.min(this.restartAttempt, delays.length - 1)]!;\n    this.restartAttempt += 1;\n    void this.report([\n      {\n        event: \"runtime.auto-restart\",\n        level: \"warning\",\n        description: `Auto-restart: reconnecting in ${Math.round(delay / 1000)} s (attempt ${this.restartAttempt}).`,\n        at: nowIso(),\n      },\n    ]);\n    this.restartTimer = setTimeout(() => {\n      this.restartTimer = null;\n      const attempt = this.restartAttempt;\n      void this.enqueue(() => this.startNow()).then(() => {\n        // startNow resets nothing on failure; keep backing off.\n        if (this.state === \"error\" && !/token/i.test(this.lastError ?? \"\")) {\n          this.restartAttempt = attempt;\n          this.scheduleAutoRestart();\n        }\n      });\n    }, delay);\n    this.restartTimer.unref?.();\n  }\n\n  private async onShardReconnecting(shardId: number): Promise<void> {\n    if (this.stopping || this.state === \"offline\") return;\n\n    // Truthful: mid-reconnect the bot is not serving traffic.\n    if (this.state === \"online\") this.state = \"starting\";\n\n    await this.report([\n      {\n        event: \"gateway.reconnecting\",\n        level: \"warning\",\n        description: `Lost the gateway connection (shard ${shardId}); reconnecting.`,\n        at: nowIso(),\n      },\n    ]);\n  }\n\n  private async onShardResume(shardId: number): Promise<void> {\n    if (this.stopping || this.client === null) return;\n\n    this.state = \"online\";\n    this.lastError = null;\n    this.syncGuildCount();\n\n    await this.report([\n      {\n        event: \"gateway.resumed\",\n        level: \"success\",\n        description: `Gateway session resumed (shard ${shardId}).`,\n        at: nowIso(),\n      },\n    ]);\n  }\n\n  private async teardownClient(): Promise<void> {\n    this.stopDeploymentPolling();\n    const client = this.client;\n    this.client = null;\n    this.runner?.detach();\n    this.runner = null;\n    if (client === null) return;\n\n    // Detach first: a destroyed client must not push more state.\n    client.removeAllListeners();\n    try {\n      // destroy() is sync in some 14.x releases and async in others.\n      await Promise.resolve(client.destroy());\n    } catch (error) {\n      logger.warn(`Error destroying client for bot ${this.botId}: ${describeError(error)}`);\n    }\n  }\n\n  private async report(events: RuntimeEvent[]): Promise<void> {\n    const status = this.status();\n    await reportRuntimeState({\n      botId: this.botId,\n      userId: this.userId,\n      state: status.state,\n      startedAt: status.startedAt,\n      lastError: status.lastError,\n      guildCount: status.guildCount,\n      username: status.username,\n      events,\n    });\n  }\n}\n","runtime/src/standalone.ts":"/**\n * Runs ONE exported Bottly bot on its own, without Bottly: the flows,\n * presence and settings come from bot.json next to the code (made by\n * Bot → Settings → Export as code), the token and secrets from .env.\n *\n *   npm install\n *   npm start\n *\n * Bottly storage becomes data/storage.json (src/local-storage.ts); AI Chat\n * calls your own provider (AI_PROVIDER / AI_API_KEY); the AI server agent\n * and Bottly's own AI need Bottly hosting.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n/** Name of the variable that holds a plugin setting, e.g. PLUGIN_SELLAUTH_API_KEY. */\nexport function pluginEnvName(plugin: string, key: string): string {\n  const words = `${plugin}_${key.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")}`;\n  return `PLUGIN_${words.toUpperCase().replace(/[^A-Z0-9]+/g, \"_\")}`;\n}\n\ninterface ExportedBot {\n  name?: string;\n  version?: number;\n  intents?: string[];\n  flows?: unknown[];\n  presence?: unknown;\n  prefixes?: string[];\n  images?: Record<string, unknown>;\n  /** Names of the bot's settings ({env.NAME}); values live in .env. */\n  env?: string[];\n  /** Plugin id → setting keys; values live in .env as PLUGIN_<ID>_<KEY>. */\n  plugins?: Record<string, string[]>;\n}\n\nasync function main() {\n  const root = resolve(process.env[\"BOTTLY_BOT_DIR\"] || \".\");\n  const envFile = resolve(root, \".env\");\n  if (existsSync(envFile)) process.loadEnvFile(envFile);\n  process.env[\"BOTTLY_STANDALONE\"] = \"1\";\n\n  const token = process.env[\"DISCORD_TOKEN\"]?.trim();\n  if (!token) {\n    console.error(\"Put your bot token in .env as DISCORD_TOKEN=... (Discord Developer Portal → Bot → Reset Token).\");\n    process.exit(1);\n  }\n  const bot = JSON.parse(readFileSync(resolve(root, \"bot.json\"), \"utf8\")) as ExportedBot;\n\n  // Loaded after BOTTLY_STANDALONE is set: config.ts reads it on import.\n  const { Client, Events, Partials } = await import(\"discord.js\");\n  const { FlowRunner } = await import(\"./executor.js\");\n  const { syncCommands } = await import(\"./commands.js\");\n  const { applyPresence, intentBits } = await import(\"./session.js\");\n  const { localStorage } = await import(\"./local-storage.js\");\n  const { logger } = await import(\"./logger.js\");\n  type Flows = ConstructorParameters<typeof FlowRunner>[1];\n  type Context = Parameters<InstanceType<typeof FlowRunner>[\"setContext\"]>[0];\n\n  const env: Record<string, string> = {};\n  for (const name of bot.env ?? []) env[name] = process.env[name] ?? \"\";\n  const plugins: Record<string, Record<string, string>> = {};\n  for (const [plugin, keys] of Object.entries(bot.plugins ?? {})) {\n    plugins[plugin] = {};\n    for (const key of keys) plugins[plugin]![key] = process.env[pluginEnvName(plugin, key)] ?? \"\";\n  }\n\n  const flows = (bot.flows ?? []) as Flows;\n  const client = new Client({\n    intents: intentBits(bot.intents ?? []),\n    allowedMentions: { parse: [\"users\"], repliedUser: true },\n    partials: [\n      Partials.Message,\n      Partials.Channel,\n      Partials.Reaction,\n      Partials.GuildMember,\n      Partials.User,\n      Partials.GuildScheduledEvent,\n    ],\n  });\n\n  const runner = new FlowRunner(client, flows, (event) => {\n    const line = `[${event.event}] ${event.description}`;\n    if (event.level === \"error\") logger.error(line);\n    else if (event.level === \"warning\") logger.warn(line);\n    else logger.info(line);\n  });\n  runner.attach();\n  runner.setContext({\n    botId: \"local\",\n    userId: \"local\",\n    env,\n    plugins,\n    serverAgent: false,\n    prefixes: bot.prefixes ?? [],\n    images: (bot.images ?? {}) as NonNullable<Context[\"images\"]>,\n  });\n\n  client.once(Events.ClientReady, async (ready) => {\n    logger.info(`${ready.user.tag} is online in ${ready.guilds.cache.size} server(s).`);\n    applyPresence(ready, (bot.presence ?? null) as Parameters<typeof applyPresence>[1]);\n    try {\n      const result = await syncCommands(ready, flows);\n      logger.info(\n        result.skipped ? \"Slash commands are up to date.\" : `Registered ${result.commands} slash command(s).`,\n      );\n    } catch (error) {\n      logger.error(`Could not register slash commands: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  });\n\n  const stop = async () => {\n    localStorage().flush();\n    runner.detach();\n    await client.destroy();\n    process.exit(0);\n  };\n  process.on(\"SIGINT\", () => void stop());\n  process.on(\"SIGTERM\", () => void stop());\n\n  await client.login(token);\n}\n\nvoid main().catch((error: unknown) => {\n  console.error(error instanceof Error ? error.message : error);\n  process.exit(1);\n});\n","runtime/src/store.ts":"/**\n * Keyed records on top of Bottly storage for the plugin engines (levels,\n * wallets, giveaways, suggestions). One bot runs in one runtime process, so a\n * per-key lock here makes read-modify-write safe: two quick /pay or /work\n * commands can never spend the same coins twice.\n */\nimport { storageRequest } from \"./control-plane.js\";\n\nexport type Row = Record<string, string>;\n\nfunction toRow(raw: Record<string, unknown> | undefined): Row | null {\n  if (!raw) return null;\n  const out: Row = {};\n  for (const [k, v] of Object.entries(raw)) out[k] = v === null || v === undefined ? \"\" : String(v);\n  return out;\n}\n\nexport class BotStore {\n  private readonly locks = new Map<string, Promise<unknown>>();\n\n  constructor(\n    private readonly botId: () => string,\n    private readonly userId: () => string,\n  ) {}\n\n  private ready(): void {\n    if (!this.botId() || !this.userId()) throw new Error(\"Storage is not available for this bot.\");\n  }\n\n  /** Runs `fn` after every earlier call for the same key has finished. */\n  async lock<T>(key: string, fn: () => Promise<T>): Promise<T> {\n    const previous = this.locks.get(key) ?? Promise.resolve();\n    const run = previous.catch(() => undefined).then(fn);\n    this.locks.set(key, run);\n    try {\n      return await run;\n    } finally {\n      if (this.locks.get(key) === run) this.locks.delete(key);\n    }\n  }\n\n  async get(table: string, field: string, value: string): Promise<Row | null> {\n    this.ready();\n    const res = await storageRequest(this.botId(), this.userId(), {\n      op: \"find\",\n      table,\n      where: { field, value },\n    });\n    if (!res.ok) throw new Error(res.error ?? \"Storage failed.\");\n    return toRow(res.rows?.[0]);\n  }\n\n  /** Updates the record whose `field` is `value`, or creates it. */\n  async put(\n    table: string,\n    field: string,\n    value: string,\n    data: Row,\n    existing?: Row | null,\n  ): Promise<void> {\n    this.ready();\n    const where = { field, value };\n    const current = existing === undefined ? await this.get(table, field, value) : existing;\n    const res = current\n      ? await storageRequest(this.botId(), this.userId(), { op: \"update\", table, where, data })\n      : await storageRequest(this.botId(), this.userId(), {\n          op: \"save\",\n          table,\n          data: { [field]: value, ...data },\n        });\n    if (!res.ok) throw new Error(res.error ?? \"Storage failed.\");\n  }\n\n  async remove(table: string, field: string, value: string): Promise<void> {\n    this.ready();\n    await storageRequest(this.botId(), this.userId(), {\n      op: \"delete\",\n      table,\n      where: { field, value },\n    });\n  }\n\n  async add(table: string, data: Row): Promise<void> {\n    this.ready();\n    const res = await storageRequest(this.botId(), this.userId(), { op: \"save\", table, data });\n    if (!res.ok) throw new Error(res.error ?? \"Storage failed.\");\n  }\n\n  async list(\n    table: string,\n    options: {\n      where?: { field: string; value: string };\n      sort?: { field: string; asc?: boolean };\n      limit?: number;\n    } = {},\n  ): Promise<Row[]> {\n    this.ready();\n    const res = await storageRequest(this.botId(), this.userId(), {\n      op: \"list\",\n      table,\n      ...options,\n    });\n    if (!res.ok) throw new Error(res.error ?? \"Storage failed.\");\n    return (res.rows ?? []).map((r) => toRow(r)!);\n  }\n\n  async count(table: string, where?: { field: string; value: string }): Promise<number> {\n    this.ready();\n    const res = await storageRequest(this.botId(), this.userId(), {\n      op: \"count\",\n      table,\n      ...(where ? { where } : {}),\n    });\n    return res.ok ? (res.count ?? 0) : 0;\n  }\n}\n","runtime/src/studio/font-list.ts":"/* AUTO-GENERATED FILE — do not edit.\n * Source: src/lib/studio/font-list.ts (web app)\n * Regenerate: npm run sync:contract (inside runtime/)\n */\n/**\n * The studios' font list, without loaders: shared by the web app and the bot\n * runtime (which registers the same fontsource files with @napi-rs/canvas,\n * see runtime/scripts/sync-studio.mjs).\n */\n\nexport interface StudioFont {\n  family: string;\n  label: string;\n  weight: number;\n  style: \"display\" | \"pixel\" | \"tech\" | \"hand\" | \"clean\";\n  /** fontsource package, e.g. \"russo-one\"; empty for a licensed font file. */\n  pkg: string;\n  /**\n   * Licensed fonts bought for Bottly: a WOFF2 in public/studio/fonts (the\n   * runtime gets a copy in runtime/fonts, see sync-studio.mjs).\n   */\n  file?: string;\n}\n\n/** A licensed font served from public/studio/fonts/<slug>.woff2. */\nconst own = (\n  family: string,\n  label: string,\n  style: StudioFont[\"style\"],\n  slug: string,\n): StudioFont => ({\n  family,\n  label,\n  weight: 400,\n  style,\n  pkg: \"\",\n  file: `/studio/fonts/${slug}.woff2`,\n});\n\nexport const STUDIO_FONTS: StudioFont[] = [\n  { family: \"Russo One\", label: \"Russo One\", weight: 400, style: \"display\", pkg: \"russo-one\" },\n  { family: \"Bungee\", label: \"Bungee\", weight: 400, style: \"display\", pkg: \"bungee\" },\n  {\n    family: \"Racing Sans One\",\n    label: \"Racing Sans\",\n    weight: 400,\n    style: \"display\",\n    pkg: \"racing-sans-one\",\n  },\n  { family: \"Anton\", label: \"Anton\", weight: 400, style: \"display\", pkg: \"anton\" },\n  { family: \"Bebas Neue\", label: \"Bebas Neue\", weight: 400, style: \"display\", pkg: \"bebas-neue\" },\n  {\n    family: \"Rubik Mono One\",\n    label: \"Rubik Mono\",\n    weight: 400,\n    style: \"display\",\n    pkg: \"rubik-mono-one\",\n  },\n  { family: \"Bangers\", label: \"Bangers\", weight: 400, style: \"display\", pkg: \"bangers\" },\n  { family: \"Righteous\", label: \"Righteous\", weight: 400, style: \"display\", pkg: \"righteous\" },\n  {\n    family: \"Black Ops One\",\n    label: \"Black Ops\",\n    weight: 400,\n    style: \"display\",\n    pkg: \"black-ops-one\",\n  },\n  {\n    family: \"Saira Stencil One\",\n    label: \"Saira Stencil\",\n    weight: 400,\n    style: \"display\",\n    pkg: \"saira-stencil-one\",\n  },\n  {\n    family: \"Press Start 2P\",\n    label: \"Press Start (pixel)\",\n    weight: 400,\n    style: \"pixel\",\n    pkg: \"press-start-2p\",\n  },\n  {\n    family: \"Silkscreen\",\n    label: \"Silkscreen (pixel)\",\n    weight: 700,\n    style: \"pixel\",\n    pkg: \"silkscreen\",\n  },\n  { family: \"Orbitron\", label: \"Orbitron\", weight: 900, style: \"tech\", pkg: \"orbitron\" },\n  { family: \"Audiowide\", label: \"Audiowide\", weight: 400, style: \"tech\", pkg: \"audiowide\" },\n  {\n    family: \"Chakra Petch\",\n    label: \"Chakra Petch\",\n    weight: 700,\n    style: \"tech\",\n    pkg: \"chakra-petch\",\n  },\n  { family: \"Teko\", label: \"Teko\", weight: 600, style: \"tech\", pkg: \"teko\" },\n  { family: \"Monoton\", label: \"Monoton (neon)\", weight: 400, style: \"tech\", pkg: \"monoton\" },\n  {\n    family: \"Permanent Marker\",\n    label: \"Permanent Marker\",\n    weight: 400,\n    style: \"hand\",\n    pkg: \"permanent-marker\",\n  },\n  { family: \"Figtree\", label: \"Figtree\", weight: 800, style: \"clean\", pkg: \"figtree\" },\n  { family: \"Outfit\", label: \"Outfit\", weight: 800, style: \"clean\", pkg: \"outfit\" },\n  own(\"Burbank Big Condensed\", \"Burbank Big Condensed\", \"display\", \"burbank-big-condensed-black\"),\n  own(\"Monument Extended\", \"Monument Extended\", \"display\", \"monument-extended-ultrabold\"),\n  own(\"Hiruko Black Alternate\", \"Hiruko Black\", \"display\", \"hiruko-black-alternate\"),\n  own(\"Americorps Bold Condensed\", \"Americorps Bold\", \"display\", \"americorps-bold-condensed\"),\n  own(\n    \"Americorps Outline Condensed\",\n    \"Americorps Outline\",\n    \"display\",\n    \"americorps-outline-condensed\",\n  ),\n  own(\"Astigma\", \"Astigma\", \"display\", \"astigma\"),\n  own(\"Vampire Wars\", \"Vampire Wars\", \"display\", \"vampire-wars\"),\n  own(\"Spiced Rum Supernova\", \"Spiced Rum Supernova\", \"hand\", \"spiced-rum-supernova\"),\n  own(\"Michroma\", \"Michroma\", \"tech\", \"michroma\"),\n  own(\"Autobahn\", \"Autobahn\", \"tech\", \"autobahn\"),\n  own(\"X-Heighting\", \"X-Heighting\", \"tech\", \"x-heighting\"),\n];\n\nconst BY_FAMILY = new Map(STUDIO_FONTS.map((f) => [f.family, f]));\n\nexport function studioFont(family: string): StudioFont {\n  return BY_FAMILY.get(family) ?? STUDIO_FONTS[0]!;\n}\n\n/**\n * \"<family> Ext\" is the latin-ext half of a font on the bot runtime, which\n * registers each fontsource subset as its own family (browsers merge them\n * through unicode-range and simply skip the unknown name). Letters a font\n * lacks (pixel fonts without \"Ł\") fall back to Figtree on both sides.\n */\nexport function fontCss(family: string, px: number): string {\n  const f = studioFont(family);\n  return `${f.weight} ${Math.max(1, px)}px \"${f.family}\", \"${f.family} Ext\", \"Figtree\", \"Figtree Ext\", sans-serif`;\n}\n","runtime/src/studio/render.ts":"/// <reference lib=\"dom\" />\n/* AUTO-GENERATED FILE — do not edit.\n * Source: src/lib/studio/render.ts (web app)\n * Regenerate: npm run sync:contract (inside runtime/)\n */\n/**\n * Canvas rendering shared by Emoji Studio and Graphics Studio. Every shape\n * (icon, text, image) is drawn first as a white mask; effects work on masks,\n * so a gradient, outline, 3D extrusion, glow, drop shadow, shine or hollow\n * \"ghost\" outline looks the same on text, icons and pictures.\n */\nimport { studioIcon } from \"./studio-icons.js\";\nimport { fontCss } from \"./font-list.js\";\n\nexport interface Paint {\n  type: \"solid\" | \"gradient\";\n  color: string;\n  color2: string;\n  /** Degrees, 90 = top to bottom. */\n  angle: number;\n}\n\nexport type Glyph =\n  | { kind: \"icon\"; id: string }\n  | { kind: \"text\"; text: string; font: string }\n  | { kind: \"image\"; src: string; tint: boolean };\n\nexport interface Effects {\n  fill: Paint;\n  /** Outline hugging the shape. */\n  stroke: { width: number; color: string } | null;\n  /** 3D depth towards `angle`. */\n  extrude: { depth: number; angle: number; color: string } | null;\n  glow: { blur: number; color: string } | null;\n  shadow: { x: number; y: number; blur: number; color: string } | null;\n  /** White sheen on the top half, 0-1. */\n  shine: number;\n  /** Hollow outline copy offset behind the shape. */\n  ghost: { x: number; y: number; width: number; color: string } | null;\n  /** A second outline around the first (a dark rim around a white sticker edge). */\n  outline2?: { width: number; color: string } | null;\n  /** Lit top edges and shaded bottom edges for a raised look, 0-1. */\n  bevel?: number;\n}\n\nexport const NO_EFFECTS: Effects = {\n  fill: { type: \"solid\", color: \"#ffffff\", color2: \"#ffffff\", angle: 90 },\n  stroke: null,\n  extrude: null,\n  glow: null,\n  shadow: null,\n  shine: 0,\n  ghost: null,\n};\n\n/* ------------------------------------------------------------------ *\n * Canvas helpers\n * ------------------------------------------------------------------ */\n\n/**\n * Where canvases, paths and pictures come from. The browser by default; the\n * bot runtime swaps in @napi-rs/canvas (runtime/src/studio-image.ts) so a\n * design renders the same on a server.\n */\nexport interface CanvasBackend {\n  createCanvas(w: number, h: number): HTMLCanvasElement;\n  path(d: string): Path2D;\n}\n\nlet backend: CanvasBackend = {\n  createCanvas: (w, h) => {\n    const c = document.createElement(\"canvas\");\n    c.width = w;\n    c.height = h;\n    return c;\n  },\n  path: (d) => new Path2D(d),\n};\n\nexport function setCanvasBackend(b: CanvasBackend): void {\n  backend = b;\n}\n\nexport function makeCanvas(w: number, h: number): HTMLCanvasElement {\n  return backend.createCanvas(Math.max(1, Math.ceil(w)), Math.max(1, Math.ceil(h)));\n}\n\nfunction ctx2d(c: HTMLCanvasElement): CanvasRenderingContext2D {\n  return c.getContext(\"2d\")!;\n}\n\nconst images = new Map<string, HTMLImageElement>();\n\n/** Loads pictures used by a design; rendering skips the ones not ready yet. */\nexport function loadImages(srcs: Iterable<string>): Promise<void> {\n  const jobs: Promise<void>[] = [];\n  for (const src of srcs) {\n    if (!src || images.has(src)) continue;\n    const img = new Image();\n    img.decoding = \"async\";\n    images.set(src, img);\n    jobs.push(\n      new Promise<void>((resolve) => {\n        img.onload = () => resolve();\n        img.onerror = () => resolve();\n        img.src = src;\n      }),\n    );\n  }\n  return Promise.all(jobs).then(() => undefined);\n}\n\n/** Hands the renderer a picture loaded elsewhere (the runtime's avatars). */\nexport function registerImage(src: string, img: HTMLImageElement): void {\n  images.set(src, img);\n  if (images.size > 200) images.delete(images.keys().next().value as string);\n}\n\nfunction image(src: string): HTMLImageElement | null {\n  const img = images.get(src);\n  return img && img.complete !== false && img.naturalWidth > 0 ? img : null;\n}\n\n/** A canvas paint for a box. */\nexport function paintStyle(\n  ctx: CanvasRenderingContext2D,\n  paint: Paint,\n  x: number,\n  y: number,\n  w: number,\n  h: number,\n): string | CanvasGradient {\n  if (paint.type === \"solid\") return paint.color;\n  const a = (paint.angle * Math.PI) / 180;\n  const cx = x + w / 2;\n  const cy = y + h / 2;\n  const r = (Math.abs(Math.cos(a)) * w + Math.abs(Math.sin(a)) * h) / 2;\n  const g = ctx.createLinearGradient(\n    cx - Math.cos(a) * r,\n    cy - Math.sin(a) * r,\n    cx + Math.cos(a) * r,\n    cy + Math.sin(a) * r,\n  );\n  g.addColorStop(0, paint.color);\n  g.addColorStop(1, paint.color2);\n  return g;\n}\n\nfunction tinted(\n  mask: HTMLCanvasElement,\n  style: string | ((c: CanvasRenderingContext2D) => string | CanvasGradient),\n) {\n  const out = makeCanvas(mask.width, mask.height);\n  const c = ctx2d(out);\n  c.drawImage(mask, 0, 0);\n  c.globalCompositeOperation = \"source-in\";\n  c.fillStyle = typeof style === \"function\" ? style(c) : style;\n  c.fillRect(0, 0, out.width, out.height);\n  return out;\n}\n\n/** The mask grown by `width` px in every direction. */\nfunction dilate(mask: HTMLCanvasElement, width: number): HTMLCanvasElement {\n  const out = makeCanvas(mask.width, mask.height);\n  const c = ctx2d(out);\n  const rings =\n    width > 6 ? [width, width * 0.66, width * 0.33] : width > 2 ? [width, width / 2] : [width];\n  for (const r of rings) {\n    const steps = Math.max(8, Math.min(32, Math.round(r * 2)));\n    for (let i = 0; i < steps; i++) {\n      const a = (i / steps) * Math.PI * 2;\n      c.drawImage(mask, Math.cos(a) * r, Math.sin(a) * r);\n    }\n  }\n  c.drawImage(mask, 0, 0);\n  return out;\n}\n\n/**\n * Draws a white mask onto ctx at (x, y) with effects. `box` is the shape's\n * own area inside the mask, used to lay out gradients.\n */\nexport function compose(\n  ctx: CanvasRenderingContext2D,\n  mask: HTMLCanvasElement,\n  x: number,\n  y: number,\n  fx: Effects,\n  box: { x: number; y: number; w: number; h: number },\n  options: { raw?: HTMLCanvasElement | null; bevelSize?: number } = {},\n): void {\n  const strokeW = fx.stroke && fx.stroke.width > 0 ? fx.stroke.width : 0;\n  const rim = fx.outline2 && fx.outline2.width > 0 ? fx.outline2 : null;\n  const inner = strokeW ? dilate(mask, strokeW) : mask;\n  // The outer silhouette: shadows and 3D depth follow the outermost outline.\n  const base = rim ? dilate(mask, strokeW + rim.width) : inner;\n\n  // Shadows work in device pixels: scale them with the current transform.\n  const t = ctx.getTransform();\n  const k = Math.hypot(t.a, t.b) || 1;\n\n  if (fx.shadow) {\n    ctx.save();\n    ctx.shadowColor = fx.shadow.color;\n    ctx.shadowBlur = fx.shadow.blur * k;\n    // Draw far off-canvas so only the shadow lands on it.\n    const far = 100000;\n    ctx.setTransform(t.a, t.b, t.c, t.d, t.e - far, t.f);\n    ctx.shadowOffsetX = far + t.a * fx.shadow.x + t.c * fx.shadow.y;\n    ctx.shadowOffsetY = t.b * fx.shadow.x + t.d * fx.shadow.y;\n    ctx.drawImage(tinted(base, \"#000\"), x, y);\n    ctx.restore();\n  }\n\n  if (fx.ghost && fx.ghost.width > 0) {\n    const grown = dilate(mask, fx.ghost.width);\n    const ring = ctx2d(grown);\n    ring.globalCompositeOperation = \"destination-out\";\n    ring.drawImage(mask, 0, 0);\n    ctx.drawImage(tinted(grown, fx.ghost.color), x + fx.ghost.x, y + fx.ghost.y);\n  }\n\n  if (fx.extrude && fx.extrude.depth > 0) {\n    const side = tinted(base, fx.extrude.color);\n    const a = (fx.extrude.angle * Math.PI) / 180;\n    const steps = Math.ceil(fx.extrude.depth);\n    for (let i = steps; i >= 1; i--) ctx.drawImage(side, x + Math.cos(a) * i, y + Math.sin(a) * i);\n  }\n\n  if (rim) ctx.drawImage(tinted(base, rim.color), x, y);\n  if (fx.stroke && strokeW) ctx.drawImage(tinted(inner, fx.stroke.color), x, y);\n\n  let face = options.raw ?? tinted(mask, (c) => paintStyle(c, fx.fill, box.x, box.y, box.w, box.h));\n  if (fx.bevel && fx.bevel > 0)\n    face = beveled(face, mask, options.bevelSize ?? Math.min(box.w, box.h), fx.bevel);\n  if (fx.shine > 0) {\n    const shiny = makeCanvas(face.width, face.height);\n    const s = ctx2d(shiny);\n    s.drawImage(face, 0, 0);\n    s.globalCompositeOperation = \"source-atop\";\n    const g = s.createLinearGradient(0, box.y, 0, box.y + box.h);\n    g.addColorStop(0, `rgba(255,255,255,${0.55 * fx.shine})`);\n    g.addColorStop(0.48, `rgba(255,255,255,${0.12 * fx.shine})`);\n    g.addColorStop(0.5, \"rgba(255,255,255,0)\");\n    g.addColorStop(1, \"rgba(0,0,0,0)\");\n    s.fillStyle = g;\n    s.fillRect(0, 0, shiny.width, shiny.height);\n    face = shiny;\n  }\n\n  ctx.save();\n  if (fx.glow && fx.glow.blur > 0) {\n    ctx.shadowColor = fx.glow.color;\n    ctx.shadowBlur = fx.glow.blur * k;\n  }\n  ctx.drawImage(face, x, y);\n  if (fx.glow && fx.glow.blur > 0) ctx.drawImage(face, x, y);\n  ctx.restore();\n}\n\n/**\n * The face with light on its top edges and shade on its bottom edges, like a\n * raised letter. Each band is the mask minus itself shifted down (or up),\n * built up in many thin steps so it fades smoothly into the face.\n * `size` is the shape's own scale (a text layer's font size).\n */\nfunction beveled(\n  face: HTMLCanvasElement,\n  mask: HTMLCanvasElement,\n  size: number,\n  amount: number,\n): HTMLCanvasElement {\n  const out = makeCanvas(face.width, face.height);\n  const c = ctx2d(out);\n  c.drawImage(face, 0, 0);\n  const depth = Math.max(1, size * 0.035);\n  const steps = Math.max(2, Math.min(10, Math.round(depth)));\n  const band = (dy: number) => {\n    const e = makeCanvas(mask.width, mask.height);\n    const ec = ctx2d(e);\n    ec.drawImage(mask, 0, 0);\n    ec.globalCompositeOperation = \"destination-out\";\n    ec.drawImage(mask, 0, dy);\n    return e;\n  };\n  const light = makeCanvas(mask.width, mask.height);\n  const shade = makeCanvas(mask.width, mask.height);\n  const lc = ctx2d(light);\n  const sc = ctx2d(shade);\n  // Bands of growing depth stacked at equal strength: strongest at the edge, fading inwards.\n  lc.globalAlpha = 1 / steps;\n  sc.globalAlpha = 1 / steps;\n  for (let i = 1; i <= steps; i++) {\n    const d = (depth * i) / steps;\n    lc.drawImage(band(d), 0, 0);\n    sc.drawImage(band(-d), 0, 0);\n  }\n  c.globalCompositeOperation = \"source-atop\";\n  c.globalAlpha = Math.min(1, 0.55 * amount);\n  c.drawImage(tinted(light, \"#ffffff\"), 0, 0);\n  c.globalAlpha = Math.min(1, 0.4 * amount);\n  c.drawImage(tinted(shade, \"#000000\"), 0, 0);\n  return out;\n}\n\n/** Margin a mask needs around its shape for these effects. */\nexport function effectsMargin(fx: Effects): number {\n  return Math.ceil(\n    (fx.stroke?.width ?? 0) +\n      (fx.outline2?.width ?? 0) +\n      (fx.ghost ? fx.ghost.width + Math.hypot(fx.ghost.x, fx.ghost.y) : 0) +\n      2,\n  );\n}\n\n/* ------------------------------------------------------------------ *\n * Glyph masks\n * ------------------------------------------------------------------ */\n\nexport interface GlyphOptions {\n  /** Line width of line icons on the 24px grid. */\n  lineWidth: number;\n  /** Fill line icons as well as stroking them. */\n  solid: boolean;\n}\n\n/** Draws a glyph in white, centred in a size×size box at (cx, cy). */\nexport function drawGlyphMask(\n  c: CanvasRenderingContext2D,\n  glyph: Glyph,\n  cx: number,\n  cy: number,\n  size: number,\n  opts: GlyphOptions,\n): void {\n  c.save();\n  c.fillStyle = \"#fff\";\n  c.strokeStyle = \"#fff\";\n  if (glyph.kind === \"icon\") {\n    const icon = studioIcon(glyph.id);\n    if (icon) {\n      const s = size / 24;\n      c.translate(cx - size / 2, cy - size / 2);\n      c.scale(s, s);\n      c.lineCap = \"round\";\n      c.lineJoin = \"round\";\n      if (icon.set !== \"line\") {\n        // Solid, duotone and brand icons are drawn filled; the duotone light layer see-through.\n        const faded = new Set(icon.faded ?? []);\n        icon.paths.forEach((d, i) => {\n          c.globalAlpha = faded.has(i) ? 0.35 : 1;\n          c.fill(backend.path(d));\n        });\n        c.globalAlpha = 1;\n      } else {\n        const inner = new Set(opts.solid ? (icon.inner ?? []) : []);\n        const open = new Set(icon.open ?? []);\n        c.lineWidth = opts.lineWidth;\n        icon.paths.forEach((d, i) => {\n          if (inner.has(i)) return;\n          const p = backend.path(d);\n          if (opts.solid && !open.has(i)) c.fill(p, \"nonzero\");\n          c.stroke(p);\n        });\n        // Filled icons keep their details as cut-outs (the \"i\" of info, clock hands…).\n        if (inner.size > 0) {\n          c.globalCompositeOperation = \"destination-out\";\n          c.lineWidth = opts.lineWidth;\n          for (const i of inner) c.stroke(backend.path(icon.paths[i]!));\n          c.globalCompositeOperation = \"source-over\";\n          // The cut-outs end at the outline instead of nicking through it.\n          c.lineWidth = opts.lineWidth;\n          icon.paths.forEach((d, i) => {\n            if (!inner.has(i) && !open.has(i)) c.stroke(backend.path(d));\n          });\n        }\n      }\n    }\n  } else if (glyph.kind === \"text\") {\n    const text = glyph.text || \"?\";\n    let px = size;\n    c.font = fontCss(glyph.font, px);\n    const m = c.measureText(text);\n    const w = m.width;\n    const h = (m.actualBoundingBoxAscent || px * 0.7) + (m.actualBoundingBoxDescent || 0);\n    const fit = Math.min(size / Math.max(1, w), size / Math.max(1, h), 1.6);\n    px *= fit;\n    c.font = fontCss(glyph.font, px);\n    const m2 = c.measureText(text);\n    const asc = m2.actualBoundingBoxAscent || px * 0.7;\n    const desc = m2.actualBoundingBoxDescent || 0;\n    c.textAlign = \"center\";\n    c.textBaseline = \"alphabetic\";\n    c.fillText(text, cx, cy + (asc - desc) / 2);\n  } else {\n    const img = image(glyph.src);\n    if (img) {\n      const r = Math.min(size / img.naturalWidth, size / img.naturalHeight);\n      const w = img.naturalWidth * r;\n      const h = img.naturalHeight * r;\n      c.drawImage(img, cx - w / 2, cy - h / 2, w, h);\n    }\n  }\n  c.restore();\n}\n\n/** The glyph's own colours (an untinted picture), or null. */\nfunction glyphRaw(\n  glyph: Glyph,\n  w: number,\n  h: number,\n  cx: number,\n  cy: number,\n  size: number,\n): HTMLCanvasElement | null {\n  if (glyph.kind !== \"image\" || glyph.tint) return null;\n  const img = image(glyph.src);\n  if (!img) return null;\n  const out = makeCanvas(w, h);\n  const r = Math.min(size / img.naturalWidth, size / img.naturalHeight);\n  const iw = img.naturalWidth * r;\n  const ih = img.naturalHeight * r;\n  ctx2d(out).drawImage(img, cx - iw / 2, cy - ih / 2, iw, ih);\n  return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Emoji\n * ------------------------------------------------------------------ */\n\nexport type TileStyle =\n  \"none\" | \"tile\" | \"outline\" | \"tinted\" | \"solid\" | \"circle\" | \"ring\" | \"bracket\" | \"framed\";\n\nexport type EmojiTexture = \"none\" | \"silver\" | \"gold\" | \"rose-gold\" | \"bronze\" | \"chrome\" | \"holo\";\n\n/**\n * Metal finishes for emoji: a light-to-dark fill with a bevel and shine, so\n * the glyph (and the frame of a \"framed\" tile) reads as polished metal.\n */\nexport const EMOJI_TEXTURES: Record<\n  Exclude<EmojiTexture, \"none\">,\n  { name: string; fill: Paint; rim: Paint; bevel: number; shine: number }\n> = {\n  silver: {\n    name: \"Silver\",\n    fill: { type: \"gradient\", color: \"#FFFFFF\", color2: \"#A6A9B2\", angle: 90 },\n    rim: { type: \"gradient\", color: \"#F4F5F7\", color2: \"#8D9099\", angle: 90 },\n    bevel: 0.55,\n    shine: 0.55,\n  },\n  gold: {\n    name: \"Gold\",\n    fill: { type: \"gradient\", color: \"#FFF4C2\", color2: \"#C08A1A\", angle: 90 },\n    rim: { type: \"gradient\", color: \"#FFE9A0\", color2: \"#9C6B0E\", angle: 90 },\n    bevel: 0.6,\n    shine: 0.55,\n  },\n  \"rose-gold\": {\n    name: \"Rose gold\",\n    fill: { type: \"gradient\", color: \"#FFE6DC\", color2: \"#C27766\", angle: 90 },\n    rim: { type: \"gradient\", color: \"#FBD5C8\", color2: \"#A55E50\", angle: 90 },\n    bevel: 0.55,\n    shine: 0.5,\n  },\n  bronze: {\n    name: \"Bronze\",\n    fill: { type: \"gradient\", color: \"#F7CBA0\", color2: \"#8A4B1F\", angle: 90 },\n    rim: { type: \"gradient\", color: \"#E8B588\", color2: \"#6E3A16\", angle: 90 },\n    bevel: 0.6,\n    shine: 0.45,\n  },\n  chrome: {\n    name: \"Chrome\",\n    fill: { type: \"gradient\", color: \"#FFFFFF\", color2: \"#4E5462\", angle: 90 },\n    rim: { type: \"gradient\", color: \"#FFFFFF\", color2: \"#5B6170\", angle: 90 },\n    bevel: 0.85,\n    shine: 0.75,\n  },\n  holo: {\n    name: \"Holo\",\n    fill: { type: \"gradient\", color: \"#B8F6FF\", color2: \"#E9B4FF\", angle: 135 },\n    rim: { type: \"gradient\", color: \"#C9FFF4\", color2: \"#D6B8FF\", angle: 135 },\n    bevel: 0.4,\n    shine: 0.6,\n  },\n};\n\nexport interface EmojiStyle {\n  tile: TileStyle;\n  tileColor: string;\n  accent: Paint;\n  /** Glyph colour on solid / circle tiles. */\n  glyphOnSolid: string;\n  lineWidth: number;\n  solid: boolean;\n  /** Glyph size, 0.3-1 of the emoji. */\n  size: number;\n  glow: number;\n  shadow: boolean;\n  outline: number;\n  outlineColor: string;\n  shine: number;\n  rotation: number;\n  /** Tile corner radius, 0-0.5 of the size. */\n  radius: number;\n  /** Brand logos in their own colour instead of the accent. */\n  brandColors: boolean;\n  /** Metal finish of the glyph and of a framed tile's border (older packs: none). */\n  texture?: EmojiTexture;\n}\n\nexport const DEFAULT_EMOJI_STYLE: EmojiStyle = {\n  tile: \"none\",\n  tileColor: \"#1c1f24\",\n  accent: { type: \"gradient\", color: \"#5EF2B5\", color2: \"#0E9F6E\", angle: 90 },\n  glyphOnSolid: \"#ffffff\",\n  lineWidth: 2.4,\n  solid: true,\n  size: 0.78,\n  glow: 0.25,\n  shadow: true,\n  outline: 0,\n  outlineColor: \"#0b0d10\",\n  shine: 0.35,\n  rotation: 0,\n  radius: 0.26,\n  brandColors: false,\n};\n\nfunction roundRect(\n  c: CanvasRenderingContext2D,\n  x: number,\n  y: number,\n  w: number,\n  h: number,\n  r: number,\n) {\n  c.beginPath();\n  c.roundRect(x, y, w, h, Math.max(0, Math.min(r, w / 2, h / 2)));\n}\n\nfunction alpha(hex: string, a: number): string {\n  const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n  if (!m) return hex;\n  const n = Number.parseInt(m[1]!, 16);\n  return `rgba(${(n >> 16) & 255},${(n >> 8) & 255},${n & 255},${a})`;\n}\n\nfunction shade(hex: string, amount: number): string {\n  const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n  if (!m) return hex;\n  const n = Number.parseInt(m[1]!, 16);\n  const f = (v: number) =>\n    Math.max(0, Math.min(255, Math.round(amount < 0 ? v * (1 + amount) : v + (255 - v) * amount)));\n  return `#${[(n >> 16) & 255, (n >> 8) & 255, n & 255].map((v) => f(v).toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nexport { alpha as withAlpha, shade as shadeColor };\n\n/** Draws one emoji filling a size×size canvas context. */\nexport function renderEmoji(\n  ctx: CanvasRenderingContext2D,\n  size: number,\n  glyph: Glyph,\n  s: EmojiStyle,\n): void {\n  ctx.clearRect(0, 0, size, size);\n  const pad = size * 0.04;\n  const tileBox = { x: pad, y: pad, w: size - pad * 2, h: size - pad * 2 };\n  const accentFill = (c: CanvasRenderingContext2D) =>\n    paintStyle(c, s.accent, tileBox.x, tileBox.y, tileBox.w, tileBox.h);\n  const round = s.tile === \"circle\" || s.tile === \"ring\";\n  const metal = s.texture && s.texture !== \"none\" ? EMOJI_TEXTURES[s.texture] : null;\n  const radius = round ? tileBox.w / 2 : tileBox.w * s.radius;\n\n  // Bracket: two rounded corners of an outline (top left, bottom right), as on role badges.\n  if (s.tile === \"bracket\") {\n    const { x, y, w, h } = tileBox;\n    const r = Math.max(w * s.radius, w * 0.12);\n    const lw = size * 0.065;\n    const inset = lw / 2;\n    const reach = 0.58;\n    ctx.save();\n    ctx.lineWidth = lw;\n    ctx.lineCap = \"round\";\n    ctx.lineJoin = \"round\";\n    ctx.strokeStyle = accentFill(ctx);\n    if (s.glow > 0) {\n      ctx.shadowColor = alpha(s.accent.color, 0.55);\n      ctx.shadowBlur = size * 0.08 * s.glow;\n    }\n    const x0 = x + inset;\n    const y0 = y + inset;\n    const x1 = x + w - inset;\n    const y1 = y + h - inset;\n    ctx.beginPath();\n    ctx.moveTo(x0 + w * reach, y0);\n    ctx.arcTo(x0, y0, x0, y1, r);\n    ctx.lineTo(x0, y0 + h * reach);\n    ctx.moveTo(x1 - w * reach, y1);\n    ctx.arcTo(x1, y1, x1, y0, r);\n    ctx.lineTo(x1, y1 - h * reach);\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  // Tile\n  if (s.tile !== \"none\" && s.tile !== \"bracket\") {\n    ctx.save();\n    if (s.tile === \"outline\" || s.tile === \"ring\") {\n      ctx.shadowColor = alpha(s.accent.color, 0.55);\n      ctx.shadowBlur = size * 0.08 * Math.max(0.3, s.glow);\n    }\n    roundRect(ctx, tileBox.x, tileBox.y, tileBox.w, tileBox.h, radius);\n    if (s.tile === \"solid\" || s.tile === \"circle\") ctx.fillStyle = accentFill(ctx);\n    else {\n      const g = ctx.createLinearGradient(0, tileBox.y, 0, tileBox.y + tileBox.h);\n      g.addColorStop(0, shade(s.tileColor, 0.08));\n      g.addColorStop(1, shade(s.tileColor, -0.25));\n      ctx.fillStyle = g;\n    }\n    ctx.fill();\n    ctx.restore();\n    ctx.save();\n    roundRect(ctx, tileBox.x, tileBox.y, tileBox.w, tileBox.h, radius);\n    ctx.clip();\n    if (s.tile === \"tinted\") {\n      ctx.fillStyle = alpha(s.accent.color2, 0.28);\n      ctx.fillRect(0, 0, size, size);\n    }\n    // soft top light\n    const light = ctx.createRadialGradient(size * 0.3, 0, 0, size * 0.3, 0, size * 0.9);\n    light.addColorStop(0, \"rgba(255,255,255,0.10)\");\n    light.addColorStop(1, \"rgba(255,255,255,0)\");\n    ctx.fillStyle = light;\n    ctx.fillRect(0, 0, size, size);\n    ctx.restore();\n    ctx.save();\n    if (s.tile === \"framed\") {\n      // A thick light frame (metal when a texture is on), inset so it stays inside.\n      const lw = Math.max(1.5, size * 0.045);\n      roundRect(\n        ctx,\n        tileBox.x + lw / 2,\n        tileBox.y + lw / 2,\n        tileBox.w - lw,\n        tileBox.h - lw,\n        Math.max(0, radius - lw / 2),\n      );\n      ctx.lineWidth = lw;\n      ctx.strokeStyle = paintStyle(\n        ctx,\n        metal?.rim ?? { type: \"gradient\", color: \"#F2F3F5\", color2: \"#A3A6AD\", angle: 90 },\n        tileBox.x,\n        tileBox.y,\n        tileBox.w,\n        tileBox.h,\n      );\n      ctx.stroke();\n      ctx.restore();\n    } else {\n      roundRect(ctx, tileBox.x + 0.5, tileBox.y + 0.5, tileBox.w - 1, tileBox.h - 1, radius);\n      ctx.lineWidth = Math.max(\n        1,\n        size * (s.tile === \"outline\" || s.tile === \"ring\" ? 0.035 : 0.012),\n      );\n      ctx.strokeStyle =\n        s.tile === \"outline\" || s.tile === \"ring\"\n          ? accentFill(ctx)\n          : s.tile === \"tinted\"\n            ? alpha(s.accent.color, 0.6)\n            : \"rgba(255,255,255,0.08)\";\n      ctx.stroke();\n      ctx.restore();\n    }\n  }\n\n  // Glyph\n  const glyphSize =\n    (s.tile === \"none\" ? size : s.tile === \"bracket\" ? tileBox.w * 0.52 : tileBox.w * 0.8) * s.size;\n  const mask = makeCanvas(size, size);\n  const m = ctx2d(mask);\n  m.translate(size / 2, size / 2);\n  m.rotate((s.rotation * Math.PI) / 180);\n  m.translate(-size / 2, -size / 2);\n  drawGlyphMask(m, glyph, size / 2, size / 2, glyphSize, {\n    lineWidth: s.lineWidth,\n    solid: s.solid,\n  });\n  const onSolid = s.tile === \"solid\" || s.tile === \"circle\";\n  const brand = glyph.kind === \"icon\" ? studioIcon(glyph.id) : undefined;\n  const fill: Paint = onSolid\n    ? { type: \"solid\", color: s.glyphOnSolid, color2: s.glyphOnSolid, angle: 90 }\n    : s.brandColors && brand?.color\n      ? { type: \"solid\", color: brand.color, color2: brand.color, angle: 90 }\n      : (metal?.fill ?? s.accent);\n  const box = { x: (size - glyphSize) / 2, y: (size - glyphSize) / 2, w: glyphSize, h: glyphSize };\n  compose(\n    ctx,\n    mask,\n    0,\n    0,\n    {\n      fill,\n      stroke: s.outline > 0 ? { width: (s.outline * size) / 64, color: s.outlineColor } : null,\n      extrude: null,\n      glow:\n        s.glow > 0\n          ? {\n              blur: size * 0.12 * s.glow,\n              color: alpha(onSolid ? \"#000000\" : fill.color, onSolid ? 0.35 : 0.85),\n            }\n          : null,\n      shadow: s.shadow\n        ? { x: 0, y: size * 0.025, blur: size * 0.04, color: \"rgba(0,0,0,0.45)\" }\n        : null,\n      shine: metal ? Math.max(s.shine, metal.shine) : s.shine,\n      ghost: null,\n      ...(metal && !onSolid ? { bevel: metal.bevel } : {}),\n    },\n    box,\n    {\n      raw: glyphRaw(glyph, size, size, size / 2, size / 2, glyphSize),\n      ...(metal && !onSolid ? { bevelSize: glyphSize } : {}),\n    },\n  );\n}\n\n/* ------------------------------------------------------------------ *\n * Graphics designs\n * ------------------------------------------------------------------ */\n\nexport type PatternType =\n  | \"none\"\n  | \"grid\"\n  | \"dots\"\n  | \"bricks\"\n  | \"stripes\"\n  | \"noise\"\n  | \"pixels\"\n  | \"scanlines\"\n  | \"halftone\"\n  | \"stars\"\n  | \"hexagons\"\n  | \"topo\"\n  | \"perspective\"\n  | \"rays\"\n  | \"bokeh\"\n  | \"waves\";\n\nexport interface Light {\n  x: number;\n  y: number;\n  r: number;\n  color: string;\n  alpha: number;\n}\n\nexport interface Background {\n  paint: Paint;\n  image: { src: string; opacity: number; blur: number } | null;\n  lights: Light[];\n  pattern: { type: PatternType; color: string; opacity: number; scale: number };\n  vignette: number;\n}\n\ninterface LayerBase {\n  id: string;\n  name: string;\n  /** Centre, in design pixels. */\n  x: number;\n  y: number;\n  rotation: number;\n  opacity: number;\n  visible: boolean;\n  /** Mirrored left-right / upside down. */\n  flipX?: boolean;\n  flipY?: boolean;\n  /** How the layer mixes with what is under it (canvas composite operation). */\n  blend?: BlendMode;\n  /** Locked layers cannot be picked or dragged on the canvas. */\n  locked?: boolean;\n}\n\nexport const BLEND_MODES = [\n  \"normal\",\n  \"multiply\",\n  \"screen\",\n  \"overlay\",\n  \"darken\",\n  \"lighten\",\n  \"color-dodge\",\n  \"soft-light\",\n  \"difference\",\n  \"hue\",\n  \"color\",\n] as const;\nexport type BlendMode = (typeof BLEND_MODES)[number];\n\n/** Photo adjustments of an image layer (1 = unchanged, 0 for the rest). */\nexport interface ImageFilters {\n  brightness: number;\n  contrast: number;\n  saturate: number;\n  /** Degrees. */\n  hue: number;\n  grayscale: number;\n  sepia: number;\n  /** Pixels. */\n  blur: number;\n}\n\nexport const NO_FILTERS: ImageFilters = {\n  brightness: 1,\n  contrast: 1,\n  saturate: 1,\n  hue: 0,\n  grayscale: 0,\n  sepia: 0,\n  blur: 0,\n};\n\n/** CSS filter string, or \"none\" when nothing changes. */\nexport function filterCss(f: Partial<ImageFilters> | undefined): string {\n  if (!f) return \"none\";\n  const v = { ...NO_FILTERS, ...f };\n  const parts: string[] = [];\n  if (v.brightness !== 1) parts.push(`brightness(${v.brightness})`);\n  if (v.contrast !== 1) parts.push(`contrast(${v.contrast})`);\n  if (v.saturate !== 1) parts.push(`saturate(${v.saturate})`);\n  if (v.hue !== 0) parts.push(`hue-rotate(${v.hue}deg)`);\n  if (v.grayscale !== 0) parts.push(`grayscale(${v.grayscale})`);\n  if (v.sepia !== 0) parts.push(`sepia(${v.sepia})`);\n  if (v.blur !== 0) parts.push(`blur(${v.blur}px)`);\n  return parts.length ? parts.join(\" \") : \"none\";\n}\n\nexport interface TextLayer extends LayerBase {\n  type: \"text\";\n  text: string;\n  font: string;\n  size: number;\n  letterSpacing: number;\n  lineHeight: number;\n  /** Italic slant, -0.5..0.5. */\n  skew: number;\n  uppercase: boolean;\n  align: \"left\" | \"center\" | \"right\";\n  /** Wider text is drawn smaller to fit (templates set it so names never spill out). */\n  maxWidth?: number;\n  fx: Effects;\n}\n\nexport interface IconLayer extends LayerBase {\n  type: \"icon\";\n  glyph: Glyph;\n  size: number;\n  lineWidth: number;\n  solid: boolean;\n  fx: Effects;\n}\n\nexport interface ImageLayer extends LayerBase {\n  type: \"image\";\n  src: string;\n  width: number;\n  height: number;\n  radius: number;\n  filters?: Partial<ImageFilters>;\n  fx: Effects;\n}\n\nexport interface ShapeLayer extends LayerBase {\n  type: \"shape\";\n  shape:\n    | \"rect\"\n    | \"circle\"\n    | \"tape\"\n    | \"line\"\n    | \"sparkle\"\n    | \"triangle\"\n    | \"star\"\n    | \"hexagon\"\n    | \"heart\"\n    | \"ring\"\n    | \"arrow\";\n  width: number;\n  height: number;\n  radius: number;\n  paint: Paint;\n  /** Tape: the stripe colour and its text. */\n  color2: string;\n  label: string;\n  fx: Effects;\n}\n\nexport type Layer = TextLayer | IconLayer | ImageLayer | ShapeLayer;\n\nexport interface Design {\n  version: 1;\n  format: string;\n  width: number;\n  height: number;\n  background: Background;\n  layers: Layer[];\n}\n\nexport type Watermark = \"banner\" | \"subtle\" | null;\n\nexport interface LayerBox {\n  id: string;\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\nfunction seeded(seed: number) {\n  let s = seed >>> 0 || 1;\n  return () => {\n    s ^= s << 13;\n    s ^= s >>> 17;\n    s ^= s << 5;\n    return ((s >>> 0) % 100000) / 100000;\n  };\n}\n\nfunction drawPattern(ctx: CanvasRenderingContext2D, d: Design): void {\n  const p = d.background.pattern;\n  if (p.type === \"none\" || p.opacity <= 0) return;\n  const { width: W, height: H } = d;\n  const unit = Math.max(4, (Math.min(W, H) / 18) * p.scale);\n  const rand = seeded(W * 31 + H);\n  ctx.save();\n  ctx.globalAlpha = p.opacity;\n  ctx.fillStyle = p.color;\n  ctx.strokeStyle = p.color;\n  switch (p.type) {\n    case \"grid\": {\n      ctx.lineWidth = Math.max(1, unit / 40);\n      ctx.beginPath();\n      for (let x = 0; x <= W; x += unit) {\n        ctx.moveTo(x, 0);\n        ctx.lineTo(x, H);\n      }\n      for (let y = 0; y <= H; y += unit) {\n        ctx.moveTo(0, y);\n        ctx.lineTo(W, y);\n      }\n      ctx.stroke();\n      ctx.globalAlpha = p.opacity * 0.5;\n      ctx.lineWidth = Math.max(0.5, unit / 90);\n      ctx.beginPath();\n      for (let x = 0; x <= W; x += unit / 4) {\n        ctx.moveTo(x, 0);\n        ctx.lineTo(x, H);\n      }\n      for (let y = 0; y <= H; y += unit / 4) {\n        ctx.moveTo(0, y);\n        ctx.lineTo(W, y);\n      }\n      ctx.stroke();\n      break;\n    }\n    case \"dots\": {\n      const r = Math.max(1, unit / 14);\n      for (let y = unit / 2; y < H; y += unit / 2)\n        for (let x = unit / 2; x < W; x += unit / 2) {\n          ctx.beginPath();\n          ctx.arc(x, y, r, 0, Math.PI * 2);\n          ctx.fill();\n        }\n      break;\n    }\n    case \"bricks\": {\n      const bh = unit * 0.7;\n      const bw = unit * 1.6;\n      const gap = Math.max(1, unit / 14);\n      for (let row = 0, y = 0; y < H; row++, y += bh) {\n        const off = row % 2 ? bw / 2 : 0;\n        for (let x = -off; x < W; x += bw) {\n          ctx.globalAlpha = p.opacity * (0.35 + rand() * 0.65);\n          ctx.fillRect(x + gap / 2, y + gap / 2, bw - gap, bh - gap);\n        }\n      }\n      break;\n    }\n    case \"stripes\": {\n      ctx.lineWidth = unit / 3;\n      ctx.beginPath();\n      for (let x = -H; x < W + H; x += unit) {\n        ctx.moveTo(x, 0);\n        ctx.lineTo(x + H, H);\n      }\n      ctx.stroke();\n      break;\n    }\n    case \"noise\": {\n      const n = Math.round((W * H) / 220);\n      const s = Math.max(1, Math.round(Math.min(W, H) / 500));\n      for (let i = 0; i < n; i++) {\n        ctx.globalAlpha = p.opacity * rand();\n        ctx.fillRect(rand() * W, rand() * H, s, s);\n      }\n      break;\n    }\n    case \"pixels\": {\n      const s = unit / 2;\n      for (let y = 0; y < H; y += s)\n        for (let x = 0; x < W; x += s) {\n          const v = rand();\n          if (v < 0.45) continue;\n          ctx.globalAlpha = p.opacity * (v - 0.4);\n          ctx.fillRect(x, y, s - 1, s - 1);\n        }\n      break;\n    }\n    case \"scanlines\": {\n      const s = Math.max(2, unit / 6);\n      for (let y = 0; y < H; y += s * 2) ctx.fillRect(0, y, W, s * 0.6);\n      break;\n    }\n    case \"halftone\": {\n      const s = unit / 2;\n      for (let y = 0; y < H; y += s)\n        for (let x = (y / s) % 2 ? s / 2 : 0; x < W; x += s) {\n          const r = (s / 2) * (0.15 + 0.85 * (x / W));\n          ctx.beginPath();\n          ctx.arc(x, y, r * 0.8, 0, Math.PI * 2);\n          ctx.fill();\n        }\n      break;\n    }\n    case \"stars\": {\n      const n = Math.round((W * H) / (unit * unit * 1.5));\n      for (let i = 0; i < n; i++) {\n        const x = rand() * W;\n        const y = rand() * H;\n        const r = unit * (0.06 + rand() * 0.16);\n        ctx.globalAlpha = p.opacity * (0.3 + rand() * 0.7);\n        sparkle(ctx, x, y, r);\n      }\n      break;\n    }\n    case \"topo\":\n      drawTopo(ctx, W, H, unit, rand);\n      break;\n    case \"perspective\": {\n      // A floor grid running to the horizon, fading as it goes.\n      const horizon = H * 0.52;\n      const vx = W / 2;\n      ctx.lineWidth = Math.max(1, unit / 26);\n      for (let i = 1; i <= 18; i++) {\n        const t = i / 18;\n        const y = horizon + (H - horizon) * t * t;\n        ctx.globalAlpha = p.opacity * (0.2 + 0.8 * t);\n        ctx.beginPath();\n        ctx.moveTo(0, y);\n        ctx.lineTo(W, y);\n        ctx.stroke();\n      }\n      ctx.globalAlpha = p.opacity;\n      const spread = W * 2.4;\n      for (let i = -14; i <= 14; i++) {\n        ctx.beginPath();\n        ctx.moveTo(vx, horizon);\n        ctx.lineTo(vx + (i / 14) * spread, H);\n        ctx.stroke();\n      }\n      ctx.globalAlpha = p.opacity * 0.6;\n      ctx.fillRect(0, horizon - ctx.lineWidth, W, ctx.lineWidth * 2);\n      break;\n    }\n    case \"rays\": {\n      const cx = W / 2;\n      const cy = H * 0.45;\n      const n = Math.max(8, Math.round(22 * p.scale));\n      const r = Math.hypot(W, H);\n      for (let i = 0; i < n; i++) {\n        const a0 = (i / n) * Math.PI * 2;\n        const a1 = a0 + (Math.PI / n) * 0.9;\n        ctx.globalAlpha = p.opacity * (0.55 + 0.45 * rand());\n        ctx.beginPath();\n        ctx.moveTo(cx, cy);\n        ctx.lineTo(cx + Math.cos(a0) * r, cy + Math.sin(a0) * r);\n        ctx.lineTo(cx + Math.cos(a1) * r, cy + Math.sin(a1) * r);\n        ctx.closePath();\n        ctx.fill();\n      }\n      break;\n    }\n    case \"bokeh\": {\n      const n = Math.round((W * H) / (unit * unit * 6)) + 6;\n      for (let i = 0; i < n; i++) {\n        const x = rand() * W;\n        const y = rand() * H;\n        const r = unit * (0.25 + rand() * rand() * 1.6);\n        const g = ctx.createRadialGradient(x, y, 0, x, y, r);\n        g.addColorStop(0, alpha(p.color, 0.9));\n        g.addColorStop(0.7, alpha(p.color, 0.5));\n        g.addColorStop(1, alpha(p.color, 0));\n        ctx.globalAlpha = p.opacity * (0.25 + rand() * 0.75);\n        ctx.fillStyle = g;\n        ctx.beginPath();\n        ctx.arc(x, y, r, 0, Math.PI * 2);\n        ctx.fill();\n      }\n      break;\n    }\n    case \"waves\": {\n      ctx.lineWidth = Math.max(1, unit / 22);\n      const amp = unit * 0.35;\n      const len = unit * 2.2;\n      for (let y = -amp; y < H + amp; y += unit * 0.55) {\n        const phase = rand() * Math.PI * 2;\n        ctx.globalAlpha = p.opacity * (0.4 + 0.6 * rand());\n        ctx.beginPath();\n        for (let x = 0; x <= W; x += Math.max(2, unit / 8)) {\n          const yy = y + Math.sin((x / len) * Math.PI * 2 + phase) * amp;\n          if (x === 0) ctx.moveTo(x, yy);\n          else ctx.lineTo(x, yy);\n        }\n        ctx.stroke();\n      }\n      break;\n    }\n    case \"hexagons\": {\n      const r = unit / 2;\n      const h = Math.sqrt(3) * r;\n      ctx.lineWidth = Math.max(1, unit / 30);\n      for (let row = 0, y = 0; y < H + h; row++, y += h / 2)\n        for (let x = row % 2 ? r * 1.5 : 0; x < W + r; x += r * 3) {\n          ctx.beginPath();\n          for (let i = 0; i < 6; i++) {\n            const a = (Math.PI / 3) * i;\n            ctx.lineTo(x + Math.cos(a) * r, y + Math.sin(a) * r);\n          }\n          ctx.closePath();\n          ctx.stroke();\n        }\n      break;\n    }\n  }\n  ctx.restore();\n}\n\n/** Contour lines of a smooth wavy field (a topographic map), by marching squares. */\nfunction drawTopo(\n  ctx: CanvasRenderingContext2D,\n  W: number,\n  H: number,\n  unit: number,\n  rand: () => number,\n) {\n  const waves = Array.from({ length: 5 }, () => ({\n    a: (rand() - 0.5) * 2.2,\n    b: (rand() - 0.5) * 2.2,\n    p: rand() * Math.PI * 2,\n    k: 0.5 + rand(),\n  }));\n  const scale = 1 / (unit * 3);\n  const field = (x: number, y: number) =>\n    waves.reduce(\n      (v, w) => v + Math.sin((x * w.a + y * w.b) * scale * w.k + w.p) / waves.length,\n      0,\n    ) +\n    0.35 * Math.sin(x * scale * 0.7 + y * scale * 0.4);\n  const cell = Math.max(3, unit / 4);\n  const cols = Math.ceil(W / cell) + 1;\n  const rows = Math.ceil(H / cell) + 1;\n  const v = new Float32Array(cols * rows);\n  for (let j = 0; j < rows; j++)\n    for (let i = 0; i < cols; i++) v[j * cols + i] = field(i * cell, j * cell);\n  ctx.lineWidth = Math.max(1, unit / 30);\n  ctx.beginPath();\n  for (let level = -1.2; level <= 1.2; level += 0.12) {\n    for (let j = 0; j < rows - 1; j++)\n      for (let i = 0; i < cols - 1; i++) {\n        const a = v[j * cols + i]! - level;\n        const b = v[j * cols + i + 1]! - level;\n        const c = v[(j + 1) * cols + i + 1]! - level;\n        const d = v[(j + 1) * cols + i]! - level;\n        const pts: [number, number][] = [];\n        const x0 = i * cell;\n        const y0 = j * cell;\n        if (a > 0 !== b > 0) pts.push([x0 + (cell * a) / (a - b), y0]);\n        if (b > 0 !== c > 0) pts.push([x0 + cell, y0 + (cell * b) / (b - c)]);\n        if (c > 0 !== d > 0) pts.push([x0 + cell - (cell * c) / (c - d), y0 + cell]);\n        if (d > 0 !== a > 0) pts.push([x0, y0 + cell - (cell * d) / (d - a)]);\n        for (let k = 0; k + 1 < pts.length; k += 2) {\n          ctx.moveTo(pts[k]![0], pts[k]![1]);\n          ctx.lineTo(pts[k + 1]![0], pts[k + 1]![1]);\n        }\n      }\n  }\n  ctx.stroke();\n}\n\nfunction sparkle(c: CanvasRenderingContext2D, x: number, y: number, r: number) {\n  c.beginPath();\n  c.moveTo(x, y - r);\n  c.quadraticCurveTo(x, y, x + r, y);\n  c.quadraticCurveTo(x, y, x, y + r);\n  c.quadraticCurveTo(x, y, x - r, y);\n  c.quadraticCurveTo(x, y, x, y - r);\n  c.fill();\n}\n\nfunction drawBackground(ctx: CanvasRenderingContext2D, d: Design): void {\n  const { width: W, height: H, background: bg } = d;\n  ctx.fillStyle = paintStyle(ctx, bg.paint, 0, 0, W, H);\n  ctx.fillRect(0, 0, W, H);\n  const img = bg.image ? image(bg.image.src) : null;\n  if (img && bg.image) {\n    const r = Math.max(W / img.naturalWidth, H / img.naturalHeight);\n    const w = img.naturalWidth * r;\n    const h = img.naturalHeight * r;\n    ctx.save();\n    ctx.globalAlpha = bg.image.opacity;\n    if (bg.image.blur > 0) ctx.filter = `blur(${bg.image.blur}px)`;\n    ctx.drawImage(img, (W - w) / 2, (H - h) / 2, w, h);\n    ctx.restore();\n  }\n  for (const l of bg.lights) {\n    const g = ctx.createRadialGradient(l.x * W, l.y * H, 0, l.x * W, l.y * H, l.r * Math.max(W, H));\n    g.addColorStop(0, alpha(l.color, l.alpha));\n    g.addColorStop(1, alpha(l.color, 0));\n    ctx.fillStyle = g;\n    ctx.fillRect(0, 0, W, H);\n  }\n  drawPattern(ctx, d);\n  if (bg.vignette > 0) {\n    const g = ctx.createRadialGradient(\n      W / 2,\n      H / 2,\n      Math.min(W, H) * 0.35,\n      W / 2,\n      H / 2,\n      Math.hypot(W, H) / 2,\n    );\n    g.addColorStop(0, \"rgba(0,0,0,0)\");\n    g.addColorStop(1, `rgba(0,0,0,${bg.vignette})`);\n    ctx.fillStyle = g;\n    ctx.fillRect(0, 0, W, H);\n  }\n}\n\nfunction textLines(l: TextLayer): string[] {\n  return (l.uppercase ? l.text.toUpperCase() : l.text).split(\"\\n\");\n}\n\n/** The layer's font size, shrunk until the text fits its maxWidth. */\nfunction fittedSize(l: TextLayer): number {\n  if (!l.maxWidth || l.maxWidth <= 0) return l.size;\n  const probe = ctx2d(makeCanvas(2, 2));\n  probe.font = fontCss(l.font, l.size);\n  const spacing = l.letterSpacing * l.size;\n  const lines = textLines(l);\n  const width = Math.max(\n    1,\n    ...lines.map((t) => probe.measureText(t).width + spacing * Math.max(0, [...t].length - 1)),\n  );\n  const lineCount = lines.length;\n  const slant = Math.abs(l.skew) * l.size * (0.9 + l.lineHeight * (lineCount - 1));\n  return width + slant > l.maxWidth ? l.size * (l.maxWidth / (width + slant)) : l.size;\n}\n\n/** Mask of a text layer, its size and the text box inside it. */\nfunction textMask(layer: TextLayer, margin: number) {\n  const size = fittedSize(layer);\n  const l = size === layer.size ? layer : { ...layer, size };\n  const probe = ctx2d(makeCanvas(2, 2));\n  probe.font = fontCss(l.font, l.size);\n  const spacing = l.letterSpacing * l.size;\n  const lines = textLines(l);\n  const widths = lines.map(\n    (t) => probe.measureText(t).width + spacing * Math.max(0, [...t].length - 1),\n  );\n  const m = probe.measureText(\"ÁjHg\");\n  const asc = m.actualBoundingBoxAscent || l.size * 0.8;\n  const desc = m.actualBoundingBoxDescent || l.size * 0.2;\n  const lineGap = l.size * l.lineHeight;\n  const textW = Math.max(1, ...widths);\n  const textH = asc + desc + lineGap * (lines.length - 1);\n  const slant = Math.abs(l.skew) * textH;\n  const w = textW + slant + margin * 2;\n  const h = textH + margin * 2;\n  const mask = makeCanvas(w, h);\n  const c = ctx2d(mask);\n  c.fillStyle = \"#fff\";\n  c.font = fontCss(l.font, l.size);\n  if (\"letterSpacing\" in c)\n    (c as unknown as { letterSpacing: string }).letterSpacing = `${spacing}px`;\n  c.textBaseline = \"alphabetic\";\n  c.translate(margin + slant / 2, 0);\n  c.transform(1, 0, -l.skew, 1, l.skew * (margin + textH / 2), 0);\n  lines.forEach((t, i) => {\n    const lw = widths[i]!;\n    const x = l.align === \"left\" ? 0 : l.align === \"right\" ? textW - lw : (textW - lw) / 2;\n    c.fillText(t, x, margin + asc + i * lineGap);\n  });\n  return { mask, w, h, box: { x: margin, y: margin, w: textW + slant, h: textH } };\n}\n\nfunction shapeMask(l: ShapeLayer, margin: number) {\n  const w = l.width + margin * 2;\n  const h = l.height + margin * 2;\n  const mask = makeCanvas(w, h);\n  const c = ctx2d(mask);\n  c.fillStyle = \"#fff\";\n  c.strokeStyle = \"#fff\";\n  const x = margin;\n  const y = margin;\n  switch (l.shape) {\n    case \"rect\":\n    case \"tape\":\n      roundRect(c, x, y, l.width, l.height, l.shape === \"tape\" ? 0 : l.radius);\n      c.fill();\n      break;\n    case \"circle\":\n      c.beginPath();\n      c.ellipse(x + l.width / 2, y + l.height / 2, l.width / 2, l.height / 2, 0, 0, Math.PI * 2);\n      c.fill();\n      break;\n    case \"line\":\n      c.fillRect(x, y + l.height / 2 - Math.max(1, l.height) / 2, l.width, Math.max(1, l.height));\n      break;\n    case \"sparkle\":\n      sparkle(c, x + l.width / 2, y + l.height / 2, Math.min(l.width, l.height) / 2);\n      break;\n    case \"triangle\":\n      polygon(c, [\n        [x + l.width / 2, y],\n        [x + l.width, y + l.height],\n        [x, y + l.height],\n      ]);\n      break;\n    case \"star\": {\n      const pts: [number, number][] = [];\n      for (let i = 0; i < 10; i++) {\n        const a = -Math.PI / 2 + (i * Math.PI) / 5;\n        const r = i % 2 === 0 ? 1 : 0.45;\n        pts.push([\n          x + l.width / 2 + (Math.cos(a) * r * l.width) / 2,\n          y + l.height / 2 + (Math.sin(a) * r * l.height) / 2,\n        ]);\n      }\n      polygon(c, pts);\n      break;\n    }\n    case \"hexagon\": {\n      const pts: [number, number][] = [];\n      for (let i = 0; i < 6; i++) {\n        const a = (i * Math.PI) / 3;\n        pts.push([\n          x + l.width / 2 + (Math.cos(a) * l.width) / 2,\n          y + l.height / 2 + (Math.sin(a) * l.height) / 2,\n        ]);\n      }\n      polygon(c, pts);\n      break;\n    }\n    case \"heart\": {\n      const w = l.width;\n      const h = l.height;\n      c.beginPath();\n      c.moveTo(x + w / 2, y + h);\n      c.bezierCurveTo(\n        x - w * 0.1,\n        y + h * 0.55,\n        x + w * 0.05,\n        y - h * 0.1,\n        x + w / 2,\n        y + h * 0.25,\n      );\n      c.bezierCurveTo(x + w * 0.95, y - h * 0.1, x + w * 1.1, y + h * 0.55, x + w / 2, y + h);\n      c.fill();\n      break;\n    }\n    case \"ring\": {\n      // The corner radius doubles as the ring's thickness.\n      const t = Math.max(\n        1,\n        Math.min(l.radius || Math.min(l.width, l.height) * 0.12, Math.min(l.width, l.height) / 2),\n      );\n      c.beginPath();\n      c.ellipse(x + l.width / 2, y + l.height / 2, l.width / 2, l.height / 2, 0, 0, Math.PI * 2);\n      c.ellipse(\n        x + l.width / 2,\n        y + l.height / 2,\n        Math.max(0, l.width / 2 - t),\n        Math.max(0, l.height / 2 - t),\n        0,\n        0,\n        Math.PI * 2,\n      );\n      c.fill(\"evenodd\");\n      break;\n    }\n    case \"arrow\": {\n      const shaft = l.height * 0.38;\n      const head = Math.min(l.width * 0.45, l.height * 0.9);\n      polygon(c, [\n        [x, y + (l.height - shaft) / 2],\n        [x + l.width - head, y + (l.height - shaft) / 2],\n        [x + l.width - head, y],\n        [x + l.width, y + l.height / 2],\n        [x + l.width - head, y + l.height],\n        [x + l.width - head, y + (l.height + shaft) / 2],\n        [x, y + (l.height + shaft) / 2],\n      ]);\n      break;\n    }\n  }\n  return { mask, w, h, box: { x, y, w: l.width, h: l.height } };\n}\n\nfunction polygon(c: CanvasRenderingContext2D, pts: [number, number][]) {\n  c.beginPath();\n  pts.forEach(([px, py], i) => (i === 0 ? c.moveTo(px, py) : c.lineTo(px, py)));\n  c.closePath();\n  c.fill();\n}\n\n/** Tape stripes and text drawn over the tape's face. */\nfunction tapeFace(l: ShapeLayer, w: number, h: number, margin: number): HTMLCanvasElement {\n  const face = makeCanvas(w, h);\n  const c = ctx2d(face);\n  c.fillStyle = paintStyle(c, l.paint, margin, margin, l.width, l.height);\n  c.fillRect(margin, margin, l.width, l.height);\n  c.save();\n  c.beginPath();\n  c.rect(margin, margin, l.width, l.height);\n  c.clip();\n  c.fillStyle = l.color2;\n  const s = l.height;\n  for (let x = margin - s; x < margin + l.width + s; x += s * 1.2) {\n    c.beginPath();\n    c.moveTo(x, margin + l.height);\n    c.lineTo(x + s * 0.5, margin);\n    c.lineTo(x + s * 0.95, margin);\n    c.lineTo(x + s * 0.45, margin + l.height);\n    c.fill();\n  }\n  if (l.label) {\n    c.font = fontCss(\"Russo One\", l.height * 0.62);\n    c.textAlign = \"center\";\n    c.textBaseline = \"middle\";\n    const t = `${l.label}   `;\n    const tw = c.measureText(t).width;\n    c.fillStyle = l.paint.color;\n    for (let x = margin + tw / 2; x < margin + l.width + tw; x += tw) {\n      c.fillRect(x - tw * 0.32, margin + l.height * 0.12, tw * 0.64, l.height * 0.76);\n    }\n    c.fillStyle = l.color2;\n    for (let x = margin + tw / 2; x < margin + l.width + tw; x += tw)\n      c.fillText(l.label, x, margin + l.height / 2 + 1);\n  }\n  c.restore();\n  return face;\n}\n\nfunction layerMask(l: Layer, margin: number) {\n  if (l.type === \"text\") return textMask(l, margin);\n  if (l.type === \"shape\") return shapeMask(l, margin);\n  if (l.type === \"icon\") {\n    const w = l.size + margin * 2;\n    const mask = makeCanvas(w, w);\n    drawGlyphMask(ctx2d(mask), l.glyph, w / 2, w / 2, l.size, {\n      lineWidth: l.lineWidth,\n      solid: l.solid,\n    });\n    return { mask, w, h: w, box: { x: margin, y: margin, w: l.size, h: l.size } };\n  }\n  const w = l.width + margin * 2;\n  const h = l.height + margin * 2;\n  const mask = makeCanvas(w, h);\n  const c = ctx2d(mask);\n  const img = image(l.src);\n  if (img) {\n    roundRect(c, margin, margin, l.width, l.height, l.radius);\n    c.clip();\n    const r = Math.max(l.width / img.naturalWidth, l.height / img.naturalHeight);\n    const iw = img.naturalWidth * r;\n    const ih = img.naturalHeight * r;\n    const filter = filterCss(l.filters);\n    if (filter !== \"none\") c.filter = filter;\n    c.drawImage(img, margin + (l.width - iw) / 2, margin + (l.height - ih) / 2, iw, ih);\n  }\n  return { mask, w, h, box: { x: margin, y: margin, w: l.width, h: l.height } };\n}\n\nconst sprites = new Map<\n  string,\n  { canvas: HTMLCanvasElement; ox: number; oy: number; box: { w: number; h: number } }\n>();\n\n/** A layer composed with its effects at 1:1, cached while it doesn't change. */\nfunction layerSprite(l: Layer) {\n  // Position, turn, mirroring and blending happen when the sprite is drawn.\n  const key = JSON.stringify({\n    ...l,\n    x: 0,\n    y: 0,\n    rotation: 0,\n    opacity: 1,\n    name: \"\",\n    flipX: false,\n    flipY: false,\n    blend: \"normal\",\n    locked: false,\n  });\n  const hit = sprites.get(key);\n  if (hit) return hit;\n  const margin = effectsMargin(l.fx) + 4;\n  const { mask, w, h, box } = layerMask(l, margin);\n  let raw: HTMLCanvasElement | null = null;\n  if (l.type === \"image\") raw = mask;\n  else if (l.type === \"shape\" && l.shape === \"tape\") raw = tapeFace(l, w, h, margin);\n  else if (l.type === \"icon\") raw = glyphRaw(l.glyph, w, h, w / 2, h / 2, l.size);\n  const fx: Effects = l.type === \"shape\" && l.shape !== \"tape\" ? { ...l.fx, fill: l.paint } : l.fx;\n  const pad = Math.ceil(\n    (fx.extrude?.depth ?? 0) +\n      (fx.shadow\n        ? Math.max(Math.abs(fx.shadow.x), Math.abs(fx.shadow.y)) + fx.shadow.blur * 2\n        : 0) +\n      (fx.glow ? fx.glow.blur * 2 : 0) +\n      4,\n  );\n  const canvas = makeCanvas(w + pad * 2, h + pad * 2);\n  // A text layer bevels by its letter size, not by the whole (multi-line) block.\n  const bevelSize =\n    l.type === \"text\" ? fittedSize(l) : l.type === \"icon\" ? l.size : Math.min(box.w, box.h);\n  compose(ctx2d(canvas), mask, pad, pad, fx, box, { raw, bevelSize });\n  const sprite = { canvas, ox: pad + w / 2, oy: pad + h / 2, box: { w: box.w, h: box.h } };\n  // Only fully loaded pictures are worth keeping.\n  const pending =\n    (l.type === \"image\" && !image(l.src)) ||\n    (l.type === \"icon\" && l.glyph.kind === \"image\" && !image(l.glyph.src));\n  if (!pending) {\n    sprites.set(key, sprite);\n    if (sprites.size > 80) sprites.delete(sprites.keys().next().value as string);\n  }\n  return sprite;\n}\n\n/** Forget cached layers (after fonts finish loading). */\nexport function clearRenderCache(): void {\n  sprites.clear();\n}\n\nfunction drawLayer(ctx: CanvasRenderingContext2D, l: Layer): LayerBox {\n  const sprite = layerSprite(l);\n  ctx.save();\n  ctx.globalAlpha = l.opacity;\n  if (l.blend && l.blend !== \"normal\") ctx.globalCompositeOperation = l.blend;\n  ctx.translate(l.x, l.y);\n  ctx.rotate((l.rotation * Math.PI) / 180);\n  if (l.flipX || l.flipY) ctx.scale(l.flipX ? -1 : 1, l.flipY ? -1 : 1);\n  ctx.drawImage(sprite.canvas, -sprite.ox, -sprite.oy);\n  ctx.restore();\n  return {\n    id: l.id,\n    x: l.x - sprite.box.w / 2,\n    y: l.y - sprite.box.h / 2,\n    w: sprite.box.w,\n    h: sprite.box.h,\n  };\n}\n\n/** The Bottly icon used as the free-plan watermark (public/icon-512.png). */\nexport const WATERMARK_LOGO = \"/icon-512.png\";\n\n/** Free-plan mark: the Bottly icon at 50% in the bottom-right corner. */\nfunction drawWatermark(ctx: CanvasRenderingContext2D, d: Design, kind: Watermark): void {\n  if (!kind) return;\n  const logo = image(WATERMARK_LOGO);\n  if (!logo) return;\n  const { width: W, height: H } = d;\n  const m = Math.min(W, H);\n  // Banners carry a clear mark; pictures (avatars, icons) a smaller one.\n  const size = Math.max(16, m * (kind === \"banner\" ? 0.13 : 0.09));\n  const margin = Math.max(6, m * 0.035);\n  ctx.save();\n  ctx.globalAlpha = 0.5;\n  ctx.drawImage(logo, W - size - margin, H - size - margin, size, size);\n  ctx.restore();\n}\n\n/** Renders a design at `scale`; returns each visible layer's box (design px). */\nexport function renderDesign(\n  ctx: CanvasRenderingContext2D,\n  d: Design,\n  options: { scale?: number; watermark?: Watermark } = {},\n): LayerBox[] {\n  const scale = options.scale ?? 1;\n  ctx.save();\n  ctx.setTransform(scale, 0, 0, scale, 0, 0);\n  drawBackground(ctx, d);\n  const boxes: LayerBox[] = [];\n  for (const l of d.layers) if (l.visible) boxes.push(drawLayer(ctx, l));\n  drawWatermark(ctx, d, options.watermark ?? null);\n  ctx.restore();\n  return boxes;\n}\n\n/** Every font and picture a design needs before it renders right. */\nexport function designAssets(d: Design): { fonts: string[]; images: string[] } {\n  const fonts = new Set<string>([\"Figtree\", \"Russo One\"]);\n  // The watermark is drawn only once its picture is loaded.\n  const imgs = new Set<string>([WATERMARK_LOGO]);\n  if (d.background.image) imgs.add(d.background.image.src);\n  for (const l of d.layers) {\n    if (l.type === \"text\") fonts.add(l.font);\n    if (l.type === \"image\") imgs.add(l.src);\n    if (l.type === \"icon\" && l.glyph.kind === \"text\") fonts.add(l.glyph.font);\n    if (l.type === \"icon\" && l.glyph.kind === \"image\") imgs.add(l.glyph.src);\n  }\n  return { fonts: [...fonts], images: [...imgs] };\n}\n\n/** A PNG/JPEG data URL of a design at full size. */\nexport function exportDesign(\n  d: Design,\n  type: \"image/png\" | \"image/jpeg\" | \"image/webp\",\n  watermark: Watermark,\n): string {\n  const c = makeCanvas(d.width, d.height);\n  renderDesign(ctx2d(c), d, { watermark });\n  return c.toDataURL(type, 0.92);\n}\n","runtime/src/studio/studio-icons.ts":"/* AUTO-GENERATED FILE — do not edit.\n * Source: src/data/studio-icons.ts (web app)\n * Regenerate: npm run sync:contract (inside runtime/)\n */\n/**\n * Icons of Emoji Studio and Graphics Studio as SVG path data on a 24×24 grid.\n * Generated by scripts/gen-studio-icons.mts from lucide (ISC), Phosphor (MIT),\n * simple-icons and cryptocurrency-icons (CC0) and Bottly's own icons; edit the\n * lists there, not this file.\n */\n\nexport interface StudioIcon {\n  id: string;\n  label: string;\n  /** \"line\" icons are stroked; the other sets are filled. */\n  set: \"line\" | \"solid\" | \"duotone\" | \"brand\" | \"crypto\";\n  paths: string[];\n  /** Line icons: paths inside a closed shape, cut out when the icon is filled. */\n  inner?: number[];\n  /** Line icons: open strokes, never filled. */\n  open?: number[];\n  /** Duotone icons: the light layer, drawn see-through. */\n  faded?: number[];\n  /** Brand colour. */\n  color?: string;\n}\n\nexport const STUDIO_ICONS: StudioIcon[] = [{\"id\":\"thumbs-up\",\"label\":\"Like\",\"set\":\"line\",\"paths\":[\"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\",\"M7 10v12\"],\"inner\":[1]},{\"id\":\"thumbs-down\",\"label\":\"Dislike\",\"set\":\"line\",\"paths\":[\"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z\",\"M17 14V2\"],\"inner\":[1]},{\"id\":\"check\",\"label\":\"Check\",\"set\":\"line\",\"paths\":[\"M20 6 9 17l-5-5\"],\"open\":[0]},{\"id\":\"x\",\"label\":\"Cross\",\"set\":\"line\",\"paths\":[\"M18 6 6 18\",\"m6 6 12 12\"],\"open\":[0,1]},{\"id\":\"circle-check\",\"label\":\"Check circle\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m9 12 2 2 4-4\"],\"inner\":[1]},{\"id\":\"circle-x\",\"label\":\"Cross circle\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m15 9-6 6\",\"m9 9 6 6\"],\"inner\":[1,2]},{\"id\":\"triangle-alert\",\"label\":\"Warning\",\"set\":\"line\",\"paths\":[\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\"M12 9v4\",\"M12 17h.01\"],\"inner\":[1,2]},{\"id\":\"info\",\"label\":\"Info\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M12 16v-4\",\"M12 8h.01\"],\"inner\":[1,2]},{\"id\":\"circle-question-mark\",\"label\":\"Question\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\",\"M12 17h.01\"],\"inner\":[1,2]},{\"id\":\"ban\",\"label\":\"Ban\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M4.929 4.929 19.07 19.071\"],\"inner\":[1]},{\"id\":\"heart\",\"label\":\"Heart\",\"set\":\"line\",\"paths\":[\"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\"]},{\"id\":\"star\",\"label\":\"Star\",\"set\":\"line\",\"paths\":[\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\"]},{\"id\":\"sparkles\",\"label\":\"Sparkles\",\"set\":\"line\",\"paths\":[\"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\",\"M20 2v4\",\"M22 4h-4\",\"M2 20a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"inner\":[1,2,3]},{\"id\":\"flame\",\"label\":\"Fire\",\"set\":\"line\",\"paths\":[\"M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4\"]},{\"id\":\"zap\",\"label\":\"Bolt\",\"set\":\"line\",\"paths\":[\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\"]},{\"id\":\"crown\",\"label\":\"Crown\",\"set\":\"line\",\"paths\":[\"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z\",\"M5 21h14\"],\"open\":[1]},{\"id\":\"trophy\",\"label\":\"Trophy\",\"set\":\"line\",\"paths\":[\"M10 14.66v1.626a2 2 0 0 1-.976 1.696A5 5 0 0 0 7 21.978\",\"M14 14.66v1.626a2 2 0 0 0 .976 1.696A5 5 0 0 1 17 21.978\",\"M18 9h1.5a1 1 0 0 0 0-5H18\",\"M4 22h16\",\"M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z\",\"M6 9H4.5a1 1 0 0 1 0-5H6\"],\"open\":[0,1,2,3,5]},{\"id\":\"medal\",\"label\":\"Medal\",\"set\":\"line\",\"paths\":[\"M7.21 15 2.66 7.14a2 2 0 0 1 .13-2.2L4.4 2.8A2 2 0 0 1 6 2h12a2 2 0 0 1 1.6.8l1.6 2.14a2 2 0 0 1 .14 2.2L16.79 15\",\"M11 12 5.12 2.2\",\"m13 12 5.88-9.8\",\"M8 7h8\",\"M7 17a5 5 0 1 0 10 0a5 5 0 1 0 -10 0Z\",\"M12 18v-2h-.5\"],\"inner\":[5],\"open\":[0,1,2,3]},{\"id\":\"award\",\"label\":\"Award\",\"set\":\"line\",\"paths\":[\"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526\",\"M6 8a6 6 0 1 0 12 0a6 6 0 1 0 -12 0Z\"],\"open\":[0]},{\"id\":\"gem\",\"label\":\"Gem\",\"set\":\"line\",\"paths\":[\"M10.5 3 8 9l4 13 4-13-2.5-6\",\"M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z\",\"M2 9h20\"],\"inner\":[0,2]},{\"id\":\"party-popper\",\"label\":\"Party\",\"set\":\"line\",\"paths\":[\"M5.8 11.3 2 22l10.7-3.79\",\"M4 3h.01\",\"M22 8h.01\",\"M15 2h.01\",\"M22 20h.01\",\"m22 2-2.24.75a2.9 2.9 0 0 0-1.96 3.12c.1.86-.57 1.63-1.45 1.63h-.38c-.86 0-1.6.6-1.76 1.44L14 10\",\"m22 13-.82-.33c-.86-.34-1.82.2-1.98 1.11c-.11.7-.72 1.22-1.43 1.22H17\",\"m11 2 .33.82c.34.86-.2 1.82-1.11 1.98C9.52 4.9 9 5.52 9 6.23V7\",\"M11 13c1.93 1.93 2.83 4.17 2 5-.83.83-3.07-.07-5-2-1.93-1.93-2.83-4.17-2-5 .83-.83 3.07.07 5 2Z\"],\"open\":[0,1,2,3,4,5,6,7,8]},{\"id\":\"gift\",\"label\":\"Gift\",\"set\":\"line\",\"paths\":[\"M12 7v14\",\"M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8\",\"M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5\",\"M4 7h16a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-16a1 1 0 0 1 -1 -1v-2a1 1 0 0 1 1 -1Z\"],\"open\":[0,1,2]},{\"id\":\"smile\",\"label\":\"Smile\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M8 14s1.5 2 4 2 4-2 4-2\",\"M9 9L9.01 9\",\"M15 9L15.01 9\"],\"inner\":[1,2,3]},{\"id\":\"laugh\",\"label\":\"Laugh\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M18 13a6 6 0 0 1-6 5 6 6 0 0 1-6-5h12Z\",\"M9 9L9.01 9\",\"M15 9L15.01 9\"],\"inner\":[1,2,3]},{\"id\":\"frown\",\"label\":\"Sad\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M16 16s-1.5-2-4-2-4 2-4 2\",\"M9 9L9.01 9\",\"M15 9L15.01 9\"],\"inner\":[1,2,3]},{\"id\":\"angry\",\"label\":\"Angry\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M16 16s-1.5-2-4-2-4 2-4 2\",\"M7.5 8 10 9\",\"m14 9 2.5-1\",\"M9 10h.01\",\"M15 10h.01\"],\"inner\":[1,2,3,4,5]},{\"id\":\"skull\",\"label\":\"Skull\",\"set\":\"line\",\"paths\":[\"m12.5 17-.5-1-.5 1h1z\",\"M15 22a1 1 0 0 0 1-1v-1a2 2 0 0 0 1.56-3.25 8 8 0 1 0-11.12 0A2 2 0 0 0 8 20v1a1 1 0 0 0 1 1z\",\"M14 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M8 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\"],\"inner\":[0,2,3]},{\"id\":\"ghost\",\"label\":\"Ghost\",\"set\":\"line\",\"paths\":[\"M9 10h.01\",\"M15 10h.01\",\"M12 2a8 8 0 0 0-8 8v12l3-3 2.5 2.5L12 19l2.5 2.5L17 19l3 3V10a8 8 0 0 0-8-8z\"],\"inner\":[0,1]},{\"id\":\"hand\",\"label\":\"Wave\",\"set\":\"line\",\"paths\":[\"M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2\",\"M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2\",\"M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8\",\"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\"],\"open\":[0,1,2,3]},{\"id\":\"hand-heart\",\"label\":\"Hand heart\",\"set\":\"line\",\"paths\":[\"M11 14h2a2 2 0 0 0 0-4h-3c-.6 0-1.1.2-1.4.6L3 16\",\"m14.45 13.39 5.05-4.694C20.196 8 21 6.85 21 5.75a2.75 2.75 0 0 0-4.797-1.837.276.276 0 0 1-.406 0A2.75 2.75 0 0 0 11 5.75c0 1.2.802 2.248 1.5 2.946L16 11.95\",\"m2 15 6 6\",\"m7 20 1.6-1.4c.3-.4.8-.6 1.4-.6h4c1.1 0 2.1-.4 2.8-1.2l4.6-4.4a1 1 0 0 0-2.75-2.91\"],\"open\":[0,1,2,3]},{\"id\":\"handshake\",\"label\":\"Handshake\",\"set\":\"line\",\"paths\":[\"m11 17 2 2a1 1 0 1 0 3-3\",\"m14 14 2.5 2.5a1 1 0 1 0 3-3l-3.88-3.88a3 3 0 0 0-4.24 0l-.88.88a1 1 0 1 1-3-3l2.81-2.81a5.79 5.79 0 0 1 7.06-.87l.47.28a2 2 0 0 0 1.42.25L21 4\",\"m21 3 1 11h-2\",\"M3 3 2 14l6.5 6.5a1 1 0 1 0 3-3\",\"M3 4h8\"],\"open\":[0,1,2,3,4]},{\"id\":\"user\",\"label\":\"User\",\"set\":\"line\",\"paths\":[\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\",\"M8 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\"],\"open\":[0]},{\"id\":\"users\",\"label\":\"Users\",\"set\":\"line\",\"paths\":[\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\"M16 3.128a4 4 0 0 1 0 7.744\",\"M22 21v-2a4 4 0 0 0-3-3.87\",\"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\"],\"open\":[0,1,2]},{\"id\":\"user-plus\",\"label\":\"Add user\",\"set\":\"line\",\"paths\":[\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\",\"M19 8L19 14\",\"M22 11L16 11\"],\"open\":[0,2,3]},{\"id\":\"user-minus\",\"label\":\"Remove user\",\"set\":\"line\",\"paths\":[\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\",\"M22 11L16 11\"],\"open\":[0,2]},{\"id\":\"user-check\",\"label\":\"Verified user\",\"set\":\"line\",\"paths\":[\"m16 11 2 2 4-4\",\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\"],\"open\":[0,1]},{\"id\":\"user-x\",\"label\":\"Blocked user\",\"set\":\"line\",\"paths\":[\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\",\"M17 8L22 13\",\"M22 8L17 13\"],\"open\":[0,2,3]},{\"id\":\"user-round\",\"label\":\"Person\",\"set\":\"line\",\"paths\":[\"M7 8a5 5 0 1 0 10 0a5 5 0 1 0 -10 0Z\",\"M20 21a8 8 0 0 0-16 0\"],\"open\":[1]},{\"id\":\"contact\",\"label\":\"Contact\",\"set\":\"line\",\"paths\":[\"M16 2v2\",\"M7 22v-2a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v2\",\"M8 2v2\",\"M9 11a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\"],\"inner\":[1,3],\"open\":[0,2]},{\"id\":\"megaphone\",\"label\":\"Announcement\",\"set\":\"line\",\"paths\":[\"M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z\",\"M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14\",\"M8 6v8\"],\"inner\":[2],\"open\":[1]},{\"id\":\"bell\",\"label\":\"Bell\",\"set\":\"line\",\"paths\":[\"M10.268 21a2 2 0 0 0 3.464 0\",\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\"],\"open\":[0]},{\"id\":\"bell-ring\",\"label\":\"Ping\",\"set\":\"line\",\"paths\":[\"M10.268 21a2 2 0 0 0 3.464 0\",\"M22 8c0-2.3-.8-4.3-2-6\",\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\",\"M4 2C2.8 3.7 2 5.7 2 8\"],\"open\":[0,1,3]},{\"id\":\"message-circle\",\"label\":\"Message\",\"set\":\"line\",\"paths\":[\"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719\"]},{\"id\":\"messages-square\",\"label\":\"Chat\",\"set\":\"line\",\"paths\":[\"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\",\"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1\"],\"open\":[1]},{\"id\":\"mail\",\"label\":\"Mail\",\"set\":\"line\",\"paths\":[\"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7\",\"M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2Z\"],\"inner\":[0]},{\"id\":\"send\",\"label\":\"Send\",\"set\":\"line\",\"paths\":[\"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\",\"m21.854 2.147-10.94 10.939\"],\"inner\":[1]},{\"id\":\"at-sign\",\"label\":\"Mention\",\"set\":\"line\",\"paths\":[\"M8 12a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\",\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8\"],\"open\":[1]},{\"id\":\"hash\",\"label\":\"Channel\",\"set\":\"line\",\"paths\":[\"M4 9L20 9\",\"M4 15L20 15\",\"M10 3L8 21\",\"M16 3L14 21\"],\"open\":[0,1,2,3]},{\"id\":\"mic\",\"label\":\"Mic\",\"set\":\"line\",\"paths\":[\"M12 19v3\",\"M19 10v2a7 7 0 0 1-14 0v-2\",\"M12 2h0a3 3 0 0 1 3 3v7a3 3 0 0 1 -3 3h0a3 3 0 0 1 -3 -3v-7a3 3 0 0 1 3 -3Z\"],\"open\":[0,1]},{\"id\":\"headphones\",\"label\":\"Headphones\",\"set\":\"line\",\"paths\":[\"M3 14h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a9 9 0 0 1 18 0v7a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3\"],\"open\":[0]},{\"id\":\"volume-2\",\"label\":\"Volume\",\"set\":\"line\",\"paths\":[\"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\",\"M16 9a5 5 0 0 1 0 6\",\"M19.364 18.364a9 9 0 0 0 0-12.728\"],\"open\":[1,2]},{\"id\":\"calendar\",\"label\":\"Calendar\",\"set\":\"line\",\"paths\":[\"M8 2v4\",\"M16 2v4\",\"M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"M3 10h18\"],\"inner\":[3],\"open\":[0,1]},{\"id\":\"calendar-days\",\"label\":\"Events\",\"set\":\"line\",\"paths\":[\"M8 2v4\",\"M16 2v4\",\"M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"M3 10h18\",\"M8 14h.01\",\"M12 14h.01\",\"M16 14h.01\",\"M8 18h.01\",\"M12 18h.01\",\"M16 18h.01\"],\"inner\":[3,4,5,6,7,8,9],\"open\":[0,1]},{\"id\":\"clock\",\"label\":\"Clock\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M12 6v6l4 2\"],\"inner\":[1]},{\"id\":\"timer\",\"label\":\"Timer\",\"set\":\"line\",\"paths\":[\"M10 2L14 2\",\"M12 14L15 11\",\"M4 14a8 8 0 1 0 16 0a8 8 0 1 0 -16 0Z\"],\"inner\":[1],\"open\":[0]},{\"id\":\"hourglass\",\"label\":\"Hourglass\",\"set\":\"line\",\"paths\":[\"M5 22h14\",\"M5 2h14\",\"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22\",\"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2\"],\"open\":[0,1,2,3]},{\"id\":\"pin\",\"label\":\"Pin\",\"set\":\"line\",\"paths\":[\"M12 17v5\",\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\"],\"open\":[0]},{\"id\":\"bookmark\",\"label\":\"Bookmark\",\"set\":\"line\",\"paths\":[\"M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z\"]},{\"id\":\"flag\",\"label\":\"Flag\",\"set\":\"line\",\"paths\":[\"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\"],\"open\":[0]},{\"id\":\"link\",\"label\":\"Link\",\"set\":\"line\",\"paths\":[\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\",\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"],\"open\":[0,1]},{\"id\":\"paperclip\",\"label\":\"Attachment\",\"set\":\"line\",\"paths\":[\"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\"],\"open\":[0]},{\"id\":\"image\",\"label\":\"Image\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"M7 9a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"],\"inner\":[1,2]},{\"id\":\"camera\",\"label\":\"Camera\",\"set\":\"line\",\"paths\":[\"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z\",\"M9 13a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"inner\":[1]},{\"id\":\"video\",\"label\":\"Video\",\"set\":\"line\",\"paths\":[\"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\",\"M4 6h10a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-8a2 2 0 0 1 2 -2Z\"],\"open\":[0]},{\"id\":\"music\",\"label\":\"Music\",\"set\":\"line\",\"paths\":[\"M9 18V5l12-2v13\",\"M3 18a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M15 16a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"open\":[0]},{\"id\":\"book-open\",\"label\":\"Rules\",\"set\":\"line\",\"paths\":[\"M12 7v14\",\"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"],\"inner\":[0]},{\"id\":\"scroll-text\",\"label\":\"Scroll\",\"set\":\"line\",\"paths\":[\"M15 12h-5\",\"M15 8h-5\",\"M19 17V5a2 2 0 0 0-2-2H4\",\"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\"],\"open\":[0,1,2,3]},{\"id\":\"file-text\",\"label\":\"Document\",\"set\":\"line\",\"paths\":[\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\"M14 2v5a1 1 0 0 0 1 1h5\",\"M10 9H8\",\"M16 13H8\",\"M16 17H8\"],\"inner\":[1,2,3,4]},{\"id\":\"clipboard-list\",\"label\":\"Checklist\",\"set\":\"line\",\"paths\":[\"M9 2h6a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-6a1 1 0 0 1 -1 -1v-2a1 1 0 0 1 1 -1Z\",\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\"M12 11h4\",\"M12 16h4\",\"M8 11h.01\",\"M8 16h.01\"],\"open\":[1,2,3]},{\"id\":\"newspaper\",\"label\":\"News\",\"set\":\"line\",\"paths\":[\"M15 18h-5\",\"M18 14h-8\",\"M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-4 0v-9a2 2 0 0 1 2-2h2\",\"M11 6h6a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-6a1 1 0 0 1 -1 -1v-2a1 1 0 0 1 1 -1Z\"],\"open\":[0,1,2]},{\"id\":\"lightbulb\",\"label\":\"Idea\",\"set\":\"line\",\"paths\":[\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\",\"M9 18h6\",\"M10 22h4\"],\"open\":[0,1,2]},{\"id\":\"rocket\",\"label\":\"Rocket\",\"set\":\"line\",\"paths\":[\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\",\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09\",\"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z\",\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\"],\"open\":[0,1,2,3]},{\"id\":\"globe\",\"label\":\"Globe\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\",\"M2 12h20\"],\"open\":[0,1,2]},{\"id\":\"map-pin\",\"label\":\"Location\",\"set\":\"line\",\"paths\":[\"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\",\"M9 10a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"inner\":[1]},{\"id\":\"house\",\"label\":\"Home\",\"set\":\"line\",\"paths\":[\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\",\"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"],\"inner\":[0]},{\"id\":\"shield\",\"label\":\"Shield\",\"set\":\"line\",\"paths\":[\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"]},{\"id\":\"shield-check\",\"label\":\"Verified\",\"set\":\"line\",\"paths\":[\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\"m9 12 2 2 4-4\"],\"inner\":[1]},{\"id\":\"shield-alert\",\"label\":\"Security\",\"set\":\"line\",\"paths\":[\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\"M12 8v4\",\"M12 16h.01\"],\"inner\":[1,2]},{\"id\":\"lock\",\"label\":\"Lock\",\"set\":\"line\",\"paths\":[\"M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-7a2 2 0 0 1 2 -2Z\",\"M7 11V7a5 5 0 0 1 10 0v4\"],\"open\":[1]},{\"id\":\"lock-open\",\"label\":\"Unlock\",\"set\":\"line\",\"paths\":[\"M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-7a2 2 0 0 1 2 -2Z\",\"M7 11V7a5 5 0 0 1 9.9-1\"],\"open\":[1]},{\"id\":\"key-round\",\"label\":\"Key\",\"set\":\"line\",\"paths\":[\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\",\"M16 7.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\"],\"inner\":[1]},{\"id\":\"eye\",\"label\":\"Eye\",\"set\":\"line\",\"paths\":[\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\"M9 12a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"inner\":[1]},{\"id\":\"eye-off\",\"label\":\"Hidden\",\"set\":\"line\",\"paths\":[\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\"M14.084 14.158a3 3 0 0 1-4.242-4.242\",\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\"m2 2 20 20\"],\"open\":[0,1,2,3]},{\"id\":\"gavel\",\"label\":\"Gavel\",\"set\":\"line\",\"paths\":[\"m14 13-8.381 8.38a1 1 0 0 1-3.001-3l8.384-8.381\",\"m16 16 6-6\",\"m21.5 10.5-8-8\",\"m8 8 6-6\",\"m8.5 7.5 8 8\"],\"open\":[0,1,2,3,4]},{\"id\":\"scale\",\"label\":\"Scale\",\"set\":\"line\",\"paths\":[\"M12 3v18\",\"m19 8 3 8a5 5 0 0 1-6 0zV7\",\"M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1\",\"m5 8 3 8a5 5 0 0 1-6 0zV7\",\"M7 21h10\"],\"open\":[0,2,4]},{\"id\":\"siren\",\"label\":\"Siren\",\"set\":\"line\",\"paths\":[\"M7 18v-6a5 5 0 1 1 10 0v6\",\"M5 21a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-1a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2z\",\"M21 12h1\",\"M18.5 4.5 18 5\",\"M2 12h1\",\"M12 2v1\",\"m4.929 4.929.707.707\",\"M12 12v6\"],\"open\":[0,2,3,4,5,6,7]},{\"id\":\"bug\",\"label\":\"Bug\",\"set\":\"line\",\"paths\":[\"M12 20v-9\",\"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z\",\"M14.12 3.88 16 2\",\"M21 21a4 4 0 0 0-3.81-4\",\"M21 5a4 4 0 0 1-3.55 3.97\",\"M22 13h-4\",\"M3 21a4 4 0 0 1 3.81-4\",\"M3 5a4 4 0 0 0 3.55 3.97\",\"M6 13H2\",\"m8 2 1.88 1.88\",\"M9 7.13V6a3 3 0 1 1 6 0v1.13\"],\"inner\":[0],\"open\":[2,3,4,5,6,7,8,9,10]},{\"id\":\"bot\",\"label\":\"Bot\",\"set\":\"line\",\"paths\":[\"M12 8V4H8\",\"M6 8h12a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-8a2 2 0 0 1 2 -2Z\",\"M2 14h2\",\"M20 14h2\",\"M15 13v2\",\"M9 13v2\"],\"inner\":[4,5],\"open\":[0,2,3]},{\"id\":\"cpu\",\"label\":\"CPU\",\"set\":\"line\",\"paths\":[\"M12 20v2\",\"M12 2v2\",\"M17 20v2\",\"M17 2v2\",\"M2 12h2\",\"M2 17h2\",\"M2 7h2\",\"M20 12h2\",\"M20 17h2\",\"M20 7h2\",\"M7 20v2\",\"M7 2v2\",\"M6 4h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2Z\",\"M9 8h6a1 1 0 0 1 1 1v6a1 1 0 0 1 -1 1h-6a1 1 0 0 1 -1 -1v-6a1 1 0 0 1 1 -1Z\"],\"inner\":[13],\"open\":[0,1,2,3,4,5,6,7,8,9,10,11]},{\"id\":\"server\",\"label\":\"Server\",\"set\":\"line\",\"paths\":[\"M4 2h16a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-4a2 2 0 0 1 2 -2Z\",\"M4 14h16a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-4a2 2 0 0 1 2 -2Z\",\"M6 6L6.01 6\",\"M6 18L6.01 18\"],\"inner\":[2,3]},{\"id\":\"code\",\"label\":\"Code\",\"set\":\"line\",\"paths\":[\"m16 18 6-6-6-6\",\"m8 6-6 6 6 6\"],\"open\":[0,1]},{\"id\":\"terminal\",\"label\":\"Terminal\",\"set\":\"line\",\"paths\":[\"M12 19h8\",\"m4 17 6-6-6-6\"],\"open\":[0,1]},{\"id\":\"wrench\",\"label\":\"Wrench\",\"set\":\"line\",\"paths\":[\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z\"]},{\"id\":\"hammer\",\"label\":\"Hammer\",\"set\":\"line\",\"paths\":[\"m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9\",\"m18 15 4-4\",\"m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172v-.344a2 2 0 0 0-.586-1.414l-1.657-1.657A6 6 0 0 0 12.516 3H9l1.243 1.243A6 6 0 0 1 12 8.485V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5\"],\"open\":[0,1,2]},{\"id\":\"settings\",\"label\":\"Settings\",\"set\":\"line\",\"paths\":[\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\",\"M9 12a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"inner\":[1]},{\"id\":\"sliders-horizontal\",\"label\":\"Sliders\",\"set\":\"line\",\"paths\":[\"M10 5H3\",\"M12 19H3\",\"M14 3v4\",\"M16 17v4\",\"M21 12h-9\",\"M21 19h-5\",\"M21 5h-7\",\"M8 10v4\",\"M8 12H3\"],\"open\":[0,1,2,3,4,5,6,7,8]},{\"id\":\"pencil\",\"label\":\"Pencil\",\"set\":\"line\",\"paths\":[\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\"m15 5 4 4\"],\"inner\":[1]},{\"id\":\"brush\",\"label\":\"Brush\",\"set\":\"line\",\"paths\":[\"m11 10 3 3\",\"M6.5 21A3.5 3.5 0 1 0 3 17.5a2.62 2.62 0 0 1-.708 1.792A1 1 0 0 0 3 21z\",\"M9.969 17.031 21.378 5.624a1 1 0 0 0-3.002-3.002L6.967 14.031\"],\"open\":[0,2]},{\"id\":\"palette\",\"label\":\"Palette\",\"set\":\"line\",\"paths\":[\"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z\",\"M13 6.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"M17 10.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"M6 12.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"M8 7.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\"],\"inner\":[1,2,4]},{\"id\":\"trash-2\",\"label\":\"Trash\",\"set\":\"line\",\"paths\":[\"M10 11v6\",\"M14 11v6\",\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\",\"M3 6h18\",\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"],\"open\":[0,1,2,3,4]},{\"id\":\"search\",\"label\":\"Search\",\"set\":\"line\",\"paths\":[\"m21 21-4.34-4.34\",\"M3 11a8 8 0 1 0 16 0a8 8 0 1 0 -16 0Z\"],\"open\":[0]},{\"id\":\"funnel\",\"label\":\"Filter\",\"set\":\"line\",\"paths\":[\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\"]},{\"id\":\"list\",\"label\":\"List\",\"set\":\"line\",\"paths\":[\"M3 5h.01\",\"M3 12h.01\",\"M3 19h.01\",\"M8 5h13\",\"M8 12h13\",\"M8 19h13\"],\"open\":[3,4,5]},{\"id\":\"layout-grid\",\"label\":\"Grid\",\"set\":\"line\",\"paths\":[\"M4 3h5a1 1 0 0 1 1 1v5a1 1 0 0 1 -1 1h-5a1 1 0 0 1 -1 -1v-5a1 1 0 0 1 1 -1Z\",\"M15 3h5a1 1 0 0 1 1 1v5a1 1 0 0 1 -1 1h-5a1 1 0 0 1 -1 -1v-5a1 1 0 0 1 1 -1Z\",\"M15 14h5a1 1 0 0 1 1 1v5a1 1 0 0 1 -1 1h-5a1 1 0 0 1 -1 -1v-5a1 1 0 0 1 1 -1Z\",\"M4 14h5a1 1 0 0 1 1 1v5a1 1 0 0 1 -1 1h-5a1 1 0 0 1 -1 -1v-5a1 1 0 0 1 1 -1Z\"]},{\"id\":\"folder\",\"label\":\"Folder\",\"set\":\"line\",\"paths\":[\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"]},{\"id\":\"download\",\"label\":\"Download\",\"set\":\"line\",\"paths\":[\"M12 15V3\",\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\",\"m7 10 5 5 5-5\"],\"open\":[0,1,2]},{\"id\":\"upload\",\"label\":\"Upload\",\"set\":\"line\",\"paths\":[\"M12 3v12\",\"m17 8-5-5-5 5\",\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"],\"open\":[0,1,2]},{\"id\":\"refresh-cw\",\"label\":\"Refresh\",\"set\":\"line\",\"paths\":[\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\",\"M21 3v5h-5\",\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\",\"M8 16H3v5\"],\"open\":[0,1,2,3]},{\"id\":\"power\",\"label\":\"Power\",\"set\":\"line\",\"paths\":[\"M12 2v10\",\"M18.4 6.6a9 9 0 1 1-12.77.04\"],\"open\":[0,1]},{\"id\":\"log-in\",\"label\":\"Join\",\"set\":\"line\",\"paths\":[\"m10 17 5-5-5-5\",\"M15 12H3\",\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\"],\"open\":[0,1,2]},{\"id\":\"log-out\",\"label\":\"Leave\",\"set\":\"line\",\"paths\":[\"m16 17 5-5-5-5\",\"M21 12H9\",\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"],\"open\":[0,1,2]},{\"id\":\"arrow-right\",\"label\":\"Arrow right\",\"set\":\"line\",\"paths\":[\"M5 12h14\",\"m12 5 7 7-7 7\"],\"open\":[0,1]},{\"id\":\"arrow-left\",\"label\":\"Arrow left\",\"set\":\"line\",\"paths\":[\"m12 19-7-7 7-7\",\"M19 12H5\"],\"open\":[0,1]},{\"id\":\"arrow-up\",\"label\":\"Arrow up\",\"set\":\"line\",\"paths\":[\"m5 12 7-7 7 7\",\"M12 19V5\"],\"open\":[0,1]},{\"id\":\"arrow-down\",\"label\":\"Arrow down\",\"set\":\"line\",\"paths\":[\"M12 5v14\",\"m19 12-7 7-7-7\"],\"open\":[0,1]},{\"id\":\"arrow-up-right\",\"label\":\"Arrow up right\",\"set\":\"line\",\"paths\":[\"M7 7h10v10\",\"M7 17 17 7\"],\"open\":[0,1]},{\"id\":\"arrow-down-right\",\"label\":\"Arrow down right\",\"set\":\"line\",\"paths\":[\"m7 7 10 10\",\"M17 7v10H7\"],\"open\":[0,1]},{\"id\":\"arrow-up-left\",\"label\":\"Arrow up left\",\"set\":\"line\",\"paths\":[\"M7 17V7h10\",\"M17 17 7 7\"],\"open\":[0,1]},{\"id\":\"arrow-down-left\",\"label\":\"Arrow down left\",\"set\":\"line\",\"paths\":[\"M17 7 7 17\",\"M17 17H7V7\"],\"open\":[0,1]},{\"id\":\"arrow-big-right\",\"label\":\"Big arrow right\",\"set\":\"line\",\"paths\":[\"M11 9a1 1 0 0 0 1-1V5.061a1 1 0 0 1 1.811-.75l6.836 6.836a1.207 1.207 0 0 1 0 1.707l-6.836 6.835a1 1 0 0 1-1.811-.75V16a1 1 0 0 0-1-1H5a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1z\"]},{\"id\":\"arrow-big-left\",\"label\":\"Big arrow left\",\"set\":\"line\",\"paths\":[\"M13 9a1 1 0 0 1-1-1V5.061a1 1 0 0 0-1.811-.75l-6.835 6.836a1.207 1.207 0 0 0 0 1.707l6.835 6.835a1 1 0 0 0 1.811-.75V16a1 1 0 0 1 1-1h6a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1z\"]},{\"id\":\"arrow-big-up\",\"label\":\"Big arrow up\",\"set\":\"line\",\"paths\":[\"M9 13a1 1 0 0 0-1-1H5.061a1 1 0 0 1-.75-1.811l6.836-6.835a1.207 1.207 0 0 1 1.707 0l6.835 6.835a1 1 0 0 1-.75 1.811H16a1 1 0 0 0-1 1v6a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1z\"]},{\"id\":\"arrow-big-down\",\"label\":\"Big arrow down\",\"set\":\"line\",\"paths\":[\"M15 11a1 1 0 0 0 1 1h2.939a1 1 0 0 1 .75 1.811l-6.835 6.836a1.207 1.207 0 0 1-1.707 0L4.31 13.81a1 1 0 0 1 .75-1.811H8a1 1 0 0 0 1-1V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1z\"]},{\"id\":\"circle-arrow-right\",\"label\":\"Circle arrow right\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m12 16 4-4-4-4\",\"M8 12h8\"],\"inner\":[1,2]},{\"id\":\"circle-arrow-left\",\"label\":\"Circle arrow left\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m12 8-4 4 4 4\",\"M16 12H8\"],\"inner\":[1,2]},{\"id\":\"circle-arrow-up\",\"label\":\"Circle arrow up\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m16 12-4-4-4 4\",\"M12 16V8\"],\"inner\":[1,2]},{\"id\":\"circle-arrow-down\",\"label\":\"Circle arrow down\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M12 8v8\",\"m8 12 4 4 4-4\"],\"inner\":[1,2]},{\"id\":\"arrow-up-down\",\"label\":\"Arrows up down\",\"set\":\"line\",\"paths\":[\"m21 16-4 4-4-4\",\"M17 20V4\",\"m3 8 4-4 4 4\",\"M7 4v16\"],\"open\":[0,1,2,3]},{\"id\":\"arrow-right-to-line\",\"label\":\"Arrow to line\",\"set\":\"line\",\"paths\":[\"M17 12H3\",\"m11 18 6-6-6-6\",\"M21 5v14\"],\"open\":[0,1,2]},{\"id\":\"arrow-down-to-line\",\"label\":\"Arrow down to line\",\"set\":\"line\",\"paths\":[\"M12 17V3\",\"m6 11 6 6 6-6\",\"M19 21H5\"],\"open\":[0,1,2]},{\"id\":\"arrow-up-from-line\",\"label\":\"Arrow up from line\",\"set\":\"line\",\"paths\":[\"m18 9-6-6-6 6\",\"M12 3v14\",\"M5 21h14\"],\"open\":[0,1,2]},{\"id\":\"square-arrow-out-up-right\",\"label\":\"Open in new\",\"set\":\"line\",\"paths\":[\"M21 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h6\",\"m21 3-9 9\",\"M15 3h6v6\"],\"open\":[0,1,2]},{\"id\":\"corner-down-right\",\"label\":\"Corner down right\",\"set\":\"line\",\"paths\":[\"m15 10 5 5-5 5\",\"M4 4v7a4 4 0 0 0 4 4h12\"],\"open\":[0,1]},{\"id\":\"corner-up-right\",\"label\":\"Corner up right\",\"set\":\"line\",\"paths\":[\"m15 14 5-5-5-5\",\"M4 20v-7a4 4 0 0 1 4-4h12\"],\"open\":[0,1]},{\"id\":\"corner-down-left\",\"label\":\"Corner down left\",\"set\":\"line\",\"paths\":[\"M20 4v7a4 4 0 0 1-4 4H4\",\"m9 10-5 5 5 5\"],\"open\":[0,1]},{\"id\":\"corner-up-left\",\"label\":\"Corner up left\",\"set\":\"line\",\"paths\":[\"M20 20v-7a4 4 0 0 0-4-4H4\",\"M9 14 4 9l5-5\"],\"open\":[0,1]},{\"id\":\"move\",\"label\":\"Move\",\"set\":\"line\",\"paths\":[\"M12 2v20\",\"m15 19-3 3-3-3\",\"m19 9 3 3-3 3\",\"M2 12h20\",\"m5 9-3 3 3 3\",\"m9 5 3-3 3 3\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"move-right\",\"label\":\"Long arrow right\",\"set\":\"line\",\"paths\":[\"M18 8L22 12L18 16\",\"M2 12H22\"],\"open\":[0,1]},{\"id\":\"move-up-right\",\"label\":\"Long arrow up right\",\"set\":\"line\",\"paths\":[\"M13 5H19V11\",\"M19 5L5 19\"],\"open\":[0,1]},{\"id\":\"move-horizontal\",\"label\":\"Arrows left right\",\"set\":\"line\",\"paths\":[\"m18 8 4 4-4 4\",\"M2 12h20\",\"m6 8-4 4 4 4\"],\"open\":[0,1,2]},{\"id\":\"move-vertical\",\"label\":\"Arrows up down long\",\"set\":\"line\",\"paths\":[\"M12 2v20\",\"m8 18 4 4 4-4\",\"m8 6 4-4 4 4\"],\"open\":[0,1,2]},{\"id\":\"move-diagonal\",\"label\":\"Arrows diagonal\",\"set\":\"line\",\"paths\":[\"M11 19H5v-6\",\"M13 5h6v6\",\"M19 5 5 19\"],\"open\":[0,1,2]},{\"id\":\"maximize-2\",\"label\":\"Expand\",\"set\":\"line\",\"paths\":[\"M15 3h6v6\",\"m21 3-7 7\",\"m3 21 7-7\",\"M9 21H3v-6\"],\"open\":[0,1,2,3]},{\"id\":\"minimize-2\",\"label\":\"Collapse\",\"set\":\"line\",\"paths\":[\"m14 10 7-7\",\"M20 10h-6V4\",\"m3 21 7-7\",\"M4 14h6v6\"],\"open\":[0,1,2,3]},{\"id\":\"rotate-cw\",\"label\":\"Rotate\",\"set\":\"line\",\"paths\":[\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\",\"M21 3v5h-5\"],\"open\":[0,1]},{\"id\":\"rotate-ccw\",\"label\":\"Rotate back\",\"set\":\"line\",\"paths\":[\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\",\"M3 3v5h5\"],\"open\":[0,1]},{\"id\":\"iteration-cw\",\"label\":\"Loop\",\"set\":\"line\",\"paths\":[\"M4 10a8 8 0 1 1 8 8H4\",\"m8 22-4-4 4-4\"],\"open\":[0,1]},{\"id\":\"shuffle\",\"label\":\"Shuffle\",\"set\":\"line\",\"paths\":[\"m18 14 4 4-4 4\",\"m18 2 4 4-4 4\",\"M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22\",\"M2 6h1.972a4 4 0 0 1 3.6 2.2\",\"M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45\"],\"open\":[0,1,2,3,4]},{\"id\":\"repeat-2\",\"label\":\"Repeat arrows\",\"set\":\"line\",\"paths\":[\"m2 9 3-3 3 3\",\"M13 18H7a2 2 0 0 1-2-2V6\",\"m22 15-3 3-3-3\",\"M11 6h6a2 2 0 0 1 2 2v10\"],\"open\":[0,1,2,3]},{\"id\":\"forward\",\"label\":\"Forward\",\"set\":\"line\",\"paths\":[\"m15 17 5-5-5-5\",\"M4 18v-2a4 4 0 0 1 4-4h12\"],\"open\":[0,1]},{\"id\":\"reply\",\"label\":\"Reply\",\"set\":\"line\",\"paths\":[\"M20 18v-2a4 4 0 0 0-4-4H4\",\"m9 17-5-5 5-5\"],\"open\":[0,1]},{\"id\":\"share-2\",\"label\":\"Share\",\"set\":\"line\",\"paths\":[\"M15 5a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M3 12a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M15 19a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M8.59 13.51L15.42 17.49\",\"M15.41 6.51L8.59 10.49\"],\"open\":[3,4]},{\"id\":\"split\",\"label\":\"Split\",\"set\":\"line\",\"paths\":[\"M16 3h5v5\",\"M8 3H3v5\",\"M12 22v-8.3a4 4 0 0 0-1.172-2.872L3 3\",\"m15 9 6-6\"],\"open\":[0,1,2,3]},{\"id\":\"merge\",\"label\":\"Merge\",\"set\":\"line\",\"paths\":[\"m8 6 4-4 4 4\",\"M12 2v10.3a4 4 0 0 1-1.172 2.872L4 22\",\"m20 22-5-5\"],\"open\":[0,1,2]},{\"id\":\"chevron-right\",\"label\":\"Chevron right\",\"set\":\"line\",\"paths\":[\"m9 18 6-6-6-6\"],\"open\":[0]},{\"id\":\"chevron-left\",\"label\":\"Chevron left\",\"set\":\"line\",\"paths\":[\"m15 18-6-6 6-6\"],\"open\":[0]},{\"id\":\"chevron-up\",\"label\":\"Chevron up\",\"set\":\"line\",\"paths\":[\"m18 15-6-6-6 6\"],\"open\":[0]},{\"id\":\"chevron-down\",\"label\":\"Chevron down\",\"set\":\"line\",\"paths\":[\"m6 9 6 6 6-6\"],\"open\":[0]},{\"id\":\"chevrons-right\",\"label\":\"Next\",\"set\":\"line\",\"paths\":[\"m6 17 5-5-5-5\",\"m13 17 5-5-5-5\"],\"open\":[0,1]},{\"id\":\"chevrons-left\",\"label\":\"Back\",\"set\":\"line\",\"paths\":[\"m11 17-5-5 5-5\",\"m18 17-5-5 5-5\"],\"open\":[0,1]},{\"id\":\"chevrons-up\",\"label\":\"Double up\",\"set\":\"line\",\"paths\":[\"m17 11-5-5-5 5\",\"m17 18-5-5-5 5\"],\"open\":[0,1]},{\"id\":\"chevrons-down\",\"label\":\"Double down\",\"set\":\"line\",\"paths\":[\"m7 6 5 5 5-5\",\"m7 13 5 5 5-5\"],\"open\":[0,1]},{\"id\":\"circle-chevron-right\",\"label\":\"Circle chevron\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m10 8 4 4-4 4\"],\"inner\":[1]},{\"id\":\"mouse-pointer-click\",\"label\":\"Click\",\"set\":\"line\",\"paths\":[\"M14 4.1 12 6\",\"m5.1 8-2.9-.8\",\"m6 12-1.9 2\",\"M7.2 2.2 8 5.1\",\"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z\"],\"open\":[0,1,2,3]},{\"id\":\"pointer\",\"label\":\"Pointer\",\"set\":\"line\",\"paths\":[\"M22 14a8 8 0 0 1-8 8\",\"M18 11v-1a2 2 0 0 0-2-2a2 2 0 0 0-2 2\",\"M14 10V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1\",\"M10 9.5V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v10\",\"M18 11a2 2 0 1 1 4 0v3a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\"],\"open\":[0,1,2,3,4]},{\"id\":\"spline\",\"label\":\"Curve\",\"set\":\"line\",\"paths\":[\"M17 5a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M3 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M5 17A12 12 0 0 1 17 5\"],\"open\":[2]},{\"id\":\"route\",\"label\":\"Route\",\"set\":\"line\",\"paths\":[\"M3 19a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15\",\"M15 5a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"open\":[1]},{\"id\":\"waypoints\",\"label\":\"Waypoints\",\"set\":\"line\",\"paths\":[\"m10.586 5.414-5.172 5.172\",\"m18.586 13.414-5.172 5.172\",\"M6 12h12\",\"M10 20a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M10 4a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M18 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M2 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"open\":[0,1,2]},{\"id\":\"git-branch\",\"label\":\"Branch\",\"set\":\"line\",\"paths\":[\"M15 6a9 9 0 0 0-9 9V3\",\"M15 6a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M3 18a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"open\":[0]},{\"id\":\"git-merge\",\"label\":\"Git merge\",\"set\":\"line\",\"paths\":[\"M15 18a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M3 6a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M6 21V9a9 9 0 0 0 9 9\"],\"open\":[2]},{\"id\":\"workflow\",\"label\":\"Workflow\",\"set\":\"line\",\"paths\":[\"M5 3h4a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-4a2 2 0 0 1 -2 -2v-4a2 2 0 0 1 2 -2Z\",\"M7 11v4a2 2 0 0 0 2 2h4\",\"M15 13h4a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-4a2 2 0 0 1 -2 -2v-4a2 2 0 0 1 2 -2Z\"],\"open\":[1]},{\"id\":\"milestone\",\"label\":\"Milestone\",\"set\":\"line\",\"paths\":[\"M12 13v8\",\"M12 3v3\",\"M4 6a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h13a2 2 0 0 0 1.152-.365l3.424-2.317a1 1 0 0 0 0-1.635l-3.424-2.318A2 2 0 0 0 17 6z\"],\"open\":[0,1]},{\"id\":\"signpost\",\"label\":\"Signpost\",\"set\":\"line\",\"paths\":[\"M12 13v8\",\"M12 3v3\",\"M18 6a2 2 0 0 1 1.387.56l2.307 2.22a1 1 0 0 1 0 1.44l-2.307 2.22A2 2 0 0 1 18 13H6a2 2 0 0 1-1.387-.56l-2.306-2.22a1 1 0 0 1 0-1.44l2.306-2.22A2 2 0 0 1 6 6z\"],\"open\":[0,1]},{\"id\":\"waves\",\"label\":\"Waves\",\"set\":\"line\",\"paths\":[\"M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\",\"M2 12c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\",\"M2 18c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\"],\"open\":[0,1,2]},{\"id\":\"audio-lines\",\"label\":\"Sound lines\",\"set\":\"line\",\"paths\":[\"M2 10v3\",\"M6 6v11\",\"M10 3v18\",\"M14 8v7\",\"M18 5v13\",\"M22 10v3\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"chart-spline\",\"label\":\"Spline chart\",\"set\":\"line\",\"paths\":[\"M3 3v16a2 2 0 0 0 2 2h16\",\"M7 16c.5-2 1.5-7 4-7 2 0 2 3 4 3 2.5 0 4.5-5 5-7\"],\"open\":[0,1]},{\"id\":\"separator-horizontal\",\"label\":\"Divider\",\"set\":\"line\",\"paths\":[\"m16 16-4 4-4-4\",\"M3 12h18\",\"m8 8 4-4 4 4\"],\"open\":[0,1,2]},{\"id\":\"grip-horizontal\",\"label\":\"Grip\",\"set\":\"line\",\"paths\":[\"M11 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M18 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M4 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M11 15a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M18 15a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M4 15a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\"]},{\"id\":\"ellipsis\",\"label\":\"Dots\",\"set\":\"line\",\"paths\":[\"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\"]},{\"id\":\"ellipsis-vertical\",\"label\":\"Dots vertical\",\"set\":\"line\",\"paths\":[\"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M11 5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M11 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\"]},{\"id\":\"slash\",\"label\":\"Slash\",\"set\":\"line\",\"paths\":[\"M22 2 2 22\"],\"open\":[0]},{\"id\":\"equal\",\"label\":\"Equal\",\"set\":\"line\",\"paths\":[\"M5 9L19 9\",\"M5 15L19 15\"],\"open\":[0,1]},{\"id\":\"asterisk\",\"label\":\"Asterisk\",\"set\":\"line\",\"paths\":[\"M12 6v12\",\"M17.196 9 6.804 15\",\"m6.804 9 10.392 6\"],\"open\":[0,1,2]},{\"id\":\"infinity\",\"label\":\"Infinity\",\"set\":\"line\",\"paths\":[\"M6 16c5 0 7-8 12-8a4 4 0 0 1 0 8c-5 0-7-8-12-8a4 4 0 1 0 0 8\"],\"open\":[0]},{\"id\":\"circle-plus\",\"label\":\"Plus circle\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M8 12h8\",\"M12 8v8\"],\"inner\":[1,2]},{\"id\":\"circle-minus\",\"label\":\"Minus circle\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M8 12h8\"],\"inner\":[1]},{\"id\":\"square-check\",\"label\":\"Check square\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"m9 12 2 2 4-4\"],\"inner\":[1]},{\"id\":\"square-x\",\"label\":\"Cross square\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"m15 9-6 6\",\"m9 9 6 6\"],\"inner\":[1,2]},{\"id\":\"hand-metal\",\"label\":\"Rock on\",\"set\":\"line\",\"paths\":[\"M18 12.5V10a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1.4\",\"M14 11V9a2 2 0 1 0-4 0v2\",\"M10 10.5V5a2 2 0 1 0-4 0v9\",\"m7 15-1.76-1.76a2 2 0 0 0-2.83 2.82l3.6 3.6C7.5 21.14 9.2 22 12 22h2a8 8 0 0 0 8-8V7a2 2 0 1 0-4 0v5\"],\"open\":[0,1,2,3]},{\"id\":\"undo-2\",\"label\":\"Undo\",\"set\":\"line\",\"paths\":[\"M9 14 4 9l5-5\",\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\"],\"open\":[0,1]},{\"id\":\"redo-2\",\"label\":\"Redo\",\"set\":\"line\",\"paths\":[\"m15 14 5-5-5-5\",\"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\"],\"open\":[0,1]},{\"id\":\"external-link\",\"label\":\"Open\",\"set\":\"line\",\"paths\":[\"M15 3h6v6\",\"M10 14 21 3\",\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"],\"open\":[0,1,2]},{\"id\":\"plus\",\"label\":\"Plus\",\"set\":\"line\",\"paths\":[\"M5 12h14\",\"M12 5v14\"],\"open\":[0,1]},{\"id\":\"minus\",\"label\":\"Minus\",\"set\":\"line\",\"paths\":[\"M5 12h14\"],\"open\":[0]},{\"id\":\"circle-dot\",\"label\":\"Dot\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\"],\"inner\":[1]},{\"id\":\"circle\",\"label\":\"Circle\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\"]},{\"id\":\"square\",\"label\":\"Square\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\"]},{\"id\":\"triangle\",\"label\":\"Triangle\",\"set\":\"line\",\"paths\":[\"M13.73 4a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\"]},{\"id\":\"hexagon\",\"label\":\"Hexagon\",\"set\":\"line\",\"paths\":[\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"]},{\"id\":\"badge-check\",\"label\":\"Badge\",\"set\":\"line\",\"paths\":[\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\",\"m9 12 2 2 4-4\"],\"inner\":[1]},{\"id\":\"ticket\",\"label\":\"Ticket\",\"set\":\"line\",\"paths\":[\"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z\",\"M13 5v2\",\"M13 17v2\",\"M13 11v2\"],\"inner\":[1,2,3]},{\"id\":\"tag\",\"label\":\"Tag\",\"set\":\"line\",\"paths\":[\"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\",\"M7 7.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\"],\"inner\":[1]},{\"id\":\"tags\",\"label\":\"Tags\",\"set\":\"line\",\"paths\":[\"M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z\",\"M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193\",\"M10 6.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\"],\"inner\":[2],\"open\":[1]},{\"id\":\"percent\",\"label\":\"Percent\",\"set\":\"line\",\"paths\":[\"M19 5L5 19\",\"M4 6.5a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0 -5 0Z\",\"M15 17.5a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0 -5 0Z\"],\"open\":[0]},{\"id\":\"sticker\",\"label\":\"Sticker\",\"set\":\"line\",\"paths\":[\"M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z\",\"M15 3v5a1 1 0 0 0 1 1h5\",\"M8 13h.01\",\"M16 13h.01\",\"M10 16s.8 1 2 1c1.3 0 2-1 2-1\"],\"inner\":[1,2,3,4]},{\"id\":\"dice-5\",\"label\":\"Dice\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"M16 8h.01\",\"M8 8h.01\",\"M8 16h.01\",\"M16 16h.01\",\"M12 12h.01\"],\"inner\":[1,2,3,4,5]},{\"id\":\"gamepad-2\",\"label\":\"Gamepad\",\"set\":\"line\",\"paths\":[\"M6 11L10 11\",\"M8 9L8 13\",\"M15 12L15.01 12\",\"M18 10L18.01 10\",\"M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z\"],\"inner\":[0,1,2,3]},{\"id\":\"swords\",\"label\":\"Swords\",\"set\":\"line\",\"paths\":[\"M14.5 17.5L3 6L3 3L6 3L17.5 14.5\",\"M13 19L19 13\",\"M16 16L20 20\",\"M19 21L21 19\",\"M14.5 6.5L18 3L21 3L21 6L17.5 9.5\",\"M5 14L9 18\",\"M7 17L4 20\",\"M3 19L5 21\"],\"open\":[0,1,2,3,4,5,6,7]},{\"id\":\"sword\",\"label\":\"Sword\",\"set\":\"line\",\"paths\":[\"m11 19-6-6\",\"m5 21-2-2\",\"m8 16-4 4\",\"M9.5 17.5 21 6V3h-3L6.5 14.5\"],\"open\":[0,1,2,3]},{\"id\":\"target\",\"label\":\"Target\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M6 12a6 6 0 1 0 12 0a6 6 0 1 0 -12 0Z\",\"M10 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"inner\":[1,2]},{\"id\":\"puzzle\",\"label\":\"Puzzle\",\"set\":\"line\",\"paths\":[\"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z\"]},{\"id\":\"chart-bar\",\"label\":\"Chart\",\"set\":\"line\",\"paths\":[\"M3 3v16a2 2 0 0 0 2 2h16\",\"M7 16h8\",\"M7 11h12\",\"M7 6h3\"],\"open\":[0,1,2,3]},{\"id\":\"chart-line\",\"label\":\"Trend\",\"set\":\"line\",\"paths\":[\"M3 3v16a2 2 0 0 0 2 2h16\",\"m19 9-5 5-4-4-3 3\"],\"open\":[0,1]},{\"id\":\"trending-up\",\"label\":\"Trending up\",\"set\":\"line\",\"paths\":[\"M16 7h6v6\",\"m22 7-8.5 8.5-5-5L2 17\"],\"open\":[0,1]},{\"id\":\"trending-down\",\"label\":\"Trending down\",\"set\":\"line\",\"paths\":[\"M16 17h6v-6\",\"m22 17-8.5-8.5-5 5L2 7\"],\"open\":[0,1]},{\"id\":\"activity\",\"label\":\"Activity\",\"set\":\"line\",\"paths\":[\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\"],\"open\":[0]},{\"id\":\"sun\",\"label\":\"Sun\",\"set\":\"line\",\"paths\":[\"M8 12a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\",\"M12 2v2\",\"M12 20v2\",\"m4.93 4.93 1.41 1.41\",\"m17.66 17.66 1.41 1.41\",\"M2 12h2\",\"M20 12h2\",\"m6.34 17.66-1.41 1.41\",\"m19.07 4.93-1.41 1.41\"],\"open\":[1,2,3,4,5,6,7,8]},{\"id\":\"moon\",\"label\":\"Moon\",\"set\":\"line\",\"paths\":[\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"]},{\"id\":\"cloud\",\"label\":\"Cloud\",\"set\":\"line\",\"paths\":[\"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z\"]},{\"id\":\"snowflake\",\"label\":\"Snow\",\"set\":\"line\",\"paths\":[\"m10 20-1.25-2.5L6 18\",\"M10 4 8.75 6.5 6 6\",\"m14 20 1.25-2.5L18 18\",\"m14 4 1.25 2.5L18 6\",\"m17 21-3-6h-4\",\"m17 3-3 6 1.5 3\",\"M2 12h6.5L10 9\",\"m20 10-1.5 2 1.5 2\",\"M22 12h-6.5L14 15\",\"m4 10 1.5 2L4 14\",\"m7 21 3-6-1.5-3\",\"m7 3 3 6h4\"],\"open\":[0,1,2,3,4,5,6,7,8,9,10,11]},{\"id\":\"umbrella\",\"label\":\"Umbrella\",\"set\":\"line\",\"paths\":[\"M12 13v7a2 2 0 0 0 4 0\",\"M12 2v2\",\"M20.992 13a1 1 0 0 0 .97-1.274 10.284 10.284 0 0 0-19.923 0A1 1 0 0 0 3 13z\"],\"open\":[0,1,2]},{\"id\":\"leaf\",\"label\":\"Leaf\",\"set\":\"line\",\"paths\":[\"M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z\",\"M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12\"],\"open\":[1]},{\"id\":\"tree-pine\",\"label\":\"Tree\",\"set\":\"line\",\"paths\":[\"m17 14 3 3.3a1 1 0 0 1-.7 1.7H4.7a1 1 0 0 1-.7-1.7L7 14h-.3a1 1 0 0 1-.7-1.7L9 9h-.2A1 1 0 0 1 8 7.3L12 3l4 4.3a1 1 0 0 1-.8 1.7H15l3 3.3a1 1 0 0 1-.7 1.7H17Z\",\"M12 22v-3\"],\"open\":[1]},{\"id\":\"flower-2\",\"label\":\"Flower\",\"set\":\"line\",\"paths\":[\"M12 5a3 3 0 1 1 3 3m-3-3a3 3 0 1 0-3 3m3-3v1M9 8a3 3 0 1 0 3 3M9 8h1m5 0a3 3 0 1 1-3 3m3-3h-1m-2 3v-1\",\"M10 8a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M12 10v12\",\"M12 22c4.2 0 7-1.667 7-5-4.2 0-7 1.667-7 5Z\",\"M12 22c-4.2 0-7-1.667-7-5 4.2 0 7 1.667 7 5Z\"],\"open\":[0,2]},{\"id\":\"paw-print\",\"label\":\"Paw\",\"set\":\"line\",\"paths\":[\"M9 4a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M16 8a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M18 16a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M9 10a5 5 0 0 1 5 5v3.5a3.5 3.5 0 0 1-6.84 1.045Q6.52 17.48 4.46 16.84A3.5 3.5 0 0 1 5.5 10Z\"]},{\"id\":\"dog\",\"label\":\"Dog\",\"set\":\"line\",\"paths\":[\"M11.25 16.25h1.5L12 17z\",\"M16 14v.5\",\"M4.42 11.247A13.152 13.152 0 0 0 4 14.556C4 18.728 7.582 21 12 21s8-2.272 8-6.444a11.702 11.702 0 0 0-.493-3.309\",\"M8 14v.5\",\"M8.5 8.5c-.384 1.05-1.083 2.028-2.344 2.5-1.931.722-3.576-.297-3.656-1-.113-.994 1.177-6.53 4-7 1.923-.321 3.651.845 3.651 2.235A7.497 7.497 0 0 1 14 5.277c0-1.39 1.844-2.598 3.767-2.277 2.823.47 4.113 6.006 4 7-.08.703-1.725 1.722-3.656 1-1.261-.472-1.855-1.45-2.239-2.5\"],\"open\":[1,2,3,4]},{\"id\":\"cat\",\"label\":\"Cat\",\"set\":\"line\",\"paths\":[\"M12 5c.67 0 1.35.09 2 .26 1.78-2 5.03-2.84 6.42-2.26 1.4.58-.42 7-.42 7 .57 1.07 1 2.24 1 3.44C21 17.9 16.97 21 12 21s-9-3-9-7.56c0-1.25.5-2.4 1-3.44 0 0-1.89-6.42-.5-7 1.39-.58 4.72.23 6.5 2.23A9.04 9.04 0 0 1 12 5Z\",\"M8 14v.5\",\"M16 14v.5\",\"M11.25 16.25h1.5L12 17l-.75-.75Z\"],\"inner\":[1,2,3]},{\"id\":\"fish\",\"label\":\"Fish\",\"set\":\"line\",\"paths\":[\"M6.5 12c.94-3.46 4.94-6 8.5-6 3.56 0 6.06 2.54 7 6-.94 3.47-3.44 6-7 6s-7.56-2.53-8.5-6Z\",\"M18 12v.5\",\"M16 17.93a9.77 9.77 0 0 1 0-11.86\",\"M7 10.67C7 8 5.58 5.97 2.73 5.5c-1 1.5-1 5 .23 6.5-1.24 1.5-1.24 5-.23 6.5C5.58 18.03 7 16 7 13.33\",\"M10.46 7.26C10.2 5.88 9.17 4.24 8 3h5.8a2 2 0 0 1 1.98 1.67l.23 1.4\",\"m16.01 17.93-.23 1.4A2 2 0 0 1 13.8 21H9.5a5.96 5.96 0 0 0 1.49-3.98\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"bird\",\"label\":\"Bird\",\"set\":\"line\",\"paths\":[\"M16 7h.01\",\"M3.4 18H12a8 8 0 0 0 8-8V7a4 4 0 0 0-7.28-2.3L2 20\",\"m20 7 2 .5-2 .5\",\"M10 18v3\",\"M14 17.75V21\",\"M7 18a6 6 0 0 0 3.84-10.61\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"pizza\",\"label\":\"Pizza\",\"set\":\"line\",\"paths\":[\"m12 14-1 1\",\"m13.75 18.25-1.25 1.42\",\"M17.775 5.654a15.68 15.68 0 0 0-12.121 12.12\",\"M18.8 9.3a1 1 0 0 0 2.1 7.7\",\"M21.964 20.732a1 1 0 0 1-1.232 1.232l-18-5a1 1 0 0 1-.695-1.232A19.68 19.68 0 0 1 15.732 2.037a1 1 0 0 1 1.232.695z\"],\"open\":[0,1,2,3,4]},{\"id\":\"coffee\",\"label\":\"Coffee\",\"set\":\"line\",\"paths\":[\"M10 2v2\",\"M14 2v2\",\"M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1\",\"M6 2v2\"],\"open\":[0,1,2,3]},{\"id\":\"cake\",\"label\":\"Cake\",\"set\":\"line\",\"paths\":[\"M20 21v-8a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8\",\"M4 16s.5-1 2-1 2.5 2 4 2 2.5-2 4-2 2.5 2 4 2 2-1 2-1\",\"M2 21h20\",\"M7 8v3\",\"M12 8v3\",\"M17 8v3\",\"M7 4h.01\",\"M12 4h.01\",\"M17 4h.01\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"beer\",\"label\":\"Beer\",\"set\":\"line\",\"paths\":[\"M17 11h1a3 3 0 0 1 0 6h-1\",\"M9 12v6\",\"M13 12v6\",\"M14 7.5c-1 0-1.44.5-3 .5s-2-.5-3-.5-1.72.5-2.5.5a2.5 2.5 0 0 1 0-5c.78 0 1.57.5 2.5.5S9.44 2 11 2s2 1.5 3 1.5 1.72-.5 2.5-.5a2.5 2.5 0 0 1 0 5c-.78 0-1.5-.5-2.5-.5Z\",\"M5 8v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V8\"],\"open\":[0,1,2,4]},{\"id\":\"car\",\"label\":\"Car\",\"set\":\"line\",\"paths\":[\"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2\",\"M5 17a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M9 17h6\",\"M15 17a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"open\":[0,1,2,3]},{\"id\":\"plane\",\"label\":\"Plane\",\"set\":\"line\",\"paths\":[\"M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.1-1.1.5l-.3.5c-.2.5-.1 1 .3 1.3L9 12l-2 3H4l-1 1 3 2 2 3 1-1v-3l3-2 3.5 5.3c.3.4.8.5 1.3.3l.5-.2c.4-.3.6-.7.5-1.2z\"]},{\"id\":\"ship\",\"label\":\"Ship\",\"set\":\"line\",\"paths\":[\"M12 10.189V14\",\"M12 2v3\",\"M19 13V7a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v6\",\"M19.38 20A11.6 11.6 0 0 0 21 14l-8.188-3.639a2 2 0 0 0-1.624 0L3 14a11.6 11.6 0 0 0 2.81 7.76\",\"M2 21c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1s1.2 1 2.5 1c2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\"],\"open\":[0,1,2,3,4]},{\"id\":\"anchor\",\"label\":\"Anchor\",\"set\":\"line\",\"paths\":[\"M12 6v16\",\"m19 13 2-1a9 9 0 0 1-18 0l2 1\",\"M9 11h6\",\"M10 4a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"open\":[0,1,2]},{\"id\":\"mountain\",\"label\":\"Mountain\",\"set\":\"line\",\"paths\":[\"m8 3 4 8 5-5 5 15H2L8 3z\"]},{\"id\":\"tent\",\"label\":\"Tent\",\"set\":\"line\",\"paths\":[\"M3.5 21 14 3\",\"M20.5 21 10 3\",\"M15.5 21 12 15l-3.5 6\",\"M2 21h20\"],\"open\":[0,1,2,3]},{\"id\":\"compass\",\"label\":\"Compass\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z\"],\"inner\":[1]},{\"id\":\"map\",\"label\":\"Map\",\"set\":\"line\",\"paths\":[\"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z\",\"M15 5.764v15\",\"M9 3.236v15\"],\"inner\":[1,2]},{\"id\":\"phone\",\"label\":\"Phone\",\"set\":\"line\",\"paths\":[\"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384\"]},{\"id\":\"smartphone\",\"label\":\"Smartphone\",\"set\":\"line\",\"paths\":[\"M7 2h10a2 2 0 0 1 2 2v16a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-16a2 2 0 0 1 2 -2Z\",\"M12 18h.01\"],\"inner\":[1]},{\"id\":\"laptop\",\"label\":\"Laptop\",\"set\":\"line\",\"paths\":[\"M18 5a2 2 0 0 1 2 2v8.526a2 2 0 0 0 .212.897l1.068 2.127a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45l1.068-2.127A2 2 0 0 0 4 15.526V7a2 2 0 0 1 2-2z\",\"M20.054 15.987H3.946\"],\"inner\":[1]},{\"id\":\"monitor\",\"label\":\"Monitor\",\"set\":\"line\",\"paths\":[\"M4 3h16a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2Z\",\"M8 21L16 21\",\"M12 17L12 21\"],\"open\":[1,2]},{\"id\":\"keyboard\",\"label\":\"Keyboard\",\"set\":\"line\",\"paths\":[\"M10 8h.01\",\"M12 12h.01\",\"M14 8h.01\",\"M16 12h.01\",\"M18 8h.01\",\"M6 8h.01\",\"M7 16h10\",\"M8 12h.01\",\"M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2Z\"],\"inner\":[0,1,2,3,4,5,6,7]},{\"id\":\"mouse\",\"label\":\"Mouse\",\"set\":\"line\",\"paths\":[\"M12 2h0a7 7 0 0 1 7 7v6a7 7 0 0 1 -7 7h0a7 7 0 0 1 -7 -7v-6a7 7 0 0 1 7 -7Z\",\"M12 6v4\"],\"inner\":[1]},{\"id\":\"wifi\",\"label\":\"Wi-Fi\",\"set\":\"line\",\"paths\":[\"M12 20h.01\",\"M2 8.82a15 15 0 0 1 20 0\",\"M5 12.859a10 10 0 0 1 14 0\",\"M8.5 16.429a5 5 0 0 1 7 0\"],\"open\":[1,2,3]},{\"id\":\"battery-full\",\"label\":\"Battery\",\"set\":\"line\",\"paths\":[\"M10 10v4\",\"M14 10v4\",\"M22 14v-4\",\"M6 10v4\",\"M4 6h12a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-8a2 2 0 0 1 2 -2Z\"],\"inner\":[0,1,3],\"open\":[2]},{\"id\":\"plug\",\"label\":\"Plug\",\"set\":\"line\",\"paths\":[\"M12 22v-5\",\"M15 8V2\",\"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z\",\"M9 8V2\"],\"open\":[0,1,3]},{\"id\":\"magnet\",\"label\":\"Magnet\",\"set\":\"line\",\"paths\":[\"m12 15 4 4\",\"M2.352 10.648a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l6.029-6.029a1 1 0 1 1 3 3l-6.029 6.029a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l6.365-6.367A1 1 0 0 0 8.716 4.282z\",\"m5 8 4 4\"],\"open\":[0,1,2]},{\"id\":\"atom\",\"label\":\"Atom\",\"set\":\"line\",\"paths\":[\"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M20.2 20.2c2.04-2.03.02-7.36-4.5-11.9-4.54-4.52-9.87-6.54-11.9-4.5-2.04 2.03-.02 7.36 4.5 11.9 4.54 4.52 9.87 6.54 11.9 4.5Z\",\"M15.7 15.7c4.52-4.54 6.54-9.87 4.5-11.9-2.03-2.04-7.36-.02-11.9 4.5-4.52 4.54-6.54 9.87-4.5 11.9 2.03 2.04 7.36.02 11.9-4.5Z\"],\"open\":[0,1,2]},{\"id\":\"flask-conical\",\"label\":\"Flask\",\"set\":\"line\",\"paths\":[\"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2\",\"M6.453 15h11.094\",\"M8.5 2h7\"],\"open\":[0,1,2]},{\"id\":\"dna\",\"label\":\"DNA\",\"set\":\"line\",\"paths\":[\"m10 16 1.5 1.5\",\"m14 8-1.5-1.5\",\"M15 2c-1.798 1.998-2.518 3.995-2.807 5.993\",\"m16.5 10.5 1 1\",\"m17 6-2.891-2.891\",\"M2 15c6.667-6 13.333 0 20-6\",\"m20 9 .891.891\",\"M3.109 14.109 4 15\",\"m6.5 12.5 1 1\",\"m7 18 2.891 2.891\",\"M9 22c1.798-1.998 2.518-3.995 2.807-5.993\"],\"open\":[0,1,2,3,4,5,6,7,8,9,10]},{\"id\":\"pill\",\"label\":\"Pill\",\"set\":\"line\",\"paths\":[\"m10.5 20.5 10-10a4.95 4.95 0 1 0-7-7l-10 10a4.95 4.95 0 1 0 7 7Z\",\"m8.5 8.5 7 7\"],\"inner\":[1]},{\"id\":\"syringe\",\"label\":\"Syringe\",\"set\":\"line\",\"paths\":[\"m18 2 4 4\",\"m17 7 3-3\",\"M19 9 8.7 19.3c-1 1-2.5 1-3.4 0l-.6-.6c-1-1-1-2.5 0-3.4L15 5\",\"m9 11 4 4\",\"m5 19-3 3\",\"m14 4 6 6\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"heart-pulse\",\"label\":\"Health\",\"set\":\"line\",\"paths\":[\"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\",\"M3.22 13H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27\"],\"inner\":[1]},{\"id\":\"dumbbell\",\"label\":\"Gym\",\"set\":\"line\",\"paths\":[\"M17.596 12.768a2 2 0 1 0 2.829-2.829l-1.768-1.767a2 2 0 0 0 2.828-2.829l-2.828-2.828a2 2 0 0 0-2.829 2.828l-1.767-1.768a2 2 0 1 0-2.829 2.829z\",\"m2.5 21.5 1.4-1.4\",\"m20.1 3.9 1.4-1.4\",\"M5.343 21.485a2 2 0 1 0 2.829-2.828l1.767 1.768a2 2 0 1 0 2.829-2.829l-6.364-6.364a2 2 0 1 0-2.829 2.829l1.768 1.767a2 2 0 0 0-2.828 2.829z\",\"m9.6 14.4 4.8-4.8\"],\"inner\":[1,2],\"open\":[4]},{\"id\":\"bike\",\"label\":\"Bike\",\"set\":\"line\",\"paths\":[\"M15 17.5a3.5 3.5 0 1 0 7 0a3.5 3.5 0 1 0 -7 0Z\",\"M2 17.5a3.5 3.5 0 1 0 7 0a3.5 3.5 0 1 0 -7 0Z\",\"M14 5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M12 17.5V14l-3-3 4-3 2 3h2\"],\"open\":[0,1,2,3]},{\"id\":\"graduation-cap\",\"label\":\"Graduation\",\"set\":\"line\",\"paths\":[\"M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z\",\"M22 10v6\",\"M6 12.5V16a6 3 0 0 0 12 0v-3.5\"],\"inner\":[1],\"open\":[2]},{\"id\":\"school\",\"label\":\"School\",\"set\":\"line\",\"paths\":[\"M14 21v-3a2 2 0 0 0-4 0v3\",\"M18 5v16\",\"m4 6 7.106-3.79a2 2 0 0 1 1.788 0L20 6\",\"m6 11-3.52 2.147a1 1 0 0 0-.48.854V19a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5a1 1 0 0 0-.48-.853L18 11\",\"M6 5v16\",\"M10 9a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"open\":[0,1,2,3,4]},{\"id\":\"briefcase\",\"label\":\"Briefcase\",\"set\":\"line\",\"paths\":[\"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\",\"M4 6h16a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2Z\"],\"open\":[0]},{\"id\":\"building-2\",\"label\":\"Building\",\"set\":\"line\",\"paths\":[\"M10 12h4\",\"M10 8h4\",\"M14 21v-3a2 2 0 0 0-4 0v3\",\"M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2\",\"M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16\"],\"open\":[0,1,2,3,4]},{\"id\":\"landmark\",\"label\":\"Bank\",\"set\":\"line\",\"paths\":[\"M10 18v-7\",\"M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z\",\"M14 18v-7\",\"M18 18v-7\",\"M3 22h18\",\"M6 18v-7\"],\"open\":[0,2,3,4,5]},{\"id\":\"store\",\"label\":\"Store\",\"set\":\"line\",\"paths\":[\"M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5\",\"M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244\",\"M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05\"],\"open\":[0,2]},{\"id\":\"shopping-cart\",\"label\":\"Cart\",\"set\":\"line\",\"paths\":[\"M7 21a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M18 21a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12\"],\"open\":[2]},{\"id\":\"shopping-bag\",\"label\":\"Bag\",\"set\":\"line\",\"paths\":[\"M16 10a4 4 0 0 1-8 0\",\"M3.103 6.034h17.794\",\"M3.4 5.467a2 2 0 0 0-.4 1.2V20a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.667a2 2 0 0 0-.4-1.2l-2-2.667A2 2 0 0 0 17 2H7a2 2 0 0 0-1.6.8z\"],\"inner\":[0,1]},{\"id\":\"shopping-basket\",\"label\":\"Basket\",\"set\":\"line\",\"paths\":[\"m15 11-1 9\",\"m19 11-4-7\",\"M2 11h20\",\"m3.5 11 1.6 7.4a2 2 0 0 0 2 1.6h9.8a2 2 0 0 0 2-1.6l1.7-7.4\",\"M4.5 15.5h15\",\"m5 11 4-7\",\"m9 11 1 9\"],\"open\":[0,1,2,3,4,5,6]},{\"id\":\"package\",\"label\":\"Package\",\"set\":\"line\",\"paths\":[\"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\",\"M12 22V12\",\"M3.29 7L12 12L20.71 7\",\"m7.5 4.27 9 5.15\"],\"inner\":[1,2,3]},{\"id\":\"truck\",\"label\":\"Delivery\",\"set\":\"line\",\"paths\":[\"M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2\",\"M15 18H9\",\"M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14\",\"M15 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M5 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"open\":[0,1,2]},{\"id\":\"credit-card\",\"label\":\"Card\",\"set\":\"line\",\"paths\":[\"M4 5h16a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2Z\",\"M2 10L22 10\"],\"inner\":[1]},{\"id\":\"wallet\",\"label\":\"Wallet\",\"set\":\"line\",\"paths\":[\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\",\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\"],\"open\":[0,1]},{\"id\":\"banknote\",\"label\":\"Banknote\",\"set\":\"line\",\"paths\":[\"M4 6h16a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-8a2 2 0 0 1 2 -2Z\",\"M10 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M6 12h.01M18 12h.01\"],\"inner\":[1,2]},{\"id\":\"coins\",\"label\":\"Coins\",\"set\":\"line\",\"paths\":[\"M13.744 17.736a6 6 0 1 1-7.48-7.48\",\"M15 6h1v4\",\"m6.134 14.768.866-.5 2 3.464\",\"M10 8a6 6 0 1 0 12 0a6 6 0 1 0 -12 0Z\"],\"open\":[0,1,2,3]},{\"id\":\"piggy-bank\",\"label\":\"Piggy bank\",\"set\":\"line\",\"paths\":[\"M11 17h3v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-3a3.16 3.16 0 0 0 2-2h1a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1h-1a5 5 0 0 0-2-4V3a4 4 0 0 0-3.2 1.6l-.3.4H11a6 6 0 0 0-6 6v1a5 5 0 0 0 2 4v3a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1z\",\"M16 10h.01\",\"M2 8v1a2 2 0 0 0 2 2h1\"],\"inner\":[1,2]},{\"id\":\"hand-coins\",\"label\":\"Pay\",\"set\":\"line\",\"paths\":[\"M11 15h2a2 2 0 1 0 0-4h-3c-.6 0-1.1.2-1.4.6L3 17\",\"m7 21 1.6-1.4c.3-.4.8-.6 1.4-.6h4c1.1 0 2.1-.4 2.8-1.2l4.6-4.4a2 2 0 0 0-2.75-2.91l-4.2 3.9\",\"m2 16 6 6\",\"M13.1 9a2.9 2.9 0 1 0 5.8 0a2.9 2.9 0 1 0 -5.8 0Z\",\"M3 5a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"open\":[0,1,2,3,4]},{\"id\":\"receipt\",\"label\":\"Receipt\",\"set\":\"line\",\"paths\":[\"M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z\",\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\",\"M12 17.5v-11\"],\"inner\":[1,2]},{\"id\":\"badge-dollar-sign\",\"label\":\"Dollar badge\",\"set\":\"line\",\"paths\":[\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\",\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\",\"M12 18V6\"],\"inner\":[1,2]},{\"id\":\"badge-percent\",\"label\":\"Sale\",\"set\":\"line\",\"paths\":[\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\",\"m15 9-6 6\",\"M9 9h.01\",\"M15 15h.01\"],\"inner\":[1,2,3]},{\"id\":\"dollar-sign\",\"label\":\"Dollar\",\"set\":\"line\",\"paths\":[\"M12 2L12 22\",\"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\"],\"open\":[0,1]},{\"id\":\"euro\",\"label\":\"Euro\",\"set\":\"line\",\"paths\":[\"M4 10h12\",\"M4 14h9\",\"M19 6a7.7 7.7 0 0 0-5.2-2A7.9 7.9 0 0 0 6 12c0 4.4 3.5 8 7.8 8 2 0 3.8-.8 5.2-2\"],\"open\":[0,1,2]},{\"id\":\"pound-sterling\",\"label\":\"Pound\",\"set\":\"line\",\"paths\":[\"M18 7c0-5.333-8-5.333-8 0\",\"M10 7v14\",\"M6 21h12\",\"M6 13h10\"],\"open\":[0,1,2,3]},{\"id\":\"bitcoin\",\"label\":\"Bitcoin line\",\"set\":\"line\",\"paths\":[\"M11.767 19.089c4.924.868 6.14-6.025 1.216-6.894m-1.216 6.894L5.86 18.047m5.908 1.042-.347 1.97m1.563-8.864c4.924.869 6.14-6.025 1.215-6.893m-1.215 6.893-3.94-.694m5.155-6.2L8.29 4.26m5.908 1.042.348-1.97M7.48 20.364l3.126-17.727\"],\"open\":[0]},{\"id\":\"arrow-left-right\",\"label\":\"Exchange\",\"set\":\"line\",\"paths\":[\"M8 3 4 7l4 4\",\"M4 7h16\",\"m16 21 4-4-4-4\",\"M20 17H4\"],\"open\":[0,1,2,3]},{\"id\":\"repeat\",\"label\":\"Repeat\",\"set\":\"line\",\"paths\":[\"m17 2 4 4-4 4\",\"M3 11v-1a4 4 0 0 1 4-4h14\",\"m7 22-4-4 4-4\",\"M21 13v1a4 4 0 0 1-4 4H3\"],\"open\":[0,1,2,3]},{\"id\":\"circle-dollar-sign\",\"label\":\"Money\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\",\"M12 18V6\"],\"inner\":[1,2]},{\"id\":\"vault\",\"label\":\"Vault\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"M7 7.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"m7.9 7.9 2.7 2.7\",\"M16 7.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"m13.4 10.6 2.7-2.7\",\"M7 16.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"m7.9 16.1 2.7-2.7\",\"M16 16.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"m13.4 13.4 2.7 2.7\",\"M10 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"inner\":[1,2,3,4,5,6,7,8,9]},{\"id\":\"chart-candlestick\",\"label\":\"Candles\",\"set\":\"line\",\"paths\":[\"M9 5v4\",\"M8 9h2a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-4a1 1 0 0 1 1 -1Z\",\"M9 15v2\",\"M17 3v2\",\"M16 5h2a1 1 0 0 1 1 1v6a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-6a1 1 0 0 1 1 -1Z\",\"M17 13v3\",\"M3 3v16a2 2 0 0 0 2 2h16\"],\"open\":[0,2,3,5,6]},{\"id\":\"calculator\",\"label\":\"Calculator\",\"set\":\"line\",\"paths\":[\"M6 2h12a2 2 0 0 1 2 2v16a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-16a2 2 0 0 1 2 -2Z\",\"M8 6L16 6\",\"M16 14L16 18\",\"M16 10h.01\",\"M12 10h.01\",\"M8 10h.01\",\"M12 14h.01\",\"M8 14h.01\",\"M12 18h.01\",\"M8 18h.01\"],\"inner\":[1,2,3,4,5,6,7,8,9]},{\"id\":\"bt-arrow\",\"label\":\"Arrow\",\"set\":\"solid\",\"paths\":[\"M12.69 20.5C12.62 20.43 12.56 19.68 12.56 18.82L12.56 17.27L11.86 17.15C8.28 16.58 5.51 14.75 3.7 11.77C2.67 10.08 2.25 8.53 2.12 6C2.03 4.14 2.05 3.8 2.31 3.59C2.8 3.19 3.09 3.44 3.52 4.62C4.81 8.14 8.02 10.8 11.66 11.35L12.55 11.48L12.6 9.82C12.66 8.18 12.66 8.16 13.12 8.17C13.41 8.17 15.15 9.28 17.67 11.04C21.97 14.06 22.28 14.4 21.33 14.98C21.1 15.12 19.2 16.45 17.12 17.93C13.53 20.48 12.98 20.8 12.69 20.5Z\"]},{\"id\":\"bt-arrows\",\"label\":\"Double arrow\",\"set\":\"solid\",\"paths\":[\"M2.51 18.66C2.45 18.51 2.43 18.31 2.47 18.21C2.5 18.11 3.71 16.71 5.16 15.1C6.6 13.49 7.78 12.09 7.78 12C7.78 11.91 6.6 10.51 5.16 8.9C3.51 7.06 2.53 5.81 2.53 5.56C2.53 5.17 2.62 5.15 4.89 5.1L7.26 5.05L10.14 8.27C11.73 10.03 13.1 11.6 13.18 11.74C13.39 12.11 13.35 12.17 10.15 15.73L7.27 18.94L4.94 18.94C3.07 18.94 2.59 18.88 2.51 18.66ZM10.8 18.63C10.64 18.22 10.82 17.98 13.68 14.82C15.02 13.33 16.12 12.06 16.12 12C16.12 11.94 15.02 10.67 13.68 9.18C10.82 6.02 10.64 5.78 10.8 5.37C10.9 5.11 11.26 5.06 13.23 5.06L15.54 5.06L18.51 8.36C20.14 10.17 21.47 11.81 21.47 12C21.47 12.19 20.14 13.83 18.51 15.64L15.54 18.94L13.23 18.94C11.26 18.94 10.9 18.89 10.8 18.63Z\"]},{\"id\":\"bt-basket\",\"label\":\"Basket\",\"set\":\"solid\",\"paths\":[\"M5.5 20.25C5.28 20.16 5.01 19.81 4.9 19.47C4.75 18.97 3.75 13.57 3.75 13.21C3.75 13.16 3.59 13.12 3.4 13.12C2.95 13.13 2.44 12.55 2.44 12.03C2.44 11.81 2.61 11.46 2.81 11.25C3.18 10.89 3.44 10.87 12.08 10.88L20.98 10.88L21.27 11.29C21.43 11.52 21.56 11.89 21.56 12.11C21.56 12.57 21.02 13.12 20.57 13.12C20.37 13.12 20.23 13.34 20.16 13.73C19.14 19.55 19.04 19.95 18.56 20.19C18.01 20.47 6.18 20.52 5.5 20.25ZM7.3 18.11C7.62 17.73 7.36 13.76 6.99 13.39C6.65 13.06 6.48 13.06 6.2 13.39C6.04 13.58 6.03 14.19 6.16 15.74C6.37 18.13 6.7 18.83 7.3 18.11ZM10.65 18.15C10.91 17.89 10.96 13.93 10.71 13.53C10.62 13.39 10.35 13.31 10.1 13.34C9.66 13.41 9.66 13.45 9.6 15.63C9.55 17.83 9.67 18.38 10.2 18.38C10.33 18.38 10.53 18.27 10.65 18.15ZM14.23 18.11C14.38 17.94 14.43 17.11 14.4 15.63C14.34 13.45 14.34 13.41 13.9 13.34C13.65 13.31 13.38 13.39 13.29 13.53C13.04 13.93 13.09 17.89 13.35 18.15C13.65 18.45 13.97 18.43 14.23 18.11ZM17.39 18.22C17.65 18.06 18.1 14.04 17.92 13.57C17.87 13.43 17.62 13.31 17.37 13.31C16.81 13.31 16.76 13.51 16.58 16.1C16.47 17.66 16.5 18.07 16.71 18.2C17.03 18.41 17.09 18.41 17.39 18.22ZM4.88 10.07C4.88 9.45 5.83 5.73 6.09 5.33C6.56 4.6 7.21 4.3 8.4 4.24C9.14 4.2 9.64 4.08 9.84 3.87C10.28 3.43 13.96 3.42 14.2 3.85C14.31 4.04 14.75 4.17 15.56 4.23C17.57 4.37 18 4.86 18.67 7.73C19.24 10.16 19.24 10.12 18.58 10.12C18.04 10.12 18.02 10.1 17.62 8.3C17.19 6.42 16.97 5.82 16.61 5.58C16.22 5.32 14.5 5.42 14.25 5.72C13.91 6.13 10.09 6.13 9.75 5.72C9.6 5.53 9.18 5.44 8.52 5.44C7.67 5.44 7.47 5.51 7.14 5.93C6.92 6.2 6.75 6.53 6.75 6.67C6.75 6.8 6.57 7.67 6.36 8.61C5.97 10.28 5.95 10.31 5.42 10.31C5.1 10.31 4.88 10.21 4.88 10.07Z\"]},{\"id\":\"bt-bell\",\"label\":\"Bell\",\"set\":\"solid\",\"paths\":[\"M10.78 21.3C10.1 20.99 9.47 20.33 9.2 19.64L9.01 19.12L11.91 19.12C15.12 19.12 15.15 19.14 14.39 20.25C13.59 21.42 12.06 21.87 10.78 21.3ZM4.73 18.25C4.6 18.2 4.37 17.91 4.22 17.62C3.88 16.96 4.04 16.46 4.87 15.57C6.03 14.33 6.24 13.66 6.38 10.78C6.52 7.8 6.84 6.88 8.19 5.59C8.91 4.89 10.32 4.14 10.91 4.13C11.14 4.13 11.24 3.93 11.29 3.44C11.4 2.12 12.6 2.1 12.71 3.42C12.77 4.03 12.83 4.1 13.59 4.29C15.29 4.72 17.03 6.61 17.42 8.44C17.53 8.97 17.63 10.21 17.63 11.21C17.63 13.3 18.01 14.39 19.2 15.71C20 16.59 20.1 17.4 19.46 17.99C19.07 18.36 18.85 18.37 12.01 18.36C8.14 18.35 4.86 18.3 4.73 18.25ZM3.36 10.77C3.16 10.52 3.16 10.18 3.34 8.94C3.61 7.06 4.49 5.14 5.66 3.85C6.46 2.97 6.54 2.93 7.01 3.14C7.68 3.45 7.63 3.93 6.82 4.9C5.81 6.1 5.04 7.86 4.93 9.23C4.87 9.88 4.75 10.55 4.66 10.73C4.45 11.14 3.69 11.16 3.36 10.77ZM19.36 10.83C19.26 10.7 19.13 10.09 19.07 9.47C18.94 7.91 18.3 6.34 17.32 5.14C16.37 3.97 16.29 3.46 16.99 3.14C17.46 2.93 17.54 2.97 18.3 3.81C19.39 5.02 20.2 6.73 20.57 8.59C20.8 9.78 20.82 10.23 20.66 10.59C20.43 11.11 19.69 11.24 19.36 10.83Z\"]},{\"id\":\"bt-box\",\"label\":\"Box\",\"set\":\"solid\",\"paths\":[\"M7.41 19.37C5.03 18.18 3.03 17.11 2.96 16.99C2.88 16.88 2.82 14.57 2.82 11.86L2.81 6.94L4.73 5.98L6.66 5.01L11.01 7.24L15.37 9.47L15.37 11.86C15.37 13.38 15.45 14.25 15.57 14.25C15.68 14.25 16.18 14.04 16.69 13.78L17.62 13.31L17.62 10.88L17.62 8.46L13.32 6.24C10.95 5.03 9.01 3.98 9 3.93C9 3.87 9.68 3.49 10.51 3.09L12.02 2.35L16.6 4.65L21.19 6.94L21.18 11.86C21.18 14.57 21.12 16.88 21.04 17C20.88 17.25 12.22 21.57 11.91 21.55C11.81 21.55 9.78 20.57 7.41 19.37Z\"]},{\"id\":\"bt-calendar\",\"label\":\"Calendar\",\"set\":\"solid\",\"paths\":[\"M4.95 20.17C4.63 20.03 4.31 19.77 4.25 19.6C4.18 19.42 4.12 17.09 4.12 14.42L4.12 9.56L12.09 9.56L20.06 9.56L20.06 14.02C20.06 18.98 19.95 19.73 19.13 20.16C18.36 20.55 5.85 20.56 4.95 20.17ZM8.59 18.15C8.71 18.03 8.81 17.57 8.81 17.13C8.81 16.53 8.72 16.28 8.45 16.13C7.91 15.84 7.01 15.9 6.67 16.23C6.33 16.57 6.28 17.48 6.57 18.01C6.71 18.28 6.96 18.38 7.56 18.38C8 18.38 8.46 18.27 8.59 18.15ZM12.9 18.15C13.19 17.86 13.19 16.45 12.9 16.16C12.78 16.04 12.37 15.94 12 15.94C11.13 15.94 10.88 16.21 10.88 17.16C10.88 17.58 10.98 18.03 11.1 18.15C11.39 18.44 12.61 18.44 12.9 18.15ZM17.43 18.01C17.72 17.48 17.67 16.57 17.33 16.23C16.99 15.9 16.09 15.84 15.55 16.13C15.28 16.28 15.19 16.53 15.19 17.13C15.19 17.57 15.29 18.03 15.41 18.15C15.54 18.27 16 18.38 16.44 18.38C17.04 18.38 17.29 18.28 17.43 18.01ZM8.52 13.77C8.87 13.42 8.91 12.17 8.59 11.85C8.46 11.73 8 11.62 7.56 11.62C6.67 11.62 6.38 11.94 6.38 12.91C6.38 13.89 7.82 14.47 8.52 13.77ZM12.76 13.87C13.03 13.72 13.12 13.47 13.12 12.87C13.12 12.43 13.02 11.97 12.9 11.85C12.61 11.56 11.39 11.56 11.1 11.85C10.74 12.21 10.82 13.63 11.2 13.86C11.63 14.11 12.31 14.11 12.76 13.87ZM17.21 13.77C17.66 13.45 17.77 12.62 17.43 11.99C17.29 11.72 17.04 11.62 16.44 11.62C16 11.62 15.54 11.73 15.41 11.85C15.09 12.17 15.13 13.42 15.48 13.77C15.86 14.14 16.67 14.15 17.21 13.77ZM4.12 7.23C4.12 5.75 4.16 5.63 4.62 5.26C5.4 4.65 5.93 4.75 6.08 5.53C6.23 6.31 6.79 6.75 7.64 6.75C8.4 6.75 9.19 6.04 9.19 5.35L9.19 4.88L12 4.88L14.81 4.88L14.81 5.35C14.81 6.04 15.6 6.75 16.36 6.75C17.21 6.75 17.77 6.31 17.92 5.53C18.02 4.97 18.12 4.88 18.55 4.88C18.85 4.88 19.24 5.07 19.5 5.34C19.86 5.73 19.95 6.07 20.02 7.31L20.11 8.81L12.12 8.81L4.12 8.81L4.12 7.23ZM6.94 5.64C6.64 5.07 6.72 4.35 7.12 3.94C7.58 3.49 7.76 3.47 8.14 3.86C8.49 4.2 8.54 5.45 8.21 5.78C7.87 6.12 7.16 6.04 6.94 5.64ZM15.8 5.78C15.43 5.42 15.51 4.23 15.92 3.86C16.66 3.19 17.52 4.31 17.13 5.42C16.94 5.96 16.18 6.17 15.8 5.78Z\"]},{\"id\":\"bt-cards\",\"label\":\"Cards\",\"set\":\"solid\",\"paths\":[\"M4.12 17.58C3.81 17.06 3.75 16.63 3.75 14.67L3.75 12.38L10.69 12.38L17.62 12.38L17.62 14.87C17.62 18.5 18.29 18.19 10.68 18.19L4.49 18.19L4.12 17.58ZM15.53 15.49C15.63 14.99 15.25 14.82 14.04 14.82C12.92 14.81 12.46 15.09 12.68 15.64C12.78 15.9 13.03 15.94 14.13 15.9C15.26 15.85 15.47 15.79 15.53 15.49ZM18.75 12.42C18.75 8.91 18.61 8.43 17.39 7.69C16.82 7.34 16.44 7.31 11.8 7.31C9.06 7.31 6.76 7.26 6.69 7.19C6.52 7.02 7.06 6.06 7.41 5.93C7.58 5.86 10.32 5.81 13.49 5.81C19.05 5.81 19.28 5.83 19.76 6.2L20.25 6.59L20.25 10.77L20.25 14.96L19.79 15.26C18.78 15.92 18.75 15.84 18.75 12.42ZM3.94 11.09C3.66 11 3.71 10 4.02 9.4C4.49 8.49 4.83 8.44 10.9 8.44L16.53 8.44L17.09 9C17.56 9.46 17.64 9.68 17.59 10.32L17.53 11.08L10.83 11.12C7.14 11.14 4.04 11.13 3.94 11.09Z\"]},{\"id\":\"bt-cart\",\"label\":\"Cart\",\"set\":\"solid\",\"paths\":[\"M7.77 21.1C6.81 20.14 7.47 18.38 8.79 18.38C10.21 18.38 10.92 20.22 9.85 21.13C9.19 21.7 8.36 21.69 7.77 21.1ZM17.34 21.1C16.71 20.48 16.71 19.46 17.34 18.84C18.31 17.86 19.91 18.56 19.91 19.97C19.91 21.37 18.31 22.08 17.34 21.1ZM8.91 17.45C7.8 16.99 7.47 16.04 7.77 14.22C7.9 13.45 7.8 12.98 6.84 10.1C6.25 8.31 5.6 6.4 5.4 5.86L5.04 4.88L4.03 4.88C2.63 4.88 2.01 4.2 2.73 3.48C3.06 3.15 5.51 3.06 5.99 3.36C6.14 3.46 6.48 4.15 6.74 4.91L7.22 6.28L14.04 6.38C20.6 6.47 20.87 6.48 21.1 6.84C21.3 7.16 21.17 7.7 20.23 10.59C19.62 12.45 18.98 14.07 18.81 14.2C18.57 14.38 17.31 14.44 14.03 14.44C9.82 14.44 9.57 14.46 9.38 14.8C9.27 15 9.19 15.34 9.19 15.55C9.19 15.92 9.29 15.93 14.37 15.98C19.35 16.03 19.56 16.05 19.8 16.41C20.02 16.74 20.01 16.86 19.77 17.21C19.48 17.62 19.43 17.62 14.38 17.61C11.58 17.61 9.11 17.53 8.91 17.45Z\"]},{\"id\":\"bt-clock\",\"label\":\"Clock\",\"set\":\"solid\",\"paths\":[\"M9.68 21.27C6.34 20.46 3.52 17.61 2.73 14.23C1.09 7.29 7.29 1.09 14.23 2.73C17.65 3.53 20.47 6.35 21.27 9.77C22.92 16.73 16.65 22.95 9.68 21.27ZM15.9 15.15C16.32 14.73 16.12 14.44 14.44 13.09L12.75 11.74L12.75 9.07C12.75 6.89 12.7 6.35 12.46 6.11C12.09 5.74 11.91 5.74 11.54 6.11C11.3 6.35 11.25 6.91 11.25 9.29L11.25 12.18L11.77 12.64C13.23 13.93 15.13 15.36 15.38 15.37C15.54 15.37 15.78 15.27 15.9 15.15Z\"]},{\"id\":\"bt-dislike\",\"label\":\"Dislike\",\"set\":\"solid\",\"paths\":[\"M10.31 20.58C9.25 19.85 8.92 19.25 8.85 17.85C8.82 17.15 8.91 16.16 9.06 15.61L9.32 14.62L7.33 14.62C6.24 14.62 5.04 14.54 4.66 14.43C3.8 14.19 2.69 12.99 2.52 12.12C2.34 11.16 3.31 5.53 3.81 4.63C4.03 4.24 4.5 3.73 4.87 3.51C5.47 3.13 5.77 3.09 8.06 3.11C10.66 3.12 12.86 3.45 14.59 4.09L15.47 4.42L15.52 9.34L15.57 14.26L14.45 15.3C13.14 16.51 12.56 17.59 12.56 18.8C12.56 20.83 11.69 21.52 10.31 20.58ZM17.25 14.81C16.89 14.46 16.88 14.19 16.88 9.2L16.88 3.96L17.39 3.56C17.84 3.2 18.09 3.16 19.38 3.22C21.65 3.32 21.56 3.08 21.56 9.22L21.56 14.27L21.1 14.73C20.69 15.14 20.49 15.19 19.13 15.19C17.88 15.19 17.56 15.13 17.25 14.81Z\"]},{\"id\":\"bt-dot\",\"label\":\"Dot\",\"set\":\"solid\",\"paths\":[\"M10.27 13.69C9.54 12.96 9.52 12.91 9.6 11.89C9.67 11.03 9.79 10.74 10.29 10.25C10.82 9.71 10.99 9.66 12.02 9.66C13.09 9.66 13.19 9.7 13.8 10.36C14.35 10.96 14.44 11.19 14.44 12.02C14.44 12.89 14.37 13.05 13.71 13.71C13.05 14.37 12.89 14.44 12 14.44C11.1 14.44 10.95 14.37 10.27 13.69Z\"]},{\"id\":\"bt-eur\",\"label\":\"EUR\",\"set\":\"solid\",\"paths\":[\"M3.3 13.92C3.36 13.54 3.55 12.42 3.72 11.44L4.03 9.66L6.35 9.6L8.67 9.55L8.56 10.14C8.49 10.47 8.44 10.81 8.44 10.9C8.44 10.99 7.8 11.06 7.03 11.06C6.22 11.06 5.62 11.14 5.62 11.25C5.62 11.36 6.16 11.44 6.84 11.44C7.92 11.44 8.06 11.48 8.06 11.8C8.06 12.63 7.89 12.75 6.64 12.75C5.96 12.75 5.44 12.83 5.44 12.94C5.44 13.04 6 13.12 6.76 13.12L8.09 13.12L7.96 13.73C7.89 14.07 7.79 14.41 7.75 14.48C7.7 14.56 6.66 14.62 5.42 14.62L3.18 14.62L3.3 13.92ZM9.03 14.19C8.54 13.67 8.54 13.54 8.94 11.31L9.25 9.56L10.05 9.56C10.49 9.56 10.89 9.63 10.94 9.71C10.99 9.79 10.92 10.4 10.77 11.07C10.63 11.74 10.51 12.43 10.51 12.61C10.5 12.98 11.22 13.22 11.79 13.04C12.22 12.9 12.27 12.78 12.57 10.92L12.78 9.56L13.6 9.56C14.05 9.56 14.46 9.63 14.51 9.71C14.65 9.94 13.92 13.51 13.66 13.81C13.18 14.39 12.39 14.62 10.92 14.62C9.62 14.62 9.39 14.57 9.03 14.19ZM14.55 13.92C14.61 13.54 14.8 12.42 14.97 11.44L15.28 9.66L17.32 9.6C19.23 9.55 19.4 9.58 19.83 9.98C20.21 10.34 20.27 10.53 20.2 11.21C20.14 11.68 19.94 12.2 19.71 12.45C19.17 13.02 19.21 13.12 19.97 13.12C20.66 13.12 20.75 13.3 20.51 14.2C20.4 14.6 20.29 14.62 18.82 14.62C17.25 14.62 17.24 14.62 16.88 14.03C16.5 13.4 16.5 13.39 16.21 14.39C16.16 14.53 15.8 14.62 15.28 14.62L14.43 14.62L14.55 13.92ZM18.28 11.34C18.28 11.24 17.96 11.13 17.58 11.1C17.03 11.05 16.88 11.11 16.88 11.34C16.88 11.58 17.03 11.63 17.58 11.59C17.96 11.56 18.28 11.45 18.28 11.34Z\"]},{\"id\":\"bt-gift\",\"label\":\"Gift\",\"set\":\"solid\",\"paths\":[\"M6.66 20.51C6.25 20.36 5.64 19.98 5.31 19.65C4.26 18.64 4.12 18.13 4.12 15.3L4.12 12.75L7.69 12.75L11.25 12.75L11.25 16.78L11.25 20.81L9.33 20.8C8.14 20.79 7.12 20.68 6.66 20.51ZM12.75 16.78L12.75 12.74L16.36 12.79L19.97 12.84L19.97 15C19.97 17.78 19.84 18.34 18.93 19.37C17.94 20.49 16.98 20.81 14.59 20.81L12.75 20.81L12.75 16.78ZM4.13 11.01C3.23 10.55 2.91 9.14 3.46 8.08C3.81 7.41 4.07 7.31 5.47 7.31L6.6 7.31L6.47 6.57C5.99 3.72 9.74 2.04 11.58 4.27L12 4.78L12.42 4.27C14.26 2.04 18.01 3.72 17.53 6.57L17.4 7.31L18.64 7.31C19.62 7.31 19.95 7.39 20.25 7.68C20.98 8.41 20.98 10.04 20.25 10.77C19.88 11.15 19.66 11.16 12.23 11.2C6.34 11.24 4.49 11.2 4.13 11.01ZM11.06 7.04C11.06 6.58 10.68 5.74 10.27 5.3C9.5 4.47 8.06 4.93 8.06 6C8.06 6.85 8.75 7.27 10.17 7.3C10.83 7.31 11.06 7.24 11.06 7.04ZM15.56 6.85C16.35 6.13 15.82 4.88 14.72 4.88C13.87 4.88 12.94 6.02 12.94 7.07C12.94 7.5 15.03 7.32 15.56 6.85Z\"]},{\"id\":\"bt-happy\",\"label\":\"Happy\",\"set\":\"solid\",\"paths\":[\"M10.2 20.35C8.56 19.99 7.21 19.24 5.96 17.99C2.61 14.64 2.62 9.35 5.99 5.98C9.36 2.61 14.64 2.61 18.01 5.98C21.38 9.35 21.39 14.64 18.04 17.99C16.76 19.27 15.44 19.99 13.71 20.35C12.22 20.67 11.69 20.67 10.2 20.35ZM13.48 17.52C15.16 17.02 16.54 15.49 16.86 13.76C17.16 12.13 17.34 12.19 12 12.19C6.66 12.19 6.84 12.13 7.14 13.76C7.55 15.94 9.68 17.75 11.92 17.8C12.24 17.81 12.94 17.68 13.48 17.52ZM8.81 9.91C9.07 9.9 9.52 9.96 9.82 10.04C10.18 10.13 10.4 10.1 10.5 9.93C11.07 9.02 8.96 8.25 7.7 8.9C6.74 9.4 6.78 10.24 7.76 10.03C8.08 9.97 8.55 9.91 8.81 9.91ZM15.19 9.91C15.45 9.9 15.9 9.96 16.19 10.04C16.55 10.13 16.78 10.1 16.88 9.93C17.44 9.02 15.34 8.25 14.07 8.9C13.11 9.4 13.16 10.24 14.14 10.03C14.46 9.97 14.93 9.91 15.19 9.91Z\"]},{\"id\":\"bt-hashtag\",\"label\":\"Hashtag\",\"set\":\"solid\",\"paths\":[\"M5.11 20.95C4.73 20.45 4.73 20.05 5.15 18.4L5.59 16.69L4.62 16.69C3.3 16.69 2.77 16.31 2.85 15.41C2.92 14.54 3.44 14.26 5.01 14.25L6.17 14.25L6.36 13.55C6.46 13.16 6.68 12.3 6.84 11.62C7.01 10.95 7.19 10.26 7.24 10.08C7.33 9.78 7.17 9.75 5.59 9.75C3.44 9.74 2.93 9.53 2.85 8.6C2.76 7.57 3.09 7.42 5.69 7.31L7.95 7.22L8.43 5.32C8.69 4.28 9.02 3.29 9.16 3.12C9.49 2.73 10.38 2.72 10.77 3.11C11.15 3.49 11.14 4.1 10.69 5.81C10.48 6.59 10.32 7.24 10.32 7.27C10.31 7.29 11.6 7.31 13.18 7.31L16.05 7.31L16.48 5.48C17.05 3.1 17.25 2.77 18.15 2.85C19.26 2.94 19.39 3.47 18.85 5.58L18.41 7.31L19.38 7.31C20.7 7.31 21.23 7.69 21.15 8.59C21.08 9.46 20.56 9.74 18.99 9.75L17.83 9.75L17.64 10.45C17.54 10.84 17.32 11.7 17.16 12.38C16.99 13.05 16.81 13.74 16.76 13.92C16.67 14.22 16.83 14.25 18.41 14.25C20.56 14.26 21.07 14.47 21.15 15.4C21.24 16.43 20.91 16.58 18.31 16.69L16.05 16.78L15.57 18.68C15.31 19.72 14.98 20.71 14.84 20.88C14.51 21.27 13.62 21.28 13.23 20.89C12.85 20.51 12.86 19.9 13.31 18.19C13.52 17.41 13.68 16.76 13.68 16.73C13.69 16.71 12.4 16.69 10.82 16.69L7.95 16.69L7.52 18.52C6.97 20.81 6.75 21.19 5.92 21.19C5.58 21.19 5.21 21.08 5.11 20.95ZM14.84 12.09C15.13 10.96 15.37 9.97 15.37 9.89C15.37 9.81 14.09 9.76 12.53 9.79L9.68 9.84L9.16 11.91C8.87 13.04 8.63 14.03 8.63 14.11C8.63 14.19 9.91 14.24 11.47 14.21L14.32 14.16L14.84 12.09Z\"]},{\"id\":\"bt-heart\",\"label\":\"Heart\",\"set\":\"solid\",\"paths\":[\"M9.19 18.24C4.69 14.35 3.27 12.71 2.69 10.7C1.94 8.13 3.08 5.28 5.34 4.07C5.92 3.76 6.43 3.66 7.51 3.66C8.77 3.66 9.04 3.72 9.85 4.22C10.36 4.54 11.03 5.14 11.34 5.57C11.65 6 11.95 6.35 12 6.36C12.05 6.36 12.37 5.99 12.7 5.53C13.04 5.08 13.71 4.47 14.2 4.18C14.97 3.73 15.29 3.66 16.5 3.66C18.1 3.67 19 4.04 20 5.09C21.11 6.27 21.46 7.23 21.47 9C21.47 10.43 21.4 10.73 20.86 11.84C20.45 12.67 19.76 13.59 18.79 14.57C16.97 16.44 12.31 20.44 11.97 20.43C11.83 20.43 10.58 19.44 9.19 18.24Z\"]},{\"id\":\"bt-info\",\"label\":\"Info\",\"set\":\"solid\",\"paths\":[\"M9.68 21.27C6.34 20.46 3.52 17.61 2.73 14.23C1.09 7.29 7.29 1.09 14.23 2.73C17.65 3.53 20.47 6.35 21.27 9.77C22.92 16.73 16.65 22.95 9.68 21.27ZM13.31 17.51C14.16 17.17 14.39 16.57 13.59 16.77C12.96 16.92 12.37 16.59 12.38 16.07C12.38 15.84 12.59 14.9 12.85 13.97C13.44 11.82 13.44 11.18 12.85 10.59C12.3 10.03 11.37 9.98 10.06 10.42C9.08 10.76 8.79 11.37 9.7 11.2C10.38 11.07 10.88 11.35 10.87 11.87C10.87 12.09 10.66 13.04 10.4 13.97C9.81 16.12 9.81 16.76 10.4 17.35C10.95 17.91 12.15 17.97 13.31 17.51ZM13.88 8.44C14.73 7.59 14.08 6.19 12.84 6.19C12.03 6.19 11.44 6.74 11.44 7.49C11.44 8.65 13.04 9.27 13.88 8.44Z\"]},{\"id\":\"bt-lightbulb\",\"label\":\"Idea\",\"set\":\"solid\",\"paths\":[\"M10.3 21.01C9.93 20.65 9.75 20.28 9.75 19.89L9.75 19.31L12 19.31L14.25 19.31L14.25 19.89C14.25 20.28 14.07 20.65 13.7 21.01C13.21 21.5 13.03 21.56 12 21.56C10.97 21.56 10.79 21.5 10.3 21.01ZM9.29 17.96C9.25 17.83 9.17 17.4 9.12 17.01C9.06 16.57 8.74 15.94 8.26 15.34C6.13 12.67 6.74 9.16 9.59 7.59C10.45 7.12 10.79 7.04 12 7.05C13.58 7.05 14.52 7.42 15.55 8.45C16.58 9.48 16.95 10.42 16.95 12C16.95 13.52 16.72 14.13 15.53 15.7C15.17 16.18 14.89 16.82 14.82 17.3L14.72 18.09L12.04 18.15C10 18.19 9.35 18.14 9.29 17.96ZM2.51 12.29C2.23 11.57 2.55 11.42 4.17 11.48C5.68 11.53 5.72 11.54 5.72 12C5.72 12.46 5.68 12.47 4.17 12.52C2.91 12.57 2.6 12.52 2.51 12.29ZM18.26 12.29C17.98 11.57 18.3 11.42 19.92 11.48C21.43 11.53 21.47 11.54 21.47 12C21.47 12.46 21.43 12.47 19.92 12.52C18.66 12.57 18.35 12.52 18.26 12.29ZM10.39 11.47C10.75 10.77 11.13 10.48 11.86 10.33C12.35 10.23 12.47 10.11 12.47 9.74C12.47 9.38 12.36 9.27 11.97 9.22C10.86 9.1 9.38 10.34 9.38 11.4C9.38 12.17 10 12.22 10.39 11.47ZM6.26 7.09C5.2 6.11 4.96 5.69 5.26 5.33C5.59 4.93 5.74 4.99 6.67 5.85C7.74 6.83 7.98 7.25 7.68 7.61C7.35 8 7.2 7.95 6.26 7.09ZM16.41 7.62C15.98 7.3 16.19 6.9 17.34 5.84C18.23 5.01 18.49 4.95 18.83 5.49C18.99 5.74 18.86 5.97 18.18 6.67C17.1 7.77 16.83 7.92 16.41 7.62ZM11.52 5.57C11.47 5.43 11.44 4.68 11.48 3.92C11.53 2.58 11.55 2.53 12 2.53C12.46 2.53 12.47 2.55 12.47 4.12C12.47 5.64 12.45 5.72 12.05 5.78C11.81 5.81 11.58 5.72 11.52 5.57Z\"]},{\"id\":\"bt-like\",\"label\":\"Like\",\"set\":\"solid\",\"paths\":[\"M13.24 20.79C11.8 20.6 9.98 20.16 9.05 19.77L8.44 19.52L8.44 14.62L8.44 9.73L9.55 8.7C10.85 7.5 11.44 6.41 11.44 5.22C11.44 4.01 11.76 3.21 12.3 3.07C13.2 2.85 14.56 3.79 14.99 4.93C15.26 5.66 15.24 7.22 14.93 8.4L14.68 9.37L16.67 9.38C17.76 9.38 18.96 9.46 19.34 9.57C20.21 9.81 21.31 11.01 21.48 11.91C21.68 12.96 20.7 18.46 20.14 19.44C19.46 20.62 18.51 21.01 16.3 20.98C15.33 20.96 13.95 20.88 13.24 20.79ZM3.25 20.62C2.49 20.32 2.44 19.92 2.44 14.72L2.44 9.73L2.9 9.27C3.31 8.86 3.51 8.81 4.87 8.81C7.24 8.81 7.12 8.5 7.12 14.8L7.12 20.04L6.63 20.42C6.24 20.73 5.88 20.81 4.9 20.8C4.21 20.79 3.47 20.71 3.25 20.62Z\"]},{\"id\":\"bt-lock\",\"label\":\"Lock\",\"set\":\"solid\",\"paths\":[\"M5.42 21.01L4.88 20.47L4.88 15.66C4.87 12.72 4.95 10.71 5.07 10.49C5.31 10.03 6.21 9.56 6.83 9.56L7.31 9.56L7.31 7.78C7.31 6.25 7.38 5.85 7.77 5.08C8.53 3.59 9.86 2.66 11.51 2.49C13.43 2.3 15.22 3.25 16.17 4.98C16.62 5.81 16.68 6.1 16.68 7.73L16.69 9.56L17.17 9.56C17.79 9.56 18.69 10.03 18.93 10.49C19.05 10.71 19.12 12.72 19.12 15.66L19.13 20.47L18.58 21.01L18.03 21.56L12 21.56L5.97 21.56L5.42 21.01ZM12.52 18.15C12.65 18.03 12.75 17.45 12.75 16.87C12.75 16.05 12.83 15.73 13.12 15.47C13.53 15.1 13.63 14.09 13.32 13.51C13.22 13.33 12.88 13.07 12.57 12.94C11.9 12.66 10.99 12.94 10.68 13.51C10.37 14.09 10.47 15.1 10.88 15.47C11.17 15.73 11.25 16.05 11.25 16.87C11.25 17.95 11.46 18.38 12 18.38C12.16 18.38 12.4 18.27 12.52 18.15ZM15.18 8.02C15.18 6.76 15.1 6.33 14.76 5.72C14.13 4.61 13.29 4.12 12 4.12C9.91 4.13 8.81 5.5 8.81 8.1L8.81 9.56L12 9.56L15.19 9.56L15.18 8.02Z\"]},{\"id\":\"bt-megaphone\",\"label\":\"Announcement\",\"set\":\"solid\",\"paths\":[\"M11.09 20.16L9.66 18.76L10.45 17.97L11.24 17.17L11.82 17.73L12.4 18.28L12.86 17.76C13.42 17.1 13.42 17.04 12.85 16.51L12.39 16.07L12.86 15.71C13.4 15.28 13.7 15.43 14.18 16.36C14.55 17.07 14.37 17.81 13.69 18.47L13.14 18.99L13.6 19.54C14.16 20.21 14.19 20.69 13.69 21.19C13.05 21.83 12.6 21.65 11.09 20.16ZM5.91 18.97C5.11 18.48 3.78 16.99 3.64 16.42C3.43 15.59 3.69 15.14 5.29 13.55L6.85 12L8.82 13.97L10.78 15.95L9.07 17.63C7.23 19.44 6.91 19.58 5.91 18.97ZM7.68 15.85C8.21 15.31 8.27 15.16 8.07 14.91C7.71 14.48 7.41 14.56 6.78 15.28C5.73 16.47 6.57 17 7.68 15.85ZM9.61 13.26C8.55 12.2 7.69 11.28 7.69 11.2C7.69 11.13 7.98 10.65 8.34 10.15C9.1 9.09 9.86 7.47 10.04 6.49C10.11 6.12 10.23 5.77 10.3 5.73C10.37 5.68 11.97 7.19 13.86 9.08L17.29 12.51L16.38 12.74C15.1 13.06 14 13.57 12.73 14.44C12.12 14.85 11.61 15.19 11.58 15.19C11.55 15.19 10.66 14.32 9.61 13.26ZM18.66 12.19C17.99 11.91 10.5 4.23 10.5 3.83C10.5 3.21 11.04 2.62 11.59 2.63C12.01 2.63 12.86 3.39 16.18 6.71C18.42 8.96 20.25 10.95 20.25 11.13C20.25 11.46 19.45 12.38 19.18 12.36C19.1 12.36 18.86 12.28 18.66 12.19ZM18.38 7.78C17.92 7.23 18.3 6.91 19.36 6.97C20.14 7.02 20.35 7.1 20.41 7.38C20.44 7.58 20.36 7.81 20.22 7.9C19.81 8.16 18.63 8.09 18.38 7.78ZM17.29 5.59C16.93 5.23 17.02 5 17.79 4.24C18.23 3.81 18.66 3.55 18.87 3.59C19.48 3.71 19.39 4.31 18.64 5.08C17.88 5.86 17.65 5.95 17.29 5.59ZM15.04 4.47C14.78 4.21 14.74 3.03 14.98 2.65C15.07 2.51 15.3 2.43 15.49 2.47C15.79 2.53 15.84 2.71 15.84 3.56C15.84 4.63 15.54 4.97 15.04 4.47Z\"]},{\"id\":\"bt-money\",\"label\":\"Money\",\"set\":\"solid\",\"paths\":[\"M2.73 18.83C2.48 18.58 2.44 17.87 2.44 13.99C2.44 10.71 2.5 9.39 2.66 9.22C2.99 8.9 21.01 8.9 21.34 9.22C21.5 9.39 21.56 10.71 21.56 13.99C21.56 17.87 21.52 18.58 21.27 18.83C21.01 19.09 19.91 19.12 12 19.12C4.09 19.12 2.99 19.09 2.73 18.83ZM8.91 17.62C8.91 17.4 8.53 17.33 7.03 17.25C4.34 17.12 4.31 17.09 4.32 14.07C4.32 11.85 4.35 11.69 4.78 11.2C5.22 10.7 5.3 10.69 7.12 10.69C8.67 10.69 9 10.64 9 10.41C9 10.17 8.63 10.12 6.83 10.12C4.86 10.12 4.64 10.16 4.56 10.48C4.51 10.67 4.26 10.92 4.02 11.04C3.57 11.24 3.56 11.26 3.56 14.06L3.56 16.88L4.03 17.06C4.29 17.16 4.5 17.36 4.5 17.51C4.5 17.92 4.81 17.98 6.94 17.94C8.55 17.91 8.91 17.85 8.91 17.62ZM13.22 17.68C13.92 17.51 14.93 16.69 15.32 15.98C16.24 14.33 16.02 12.63 14.71 11.32C12.85 9.47 9.91 9.89 8.63 12.2C7.7 13.87 8.19 16.07 9.74 17.15C10.8 17.88 11.81 18.04 13.22 17.68ZM19.2 17.89C19.37 17.82 19.5 17.65 19.5 17.51C19.5 17.36 19.71 17.16 19.97 17.06L20.44 16.88L20.44 14.06C20.44 11.26 20.43 11.24 19.98 11.04C19.74 10.92 19.49 10.67 19.44 10.48C19.36 10.16 19.14 10.12 17.17 10.12C15.37 10.12 15 10.17 15 10.41C15 10.64 15.33 10.69 16.88 10.69C18.7 10.69 18.78 10.7 19.22 11.2C19.65 11.69 19.68 11.85 19.68 14.06C19.68 16.29 19.66 16.43 19.24 16.83C18.84 17.21 18.6 17.25 17 17.25C15.3 17.25 14.83 17.39 15.09 17.81C15.22 18.01 18.71 18.08 19.2 17.89ZM10.69 17.04C9.52 16.57 8.81 15.45 8.81 14.06C8.81 12.98 9.1 12.32 9.87 11.6C11.91 9.69 15.24 11.24 15.22 14.08C15.21 15.46 14.45 16.6 13.25 17.05C12.6 17.3 11.32 17.29 10.69 17.04ZM12.32 16.36C12.39 16.18 12.6 15.92 12.78 15.79C13.2 15.49 13.24 14.39 12.86 14.07C12.71 13.95 12.35 13.79 12.06 13.71C11.66 13.6 11.53 13.45 11.53 13.11C11.53 12.43 12.31 12.37 12.56 13.03C12.66 13.3 12.83 13.47 12.94 13.41C13.27 13.2 13.12 12.67 12.55 12.01L12 11.36L11.45 12.01C11.14 12.36 10.89 12.88 10.88 13.16C10.87 13.73 11.31 14.25 11.79 14.25C12.47 14.25 12.87 15.22 12.28 15.44C11.87 15.6 11.49 15.4 11.38 14.99C11.33 14.79 11.19 14.62 11.08 14.62C10.74 14.62 10.85 15.52 11.22 15.79C11.4 15.92 11.61 16.18 11.68 16.36C11.75 16.54 11.89 16.69 12 16.69C12.11 16.69 12.25 16.54 12.32 16.36ZM6.57 14.66C6.9 14.39 6.97 14.2 6.87 13.82C6.69 13.1 5.87 12.92 5.41 13.49C4.97 14.03 4.98 14.16 5.44 14.62C5.9 15.09 6.03 15.09 6.57 14.66ZM18.56 14.62C19.02 14.16 19.03 14.03 18.59 13.49C18.33 13.17 18.14 13.1 17.75 13.19C17.04 13.37 16.86 14.19 17.43 14.66C17.97 15.09 18.1 15.09 18.56 14.62ZM5.81 13.95C5.81 13.79 5.91 13.69 6.04 13.73C6.38 13.85 6.44 14.25 6.11 14.25C5.95 14.25 5.81 14.12 5.81 13.95ZM17.67 14.03C17.78 13.68 18.19 13.62 18.19 13.95C18.19 14.12 18.05 14.25 17.89 14.25C17.73 14.25 17.63 14.15 17.67 14.03ZM8.22 8.31C8.36 8.25 10.97 7.85 14.03 7.4C20.17 6.52 20.31 6.52 20.48 7.68C20.52 7.99 20.52 8.29 20.47 8.34C20.42 8.4 17.58 8.43 14.17 8.42C10.76 8.41 8.08 8.36 8.22 8.31ZM8.83 7.43C9.08 7.19 17.91 4.88 18.21 4.97C18.52 5.07 18.91 5.92 18.73 6.08C18.65 6.14 9.23 7.51 8.92 7.5C8.83 7.5 8.79 7.47 8.83 7.43Z\"]},{\"id\":\"bt-no\",\"label\":\"No\",\"set\":\"solid\",\"paths\":[\"M3.23 21.25C2.88 21.11 2.44 20.16 2.44 19.57C2.44 19.15 3.11 18.38 5.95 15.52L9.46 12L6.06 8.58C4.18 6.69 2.64 4.99 2.62 4.78C2.49 3.39 3.1 2.62 4.34 2.63C5.12 2.63 5.2 2.69 8.57 6.04L12 9.46L15.43 6.04C18.67 2.82 18.91 2.62 19.57 2.62C20.1 2.62 20.42 2.76 20.83 3.17C21.24 3.58 21.38 3.9 21.38 4.43C21.38 5.09 21.18 5.33 17.95 8.57L14.53 12.01L17.87 15.33C19.71 17.16 21.29 18.78 21.38 18.94C21.7 19.45 21.57 20.21 21.08 20.8C20.66 21.29 20.46 21.37 19.73 21.37L18.87 21.37L15.43 17.96L12 14.54L8.57 17.96L5.13 21.38L4.3 21.36C3.84 21.35 3.36 21.3 3.23 21.25Z\"]},{\"id\":\"bt-notes\",\"label\":\"Notes\",\"set\":\"solid\",\"paths\":[\"M2.99 21.01L2.44 20.47L2.44 12L2.44 3.53L2.99 2.99L3.53 2.44L8.04 2.44L12.55 2.44L12.6 4.64L12.66 6.84L14.86 6.9L17.06 6.95L17.06 8.11L17.06 9.26L14.93 11.43C12.98 13.41 12.77 13.7 12.39 14.85C12.03 15.95 12.01 16.18 12.22 16.63C12.6 17.41 13.29 17.57 14.58 17.17C15.17 16.99 15.97 16.59 16.36 16.29L17.06 15.73L17.06 17.91C17.06 20.21 16.85 20.98 16.14 21.37C15.91 21.49 13.49 21.56 9.65 21.56L3.53 21.56L2.99 21.01ZM13.48 19.06C13.6 18.91 13.64 18.66 13.57 18.49C13.47 18.22 13.17 18.18 11.37 18.23C9.5 18.28 9.28 18.32 9.22 18.63C9.11 19.18 9.52 19.31 11.46 19.31C12.77 19.31 13.33 19.24 13.48 19.06ZM13.26 16.2C13.2 16.14 13.23 15.86 13.33 15.59C13.43 15.32 13.55 14.97 13.61 14.83C13.67 14.63 13.87 14.73 14.36 15.2L15.01 15.84L14.4 16.06C13.67 16.32 13.42 16.35 13.26 16.2ZM11.23 15.68C11.35 15.54 11.39 15.29 11.33 15.12C11.23 14.85 10.79 14.81 8.04 14.81C5.38 14.81 4.85 14.86 4.75 15.1C4.69 15.25 4.75 15.51 4.88 15.66C5.2 16.05 10.91 16.07 11.23 15.68ZM15.09 14.25L14.35 13.49L16.18 11.67L18 9.85L18.79 10.64L19.59 11.44L17.81 13.22C16.84 14.2 15.99 15 15.93 15C15.87 15 15.49 14.66 15.09 14.25ZM11.23 13.43C11.35 13.29 11.39 13.04 11.33 12.87C11.23 12.6 10.79 12.56 8.04 12.56C5.38 12.56 4.85 12.61 4.75 12.85C4.69 13 4.75 13.26 4.88 13.41C5.2 13.8 10.91 13.82 11.23 13.43ZM11.23 11.18C11.35 11.04 11.39 10.78 11.33 10.61C11.22 10.34 10.84 10.31 8 10.36C5.03 10.4 4.78 10.43 4.72 10.76C4.68 10.95 4.76 11.18 4.9 11.27C5.04 11.36 6.47 11.43 8.09 11.43C10.34 11.44 11.07 11.38 11.23 11.18ZM19.63 9.98C19.25 9.59 18.94 9.17 18.94 9.05C18.94 8.69 19.9 8.06 20.45 8.06C21.64 8.06 21.91 9.16 20.94 10.09L20.33 10.69L19.63 9.98ZM13.5 8.91C13.69 8.68 13.69 8.57 13.5 8.34C13.3 8.1 12.63 8.06 9.02 8.11C5.05 8.15 4.78 8.18 4.72 8.51C4.68 8.7 4.76 8.93 4.9 9.02C5.04 9.11 6.98 9.18 9.21 9.18C12.59 9.19 13.31 9.14 13.5 8.91ZM13.69 4.12C13.69 2.7 13.73 2.44 13.99 2.44C14.39 2.44 16.81 4.84 16.97 5.39C17.09 5.81 17.06 5.81 15.39 5.81L13.69 5.81L13.69 4.12Z\"]},{\"id\":\"bt-partner\",\"label\":\"Partner\",\"set\":\"solid\",\"paths\":[\"M14.03 19.56L13.15 19.07L13.6 18.17C14.25 16.89 14.21 15.94 13.48 15.1C13.16 14.74 12.78 14.44 12.64 14.44C12.5 14.44 12.26 14.14 12.11 13.78C11.95 13.4 11.55 12.96 11.17 12.74C10.81 12.52 10.47 12.19 10.41 12C10.34 11.81 10 11.39 9.64 11.07C9.12 10.62 8.82 10.5 8.14 10.5C7.68 10.5 7.09 10.36 6.83 10.19C5.77 9.5 4.08 10 3.43 11.19C3.09 11.83 2.58 11.96 2.48 11.43C2.42 11.1 5.51 5.21 5.92 4.87C6.15 4.67 6.75 4.91 7.65 5.54C7.68 5.56 7.53 5.87 7.32 6.21C6.52 7.53 6.94 9.17 8.26 9.85C9.22 10.34 9.91 10.19 11.91 9.07C12.94 8.48 13.87 8 13.97 8C14.22 8 20.41 11.56 20.87 11.96C21.1 12.17 21.19 12.47 21.15 12.93C21.1 13.46 20.98 13.65 20.49 13.9C19.89 14.2 19.89 14.2 20.25 14.53C21.11 15.31 20.26 16.84 19.11 16.59C18.66 16.49 18.62 16.52 18.7 16.96C18.84 17.68 18.3 18.38 17.61 18.38C17.29 18.38 16.88 18.29 16.69 18.19C16.37 18.02 16.35 18.06 16.44 18.63C16.52 19.12 16.45 19.36 16.15 19.67C15.63 20.19 15.1 20.16 14.03 19.56ZM10.5 19.54C9.99 19.38 9.56 18.89 9.56 18.46C9.56 18.07 9.52 18.05 9.02 18.24C8.35 18.49 7.57 18.06 7.39 17.36C7.3 16.97 7.19 16.92 6.68 17C5.91 17.13 5.2 16.59 5.2 15.87C5.2 15.5 5.15 15.4 5 15.55C4.68 15.87 3.65 15.78 3.31 15.41C2.82 14.86 2.94 14.25 3.85 12.69C4.78 11.11 5.33 10.71 6.06 11.09C6.59 11.37 6.74 11.61 6.75 12.17L6.75 12.61L7.15 12.11C7.47 11.7 7.67 11.62 8.22 11.66C9.13 11.74 9.57 12.45 9.24 13.32C9.06 13.81 9.06 13.87 9.28 13.69C9.7 13.34 10.52 13.55 10.94 14.11C11.28 14.57 11.3 14.71 11.11 15.23C10.93 15.68 10.93 15.77 11.1 15.6C11.41 15.29 12.03 15.32 12.52 15.67C13.11 16.08 13.06 16.9 12.37 18.1C11.65 19.37 11.15 19.75 10.5 19.54ZM17.62 8.71C15.82 7.64 14.19 6.76 14.01 6.76C13.83 6.75 12.81 7.26 11.75 7.88C10.69 8.49 9.59 9 9.32 9C8.17 9 7.61 7.41 8.48 6.63C9.04 6.13 11.82 4.55 12.41 4.4C12.69 4.33 13.34 4.46 14.07 4.74L15.28 5.19L16.31 4.57C16.88 4.23 17.48 3.95 17.64 3.94C18.01 3.94 21.63 10.05 21.49 10.43C21.43 10.57 21.28 10.68 21.15 10.67C21.01 10.66 19.43 9.78 17.62 8.71Z\"]},{\"id\":\"bt-payment-confirmed\",\"label\":\"Payment confirmed\",\"set\":\"solid\",\"paths\":[\"M15.38 17.89C13.91 17.25 13.07 16.01 13.06 14.44C13.04 12.25 14.59 10.69 16.78 10.69C18.73 10.69 20.16 11.91 20.53 13.9C21.03 16.57 17.91 18.99 15.38 17.89ZM4.69 17.11C3.56 16.55 3.36 15.87 3.42 12.84L3.47 10.22L9.16 10.17L14.85 10.12L14.04 10.73C12.3 12.07 11.73 14.67 12.79 16.55L13.29 17.44L9.31 17.44C5.91 17.44 5.25 17.39 4.69 17.11ZM17.7 14.99C18.63 13.79 18.73 13.26 18.07 13.16C17.79 13.12 17.49 13.34 17.06 13.88C16.63 14.42 16.39 14.59 16.25 14.45C15.94 14.14 15.24 14.21 15.11 14.56C14.97 14.93 16.03 16.12 16.51 16.12C16.68 16.12 17.21 15.61 17.7 14.99ZM9.28 14.44C9.28 13.98 9.25 13.97 7.64 13.91C6.29 13.87 5.97 13.91 5.88 14.15C5.64 14.79 6.17 15.02 7.76 14.96C9.24 14.91 9.28 14.89 9.28 14.44ZM3.42 8.13C3.53 7.19 4.01 6.41 4.71 6.05C5.04 5.88 6.78 5.82 11.21 5.82C17.86 5.81 18.09 5.85 18.65 6.93C18.81 7.23 18.94 7.82 18.94 8.24L18.94 9L11.13 9L3.33 9L3.42 8.13Z\"]},{\"id\":\"bt-pencil\",\"label\":\"Pencil\",\"set\":\"solid\",\"paths\":[\"M2.54 21.39C2.48 21.3 2.69 20.13 3.01 18.8L3.58 16.39L8.91 11.05L14.25 5.72L16.26 7.74L18.28 9.75L12.95 15.08L7.63 20.41L5.32 20.98C2.76 21.62 2.69 21.63 2.54 21.39ZM17.44 6.47L15.48 4.5L16.4 3.57C17.83 2.11 18.73 2.08 20.2 3.43C21.9 5.01 22 5.94 20.6 7.42C20.07 7.98 19.58 8.44 19.52 8.44C19.45 8.44 18.52 7.55 17.44 6.47Z\"]},{\"id\":\"bt-pin\",\"label\":\"Pin\",\"set\":\"solid\",\"paths\":[\"M3.86 20.08C3.47 19.65 3.35 19.86 5.5 16.9L7.17 14.59L5.65 13.06C3.98 11.38 3.79 10.88 4.55 10.17C5.64 9.14 7.61 8.73 8.89 9.26L9.52 9.52L10.93 8.09L12.35 6.66L12.25 5.8C12.16 5.08 12.22 4.87 12.63 4.37C13.18 3.73 13.9 3.51 14.62 3.78C15.33 4.05 20.03 8.8 20.26 9.49C20.5 10.22 20.27 10.87 19.58 11.41C19.04 11.84 17.92 11.95 17.71 11.61C17.63 11.48 16.97 12 16.03 12.94L14.48 14.48L14.74 15.11C15.43 16.77 14.51 19.43 13.06 19.94C12.79 20.04 12.3 19.67 10.95 18.35L9.2 16.63L6.94 18.45C5.7 19.45 4.57 20.31 4.44 20.36C4.3 20.41 4.04 20.28 3.86 20.08Z\"]},{\"id\":\"bt-rocket\",\"label\":\"Rocket\",\"set\":\"solid\",\"paths\":[\"M9.81 20.23C9.71 20.14 9.7 19.59 9.77 18.98C10.02 16.98 9.99 16.69 9.51 16.69C8.95 16.69 7.31 15.04 7.31 14.48C7.31 14.01 7.01 13.98 5.01 14.23C4.3 14.32 3.87 14.29 3.75 14.16C3.65 14.04 3.76 13.46 4.02 12.66C4.71 10.62 6.27 9.38 8.16 9.38C8.61 9.37 9.04 9.06 10.32 7.83C12.56 5.67 15.38 4.22 18.25 3.75C20.36 3.41 20.66 3.81 20.15 6.26C19.59 9.02 18.09 11.82 16.13 13.79C15.47 14.45 14.86 15 14.78 15C14.69 15 14.62 15.32 14.62 15.7C14.62 17.28 13.67 18.92 12.39 19.59C11.53 20.03 9.99 20.41 9.81 20.23ZM4.31 18.95C4.31 17.51 4.7 16.26 5.35 15.61C5.69 15.28 6.14 15 6.35 15C6.72 15 6.72 15.03 6.45 15.68C5.88 17.04 6.84 18.04 8.25 17.55C8.96 17.31 9 17.31 9 17.67C9 17.87 8.72 18.31 8.39 18.65C7.74 19.3 6.49 19.69 5.05 19.69C4.32 19.69 4.31 19.68 4.31 18.95ZM15.8 10.69C16.77 9.93 16.61 8.32 15.51 7.76C14.77 7.37 13.81 7.56 13.32 8.19C12.05 9.8 14.2 11.95 15.8 10.69Z\"]},{\"id\":\"bt-rules\",\"label\":\"Rules\",\"set\":\"solid\",\"paths\":[\"M6.2 19.19C5.83 18.72 5.81 18.48 5.81 13.1L5.81 7.5L10.88 7.5C15.25 7.5 15.94 7.46 15.94 7.22C15.94 7.06 15.78 6.94 15.6 6.94C15.06 6.94 14.44 6.23 14.44 5.62C14.44 4.54 15.72 3.93 16.6 4.58C16.95 4.83 16.97 5.19 17.06 11.94C17.11 15.84 17.23 19.18 17.32 19.36C17.47 19.67 17.15 19.69 12.03 19.69L6.59 19.69L6.2 19.19ZM18.01 19.19C17.76 18.87 17.62 18.43 17.62 17.88L17.62 17.06L18.54 17.06C20.08 17.06 20.87 18.16 20.06 19.18C19.51 19.88 18.56 19.88 18.01 19.19ZM15.33 16.73C15.39 16.55 14.55 16.5 11.56 16.5C8.05 16.5 7.28 16.59 7.63 16.95C7.7 17.01 9.44 17.05 11.5 17.02C14.3 16.98 15.27 16.91 15.33 16.73ZM15.33 14.3C15.39 14.11 14.55 14.06 11.56 14.06C8.05 14.06 7.28 14.15 7.63 14.51C7.7 14.58 9.44 14.61 11.5 14.58C14.3 14.54 15.27 14.47 15.33 14.3ZM15.33 11.86C15.39 11.68 14.53 11.62 11.45 11.62C7.83 11.62 7.25 11.69 7.63 12.07C7.7 12.14 9.44 12.17 11.5 12.14C14.3 12.11 15.27 12.03 15.33 11.86ZM15.28 9.38C15.28 9.14 14.73 9.09 11.62 9.05C8.09 9 7.31 9.1 7.58 9.55C7.68 9.69 8.83 9.74 11.5 9.71C14.71 9.66 15.28 9.61 15.28 9.38ZM4.11 6.59C3.59 6.16 3.55 5.22 4.03 4.69C4.35 4.33 4.6 4.31 9.32 4.31C14.15 4.31 14.26 4.32 14.07 4.68C13.82 5.14 13.82 6.11 14.07 6.57C14.26 6.93 14.15 6.94 9.4 6.94C4.96 6.94 4.5 6.91 4.11 6.59Z\"]},{\"id\":\"bt-search\",\"label\":\"Search\",\"set\":\"solid\",\"paths\":[\"M2.99 21.01C2.61 20.63 2.44 20.28 2.44 19.86C2.44 19.33 2.75 18.93 4.78 16.88C6.07 15.58 7.12 14.44 7.12 14.35C7.12 14.26 6.9 13.63 6.62 12.95C5.34 9.8 6.45 5.94 9.22 3.94C10.58 2.95 11.89 2.56 13.88 2.54C15.5 2.53 15.77 2.58 16.92 3.13C22.25 5.65 23.15 12.57 18.63 16.24C17.21 17.39 15.82 17.87 13.88 17.87C12.57 17.88 12.06 17.79 11.05 17.38C10.37 17.1 9.74 16.87 9.65 16.88C9.56 16.88 8.42 17.93 7.12 19.22C5.07 21.25 4.67 21.56 4.14 21.56C3.72 21.56 3.37 21.39 2.99 21.01ZM16.25 15.36C19.15 13.95 20.36 10.31 18.84 7.52C17.84 5.69 16.25 4.68 14.16 4.55C11.77 4.4 9.68 5.62 8.62 7.78C7.98 9.09 7.98 11.33 8.61 12.56C9.41 14.12 10.89 15.36 12.47 15.77C13.44 16.03 15.28 15.83 16.25 15.36ZM9.68 9.35C9.36 8.9 9.43 8.61 10.1 7.67C11.02 6.36 12.48 5.62 14.16 5.62C16.03 5.63 17.02 6.3 16.34 7.13C16.02 7.53 15.96 7.54 15.05 7.31C13.35 6.87 12.34 7.38 10.67 9.52C10.39 9.87 9.99 9.8 9.68 9.35Z\"]},{\"id\":\"bt-settings\",\"label\":\"Settings\",\"set\":\"solid\",\"paths\":[\"M9.6 21.32C9.49 21.19 9.31 20.55 9.2 19.89C9.1 19.24 8.99 18.69 8.96 18.67C8.93 18.65 8.66 18.48 8.35 18.29C7.81 17.95 7.78 17.95 6.55 18.38C5.87 18.62 5.18 18.76 5.03 18.7C4.87 18.65 4.27 17.75 3.68 16.71C2.46 14.56 2.46 14.51 3.83 13.48C4.61 12.89 4.68 12.78 4.68 12C4.68 11.23 4.62 11.11 3.93 10.62C3.51 10.33 3.04 9.89 2.88 9.65C2.61 9.23 2.64 9.12 3.67 7.3C4.26 6.26 4.88 5.35 5.03 5.29C5.19 5.23 5.85 5.37 6.5 5.61C8.28 6.25 8.92 5.9 9.21 4.11C9.31 3.45 9.49 2.81 9.6 2.68C9.88 2.34 14.12 2.34 14.4 2.68C14.51 2.81 14.7 3.47 14.81 4.14C15.01 5.25 15.09 5.4 15.66 5.71C16.27 6.04 16.31 6.03 17.48 5.61C18.14 5.38 18.81 5.23 18.97 5.29C19.12 5.35 19.74 6.26 20.33 7.3C21.37 9.11 21.4 9.21 21.12 9.64C20.96 9.89 20.49 10.33 20.07 10.62C19.39 11.11 19.32 11.23 19.32 12C19.32 12.77 19.39 12.89 20.07 13.38C20.49 13.67 20.96 14.11 21.12 14.36C21.4 14.79 21.37 14.89 20.33 16.7C19.74 17.74 19.12 18.65 18.97 18.71C18.81 18.77 18.14 18.62 17.48 18.39C16.3 17.96 16.27 17.96 15.64 18.3C15.29 18.49 15 18.69 15 18.75C14.99 19.31 14.59 21.1 14.42 21.3C14.12 21.66 9.89 21.68 9.6 21.32ZM13.51 14.76C15.49 13.71 15.74 11.14 14 9.62C12.71 8.48 11.08 8.56 9.82 9.82C8.56 11.08 8.48 12.71 9.62 14C10.7 15.24 12.09 15.51 13.51 14.76Z\"]},{\"id\":\"bt-share\",\"label\":\"Share\",\"set\":\"solid\",\"paths\":[\"M2.66 19.84C2.33 19.51 2.39 18.31 2.82 16.52C3.66 12.99 5.96 10.05 9.22 8.34C10.5 7.67 12.94 6.94 13.9 6.94C14.43 6.94 14.44 6.92 14.44 5.81C14.44 4.94 14.52 4.6 14.81 4.31C15.02 4.11 15.28 3.94 15.38 3.94C15.9 3.94 16.78 4.66 18.97 6.88C22.47 10.42 22.47 10.46 18.69 14.21C16.61 16.27 15.89 16.88 15.51 16.88C14.81 16.88 14.44 16.24 14.44 15.03L14.44 14.01L13.22 14.14C9.87 14.48 6.22 16.44 3.97 19.1C3.11 20.13 3.01 20.19 2.66 19.84Z\"]},{\"id\":\"bt-stars\",\"label\":\"Stars\",\"set\":\"solid\",\"paths\":[\"M16.79 19.35C16.61 18.54 15.66 17.52 14.75 17.14L13.93 16.8L14.81 16.39C15.76 15.95 16.58 15.05 16.79 14.2C16.92 13.68 17.25 13.48 17.25 13.93C17.25 14.56 18.36 15.9 19.24 16.33L20.16 16.79L19.25 17.23C18.37 17.66 17.25 19 17.25 19.63C17.25 20.09 16.91 19.88 16.79 19.35ZM9.4 18.66C8.72 15.97 6.86 13.96 4.22 13.03C3.91 12.93 4.01 12.84 4.78 12.54C6.91 11.72 8.33 10.17 9.2 7.71L9.69 6.32L9.81 7.05C10 8.2 10.78 9.66 11.73 10.68C12.56 11.56 14.51 12.74 15.17 12.76C15.33 12.76 14.86 13.05 14.12 13.4C11.92 14.43 10.49 16.18 9.87 18.6L9.62 19.56L9.4 18.66ZM14.81 10.07C14.81 9.44 13.7 8.1 12.82 7.67L11.91 7.21L12.82 6.77C13.69 6.34 14.81 5 14.81 4.37C14.81 3.87 15.1 4.15 15.44 4.97C15.83 5.91 16.56 6.61 17.52 6.96L18.16 7.19L17.27 7.6C16.29 8.06 15.7 8.69 15.34 9.67C15.11 10.31 14.81 10.53 14.81 10.07Z\"]},{\"id\":\"bt-unlock\",\"label\":\"Unlock\",\"set\":\"solid\",\"paths\":[\"M5.54 21.15C5.3 20.79 5.25 19.96 5.25 15.84C5.25 10.25 5.28 10.13 6.57 10.13L7.31 10.12L7.31 8.15C7.31 6.52 7.38 6.03 7.72 5.31C9.45 1.64 14.37 1.49 16.17 5.05C16.83 6.34 16.89 7.75 16.31 8.07C15.5 8.5 14.96 7.98 14.73 6.56C14.55 5.42 13.16 4.31 11.9 4.31C11.09 4.31 10.06 4.97 9.61 5.77C9.25 6.4 9.19 6.8 9.19 8.32L9.19 10.12L13.68 10.12C18.1 10.12 18.17 10.13 18.46 10.54C18.89 11.16 18.89 20.52 18.46 21.15C18.17 21.56 18.16 21.56 12 21.56C5.84 21.56 5.83 21.56 5.54 21.15ZM12.59 18.44C12.82 18.24 12.94 17.87 12.94 17.39C12.94 16.87 13.08 16.48 13.41 16.09C14.06 15.32 14.03 14.43 13.33 13.65C12.88 13.14 12.65 13.04 12 13.04C11.35 13.04 11.12 13.14 10.67 13.65C9.97 14.43 9.94 15.32 10.59 16.09C10.91 16.47 11.06 16.87 11.06 17.36C11.06 18.53 11.86 19.1 12.59 18.44Z\"]},{\"id\":\"bt-usd\",\"label\":\"USD\",\"set\":\"solid\",\"paths\":[\"M3.82 14.15C3.31 13.64 3.31 13.66 3.81 10.88L4.03 9.66L4.94 9.6L5.85 9.54L5.7 10.54C5.61 11.08 5.54 11.87 5.54 12.28C5.53 12.98 5.57 13.03 6.11 13.09C6.43 13.12 6.78 13.03 6.88 12.9C6.99 12.77 7.2 11.98 7.35 11.16L7.61 9.66L8.52 9.6C9.42 9.54 9.43 9.54 9.32 10.07C9.27 10.36 9.12 11.25 8.99 12.05C8.79 13.33 8.68 13.57 8.12 14.07C7.52 14.59 7.39 14.62 5.89 14.62C4.44 14.62 4.25 14.58 3.82 14.15ZM9.07 14.33C9.14 14.17 9.19 13.83 9.19 13.58C9.19 13.15 9.25 13.12 10.28 13.12C10.88 13.12 11.43 13.07 11.49 13.01C11.55 12.95 11.35 12.56 11.05 12.14C10.38 11.21 10.35 10.63 10.96 10.02C11.38 9.6 11.56 9.56 13.21 9.56C14.98 9.56 15 9.57 15 10.02C15 10.9 14.83 11.06 13.87 11.06C12.82 11.06 12.61 11.25 13.13 11.72C13.34 11.91 13.6 12.39 13.72 12.79C13.91 13.43 13.89 13.57 13.56 14.02C13.19 14.52 13.12 14.53 11.07 14.58C9.19 14.63 8.97 14.6 9.07 14.33ZM14.71 14.2C14.76 13.97 14.93 13.02 15.09 12.09C15.58 9.25 15.26 9.56 17.64 9.56C19.61 9.56 19.73 9.59 20.19 10.05C20.62 10.48 20.66 10.62 20.54 11.5C20.18 14.31 19.8 14.62 16.71 14.62C14.64 14.62 14.62 14.62 14.71 14.2ZM18.33 12.89C18.43 12.76 18.58 12.37 18.65 12.02C18.81 11.29 18.59 11.07 17.7 11.07C17.14 11.06 17.1 11.11 16.93 12C16.83 12.51 16.79 12.97 16.84 13.03C17.03 13.22 18.15 13.12 18.33 12.89Z\"]},{\"id\":\"bt-user\",\"label\":\"User\",\"set\":\"solid\",\"paths\":[\"M6.11 21.37C5.24 21.11 4.36 20.12 4.13 19.14C3.81 17.82 4.16 15.4 4.89 13.92C5.33 13.02 5.64 12.65 6.25 12.3C7.62 11.51 8.02 11.52 9.64 12.37C11.6 13.4 12.39 13.4 14.38 12.36C15.81 11.62 15.89 11.6 16.69 11.81C18.68 12.35 19.88 14.6 19.88 17.8C19.88 19.76 19.52 20.47 18.19 21.14C17.38 21.55 17.2 21.56 12.01 21.55C9.06 21.54 6.41 21.46 6.11 21.37ZM10.24 11.35C9.32 11.02 8.12 9.88 7.67 8.91C7.21 7.92 7.21 6.15 7.66 5.15C8.1 4.2 9.5 2.95 10.46 2.66C12.58 2.02 14.75 2.89 15.88 4.82C16.56 5.98 16.61 7.94 16 9.09C14.89 11.17 12.43 12.13 10.24 11.35Z\"]},{\"id\":\"bt-users\",\"label\":\"Users\",\"set\":\"solid\",\"paths\":[\"M3.17 19.82C2.58 19.37 2.44 18.77 2.44 16.73C2.44 14.91 2.49 14.61 2.86 14.06C3.51 13.11 4.11 12.76 5.34 12.63L6.47 12.52L6.47 16.29L6.47 20.06L4.97 20.06C4.09 20.05 3.35 19.96 3.17 19.82ZM7.61 19.77C7.55 19.6 7.5 18.14 7.5 16.52C7.5 13.84 7.54 13.51 7.92 12.76C8.58 11.48 9.19 11.25 12 11.25C14.81 11.25 15.42 11.48 16.08 12.76C16.46 13.51 16.5 13.84 16.5 16.52C16.5 18.14 16.45 19.6 16.39 19.77C16.29 20.02 15.72 20.06 12 20.06C8.28 20.06 7.71 20.02 7.61 19.77ZM17.53 16.29L17.53 12.52L18.66 12.63C19.89 12.76 20.49 13.11 21.14 14.06C21.51 14.61 21.56 14.91 21.56 16.73C21.56 19.71 21.31 20.05 19.03 20.06L17.53 20.06L17.53 16.29ZM5.09 11.68C3.28 10.79 3.32 8.1 5.15 7.23C6.76 6.47 8.62 7.66 8.62 9.45C8.63 10.45 8.03 11.33 7.12 11.7C6.18 12.07 5.88 12.07 5.09 11.68ZM16.78 11.65C14.86 10.76 14.92 8.02 16.88 7.24C17.82 6.86 18.07 6.86 18.88 7.25C20.7 8.11 20.7 10.83 18.88 11.69C18.05 12.08 17.71 12.08 16.78 11.65ZM10.41 10.07C9.06 9.31 8.42 7.83 8.81 6.39C9.68 3.14 14.32 3.14 15.19 6.39C15.93 9.14 12.9 11.48 10.41 10.07Z\"]},{\"id\":\"bt-wallet\",\"label\":\"Wallet\",\"set\":\"solid\",\"paths\":[\"M2.85 20.9L2.44 20.6L2.44 14.17C2.44 8.18 2.46 7.72 2.78 7.44C3.09 7.16 3.97 7.12 11.49 7.13C18.84 7.13 19.88 7.16 20.14 7.42C20.37 7.64 20.44 8.12 20.44 9.39L20.44 11.06L16.97 11.06L13.51 11.06L12.92 11.59C12.39 12.06 12.32 12.25 12.23 13.45C12.11 15.19 12.29 16.06 12.88 16.61C13.36 17.05 13.43 17.06 16.9 17.06L20.44 17.06L20.44 18.81C20.44 20.27 20.38 20.62 20.09 20.88C19.79 21.16 18.92 21.19 11.51 21.19C4.36 21.19 3.22 21.15 2.85 20.9ZM13.29 16C13.11 15.79 13.03 15.16 13.03 14.02C13.03 11.73 12.88 11.81 17.24 11.81C21.67 11.81 21.56 11.76 21.56 14.04C21.56 16.4 21.73 16.31 17.21 16.31C14.03 16.31 13.51 16.27 13.29 16ZM16.28 14.22C16.38 13.33 15.17 13.05 14.9 13.9C14.74 14.41 15.15 14.84 15.73 14.78C16.1 14.73 16.23 14.6 16.28 14.22ZM9.45 4.57C13.3 2.63 13.64 2.56 14.17 3.58C14.33 3.9 14.44 4.19 14.4 4.22C14.27 4.35 6.62 6.37 6.28 6.37C6.07 6.36 7.5 5.55 9.45 4.57ZM9.58 6.3C9.72 6.17 16.71 4.31 17.07 4.31C17.5 4.31 17.95 4.94 18.11 5.78L18.23 6.38L13.87 6.38C11.47 6.38 9.54 6.34 9.58 6.3Z\"]},{\"id\":\"bt-wave\",\"label\":\"Wave\",\"set\":\"solid\",\"paths\":[\"M13.36 19.32C12.92 19.12 12.12 18.54 11.58 18.03C11.04 17.52 9.77 16.62 8.77 16.03C7.76 15.45 6.89 14.88 6.83 14.78C6.76 14.68 6.77 14.4 6.83 14.15C6.99 13.51 7.55 13.55 9.27 14.33C10.05 14.69 10.69 14.95 10.69 14.91C10.69 14.88 9.8 14.19 8.73 13.39C7.65 12.59 6.72 11.81 6.66 11.66C6.48 11.2 6.75 10.69 7.24 10.57C7.61 10.48 8.15 10.75 9.9 11.91L12.09 13.37L10.24 11.42C8.07 9.14 7.86 8.79 8.34 8.25C8.53 8.04 8.82 7.88 8.98 7.88C9.14 7.88 10.19 8.78 11.32 9.89L13.36 11.91L12.12 9.54C11.43 8.24 10.88 7 10.88 6.78C10.88 6.33 11.49 5.93 11.96 6.08C12.14 6.14 13.06 7.43 14 8.95C14.95 10.47 15.86 11.89 16.03 12.09L16.34 12.47L16.22 12.09C16.15 11.89 16.05 11.25 15.99 10.68C15.88 9.48 16.21 8.64 16.98 8.13C17.61 7.72 17.84 7.96 18.01 9.26C18.09 9.82 18.47 10.98 18.86 11.84C20.07 14.49 19.95 16.68 18.49 18.33C18.17 18.7 17.57 19.15 17.16 19.34C16.14 19.8 14.4 19.79 13.36 19.32ZM5.67 18.25C4.92 17.88 4.31 16.93 4.31 16.13C4.31 15.34 4.73 15.47 4.9 16.32C5.05 17.06 5.8 17.78 6.58 17.94C7.22 18.07 7.32 18.56 6.7 18.56C6.47 18.56 6.01 18.42 5.67 18.25ZM6.46 17.18C5.92 16.94 5.44 16.22 5.44 15.65C5.44 15.16 5.91 15.36 6.13 15.94C6.27 16.31 6.55 16.58 6.93 16.71C7.25 16.83 7.49 17.01 7.45 17.12C7.35 17.43 7.08 17.44 6.46 17.18ZM14.9 6.89C14.76 6.43 14.57 6.24 14.11 6.1C13.38 5.89 13.3 5.44 13.98 5.44C14.62 5.44 15.56 6.38 15.56 7.02C15.56 7.7 15.11 7.62 14.9 6.89ZM16.12 6.64C16.12 5.99 15.01 4.88 14.36 4.88C14.05 4.88 13.88 4.77 13.88 4.59C13.88 4.19 14.78 4.24 15.51 4.68C15.84 4.88 16.24 5.3 16.4 5.61C16.77 6.33 16.78 7.12 16.41 7.12C16.23 7.12 16.12 6.95 16.12 6.64Z\"]},{\"id\":\"bt-yes\",\"label\":\"Yes\",\"set\":\"solid\",\"paths\":[\"M8.72 18.76C8.51 18.67 7.01 17.26 5.39 15.61C2.81 13 2.44 12.55 2.44 12.03C2.44 11.22 3.15 10.5 3.96 10.5C4.48 10.5 4.89 10.82 6.92 12.84L9.28 15.18L14.25 10.23C17.47 7.02 19.4 5.23 19.74 5.15C20.69 4.91 21.75 6.01 21.5 6.97C21.34 7.59 10.15 18.7 9.56 18.83C9.3 18.88 8.93 18.85 8.72 18.76Z\"]},{\"id\":\"bt-boost\",\"label\":\"Boost\",\"set\":\"solid\",\"paths\":[\"M11.32 20.4C11.02 20.17 9.79 19.15 8.58 18.14L6.38 16.29L6.38 12L6.38 7.71L8.58 5.86C9.79 4.84 11.06 3.81 11.39 3.56L12 3.12L12.61 3.56C12.94 3.81 14.21 4.84 15.42 5.86L17.63 7.71L17.62 12L17.62 16.29L15.42 18.14C12.82 20.32 12.18 20.81 12 20.81C11.92 20.81 11.62 20.63 11.32 20.4ZM13.69 16.3L15.19 14.98L15.19 12L15.19 9.02L13.69 7.7C12.86 6.97 12.1 6.37 12 6.37C11.9 6.37 11.14 6.97 10.31 7.7L8.81 9.02L8.81 12L8.81 14.98L10.31 16.3C11.14 17.03 11.9 17.62 12 17.62C12.1 17.62 12.86 17.03 13.69 16.3ZM11.2 14.99L10.5 14.41L10.5 12L10.5 9.59L11.26 8.99L12.02 8.39L12.71 8.95L13.41 9.51L13.46 11.96L13.51 14.4L12.81 14.98C12.42 15.3 12.06 15.56 12 15.56C11.94 15.56 11.58 15.3 11.2 14.99Z\"]},{\"id\":\"bt-event-add\",\"label\":\"Add event\",\"set\":\"solid\",\"paths\":[\"M2.42 22.86C1.83 22.65 1.51 22.37 1.24 21.82L1 21.33L1.02 13.47L1.04 5.61L1.21 5.3C1.46 4.82 2 4.36 2.48 4.22C2.7 4.15 3.16 4.1 3.49 4.1L4.09 4.1L4.12 3.07L4.14 2.05L5.18 2.05L6.23 2.05L6.25 3.07L6.27 4.1L9.41 4.1L12.54 4.1L12.54 6.73L12.54 9.37L7.82 9.37L3.09 9.37L3.09 15.14L3.09 20.91L10.41 20.91L17.73 20.91L17.73 16.18L17.73 11.46L18.78 11.46L19.83 11.46L19.81 16.52L19.79 21.58L19.55 21.96C19.3 22.37 18.74 22.79 18.29 22.92C18.1 22.97 15.35 23 10.41 23C3.33 23 2.79 22.99 2.42 22.86ZM5.18 14.09L5.18 11.46L7.82 11.46L10.45 11.46L10.43 14.07L10.41 16.69L7.8 16.71L5.18 16.73L5.18 14.09ZM17.73 7.78L17.73 6.19L16.18 6.19L14.63 6.19L14.63 5.14L14.63 4.1L16.18 4.1L17.73 4.1L17.73 2.55L17.73 1L18.78 1L19.82 1L19.82 2.55L19.82 4.1L21.41 4.1L23 4.1L23 5.14L23 6.19L21.43 6.21L19.86 6.23L19.84 7.8L19.82 9.37L18.78 9.37L17.73 9.37L17.73 7.78Z\"]},{\"id\":\"bt-statistics\",\"label\":\"Statistics\",\"set\":\"solid\",\"paths\":[\"M5.38 20.77L5.38 18.58L3.88 18.55C2.4 18.52 2.37 18.51 1.93 18.2C1.68 18.03 1.38 17.68 1.24 17.43L1 16.97L1 9.84C1 2.99 1.01 2.7 1.2 2.32C1.47 1.8 2.04 1.3 2.54 1.16C3.08 1.01 20.92 1.01 21.46 1.16C21.96 1.3 22.53 1.8 22.8 2.32C22.99 2.7 23 2.99 23 9.84L23 16.97L22.76 17.43C22.62 17.68 22.31 18.03 22.07 18.2L21.63 18.52L16.47 18.55L11.3 18.57L8.47 20.69C6.91 21.85 5.58 22.84 5.51 22.88C5.41 22.94 5.38 22.5 5.38 20.77ZM9.38 17.23L10.52 16.38L15.67 16.38L20.81 16.38L20.81 9.81L20.81 3.24L12 3.24L3.19 3.24L3.19 9.81L3.19 16.38L5.38 16.38L7.57 16.38L7.57 17.49L7.57 18.59L7.91 18.34C8.09 18.2 8.76 17.7 9.38 17.23ZM6.45 9.84L6.47 5.48L7.59 5.45L8.72 5.42L8.72 9.81L8.72 14.19L7.57 14.19L6.42 14.19L6.45 9.84ZM10.91 12L10.91 9.81L12 9.81L13.09 9.81L13.09 12L13.09 14.19L12 14.19L10.91 14.19L10.91 12ZM15.28 10.91L15.28 7.62L16.38 7.62L17.47 7.62L17.47 10.91L17.47 14.19L16.38 14.19L15.28 14.19L15.28 10.91Z\"]},{\"id\":\"bt-developer\",\"label\":\"Developer\",\"set\":\"solid\",\"paths\":[\"M3.76 16.76L1.01 12L3.76 7.24L6.51 2.48L12.02 2.5L17.53 2.52L20.14 7.01C21.57 9.48 22.8 11.61 22.88 11.75L23.03 11.99L22.33 13.19C21.95 13.86 20.72 15.99 19.59 17.94L17.54 21.48L12.02 21.5L6.51 21.52L3.76 16.76ZM13.33 12.31C14.26 9.33 14.99 6.85 14.96 6.82C14.84 6.72 12.84 6.14 12.79 6.2C12.71 6.28 9.36 17.11 9.4 17.16C9.49 17.24 11.55 17.84 11.59 17.8C11.62 17.77 12.4 15.3 13.33 12.31ZM7.26 12.9L6.37 12L7.26 11.1L8.16 10.21L8.16 8.69L8.16 7.17L5.74 9.58L3.32 12L5.72 14.4L8.12 16.8L8.14 15.3L8.16 13.79L7.26 12.9ZM18.32 9.62L15.96 7.24L15.94 8.72L15.92 10.21L16.81 11.1L17.71 12L16.81 12.9L15.92 13.79L15.92 15.27L15.92 16.76L18.3 14.38L20.67 12L18.32 9.62Z\"]},{\"id\":\"bt-channel\",\"label\":\"Channel\",\"set\":\"solid\",\"paths\":[\"M5.03 22.1C4.64 21.94 4.63 21.75 4.96 19.88C5.13 18.92 5.29 18.03 5.31 17.91L5.36 17.67L3.44 17.67C1.39 17.67 1.12 17.63 1.03 17.27C1 17.16 1.03 16.76 1.09 16.38C1.25 15.32 1.13 15.37 3.65 15.37L5.76 15.37L5.86 14.79C5.91 14.48 6.17 12.97 6.44 11.45L6.93 8.67L4.9 8.63C2.86 8.59 2.86 8.59 2.69 8.38C2.51 8.16 2.52 8.13 2.71 7.13C2.87 6.34 2.74 6.38 5.19 6.33L7.35 6.29L7.7 4.33C7.89 3.25 8.07 2.28 8.11 2.19C8.19 1.92 8.52 1.81 9.24 1.81C9.8 1.81 9.9 1.83 10.09 2.02C10.2 2.13 10.29 2.28 10.29 2.34C10.29 2.45 9.76 5.57 9.65 6.09L9.6 6.33L12.96 6.33L16.33 6.33L16.46 5.63C16.53 5.24 16.69 4.31 16.83 3.56C17.13 1.85 17.16 1.81 18.1 1.81C18.72 1.81 19.05 1.9 19.18 2.1C19.3 2.27 19.24 2.77 18.92 4.56L18.6 6.33L20.55 6.33C22.54 6.33 22.75 6.36 22.92 6.67C23.03 6.89 22.8 8.27 22.61 8.46C22.5 8.57 22.12 8.6 20.34 8.63L18.19 8.67L17.62 11.91C17.3 13.7 17.04 15.2 17.04 15.26C17.03 15.34 17.49 15.37 19.03 15.37C20.93 15.37 21.05 15.38 21.21 15.54C21.41 15.74 21.42 16.04 21.26 16.82C21.07 17.69 21.13 17.67 18.69 17.67L16.62 17.67L16.58 17.86C16.56 17.97 16.39 18.89 16.21 19.92C16 21.14 15.84 21.85 15.74 21.97C15.63 22.11 15.48 22.15 14.95 22.18C14.17 22.22 13.81 22.1 13.73 21.77C13.7 21.64 13.79 20.85 13.96 19.89C14.12 18.97 14.26 18.1 14.28 17.95L14.32 17.67L10.97 17.69L7.61 17.71L7.26 19.67C7.07 20.75 6.89 21.72 6.85 21.81C6.82 21.91 6.7 22.04 6.58 22.09C6.33 22.21 5.31 22.21 5.03 22.1ZM14.77 15.18C14.82 14.98 15.92 8.74 15.92 8.67C15.92 8.65 14.41 8.63 12.55 8.63C10.7 8.63 9.19 8.66 9.19 8.69C9.19 8.79 8.07 15.15 8.03 15.26C8.01 15.35 8.71 15.37 11.36 15.37L14.73 15.37L14.77 15.18Z\"]},{\"id\":\"bt-upload\",\"label\":\"Upload\",\"set\":\"solid\",\"paths\":[\"M2.91 21.71L2.91 20.42L12 20.42L21.09 20.42L21.09 21.71L21.09 23L12 23L2.91 23L2.91 21.71ZM8.14 17.77C8.11 17.74 8.08 15.98 8.08 13.86L8.08 10L5.52 10L2.96 10L7.48 5.48L12 0.96L16.52 5.48L21.04 10L18.48 10L15.92 10L15.92 13.91L15.92 17.83L12.06 17.83C9.94 17.83 8.17 17.81 8.14 17.77Z\"]},{\"id\":\"bt-member\",\"label\":\"Member\",\"set\":\"solid\",\"paths\":[\"M1 21.96C1 19.68 1.68 17.98 3.19 16.47C4.62 15.04 6.63 14.09 9.23 13.61C10.6 13.36 13.41 13.36 14.81 13.62C17.88 14.18 20.43 15.65 21.74 17.63C22.57 18.88 22.89 19.96 22.97 21.8L23.03 23L12.01 23L1 23L1 21.96ZM10.74 11.88C8.37 11.22 6.86 9.53 6.54 7.2C6.16 4.41 8.11 1.67 10.88 1.12C12.16 0.87 13.22 1.02 14.44 1.62C15.06 1.93 15.33 2.12 15.83 2.62C16.91 3.72 17.37 4.74 17.44 6.26C17.49 7.35 17.35 7.99 16.87 8.99C16.6 9.55 16.41 9.81 15.84 10.37C15.12 11.09 14.56 11.44 13.65 11.77C13.03 11.99 11.34 12.06 10.74 11.88Z\"]},{\"id\":\"bt-copy\",\"label\":\"Copy\",\"set\":\"solid\",\"paths\":[\"M7.87 22.88C7.38 22.71 7.04 22.42 6.78 21.98L6.54 21.58L6.54 14.02L6.54 6.46L6.73 6.1C6.97 5.66 7.43 5.27 7.87 5.14C8.09 5.07 9.36 5.04 11.84 5.04L15.48 5.04L18.47 8.03L21.45 11.01L21.45 16.22C21.45 21.88 21.47 21.72 20.97 22.31C20.85 22.46 20.58 22.66 20.39 22.77L20.04 22.96L14.11 22.98C9.41 22.99 8.11 22.97 7.87 22.88ZM19.48 16.51L19.48 12L16.98 12L14.49 12L14.49 9.51L14.49 7.01L11.51 7.04L8.52 7.06L8.5 13.93C8.49 17.71 8.49 20.86 8.52 20.92C8.55 21 9.73 21.02 14.02 21.02L19.48 21.02L19.48 16.51ZM2.55 9.76C2.55 2.58 2.55 2.54 2.73 2.16C2.83 1.94 3.05 1.65 3.22 1.51C3.84 1 3.8 1 10.43 1L16.47 1L16.47 2.03L16.47 3.06L10.5 3.06L4.52 3.06L4.52 10.02L4.52 16.98L3.54 16.98L2.55 16.98L2.55 9.76Z\"]},{\"id\":\"bt-media\",\"label\":\"Media\",\"set\":\"solid\",\"paths\":[\"M4.05 22.79C2.51 22.26 1.41 21.05 1.09 19.54C1.03 19.22 1 16.64 1.02 11.72L1.05 4.37L1.3 3.79C1.8 2.62 2.7 1.72 3.84 1.26L4.37 1.05L11.91 1.05C19.05 1.05 19.47 1.06 19.98 1.22C21.15 1.61 22.26 2.66 22.74 3.84L22.95 4.37L22.98 11.72C23 16.61 22.97 19.22 22.91 19.52C22.77 20.15 22.34 21.03 21.92 21.51C21.46 22.05 20.62 22.59 19.88 22.82C19.31 22.99 19.01 23 11.97 23L4.65 23L4.05 22.79ZM18.44 18.26C17.54 16.12 15.38 11.1 15.33 11.05C15.29 11.01 14.29 12.18 13.11 13.66C11.93 15.14 10.94 16.34 10.91 16.34C10.87 16.34 10.37 15.86 9.78 15.28L8.7 14.21L7.07 16.38L5.44 18.56L12 18.56L18.57 18.56L18.44 18.26ZM8.73 9.45C9.31 9.09 9.71 8.46 9.76 7.8C9.92 5.85 7.66 4.7 6.16 5.98C5.67 6.4 5.44 6.91 5.44 7.6C5.44 8.29 5.68 8.83 6.2 9.28C6.68 9.68 6.99 9.78 7.72 9.75C8.16 9.73 8.38 9.67 8.73 9.45Z\"]},{\"id\":\"bt-owner\",\"label\":\"Owner\",\"set\":\"solid\",\"paths\":[\"M3.22 21.26L3.22 20.19L12.04 20.19L20.85 20.19L20.85 21.26L20.85 22.33L12.04 22.33L3.22 22.33L3.22 21.26ZM3.8 18.92C3.64 18.84 3.47 18.69 3.4 18.59C3.27 18.39 1 9.46 1 9.15C1 9.05 1.07 8.83 1.14 8.66C1.32 8.27 1.83 8 2.24 8.06C2.4 8.09 3.44 8.67 4.86 9.52C6.15 10.29 7.23 10.93 7.25 10.93C7.28 10.93 8.18 9.6 9.26 7.99L11.22 5.05L10.63 4.44C9.82 3.61 9.81 3.64 10.91 2.54C11.62 1.83 11.82 1.67 12 1.67C12.17 1.67 12.38 1.83 13.09 2.53C14.21 3.65 14.21 3.65 13.37 4.52C13.04 4.86 12.8 5.14 12.84 5.16C12.87 5.17 13.75 6.45 14.78 8C15.81 9.55 16.68 10.85 16.71 10.88C16.75 10.92 17.77 10.35 19.16 9.52C20.98 8.43 21.61 8.08 21.84 8.06C22.45 8 23 8.5 23 9.12C23 9.3 22.49 11.47 21.88 13.93C20.67 18.77 20.68 18.75 20.14 18.97C19.94 19.06 18.5 19.07 11.98 19.07C4.26 19.07 4.07 19.06 3.8 18.92Z\"]},{\"id\":\"bt-edit\",\"label\":\"Edit\",\"set\":\"solid\",\"paths\":[\"M1.49 22.57C0.87 22.15 0.87 22.09 1.7 18.84L2.44 15.91L3.99 17.4C4.85 18.22 6.11 19.45 6.79 20.14C7.94 21.29 8.02 21.39 7.79 21.44C7.66 21.48 6.37 21.79 4.92 22.15C3.48 22.51 2.19 22.8 2.06 22.8C1.93 22.8 1.68 22.7 1.49 22.57ZM6.81 17.13L3.67 14.05L8.38 9.42L13.09 4.79L16.17 7.82C17.86 9.48 19.26 10.87 19.28 10.9C19.3 10.96 18.11 12.15 12 18.18L9.94 20.2L6.81 17.13ZM17.75 6.35L14.65 3.32L15.25 2.7C17.05 0.86 19.82 0.78 21.65 2.51C23 3.78 23.36 5.81 22.54 7.47C22.31 7.96 21.08 9.41 20.91 9.4C20.88 9.39 19.45 8.03 17.75 6.35Z\"]},{\"id\":\"bt-location\",\"label\":\"Location\",\"set\":\"solid\",\"paths\":[\"M10.7 22.94C7 22.67 4.51 22.02 2.7 20.88C0.24 19.32 0.56 17.28 3.5 15.81C4.19 15.47 6.08 14.8 6.36 14.8C6.47 14.8 6.5 15 6.5 15.86C6.5 16.85 6.49 16.92 6.31 16.92C6.2 16.92 5.71 17.05 5.22 17.21C1.94 18.26 2.86 19.66 7.32 20.4C13 21.33 20.78 20.28 20.78 18.58C20.78 17.96 19.68 17.33 17.93 16.95L17.55 16.87L17.52 15.83C17.5 14.96 17.52 14.8 17.64 14.8C17.9 14.8 19.65 15.39 20.38 15.72C23.78 17.29 23.89 19.65 20.64 21.29C19.21 22.01 17.56 22.47 15.37 22.75C14.24 22.9 11.56 23.01 10.7 22.94ZM11.85 19.49C11.8 19.42 11.34 18.82 10.83 18.16C7.33 13.66 5.44 9.92 5.44 7.5C5.44 5.62 6.47 3.53 7.97 2.39C9.33 1.37 10.69 0.95 12.39 1.03C14.14 1.12 15.4 1.69 16.69 2.97C18.16 4.45 18.86 6.45 18.57 8.33C18.26 10.32 16.79 13.27 14.5 16.49C13.58 17.78 12.12 19.62 12.02 19.62C11.98 19.62 11.91 19.56 11.85 19.49ZM13.04 9.5C14.12 8.95 14.52 7.67 13.95 6.6C12.94 4.67 10.05 5.23 9.9 7.38C9.84 8.11 10.04 8.66 10.54 9.14C10.75 9.34 11.08 9.57 11.29 9.64C11.77 9.82 12.53 9.76 13.04 9.5Z\"]},{\"id\":\"bt-manager\",\"label\":\"Manager\",\"set\":\"solid\",\"paths\":[\"M11.02 22.62C9.06 21.52 7.17 20.13 5.8 18.77C4.51 17.48 3.78 16.37 3.47 15.23C3.34 14.77 3.34 14.58 3.34 10.5C3.34 7.66 3.36 6.2 3.41 6.08C3.51 5.81 3.84 5.5 4.09 5.43C4.22 5.39 4.47 5.36 4.65 5.36C6.53 5.36 8.97 3.93 10.85 1.74C11.35 1.15 11.58 1 11.97 1C12.37 1 12.67 1.17 13.01 1.6C13.48 2.2 14.75 3.38 15.42 3.86C16.16 4.39 17.23 4.93 17.97 5.14C18.3 5.24 18.83 5.33 19.21 5.35C20.09 5.42 20.35 5.56 20.56 6.07C20.71 6.43 20.71 14.24 20.56 14.96C20.18 16.8 18.53 18.8 15.6 20.92C14.78 21.52 13.43 22.37 12.72 22.75C12.04 23.11 11.88 23.1 11.02 22.62ZM11.36 14.61C11.68 14.38 11.98 14.22 12.02 14.23C12.06 14.25 12.77 14.71 13.58 15.27C14.4 15.82 15.1 16.3 15.14 16.32C15.18 16.34 14.97 15.63 14.68 14.74L14.16 13.12L14.84 12.38C15.22 11.98 15.69 11.5 15.89 11.3L16.24 10.96L14.65 10.93L13.06 10.89L12.52 9.25L11.98 7.61L11.44 9.25L10.89 10.89L9.3 10.93L7.7 10.96L8.74 12C9.32 12.57 9.79 13.09 9.79 13.14C9.79 13.19 9.56 13.92 9.28 14.75C9 15.58 8.78 16.29 8.78 16.32C8.78 16.36 9.67 15.77 11.36 14.61Z\"]},{\"id\":\"bt-verified\",\"label\":\"Verified\",\"set\":\"solid\",\"paths\":[\"M8.49 22.34C8.15 22.18 7.88 21.83 7.41 20.89C6.72 19.51 6.48 19.33 5.08 19.13C4 18.98 3.56 18.84 3.24 18.54C2.87 18.19 2.83 17.85 3.03 16.64C3.31 14.89 3.26 14.74 2.13 13.64C1.34 12.88 1 12.38 1 12C1 11.63 1.29 11.19 2.05 10.42C2.46 10 2.88 9.54 2.96 9.42C3.19 9.08 3.21 8.59 3.05 7.57C2.96 7.09 2.9 6.55 2.9 6.36C2.9 5.47 3.32 5.16 4.85 4.94C6.47 4.7 6.73 4.52 7.41 3.14C8.06 1.82 8.35 1.53 9.04 1.53C9.3 1.53 9.56 1.63 10.44 2.08C11.03 2.39 11.65 2.66 11.81 2.68C12.21 2.75 12.72 2.59 13.73 2.07C14.37 1.75 14.66 1.64 14.95 1.61C15.7 1.55 15.92 1.76 16.64 3.14C16.91 3.66 17.24 4.2 17.38 4.34C17.68 4.64 17.93 4.72 19.2 4.93C20.28 5.11 20.68 5.28 20.94 5.67C21.15 5.98 21.16 6.57 20.96 7.73C20.8 8.62 20.81 8.97 21.01 9.35C21.07 9.48 21.49 9.95 21.94 10.42C22.85 11.34 23 11.57 23 12C23 12.46 22.82 12.75 21.94 13.65C21.49 14.12 21.07 14.6 21.01 14.72C20.86 15.01 20.86 15.73 21 16.51C21.17 17.38 21.17 18.03 20.99 18.33C20.76 18.72 20.37 18.89 19.21 19.08C17.54 19.35 17.38 19.47 16.6 20.98C15.97 22.22 15.53 22.58 14.81 22.44C14.67 22.42 14.11 22.17 13.57 21.89C12.6 21.39 12.57 21.38 12.04 21.38C11.52 21.38 11.48 21.4 10.45 21.89C9.26 22.46 8.91 22.54 8.49 22.34ZM14.54 12.81C16.23 10.53 17.61 8.63 17.62 8.58C17.62 8.51 15.95 7.22 15.84 7.22C15.81 7.22 15.21 7.97 14.53 8.89C13.84 9.81 12.73 11.28 12.06 12.16L10.85 13.76L9.56 12.76C8.85 12.22 8.24 11.75 8.2 11.71C8.15 11.67 7.89 11.97 7.48 12.55C7.12 13.04 6.82 13.47 6.82 13.51C6.82 13.61 11.28 16.99 11.38 16.97C11.43 16.96 12.85 15.09 14.54 12.81Z\"]},{\"id\":\"bt-voice\",\"label\":\"Voice channel\",\"set\":\"solid\",\"paths\":[\"M10.99 22.31C10.86 22.26 9.61 20.97 8.18 19.41L5.61 16.59L3.74 16.59C1.68 16.59 1.55 16.56 1.21 16.05L1 15.75L1 12.03C1 7.99 1 8 1.51 7.6C1.74 7.42 1.86 7.41 3.68 7.41L5.61 7.41L8.18 4.6C10.97 1.54 11.05 1.47 11.73 1.67C11.92 1.73 12.18 1.9 12.31 2.05L12.55 2.33L12.55 11.99L12.55 21.66L12.35 21.91C12.14 22.17 11.67 22.41 11.39 22.4C11.3 22.4 11.12 22.36 10.99 22.31ZM14.91 18.94L14.91 17.8L15.64 17.7C16.99 17.51 18.12 16.92 19.09 15.9C20.13 14.81 20.64 13.52 20.64 12C20.64 10.49 20.13 9.2 19.12 8.13C18.09 7.04 16.89 6.43 15.47 6.27L14.91 6.2L14.91 5.08L14.91 3.95L15.44 3.95C16.2 3.95 17.59 4.33 18.49 4.78C20.52 5.78 22.01 7.58 22.69 9.82C22.91 10.54 22.94 10.79 22.95 11.95C22.95 13.43 22.81 14.13 22.24 15.37C21.02 18 18.46 19.81 15.66 20.02L14.91 20.07L14.91 18.94ZM14.91 14.32L14.91 13.15L15.16 13.09C15.85 12.94 16.23 12.06 15.88 11.43C15.74 11.18 15.29 10.87 15.07 10.86C14.92 10.86 14.91 10.75 14.91 9.67L14.91 8.48L15.3 8.55C17.21 8.87 18.47 10.4 18.34 12.25C18.28 13.13 17.78 14.11 17.12 14.65C16.62 15.05 15.92 15.35 15.3 15.43L14.91 15.48L14.91 14.32Z\"]},{\"id\":\"bt-media-add\",\"label\":\"Add media\",\"set\":\"solid\",\"paths\":[\"M4.24 22.91C3.74 22.81 2.85 22.38 2.42 22.03C1.93 21.63 1.41 20.82 1.21 20.15C1.04 19.61 1.04 19.41 1.06 12.84L1.08 6.08L1.28 5.59C1.71 4.54 2.68 3.6 3.73 3.22C4.16 3.07 4.47 3.06 8.25 3.03C12.12 3.01 12.31 3.01 12.26 3.16C12.01 3.99 11.96 5.66 12.17 6.53C12.78 9.1 14.75 11.14 17.25 11.78C18.28 12.05 19.64 12.05 20.76 11.78L20.95 11.73L20.92 15.87L20.9 20.02L20.59 20.68C20.03 21.84 18.95 22.68 17.72 22.91C17.11 23.02 4.8 23.02 4.24 22.91ZM16.91 18.91C16.91 18.77 14.01 12.09 13.96 12.1C13.93 12.12 13.05 13.2 11.99 14.52C10.94 15.84 10.07 16.93 10.05 16.95C10.04 16.97 9.57 16.54 9.03 15.99L8.03 15L6.62 16.88C5.85 17.91 5.18 18.81 5.13 18.86C5.07 18.95 6.25 18.97 10.98 18.97C14.24 18.97 16.91 18.94 16.91 18.91ZM7.63 10.9C7.86 10.84 8.11 10.66 8.4 10.36C8.75 10.01 8.85 9.83 8.94 9.46C9.36 7.57 7.06 6.24 5.67 7.57C4.84 8.37 4.81 9.54 5.6 10.38C6.13 10.94 6.83 11.12 7.63 10.9ZM18 7.55L18 6.04L16.49 6.04L14.98 6.04L14.98 5.03L14.98 4.02L16.49 4.02L18 4.02L18 2.51L18 0.99L18.99 1.02L19.98 1.04L20 2.53L20.02 4.02L21.49 4.02L22.96 4.02L22.96 5.03L22.96 6.04L21.49 6.04L20.02 6.04L20 7.53L19.98 9.02L18.99 9.04L18 9.07L18 7.55Z\"]},{\"id\":\"bt-public\",\"label\":\"Public\",\"set\":\"solid\",\"paths\":[\"M10.08 22.85C6.63 22.2 3.65 19.97 2.16 16.93C1.26 15.1 0.95 13.59 1.03 11.54C1.24 6.5 4.8 2.33 9.8 1.25C10.78 1.04 13 1.01 13.9 1.2C14.92 1.4 16.11 1.82 17.04 2.3C22.61 5.16 24.61 12.17 21.42 17.62C19.99 20.06 17.5 21.93 14.72 22.65C13.45 22.98 11.25 23.08 10.08 22.85ZM10.87 19.67L10.87 18.61L10.44 18.55C9.87 18.47 9.24 18.01 8.95 17.46C8.76 17.09 8.71 16.85 8.71 16.17L8.71 15.34L6.09 12.72C4.65 11.28 3.45 10.13 3.43 10.16C3.26 10.32 3.16 12.11 3.26 12.97C3.72 16.76 6.44 19.78 10.1 20.59C10.44 20.66 10.75 20.73 10.79 20.73C10.83 20.73 10.87 20.26 10.87 19.67ZM19.04 17.19C19.63 16.4 20.16 15.33 20.45 14.3C20.75 13.23 20.78 10.97 20.5 9.96C19.81 7.41 18.23 5.41 16 4.24L15.32 3.88L15.26 4.46C15.17 5.28 14.77 5.9 14.07 6.26C13.55 6.54 13.44 6.55 12.19 6.55L10.87 6.55L10.87 7.85L10.87 9.14L10.52 9.49L10.17 9.84L8.87 9.84L7.58 9.84L7.58 10.92L7.58 12L10.98 12C14.71 12 14.83 12.02 15.13 12.61C15.26 12.85 15.29 13.3 15.29 14.66L15.29 16.4L16.21 16.44C17.03 16.47 17.17 16.5 17.57 16.78C17.81 16.96 18.11 17.27 18.22 17.48C18.33 17.69 18.46 17.85 18.5 17.83C18.54 17.82 18.78 17.53 19.04 17.19Z\"]},{\"id\":\"bt-link\",\"label\":\"Link\",\"set\":\"solid\",\"paths\":[\"M6.07 22.91C5.82 22.87 5.35 22.75 5.03 22.64C1.84 21.54 0.22 17.97 1.48 14.85C1.84 13.95 2.21 13.44 3.36 12.26L4.5 11.09L4.61 11.97C4.66 12.46 4.78 13.11 4.88 13.41L5.04 13.97L4.51 14.53C3.34 15.74 3.11 17.16 3.85 18.65C4.2 19.36 4.76 19.9 5.52 20.26C6.02 20.5 6.11 20.51 6.99 20.51C7.89 20.51 7.95 20.5 8.5 20.24C9 19.99 9.33 19.7 11.42 17.63C12.71 16.35 13.89 15.12 14.05 14.91C15.02 13.6 14.93 11.7 13.84 10.5C13.44 10.07 13.34 9.88 13.34 9.51C13.34 8.84 13.86 8.31 14.52 8.31C14.99 8.31 15.32 8.5 15.78 9.09C16.64 10.15 17.09 11.44 17.09 12.84C17.09 13.86 16.94 14.51 16.46 15.5L16.09 16.28L13.4 18.99C10.11 22.29 9.72 22.58 7.99 22.88C7.23 23.01 6.8 23.02 6.07 22.91ZM9.14 15.66C8.99 15.62 8.7 15.38 8.44 15.11C6.55 13.05 6.41 10 8.09 7.64C8.62 6.9 13.37 2.24 13.93 1.91C14.62 1.51 15.32 1.24 16.07 1.11C18.21 0.72 20.59 1.69 21.85 3.47C22.65 4.6 22.96 5.56 22.96 6.95C22.96 8.02 22.77 8.82 22.29 9.74C22 10.31 21.76 10.6 20.72 11.66L19.5 12.91L19.44 12.19C19.42 11.79 19.31 11.14 19.21 10.75L19.03 10.03L19.44 9.61C20.3 8.73 20.65 7.83 20.58 6.68C20.49 5.3 19.42 3.96 18.09 3.56C17.17 3.28 15.88 3.47 15.12 4C14.93 4.14 13.66 5.36 12.31 6.72C9.63 9.41 9.54 9.53 9.35 10.62C9.18 11.62 9.47 12.59 10.23 13.54C10.46 13.83 10.68 14.18 10.7 14.33C10.81 14.91 10.41 15.49 9.78 15.66C9.61 15.71 9.46 15.74 9.43 15.74C9.41 15.74 9.28 15.7 9.14 15.66Z\"]},{\"id\":\"bt-slowmode\",\"label\":\"Slowmode\",\"set\":\"solid\",\"paths\":[\"M10.45 22.92C7.16 22.33 4.4 20.11 3.2 17.11C2.75 15.97 2.62 15.33 2.57 13.91C2.54 12.9 2.56 12.45 2.66 11.9C3.22 8.93 5.08 6.47 7.76 5.12C10.82 3.59 14.38 3.83 17.31 5.78L17.88 6.16L18.59 5.45C18.98 5.06 19.33 4.75 19.38 4.75C19.48 4.75 20.8 6.07 20.8 6.17C20.8 6.22 20.48 6.57 20.1 6.96L19.39 7.67L19.81 8.29C21.98 11.54 21.97 15.64 19.77 18.95C19.26 19.7 18.16 20.8 17.36 21.36C16.5 21.94 15.35 22.48 14.39 22.73C13.71 22.91 13.38 22.94 12.2 22.97C11.44 22.98 10.65 22.96 10.45 22.92ZM13.02 20.84C14.52 20.68 16.24 19.77 17.36 18.55C20.3 15.36 19.86 10.39 16.4 7.72C15.07 6.7 13.73 6.26 11.92 6.27C10.57 6.28 9.89 6.44 8.7 7.03C6.77 7.99 5.46 9.6 4.86 11.72C4.78 12.02 4.71 12.64 4.69 13.34C4.66 14.31 4.68 14.6 4.82 15.2C5.57 18.33 8.11 20.57 11.27 20.88C11.87 20.94 12.07 20.94 13.02 20.84ZM10.94 11.47L10.94 8.33L12 8.33L13.06 8.33L13.06 11.47L13.06 14.61L12 14.61L10.94 14.61L10.94 11.47ZM8.82 2.02L8.82 1L11.96 1L15.1 1L15.1 2.02L15.1 3.04L11.96 3.04L8.82 3.04L8.82 2.02Z\"]},{\"id\":\"bt-delete\",\"label\":\"Delete\",\"set\":\"solid\",\"paths\":[\"M5.32 22.84C4.88 22.65 4.38 22.17 4.11 21.67C3.9 21.28 3.9 21.28 3.9 14.06L3.9 6.84L11.98 6.82L20.05 6.79L20.05 14.02C20.05 21.98 20.08 21.62 19.43 22.3C18.75 23.03 19.08 23 12 22.99C6.56 22.99 5.62 22.97 5.32 22.84ZM10.82 14.9L10.82 11.41L9.69 11.41L8.56 11.41L8.56 14.9L8.56 18.38L9.69 18.38L10.82 18.38L10.82 14.9ZM15.44 14.9L15.44 11.41L14.31 11.41L13.18 11.41L13.18 14.9L13.18 18.38L14.31 18.38L15.44 18.38L15.44 14.9ZM1.59 4.49L1.59 3.36L5.05 3.33L8.51 3.31L8.54 2.15L8.57 1L12 1L15.44 1L15.44 2.18L15.44 3.36L18.92 3.36L22.41 3.36L22.41 4.49L22.41 5.62L12 5.62L1.59 5.62L1.59 4.49Z\"]},{\"id\":\"bt-discovery\",\"label\":\"Discovery\",\"set\":\"solid\",\"paths\":[\"M10.1 22.57C5.81 21.81 2.31 18.57 1.33 14.45C0.06 9.1 3.16 3.61 8.45 1.85C9.67 1.45 10.64 1.3 12.01 1.3C13.95 1.3 15.36 1.63 17.05 2.48C19.23 3.58 20.81 5.15 21.9 7.3C23.14 9.77 23.35 12.7 22.49 15.29C21.22 19.07 17.91 21.89 13.95 22.57C12.97 22.74 11.04 22.74 10.1 22.57ZM10.01 16.36C12.39 15.28 14.36 14.36 14.41 14.32C14.5 14.23 18.59 5.67 18.56 5.63C18.52 5.59 9.76 9.59 9.66 9.7C9.58 9.78 5.75 17.71 5.51 18.3C5.44 18.45 4.91 18.68 10.01 16.36ZM11.36 12.98C11.22 12.9 11.03 12.69 10.96 12.53C10.36 11.27 12 10.19 12.91 11.23C13.39 11.77 13.34 12.4 12.8 12.88C12.55 13.1 12.43 13.14 12.06 13.14C11.78 13.14 11.53 13.08 11.36 12.98Z\"]},{\"id\":\"bt-reply\",\"label\":\"Reply\",\"set\":\"solid\",\"paths\":[\"M22.37 20.93C21.63 19.92 20.23 18.54 19.23 17.84C16.92 16.19 13.9 15.27 10.49 15.16L9.57 15.14L9.55 17.79L9.53 20.45L5.71 16.37C3.61 14.13 1.69 12.08 1.44 11.82L0.99 11.36L5.24 6.82L9.49 2.28L9.53 4.85L9.57 7.42L10.51 7.61C12.42 8.01 14.42 8.83 16.01 9.89C17.25 10.7 18.98 12.46 19.9 13.83C20.68 15 21.48 16.61 21.98 17.98C22.29 18.84 23.04 21.61 22.97 21.67C22.96 21.69 22.69 21.36 22.37 20.93Z\"]},{\"id\":\"bt-forum\",\"label\":\"Forum\",\"set\":\"solid\",\"paths\":[\"M14.05 22.17C13.04 22.05 11.81 21.61 10.83 21.03C9.78 20.4 8.56 19.12 8.03 18.06L7.84 17.69L5.13 17.69C2.45 17.69 2.41 17.69 1.98 17.49C1.52 17.27 1.26 16.99 1.1 16.5C0.97 16.13 0.97 9.44 1.09 8.58C1.46 5.99 3.25 3.61 5.65 2.49C6.94 1.9 8.72 1.64 10.07 1.85C11 1.99 12.28 2.45 13.09 2.94C13.97 3.46 15.05 4.5 15.62 5.39C15.86 5.76 16.08 6.13 16.11 6.21C16.14 6.32 16.36 6.42 16.9 6.55C18.35 6.9 20.12 7.97 20.99 9.02C21.83 10.02 22.44 11.19 22.75 12.39C22.93 13.06 22.94 13.36 22.98 16.84C23.02 20.92 23 21.08 22.55 21.6C21.99 22.23 22.03 22.23 17.95 22.21C15.95 22.21 14.2 22.19 14.05 22.17ZM20.67 16.56L20.64 13.2L20.4 12.51C19.98 11.3 19.3 10.37 18.35 9.7C17.82 9.32 17.17 8.96 17.02 8.96C16.98 8.96 16.92 9.41 16.9 9.97C16.79 12.1 16.01 13.92 14.58 15.35C13.59 16.34 12.48 16.98 11.07 17.39L10.38 17.59L10.89 18.12C11.71 18.98 12.51 19.46 13.6 19.75C14.16 19.89 14.56 19.91 17.46 19.91L20.7 19.92L20.67 16.56ZM10.74 15.11C11.67 14.77 12.26 14.39 12.99 13.67C14.73 11.93 15.12 9.29 13.95 7.05C13.52 6.22 12.48 5.18 11.64 4.74C10.39 4.09 8.89 3.91 7.56 4.25C6.54 4.51 5.77 4.96 4.98 5.75C4.19 6.54 3.74 7.31 3.48 8.33C3.33 8.93 3.31 9.28 3.31 12.19L3.31 15.39L6.71 15.37L10.12 15.34L10.74 15.11Z\"]},{\"id\":\"bt-exchange\",\"label\":\"Exchange\",\"set\":\"solid\",\"paths\":[\"M14.35 22.87C13.18 22.69 12.23 22.11 11.31 21.01C10.57 20.13 10.24 19.29 10.1 17.97C10.02 17.2 10.04 17.04 10.31 16.19C10.55 15.46 10.78 15.01 11.18 14.47C11.7 13.78 12.67 12.97 13.15 12.83C13.27 12.79 13.44 12.71 13.54 12.65C13.64 12.59 14.11 12.46 14.59 12.36L15.46 12.19L16.31 12.36C16.78 12.45 17.4 12.64 17.69 12.78C19.16 13.46 20.34 14.88 20.71 16.42C21.27 18.8 20.21 21.16 18.01 22.4C17.48 22.7 17.28 22.76 16.5 22.87C15.45 23.02 15.34 23.02 14.35 22.87ZM16.83 20.85C17.1 20.79 17.4 20.68 17.5 20.58C17.73 20.37 17.74 20.01 17.51 19.78C17.37 19.63 17.29 19.62 17.04 19.68C16.21 19.87 15.09 19.66 14.85 19.27C14.7 19.03 14.91 18.92 15.56 18.92C16.12 18.92 16.16 18.91 16.28 18.69C16.4 18.47 16.4 18.45 16.18 18.26C15.96 18.07 15.9 18.06 15.39 18.11C14.7 18.17 14.47 18.07 14.47 17.72C14.47 17.37 14.74 17.29 15.65 17.35C16.34 17.39 16.39 17.39 16.58 17.19C16.81 16.96 16.83 16.8 16.65 16.62C16.47 16.44 16.25 16.4 15.5 16.43C14.92 16.45 14.84 16.43 14.82 16.3C14.77 16.06 15.12 15.76 15.61 15.62C16.03 15.49 16.54 15.5 17.05 15.63C17.22 15.67 17.32 15.65 17.44 15.54C17.66 15.35 17.66 14.84 17.45 14.64C17.21 14.43 16.36 14.34 15.59 14.44C14.56 14.58 14.1 14.91 13.39 16.02C13.22 16.28 13.06 16.42 12.92 16.45C12.54 16.53 12.45 16.62 12.45 16.91C12.45 17.14 12.5 17.2 12.78 17.35C13.03 17.48 13.11 17.57 13.11 17.72C13.11 17.87 13.03 17.96 12.78 18.09C12.26 18.36 12.29 18.84 12.83 18.95C13.05 19 13.18 19.11 13.45 19.5C13.88 20.13 14.53 20.67 14.94 20.73C15.11 20.76 15.38 20.81 15.54 20.85C15.97 20.95 16.28 20.95 16.83 20.85ZM7.39 19.21C7.14 19.17 6.22 19.14 5.35 19.14L3.76 19.13L3.76 18.94C3.76 18.81 3.9 18.64 4.22 18.39C4.79 17.93 4.87 17.69 4.53 17.4C4.09 17.02 3.45 16.21 3.2 15.71C2.86 15.04 2.78 14.67 2.81 13.9C2.82 13.36 2.88 13.12 3.09 12.65C3.23 12.32 3.35 12 3.35 11.94C3.35 11.72 3.69 11.37 3.87 11.4C4.03 11.42 4.05 11.49 4.09 12C4.12 12.46 4.19 12.68 4.4 13.05C4.73 13.61 6.59 15.61 6.82 15.65C7.03 15.69 7.17 15.57 7.57 15.02C7.81 14.69 7.94 14.59 8.07 14.61C8.25 14.64 8.25 14.66 8.22 15.87C8.2 16.55 8.24 17.53 8.29 18.04C8.38 18.9 8.38 18.99 8.25 19.13C8.09 19.3 8.08 19.3 7.39 19.21ZM20.26 12.77C20.2 12.71 20.16 12.47 20.16 12.24C20.16 11.72 19.84 11.04 19.32 10.43C18.7 9.71 17.47 8.5 17.36 8.5C17.25 8.5 16.96 8.78 16.56 9.28C16.34 9.56 16.28 9.6 16.15 9.52C16.01 9.44 16 9.33 16.02 8.61C16.03 8.16 15.99 7.24 15.92 6.56C15.82 5.47 15.82 5.3 15.93 5.13L16.05 4.94L18.08 4.99C20.32 5.05 20.49 5.07 20.49 5.24C20.49 5.35 20.38 5.47 19.66 6.12C19.52 6.24 19.42 6.38 19.42 6.42C19.42 6.46 19.66 6.74 19.95 7.05C20.51 7.63 20.98 8.29 21.11 8.7C21.16 8.84 21.19 9.53 21.18 10.23C21.17 11.48 21.16 11.52 20.9 12.13C20.58 12.86 20.46 12.97 20.26 12.77ZM7.61 11.7C6.49 11.41 5.61 10.87 4.84 10.01C3.9 8.97 3.49 7.89 3.48 6.48C3.47 5.14 3.76 4.3 4.64 3.13C5.24 2.34 6.37 1.52 7.08 1.37C7.22 1.33 7.56 1.24 7.83 1.15C8.41 0.97 9.22 0.95 9.71 1.12C9.9 1.18 10.23 1.28 10.44 1.32C11.41 1.54 12.87 2.72 13.51 3.81C14 4.65 14.14 5.2 14.15 6.46C14.16 7.66 14.08 8.01 13.55 9.02C13.16 9.77 12.04 10.87 11.28 11.24C10.05 11.85 8.76 12.01 7.61 11.7ZM9.18 9.81C9.48 9.43 9.66 9.31 10.07 9.19C10.59 9.04 11.19 8.45 11.35 7.93C11.43 7.65 11.43 7.54 11.31 7.23C11.12 6.74 10.58 6.29 10.05 6.2C9.51 6.1 9.28 5.82 9.28 5.28C9.28 4.96 9.32 4.86 9.46 4.75C9.7 4.59 9.95 4.59 10.3 4.76C10.86 5.03 11.24 4.69 11.01 4.13C10.88 3.81 10.55 3.64 10.06 3.64C9.68 3.64 9.56 3.56 9.13 3.03C8.94 2.79 8.64 2.87 8.42 3.22C8.25 3.48 8.13 3.56 7.78 3.67C6.61 4.01 6.04 4.97 6.47 5.9C6.65 6.31 7.11 6.63 7.7 6.77C8.23 6.89 8.46 7.14 8.46 7.63C8.46 8.16 8.31 8.3 7.75 8.28C7.47 8.27 7.23 8.21 7.14 8.13C6.98 7.98 6.63 7.96 6.5 8.1C6.38 8.22 6.37 8.7 6.48 8.91C6.59 9.12 7.16 9.32 7.67 9.32C8.09 9.32 8.13 9.34 8.37 9.65C8.67 10.03 8.95 10.08 9.18 9.81ZM9.38 8.15C9.22 7.99 9.25 7.28 9.43 7.19C9.88 6.96 10.24 7.7 9.86 8.09C9.67 8.27 9.52 8.29 9.38 8.15ZM7.72 5.56C7.49 5.26 7.51 5.09 7.8 4.84C8.1 4.59 8.15 4.58 8.33 4.75C8.46 4.88 8.5 5.4 8.41 5.65C8.33 5.86 7.92 5.81 7.72 5.56Z\"]},{\"id\":\"bt-giveaway\",\"label\":\"Giveaway\",\"set\":\"solid\",\"paths\":[\"M1.39 22.61C0.92 22.14 0.89 21.83 1.25 21.07C2 19.47 2.95 17.26 3.06 16.84C3.32 15.89 3.59 15.88 4.01 16.81C4.57 18.07 5.79 20.59 6.08 21.09C6.16 21.23 6.22 21.44 6.22 21.56C6.22 21.79 6.14 21.83 4.92 22.24C4.5 22.38 3.84 22.6 3.44 22.74C3.04 22.89 2.5 23 2.25 23C1.84 23 1.73 22.95 1.39 22.61ZM7.55 21.07C7.49 21 7.3 20.62 7.13 20.23C6.81 19.54 5.37 16.56 4.59 15L4.17 14.18L4.64 13.14C4.89 12.57 5.18 11.86 5.28 11.57C5.38 11.28 5.54 10.96 5.65 10.87C5.89 10.65 6.01 10.78 6.43 11.75C6.6 12.16 7.26 13.56 7.89 14.85C8.52 16.13 9.04 17.22 9.04 17.26C9.04 17.3 9.33 17.92 9.69 18.63C10.06 19.34 10.34 20.01 10.32 20.12C10.3 20.28 10.06 20.42 9.29 20.72C8.11 21.18 7.71 21.26 7.55 21.07ZM11.56 19.38C11.39 19.15 11.23 18.86 11.19 18.75C11.16 18.63 10.78 17.81 10.34 16.92C9.91 16.04 9.41 15 9.23 14.61C8.91 13.91 7.62 11.23 6.96 9.86C6.64 9.22 6.61 9.07 6.66 8.62C6.7 8.26 6.67 8.02 6.57 7.81C6.36 7.42 6.42 7.14 6.75 6.89C6.95 6.75 7.07 6.72 7.21 6.78C7.37 6.87 9.59 9.19 10.84 10.59C11.42 11.24 12.91 12.88 13.82 13.85C14.21 14.27 14.73 14.84 14.97 15.11C15.22 15.39 15.81 16.04 16.3 16.56C16.79 17.09 17.26 17.65 17.34 17.81C17.48 18.08 17.48 18.12 17.3 18.37C17.07 18.66 16.73 18.7 16.19 18.47C15.92 18.36 15.81 18.36 15.54 18.47C14.84 18.76 12.29 19.7 12.08 19.75C11.91 19.79 11.8 19.71 11.56 19.38ZM17.07 15.27C16.7 14.91 16.7 14.67 17.03 14.27C17.23 14.03 17.38 13.96 17.63 13.96C17.92 13.96 18.02 14.02 18.23 14.35C18.48 14.73 18.49 14.76 18.34 15.05C18.03 15.64 17.52 15.73 17.07 15.27ZM14 12.41C13.87 12.27 13.76 12.1 13.76 12.03C13.76 11.73 14.08 11.45 14.6 11.3C15.08 11.16 15.26 11.01 15.26 10.74C15.26 10.7 15.15 10.53 15.01 10.36C14.77 10.08 14.36 8.98 14.36 8.61C14.36 8.51 14.47 8.21 14.61 7.94C14.88 7.41 15.38 7.03 15.81 7.03C16.39 7.03 17.16 7.63 17.57 8.41C17.71 8.7 17.75 9.73 17.64 10.3C17.53 10.83 17.72 11.05 18.31 11.05C19.28 11.04 20.25 10.54 20.84 9.74C21.33 9.08 21.52 8.18 21.48 6.79C21.44 5.7 21.44 5.7 21.72 5.49C21.94 5.32 22.03 5.3 22.23 5.4C22.62 5.57 22.73 6.08 22.67 7.52C22.63 8.64 22.59 8.87 22.33 9.51C21.8 10.76 21 11.56 19.85 12C18.95 12.34 17.86 12.35 17.09 12.03L16.55 11.8L16.15 12.04C15.68 12.3 14.72 12.65 14.44 12.65C14.34 12.65 14.14 12.54 14 12.41ZM16.57 9.34C16.57 8.65 15.93 8.15 15.66 8.64C15.51 8.94 15.72 9.51 16.05 9.68C16.42 9.88 16.57 9.78 16.57 9.34ZM11.29 9.29C10.97 8.97 10.97 8.54 11.29 8.2C11.61 7.85 12.01 7.85 12.37 8.2C12.75 8.57 12.74 8.94 12.34 9.28C11.96 9.61 11.61 9.61 11.29 9.29ZM18.3 6.5C18.05 6.23 18.01 6.06 18.11 5.7C18.17 5.45 18.61 5.12 18.87 5.12C18.92 5.12 19.11 5.24 19.28 5.38C19.51 5.57 19.58 5.72 19.58 5.97C19.58 6.62 18.74 6.97 18.3 6.5ZM11.95 5.91C11.78 5.68 11.49 5.38 11.3 5.25C10.88 4.97 10.83 4.63 11.17 4.32C11.29 4.21 11.42 4.11 11.46 4.11C11.5 4.11 11.68 3.91 11.86 3.67C12.03 3.42 12.24 3.2 12.32 3.17C12.57 3.07 12.95 3.3 13.12 3.65C13.21 3.84 13.45 4.09 13.66 4.2C14.29 4.56 14.27 4.96 13.61 5.28C13.42 5.37 13.24 5.52 13.21 5.62C13.09 5.98 12.74 6.32 12.5 6.32C12.33 6.32 12.16 6.2 11.95 5.91ZM20.35 4.31C19.98 4.08 19.81 3.88 19.61 3.44C19.38 2.93 19.37 2.84 19.48 2.52C19.8 1.6 20.51 1 21.28 1C21.93 1 22.81 1.67 22.96 2.27C23.07 2.7 22.94 3.47 22.71 3.8C22.43 4.19 21.62 4.62 21.16 4.62C20.96 4.62 20.64 4.49 20.35 4.31ZM15.71 3.35C15.11 3.06 15.06 2.43 15.6 2.07C15.99 1.82 16.32 1.86 16.61 2.21C16.95 2.61 16.94 2.86 16.58 3.22C16.24 3.55 16.14 3.57 15.71 3.35Z\"]},{\"id\":\"bt-mail\",\"label\":\"Mail\",\"set\":\"solid\",\"paths\":[\"M2.46 19.68C2.32 19.54 2.47 19.27 2.94 18.81C3.23 18.53 4.63 17.13 6.04 15.71C7.45 14.28 8.68 13.11 8.77 13.11C8.86 13.11 9.33 13.52 9.83 14.03C10.83 15.05 11.31 15.32 12.03 15.33C12.72 15.33 13.13 15.08 14.17 14.03C14.67 13.52 15.15 13.11 15.23 13.11C15.34 13.11 21.02 18.67 21.68 19.42C21.7 19.44 21.66 19.53 21.59 19.62C21.47 19.76 20.47 19.78 11.98 19.75C6.77 19.74 2.49 19.71 2.46 19.68ZM19.5 15.42C17.79 13.7 16.37 12.2 16.36 12.09C16.33 11.93 17.1 11.12 19.48 8.76C21.22 7.04 22.69 5.66 22.76 5.68C22.86 5.72 22.89 7.12 22.9 11.81C22.9 15.15 22.93 17.92 22.96 17.97C23.04 18.1 22.91 18.43 22.75 18.49C22.66 18.53 21.47 17.4 19.5 15.42ZM1.16 18.37C1.13 18.32 1.1 15.45 1.09 12C1.08 5.57 1.09 5.38 1.45 5.63C1.51 5.67 2.93 7.09 4.62 8.78C6.99 11.18 7.67 11.92 7.64 12.09C7.61 12.33 1.54 18.46 1.34 18.46C1.27 18.46 1.19 18.42 1.16 18.37ZM11.7 14.02C11.39 13.82 2.31 4.7 2.31 4.58C2.31 4.21 2.33 4.2 12.07 4.27C17.28 4.3 21.54 4.33 21.55 4.33C21.56 4.33 21.59 4.41 21.63 4.5C21.69 4.66 21.16 5.21 14.55 11.86C12.29 14.13 12.1 14.28 11.7 14.02Z\"]},{\"id\":\"bt-menu\",\"label\":\"Menu\",\"set\":\"solid\",\"paths\":[\"M11 20.99C10.4 20.39 10.37 19.59 10.92 18.92C11.4 18.35 11.34 18.36 16.75 18.36C21.56 18.36 21.71 18.37 22.11 18.56C23.07 19.03 23.27 20.33 22.47 21.03L22.13 21.33L16.73 21.33L11.34 21.33L11 20.99ZM1.92 13.39C1.38 13.04 0.95 12.27 1.1 11.89C1.3 11.37 1.5 11.1 1.88 10.81L2.28 10.52L12.05 10.52L21.82 10.52L22.22 10.8C22.78 11.21 22.95 11.51 22.95 12.1C22.95 12.67 22.79 12.96 22.27 13.36L21.91 13.63L12.15 13.65L2.38 13.68L1.92 13.39ZM2.1 5.69C1.72 5.53 1.33 5.1 1.15 4.65C1 4.31 1.01 4.27 1.19 3.84C1.38 3.42 1.53 3.25 2.02 2.9C2.2 2.78 3.44 2.76 12.06 2.77L21.9 2.77L22.26 3.03C22.8 3.4 22.94 3.74 22.91 4.56C22.9 4.93 22.42 5.51 21.98 5.7C21.52 5.89 2.53 5.89 2.1 5.69Z\"]},{\"id\":\"bt-brush\",\"label\":\"Brush\",\"set\":\"solid\",\"paths\":[\"M2.13 22.06C1.51 21.75 1 21.33 1 21.14C1 21.07 1.29 20.71 1.64 20.34C2.41 19.54 3.02 18.54 3.17 17.82C3.5 16.25 4.8 15.17 6.35 15.18C7.57 15.19 8.58 15.84 9.2 17.03C9.58 17.77 9.59 18.81 9.2 19.58C8.66 20.69 7.59 21.5 5.85 22.1C5.23 22.32 4.96 22.36 3.92 22.36C2.78 22.36 2.68 22.34 2.13 22.06ZM10.57 16.43C10.53 16.39 10.44 16.23 10.37 16.06C10.15 15.58 9.35 14.75 8.76 14.4C7.89 13.9 7.89 13.91 8.82 12.76C9.27 12.2 9.67 11.75 9.72 11.75C9.9 11.75 12.9 14.87 12.85 15C12.82 15.08 12.79 15.16 12.79 15.18C12.79 15.2 12.66 15.29 12.49 15.37C12.33 15.46 11.95 15.75 11.65 16.02C11.14 16.48 10.76 16.62 10.57 16.43ZM12.42 12.34C11.38 11.3 10.81 10.67 10.81 10.54C10.81 10.42 11.11 10.02 11.53 9.59C15.42 5.56 18.04 3.35 20.3 2.23C21.78 1.5 22.44 1.47 22.84 2.15C23.46 3.19 21.78 6.14 18.65 9.52C17.54 10.71 14.25 13.93 14.13 13.93C14.08 13.93 13.31 13.21 12.42 12.34Z\"]},{\"id\":\"bt-blacklist\",\"label\":\"Blacklist\",\"set\":\"solid\",\"paths\":[\"M10.61 22.95C8.06 22.57 6.11 21.65 4.43 20.02C2.77 18.41 1.79 16.6 1.29 14.27C1.13 13.51 1.09 13.09 1.09 11.91C1.1 9.81 1.41 8.53 2.34 6.76C3.32 4.89 5.1 3.17 7.06 2.19C10.22 0.62 14.08 0.68 17.21 2.34C18.59 3.07 20.14 4.43 21.01 5.68C21.78 6.77 22.42 8.28 22.72 9.7C22.98 10.95 22.98 12.99 22.71 14.21C22.17 16.64 21.25 18.39 19.69 19.89C17.51 21.99 15.3 22.9 12.26 22.96C11.5 22.97 10.76 22.97 10.61 22.95ZM13.72 19.8C14.53 19.61 15.65 19.16 16.16 18.82C16.35 18.69 16.64 18.49 16.81 18.38C17.15 18.14 18.2 17.05 18.57 16.54C19 15.95 19.51 14.76 19.72 13.88C20.13 12.18 19.93 10.5 19.11 8.76C18.79 8.07 18.69 7.93 18.53 7.93C18.39 7.93 17.48 8.78 15.3 10.94C11.27 14.94 7.71 18.53 7.71 18.59C7.71 19 9.81 19.81 11.35 20C11.87 20.07 12.98 19.97 13.72 19.8ZM8.12 13.8C9.49 12.41 11.04 10.84 11.57 10.31C14.78 7.1 16.2 5.6 16.15 5.47C16.02 5.13 13.99 4.43 12.74 4.29C11.97 4.21 11.69 4.22 10.94 4.33C9.72 4.53 8.23 5.09 7.51 5.62C7.01 5.99 6.04 6.94 5.68 7.41C4.67 8.74 4.07 10.5 4.07 12.14C4.08 13.85 4.9 16.33 5.47 16.33C5.57 16.33 6.57 15.37 8.12 13.8Z\"]},{\"id\":\"bt-nitro\",\"label\":\"Nitro\",\"set\":\"solid\",\"paths\":[\"M12.78 20.18C10.89 19.75 9.19 18.63 8.02 17.06C7.44 16.28 6.77 14.89 6.61 14.11C6.58 13.97 6.48 13.78 6.38 13.68C6.2 13.51 6.13 13.5 4.86 13.54C3.14 13.59 3.17 13.61 3.17 12.57C3.17 12.01 3.21 11.78 3.3 11.7C3.38 11.63 3.82 11.6 4.74 11.62C5.82 11.64 6.07 11.62 6.18 11.51C6.34 11.35 6.67 9.9 6.6 9.68C6.54 9.46 6.27 9.41 5.64 9.48C4.82 9.56 4.74 9.47 4.74 8.43C4.74 7.81 4.77 7.6 4.88 7.52C4.98 7.43 5.34 7.41 6.27 7.43L7.53 7.45L8.13 6.84C8.7 6.27 8.9 5.88 8.63 5.86C8.57 5.86 7.84 5.86 7.01 5.87C5.12 5.89 5.17 5.92 5.17 4.78C5.17 4.19 5.21 3.95 5.3 3.87C5.46 3.74 15.45 3.74 16.26 3.87C17.15 4.01 18.49 4.61 19.49 5.31C20.62 6.11 21.8 7.64 22.33 9C22.87 10.37 22.96 10.8 22.95 12C22.94 13.22 22.87 13.56 22.34 14.93C21.85 16.19 21.64 16.55 20.83 17.52C20.18 18.31 19.3 19 18.36 19.46C16.9 20.18 16.64 20.24 14.87 20.27C13.76 20.29 13.15 20.26 12.78 20.18ZM17.35 16.09C17.68 15.78 19.75 12.68 19.88 12.3C19.96 12.09 19.94 11.98 19.78 11.68C19.68 11.47 19.51 11.2 19.4 11.08C19.3 10.95 19 10.52 18.74 10.13C17.67 8.53 17.39 8.17 17.09 8.02C16.82 7.89 16.51 7.87 14.63 7.87C12.32 7.87 12.1 7.9 11.73 8.31C11.62 8.43 11.05 9.26 10.44 10.17C9.68 11.32 9.35 11.89 9.35 12.06C9.35 12.31 9.5 12.68 9.79 13.09C9.87 13.21 10.11 13.58 10.32 13.91C11.58 15.88 11.77 16.11 12.22 16.3C12.35 16.35 13.34 16.38 14.76 16.37L17.08 16.35L17.35 16.09ZM13.03 13.85C12.73 13.53 11.89 12.36 11.81 12.17C11.76 12.03 12.76 10.47 13.08 10.18C13.23 10.04 13.43 10.02 14.61 10.02C15.8 10.02 15.98 10.04 16.14 10.18C16.29 10.32 16.45 10.54 17.23 11.69C17.49 12.05 17.48 12.12 17.22 12.49C17.11 12.65 16.83 13.05 16.61 13.37C16.4 13.69 16.14 13.99 16.05 14.04C15.95 14.09 15.31 14.13 14.59 14.13L13.29 14.13L13.03 13.85ZM1.26 9.46C1.19 9.43 1.1 9.37 1.07 9.31C0.97 9.17 0.99 7.67 1.09 7.52C1.19 7.36 2.32 7.36 2.52 7.52C2.62 7.6 2.65 7.82 2.65 8.39C2.65 9.35 2.58 9.46 1.9 9.49C1.62 9.51 1.33 9.49 1.26 9.46Z\"]},{\"id\":\"bt-gamepad\",\"label\":\"Gamepad\",\"set\":\"solid\",\"paths\":[\"M3.42 19.37C2.2 18.72 1.33 17.24 1.09 15.41C0.85 13.51 1.1 11.33 1.77 9.58C2.72 7.12 4.02 5.5 5.71 4.68C6.21 4.43 6.33 4.41 7.24 4.41C8.17 4.41 8.25 4.43 8.68 4.68C8.92 4.82 9.36 5.13 9.64 5.37C10.5 6.08 10.84 6.19 12.09 6.2C13.36 6.2 13.72 6.08 14.55 5.37C15.42 4.62 15.83 4.43 16.67 4.38C17.61 4.34 18.17 4.46 18.87 4.87C20.54 5.85 21.89 7.82 22.69 10.44L23 11.47L23 13.8C23 15.93 22.98 16.19 22.81 16.69C22.4 17.95 21.52 19.05 20.65 19.44C20.06 19.71 18.81 19.71 18.12 19.45C17.46 19.2 16.5 18.46 15.85 17.71C14.27 15.85 14.1 15.77 12.04 15.77L10.64 15.77L10.06 16.06C9.59 16.3 9.35 16.51 8.72 17.26C7.83 18.33 7.22 18.87 6.45 19.28C5.93 19.56 5.83 19.58 4.91 19.61C3.96 19.63 3.9 19.62 3.42 19.37ZM18.88 14.05C19.39 13.83 19.77 13.31 19.77 12.81C19.77 12.25 19.16 11.59 18.59 11.54C18.14 11.5 17.96 11.56 17.61 11.87C17.23 12.22 17.04 12.69 17.14 13.07C17.23 13.44 17.63 13.9 18.02 14.08C18.46 14.28 18.35 14.28 18.88 14.05ZM7.58 13.61C7.77 13.41 7.82 13.26 7.82 12.96C7.82 12.52 7.94 12.36 8.28 12.36C8.69 12.36 9.08 12.17 9.22 11.9C9.41 11.53 9.38 11.33 9.09 11.02C8.87 10.78 8.77 10.74 8.38 10.74C8.13 10.74 7.9 10.7 7.87 10.65C7.84 10.6 7.8 10.37 7.77 10.14C7.71 9.47 7.25 9.1 6.75 9.3C6.45 9.43 6.3 9.73 6.3 10.19C6.3 10.62 6.17 10.74 5.71 10.74C5.36 10.74 4.95 10.95 4.75 11.23C4.47 11.63 4.95 12.25 5.59 12.33C6.12 12.4 6.3 12.57 6.3 13.03C6.3 13.44 6.48 13.77 6.78 13.89C7.05 13.99 7.29 13.91 7.58 13.61ZM16.34 11.51C16.91 11.21 17.31 10.56 17.2 10.09C17.12 9.73 16.5 9.06 16.17 8.99C15.55 8.85 14.85 9.31 14.65 10C14.55 10.33 14.56 10.41 14.73 10.78C14.87 11.06 15.06 11.26 15.31 11.42C15.73 11.67 15.99 11.7 16.34 11.51Z\"]},{\"id\":\"bt-palette\",\"label\":\"Palette\",\"set\":\"solid\",\"paths\":[\"M8.45 22.64C5.22 21.51 2.77 19.04 1.69 15.82C1.12 14.14 0.89 12.2 1.09 10.88C1.7 6.95 3.72 4.07 7.11 2.31C9.53 1.05 12.66 0.77 15.13 1.58C15.52 1.7 15.88 1.81 15.94 1.81C16.04 1.81 17.17 2.36 17.61 2.62C18.83 3.34 20.38 4.77 21.08 5.82C22.07 7.31 22.7 8.87 22.91 10.32C23.09 11.5 22.99 13.82 22.74 14.56C22.24 16.02 21.57 16.72 20.35 17.04C19.7 17.22 18.02 17.19 16.49 16.98C15.03 16.79 13.8 16.75 13.27 16.9C12.81 17.03 12.25 17.55 12.13 17.97C12.04 18.25 12.05 18.36 12.2 18.7C12.3 18.92 12.52 19.27 12.68 19.49C13.38 20.39 13.38 20.4 13.39 21.08C13.39 21.68 13.37 21.76 13.1 22.12C12.52 22.87 12.4 22.91 10.71 22.91C9.29 22.9 9.18 22.89 8.45 22.64ZM6.75 13.17C6.94 13.05 7.23 12.76 7.39 12.52C7.81 11.91 7.81 11.44 7.37 10.83C7.19 10.58 6.89 10.29 6.7 10.18C5.63 9.56 4.13 10.57 4.27 11.82C4.34 12.43 4.69 12.91 5.31 13.24C5.89 13.54 6.22 13.52 6.75 13.17ZM18.77 13.24C19.11 13.06 19.34 12.86 19.55 12.54C19.96 11.94 19.97 11.47 19.58 10.87C18.77 9.61 17.27 9.72 16.59 11.09L16.34 11.61L16.53 12.13C16.76 12.73 17.04 13.04 17.61 13.29C18.13 13.53 18.19 13.53 18.77 13.24ZM10.06 8.19C10.97 7.73 11.29 6.69 10.78 5.86C10.53 5.45 9.85 5.04 9.41 5.04C8.67 5.04 7.86 5.75 7.69 6.54C7.58 7.1 8.11 7.94 8.74 8.2C9.25 8.4 9.64 8.4 10.06 8.19ZM15.55 8.15C16.78 7.52 16.72 5.86 15.44 5.21C14.67 4.82 13.78 5.18 13.35 6.06C13.05 6.67 13.09 7.09 13.49 7.65C13.99 8.33 14.81 8.53 15.55 8.15Z\"]},{\"id\":\"bt-bolt\",\"label\":\"Bolt\",\"set\":\"solid\",\"paths\":[\"M5.49 22.87C5.43 22.71 5.45 22.63 5.76 21.5C5.89 21.04 6.09 20.22 6.22 19.69C6.34 19.15 6.54 18.4 6.66 18.01C6.86 17.31 7.24 15.82 7.41 15.05C7.46 14.83 7.55 14.5 7.63 14.32C7.82 13.84 7.8 13.48 7.58 13.37C7.46 13.3 6.72 13.28 5.38 13.29C4.28 13.3 3.32 13.28 3.27 13.25C2.99 13.08 3.09 12.86 4.82 9.84C5.09 9.37 5.42 8.78 5.57 8.51C6.11 7.52 6.44 6.93 7.76 4.63C8.32 3.65 8.98 2.48 9.23 2.04C9.48 1.6 9.76 1.18 9.84 1.12C9.97 1.02 10.99 1 15.13 1.02L20.26 1.04L20.29 1.25C20.31 1.4 20.22 1.56 20.01 1.78C19.85 1.96 19.31 2.62 18.81 3.25C16.72 5.94 15.76 7.14 15.47 7.43C15.36 7.54 15.27 7.73 15.27 7.86L15.27 8.08L17.94 8.06C19.41 8.04 20.67 8.06 20.73 8.1C20.97 8.25 20.83 8.57 20.28 9.08C19.98 9.36 19.04 10.26 18.19 11.06C17.34 11.87 16.58 12.59 16.5 12.66C15.8 13.31 14.6 14.46 12 16.99C10.32 18.63 8.39 20.5 7.71 21.15C7.02 21.8 6.33 22.49 6.17 22.67C5.87 23.01 5.58 23.1 5.49 22.87Z\"]},{\"id\":\"bt-plus\",\"label\":\"Plus\",\"set\":\"solid\",\"paths\":[\"M11.27 22.83C10.82 22.62 10.54 22.33 10.34 21.85C10.21 21.52 10.2 21.13 10.26 17.82C10.32 14.18 10.32 14.15 10.13 13.98C9.95 13.82 9.75 13.81 6.37 13.83C4.01 13.84 2.67 13.81 2.43 13.74C1.71 13.55 1.05 12.73 1.05 12.03C1.04 11.43 1.62 10.64 2.26 10.37C2.45 10.29 3.57 10.26 6.22 10.26C9.48 10.26 9.94 10.24 10.07 10.11C10.2 9.98 10.21 9.58 10.16 6.29C10.09 2.27 10.09 2.29 10.61 1.67C10.92 1.31 11.57 1 12.02 1C12.63 1.01 13.36 1.53 13.7 2.2L13.91 2.6L13.84 6.26C13.79 9.62 13.79 9.93 13.94 10.09C14.08 10.25 14.29 10.26 17.78 10.26C21.88 10.26 21.82 10.25 22.42 10.87C22.87 11.34 23.03 11.92 22.87 12.47C22.71 13 22.11 13.6 21.59 13.74C21.32 13.81 20.09 13.84 17.63 13.83C14.25 13.81 14.05 13.82 13.87 13.98C13.68 14.15 13.68 14.18 13.74 17.82C13.8 21.13 13.79 21.52 13.66 21.85C13.36 22.55 12.72 23 12 23C11.8 23 11.47 22.92 11.27 22.83Z\"]},{\"id\":\"bt-sms\",\"label\":\"SMS\",\"set\":\"solid\",\"paths\":[\"M18.83 21.33C18.72 21.22 18.02 20.62 17.28 20.01C16.55 19.39 15.49 18.52 14.94 18.06C14.39 17.6 13.86 17.18 13.76 17.12C13.62 17.05 12.37 17.02 9.34 17.02C5.42 17.02 5.07 17.01 4.53 16.86C3.27 16.5 2.18 15.56 1.54 14.3C1.15 13.52 1.1 12.93 1.08 9.57C1.07 6.58 1.08 6.39 1.25 5.91C1.76 4.46 2.82 3.41 4.42 2.76L5.03 2.52L12.04 2.52L19.06 2.52L19.72 2.79C21.29 3.43 22.3 4.44 22.8 5.88L23.01 6.48L22.98 9.83C22.94 13.56 22.94 13.62 22.31 14.69C21.77 15.6 20.68 16.54 19.95 16.72C19.81 16.76 19.62 16.89 19.53 17.01C19.35 17.23 19.35 17.32 19.38 19.38C19.41 21.52 19.41 21.53 19.22 21.53C19.12 21.53 18.95 21.44 18.83 21.33ZM6.85 11.9C7.05 11.85 7.34 11.66 7.56 11.44C7.91 11.09 7.93 11.04 7.93 10.58C7.93 10.14 7.9 10.06 7.62 9.75C7.44 9.56 7.27 9.4 7.22 9.4C7.18 9.4 6.95 9.32 6.71 9.22C6.25 9.02 6.08 8.73 6.29 8.48C6.4 8.35 6.48 8.35 7.21 8.5C7.47 8.55 7.51 8.53 7.62 8.26C7.77 7.91 7.68 7.72 7.31 7.59C6.63 7.35 5.73 7.53 5.22 8.01C4.93 8.28 4.87 8.39 4.83 8.77C4.79 9.19 4.81 9.23 5.13 9.57C5.33 9.79 5.66 10.01 5.98 10.13C6.55 10.36 6.69 10.57 6.49 10.86C6.33 11.09 6.15 11.09 5.62 10.89C5.12 10.7 4.95 10.73 4.82 11.01C4.62 11.45 4.78 11.76 5.3 11.91C5.66 12.02 6.45 12.01 6.85 11.9ZM18.5 11.73C18.9 11.52 19.05 11.38 19.19 11.09C19.55 10.34 19.23 9.76 18.14 9.24C17.47 8.91 17.35 8.74 17.6 8.49C17.74 8.35 17.82 8.35 18.55 8.5C18.78 8.54 18.85 8.52 18.97 8.33C19.27 7.87 18.83 7.5 18 7.5C17.32 7.5 16.93 7.65 16.53 8.07C16.21 8.4 16.16 8.5 16.16 8.82C16.16 9.35 16.57 9.82 17.32 10.14C17.83 10.36 17.89 10.41 17.89 10.63C17.89 11.03 17.58 11.12 16.98 10.89C16.43 10.68 16.3 10.7 16.16 11.05C16.01 11.41 16.12 11.65 16.53 11.83C17.12 12.1 17.88 12.06 18.5 11.73ZM9.97 11.79C10.12 11.68 10.13 11.57 10.11 10.38C10.08 9.09 10.08 9.08 10.31 8.81C10.59 8.48 10.81 8.46 11.09 8.75C11.3 8.96 11.31 8.99 11.31 10.28C11.31 11.82 11.35 11.91 11.98 11.91C12.66 11.91 12.69 11.83 12.69 10.31C12.69 9.03 12.7 8.99 12.91 8.76C13.17 8.48 13.42 8.47 13.69 8.75C13.9 8.96 13.91 8.99 13.91 10.28C13.91 11.83 13.94 11.91 14.6 11.91C15.28 11.91 15.31 11.84 15.28 10.12C15.25 8.67 15.25 8.66 14.98 8.23C14.64 7.68 14.27 7.48 13.68 7.52C13.43 7.54 13.14 7.62 13.03 7.7C12.91 7.78 12.74 7.9 12.64 7.97C12.48 8.09 12.44 8.08 12.09 7.83C11.6 7.46 11.01 7.4 10.59 7.66C10.24 7.87 9.93 7.89 9.7 7.72C9.44 7.52 8.91 7.55 8.8 7.75C8.74 7.86 8.71 8.63 8.71 9.77C8.72 11.89 8.73 11.91 9.4 11.91C9.62 11.91 9.88 11.86 9.97 11.79Z\"]},{\"id\":\"bt-refresh\",\"label\":\"Refresh\",\"set\":\"solid\",\"paths\":[\"M10.17 22.86C7.31 22.44 4.58 20.68 2.84 18.14C2.44 17.55 1.8 16.19 1.54 15.35C0.51 12.02 1 8.62 2.93 5.72C3.35 5.09 5.05 3.41 5.72 2.96C9.52 0.4 14.29 0.38 18.06 2.89C18.39 3.11 18.8 3.44 18.97 3.61C19.41 4.07 19.65 4.04 20.13 3.49C20.34 3.24 20.74 2.84 21.02 2.61C21.62 2.1 21.97 2.04 22.43 2.37C22.96 2.77 22.97 2.83 22.91 6.4L22.86 9.64L22.5 9.95L22.14 10.26L18.95 10.26C15.41 10.26 15.37 10.25 15.02 9.68C14.67 9.11 14.79 8.87 15.98 7.69C16.57 7.11 16.86 6.75 16.86 6.62C16.86 6.46 16.68 6.29 16.09 5.9C15.67 5.63 15.3 5.4 15.26 5.4C15.23 5.4 15.01 5.32 14.79 5.21C12.12 4 8.66 4.73 6.57 6.94C5.58 7.99 5.07 8.9 4.66 10.3C4.36 11.33 4.36 12.92 4.65 13.95C5.04 15.26 5.59 16.24 6.52 17.23C7.44 18.21 8.63 18.91 10.03 19.31C11.08 19.61 12.61 19.64 13.6 19.39C14.38 19.19 15.56 18.67 16.07 18.31C17.09 17.59 17.13 17.56 17.31 17.65C17.41 17.69 17.93 18.15 18.46 18.67C19.15 19.35 19.42 19.68 19.42 19.83C19.42 20.18 18.29 21.09 17.03 21.75C14.98 22.82 12.56 23.22 10.17 22.86Z\"]},{\"id\":\"bt-ticket\",\"label\":\"Ticket\",\"set\":\"solid\",\"paths\":[\"M7.73 22.86C7.34 22.66 5.91 21.21 5.91 21.02C5.91 20.93 6.06 20.73 6.24 20.57C6.66 20.21 6.99 19.63 7.06 19.1C7.2 18.04 5.96 16.81 4.88 16.94C4.37 17 3.78 17.33 3.44 17.76C3.3 17.94 3.12 18.1 3.05 18.13C2.88 18.2 1.37 16.66 1.16 16.2C0.96 15.76 0.96 15.27 1.16 14.83C1.35 14.42 1.07 14.71 8.36 7.34C12.53 3.13 14.43 1.27 14.67 1.16C15.07 0.97 15.71 0.95 16.09 1.12C16.32 1.21 16.81 1.64 17.98 2.76C18.19 2.97 18.11 3.24 17.76 3.52C17.35 3.85 16.91 4.71 16.91 5.16C16.91 5.8 17.43 6.54 18.13 6.91C18.84 7.29 19.82 7.02 20.42 6.3C20.62 6.07 20.82 5.91 20.92 5.91C21.14 5.91 22.7 7.56 22.88 7.97C23.04 8.37 23.03 8.84 22.84 9.25C22.74 9.47 22.03 10.23 20.89 11.37C19.9 12.34 16.96 15.29 14.34 17.91C11.71 20.55 9.45 22.75 9.27 22.84C8.89 23.04 8.09 23.05 7.73 22.86ZM14.77 14.85C17.02 12.61 18.85 10.73 18.85 10.68C18.85 10.59 13.49 5.29 13.35 5.24C13.3 5.23 11.56 6.92 9.47 9C7.37 11.08 5.55 12.86 5.4 12.96C4.83 13.36 4.78 13.29 7.74 16.23C9.22 17.71 10.49 18.93 10.56 18.93C10.63 18.94 12.53 17.1 14.77 14.85ZM9.23 14.78C8.52 14.07 7.94 13.47 7.94 13.43C7.94 13.39 8.6 12.7 9.4 11.89C10.2 11.09 11.39 9.89 12.03 9.23C12.67 8.56 13.26 8.02 13.34 8.02C13.51 8.02 15.98 10.51 15.98 10.69C15.98 10.76 15.74 11.04 15.45 11.31C15.16 11.57 13.95 12.75 12.77 13.93C11.58 15.1 10.59 16.06 10.56 16.06C10.54 16.06 9.94 15.48 9.23 14.78Z\"]},{\"id\":\"bt-chat\",\"label\":\"Chat\",\"set\":\"solid\",\"paths\":[\"M1.12 21.75C0.93 21.55 0.98 21.24 1.26 20.96C1.6 20.62 2.41 19.48 2.64 19.03C3.62 17.08 3.6 17.22 3.09 16.6C1.98 15.22 1.37 14 1.14 12.68C0.51 9.09 2.09 6.13 5.88 3.79C6.19 3.6 7.16 3.2 7.95 2.94C10.93 1.94 12.77 1.93 15.87 2.88C19.44 3.98 22.17 6.67 22.83 9.74C22.99 10.51 22.96 12.27 22.77 13.01C22.25 15.06 20.99 16.85 19.13 18.17C16.23 20.23 11.82 20.91 8.4 19.82C7.94 19.67 7.5 19.55 7.43 19.55C7.36 19.55 7.01 19.75 6.66 19.99C5.63 20.69 4.84 21.06 3.27 21.53C2.37 21.81 1.28 21.92 1.12 21.75ZM6.96 12.7C7.25 12.55 7.65 12.14 7.8 11.84C8.13 11.2 7.52 10.13 6.68 9.93C6.14 9.79 5.4 10.3 5.1 11.01C4.96 11.34 4.97 11.39 5.15 11.81C5.51 12.65 6.31 13.04 6.96 12.7ZM12.7 12.57C12.99 12.38 13.17 12.18 13.32 11.84L13.54 11.37L13.31 10.93C12.63 9.63 11.27 9.61 10.67 10.89C10.42 11.41 10.45 11.62 10.83 12.15C11.34 12.85 12.02 13 12.7 12.57ZM18.23 12.55C18.65 12.28 18.95 11.78 18.95 11.37C18.95 11.04 18.68 10.54 18.34 10.27C17.76 9.79 17.17 9.81 16.62 10.33C16.35 10.58 16 11.17 16 11.36C16 11.63 16.44 12.31 16.78 12.56C17.27 12.92 17.68 12.92 18.23 12.55Z\"]},{\"id\":\"bt-alert\",\"label\":\"Alert\",\"set\":\"solid\",\"paths\":[\"M11.12 22.88C10.94 22.81 10.67 22.67 10.52 22.57C9 21.47 8.87 19.51 10.24 18.28C11.53 17.11 13.45 17.46 14.4 19.04C14.63 19.43 14.66 19.56 14.66 20.3C14.66 21.04 14.63 21.16 14.4 21.55C14.11 22.03 13.58 22.54 13.13 22.78C12.73 22.99 11.56 23.05 11.12 22.88ZM10.24 15.92C10.19 15.86 10.12 15.52 10.08 15.16C10.05 14.81 9.96 14.19 9.89 13.79C9.82 13.38 9.7 12.48 9.62 11.77C9.48 10.53 9.42 10.03 9.02 6.73C8.91 5.87 8.75 4.51 8.65 3.7C8.56 2.9 8.45 2.01 8.41 1.74C8.36 1.32 8.38 1.23 8.52 1.12C8.65 1.03 9.37 1 12.05 1C14.95 1 15.43 1.02 15.53 1.14C15.65 1.28 15.64 1.42 15.16 5.35C15.11 5.76 14.97 6.95 14.84 8.01C14.57 10.24 14.31 12.4 14.15 13.65C14.08 14.13 14.01 14.79 13.98 15.13C13.9 16.06 13.95 16.03 12 16.03C10.77 16.03 10.3 16 10.24 15.92Z\"]},{\"id\":\"bt-list\",\"label\":\"List\",\"set\":\"solid\",\"paths\":[\"M1.64 19.89C0.87 19.23 0.94 18.36 1.81 17.78C2.09 17.59 2.23 17.57 3.09 17.57C3.99 17.57 4.1 17.59 4.44 17.81C4.8 18.04 5.14 18.57 5.14 18.89C5.14 19.17 4.81 19.73 4.53 19.92C4.26 20.11 4.12 20.12 3.08 20.12C1.97 20.12 1.92 20.12 1.64 19.89ZM8.47 19.9C8.15 19.68 8.08 19.58 7.94 19.11C7.82 18.72 8.19 18.03 8.65 17.77L9.02 17.56L15.48 17.59L21.95 17.61L22.28 17.87C23.02 18.43 23.08 19.18 22.44 19.78L22.08 20.12L15.44 20.12L8.8 20.12L8.47 19.9ZM1.71 13.14C0.87 12.57 0.9 11.52 1.76 10.96C2.1 10.74 2.21 10.72 3.1 10.72C4.04 10.72 4.09 10.73 4.46 11C5.32 11.62 5.33 12.43 4.48 13.12C4.19 13.36 4.14 13.37 3.11 13.37C2.12 13.37 2.02 13.35 1.71 13.14ZM8.55 13.14C7.69 12.55 7.71 11.48 8.61 10.95L9 10.72L15.44 10.72L21.87 10.72L22.24 11C23.01 11.56 23.08 12.27 22.45 12.95L22.1 13.32L15.5 13.35L8.9 13.37L8.55 13.14ZM1.76 6.44C1.37 6.2 1 5.63 1 5.27C1 4.86 1.32 4.36 1.77 4.1C2.11 3.9 2.26 3.88 3.09 3.88C4.21 3.88 4.61 4.04 4.99 4.63C5.29 5.12 5.29 5.41 4.98 5.88C4.56 6.51 4.31 6.61 3.1 6.61C2.22 6.61 2 6.58 1.76 6.44ZM8.71 6.53C8.42 6.4 8.02 5.93 7.89 5.55C7.79 5.25 7.79 5.15 7.9 4.88C8.07 4.47 8.61 3.99 8.98 3.92C9.13 3.89 12.12 3.88 15.61 3.89L21.96 3.92L22.29 4.15C22.67 4.4 23 4.93 23 5.26C23 5.62 22.49 6.33 22.13 6.48C21.87 6.59 20.79 6.61 15.36 6.61C11.8 6.61 8.81 6.57 8.71 6.53Z\"]},{\"id\":\"role-admin\",\"label\":\"Admin role\",\"set\":\"solid\",\"paths\":[\"M11.42 22.82C11.28 22.72 11.09 22.65 11 22.65C10.87 22.65 10.62 22.55 9.69 22.12C8.79 21.7 7.54 20.82 6.75 20.04C6.04 19.35 5.12 18.25 4.85 17.78C4.76 17.62 4.62 17.38 4.55 17.25C4.47 17.12 4.33 16.87 4.23 16.7C4.12 16.53 4.01 16.29 3.97 16.17C3.94 16.05 3.85 15.89 3.79 15.81C3.73 15.74 3.63 15.5 3.57 15.28C3.51 15.06 3.43 14.83 3.37 14.77C3.29 14.67 3.15 14.23 2.84 13.02C2.76 12.73 2.59 11.92 2.46 11.22C2.23 9.98 2.23 9.86 2.26 7.12L2.29 4.29L2.59 3.98C2.78 3.78 3.01 3.64 3.21 3.61C3.51 3.56 3.97 3.42 5.48 2.94C5.82 2.84 6.3 2.7 6.54 2.63C6.79 2.57 7.19 2.46 7.43 2.38C7.87 2.23 8.7 1.98 10.14 1.56C10.55 1.44 11.09 1.26 11.34 1.17C11.87 0.97 12.19 0.96 12.52 1.13C12.66 1.2 13.01 1.32 13.29 1.39C13.58 1.46 14 1.58 14.22 1.65C14.44 1.72 14.98 1.89 15.42 2.02C15.85 2.15 16.53 2.35 16.92 2.47C17.31 2.58 18.05 2.81 18.56 2.96C19.08 3.11 19.72 3.31 19.98 3.4C20.25 3.49 20.61 3.58 20.79 3.61C20.99 3.64 21.21 3.78 21.41 3.98L21.71 4.29L21.74 7.1C21.76 8.65 21.73 10.13 21.69 10.4C21.49 11.55 21.29 12.52 21.16 13.02C20.85 14.22 20.71 14.67 20.63 14.77C20.57 14.83 20.49 15.06 20.43 15.28C20.37 15.5 20.27 15.74 20.21 15.81C20.15 15.89 20.06 16.05 20.03 16.17C19.99 16.29 19.88 16.53 19.77 16.7C19.67 16.87 19.53 17.12 19.45 17.25C19.38 17.38 19.24 17.62 19.15 17.78C18.9 18.23 17.81 19.52 17.15 20.14C16.39 20.86 15.15 21.73 14.31 22.12C13.38 22.55 13.13 22.65 13 22.65C12.91 22.65 12.71 22.73 12.55 22.82C12.19 23.04 11.77 23.04 11.42 22.82ZM13.07 20.12C13.68 19.82 14.06 19.6 14.72 19.14C15.18 18.82 16.25 17.73 16.59 17.23C16.77 16.97 16.98 16.67 17.07 16.57C17.26 16.34 18.21 14.52 18.21 14.37C18.21 14.31 18.31 14.06 18.43 13.82C18.55 13.57 18.65 13.3 18.65 13.2C18.65 13.11 18.75 12.71 18.87 12.32C19.25 11.07 19.46 9.4 19.45 7.55L19.45 5.9L19.04 5.62C18.81 5.47 18.54 5.35 18.44 5.35C18.34 5.35 17.96 5.25 17.59 5.13C16.96 4.93 16.36 4.75 14.6 4.22C14.17 4.09 13.52 3.89 13.15 3.77C12.3 3.48 11.7 3.48 10.85 3.77C10.48 3.89 9.84 4.09 9.43 4.22C7.75 4.71 7.05 4.93 6.41 5.13C6.04 5.25 5.66 5.35 5.56 5.35C5.46 5.35 5.19 5.47 4.96 5.62L4.55 5.9L4.55 7.59C4.55 9.48 4.74 11.04 5.13 12.32C5.25 12.71 5.35 13.11 5.35 13.2C5.35 13.3 5.45 13.57 5.57 13.82C5.69 14.06 5.79 14.31 5.79 14.37C5.79 14.52 6.74 16.34 6.93 16.57C7.01 16.67 7.22 16.95 7.39 17.19C7.82 17.82 8.31 18.33 9.09 18.95C9.89 19.59 10.22 19.79 11.11 20.21C11.92 20.59 12.14 20.58 13.07 20.12ZM11.11 19.34C10.05 18.81 9.01 17.95 8.22 16.97C7.53 16.12 7.45 15.99 6.94 14.93C6.74 14.51 6.53 14.09 6.48 14C6.31 13.69 5.9 12.21 5.61 10.89C5.36 9.75 5.24 6.51 5.45 6.36C5.58 6.25 6.51 5.93 7.7 5.58C8.14 5.45 8.7 5.28 8.94 5.2C9.18 5.12 9.62 4.98 9.92 4.9C10.21 4.82 10.79 4.65 11.21 4.52C12.05 4.27 12.18 4.28 13.51 4.72C13.78 4.81 14.34 4.98 14.75 5.11C17.85 6.03 18.23 6.15 18.47 6.3L18.68 6.43L18.63 8.17C18.6 9.5 18.54 10.14 18.39 10.85C18.12 12.16 17.7 13.68 17.52 14C17.47 14.09 17.26 14.51 17.06 14.93C16.55 15.99 16.46 16.12 15.78 16.97C14.9 18.06 14.22 18.62 12.95 19.3C12.17 19.71 11.86 19.72 11.11 19.34Z\"]},{\"id\":\"role-booster\",\"label\":\"Booster role\",\"set\":\"solid\",\"paths\":[\"M11.6 22.85C11.36 22.72 10.52 22.06 10.11 21.68C10.03 21.61 9.53 21.19 8.99 20.74C8.45 20.29 7.96 19.88 7.89 19.82C7.82 19.76 7.22 19.26 6.56 18.72C5.84 18.13 5.29 17.61 5.2 17.43C5.07 17.17 5.06 16.53 5.06 12C5.06 7.47 5.07 6.83 5.2 6.57C5.29 6.39 5.84 5.87 6.56 5.28C7.22 4.74 7.82 4.24 7.89 4.18C7.96 4.12 8.45 3.71 8.99 3.26C9.53 2.81 10.03 2.39 10.11 2.32C10.57 1.89 11.49 1.19 11.73 1.09C11.95 1 12.05 1 12.29 1.1C12.52 1.19 15.4 3.52 16.07 4.15C16.16 4.23 16.77 4.74 17.44 5.28C18.16 5.87 18.71 6.39 18.8 6.57C18.93 6.83 18.94 7.47 18.94 12C18.94 16.53 18.93 17.17 18.8 17.43C18.71 17.61 18.16 18.13 17.44 18.72C16.77 19.26 16.16 19.77 16.07 19.85C15.5 20.39 12.62 22.73 12.39 22.85C12.03 23.03 11.94 23.03 11.6 22.85ZM12.96 18.25C13.35 17.92 13.93 17.4 14.25 17.09C14.58 16.78 15.01 16.39 15.22 16.22C15.43 16.06 15.62 15.85 15.65 15.76C15.68 15.68 15.71 13.98 15.71 12C15.71 10.02 15.68 8.32 15.65 8.24C15.62 8.15 15.43 7.94 15.22 7.78C15.01 7.61 14.58 7.22 14.25 6.91C13.08 5.78 12.27 5.15 11.99 5.15C11.72 5.15 11.52 5.3 9.88 6.81C9.48 7.17 8.99 7.61 8.78 7.77C8.57 7.94 8.38 8.15 8.35 8.24C8.27 8.44 8.27 15.56 8.35 15.76C8.38 15.85 8.57 16.06 8.78 16.23C8.99 16.39 9.48 16.83 9.88 17.19C12.06 19.19 11.91 19.14 12.96 18.25ZM11.12 16.35C10.72 15.97 10.23 15.5 10.03 15.31L9.66 14.97L9.66 12L9.66 9.03L10.03 8.69C10.23 8.5 10.72 8.03 11.12 7.65C11.51 7.27 11.91 6.95 12 6.95C12.09 6.95 12.49 7.27 12.88 7.65C13.28 8.03 13.77 8.5 13.97 8.68L14.34 9.01L14.34 12L14.34 14.99L13.97 15.32C13.77 15.5 13.28 15.97 12.88 16.35C12.49 16.73 12.09 17.05 12 17.05C11.91 17.05 11.51 16.73 11.12 16.35Z\"]},{\"id\":\"role-premium\",\"label\":\"Premium client role\",\"set\":\"solid\",\"paths\":[\"M4.6 22.85C4.46 22.79 4.28 22.64 4.2 22.52C4.06 22.3 3.75 20.81 3.64 19.81C3.6 19.51 3.53 19.09 3.48 18.89C3.43 18.69 3.31 18 3.21 17.36C2.94 15.52 2.74 14.46 2.64 14.33C2.59 14.27 2.37 14.22 2.14 14.22C1.81 14.22 1.67 14.16 1.41 13.92L1.08 13.61L1.07 12.01L1.07 10.4L1.41 10.09L1.75 9.77L2.93 9.79C4.27 9.81 4.46 9.75 4.59 9.27C4.64 9.1 4.77 8.84 4.87 8.71C4.98 8.57 5.07 8.39 5.07 8.31C5.07 8.22 5.17 8.01 5.3 7.84C5.43 7.67 5.53 7.46 5.53 7.38C5.53 7.3 5.63 7.09 5.76 6.92C5.89 6.74 5.99 6.54 5.99 6.45C5.99 6.37 6.1 6.16 6.22 5.99C6.35 5.82 6.45 5.61 6.45 5.53C6.45 5.45 6.56 5.24 6.68 5.07C6.81 4.89 6.92 4.69 6.92 4.61C6.92 4.52 7.02 4.32 7.15 4.14C7.27 3.97 7.38 3.76 7.38 3.68C7.38 3.6 7.48 3.39 7.61 3.22C7.74 3.05 7.84 2.84 7.84 2.75C7.84 2.67 7.92 2.5 8.01 2.37C8.11 2.25 8.25 2 8.33 1.82C8.4 1.64 8.6 1.4 8.75 1.29C9.03 1.09 9.1 1.08 12 1.08C14.9 1.08 14.97 1.09 15.25 1.29C15.4 1.4 15.6 1.64 15.67 1.82C15.75 2 15.89 2.25 15.99 2.37C16.08 2.5 16.16 2.67 16.16 2.75C16.16 2.84 16.26 3.05 16.39 3.22C16.52 3.39 16.62 3.6 16.62 3.68C16.62 3.76 16.73 3.97 16.85 4.14C16.98 4.32 17.08 4.52 17.08 4.61C17.08 4.69 17.19 4.89 17.32 5.07C17.44 5.24 17.55 5.45 17.55 5.53C17.55 5.61 17.65 5.82 17.78 5.99C17.9 6.16 18.01 6.37 18.01 6.45C18.01 6.54 18.11 6.74 18.24 6.92C18.37 7.09 18.47 7.3 18.47 7.38C18.47 7.46 18.57 7.67 18.7 7.84C18.83 8.01 18.93 8.22 18.93 8.31C18.93 8.39 19.02 8.57 19.13 8.71C19.23 8.84 19.36 9.1 19.41 9.27C19.54 9.75 19.73 9.81 21.07 9.79L22.25 9.77L22.59 10.08L22.93 10.39L22.93 12L22.93 13.61L22.59 13.91C22.33 14.16 22.19 14.22 21.86 14.22C21.37 14.22 21.28 14.31 21.2 14.91C21.16 15.17 21.07 15.64 21 15.97C20.93 16.31 20.81 16.99 20.74 17.5C20.61 18.45 20.46 19.36 20.12 21.29C19.95 22.23 19.89 22.43 19.67 22.65C19.53 22.79 19.35 22.91 19.29 22.91C12.9 22.97 4.81 22.93 4.6 22.85ZM8.86 19.68L9.13 19.41L9.13 16.68L9.13 13.96L8.81 13.67C8.45 13.36 8.38 13.34 8.11 13.48C7.69 13.71 7.66 13.96 7.66 16.71C7.66 18.83 7.68 19.36 7.79 19.58C8.03 20.03 8.47 20.08 8.86 19.68ZM12.5 19.67C12.63 19.51 12.74 19.31 12.74 19.23C12.74 19.14 12.75 17.94 12.75 16.55C12.75 14.1 12.74 14.03 12.54 13.76C12.32 13.45 12.09 13.35 11.83 13.43C11.74 13.46 11.57 13.61 11.46 13.76C11.26 14.03 11.25 14.1 11.25 16.55C11.25 17.94 11.26 19.14 11.26 19.23C11.26 19.51 11.72 19.95 12 19.95C12.18 19.95 12.34 19.86 12.5 19.67ZM15.92 19.89C16.3 19.75 16.34 19.43 16.34 16.71C16.34 13.96 16.31 13.71 15.89 13.48C15.62 13.34 15.55 13.36 15.19 13.67L14.87 13.96L14.87 16.68L14.87 19.41L15.14 19.68C15.4 19.94 15.63 20.01 15.92 19.89ZM17.92 9.73C18.07 9.64 18.02 9.44 17.78 9.15C17.65 9 17.55 8.82 17.55 8.75C17.55 8.67 17.44 8.47 17.32 8.3C17.19 8.13 17.08 7.92 17.08 7.83C17.08 7.75 17 7.57 16.9 7.44C16.79 7.31 16.66 7.06 16.6 6.9C16.55 6.73 16.42 6.49 16.33 6.37C16.24 6.25 16.16 6.08 16.16 5.99C16.16 5.9 16.07 5.72 15.97 5.59C15.87 5.46 15.74 5.22 15.68 5.05C15.62 4.88 15.5 4.64 15.41 4.52C15.31 4.4 15.24 4.23 15.24 4.14C15.24 4.05 15.15 3.87 15.04 3.74C14.94 3.6 14.81 3.36 14.77 3.19C14.61 2.62 14.41 2.57 12 2.57C9.59 2.57 9.39 2.62 9.23 3.19C9.19 3.36 9.06 3.6 8.96 3.74C8.85 3.87 8.76 4.05 8.76 4.14C8.76 4.23 8.69 4.4 8.59 4.52C8.5 4.64 8.38 4.88 8.32 5.05C8.26 5.22 8.13 5.46 8.03 5.59C7.93 5.72 7.84 5.9 7.84 5.99C7.84 6.07 7.74 6.28 7.61 6.45C7.48 6.63 7.38 6.83 7.38 6.92C7.38 7 7.27 7.21 7.15 7.38C7.02 7.55 6.92 7.76 6.92 7.85C6.92 7.93 6.84 8.1 6.74 8.22C6.65 8.34 6.54 8.55 6.5 8.67C6.46 8.8 6.33 9.02 6.21 9.16C5.98 9.45 5.94 9.6 6.08 9.74C6.18 9.84 17.76 9.83 17.92 9.73Z\"]},{\"id\":\"role-client\",\"label\":\"Client role\",\"set\":\"solid\",\"paths\":[\"M4.6 22.85C4.46 22.79 4.28 22.64 4.2 22.52C4.06 22.3 3.75 20.81 3.64 19.81C3.6 19.51 3.53 19.09 3.48 18.89C3.43 18.69 3.31 18 3.21 17.36C2.94 15.52 2.74 14.46 2.64 14.33C2.59 14.27 2.37 14.22 2.14 14.22C1.81 14.22 1.67 14.16 1.41 13.92L1.08 13.61L1.07 12.01L1.07 10.4L1.41 10.09L1.75 9.77L2.93 9.79C4.27 9.81 4.46 9.75 4.59 9.27C4.64 9.1 4.77 8.84 4.87 8.71C4.98 8.57 5.07 8.39 5.07 8.31C5.07 8.22 5.17 8.01 5.3 7.84C5.43 7.67 5.53 7.46 5.53 7.38C5.53 7.3 5.63 7.09 5.76 6.92C5.89 6.74 5.99 6.54 5.99 6.45C5.99 6.37 6.1 6.16 6.22 5.99C6.35 5.82 6.45 5.61 6.45 5.53C6.45 5.45 6.56 5.24 6.68 5.07C6.81 4.89 6.92 4.69 6.92 4.61C6.92 4.52 7.02 4.32 7.15 4.14C7.27 3.97 7.38 3.76 7.38 3.68C7.38 3.6 7.48 3.39 7.61 3.22C7.74 3.05 7.84 2.84 7.84 2.75C7.84 2.67 7.92 2.5 8.01 2.37C8.11 2.25 8.25 2 8.33 1.82C8.4 1.64 8.6 1.4 8.75 1.29C9.03 1.09 9.1 1.08 12 1.08C14.9 1.08 14.97 1.09 15.25 1.29C15.4 1.4 15.6 1.64 15.67 1.82C15.75 2 15.89 2.25 15.99 2.37C16.08 2.5 16.16 2.67 16.16 2.75C16.16 2.84 16.26 3.05 16.39 3.22C16.52 3.39 16.62 3.6 16.62 3.68C16.62 3.76 16.73 3.97 16.85 4.14C16.98 4.32 17.08 4.52 17.08 4.61C17.08 4.69 17.19 4.89 17.32 5.07C17.44 5.24 17.55 5.45 17.55 5.53C17.55 5.61 17.65 5.82 17.78 5.99C17.9 6.16 18.01 6.37 18.01 6.45C18.01 6.54 18.11 6.74 18.24 6.92C18.37 7.09 18.47 7.3 18.47 7.38C18.47 7.46 18.57 7.67 18.7 7.84C18.83 8.01 18.93 8.22 18.93 8.31C18.93 8.39 19.02 8.57 19.13 8.71C19.23 8.84 19.36 9.1 19.41 9.27C19.54 9.75 19.73 9.81 21.07 9.79L22.25 9.77L22.59 10.08L22.93 10.39L22.93 12L22.93 13.61L22.59 13.91C22.33 14.16 22.19 14.22 21.86 14.22C21.37 14.22 21.28 14.31 21.2 14.91C21.16 15.17 21.07 15.64 21 15.97C20.93 16.31 20.81 16.99 20.74 17.5C20.61 18.45 20.46 19.36 20.12 21.29C19.95 22.23 19.89 22.43 19.67 22.65C19.53 22.79 19.35 22.91 19.29 22.91C12.9 22.97 4.81 22.93 4.6 22.85ZM8.86 19.68L9.13 19.41L9.13 16.68L9.13 13.96L8.81 13.67C8.45 13.36 8.38 13.34 8.11 13.48C7.69 13.71 7.66 13.96 7.66 16.71C7.66 18.83 7.68 19.36 7.79 19.58C8.03 20.03 8.47 20.08 8.86 19.68ZM12.5 19.67C12.63 19.51 12.74 19.31 12.74 19.23C12.74 19.14 12.75 17.94 12.75 16.55C12.75 14.1 12.74 14.03 12.54 13.76C12.32 13.45 12.09 13.35 11.83 13.43C11.74 13.46 11.57 13.61 11.46 13.76C11.26 14.03 11.25 14.1 11.25 16.55C11.25 17.94 11.26 19.14 11.26 19.23C11.26 19.51 11.72 19.95 12 19.95C12.18 19.95 12.34 19.86 12.5 19.67ZM15.92 19.89C16.3 19.75 16.34 19.43 16.34 16.71C16.34 13.96 16.31 13.71 15.89 13.48C15.62 13.34 15.55 13.36 15.19 13.67L14.87 13.96L14.87 16.68L14.87 19.41L15.14 19.68C15.4 19.94 15.63 20.01 15.92 19.89ZM17.92 9.73C18.07 9.64 18.02 9.44 17.78 9.15C17.65 9 17.55 8.82 17.55 8.75C17.55 8.67 17.44 8.47 17.32 8.3C17.19 8.13 17.08 7.92 17.08 7.83C17.08 7.75 17 7.57 16.9 7.44C16.79 7.31 16.66 7.06 16.6 6.9C16.55 6.73 16.42 6.49 16.33 6.37C16.24 6.25 16.16 6.08 16.16 5.99C16.16 5.9 16.07 5.72 15.97 5.59C15.87 5.46 15.74 5.22 15.68 5.05C15.62 4.88 15.5 4.64 15.41 4.52C15.31 4.4 15.24 4.23 15.24 4.14C15.24 4.05 15.15 3.87 15.04 3.74C14.94 3.6 14.81 3.36 14.77 3.19C14.61 2.62 14.41 2.57 12 2.57C9.59 2.57 9.39 2.62 9.23 3.19C9.19 3.36 9.06 3.6 8.96 3.74C8.85 3.87 8.76 4.05 8.76 4.14C8.76 4.23 8.69 4.4 8.59 4.52C8.5 4.64 8.38 4.88 8.32 5.05C8.26 5.22 8.13 5.46 8.03 5.59C7.93 5.72 7.84 5.9 7.84 5.99C7.84 6.07 7.74 6.28 7.61 6.45C7.48 6.63 7.38 6.83 7.38 6.92C7.38 7 7.27 7.21 7.15 7.38C7.02 7.55 6.92 7.76 6.92 7.85C6.92 7.93 6.84 8.1 6.74 8.22C6.65 8.34 6.54 8.55 6.5 8.67C6.46 8.8 6.33 9.02 6.21 9.16C5.98 9.45 5.94 9.6 6.08 9.74C6.18 9.84 17.76 9.83 17.92 9.73Z\"]},{\"id\":\"role-owner\",\"label\":\"Owner role\",\"set\":\"solid\",\"paths\":[\"M3.83 22.34C3.71 22.21 3.68 21.97 3.68 21.03C3.69 20.39 3.72 19.82 3.76 19.75C3.82 19.66 5.43 19.64 11.96 19.64C19.01 19.64 20.11 19.66 20.19 19.78C20.25 19.86 20.28 20.37 20.28 21.08C20.27 22.12 20.25 22.27 20.1 22.38C19.96 22.48 18.57 22.5 11.96 22.5C4.36 22.51 3.97 22.5 3.83 22.34ZM3.69 17.98C3.49 17.72 3.48 17.7 3.29 16.74C3.22 16.4 3.09 15.87 3.01 15.58C2.63 14.18 2.44 13.4 2.38 13.04C2.35 12.82 2.27 12.52 2.2 12.36C2.14 12.2 2.04 11.8 1.98 11.46C1.92 11.12 1.84 10.77 1.79 10.68C1.75 10.6 1.63 10.18 1.54 9.74C1.45 9.31 1.29 8.68 1.18 8.34C0.98 7.64 0.95 7.34 1.09 7.26C1.14 7.23 1.92 7.56 2.81 8C3.71 8.44 4.54 8.85 4.67 8.9C4.79 8.96 4.95 9.04 5.02 9.09C5.1 9.13 5.51 9.34 5.94 9.54C6.37 9.74 6.76 9.99 6.81 10.08C6.86 10.17 6.9 10.54 6.9 10.9C6.91 11.47 6.94 11.6 7.17 11.94C7.31 12.15 7.6 12.44 7.81 12.59C8.13 12.8 8.29 12.85 8.74 12.85C9.2 12.85 9.34 12.81 9.65 12.58C9.85 12.43 10.13 12.16 10.27 11.98C10.52 11.65 10.52 11.61 10.56 10.39L10.59 9.13L10.29 8.76C10.12 8.55 9.79 8.11 9.54 7.79C9.29 7.46 8.92 7.01 8.71 6.77C8.5 6.54 8.33 6.26 8.33 6.15C8.33 6.04 8.6 5.63 8.94 5.22C9.27 4.82 9.78 4.17 10.08 3.77C10.37 3.38 10.67 3 10.73 2.93C10.8 2.85 11.06 2.51 11.32 2.16C11.86 1.44 12.08 1.35 12.32 1.75C12.61 2.2 14.08 4.12 15.24 5.55C15.6 6 15.6 6.3 15.23 6.74C14.59 7.49 13.72 8.62 13.52 8.95C13.32 9.28 13.31 9.39 13.33 10.32C13.36 11.49 13.51 11.95 14.02 12.4C14.44 12.76 14.67 12.85 15.25 12.85C15.95 12.85 16.49 12.46 16.87 11.69C17.08 11.29 17.11 11.14 17.06 10.79C16.98 10.16 17.12 9.94 17.81 9.62C18.13 9.46 19.09 9 19.93 8.59C20.78 8.18 21.49 7.84 21.51 7.84C21.53 7.84 21.84 7.68 22.19 7.48C22.54 7.28 22.87 7.14 22.91 7.17C23.06 7.26 23.01 7.76 22.83 8.05C22.74 8.21 22.63 8.51 22.6 8.74C22.57 8.96 22.44 9.5 22.33 9.94C22.21 10.39 22.01 11.16 21.89 11.66C21.76 12.17 21.56 12.98 21.43 13.48C21.31 13.97 21.11 14.77 20.99 15.26C20.45 17.42 20.28 18 20.15 18.1C20.04 18.19 18.27 18.22 11.94 18.22L3.87 18.22L3.69 17.98Z\"]},{\"id\":\"role-seller\",\"label\":\"Seller role\",\"set\":\"solid\",\"paths\":[\"M9.07 22.94C8.4 22.82 6.94 22.42 6.46 22.22C4.97 21.63 4.15 20.98 3.36 19.76C3.33 19.7 3.19 19.41 3.05 19.11C2.85 18.66 2.8 18.4 2.76 17.56C2.7 16.04 2.96 14.67 3.53 13.54C3.65 13.3 3.75 13.05 3.75 12.99C3.75 12.93 3.86 12.71 4 12.51C4.13 12.3 4.35 11.97 4.47 11.77C4.6 11.57 4.82 11.26 4.97 11.08C5.11 10.91 5.25 10.72 5.29 10.67C5.67 10.18 7.16 8.52 7.67 8.04L8.32 7.42L12 7.42L15.68 7.42L16.33 8.04C16.84 8.52 18.33 10.18 18.71 10.67C18.75 10.72 18.89 10.91 19.03 11.08C19.18 11.26 19.4 11.57 19.53 11.77C19.65 11.97 19.87 12.3 20 12.51C20.14 12.71 20.25 12.93 20.25 12.99C20.25 13.05 20.35 13.3 20.47 13.54C21.04 14.67 21.3 16.04 21.24 17.56C21.2 18.41 21.15 18.66 20.95 19.09C20.82 19.37 20.71 19.62 20.71 19.65C20.71 19.68 20.54 19.93 20.34 20.21C19.85 20.87 19.06 21.51 18.28 21.89C17.93 22.06 17.56 22.24 17.46 22.29C17.37 22.34 16.81 22.51 16.22 22.66L15.16 22.94L12.23 22.96C10.62 22.97 9.19 22.96 9.07 22.94ZM12.58 18.71C12.74 18.41 12.97 18.14 13.18 18.01C13.76 17.64 14.27 16.99 14.34 16.53C14.44 15.9 14.31 15.32 13.99 14.92C13.65 14.49 12.8 14.07 11.93 13.88C11.26 13.74 10.99 13.52 10.99 13.11C10.99 12.75 11.2 12.51 11.63 12.37C11.95 12.26 12.07 12.26 12.35 12.36C12.8 12.52 12.92 12.62 12.92 12.88C12.92 13.14 13.39 13.7 13.66 13.77C13.91 13.84 14.38 13.39 14.38 13.08C14.37 12.35 14.02 11.78 13.27 11.26C12.96 11.06 12.73 10.81 12.59 10.51C12.23 9.81 11.73 9.82 11.4 10.53C11.29 10.78 11.07 11.03 10.75 11.25C10.49 11.44 10.15 11.74 10 11.93C9.5 12.56 9.5 13.77 10.01 14.35C10.33 14.72 11.22 15.17 11.82 15.26C12.32 15.34 12.87 15.61 12.95 15.81C13.12 16.25 12.82 16.73 12.24 16.95C11.75 17.13 10.99 16.6 10.99 16.08C10.99 16.01 10.84 15.84 10.66 15.7C10.39 15.5 10.3 15.47 10.09 15.54C9.23 15.84 9.64 17.29 10.78 17.99C11.02 18.14 11.24 18.37 11.37 18.62C11.65 19.19 11.72 19.25 12.04 19.22C12.27 19.2 12.36 19.12 12.58 18.71ZM8.79 6.01C8.66 5.95 8.5 5.78 8.42 5.63C8.35 5.48 8.19 5.22 8.08 5.07C7.97 4.91 7.88 4.72 7.88 4.64C7.88 4.57 7.8 4.41 7.7 4.29C7.61 4.17 7.46 3.92 7.38 3.75C7.29 3.57 7.11 3.22 6.96 2.97C6.31 1.86 6.31 1.65 6.93 1.27C7.26 1.06 7.37 1.05 9.07 1.02C10.48 1 10.96 1.02 11.36 1.13C12.27 1.39 14.14 1.73 14.64 1.73C15.15 1.73 15.91 1.56 16.5 1.31C16.8 1.18 16.86 1.18 17.13 1.32C17.69 1.61 17.68 1.88 17.04 2.97C16.89 3.22 16.71 3.57 16.62 3.75C16.54 3.92 16.39 4.17 16.3 4.29C16.2 4.41 16.12 4.57 16.12 4.64C16.12 4.72 16.03 4.91 15.92 5.07C15.81 5.22 15.65 5.48 15.58 5.63C15.5 5.78 15.34 5.95 15.21 6.01C14.89 6.17 9.11 6.17 8.79 6.01Z\"]},{\"id\":\"role-user\",\"label\":\"User role\",\"set\":\"solid\",\"paths\":[\"M3.84 22.74C3.3 22.42 3 22.1 2.68 21.52C2.38 20.97 2.35 20.42 2.59 19.85C2.68 19.65 2.79 19.22 2.84 18.89C2.89 18.55 3.01 18.01 3.1 17.68C3.19 17.36 3.31 16.92 3.37 16.72C3.86 14.84 5.09 12.73 6.22 11.83C6.43 11.66 6.85 11.44 7.15 11.34L7.7 11.15L8.32 11.36C8.65 11.47 9.06 11.64 9.22 11.74C9.78 12.08 11.06 12.36 12 12.36C12.94 12.36 14.22 12.08 14.78 11.74C14.94 11.64 15.35 11.47 15.68 11.36L16.3 11.15L16.85 11.34C17.15 11.44 17.57 11.66 17.78 11.83C18.91 12.73 20.14 14.84 20.63 16.72C20.69 16.92 20.81 17.36 20.9 17.68C20.99 18.01 21.11 18.55 21.16 18.89C21.21 19.22 21.32 19.65 21.4 19.84C21.83 20.87 21.31 22.08 20.14 22.75L19.71 23L11.98 23L4.25 22.99L3.84 22.74ZM10.81 11.09C10.15 10.96 9.13 10.39 8.53 9.81C8.03 9.33 7.5 8.62 7.37 8.24C7.29 8.02 7.19 7.8 7.15 7.74C7.1 7.69 7.02 7.31 6.96 6.89C6.66 4.68 7.67 2.68 9.65 1.58C10.45 1.13 10.84 1.05 12 1.05C13.16 1.05 13.55 1.13 14.35 1.58C16.33 2.68 17.34 4.68 17.04 6.89C16.98 7.31 16.9 7.69 16.85 7.74C16.81 7.8 16.71 8.02 16.63 8.24C16.5 8.62 15.97 9.34 15.48 9.8C15.06 10.2 14.63 10.49 13.99 10.8C13.42 11.08 13.29 11.1 12.3 11.13C11.7 11.15 11.04 11.13 10.81 11.09Z\"]},{\"id\":\"role-bot\",\"label\":\"Bot role\",\"set\":\"solid\",\"paths\":[\"M8.69 22.7C6.49 22.14 5.36 21.72 4.07 20.98C3.14 20.43 1.97 19.3 1.51 18.47L1.15 17.84L1.2 15.72C1.23 13.74 1.26 13.53 1.56 12.68C1.88 11.76 2.38 10.68 2.77 10.06C2.96 9.75 2.99 9.46 3 7.21C3.01 4.82 2.97 4.31 2.76 4.31C2.71 4.31 2.49 4.06 2.26 3.75C1.74 3.03 1.71 2.48 2.18 1.84C2.65 1.18 3 1 3.74 1C4.25 1 4.46 1.06 4.76 1.29C5.25 1.67 5.62 2.28 5.62 2.73C5.62 3.15 5.2 3.91 4.77 4.28C4.46 4.55 4.47 4.42 4.43 7.18C4.42 7.73 4.74 7.73 5.25 7.18C5.65 6.76 6.65 6.02 6.82 6.02C6.86 6.02 7.03 5.92 7.19 5.8C8.11 5.15 10.3 4.61 12 4.61C13.7 4.61 15.89 5.15 16.81 5.8C16.97 5.92 17.14 6.02 17.17 6.02C17.35 6.02 18.49 6.84 18.81 7.21C19.27 7.73 19.58 7.72 19.57 7.18C19.53 4.42 19.54 4.55 19.23 4.28C18.8 3.91 18.38 3.15 18.38 2.73C18.38 2.28 18.75 1.67 19.24 1.29C19.54 1.06 19.75 1 20.26 1C21 1 21.35 1.18 21.82 1.84C22.29 2.48 22.26 3.03 21.74 3.75C21.51 4.06 21.29 4.31 21.24 4.31C21.03 4.31 20.99 4.82 21 7.21C21.01 9.46 21.04 9.75 21.23 10.06C21.7 10.8 22.16 11.86 22.49 12.92C22.81 13.96 22.83 14.13 22.83 15.95C22.83 17.85 22.82 17.89 22.52 18.42C22.11 19.13 21.78 19.51 20.95 20.23C19.69 21.31 17.93 22.07 15.23 22.7C14.08 22.97 13.74 23 11.87 22.99C10.06 22.98 9.63 22.94 8.69 22.7ZM15.27 18.1C17.36 17.82 18.59 17.32 18.85 16.65C19.1 15.98 18.51 12.98 17.87 11.72C17.53 11.05 17.33 11 16.25 11.37C15.21 11.72 13.9 11.87 12 11.87C10.1 11.87 8.79 11.72 7.75 11.37C6.67 11 6.47 11.05 6.13 11.72C5.49 12.98 4.9 15.98 5.15 16.65C5.47 17.49 7.33 18.04 10.97 18.37C11.77 18.44 13.5 18.33 15.27 18.1ZM8.05 16.33C7.22 15.84 7.17 15 7.93 14.49C8.52 14.08 8.61 14.08 9.12 14.46C9.92 15.04 9.92 15.71 9.13 16.28C8.87 16.46 8.63 16.62 8.59 16.62C8.55 16.61 8.31 16.49 8.05 16.33ZM15.01 16.4C14.36 16.01 14.12 15.42 14.39 14.92C14.45 14.81 14.7 14.58 14.95 14.41C15.38 14.11 15.41 14.1 15.72 14.27C16.84 14.88 16.93 15.75 15.94 16.33C15.36 16.67 15.44 16.67 15.01 16.4Z\"]},{\"id\":\"role-dev\",\"label\":\"Developer role\",\"set\":\"solid\",\"paths\":[\"M9.56 21.85C9.04 21.69 8.5 21.03 8.5 20.55C8.5 20.44 8.61 20 8.74 19.57C8.99 18.79 9.19 18.03 9.5 16.6C9.75 15.5 9.98 14.55 10.25 13.55C10.38 13.08 10.6 12.21 10.74 11.6C10.89 10.99 11.3 9.31 11.66 7.85C12.03 6.39 12.4 4.82 12.5 4.35C12.6 3.88 12.78 3.29 12.9 3.03C13.14 2.47 13.69 2.05 14.16 2.05C14.62 2.05 15.36 2.65 15.49 3.12C15.6 3.52 15.59 3.63 15.25 4.8C15.13 5.24 14.93 6.01 14.81 6.5C14.29 8.75 13.88 10.44 13.73 10.95C13.54 11.6 13.25 12.83 13.05 13.8C12.91 14.48 12.79 14.97 12.26 16.95C12.13 17.47 11.87 18.51 11.7 19.25C11.52 19.99 11.31 20.77 11.23 20.97C10.92 21.7 10.25 22.06 9.56 21.85ZM6.54 18.44C6.24 18.36 5.8 17.91 3.86 15.76C3.54 15.39 3 14.8 2.66 14.44C0.76 12.39 0.64 12.04 1.51 10.94C1.8 10.59 2.26 10.05 2.54 9.74C2.82 9.44 3.43 8.76 3.9 8.24C4.36 7.72 5.13 6.91 5.61 6.42C6.44 5.59 6.49 5.55 6.91 5.55C7.46 5.55 7.97 5.93 8.25 6.54C8.43 6.94 8.43 6.96 8.24 7.37C8.13 7.61 7.27 8.65 6.23 9.8C4.95 11.19 4.4 11.87 4.4 12.03C4.4 12.19 4.72 12.62 5.39 13.33C7.41 15.52 7.99 16.2 8.2 16.61C8.41 17.04 8.41 17.05 8.22 17.48C8.03 17.91 7.49 18.45 7.25 18.45C7.18 18.45 7.06 18.47 6.98 18.49C6.91 18.51 6.71 18.49 6.54 18.44ZM16.86 18.45C16.33 18.29 15.8 17.63 15.8 17.12C15.8 16.71 16.06 16.23 16.57 15.68C16.83 15.4 17.36 14.82 17.75 14.38C18.13 13.95 18.73 13.3 19.07 12.94C19.43 12.57 19.7 12.19 19.7 12.07C19.7 11.86 19.45 11.54 17.7 9.59C16.1 7.81 15.91 7.56 15.84 7.2C15.75 6.71 15.96 6.2 16.4 5.85C17.17 5.24 17.91 5.56 19.12 7.03C19.27 7.21 19.74 7.75 20.17 8.22C20.6 8.7 21.22 9.38 21.54 9.74C21.86 10.1 22.18 10.44 22.24 10.5C22.3 10.56 22.5 10.8 22.68 11.04C22.95 11.42 23 11.58 23 12.06C23 12.7 22.96 12.76 21.57 14.28C21.11 14.79 20.51 15.45 20.24 15.75C18.63 17.59 17.9 18.34 17.66 18.41C17.24 18.52 17.15 18.53 16.86 18.45Z\"]},{\"id\":\"role-middleman\",\"label\":\"Middleman role\",\"set\":\"solid\",\"paths\":[\"M2.42 21.08C1.84 20.88 1.51 20.6 1.25 20.07C1.02 19.6 1.01 19.47 1 16.22C1 13 1.01 12.84 1.21 12.65C1.43 12.45 1.48 12.46 2.28 12.75C2.68 12.9 3.32 12.92 6.34 12.92C10.43 12.91 10.29 12.88 10.16 13.76C10.1 14.16 10.13 14.26 10.36 14.49C10.63 14.76 10.68 14.76 12.09 14.76C13.8 14.76 13.83 14.74 13.84 13.78C13.84 13.43 13.9 13.1 13.96 13.03C14.04 12.95 15.21 12.91 17.73 12.92C21.17 12.93 21.42 12.91 21.88 12.71C22.43 12.46 22.73 12.43 22.84 12.6C22.88 12.66 22.91 14.37 22.91 16.39L22.9 20.07L22.61 20.44C22.01 21.2 22.55 21.16 12.17 21.19C5.11 21.21 2.7 21.18 2.42 21.08ZM5.81 11.95L2.23 11.89L1.82 11.58C1.13 11.05 1.01 10.62 1 8.78C1 6.88 1.13 6.44 1.87 5.93L2.34 5.61L4.71 5.59C6.01 5.58 7.15 5.54 7.24 5.51C7.35 5.47 7.39 5.28 7.39 4.88C7.39 4.41 7.46 4.2 7.75 3.77C8.37 2.82 8.34 2.82 11.97 2.82C15.48 2.81 15.46 2.8 16.16 3.53C16.48 3.87 16.54 4 16.6 4.67C16.64 5.09 16.71 5.47 16.75 5.52C16.8 5.56 17.82 5.59 19.02 5.57C20.23 5.56 21.4 5.59 21.64 5.65C21.89 5.71 22.23 5.92 22.48 6.18L22.91 6.6L22.91 8.75C22.91 11.16 22.89 11.23 22.07 11.7C21.65 11.94 21.58 11.94 17.89 11.94C14.61 11.95 14.11 11.92 13.96 11.78C13.86 11.68 13.79 11.54 13.79 11.45C13.79 11.17 13.36 11.08 12 11.08L10.64 11.08L10.16 11.57C9.9 11.83 9.62 12.04 9.54 12.03C9.46 12.02 7.79 11.98 5.81 11.95ZM14.66 5.44C14.77 5.32 14.87 5.18 14.87 5.12C14.87 5.06 14.77 4.91 14.66 4.79C14.45 4.59 14.29 4.58 12.05 4.58C9.81 4.58 9.66 4.59 9.45 4.79C9.33 4.91 9.24 5.06 9.24 5.12C9.24 5.18 9.33 5.32 9.45 5.44C9.66 5.65 9.81 5.66 12.05 5.66C14.29 5.66 14.45 5.65 14.66 5.44Z\"]},{\"id\":\"role-moderator\",\"label\":\"Moderator role\",\"set\":\"solid\",\"paths\":[\"M11.01 22.92C10.93 22.89 10.73 22.76 10.57 22.62C10.4 22.49 10.22 22.38 10.17 22.38C10.11 22.38 9.84 22.23 9.58 22.04C7.16 20.35 5.02 17.91 3.92 15.57C3.7 15.12 3.46 14.62 3.38 14.46C2.87 13.45 2.24 10.98 2.15 9.61C2.06 8.37 1.9 6.48 1.82 5.91C1.76 5.48 1.77 5.47 2.16 5.3C3.27 4.82 3.68 4.57 4.26 4.05C5 3.37 5.39 2.85 5.82 1.93C6 1.56 6.22 1.2 6.32 1.13C6.45 1.03 7.75 1 12 1L17.52 1L17.74 1.24C17.86 1.37 18.03 1.67 18.11 1.91C18.29 2.4 18.92 3.28 19.43 3.76C19.97 4.25 20.41 4.54 21.33 5L22.17 5.42L22.16 5.88C22.12 7.39 21.73 11.21 21.59 11.5C21.54 11.6 21.43 12 21.34 12.4C21.26 12.81 21.09 13.31 20.98 13.53C20.86 13.74 20.77 13.97 20.77 14.04C20.77 14.38 19.66 16.46 18.88 17.59C18.03 18.82 16.14 20.83 15.37 21.32C15.23 21.42 15.09 21.52 15.06 21.56C14.98 21.67 14 22.32 13.37 22.68C12.86 22.97 12.72 23 11.99 22.99C11.54 22.99 11.1 22.96 11.01 22.92ZM13.2 20.4C13.57 20.11 14.15 19.66 14.49 19.39C15.6 18.51 17.02 16.91 17.66 15.78C18.06 15.09 18.47 14.35 18.57 14.13C19.28 12.58 19.8 10.54 19.89 8.95C19.92 8.43 19.97 7.79 20 7.52C20.03 7.25 20.01 6.94 19.95 6.83C19.89 6.71 19.52 6.41 19.13 6.15C18.05 5.43 17.2 4.54 16.64 3.54C16.38 3.07 16.31 3.06 14.21 3.07C13.11 3.08 12.17 3.12 12.13 3.16C12.07 3.22 12 19.36 12.05 20.85C12.06 21.08 12.62 20.86 13.2 20.4Z\"]},{\"id\":\"role-partner\",\"label\":\"Partnerships role\",\"set\":\"solid\",\"paths\":[\"M10.33 18.68C9.03 18.29 8.07 17.71 7.18 16.76C6.59 16.15 6.52 15.9 6.81 15.56C7.02 15.33 8.98 13.98 9.12 13.98C9.16 13.98 9.29 13.89 9.39 13.78C9.72 13.41 10.09 13.42 10.8 13.79C11.79 14.31 12.61 14.24 13.84 13.55C14.77 13.03 16.1 12.14 17.11 11.37C18.85 10.05 20.07 9.39 20.77 9.39C21.67 9.39 22.72 10.23 22.91 11.09C23.22 12.45 22.59 13.24 19.63 15.2C19.12 15.53 18.53 15.92 18.31 16.07C16.79 17.09 15.48 17.88 14.97 18.1C14.77 18.19 14.47 18.33 14.29 18.42C13.38 18.87 11.41 19 10.33 18.68ZM2.62 14.61C2.13 14.39 1.74 14.01 1.31 13.36C0.87 12.68 0.88 12.12 1.36 11.41C1.71 10.88 2.52 10.14 3.15 9.75C3.33 9.64 3.82 9.32 4.23 9.03C4.65 8.74 5.17 8.39 5.39 8.25C5.61 8.1 6.04 7.82 6.34 7.61C8.47 6.17 8.95 5.9 10.23 5.48C12.48 4.74 14.98 5.54 16.93 7.61C17.47 8.2 17.4 8.44 16.51 9.1C15.37 9.94 14.2 10.64 13.95 10.64C13.86 10.64 13.49 10.48 13.13 10.28C11.78 9.54 11.42 9.67 7.46 12.42C5.1 14.06 4.49 14.45 4.03 14.63C3.43 14.86 3.14 14.86 2.62 14.61Z\"]},{\"id\":\"role-shop\",\"label\":\"Shop role\",\"set\":\"solid\",\"paths\":[\"M2.92 22.44L2.53 22.1L2.56 18.14L2.59 14.19L3.57 14.18C4.63 14.17 5.02 14.04 6 13.34L6.46 13.01L6.79 13.29C6.97 13.44 7.41 13.71 7.76 13.88C8.28 14.14 8.53 14.19 9.21 14.19C10.09 14.18 10.52 14.02 11.48 13.34L11.94 13.01L12.23 13.22C13.47 14.09 14.1 14.32 15.04 14.21C15.64 14.14 16.64 13.68 16.94 13.35C17.16 13.11 17.67 13.09 17.85 13.31C18.04 13.54 18.88 13.99 19.3 14.1C19.5 14.14 20.03 14.19 20.48 14.19L21.3 14.19L21.33 18C21.36 21.72 21.35 21.83 21.13 22.19C21 22.4 20.81 22.61 20.7 22.67C20.58 22.74 18.71 22.78 15.9 22.78C11.34 22.78 11.3 22.78 11.17 22.55C11.09 22.4 11.06 21.34 11.07 19.24C11.08 17.55 11.09 16.1 11.08 16.02C11.07 15.94 10.91 15.78 10.71 15.67C10.39 15.47 10.16 15.45 8.18 15.45C6.17 15.45 5.98 15.46 5.64 15.68C5.43 15.8 5.27 15.99 5.26 16.09C5.26 16.19 5.26 17.63 5.27 19.3C5.28 21.32 5.24 22.41 5.16 22.56C5.06 22.75 4.94 22.78 4.17 22.78C3.36 22.78 3.28 22.76 2.92 22.44ZM18.34 19.25L18.68 18.9L18.67 17.48L18.66 16.07L18.31 15.76L17.96 15.45L16.1 15.45C14.13 15.45 13.73 15.53 13.48 15.99C13.42 16.1 13.37 16.82 13.37 17.58C13.37 18.97 13.37 18.97 13.69 19.29L14.01 19.61L16 19.61L17.99 19.61L18.34 19.25ZM3.04 13.08C2.22 12.89 1.54 12.34 1.25 11.64C1.06 11.18 1.04 10.88 1.06 8.97L1.08 6.81L1.54 5.9C1.8 5.4 2.07 4.92 2.15 4.83C2.23 4.74 2.37 4.49 2.47 4.28C2.56 4.07 2.79 3.68 2.97 3.41C3.15 3.14 3.37 2.77 3.45 2.59C3.64 2.19 4.22 1.63 4.69 1.4C5 1.24 5.81 1.22 11.94 1.22C18.56 1.22 18.87 1.23 19.27 1.43C19.74 1.67 20.29 2.26 20.54 2.78C20.72 3.16 20.87 3.42 21.47 4.42C22.02 5.33 22.54 6.25 22.75 6.69C22.91 7 22.95 7.44 22.98 9.01C23.01 10.78 23 10.98 22.79 11.38C22.46 12.02 21.54 12.9 21.06 13.03C19.7 13.41 18.31 12.86 17.8 11.73C17.57 11.21 17.33 11.19 17.1 11.66C16.68 12.54 15.7 13.16 14.7 13.17C13.69 13.18 12.64 12.54 12.31 11.71C12.1 11.19 11.81 11.15 11.61 11.62C11.54 11.81 11.26 12.18 10.99 12.44C9.77 13.66 7.56 13.29 6.82 11.74C6.72 11.53 6.58 11.34 6.51 11.32C6.44 11.3 6.22 11.52 6.02 11.82C5.24 12.96 4.29 13.36 3.04 13.08Z\"]},{\"id\":\"role-support\",\"label\":\"Support role\",\"set\":\"solid\",\"paths\":[\"M13.78 22.73C12.29 22.2 11.43 21.6 10.33 20.32C9.76 19.66 9.68 19.51 9.78 19.33C9.87 19.16 10.01 19.11 10.42 19.11C10.71 19.11 11.39 18.98 11.94 18.82C14.81 17.97 17.15 15.93 18.31 13.26C18.63 12.53 19.07 10.87 19.14 10.17C19.16 9.92 19.23 9.82 19.42 9.8C19.77 9.75 21.72 11.72 22.15 12.56C23.27 14.73 23.3 17.16 22.23 19.19L21.98 19.66L22.27 20.58C22.44 21.09 22.62 21.65 22.68 21.83C22.92 22.5 22.93 22.7 22.73 22.84C22.58 22.95 22.42 22.94 21.91 22.77C19.73 22.05 19.52 22.01 19.14 22.28C19.01 22.37 18.54 22.57 18.09 22.72C17.39 22.96 17.09 23 15.89 22.99C14.74 22.98 14.38 22.94 13.78 22.73ZM7.69 17.66C7.12 17.55 6.35 17.3 5.98 17.12C5.6 16.93 5.19 16.78 5.07 16.78C4.94 16.78 4.41 16.91 3.89 17.06C1.59 17.74 1.26 17.79 1.15 17.49C1.11 17.4 1.14 17.18 1.22 17.02C1.45 16.51 2.11 14.14 2.11 13.81C2.11 13.64 1.99 13.29 1.84 13.03C1.43 12.31 1.09 10.95 1.03 9.77C0.98 8.86 1.01 8.53 1.26 7.58C1.42 6.96 1.65 6.26 1.78 6.03C1.9 5.8 2 5.57 2 5.52C2 5.47 2.28 5.06 2.62 4.61C3.19 3.84 4.13 2.94 4.95 2.38C5.88 1.73 8.22 1.01 9.41 1C9.67 1 10.37 1.11 10.97 1.24C12.75 1.63 14.64 2.67 15.62 3.82C16.2 4.5 16.98 5.69 17.06 6.03C17.1 6.2 17.18 6.36 17.23 6.39C17.37 6.48 17.52 7.12 17.71 8.38C17.86 9.35 17.86 9.61 17.71 10.6C17.5 12.03 17.52 11.98 16.91 13.22C16.49 14.07 16.21 14.45 15.44 15.23C14.02 16.68 12.85 17.33 11.06 17.68C9.72 17.93 9.05 17.93 7.69 17.66ZM10.03 13.76C10.28 13.46 10.27 13.32 9.99 12.96C9.71 12.6 9.21 12.57 8.89 12.89C8.58 13.2 8.61 13.6 8.97 13.89C9.32 14.16 9.73 14.12 10.03 13.76ZM9.82 11.38C9.93 11.34 10.03 11.12 10.07 10.87C10.13 10.53 10.28 10.28 10.71 9.85C11.74 8.8 11.93 8.48 11.98 7.7C12.03 6.94 11.81 6.35 11.24 5.74C10.85 5.31 9.94 4.89 9.41 4.89C8.5 4.89 7.1 5.99 6.94 6.82C6.84 7.33 7.02 7.56 7.5 7.56C7.81 7.56 7.93 7.47 8.25 7.02C8.47 6.72 8.8 6.42 8.99 6.34C9.52 6.12 10.14 6.34 10.5 6.86C10.97 7.56 10.9 7.77 9.82 8.86C9.29 9.4 8.82 9.96 8.76 10.11C8.64 10.41 8.73 11.08 8.91 11.31C9.03 11.45 9.53 11.49 9.82 11.38Z\"]},{\"id\":\"role-management\",\"label\":\"Management role\",\"set\":\"solid\",\"paths\":[\"M17.23 22.77C17.13 22.64 16.6 22.04 16.05 21.44C15.51 20.84 14.64 19.72 14.13 18.96C13.62 18.2 13.11 17.52 13 17.44C12.62 17.17 12.77 16.86 13.69 15.94C14.18 15.46 14.62 15.06 14.66 15.06C14.71 15.06 15.2 15.43 15.76 15.89C16.31 16.35 17.08 16.96 17.48 17.26C17.87 17.55 18.33 17.96 18.51 18.17C18.69 18.38 19.2 18.91 19.63 19.36C20.09 19.83 20.42 20.27 20.42 20.39C20.42 20.52 20.23 20.77 19.97 20.99C19.72 21.2 19.14 21.74 18.68 22.18C17.81 23.05 17.54 23.16 17.23 22.77ZM3.84 22.64C2.97 22.31 2.18 21.31 2.18 20.54C2.18 20.18 2.28 20.06 3.56 18.87C4.31 18.16 5.07 17.51 5.25 17.43C5.71 17.2 11.46 11.46 11.92 10.77C12.14 10.44 12.84 9.61 13.49 8.92C14.14 8.23 14.71 7.6 14.75 7.51C14.81 7.41 14.71 7.19 14.43 6.83C14.21 6.55 13.93 6.13 13.82 5.92C12.55 3.48 12.33 3.07 11.7 2.01C11.38 1.45 11.35 1.32 11.54 1.13C11.74 0.93 12.09 0.97 12.5 1.25C12.7 1.38 13.01 1.57 13.18 1.66C13.36 1.75 13.77 1.98 14.09 2.16C14.42 2.34 15.14 2.72 15.69 3.01C16.25 3.29 16.9 3.7 17.14 3.92C17.62 4.38 17.94 4.43 18.22 4.11C18.33 3.99 18.49 3.9 18.57 3.9C18.87 3.9 19.65 4.45 20.3 5.12C20.88 5.72 20.96 5.86 20.96 6.23C20.96 6.45 20.89 6.75 20.79 6.88C20.7 7.01 20.66 7.2 20.7 7.31C20.73 7.41 21.24 7.93 21.82 8.46C22.4 8.99 22.88 9.49 22.89 9.58C22.9 9.83 20.3 12.37 20.04 12.37C19.89 12.38 19.46 12.01 18.8 11.32C18.24 10.74 17.71 10.24 17.61 10.2C17.49 10.16 17.01 10.55 16.02 11.52C15.18 12.33 14.47 12.93 14.31 12.97C13.87 13.06 7.57 19.42 7.44 19.89C7.37 20.13 7.16 20.4 6.88 20.63C6.63 20.83 6.13 21.35 5.78 21.78C4.93 22.8 4.61 22.94 3.84 22.64ZM5.19 9.46C2.93 7.16 2.75 7 2.45 7.05C2.27 7.08 2.04 7.13 1.94 7.17C1.71 7.26 1.11 6.69 1.11 6.38C1.11 5.87 2.96 3.94 3.98 3.39C4.37 3.18 4.55 3.24 4.9 3.71C5.1 3.98 5.1 4.01 4.93 4.26C4.84 4.41 4.76 4.6 4.76 4.67C4.76 4.75 5.12 5.18 5.57 5.62C6.02 6.06 7.16 7.23 8.1 8.22C9.61 9.8 9.8 10.04 9.7 10.22C9.47 10.64 8.04 11.95 7.82 11.93C7.68 11.93 6.66 10.96 5.19 9.46Z\"]},{\"id\":\"role-exchanger\",\"label\":\"Exchanger role\",\"set\":\"solid\",\"paths\":[\"M16.12 22.71C15.85 22.36 15.84 22.17 16.06 21.23C16.21 20.6 16.21 20.49 16.07 20.35C15.93 20.22 15.29 20.19 11.98 20.21C6.59 20.24 6.72 20.29 3.93 17.51C1.65 15.25 1.67 15.27 1.67 14.2C1.67 13.39 1.69 13.29 2 12.9C2.49 12.29 3.22 11.95 3.85 12.04C4.52 12.13 4.81 12.35 6.44 13.95C7.23 14.73 8.07 15.44 8.38 15.6L8.92 15.89L12.46 15.89C16.58 15.89 16.37 15.96 16.06 14.77C15.83 13.87 15.84 13.53 16.12 13.24C16.62 12.7 16.8 12.81 19.33 15.33C21.33 17.33 21.67 17.71 21.67 18C21.67 18.28 21.33 18.66 19.33 20.66C17.36 22.64 16.95 23 16.67 23C16.46 23 16.27 22.9 16.12 22.71ZM19.69 12C19.27 11.9 19.2 11.85 17.37 10.09C16.59 9.33 15.78 8.67 15.46 8.51L14.9 8.22L11.39 8.22L7.88 8.22L7.77 8.48C7.68 8.67 7.69 8.91 7.82 9.41C8.06 10.32 8.05 10.52 7.73 10.84C7.18 11.39 7.05 11.31 4.54 8.8C2.39 6.66 2.22 6.47 2.22 6.1C2.22 5.73 2.38 5.54 4.6 3.35C5.91 2.06 7.07 1 7.17 1C7.42 1 8 1.6 8 1.85C8 1.96 7.92 2.36 7.84 2.72C7.63 3.57 7.63 3.62 7.84 3.82C7.99 3.97 8.55 4 12.09 4C16.6 4 16.87 4.03 17.83 4.67C18.61 5.2 21.99 8.61 22.18 9.06C22.37 9.54 22.38 10.23 22.18 10.7C21.98 11.18 21.22 11.85 20.7 11.99C20.23 12.12 20.2 12.12 19.69 12Z\"]},{\"id\":\"role-recruiter\",\"label\":\"Recruiter role\",\"set\":\"solid\",\"paths\":[\"M20.92 22.89C20.78 22.83 19.97 22.1 19.13 21.28L17.59 19.77L17.17 20.02C16.94 20.16 16.63 20.36 16.48 20.46C15.96 20.8 14.94 21.22 13.89 21.5C12.4 21.91 10.38 21.91 8.86 21.5C7.73 21.19 6.07 20.43 5.52 19.96C5.33 19.81 5.14 19.68 5.1 19.68C4.9 19.68 3.34 18.04 2.94 17.41C2.71 17.05 2.43 16.63 2.32 16.47C2.04 16.06 1.51 14.67 1.27 13.71C0.97 12.56 0.97 10.33 1.27 9.18C1.51 8.23 2.04 6.84 2.32 6.42C2.43 6.27 2.71 5.85 2.94 5.5C3.7 4.35 4.99 3.17 6.31 2.42C7.59 1.68 10.05 1 11.43 1C12.2 1 14.42 1.49 15.32 1.87C17.36 2.72 19.12 4.19 20.18 5.96C20.23 6.06 20.37 6.27 20.47 6.42C21.11 7.4 21.78 9.97 21.78 11.45C21.78 12.48 21.42 14.33 21.06 15.14C20.91 15.46 20.79 15.78 20.79 15.85C20.79 15.96 20.56 16.34 20 17.16C19.89 17.33 19.79 17.53 19.79 17.62C19.79 17.7 20.35 18.31 21.02 18.98C22.69 20.62 22.94 20.95 22.93 21.47C22.92 21.9 22.51 22.57 22.14 22.77C21.82 22.94 21.19 23 20.92 22.89ZM13.09 18.62C14.71 18.29 16.61 16.95 17.56 15.48C19.16 12.98 19.17 9.81 17.57 7.41C17.12 6.74 15.85 5.5 15.22 5.12C12.34 3.38 8.48 3.87 6.17 6.27C4.93 7.56 4.3 8.84 4.09 10.47C3.69 13.69 5.29 16.65 8.19 18.06C9.87 18.88 11.15 19.02 13.09 18.62ZM10.01 16.9C8.8 16.81 7.84 16.56 7.6 16.28C7.38 16.01 7.5 15.27 7.86 14.56C8.29 13.73 8.42 13.58 9.16 13.03C11.11 11.58 13.78 12.33 14.89 14.65C15.35 15.6 15.37 16.04 14.97 16.36C14.59 16.66 14.08 16.79 12.94 16.86C12.42 16.9 11.83 16.94 11.61 16.96C11.4 16.98 10.68 16.95 10.01 16.9ZM10.29 11.3C9.75 11.05 9.28 10.67 8.95 10.2C8.59 9.7 8.57 9.64 8.57 8.68C8.57 7.74 8.59 7.66 8.94 7.12C9.44 6.35 10.18 5.88 11.02 5.8C12.21 5.67 13.03 6.09 13.81 7.21C14.18 7.74 14.21 7.83 14.21 8.62C14.21 9.41 14.18 9.51 13.8 10.09C13.57 10.43 13.16 10.86 12.87 11.05C12.39 11.37 12.28 11.39 11.4 11.38C10.88 11.38 10.38 11.34 10.29 11.3Z\"]},{\"id\":\"ph-tree-palm\",\"label\":\"Palm tree\",\"set\":\"solid\",\"paths\":[\"M22.49 5.66a.75 .75 0 0 1-.44 .54L16.78 8.49a6.7 6.7 0 0 1 4.06 3.11 6.62 6.62 0 0 1 .68 5.09A.75 .75 0 0 1 20.34 17.1l-7.59-5.78V21a.75 .75 0 0 1-1.5 0V11.31L3.66 17.1a.75 .75 0 0 1-1.18-.4 6.62 6.62 0 0 1 .68-5.09A6.7 6.7 0 0 1 7.22 8.49L1.95 6.2a.75 .75 0 0 1-.24-1.2 6.27 6.27 0 0 1 9.16 0 6.77 6.77 0 0 1 1.13 1.59 6.77 6.77 0 0 1 1.13-1.59 6.27 6.27 0 0 1 9.16 0A.75 .75 0 0 1 22.49 5.66Z\"]},{\"id\":\"ph-island\",\"label\":\"Island\",\"set\":\"solid\",\"paths\":[\"M22.46 21.25A.75 .75 0 0 1 21.75 21.75H2.25a.75 .75 0 0 1-.47-1.34c.15-.12 3.61-2.84 9.21-3.14A11.25 11.25 0 0 1 10.69 13.72c.16-2.04 1.02-4.75 4.03-6.79a6.21 6.21 0 0 0-1.41-.18l-.16 0c-1.78 .06-2.9 1.1-3.42 3.18A.75 .75 0 0 1 9 10.5a.72 .72 0 0 1-.19-.02 .75 .75 0 0 1-.55-.91c.87-3.46 3.1-4.26 4.83-4.31a7.63 7.63 0 0 1 2.03 .23c-.36-.59-.88-1.21-1.61-1.52-.94-.4-2.08-.22-3.4 .52a.75 .75 0 0 1-.73-1.31c1.76-.98 3.35-1.18 4.73-.58 1.17 .5 1.94 1.48 2.43 2.34 .58-.9 1.3-1.52 2.1-1.78 1.11-.36 2.31-.07 3.56 .88a.75 .75 0 0 1-.9 1.2c-.84-.63-1.57-.85-2.19-.65-.68 .22-1.21 .94-1.54 1.56A6.61 6.61 0 0 1 19.5 6.85c1.37 .78 3 2.44 3 5.9a.75 .75 0 0 1-1.5 0c0-2.2-.76-3.75-2.25-4.59a4.73 4.73 0 0 0-.54-.26 5.22 5.22 0 0 1 .47 3.1 5.57 5.57 0 0 1-.83 2.19 .75 .75 0 0 1-1.23-.86c.07-.1 1.53-2.29-.31-4.63-2.53 1.43-3.93 3.49-4.14 6.15a9.78 9.78 0 0 0 .36 3.42c5.87 .17 9.52 3.03 9.68 3.16A.75 .75 0 0 1 22.46 21.25ZM4.88 15.75a2.63 2.63 0 1 0-2.62-2.62A2.63 2.63 0 0 0 4.88 15.75Z\"]},{\"id\":\"ph-sailboat\",\"label\":\"Sailboat\",\"set\":\"solid\",\"paths\":[\"M15 13.13V6.83a.38 .38 0 0 1 .66-.25l5.16 5.67a.75 .75 0 0 1 .04 .96 .77 .77 0 0 1-.62 .29H15.38A.38 .38 0 0 1 15 13.13Zm8.18 3.05A.75 .75 0 0 0 22.5 15.75H13.5V.75a.75 .75 0 0 0-1.33-.47l-9.75 12A.75 .75 0 0 0 3 13.5h9v2.25H1.5a.75 .75 0 0 0-.59 1.22l2.78 3.47a1.49 1.49 0 0 0 1.17 .56H19.14a1.49 1.49 0 0 0 1.17-.56l2.78-3.47A.75 .75 0 0 0 23.18 16.17Z\"]},{\"id\":\"ph-anchor\",\"label\":\"Anchor\",\"set\":\"solid\",\"paths\":[\"M21 13.5c0 3.57-2.59 4.28-4.68 4.85C14.04 18.97 12.75 19.44 12.75 21.75a.75 .75 0 0 1-1.5 0c0-2.31-1.29-2.78-3.57-3.4C5.59 17.78 3 17.07 3 13.5a.75 .75 0 0 1 1.5 0c0 2.31 1.29 2.78 3.57 3.4 1.07 .29 2.26 .62 3.18 1.34V12H8.25a.75 .75 0 0 1 0-1.5h3V7.77a2.63 2.63 0 1 1 1.5 0V10.5h3a.75 .75 0 0 1 0 1.5H12.75v6.25c.92-.73 2.11-1.05 3.18-1.34C18.21 16.28 19.5 15.81 19.5 13.5a.75 .75 0 0 1 1.5 0Z\"]},{\"id\":\"ph-treasure-chest\",\"label\":\"Treasure chest\",\"set\":\"solid\",\"paths\":[\"M22.5 11.63v6.38a1.5 1.5 0 0 1-1.5 1.5H3a1.5 1.5 0 0 1-1.5-1.5V11.63a.38 .38 0 0 1 .38-.37H5.25v6a.75 .75 0 0 0 .8 .75A.77 .77 0 0 0 6.75 17.22V11.25h3.75v1.88a.38 .38 0 0 0 .38 .38h2.25a.38 .38 0 0 0 .38-.37V11.25h3.75v6a.75 .75 0 0 0 .8 .75 .77 .77 0 0 0 .7-.77V11.25h3.38A.38 .38 0 0 1 22.5 11.63ZM17.25 3.75H6.75A5.25 5.25 0 0 0 1.5 9v.38a.38 .38 0 0 0 .38 .38H5.25V6.03A.77 .77 0 0 1 5.95 5.25 .75 .75 0 0 1 6.75 6v3.75h3.75V8.63a.38 .38 0 0 1 .38-.37h2.25a.38 .38 0 0 1 .38 .38v1.13h3.75V6.03A.77 .77 0 0 1 17.95 5.25 .75 .75 0 0 1 18.75 6v3.75h3.38a.38 .38 0 0 0 .38-.37V9A5.25 5.25 0 0 0 17.25 3.75Z\"]},{\"id\":\"ph-flag-pennant\",\"label\":\"Pennant\",\"set\":\"solid\",\"paths\":[\"M23.25 9.75a.75 .75 0 0 1-.5 .71L6 16.28V20.25a.75 .75 0 0 1-1.5 0V3.75a.75 .75 0 0 1 1-.71l17.25 6A.75 .75 0 0 1 23.25 9.75Z\"]},{\"id\":\"ph-flag-banner\",\"label\":\"Banner\",\"set\":\"solid\",\"paths\":[\"M22.43 5.57l-4.28 8.98a.33 .33 0 0 1-.01 .03l-3.21 6.74a.75 .75 0 1 1-1.35-.64L16.28 15H3.75a.75 .75 0 0 1-.53-1.28L7.19 9.75 3.22 5.78A.75 .75 0 0 1 3.75 4.5H21.75a.75 .75 0 0 1 .68 1.07Z\"]},{\"id\":\"ph-sun-horizon\",\"label\":\"Sunset\",\"set\":\"solid\",\"paths\":[\"M23.25 15a.75 .75 0 0 1-.75 .75H1.5a.75 .75 0 0 1 0-1.5H5.29a6.89 6.89 0 0 1-.04-.75 6.75 6.75 0 0 1 13.5 0 6.89 6.89 0 0 1-.04 .75H22.5A.75 .75 0 0 1 23.25 15Zm-3.75 3H4.5a.75 .75 0 0 0 0 1.5H19.5a.75 .75 0 0 0 0-1.5ZM7.58 5.59a.75 .75 0 0 0 1.34-.67l-.75-1.5a.75 .75 0 0 0-1.34 .67ZM1.91 9.67l1.5 .75a.75 .75 0 1 0 .67-1.34l-1.5-.75a.75 .75 0 1 0-.67 1.34ZM20.25 10.5a.75 .75 0 0 0 .33-.08l1.5-.75a.75 .75 0 1 0-.67-1.34l-1.5 .75A.75 .75 0 0 0 20.25 10.5ZM15.41 5.92a.75 .75 0 0 0 1.01-.34l.75-1.5a.75 .75 0 0 0-1.34-.67l-.75 1.5A.75 .75 0 0 0 15.41 5.92Z\"]},{\"id\":\"ph-moon-stars\",\"label\":\"Moon and stars\",\"set\":\"solid\",\"paths\":[\"M22.5 9a.75 .75 0 0 1-.75 .75H20.25v1.5a.75 .75 0 0 1-1.5 0V9.75H17.25a.75 .75 0 0 1 0-1.5h1.5V6.75a.75 .75 0 0 1 1.5 0V8.25h1.5A.75 .75 0 0 1 22.5 9ZM13.5 5.25h.75v.75a.75 .75 0 0 0 1.5 0V5.25h.75a.75 .75 0 0 0 0-1.5h-.75V3a.75 .75 0 0 0-1.5 0v.75h-.75a.75 .75 0 0 0 0 1.5Zm6.11 8.84A8.26 8.26 0 0 1 9.91 4.39a.75 .75 0 0 0-.99-.85A9 9 0 1 0 20.46 15.09a.75 .75 0 0 0-.85-.99Z\"]},{\"id\":\"ph-cloud-moon\",\"label\":\"Night\",\"set\":\"solid\",\"paths\":[\"M16.13 6.75a7.16 7.16 0 0 0-1.16 .09A6.74 6.74 0 0 0 9.77 .92a.75 .75 0 0 0-.9 .9A5.25 5.25 0 0 1 3.75 8.25a5.29 5.29 0 0 1-1.18-.13 .75 .75 0 0 0-.9 .9 6.77 6.77 0 0 0 3.03 4.22A4.88 4.88 0 0 0 8.63 21h7.5a7.13 7.13 0 0 0 0-14.25ZM3.5 9.75c.08 0 .16 0 .25 0a6.76 6.76 0 0 0 6.75-6.75c0-.08 0-.17 0-.25a5.22 5.22 0 0 1 3 4.5A7.16 7.16 0 0 0 9.47 11.32a4.91 4.91 0 0 0-.84-.07 4.85 4.85 0 0 0-2.81 .9A5.27 5.27 0 0 1 3.5 9.75Z\"]},{\"id\":\"ph-shooting-star\",\"label\":\"Shooting star\",\"set\":\"solid\",\"paths\":[\"M22.05 7.91l-2.63 2.22 .8 3.32a1.25 1.25 0 0 1-.48 1.3 1.27 1.27 0 0 1-1.41 .06L15.38 13.03l-2.97 1.79a1.27 1.27 0 0 1-1.41-.06 1.25 1.25 0 0 1-.48-1.3l.8-3.32L8.7 7.91a1.26 1.26 0 0 1 .72-2.21l3.46-.27 1.33-3.16a1.27 1.27 0 0 1 2.33 0l1.33 3.16 3.46 .27a1.26 1.26 0 0 1 .72 2.21ZM8.26 10.49a.75 .75 0 0 0-1.06 0L1.72 15.97a.75 .75 0 0 0 1.06 1.06l5.48-5.48A.75 .75 0 0 0 8.26 10.49Zm-.05 5.74L3.22 21.22a.75 .75 0 0 0 1.06 1.06l4.99-4.99a.75 .75 0 0 0-1.06-1.06Zm6.84-.09-5.09 5.09a.75 .75 0 0 0 1.06 1.06l5.09-5.09a.75 .75 0 0 0-1.06-1.06Z\"]},{\"id\":\"ph-planet\",\"label\":\"Planet\",\"set\":\"solid\",\"paths\":[\"M22.98 5.69c-.72-1.24-2.61-1.51-5.48-.81A9 9 0 0 0 3.08 13.15C.48 15.84 .51 17.44 1.02 18.31 1.5 19.14 2.5 19.5 3.81 19.5a11.64 11.64 0 0 0 2.7-.37 9 9 0 0 0 14.42-8.27c1.17-1.22 1.95-2.38 2.22-3.37C23.33 6.8 23.27 6.19 22.98 5.69Zm-1.28 1.41c-.57 2.14-4.56 5.37-8.2 7.47-6.36 3.66-10.65 3.89-11.17 3-.14-.24-.06-.68 .21-1.22a7.51 7.51 0 0 1 .96-1.41 8.96 8.96 0 0 0 .58 1.33 .38 .38 0 0 0 .38 .2 11.45 11.45 0 0 0 1.59-.31c1.99-.52 4.37-1.54 6.71-2.89s4.41-2.87 5.85-4.33A11.51 11.51 0 0 0 19.66 7.73a.38 .38 0 0 0 .02-.42 9.02 9.02 0 0 0-.85-1.17c1.33-.22 2.57-.2 2.86 .3C21.77 6.59 21.77 6.81 21.7 7.1Z\"]},{\"id\":\"ph-alien\",\"label\":\"Alien\",\"set\":\"solid\",\"paths\":[\"M12 1.5a9.01 9.01 0 0 0-9 9c0 2.25 1.18 5.16 3.15 7.78 1.99 2.64 4.17 4.22 5.85 4.22s3.86-1.58 5.85-4.22c1.97-2.62 3.15-5.53 3.15-7.78A9.01 9.01 0 0 0 12 1.5ZM6 10.88a1.13 1.13 0 0 1 1.13-1.12 3.38 3.38 0 0 1 3.38 3.38 1.13 1.13 0 0 1-1.12 1.13A3.38 3.38 0 0 1 6 10.88Zm7.5 7.88H10.5a.75 .75 0 0 1 0-1.5h3a.75 .75 0 0 1 0 1.5Zm1.13-4.5a1.13 1.13 0 0 1-1.12-1.12 3.38 3.38 0 0 1 3.38-3.37 1.13 1.13 0 0 1 1.13 1.13A3.38 3.38 0 0 1 14.63 14.25Z\"]},{\"id\":\"ph-butterfly\",\"label\":\"Butterfly\",\"set\":\"solid\",\"paths\":[\"M12 9.39a10.16 10.16 0 0 0-.75-1.18V5.25a.75 .75 0 0 1 1.5 0V8.21A10.16 10.16 0 0 0 12 9.39ZM21.82 4.73C21.47 4.28 20.8 3.75 19.59 3.75c-1.58 0-3.61 1.06-5.42 2.83A13.13 13.13 0 0 0 12.75 8.21V16.88a.75 .75 0 0 1-1.5 0V8.21a13.13 13.13 0 0 0-1.42-1.63C8.01 4.81 5.99 3.75 4.41 3.75 3.2 3.75 2.53 4.28 2.18 4.73c-.64 .82-1.14 2.26-.02 6.68 .57 2.23 1.83 3.09 2.87 3.41A4.13 4.13 0 0 0 12 19.24a4.13 4.13 0 0 0 6.96-4.42c1.04-.32 2.3-1.18 2.87-3.41C22.47 8.93 22.95 6.2 21.82 4.73Z\"]},{\"id\":\"ph-graduation-cap\",\"label\":\"Graduation cap\",\"set\":\"solid\",\"paths\":[\"M16.5 19.43a11.16 11.16 0 0 0 1.5-.72V22.5a.75 .75 0 0 1-1.5 0Zm1.1-8.29-5.25-2.8a.75 .75 0 0 0-.7 1.32L16.03 12l1.59-.85Zm6-2.8-11.25-6a.75 .75 0 0 0-.7 0l-11.25 6a.75 .75 0 0 0 0 1.32L3 11.05v4.54a1.49 1.49 0 0 0 .38 1C4.61 17.96 7.36 20.25 12 20.25a12.19 12.19 0 0 0 4.5-.82V12.25L16.03 12l-4.03 2.15L4.11 9.94l0 0L2.34 9 12 3.85 21.66 9l-1.76 .94-.01 0L17.63 11.15a.75 .75 0 0 1 .38 .65v6.9a10.84 10.84 0 0 0 2.62-2.12A1.49 1.49 0 0 0 21 15.59V11.05l2.6-1.39a.75 .75 0 0 0 0-1.32Z\"]},{\"id\":\"ph-detective\",\"label\":\"Detective\",\"set\":\"solid\",\"paths\":[\"M24 11.25a.75 .75 0 0 1-.75 .75H.75a.75 .75 0 0 1 0-1.5H3.37l4.45-6.13a1.5 1.5 0 0 1 2.37-.07l1.2 1.4 .02 .02a.75 .75 0 0 0 1.17 0l.02-.02 1.2-1.4a1.5 1.5 0 0 1 2.37 .07L20.63 10.5H23.25A.75 .75 0 0 1 24 11.25Zm-7.12 2.25a3.38 3.38 0 0 0-3.35 3H10.48a3.38 3.38 0 1 0-.17 1.5h3.39A3.38 3.38 0 1 0 16.88 13.5Z\"]},{\"id\":\"ph-briefcase\",\"label\":\"Briefcase\",\"set\":\"solid\",\"paths\":[\"M14.25 10.5a.75 .75 0 0 1-.75 .75H10.5a.75 .75 0 0 1 0-1.5h3A.75 .75 0 0 1 14.25 10.5Zm7.5-3.75V18.75a1.5 1.5 0 0 1-1.5 1.5H3.75a1.5 1.5 0 0 1-1.5-1.5V6.75A1.5 1.5 0 0 1 3.75 5.25H7.5V4.5a2.25 2.25 0 0 1 2.25-2.25h4.5a2.25 2.25 0 0 1 2.25 2.25v.75h3.75A1.5 1.5 0 0 1 21.75 6.75ZM9 5.25h6V4.5a.75 .75 0 0 0-.75-.75H9.75a.75 .75 0 0 0-.75 .75Zm11.25 5.4V6.75H3.75v3.9A17.25 17.25 0 0 0 12 12.75 17.25 17.25 0 0 0 20.25 10.65Z\"]},{\"id\":\"ph-money-wavy\",\"label\":\"Cash\",\"set\":\"solid\",\"paths\":[\"M22.9 5.63a.75 .75 0 0 0-.73-.04c-4.02 1.97-6.9 1.05-9.94 .07C9.04 4.64 5.74 3.59 1.17 5.82A.75 .75 0 0 0 .75 6.49V17.73a.75 .75 0 0 0 1.08 .67c4.02-1.97 6.9-1.05 9.94-.07 1.8 .58 3.64 1.16 5.72 1.16 1.6 0 3.35-.35 5.34-1.32a.75 .75 0 0 0 .42-.67V6.27A.75 .75 0 0 0 22.9 5.63ZM4.5 14.25a.75 .75 0 0 1-1.5 0V8.25a.75 .75 0 0 1 1.5 0Zm7.5 .75a3 3 0 1 1 3-3A3 3 0 0 1 12 15Zm9 .75a.75 .75 0 0 1-1.5 0V9.75a.75 .75 0 0 1 1.5 0Z\"]},{\"id\":\"ph-coin-vertical\",\"label\":\"Coin\",\"set\":\"solid\",\"paths\":[\"M18.61 5.26C17.48 3.32 15.93 2.25 14.25 2.25H9.75C8.07 2.25 6.52 3.32 5.39 5.26 4.33 7.07 3.75 9.47 3.75 12s.58 4.93 1.64 6.74C6.52 20.68 8.07 21.75 9.75 21.75h4.5c1.68 0 3.23-1.07 4.36-3.01C19.67 16.93 20.25 14.53 20.25 12S19.67 7.07 18.61 5.26ZM18.73 11.25h-3a14.32 14.32 0 0 0-.91-4.5H17.69C18.26 8 18.64 9.56 18.73 11.25Zm-1.93-6H14.11a7.79 7.79 0 0 0-1.12-1.5H14.25C15.19 3.75 16.07 4.31 16.8 5.25ZM14.25 20.25H12.98a7.79 7.79 0 0 0 1.13-1.5h2.69C16.07 19.69 15.19 20.25 14.25 20.25Zm3.44-3H14.82a14.32 14.32 0 0 0 .91-4.5h3C18.64 14.44 18.26 16 17.69 17.25Z\"]},{\"id\":\"ph-currency-circle-dollar\",\"label\":\"Dollar coin\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm1.13 14.25h-.37v.75a.75 .75 0 0 1-1.5 0v-.75H9.75a.75 .75 0 0 1 0-1.5h3.38a1.13 1.13 0 0 0 0-2.25H10.88a2.63 2.63 0 0 1 0-5.25h.38V6.75a.75 .75 0 0 1 1.5 0v.75h1.5a.75 .75 0 0 1 0 1.5H10.88a1.13 1.13 0 0 0 0 2.25h2.25a2.63 2.63 0 0 1 0 5.25Z\"]},{\"id\":\"ph-shield-star\",\"label\":\"Shield star\",\"set\":\"solid\",\"paths\":[\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v5.25c0 4.94 2.39 7.94 4.4 9.58 2.16 1.77 4.31 2.37 4.41 2.39a.75 .75 0 0 0 .39 0c.09-.02 2.24-.63 4.41-2.39C18.61 18.44 21 15.44 21 10.5V5.25A1.5 1.5 0 0 0 19.5 3.75Zm-3.47 8.2-2.84 1.14L14.85 15.3a.75 .75 0 1 1-1.2 .9L12 14 10.35 16.2a.75 .75 0 1 1-1.2-.9l1.66-2.22L7.97 11.95A.75 .75 0 1 1 8.53 10.55l2.72 1.09V9a.75 .75 0 0 1 1.5 0v2.64l2.72-1.09A.75 .75 0 1 1 16.03 11.95Z\"]},{\"id\":\"ph-headset\",\"label\":\"Headset\",\"set\":\"solid\",\"paths\":[\"M21.75 12v7.5a3.75 3.75 0 0 1-3.75 3.75H12.75a.75 .75 0 0 1 0-1.5h5.25a2.25 2.25 0 0 0 2.25-2.25H18a2.25 2.25 0 0 1-2.25-2.25V13.5a2.25 2.25 0 0 1 2.25-2.25h2.22A8.25 8.25 0 0 0 6.19 6.14 8.18 8.18 0 0 0 3.78 11.25H6a2.25 2.25 0 0 1 2.25 2.25v3.75a2.25 2.25 0 0 1-2.25 2.25H4.5a2.25 2.25 0 0 1-2.25-2.25V12A9.76 9.76 0 0 1 18.93 5.12 9.69 9.69 0 0 1 21.75 12Z\"]},{\"id\":\"ph-soccer-ball\",\"label\":\"Football\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm.75 3.69 2.32-1.6a8.29 8.29 0 0 1 3.39 2.53l-.75 2.53c-.02 0-.04 .01-.06 .02l-2.14 .69a.71 .71 0 0 0-.09 .04L12.75 8.31c0-.02 0-.04 0-.06V6C12.75 5.98 12.75 5.96 12.75 5.94ZM8.93 4.34 11.25 5.94c0 .02 0 .04 0 .06V8.25c0 .02 0 .04 0 .06L8.57 10.15a.71 .71 0 0 0-.09-.04l-2.14-.69c-.02-.01-.04-.01-.06-.02l-.75-2.53A8.29 8.29 0 0 1 8.93 4.34Zm-1.22 12.1H5.05a8.19 8.19 0 0 1-1.29-4.04l2.06-1.58a.54 .54 0 0 0 .05 .02l2.14 .7a.73 .73 0 0 0 .09 .02l1.01 2.95c-.01 .02-.03 .03-.04 .05L7.75 16.38A.73 .73 0 0 0 7.71 16.45ZM14.13 19.97a8.27 8.27 0 0 1-4.25 0L8.93 17.31c.01-.01 .03-.03 .04-.04l1.32-1.82a.72 .72 0 0 0 .04-.07h3.34a.72 .72 0 0 0 .04 .07l1.32 1.82c.01 .02 .02 .03 .04 .05Zm2.16-3.53a.73 .73 0 0 0-.04-.07L14.92 14.56c-.01-.02-.03-.03-.04-.05l1.01-2.95a.73 .73 0 0 0 .09-.02l2.14-.7a.54 .54 0 0 0 .05-.02l2.06 1.58a8.19 8.19 0 0 1-1.29 4.04Z\"]},{\"id\":\"ph-basketball\",\"label\":\"Basketball\",\"set\":\"solid\",\"paths\":[\"M5.96 4.35a9.7 9.7 0 0 1 4.88-2.03 .38 .38 0 0 1 .42 .38V11.25H8.97A9.73 9.73 0 0 0 5.94 4.92 .38 .38 0 0 1 5.96 4.35ZM4.31 6.01a9.7 9.7 0 0 0-2 4.82 .38 .38 0 0 0 .38 .42H7.47A8.24 8.24 0 0 0 4.86 5.96 .38 .38 0 0 0 4.31 6.01ZM18.04 4.35a9.7 9.7 0 0 0-4.87-2.03 .38 .38 0 0 0-.42 .38V11.25h2.28a9.73 9.73 0 0 1 3.03-6.33A.38 .38 0 0 0 18.04 4.35Zm3.64 6.48A9.7 9.7 0 0 0 19.69 6.01a.38 .38 0 0 0-.55-.04A8.24 8.24 0 0 0 16.53 11.25h4.77A.38 .38 0 0 0 21.68 10.83ZM2.32 13.17A9.7 9.7 0 0 0 4.31 17.99a.38 .38 0 0 0 .55 .05A8.24 8.24 0 0 0 7.47 12.75H2.69A.38 .38 0 0 0 2.32 13.17ZM19.69 17.99a9.7 9.7 0 0 0 2-4.82 .38 .38 0 0 0-.37-.42H16.53a8.24 8.24 0 0 0 2.6 5.29A.38 .38 0 0 0 19.69 17.99ZM5.96 19.65a9.7 9.7 0 0 0 4.88 2.03 .38 .38 0 0 0 .42-.37V12.75H8.97a9.73 9.73 0 0 1-3.03 6.33A.38 .38 0 0 0 5.96 19.65ZM15.03 12.75H12.75v8.56a.38 .38 0 0 0 .42 .38 9.7 9.7 0 0 0 4.88-2.03 .38 .38 0 0 0 .02-.57A9.73 9.73 0 0 1 15.03 12.75Z\"]},{\"id\":\"ph-heartbeat\",\"label\":\"Heartbeat\",\"set\":\"solid\",\"paths\":[\"M22.5 9.56c0 6.56-9.73 11.87-10.14 12.09a.75 .75 0 0 1-.71 0c-.31-.17-5.96-3.25-8.69-7.58A.38 .38 0 0 1 3.27 13.5H6.75a.75 .75 0 0 0 .62-.33l.88-1.31 2.38 3.56a.75 .75 0 0 0 .86 .3 .77 .77 0 0 0 .4-.31L13.15 13.5H15a.75 .75 0 0 0 .75-.8 .77 .77 0 0 0-.77-.7H12.75a.75 .75 0 0 0-.62 .33l-.88 1.31-2.38-3.56a.75 .75 0 0 0-.86-.3 .77 .77 0 0 0-.4 .31L6.35 12H2.21a.38 .38 0 0 1-.36-.26A7.21 7.21 0 0 1 1.5 9.56 5.82 5.82 0 0 1 7.31 3.75c1.94 0 3.63 .83 4.69 2.24C13.06 4.58 14.75 3.75 16.69 3.75A5.82 5.82 0 0 1 22.5 9.56Z\"]},{\"id\":\"ph-thumbs-up\",\"label\":\"Like\",\"set\":\"solid\",\"paths\":[\"M21.94 7.51A2.25 2.25 0 0 0 20.25 6.75H15V5.25a3.75 3.75 0 0 0-3.75-3.75 .75 .75 0 0 0-.67 .41L7.04 9H3a1.5 1.5 0 0 0-1.5 1.5v8.25a1.5 1.5 0 0 0 1.5 1.5H19.13a2.25 2.25 0 0 0 2.23-1.97l1.13-9A2.25 2.25 0 0 0 21.94 7.51ZM3 10.5H6.75v8.25H3Z\"]},{\"id\":\"ph-thumbs-down\",\"label\":\"Dislike\",\"set\":\"solid\",\"paths\":[\"M22.48 14.72l-1.12-9A2.25 2.25 0 0 0 19.13 3.75H3A1.5 1.5 0 0 0 1.5 5.25v8.25a1.5 1.5 0 0 0 1.5 1.5H7.04l3.54 7.09A.75 .75 0 0 0 11.25 22.5a3.75 3.75 0 0 0 3.75-3.75V17.25h5.25a2.25 2.25 0 0 0 2.23-2.53ZM6.75 13.5H3V5.25H6.75Z\"]},{\"id\":\"ph-check-circle\",\"label\":\"Check\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm4.28 8.03-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-x-circle\",\"label\":\"Cross\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.53 12.22a.75 .75 0 0 1-1.06 1.06L12 13.06l-2.47 2.47a.75 .75 0 0 1-1.06-1.06L10.94 12 8.47 9.53a.75 .75 0 0 1 1.06-1.06L12 10.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06L13.06 12Z\"]},{\"id\":\"ph-check-fat\",\"label\":\"Check mark\",\"set\":\"solid\",\"paths\":[\"M22.81 8.52l-12.04 12.04a1.5 1.5 0 0 1-2.12 0l-6.71-6.75a1.5 1.5 0 0 1 0-2.12l1.88-1.87a1.5 1.5 0 0 1 2.12 0L9.75 13.52l9.07-8.96a1.5 1.5 0 0 1 2.12 0l1.87 1.83A1.5 1.5 0 0 1 22.81 8.52Z\"]},{\"id\":\"ph-x\",\"label\":\"Close\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM17.03 15.97a.75 .75 0 0 1-1.06 1.06L12 13.06 8.03 17.03a.75 .75 0 0 1-1.06-1.06L10.94 12 6.97 8.03A.75 .75 0 0 1 8.03 6.97L12 10.94l3.97-3.97a.75 .75 0 0 1 1.06 1.06L13.06 12Z\"]},{\"id\":\"ph-check-square\",\"label\":\"Check square\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3Zm-3.22 7.28-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-x-square\",\"label\":\"Cross square\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM15.53 14.47a.75 .75 0 0 1-1.06 1.06L12 13.06l-2.47 2.47a.75 .75 0 0 1-1.06-1.06L10.94 12 8.47 9.53a.75 .75 0 0 1 1.06-1.06L12 10.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06L13.06 12Z\"]},{\"id\":\"ph-warning\",\"label\":\"Warning\",\"set\":\"solid\",\"paths\":[\"M22.2 17.63 14 3.4h0a2.32 2.32 0 0 0-4 0L1.8 17.63a2.2 2.2 0 0 0 0 2.22A2.28 2.28 0 0 0 3.8 21h16.4a2.28 2.28 0 0 0 2-1.14A2.2 2.2 0 0 0 22.2 17.63ZM11.25 9.75a.75 .75 0 0 1 1.5 0v3.75a.75 .75 0 0 1-1.5 0Zm.75 8.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 18Z\"]},{\"id\":\"ph-warning-circle\",\"label\":\"Alert\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm-.75 5.25a.75 .75 0 0 1 1.5 0v5.25a.75 .75 0 0 1-1.5 0Zm.75 9.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 17.25Z\"]},{\"id\":\"ph-info\",\"label\":\"Info\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm-.37 4.5a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 11.63 6.75Zm1.13 10.5a1.5 1.5 0 0 1-1.5-1.5V12a.75 .75 0 0 1 0-1.5 1.5 1.5 0 0 1 1.5 1.5v3.75a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-question\",\"label\":\"Question\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 15.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 18Zm.75-4.57V13.5a.75 .75 0 0 1-1.5 0v-.75a.75 .75 0 0 1 .75-.75c1.24 0 2.25-.84 2.25-1.87s-1.01-1.87-2.25-1.87-2.25 .84-2.25 1.88v.38a.75 .75 0 0 1-1.5 0v-.37c0-1.86 1.68-3.37 3.75-3.37s3.75 1.51 3.75 3.38C15.75 11.75 14.46 13.12 12.75 13.43Z\"]},{\"id\":\"ph-prohibit\",\"label\":\"Ban\",\"set\":\"solid\",\"paths\":[\"M18.75 12a6.72 6.72 0 0 1-1.48 4.21L7.79 6.73A6.75 6.75 0 0 1 18.75 12ZM5.25 12a6.75 6.75 0 0 0 10.96 5.27L6.73 7.79A6.72 6.72 0 0 0 5.25 12Zm16.88 0A10.13 10.13 0 1 1 12 1.88 10.14 10.14 0 0 1 22.13 12Zm-1.87 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12Z\"]},{\"id\":\"ph-heart\",\"label\":\"Heart\",\"set\":\"solid\",\"paths\":[\"M22.5 9.56c0 6.56-9.73 11.87-10.14 12.09a.75 .75 0 0 1-.71 0C11.23 21.44 1.5 16.13 1.5 9.56A5.82 5.82 0 0 1 7.31 3.75c1.94 0 3.63 .83 4.69 2.24C13.06 4.58 14.75 3.75 16.69 3.75A5.82 5.82 0 0 1 22.5 9.56Z\"]},{\"id\":\"ph-heart-straight\",\"label\":\"Heart straight\",\"set\":\"solid\",\"paths\":[\"M22.5 9.19a5.4 5.4 0 0 1-1.59 3.84L12.53 21.53a.75 .75 0 0 1-1.07 0L3.09 13.03a5.44 5.44 0 0 1 7.69-7.7L12 6.47l1.23-1.14A5.44 5.44 0 0 1 22.5 9.19Z\"]},{\"id\":\"ph-star\",\"label\":\"Star\",\"set\":\"solid\",\"paths\":[\"M21.96 10.77l-4.22 3.64L19.03 19.85a1.54 1.54 0 0 1-2.3 1.67L12 18.61 7.26 21.52A1.54 1.54 0 0 1 4.97 19.85l1.29-5.44-4.22-3.64A1.54 1.54 0 0 1 2.91 8.06l5.53-.45 2.13-5.16a1.53 1.53 0 0 1 2.84 0l2.13 5.16 5.53 .45a1.54 1.54 0 0 1 .88 2.71Z\"]},{\"id\":\"ph-star-four\",\"label\":\"Twinkle\",\"set\":\"solid\",\"paths\":[\"M22.5 12a1.48 1.48 0 0 1-.98 1.41l-5.95 2.16L13.41 21.52a1.5 1.5 0 0 1-2.81 0L8.43 15.57 2.48 13.41a1.5 1.5 0 0 1 0-2.81L8.43 8.43 10.59 2.48a1.5 1.5 0 0 1 2.81 0l2.16 5.95L21.52 10.59A1.48 1.48 0 0 1 22.5 12Z\"]},{\"id\":\"ph-sparkle\",\"label\":\"Sparkle\",\"set\":\"solid\",\"paths\":[\"M19.5 13.5a1.48 1.48 0 0 1-.98 1.4L13.69 16.69l-1.78 4.84a1.49 1.49 0 0 1-2.8 0L7.31 16.69l-4.84-1.78a1.49 1.49 0 0 1 0-2.8L7.31 10.31l1.78-4.84a1.49 1.49 0 0 1 2.8 0L13.69 10.31l4.84 1.78A1.48 1.48 0 0 1 19.5 13.5ZM14.25 4.5h1.5V6a.75 .75 0 0 0 1.5 0V4.5h1.5a.75 .75 0 0 0 0-1.5H17.25V1.5a.75 .75 0 0 0-1.5 0V3H14.25a.75 .75 0 0 0 0 1.5Zm8.25 3h-.75V6.75a.75 .75 0 0 0-1.5 0v.75h-.75a.75 .75 0 0 0 0 1.5h.75v.75a.75 .75 0 0 0 1.5 0V9h.75a.75 .75 0 0 0 0-1.5Z\"]},{\"id\":\"ph-fire\",\"label\":\"Fire\",\"set\":\"solid\",\"paths\":[\"M13.44 1.67a.75 .75 0 0 0-1.18 .32l-2.06 5.66L7.93 5.46a.75 .75 0 0 0-1.12 .08C4.78 8.21 3.75 10.88 3.75 13.5a8.25 8.25 0 0 0 16.5 0C20.25 7.93 15.49 3.38 13.44 1.67Zm3.8 12.7a5.4 5.4 0 0 1-4.36 4.36A.72 .72 0 0 1 12.75 18.75a.75 .75 0 0 1-.12-1.49c1.55-.26 2.87-1.58 3.14-3.14a.75 .75 0 0 1 1.48 .25Z\"]},{\"id\":\"ph-lightning\",\"label\":\"Bolt\",\"set\":\"solid\",\"paths\":[\"M20.05 11.76l-10.5 11.25a.75 .75 0 0 1-1.28-.66l1.37-6.87L4.24 13.45a.75 .75 0 0 1-.28-1.22l10.5-11.25a.75 .75 0 0 1 1.28 .66L14.36 8.52l5.4 2.03a.75 .75 0 0 1 .28 1.21Z\"]},{\"id\":\"ph-crown\",\"label\":\"Crown\",\"set\":\"solid\",\"paths\":[\"M23.25 7.5a2.63 2.63 0 1 0-4.79 1.48l-2.51 3.09L13.69 6.88a2.63 2.63 0 1 0-3.38 0L8.05 12.07l-2.51-3.09a2.63 2.63 0 1 0-2.49 1.13L4.41 18.25A1.5 1.5 0 0 0 5.89 19.5H18.11A1.5 1.5 0 0 0 19.59 18.25l1.36-8.14A2.63 2.63 0 0 0 23.25 7.5ZM12 3.75a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 12 3.75ZM2.25 7.5A1.13 1.13 0 1 1 3.38 8.63 1.13 1.13 0 0 1 2.25 7.5ZM20.63 8.63a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 20.63 8.63Z\"]},{\"id\":\"ph-crown-simple\",\"label\":\"Crown simple\",\"set\":\"solid\",\"paths\":[\"M22.48 8.51c0 .01 0 .02-.01 .03L20.34 18.28a1.5 1.5 0 0 1-1.47 1.22H5.13A1.5 1.5 0 0 1 3.66 18.28L1.53 8.54c0-.01 0-.02-.01-.03A1.5 1.5 0 0 1 4.13 7.26l3.16 3.4 3.36-7.53a.09 .09 0 0 0 0-.01 1.5 1.5 0 0 1 2.72 0 .09 .09 0 0 0 0 .01l3.36 7.53L19.88 7.26a1.5 1.5 0 0 1 2.6 1.26Z\"]},{\"id\":\"ph-trophy\",\"label\":\"Trophy\",\"set\":\"solid\",\"paths\":[\"M21.75 6H19.5V4.5a.75 .75 0 0 0-.75-.75H5.25a.75 .75 0 0 0-.75 .75V6H2.25A1.5 1.5 0 0 0 .75 7.5V9a3.75 3.75 0 0 0 3.75 3.75h.34A7.51 7.51 0 0 0 11.25 17.96V20.25H9a.75 .75 0 0 0 0 1.5h6a.75 .75 0 0 0 0-1.5H12.75V17.96c2.99-.3 5.48-2.4 6.38-5.21H19.5a3.75 3.75 0 0 0 3.75-3.75V7.5A1.5 1.5 0 0 0 21.75 6ZM4.5 11.25A2.25 2.25 0 0 1 2.25 9V7.5H4.5v3q0 .38 .04 .75ZM21.75 9a2.25 2.25 0 0 1-2.25 2.25h-.05a7.67 7.67 0 0 0 .05-.83V7.5h2.25Z\"]},{\"id\":\"ph-medal\",\"label\":\"Medal\",\"set\":\"solid\",\"paths\":[\"M20.25 9A8.25 8.25 0 1 0 6.75 15.36V22.5a.75 .75 0 0 0 1.09 .67L12 21.09l4.17 2.08A.76 .76 0 0 0 16.5 23.25a.75 .75 0 0 0 .75-.75V15.36A8.24 8.24 0 0 0 20.25 9ZM5.25 9a6.75 6.75 0 1 1 6.75 6.75A6.76 6.76 0 0 1 5.25 9Zm1.5 0a5.25 5.25 0 1 1 5.25 5.25A5.26 5.26 0 0 1 6.75 9Z\"]},{\"id\":\"ph-medal-military\",\"label\":\"Military medal\",\"set\":\"solid\",\"paths\":[\"M19.41 3.75H4.59A1.59 1.59 0 0 0 3 5.34v4.61a1.59 1.59 0 0 0 .94 1.45l5.87 2.67a4.5 4.5 0 1 0 4.4 0L20.06 11.41a1.59 1.59 0 0 0 .94-1.45V5.34A1.59 1.59 0 0 0 19.41 3.75ZM9 5.25h6v6.81l-3 1.36L9 12.06Zm3 15.75a3 3 0 1 1 3-3A3 3 0 0 1 12 21Z\"]},{\"id\":\"ph-diamond\",\"label\":\"Diamond\",\"set\":\"solid\",\"paths\":[\"M22.5 12a1.49 1.49 0 0 1-.44 1.06l-9 9.01a1.5 1.5 0 0 1-2.11 0h0l-9-9.01a1.5 1.5 0 0 1 0-2.11l9-9.01a1.5 1.5 0 0 1 2.11 0l9 9.01A1.49 1.49 0 0 1 22.5 12Z\"]},{\"id\":\"ph-diamonds-four\",\"label\":\"Diamonds\",\"set\":\"solid\",\"paths\":[\"M7.72 6.53a.75 .75 0 0 1 0-1.06l3.75-3.75a.75 .75 0 0 1 1.06 0l3.75 3.75a.75 .75 0 0 1 0 1.06l-3.75 3.75a.75 .75 0 0 1-1.06 0Zm4.81 7.19a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75a.75 .75 0 0 0 0-1.06Zm9.75-2.25-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75A.75 .75 0 0 0 22.28 11.47Zm-12 0-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75A.75 .75 0 0 0 10.28 11.47Z\"]},{\"id\":\"ph-gift\",\"label\":\"Gift\",\"set\":\"solid\",\"paths\":[\"M20.25 6.75H16.96c.04-.03 .07-.06 .11-.09A2.77 2.77 0 0 0 18 4.65 3.06 3.06 0 0 0 14.85 1.5 2.77 2.77 0 0 0 12.84 2.43a5.15 5.15 0 0 0-.84 1.36 5.15 5.15 0 0 0-.84-1.36A2.77 2.77 0 0 0 9.15 1.5 3.06 3.06 0 0 0 6 4.65 2.77 2.77 0 0 0 6.93 6.66c.04 .03 .07 .06 .11 .09H3.75A1.5 1.5 0 0 0 2.25 8.25v3a1.5 1.5 0 0 0 1.5 1.5v6a1.5 1.5 0 0 0 1.5 1.5h5.63a.38 .38 0 0 0 .38-.37V11.25H3.75V8.25h7.5v3h1.5V8.25h7.5v3H12.75v8.63a.38 .38 0 0 0 .38 .38h5.63a1.5 1.5 0 0 0 1.5-1.5V12.75a1.5 1.5 0 0 0 1.5-1.5V8.25A1.5 1.5 0 0 0 20.25 6.75ZM7.92 5.53a1.28 1.28 0 0 1-.42-.94A1.56 1.56 0 0 1 9.06 3h.05a1.28 1.28 0 0 1 .94 .42c.79 .89 1.06 2.36 1.16 3.27C10.29 6.6 8.81 6.32 7.92 5.53Zm8.16 0c-.89 .79-2.37 1.07-3.28 1.16C12.91 5.71 13.22 4.27 13.97 3.42a1.28 1.28 0 0 1 .94-.42h.05A1.56 1.56 0 0 1 16.5 4.6 1.28 1.28 0 0 1 16.08 5.53Z\"]},{\"id\":\"ph-confetti\",\"label\":\"Party\",\"set\":\"solid\",\"paths\":[\"M10.45 4.93a1.48 1.48 0 0 0-2.44 .54L3.09 19.01A1.48 1.48 0 0 0 4.48 21a1.5 1.5 0 0 0 .51-.09l13.53-4.92a1.48 1.48 0 0 0 .54-2.44ZM6.11 15.11l1.8-4.95 5.94 5.94-4.95 1.8ZM15 6.75a3.54 3.54 0 0 1 .36-1.46C15.86 4.3 16.79 3.75 18 3.75c.63 0 1.03-.21 1.28-.68A2.06 2.06 0 0 0 19.5 2.24 .75 .75 0 0 1 21 2.25c0 1.21-.8 3-3 3-.63 0-1.03 .21-1.28 .68A2.06 2.06 0 0 0 16.5 6.76 .75 .75 0 0 1 15 6.75ZM12.75 3.75V1.5a.75 .75 0 0 1 1.5 0V3.75a.75 .75 0 0 1-1.5 0Zm9.53 7.72a.75 .75 0 1 1-1.06 1.06l-1.5-1.5a.75 .75 0 0 1 1.06-1.06Zm.46-4.01-2.25 .75a.75 .75 0 0 1-.47-1.42l2.25-.75a.75 .75 0 0 1 .47 1.42Z\"]},{\"id\":\"ph-smiley\",\"label\":\"Smile\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25ZM8.63 9a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 8.63 9Zm7.77 5.63c-.96 1.67-2.57 2.63-4.4 2.63s-3.43-.96-4.4-2.62a.75 .75 0 1 1 1.3-.75c.7 1.21 1.8 1.88 3.1 1.88s2.4-.67 3.1-1.87a.75 .75 0 1 1 1.3 .75ZM15.38 11.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.38 11.25Z\"]},{\"id\":\"ph-smiley-wink\",\"label\":\"Wink\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25ZM8.63 9a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 8.63 9Zm7.77 5.63c-.96 1.67-2.57 2.63-4.4 2.63s-3.43-.96-4.4-2.62a.75 .75 0 1 1 1.3-.75c.7 1.21 1.8 1.88 3.1 1.88s2.4-.67 3.1-1.87a.75 .75 0 1 1 1.3 .75ZM17.25 10.88H14.25a.75 .75 0 0 1 0-1.5h3a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-smiley-sad\",\"label\":\"Sad\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25ZM8.63 9a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 8.63 9Zm7.5 8.15A.75 .75 0 0 1 15.1 16.88c-.7-1.21-1.8-1.87-3.1-1.87s-2.4 .67-3.1 1.88a.75 .75 0 1 1-1.3-.75c.96-1.67 2.57-2.62 4.4-2.62s3.43 .96 4.4 2.63A.75 .75 0 0 1 16.13 17.15ZM15.38 11.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.38 11.25Z\"]},{\"id\":\"ph-smiley-angry\",\"label\":\"Angry\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25ZM7.5 13.13a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 7.5 13.13Zm7.37 4.54a.75 .75 0 0 1-1.04 .21C13.23 17.47 12.75 17.25 12 17.25s-1.23 .22-1.83 .62a.75 .75 0 0 1-.83-1.25C10.13 16.1 10.88 15.75 12 15.75s1.88 .35 2.67 .88A.75 .75 0 0 1 14.87 17.67ZM15.38 14.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.38 14.25Zm1.54-5.38-4.5 3a.75 .75 0 0 1-.83 0l-4.5-3a.75 .75 0 1 1 .83-1.25L12 10.35l4.08-2.72a.75 .75 0 0 1 .83 1.25Z\"]},{\"id\":\"ph-smiley-x-eyes\",\"label\":\"Dizzy\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm-1.72 9.22a.75 .75 0 0 1-1.06 1.06L8.25 11.56 7.28 12.53a.75 .75 0 0 1-1.06-1.06L7.19 10.5 6.22 9.53A.75 .75 0 0 1 7.28 8.47L8.25 9.44 9.22 8.47a.75 .75 0 0 1 1.06 1.06L9.31 10.5ZM12 18a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 18Zm5.78-6.53a.75 .75 0 0 1-1.06 1.06L15.75 11.56l-.97 .97a.75 .75 0 0 1-1.06-1.06L14.69 10.5l-.97-.97a.75 .75 0 0 1 1.06-1.06L15.75 9.44l.97-.97a.75 .75 0 0 1 1.06 1.06L16.81 10.5Z\"]},{\"id\":\"ph-skull\",\"label\":\"Skull\",\"set\":\"solid\",\"paths\":[\"M12 1.5C6.62 1.5 2.25 5.71 2.25 10.88c0 3.2 1.71 6.19 4.5 7.9V20.25a1.5 1.5 0 0 0 1.5 1.5h.75a.38 .38 0 0 0 .38-.37V18.78a.77 .77 0 0 1 .7-.77 .75 .75 0 0 1 .8 .75v2.63a.38 .38 0 0 0 .38 .38h1.5a.38 .38 0 0 0 .38-.37V18.78a.77 .77 0 0 1 .7-.77 .75 .75 0 0 1 .8 .75v2.63a.38 .38 0 0 0 .38 .38h.75a1.5 1.5 0 0 0 1.5-1.5V18.78C20.04 17.06 21.75 14.07 21.75 10.88 21.75 5.71 17.38 1.5 12 1.5ZM8.63 14.25a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 8.63 14.25Zm6.75 0a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 15.38 14.25Z\"]},{\"id\":\"ph-ghost\",\"label\":\"Ghost\",\"set\":\"solid\",\"paths\":[\"M12 2.25a9.01 9.01 0 0 0-9 9v9a.75 .75 0 0 0 1.23 .58l2.27-1.86L8.77 20.83a.75 .75 0 0 0 .95 0L12 18.97l2.28 1.86a.75 .75 0 0 0 .95 0l2.28-1.86 2.27 1.86A.75 .75 0 0 0 21 20.25V11.25A9.01 9.01 0 0 0 12 2.25ZM9.38 12a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 9.38 12Zm5.25 0a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 14.63 12Z\"]},{\"id\":\"ph-hand-waving\",\"label\":\"Wave\",\"set\":\"solid\",\"paths\":[\"M20.56 9.23A8.25 8.25 0 1 1 6.29 17.51h0L2.45 10.86a1.5 1.5 0 0 1 2.6-1.5L6.79 12.38a.75 .75 0 0 0 1.3-.75L4.41 5.25A1.5 1.5 0 0 1 7 3.75L10.69 10.13a.75 .75 0 1 0 1.3-.75l-2.81-4.87a1.5 1.5 0 0 1 2.6-1.5L15.56 9.57A4.52 4.52 0 0 0 14.25 12.75a4.46 4.46 0 0 0 .9 2.7 .75 .75 0 1 0 1.2-.9A3 3 0 0 1 16.97 10.34a.75 .75 0 0 0 .2-.98L16.1 7.5a1.5 1.5 0 0 1 2.6-1.5l1.86 3.23Zm-2.75-5.34A4.1 4.1 0 0 1 20.32 5.81l.03 .05a.75 .75 0 0 0 1.3-.75L21.62 5.06a5.59 5.59 0 0 0-3.43-2.62 .75 .75 0 0 0-.39 1.45ZM7.46 21.16A9.71 9.71 0 0 1 5.06 18.38a.75 .75 0 0 0-1.3 .75 11.21 11.21 0 0 0 2.78 3.21 .75 .75 0 0 0 .93-1.18Z\"]},{\"id\":\"ph-hand-heart\",\"label\":\"Hand heart\",\"set\":\"solid\",\"paths\":[\"M21.59 13.22a2.28 2.28 0 0 0-1.74-.45C21.61 11 22.5 9.23 22.5 7.5c0-2.48-2-4.5-4.45-4.5A4.46 4.46 0 0 0 14.63 4.57 4.46 4.46 0 0 0 11.2 3C8.75 3 6.75 5.02 6.75 7.5c0 1.03 .3 2.03 .94 3.09a2.99 2.99 0 0 0-1.38 .79L4.19 13.5H1.5A1.5 1.5 0 0 0 0 15v3.75a1.5 1.5 0 0 0 1.5 1.5H11.25a.74 .74 0 0 0 .18-.02l6-1.5a.65 .65 0 0 0 .11-.04L21.19 17.14l.04-.02a2.31 2.31 0 0 0 .37-3.9Zm-1.02 2.55-3.56 1.52L11.16 18.75H5.25V14.56l2.12-2.12A1.49 1.49 0 0 1 8.43 12H13.13a1.13 1.13 0 0 1 0 2.25H10.5a.75 .75 0 0 0 0 1.5h3a.78 .78 0 0 0 .17-.02l6.28-1.44 .03-.01a.81 .81 0 0 1 .59 1.49Z\"]},{\"id\":\"ph-handshake\",\"label\":\"Handshake\",\"set\":\"solid\",\"paths\":[\"M23.84 10.12 21.45 5.33a1.5 1.5 0 0 0-2.01-.67L17.1 5.82 12.19 4.53a.76 .76 0 0 0-.38 0L6.9 5.82 4.56 4.66a1.5 1.5 0 0 0-2.01 .67L.16 10.12a1.5 1.5 0 0 0 .67 2.01l2.53 1.27 5.2 3.72a.76 .76 0 0 0 .25 .12l6 1.5a.75 .75 0 0 0 .71-.2l3.75-3.75 1.41-1.41 2.48-1.24a1.5 1.5 0 0 0 .67-2.01Zm-5.15 3.13L15.47 10.66a.75 .75 0 0 0-1 .06C12.8 12.4 10.94 12.19 9.75 11.44L13.8 7.5h2.98l2.55 5.1Zm-3.93 3.92L9.32 15.81l-4.61-3.29 2.63-5.25L12 6.03l.92 .24-4.22 4.1-.01 .01a1.5 1.5 0 0 0 .26 2.33c1.93 1.23 4.25 1.03 6.09-.47L17.63 14.31Zm-2.41 3.26a.75 .75 0 0 1-.73 .57 .76 .76 0 0 1-.18-.02L7.54 20a.74 .74 0 0 1-.25-.12L4.81 18.12a.75 .75 0 0 1 .87-1.22l2.35 1.68L11.81 19.52A.75 .75 0 0 1 12.36 20.43Z\"]},{\"id\":\"ph-hands-clapping\",\"label\":\"Clap\",\"set\":\"solid\",\"paths\":[\"M17.71 6.09A1.69 1.69 0 0 0 14.78 7.78L12.5 3.84a1.69 1.69 0 0 0-2.93 1.69L9.04 4.59A1.69 1.69 0 0 0 6.11 6.28l.31 .54A2.44 2.44 0 0 0 3.73 10.41l.28 .49A2.44 2.44 0 0 0 2.2 14.53l3.31 5.72a7.51 7.51 0 0 0 14.02-3.71A6.74 6.74 0 0 0 19.69 9.52Zm.11 11.96A6.01 6.01 0 0 1 6.81 19.5L3.5 13.78a.94 .94 0 0 1 1.63-.94L7.03 16.13a.75 .75 0 0 0 1.3-.75L5.03 9.66A.94 .94 0 0 1 6.66 8.72l2.98 5.16a.75 .75 0 0 0 1.3-.75l-2.44-4.22a.94 .94 0 0 1 1.63-.94l3.42 5.91a.75 .75 0 0 0 1.3-.75l-1.18-2.04A.94 .94 0 0 1 15.32 10.22l1.9 3.28A5.96 5.96 0 0 1 17.82 18.05ZM15.02 2.25V.75a.75 .75 0 0 1 1.5 0V2.25a.75 .75 0 0 1-1.5 0Zm3.11 .56 .75-1.23a.75 .75 0 0 1 1.28 .78l-.75 1.23a.75 .75 0 0 1-.64 .36A.75 .75 0 0 1 18.13 2.81Zm4.22 3.16-1.41 .45a.76 .76 0 0 1-.23 .04 .75 .75 0 0 1-.23-1.46l1.41-.45a.75 .75 0 1 1 .46 1.43Z\"]},{\"id\":\"ph-hand-pointing\",\"label\":\"Point\",\"set\":\"solid\",\"paths\":[\"M21 9.75v4.77c0 4.33-3.45 7.93-7.78 7.97A7.85 7.85 0 0 1 7.56 20.19C5.51 18.03 3.2 12.75 3.2 12.75a1.5 1.5 0 0 1 .61-2.08c.72-.37 1.6-.08 2.01 .62l1.97 3.42a.57 .57 0 0 0 .56 .29l.01 0A.77 .77 0 0 0 9 14.23V3a1.5 1.5 0 0 1 1.57-1.5c.81 .04 1.43 .73 1.43 1.54V9.75a.75 .75 0 0 0 .8 .75 .77 .77 0 0 0 .7-.77V8.25a1.5 1.5 0 0 1 1.57-1.5c.81 .04 1.43 .73 1.43 1.54V10.5a.75 .75 0 0 0 .8 .75 .77 .77 0 0 0 .7-.77v-.68c0-.81 .62-1.5 1.43-1.54A1.5 1.5 0 0 1 21 9.75Z\"]},{\"id\":\"ph-user\",\"label\":\"User\",\"set\":\"solid\",\"paths\":[\"M21.65 20.63a.75 .75 0 0 1-.65 .38H3a.75 .75 0 0 1-.65-1.12c1.43-2.47 3.63-4.24 6.2-5.08a6.75 6.75 0 1 1 6.91 0c2.57 .84 4.77 2.61 6.2 5.08A.75 .75 0 0 1 21.65 20.63Z\"]},{\"id\":\"ph-users\",\"label\":\"Users\",\"set\":\"solid\",\"paths\":[\"M15.42 18.34a.75 .75 0 0 1-.63 1.16H.96a.75 .75 0 0 1-.63-1.16 8.98 8.98 0 0 1 4.43-3.54 5.63 5.63 0 1 1 6.23 0A8.98 8.98 0 0 1 15.42 18.34Zm8.24-.01a8.99 8.99 0 0 0-4.42-3.52A5.63 5.63 0 0 0 13.57 5.12a.38 .38 0 0 0-.12 .56A7.11 7.11 0 0 1 13.78 14.11a.38 .38 0 0 0 .1 .52 10.53 10.53 0 0 1 2.8 2.89 2.24 2.24 0 0 1 .34 1.54 .38 .38 0 0 0 .37 .43h5.65a.75 .75 0 0 0 .72-.56A.77 .77 0 0 0 23.66 18.33Z\"]},{\"id\":\"ph-user-plus\",\"label\":\"Add user\",\"set\":\"solid\",\"paths\":[\"M24 12.75a.75 .75 0 0 1-.75 .75H21.75v1.5a.75 .75 0 0 1-1.5 0V13.5H18.75a.75 .75 0 0 1 0-1.5h1.5V10.5a.75 .75 0 0 1 1.5 0v1.5h1.5A.75 .75 0 0 1 24 12.75ZM13.5 14.78a6.38 6.38 0 1 0-6.74 0c-1.94 .63-3.68 1.82-5.08 3.48A.75 .75 0 0 0 2.25 19.5H18a.75 .75 0 0 0 .57-1.23C17.17 16.6 15.43 15.42 13.5 14.78Z\"]},{\"id\":\"ph-user-minus\",\"label\":\"Remove user\",\"set\":\"solid\",\"paths\":[\"M18.57 18.27A.75 .75 0 0 1 18 19.5H2.25a.75 .75 0 0 1-.57-1.23c1.4-1.67 3.14-2.85 5.08-3.48a6.38 6.38 0 1 1 6.74 0C15.43 15.42 17.17 16.6 18.57 18.27ZM23.25 12H18.75a.75 .75 0 0 0 0 1.5h4.5a.75 .75 0 0 0 0-1.5Z\"]},{\"id\":\"ph-user-check\",\"label\":\"Verified user\",\"set\":\"solid\",\"paths\":[\"M23.78 12.53l-3 3a.75 .75 0 0 1-1.06 0l-1.5-1.5a.75 .75 0 0 1 1.06-1.06L20.25 13.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06ZM13.5 14.78a6.38 6.38 0 1 0-6.74 0c-1.94 .63-3.68 1.82-5.08 3.48A.75 .75 0 0 0 2.25 19.5H18a.75 .75 0 0 0 .57-1.23C17.17 16.6 15.43 15.42 13.5 14.78Z\"]},{\"id\":\"ph-identification-badge\",\"label\":\"ID badge\",\"set\":\"solid\",\"paths\":[\"M18.75 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V3.75A1.5 1.5 0 0 0 18.75 2.25ZM9 4.5h6a.75 .75 0 0 1 0 1.5H9a.75 .75 0 0 1 0-1.5Zm7.95 14.1a.75 .75 0 0 1-1.05-.15 4.88 4.88 0 0 0-7.8 0 .75 .75 0 1 1-1.2-.9A6.36 6.36 0 0 1 9.47 15.52a3.75 3.75 0 1 1 5.06 0A6.36 6.36 0 0 1 17.1 17.55 .75 .75 0 0 1 16.95 18.6ZM14.25 12.75a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 14.25 12.75Z\"]},{\"id\":\"ph-megaphone\",\"label\":\"Announcement\",\"set\":\"solid\",\"paths\":[\"M18.75 6.75H15.02c-.27-.02-5.03-.35-9.55-4.15A1.5 1.5 0 0 0 3 3.75V18.75a1.5 1.5 0 0 0 2.46 1.15c3.54-2.97 7.22-3.82 8.79-4.06v2.97A1.5 1.5 0 0 0 14.92 20.06l1.03 .69A1.5 1.5 0 0 0 18.23 19.88l1.1-4.16A4.5 4.5 0 0 0 18.75 6.75ZM16.78 19.49l0 .01-1.03-.69V15.75h2.03ZM18.75 14.25H15.75V8.25h3a3 3 0 1 1 0 6Z\"]},{\"id\":\"ph-bell\",\"label\":\"Bell\",\"set\":\"solid\",\"paths\":[\"M20.79 16.49C20.27 15.6 19.5 13.06 19.5 9.75a7.5 7.5 0 1 0-15 0c0 3.31-.77 5.85-1.29 6.74A1.5 1.5 0 0 0 4.5 18.75H8.33a3.75 3.75 0 0 0 7.35 0H19.5a1.5 1.5 0 0 0 1.29-2.26ZM12 20.25a2.25 2.25 0 0 1-2.12-1.5h4.24A2.25 2.25 0 0 1 12 20.25Z\"]},{\"id\":\"ph-bell-ringing\",\"label\":\"Ping\",\"set\":\"solid\",\"paths\":[\"M21 6.67a.75 .75 0 0 1-1.01-.32 8.82 8.82 0 0 0-3.14-3.46 .75 .75 0 1 1 .8-1.27 10.45 10.45 0 0 1 3.67 4.04A.75 .75 0 0 1 21 6.67ZM3.35 6.75a.75 .75 0 0 0 .67-.4A8.82 8.82 0 0 1 7.15 2.88a.75 .75 0 1 0-.8-1.27A10.45 10.45 0 0 0 2.68 5.66 .75 .75 0 0 0 3.35 6.75Zm17.45 9.74A1.5 1.5 0 0 1 19.5 18.75H15.68a3.75 3.75 0 0 1-7.35 0H4.5a1.5 1.5 0 0 1-1.29-2.26C4.05 15.04 4.5 12.96 4.5 10.5a7.5 7.5 0 0 1 15 0C19.5 12.96 19.95 15.04 20.79 16.49ZM14.12 18.75H9.88a2.25 2.25 0 0 0 4.24 0Z\"]},{\"id\":\"ph-chat-circle\",\"label\":\"Message\",\"set\":\"solid\",\"paths\":[\"M21.75 12A9.75 9.75 0 0 1 7.42 20.61L4.23 21.67a1.5 1.5 0 0 1-1.9-1.9l1.06-3.19A9.75 9.75 0 1 1 21.75 12Z\"]},{\"id\":\"ph-chat-circle-dots\",\"label\":\"Typing\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 0 0 3.39 16.58L2.33 19.77a1.5 1.5 0 0 0 1.9 1.9l3.19-1.06A9.75 9.75 0 1 0 12 2.25ZM7.88 13.13a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.88 13.13Zm4.13 0a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 13.13Zm4.13 0a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.13 13.13Z\"]},{\"id\":\"ph-chats\",\"label\":\"Chat\",\"set\":\"solid\",\"paths\":[\"M21.75 9a1.5 1.5 0 0 0-1.5-1.5H17.25V4.5a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 4.5V16.5a.75 .75 0 0 0 1.22 .58L6.75 14.44V17.25a1.5 1.5 0 0 0 1.5 1.5h8.77L20.53 21.58a.75 .75 0 0 0 .47 .17 .75 .75 0 0 0 .75-.75Zm-3.99 8.42a.75 .75 0 0 0-.47-.17H8.25V14.25h7.5a1.5 1.5 0 0 0 1.5-1.5V9h3V19.43Z\"]},{\"id\":\"ph-envelope\",\"label\":\"Mail\",\"set\":\"solid\",\"paths\":[\"M21 4.5H3a.75 .75 0 0 0-.75 .75V18a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A.75 .75 0 0 0 21 4.5ZM9.25 12 3.75 17.04V6.96Zm1.11 1.02 1.13 1.04a.75 .75 0 0 0 1.01 0l1.13-1.04 5.44 4.98H4.93ZM14.75 12 20.25 6.95V17.05Z\"]},{\"id\":\"ph-paper-plane-tilt\",\"label\":\"Send\",\"set\":\"solid\",\"paths\":[\"M21.69 4.16s0 .01 0 .01l-5.46 17.99a1.49 1.49 0 0 1-1.31 1.08q-.06 .01-.13 .01a1.49 1.49 0 0 1-1.35-.86L10.03 15.39a.38 .38 0 0 1 .07-.43l5.43-5.43a.75 .75 0 0 0-1.06-1.06L9.04 13.9a.38 .38 0 0 1-.43 .07L1.6 10.56a1.5 1.5 0 0 1 .23-2.79l17.99-5.46 .01 0A1.5 1.5 0 0 1 21.69 4.16Z\"]},{\"id\":\"ph-at\",\"label\":\"Mention\",\"set\":\"solid\",\"paths\":[\"M21.75 12c0 .05 0 .09 0 .14-.03 1.34-.53 2.86-2.62 2.86-2.17 0-2.62-1.63-2.62-3V8.25a.75 .75 0 0 0-.8-.75A.77 .77 0 0 0 15 8.28v.38a4.5 4.5 0 1 0 .63 6 3.77 3.77 0 0 0 .32 .47C16.45 15.75 17.41 16.5 19.13 16.5a5.14 5.14 0 0 0 .86-.07 .38 .38 0 0 1 .38 .56A9.75 9.75 0 0 1 11.8 21.75C6.67 21.65 2.46 17.52 2.26 12.39A9.75 9.75 0 1 1 21.75 12ZM9 12a3 3 0 1 0 3-3A3 3 0 0 0 9 12Z\"]},{\"id\":\"ph-hash\",\"label\":\"Channel\",\"set\":\"solid\",\"paths\":[\"M10.9 10.5h2.95l-.75 3h-2.95ZM21 4.5V19.5a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 4.5 3H19.5A1.5 1.5 0 0 1 21 4.5Zm-1.5 5.25a.75 .75 0 0 0-.75-.75H15.77l.7-2.82a.75 .75 0 0 0-1.45-.36L14.23 9h-2.95l.7-2.82a.75 .75 0 0 0-1.45-.36L9.73 9H6a.75 .75 0 0 0 0 1.5H9.35l-.75 3H5.25a.75 .75 0 0 0 0 1.5H8.23l-.7 2.82a.75 .75 0 0 0 .55 .91 .76 .76 0 0 0 .19 .02 .75 .75 0 0 0 .73-.57L9.77 15h2.95l-.7 2.82a.75 .75 0 0 0 .55 .91A.76 .76 0 0 0 12.75 18.75a.75 .75 0 0 0 .73-.57L14.27 15H18a.75 .75 0 0 0 0-1.5H14.65l.75-3H18.75A.75 .75 0 0 0 19.5 9.75Z\"]},{\"id\":\"ph-microphone\",\"label\":\"Mic\",\"set\":\"solid\",\"paths\":[\"M7.5 12V6a4.5 4.5 0 0 1 9 0v6a4.5 4.5 0 0 1-9 0Zm12 0a.75 .75 0 0 0-1.5 0 6 6 0 0 1-12 0 .75 .75 0 0 0-1.5 0 7.51 7.51 0 0 0 6.75 7.46V22.5a.75 .75 0 0 0 1.5 0V19.46A7.51 7.51 0 0 0 19.5 12Z\"]},{\"id\":\"ph-headphones\",\"label\":\"Headphones\",\"set\":\"solid\",\"paths\":[\"M21.75 12v5.25a2.25 2.25 0 0 1-2.25 2.25H18a2.25 2.25 0 0 1-2.25-2.25V13.5a2.25 2.25 0 0 1 2.25-2.25h2.22a8.22 8.22 0 0 0-8.16-7.5H12a8.25 8.25 0 0 0-8.22 7.5H6a2.25 2.25 0 0 1 2.25 2.25v3.75a2.25 2.25 0 0 1-2.25 2.25H4.5a2.25 2.25 0 0 1-2.25-2.25V12A9.76 9.76 0 0 1 18.93 5.12 9.69 9.69 0 0 1 21.75 12Z\"]},{\"id\":\"ph-speaker-high\",\"label\":\"Volume\",\"set\":\"solid\",\"paths\":[\"M15 3.02V20.97a.78 .78 0 0 1-.37 .67 .75 .75 0 0 1-.84-.05l-6.15-4.78A.38 .38 0 0 1 7.5 16.52V7.49a.38 .38 0 0 1 .15-.3l6.15-4.78a.75 .75 0 0 1 .94 .02A.78 .78 0 0 1 15 3.02ZM5.63 7.5H3A1.5 1.5 0 0 0 1.5 9v6a1.5 1.5 0 0 0 1.5 1.5H5.63a.38 .38 0 0 0 .38-.37V7.88A.38 .38 0 0 0 5.63 7.5Zm11.88 1.95a.75 .75 0 0 0-.07 1.06 2.25 2.25 0 0 1 0 2.97 .75 .75 0 1 0 1.13 .99 3.75 3.75 0 0 0 0-4.96A.75 .75 0 0 0 17.51 9.45Zm3.83-2.45a.75 .75 0 1 0-1.12 1 6 6 0 0 1 0 8 .75 .75 0 1 0 1.12 1 7.5 7.5 0 0 0 0-10Z\"]},{\"id\":\"ph-calendar\",\"label\":\"Calendar\",\"set\":\"solid\",\"paths\":[\"M19.5 3H17.25V2.25a.75 .75 0 0 0-1.5 0v.75H8.25V2.25a.75 .75 0 0 0-1.5 0v.75H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM10.5 17.25a.75 .75 0 0 1-1.5 0V12.46l-.41 .21a.75 .75 0 0 1-.67-1.34l1.5-.75A.75 .75 0 0 1 10.5 11.25Zm5.25-.75a.75 .75 0 0 1 0 1.5H12.75a.75 .75 0 0 1-.6-1.2l2.7-3.6A.75 .75 0 1 0 13.6 12.38a.75 .75 0 1 1-1.3-.75A2.25 2.25 0 0 1 16.5 12.75a2.23 2.23 0 0 1-.45 1.35L14.25 16.5ZM4.5 7.5V4.5H6.75v.75a.75 .75 0 0 0 1.5 0V4.5h7.5v.75a.75 .75 0 0 0 1.5 0V4.5h2.25V7.5Z\"]},{\"id\":\"ph-calendar-check\",\"label\":\"Event\",\"set\":\"solid\",\"paths\":[\"M19.5 3H17.25V2.25a.75 .75 0 0 0-1.5 0v.75H8.25V2.25a.75 .75 0 0 0-1.5 0v.75H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM15.91 12.53l-4.5 4.5a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.88 15.44l3.97-3.97a.75 .75 0 0 1 1.06 1.06ZM4.5 7.5V4.5H6.75v.75a.75 .75 0 0 0 1.5 0V4.5h7.5v.75a.75 .75 0 0 0 1.5 0V4.5h2.25V7.5Z\"]},{\"id\":\"ph-clock\",\"label\":\"Clock\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm5.25 10.5H12a.75 .75 0 0 1-.75-.75V6.75a.75 .75 0 0 1 1.5 0v4.5h4.5a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-timer\",\"label\":\"Timer\",\"set\":\"solid\",\"paths\":[\"M12 3.75a9 9 0 1 0 9 9A9.01 9.01 0 0 0 12 3.75Zm4.28 5.78-3.75 3.75a.75 .75 0 0 1-1.06-1.06l3.75-3.75a.75 .75 0 0 1 1.06 1.06ZM9 1.5a.75 .75 0 0 1 .75-.75h4.5a.75 .75 0 0 1 0 1.5H9.75A.75 .75 0 0 1 9 1.5Z\"]},{\"id\":\"ph-hourglass\",\"label\":\"Hourglass\",\"set\":\"solid\",\"paths\":[\"M18.75 7.09V3.75a1.5 1.5 0 0 0-1.5-1.5H6.75A1.5 1.5 0 0 0 5.25 3.75V7.13a1.51 1.51 0 0 0 .6 1.2L10.75 12 5.85 15.68A1.51 1.51 0 0 0 5.25 16.88v3.38a1.5 1.5 0 0 0 1.5 1.5H17.25a1.5 1.5 0 0 0 1.5-1.5V16.91a1.5 1.5 0 0 0-.6-1.2L13.24 12l4.91-3.71A1.5 1.5 0 0 0 18.75 7.09Z\"]},{\"id\":\"ph-push-pin\",\"label\":\"Pin\",\"set\":\"solid\",\"paths\":[\"M22.06 9.75l-5.01 5.03c.43 1.19 .6 3.18-1.24 5.63A1.49 1.49 0 0 1 14.72 21c-.04 0-.07 0-.11 0a1.5 1.5 0 0 1-1.06-.44L9.03 16.03 5.03 20.03a.75 .75 0 0 1-1.06-1.06L7.97 14.97l-4.53-4.53A1.5 1.5 0 0 1 3.56 8.22c2.38-1.92 4.66-1.54 5.66-1.23L14.25 1.94a1.5 1.5 0 0 1 2.12 0l5.69 5.69A1.5 1.5 0 0 1 22.06 9.75Z\"]},{\"id\":\"ph-bookmark-simple\",\"label\":\"Bookmark\",\"set\":\"solid\",\"paths\":[\"M17.25 3H6.75A1.5 1.5 0 0 0 5.25 4.5V21a.75 .75 0 0 0 1.15 .64L12 18.13l5.6 3.5A.75 .75 0 0 0 18.75 21V4.5A1.5 1.5 0 0 0 17.25 3Z\"]},{\"id\":\"ph-flag\",\"label\":\"Flag\",\"set\":\"solid\",\"paths\":[\"M21.75 5.25V16.5a.75 .75 0 0 1-.26 .56c-1.43 1.24-2.8 1.69-4.11 1.69-1.77 0-3.43-.82-4.97-1.58C9.93 15.94 7.76 14.87 5.25 16.85V21a.75 .75 0 0 1-1.5 0V5.25a.75 .75 0 0 1 .26-.56h0c3.38-2.92 6.4-1.43 9.07-.11C15.66 5.86 17.89 6.96 20.51 4.69A.75 .75 0 0 1 21.75 5.25Z\"]},{\"id\":\"ph-link\",\"label\":\"Link\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM10.85 18.05a4.06 4.06 0 0 1-5.16-6.23l2.38-2.38a4.06 4.06 0 0 1 5.74 0 4.02 4.02 0 0 1 .93 1.45 .75 .75 0 1 1-1.41 .52A2.56 2.56 0 0 0 9.13 10.5L6.75 12.88a2.56 2.56 0 0 0 3.25 3.93 .75 .75 0 1 1 .84 1.24Zm7.46-5.86-2.38 2.38A4.03 4.03 0 0 1 13.06 15.75h0a4.06 4.06 0 0 1-3.8-2.64 .75 .75 0 1 1 1.41-.52A2.56 2.56 0 0 0 13.06 14.25h0a2.54 2.54 0 0 0 1.81-.75L17.25 11.12a2.56 2.56 0 0 0-3.25-3.93 .75 .75 0 1 1-.84-1.24 4.06 4.06 0 0 1 5.16 6.23Z\"]},{\"id\":\"ph-paperclip\",\"label\":\"Attachment\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.53 4.72a.75 .75 0 0 0-1.06 0L8.16 13.41A2.25 2.25 0 1 0 11.34 16.59l4.62-4.72a.75 .75 0 1 1 1.07 1.05l-4.63 4.72a3.75 3.75 0 1 1-5.31-5.3L13.41 5.91A2.25 2.25 0 1 1 16.59 9.09L10.29 15.52a.75 .75 0 1 1-1.07-1.05L15.52 8.04a.75 .75 0 0 0 .01-1.07Z\"]},{\"id\":\"ph-image\",\"label\":\"Image\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM14.63 8.25a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 14.63 8.25Zm5.63 10.5H3.75V15.06l4.34-4.35a.75 .75 0 0 1 1.06 0h0L15.47 17.03a.75 .75 0 0 0 1.06-1.06l-1.66-1.65L16.22 12.97a.75 .75 0 0 1 1.06 0L20.25 15.94V18.75Z\"]},{\"id\":\"ph-camera\",\"label\":\"Camera\",\"set\":\"solid\",\"paths\":[\"M19.5 5.25H16.9L15.62 3.33A.75 .75 0 0 0 15 3H9a.75 .75 0 0 0-.62 .33L7.1 5.25H4.5A2.25 2.25 0 0 0 2.25 7.5V18a2.25 2.25 0 0 0 2.25 2.25H19.5a2.25 2.25 0 0 0 2.25-2.25V7.5A2.25 2.25 0 0 0 19.5 5.25Zm-4.12 7.13a3.38 3.38 0 1 1-3.37-3.37A3.38 3.38 0 0 1 15.38 12.38Z\"]},{\"id\":\"ph-video-camera\",\"label\":\"Video\",\"set\":\"solid\",\"paths\":[\"M18 6.75V17.25a1.5 1.5 0 0 1-1.5 1.5H3a1.5 1.5 0 0 1-1.5-1.5V6.75A1.5 1.5 0 0 1 3 5.25H16.5A1.5 1.5 0 0 1 18 6.75Zm5.44 .02a.77 .77 0 0 0-.62 .11L19.67 8.99A.38 .38 0 0 0 19.5 9.3v5.4a.38 .38 0 0 0 .17 .31l3.17 2.11a.75 .75 0 0 0 .8 .02 .78 .78 0 0 0 .36-.67V7.5A.75 .75 0 0 0 23.44 6.77Z\"]},{\"id\":\"ph-music-notes\",\"label\":\"Music\",\"set\":\"solid\",\"paths\":[\"M19.96 1.66a.74 .74 0 0 0-.64-.14l-12 3A.75 .75 0 0 0 6.75 5.25V15.57A3.38 3.38 0 1 0 8.25 18.38V9.59l10.5-2.62V12.57A3.38 3.38 0 1 0 20.25 15.38V2.25A.75 .75 0 0 0 19.96 1.66Z\"]},{\"id\":\"ph-book-open\",\"label\":\"Rules\",\"set\":\"solid\",\"paths\":[\"M22.5 5.25V18.75a.75 .75 0 0 1-.75 .75H15a2.25 2.25 0 0 0-2.25 2.24 .74 .74 0 0 1-.48 .71A.75 .75 0 0 1 11.25 21.75a2.25 2.25 0 0 0-2.25-2.25H2.25a.75 .75 0 0 1-.75-.75V5.25a.75 .75 0 0 1 .75-.75H8.25a3 3 0 0 1 3 3v8.22a.77 .77 0 0 0 .7 .77 .75 .75 0 0 0 .8-.75V7.5a3 3 0 0 1 3-3h6A.75 .75 0 0 1 22.5 5.25Z\"]},{\"id\":\"ph-scroll\",\"label\":\"Scroll\",\"set\":\"solid\",\"paths\":[\"M20.7 15.9A.75 .75 0 0 0 20.25 15.75h-.75V6a3 3 0 0 0-3-3H3.75A3 3 0 0 0 .75 6C.75 7.28 1.69 8.02 1.8 8.1h0A.74 .74 0 0 0 2.25 8.25a.75 .75 0 0 0 .46-1.34h0C2.7 6.9 2.25 6.54 2.25 6a1.5 1.5 0 0 1 3 0V18a3 3 0 0 0 3 3H18.75a3 3 0 0 0 3-3C21.75 16.72 20.81 15.98 20.7 15.9ZM9.75 9h6a.75 .75 0 0 1 0 1.5H9.75a.75 .75 0 0 1 0-1.5Zm-.75 3.75a.75 .75 0 0 1 .75-.75h6a.75 .75 0 0 1 0 1.5H9.75A.75 .75 0 0 1 9 12.75Zm9.75 6.75H10.1A2.98 2.98 0 0 0 10.5 18a2.52 2.52 0 0 0-.11-.75h9.56a1.18 1.18 0 0 1 .3 .75A1.5 1.5 0 0 1 18.75 19.5Z\"]},{\"id\":\"ph-file-text\",\"label\":\"Document\",\"set\":\"solid\",\"paths\":[\"M20.03 7.72l-5.25-5.25A.75 .75 0 0 0 14.25 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V8.25A.75 .75 0 0 0 20.03 7.72ZM15 16.5H9a.75 .75 0 0 1 0-1.5h6a.75 .75 0 0 1 0 1.5Zm0-3H9a.75 .75 0 0 1 0-1.5h6a.75 .75 0 0 1 0 1.5Zm-.75-5.25V4.13l4.13 4.13Z\"]},{\"id\":\"ph-clipboard-text\",\"label\":\"Clipboard\",\"set\":\"solid\",\"paths\":[\"M18.75 3H15.35a4.49 4.49 0 0 0-6.7 0H5.25A1.5 1.5 0 0 0 3.75 4.5V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 18.75 3Zm-6.75 0a3 3 0 0 1 3 3H9A3 3 0 0 1 12 3Zm3 12H9a.75 .75 0 0 1 0-1.5h6a.75 .75 0 0 1 0 1.5Zm0-3H9a.75 .75 0 0 1 0-1.5h6a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-newspaper\",\"label\":\"News\",\"set\":\"solid\",\"paths\":[\"M20.25 4.5H5.25A1.5 1.5 0 0 0 3.75 6V17.25a.75 .75 0 0 1-1.5 0V8.25A.75 .75 0 0 0 .75 8.25v9.01A2.25 2.25 0 0 0 3 19.5H19.5a2.25 2.25 0 0 0 2.25-2.25V6A1.5 1.5 0 0 0 20.25 4.5ZM16.5 14.25H9a.75 .75 0 0 1 0-1.5h7.5a.75 .75 0 0 1 0 1.5Zm0-3H9a.75 .75 0 0 1 0-1.5h7.5a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-lightbulb\",\"label\":\"Idea\",\"set\":\"solid\",\"paths\":[\"M16.5 21.75a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1 0-1.5h7.5A.75 .75 0 0 1 16.5 21.75Zm3.75-12a8.21 8.21 0 0 1-3.15 6.49A1.52 1.52 0 0 0 16.5 17.44v.56a1.5 1.5 0 0 1-1.5 1.5H9a1.5 1.5 0 0 1-1.5-1.5v-.56a1.5 1.5 0 0 0-.58-1.19A8.21 8.21 0 0 1 3.75 9.8C3.73 5.33 7.34 1.61 11.8 1.5A8.25 8.25 0 0 1 20.25 9.75Zm-3.01-.88a5.4 5.4 0 0 0-4.36-4.36 .75 .75 0 0 0-.25 1.48c1.55 .26 2.87 1.58 3.14 3.14A.75 .75 0 0 0 16.5 9.75a.84 .84 0 0 0 .13-.01A.75 .75 0 0 0 17.24 8.87Z\"]},{\"id\":\"ph-rocket\",\"label\":\"Rocket\",\"set\":\"solid\",\"paths\":[\"M14.25 21a.75 .75 0 0 1-.75 .75H10.5a.75 .75 0 0 1 0-1.5h3A.75 .75 0 0 1 14.25 21Zm6.71-6.39-1.16 5.22a1.5 1.5 0 0 1-2.39 .85L14.86 18.75h-5.72L6.59 20.68a1.5 1.5 0 0 1-2.39-.85L3.04 14.61a1.51 1.51 0 0 1 .31-1.29l2.68-3.21a11.54 11.54 0 0 1 .8-3.44c1.21-3.03 3.38-4.93 4.25-5.61a1.5 1.5 0 0 1 1.84 0c.88 .68 3.04 2.58 4.25 5.61a11.54 11.54 0 0 1 .8 3.44l2.68 3.21A1.51 1.51 0 0 1 20.96 14.61Zm-13.05 3.19Q6.4 15.05 6.08 12.39L4.5 14.28 5.66 19.5l.02-.01ZM13.13 9.38a1.13 1.13 0 1 0-1.12 1.13A1.13 1.13 0 0 0 13.13 9.38Zm6.38 4.91-1.58-1.89q-.32 2.65-1.83 5.41l2.24 1.69 .02 .01Z\"]},{\"id\":\"ph-rocket-launch\",\"label\":\"Launch\",\"set\":\"solid\",\"paths\":[\"M9.55 17.92C9.13 18.84 7.71 21 3.75 21a.75 .75 0 0 1-.75-.75c0-3.96 2.16-5.38 3.08-5.8a.75 .75 0 0 1 .62 1.37c-.6 .27-1.93 1.16-2.17 3.65 2.49-.23 3.38-1.56 3.65-2.17a.75 .75 0 1 1 1.37 .62Zm11.44-13.5a1.5 1.5 0 0 0-1.41-1.41c-1.18-.07-4.19 .04-6.69 2.54h0L8.25 10.19A.75 .75 0 0 1 7.19 9.13l2.49-2.49A.38 .38 0 0 0 9.41 6H6.97A1.49 1.49 0 0 0 5.91 6.44L2.69 9.66a1.5 1.5 0 0 0 .85 2.55l3.61 .5 4.14 4.14 .5 3.61a1.49 1.49 0 0 0 1.01 1.21 1.51 1.51 0 0 0 .48 .08A1.49 1.49 0 0 0 14.34 21.31L17.56 18.09A1.5 1.5 0 0 0 18 17.03V14.59a.38 .38 0 0 0-.64-.26l-2.49 2.49a.75 .75 0 0 1-1.1-.04 .77 .77 0 0 1 .06-1.04l4.62-4.62h0C20.95 8.61 21.06 5.6 20.99 4.42Z\"]},{\"id\":\"ph-globe\",\"label\":\"Globe\",\"set\":\"solid\",\"paths\":[\"M12 2.25h0A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm7.35 6H16a12.68 12.68 0 0 0-2.09-4.28A8.28 8.28 0 0 1 19.35 8.25ZM20.25 12a8.21 8.21 0 0 1-.31 2.25H16.33a14.76 14.76 0 0 0 0-4.5h3.61A8.21 8.21 0 0 1 20.25 12ZM12 4.03a10.81 10.81 0 0 1 2.44 4.22H9.56A10.79 10.79 0 0 1 12 4.03ZM9.56 15.75H14.44a10.79 10.79 0 0 1-2.44 4.22A10.81 10.81 0 0 1 9.56 15.75Zm-.37-1.5a13.2 13.2 0 0 1 0-4.5h5.61a13.2 13.2 0 0 1 0 4.5Zm4.72 5.78a12.68 12.68 0 0 0 2.09-4.28h3.34A8.28 8.28 0 0 1 13.91 20.02Z\"]},{\"id\":\"ph-map-pin\",\"label\":\"Location\",\"set\":\"solid\",\"paths\":[\"M12 1.5a8.26 8.26 0 0 0-8.25 8.25c0 7.06 7.5 12.39 7.82 12.61a.75 .75 0 0 0 .86 0C12.75 22.14 20.25 16.81 20.25 9.75A8.26 8.26 0 0 0 12 1.5Zm0 5.25a3 3 0 1 1-3 3A3 3 0 0 1 12 6.75Z\"]},{\"id\":\"ph-house\",\"label\":\"Home\",\"set\":\"solid\",\"paths\":[\"M21 11.25v9a.75 .75 0 0 1-.75 .75H15a.75 .75 0 0 1-.75-.75V15.38a.38 .38 0 0 0-.37-.37H10.13a.38 .38 0 0 0-.37 .38v4.88a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V11.25a1.5 1.5 0 0 1 .44-1.06l7.5-7.5a1.5 1.5 0 0 1 2.12 0l7.5 7.5A1.5 1.5 0 0 1 21 11.25Z\"]},{\"id\":\"ph-shield\",\"label\":\"Shield\",\"set\":\"solid\",\"paths\":[\"M21 5.25v5.25c0 4.94-2.39 7.94-4.4 9.58-2.16 1.77-4.31 2.37-4.41 2.39a.75 .75 0 0 1-.39 0c-.09-.02-2.24-.63-4.41-2.39C5.39 18.44 3 15.44 3 10.5V5.25A1.5 1.5 0 0 1 4.5 3.75H19.5A1.5 1.5 0 0 1 21 5.25Z\"]},{\"id\":\"ph-shield-check\",\"label\":\"Verified\",\"set\":\"solid\",\"paths\":[\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v5.25c0 4.94 2.39 7.94 4.4 9.58 2.16 1.77 4.31 2.37 4.41 2.39a.75 .75 0 0 0 .39 0c.09-.03 2.24-.63 4.41-2.39C18.61 18.44 21 15.44 21 10.5V5.25A1.5 1.5 0 0 0 19.5 3.75Zm-3.22 6.53-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-shield-warning\",\"label\":\"Security\",\"set\":\"solid\",\"paths\":[\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v5.25c0 4.94 2.39 7.94 4.4 9.58 2.16 1.77 4.31 2.37 4.41 2.39a.75 .75 0 0 0 .39 0c.09-.02 2.24-.63 4.41-2.39C18.61 18.44 21 15.44 21 10.5V5.25A1.5 1.5 0 0 0 19.5 3.75ZM11.25 9a.75 .75 0 0 1 1.5 0v3.75a.75 .75 0 0 1-1.5 0Zm.75 8.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 17.25Z\"]},{\"id\":\"ph-lock\",\"label\":\"Lock\",\"set\":\"solid\",\"paths\":[\"M19.5 7.5H16.5V5.25a4.5 4.5 0 0 0-9 0V7.5H4.5A1.5 1.5 0 0 0 3 9V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V9A1.5 1.5 0 0 0 19.5 7.5Zm-7.5 7.88a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 15.38Zm3-7.87H9V5.25a3 3 0 0 1 6 0Z\"]},{\"id\":\"ph-lock-open\",\"label\":\"Unlock\",\"set\":\"solid\",\"paths\":[\"M19.5 7.5H9V5.25a3 3 0 0 1 3-3c1.44 0 2.74 1.03 3.01 2.4a.75 .75 0 0 0 1.47-.3C16.06 2.26 14.18 .75 12 .75A4.5 4.5 0 0 0 7.5 5.25V7.5H4.5A1.5 1.5 0 0 0 3 9V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V9A1.5 1.5 0 0 0 19.5 7.5Zm-7.5 7.88a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 15.38Z\"]},{\"id\":\"ph-key\",\"label\":\"Key\",\"set\":\"solid\",\"paths\":[\"M20.3 3.7A7.5 7.5 0 0 0 7.87 11.32L2.69 16.5A1.49 1.49 0 0 0 2.25 17.56V20.25a1.5 1.5 0 0 0 1.5 1.5H6.75a.75 .75 0 0 0 .75-.75V19.5H9a.75 .75 0 0 0 .75-.75V17.25h1.5a.75 .75 0 0 0 .53-.22l.9-.9A7.47 7.47 0 0 0 15 16.5h.01A7.5 7.5 0 0 0 20.3 3.7ZM16.88 8.63a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 16.88 8.63Z\"]},{\"id\":\"ph-eye\",\"label\":\"Eye\",\"set\":\"solid\",\"paths\":[\"M23.19 11.7c-.03-.07-.83-1.84-2.59-3.6C18.24 5.74 15.27 4.5 12 4.5S5.76 5.74 3.41 8.1C1.64 9.86 .84 11.63 .81 11.7a.75 .75 0 0 0 0 .61c.03 .07 .83 1.83 2.59 3.6C5.76 18.26 8.73 19.5 12 19.5s6.24-1.24 8.59-3.59c1.77-1.77 2.56-3.53 2.59-3.6A.75 .75 0 0 0 23.19 11.7ZM12 15.75a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 12 15.75Z\"]},{\"id\":\"ph-eye-slash\",\"label\":\"Hidden\",\"set\":\"solid\",\"paths\":[\"M9.06 5.43a.38 .38 0 0 1 .2-.62A12.2 12.2 0 0 1 12 4.5c3.27 0 6.24 1.24 8.59 3.6 1.77 1.77 2.56 3.53 2.59 3.6a.75 .75 0 0 1 0 .61c-.03 .07-.83 1.83-2.59 3.6q-.4 .4-.82 .76a.38 .38 0 0 1-.52-.03ZM20.06 19.75a.75 .75 0 1 1-1.11 1.01L16.88 18.48A11.93 11.93 0 0 1 12 19.5c-3.27 0-6.24-1.24-8.59-3.59C1.64 14.14 .84 12.38 .81 12.31a.75 .75 0 0 1 0-.61C.84 11.63 1.64 9.86 3.41 8.1a12.66 12.66 0 0 1 2.34-1.85L3.95 4.25A.75 .75 0 1 1 5.06 3.25Zm-6.14-4.52-4.94-5.44a3.75 3.75 0 0 0 4.94 5.44Z\"]},{\"id\":\"ph-gavel\",\"label\":\"Gavel\",\"set\":\"solid\",\"paths\":[\"M4.94 9.31a1.5 1.5 0 0 1 0-2.12l6-6a1.5 1.5 0 0 1 2.12 2.12l-6 6a1.5 1.5 0 0 1-2.12 0Zm17.87 1.63a1.5 1.5 0 0 0-2.12 0l-6 6a1.5 1.5 0 0 0 0 2.12h0a1.5 1.5 0 0 0 2.12 0l6-6A1.5 1.5 0 0 0 22.81 10.94Zm-3.29-1.48L14.54 4.48a.38 .38 0 0 0-.53 0L8.23 10.26a.38 .38 0 0 0 0 .53L9.66 12.22 2.69 19.19a1.5 1.5 0 0 0 2.12 2.12L11.78 14.34l1.43 1.43a.38 .38 0 0 0 .53 0l5.78-5.78A.38 .38 0 0 0 19.52 9.46Z\"]},{\"id\":\"ph-scales\",\"label\":\"Scales\",\"set\":\"solid\",\"paths\":[\"M22.45 12.47l-3-7.5A.75 .75 0 0 0 18.75 4.5a.78 .78 0 0 0-.16 .02L12.75 5.81V3.75a.75 .75 0 0 0-1.5 0V6.15L5.09 7.52A.75 .75 0 0 0 4.55 7.97l-3 7.5a.74 .74 0 0 0-.05 .28c0 2.19 2.3 3 3.75 3s3.75-.81 3.75-3a.74 .74 0 0 0-.05-.28L6.27 8.79 11.25 7.69V19.5H9.75a.75 .75 0 0 0 0 1.5h4.5a.75 .75 0 0 0 0-1.5H12.75V7.35L17.53 6.29 15.05 12.47a.74 .74 0 0 0-.05 .28c0 2.19 2.3 3 3.75 3s3.75-.81 3.75-3A.74 .74 0 0 0 22.45 12.47Zm-15 3.28H3.06L5.25 10.27Zm9.12-3L18.75 7.27 20.94 12.75Z\"]},{\"id\":\"ph-siren\",\"label\":\"Siren\",\"set\":\"solid\",\"paths\":[\"M11.25 1.5V.75a.75 .75 0 0 1 1.5 0v.75a.75 .75 0 0 1-1.5 0Zm7.5 3a.75 .75 0 0 0 .53-.22l.75-.75a.75 .75 0 0 0-1.06-1.06l-.75 .75A.75 .75 0 0 0 18.75 4.5ZM4.72 4.28A.75 .75 0 0 0 5.78 3.22l-.75-.75A.75 .75 0 0 0 3.97 3.53ZM21.75 16.5v2.25a1.5 1.5 0 0 1-1.5 1.5H3.75a1.5 1.5 0 0 1-1.5-1.5V16.5a1.5 1.5 0 0 1 1.5-1.5V12a8.25 8.25 0 0 1 8.31-8.25c4.51 .03 8.19 3.78 8.19 8.34v2.91A1.5 1.5 0 0 1 21.75 16.5ZM12.63 8.24C14.41 8.54 15.75 10.15 15.75 12a.75 .75 0 0 0 1.5 0c0-2.57-1.88-4.82-4.38-5.24a.75 .75 0 1 0-.25 1.48ZM20.25 18.75V16.5H3.75v2.25H20.25Z\"]},{\"id\":\"ph-bug\",\"label\":\"Bug\",\"set\":\"solid\",\"paths\":[\"M15.75 8.63a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 15.75 8.63ZM9.38 7.5a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 9.38 7.5Zm10.88 6A8.23 8.23 0 0 1 19.97 15.66l2.09 .91A.75 .75 0 0 1 21.75 18a.74 .74 0 0 1-.3-.06L19.44 17.06a8.25 8.25 0 0 1-14.88 0L2.55 17.94A.74 .74 0 0 1 2.25 18a.75 .75 0 0 1-.3-1.44L4.03 15.66A8.23 8.23 0 0 1 3.75 13.5v-.75H1.5a.75 .75 0 0 1 0-1.5H3.75v-.75a8.23 8.23 0 0 1 .28-2.16L1.95 7.44a.75 .75 0 1 1 .6-1.37L4.56 6.94a8.25 8.25 0 0 1 14.88 0l2.01-.88a.75 .75 0 0 1 .6 1.37L19.97 8.35a8.23 8.23 0 0 1 .28 2.16v.75h2.25a.75 .75 0 0 1 0 1.5H20.25Zm-7.5 0a.75 .75 0 0 0-1.5 0v6a.75 .75 0 0 0 1.5 0Zm6-3a6.75 6.75 0 0 0-13.5 0v.75H18.75Z\"]},{\"id\":\"ph-robot\",\"label\":\"Bot\",\"set\":\"solid\",\"paths\":[\"M18.75 4.5H12.75V1.5a.75 .75 0 0 0-1.5 0V4.5H5.25A3 3 0 0 0 2.25 7.5V18a3 3 0 0 0 3 3H18.75a3 3 0 0 0 3-3V7.5A3 3 0 0 0 18.75 4.5ZM16.13 9a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 16.13 9ZM9 17.25H7.5a1.5 1.5 0 0 1 0-3H9ZM7.88 11.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.88 11.25Zm5.63 6H10.5V14.25h3Zm3 0H15V14.25h1.5a1.5 1.5 0 0 1 0 3Z\"]},{\"id\":\"ph-cpu\",\"label\":\"CPU\",\"set\":\"solid\",\"paths\":[\"M9.75 9.75h4.5v4.5H9.75Zm12.75 4.5a.75 .75 0 0 1-.75 .75H20.25v3.75a1.5 1.5 0 0 1-1.5 1.5H15v1.5a.75 .75 0 0 1-1.5 0V20.25H10.5v1.5a.75 .75 0 0 1-1.5 0V20.25H5.25a1.5 1.5 0 0 1-1.5-1.5V15H2.25a.75 .75 0 0 1 0-1.5H3.75V10.5H2.25a.75 .75 0 0 1 0-1.5H3.75V5.25A1.5 1.5 0 0 1 5.25 3.75H9V2.25a.75 .75 0 0 1 1.5 0V3.75h3V2.25a.75 .75 0 0 1 1.5 0V3.75h3.75a1.5 1.5 0 0 1 1.5 1.5V9h1.5a.75 .75 0 0 1 0 1.5H20.25v3h1.5A.75 .75 0 0 1 22.5 14.25ZM15.75 9a.75 .75 0 0 0-.75-.75H9a.75 .75 0 0 0-.75 .75v6a.75 .75 0 0 0 .75 .75h6a.75 .75 0 0 0 .75-.75Z\"]},{\"id\":\"ph-hard-drives\",\"label\":\"Server\",\"set\":\"solid\",\"paths\":[\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v4.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 19.5 3.75ZM16.88 8.63a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.88 8.63Z\",\"M19.5 12.75H4.5a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 19.5 12.75Zm-2.62 4.88a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.88 17.63Z\"]},{\"id\":\"ph-code\",\"label\":\"Code\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM8.7 13.65a.75 .75 0 1 1-.9 1.2l-3-2.25a.75 .75 0 0 1 0-1.2l3-2.25a.75 .75 0 0 1 .9 1.2L6.5 12Zm5.52-6.69-3 10.5a.75 .75 0 1 1-1.44-.41l3-10.5a.75 .75 0 0 1 1.44 .41Zm4.98 5.64-3 2.25a.75 .75 0 0 1-.9-1.2L17.5 12 15.3 10.35a.75 .75 0 1 1 .9-1.2l3 2.25a.75 .75 0 0 1 0 1.2Z\"]},{\"id\":\"ph-terminal-window\",\"label\":\"Terminal\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-8.53 8.84-3.75 3a.75 .75 0 1 1-.94-1.17L10.05 12 7.03 9.59a.75 .75 0 1 1 .94-1.17l3.75 3a.75 .75 0 0 1 0 1.17ZM16.5 15.75H12.75a.75 .75 0 0 1 0-1.5h3.75a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-wrench\",\"label\":\"Wrench\",\"set\":\"solid\",\"paths\":[\"M21.75 9a6.75 6.75 0 0 1-9.46 6.19L7.41 20.83c-.01 .01-.02 .03-.04 .04a3 3 0 0 1-4.24-4.24c.01-.01 .03-.03 .04-.04L8.81 11.71a6.76 6.76 0 0 1 7.83-9.26 .75 .75 0 0 1 .37 1.24L13.5 7.5l.53 2.47L16.5 10.5l3.81-3.52a.75 .75 0 0 1 1.24 .37A6.81 6.81 0 0 1 21.75 9Z\"]},{\"id\":\"ph-hammer\",\"label\":\"Hammer\",\"set\":\"solid\",\"paths\":[\"M23.56 10.5 17.24 4.13a9.01 9.01 0 0 0-12.73 0l-.01 .01L3.21 5.48A.75 .75 0 0 0 4.29 6.52L5.58 5.19a7.49 7.49 0 0 1 1.75-1.3L11.69 8.25l-9 9a1.5 1.5 0 0 0 0 2.12l1.94 1.94a1.5 1.5 0 0 0 2.12 0l9-9 3 3a1.5 1.5 0 0 0 2.12 0l2.69-2.69A1.5 1.5 0 0 0 23.56 10.5Zm-8.34 .22L13.13 12.81 11.19 10.88l2.1-2.1a.75 .75 0 0 0 0-1.06L8.84 3.28a7.5 7.5 0 0 1 7.33 1.91l4.15 4.17L17.63 12.06l-1.34-1.34A.75 .75 0 0 0 15.22 10.72Zm4.59 3.53-1.12-1.12L21.38 10.43l1.13 1.13Z\"]},{\"id\":\"ph-gear\",\"label\":\"Settings\",\"set\":\"solid\",\"paths\":[\"M20.25 12.2q.01-.2 0-.4l1.4-1.75a.75 .75 0 0 0 .14-.66 10.09 10.09 0 0 0-1.02-2.46 .75 .75 0 0 0-.56-.37l-2.22-.25q-.14-.15-.28-.28L17.44 3.8a.75 .75 0 0 0-.37-.56 10.06 10.06 0 0 0-2.46-1.02 .75 .75 0 0 0-.66 .14L12.2 3.75Q12 3.75 11.8 3.75L10.05 2.35a.75 .75 0 0 0-.66-.14A10.09 10.09 0 0 0 6.93 3.24a.75 .75 0 0 0-.37 .56L6.31 6.03q-.15 .14-.28 .28L3.8 6.56a.75 .75 0 0 0-.56 .37 10.1 10.1 0 0 0-1.02 2.46 .75 .75 0 0 0 .14 .66L3.75 11.8Q3.75 12 3.75 12.2L2.35 13.95a.75 .75 0 0 0-.14 .66 10.09 10.09 0 0 0 1.02 2.46 .75 .75 0 0 0 .56 .37l2.22 .25q.14 .15 .28 .28L6.56 20.2a.75 .75 0 0 0 .37 .56 10.1 10.1 0 0 0 2.46 1.02 .75 .75 0 0 0 .66-.14L11.8 20.25q.2 .01 .41 0l1.75 1.4a.75 .75 0 0 0 .66 .14 10.05 10.05 0 0 0 2.46-1.02 .75 .75 0 0 0 .37-.56l.25-2.22q.15-.14 .28-.28L20.2 17.44a.75 .75 0 0 0 .56-.37 10.1 10.1 0 0 0 1.02-2.46 .75 .75 0 0 0-.14-.66ZM12 15.75a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 12 15.75Z\"]},{\"id\":\"ph-sliders-horizontal\",\"label\":\"Sliders\",\"set\":\"solid\",\"paths\":[\"M3 7.5a.75 .75 0 0 1 .75-.75H7.23a2.63 2.63 0 0 1 5.03 0H20.25a.75 .75 0 0 1 0 1.5H12.27a2.63 2.63 0 0 1-5.03 0H3.75A.75 .75 0 0 1 3 7.5Zm17.25 8.25H18.27a2.63 2.63 0 0 0-5.03 0H3.75a.75 .75 0 0 0 0 1.5H13.23a2.63 2.63 0 0 0 5.03 0H20.25a.75 .75 0 0 0 0-1.5Z\"]},{\"id\":\"ph-pencil-simple\",\"label\":\"Pencil\",\"set\":\"solid\",\"paths\":[\"M21.31 6.88 17.12 2.69a1.5 1.5 0 0 0-2.12 0L3.44 14.25A1.49 1.49 0 0 0 3 15.31V19.5a1.5 1.5 0 0 0 1.5 1.5H8.69A1.49 1.49 0 0 0 9.75 20.56L21.31 9a1.5 1.5 0 0 0 0-2.12ZM18 10.19 13.81 6l2.25-2.25L20.25 7.94Z\"]},{\"id\":\"ph-paint-brush\",\"label\":\"Brush\",\"set\":\"solid\",\"paths\":[\"M21.75 3a.75 .75 0 0 0-.75-.75c-4.13 0-8.37 4.66-10.73 7.75A5.63 5.63 0 0 0 3 15.38c0 2.9-1.83 4.19-1.92 4.25A.75 .75 0 0 0 1.5 21H8.63a5.63 5.63 0 0 0 5.38-7.27C17.09 11.37 21.75 7.13 21.75 3ZM11.66 10.65q.48-.62 .95-1.18A7.15 7.15 0 0 1 14.53 11.39q-.55 .46-1.18 .95A5.68 5.68 0 0 0 11.66 10.65Zm4-.25a8.68 8.68 0 0 0-2.06-2.06c2.98-3.24 5.23-4.22 6.55-4.49C19.89 5.17 18.9 7.41 15.67 10.39Z\"]},{\"id\":\"ph-palette\",\"label\":\"Palette\",\"set\":\"solid\",\"paths\":[\"M18.82 5.05A9.68 9.68 0 0 0 12 2.25h-.1A9.75 9.75 0 0 0 2.25 12c0 4.03 2.49 7.41 6.5 8.83A3 3 0 0 0 12.75 18a1.5 1.5 0 0 1 1.5-1.5h4.33a2.98 2.98 0 0 0 2.93-2.33 9.79 9.79 0 0 0 .24-2.25A9.68 9.68 0 0 0 18.82 5.05ZM7.88 15.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.88 15.75Zm0-5.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.88 10.5Zm4.13-2.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 8.25Zm4.13 2.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.13 10.5Z\"]},{\"id\":\"ph-trash\",\"label\":\"Trash\",\"set\":\"solid\",\"paths\":[\"M20.25 4.5H16.5V3.75a2.25 2.25 0 0 0-2.25-2.25H9.75A2.25 2.25 0 0 0 7.5 3.75v.75H3.75a.75 .75 0 0 0 0 1.5h.75V19.5a1.5 1.5 0 0 0 1.5 1.5H18a1.5 1.5 0 0 0 1.5-1.5V6h.75a.75 .75 0 0 0 0-1.5ZM10.5 15.75a.75 .75 0 0 1-1.5 0V9.75a.75 .75 0 0 1 1.5 0Zm4.5 0a.75 .75 0 0 1-1.5 0V9.75a.75 .75 0 0 1 1.5 0Zm0-11.25H9V3.75a.75 .75 0 0 1 .75-.75h4.5a.75 .75 0 0 1 .75 .75Z\"]},{\"id\":\"ph-magnifying-glass\",\"label\":\"Search\",\"set\":\"solid\",\"paths\":[\"M15.75 10.5a5.25 5.25 0 1 1-5.25-5.25A5.25 5.25 0 0 1 15.75 10.5Zm5.78 11.03a.75 .75 0 0 1-1.06 0l-4.69-4.69a8.25 8.25 0 1 1 1.06-1.06l4.69 4.69A.75 .75 0 0 1 21.53 21.53ZM10.5 17.25a6.75 6.75 0 1 0-6.75-6.75A6.76 6.76 0 0 0 10.5 17.25Z\"]},{\"id\":\"ph-funnel\",\"label\":\"Filter\",\"set\":\"solid\",\"paths\":[\"M21.36 6.26l-.01 .01L15 13.05v5.2A1.5 1.5 0 0 1 14.33 19.5l-3 2A1.5 1.5 0 0 1 9 20.25V13.05L2.65 6.27l-.01-.01A1.5 1.5 0 0 1 3.75 3.75H20.25a1.5 1.5 0 0 1 1.11 2.51Z\"]},{\"id\":\"ph-list\",\"label\":\"List\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM18 17.25H6a.75 .75 0 0 1 0-1.5H18a.75 .75 0 0 1 0 1.5Zm0-4.5H6a.75 .75 0 0 1 0-1.5H18a.75 .75 0 0 1 0 1.5Zm0-4.5H6a.75 .75 0 0 1 0-1.5H18a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-squares-four\",\"label\":\"Grid\",\"set\":\"solid\",\"paths\":[\"M11.25 5.25v4.5a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 5.25 3.75h4.5A1.5 1.5 0 0 1 11.25 5.25Zm7.5-1.5H14.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 18.75 3.75Zm-9 9H5.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 9.75 12.75Zm9 0H14.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 18.75 12.75Z\"]},{\"id\":\"ph-folder\",\"label\":\"Folder\",\"set\":\"solid\",\"paths\":[\"M20.25 6.75H12.31L9.75 4.19A1.49 1.49 0 0 0 8.69 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.81A1.44 1.44 0 0 0 3.69 20.25h16.64A1.42 1.42 0 0 0 21.75 18.83V8.25A1.5 1.5 0 0 0 20.25 6.75ZM3.75 5.25H8.69l1.5 1.5H3.75Z\"]},{\"id\":\"ph-download-simple\",\"label\":\"Download\",\"set\":\"solid\",\"paths\":[\"M21 13.5v6a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 1.5 0v5.25H19.5V13.5a.75 .75 0 0 1 1.5 0Zm-9.53 .53a.75 .75 0 0 0 1.06 0l3.75-3.75A.75 .75 0 0 0 15.75 9H12.75V3a.75 .75 0 0 0-1.5 0V9H8.25a.75 .75 0 0 0-.53 1.28Z\"]},{\"id\":\"ph-upload-simple\",\"label\":\"Upload\",\"set\":\"solid\",\"paths\":[\"M21 13.5v6a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 1.5 0v5.25H19.5V13.5a.75 .75 0 0 1 1.5 0ZM8.25 7.5h3v6a.75 .75 0 0 0 1.5 0V7.5h3a.75 .75 0 0 0 .53-1.28l-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75A.75 .75 0 0 0 8.25 7.5Z\"]},{\"id\":\"ph-arrows-clockwise\",\"label\":\"Refresh\",\"set\":\"solid\",\"paths\":[\"M21 4.5V9a.75 .75 0 0 1-.75 .75H15.75a.75 .75 0 0 1-.53-1.28L16.94 6.75a7.45 7.45 0 0 0-5.13-2.07h-.04A7.46 7.46 0 0 0 6.52 6.82 .75 .75 0 0 1 5.48 5.74 9 9 0 0 1 18 5.69l1.72-1.72A.75 .75 0 0 1 21 4.5ZM17.48 17.18A7.5 7.5 0 0 1 7.06 17.25l1.72-1.72A.75 .75 0 0 0 8.25 14.25H3.75a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 1.28 .53L6 18.31a8.95 8.95 0 0 0 6.19 2.51h.05a8.94 8.94 0 0 0 6.29-2.56 .75 .75 0 0 0-1.05-1.07Z\"]},{\"id\":\"ph-power\",\"label\":\"Power\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.75 9.75 0 0 0 12 2.25Zm-.75 3.75a.75 .75 0 0 1 1.5 0v6a.75 .75 0 0 1-1.5 0Zm.75 13.5A7.5 7.5 0 0 1 7.83 5.76a.75 .75 0 1 1 .83 1.25 6 6 0 1 0 6.67 0 .75 .75 0 1 1 .83-1.25A7.5 7.5 0 0 1 12 19.5Z\"]},{\"id\":\"ph-sign-in\",\"label\":\"Join\",\"set\":\"solid\",\"paths\":[\"M13.28 12.53l-3.75 3.75A.75 .75 0 0 1 8.25 15.75V12.75H2.25a.75 .75 0 0 1 0-1.5H8.25V8.25a.75 .75 0 0 1 1.28-.53l3.75 3.75A.75 .75 0 0 1 13.28 12.53ZM18.75 3H12.75a.75 .75 0 0 0 0 1.5h5.25V19.5H12.75a.75 .75 0 0 0 0 1.5h6a.75 .75 0 0 0 .75-.75V3.75A.75 .75 0 0 0 18.75 3Z\"]},{\"id\":\"ph-sign-out\",\"label\":\"Leave\",\"set\":\"solid\",\"paths\":[\"M11.25 20.25a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V3.75a.75 .75 0 0 1 .75-.75h6a.75 .75 0 0 1 0 1.5H5.25V19.5h5.25A.75 .75 0 0 1 11.25 20.25Zm10.28-8.78-3.75-3.75A.75 .75 0 0 0 16.5 8.25v3H10.5a.75 .75 0 0 0 0 1.5h6v3a.75 .75 0 0 0 1.28 .53l3.75-3.75A.75 .75 0 0 0 21.53 11.47Z\"]},{\"id\":\"ph-plus-circle\",\"label\":\"Plus\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.75 10.5H12.75v3a.75 .75 0 0 1-1.5 0V12.75H8.25a.75 .75 0 0 1 0-1.5h3V8.25a.75 .75 0 0 1 1.5 0v3h3a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-minus-circle\",\"label\":\"Minus\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.75 10.5H8.25a.75 .75 0 0 1 0-1.5h7.5a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-ticket\",\"label\":\"Ticket\",\"set\":\"solid\",\"paths\":[\"M21.75 9.75a.75 .75 0 0 0 .75-.75V6a1.5 1.5 0 0 0-1.5-1.5H3A1.5 1.5 0 0 0 1.5 6V9a.75 .75 0 0 0 .75 .75 2.25 2.25 0 0 1 0 4.5 .75 .75 0 0 0-.75 .75v3a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V15a.75 .75 0 0 0-.75-.75 2.25 2.25 0 0 1 0-4.5ZM3 15.68a3.75 3.75 0 0 0 0-7.35V6H8.25V18H3Z\"]},{\"id\":\"ph-tag\",\"label\":\"Tag\",\"set\":\"solid\",\"paths\":[\"M22.81 12.75 13.5 3.44A1.49 1.49 0 0 0 12.44 3H3.75a.75 .75 0 0 0-.75 .75v8.69A1.49 1.49 0 0 0 3.44 13.5L12.75 22.81a1.5 1.5 0 0 0 2.12 0l7.94-7.94a1.5 1.5 0 0 0 0-2.12ZM7.88 9A1.13 1.13 0 1 1 9 7.88 1.13 1.13 0 0 1 7.88 9Z\"]},{\"id\":\"ph-percent\",\"label\":\"Percent\",\"set\":\"solid\",\"paths\":[\"M16.5 16.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 16.13ZM8.63 9A1.13 1.13 0 1 0 7.5 7.88 1.13 1.13 0 0 0 8.63 9ZM21 4.5V19.5a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 4.5 3H19.5A1.5 1.5 0 0 1 21 4.5ZM6 7.88A2.63 2.63 0 1 0 8.63 5.25 2.63 2.63 0 0 0 6 7.88Zm12 8.25a2.63 2.63 0 1 0-2.62 2.63A2.63 2.63 0 0 0 18 16.13ZM17.78 6.22a.75 .75 0 0 0-1.06 0l-10.5 10.5a.75 .75 0 0 0 1.06 1.06l10.5-10.5A.75 .75 0 0 0 17.78 6.22Z\"]},{\"id\":\"ph-sticker\",\"label\":\"Sticker\",\"set\":\"solid\",\"paths\":[\"M15.75 3H8.25A5.26 5.26 0 0 0 3 8.25v7.5a5.26 5.26 0 0 0 5.25 5.25h4.5a.76 .76 0 0 0 .24-.04c2.46-.82 7.15-5.52 7.97-7.97A.76 .76 0 0 0 21 12.75V8.25A5.26 5.26 0 0 0 15.75 3ZM12.75 19.45V16.5a3.75 3.75 0 0 1 3.75-3.75h2.95C18.58 14.77 14.77 18.58 12.75 19.45Z\"]},{\"id\":\"ph-game-controller\",\"label\":\"Gamepad\",\"set\":\"solid\",\"paths\":[\"M23.2 16.29a.06 .06 0 0 0 0-.01L21.66 8.39c0-.01 0-.01 0-.02A5.63 5.63 0 0 0 16.13 3.75H7.86a5.61 5.61 0 0 0-5.53 4.64L.8 16.28a.06 .06 0 0 0 0 .01 3.38 3.38 0 0 0 5.71 2.97l.03-.03L10.27 15h3.47l3.72 4.23c.01 .01 .02 .02 .03 .03A3.38 3.38 0 0 0 19.88 20.25a3.38 3.38 0 0 0 3.32-3.96ZM9.75 10.5H9v.75a.75 .75 0 0 1-1.5 0v-.75H6.75a.75 .75 0 0 1 0-1.5h.75V8.25a.75 .75 0 0 1 1.5 0v.75h.75a.75 .75 0 0 1 0 1.5Zm3.75-.75a.75 .75 0 0 1 .75-.75h2.25a.75 .75 0 0 1 0 1.5H14.25A.75 .75 0 0 1 13.5 9.75Zm7.91 8.2a1.86 1.86 0 0 1-1.21 .77A1.88 1.88 0 0 1 18.56 18.22L15.73 15H16.13a5.63 5.63 0 0 0 4.78-2.66l.82 4.22A1.86 1.86 0 0 1 21.41 17.95Z\"]},{\"id\":\"ph-sword\",\"label\":\"Sword\",\"set\":\"solid\",\"paths\":[\"M20.25 3H14.25a.75 .75 0 0 0-.59 .29l-6 7.8L6.75 10.19a1.5 1.5 0 0 0-2.12 0l-.81 .82a1.5 1.5 0 0 0 0 2.12l2.06 2.06-3 3a1.5 1.5 0 0 0 0 2.12l.81 .81a1.5 1.5 0 0 0 2.12 0l3-3 2.06 2.06a1.5 1.5 0 0 0 2.12 0l.81-.82a1.5 1.5 0 0 0 0-2.12l-.9-.9 7.8-6A.75 .75 0 0 0 21 9.75V3.75A.75 .75 0 0 0 20.25 3Zm-.75 6.38-7.66 5.9L10.81 14.25l4.72-4.72a.75 .75 0 0 0-1.06-1.06L9.75 13.19 8.73 12.16 14.62 4.5H19.5Z\"]},{\"id\":\"ph-target\",\"label\":\"Target\",\"set\":\"solid\",\"paths\":[\"M20.8 7.8A9.76 9.76 0 1 1 18.34 4.59l2.13-2.13a.75 .75 0 0 1 1.06 1.06L15.71 9.35h0l-3.54 3.54-2.25 2.25a3.75 3.75 0 0 0 5.81-3.34 .75 .75 0 1 1 1.5-.08 5.25 5.25 0 0 1-8.95 4.01h0a5.25 5.25 0 0 1 6.86-7.92L17.28 5.66a8.24 8.24 0 1 0 2.17 2.78 .75 .75 0 0 1 1.35-.65Z\"]},{\"id\":\"ph-puzzle-piece\",\"label\":\"Puzzle\",\"set\":\"solid\",\"paths\":[\"M15.54 21H19.5a1.5 1.5 0 0 0 1.5-1.5V15.97A.75 .75 0 0 0 19.96 15.28a2.19 2.19 0 0 1-.84 .17c-1.24 0-2.25-1.04-2.25-2.32s1.01-2.32 2.25-2.32a2.19 2.19 0 0 1 .84 .17A.75 .75 0 0 0 21 10.28V6.75a1.5 1.5 0 0 0-1.5-1.5H16.1a3.32 3.32 0 0 0 .02-.37 3.38 3.38 0 0 0-6.75 0 3.32 3.32 0 0 0 .02 .38H6A1.5 1.5 0 0 0 4.5 6.75v3.02a3.32 3.32 0 0 0-.37-.02 3.38 3.38 0 0 0 0 6.75 3.32 3.32 0 0 0 .38-.02V19.5a1.5 1.5 0 0 0 1.5 1.5h3.96\"]},{\"id\":\"ph-chart-bar\",\"label\":\"Chart\",\"set\":\"solid\",\"paths\":[\"M21.75 19.5a.75 .75 0 0 1-.75 .75H3a.75 .75 0 0 1 0-1.5h.75V12.75a.75 .75 0 0 1 .75-.75H6.75a.75 .75 0 0 1 .75 .75v6H9V8.25a.75 .75 0 0 1 .75-.75h3a.75 .75 0 0 1 .75 .75V18.75h1.5V3.75a.75 .75 0 0 1 .75-.75h3.75a.75 .75 0 0 1 .75 .75V18.75h.75A.75 .75 0 0 1 21.75 19.5Z\"]},{\"id\":\"ph-chart-line-up\",\"label\":\"Growth\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM18.75 18H5.25a.75 .75 0 0 1-.75-.75V6.75a.75 .75 0 0 1 1.5 0v7.19l3.22-3.22a.75 .75 0 0 1 1.06 0L12 12.44 16.19 8.25H13.5a.75 .75 0 0 1 0-1.5h4.5a.75 .75 0 0 1 .75 .75v4.5a.75 .75 0 0 1-1.5 0V9.31l-4.72 4.72a.75 .75 0 0 1-1.06 0L9.75 12.31l-3.75 3.75V16.5H18.75a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-trend-up\",\"label\":\"Trending up\",\"set\":\"solid\",\"paths\":[\"M22.5 5.25v6a.75 .75 0 0 1-1.28 .53L18.75 9.31l-5.47 5.47a.75 .75 0 0 1-1.06 0L9 11.56 2.78 17.78a.75 .75 0 0 1-1.06-1.06l6.75-6.75a.75 .75 0 0 1 1.06 0L12.75 13.19 17.69 8.25 15.22 5.78A.75 .75 0 0 1 15.75 4.5h6A.75 .75 0 0 1 22.5 5.25Z\"]},{\"id\":\"ph-trend-down\",\"label\":\"Trending down\",\"set\":\"solid\",\"paths\":[\"M22.5 12v6a.75 .75 0 0 1-.75 .75H15.75a.75 .75 0 0 1-.53-1.28L17.69 15 12.75 10.06l-3.22 3.22a.75 .75 0 0 1-1.06 0l-6.75-6.75A.75 .75 0 0 1 2.78 5.47L9 11.69l3.22-3.22a.75 .75 0 0 1 1.06 0L18.75 13.94l2.47-2.47A.75 .75 0 0 1 22.5 12Z\"]},{\"id\":\"ph-pulse\",\"label\":\"Activity\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-.75 9H17.68L14.91 17.63a.75 .75 0 0 1-.65 .38h-.04a.75 .75 0 0 1-.65-.45L9.66 8.43 7.41 12.38a.75 .75 0 0 1-.66 .38H4.5a.75 .75 0 0 1 0-1.5H6.32L9.1 6.38a.75 .75 0 0 1 1.34 .08L14.34 15.57l2.25-3.94a.75 .75 0 0 1 .65-.37h2.25a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-sun\",\"label\":\"Sun\",\"set\":\"solid\",\"paths\":[\"M11.25 3.75V1.5a.75 .75 0 0 1 1.5 0V3.75a.75 .75 0 0 1-1.5 0Zm.75 2.25a6 6 0 1 0 6 6A6.01 6.01 0 0 0 12 6ZM5.47 6.53A.75 .75 0 0 0 6.53 5.47l-1.5-1.5A.75 .75 0 0 0 3.97 5.03Zm0 10.94-1.5 1.5a.75 .75 0 0 0 1.06 1.06l1.5-1.5a.75 .75 0 0 0-1.06-1.06ZM18 6.75a.75 .75 0 0 0 .53-.22l1.5-1.5a.75 .75 0 0 0-1.06-1.06l-1.5 1.5A.75 .75 0 0 0 18 6.75Zm.53 10.72a.75 .75 0 0 0-1.06 1.06l1.5 1.5a.75 .75 0 0 0 1.06-1.06ZM4.5 12a.75 .75 0 0 0-.75-.75H1.5a.75 .75 0 0 0 0 1.5H3.75A.75 .75 0 0 0 4.5 12Zm7.5 7.5a.75 .75 0 0 0-.75 .75v2.25a.75 .75 0 0 0 1.5 0V20.25A.75 .75 0 0 0 12 19.5Zm10.5-8.25H20.25a.75 .75 0 0 0 0 1.5h2.25a.75 .75 0 0 0 0-1.5Z\"]},{\"id\":\"ph-moon\",\"label\":\"Moon\",\"set\":\"solid\",\"paths\":[\"M22.08 14.08a9.83 9.83 0 0 1-3.47 4.96A9.75 9.75 0 0 1 3 11.25 9.66 9.66 0 0 1 4.96 5.39a9.83 9.83 0 0 1 4.96-3.47 .75 .75 0 0 1 .94 .94 8.26 8.26 0 0 0 10.29 10.29 .75 .75 0 0 1 .94 .94Z\"]},{\"id\":\"ph-cloud\",\"label\":\"Cloud\",\"set\":\"solid\",\"paths\":[\"M15.01 3.75A8.26 8.26 0 0 0 7.62 8.31h0A8.2 8.2 0 0 0 6.75 11.97 .77 .77 0 0 1 6.05 12.75 .75 .75 0 0 1 5.25 12a9.72 9.72 0 0 1 .5-3.09 .38 .38 0 0 0-.45-.49A6.01 6.01 0 0 0 .75 14.25c0 3.3 2.79 6 6.09 6H15a8.26 8.26 0 0 0 8.24-8.58C23.07 7.27 19.41 3.75 15.01 3.75Z\"]},{\"id\":\"ph-snowflake\",\"label\":\"Snow\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.97 11.18 1.78-.63a.75 .75 0 1 1 .5 1.41l-1.45 .52 .42 1.58a.75 .75 0 0 1-.53 .92A.77 .77 0 0 1 16.5 17.25a.75 .75 0 0 1-.72-.56l-.52-1.95L12.75 13.3v2.89l1.28 1.28a.75 .75 0 0 1-1.06 1.06L12 17.56l-.97 .97a.75 .75 0 0 1-1.06-1.06L11.25 16.19V13.3L8.75 14.74l-.52 1.95A.75 .75 0 0 1 7.5 17.25a.77 .77 0 0 1-.19-.03 .75 .75 0 0 1-.53-.92l.42-1.58-1.45-.52a.75 .75 0 0 1 .5-1.41l1.78 .63L10.5 12 8.03 10.57l-1.78 .63A.77 .77 0 0 1 6 11.25a.75 .75 0 0 1-.25-1.46l1.45-.52L6.78 7.69a.75 .75 0 0 1 1.45-.39l.52 1.95L11.25 10.7V7.81L9.97 6.53a.75 .75 0 0 1 1.06-1.06L12 6.44l.97-.97a.75 .75 0 0 1 1.06 1.06L12.75 7.81v2.89l2.5-1.44 .52-1.95a.75 .75 0 0 1 1.45 .39l-.42 1.58 1.45 .52A.75 .75 0 0 1 18 11.25a.77 .77 0 0 1-.25-.04l-1.78-.63L13.5 12Z\"]},{\"id\":\"ph-leaf\",\"label\":\"Leaf\",\"set\":\"solid\",\"paths\":[\"M20.95 3.76a.75 .75 0 0 0-.7-.7C13.11 2.63 7.39 4.78 4.95 8.81a8.16 8.16 0 0 0-1.2 4.59A9.54 9.54 0 0 0 4.38 16.42a.38 .38 0 0 0 .62 .13l7.97-8.09a.75 .75 0 0 1 1.06 1.06L5.32 18.37 3.99 19.7a.77 .77 0 0 0-.06 1.04 .75 .75 0 0 0 1.1 .04l1.57-1.57c1.33 .64 2.66 .99 3.99 1.04q.16 .01 .31 .01A8.15 8.15 0 0 0 15.19 19.05C19.22 16.61 21.37 10.89 20.95 3.76Z\"]},{\"id\":\"ph-tree\",\"label\":\"Tree\",\"set\":\"solid\",\"paths\":[\"M12 17.61a6.79 6.79 0 0 0 .75 .43V21.75a.75 .75 0 0 1-1.5 0V18.04A6.79 6.79 0 0 0 12 17.61ZM18.57 5.87a7.13 7.13 0 0 0-13.14 0A6.72 6.72 0 0 0 1.5 11.98C1.49 15.56 4.5 18.66 8.08 18.75A6.77 6.77 0 0 0 11.25 18.04V14.71L7.16 12.67a.75 .75 0 1 1 .67-1.34L11.25 13.04V8.25a.75 .75 0 0 1 1.5 0v2.54l3.41-1.71a.75 .75 0 1 1 .67 1.34L12.75 12.46v5.58A6.77 6.77 0 0 0 15.75 18.75l.17 0C19.5 18.66 22.51 15.56 22.5 11.98A6.72 6.72 0 0 0 18.57 5.87Z\"]},{\"id\":\"ph-flower\",\"label\":\"Flower\",\"set\":\"solid\",\"paths\":[\"M19.72 12.13c-.08-.04-.16-.09-.25-.13 .09-.04 .17-.08 .25-.13a3.75 3.75 0 1 0-3.75-6.49c-.08 .04-.15 .09-.23 .15 .01-.09 .01-.19 .01-.28a3.75 3.75 0 0 0-7.5 0c0 .09 0 .18 .01 .28-.08-.05-.16-.11-.23-.15a3.75 3.75 0 1 0-3.75 6.5c.08 .04 .16 .09 .25 .13-.09 .04-.17 .08-.25 .13a3.75 3.75 0 1 0 3.75 6.5c.08-.04 .15-.09 .23-.15-.01 .09-.01 .19-.01 .28a3.75 3.75 0 0 0 7.5 0c0-.09 0-.18-.01-.28 .08 .05 .16 .11 .23 .15A3.73 3.73 0 0 0 17.84 19.13a3.79 3.79 0 0 0 .98-.13 3.75 3.75 0 0 0 .9-6.87ZM12 14.63a2.63 2.63 0 1 1 2.63-2.62A2.63 2.63 0 0 1 12 14.63Z\"]},{\"id\":\"ph-paw-print\",\"label\":\"Paw\",\"set\":\"solid\",\"paths\":[\"M22.5 10.13a2.63 2.63 0 1 1-2.62-2.62A2.63 2.63 0 0 1 22.5 10.13ZM6.75 10.13a2.63 2.63 0 1 0-2.62 2.63A2.63 2.63 0 0 0 6.75 10.13ZM8.63 8.25A2.63 2.63 0 1 0 6 5.63 2.63 2.63 0 0 0 8.63 8.25Zm6.75 0a2.63 2.63 0 1 0-2.62-2.62A2.63 2.63 0 0 0 15.38 8.25Zm2.17 5.71a3.31 3.31 0 0 1-1.58-1.98 4.13 4.13 0 0 0-7.92 0A3.3 3.3 0 0 1 6.47 13.95 3.75 3.75 0 0 0 8.25 21a3.7 3.7 0 0 0 1.46-.29 6.01 6.01 0 0 1 4.58 0 3.75 3.75 0 0 0 3.26-6.75Z\"]},{\"id\":\"ph-dog\",\"label\":\"Dog\",\"set\":\"solid\",\"paths\":[\"M22.47 11.72l-1.54-8.25a1.5 1.5 0 0 0-1.84-1.18l-.03 .01L14.14 3.75h-4.28L4.93 2.3l-.03-.01A1.5 1.5 0 0 0 3.07 3.47L1.53 11.72a1.48 1.48 0 0 0 .86 1.64A1.52 1.52 0 0 0 3.01 13.5 1.45 1.45 0 0 0 3.75 13.3V17.25a3.75 3.75 0 0 0 3.75 3.75h9a3.75 3.75 0 0 0 3.75-3.75V13.3a1.45 1.45 0 0 0 .74 .2 1.53 1.53 0 0 0 .63-.14A1.48 1.48 0 0 0 22.47 11.72ZM16.5 19.5H12.75V18.31l1.28-1.28a.75 .75 0 0 0-1.06-1.06L12 16.94l-.97-.97a.75 .75 0 0 0-1.06 1.06L11.25 18.31V19.5H7.5a2.25 2.25 0 0 1-2.25-2.25V11.54L10.12 5.25h3.76L18.75 11.54V17.25A2.25 2.25 0 0 1 16.5 19.5Zm-6.75-6.37a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.75 13.13Zm6.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 13.13Z\"]},{\"id\":\"ph-cat\",\"label\":\"Cat\",\"set\":\"solid\",\"paths\":[\"M20.89 3.14a1.5 1.5 0 0 0-1.7 .3c-.01 .01-.02 .03-.04 .04L17.54 5.34A10.43 10.43 0 0 0 6.47 5.34L4.85 3.48c-.01-.01-.02-.03-.04-.04a1.5 1.5 0 0 0-1.7-.3A1.54 1.54 0 0 0 2.25 4.54V12.75c0 4.59 3.76 8.4 8.58 8.94a.38 .38 0 0 0 .42-.37v-3l-1.26-1.26a.77 .77 0 0 1-.04-1.07 .75 .75 0 0 1 1.08-.02L12 16.94l.97-.97a.75 .75 0 0 1 1.08 .02 .77 .77 0 0 1-.04 1.07L12.75 18.31v3a.38 .38 0 0 0 .42 .38C17.99 21.15 21.75 17.34 21.75 12.75V4.54A1.54 1.54 0 0 0 20.89 3.14ZM7.88 14.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.88 14.25Zm1.88-6a.75 .75 0 1 1-1.5 0V6.47a.75 .75 0 0 1 1.5 0Zm3 0a.75 .75 0 1 1-1.5 0V6a.75 .75 0 0 1 1.5 0Zm1.5 0V6.47a.75 .75 0 0 1 1.5 0V8.25a.75 .75 0 1 1-1.5 0Zm1.88 6a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.13 14.25Z\"]},{\"id\":\"ph-fish\",\"label\":\"Fish\",\"set\":\"solid\",\"paths\":[\"M15.75 7.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 15.75 7.13Zm4.57 6.34c-1.82 3.27-5.2 5.04-10.05 5.26l-2.06 4.82A.75 .75 0 0 1 7.51 24l-.05 0a.75 .75 0 0 1-.67-.54L5.4 18.6 .54 17.21a.75 .75 0 0 1-.09-1.41l4.82-2.06c.22-4.85 1.99-8.23 5.26-10.05 2.32-1.29 4.94-1.48 6.74-1.42 1.75 .06 3.38 .4 3.64 .56a.75 .75 0 0 1 .27 .27c.16 .27 .5 1.89 .56 3.64C21.8 8.52 21.61 11.15 20.32 13.47Zm-.4-9.38c-1.33-.28-6.01-1.03-9.4 1.38a7.61 7.61 0 0 0-1.5 1.41 3.38 3.38 0 0 0 3.69 3.6 .75 .75 0 0 1 .82 .82 3.38 3.38 0 0 0 3.61 3.69 7.58 7.58 0 0 0 1.41-1.5C20.95 10.1 20.2 5.41 19.91 4.08Z\"]},{\"id\":\"ph-bird\",\"label\":\"Bird\",\"set\":\"solid\",\"paths\":[\"M22.17 6.88 19.99 5.42A5.63 5.63 0 0 0 14.63 1.5h-.03C11.51 1.52 9 4.08 9 7.21V9.06L1.09 18.55l-.01 .01A1.5 1.5 0 0 0 2.25 21h8.25A9.76 9.76 0 0 0 20.25 11.25V9.4l1.92-1.28a.75 .75 0 0 0 0-1.25ZM11.83 12.48l-5.62 6.75a.75 .75 0 1 1-1.15-.96l5.63-6.75a.75 .75 0 1 1 1.15 .96ZM15.38 7.5a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.38 7.5Z\"]},{\"id\":\"ph-pizza\",\"label\":\"Pizza\",\"set\":\"solid\",\"paths\":[\"M22.46 5.91a1.49 1.49 0 0 0-.68-.93 18.89 18.89 0 0 0-19.55 0 1.5 1.5 0 0 0-.5 2.06l9 14.74a1.5 1.5 0 0 0 2.57 0l9-14.74A1.48 1.48 0 0 0 22.46 5.91Zm-5.17 6.42a3.75 3.75 0 0 0-3.88 6.35L12 21 9.05 16.17a3.75 3.75 0 1 0-3.88-6.35L4.57 8.84a14.25 14.25 0 0 1 14.85 0Z\"]},{\"id\":\"ph-coffee\",\"label\":\"Coffee\",\"set\":\"solid\",\"paths\":[\"M19.5 7.5H3a.75 .75 0 0 0-.75 .75v4.5a9.03 9.03 0 0 0 3.05 6.75H3a.75 .75 0 0 0 0 1.5H19.5a.75 .75 0 0 0 0-1.5H17.2a9.06 9.06 0 0 0 2.53-3.76A3.75 3.75 0 0 0 23.25 12v-.75A3.75 3.75 0 0 0 19.5 7.5Zm2.25 4.5a2.25 2.25 0 0 1-1.61 2.16 8.98 8.98 0 0 0 .11-1.41V9.13A2.25 2.25 0 0 1 21.75 11.25ZM10.5 5.25V2.25a.75 .75 0 0 1 1.5 0V5.25a.75 .75 0 0 1-1.5 0Zm3 0V2.25a.75 .75 0 0 1 1.5 0V5.25a.75 .75 0 0 1-1.5 0ZM7.5 5.25V2.25a.75 .75 0 0 1 1.5 0V5.25a.75 .75 0 0 1-1.5 0Z\"]},{\"id\":\"ph-cake\",\"label\":\"Cake\",\"set\":\"solid\",\"paths\":[\"M19.5 8.25H12.75V7.41a3.01 3.01 0 0 0 2.25-2.91c0-2.62-2.48-4.3-2.58-4.37a.75 .75 0 0 0-.83 0C11.48 .2 9 1.88 9 4.5a3.01 3.01 0 0 0 2.25 2.91v.84H4.5a2.25 2.25 0 0 0-2.25 2.25v2.19a3.83 3.83 0 0 0 .75 2.27V18.75a2.25 2.25 0 0 0 2.25 2.25H18.75a2.25 2.25 0 0 0 2.25-2.25V14.96a3.83 3.83 0 0 0 .75-2.27V10.5A2.25 2.25 0 0 0 19.5 8.25ZM10.5 4.5c0-1.27 .94-2.29 1.5-2.79 .56 .5 1.5 1.52 1.5 2.79a1.5 1.5 0 0 1-3 0Zm9.75 8.19c0 1.24-.98 2.28-2.19 2.31A2.25 2.25 0 0 1 15.75 12.75a.75 .75 0 0 0-1.5 0 2.25 2.25 0 0 1-4.5 0 .75 .75 0 0 0-1.5 0 2.25 2.25 0 0 1-2.31 2.25C4.73 14.97 3.75 13.93 3.75 12.69V10.5a.75 .75 0 0 1 .75-.75H19.5a.75 .75 0 0 1 .75 .75Z\"]},{\"id\":\"ph-beer-bottle\",\"label\":\"Beer\",\"set\":\"solid\",\"paths\":[\"M23.03 3.97l-3-3a.75 .75 0 0 0-1.06 1.06l.14 .14L13.94 6.05l-3.58 .72a.75 .75 0 0 0-.38 .2L2.16 14.78a2.25 2.25 0 0 0 0 3.18L6.04 21.84a2.25 2.25 0 0 0 3.18 0l7.81-7.81a.75 .75 0 0 0 .2-.38l.72-3.58 3.88-5.17 .14 .14a.75 .75 0 0 0 1.06-1.06ZM7.63 21a.74 .74 0 0 1-.53-.22L3.22 16.9a.75 .75 0 0 1 0-1.06L3.75 15.31 8.69 20.25 8.16 20.78A.75 .75 0 0 1 7.63 21ZM16.65 9.3a.74 .74 0 0 0-.13 .3l-.71 3.53L15 13.94 10.06 9l.81-.81 3.53-.71a.74 .74 0 0 0 .3-.13l5.48-4.11 .58 .58Z\"]},{\"id\":\"ph-car\",\"label\":\"Car\",\"set\":\"solid\",\"paths\":[\"M22.5 9.75H21.49L18.88 3.89A1.5 1.5 0 0 0 17.51 3H6.49a1.5 1.5 0 0 0-1.37 .89L2.51 9.75H1.5a.75 .75 0 0 0 0 1.5h.75v7.5a1.5 1.5 0 0 0 1.5 1.5H6a1.5 1.5 0 0 0 1.5-1.5v-.75h9v.75a1.5 1.5 0 0 0 1.5 1.5h2.25a1.5 1.5 0 0 0 1.5-1.5V11.25h.75a.75 .75 0 0 0 0-1.5ZM7.5 14.25H5.25a.75 .75 0 0 1 0-1.5H7.5a.75 .75 0 0 1 0 1.5Zm11.25 0H16.5a.75 .75 0 0 1 0-1.5h2.25a.75 .75 0 0 1 0 1.5ZM4.15 9.75 6.49 4.5H17.51l2.33 5.25Z\"]},{\"id\":\"ph-airplane\",\"label\":\"Plane\",\"set\":\"solid\",\"paths\":[\"M22.5 12.75v3a.75 .75 0 0 1-.75 .75 .71 .71 0 0 1-.15-.01L14.63 15.09v2.22l1.66 1.65A.75 .75 0 0 1 16.5 19.5v2.25a.75 .75 0 0 1-1.03 .7l-3.47-1.39L8.53 22.45A.75 .75 0 0 1 7.5 21.75V19.5a.75 .75 0 0 1 .22-.53L9.38 17.31V15.09L2.4 16.49A.71 .71 0 0 1 2.25 16.5a.75 .75 0 0 1-.75-.75V12.75a.75 .75 0 0 1 .41-.67L9.38 8.35V4.13a2.63 2.63 0 0 1 5.25 0V8.35l7.46 3.73A.75 .75 0 0 1 22.5 12.75Z\"]},{\"id\":\"ph-shopping-cart\",\"label\":\"Cart\",\"set\":\"solid\",\"paths\":[\"M21.58 5.52A.75 .75 0 0 0 21 5.25H5.88L5.31 2.12A.75 .75 0 0 0 4.57 1.5H2.25a.75 .75 0 0 0 0 1.5h1.69L6.33 16.15a2.25 2.25 0 0 0 .5 1.06 2.63 2.63 0 1 0 4.16 .79h4.26A2.6 2.6 0 0 0 15 19.13a2.63 2.63 0 1 0 2.63-2.62H8.55a.75 .75 0 0 1-.74-.62L7.51 14.25h10.88a2.25 2.25 0 0 0 2.21-1.85l1.14-6.27A.75 .75 0 0 0 21.58 5.52ZM9.75 19.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.75 19.13Zm9 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18.75 19.13Z\"]},{\"id\":\"ph-shopping-bag\",\"label\":\"Bag\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-8.25 9A4.5 4.5 0 0 1 7.5 8.25a.75 .75 0 0 1 1.5 0 3 3 0 0 0 6 0 .75 .75 0 0 1 1.5 0A4.5 4.5 0 0 1 12 12.75Z\"]},{\"id\":\"ph-shopping-bag-open\",\"label\":\"Open bag\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM12 15a4.5 4.5 0 0 1-4.5-4.5 .75 .75 0 0 1 1.5 0 3 3 0 0 0 6 0 .75 .75 0 0 1 1.5 0A4.5 4.5 0 0 1 12 15ZM3.75 6.75V5.25H20.25V6.75Z\"]},{\"id\":\"ph-storefront\",\"label\":\"Store\",\"set\":\"solid\",\"paths\":[\"M21.72 8.79 20.38 4.09A1.51 1.51 0 0 0 18.94 3H5.06A1.51 1.51 0 0 0 3.62 4.09L2.28 8.79A.74 .74 0 0 0 2.25 9v1.5a3.75 3.75 0 0 0 1.5 3v6.75a.75 .75 0 0 0 .75 .75H19.5a.75 .75 0 0 0 .75-.75V13.5a3.75 3.75 0 0 0 1.5-3V9A.74 .74 0 0 0 21.72 8.79ZM8.25 10.5a2.25 2.25 0 0 1-3.29 1.99 .74 .74 0 0 0-.17-.1A2.25 2.25 0 0 1 3.75 10.5v-.75H8.25Zm6 0a2.25 2.25 0 0 1-4.5 0v-.75h4.5Zm6 0a2.25 2.25 0 0 1-1.04 1.89 .76 .76 0 0 0-.17 .1A2.25 2.25 0 0 1 15.75 10.5v-.75h4.5Z\"]},{\"id\":\"ph-package\",\"label\":\"Package\",\"set\":\"solid\",\"paths\":[\"M20.97 6.2 12.72 1.69a1.49 1.49 0 0 0-1.44 0l-8.25 4.52a1.5 1.5 0 0 0-.78 1.31v8.97a1.5 1.5 0 0 0 .78 1.31l8.25 4.52a1.49 1.49 0 0 0 1.44 0l8.25-4.52a1.5 1.5 0 0 0 .78-1.31V7.52A1.5 1.5 0 0 0 20.97 6.2ZM12 3l7.53 4.13L16.74 8.65l-7.53-4.12Zm0 8.25L4.47 7.13 7.65 5.38l7.53 4.13Zm8.25 5.24h0l-7.5 4.11V12.55l3-1.64V14.25a.75 .75 0 0 0 1.5 0V10.08l3-1.64v8.04Z\"]},{\"id\":\"ph-truck\",\"label\":\"Delivery\",\"set\":\"solid\",\"paths\":[\"M23.95 10.97l-1.31-3.28A1.49 1.49 0 0 0 21.24 6.75H18V6a.75 .75 0 0 0-.75-.75H3A1.5 1.5 0 0 0 1.5 6.75V17.25a1.5 1.5 0 0 0 1.5 1.5H4.59a3 3 0 0 0 5.81 0h4.69a3 3 0 0 0 5.81 0h1.59a1.5 1.5 0 0 0 1.5-1.5V11.25A.76 .76 0 0 0 23.95 10.97ZM7.5 19.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 7.5 19.5ZM3 12.75V6.75H16.5v6Zm15 6.75a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 18 19.5Zm0-9V8.25h3.24l.9 2.25Z\"]},{\"id\":\"ph-credit-card\",\"label\":\"Card\",\"set\":\"solid\",\"paths\":[\"M21 4.5H3A1.5 1.5 0 0 0 1.5 6V18a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V6A1.5 1.5 0 0 0 21 4.5ZM12.75 16.5H11.25a.75 .75 0 0 1 0-1.5h1.5a.75 .75 0 0 1 0 1.5Zm6 0H15.75a.75 .75 0 0 1 0-1.5h3a.75 .75 0 0 1 0 1.5ZM3 8.25V6H21V8.25Z\"]},{\"id\":\"ph-wallet\",\"label\":\"Wallet\",\"set\":\"solid\",\"paths\":[\"M20.25 6H5.25a.75 .75 0 0 1 0-1.5H18a.75 .75 0 0 0 0-1.5H5.25A2.25 2.25 0 0 0 3 5.25V17.25a2.25 2.25 0 0 0 2.25 2.25H20.25a1.5 1.5 0 0 0 1.5-1.5V7.5A1.5 1.5 0 0 0 20.25 6Zm-3.37 7.5a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.88 13.5Z\"]},{\"id\":\"ph-money\",\"label\":\"Money\",\"set\":\"solid\",\"paths\":[\"M15.75 12a3.75 3.75 0 1 1-3.75-3.75A3.75 3.75 0 0 1 15.75 12Zm7.5-6V18a.75 .75 0 0 1-.75 .75H1.5a.75 .75 0 0 1-.75-.75V6a.75 .75 0 0 1 .75-.75H22.5A.75 .75 0 0 1 23.25 6Zm-1.5 4.35A5.32 5.32 0 0 1 18.15 6.75H5.85A5.32 5.32 0 0 1 2.25 10.35v3.31A5.32 5.32 0 0 1 5.85 17.25h12.31A5.32 5.32 0 0 1 21.75 13.65Z\"]},{\"id\":\"ph-coins\",\"label\":\"Coins\",\"set\":\"solid\",\"paths\":[\"M17.25 8.4V7.88c0-2.35-3.55-4.12-8.25-4.12S.75 5.52 .75 7.88v3.75c0 1.96 2.46 3.51 6 3.98V16.13c0 2.35 3.55 4.13 8.25 4.13s8.25-1.77 8.25-4.12V12.38C23.25 10.43 20.87 8.88 17.25 8.4ZM5.25 13.77C3.41 13.26 2.25 12.41 2.25 11.63V10.31c.77 .54 1.79 .98 3 1.27Zm7.5-2.19c1.21-.29 2.24-.73 3-1.27V11.63c0 .79-1.16 1.63-3 2.14Zm-1.5 6.69C9.41 17.76 8.25 16.91 8.25 16.13v-.39c.25 .01 .5 .02 .75 .02 .36 0 .72-.01 1.07-.03A11.43 11.43 0 0 0 11.25 16.07Zm0-4.18A15.28 15.28 0 0 1 9 14.25a15.28 15.28 0 0 1-2.25-.16V11.86A17.23 17.23 0 0 0 9 12a17.23 17.23 0 0 0 2.25-.14Zm6 4.5a15.51 15.51 0 0 1-4.5 0V16.35a16.83 16.83 0 0 0 2.25 .15 17.23 17.23 0 0 0 2.25-.14ZM21.75 16.13c0 .79-1.16 1.63-3 2.14V16.08c1.21-.29 2.24-.73 3-1.27Z\"]},{\"id\":\"ph-piggy-bank\",\"label\":\"Piggy bank\",\"set\":\"solid\",\"paths\":[\"M21.19 8.26c-.04-.09-.08-.19-.12-.28a8.24 8.24 0 0 0-2.83-3.47H20.25a.75 .75 0 0 0 0-1.5H10.5a8.26 8.26 0 0 0-8.22 7.59A3 3 0 0 0 0 13.5a.75 .75 0 0 0 1.5 0 1.5 1.5 0 0 1 .8-1.33A8.22 8.22 0 0 0 4.31 16.71l1.18 3.3A1.5 1.5 0 0 0 6.9 21H8.1a1.5 1.5 0 0 0 1.41-1l.18-.5h5.37l.18 .5A1.5 1.5 0 0 0 16.65 21h1.19a1.5 1.5 0 0 0 1.41-1L20.78 15.75H21a2.25 2.25 0 0 0 2.25-2.25V10.5A2.25 2.25 0 0 0 21.19 8.26ZM14.25 6.75H10.5a.75 .75 0 0 1 0-1.5h3.75a.75 .75 0 0 1 0 1.5Zm2.63 5.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.88 12Z\"]},{\"id\":\"ph-hand-coins\",\"label\":\"Pay\",\"set\":\"solid\",\"paths\":[\"M12.01 5.38a3.38 3.38 0 0 1 5.17-2.61 .38 .38 0 0 1-.05 .66A4.88 4.88 0 0 0 14.25 7.88c0 .11 0 .22 .01 .33a.38 .38 0 0 1-.56 .35A3.38 3.38 0 0 1 12.01 5.38ZM22.5 15.06a2.29 2.29 0 0 1-1.27 2.06l-.04 .02-3.64 1.55a.65 .65 0 0 1-.11 .04l-6 1.5A.74 .74 0 0 1 11.25 20.25H1.5A1.5 1.5 0 0 1 0 18.75V15a1.5 1.5 0 0 1 1.5-1.5H4.19l2.12-2.12A2.98 2.98 0 0 1 8.43 10.5H13.13a2.63 2.63 0 0 1 2.55 3.23l3.92-.9A2.31 2.31 0 0 1 22.5 15.06Zm-1.5 0a.81 .81 0 0 0-1.02-.78l-.03 .01-6.28 1.44a.78 .78 0 0 1-.17 .02H10.5a.75 .75 0 0 1 0-1.5h2.63a1.13 1.13 0 0 0 0-2.25H8.43a1.49 1.49 0 0 0-1.06 .44L5.25 14.56V18.75h5.91l5.85-1.46 3.56-1.52A.8 .8 0 0 0 21 15.06ZM15.75 7.88a3.38 3.38 0 1 0 3.38-3.37A3.38 3.38 0 0 0 15.75 7.88Z\"]},{\"id\":\"ph-receipt\",\"label\":\"Receipt\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V19.5a.75 .75 0 0 0 1.09 .67L6 18.84l2.66 1.33a.75 .75 0 0 0 .67 0L12 18.84l2.66 1.33a.75 .75 0 0 0 .67 0L18 18.84l2.66 1.33A.75 .75 0 0 0 21.75 19.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM16.5 13.5H7.5a.75 .75 0 0 1 0-1.5h9a.75 .75 0 0 1 0 1.5Zm0-3H7.5a.75 .75 0 0 1 0-1.5h9a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-currency-dollar\",\"label\":\"Dollar\",\"set\":\"solid\",\"paths\":[\"M15 14.25a1.5 1.5 0 0 1-1.5 1.5h-.75V12.75h.75A1.5 1.5 0 0 1 15 14.25Zm6.75-2.25A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-5.25 2.25a3 3 0 0 0-3-3h-.75V8.25h.38a1.5 1.5 0 0 1 1.5 1.5 .75 .75 0 0 0 1.5 0 3 3 0 0 0-3-3h-.37V6a.75 .75 0 0 0-1.5 0v.75h-.37a3 3 0 0 0 0 6h.38v3h-.75a1.5 1.5 0 0 1-1.5-1.5 .75 .75 0 0 0-1.5 0 3 3 0 0 0 3 3h.75v.75a.75 .75 0 0 0 1.5 0v-.75h.75A3 3 0 0 0 16.5 14.25Zm-7.12-4.5a1.5 1.5 0 0 0 1.5 1.5h.38V8.25h-.37A1.5 1.5 0 0 0 9.38 9.75Z\"]},{\"id\":\"ph-currency-eur\",\"label\":\"Euro\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 7.5a.75 .75 0 0 1 0 1.5H8.25v1.5h2.25a.75 .75 0 0 1 0 1.5H8.33a3.75 3.75 0 0 0 6.17 2.05 .75 .75 0 1 1 1 1.12A5.25 5.25 0 0 1 6.8 14.25H6a.75 .75 0 0 1 0-1.5h.75V11.25H6a.75 .75 0 0 1 0-1.5h.8a5.25 5.25 0 0 1 8.7-3.16 .75 .75 0 1 1-1 1.12A3.75 3.75 0 0 0 8.33 9.75Z\"]},{\"id\":\"ph-currency-btc\",\"label\":\"Bitcoin\",\"set\":\"solid\",\"paths\":[\"M16.5 14.25a1.5 1.5 0 0 1-1.5 1.5H10.5V12.75h4.5A1.5 1.5 0 0 1 16.5 14.25Zm6-2.25A9.75 9.75 0 1 1 12.75 2.25 9.76 9.76 0 0 1 22.5 12Zm-4.5 2.25a3 3 0 0 0-1.45-2.57A3 3 0 0 0 15 6.84V6a.75 .75 0 0 0-1.5 0v.75H12V6a.75 .75 0 0 0-1.5 0v.75H9a.75 .75 0 0 0 0 1.5v7.5a.75 .75 0 0 0 0 1.5h1.5v.75a.75 .75 0 0 0 1.5 0v-.75h1.5v.75a.75 .75 0 0 0 1.5 0v-.75A3 3 0 0 0 18 14.25Zm-2.25-4.5a1.5 1.5 0 0 0-1.5-1.5H10.5v3h3.75A1.5 1.5 0 0 0 15.75 9.75Z\"]},{\"id\":\"ph-bank\",\"label\":\"Bank\",\"set\":\"solid\",\"paths\":[\"M23.25 19.5a.75 .75 0 0 1-.75 .75H1.5a.75 .75 0 0 1 0-1.5H22.5A.75 .75 0 0 1 23.25 19.5ZM1.53 9.2a.75 .75 0 0 1 .33-.84l9.75-6a.75 .75 0 0 1 .79 0l9.75 6A.75 .75 0 0 1 21.75 9.75H19.5v6h1.5a.75 .75 0 0 1 0 1.5H3a.75 .75 0 0 1 0-1.5H4.5V9.75H2.25A.75 .75 0 0 1 1.53 9.2ZM13.5 15a.75 .75 0 0 0 1.5 0V10.5a.75 .75 0 0 0-1.5 0Zm-4.5 0a.75 .75 0 0 0 1.5 0V10.5a.75 .75 0 0 0-1.5 0Z\"]},{\"id\":\"ph-vault\",\"label\":\"Vault\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18a1.5 1.5 0 0 0 1.5 1.5H5.25v1.5a.75 .75 0 0 0 1.5 0V19.5H17.25v1.5a.75 .75 0 0 0 1.5 0V19.5h1.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-.75 9H16.79a3.38 3.38 0 1 1 0-1.5H19.5a.75 .75 0 0 1 0 1.5Zm-4.12-.75a1.88 1.88 0 1 1-1.87-1.87A1.88 1.88 0 0 1 15.38 12Z\"]},{\"id\":\"ph-calculator\",\"label\":\"Calculator\",\"set\":\"solid\",\"paths\":[\"M18.75 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V3.75A1.5 1.5 0 0 0 18.75 2.25ZM8.25 18.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 8.25 18.75Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 8.25 15Zm3.75 3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 18.75Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 15Zm3.75 3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.75 18.75Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.75 15Zm1.5-5.25a.75 .75 0 0 1-.75 .75H7.5a.75 .75 0 0 1-.75-.75V6a.75 .75 0 0 1 .75-.75h9a.75 .75 0 0 1 .75 .75Z\"]},{\"id\":\"ph-seal-check\",\"label\":\"Badge\",\"set\":\"solid\",\"paths\":[\"M21.17 9.64c-.35-.37-.72-.75-.86-1.08-.13-.31-.13-.81-.14-1.31-.01-.91-.03-1.95-.75-2.67s-1.76-.74-2.67-.75c-.49-.01-1-.01-1.31-.14-.33-.14-.72-.5-1.08-.86C13.71 2.2 12.98 1.5 12 1.5s-1.71 .7-2.36 1.33c-.37 .35-.75 .72-1.08 .86C8.25 3.81 7.74 3.82 7.25 3.83c-.91 .01-1.95 .03-2.67 .75S3.84 6.33 3.83 7.25c-.01 .49-.01 1-.14 1.31-.14 .33-.5 .72-.86 1.08C2.2 10.29 1.5 11.02 1.5 12s.7 1.71 1.33 2.36c.35 .37 .72 .75 .86 1.08 .13 .31 .14 .81 .14 1.31 .01 .92 .03 1.95 .75 2.67s1.76 .74 2.67 .75c.49 .01 1 .02 1.31 .14 .33 .14 .72 .5 1.08 .86C10.29 21.8 11.02 22.5 12 22.5s1.71-.7 2.36-1.33c.37-.35 .75-.72 1.08-.86 .31-.13 .81-.13 1.31-.14 .92-.01 1.95-.03 2.67-.75s.74-1.76 .75-2.67c.01-.49 .02-1 .14-1.31 .14-.33 .5-.72 .86-1.08C21.8 13.71 22.5 12.98 22.5 12S21.8 10.29 21.17 9.64Zm-4.89 .64-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-seal-percent\",\"label\":\"Sale\",\"set\":\"solid\",\"paths\":[\"M9 9.75a.75 .75 0 1 1 .75-.75A.75 .75 0 0 1 9 9.75Zm6 4.5a.75 .75 0 1 0 .75 .75A.75 .75 0 0 0 15 14.25Zm7.5-2.25c0 .98-.7 1.71-1.33 2.36-.35 .37-.72 .75-.86 1.08-.13 .31-.13 .81-.14 1.31-.01 .92-.03 1.95-.75 2.67s-1.76 .74-2.67 .75c-.49 .01-1 .02-1.31 .14-.33 .14-.72 .5-1.08 .86C13.71 21.8 12.98 22.5 12 22.5s-1.71-.7-2.36-1.33c-.37-.35-.75-.72-1.08-.86-.31-.13-.81-.13-1.31-.14-.91-.01-1.95-.03-2.67-.75s-.74-1.76-.75-2.67c-.01-.49-.01-1-.14-1.31-.14-.33-.5-.72-.86-1.08C2.2 13.71 1.5 12.98 1.5 12s.7-1.71 1.33-2.36c.35-.37 .72-.75 .86-1.08 .13-.31 .14-.81 .14-1.31 .01-.91 .03-1.95 .75-2.67s1.76-.74 2.67-.75c.49-.01 1-.01 1.31-.14 .33-.14 .72-.5 1.08-.86C10.29 2.2 11.02 1.5 12 1.5s1.71 .7 2.36 1.33c.37 .35 .75 .72 1.08 .86 .31 .13 .81 .14 1.31 .14 .92 .01 1.95 .03 2.67 .75s.74 1.76 .75 2.67c.01 .49 .02 1 .14 1.31 .14 .33 .5 .72 .86 1.08C21.8 10.29 22.5 11.02 22.5 12ZM9 11.25A2.25 2.25 0 1 0 6.75 9 2.25 2.25 0 0 0 9 11.25Zm7.28-2.47a.75 .75 0 0 0-1.06-1.06l-7.5 7.5a.75 .75 0 0 0 1.06 1.06ZM17.25 15a2.25 2.25 0 1 0-2.25 2.25A2.25 2.25 0 0 0 17.25 15Z\"]},{\"id\":\"ph-seal-warning\",\"label\":\"Notice\",\"set\":\"solid\",\"paths\":[\"M21.17 9.64c-.35-.37-.72-.75-.86-1.08-.13-.31-.13-.81-.14-1.31-.01-.91-.03-1.95-.75-2.67s-1.76-.74-2.67-.75c-.49-.01-1-.01-1.31-.14-.33-.14-.72-.5-1.08-.86C13.71 2.2 12.98 1.5 12 1.5s-1.71 .7-2.36 1.33c-.37 .35-.75 .72-1.08 .86C8.25 3.81 7.74 3.82 7.25 3.83c-.91 .01-1.95 .03-2.67 .75S3.84 6.33 3.83 7.25c-.01 .49-.01 1-.14 1.31-.14 .33-.5 .72-.86 1.08C2.2 10.29 1.5 11.02 1.5 12s.7 1.71 1.33 2.36c.35 .37 .72 .75 .86 1.08 .13 .31 .14 .81 .14 1.31 .01 .92 .03 1.95 .75 2.67s1.76 .74 2.67 .75c.49 .01 1 .02 1.31 .14 .33 .14 .72 .5 1.08 .86C10.29 21.8 11.02 22.5 12 22.5s1.71-.7 2.36-1.33c.37-.35 .75-.72 1.08-.86 .31-.13 .81-.13 1.31-.14 .92-.01 1.95-.03 2.67-.75s.74-1.76 .75-2.67c.01-.49 .02-1 .14-1.31 .14-.33 .5-.72 .86-1.08C21.8 13.71 22.5 12.98 22.5 12S21.8 10.29 21.17 9.64ZM11.25 7.5a.75 .75 0 0 1 1.5 0v5.25a.75 .75 0 0 1-1.5 0Zm.75 9.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 17.25Z\"]},{\"id\":\"ph-arrow-right\",\"label\":\"Arrow right\",\"set\":\"solid\",\"paths\":[\"M20.78 12.53l-6.75 6.75A.75 .75 0 0 1 12.75 18.75V12.75H3.75a.75 .75 0 0 1 0-1.5h9V5.25a.75 .75 0 0 1 1.28-.53l6.75 6.75A.75 .75 0 0 1 20.78 12.53Z\"]},{\"id\":\"ph-arrow-left\",\"label\":\"Arrow left\",\"set\":\"solid\",\"paths\":[\"M21 12a.75 .75 0 0 1-.75 .75H11.25v6a.75 .75 0 0 1-1.28 .53l-6.75-6.75a.75 .75 0 0 1 0-1.06l6.75-6.75A.75 .75 0 0 1 11.25 5.25v6h9A.75 .75 0 0 1 21 12Z\"]},{\"id\":\"ph-arrow-up\",\"label\":\"Arrow up\",\"set\":\"solid\",\"paths\":[\"M19.44 10.79A.75 .75 0 0 1 18.75 11.25H12.75v9a.75 .75 0 0 1-1.5 0V11.25H5.25a.75 .75 0 0 1-.53-1.28l6.75-6.75a.75 .75 0 0 1 1.06 0l6.75 6.75A.75 .75 0 0 1 19.44 10.79Z\"]},{\"id\":\"ph-arrow-down\",\"label\":\"Arrow down\",\"set\":\"solid\",\"paths\":[\"M19.28 14.03l-6.75 6.75a.75 .75 0 0 1-1.06 0l-6.75-6.75A.75 .75 0 0 1 5.25 12.75h6V3.75a.75 .75 0 0 1 1.5 0v9h6a.75 .75 0 0 1 .53 1.28Z\"]},{\"id\":\"ph-arrow-up-right\",\"label\":\"Arrow up right\",\"set\":\"solid\",\"paths\":[\"M18.75 6V15.75a.75 .75 0 0 1-1.28 .53L13.13 11.94 6.53 18.53a.75 .75 0 0 1-1.06-1.06L12.06 10.88 7.72 6.53A.75 .75 0 0 1 8.25 5.25H18A.75 .75 0 0 1 18.75 6Z\"]},{\"id\":\"ph-arrow-down-right\",\"label\":\"Arrow down right\",\"set\":\"solid\",\"paths\":[\"M18.75 8.25V18a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1-.53-1.28L12.06 13.13 5.47 6.53A.75 .75 0 0 1 6.53 5.47L13.13 12.06l4.34-4.35A.75 .75 0 0 1 18.75 8.25Z\"]},{\"id\":\"ph-arrow-up-left\",\"label\":\"Arrow up left\",\"set\":\"solid\",\"paths\":[\"M18.53 18.53a.75 .75 0 0 1-1.06 0L10.88 11.94 6.53 16.28A.75 .75 0 0 1 5.25 15.75V6a.75 .75 0 0 1 .75-.75H15.75a.75 .75 0 0 1 .53 1.28L11.94 10.88l6.6 6.59A.75 .75 0 0 1 18.53 18.53Z\"]},{\"id\":\"ph-arrow-down-left\",\"label\":\"Arrow down left\",\"set\":\"solid\",\"paths\":[\"M18.53 6.53 11.94 13.13l4.35 4.34A.75 .75 0 0 1 15.75 18.75H6a.75 .75 0 0 1-.75-.75V8.25a.75 .75 0 0 1 1.28-.53L10.88 12.06l6.59-6.6a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-arrow-circle-right\",\"label\":\"Circle arrow right\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm4.28 10.28-3 3a.75 .75 0 0 1-1.06-1.06L13.94 12.75H8.25a.75 .75 0 0 1 0-1.5h5.69l-1.72-1.72a.75 .75 0 0 1 1.06-1.06l3 3A.75 .75 0 0 1 16.28 12.53Z\"]},{\"id\":\"ph-arrow-circle-left\",\"label\":\"Circle arrow left\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.75 10.5H10.06l1.72 1.72a.75 .75 0 0 1-1.06 1.06l-3-3a.75 .75 0 0 1 0-1.06l3-3a.75 .75 0 0 1 1.06 1.06L10.06 11.25H15.75a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-arrow-circle-up\",\"label\":\"Circle arrow up\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.53 9.53a.75 .75 0 0 1-1.06 0L12.75 10.06V15.75a.75 .75 0 0 1-1.5 0V10.06l-1.72 1.72a.75 .75 0 0 1-1.06-1.06l3-3a.75 .75 0 0 1 1.06 0l3 3A.75 .75 0 0 1 15.53 11.78Z\"]},{\"id\":\"ph-arrow-circle-down\",\"label\":\"Circle arrow down\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.53 11.03-3 3a.75 .75 0 0 1-1.06 0l-3-3a.75 .75 0 0 1 1.06-1.06L11.25 13.94V8.25a.75 .75 0 0 1 1.5 0v5.69l1.72-1.72a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-arrow-fat-right\",\"label\":\"Fat arrow right\",\"set\":\"solid\",\"paths\":[\"M22.28 12.53l-9 9A.75 .75 0 0 1 12 21V17.25H4.5a1.5 1.5 0 0 1-1.5-1.5V8.25A1.5 1.5 0 0 1 4.5 6.75h7.5V3a.75 .75 0 0 1 1.28-.53l9 9A.75 .75 0 0 1 22.28 12.53Z\"]},{\"id\":\"ph-arrow-fat-left\",\"label\":\"Fat arrow left\",\"set\":\"solid\",\"paths\":[\"M21 8.25v7.5a1.5 1.5 0 0 1-1.5 1.5H12v3.75a.75 .75 0 0 1-1.28 .53l-9-9a.75 .75 0 0 1 0-1.06l9-9A.75 .75 0 0 1 12 3V6.75h7.5A1.5 1.5 0 0 1 21 8.25Z\"]},{\"id\":\"ph-arrow-fat-up\",\"label\":\"Fat arrow up\",\"set\":\"solid\",\"paths\":[\"M21.69 11.54A.75 .75 0 0 1 21 12H17.25v7.5a1.5 1.5 0 0 1-1.5 1.5H8.25a1.5 1.5 0 0 1-1.5-1.5V12H3a.75 .75 0 0 1-.53-1.28l9-9a.75 .75 0 0 1 1.06 0l9 9A.75 .75 0 0 1 21.69 11.54Z\"]},{\"id\":\"ph-arrow-fat-down\",\"label\":\"Fat arrow down\",\"set\":\"solid\",\"paths\":[\"M21.53 13.28l-9 9a.75 .75 0 0 1-1.06 0l-9-9A.75 .75 0 0 1 3 12H6.75V4.5A1.5 1.5 0 0 1 8.25 3h7.5a1.5 1.5 0 0 1 1.5 1.5v7.5h3.75a.75 .75 0 0 1 .53 1.28Z\"]},{\"id\":\"ph-arrow-fat-lines-right\",\"label\":\"Fast arrow\",\"set\":\"solid\",\"paths\":[\"M4.5 7.5v9a.75 .75 0 0 1-1.5 0V7.5a.75 .75 0 0 1 1.5 0Zm2.25-.75a.75 .75 0 0 0-.75 .75v9a.75 .75 0 0 0 1.5 0V7.5A.75 .75 0 0 0 6.75 6.75Zm15.53 4.72-9-9A.75 .75 0 0 0 12 3V6.75H9.75a.75 .75 0 0 0-.75 .75v9a.75 .75 0 0 0 .75 .75h2.25v3.75a.75 .75 0 0 0 1.28 .53l9-9A.75 .75 0 0 0 22.28 11.47Z\"]},{\"id\":\"ph-arrow-bend-up-right\",\"label\":\"Bend right\",\"set\":\"solid\",\"paths\":[\"M21.53 10.28l-4.5 4.5A.75 .75 0 0 1 15.75 14.25V10.5H12a8.26 8.26 0 0 0-8.25 8.25 .75 .75 0 0 1-1.5 0A9.76 9.76 0 0 1 12 9h3.75V5.25a.75 .75 0 0 1 1.28-.53l4.5 4.5A.75 .75 0 0 1 21.53 10.28Z\"]},{\"id\":\"ph-arrow-bend-down-right\",\"label\":\"Bend down\",\"set\":\"solid\",\"paths\":[\"M21.53 14.78l-4.5 4.5A.75 .75 0 0 1 15.75 18.75V15H12A9.76 9.76 0 0 1 2.25 5.25a.75 .75 0 0 1 1.5 0 8.26 8.26 0 0 0 8.25 8.25h3.75V9.75a.75 .75 0 0 1 1.28-.53l4.5 4.5A.75 .75 0 0 1 21.53 14.78Z\"]},{\"id\":\"ph-arrow-u-up-left\",\"label\":\"U-turn left\",\"set\":\"solid\",\"paths\":[\"M21.75 13.5a6.01 6.01 0 0 1-6 6H7.5a.75 .75 0 0 1 0-1.5h8.25a4.5 4.5 0 0 0 0-9H8.25v3.75a.75 .75 0 0 1-1.28 .53l-4.5-4.5a.75 .75 0 0 1 0-1.06l4.5-4.5A.75 .75 0 0 1 8.25 3.75V7.5h7.5A6.01 6.01 0 0 1 21.75 13.5Z\"]},{\"id\":\"ph-arrow-u-up-right\",\"label\":\"U-turn right\",\"set\":\"solid\",\"paths\":[\"M15.75 12.75V9H8.25a4.5 4.5 0 0 0 0 9h8.25a.75 .75 0 0 1 0 1.5H8.25A6 6 0 0 1 8.25 7.5h7.5V3.75a.75 .75 0 0 1 1.28-.53l4.5 4.5a.75 .75 0 0 1 0 1.06l-4.5 4.5A.75 .75 0 0 1 15.75 12.75Z\"]},{\"id\":\"ph-arrow-elbow-down-right\",\"label\":\"Elbow arrow\",\"set\":\"solid\",\"paths\":[\"M20.78 17.03l-4.5 4.5A.75 .75 0 0 1 15 21V17.25H6.75a.75 .75 0 0 1-.75-.75V3a.75 .75 0 0 1 1.5 0V15.75h7.5V12a.75 .75 0 0 1 1.28-.53l4.5 4.5A.75 .75 0 0 1 20.78 17.03Z\"]},{\"id\":\"ph-arrow-square-out\",\"label\":\"Open in new\",\"set\":\"solid\",\"paths\":[\"M18 12.75v6.75a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V7.5A1.5 1.5 0 0 1 4.5 6h6.75a.75 .75 0 0 1 0 1.5H4.5V19.5H16.5V12.75a.75 .75 0 0 1 1.5 0Zm3-9a.75 .75 0 0 0-.75-.75H14.25a.75 .75 0 0 0-.53 1.28L16.19 6.75l-3.97 3.97a.75 .75 0 0 0 1.06 1.06L17.25 7.81l2.47 2.47A.75 .75 0 0 0 21 9.75Z\"]},{\"id\":\"ph-arrow-line-right\",\"label\":\"Arrow to line\",\"set\":\"solid\",\"paths\":[\"M21 3.75V20.25a.75 .75 0 0 1-1.5 0V3.75a.75 .75 0 0 1 1.5 0ZM11.03 4.72A.75 .75 0 0 0 9.75 5.25v6H3a.75 .75 0 0 0 0 1.5h6.75v6a.75 .75 0 0 0 1.28 .53l6.75-6.75a.75 .75 0 0 0 0-1.06Z\"]},{\"id\":\"ph-arrow-line-down\",\"label\":\"Arrow down to line\",\"set\":\"solid\",\"paths\":[\"M4.72 11.03A.75 .75 0 0 1 5.25 9.75h6V3a.75 .75 0 0 1 1.5 0v6.75h6a.75 .75 0 0 1 .53 1.28l-6.75 6.75a.75 .75 0 0 1-1.06 0ZM20.25 19.5H3.75a.75 .75 0 0 0 0 1.5H20.25a.75 .75 0 0 0 0-1.5Z\"]},{\"id\":\"ph-arrows-left-right\",\"label\":\"Arrows left right\",\"set\":\"solid\",\"paths\":[\"M3.97 8.03a.75 .75 0 0 1 0-1.06l3-3A.75 .75 0 0 1 8.25 4.5V6.75H19.5a.75 .75 0 0 1 0 1.5H8.25v2.25a.75 .75 0 0 1-1.28 .53Zm16.06 7.94-3-3A.75 .75 0 0 0 15.75 13.5v2.25H4.5a.75 .75 0 0 0 0 1.5H15.75v2.25a.75 .75 0 0 0 1.28 .53l3-3A.75 .75 0 0 0 20.03 15.97Z\"]},{\"id\":\"ph-arrows-down-up\",\"label\":\"Arrows up down\",\"set\":\"solid\",\"paths\":[\"M11.19 16.21a.75 .75 0 0 1-.16 .82l-3 3a.75 .75 0 0 1-1.06 0l-3-3A.75 .75 0 0 1 4.5 15.75H6.75V4.5a.75 .75 0 0 1 1.5 0V15.75h2.25A.75 .75 0 0 1 11.19 16.21Zm8.84-9.24-3-3a.75 .75 0 0 0-1.06 0l-3 3A.75 .75 0 0 0 13.5 8.25h2.25V19.5a.75 .75 0 0 0 1.5 0V8.25h2.25a.75 .75 0 0 0 .53-1.28Z\"]},{\"id\":\"ph-arrows-out-cardinal\",\"label\":\"Move\",\"set\":\"solid\",\"paths\":[\"M9 12.75H6v2.25a.75 .75 0 0 1-1.28 .53l-3-3a.75 .75 0 0 1 0-1.06l3-3A.75 .75 0 0 1 6 9v2.25H9a.75 .75 0 0 1 0 1.5Zm0-6.75h2.25V9a.75 .75 0 0 0 1.5 0V6h2.25a.75 .75 0 0 0 .53-1.28l-3-3a.75 .75 0 0 0-1.06 0l-3 3A.75 .75 0 0 0 9 6Zm13.28 5.47-3-3A.75 .75 0 0 0 18 9v2.25H15a.75 .75 0 0 0 0 1.5h3v2.25a.75 .75 0 0 0 1.28 .53l3-3A.75 .75 0 0 0 22.28 11.47ZM15 18H12.75V15a.75 .75 0 0 0-1.5 0v3H9a.75 .75 0 0 0-.53 1.28l3 3a.75 .75 0 0 0 1.06 0l3-3A.75 .75 0 0 0 15 18Z\"]},{\"id\":\"ph-arrows-in\",\"label\":\"Collapse\",\"set\":\"solid\",\"paths\":[\"M13.5 9.75V6a.75 .75 0 0 1 1.28-.53L16.13 6.81l2.84-2.85a.75 .75 0 0 1 1.06 1.06L17.19 7.88l1.35 1.34A.75 .75 0 0 1 18 10.5H14.25A.75 .75 0 0 1 13.5 9.75Zm-3.75 3.75H6a.75 .75 0 0 0-.53 1.28L6.81 16.13 3.97 18.97a.75 .75 0 0 0 1.06 1.06L7.88 17.19l1.34 1.35A.75 .75 0 0 0 10.5 18V14.25A.75 .75 0 0 0 9.75 13.5Zm.29-8.19a.75 .75 0 0 0-.82 .16L7.88 6.81 5.03 3.97A.75 .75 0 0 0 3.97 5.03L6.81 7.88 5.47 9.22A.75 .75 0 0 0 6 10.5h3.75a.75 .75 0 0 0 .75-.75V6A.75 .75 0 0 0 10.04 5.31ZM17.19 16.13l1.35-1.34A.75 .75 0 0 0 18 13.5H14.25a.75 .75 0 0 0-.75 .75v3.75a.75 .75 0 0 0 1.28 .53L16.13 17.19l2.84 2.85a.75 .75 0 0 0 1.06-1.06Z\"]},{\"id\":\"ph-arrows-out\",\"label\":\"Expand\",\"set\":\"solid\",\"paths\":[\"M10.28 13.72a.75 .75 0 0 1 0 1.06L7.81 17.25l1.72 1.72A.75 .75 0 0 1 9 20.25H4.5a.75 .75 0 0 1-.75-.75V15a.75 .75 0 0 1 1.28-.53L6.75 16.19l2.47-2.47A.75 .75 0 0 1 10.28 13.72ZM7.81 6.75l1.72-1.72A.75 .75 0 0 0 9 3.75H4.5a.75 .75 0 0 0-.75 .75V9a.75 .75 0 0 0 1.28 .53L6.75 7.81l2.47 2.47a.75 .75 0 0 0 1.06-1.06ZM19.5 3.75H15a.75 .75 0 0 0-.53 1.28L16.19 6.75 13.72 9.22a.75 .75 0 0 0 1.06 1.06L17.25 7.81l1.72 1.72A.75 .75 0 0 0 20.25 9V4.5A.75 .75 0 0 0 19.5 3.75Zm.29 10.56a.75 .75 0 0 0-.82 .16L17.25 16.19l-2.47-2.47a.75 .75 0 0 0-1.06 1.06L16.19 17.25l-1.72 1.72A.75 .75 0 0 0 15 20.25h4.5a.75 .75 0 0 0 .75-.75V15A.75 .75 0 0 0 19.79 14.31Z\"]},{\"id\":\"ph-arrows-counter-clockwise\",\"label\":\"Undo\",\"set\":\"solid\",\"paths\":[\"M8.25 9.75H3.75a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 1.28-.53L6 5.69a8.95 8.95 0 0 1 6.19-2.51h.05a8.94 8.94 0 0 1 6.29 2.56 .75 .75 0 0 1-1.05 1.07 7.46 7.46 0 0 0-5.24-2.13h-.04A7.45 7.45 0 0 0 7.06 6.75L8.78 8.47A.75 .75 0 0 1 8.25 9.75Zm12 4.5H15.75a.75 .75 0 0 0-.53 1.28L16.94 17.25a7.45 7.45 0 0 1-5.13 2.07h-.04a7.46 7.46 0 0 1-5.24-2.13 .75 .75 0 1 0-1.05 1.07 8.94 8.94 0 0 0 6.29 2.56H11.81a8.95 8.95 0 0 0 6.19-2.51l1.72 1.72A.75 .75 0 0 0 21 19.5V15A.75 .75 0 0 0 20.25 14.25Z\"]},{\"id\":\"ph-caret-right\",\"label\":\"Caret right\",\"set\":\"solid\",\"paths\":[\"M17.03 12.53l-7.5 7.5A.75 .75 0 0 1 8.25 19.5V4.5a.75 .75 0 0 1 1.28-.53l7.5 7.5A.75 .75 0 0 1 17.03 12.53Z\"]},{\"id\":\"ph-caret-left\",\"label\":\"Caret left\",\"set\":\"solid\",\"paths\":[\"M15.75 4.5V19.5a.75 .75 0 0 1-1.28 .53l-7.5-7.5a.75 .75 0 0 1 0-1.06l7.5-7.5A.75 .75 0 0 1 15.75 4.5Z\"]},{\"id\":\"ph-caret-up\",\"label\":\"Caret up\",\"set\":\"solid\",\"paths\":[\"M20.19 15.29A.75 .75 0 0 1 19.5 15.75H4.5a.75 .75 0 0 1-.53-1.28l7.5-7.5a.75 .75 0 0 1 1.06 0l7.5 7.5A.75 .75 0 0 1 20.19 15.29Z\"]},{\"id\":\"ph-caret-down\",\"label\":\"Caret down\",\"set\":\"solid\",\"paths\":[\"M20.03 9.53l-7.5 7.5a.75 .75 0 0 1-1.06 0l-7.5-7.5A.75 .75 0 0 1 4.5 8.25H19.5a.75 .75 0 0 1 .53 1.28Z\"]},{\"id\":\"ph-caret-double-right\",\"label\":\"Next\",\"set\":\"solid\",\"paths\":[\"M20.78 12.53l-7.5 7.5A.75 .75 0 0 1 12 19.5V13.81L5.78 20.03A.75 .75 0 0 1 4.5 19.5V4.5a.75 .75 0 0 1 1.28-.53L12 10.19V4.5a.75 .75 0 0 1 1.28-.53l7.5 7.5A.75 .75 0 0 1 20.78 12.53Z\"]},{\"id\":\"ph-caret-double-left\",\"label\":\"Back\",\"set\":\"solid\",\"paths\":[\"M19.5 4.5V19.5a.75 .75 0 0 1-1.28 .53L12 13.81V19.5a.75 .75 0 0 1-1.28 .53l-7.5-7.5a.75 .75 0 0 1 0-1.06l7.5-7.5A.75 .75 0 0 1 12 4.5v5.69l6.22-6.22A.75 .75 0 0 1 19.5 4.5Z\"]},{\"id\":\"ph-caret-circle-right\",\"label\":\"Caret circle\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm2.78 10.28-3.75 3.75a.75 .75 0 0 1-1.06-1.06L13.19 12 9.97 8.78a.75 .75 0 0 1 1.06-1.06l3.75 3.75A.75 .75 0 0 1 14.78 12.53Z\"]},{\"id\":\"ph-caret-circle-double-right\",\"label\":\"Skip\",\"set\":\"solid\",\"paths\":[\"M18.9 5.1a9.75 9.75 0 1 0 0 13.8A9.77 9.77 0 0 0 18.9 5.1Zm-7.12 7.43-3 3a.75 .75 0 1 1-1.06-1.06L10.19 12 7.72 9.53A.75 .75 0 1 1 8.78 8.47l3 3A.75 .75 0 0 1 11.78 12.53Zm5.25 0-3 3a.75 .75 0 0 1-1.06-1.06L15.44 12l-2.47-2.47a.75 .75 0 1 1 1.06-1.06l3 3A.75 .75 0 0 1 17.03 12.53Z\"]},{\"id\":\"ph-cursor\",\"label\":\"Cursor\",\"set\":\"solid\",\"paths\":[\"M20.67 19.48 19.48 20.67a1.13 1.13 0 0 1-1.59 0l-5.3-5.3L10.78 20.07l-.01 .03A1.49 1.49 0 0 1 9.4 21l-.07 0a1.48 1.48 0 0 1-1.35-1.03L3.08 4.96A1.5 1.5 0 0 1 4.96 3.08L19.97 7.98a1.5 1.5 0 0 1 .13 2.79l-.03 .01-4.7 1.81 5.3 5.3A1.13 1.13 0 0 1 20.67 19.48Z\"]},{\"id\":\"ph-cursor-click\",\"label\":\"Click\",\"set\":\"solid\",\"paths\":[\"M20.67 17.89a1.13 1.13 0 0 1 0 1.59L19.48 20.67a1.13 1.13 0 0 1-1.59 0l-5.3-5.3L10.78 20.07c0 .01-.01 .02-.01 .03a1.48 1.48 0 0 1-1.37 .9l-.07 0a1.48 1.48 0 0 1-1.35-1.03L3.08 4.96A1.5 1.5 0 0 1 4.96 3.08L19.97 7.98a1.5 1.5 0 0 1 .13 2.79l-.03 .01-4.7 1.81ZM9 3a.75 .75 0 0 0 .75-.75V1.5a.75 .75 0 0 0-1.5 0v.75A.75 .75 0 0 0 9 3ZM1.5 9.75h.75a.75 .75 0 0 0 0-1.5H1.5a.75 .75 0 0 0 0 1.5ZM11.66 3.67a.75 .75 0 0 0 1.01-.34l.75-1.5a.75 .75 0 0 0-1.34-.67l-.75 1.5A.75 .75 0 0 0 11.66 3.67Zm-9 7.66-1.5 .75a.75 .75 0 0 0 .67 1.34l1.5-.75a.75 .75 0 1 0-.67-1.34Z\"]},{\"id\":\"ph-line-segment\",\"label\":\"Line\",\"set\":\"solid\",\"paths\":[\"M19.86 7.86a2.63 2.63 0 0 1-3.1 .45L8.31 16.75a2.63 2.63 0 1 1-4.17-.61h0a2.63 2.63 0 0 1 3.1-.45l8.44-8.44a2.63 2.63 0 1 1 4.17 .61Z\"]},{\"id\":\"ph-line-segments\",\"label\":\"Zigzag\",\"set\":\"solid\",\"paths\":[\"M22.11 7.11A2.62 2.62 0 0 1 20.25 7.88a2.67 2.67 0 0 1-.53-.05l-2.87 5.32 0 0a2.63 2.63 0 1 1-4.17 .61l-2.44-2.44A2.63 2.63 0 0 1 9 11.63a2.66 2.66 0 0 1-.53-.05L5.6 16.89l0 0a2.63 2.63 0 1 1-3.71 0h0a2.63 2.63 0 0 1 2.39-.71l2.87-5.32 0 0a2.63 2.63 0 0 1 0-3.71h0a2.63 2.63 0 0 1 4.17 3.1l2.44 2.44a2.63 2.63 0 0 1 1.78-.26l2.87-5.32 0 0a2.63 2.63 0 0 1 0-3.71h0a2.63 2.63 0 0 1 3.71 3.71Z\"]},{\"id\":\"ph-line-vertical\",\"label\":\"Vertical line\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM12.75 18a.75 .75 0 0 1-1.5 0V6a.75 .75 0 0 1 1.5 0Z\"]},{\"id\":\"ph-dots-three\",\"label\":\"Dots\",\"set\":\"solid\",\"paths\":[\"M21 7.5H3A1.5 1.5 0 0 0 1.5 9v6a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V9A1.5 1.5 0 0 0 21 7.5ZM5.63 13.13a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 5.63 13.13Zm6.38 0a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 13.13Zm6.38 0a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 18.38 13.13Z\"]},{\"id\":\"ph-dots-three-vertical\",\"label\":\"Dots vertical\",\"set\":\"solid\",\"paths\":[\"M15 1.5H9A1.5 1.5 0 0 0 7.5 3V21a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V3A1.5 1.5 0 0 0 15 1.5ZM12 19.5a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 19.5Zm0-6.37a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 13.13Zm0-6.37a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 6.75Z\"]},{\"id\":\"ph-dot-outline\",\"label\":\"Dot\",\"set\":\"solid\",\"paths\":[\"M14.63 12a2.63 2.63 0 1 1-2.62-2.62A2.63 2.63 0 0 1 14.63 12Z\"]},{\"id\":\"ph-wave-sine\",\"label\":\"Wave\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-.45 8.57c-1.56 3.28-2.91 4.74-4.37 4.74-1.84 0-2.94-2.3-4.11-4.74C10.5 10.59 9.47 8.44 8.57 8.44c-.35 0-1.35 .38-3.02 3.89a.75 .75 0 0 1-1.35-.64C5.76 8.4 7.11 6.94 8.57 6.94c1.85 0 2.94 2.3 4.11 4.74C13.5 13.41 14.53 15.56 15.43 15.56c.35 0 1.35-.37 3.02-3.88a.75 .75 0 1 1 1.35 .65Z\"]},{\"id\":\"ph-wave-square\",\"label\":\"Square wave\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-.75 12a.75 .75 0 0 1-.75 .75H12a.75 .75 0 0 1-.75-.75V9H6v3a.75 .75 0 0 1-1.5 0V8.25a.75 .75 0 0 1 .75-.75h6.75a.75 .75 0 0 1 .75 .75v6.75h5.25V12a.75 .75 0 0 1 1.5 0Z\"]},{\"id\":\"ph-wave-triangle\",\"label\":\"Triangle wave\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-.92 8.73-3.75 4.5A.75 .75 0 0 1 15 17.25h-.04a.75 .75 0 0 1-.58-.33l-5.44-8.16L5.83 12.48a.75 .75 0 0 1-1.15-.96l3.75-4.5a.75 .75 0 0 1 1.2 .06l5.44 8.16 3.11-3.73a.75 .75 0 1 1 1.15 .96Z\"]},{\"id\":\"ph-waves\",\"label\":\"Waves\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM18.49 16.58c-1.23 1.05-2.33 1.42-3.34 1.42-1.34 0-2.5-.65-3.51-1.22-1.73-.97-3.09-1.73-5.15 .03a.75 .75 0 1 1-.98-1.14c2.85-2.44 5.07-1.2 6.85-.2 1.73 .97 3.09 1.73 5.15-.03a.75 .75 0 0 1 .98 1.14Zm0-4.12c-1.23 1.05-2.33 1.42-3.34 1.42-1.34 0-2.5-.65-3.51-1.22-1.73-.97-3.09-1.73-5.15 .03a.75 .75 0 0 1-.98-1.14c2.85-2.44 5.07-1.2 6.85-.2 1.73 .97 3.09 1.73 5.15-.03a.75 .75 0 1 1 .98 1.14Zm0-4.12c-1.23 1.05-2.33 1.42-3.34 1.42-1.34 0-2.5-.65-3.51-1.22-1.73-.97-3.09-1.73-5.15 .03A.75 .75 0 0 1 5.51 7.42c2.85-2.44 5.07-1.2 6.85-.2 1.73 .97 3.09 1.73 5.15-.03a.75 .75 0 1 1 .98 1.14Z\"]},{\"id\":\"ph-equals\",\"label\":\"Equals\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM17.25 15H6.75a.75 .75 0 0 1 0-1.5H17.25a.75 .75 0 0 1 0 1.5Zm0-4.5H6.75a.75 .75 0 0 1 0-1.5H17.25a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-divide\",\"label\":\"Divide\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM12 6a1.5 1.5 0 1 1-1.5 1.5A1.5 1.5 0 0 1 12 6Zm0 12a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 12 18Zm5.25-5.25H6.75a.75 .75 0 0 1 0-1.5H17.25a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-asterisk\",\"label\":\"Asterisk\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm5.57 12.1a.75 .75 0 0 1-.37 1.4 .74 .74 0 0 1-.37-.1L12.75 13.3V18a.75 .75 0 0 1-1.5 0V13.3L7.18 15.65A.75 .75 0 0 1 6.15 15.38a.75 .75 0 0 1 .27-1.02L10.5 12 6.43 9.65a.75 .75 0 0 1 .75-1.3L11.25 10.7V6a.75 .75 0 0 1 1.5 0v4.7l4.07-2.35a.75 .75 0 0 1 .75 1.3L13.5 12Z\"]},{\"id\":\"ph-infinity\",\"label\":\"Infinity\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM19.15 14.65a3.75 3.75 0 0 1-5.29 .02L9.12 10.44 9.09 10.41A2.25 2.25 0 1 0 9.09 13.59c.03-.03 .07-.07 .09-.1a.75 .75 0 1 1 1.13 .99c-.05 .06-.11 .12-.16 .17a3.75 3.75 0 1 1-.02-5.32l4.74 4.23 .03 .03A2.25 2.25 0 1 0 14.91 10.41c-.03 .03-.07 .07-.09 .1a.75 .75 0 0 1-1.12-.99c.05-.06 .11-.12 .16-.17a3.75 3.75 0 0 1 5.3 5.3Z\"]},{\"id\":\"ph-spiral\",\"label\":\"Spiral\",\"set\":\"solid\",\"paths\":[\"M23.25 13.5a.75 .75 0 0 1-1.5 0 9.01 9.01 0 0 0-9-9c-.13 0-.26 0-.39 .01A7.51 7.51 0 0 0 5.25 12a6.01 6.01 0 0 0 6 6 4.13 4.13 0 0 0 4.13-4.12 3 3 0 0 0-3-3 .75 .75 0 0 0 0 1.5 1.5 1.5 0 0 1 1.5 1.5 2.63 2.63 0 0 1-2.62 2.63 4.5 4.5 0 0 1-4.5-4.5 6.01 6.01 0 0 1 6-6 7.51 7.51 0 0 1 7.5 7.5 8.26 8.26 0 0 1-8.25 8.25 9.01 9.01 0 0 1-9-9A9.76 9.76 0 0 1 12.75 3 10.51 10.51 0 0 1 23.25 13.5Z\"]},{\"id\":\"ph-circle-notch\",\"label\":\"Loading\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 16.5A6.75 6.75 0 0 1 8.63 6.15a.75 .75 0 0 1 .75 1.3 5.25 5.25 0 1 0 5.25 0 .75 .75 0 0 1 .75-1.3A6.75 6.75 0 0 1 12 18.75Z\"]},{\"id\":\"ph-circles-three\",\"label\":\"Circles\",\"set\":\"solid\",\"paths\":[\"M12 11.25a4.13 4.13 0 1 1 4.13-4.12A4.13 4.13 0 0 1 12 11.25Zm5.63 .75a4.13 4.13 0 1 0 4.13 4.13A4.13 4.13 0 0 0 17.63 12ZM6.38 12a4.13 4.13 0 1 0 4.13 4.13A4.13 4.13 0 0 0 6.38 12Z\"]},{\"id\":\"ph-git-branch\",\"label\":\"Branch\",\"set\":\"solid\",\"paths\":[\"M21.75 6a3 3 0 1 0-3.75 2.91v1.59a.75 .75 0 0 1-.75 .75H9a2.24 2.24 0 0 0-.75 .13V8.91a3 3 0 1 0-1.5 0v6.19a3 3 0 1 0 1.5 0V13.5a.75 .75 0 0 1 .75-.75h8.25a2.25 2.25 0 0 0 2.25-2.25V8.91A3.01 3.01 0 0 0 21.75 6ZM6 6A1.5 1.5 0 1 1 7.5 7.5 1.5 1.5 0 0 1 6 6ZM9 18a1.5 1.5 0 1 1-1.5-1.5A1.5 1.5 0 0 1 9 18Z\"]},{\"id\":\"ph-flow-arrow\",\"label\":\"Flow\",\"set\":\"solid\",\"paths\":[\"M23.03 8.03l-3 3a.75 .75 0 0 1-1.06-1.06L20.69 8.25H19.5c-3.63 0-4.37 1.78-5.31 4.04C13.22 14.61 12.12 17.25 7.5 17.25H7.41a3 3 0 1 1 0-1.5h.09c3.63 0 4.37-1.78 5.31-4.04C13.78 9.39 14.88 6.75 19.5 6.75h1.19L18.97 5.03a.75 .75 0 0 1 1.06-1.06l3 3A.75 .75 0 0 1 23.03 8.03Z\"]},{\"id\":\"ph-path\",\"label\":\"Path\",\"set\":\"solid\",\"paths\":[\"M21.38 18.75a2.63 2.63 0 0 1-5.14 .75H6.75a4.5 4.5 0 0 1 0-9h9a2.25 2.25 0 0 0 0-4.5H6.75a.75 .75 0 0 1 0-1.5h9a3.75 3.75 0 0 1 0 7.5H6.75a3 3 0 0 0 0 6H16.23A2.63 2.63 0 0 1 21.38 18.75Z\"]},{\"id\":\"ph-numpad\",\"label\":\"Numpad\",\"set\":\"solid\",\"paths\":[\"M18.75 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V3.75A1.5 1.5 0 0 0 18.75 2.25ZM7.5 15.38a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.5 15.38Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.5 11.63Zm0-3.75A1.13 1.13 0 1 1 8.63 6.75 1.13 1.13 0 0 1 7.5 7.88Zm4.5 11.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 19.13Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 15.38Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 11.63Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 7.88Zm4.5 7.5a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.5 15.38Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.5 11.63Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.5 7.88Z\"]},{\"id\":\"ph-tree-palm-duo\",\"label\":\"Palm tree duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 5.51 12 9.75a6.14 6.14 0 0 1 1.67-4.24 5.52 5.52 0 0 1 8.08 0ZM16.55 9.2A6.02 6.02 0 0 0 12 9.8L20.79 16.5a5.91 5.91 0 0 0-.6-4.52A5.97 5.97 0 0 0 16.55 9.2Zm-6.22-3.7a5.52 5.52 0 0 0-8.08 0L12 9.75A6.14 6.14 0 0 0 10.33 5.51ZM7.45 9.2a5.97 5.97 0 0 0-3.64 2.78A5.91 5.91 0 0 0 3.21 16.5L12 9.8A6.02 6.02 0 0 0 7.45 9.2Z\",\"M22.29 4.99a6.27 6.27 0 0 0-9.16 0 6.77 6.77 0 0 0-1.13 1.59 6.77 6.77 0 0 0-1.12-1.59 6.27 6.27 0 0 0-9.16 0 .75 .75 0 0 0 .24 1.2L7.22 8.49a6.7 6.7 0 0 0-4.06 3.11 6.62 6.62 0 0 0-.67 5.09A.75 .75 0 0 0 3.66 17.1l7.59-5.78V21a.75 .75 0 0 0 1.5 0V11.31l7.59 5.78a.75 .75 0 0 0 1.18-.4 6.62 6.62 0 0 0-.67-5.09A6.7 6.7 0 0 0 16.78 8.49l5.27-2.29a.75 .75 0 0 0 .24-1.2ZM6.29 4.5a4.79 4.79 0 0 1 3.5 1.52 5.3 5.3 0 0 1 1.34 2.52L3.66 5.3A4.73 4.73 0 0 1 6.29 4.5ZM3.75 15.14a5.14 5.14 0 0 1 .7-2.78 5.21 5.21 0 0 1 3.19-2.43A5.3 5.3 0 0 1 9.01 9.75a5.23 5.23 0 0 1 1.52 .23ZM19.55 12.36A5.14 5.14 0 0 1 20.25 15.14l-6.78-5.17a5.28 5.28 0 0 1 6.08 2.38ZM12.88 8.55a5.3 5.3 0 0 1 1.34-2.52A4.79 4.79 0 0 1 17.71 4.5 4.73 4.73 0 0 1 20.34 5.3Z\"],\"faded\":[0]},{\"id\":\"ph-island-duo\",\"label\":\"Island duotone\",\"set\":\"duotone\",\"paths\":[\"M3 13.13a1.88 1.88 0 1 1 1.88 1.88A1.88 1.88 0 0 1 3 13.13Zm9 4.88c-6 0-9.75 3-9.75 3H21.75S18 18 12 18Z\",\"M22.34 21.47A.75 .75 0 0 1 21.28 21.59c-.03-.03-3.64-2.84-9.28-2.84S2.75 21.56 2.72 21.59a.75 .75 0 0 1-.94-1.17c.15-.12 3.61-2.84 9.21-3.14A11.24 11.24 0 0 1 10.69 13.72c.16-2.04 1.02-4.75 4.03-6.79a6.21 6.21 0 0 0-1.41-.18l-.16 0c-1.78 .06-2.9 1.1-3.42 3.18A.75 .75 0 0 1 9 10.5a.72 .72 0 0 1-.18-.02 .75 .75 0 0 1-.55-.91c.87-3.46 3.1-4.26 4.83-4.31a7.64 7.64 0 0 1 2.03 .23c-.36-.59-.88-1.21-1.61-1.52-.94-.4-2.08-.22-3.4 .52a.75 .75 0 0 1-.73-1.31c1.76-.98 3.35-1.18 4.73-.58 1.17 .5 1.94 1.48 2.43 2.34 .58-.9 1.3-1.52 2.1-1.78 1.11-.36 2.31-.07 3.56 .88a.75 .75 0 0 1-.9 1.2c-.84-.63-1.57-.85-2.19-.65-.68 .22-1.21 .94-1.53 1.56A6.61 6.61 0 0 1 19.5 6.85c1.37 .78 3 2.44 3 5.9a.75 .75 0 0 1-1.5 0c0-2.2-.76-3.75-2.25-4.59a4.73 4.73 0 0 0-.54-.26 5.22 5.22 0 0 1 .47 3.1 5.57 5.57 0 0 1-.83 2.19 .75 .75 0 0 1-1.23-.86c.07-.1 1.53-2.29-.31-4.63-2.53 1.43-3.93 3.49-4.14 6.15a9.78 9.78 0 0 0 .36 3.42c5.87 .17 9.52 3.03 9.68 3.16A.75 .75 0 0 1 22.34 21.47ZM2.25 13.13a2.63 2.63 0 1 1 2.63 2.63A2.63 2.63 0 0 1 2.25 13.13Zm1.5 0a1.13 1.13 0 1 0 1.13-1.12A1.13 1.13 0 0 0 3.75 13.13Z\"],\"faded\":[0]},{\"id\":\"ph-sailboat-duo\",\"label\":\"Sailboat duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 16.5l-2.78 3.47a.75 .75 0 0 1-.58 .28H4.86a.75 .75 0 0 1-.58-.28L1.5 16.5ZM12.75 .75 3 12.75H12.75Z\",\"M23.18 16.17A.75 .75 0 0 0 22.5 15.75H13.5V13.5h6.75a.75 .75 0 0 0 .55-1.25L13.5 4.21V.75a.75 .75 0 0 0-1.33-.47l-9.75 12A.75 .75 0 0 0 3 13.5h9v2.25H1.5a.75 .75 0 0 0-.59 1.22l2.78 3.47a1.49 1.49 0 0 0 1.17 .56H19.14a1.49 1.49 0 0 0 1.17-.56l2.78-3.47A.75 .75 0 0 0 23.18 16.17ZM18.56 12H13.5V6.44ZM4.58 12 12 2.86V12Zm14.56 7.5H4.86l-1.8-2.25H20.94Z\"],\"faded\":[0]},{\"id\":\"ph-anchor-duo\",\"label\":\"Anchor duotone\",\"set\":\"duotone\",\"paths\":[\"M14.25 5.25a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 14.25 5.25Z\",\"M20.25 12.75a.75 .75 0 0 0-.75 .75c0 2.31-1.29 2.78-3.57 3.4-1.06 .29-2.26 .62-3.18 1.34V12h3a.75 .75 0 0 0 0-1.5H12.75V8.16a3 3 0 1 0-1.5 0v2.34H8.25a.75 .75 0 0 0 0 1.5h3v6.25c-.92-.73-2.11-1.05-3.18-1.34C5.79 16.28 4.5 15.81 4.5 13.5a.75 .75 0 0 0-1.5 0c0 3.57 2.59 4.28 4.68 4.85C9.96 18.97 11.25 19.44 11.25 21.75a.75 .75 0 0 0 1.5 0c0-2.31 1.29-2.78 3.57-3.4C18.41 17.78 21 17.07 21 13.5A.75 .75 0 0 0 20.25 12.75ZM10.5 5.25a1.5 1.5 0 1 1 1.5 1.5A1.5 1.5 0 0 1 10.5 5.25Z\"],\"faded\":[0]},{\"id\":\"ph-treasure-chest-duo\",\"label\":\"Treasure chest duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 10.5v7.5a.75 .75 0 0 1-.75 .75H3a.75 .75 0 0 1-.75-.75V10.5h8.25v3h3V10.5Z\",\"M17.25 3.75H6.75A5.26 5.26 0 0 0 1.5 9v9a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V9A5.26 5.26 0 0 0 17.25 3.75Zm3.75 5.25v.75H18V5.32A3.76 3.76 0 0 1 21 9Zm-8.25 3.75H11.25V9.75h1.5Zm-2.25 1.5h3a.75 .75 0 0 0 .75-.75V11.25h2.25v6.75H7.5V11.25h2.25v2.25A.75 .75 0 0 0 10.5 14.25Zm3.75-4.5V9a.75 .75 0 0 0-.75-.75H10.5a.75 .75 0 0 0-.75 .75v.75H7.5V5.25h9v4.5ZM6 5.32V9.75H3V9A3.76 3.76 0 0 1 6 5.32ZM3 11.25H6v6.75H3Zm18 6.75H18V11.25h3v6.75Z\"],\"faded\":[0]},{\"id\":\"ph-flag-pennant-duo\",\"label\":\"Pennant duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 9.75 5.25 15.75V3.75Z\",\"M22.75 9.04l-17.25-6A.75 .75 0 0 0 4.5 3.75V20.25a.75 .75 0 0 0 1.5 0V16.28l16.75-5.82a.75 .75 0 0 0 0-1.42ZM6 14.7V4.8L20.22 9.75Z\"],\"faded\":[0]},{\"id\":\"ph-flag-banner-duo\",\"label\":\"Banner duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 5.25l-4.29 9H3.75l4.5-4.5L3.75 5.25Z\",\"M22.38 4.85A.75 .75 0 0 0 21.75 4.5H3.75a.75 .75 0 0 0-.53 1.28L7.19 9.75 3.22 13.72A.75 .75 0 0 0 3.75 15H16.28l-2.7 5.68a.75 .75 0 1 0 1.35 .65l7.5-15.75A.75 .75 0 0 0 22.38 4.85ZM16.99 13.5H5.56l3.22-3.22a.75 .75 0 0 0 0-1.06L5.56 6h15Z\"],\"faded\":[0]},{\"id\":\"ph-sun-horizon-duo\",\"label\":\"Sunset duotone\",\"set\":\"duotone\",\"paths\":[\"M18 13.5a6.03 6.03 0 0 1-.19 1.5H6.19a6 6 0 1 1 11.81-1.5Z\",\"M22.5 14.25H18.71a6.89 6.89 0 0 0 .04-.75 6.75 6.75 0 0 0-13.5 0 6.89 6.89 0 0 0 .04 .75H1.5a.75 .75 0 0 0 0 1.5H22.5a.75 .75 0 0 0 0-1.5ZM6.75 13.5a5.25 5.25 0 1 1 10.44 .75H6.81A5.26 5.26 0 0 1 6.75 13.5Zm13.5 5.25a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1 0-1.5H19.5A.75 .75 0 0 1 20.25 18.75ZM6.83 4.09a.75 .75 0 0 1 1.34-.67l.75 1.5a.75 .75 0 0 1-1.34 .67Zm-5.25 4.58a.75 .75 0 0 1 1.01-.33l1.5 .75a.75 .75 0 0 1-.67 1.34l-1.5-.75A.75 .75 0 0 1 1.58 8.66Zm18 1.42a.75 .75 0 0 1 .34-1.01l1.5-.75a.75 .75 0 1 1 .67 1.34l-1.5 .75a.75 .75 0 0 1-1.01-.34Zm-4.5-5.17 .75-1.5a.75 .75 0 0 1 1.34 .67l-.75 1.5a.75 .75 0 1 1-1.34-.67Z\"],\"faded\":[0]},{\"id\":\"ph-moon-stars-duo\",\"label\":\"Moon and stars duotone\",\"set\":\"duotone\",\"paths\":[\"M19.75 14.83A8.25 8.25 0 1 1 9.17 4.25 9.01 9.01 0 0 0 18 15 9.07 9.07 0 0 0 19.75 14.83Z\",\"M22.5 9a.75 .75 0 0 1-.75 .75H20.25v1.5a.75 .75 0 0 1-1.5 0V9.75H17.25a.75 .75 0 0 1 0-1.5h1.5V6.75a.75 .75 0 0 1 1.5 0V8.25h1.5A.75 .75 0 0 1 22.5 9ZM13.5 5.25h.75v.75a.75 .75 0 0 0 1.5 0V5.25h.75a.75 .75 0 0 0 0-1.5h-.75V3a.75 .75 0 0 0-1.5 0v.75h-.75a.75 .75 0 0 0 0 1.5Zm6.82 9.09a.75 .75 0 0 1 .13 .75A9 9 0 1 1 8.91 3.54a.75 .75 0 0 1 .99 .85A8.26 8.26 0 0 0 19.61 14.09 .75 .75 0 0 1 20.32 14.34Zm-1.82 1.4c-.17 .01-.34 .01-.5 .01A9.76 9.76 0 0 1 8.25 6c0-.17 0-.34 .01-.5A7.5 7.5 0 1 0 18.5 15.74Z\"],\"faded\":[0]},{\"id\":\"ph-cloud-moon-duo\",\"label\":\"Night duotone\",\"set\":\"duotone\",\"paths\":[\"M9.97 12.22ZM9.6 1.65h0A6.01 6.01 0 0 1 2.4 8.85h0A6.01 6.01 0 0 0 5.91 13.02h0a4.13 4.13 0 0 1 4.06-.8 6.39 6.39 0 0 1 4.26-4.44l.01 0c0-.09 .01-.19 .01-.28A6 6 0 0 0 9.6 1.65Z\",\"M16.13 6.75a7.17 7.17 0 0 0-1.16 .09A6.74 6.74 0 0 0 9.77 .92a.75 .75 0 0 0-.9 .9A5.25 5.25 0 0 1 3.75 8.25a5.29 5.29 0 0 1-1.18-.13 .75 .75 0 0 0-.9 .9 6.77 6.77 0 0 0 3.03 4.22A4.88 4.88 0 0 0 8.63 21h7.5a7.13 7.13 0 0 0 0-14.25ZM3.5 9.75c.08 0 .16 0 .25 0a6.76 6.76 0 0 0 6.75-6.75c0-.08 0-.17 0-.25a5.22 5.22 0 0 1 3 4.5 7.15 7.15 0 0 0-4.03 4.07A4.88 4.88 0 0 0 5.81 12.15 5.27 5.27 0 0 1 3.5 9.75ZM16.13 19.5H8.63a3.38 3.38 0 1 1 .45-6.72c-.03 .22-.06 .45-.07 .68a.75 .75 0 0 0 1.5 .09 5.52 5.52 0 0 1 .18-1.11c0-.01 .01-.03 .01-.04A5.63 5.63 0 1 1 16.13 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-shooting-star-duo\",\"label\":\"Shooting star duotone\",\"set\":\"duotone\",\"paths\":[\"M21.57 7.34l-2.98 2.52L19.5 13.62a.51 .51 0 0 1-.77 .55L15.38 12.16l-3.35 2.02a.51 .51 0 0 1-.77-.55l.91-3.77L9.18 7.34a.5 .5 0 0 1 .29-.89l3.92-.31 1.51-3.58a.52 .52 0 0 1 .95 0l1.51 3.58L21.28 6.45A.5 .5 0 0 1 21.57 7.34Z\",\"M22.44 6.57a1.26 1.26 0 0 0-1.1-.87l-3.46-.27L16.54 2.27a1.27 1.27 0 0 0-2.33 0L12.88 5.43 9.41 5.7a1.26 1.26 0 0 0-.72 2.21l2.63 2.22-.8 3.32a1.25 1.25 0 0 0 .48 1.3 1.27 1.27 0 0 0 1.41 .06L15.38 13.03l2.97 1.79a1.27 1.27 0 0 0 1.41-.06 1.25 1.25 0 0 0 .48-1.3l-.8-3.32 2.63-2.22A1.25 1.25 0 0 0 22.44 6.57ZM18.1 9.28a.75 .75 0 0 0-.24 .75l.78 3.21L15.76 11.51a.75 .75 0 0 0-.77 0l-2.87 1.73L12.89 10.03a.75 .75 0 0 0-.25-.75L10.13 7.15l3.33-.26a.75 .75 0 0 0 .63-.46L15.38 3.37l1.29 3.06a.75 .75 0 0 0 .63 .46l3.33 .26Zm-9.84 2.27L2.78 17.03a.75 .75 0 0 1-1.06-1.06l5.48-5.48a.75 .75 0 0 1 1.06 1.06Zm1.01 4.68a.75 .75 0 0 1 0 1.06L4.28 22.28a.75 .75 0 0 1-1.06-1.06l4.99-4.99A.75 .75 0 0 1 9.27 16.23Zm6.84-.09a.75 .75 0 0 1 0 1.06l-5.09 5.09a.75 .75 0 0 1-1.06-1.06l5.09-5.09A.75 .75 0 0 1 16.12 16.13Z\"],\"faded\":[0]},{\"id\":\"ph-planet-duo\",\"label\":\"Planet duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12a8.25 8.25 0 1 1-8.25-8.25A8.25 8.25 0 0 1 20.25 12Z\",\"M22.98 5.69c-.72-1.24-2.61-1.51-5.48-.81A8.99 8.99 0 0 0 3 12a9.19 9.19 0 0 0 .07 1.15C.48 15.84 .51 17.44 1.02 18.31 1.5 19.14 2.5 19.5 3.81 19.5a11.64 11.64 0 0 0 2.7-.37A8.99 8.99 0 0 0 21 12a9.1 9.1 0 0 0-.07-1.15c1.17-1.22 1.95-2.38 2.22-3.37C23.33 6.8 23.27 6.19 22.98 5.69ZM12 4.5a7.51 7.51 0 0 1 7.31 5.83c-1.6 1.51-3.76 3.05-5.82 4.23C10.91 16.04 8.67 16.97 6.88 17.48A7.49 7.49 0 0 1 12 4.5ZM2.32 17.56c-.14-.24-.06-.68 .21-1.22a7.41 7.41 0 0 1 .96-1.41 9 9 0 0 0 1.69 2.94C3.56 18.14 2.55 17.96 2.32 17.56ZM12 19.5a7.45 7.45 0 0 1-3.61-.93 34.69 34.69 0 0 0 5.85-2.71c2.02-1.16 3.81-2.42 5.26-3.66A7.51 7.51 0 0 1 12 19.5ZM21.7 7.1c-.16 .59-.58 1.27-1.18 1.98a8.97 8.97 0 0 0-1.69-2.94c1.33-.22 2.57-.2 2.86 .3C21.77 6.59 21.77 6.81 21.7 7.1Z\"],\"faded\":[0]},{\"id\":\"ph-alien-duo\",\"label\":\"Alien duotone\",\"set\":\"duotone\",\"paths\":[\"M12 2.25a8.25 8.25 0 0 0-8.25 8.25c0 4.56 5.25 11.25 8.25 11.25s8.25-6.69 8.25-11.25A8.25 8.25 0 0 0 12 2.25ZM9.75 13.5a3 3 0 0 1-3-3 .75 .75 0 0 1 .75-.75 3 3 0 0 1 3 3A.75 .75 0 0 1 9.75 13.5Zm4.5 0a.75 .75 0 0 1-.75-.75 3 3 0 0 1 3-3 .75 .75 0 0 1 .75 .75A3 3 0 0 1 14.25 13.5Z\",\"M12 1.5a9.01 9.01 0 0 0-9 9c0 2.25 1.18 5.16 3.15 7.78 1.99 2.64 4.17 4.22 5.85 4.22s3.86-1.58 5.85-4.22c1.97-2.62 3.15-5.53 3.15-7.78A9.01 9.01 0 0 0 12 1.5Zm4.65 15.88C15.02 19.55 13.15 21 12 21s-3.02-1.45-4.65-3.62C5.59 15.05 4.5 12.41 4.5 10.5a7.5 7.5 0 0 1 15 0C19.5 12.41 18.41 15.05 16.65 17.38ZM11.25 12.75A3.75 3.75 0 0 0 7.5 9a1.5 1.5 0 0 0-1.5 1.5 3.75 3.75 0 0 0 3.75 3.75A1.5 1.5 0 0 0 11.25 12.75ZM7.5 10.5a2.25 2.25 0 0 1 2.25 2.25h0A2.25 2.25 0 0 1 7.5 10.5Zm9-1.5a3.75 3.75 0 0 0-3.75 3.75 1.5 1.5 0 0 0 1.5 1.5 3.75 3.75 0 0 0 3.75-3.75A1.5 1.5 0 0 0 16.5 9Zm-2.25 3.75a2.25 2.25 0 0 1 2.25-2.25A2.25 2.25 0 0 1 14.25 12.75Zm0 4.5a.75 .75 0 0 1-.75 .75H10.5a.75 .75 0 0 1 0-1.5h3A.75 .75 0 0 1 14.25 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-butterfly-duo\",\"label\":\"Butterfly duotone\",\"set\":\"duotone\",\"paths\":[\"M21.11 11.22c-.74 2.9-2.75 3.07-3.5 3.02h-.09A3.38 3.38 0 1 1 12 16.88a3.38 3.38 0 1 1-5.5-2.63h-.09c-.75 .05-2.77-.12-3.5-3.02C2.14 8.24 1.48 4.5 4.41 4.5S12 8.98 12 11.97C12 8.98 16.65 4.5 19.59 4.5S21.86 8.24 21.11 11.22Z\",\"M21.82 4.73C21.47 4.28 20.8 3.75 19.59 3.75c-1.58 0-3.61 1.06-5.42 2.83A13.13 13.13 0 0 0 12.75 8.21V5.25a.75 .75 0 0 0-1.5 0V8.21a13.13 13.13 0 0 0-1.42-1.63C8.01 4.81 5.99 3.75 4.41 3.75 3.2 3.75 2.53 4.28 2.18 4.73c-.64 .82-1.14 2.26-.02 6.68 .57 2.23 1.83 3.09 2.87 3.41A4.13 4.13 0 0 0 12 19.24a4.13 4.13 0 0 0 6.96-4.42c1.04-.32 2.3-1.18 2.87-3.41C22.47 8.93 22.95 6.2 21.82 4.73ZM8.63 19.5A2.64 2.64 0 0 1 8.33 14.25a.75 .75 0 1 0-.16-1.49A4.09 4.09 0 0 0 6.22 13.5c-.79 .01-2.06-.33-2.6-2.46C3.35 9.97 2.53 6.74 3.37 5.65 3.5 5.48 3.76 5.25 4.41 5.25c2.56 0 6.84 4.21 6.84 6.72V16.88A2.63 2.63 0 0 1 8.63 19.5ZM20.38 11.04c-.54 2.13-1.81 2.47-2.6 2.46a4.09 4.09 0 0 0-1.94-.75 .75 .75 0 1 0-.16 1.49A2.64 2.64 0 1 1 12.75 16.88V11.97C12.75 9.46 17.03 5.25 19.59 5.25c.65 0 .91 .23 1.04 .4C21.47 6.74 20.65 9.97 20.38 11.04Z\"],\"faded\":[0]},{\"id\":\"ph-graduation-cap-duo\",\"label\":\"Graduation cap duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 10.6v4.99a.75 .75 0 0 1-.19 .5c-1.06 1.18-3.65 3.41-8.06 3.41s-7-2.23-8.06-3.41a.75 .75 0 0 1-.19-.5V10.6L12 15Z\",\"M23.6 8.34l-11.25-6a.75 .75 0 0 0-.7 0l-11.25 6a.75 .75 0 0 0 0 1.32L3 11.05v4.54a1.49 1.49 0 0 0 .38 1C4.61 17.96 7.36 20.25 12 20.25a12.19 12.19 0 0 0 4.5-.82V22.5a.75 .75 0 0 0 1.5 0V18.7a10.84 10.84 0 0 0 2.62-2.12A1.49 1.49 0 0 0 21 15.59V11.05l2.6-1.39a.75 .75 0 0 0 0-1.32ZM12 18.75c-4.06 0-6.44-1.98-7.5-3.16V11.85l7.15 3.81a.75 .75 0 0 0 .71 0L16.5 13.45v4.34C15.32 18.35 13.83 18.75 12 18.75Zm7.5-3.16a9.17 9.17 0 0 1-1.5 1.34V12.65l1.5-.8ZM17.63 11.15l-.02-.01-5.25-2.8a.75 .75 0 0 0-.7 1.32L16.03 12l-4.03 2.15L2.34 9 12 3.85 21.66 9Z\"],\"faded\":[0]},{\"id\":\"ph-detective-duo\",\"label\":\"Detective duotone\",\"set\":\"duotone\",\"paths\":[\"M9.75 16.88a2.63 2.63 0 1 1-2.62-2.62A2.63 2.63 0 0 1 9.75 16.88Zm7.13-2.62a2.63 2.63 0 1 0 2.63 2.63A2.63 2.63 0 0 0 16.88 14.25ZM15.57 4.81a.75 .75 0 0 0-1.19-.03L13.17 6.19a1.5 1.5 0 0 1-2.34 0L9.62 4.78a.75 .75 0 0 0-1.19 .03L3.75 11.25H20.25Z\",\"M23.25 10.5H20.63l-4.45-6.13a1.5 1.5 0 0 0-2.37-.07l-1.2 1.4-.02 .02a.75 .75 0 0 1-1.17 0l-.02-.02-1.2-1.4a1.5 1.5 0 0 0-2.37 .07L3.37 10.5H.75a.75 .75 0 0 0 0 1.5H23.25a.75 .75 0 0 0 0-1.5ZM9.03 5.25l.02 .02 1.2 1.4a2.25 2.25 0 0 0 3.49 0l1.2-1.4c.01-.01 .01-.01 .02-.02l3.81 5.25H5.22ZM16.88 13.5a3.38 3.38 0 0 0-3.35 3H10.48a3.38 3.38 0 1 0-.17 1.5h3.39A3.38 3.38 0 1 0 16.88 13.5ZM7.13 18.75a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 7.13 18.75Zm9.75 0a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 16.88 18.75Z\"],\"faded\":[0]},{\"id\":\"ph-briefcase-duo\",\"label\":\"Briefcase duotone\",\"set\":\"duotone\",\"paths\":[\"M21 11.09V18.75a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V11.09h0A17.92 17.92 0 0 0 12 13.5 17.91 17.91 0 0 0 21 11.09Z\",\"M9.75 10.5a.75 .75 0 0 1 .75-.75h3a.75 .75 0 0 1 0 1.5H10.5A.75 .75 0 0 1 9.75 10.5ZM21.75 6.75V18.75a1.5 1.5 0 0 1-1.5 1.5H3.75a1.5 1.5 0 0 1-1.5-1.5V6.75A1.5 1.5 0 0 1 3.75 5.25H7.5V4.5a2.25 2.25 0 0 1 2.25-2.25h4.5a2.25 2.25 0 0 1 2.25 2.25v.75h3.75A1.5 1.5 0 0 1 21.75 6.75ZM9 5.25h6V4.5a.75 .75 0 0 0-.75-.75H9.75a.75 .75 0 0 0-.75 .75ZM3.75 6.75v3.9A17.26 17.26 0 0 0 12 12.75a17.25 17.25 0 0 0 8.25-2.1V6.75ZM20.25 18.75V12.34A18.77 18.77 0 0 1 12 14.25a18.77 18.77 0 0 1-8.25-1.91V18.75H20.25Z\"],\"faded\":[0]},{\"id\":\"ph-money-wavy-duo\",\"label\":\"Cash duotone\",\"set\":\"duotone\",\"paths\":[\"M1.5 6.49v11.25c8.59-4.2 12.41 3.97 21-.23v-11.25C13.91 10.46 10.09 2.29 1.5 6.49ZM12 14.25a2.25 2.25 0 1 1 2.25-2.25A2.25 2.25 0 0 1 12 14.25Z\",\"M22.9 5.63a.75 .75 0 0 0-.73-.04c-4.02 1.97-6.9 1.05-9.94 .07-3.19-1.02-6.49-2.08-11.06 .15A.75 .75 0 0 0 .75 6.49V17.73a.75 .75 0 0 0 1.08 .67c4.02-1.97 6.9-1.05 9.94-.07 1.8 .58 3.64 1.16 5.72 1.16 1.6 0 3.35-.35 5.34-1.32a.75 .75 0 0 0 .42-.67V6.27A.75 .75 0 0 0 22.9 5.63ZM21.75 17.03c-3.81 1.7-6.59 .81-9.52-.12-1.8-.58-3.64-1.16-5.72-1.16a11.44 11.44 0 0 0-4.26 .84V6.97c3.81-1.7 6.59-.81 9.52 .12S17.73 9 21.75 7.41ZM12 9a3 3 0 1 0 3 3A3 3 0 0 0 12 9Zm0 4.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 12 13.5ZM5.25 9v4.5a.75 .75 0 0 1-1.5 0V9a.75 .75 0 1 1 1.5 0Zm13.5 6V10.5a.75 .75 0 1 1 1.5 0v4.5a.75 .75 0 1 1-1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-coin-vertical-duo\",\"label\":\"Coin duotone\",\"set\":\"duotone\",\"paths\":[\"M15 12c0 4.97-2.35 9-5.25 9s-5.25-4.03-5.25-9 2.35-9 5.25-9S15 7.03 15 12Z\",\"M18.61 5.26C17.48 3.32 15.93 2.25 14.25 2.25H9.75C8.07 2.25 6.52 3.32 5.39 5.26 4.33 7.07 3.75 9.47 3.75 12s.58 4.93 1.64 6.74C6.52 20.68 8.07 21.75 9.75 21.75h4.5c1.68 0 3.23-1.07 4.36-3.01C19.67 16.93 20.25 14.53 20.25 12S19.67 7.07 18.61 5.26ZM18.73 11.25h-3a14.32 14.32 0 0 0-.91-4.5H17.69C18.26 8 18.64 9.56 18.73 11.25Zm-1.93-6H14.11a7.79 7.79 0 0 0-1.12-1.5H14.25C15.19 3.75 16.07 4.31 16.8 5.25ZM5.25 12c0-4.47 2.06-8.25 4.5-8.25s4.5 3.78 4.5 8.25-2.06 8.25-4.5 8.25S5.25 16.47 5.25 12Zm9 8.25H12.98a7.79 7.79 0 0 0 1.13-1.5h2.69C16.07 19.69 15.19 20.25 14.25 20.25Zm3.44-3H14.82a14.32 14.32 0 0 0 .91-4.5h3C18.64 14.44 18.26 16 17.69 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-currency-circle-dollar-duo\",\"label\":\"Dollar coin duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm3.75-6.37a2.63 2.63 0 0 1-2.62 2.63h-.37v.75a.75 .75 0 0 1-1.5 0v-.75H9.75a.75 .75 0 0 1 0-1.5h3.38a1.13 1.13 0 0 0 0-2.25H10.88a2.63 2.63 0 0 1 0-5.25h.38V6.75a.75 .75 0 0 1 1.5 0v.75h1.5a.75 .75 0 0 1 0 1.5H10.88a1.13 1.13 0 0 0 0 2.25h2.25A2.63 2.63 0 0 1 15.75 13.88Z\"],\"faded\":[0]},{\"id\":\"ph-shield-star-duo\",\"label\":\"Shield star duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25v5.25c0 9-8.25 11.25-8.25 11.25S3.75 19.5 3.75 10.5V5.25a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 5.25Z\",\"M7.55 10.97A.75 .75 0 0 1 8.53 10.55l2.72 1.09V9a.75 .75 0 0 1 1.5 0v2.64l2.72-1.09A.75 .75 0 1 1 16.03 11.95l-2.84 1.14L14.85 15.3a.75 .75 0 1 1-1.2 .9L12 14 10.35 16.2a.75 .75 0 1 1-1.2-.9l1.66-2.22L7.97 11.95A.75 .75 0 0 1 7.55 10.97ZM21 5.25v5.25c0 4.94-2.39 7.94-4.4 9.58-2.16 1.77-4.31 2.37-4.41 2.39a.75 .75 0 0 1-.39 0c-.09-.02-2.24-.63-4.41-2.39C5.39 18.44 3 15.44 3 10.5V5.25A1.5 1.5 0 0 1 4.5 3.75H19.5A1.5 1.5 0 0 1 21 5.25Zm-1.5 0L4.5 5.25l0 5.25c0 3.5 1.3 6.33 3.85 8.42A12.02 12.02 0 0 0 12 20.96a12.12 12.12 0 0 0 3.69-2.08C18.22 16.8 19.5 13.98 19.5 10.5Z\"],\"faded\":[0]},{\"id\":\"ph-headset-duo\",\"label\":\"Headset duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 13.5v3.75a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V12H6A1.5 1.5 0 0 1 7.5 13.5Zm10.5-1.5a1.5 1.5 0 0 0-1.5 1.5v3.75a1.5 1.5 0 0 0 1.5 1.5h3V12Z\",\"M18.93 5.12A9.76 9.76 0 0 0 2.25 12v5.25a2.25 2.25 0 0 0 2.25 2.25H6a2.25 2.25 0 0 0 2.25-2.25V13.5a2.25 2.25 0 0 0-2.25-2.25H3.78A8.26 8.26 0 0 1 17.86 6.18 8.19 8.19 0 0 1 20.22 11.25H18a2.25 2.25 0 0 0-2.25 2.25v3.75a2.25 2.25 0 0 0 2.25 2.25h2.25a2.25 2.25 0 0 1-2.25 2.25H12.75a.75 .75 0 0 0 0 1.5h5.25a3.75 3.75 0 0 0 3.75-3.75V12A9.69 9.69 0 0 0 18.93 5.12ZM6 12.75a.75 .75 0 0 1 .75 .75v3.75a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V12.75Zm12 5.25a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 .75-.75h2.25v5.25Z\"],\"faded\":[0]},{\"id\":\"ph-soccer-ball-duo\",\"label\":\"Football duotone\",\"set\":\"duotone\",\"paths\":[\"M6.11 10.13l-3.09 2.38c-.01-.17-.01-.34-.01-.51A8.96 8.96 0 0 1 4.99 6.35ZM4.4 16.82a9.01 9.01 0 0 0 5.34 3.89l-1.38-3.89Zm9.86 3.89a9.01 9.01 0 0 0 5.34-3.89H15.64ZM19.01 6.35l-1.12 3.78 3.09 2.38c.01-.17 .01-.34 .01-.51A8.96 8.96 0 0 0 19.01 6.35Zm-3.61-2.69a9.03 9.03 0 0 0-6.8 0L12 6ZM14.32 15 15.75 10.83 12 8.25 8.25 10.83 9.68 15Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm7.17 13.82H16.02l-.87-1.2 1.18-3.45 1.41-.46 2.46 1.89A8.19 8.19 0 0 1 19.17 16.07Zm-15.37-3.22L6.25 10.97l1.41 .46 1.18 3.45L7.98 16.07H4.83A8.19 8.19 0 0 1 3.79 12.86Zm.94-4.75 .52 1.74L3.82 10.95A8.19 8.19 0 0 1 4.73 8.11ZM10.22 14.25 9.14 11.12 12 9.16l2.86 1.96L13.78 14.25Zm8.54-4.4 .52-1.74a8.19 8.19 0 0 1 .91 2.84Zm-.58-3.32-.89 3.01-1.41 .46L12.75 7.86V6.39l2.73-1.87A8.3 8.3 0 0 1 18.17 6.53ZM13.69 3.93 12 5.09 10.31 3.93a8.27 8.27 0 0 1 3.39 0ZM8.52 4.52l2.73 1.88V7.86L8.13 10l-1.41-.46L5.83 6.53A8.3 8.3 0 0 1 8.52 4.52ZM5.92 17.57H7.83l.67 1.9A8.29 8.29 0 0 1 5.92 17.57ZM10.31 20.07 9.2 16.94 10.06 15.75h3.87l.87 1.19-1.11 3.13a8.25 8.25 0 0 1-3.38 0Zm5.19-.6 .67-1.9h1.91A8.29 8.29 0 0 1 15.5 19.47Z\"],\"faded\":[0]},{\"id\":\"ph-basketball-duo\",\"label\":\"Basketball duotone\",\"set\":\"duotone\",\"paths\":[\"M5.63 18.36h0l.01 .01ZM5.63 5.63h0a9.04 9.04 0 0 0 0 12.74 9.01 9.01 0 0 0 2.63-6.37A9.01 9.01 0 0 0 5.63 5.63Zm12.75 0h0a9.04 9.04 0 0 0 0 12.74A9.04 9.04 0 0 0 18.38 5.63Zm0 12.74 .01 .01-.01-.01Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25ZM3.78 12.75H7.47A8.18 8.18 0 0 1 5.63 17.23 8.21 8.21 0 0 1 3.78 12.75ZM12.75 11.25V3.78a8.21 8.21 0 0 1 4.56 1.91A9.66 9.66 0 0 0 15.03 11.25Zm-1.5 0H8.97A9.66 9.66 0 0 0 6.69 5.69 8.21 8.21 0 0 1 11.25 3.78Zm-3.78 0H3.78A8.21 8.21 0 0 1 5.63 6.77 8.18 8.18 0 0 1 7.47 11.25ZM8.97 12.75H11.25v7.47a8.21 8.21 0 0 1-4.56-1.91A9.66 9.66 0 0 0 8.97 12.75Zm3.78 0h2.28a9.66 9.66 0 0 0 2.29 5.56A8.21 8.21 0 0 1 12.75 20.22Zm3.78 0h3.68A8.21 8.21 0 0 1 18.38 17.23 8.18 8.18 0 0 1 16.53 12.75Zm0-1.5A8.18 8.18 0 0 1 18.38 6.77 8.21 8.21 0 0 1 20.22 11.25Z\"],\"faded\":[0]},{\"id\":\"ph-heartbeat-duo\",\"label\":\"Heartbeat duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 9.56c0 6.19-9.75 11.44-9.75 11.44S2.25 15.75 2.25 9.56A5.06 5.06 0 0 1 7.31 4.5c2.12 0 3.93 1.15 4.69 3 .76-1.85 2.57-3 4.69-3A5.06 5.06 0 0 1 21.75 9.56Z\",\"M6.75 13.5H3a.75 .75 0 0 1 0-1.5H6.35l1.28-1.92a.75 .75 0 0 1 1.25 0l2.38 3.56 .88-1.31A.75 .75 0 0 1 12.75 12h2.25a.75 .75 0 0 1 0 1.5H13.15l-1.28 1.92a.75 .75 0 0 1-1.25 0L8.25 11.85l-.88 1.31A.75 .75 0 0 1 6.75 13.5ZM16.69 3.75c-1.94 0-3.63 .83-4.69 2.24C10.94 4.58 9.25 3.75 7.31 3.75a5.82 5.82 0 0 0-5.81 5.81c0 .07 0 .14 0 .21a.75 .75 0 1 0 1.5-.05c0-.05 0-.11 0-.16A4.32 4.32 0 0 1 7.31 5.25c1.82 0 3.35 .97 3.99 2.53a.75 .75 0 0 0 1.39 0c.64-1.56 2.17-2.53 3.99-2.53a4.32 4.32 0 0 1 4.31 4.31c0 5.03-7.29 9.58-9 10.58-1.02-.59-4-2.44-6.25-4.89a.75 .75 0 1 0-1.11 1.01c2.92 3.19 6.84 5.31 7 5.4a.75 .75 0 0 0 .71 0C12.77 21.44 22.5 16.13 22.5 9.56A5.82 5.82 0 0 0 16.69 3.75Z\"],\"faded\":[0]},{\"id\":\"ph-thumbs-up-duo\",\"label\":\"Like duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 9.75V19.5H3a.75 .75 0 0 1-.75-.75V10.5a.75 .75 0 0 1 .75-.75Z\",\"M21.94 7.51A2.25 2.25 0 0 0 20.25 6.75H15V5.25a3.75 3.75 0 0 0-3.75-3.75 .75 .75 0 0 0-.67 .41L7.04 9H3a1.5 1.5 0 0 0-1.5 1.5v8.25a1.5 1.5 0 0 0 1.5 1.5H19.13a2.25 2.25 0 0 0 2.23-1.97l1.13-9A2.25 2.25 0 0 0 21.94 7.51ZM3 10.5H6.75v8.25H3ZM20.99 9.09l-1.12 9a.75 .75 0 0 1-.74 .66H8.25V9.93l3.44-6.88A2.25 2.25 0 0 1 13.5 5.25V7.5a.75 .75 0 0 0 .75 .75h6a.75 .75 0 0 1 .74 .84Z\"],\"faded\":[0]},{\"id\":\"ph-thumbs-down-duo\",\"label\":\"Dislike duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 4.5V14.25H3a.75 .75 0 0 1-.75-.75V5.25a.75 .75 0 0 1 .75-.75Z\",\"M22.48 14.72l-1.12-9A2.25 2.25 0 0 0 19.13 3.75H3A1.5 1.5 0 0 0 1.5 5.25v8.25a1.5 1.5 0 0 0 1.5 1.5H7.04l3.54 7.09A.75 .75 0 0 0 11.25 22.5a3.75 3.75 0 0 0 3.75-3.75V17.25h5.25a2.25 2.25 0 0 0 2.23-2.53ZM6.75 13.5H3V5.25H6.75Zm14.06 2a.74 .74 0 0 1-.56 .25H14.25a.75 .75 0 0 0-.75 .75v2.25a2.25 2.25 0 0 1-1.81 2.21L8.25 14.07V5.25H19.13a.75 .75 0 0 1 .74 .66l1.13 9A.74 .74 0 0 1 20.81 15.5Z\"],\"faded\":[0]},{\"id\":\"ph-check-circle-duo\",\"label\":\"Check duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M16.28 9.22a.75 .75 0 0 1 0 1.06l-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72A.75 .75 0 0 1 16.28 9.22ZM21.75 12A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-x-circle-duo\",\"label\":\"Cross duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M15.53 9.53 13.06 12l2.47 2.47a.75 .75 0 0 1-1.06 1.06L12 13.06l-2.47 2.47a.75 .75 0 0 1-1.06-1.06L10.94 12 8.47 9.53a.75 .75 0 0 1 1.06-1.06L12 10.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06ZM21.75 12A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-check-fat-duo\",\"label\":\"Check mark duotone\",\"set\":\"duotone\",\"paths\":[\"M22.28 7.99l-12.04 12.04a.75 .75 0 0 1-1.06 0l-6.71-6.75a.75 .75 0 0 1 0-1.06l2.25-2.25a.75 .75 0 0 1 1.06 0L9.75 13.82l9.22-9.1a.75 .75 0 0 1 1.06 0l2.25 2.21A.75 .75 0 0 1 22.28 7.99Z\",\"M22.81 6.4l-2.25-2.21a1.5 1.5 0 0 0-2.12 0L9.75 12.77l-3.44-3.34a1.5 1.5 0 0 0-2.12 0l-2.25 2.25a1.5 1.5 0 0 0 0 2.12l6.71 6.75a1.5 1.5 0 0 0 2.12 0L22.81 8.52A1.5 1.5 0 0 0 22.81 6.4ZM9.71 19.5 3 12.75l2.25-2.25a.06 .06 0 0 1 .01 .01l3.97 3.85a.75 .75 0 0 0 1.05 0L19.51 5.25 21.75 7.46Z\"],\"faded\":[0]},{\"id\":\"ph-x-duo\",\"label\":\"Close duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25V18.75a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 5.25 3.75H18.75A1.5 1.5 0 0 1 20.25 5.25Z\",\"M19.28 18.22a.75 .75 0 0 1-1.06 1.06L12 13.06 5.78 19.28a.75 .75 0 0 1-1.06-1.06L10.94 12 4.72 5.78A.75 .75 0 0 1 5.78 4.72L12 10.94l6.22-6.22a.75 .75 0 0 1 1.06 1.06L13.06 12Z\"],\"faded\":[0]},{\"id\":\"ph-check-square-duo\",\"label\":\"Check square duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V19.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 4.5Z\",\"M16.28 9.22a.75 .75 0 0 1 0 1.06l-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72A.75 .75 0 0 1 16.28 9.22ZM21 4.5V19.5a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 4.5 3H19.5A1.5 1.5 0 0 1 21 4.5ZM19.5 19.5V4.5H4.5V19.5H19.5Z\"],\"faded\":[0]},{\"id\":\"ph-x-square-duo\",\"label\":\"Cross square duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V19.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 4.5Z\",\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3Zm0 16.5H4.5V4.5H19.5V19.5ZM15.53 9.53 13.06 12l2.47 2.47a.75 .75 0 0 1-1.06 1.06L12 13.06l-2.47 2.47a.75 .75 0 0 1-1.06-1.06L10.94 12 8.47 9.53a.75 .75 0 0 1 1.06-1.06L12 10.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06Z\"],\"faded\":[0]},{\"id\":\"ph-warning-duo\",\"label\":\"Warning duotone\",\"set\":\"duotone\",\"paths\":[\"M20.2 20.25H3.8C2.62 20.25 1.88 19.01 2.45 18.01L10.65 3.77c.59-1.03 2.11-1.03 2.7 0l8.2 14.24C22.13 19.01 21.38 20.25 20.2 20.25Z\",\"M22.2 17.63 14 3.4h0a2.32 2.32 0 0 0-4 0L1.8 17.63a2.2 2.2 0 0 0 0 2.22A2.28 2.28 0 0 0 3.8 21h16.4a2.28 2.28 0 0 0 2-1.14A2.2 2.2 0 0 0 22.2 17.63ZM20.9 19.11a.8 .8 0 0 1-.7 .39H3.8a.8 .8 0 0 1-.7-.39 .71 .71 0 0 1 0-.72L11.3 4.14a.82 .82 0 0 1 1.41 0l8.2 14.24A.71 .71 0 0 1 20.9 19.11ZM11.25 13.5V9.75a.75 .75 0 0 1 1.5 0v3.75a.75 .75 0 0 1-1.5 0Zm1.88 3.38a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 16.88Z\"],\"faded\":[0]},{\"id\":\"ph-warning-circle-duo\",\"label\":\"Alert duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm-.75-7.5V7.5a.75 .75 0 0 1 1.5 0v5.25a.75 .75 0 0 1-1.5 0Zm1.88 3.38a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 16.13Z\"],\"faded\":[0]},{\"id\":\"ph-info-duo\",\"label\":\"Info duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M13.5 16.5a.75 .75 0 0 1-.75 .75 1.5 1.5 0 0 1-1.5-1.5V12a.75 .75 0 0 1 0-1.5 1.5 1.5 0 0 1 1.5 1.5v3.75A.75 .75 0 0 1 13.5 16.5Zm8.25-4.5A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12ZM11.63 9a1.13 1.13 0 1 0-1.12-1.12A1.13 1.13 0 0 0 11.63 9Z\"],\"faded\":[0]},{\"id\":\"ph-question-duo\",\"label\":\"Question duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M13.13 16.88a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 16.88ZM12 6.75c-2.07 0-3.75 1.51-3.75 3.38v.38a.75 .75 0 0 0 1.5 0v-.37c0-1.03 1.01-1.87 2.25-1.87s2.25 .84 2.25 1.88-1.01 1.88-2.25 1.88a.75 .75 0 0 0-.75 .75v.75a.75 .75 0 0 0 1.5 0v-.07c1.71-.31 3-1.68 3-3.31C15.75 8.26 14.07 6.75 12 6.75Zm9.75 5.25A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-prohibit-duo\",\"label\":\"Ban duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm8.25 9.75a8.21 8.21 0 0 1-1.91 5.28L6.72 5.66A8.25 8.25 0 0 1 20.25 12ZM3.75 12A8.21 8.21 0 0 1 5.66 6.72L17.28 18.34A8.25 8.25 0 0 1 3.75 12Z\"],\"faded\":[0]},{\"id\":\"ph-heart-duo\",\"label\":\"Heart duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 9.56c0 6.19-9.75 11.44-9.75 11.44S2.25 15.75 2.25 9.56A5.06 5.06 0 0 1 7.31 4.5c2.12 0 3.93 1.15 4.69 3 .76-1.85 2.57-3 4.69-3A5.06 5.06 0 0 1 21.75 9.56Z\",\"M16.69 3.75c-1.94 0-3.63 .83-4.69 2.24C10.94 4.58 9.25 3.75 7.31 3.75a5.82 5.82 0 0 0-5.81 5.81c0 6.56 9.73 11.87 10.14 12.09a.75 .75 0 0 0 .71 0C12.77 21.44 22.5 16.13 22.5 9.56A5.82 5.82 0 0 0 16.69 3.75ZM12 20.14C10.29 19.14 3 14.6 3 9.56A4.32 4.32 0 0 1 7.31 5.25c1.82 0 3.35 .97 3.99 2.53a.75 .75 0 0 0 1.39 0c.64-1.56 2.17-2.53 3.99-2.53a4.32 4.32 0 0 1 4.31 4.31C21 14.59 13.71 19.14 12 20.14Z\"],\"faded\":[0]},{\"id\":\"ph-heart-straight-duo\",\"label\":\"Heart straight duotone\",\"set\":\"duotone\",\"paths\":[\"M20.38 12.5 12 21 3.62 12.5a4.69 4.69 0 0 1 6.63-6.63L12 7.5l1.75-1.63a4.69 4.69 0 1 1 6.63 6.63Z\",\"M20.91 5.34a5.44 5.44 0 0 0-7.68-.01L12 6.47 10.77 5.33A5.44 5.44 0 0 0 3.09 13.03l8.38 8.5a.75 .75 0 0 0 1.07 0L20.91 13.03a5.44 5.44 0 0 0 0-7.69Zm-1.06 6.63L12 19.93 4.15 11.97a3.94 3.94 0 0 1 5.57-5.57l.02 .02 1.75 1.63a.75 .75 0 0 0 1.02 0L14.26 6.42l.02-.02a3.94 3.94 0 1 1 5.57 5.57Z\"],\"faded\":[0]},{\"id\":\"ph-star-duo\",\"label\":\"Star duotone\",\"set\":\"duotone\",\"paths\":[\"M21.47 10.2l-4.57 3.94 1.4 5.89a.79 .79 0 0 1-1.17 .86L12 17.73 6.87 20.88a.79 .79 0 0 1-1.17-.86l1.4-5.89-4.57-3.94A.79 .79 0 0 1 2.97 8.81L8.97 8.32l2.31-5.59a.78 .78 0 0 1 1.45 0l2.31 5.59L21.03 8.81A.79 .79 0 0 1 21.47 10.2Z\",\"M22.42 9.12A1.54 1.54 0 0 0 21.09 8.06l-5.53-.45L13.42 2.45a1.53 1.53 0 0 0-2.84 0L8.45 7.62 2.91 8.06a1.54 1.54 0 0 0-.88 2.71l4.22 3.64L4.97 19.85a1.54 1.54 0 0 0 2.3 1.67L12 18.61l4.74 2.91A1.54 1.54 0 0 0 19.03 19.85l-1.29-5.44 4.22-3.64A1.54 1.54 0 0 0 22.42 9.12Zm-1.44 .51-4.57 3.94a.75 .75 0 0 0-.24 .74l1.4 5.89a.03 .03 0 0 1-.02 .05c-.02 .01-.02 .01-.04 0l-5.13-3.15a.75 .75 0 0 0-.79 0L6.48 20.24c-.01 .01-.02 .01-.04 0a.03 .03 0 0 1-.02-.04l1.4-5.89a.75 .75 0 0 0-.24-.74l-4.57-3.94c-.01-.01-.02-.02-.01-.05s.02-.03 .03-.03l5.99-.48A.75 .75 0 0 0 9.66 8.61l2.31-5.59c.01-.02 .01-.02 .03-.02s.03 .01 .03 .02L14.34 8.61a.75 .75 0 0 0 .63 .46l5.99 .48c.01 0 .02 0 .03 .03S21 9.62 20.99 9.63Z\"],\"faded\":[0]},{\"id\":\"ph-star-four-duo\",\"label\":\"Twinkle duotone\",\"set\":\"duotone\",\"paths\":[\"M21.26 12.7l-6.28 2.28-2.28 6.28a.75 .75 0 0 1-1.41 0L9.02 14.98 2.74 12.7a.75 .75 0 0 1 0-1.41L9.02 9.02l2.28-6.28a.75 .75 0 0 1 1.41 0l2.28 6.28 6.28 2.28A.75 .75 0 0 1 21.26 12.7Z\",\"M21.52 10.59 15.57 8.43 13.41 2.48a1.5 1.5 0 0 0-2.81 0L8.43 8.43 2.48 10.59a1.5 1.5 0 0 0 0 2.81l5.95 2.16L10.59 21.52a1.5 1.5 0 0 0 2.81 0l2.16-5.95L21.52 13.41a1.5 1.5 0 0 0 0-2.81ZM14.73 14.28a.75 .75 0 0 0-.45 .45L12 20.99l-2.28-6.26a.75 .75 0 0 0-.45-.45L3.01 12l6.26-2.28a.75 .75 0 0 0 .45-.45L12 3.01l2.28 6.26a.75 .75 0 0 0 .45 .45L20.99 12Z\"],\"faded\":[0]},{\"id\":\"ph-sparkle-duo\",\"label\":\"Sparkle duotone\",\"set\":\"duotone\",\"paths\":[\"M18.26 14.2l-5.16 1.9-1.9 5.16a.74 .74 0 0 1-1.39 0l-1.9-5.16-5.16-1.9a.74 .74 0 0 1 0-1.39l5.16-1.9 1.9-5.16a.74 .74 0 0 1 1.39 0l1.9 5.16 5.16 1.9A.74 .74 0 0 1 18.26 14.2Z\",\"M18.52 12.1 13.69 10.31l-1.78-4.84a1.49 1.49 0 0 0-2.8 0L7.31 10.31l-4.84 1.78a1.49 1.49 0 0 0 0 2.8L7.31 16.69l1.78 4.84a1.49 1.49 0 0 0 2.8 0L13.69 16.69l4.84-1.78a1.49 1.49 0 0 0 0-2.8ZM12.84 15.4a.75 .75 0 0 0-.44 .44L10.5 20.99 8.6 15.84A.75 .75 0 0 0 8.16 15.4L3.01 13.5 8.16 11.6A.75 .75 0 0 0 8.6 11.16L10.5 6.01 12.4 11.16a.75 .75 0 0 0 .44 .44L17.99 13.5ZM13.5 3.75a.75 .75 0 0 1 .75-.75h1.5V1.5a.75 .75 0 0 1 1.5 0V3h1.5a.75 .75 0 0 1 0 1.5H17.25V6a.75 .75 0 0 1-1.5 0V4.5H14.25A.75 .75 0 0 1 13.5 3.75ZM23.25 8.25a.75 .75 0 0 1-.75 .75h-.75v.75a.75 .75 0 0 1-1.5 0V9h-.75a.75 .75 0 0 1 0-1.5h.75V6.75a.75 .75 0 0 1 1.5 0v.75h.75A.75 .75 0 0 1 23.25 8.25Z\"],\"faded\":[0]},{\"id\":\"ph-fire-duo\",\"label\":\"Fire duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 13.5a7.5 7.5 0 0 1-15 0c0-2.87 1.35-5.46 2.91-7.5l3.09 3 2.46-6.75C14.99 3.93 19.5 8.26 19.5 13.5Z\",\"M17.24 14.38a5.4 5.4 0 0 1-4.36 4.36A.82 .82 0 0 1 12.75 18.75a.75 .75 0 0 1-.12-1.49c1.55-.26 2.87-1.58 3.14-3.14a.75 .75 0 0 1 1.48 .25ZM20.25 13.5a8.25 8.25 0 0 1-16.5 0c0-2.62 1.03-5.29 3.06-7.95a.75 .75 0 0 1 1.12-.08l2.26 2.19 2.06-5.66a.75 .75 0 0 1 1.18-.32C15.49 3.38 20.25 7.93 20.25 13.5Zm-1.5 0c0-4.32-3.36-8.05-5.46-9.97L11.21 9.26a.75 .75 0 0 1-1.23 .28L7.51 7.14C6.01 9.3 5.25 11.44 5.25 13.5a6.75 6.75 0 0 0 13.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-lightning-duo\",\"label\":\"Bolt duotone\",\"set\":\"duotone\",\"paths\":[\"M9 22.5l1.5-7.5L4.5 12.75 15 1.5 13.5 9l6 2.25Z\",\"M20.23 11.08a.75 .75 0 0 0-.47-.53L14.36 8.52l1.37-6.87a.75 .75 0 0 0-1.28-.66l-10.5 11.25a.75 .75 0 0 0 .28 1.22l5.4 2.03L8.27 22.35a.75 .75 0 0 0 1.28 .66l10.5-11.25A.75 .75 0 0 0 20.23 11.08ZM10.25 20.06l.98-4.91a.75 .75 0 0 0-.47-.85L5.81 12.44l7.93-8.5L12.77 8.85a.75 .75 0 0 0 .47 .85l4.95 1.86Z\"],\"faded\":[0]},{\"id\":\"ph-crown-duo\",\"label\":\"Crown duotone\",\"set\":\"duotone\",\"paths\":[\"M20.32 9.35l-1.46 8.77a.75 .75 0 0 1-.74 .63H5.89a.75 .75 0 0 1-.74-.63L3.68 9.35l.01 0a1.86 1.86 0 0 0 .86-.39h0L8.25 13.5l3-6.9h0a1.88 1.88 0 0 0 1.49 0h0L15.75 13.5l3.69-4.54h0a1.86 1.86 0 0 0 .86 .39Z\",\"M23.25 7.5a2.63 2.63 0 1 0-4.79 1.48l-2.51 3.09L13.69 6.88a2.63 2.63 0 1 0-3.38 0L8.05 12.07l-2.51-3.09a2.63 2.63 0 1 0-2.49 1.13L4.41 18.25A1.5 1.5 0 0 0 5.89 19.5H18.11A1.5 1.5 0 0 0 19.59 18.25l1.36-8.14A2.63 2.63 0 0 0 23.25 7.5ZM12 3.75a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 12 3.75ZM2.25 7.5A1.13 1.13 0 1 1 3.38 8.63 1.13 1.13 0 0 1 2.25 7.5ZM18.11 18H5.89L4.58 10.17 7.67 13.97A.75 .75 0 0 0 8.25 14.25a.73 .73 0 0 0 .1-.01 .75 .75 0 0 0 .59-.44l2.75-6.32a2.53 2.53 0 0 0 .63 0l2.75 6.32a.75 .75 0 0 0 .59 .44A.73 .73 0 0 0 15.75 14.25a.75 .75 0 0 0 .58-.28l3.09-3.8ZM20.63 8.63a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 20.63 8.63Z\"],\"faded\":[0]},{\"id\":\"ph-crown-simple-duo\",\"label\":\"Crown simple duotone\",\"set\":\"duotone\",\"paths\":[\"M21.74 8.38l-2.13 9.75a.75 .75 0 0 1-.74 .62H5.13a.75 .75 0 0 1-.74-.62l-2.13-9.75A.75 .75 0 0 1 3.56 7.76L7.5 12l3.82-8.56a.75 .75 0 0 1 1.36 0L16.5 12l3.94-4.24A.75 .75 0 0 1 21.74 8.38Z\",\"M21.65 6.9A1.49 1.49 0 0 0 19.88 7.26l-3.16 3.4-3.36-7.53a.09 .09 0 0 1 0-.01 1.5 1.5 0 0 0-2.72 0 .09 .09 0 0 1 0 .01l-3.36 7.53L4.13 7.26A1.5 1.5 0 0 0 1.52 8.51c0 .01 0 .02 .01 .03L3.66 18.28a1.5 1.5 0 0 0 1.47 1.22H18.87A1.5 1.5 0 0 0 20.34 18.28L22.47 8.54c0-.01 0-.02 .01-.03A1.49 1.49 0 0 0 21.65 6.9ZM18.88 17.97l-.01 .03H5.13l-.01-.03L3 8.25l.01 .02 3.94 4.24a.75 .75 0 0 0 1.24-.2L12 3.75l3.81 8.55a.75 .75 0 0 0 1.24 .2l3.94-4.24L21 8.25Z\"],\"faded\":[0]},{\"id\":\"ph-trophy-duo\",\"label\":\"Trophy duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 4.5v5.92c0 3.72-2.98 6.81-6.7 6.83A6.75 6.75 0 0 1 5.25 10.5V4.5Z\",\"M21.75 6H19.5V4.5a.75 .75 0 0 0-.75-.75H5.25a.75 .75 0 0 0-.75 .75V6H2.25A1.5 1.5 0 0 0 .75 7.5V9a3.75 3.75 0 0 0 3.75 3.75h.34A7.51 7.51 0 0 0 11.25 17.96V20.25H9a.75 .75 0 0 0 0 1.5h6a.75 .75 0 0 0 0-1.5H12.75V17.96c2.99-.3 5.48-2.4 6.38-5.21H19.5a3.75 3.75 0 0 0 3.75-3.75V7.5A1.5 1.5 0 0 0 21.75 6ZM4.5 11.25A2.25 2.25 0 0 1 2.25 9V7.5H4.5v3q0 .38 .04 .75Zm13.5-.83c0 3.33-2.72 6.06-6 6.08a6 6 0 0 1-6-6V5.25H18ZM21.75 9a2.25 2.25 0 0 1-2.25 2.25h-.05a7.67 7.67 0 0 0 .05-.83V7.5h2.25Z\"],\"faded\":[0]},{\"id\":\"ph-medal-duo\",\"label\":\"Medal duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 9a4.5 4.5 0 1 1-4.5-4.5A4.5 4.5 0 0 1 16.5 9Z\",\"M20.25 9A8.25 8.25 0 1 0 6.75 15.36V22.5a.75 .75 0 0 0 1.09 .67L12 21.09l4.17 2.08A.76 .76 0 0 0 16.5 23.25a.75 .75 0 0 0 .75-.75V15.36A8.24 8.24 0 0 0 20.25 9ZM5.25 9a6.75 6.75 0 1 1 6.75 6.75A6.76 6.76 0 0 1 5.25 9ZM15.75 21.29l-3.42-1.71a.75 .75 0 0 0-.67 0L8.25 21.29V16.35a8.24 8.24 0 0 0 7.5 0ZM12 14.25A5.25 5.25 0 1 0 6.75 9 5.26 5.26 0 0 0 12 14.25Zm0-9A3.75 3.75 0 1 1 8.25 9 3.75 3.75 0 0 1 12 5.25Z\"],\"faded\":[0]},{\"id\":\"ph-medal-military-duo\",\"label\":\"Military medal duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 18a3.75 3.75 0 1 1-3.75-3.75A3.75 3.75 0 0 1 15.75 18ZM19.41 4.5H15.75v8.05l4.01-1.82a.84 .84 0 0 0 .5-.77V5.34A.84 .84 0 0 0 19.41 4.5ZM8.25 4.5H4.59a.84 .84 0 0 0-.84 .84v4.61a.84 .84 0 0 0 .5 .77L8.25 12.55Z\",\"M19.41 3.75H4.59A1.59 1.59 0 0 0 3 5.34v4.61a1.59 1.59 0 0 0 .94 1.45l5.87 2.67a4.5 4.5 0 1 0 4.4 0L20.06 11.41a1.59 1.59 0 0 0 .94-1.45V5.34A1.59 1.59 0 0 0 19.41 3.75ZM15 5.25v6.81l-3 1.36L9 12.06V5.25ZM4.5 9.96V5.34a.09 .09 0 0 1 .09-.09H7.5v6.13L4.56 10.04A.09 .09 0 0 1 4.5 9.96ZM12 21a3 3 0 1 1 3-3A3 3 0 0 1 12 21Zm7.5-11.04a.09 .09 0 0 1-.06 .09L16.5 11.38V5.25h2.91a.09 .09 0 0 1 .09 .09Z\"],\"faded\":[0]},{\"id\":\"ph-diamond-duo\",\"label\":\"Diamond duotone\",\"set\":\"duotone\",\"paths\":[\"M21.53 12.53l-9 9a.74 .74 0 0 1-1.05 0l-9-9a.74 .74 0 0 1 0-1.05l9-9a.74 .74 0 0 1 1.05 0l9 9A.74 .74 0 0 1 21.53 12.53Z\",\"M22.06 10.94 13.06 1.94a1.5 1.5 0 0 0-2.11 0l-9 9.01a1.5 1.5 0 0 0 0 2.11l9 9.01h0a1.5 1.5 0 0 0 2.11 0l9-9.01a1.5 1.5 0 0 0 0-2.11ZM12 21h0L3 12 12 3 21 12Z\"],\"faded\":[0]},{\"id\":\"ph-diamonds-four-duo\",\"label\":\"Diamonds duotone\",\"set\":\"duotone\",\"paths\":[\"M12 9.75 8.25 6l3.75-3.75 3.75 3.75ZM8.25 18l3.75 3.75 3.75-3.75-3.75-3.75ZM18 8.25l-3.75 3.75 3.75 3.75 3.75-3.75ZM6 8.25 2.25 12l3.75 3.75 3.75-3.75Z\",\"M11.47 10.28a.75 .75 0 0 0 1.06 0l3.75-3.75a.75 .75 0 0 0 0-1.06l-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06ZM12 3.31 14.69 6 12 8.69 9.31 6Zm.53 10.41a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75a.75 .75 0 0 0 0-1.06ZM12 20.69 9.31 18 12 15.31 14.69 18Zm10.28-9.22-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75A.75 .75 0 0 0 22.28 11.47ZM18 14.69 15.31 12 18 9.31 20.69 12Zm-7.72-3.22-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75A.75 .75 0 0 0 10.28 11.47ZM6 14.69 3.31 12 6 9.31 8.69 12Z\"],\"faded\":[0]},{\"id\":\"ph-gift-duo\",\"label\":\"Gift duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 12v6.75a.75 .75 0 0 1-.75 .75H5.25a.75 .75 0 0 1-.75-.75V12Z\",\"M20.25 6.75H16.96c.04-.03 .07-.06 .11-.09A2.77 2.77 0 0 0 18 4.65 3.06 3.06 0 0 0 14.85 1.5 2.77 2.77 0 0 0 12.84 2.43a5.15 5.15 0 0 0-.84 1.36 5.15 5.15 0 0 0-.84-1.36A2.77 2.77 0 0 0 9.15 1.5 3.06 3.06 0 0 0 6 4.65 2.77 2.77 0 0 0 6.93 6.66c.04 .03 .07 .06 .11 .09H3.75A1.5 1.5 0 0 0 2.25 8.25v3a1.5 1.5 0 0 0 1.5 1.5v6a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V12.75a1.5 1.5 0 0 0 1.5-1.5V8.25A1.5 1.5 0 0 0 20.25 6.75ZM13.97 3.42a1.28 1.28 0 0 1 .94-.42h.05A1.56 1.56 0 0 1 16.5 4.6a1.28 1.28 0 0 1-.42 .94c-.89 .79-2.37 1.07-3.28 1.16C12.91 5.71 13.22 4.27 13.97 3.42Zm-6.01 .03A1.56 1.56 0 0 1 9.06 3h.05a1.28 1.28 0 0 1 .94 .42c.79 .89 1.06 2.36 1.16 3.27-.91-.09-2.39-.37-3.27-1.16a1.28 1.28 0 0 1-.42-.94A1.56 1.56 0 0 1 7.96 3.46ZM3.75 8.25h7.5v3H3.75Zm1.5 4.5h6v6H5.25Zm13.5 6H12.75V12.75h6Zm1.5-7.5H12.75V8.25h7.5v3Z\"],\"faded\":[0]},{\"id\":\"ph-confetti-duo\",\"label\":\"Party duotone\",\"set\":\"duotone\",\"paths\":[\"M5.52 14.52l3.96 3.96-4.75 1.73a.73 .73 0 0 1-.94-.94Zm13.01-.44L9.92 5.46A.73 .73 0 0 0 8.72 5.73l-1.4 3.84 7.11 7.11 3.84-1.4A.73 .73 0 0 0 18.54 14.08Z\",\"M10.45 4.93a1.48 1.48 0 0 0-2.44 .54L3.09 19.01A1.48 1.48 0 0 0 4.48 21a1.5 1.5 0 0 0 .51-.09l13.53-4.92a1.48 1.48 0 0 0 .54-2.44Zm-.78 12.68-3.28-3.28 1.23-3.39 5.44 5.44Zm-5.16 1.88 1.31-3.6 2.29 2.29ZM14.63 15.81 8.19 9.38l1.22-3.36 8.57 8.57ZM15 6.75a3.54 3.54 0 0 1 .36-1.46C15.86 4.3 16.79 3.75 18 3.75c.63 0 1.03-.21 1.28-.68A2.06 2.06 0 0 0 19.5 2.24 .75 .75 0 0 1 21 2.25c0 1.21-.8 3-3 3-.63 0-1.03 .21-1.28 .68A2.06 2.06 0 0 0 16.5 6.76 .75 .75 0 0 1 15 6.75ZM12.75 3.75V1.5a.75 .75 0 0 1 1.5 0V3.75a.75 .75 0 0 1-1.5 0Zm9.53 7.72a.75 .75 0 1 1-1.06 1.06l-1.5-1.5a.75 .75 0 0 1 1.06-1.06Zm.46-4.01-2.25 .75a.75 .75 0 0 1-.47-1.42l2.25-.75a.75 .75 0 0 1 .47 1.42Z\"],\"faded\":[0]},{\"id\":\"ph-smiley-duo\",\"label\":\"Smile duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25ZM7.5 10.13a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 7.5 10.13Zm9 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 10.13Zm-.1 4.5c-.96 1.67-2.57 2.63-4.4 2.63s-3.43-.96-4.4-2.62a.75 .75 0 1 1 1.3-.75c.7 1.21 1.8 1.88 3.1 1.88s2.4-.67 3.1-1.87a.75 .75 0 1 1 1.3 .75Z\"],\"faded\":[0]},{\"id\":\"ph-smiley-wink-duo\",\"label\":\"Wink duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25ZM7.5 10.13a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 7.5 10.13Zm9.75 0a.75 .75 0 0 1-.75 .75H14.25a.75 .75 0 0 1 0-1.5h2.25A.75 .75 0 0 1 17.25 10.13Zm-.85 4.5c-.96 1.67-2.57 2.63-4.4 2.63s-3.43-.96-4.4-2.62a.75 .75 0 1 1 1.3-.75c.7 1.21 1.8 1.88 3.1 1.88s2.4-.67 3.1-1.87a.75 .75 0 1 1 1.3 .75Z\"],\"faded\":[0]},{\"id\":\"ph-smiley-sad-duo\",\"label\":\"Sad duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25ZM7.5 10.13a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 7.5 10.13Zm9 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 10.13Zm-.1 6a.75 .75 0 1 1-1.3 .75c-.7-1.21-1.8-1.87-3.1-1.87s-2.4 .67-3.1 1.88a.75 .75 0 1 1-1.3-.75c.96-1.67 2.57-2.62 4.4-2.62S15.43 14.46 16.4 16.13Z\"],\"faded\":[0]},{\"id\":\"ph-smiley-angry-duo\",\"label\":\"Angry duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M8.63 14.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 8.63 14.25Zm6.75-2.25a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 15.38 12Zm6.38 0A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12ZM16.08 7.63 12 10.35l-4.08-2.72a.75 .75 0 1 0-.83 1.25l4.5 3a.75 .75 0 0 0 .83 0l4.5-3a.75 .75 0 0 0-.83-1.25Zm-1.42 9C13.88 16.1 13.12 15.75 12 15.75s-1.87 .35-2.67 .88a.75 .75 0 0 0 .83 1.25C10.77 17.47 11.25 17.25 12 17.25s1.23 .22 1.83 .62a.75 .75 0 1 0 .83-1.25Z\"],\"faded\":[0]},{\"id\":\"ph-smiley-x-eyes-duo\",\"label\":\"Dizzy duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm5.78-8.78a.75 .75 0 0 1-1.06 1.06L15.75 11.56l-.97 .97a.75 .75 0 0 1-1.06-1.06L14.69 10.5l-.97-.97a.75 .75 0 0 1 1.06-1.06L15.75 9.44l.97-.97a.75 .75 0 0 1 1.06 1.06L16.81 10.5Zm-7.5-1.94L9.31 10.5l.97 .97a.75 .75 0 0 1-1.06 1.06L8.25 11.56 7.28 12.53a.75 .75 0 0 1-1.06-1.06L7.19 10.5 6.22 9.53A.75 .75 0 0 1 7.28 8.47L8.25 9.44 9.22 8.47a.75 .75 0 0 1 1.06 1.06ZM13.13 16.88a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 16.88Z\"],\"faded\":[0]},{\"id\":\"ph-skull-duo\",\"label\":\"Skull duotone\",\"set\":\"duotone\",\"paths\":[\"M12 2.25c-4.97 0-9 3.86-9 8.63 0 3.19 1.81 5.98 4.5 7.47V20.25a.75 .75 0 0 0 .75 .75h7.5a.75 .75 0 0 0 .75-.75V18.35c2.69-1.49 4.5-4.28 4.5-7.47C21 6.11 16.97 2.25 12 2.25ZM8.63 14.25a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 8.63 14.25Zm6.75 0a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 15.38 14.25Z\",\"M8.63 9.75a2.63 2.63 0 1 0 2.63 2.63A2.63 2.63 0 0 0 8.63 9.75Zm0 3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 8.63 13.5Zm6.75-3.75a2.63 2.63 0 1 0 2.63 2.63A2.63 2.63 0 0 0 15.38 9.75Zm0 3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.38 13.5ZM12 1.5C6.62 1.5 2.25 5.71 2.25 10.88c0 3.2 1.71 6.19 4.5 7.9V20.25a1.5 1.5 0 0 0 1.5 1.5h7.5a1.5 1.5 0 0 0 1.5-1.5V18.78C20.04 17.06 21.75 14.07 21.75 10.88 21.75 5.71 17.38 1.5 12 1.5Zm4.14 16.19a.75 .75 0 0 0-.39 .66V20.25H14.25V18a.75 .75 0 0 0-1.5 0v2.25H11.25V18a.75 .75 0 0 0-1.5 0v2.25H8.25V18.35a.75 .75 0 0 0-.39-.66C5.33 16.28 3.75 13.67 3.75 10.88c0-4.34 3.7-7.87 8.25-7.87s8.25 3.53 8.25 7.88C20.25 13.67 18.67 16.28 16.14 17.69Z\"],\"faded\":[0]},{\"id\":\"ph-ghost-duo\",\"label\":\"Ghost duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 11.25v9l-2.75-2.25-2.75 2.25L12 18 9.25 20.25 6.5 18 3.75 20.25V11.25a8.25 8.25 0 0 1 16.5 0Z\",\"M10.5 10.88a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 10.5 10.88Zm4.13-1.12a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 14.63 9.75Zm6.38 1.5v9a.75 .75 0 0 1-1.23 .58l-2.27-1.86L15.23 20.83a.75 .75 0 0 1-.95 0L12 18.97l-2.28 1.86a.75 .75 0 0 1-.95 0L6.5 18.97 4.23 20.83A.75 .75 0 0 1 3 20.25V11.25a9 9 0 0 1 18 0Zm-1.5 0a7.5 7.5 0 0 0-15 0v7.42l1.53-1.25a.75 .75 0 0 1 .95 0l2.28 1.86 2.27-1.86a.75 .75 0 0 1 .95 0l2.27 1.86 2.28-1.86a.75 .75 0 0 1 .95 0L19.5 18.67Z\"],\"faded\":[0]},{\"id\":\"ph-hand-waving-duo\",\"label\":\"Wave duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 19.99A7.5 7.5 0 0 1 7 17.25l-3.75-6.5a1.88 1.88 0 0 1 3.25-1.87L5.16 6.56A1.88 1.88 0 0 1 8.41 4.69l.65 1.13h0a1.88 1.88 0 0 1 3.25-1.87l2.81 4.88A1.88 1.88 0 0 1 18.38 6.94l1.62 2.81A7.5 7.5 0 0 1 17.25 19.99Z\",\"M20.64 9.38 19.02 6.56a2.63 2.63 0 0 0-3.58-.96 2.6 2.6 0 0 0-.84 .78L12.96 3.56a2.63 2.63 0 0 0-4.54 0A2.63 2.63 0 0 0 4.51 6.94l.15 .26A2.59 2.59 0 0 0 3.56 7.54a2.63 2.63 0 0 0-.96 3.59l3.75 6.5a8.2 8.2 0 0 0 5.01 3.84 8.3 8.3 0 0 0 2.15 .28 8.25 8.25 0 0 0 7.13-12.37Zm-.62 5.87A6.75 6.75 0 0 1 7.65 16.88l-3.75-6.5a1.13 1.13 0 0 1 1.95-1.12L7.65 12.38a.75 .75 0 1 0 1.3-.75L5.81 6.19A1.13 1.13 0 1 1 7.76 5.06L10.69 10.13a.75 .75 0 1 0 1.3-.75L9.71 5.44h0a1.13 1.13 0 1 1 1.95-1.12l3.13 5.43a4.5 4.5 0 0 0-.52 5.68 .75 .75 0 0 0 1.24-.84A3 3 0 0 1 16.2 10.5a.75 .75 0 0 0 .2-.98L15.77 8.44A1.13 1.13 0 1 1 17.72 7.31l1.62 2.81A6.71 6.71 0 0 1 20.02 15.25ZM17.27 2.97A.75 .75 0 0 1 18.19 2.44a5.59 5.59 0 0 1 3.42 2.63l.03 .05a.75 .75 0 1 1-1.3 .75l-.03-.05a4.09 4.09 0 0 0-2.51-1.92A.75 .75 0 0 1 17.27 2.97ZM7.58 22.22a.75 .75 0 0 1-1.05 .12A11.21 11.21 0 0 1 3.76 19.13a.75 .75 0 0 1 1.3-.75 9.72 9.72 0 0 0 2.4 2.79A.75 .75 0 0 1 7.58 22.22Z\"],\"faded\":[0]},{\"id\":\"ph-hand-heart-duo\",\"label\":\"Hand heart duotone\",\"set\":\"duotone\",\"paths\":[\"M1.5 14.25H4.5v5.25H1.5a.75 .75 0 0 1-.75-.75V15A.75 .75 0 0 1 1.5 14.25ZM18.05 3.75A3.67 3.67 0 0 0 14.63 6a3.67 3.67 0 0 0-3.43-2.25C9.16 3.75 7.5 5.47 7.5 7.5c0 1.37 .66 2.6 1.57 3.75H13.13a1.88 1.88 0 0 1 0 3.75h.38l3.54-.81C19.11 12.66 21.75 10.24 21.75 7.5 21.75 5.47 20.09 3.75 18.05 3.75Z\",\"M21.59 13.22a2.28 2.28 0 0 0-1.74-.45C21.61 11 22.5 9.23 22.5 7.5c0-2.48-2-4.5-4.45-4.5A4.46 4.46 0 0 0 14.63 4.57 4.46 4.46 0 0 0 11.2 3C8.75 3 6.75 5.02 6.75 7.5c0 1.03 .3 2.03 .94 3.09a2.99 2.99 0 0 0-1.38 .79L4.19 13.5H1.5A1.5 1.5 0 0 0 0 15v3.75a1.5 1.5 0 0 0 1.5 1.5H11.25a.74 .74 0 0 0 .18-.02l6-1.5a.65 .65 0 0 0 .11-.04L21.19 17.14l.04-.02a2.31 2.31 0 0 0 .37-3.9ZM11.2 4.5A2.92 2.92 0 0 1 13.93 6.28a.75 .75 0 0 0 1.39 0 2.92 2.92 0 0 1 2.73-1.78C19.65 4.5 21 5.87 21 7.5c0 1.83-1.48 3.9-4.28 5.99l-1.04 .24A2.63 2.63 0 0 0 13.13 10.5H9.44C8.63 9.41 8.25 8.45 8.25 7.5 8.25 5.87 9.6 4.5 11.2 4.5ZM1.5 15H3.75v3.75H1.5Zm19.07 .77-3.56 1.52L11.16 18.75H5.25V14.56l2.12-2.12A1.49 1.49 0 0 1 8.43 12H13.13a1.13 1.13 0 0 1 0 2.25H10.5a.75 .75 0 0 0 0 1.5h3a.78 .78 0 0 0 .17-.02l6.28-1.44 .03-.01a.81 .81 0 0 1 .59 1.49Z\"],\"faded\":[0]},{\"id\":\"ph-handshake-duo\",\"label\":\"Handshake duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 14.25l-3.75 3.75L9 16.5 3.75 12.75 6.81 6.62 12 5.25l5.19 1.37L17.21 6.75H13.5L9.22 10.9a.75 .75 0 0 0 .13 1.16C10.99 13.12 13.22 13.04 15 11.25Z\",\"M23.84 10.12 21.45 5.33a1.5 1.5 0 0 0-2.01-.67L17.1 5.82 12.19 4.53a.76 .76 0 0 0-.38 0L6.9 5.82 4.56 4.66a1.5 1.5 0 0 0-2.01 .67L.16 10.12a1.5 1.5 0 0 0 .67 2.01l2.53 1.27 5.2 3.72a.76 .76 0 0 0 .25 .12l6 1.5a.75 .75 0 0 0 .71-.2l5.16-5.16 2.48-1.24a1.5 1.5 0 0 0 .67-2.01Zm-5.15 3.13L15.47 10.66a.75 .75 0 0 0-1 .06C12.8 12.4 10.94 12.19 9.75 11.44L13.8 7.5h2.98l2.55 5.1ZM3.89 6 5.81 6.96 3.42 11.74 1.5 10.79Zm10.88 11.17L9.32 15.81l-4.61-3.29 2.63-5.25L12 6.03l.92 .24-4.22 4.1-.01 .01a1.5 1.5 0 0 0 .26 2.33c1.93 1.23 4.25 1.03 6.09-.47L17.63 14.31Zm5.81-5.43-2.39-4.78L20.11 6 22.5 10.79Zm-8.23 8.69a.75 .75 0 0 1-.73 .57 .76 .76 0 0 1-.18-.02L7.54 20a.74 .74 0 0 1-.25-.12L4.81 18.12a.75 .75 0 0 1 .87-1.22l2.35 1.68L11.81 19.52A.75 .75 0 0 1 12.36 20.43Z\"],\"faded\":[0]},{\"id\":\"ph-hands-clapping-duo\",\"label\":\"Clap duotone\",\"set\":\"duotone\",\"paths\":[\"M18.66 17.6h0A6.72 6.72 0 0 0 17.84 13.13l-1.89-3.28a1.69 1.69 0 0 0-2.96 1.62L10.75 7.59A1.69 1.69 0 1 0 7.83 9.28L7.29 8.34 6.1 6.28A1.69 1.69 0 1 1 9.03 4.59L9.56 5.53a1.69 1.69 0 1 1 2.92-1.69l2.27 3.94a1.69 1.69 0 0 1 2.93-1.69l1.98 3.43A6.75 6.75 0 0 1 18.66 17.6Z\",\"M15.02 2.25V.75a.75 .75 0 0 1 1.5 0V2.25a.75 .75 0 0 1-1.5 0ZM18.38 3.84a.74 .74 0 0 0 .39 .11 .75 .75 0 0 0 .64-.36l.75-1.23a.75 .75 0 0 0-1.28-.78l-.75 1.23A.75 .75 0 0 0 18.38 3.84Zm4.45 1.18a.75 .75 0 0 0-.94-.48l-1.41 .45a.75 .75 0 0 0 .23 1.46 .76 .76 0 0 0 .23-.04l1.41-.45A.75 .75 0 0 0 22.84 5.02ZM20.34 9.15a7.52 7.52 0 0 1-.96 8.81c-.03 .16-.07 .32-.11 .49A7.52 7.52 0 0 1 5.51 20.25L2.2 14.53a2.44 2.44 0 0 1 1.8-3.64l-.28-.49a2.44 2.44 0 0 1 1.8-3.64L5.46 6.66A2.44 2.44 0 0 1 8.95 3.42 2.44 2.44 0 0 1 13.15 3.47l1.15 1.99A2.44 2.44 0 0 1 18.36 5.72ZM10.23 5.16l0 0h0l2.34 4.05a2.44 2.44 0 0 1 1.62-.94L11.85 4.22a.94 .94 0 1 0-1.63 .94ZM6.76 5.91l.61 1.05a2.44 2.44 0 0 1 1.62-.94L8.39 4.97A.94 .94 0 1 0 6.76 5.91Zm10.46 7.59-1.9-3.28a.94 .94 0 0 0-1.66 .87L14.84 13.13a.75 .75 0 0 1-1.3 .75l-3.42-5.91A.94 .94 0 1 0 8.49 8.91l2.44 4.22a.75 .75 0 0 1-1.3 .75L6.66 8.72h0l0 0a.94 .94 0 0 0-1.62 .94l3.3 5.72A.75 .75 0 0 1 7.03 16.13L5.13 12.84a.94 .94 0 0 0-1.63 .94l3.31 5.72a6.01 6.01 0 0 0 11.01-1.45A5.96 5.96 0 0 0 17.22 13.5Zm1.82-3.6L17.06 6.47A.94 .94 0 0 0 15.43 7.41l3.09 5.35A7.52 7.52 0 0 1 19.41 15.14 6.02 6.02 0 0 0 19.04 9.9Z\"],\"faded\":[0]},{\"id\":\"ph-hand-pointing-duo\",\"label\":\"Point duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 10.88v3.38a7.5 7.5 0 0 1-7.5 7.5c-4.14 0-5.23-2.25-8.75-8.44a1.88 1.88 0 0 1 3.25-1.87L9 14.25V4.13a1.88 1.88 0 0 1 3.75 0v5.25a1.88 1.88 0 0 1 3.75 0v1.5a1.88 1.88 0 0 1 3.75 0Z\",\"M18.38 8.25a2.61 2.61 0 0 0-1.25 .32A2.63 2.63 0 0 0 13.5 7V4.13a2.63 2.63 0 0 0-5.25 0v7.5l-.36-.57A2.63 2.63 0 0 0 3.35 13.69l.44 .77C7.01 20.15 8.35 22.5 12.75 22.5a8.26 8.26 0 0 0 8.25-8.25V10.88A2.63 2.63 0 0 0 18.38 8.25Zm1.13 6a6.76 6.76 0 0 1-6.75 6.75c-3.53 0-4.49-1.69-7.66-7.28l-.44-.78 0 0A1.13 1.13 0 0 1 5.06 11.4a1.11 1.11 0 0 1 .56-.15 1.13 1.13 0 0 1 .98 .56 .17 .17 0 0 0 .01 .02l1.75 2.81A.75 .75 0 0 0 9.75 14.25V4.13a1.13 1.13 0 0 1 2.25 0v6.38a.75 .75 0 0 0 1.5 0V9.38a1.13 1.13 0 0 1 2.25 0v1.88a.75 .75 0 0 0 1.5 0v-.37a1.13 1.13 0 0 1 2.25 0Z\"],\"faded\":[0]},{\"id\":\"ph-user-duo\",\"label\":\"User duotone\",\"set\":\"duotone\",\"paths\":[\"M18 9a6 6 0 1 1-6-6A6 6 0 0 1 18 9Z\",\"M21.65 19.88c-1.43-2.47-3.63-4.24-6.2-5.08a6.75 6.75 0 1 0-6.91 0C5.98 15.64 3.78 17.41 2.35 19.88a.75 .75 0 1 0 1.3 .75c1.77-3.05 4.89-4.87 8.35-4.87s6.58 1.82 8.35 4.88a.75 .75 0 1 0 1.3-.75ZM6.75 9a5.25 5.25 0 1 1 5.25 5.25A5.26 5.26 0 0 1 6.75 9Z\"],\"faded\":[0]},{\"id\":\"ph-users-duo\",\"label\":\"Users duotone\",\"set\":\"duotone\",\"paths\":[\"M12.75 10.13A4.88 4.88 0 1 1 7.88 5.25 4.88 4.88 0 0 1 12.75 10.13Z\",\"M10.99 14.81a5.63 5.63 0 1 0-6.23 0A8.98 8.98 0 0 0 .33 18.34a.75 .75 0 1 0 1.26 .82 7.5 7.5 0 0 1 12.58 0 .75 .75 0 0 0 1.26-.82A8.98 8.98 0 0 0 10.99 14.81ZM3.75 10.13a4.13 4.13 0 1 1 4.13 4.13A4.13 4.13 0 0 1 3.75 10.13Zm19.7 9.25a.75 .75 0 0 1-1.04-.22A7.48 7.48 0 0 0 16.13 15.75a.75 .75 0 0 1 0-1.5 4.13 4.13 0 1 0-1.53-7.96 .75 .75 0 1 1-.56-1.39 5.63 5.63 0 0 1 5.21 9.9 8.98 8.98 0 0 1 4.43 3.54A.75 .75 0 0 1 23.45 19.38Z\"],\"faded\":[0]},{\"id\":\"ph-user-plus-duo\",\"label\":\"Add user duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 9.38a5.63 5.63 0 1 1-5.62-5.62A5.63 5.63 0 0 1 15.75 9.38Z\",\"M24 12.75a.75 .75 0 0 1-.75 .75H21.75v1.5a.75 .75 0 0 1-1.5 0V13.5H18.75a.75 .75 0 0 1 0-1.5h1.5V10.5a.75 .75 0 0 1 1.5 0v1.5h1.5A.75 .75 0 0 1 24 12.75Zm-5.43 5.52a.75 .75 0 0 1-1.15 .97C15.54 16.99 12.95 15.75 10.13 15.75s-5.41 1.24-7.3 3.48a.75 .75 0 0 1-1.15-.97c1.4-1.67 3.14-2.85 5.08-3.48a6.38 6.38 0 1 1 6.74 0C15.43 15.42 17.17 16.6 18.57 18.27ZM10.13 14.25a4.88 4.88 0 1 0-4.87-4.87A4.88 4.88 0 0 0 10.13 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-user-minus-duo\",\"label\":\"Remove user duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 9.38a5.63 5.63 0 1 1-5.62-5.62A5.63 5.63 0 0 1 15.75 9.38Z\",\"M24 12.75a.75 .75 0 0 1-.75 .75H18.75a.75 .75 0 0 1 0-1.5h4.5A.75 .75 0 0 1 24 12.75Zm-5.43 5.52a.75 .75 0 0 1-1.15 .97C15.54 16.99 12.95 15.75 10.13 15.75s-5.41 1.24-7.3 3.48a.75 .75 0 0 1-1.15-.97c1.4-1.67 3.14-2.85 5.08-3.48a6.38 6.38 0 1 1 6.74 0C15.43 15.42 17.17 16.6 18.57 18.27ZM10.13 14.25a4.88 4.88 0 1 0-4.87-4.87A4.88 4.88 0 0 0 10.13 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-user-check-duo\",\"label\":\"Verified user duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 9.38a5.63 5.63 0 1 1-5.62-5.62A5.63 5.63 0 0 1 15.75 9.38Z\",\"M13.5 14.78a6.38 6.38 0 1 0-6.74 0c-1.94 .63-3.68 1.82-5.08 3.48a.75 .75 0 0 0 1.15 .97C4.71 16.99 7.3 15.75 10.13 15.75s5.41 1.24 7.3 3.48a.75 .75 0 0 0 1.15-.97C17.17 16.6 15.43 15.42 13.5 14.78ZM5.25 9.38a4.88 4.88 0 1 1 4.88 4.88A4.88 4.88 0 0 1 5.25 9.38Zm18.53 3.16-3 3a.75 .75 0 0 1-1.06 0l-1.5-1.5a.75 .75 0 0 1 1.06-1.06L20.25 13.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06Z\"],\"faded\":[0]},{\"id\":\"ph-identification-badge-duo\",\"label\":\"ID badge duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 3H5.25a.75 .75 0 0 0-.75 .75V20.25a.75 .75 0 0 0 .75 .75H18.75a.75 .75 0 0 0 .75-.75V3.75A.75 .75 0 0 0 18.75 3ZM12 15.75a3 3 0 1 1 3-3A3 3 0 0 1 12 15.75Z\",\"M7.05 18.6a.75 .75 0 0 0 1.05-.15 4.88 4.88 0 0 1 7.8 0 .75 .75 0 1 0 1.2-.9A6.36 6.36 0 0 0 14.53 15.52a3.75 3.75 0 1 0-5.06 0A6.36 6.36 0 0 0 6.9 17.55 .75 .75 0 0 0 7.05 18.6ZM12 10.5a2.25 2.25 0 1 1-2.25 2.25A2.25 2.25 0 0 1 12 10.5Zm6.75-8.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V3.75A1.5 1.5 0 0 0 18.75 2.25Zm0 18H5.25V3.75H18.75ZM8.25 6a.75 .75 0 0 1 .75-.75h6a.75 .75 0 0 1 0 1.5H9A.75 .75 0 0 1 8.25 6Z\"],\"faded\":[0]},{\"id\":\"ph-megaphone-duo\",\"label\":\"Announcement duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 11.25a3.75 3.75 0 0 1-3.75 3.75H15V7.5h3.75A3.75 3.75 0 0 1 22.5 11.25Z\",\"M23.25 11.25a4.5 4.5 0 0 0-4.5-4.5H15.02c-.27-.02-5.03-.35-9.55-4.15A1.5 1.5 0 0 0 3 3.75V18.75a1.5 1.5 0 0 0 2.46 1.15c3.54-2.97 7.22-3.82 8.79-4.06v2.97A1.5 1.5 0 0 0 14.92 20.06l1.03 .69A1.5 1.5 0 0 0 18.23 19.88l1.1-4.16A4.51 4.51 0 0 0 23.25 11.25ZM4.5 18.74V3.75h0c4.01 3.37 8.12 4.22 9.75 4.43v6.14C12.62 14.53 8.52 15.38 4.5 18.74Zm12.28 .75 0 .01-1.03-.69V15.75h2.03ZM18.75 14.25H15.75V8.25h3a3 3 0 1 1 0 6Z\"],\"faded\":[0]},{\"id\":\"ph-bell-duo\",\"label\":\"Bell duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 18H4.5a.75 .75 0 0 1-.64-1.12C4.47 15.81 5.25 13.11 5.25 9.75a6.75 6.75 0 0 1 13.5 0c0 3.36 .78 6.06 1.4 7.13A.75 .75 0 0 1 19.5 18Z\",\"M20.79 16.49C20.27 15.6 19.5 13.06 19.5 9.75a7.5 7.5 0 1 0-15 0c0 3.31-.77 5.85-1.29 6.74A1.5 1.5 0 0 0 4.5 18.75H8.33a3.75 3.75 0 0 0 7.35 0H19.5a1.5 1.5 0 0 0 1.29-2.26ZM12 20.25a2.25 2.25 0 0 1-2.12-1.5h4.24A2.25 2.25 0 0 1 12 20.25ZM4.5 17.25c.72-1.24 1.5-4.12 1.5-7.5a6 6 0 1 1 12 0c0 3.38 .78 6.26 1.5 7.5Z\"],\"faded\":[0]},{\"id\":\"ph-bell-ringing-duo\",\"label\":\"Ping duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 18H4.5a.75 .75 0 0 1-.64-1.12C4.47 15.81 5.25 13.86 5.25 10.5a6.75 6.75 0 0 1 13.5 0c0 3.36 .78 5.31 1.4 6.38A.75 .75 0 0 1 19.5 18Z\",\"M21 6.67a.75 .75 0 0 1-1.01-.32 8.82 8.82 0 0 0-3.14-3.46 .75 .75 0 1 1 .8-1.27 10.45 10.45 0 0 1 3.67 4.04A.75 .75 0 0 1 21 6.67ZM3.35 6.75a.75 .75 0 0 0 .67-.4A8.82 8.82 0 0 1 7.15 2.88a.75 .75 0 1 0-.8-1.27A10.45 10.45 0 0 0 2.68 5.66 .75 .75 0 0 0 3.35 6.75Zm17.45 9.74A1.5 1.5 0 0 1 19.5 18.75H15.68a3.75 3.75 0 0 1-7.35 0H4.5a1.5 1.5 0 0 1-1.29-2.26C4.05 15.04 4.5 12.96 4.5 10.5a7.5 7.5 0 0 1 15 0C19.5 12.96 19.95 15.04 20.79 16.49ZM14.12 18.75H9.88a2.25 2.25 0 0 0 4.24 0ZM19.5 17.25c-1-1.71-1.5-3.98-1.5-6.75a6 6 0 0 0-12 0c0 2.77-.5 5.04-1.5 6.75Z\"],\"faded\":[0]},{\"id\":\"ph-chat-circle-duo\",\"label\":\"Message duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12A9 9 0 0 1 7.49 19.79h0L3.99 20.96a.75 .75 0 0 1-.95-.95l1.17-3.51h0A9 9 0 1 1 21 12Z\",\"M12 2.25A9.75 9.75 0 0 0 3.39 16.58L2.33 19.77a1.5 1.5 0 0 0 1.9 1.9l3.19-1.06A9.75 9.75 0 1 0 12 2.25Zm0 18a8.24 8.24 0 0 1-4.13-1.11 .75 .75 0 0 0-.61-.06L3.75 20.25 4.92 16.74a.75 .75 0 0 0-.06-.61A8.25 8.25 0 1 1 12 20.25Z\"],\"faded\":[0]},{\"id\":\"ph-chat-circle-dots-duo\",\"label\":\"Typing duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12A9 9 0 0 1 7.49 19.79h0L3.99 20.96a.75 .75 0 0 1-.95-.95l1.17-3.51h0A9 9 0 1 1 21 12Z\",\"M12 2.25A9.75 9.75 0 0 0 3.39 16.58L2.33 19.77a1.5 1.5 0 0 0 1.9 1.9l3.19-1.06A9.75 9.75 0 1 0 12 2.25Zm0 18a8.24 8.24 0 0 1-4.13-1.11 .75 .75 0 0 0-.37-.1 .74 .74 0 0 0-.24 .04L3.75 20.25 4.92 16.74a.75 .75 0 0 0-.06-.61A8.25 8.25 0 1 1 12 20.25Zm1.13-8.25a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 12Zm-4.12 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9 12Zm8.25 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 17.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-chats-duo\",\"label\":\"Chat duotone\",\"set\":\"duotone\",\"paths\":[\"M21 9V21l-3.71-3H8.25a.75 .75 0 0 1-.75-.75V13.5h8.25a.75 .75 0 0 0 .75-.75V8.25h3.75A.75 .75 0 0 1 21 9Z\",\"M20.25 7.5H17.25V4.5a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 4.5V16.5a.75 .75 0 0 0 1.22 .58L6.75 14.44V17.25a1.5 1.5 0 0 0 1.5 1.5h8.77L20.53 21.58a.75 .75 0 0 0 .47 .17 .75 .75 0 0 0 .75-.75V9A1.5 1.5 0 0 0 20.25 7.5ZM6.24 12.92 3.75 14.93V4.5H15.75v8.25H6.71A.75 .75 0 0 0 6.24 12.92ZM20.25 19.43l-2.49-2.01a.75 .75 0 0 0-.47-.17H8.25V14.25h7.5a1.5 1.5 0 0 0 1.5-1.5V9h3Z\"],\"faded\":[0]},{\"id\":\"ph-envelope-duo\",\"label\":\"Mail duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25l-9 8.25L3 5.25Z\",\"M21 4.5H3a.75 .75 0 0 0-.75 .75V18a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A.75 .75 0 0 0 21 4.5Zm-9 7.98L4.93 6H19.07ZM9.25 12 3.75 17.04V6.96Zm1.11 1.02 1.13 1.04a.75 .75 0 0 0 1.01 0l1.13-1.04 5.44 4.98H4.93ZM14.75 12 20.25 6.95V17.05Z\"],\"faded\":[0]},{\"id\":\"ph-paper-plane-tilt-duo\",\"label\":\"Send duotone\",\"set\":\"duotone\",\"paths\":[\"M20.97 3.95l-5.46 18a.75 .75 0 0 1-1.4 .12L10.13 13.88 1.93 9.89a.75 .75 0 0 1 .12-1.4l18-5.46A.75 .75 0 0 1 20.97 3.95Z\",\"M21.31 2.69a1.5 1.5 0 0 0-1.47-.38l-.01 0L1.83 7.77a1.5 1.5 0 0 0-.23 2.79L9.56 14.44l3.87 7.96A1.49 1.49 0 0 0 14.79 23.25q.06 0 .13-.01a1.49 1.49 0 0 0 1.31-1.08l5.46-17.99c0 0 0-.01 0-.01A1.5 1.5 0 0 0 21.31 2.69ZM14.8 21.74l0 .01 0-.01-3.76-7.72 4.5-4.5a.75 .75 0 0 0-1.06-1.06l-4.5 4.5L2.26 9.21l-.01 0 .01 0L20.25 3.75Z\"],\"faded\":[0]},{\"id\":\"ph-at-duo\",\"label\":\"Mention duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25a9.75 9.75 0 0 0 0 19.5c2.02 0 4.13-.61 5.67-1.62a.75 .75 0 0 0-.83-1.25C15.56 19.72 13.71 20.25 12 20.25a8.25 8.25 0 1 1 8.25-8.25c0 2.48-1.02 3-1.87 3s-1.87-.52-1.87-3V8.25a.75 .75 0 0 0-1.5 0v.4a4.5 4.5 0 1 0 .56 6.1c.56 1.13 1.53 1.75 2.82 1.75 2.11 0 3.38-1.68 3.38-4.5A9.76 9.76 0 0 0 12 2.25Zm0 12.75a3 3 0 1 1 3-3A3 3 0 0 1 12 15Z\"],\"faded\":[0]},{\"id\":\"ph-hash-duo\",\"label\":\"Channel duotone\",\"set\":\"duotone\",\"paths\":[\"M15.55 9l-1.09 6h-6l1.09-6Z\",\"M21 8.25H16.44l.79-4.37a.75 .75 0 0 0-1.48-.27l-.84 4.63H10.44l.79-4.37a.75 .75 0 0 0-1.48-.27L8.92 8.25H4.5a.75 .75 0 0 0 0 1.5H8.65L7.83 14.25H3a.75 .75 0 0 0 0 1.5H7.56l-.79 4.37a.75 .75 0 0 0 .6 .87A.73 .73 0 0 0 7.5 21a.75 .75 0 0 0 .74-.62l.84-4.63H13.56l-.79 4.37a.75 .75 0 0 0 .6 .87A.73 .73 0 0 0 13.5 21a.75 .75 0 0 0 .74-.62l.84-4.63H19.5a.75 .75 0 0 0 0-1.5H15.35l.82-4.5H21a.75 .75 0 0 0 0-1.5Zm-7.17 6H9.35l.82-4.5h4.47Z\"],\"faded\":[0]},{\"id\":\"ph-microphone-duo\",\"label\":\"Mic duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 6v6a3.75 3.75 0 0 1-3.75 3.75h0a3.75 3.75 0 0 1-3.75-3.75V6a3.75 3.75 0 0 1 3.75-3.75h0A3.75 3.75 0 0 1 15.75 6Z\",\"M12 16.5a4.5 4.5 0 0 0 4.5-4.5V6a4.5 4.5 0 0 0-9 0v6A4.5 4.5 0 0 0 12 16.5ZM9 6a3 3 0 0 1 6 0v6a3 3 0 0 1-6 0Zm3.75 13.46V22.5a.75 .75 0 0 1-1.5 0V19.46A7.51 7.51 0 0 1 4.5 12a.75 .75 0 0 1 1.5 0 6 6 0 0 0 12 0 .75 .75 0 0 1 1.5 0A7.51 7.51 0 0 1 12.75 19.46Z\"],\"faded\":[0]},{\"id\":\"ph-headphones-duo\",\"label\":\"Headphones duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 13.5v3.75a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V12H6A1.5 1.5 0 0 1 7.5 13.5Zm10.5-1.5a1.5 1.5 0 0 0-1.5 1.5v3.75a1.5 1.5 0 0 0 1.5 1.5h1.5a1.5 1.5 0 0 0 1.5-1.5V12Z\",\"M18.93 5.12A9.76 9.76 0 0 0 2.25 12v5.25a2.25 2.25 0 0 0 2.25 2.25H6a2.25 2.25 0 0 0 2.25-2.25V13.5a2.25 2.25 0 0 0-2.25-2.25H3.78A8.25 8.25 0 0 1 12 3.75h.06a8.22 8.22 0 0 1 8.16 7.5H18a2.25 2.25 0 0 0-2.25 2.25v3.75a2.25 2.25 0 0 0 2.25 2.25h1.5a2.25 2.25 0 0 0 2.25-2.25V12A9.69 9.69 0 0 0 18.93 5.12ZM6 12.75a.75 .75 0 0 1 .75 .75v3.75a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V12.75Zm14.25 4.5a.75 .75 0 0 1-.75 .75H18a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 .75-.75h2.25Z\"],\"faded\":[0]},{\"id\":\"ph-speaker-high-duo\",\"label\":\"Volume duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 8.25v7.5H3a.75 .75 0 0 1-.75-.75V9a.75 .75 0 0 1 .75-.75Z\",\"M14.58 2.33a.75 .75 0 0 0-.79 .08L7.24 7.5H3A1.5 1.5 0 0 0 1.5 9v6a1.5 1.5 0 0 0 1.5 1.5H7.24l6.55 5.09A.75 .75 0 0 0 15 21V3A.75 .75 0 0 0 14.58 2.33ZM3 9H6.75v6H3ZM13.5 19.47 8.25 15.38V8.62l5.25-4.08Zm5.06-9.94a3.75 3.75 0 0 1 0 4.96 .75 .75 0 0 1-1.12-.99 2.25 2.25 0 0 0 0-2.97 .75 .75 0 0 1 1.13-.99ZM23.25 12a7.49 7.49 0 0 1-1.91 5 .75 .75 0 0 1-1.12-1 6 6 0 0 0 0-8 .75 .75 0 1 1 1.12-1A7.48 7.48 0 0 1 23.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-calendar-duo\",\"label\":\"Calendar duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V8.25H3.75V4.5a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 4.5Z\",\"M19.5 3H17.25V2.25a.75 .75 0 0 0-1.5 0v.75H8.25V2.25a.75 .75 0 0 0-1.5 0v.75H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM6.75 4.5v.75a.75 .75 0 0 0 1.5 0V4.5h7.5v.75a.75 .75 0 0 0 1.5 0V4.5h2.25V7.5H4.5V4.5ZM19.5 19.5H4.5V9H19.5V19.5Zm-9-8.25v6a.75 .75 0 0 1-1.5 0V12.46l-.41 .21a.75 .75 0 0 1-.67-1.34l1.5-.75A.75 .75 0 0 1 10.5 11.25Zm5.55 2.85L14.25 16.5h1.5a.75 .75 0 0 1 0 1.5H12.75a.75 .75 0 0 1-.6-1.2l2.7-3.6A.75 .75 0 1 0 13.6 12.38a.75 .75 0 1 1-1.3-.75A2.25 2.25 0 0 1 16.5 12.75 2.23 2.23 0 0 1 16.05 14.1Z\"],\"faded\":[0]},{\"id\":\"ph-calendar-check-duo\",\"label\":\"Event duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V8.25H3.75V4.5a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 4.5Z\",\"M19.5 3H17.25V2.25a.75 .75 0 0 0-1.5 0v.75H8.25V2.25a.75 .75 0 0 0-1.5 0v.75H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM6.75 4.5v.75a.75 .75 0 0 0 1.5 0V4.5h7.5v.75a.75 .75 0 0 0 1.5 0V4.5h2.25V7.5H4.5V4.5ZM19.5 19.5H4.5V9H19.5V19.5Zm-3.59-8.03a.75 .75 0 0 1 0 1.06l-4.5 4.5a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.88 15.44l3.97-3.97A.75 .75 0 0 1 15.91 11.47Z\"],\"faded\":[0]},{\"id\":\"ph-clock-duo\",\"label\":\"Clock duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm6-8.25a.75 .75 0 0 1-.75 .75H12a.75 .75 0 0 1-.75-.75V6.75a.75 .75 0 0 1 1.5 0v4.5h4.5A.75 .75 0 0 1 18 12Z\"],\"faded\":[0]},{\"id\":\"ph-timer-duo\",\"label\":\"Timer duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12.75a8.25 8.25 0 1 1-8.25-8.25A8.25 8.25 0 0 1 20.25 12.75Z\",\"M12 3.75a9 9 0 1 0 9 9A9.01 9.01 0 0 0 12 3.75Zm0 16.5a7.5 7.5 0 1 1 7.5-7.5A7.51 7.51 0 0 1 12 20.25ZM16.28 8.47a.75 .75 0 0 1 0 1.06l-3.75 3.75a.75 .75 0 0 1-1.06-1.06l3.75-3.75A.75 .75 0 0 1 16.28 8.47ZM9 1.5a.75 .75 0 0 1 .75-.75h4.5a.75 .75 0 0 1 0 1.5H9.75A.75 .75 0 0 1 9 1.5Z\"],\"faded\":[0]},{\"id\":\"ph-hourglass-duo\",\"label\":\"Hourglass duotone\",\"set\":\"duotone\",\"paths\":[\"M17.7 7.69 12 12 6.3 7.73A.75 .75 0 0 1 6 7.13V3.75a.75 .75 0 0 1 .75-.75H17.25a.75 .75 0 0 1 .75 .75V7.09A.75 .75 0 0 1 17.7 7.69ZM6 16.88v3.38a.75 .75 0 0 0 .75 .75H17.25a.75 .75 0 0 0 .75-.75V16.91a.75 .75 0 0 0-.3-.6L12 12 6.3 16.27A.75 .75 0 0 0 6 16.88Z\",\"M18.75 7.09V3.75a1.5 1.5 0 0 0-1.5-1.5H6.75A1.5 1.5 0 0 0 5.25 3.75V7.13a1.51 1.51 0 0 0 .6 1.2L10.75 12 5.85 15.68A1.51 1.51 0 0 0 5.25 16.88v3.38a1.5 1.5 0 0 0 1.5 1.5H17.25a1.5 1.5 0 0 0 1.5-1.5V16.91a1.51 1.51 0 0 0-.6-1.2L13.24 12l4.91-3.71A1.51 1.51 0 0 0 18.75 7.09ZM17.25 20.25H6.75V16.88l5.25-3.94 5.25 3.97Zm0-13.16L12 11.06 6.75 7.13V3.75H17.25Z\"],\"faded\":[0]},{\"id\":\"ph-push-pin-duo\",\"label\":\"Pin duotone\",\"set\":\"duotone\",\"paths\":[\"M21.53 9.22 16.16 14.61c1.07 2.15-.16 4.3-.95 5.34a.75 .75 0 0 1-1.12 .08L3.97 9.92A.75 .75 0 0 1 4.03 8.8c2.78-2.24 5.38-.94 5.38-.94l5.37-5.39a.75 .75 0 0 1 1.06 0L21.53 8.16A.75 .75 0 0 1 21.53 9.22Z\",\"M22.06 7.63 16.37 1.94a1.5 1.5 0 0 0-2.12 0L9.22 6.98c-1-.31-3.28-.69-5.66 1.23a1.5 1.5 0 0 0-.12 2.23L7.97 14.97 3.97 18.97a.75 .75 0 0 0 1.06 1.06L9.03 16.03l4.53 4.53A1.5 1.5 0 0 0 14.62 21c.04 0 .07 0 .11 0a1.49 1.49 0 0 0 1.09-.59c1.84-2.45 1.66-4.44 1.24-5.62L22.06 9.75A1.5 1.5 0 0 0 22.06 7.63ZM21 8.69h0l-5.37 5.39a.75 .75 0 0 0-.14 .86c.89 1.77-.17 3.62-.88 4.56L4.5 9.38c1.13-.91 2.22-1.15 3.05-1.15A3.76 3.76 0 0 1 9.08 8.53a.75 .75 0 0 0 .87-.14L15.31 3 21 8.69Z\"],\"faded\":[0]},{\"id\":\"ph-bookmark-simple-duo\",\"label\":\"Bookmark duotone\",\"set\":\"duotone\",\"paths\":[\"M18 4.5V21l-6-3.75L6 21V4.5a.75 .75 0 0 1 .75-.75H17.25A.75 .75 0 0 1 18 4.5Z\",\"M17.25 3H6.75A1.5 1.5 0 0 0 5.25 4.5V21a.75 .75 0 0 0 1.15 .64L12 18.13l5.6 3.5A.75 .75 0 0 0 18.75 21V4.5A1.5 1.5 0 0 0 17.25 3Zm0 16.65-4.85-3.03a.75 .75 0 0 0-.79 0L6.75 19.65V4.5H17.25Z\"],\"faded\":[0]},{\"id\":\"ph-flag-duo\",\"label\":\"Flag duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V16.5c-6 5.2-10.5-5.2-16.5 0V5.25C10.5 .05 15 10.45 21 5.25Z\",\"M4.01 4.69A.75 .75 0 0 0 3.75 5.25V21a.75 .75 0 0 0 1.5 0V16.85c2.51-1.98 4.68-.91 7.17 .32 1.54 .76 3.19 1.58 4.97 1.58 1.31 0 2.68-.45 4.11-1.69a.75 .75 0 0 0 .26-.56V5.25A.75 .75 0 0 0 20.51 4.69c-2.62 2.27-4.85 1.17-7.43-.11C10.41 3.26 7.39 1.76 4.01 4.69ZM20.25 16.15c-2.51 1.98-4.68 .91-7.17-.32-2.34-1.16-4.95-2.45-7.83-.79V5.61c2.51-1.98 4.68-.91 7.17 .32 2.34 1.16 4.95 2.45 7.83 .79Z\"],\"faded\":[0]},{\"id\":\"ph-link-duo\",\"label\":\"Link duotone\",\"set\":\"duotone\",\"paths\":[\"M20.47 11.21 17.21 14.47a4.37 4.37 0 0 1-4.15 1.15c-.03 .03-.06 .06-.09 .09L9.71 18.97A4.37 4.37 0 1 1 3.53 12.79L6.79 9.53A4.37 4.37 0 0 1 10.94 8.38c.03-.03 .06-.06 .09-.09L14.29 5.03a4.37 4.37 0 0 1 6.18 6.18Z\",\"M22.5 8.27a5.1 5.1 0 0 1-1.5 3.47L17.74 15a5.09 5.09 0 0 1-3.62 1.5h0A5.12 5.12 0 0 1 9 11.24a.75 .75 0 0 1 1.5 .04A3.62 3.62 0 0 0 14.12 15h0a3.6 3.6 0 0 0 2.56-1.06l3.26-3.26a3.62 3.62 0 0 0-5.12-5.12l-1.03 1.03A.75 .75 0 0 1 12.72 5.53l1.03-1.03A5.12 5.12 0 0 1 21 4.5 5.14 5.14 0 0 1 22.5 8.27ZM10.22 17.41l-1.03 1.03A3.6 3.6 0 0 1 6.62 19.5h0a3.62 3.62 0 0 1-2.56-6.18L7.31 10.06A3.62 3.62 0 0 1 13.5 12.72a.75 .75 0 0 0 .73 .77H14.25a.75 .75 0 0 0 .75-.73A5.14 5.14 0 0 0 13.5 9a5.12 5.12 0 0 0-7.24 0L3 12.26A5.12 5.12 0 0 0 6.62 21h0a5.09 5.09 0 0 0 3.62-1.5l1.03-1.03A.75 .75 0 0 0 10.22 17.41Z\"],\"faded\":[0]},{\"id\":\"ph-paperclip-duo\",\"label\":\"Attachment duotone\",\"set\":\"duotone\",\"paths\":[\"M16.95 9.82 19.13 12l-7.69 7.68a4.5 4.5 0 0 1-6.36-6.36L14.38 3.88a3 3 0 0 1 4.24 4.24Z\",\"M19.66 11.47a.75 .75 0 0 1 0 1.06l-7.69 7.69a5.25 5.25 0 0 1-7.43-7.43L13.84 3.35a3.75 3.75 0 1 1 5.31 5.3L9.84 18.09A2.25 2.25 0 1 1 6.66 14.91L14.47 6.97A.75 .75 0 1 1 15.53 8.02L7.72 15.97a.75 .75 0 1 0 1.06 1.07L18.09 7.59A2.25 2.25 0 1 0 14.91 4.41L5.6 13.85a3.75 3.75 0 1 0 5.3 5.31l7.69-7.69A.75 .75 0 0 1 19.66 11.47Z\"],\"faded\":[0]},{\"id\":\"ph-image-duo\",\"label\":\"Image duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V16.69l-3.72-3.72a.75 .75 0 0 0-1.06 0L13.81 15.38 9.16 10.72a.75 .75 0 0 0-1.06 0L3 15.81V5.25a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 5.25Z\",\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm0 1.5V14.88l-2.44-2.44a1.5 1.5 0 0 0-2.12 0l-1.87 1.88-4.12-4.12a1.5 1.5 0 0 0-2.12 0L3.75 14V5.25ZM3.75 16.13l4.88-4.87 7.5 7.5H3.75Zm16.5 2.63H18.25l-3.37-3.37 1.88-1.87L20.25 17V18.75ZM13.5 9.38a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 13.5 9.38Z\"],\"faded\":[0]},{\"id\":\"ph-camera-duo\",\"label\":\"Camera duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 6H16.5L15 3.75H9L7.5 6H4.5A1.5 1.5 0 0 0 3 7.5V18a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V7.5A1.5 1.5 0 0 0 19.5 6ZM12 15.75a3.38 3.38 0 1 1 3.38-3.37A3.38 3.38 0 0 1 12 15.75Z\",\"M19.5 5.25H16.9L15.62 3.33A.75 .75 0 0 0 15 3H9a.75 .75 0 0 0-.62 .33L7.1 5.25H4.5A2.25 2.25 0 0 0 2.25 7.5V18a2.25 2.25 0 0 0 2.25 2.25H19.5a2.25 2.25 0 0 0 2.25-2.25V7.5A2.25 2.25 0 0 0 19.5 5.25Zm.75 12.75a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V7.5a.75 .75 0 0 1 .75-.75H7.5a.75 .75 0 0 0 .62-.33L9.4 4.5h5.2l1.28 1.92A.75 .75 0 0 0 16.5 6.75h3a.75 .75 0 0 1 .75 .75ZM12 8.25a4.13 4.13 0 1 0 4.13 4.13A4.13 4.13 0 0 0 12 8.25Zm0 6.75a2.63 2.63 0 1 1 2.63-2.62A2.63 2.63 0 0 1 12 15Z\"],\"faded\":[0]},{\"id\":\"ph-video-camera-duo\",\"label\":\"Video duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 6.75V17.25a.75 .75 0 0 1-.75 .75H3a.75 .75 0 0 1-.75-.75V6.75a.75 .75 0 0 1 .75-.75H18A.75 .75 0 0 1 18.75 6.75Z\",\"M23.6 6.84a.75 .75 0 0 0-.77 .04L19.5 9.1V6.75a1.5 1.5 0 0 0-1.5-1.5H3A1.5 1.5 0 0 0 1.5 6.75V17.25a1.5 1.5 0 0 0 1.5 1.5H18a1.5 1.5 0 0 0 1.5-1.5V14.91l3.33 2.22A.75 .75 0 0 0 23.25 17.25a.75 .75 0 0 0 .75-.75V7.5A.75 .75 0 0 0 23.6 6.84ZM18 17.25H3V6.75H18V17.25Zm4.5-2.15-3-2V10.9L22.5 8.91Z\"],\"faded\":[0]},{\"id\":\"ph-music-notes-duo\",\"label\":\"Music duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 15.38a2.63 2.63 0 1 1-2.62-2.62A2.63 2.63 0 0 1 19.5 15.38ZM4.88 15.75a2.63 2.63 0 1 0 2.63 2.63A2.63 2.63 0 0 0 4.88 15.75Z\",\"M19.96 1.66a.75 .75 0 0 0-.64-.14l-12 3A.75 .75 0 0 0 6.75 5.25V15.57A3.38 3.38 0 1 0 8.25 18.38V10.34l10.5-2.62v4.86A3.38 3.38 0 1 0 20.25 15.38V2.25A.75 .75 0 0 0 19.96 1.66ZM4.88 20.25a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 4.88 20.25ZM8.25 8.79V5.84l10.5-2.62v2.95ZM16.88 17.25a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 16.88 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-book-open-duo\",\"label\":\"Rules duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 5.25V18.75H15a3 3 0 0 0-3 3 3 3 0 0 0-3-3H2.25V5.25H9a3 3 0 0 1 3 3 3 3 0 0 1 3-3Z\",\"M21.75 4.5H15a3.75 3.75 0 0 0-3 1.5A3.75 3.75 0 0 0 9 4.5H2.25a.75 .75 0 0 0-.75 .75V18.75a.75 .75 0 0 0 .75 .75H9a2.25 2.25 0 0 1 2.25 2.25 .75 .75 0 0 0 1.5 0 2.25 2.25 0 0 1 2.25-2.25h6.75a.75 .75 0 0 0 .75-.75V5.25A.75 .75 0 0 0 21.75 4.5ZM9 18H3V6H9a2.25 2.25 0 0 1 2.25 2.25V18.75A3.73 3.73 0 0 0 9 18Zm12 0H15a3.73 3.73 0 0 0-2.25 .75V8.25a2.25 2.25 0 0 1 2.25-2.25h6Z\"],\"faded\":[0]},{\"id\":\"ph-scroll-duo\",\"label\":\"Scroll duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 16.5H9.75s.75 .56 .75 1.5a2.25 2.25 0 0 1-4.5 0V6A2.25 2.25 0 0 0 3.75 3.75H16.5a2.25 2.25 0 0 1 2.25 2.25Z\",\"M9 9.75a.75 .75 0 0 1 .75-.75h6a.75 .75 0 0 1 0 1.5H9.75A.75 .75 0 0 1 9 9.75Zm.75 3.75h6a.75 .75 0 0 0 0-1.5H9.75a.75 .75 0 0 0 0 1.5Zm12 4.5a3 3 0 0 1-3 3H8.25a3 3 0 0 1-3-3V6a1.5 1.5 0 0 0-3 0c0 .54 .45 .9 .46 .91h0A.75 .75 0 0 1 2.25 8.25a.74 .74 0 0 1-.45-.15h0C1.69 8.02 .75 7.28 .75 6A3 3 0 0 1 3.75 3H16.5a3 3 0 0 1 3 3V15.75h.75a.75 .75 0 0 1 .45 .15C20.81 15.98 21.75 16.72 21.75 18ZM9.02 16.26A.76 .76 0 0 1 9.75 15.75h8.25V6a1.5 1.5 0 0 0-1.5-1.5H6.35A2.97 2.97 0 0 1 6.75 6V18a1.5 1.5 0 0 0 3 0c0-.54-.45-.9-.46-.91A.73 .73 0 0 1 9.02 16.26ZM20.25 18a1.18 1.18 0 0 0-.3-.75h-8.81a2.52 2.52 0 0 1 .11 .75 2.98 2.98 0 0 1-.4 1.5H18.75A1.5 1.5 0 0 0 20.25 18Z\"],\"faded\":[0]},{\"id\":\"ph-file-text-duo\",\"label\":\"Document duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 8.25H14.25V3Z\",\"M20.03 7.72l-5.25-5.25A.75 .75 0 0 0 14.25 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V8.25A.75 .75 0 0 0 20.03 7.72ZM15 4.81 17.69 7.5H15ZM18.75 20.25H5.25V3.75h8.25V8.25a.75 .75 0 0 0 .75 .75h4.5V20.25Zm-3-7.5a.75 .75 0 0 1-.75 .75H9a.75 .75 0 0 1 0-1.5h6A.75 .75 0 0 1 15.75 12.75Zm0 3a.75 .75 0 0 1-.75 .75H9a.75 .75 0 0 1 0-1.5h6A.75 .75 0 0 1 15.75 15.75Z\"],\"faded\":[0]},{\"id\":\"ph-clipboard-text-duo\",\"label\":\"Clipboard duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 4.5V20.25a.75 .75 0 0 1-.75 .75H5.25a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 .75-.75H9a3.73 3.73 0 0 0-.75 2.25v.75h7.5V6a3.73 3.73 0 0 0-.75-2.25h3.75A.75 .75 0 0 1 19.5 4.5Z\",\"M15.75 14.25a.75 .75 0 0 1-.75 .75H9a.75 .75 0 0 1 0-1.5h6A.75 .75 0 0 1 15.75 14.25Zm-.75-3.75H9a.75 .75 0 0 0 0 1.5h6a.75 .75 0 0 0 0-1.5Zm5.25-6V20.25a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 5.25 3H8.65a4.49 4.49 0 0 1 6.7 0H18.75A1.5 1.5 0 0 1 20.25 4.5ZM9 6h6a3 3 0 0 0-6 0ZM18.75 4.5H16.24A4.49 4.49 0 0 1 16.5 6v.75a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1-.75-.75V6a4.49 4.49 0 0 1 .26-1.5H5.25V20.25H18.75Z\"],\"faded\":[0]},{\"id\":\"ph-newspaper-duo\",\"label\":\"News duotone\",\"set\":\"duotone\",\"paths\":[\"M21 6V17.25a1.5 1.5 0 0 1-1.5 1.5H3a1.5 1.5 0 0 0 1.5-1.5V6a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 6Z\",\"M8.25 10.5a.75 .75 0 0 1 .75-.75h7.5a.75 .75 0 0 1 0 1.5H9A.75 .75 0 0 1 8.25 10.5Zm.75 3.75h7.5a.75 .75 0 0 0 0-1.5H9a.75 .75 0 0 0 0 1.5ZM21.75 6V17.25a2.25 2.25 0 0 1-2.25 2.25H3A2.25 2.25 0 0 1 .75 17.26V8.25a.75 .75 0 0 1 1.5 0v9a.75 .75 0 0 0 1.5 0V6A1.5 1.5 0 0 1 5.25 4.5H20.25A1.5 1.5 0 0 1 21.75 6Zm-1.5 0H5.25V17.25a2.24 2.24 0 0 1-.13 .75H19.5a.75 .75 0 0 0 .75-.75Z\"],\"faded\":[0]},{\"id\":\"ph-lightbulb-duo\",\"label\":\"Idea duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 9.75a7.49 7.49 0 0 1-2.87 5.9A2.28 2.28 0 0 0 15.75 17.44v.56a.75 .75 0 0 1-.75 .75H9a.75 .75 0 0 1-.75-.75v-.56a2.26 2.26 0 0 0-.87-1.78A7.49 7.49 0 0 1 4.5 9.79C4.48 5.73 7.76 2.34 11.82 2.25A7.5 7.5 0 0 1 19.5 9.75Z\",\"M16.5 21.75a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1 0-1.5h7.5A.75 .75 0 0 1 16.5 21.75Zm3.75-12a8.21 8.21 0 0 1-3.15 6.49A1.52 1.52 0 0 0 16.5 17.44v.56a1.5 1.5 0 0 1-1.5 1.5H9a1.5 1.5 0 0 1-1.5-1.5v-.56a1.5 1.5 0 0 0-.58-1.19A8.21 8.21 0 0 1 3.75 9.8C3.73 5.33 7.34 1.61 11.8 1.5A8.25 8.25 0 0 1 20.25 9.75Zm-1.5 0a6.75 6.75 0 0 0-6.91-6.75c-3.66 .09-6.61 3.13-6.59 6.79a6.72 6.72 0 0 0 2.59 5.28A3 3 0 0 1 9 17.44v.56h6v-.56a3.01 3.01 0 0 1 1.17-2.38A6.72 6.72 0 0 0 18.75 9.75Zm-1.51-.88a5.4 5.4 0 0 0-4.36-4.36 .75 .75 0 0 0-.25 1.48c1.55 .26 2.87 1.58 3.14 3.14A.75 .75 0 0 0 16.5 9.75a.84 .84 0 0 0 .13-.01A.75 .75 0 0 0 17.24 8.87Z\"],\"faded\":[0]},{\"id\":\"ph-rocket-duo\",\"label\":\"Rocket duotone\",\"set\":\"duotone\",\"paths\":[\"M8.89 18 6.13 20.09a.75 .75 0 0 1-1.2-.42L3.77 14.45a.75 .75 0 0 1 .16-.64l2.84-3.41C6.66 12.59 7.19 15.13 8.89 18Zm11.19-4.2-2.84-3.41c.11 2.19-.43 4.74-2.12 7.6l2.76 2.09a.75 .75 0 0 0 1.2-.42l1.16-5.22A.75 .75 0 0 0 20.08 13.8Z\",\"M14.25 21a.75 .75 0 0 1-.75 .75H10.5a.75 .75 0 0 1 0-1.5h3A.75 .75 0 0 1 14.25 21ZM12 10.5a1.13 1.13 0 1 0-1.12-1.12A1.13 1.13 0 0 0 12 10.5Zm8.96 4.11-1.16 5.22a1.5 1.5 0 0 1-2.39 .85L14.86 18.75h-5.72L6.59 20.68a1.5 1.5 0 0 1-2.39-.85L3.04 14.61a1.51 1.51 0 0 1 .31-1.29l2.68-3.21a11.54 11.54 0 0 1 .8-3.44c1.21-3.03 3.38-4.93 4.25-5.61a1.5 1.5 0 0 1 1.84 0c.88 .68 3.04 2.58 4.25 5.61a11.54 11.54 0 0 1 .8 3.44l2.68 3.21A1.51 1.51 0 0 1 20.96 14.61ZM9.32 17.25h5.36c1.98-3.52 2.35-6.89 1.1-10.02C14.68 4.47 12.61 2.72 12 2.25c-.61 .47-2.68 2.22-3.78 4.98C6.97 10.36 7.34 13.73 9.32 17.25Zm-1.41 .55Q6.4 15.05 6.08 12.39L4.5 14.28 5.66 19.5l.02-.01ZM19.5 14.28l-1.58-1.89q-.32 2.65-1.83 5.41l2.24 1.69 .02 .01Z\"],\"faded\":[0]},{\"id\":\"ph-rocket-launch-duo\",\"label\":\"Launch duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 11.25v5.78a.75 .75 0 0 1-.22 .53l-3.22 3.22a.75 .75 0 0 1-1.27-.42L12 16.5ZM12.75 6.75H6.97a.75 .75 0 0 0-.53 .22L3.22 10.19a.75 .75 0 0 0 .42 1.27L7.5 12ZM3.75 20.25c3.53 0 4.75-1.85 5.12-2.64L6.39 15.14C5.6 15.5 3.75 16.72 3.75 20.25Z\",\"M20.99 4.42a1.5 1.5 0 0 0-1.41-1.41c-1.18-.07-4.19 .04-6.69 2.54L12.44 6H6.97A1.49 1.49 0 0 0 5.91 6.44L2.69 9.66a1.5 1.5 0 0 0 .85 2.55l3.61 .5 4.14 4.14 .5 3.61a1.49 1.49 0 0 0 1.01 1.21 1.51 1.51 0 0 0 .48 .08A1.49 1.49 0 0 0 14.34 21.31L17.56 18.09A1.49 1.49 0 0 0 18 17.03V11.56l.45-.45C20.95 8.61 21.06 5.6 20.99 4.42ZM6.97 7.5h3.97L7.23 11.21 3.75 10.72Zm6.98-.89a7.19 7.19 0 0 1 5.54-2.11 7.17 7.17 0 0 1-2.1 5.55L12 15.44 8.56 12ZM16.5 17.03 13.28 20.25l-.49-3.48L16.5 13.06Zm-6.95 .89C9.13 18.84 7.71 21 3.75 21a.75 .75 0 0 1-.75-.75c0-3.96 2.16-5.38 3.08-5.8a.75 .75 0 0 1 .62 1.37c-.6 .27-1.93 1.16-2.17 3.65 2.49-.23 3.38-1.56 3.65-2.17a.75 .75 0 1 1 1.37 .62Z\"],\"faded\":[0]},{\"id\":\"ph-globe-duo\",\"label\":\"Globe duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25h0A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm8.25 9.75a8.21 8.21 0 0 1-.31 2.25H16.33a14.76 14.76 0 0 0 0-4.5h3.61A8.21 8.21 0 0 1 20.25 12ZM9.56 15.75H14.44a10.79 10.79 0 0 1-2.44 4.22A10.81 10.81 0 0 1 9.56 15.75Zm-.37-1.5a13.2 13.2 0 0 1 0-4.5h5.61a13.2 13.2 0 0 1 0 4.5ZM3.75 12a8.21 8.21 0 0 1 .31-2.25H7.67a14.76 14.76 0 0 0 0 4.5H4.06A8.21 8.21 0 0 1 3.75 12ZM14.44 8.25H9.56a10.79 10.79 0 0 1 2.44-4.22A10.81 10.81 0 0 1 14.44 8.25Zm4.91 0H16a12.68 12.68 0 0 0-2.09-4.28A8.28 8.28 0 0 1 19.35 8.25ZM10.09 3.97A12.68 12.68 0 0 0 8 8.25H4.65A8.28 8.28 0 0 1 10.09 3.97ZM4.65 15.75H8a12.68 12.68 0 0 0 2.09 4.28A8.28 8.28 0 0 1 4.65 15.75Zm9.26 4.28a12.68 12.68 0 0 0 2.09-4.28h3.34A8.28 8.28 0 0 1 13.91 20.02Z\"],\"faded\":[0]},{\"id\":\"ph-map-pin-duo\",\"label\":\"Location duotone\",\"set\":\"duotone\",\"paths\":[\"M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 6.75 7.5 12 7.5 12s7.5-5.25 7.5-12A7.5 7.5 0 0 0 12 2.25Zm0 10.5a3 3 0 1 1 3-3A3 3 0 0 1 12 12.75Z\",\"M12 6a3.75 3.75 0 1 0 3.75 3.75A3.75 3.75 0 0 0 12 6Zm0 6a2.25 2.25 0 1 1 2.25-2.25A2.25 2.25 0 0 1 12 12Zm0-10.5a8.26 8.26 0 0 0-8.25 8.25c0 2.94 1.36 6.06 3.94 9.02a23.83 23.83 0 0 0 3.89 3.59 .75 .75 0 0 0 .86 0A23.83 23.83 0 0 0 16.31 18.77c2.57-2.96 3.94-6.08 3.94-9.02A8.26 8.26 0 0 0 12 1.5Zm0 19.31c-1.55-1.22-6.75-5.7-6.75-11.06a6.75 6.75 0 0 1 13.5 0C18.75 15.12 13.55 19.59 12 20.81Z\"],\"faded\":[0]},{\"id\":\"ph-house-duo\",\"label\":\"Home duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 11.25v9H14.25V14.25H9.75v6H3.75V11.25a.75 .75 0 0 1 .22-.53l7.5-7.5a.75 .75 0 0 1 1.06 0l7.5 7.5A.75 .75 0 0 1 20.25 11.25Z\",\"M20.56 10.19l-7.5-7.5a1.5 1.5 0 0 0-2.12 0l-7.5 7.5A1.49 1.49 0 0 0 3 11.25v9a.75 .75 0 0 0 .75 .75h6a.75 .75 0 0 0 .75-.75V15h3v5.25a.75 .75 0 0 0 .75 .75h6a.75 .75 0 0 0 .75-.75V11.25A1.49 1.49 0 0 0 20.56 10.19ZM19.5 19.5H15V14.25a.75 .75 0 0 0-.75-.75H9.75a.75 .75 0 0 0-.75 .75v5.25H4.5V11.25l7.5-7.5 7.5 7.5Z\"],\"faded\":[0]},{\"id\":\"ph-shield-duo\",\"label\":\"Shield duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25v5.25c0 9-8.25 11.25-8.25 11.25S3.75 19.5 3.75 10.5V5.25a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 5.25Z\",\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v5.25c0 4.94 2.39 7.94 4.4 9.58 2.16 1.77 4.31 2.37 4.41 2.39a.75 .75 0 0 0 .39 0c.09-.02 2.24-.63 4.41-2.39C18.61 18.44 21 15.44 21 10.5V5.25A1.5 1.5 0 0 0 19.5 3.75Zm0 6.75c0 3.48-1.28 6.3-3.81 8.38A12.12 12.12 0 0 1 12 20.96a12.02 12.02 0 0 1-3.65-2.04C5.8 16.83 4.5 14 4.5 10.5l0-5.25 15 0Z\"],\"faded\":[0]},{\"id\":\"ph-shield-check-duo\",\"label\":\"Verified duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25v5.25c0 9-8.25 11.25-8.25 11.25S3.75 19.5 3.75 10.5V5.25a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 5.25Z\",\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v5.25c0 4.94 2.39 7.94 4.4 9.58 2.16 1.77 4.31 2.37 4.41 2.39a.75 .75 0 0 0 .39 0c.09-.03 2.24-.63 4.41-2.39C18.61 18.44 21 15.44 21 10.5V5.25A1.5 1.5 0 0 0 19.5 3.75Zm0 6.75c0 3.48-1.28 6.3-3.81 8.38A12.12 12.12 0 0 1 12 20.96a12.02 12.02 0 0 1-3.65-2.04C5.8 16.83 4.5 14 4.5 10.5l0-5.25 15 0ZM7.72 13.28a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72a.75 .75 0 0 1 1.06 1.06l-5.25 5.25a.75 .75 0 0 1-1.06 0Z\"],\"faded\":[0]},{\"id\":\"ph-shield-warning-duo\",\"label\":\"Security duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25v5.25c0 9-8.25 11.25-8.25 11.25S3.75 19.5 3.75 10.5V5.25a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 5.25Z\",\"M11.25 12.75V9a.75 .75 0 0 1 1.5 0v3.75a.75 .75 0 0 1-1.5 0Zm.75 4.5a1.13 1.13 0 1 0-1.12-1.12A1.13 1.13 0 0 0 12 17.25ZM21 5.25v5.25c0 4.94-2.39 7.94-4.4 9.58-2.16 1.77-4.31 2.37-4.41 2.39a.75 .75 0 0 1-.39 0c-.09-.02-2.24-.63-4.41-2.39C5.39 18.44 3 15.44 3 10.5V5.25A1.5 1.5 0 0 1 4.5 3.75H19.5A1.5 1.5 0 0 1 21 5.25Zm-1.5 0L4.5 5.25l0 5.25c0 3.5 1.3 6.33 3.85 8.42A12.02 12.02 0 0 0 12 20.96a12.12 12.12 0 0 0 3.69-2.08C18.22 16.8 19.5 13.98 19.5 10.5Z\"],\"faded\":[0]},{\"id\":\"ph-lock-duo\",\"label\":\"Lock duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 9V19.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V9a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 9Z\",\"M19.5 7.5H16.5V5.25a4.5 4.5 0 0 0-9 0V7.5H4.5A1.5 1.5 0 0 0 3 9V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V9A1.5 1.5 0 0 0 19.5 7.5ZM9 5.25a3 3 0 0 1 6 0V7.5H9ZM19.5 19.5H4.5V9H19.5V19.5Zm-6.37-5.25a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-lock-open-duo\",\"label\":\"Unlock duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 9V19.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V9a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 9Z\",\"M19.5 7.5H9V5.25a3 3 0 0 1 3-3c1.44 0 2.74 1.03 3.01 2.4a.75 .75 0 0 0 1.47-.3C16.06 2.26 14.18 .75 12 .75A4.5 4.5 0 0 0 7.5 5.25V7.5H4.5A1.5 1.5 0 0 0 3 9V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V9A1.5 1.5 0 0 0 19.5 7.5Zm0 12H4.5V9H19.5V19.5Zm-6.37-5.25a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-key-duo\",\"label\":\"Key duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 9.22C21.63 12.84 18.63 15.75 15.01 15.75a6.72 6.72 0 0 1-2.52-.48h0L11.25 16.5H9v2.25H6.75v2.25H3.75a.75 .75 0 0 1-.75-.75V17.56a.75 .75 0 0 1 .22-.53l5.52-5.52h0A6.72 6.72 0 0 1 8.25 8.99c0-3.62 2.91-6.62 6.53-6.74A6.75 6.75 0 0 1 21.75 9.22Z\",\"M20.3 3.7A7.5 7.5 0 0 0 7.87 11.32L2.69 16.5A1.49 1.49 0 0 0 2.25 17.56V20.25a1.5 1.5 0 0 0 1.5 1.5H6.75a.75 .75 0 0 0 .75-.75V19.5H9a.75 .75 0 0 0 .75-.75V17.25h1.5a.75 .75 0 0 0 .53-.22l.9-.9A7.47 7.47 0 0 0 15 16.5h.01A7.5 7.5 0 0 0 20.3 3.7ZM21 9.2c-.1 3.2-2.79 5.8-5.99 5.8H15a5.97 5.97 0 0 1-2.22-.42 .75 .75 0 0 0-.83 .16L10.94 15.75H9a.75 .75 0 0 0-.75 .75v1.5H6.75a.75 .75 0 0 0-.75 .75v1.5H3.75V17.56l5.52-5.51a.75 .75 0 0 0 .16-.83A5.97 5.97 0 0 1 9 8.99c0-3.2 2.61-5.89 5.8-5.99A6 6 0 0 1 21 9.2ZM18 7.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18 7.13Z\"],\"faded\":[0]},{\"id\":\"ph-eye-duo\",\"label\":\"Eye duotone\",\"set\":\"duotone\",\"paths\":[\"M12 5.25C4.5 5.25 1.5 12 1.5 12s3 6.75 10.5 6.75 10.5-6.75 10.5-6.75S19.5 5.25 12 5.25Zm0 10.5a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 12 15.75Z\",\"M23.19 11.7c-.03-.07-.83-1.84-2.59-3.6C18.24 5.74 15.27 4.5 12 4.5S5.76 5.74 3.41 8.1C1.64 9.86 .84 11.63 .81 11.7a.75 .75 0 0 0 0 .61c.03 .07 .83 1.83 2.59 3.6C5.76 18.26 8.73 19.5 12 19.5s6.24-1.24 8.59-3.59c1.77-1.77 2.56-3.53 2.59-3.6A.75 .75 0 0 0 23.19 11.7ZM12 18c-2.89 0-5.41-1.05-7.49-3.12A12.51 12.51 0 0 1 2.34 12 12.5 12.5 0 0 1 4.51 9.12C6.59 7.05 9.11 6 12 6s5.41 1.05 7.49 3.12A12.51 12.51 0 0 1 21.66 12C20.99 13.26 18.04 18 12 18Zm0-10.5a4.5 4.5 0 1 0 4.5 4.5A4.5 4.5 0 0 0 12 7.5Zm0 7.5a3 3 0 1 1 3-3A3 3 0 0 1 12 15Z\"],\"faded\":[0]},{\"id\":\"ph-eye-slash-duo\",\"label\":\"Hidden duotone\",\"set\":\"duotone\",\"paths\":[\"M12 5.25C4.5 5.25 1.5 12 1.5 12s3 6.75 10.5 6.75 10.5-6.75 10.5-6.75S19.5 5.25 12 5.25Zm0 10.5a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 12 15.75Z\",\"M5.06 3.25A.75 .75 0 1 0 3.95 4.25L5.75 6.24C2.34 8.33 .88 11.55 .81 11.7a.75 .75 0 0 0 0 .61c.03 .07 .83 1.83 2.59 3.6C5.76 18.26 8.73 19.5 12 19.5a11.92 11.92 0 0 0 4.88-1.02l2.06 2.27a.75 .75 0 1 0 1.11-1.01Zm4.44 7.11 3.91 4.3a3 3 0 0 1-3.91-4.3ZM12 18c-2.89 0-5.41-1.05-7.49-3.12A12.48 12.48 0 0 1 2.34 12c.44-.82 1.84-3.13 4.44-4.63l1.69 1.85a4.5 4.5 0 0 0 5.97 6.56l1.38 1.52A10.5 10.5 0 0 1 12 18Zm.56-8.95a.75 .75 0 0 1 .28-1.47 4.51 4.51 0 0 1 3.63 4 .75 .75 0 0 1-.68 .82 .6 .6 0 0 1-.07 0 .75 .75 0 0 1-.75-.68A3.01 3.01 0 0 0 12.56 9.05Zm10.62 3.25c-.04 .09-.99 2.19-3.13 4.11a.75 .75 0 1 1-1-1.12A12.45 12.45 0 0 0 21.66 12a12.48 12.48 0 0 0-2.17-2.88C17.41 7.05 14.89 6 12 6a11.1 11.1 0 0 0-1.81 .15A.75 .75 0 1 1 9.94 4.67 12.56 12.56 0 0 1 12 4.5c3.27 0 6.24 1.24 8.59 3.6 1.77 1.77 2.56 3.53 2.59 3.6A.75 .75 0 0 1 23.19 12.31Z\"],\"faded\":[0]},{\"id\":\"ph-gavel-duo\",\"label\":\"Gavel duotone\",\"set\":\"duotone\",\"paths\":[\"M14.03 4.28l-6 6a.75 .75 0 0 1-1.06 0l-1.5-1.5a.75 .75 0 0 1 0-1.06l6-6a.75 .75 0 0 1 1.06 0l1.5 1.5A.75 .75 0 0 1 14.03 4.28Zm8.25 7.19-1.5-1.5a.75 .75 0 0 0-1.06 0l-6 6a.75 .75 0 0 0 0 1.06l1.5 1.5a.75 .75 0 0 0 1.06 0l6-6A.75 .75 0 0 0 22.28 11.47Z\",\"M22.81 10.94l-1.5-1.5a1.5 1.5 0 0 0-1.95-.14L14.7 4.64a1.5 1.5 0 0 0-.14-1.95l-1.5-1.5a1.5 1.5 0 0 0-2.12 0l-6 6a1.5 1.5 0 0 0 0 2.12l1.5 1.5a1.5 1.5 0 0 0 1.95 .14L9.06 11.63 2.94 17.75A2.34 2.34 0 0 0 6.25 21.07L12.38 14.94l.67 .67a1.5 1.5 0 0 0 .14 1.95l1.5 1.5a1.5 1.5 0 0 0 2.12 0l6-6A1.5 1.5 0 0 0 22.81 10.94ZM7.5 9.75 6 8.25l6-6 1.5 1.5ZM5.19 20a.84 .84 0 0 1-1.19 0 .84 .84 0 0 1 0-1.19L10.13 12.69 11.31 13.88ZM9.47 9.91 13.66 5.72 18.28 10.34 14.1 14.53ZM15.75 18l-1.5-1.5 .38-.37h0l5.25-5.25h0l.38-.37 1.5 1.5Z\"],\"faded\":[0]},{\"id\":\"ph-scales-duo\",\"label\":\"Scales duotone\",\"set\":\"duotone\",\"paths\":[\"M5.25 8.25l3 7.5c0 1.66-1.87 2.25-3 2.25s-3-.59-3-2.25ZM18.75 5.25l-3 7.5c0 1.66 1.88 2.25 3 2.25s3-.59 3-2.25Z\",\"M22.45 12.47l-3-7.5h0a.75 .75 0 0 0-.86-.45L12.75 5.81V3.75a.75 .75 0 0 0-1.5 0V6.15L5.09 7.52A.75 .75 0 0 0 4.55 7.97h0v.01L1.55 15.47a.74 .74 0 0 0-.05 .28c0 2.19 2.3 3 3.75 3s3.75-.81 3.75-3a.74 .74 0 0 0-.05-.28L6.27 8.79 11.25 7.69V19.5H9.75a.75 .75 0 0 0 0 1.5h4.5a.75 .75 0 0 0 0-1.5H12.75V7.35L17.53 6.29 15.05 12.47a.74 .74 0 0 0-.05 .28c0 2.19 2.3 3 3.75 3s3.75-.81 3.75-3A.74 .74 0 0 0 22.45 12.47ZM5.25 17.25c-.71 0-2.13-.34-2.24-1.37L5.25 10.27l2.24 5.61C7.38 16.91 5.96 17.25 5.25 17.25Zm13.5-3c-.71 0-2.13-.34-2.24-1.37L18.75 7.27l2.24 5.61C20.88 13.91 19.46 14.25 18.75 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-siren-duo\",\"label\":\"Siren duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 12.09v3.66H4.5V12a7.5 7.5 0 0 1 7.56-7.5C16.19 4.53 19.5 7.96 19.5 12.09Z\",\"M11.25 1.5V.75a.75 .75 0 0 1 1.5 0v.75a.75 .75 0 0 1-1.5 0Zm7.5 3a.75 .75 0 0 0 .53-.22l.75-.75a.75 .75 0 0 0-1.06-1.06l-.75 .75A.75 .75 0 0 0 18.75 4.5ZM4.72 4.28A.75 .75 0 0 0 5.78 3.22l-.75-.75A.75 .75 0 0 0 3.97 3.53Zm8.16 2.48a.75 .75 0 1 0-.25 1.48C14.41 8.54 15.75 10.15 15.75 12a.75 .75 0 0 0 1.5 0C17.25 9.43 15.37 7.18 12.87 6.76ZM21.75 16.5v2.25a1.5 1.5 0 0 1-1.5 1.5H3.75a1.5 1.5 0 0 1-1.5-1.5V16.5a1.5 1.5 0 0 1 1.5-1.5V12a8.25 8.25 0 0 1 8.25-8.25h.06c4.51 .03 8.19 3.78 8.19 8.34v2.91A1.5 1.5 0 0 1 21.75 16.5ZM5.25 15H18.75V12.09c0-3.75-3-6.82-6.7-6.84H12a6.75 6.75 0 0 0-6.75 6.75Zm15 3.75V16.5H3.75v2.25H20.25Z\"],\"faded\":[0]},{\"id\":\"ph-bug-duo\",\"label\":\"Bug duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 12v1.5a7.5 7.5 0 0 1-15 0V12Z\",\"M13.5 8.63a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 13.5 8.63ZM9.38 7.5a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 9.38 7.5Zm10.88 6A8.23 8.23 0 0 1 19.97 15.66l2.09 .91A.75 .75 0 0 1 21.75 18a.74 .74 0 0 1-.3-.06L19.44 17.06a8.25 8.25 0 0 1-14.88 0L2.55 17.94A.74 .74 0 0 1 2.25 18a.75 .75 0 0 1-.3-1.44L4.03 15.66A8.23 8.23 0 0 1 3.75 13.5v-.75H1.5a.75 .75 0 0 1 0-1.5H3.75v-.75a8.23 8.23 0 0 1 .28-2.16L1.95 7.44a.75 .75 0 1 1 .6-1.37L4.56 6.94a8.25 8.25 0 0 1 14.88 0l2.01-.88a.75 .75 0 0 1 .6 1.37L19.97 8.35a8.23 8.23 0 0 1 .28 2.16v.75h2.25a.75 .75 0 0 1 0 1.5H20.25ZM5.25 11.25H18.75v-.75a6.75 6.75 0 0 0-13.5 0Zm6 8.96V12.75H5.25v.75A6.76 6.76 0 0 0 11.25 20.21ZM18.75 13.5v-.75H12.75v7.46A6.76 6.76 0 0 0 18.75 13.5Z\"],\"faded\":[0]},{\"id\":\"ph-robot-duo\",\"label\":\"Bot duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 5.25H5.25A2.25 2.25 0 0 0 3 7.5V18a2.25 2.25 0 0 0 2.25 2.25H18.75a2.25 2.25 0 0 0 2.25-2.25V7.5A2.25 2.25 0 0 0 18.75 5.25ZM15.38 17.25H8.63a1.88 1.88 0 0 1 0-3.75h6.75a1.88 1.88 0 0 1 0 3.75Z\",\"M18.75 4.5H12.75V1.5a.75 .75 0 0 0-1.5 0V4.5H5.25A3 3 0 0 0 2.25 7.5V18a3 3 0 0 0 3 3H18.75a3 3 0 0 0 3-3V7.5A3 3 0 0 0 18.75 4.5Zm1.5 13.5a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V7.5A1.5 1.5 0 0 1 5.25 6H18.75a1.5 1.5 0 0 1 1.5 1.5ZM6.75 10.13a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 6.75 10.13Zm8.25 0a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 15 10.13Zm.38 2.63H8.63a2.63 2.63 0 0 0 0 5.25h6.75a2.63 2.63 0 0 0 0-5.25Zm-2.25 1.5v2.25H10.88V14.25ZM7.5 15.38a1.13 1.13 0 0 1 1.13-1.12h.75v2.25H8.63A1.13 1.13 0 0 1 7.5 15.38Zm7.88 1.13h-.75V14.25h.75a1.13 1.13 0 0 1 0 2.25Z\"],\"faded\":[0]},{\"id\":\"ph-cpu-duo\",\"label\":\"CPU duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 4.5H5.25a.75 .75 0 0 0-.75 .75V18.75a.75 .75 0 0 0 .75 .75H18.75a.75 .75 0 0 0 .75-.75V5.25A.75 .75 0 0 0 18.75 4.5ZM14.25 14.25H9.75V9.75h4.5Z\",\"M14.25 9H9.75a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 .75 .75h4.5a.75 .75 0 0 0 .75-.75V9.75A.75 .75 0 0 0 14.25 9Zm-.75 4.5H10.5V10.5h3Zm8.25 0H20.25V10.5h1.5a.75 .75 0 0 0 0-1.5H20.25V5.25a1.5 1.5 0 0 0-1.5-1.5H15V2.25a.75 .75 0 0 0-1.5 0V3.75H10.5V2.25a.75 .75 0 0 0-1.5 0V3.75H5.25A1.5 1.5 0 0 0 3.75 5.25V9H2.25a.75 .75 0 0 0 0 1.5H3.75v3H2.25a.75 .75 0 0 0 0 1.5H3.75v3.75a1.5 1.5 0 0 0 1.5 1.5H9v1.5a.75 .75 0 0 0 1.5 0V20.25h3v1.5a.75 .75 0 0 0 1.5 0V20.25h3.75a1.5 1.5 0 0 0 1.5-1.5V15h1.5a.75 .75 0 0 0 0-1.5Zm-3 5.25H5.25V5.25H18.75v8.99s0 .01 0 .01 0 .01 0 .01V18.75Z\"],\"faded\":[0]},{\"id\":\"ph-hard-drives-duo\",\"label\":\"Server duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 14.25v4.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V14.25a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 14.25ZM19.5 4.5H4.5a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 .75 .75H19.5a.75 .75 0 0 0 .75-.75V5.25A.75 .75 0 0 0 19.5 4.5Z\",\"M19.5 12.75H4.5a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 19.5 12.75Zm0 6H4.5V14.25H19.5v4.5Zm0-15H4.5A1.5 1.5 0 0 0 3 5.25v4.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 19.5 3.75Zm0 6H4.5V5.25H19.5v4.5ZM18 7.5a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18 7.5Zm0 9a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18 16.5Z\"],\"faded\":[0]},{\"id\":\"ph-code-duo\",\"label\":\"Code duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 12l-4.5 3.75H6L1.5 12 6 8.25H18Z\",\"M6.48 8.83 2.67 12l3.81 3.17a.75 .75 0 1 1-.96 1.15l-4.5-3.75a.75 .75 0 0 1 0-1.15l4.5-3.75a.75 .75 0 0 1 .96 1.15Zm16.5 2.6-4.5-3.75a.75 .75 0 1 0-.96 1.15L21.33 12l-3.81 3.17a.75 .75 0 1 0 .96 1.15l4.5-3.75a.75 .75 0 0 0 0-1.15ZM15.26 3.05a.75 .75 0 0 0-.96 .45l-6 16.5a.75 .75 0 0 0 .45 .96A.76 .76 0 0 0 9 21a.75 .75 0 0 0 .71-.49l6-16.5A.75 .75 0 0 0 15.26 3.05Z\"],\"faded\":[0]},{\"id\":\"ph-terminal-window-duo\",\"label\":\"Terminal duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V18.75a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V5.25a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 5.25Z\",\"M12 12a.75 .75 0 0 1-.28 .59l-3.75 3a.75 .75 0 1 1-.94-1.17L10.05 12 7.03 9.59a.75 .75 0 1 1 .94-1.17l3.75 3A.75 .75 0 0 1 12 12Zm4.5 2.25H12.75a.75 .75 0 0 0 0 1.5h3.75a.75 .75 0 0 0 0-1.5Zm5.25-9V18.75a1.5 1.5 0 0 1-1.5 1.5H3.75a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 3.75 3.75H20.25A1.5 1.5 0 0 1 21.75 5.25ZM20.25 18.75V5.25H3.75V18.75H20.25Z\"],\"faded\":[0]},{\"id\":\"ph-wrench-duo\",\"label\":\"Wrench duotone\",\"set\":\"duotone\",\"paths\":[\"M21 9a6 6 0 0 1-8.9 5.25L6.84 20.34A2.25 2.25 0 0 1 3.66 17.16L9.75 11.9a6 6 0 0 1 7.5-8.46L13.5 7.5l.53 2.47L16.5 10.5l4.06-3.75A5.98 5.98 0 0 1 21 9Z\",\"M21.26 6.47a.75 .75 0 0 0-1.2-.27l-3.78 3.49-1.62-.35-.35-1.62 3.49-3.78A.75 .75 0 0 0 17.53 2.74 6.75 6.75 0 0 0 8.25 9 6.78 6.78 0 0 0 8.81 11.71L3.17 16.59c-.01 .01-.03 .02-.04 .04a3 3 0 0 0 4.24 4.24c.01-.01 .03-.03 .04-.04L12.29 15.19A6.75 6.75 0 0 0 21.75 9 6.71 6.71 0 0 0 21.26 6.47ZM15 14.25a5.26 5.26 0 0 1-2.54-.66 .75 .75 0 0 0-.93 .17L6.29 19.83a1.5 1.5 0 0 1-2.12-2.12L10.24 12.47a.75 .75 0 0 0 .17-.93 5.25 5.25 0 0 1 5.47-7.72l-2.92 3.17a.75 .75 0 0 0-.18 .67L13.3 10.13a.75 .75 0 0 0 .58 .58l2.47 .53a.75 .75 0 0 0 .67-.18l3.17-2.92A5.26 5.26 0 0 1 15 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-hammer-duo\",\"label\":\"Hammer duotone\",\"set\":\"duotone\",\"paths\":[\"M23.03 12.09 20.34 14.78a.75 .75 0 0 1-1.06 0L15.76 11.25l-2.62 2.63-3-3 2.63-2.62L7.5 2.98a8.23 8.23 0 0 1 9.22 1.69l6.31 6.36A.75 .75 0 0 1 23.03 12.09Z\",\"M23.56 10.5 17.24 4.13a9.01 9.01 0 0 0-12.73 0l-.01 .01L3.21 5.48A.75 .75 0 0 0 4.29 6.52L5.58 5.19a7.49 7.49 0 0 1 1.75-1.3L11.69 8.25l-9 9a1.5 1.5 0 0 0 0 2.12l1.94 1.94a1.5 1.5 0 0 0 2.12 0l9-9 1.34 1.34h0L18.75 15.31a1.5 1.5 0 0 0 2.12 0l2.69-2.69A1.5 1.5 0 0 0 23.56 10.5ZM5.69 20.25 3.75 18.31l6.38-6.37L12.06 13.88ZM15.22 10.72 13.13 12.81 11.19 10.88l2.1-2.1a.75 .75 0 0 0 0-1.06L8.84 3.28a7.5 7.5 0 0 1 7.33 1.91l4.15 4.17L17.63 12.06l-1.34-1.34A.75 .75 0 0 0 15.22 10.72Zm4.59 3.53-1.12-1.12L21.38 10.43l1.13 1.13Z\"],\"faded\":[0]},{\"id\":\"ph-gear-duo\",\"label\":\"Settings duotone\",\"set\":\"duotone\",\"paths\":[\"M19.49 11.55l1.57-1.97a9.29 9.29 0 0 0-.94-2.28l-2.5-.28a7.59 7.59 0 0 0-.64-.64l-.28-2.5a9.32 9.32 0 0 0-2.28-.94l-1.97 1.57a7.65 7.65 0 0 0-.9 0l-1.97-1.57A9.29 9.29 0 0 0 7.3 3.88l-.28 2.5a7.59 7.59 0 0 0-.64 .64l-2.5 .28a9.32 9.32 0 0 0-.94 2.28l1.57 1.97a7.65 7.65 0 0 0 0 .9l-1.57 1.97a9.29 9.29 0 0 0 .94 2.28l2.5 .28a7.59 7.59 0 0 0 .64 .64l.28 2.5a9.32 9.32 0 0 0 2.28 .94l1.97-1.57a7.65 7.65 0 0 0 .9 0l1.97 1.57a9.29 9.29 0 0 0 2.28-.94l.28-2.5a7.59 7.59 0 0 0 .64-.64l2.5-.28a9.32 9.32 0 0 0 .94-2.28l-1.57-1.97A7.65 7.65 0 0 0 19.49 11.55ZM12 15.75a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 12 15.75Z\",\"M12 7.5a4.5 4.5 0 1 0 4.5 4.5A4.5 4.5 0 0 0 12 7.5Zm0 7.5a3 3 0 1 1 3-3A3 3 0 0 1 12 15Zm8.25-2.8q.01-.2 0-.4l1.4-1.75a.75 .75 0 0 0 .14-.66 10.09 10.09 0 0 0-1.02-2.46 .75 .75 0 0 0-.56-.37l-2.22-.25q-.14-.15-.28-.28L17.44 3.8a.75 .75 0 0 0-.37-.56 10.06 10.06 0 0 0-2.46-1.02 .75 .75 0 0 0-.66 .14L12.2 3.75Q12 3.75 11.8 3.75L10.05 2.35a.75 .75 0 0 0-.66-.14A10.09 10.09 0 0 0 6.93 3.24a.75 .75 0 0 0-.37 .56L6.31 6.03q-.15 .14-.28 .28L3.8 6.56a.75 .75 0 0 0-.56 .37 10.1 10.1 0 0 0-1.02 2.46 .75 .75 0 0 0 .14 .66L3.75 11.8Q3.75 12 3.75 12.2L2.35 13.95a.75 .75 0 0 0-.14 .66 10.09 10.09 0 0 0 1.02 2.46 .75 .75 0 0 0 .56 .37l2.22 .25q.14 .15 .28 .28L6.56 20.2a.75 .75 0 0 0 .37 .56 10.1 10.1 0 0 0 2.46 1.02 .75 .75 0 0 0 .66-.14L11.8 20.25q.2 .01 .41 0l1.75 1.4a.75 .75 0 0 0 .66 .14 10.05 10.05 0 0 0 2.46-1.02 .75 .75 0 0 0 .37-.56l.25-2.22q.15-.14 .28-.28L20.2 17.44a.75 .75 0 0 0 .56-.37 10.1 10.1 0 0 0 1.02-2.46 .75 .75 0 0 0-.14-.66Zm-1.51-.61a6.93 6.93 0 0 1 0 .81 .75 .75 0 0 0 .16 .51l1.33 1.66a8.58 8.58 0 0 1-.58 1.41L17.53 16.23a.75 .75 0 0 0-.48 .25 6.95 6.95 0 0 1-.58 .58 .75 .75 0 0 0-.25 .48l-.24 2.12a8.56 8.56 0 0 1-1.41 .58l-1.66-1.33a.75 .75 0 0 0-.47-.16h-.04a6.93 6.93 0 0 1-.81 0 .76 .76 0 0 0-.51 .16L9.42 20.23a8.58 8.58 0 0 1-1.41-.58L7.77 17.53a.75 .75 0 0 0-.25-.48 6.95 6.95 0 0 1-.58-.58 .75 .75 0 0 0-.48-.25L4.35 15.99a8.56 8.56 0 0 1-.58-1.41l1.33-1.66a.75 .75 0 0 0 .16-.51 6.93 6.93 0 0 1 0-.81 .75 .75 0 0 0-.16-.51L3.77 9.42a8.58 8.58 0 0 1 .58-1.41L6.47 7.77a.75 .75 0 0 0 .48-.25 6.95 6.95 0 0 1 .58-.58A.75 .75 0 0 0 7.77 6.47L8.01 4.35a8.56 8.56 0 0 1 1.41-.58l1.66 1.33a.75 .75 0 0 0 .51 .16 6.93 6.93 0 0 1 .81 0 .76 .76 0 0 0 .51-.16L14.58 3.77a8.58 8.58 0 0 1 1.41 .58L16.23 6.47a.75 .75 0 0 0 .25 .48 6.95 6.95 0 0 1 .58 .58 .75 .75 0 0 0 .48 .25l2.12 .24a8.56 8.56 0 0 1 .58 1.41l-1.33 1.66A.75 .75 0 0 0 18.74 11.59Z\"],\"faded\":[0]},{\"id\":\"ph-sliders-horizontal-duo\",\"label\":\"Sliders duotone\",\"set\":\"duotone\",\"paths\":[\"M12 7.5a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 12 7.5Zm3.75 6.75a2.25 2.25 0 1 0 2.25 2.25A2.25 2.25 0 0 0 15.75 14.25Z\",\"M3.75 8.25H6.84a3 3 0 0 0 5.81 0h7.59a.75 .75 0 0 0 0-1.5H12.66a3 3 0 0 0-5.81 0H3.75a.75 .75 0 0 0 0 1.5Zm6-2.25A1.5 1.5 0 1 1 8.25 7.5 1.5 1.5 0 0 1 9.75 6ZM20.25 15.75H18.66a3 3 0 0 0-5.81 0H3.75a.75 .75 0 0 0 0 1.5h9.09a3 3 0 0 0 5.81 0h1.59a.75 .75 0 0 0 0-1.5Zm-4.5 2.25a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 15.75 18Z\"],\"faded\":[0]},{\"id\":\"ph-pencil-simple-duo\",\"label\":\"Pencil duotone\",\"set\":\"duotone\",\"paths\":[\"M20.78 8.47 18 11.25 12.75 6l2.78-2.78a.75 .75 0 0 1 1.06 0L20.78 7.41A.75 .75 0 0 1 20.78 8.47Z\",\"M21.31 6.88 17.12 2.69a1.5 1.5 0 0 0-2.12 0L3.44 14.25A1.49 1.49 0 0 0 3 15.31V19.5a1.5 1.5 0 0 0 1.5 1.5H8.69A1.49 1.49 0 0 0 9.75 20.56L21.31 9a1.5 1.5 0 0 0 0-2.12ZM8.69 19.5H4.5V15.31l8.25-8.25L16.94 11.25ZM18 10.19 13.81 6l2.25-2.25L20.25 7.94Z\"],\"faded\":[0]},{\"id\":\"ph-paint-brush-duo\",\"label\":\"Brush duotone\",\"set\":\"duotone\",\"paths\":[\"M21 3c0 3.08-2.97 6.32-5.5 8.54A7.91 7.91 0 0 0 12.47 8.5C14.68 5.97 17.92 3 21 3Z\",\"M21.75 3a.75 .75 0 0 0-.75-.75c-4.13 0-8.37 4.66-10.73 7.75A5.63 5.63 0 0 0 3 15.38c0 2.9-1.83 4.19-1.92 4.25A.75 .75 0 0 0 1.5 21H8.63a5.63 5.63 0 0 0 5.38-7.27C17.09 11.37 21.75 7.13 21.75 3ZM8.63 19.5H3.25C3.88 18.6 4.5 17.24 4.5 15.38a4.13 4.13 0 1 1 4.13 4.13Zm3.04-8.85q.48-.62 .95-1.18A7.15 7.15 0 0 1 14.53 11.39q-.55 .46-1.18 .95A5.68 5.68 0 0 0 11.66 10.65Zm4-.25a8.68 8.68 0 0 0-2.06-2.06c2.98-3.24 5.23-4.22 6.55-4.49C19.89 5.17 18.9 7.41 15.67 10.39Z\"],\"faded\":[0]},{\"id\":\"ph-palette-duo\",\"label\":\"Palette duotone\",\"set\":\"duotone\",\"paths\":[\"M21 11.92a9.05 9.05 0 0 1-.22 2.08A2.25 2.25 0 0 1 18.58 15.75H14.25a2.25 2.25 0 0 0-2.25 2.25 2.25 2.25 0 0 1-3 2.12C5.51 18.88 3 15.92 3 12a9 9 0 0 1 8.91-9C16.86 2.95 20.96 6.97 21 11.92Z\",\"M18.82 5.05A9.68 9.68 0 0 0 12 2.25h-.1A9.75 9.75 0 0 0 2.25 12c0 4.03 2.49 7.41 6.5 8.83A3 3 0 0 0 12.75 18a1.5 1.5 0 0 1 1.5-1.5h4.33a2.98 2.98 0 0 0 2.93-2.33 9.79 9.79 0 0 0 .24-2.25A9.68 9.68 0 0 0 18.82 5.05Zm1.22 8.79A1.49 1.49 0 0 1 18.58 15H14.25a3 3 0 0 0-3 3 1.5 1.5 0 0 1-2 1.41C5.86 18.22 3.75 15.38 3.75 12a8.25 8.25 0 0 1 8.16-8.25h.08a8.28 8.28 0 0 1 8.25 8.18A8.33 8.33 0 0 1 20.04 13.84ZM13.13 7.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 7.13ZM9 9.38A1.13 1.13 0 1 1 7.88 8.25 1.13 1.13 0 0 1 9 9.38Zm0 5.25a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9 14.63Zm8.25-5.25a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 17.25 9.38Z\"],\"faded\":[0]},{\"id\":\"ph-trash-duo\",\"label\":\"Trash duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 5.25V19.5a.75 .75 0 0 1-.75 .75H6a.75 .75 0 0 1-.75-.75V5.25Z\",\"M20.25 4.5H16.5V3.75a2.25 2.25 0 0 0-2.25-2.25H9.75A2.25 2.25 0 0 0 7.5 3.75v.75H3.75a.75 .75 0 0 0 0 1.5h.75V19.5a1.5 1.5 0 0 0 1.5 1.5H18a1.5 1.5 0 0 0 1.5-1.5V6h.75a.75 .75 0 0 0 0-1.5ZM9 3.75a.75 .75 0 0 1 .75-.75h4.5a.75 .75 0 0 1 .75 .75v.75H9Zm9 15.75H6V6H18ZM10.5 9.75v6a.75 .75 0 0 1-1.5 0V9.75a.75 .75 0 0 1 1.5 0Zm4.5 0v6a.75 .75 0 0 1-1.5 0V9.75a.75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-magnifying-glass-duo\",\"label\":\"Search duotone\",\"set\":\"duotone\",\"paths\":[\"M18 10.5a7.5 7.5 0 1 1-7.5-7.5A7.5 7.5 0 0 1 18 10.5Z\",\"M21.53 20.47 16.84 15.78a8.27 8.27 0 1 0-1.06 1.06l4.69 4.69a.75 .75 0 0 0 1.06-1.06ZM3.75 10.5a6.75 6.75 0 1 1 6.75 6.75A6.76 6.76 0 0 1 3.75 10.5Z\"],\"faded\":[0]},{\"id\":\"ph-funnel-duo\",\"label\":\"Filter duotone\",\"set\":\"duotone\",\"paths\":[\"M20.8 5.75 14.25 12.75v5.5a.75 .75 0 0 1-.33 .62l-3 2A.75 .75 0 0 1 9.75 20.25V12.75L3.2 5.75A.75 .75 0 0 1 3.75 4.5H20.25A.75 .75 0 0 1 20.8 5.75Z\",\"M21.62 4.64A1.48 1.48 0 0 0 20.25 3.75H3.75A1.5 1.5 0 0 0 2.64 6.26l.01 .01L9 13.05V20.25a1.5 1.5 0 0 0 2.33 1.25l3-2A1.5 1.5 0 0 0 15 18.25V13.05l6.35-6.78 .01-.01A1.48 1.48 0 0 0 21.62 4.64ZM3.75 5.25h0Zm9.95 6.99A.75 .75 0 0 0 13.5 12.75v5.5L10.5 20.25V12.75a.75 .75 0 0 0-.2-.51L3.75 5.25H20.25Z\"],\"faded\":[0]},{\"id\":\"ph-list-duo\",\"label\":\"List duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 6V18H3.75V6Z\",\"M21 12a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1 0-1.5H20.25A.75 .75 0 0 1 21 12ZM3.75 6.75H20.25a.75 .75 0 0 0 0-1.5H3.75a.75 .75 0 0 0 0 1.5ZM20.25 17.25H3.75a.75 .75 0 0 0 0 1.5H20.25a.75 .75 0 0 0 0-1.5Z\"],\"faded\":[0]},{\"id\":\"ph-squares-four-duo\",\"label\":\"Grid duotone\",\"set\":\"duotone\",\"paths\":[\"M10.5 5.25v4.5a.75 .75 0 0 1-.75 .75H5.25a.75 .75 0 0 1-.75-.75V5.25a.75 .75 0 0 1 .75-.75h4.5A.75 .75 0 0 1 10.5 5.25Zm8.25-.75H14.25a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 .75 .75h4.5a.75 .75 0 0 0 .75-.75V5.25A.75 .75 0 0 0 18.75 4.5Zm-9 9H5.25a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 .75 .75h4.5a.75 .75 0 0 0 .75-.75V14.25A.75 .75 0 0 0 9.75 13.5Zm9 0H14.25a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 .75 .75h4.5a.75 .75 0 0 0 .75-.75V14.25A.75 .75 0 0 0 18.75 13.5Z\",\"M18.75 12.75H14.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 18.75 12.75Zm0 6H14.25V14.25h4.5v4.5ZM9.75 3.75H5.25A1.5 1.5 0 0 0 3.75 5.25v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 9.75 3.75Zm0 6H5.25V5.25h4.5v4.5Zm9-6H14.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 18.75 3.75Zm0 6H14.25V5.25h4.5v4.5Zm-9 3H5.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 9.75 12.75Zm0 6H5.25V14.25h4.5v4.5Z\"],\"faded\":[0]},{\"id\":\"ph-folder-duo\",\"label\":\"Folder duotone\",\"set\":\"duotone\",\"paths\":[\"M12 7.5H3V5.25a.75 .75 0 0 1 .75-.75H8.69a.75 .75 0 0 1 .53 .22Z\",\"M20.25 6.75H12.31L9.75 4.19A1.49 1.49 0 0 0 8.69 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.81A1.44 1.44 0 0 0 3.69 20.25H20.33A1.42 1.42 0 0 0 21.75 18.83V8.25A1.5 1.5 0 0 0 20.25 6.75ZM8.69 5.25l1.5 1.5H3.75V5.25ZM20.25 18.75H3.75V8.25H20.25Z\"],\"faded\":[0]},{\"id\":\"ph-download-simple-duo\",\"label\":\"Download duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V19.5H3.75V4.5A1.5 1.5 0 0 1 5.25 3H18.75A1.5 1.5 0 0 1 20.25 4.5Z\",\"M21 13.5v6a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 1.5 0v5.25H19.5V13.5a.75 .75 0 0 1 1.5 0Zm-9.53 .53a.75 .75 0 0 0 1.06 0l3.75-3.75a.75 .75 0 0 0-1.06-1.06L12.75 11.69V3a.75 .75 0 0 0-1.5 0v8.69L8.78 9.22a.75 .75 0 0 0-1.06 1.06Z\"],\"faded\":[0]},{\"id\":\"ph-upload-simple-duo\",\"label\":\"Upload duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V19.5H3.75V4.5A1.5 1.5 0 0 1 5.25 3H18.75A1.5 1.5 0 0 1 20.25 4.5Z\",\"M21 13.5v6a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 1.5 0v5.25H19.5V13.5a.75 .75 0 0 1 1.5 0ZM8.78 7.28 11.25 4.81V13.5a.75 .75 0 0 0 1.5 0V4.81l2.47 2.47a.75 .75 0 0 0 1.06-1.06l-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75A.75 .75 0 0 0 8.78 7.28Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-clockwise-duo\",\"label\":\"Refresh duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12a8.25 8.25 0 1 1-8.25-8.25A8.25 8.25 0 0 1 20.25 12Z\",\"M21 4.5V9a.75 .75 0 0 1-.75 .75H15.75a.75 .75 0 0 1 0-1.5h2.69L17.07 6.88a7.46 7.46 0 0 0-5.26-2.2h-.04A7.46 7.46 0 0 0 6.52 6.82 .75 .75 0 0 1 5.48 5.74a9 9 0 0 1 12.66 .07L19.5 7.19V4.5a.75 .75 0 0 1 1.5 0ZM17.48 17.18a7.5 7.5 0 0 1-10.54-.06L5.56 15.75H8.25a.75 .75 0 0 0 0-1.5H3.75a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 1.5 0V16.81l1.37 1.37A8.95 8.95 0 0 0 12.19 20.82h.05a8.94 8.94 0 0 0 6.29-2.56 .75 .75 0 0 0-1.05-1.07Z\"],\"faded\":[0]},{\"id\":\"ph-power-duo\",\"label\":\"Power duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12a8.25 8.25 0 1 1-8.25-8.25A8.25 8.25 0 0 1 20.25 12Z\",\"M11.25 12V4.5a.75 .75 0 0 1 1.5 0v7.5a.75 .75 0 0 1-1.5 0Zm5.66-7.38a.75 .75 0 0 0-.82 1.26C18.26 7.29 19.5 9.52 19.5 12a7.5 7.5 0 0 1-15 0c0-2.48 1.24-4.71 3.41-6.12a.75 .75 0 0 0-.82-1.26C4.49 6.32 3 9.01 3 12a9 9 0 0 0 18 0C21 9.01 19.51 6.32 16.91 4.62Z\"],\"faded\":[0]},{\"id\":\"ph-sign-in-duo\",\"label\":\"Join duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 3.75V20.25H3.75a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 3.75 3.75Z\",\"M13.28 12.53l-3.75 3.75a.75 .75 0 0 1-1.06-1.06L10.94 12.75H2.25a.75 .75 0 0 1 0-1.5h8.69L8.47 8.78a.75 .75 0 0 1 1.06-1.06l3.75 3.75A.75 .75 0 0 1 13.28 12.53ZM18.75 3H12.75a.75 .75 0 0 0 0 1.5h5.25V19.5H12.75a.75 .75 0 0 0 0 1.5h6a.75 .75 0 0 0 .75-.75V3.75A.75 .75 0 0 0 18.75 3Z\"],\"faded\":[0]},{\"id\":\"ph-sign-out-duo\",\"label\":\"Leave duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V18.75a1.5 1.5 0 0 1-1.5 1.5H4.5V3.75H19.5A1.5 1.5 0 0 1 21 5.25Z\",\"M11.25 20.25a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V3.75a.75 .75 0 0 1 .75-.75h6a.75 .75 0 0 1 0 1.5H5.25V19.5h5.25A.75 .75 0 0 1 11.25 20.25Zm10.28-8.78-3.75-3.75a.75 .75 0 0 0-1.06 1.06L19.19 11.25H10.5a.75 .75 0 0 0 0 1.5h8.69l-2.47 2.47a.75 .75 0 0 0 1.06 1.06l3.75-3.75A.75 .75 0 0 0 21.53 11.47Z\"],\"faded\":[0]},{\"id\":\"ph-plus-circle-duo\",\"label\":\"Plus duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm4.5-8.25a.75 .75 0 0 1-.75 .75H12.75v3a.75 .75 0 0 1-1.5 0V12.75H8.25a.75 .75 0 0 1 0-1.5h3V8.25a.75 .75 0 0 1 1.5 0v3h3A.75 .75 0 0 1 16.5 12Z\"],\"faded\":[0]},{\"id\":\"ph-minus-circle-duo\",\"label\":\"Minus duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M16.5 12a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1 0-1.5h7.5A.75 .75 0 0 1 16.5 12Zm5.25 0A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-ticket-duo\",\"label\":\"Ticket duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 12a3 3 0 0 0 3 3v3a.75 .75 0 0 1-.75 .75H9V5.25H21a.75 .75 0 0 1 .75 .75V9A3 3 0 0 0 18.75 12Z\",\"M21.75 9.75a.75 .75 0 0 0 .75-.75V6a1.5 1.5 0 0 0-1.5-1.5H3A1.5 1.5 0 0 0 1.5 6V9a.75 .75 0 0 0 .75 .75 2.25 2.25 0 0 1 0 4.5 .75 .75 0 0 0-.75 .75v3a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V15a.75 .75 0 0 0-.75-.75 2.25 2.25 0 0 1 0-4.5ZM3 15.68a3.75 3.75 0 0 0 0-7.35V6H8.25V18H3Zm18 0V18H9.75V6H21V8.32a3.75 3.75 0 0 0 0 7.35Z\"],\"faded\":[0]},{\"id\":\"ph-tag-duo\",\"label\":\"Tag duotone\",\"set\":\"duotone\",\"paths\":[\"M22.28 14.34 14.34 22.28a.75 .75 0 0 1-1.06 0L3.97 12.97A.75 .75 0 0 1 3.75 12.44V3.75h8.69a.75 .75 0 0 1 .53 .22l9.31 9.31A.75 .75 0 0 1 22.28 14.34Z\",\"M22.81 12.75 13.5 3.44A1.49 1.49 0 0 0 12.44 3H3.75a.75 .75 0 0 0-.75 .75v8.69A1.49 1.49 0 0 0 3.44 13.5L12.75 22.81a1.5 1.5 0 0 0 2.12 0l7.94-7.94a1.5 1.5 0 0 0 0-2.12Zm-9 9L4.5 12.44V4.5h7.94L21.75 13.81ZM9 7.88A1.13 1.13 0 1 1 7.88 6.75 1.13 1.13 0 0 1 9 7.88Z\"],\"faded\":[0]},{\"id\":\"ph-percent-duo\",\"label\":\"Percent duotone\",\"set\":\"duotone\",\"paths\":[\"M8.98 5.27a2.63 2.63 0 1 1-3.71 0A2.63 2.63 0 0 1 8.98 5.27Zm9.75 9.75a2.63 2.63 0 1 0 0 3.71A2.63 2.63 0 0 0 18.73 15.02Z\",\"M19.28 5.78l-13.5 13.5a.75 .75 0 0 1-1.06-1.06l13.5-13.5a.75 .75 0 0 1 1.06 1.06ZM4.74 9.51a3.38 3.38 0 0 1 4.77-4.77h0a3.38 3.38 0 0 1-4.77 4.77ZM5.25 7.13A1.88 1.88 0 1 0 8.45 5.8h0A1.88 1.88 0 0 0 5.25 7.13ZM20.25 16.88a3.38 3.38 0 1 1-.99-2.39h0A3.35 3.35 0 0 1 20.25 16.88Zm-1.5 0a1.88 1.88 0 1 0-.55 1.33A1.86 1.86 0 0 0 18.75 16.88Z\"],\"faded\":[0]},{\"id\":\"ph-sticker-duo\",\"label\":\"Sticker duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12.75c-.75 2.25-5.25 6.75-7.5 7.5V17.25a4.5 4.5 0 0 1 4.5-4.5Z\",\"M15.75 3H8.25A5.26 5.26 0 0 0 3 8.25v7.5a5.26 5.26 0 0 0 5.25 5.25h4.5a.76 .76 0 0 0 .24-.04c2.46-.82 7.15-5.52 7.97-7.97A.76 .76 0 0 0 21 12.75V8.25A5.26 5.26 0 0 0 15.75 3ZM4.5 15.75V8.25A3.75 3.75 0 0 1 8.25 4.5h7.5a3.75 3.75 0 0 1 3.75 3.75v3.75H17.25a5.26 5.26 0 0 0-5.25 5.25v2.25H8.25A3.75 3.75 0 0 1 4.5 15.75Zm9 3.29V17.25a3.75 3.75 0 0 1 3.75-3.75h1.79C17.91 15.33 15.33 17.91 13.5 19.04Z\"],\"faded\":[0]},{\"id\":\"ph-game-controller-duo\",\"label\":\"Gamepad duotone\",\"set\":\"duotone\",\"paths\":[\"M20.33 19.46a2.63 2.63 0 0 1-2.31-.73L14.07 14.25H16.13a4.87 4.87 0 0 0 4.8-5.72h0l1.53 7.89A2.63 2.63 0 0 1 20.33 19.46Z\",\"M16.5 10.5H14.25a.75 .75 0 0 1 0-1.5h2.25a.75 .75 0 0 1 0 1.5ZM9.75 9H9V8.25a.75 .75 0 0 0-1.5 0v.75H6.75a.75 .75 0 0 0 0 1.5h.75v.75a.75 .75 0 0 0 1.5 0v-.75h.75a.75 .75 0 0 0 0-1.5ZM22.64 18.81a3.38 3.38 0 0 1-5.15 .45c-.01-.01-.02-.02-.03-.03L13.73 15h-3.47L6.54 19.23l-.03 .03A3.38 3.38 0 0 1 4.13 20.25 3.38 3.38 0 0 1 .8 16.29a.06 .06 0 0 1 0-.01L2.34 8.39A5.61 5.61 0 0 1 7.86 3.75H16.13a5.63 5.63 0 0 1 5.53 4.62c0 .01 0 .01 0 .02l1.53 7.89a.06 .06 0 0 1 0 .01A3.35 3.35 0 0 1 22.64 18.81ZM16.13 13.5a4.13 4.13 0 0 0 0-8.25H7.86A4.12 4.12 0 0 0 3.81 8.66l0 .01L2.28 16.56A1.88 1.88 0 0 0 5.44 18.22l3.93-4.46a.75 .75 0 0 1 .56-.25Zm5.6 3.06-.82-4.22A5.63 5.63 0 0 1 16.13 15h-.39L18.56 18.22a1.88 1.88 0 0 0 1.64 .51 1.88 1.88 0 0 0 1.52-2.17Z\"],\"faded\":[0]},{\"id\":\"ph-sword-duo\",\"label\":\"Sword duotone\",\"set\":\"duotone\",\"paths\":[\"M13.28 18.84 12.09 20.03a.75 .75 0 0 1-1.06 0L8.63 17.63 5.47 20.78a.75 .75 0 0 1-1.06 0L3.22 19.59a.75 .75 0 0 1 0-1.06L6.38 15.38 3.97 12.97a.75 .75 0 0 1 0-1.06L5.16 10.72a.75 .75 0 0 1 1.06 0l7.06 7.06A.75 .75 0 0 1 13.28 18.84Z\",\"M20.25 3H14.25a.75 .75 0 0 0-.59 .29l-6 7.8L6.75 10.19a1.5 1.5 0 0 0-2.12 0l-1.19 1.19a1.5 1.5 0 0 0 0 2.12l1.88 1.88-2.62 2.63a1.5 1.5 0 0 0 0 2.12l1.19 1.19a1.5 1.5 0 0 0 2.12 0l2.63-2.62 1.88 1.88a1.5 1.5 0 0 0 2.12 0l1.19-1.19a1.5 1.5 0 0 0 0-2.12l-.9-.9 7.8-6A.75 .75 0 0 0 21 9.75V3.75A.75 .75 0 0 0 20.25 3ZM4.94 20.25 3.75 19.06l2.63-2.62L7.56 17.63Zm6.62-.75L4.5 12.44 5.69 11.25 12.75 18.31ZM19.5 9.38l-7.66 5.9L10.81 14.25l4.72-4.72a.75 .75 0 0 0-1.06-1.06L9.75 13.19 8.73 12.16 14.62 4.5H19.5Z\"],\"faded\":[0]},{\"id\":\"ph-target-duo\",\"label\":\"Target duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 12a4.5 4.5 0 1 1-4.5-4.5A4.5 4.5 0 0 1 16.5 12Z\",\"M20.8 7.8A9.76 9.76 0 1 1 18.34 4.59l2.13-2.13a.75 .75 0 0 1 1.06 1.06l-9 9a.75 .75 0 0 1-1.06-1.06l2.6-2.6a3.75 3.75 0 1 0 1.68 2.91 .75 .75 0 1 1 1.5-.08 5.25 5.25 0 1 1-2.1-3.9L17.28 5.66a8.24 8.24 0 1 0 2.17 2.78 .75 .75 0 0 1 1.35-.65Z\"],\"faded\":[0]},{\"id\":\"ph-puzzle-piece-duo\",\"label\":\"Puzzle duotone\",\"set\":\"duotone\",\"paths\":[\"M19.13 15.75a2.63 2.63 0 0 0 1.13-.25V19.5a.75 .75 0 0 1-.75 .75H6a.75 .75 0 0 1-.75-.75V15.5a2.63 2.63 0 1 1 0-4.75V6.75a.75 .75 0 0 1 .75-.75h4.38a2.63 2.63 0 1 1 4.74 0H19.5a.75 .75 0 0 1 .75 .75v4A2.63 2.63 0 1 0 19.13 15.75Z\",\"M20.65 14.86a.75 .75 0 0 0-.72-.04 1.88 1.88 0 1 1 0-3.39A.75 .75 0 0 0 21 10.75V6.75a1.5 1.5 0 0 0-1.5-1.5H16.1a3.32 3.32 0 0 0 .02-.37 3.39 3.39 0 0 0-1.06-2.46 3.38 3.38 0 0 0-5.68 2.22 3.43 3.43 0 0 0 .01 .62H6A1.5 1.5 0 0 0 4.5 6.75v3.02a3.32 3.32 0 0 0-.37-.02 3.39 3.39 0 0 0-2.46 1.07 3.35 3.35 0 0 0-.91 2.53 3.38 3.38 0 0 0 3.12 3.15 3.43 3.43 0 0 0 .62-.01V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V15.5A.75 .75 0 0 0 20.65 14.86ZM19.5 19.5H6V15.5a.75 .75 0 0 0-1.07-.68 1.88 1.88 0 1 1 0-3.39A.75 .75 0 0 0 6 10.75V6.75h4.38a.75 .75 0 0 0 .68-1.07 1.88 1.88 0 1 1 3.39 0A.75 .75 0 0 0 15.12 6.75H19.5v3.02a3.35 3.35 0 0 0-.62-.01A3.38 3.38 0 0 0 19.13 16.5a3.32 3.32 0 0 0 .38-.02Z\"],\"faded\":[0]},{\"id\":\"ph-chart-bar-duo\",\"label\":\"Chart duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 3.75V19.5H14.25V3.75Z\",\"M21 18.75h-.75V3.75a.75 .75 0 0 0-.75-.75H14.25a.75 .75 0 0 0-.75 .75V7.5H9a.75 .75 0 0 0-.75 .75v3.75H4.5a.75 .75 0 0 0-.75 .75v6H3a.75 .75 0 0 0 0 1.5H21a.75 .75 0 0 0 0-1.5ZM15 4.5h3.75V18.75H15ZM9.75 9h3.75V18.75H9.75ZM5.25 13.5H8.25v5.25H5.25Z\"],\"faded\":[0]},{\"id\":\"ph-chart-line-up-duo\",\"label\":\"Growth duotone\",\"set\":\"duotone\",\"paths\":[\"M21 6V19.5H3V4.5H19.5A1.5 1.5 0 0 1 21 6Z\",\"M21.75 19.5a.75 .75 0 0 1-.75 .75H3a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 1.5 0V14.69l4.72-4.72a.75 .75 0 0 1 1.06 0L12 12.44 16.94 7.5H15a.75 .75 0 0 1 0-1.5h3.75a.75 .75 0 0 1 .75 .75v3.75a.75 .75 0 0 1-1.5 0V8.56l-5.47 5.47a.75 .75 0 0 1-1.06 0L9 11.56l-5.25 5.25V18.75H21A.75 .75 0 0 1 21.75 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-trend-up-duo\",\"label\":\"Trending up duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 5.25v6L15.75 5.25Z\",\"M21.75 4.5H15.75a.75 .75 0 0 0-.53 1.28L17.69 8.25 12.75 13.19l-3.22-3.22a.75 .75 0 0 0-1.06 0l-6.75 6.75a.75 .75 0 0 0 1.06 1.06L9 11.56l3.22 3.22a.75 .75 0 0 0 1.06 0L18.75 9.31l2.47 2.47A.75 .75 0 0 0 22.5 11.25V5.25A.75 .75 0 0 0 21.75 4.5Zm-.75 4.94L17.56 6H21Z\"],\"faded\":[0]},{\"id\":\"ph-trend-down-duo\",\"label\":\"Trending down duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12v6H15.75Z\",\"M22.04 11.31a.75 .75 0 0 0-.82 .16L18.75 13.94 13.28 8.47a.75 .75 0 0 0-1.06 0L9 11.69 2.78 5.47A.75 .75 0 0 0 1.72 6.53l6.75 6.75a.75 .75 0 0 0 1.06 0L12.75 10.06 17.69 15l-2.47 2.47A.75 .75 0 0 0 15.75 18.75h6a.75 .75 0 0 0 .75-.75V12A.75 .75 0 0 0 22.04 11.31ZM21 17.25H17.56L21 13.81Z\"],\"faded\":[0]},{\"id\":\"ph-pulse-duo\",\"label\":\"Activity duotone\",\"set\":\"duotone\",\"paths\":[\"M9 3.75l3.14 8.25H5.25Zm9.75 8.25H12.14L15 19.5Z\",\"M22.5 12a.75 .75 0 0 1-.75 .75H19.21l-3.54 7.09A.75 .75 0 0 1 15 20.25h-.04a.75 .75 0 0 1-.66-.48L8.94 5.7 5.93 12.31A.75 .75 0 0 1 5.25 12.75H2.25a.75 .75 0 0 1 0-1.5H4.77L8.32 3.44a.75 .75 0 0 1 1.38 .04l5.39 14.16 2.99-5.97A.75 .75 0 0 1 18.75 11.25h3A.75 .75 0 0 1 22.5 12Z\"],\"faded\":[0]},{\"id\":\"ph-sun-duo\",\"label\":\"Sun duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 12a5.25 5.25 0 1 1-5.25-5.25A5.25 5.25 0 0 1 17.25 12Z\",\"M11.25 3.75V1.5a.75 .75 0 0 1 1.5 0V3.75a.75 .75 0 0 1-1.5 0Zm6.75 8.25a6 6 0 1 1-6-6A6.01 6.01 0 0 1 18 12Zm-1.5 0a4.5 4.5 0 1 0-4.5 4.5A4.5 4.5 0 0 0 16.5 12ZM5.47 6.53A.75 .75 0 0 0 6.53 5.47l-1.5-1.5A.75 .75 0 0 0 3.97 5.03Zm0 10.94-1.5 1.5a.75 .75 0 0 0 1.06 1.06l1.5-1.5a.75 .75 0 0 0-1.06-1.06ZM18 6.75a.75 .75 0 0 0 .53-.22l1.5-1.5a.75 .75 0 0 0-1.06-1.06l-1.5 1.5A.75 .75 0 0 0 18 6.75Zm.53 10.72a.75 .75 0 0 0-1.06 1.06l1.5 1.5a.75 .75 0 0 0 1.06-1.06ZM4.5 12a.75 .75 0 0 0-.75-.75H1.5a.75 .75 0 0 0 0 1.5H3.75A.75 .75 0 0 0 4.5 12Zm7.5 7.5a.75 .75 0 0 0-.75 .75v2.25a.75 .75 0 0 0 1.5 0V20.25A.75 .75 0 0 0 12 19.5Zm10.5-8.25H20.25a.75 .75 0 0 0 0 1.5h2.25a.75 .75 0 0 0 0-1.5Z\"],\"faded\":[0]},{\"id\":\"ph-moon-duo\",\"label\":\"Moon duotone\",\"set\":\"duotone\",\"paths\":[\"M21.36 13.86A9 9 0 1 1 10.14 2.64 9.01 9.01 0 0 0 21.36 13.86Z\",\"M21.89 13.33a.75 .75 0 0 0-.75-.19 8.26 8.26 0 0 1-10.29-10.29 .75 .75 0 0 0-.94-.94 9.83 9.83 0 0 0-4.96 3.47A9.75 9.75 0 0 0 12.75 21a9.66 9.66 0 0 0 5.86-1.96 9.83 9.83 0 0 0 3.47-4.96A.75 .75 0 0 0 21.89 13.33ZM17.71 17.84A8.25 8.25 0 0 1 6.16 6.29a8.34 8.34 0 0 1 2.94-2.44A9.94 9.94 0 0 0 9 5.25 9.76 9.76 0 0 0 18.75 15a9.94 9.94 0 0 0 1.4-.1A8.34 8.34 0 0 1 17.71 17.84Z\"],\"faded\":[0]},{\"id\":\"ph-cloud-duo\",\"label\":\"Cloud duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 12a7.5 7.5 0 0 1-7.5 7.5H6.75A5.25 5.25 0 1 1 8.06 9.16l0 .01A7.5 7.5 0 0 1 22.5 12Z\",\"M15 3.75A8.26 8.26 0 0 0 7.62 8.31 6 6 0 1 0 6.75 20.25h8.25a8.25 8.25 0 0 0 0-16.5Zm0 15H6.75a4.5 4.5 0 0 1 0-9c.1 0 .21 0 .31 .01A8.25 8.25 0 0 0 6.75 12a.75 .75 0 0 0 1.5 0 6.75 6.75 0 1 1 6.75 6.75Z\"],\"faded\":[0]},{\"id\":\"ph-snowflake-duo\",\"label\":\"Snow duotone\",\"set\":\"duotone\",\"paths\":[\"M20.63 12a8.63 8.63 0 1 1-8.62-8.62A8.63 8.63 0 0 1 20.63 12Z\",\"M20.98 14.07a.75 .75 0 0 1-.55 .91l-2.31 .56 .61 2.26a.75 .75 0 0 1-.53 .92A.77 .77 0 0 1 18 18.75a.75 .75 0 0 1-.72-.56l-.72-2.7L12.75 13.3v4.39l2.03 2.03a.75 .75 0 0 1-1.06 1.06L12 19.06l-1.72 1.72a.75 .75 0 0 1-1.06-1.06L11.25 17.69V13.3L7.45 15.49l-.72 2.7A.75 .75 0 0 1 6 18.75a.77 .77 0 0 1-.19-.03 .75 .75 0 0 1-.53-.92l.61-2.26-2.31-.56a.75 .75 0 0 1 .36-1.46l2.76 .68L10.5 12 6.69 9.8l-2.76 .68A.74 .74 0 0 1 3.75 10.5a.75 .75 0 0 1-.18-1.48l2.31-.56L5.28 6.19a.75 .75 0 0 1 1.45-.39l.72 2.7L11.25 10.7V6.31L9.22 4.28a.75 .75 0 0 1 1.06-1.06L12 4.94l1.72-1.72a.75 .75 0 0 1 1.06 1.06L12.75 6.31v4.39l3.8-2.19 .72-2.7a.75 .75 0 0 1 1.45 .39l-.61 2.26 2.31 .56A.75 .75 0 0 1 20.25 10.5a.74 .74 0 0 1-.18-.02l-2.76-.68L13.5 12l3.81 2.2 2.76-.68A.75 .75 0 0 1 20.98 14.07Z\"],\"faded\":[0]},{\"id\":\"ph-leaf-duo\",\"label\":\"Leaf duotone\",\"set\":\"duotone\",\"paths\":[\"M5.98 18.02c-4.49-7.48 1.5-14.96 14.22-14.22C20.95 16.52 13.46 22.51 5.98 18.02Z\",\"M20.95 3.76a.75 .75 0 0 0-.7-.7C13.11 2.63 7.39 4.78 4.95 8.81a8.16 8.16 0 0 0-1.2 4.59c.05 1.49 .49 3 1.29 4.49l-1.83 1.83a.75 .75 0 0 0 1.06 1.06l1.83-1.83C7.59 19.76 9.1 20.19 10.59 20.24q.16 .01 .31 .01A8.15 8.15 0 0 0 15.19 19.05C19.22 16.61 21.37 10.89 20.95 3.76ZM14.41 17.77c-2.13 1.29-4.66 1.31-7.19 .07l8.31-8.31a.75 .75 0 0 0-1.06-1.06L6.16 16.78c-1.24-2.53-1.22-5.06 .07-7.19 2.07-3.42 6.99-5.29 13.25-5.07C19.71 10.77 17.83 15.69 14.41 17.77Z\"],\"faded\":[0]},{\"id\":\"ph-tree-duo\",\"label\":\"Tree duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 11.98c.01 3.18-2.66 5.93-5.84 6.02a5.97 5.97 0 0 1-3.91-1.31 5.97 5.97 0 0 1-3.9 1.31c-3.18-.08-5.85-2.83-5.85-6.01a6 6 0 0 1 3.76-5.55 6.38 6.38 0 0 1 11.98 0A6 6 0 0 1 21.75 11.98Z\",\"M18.57 5.87a7.13 7.13 0 0 0-13.14 0A6.72 6.72 0 0 0 1.5 11.98C1.49 15.56 4.5 18.66 8.08 18.75A6.77 6.77 0 0 0 11.25 18.04V21.75a.75 .75 0 0 0 1.5 0V18.04A6.77 6.77 0 0 0 15.75 18.75l.17 0C19.5 18.66 22.51 15.56 22.5 11.98A6.72 6.72 0 0 0 18.57 5.87ZM15.89 17.25a5.26 5.26 0 0 1-3.14-.94v-3.84l4.09-2.04a.75 .75 0 1 0-.67-1.34L12.75 10.79V8.25a.75 .75 0 0 0-1.5 0v4.79L7.84 11.33a.75 .75 0 1 0-.67 1.34L11.25 14.71v1.59a5.25 5.25 0 0 1-3.14 .94C5.33 17.18 2.99 14.77 3 11.99A5.23 5.23 0 0 1 6.29 7.13a.75 .75 0 0 0 .42-.44 5.63 5.63 0 0 1 10.57 0A.75 .75 0 0 0 17.71 7.13 5.23 5.23 0 0 1 21 11.99C21.01 14.77 18.67 17.18 15.89 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-flower-duo\",\"label\":\"Flower duotone\",\"set\":\"duotone\",\"paths\":[\"M19.35 12.78c-.83-.48-2.29-.69-3.69-.78 1.4-.09 2.86-.3 3.69-.78a3 3 0 1 0-3-5.2c-.83 .48-1.74 1.64-2.52 2.81C14.45 7.58 15 6.21 15 5.25a3 3 0 0 0-6 0c0 .96 .55 2.33 1.17 3.59-.77-1.17-1.69-2.33-2.52-2.81a3 3 0 1 0-3 5.2c.83 .48 2.29 .69 3.69 .78-1.4 .09-2.86 .3-3.69 .78a3 3 0 1 0 3 5.2c.83-.48 1.74-1.64 2.52-2.81C9.55 16.42 9 17.79 9 18.75a3 3 0 0 0 6 0c0-.96-.55-2.33-1.17-3.59 .77 1.17 1.69 2.33 2.52 2.81a3 3 0 1 0 3-5.2ZM14.6 13.5A3 3 0 1 1 15 12 2.98 2.98 0 0 1 14.6 13.5Z\",\"M19.72 12.13c-.08-.04-.16-.09-.25-.13 .09-.04 .17-.08 .25-.13a3.75 3.75 0 1 0-3.75-6.49c-.08 .04-.15 .09-.23 .15 .01-.09 .01-.19 .01-.28a3.75 3.75 0 0 0-7.5 0c0 .09 0 .18 .01 .28-.08-.05-.16-.11-.23-.15a3.75 3.75 0 1 0-3.75 6.5c.08 .04 .16 .09 .25 .13-.09 .04-.17 .08-.25 .13a3.75 3.75 0 1 0 3.75 6.5c.08-.04 .15-.09 .23-.15-.01 .09-.01 .19-.01 .28a3.75 3.75 0 0 0 7.5 0c0-.09 0-.18-.01-.28 .08 .05 .16 .11 .23 .15A3.73 3.73 0 0 0 17.84 19.13a3.79 3.79 0 0 0 .98-.13 3.75 3.75 0 0 0 .9-6.87ZM9.75 12a2.25 2.25 0 1 1 2.25 2.25A2.25 2.25 0 0 1 9.75 12Zm6.97-5.32a2.25 2.25 0 1 1 2.25 3.9c-.59 .34-1.74 .57-3.3 .67A3.75 3.75 0 0 0 14.49 9.2C15.35 7.9 16.13 7.02 16.72 6.68ZM12 3a2.25 2.25 0 0 1 2.25 2.25c0 .68-.37 1.8-1.06 3.19a3.73 3.73 0 0 0-2.37 0C10.13 7.05 9.75 5.93 9.75 5.25A2.25 2.25 0 0 1 12 3ZM4.21 7.5a2.25 2.25 0 0 1 3.07-.82c.59 .34 1.37 1.23 2.23 2.52A3.75 3.75 0 0 0 8.33 11.25c-1.55-.1-2.71-.33-3.3-.67A2.25 2.25 0 0 1 4.21 7.5ZM7.28 17.32a2.25 2.25 0 1 1-2.25-3.9c.59-.34 1.74-.57 3.3-.67a3.75 3.75 0 0 0 1.19 2.05C8.65 16.1 7.87 16.98 7.28 17.32ZM12 21a2.25 2.25 0 0 1-2.25-2.25c0-.68 .38-1.8 1.07-3.19a3.73 3.73 0 0 0 2.37 0C13.88 16.95 14.25 18.07 14.25 18.75A2.25 2.25 0 0 1 12 21Zm7.79-4.5a2.25 2.25 0 0 1-3.07 .82c-.59-.34-1.37-1.23-2.23-2.52A3.75 3.75 0 0 0 15.67 12.75c1.55 .1 2.71 .33 3.3 .67A2.25 2.25 0 0 1 19.79 16.5Z\"],\"faded\":[0]},{\"id\":\"ph-paw-print-duo\",\"label\":\"Paw duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 10.13a1.88 1.88 0 1 1-1.87-1.87A1.88 1.88 0 0 1 21.75 10.13ZM6 10.13a1.88 1.88 0 1 0-1.87 1.88A1.88 1.88 0 0 0 6 10.13ZM8.63 7.5A1.88 1.88 0 1 0 6.75 5.63 1.88 1.88 0 0 0 8.63 7.5Zm6.75 0a1.88 1.88 0 1 0-1.87-1.87A1.88 1.88 0 0 0 15.38 7.5Zm1.8 7.11A4.07 4.07 0 0 1 15.24 12.19a3.38 3.38 0 0 0-6.48 0 4.08 4.08 0 0 1-1.94 2.43 3 3 0 0 0 2.6 5.4 6.8 6.8 0 0 1 5.16 0 3 3 0 0 0 2.6-5.4Z\",\"M19.88 7.5a2.63 2.63 0 1 0 2.63 2.63A2.63 2.63 0 0 0 19.88 7.5Zm0 3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 19.88 11.25ZM6.75 10.13a2.63 2.63 0 1 0-2.62 2.63A2.63 2.63 0 0 0 6.75 10.13ZM4.13 11.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 4.13 11.25ZM8.63 8.25A2.63 2.63 0 1 0 6 5.63 2.63 2.63 0 0 0 8.63 8.25Zm0-3.75A1.13 1.13 0 1 1 7.5 5.63 1.13 1.13 0 0 1 8.63 4.5Zm6.75 3.75a2.63 2.63 0 1 0-2.62-2.62A2.63 2.63 0 0 0 15.38 8.25Zm0-3.75a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 15.38 4.5Zm2.17 9.46a3.31 3.31 0 0 1-1.58-1.98 4.13 4.13 0 0 0-7.92 0A3.3 3.3 0 0 1 6.47 13.95 3.75 3.75 0 0 0 8.25 21a3.7 3.7 0 0 0 1.46-.29 6.01 6.01 0 0 1 4.58 0 3.75 3.75 0 0 0 3.26-6.75ZM15.75 19.5a2.25 2.25 0 0 1-.89-.18 7.51 7.51 0 0 0-5.74 0 2.25 2.25 0 0 1-1.94-4.06 4.8 4.8 0 0 0 2.29-2.88 2.63 2.63 0 0 1 5.04 0 4.81 4.81 0 0 0 2.3 2.88A2.25 2.25 0 0 1 15.75 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-dog-duo\",\"label\":\"Dog duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 11.29V17.25a3 3 0 0 1-3 3H7.5a3 3 0 0 1-3-3V11.29L9.75 4.5h4.5Z\",\"M22.47 11.72l-1.54-8.25a1.5 1.5 0 0 0-1.84-1.18l-.03 .01L14.14 3.75h-4.28L4.93 2.3l-.03-.01A1.5 1.5 0 0 0 3.07 3.47L1.53 11.72a1.48 1.48 0 0 0 .86 1.64A1.52 1.52 0 0 0 3.01 13.5 1.45 1.45 0 0 0 3.75 13.3V17.25a3.75 3.75 0 0 0 3.75 3.75h9a3.75 3.75 0 0 0 3.75-3.75V13.3a1.45 1.45 0 0 0 .74 .2 1.53 1.53 0 0 0 .63-.14A1.48 1.48 0 0 0 22.47 11.72ZM3 12h0L4.54 3.75 8.48 4.91Zm13.5 7.5H12.75V18.31l1.28-1.28a.75 .75 0 0 0-1.06-1.06L12 16.94l-.97-.97a.75 .75 0 0 0-1.06 1.06L11.25 18.31V19.5H7.5a2.25 2.25 0 0 1-2.25-2.25V11.54L10.12 5.25h3.76L18.75 11.54V17.25A2.25 2.25 0 0 1 16.5 19.5Zm4.5-7.5L15.52 4.91 19.46 3.75 21 12ZM9.75 13.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.75 13.13Zm6.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 13.13Z\"],\"faded\":[0]},{\"id\":\"ph-cat-duo\",\"label\":\"Cat duotone\",\"set\":\"duotone\",\"paths\":[\"M21 4.5v8.25c0 4.56-4.03 8.25-9 8.25s-9-3.69-9-8.25V4.5a.75 .75 0 0 1 1.28-.53L6.34 6.34h0a9.64 9.64 0 0 1 11.33 0h0l2.06-2.37A.75 .75 0 0 1 21 4.5Z\",\"M9 13.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9 13.13Zm7.13-1.12a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 16.13 12Zm5.63-7.5v8.25c0 4.96-4.37 9-9.75 9S2.25 17.71 2.25 12.75V4.5A1.5 1.5 0 0 1 4.81 3.44c.01 .01 .02 .03 .04 .04L6.47 5.34a10.43 10.43 0 0 1 11.07 0L19.15 3.48c.01-.01 .02-.03 .04-.04A1.5 1.5 0 0 1 21.75 4.5Zm-1.5 0-2.02 2.33A.75 .75 0 0 1 17.22 6.94 8.33 8.33 0 0 0 15.75 6.07V8.25a.75 .75 0 1 1-1.5 0V5.54a9.13 9.13 0 0 0-1.5-.25V8.25a.75 .75 0 1 1-1.5 0V5.28a9.13 9.13 0 0 0-1.5 .26V8.25a.75 .75 0 1 1-1.5 0V6.07A8.33 8.33 0 0 0 6.78 6.94a.75 .75 0 0 1-1.01-.11L3.75 4.5v8.25c0 3.91 3.3 7.13 7.5 7.47V18.31l-1.28-1.28a.75 .75 0 0 1 1.06-1.06L12 16.94l.97-.97a.75 .75 0 0 1 1.06 1.06L12.75 18.31v1.91c4.2-.35 7.5-3.56 7.5-7.47Z\"],\"faded\":[0]},{\"id\":\"ph-fish-duo\",\"label\":\"Fish duotone\",\"set\":\"duotone\",\"paths\":[\"M17.42 15.71c-1.69 1.3-4.14 2.19-7.66 2.28L7.51 23.25l-1.5-5.26L.75 16.49l5.26-2.25c.08-3.51 .98-5.96 2.28-7.65A4.13 4.13 0 0 0 12.77 11.23a4.13 4.13 0 0 0 4.65 4.48Z\",\"M15.75 7.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 15.75 7.13Zm4.57 6.34c-1.82 3.27-5.2 5.04-10.05 5.26l-2.06 4.82A.75 .75 0 0 1 7.51 24l-.05 0a.75 .75 0 0 1-.67-.54L5.4 18.6 .54 17.21a.75 .75 0 0 1-.09-1.41l4.82-2.06c.22-4.85 1.99-8.23 5.26-10.05 2.32-1.29 4.94-1.48 6.74-1.42 1.75 .06 3.38 .4 3.64 .56a.75 .75 0 0 1 .27 .27c.16 .27 .5 1.89 .56 3.64C21.8 8.52 21.61 11.15 20.32 13.47Zm-5.17 2.72a4.89 4.89 0 0 1-3.13-4.2A4.88 4.88 0 0 1 7.82 8.86q-.98 2.23-1.06 5.4a.75 .75 0 0 1-.45 .67L2.98 16.35l3.23 .92a.75 .75 0 0 1 .51 .52l.92 3.23 1.42-3.32a.75 .75 0 0 1 .67-.45Q12.91 17.17 15.14 16.18ZM19.91 4.08c-1.33-.28-6.01-1.03-9.4 1.38a7.61 7.61 0 0 0-1.5 1.41 3.38 3.38 0 0 0 3.69 3.6 .75 .75 0 0 1 .82 .82 3.38 3.38 0 0 0 3.61 3.69 7.58 7.58 0 0 0 1.41-1.5C20.95 10.1 20.2 5.41 19.91 4.08Z\"],\"faded\":[0]},{\"id\":\"ph-bird-duo\",\"label\":\"Bird duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 7.5 19.5 9v2.25a9 9 0 0 1-9 9H2.25a.75 .75 0 0 1-.59-1.22L9.75 9.33V7.21c0-2.7 2.16-4.95 4.85-4.96a4.88 4.88 0 0 1 4.74 3.65Z\",\"M16.5 6.38a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 6.38Zm6 1.13a.75 .75 0 0 1-.33 .62L20.25 9.4V11.25A9.76 9.76 0 0 1 10.5 21H2.25a1.5 1.5 0 0 1-1.17-2.44l.01-.01L9 9.06V7.21C9 4.08 11.51 1.52 14.6 1.5H14.63a5.63 5.63 0 0 1 5.36 3.92l2.18 1.45A.75 .75 0 0 1 22.5 7.5Zm-2.1 0L18.93 6.52a.75 .75 0 0 1-.31-.43A4.13 4.13 0 0 0 14.63 3h-.02C12.34 3.01 10.5 4.9 10.5 7.21V9.33a.75 .75 0 0 1-.17 .48L2.25 19.5h2.52l6.65-7.98a.75 .75 0 1 1 1.15 .96L6.73 19.5H10.5a8.26 8.26 0 0 0 8.25-8.25V9a.75 .75 0 0 1 .33-.62Z\"],\"faded\":[0]},{\"id\":\"ph-pizza-duo\",\"label\":\"Pizza duotone\",\"set\":\"duotone\",\"paths\":[\"M20.44 8.6 17.54 13.35A3 3 0 1 0 14.44 18.45l-1.79 2.94a.75 .75 0 0 1-1.28 0L7.9 15.72a3 3 0 1 0-2.86-4.69L3.56 8.6a14.98 14.98 0 0 1 16.88 0Z\",\"M22.46 5.91a1.49 1.49 0 0 0-.68-.93 18.89 18.89 0 0 0-19.55 0 1.5 1.5 0 0 0-.5 2.06l9 14.74a1.5 1.5 0 0 0 2.57 0L18.19 13.74v0l4.09-6.7A1.48 1.48 0 0 0 22.46 5.91ZM5.96 11.11a2.25 2.25 0 1 1 2.29 3.76Zm8.24 6.28A2.25 2.25 0 0 1 16.5 13.63Zm3.09-5.06a3.75 3.75 0 0 0-3.88 6.35L12 21 9.05 16.17a3.75 3.75 0 1 0-3.88-6.35L4.57 8.84a14.25 14.25 0 0 1 14.85 0Zm2.92-4.77a15.76 15.76 0 0 0-16.41 0L3 6.26a17.4 17.4 0 0 1 18 0Z\"],\"faded\":[0]},{\"id\":\"ph-coffee-duo\",\"label\":\"Coffee duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 8.25v4.5a8.25 8.25 0 0 1-4.81 7.5H7.81A8.25 8.25 0 0 1 3 12.75V8.25Z\",\"M7.5 5.25V2.25a.75 .75 0 0 1 1.5 0V5.25a.75 .75 0 0 1-1.5 0Zm3.75 .75a.75 .75 0 0 0 .75-.75V2.25a.75 .75 0 0 0-1.5 0V5.25A.75 .75 0 0 0 11.25 6Zm3 0a.75 .75 0 0 0 .75-.75V2.25a.75 .75 0 0 0-1.5 0V5.25A.75 .75 0 0 0 14.25 6Zm9 5.25v.75a3.75 3.75 0 0 1-3.52 3.74 9.06 9.06 0 0 1-2.53 3.76H19.5a.75 .75 0 0 1 0 1.5H3a.75 .75 0 0 1 0-1.5H5.3A9.03 9.03 0 0 1 2.25 12.75V8.25a.75 .75 0 0 1 .75-.75H19.5A3.75 3.75 0 0 1 23.25 11.25ZM18.75 9H3.75v3.75a7.53 7.53 0 0 0 4.23 6.75h6.54A7.53 7.53 0 0 0 18.75 12.75Zm3 2.25a2.25 2.25 0 0 0-1.5-2.12V12.75a8.98 8.98 0 0 1-.11 1.41A2.25 2.25 0 0 0 21.75 12Z\"],\"faded\":[0]},{\"id\":\"ph-cake-duo\",\"label\":\"Cake duotone\",\"set\":\"duotone\",\"paths\":[\"M9.75 4.5c0-2.25 2.25-3.75 2.25-3.75s2.25 1.5 2.25 3.75a2.25 2.25 0 0 1-4.5 0ZM19.5 9H4.5a1.5 1.5 0 0 0-1.5 1.5v2.19c0 1.64 1.28 3.02 2.92 3.06A3 3 0 0 0 9 12.75a3 3 0 0 0 6 0 3 3 0 0 0 3.08 3c1.63-.04 2.92-1.43 2.92-3.06V10.5A1.5 1.5 0 0 0 19.5 9Z\",\"M21.75 10.5a2.25 2.25 0 0 0-2.25-2.25H12.75V7.41a3.01 3.01 0 0 0 2.25-2.91c0-2.62-2.48-4.3-2.58-4.37a.75 .75 0 0 0-.83 0C11.48 .2 9 1.88 9 4.5a3.01 3.01 0 0 0 2.25 2.91v.84H4.5a2.25 2.25 0 0 0-2.25 2.25v2.19a3.83 3.83 0 0 0 .75 2.27V18.75a2.25 2.25 0 0 0 2.25 2.25H18.75a2.25 2.25 0 0 0 2.25-2.25V14.96a3.83 3.83 0 0 0 .75-2.27ZM10.5 4.5c0-1.27 .94-2.29 1.5-2.79 .56 .5 1.5 1.52 1.5 2.79a1.5 1.5 0 0 1-3 0ZM3.75 10.5a.75 .75 0 0 1 .75-.75H19.5a.75 .75 0 0 1 .75 .75v2.19c0 1.24-.98 2.28-2.19 2.31A2.25 2.25 0 0 1 15.75 12.75a.75 .75 0 0 0-1.5 0 2.25 2.25 0 0 1-4.5 0 .75 .75 0 0 0-1.5 0 2.25 2.25 0 0 1-2.31 2.25C4.73 14.97 3.75 13.93 3.75 12.69Zm15 9H5.25a.75 .75 0 0 1-.75-.75V16.18A3.63 3.63 0 0 0 5.9 16.5a3.72 3.72 0 0 0 2.72-1.06A3.78 3.78 0 0 0 9 15a3.75 3.75 0 0 0 6 0 3.78 3.78 0 0 0 .39 .44A3.72 3.72 0 0 0 18 16.5c.04 0 .07 0 .11 0A3.63 3.63 0 0 0 19.5 16.18V18.75A.75 .75 0 0 1 18.75 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-beer-bottle-duo\",\"label\":\"Beer duotone\",\"set\":\"duotone\",\"paths\":[\"M15 15l-5.25 5.25L3.75 14.25 9 9Z\",\"M23.03 3.97l-3-3a.75 .75 0 0 0-1.06 1.06l.14 .14L13.94 6.05l-3.58 .72a.75 .75 0 0 0-.38 .2L2.16 14.78a2.25 2.25 0 0 0 0 3.18L6.04 21.84a2.25 2.25 0 0 0 3.18 0l7.81-7.81a.75 .75 0 0 0 .2-.38l.72-3.58 3.88-5.17 .14 .14a.75 .75 0 0 0 1.06-1.06ZM9.75 19.19 4.81 14.25 9 10.06 13.94 15ZM7.63 21a.74 .74 0 0 1-.53-.22L3.22 16.9a.75 .75 0 0 1 0-1.06L3.75 15.31 8.69 20.25 8.16 20.78A.75 .75 0 0 1 7.63 21ZM16.65 9.3a.74 .74 0 0 0-.13 .3l-.71 3.53L15 13.94 10.06 9l.81-.81 3.53-.71a.74 .74 0 0 0 .3-.13l5.48-4.11 .58 .58Z\"],\"faded\":[0]},{\"id\":\"ph-car-duo\",\"label\":\"Car duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 16.5h3.75v2.25a.75 .75 0 0 1-.75 .75H18a.75 .75 0 0 1-.75-.75ZM3 18.75a.75 .75 0 0 0 .75 .75H6a.75 .75 0 0 0 .75-.75V16.5H3ZM18.2 4.2A.75 .75 0 0 0 17.51 3.75H6.49a.75 .75 0 0 0-.69 .45L3 10.5H21Z\",\"M22.5 9.75H21.49L18.88 3.89A1.5 1.5 0 0 0 17.51 3H6.49a1.5 1.5 0 0 0-1.37 .89L2.51 9.75H1.5a.75 .75 0 0 0 0 1.5h.75v7.5a1.5 1.5 0 0 0 1.5 1.5H6a1.5 1.5 0 0 0 1.5-1.5V17.25h9v1.5a1.5 1.5 0 0 0 1.5 1.5h2.25a1.5 1.5 0 0 0 1.5-1.5V11.25h.75a.75 .75 0 0 0 0-1.5ZM6.49 4.5H17.51l2.33 5.25H4.15ZM6 18.75H3.75V17.25H6Zm12 0V17.25h2.25v1.5Zm2.25-3H3.75V11.25H20.25ZM5.25 13.5a.75 .75 0 0 1 .75-.75H7.5a.75 .75 0 0 1 0 1.5H6A.75 .75 0 0 1 5.25 13.5Zm10.5 0a.75 .75 0 0 1 .75-.75h1.5a.75 .75 0 0 1 0 1.5H16.5A.75 .75 0 0 1 15.75 13.5Z\"],\"faded\":[0]},{\"id\":\"ph-airplane-duo\",\"label\":\"Plane duotone\",\"set\":\"duotone\",\"paths\":[\"M14.25 14.25v3l1.5 1.5v3l-3.75-1.5L8.25 21.75V18.75l1.5-1.5V14.25L2.25 15.75V12.75l7.5-3.75V4.5a2.25 2.25 0 0 1 4.5 0V9l7.5 3.75v3Z\",\"M22.09 12.08 15 8.54V4.5a3 3 0 0 0-6 0V8.54L1.91 12.08A.75 .75 0 0 0 1.5 12.75v3a.75 .75 0 0 0 .9 .74L9 15.17v1.77L7.72 18.22A.75 .75 0 0 0 7.5 18.75v3a.75 .75 0 0 0 1.03 .7l3.47-1.39 3.47 1.39A.75 .75 0 0 0 16.5 21.75V18.75a.75 .75 0 0 0-.22-.53L15 16.94V15.17l6.6 1.32A.75 .75 0 0 0 22.5 15.75V12.75A.75 .75 0 0 0 22.09 12.08ZM21 14.84l-6.6-1.32A.75 .75 0 0 0 13.5 14.25v3a.75 .75 0 0 0 .22 .53L15 19.06v1.58l-2.72-1.09a.75 .75 0 0 0-.56 0L9 20.64V19.06l1.28-1.28A.75 .75 0 0 0 10.5 17.25V14.25a.75 .75 0 0 0-.9-.73L3 14.84v-1.62l7.09-3.54A.75 .75 0 0 0 10.5 9V4.5a1.5 1.5 0 0 1 3 0V9a.75 .75 0 0 0 .41 .67L21 13.21Z\"],\"faded\":[0]},{\"id\":\"ph-shopping-cart-duo\",\"label\":\"Cart duotone\",\"set\":\"duotone\",\"paths\":[\"M21 6l-1.14 6.27A1.5 1.5 0 0 1 18.38 13.5H6.61L5.25 6Z\",\"M21.58 5.52A.75 .75 0 0 0 21 5.25H5.88L5.31 2.12A.75 .75 0 0 0 4.57 1.5H2.25a.75 .75 0 0 0 0 1.5h1.69L6.33 16.15a2.25 2.25 0 0 0 .5 1.06 2.63 2.63 0 1 0 4.16 .79h4.26A2.6 2.6 0 0 0 15 19.13a2.63 2.63 0 1 0 2.63-2.62H8.55a.75 .75 0 0 1-.74-.62L7.51 14.25h10.88a2.25 2.25 0 0 0 2.21-1.85l1.14-6.27A.75 .75 0 0 0 21.58 5.52ZM9.75 19.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.75 19.13Zm9 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18.75 19.13Zm.38-6.99A.75 .75 0 0 1 18.38 12.75H7.24L6.15 6.75H20.1Z\"],\"faded\":[0]},{\"id\":\"ph-shopping-bag-duo\",\"label\":\"Bag duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V18.75a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V5.25a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 5.25Z\",\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm0 15H3.75V5.25H20.25V18.75ZM16.5 8.25a4.5 4.5 0 0 1-9 0 .75 .75 0 0 1 1.5 0 3 3 0 0 0 6 0 .75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-shopping-bag-open-duo\",\"label\":\"Open bag duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V7.5H3V5.25a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 5.25Z\",\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm0 1.5V6.75H3.75V5.25Zm0 13.5H3.75V8.25H20.25V18.75Zm-3.75-8.25a4.5 4.5 0 0 1-9 0 .75 .75 0 0 1 1.5 0 3 3 0 0 0 6 0 .75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-storefront-duo\",\"label\":\"Store duotone\",\"set\":\"duotone\",\"paths\":[\"M21 9v1.5a3 3 0 0 1-6 0V9H9v1.5a3 3 0 0 1-6 0V9L4.34 4.29A.75 .75 0 0 1 5.06 3.75H18.94a.75 .75 0 0 1 .72 .54Z\",\"M21.72 8.79 20.38 4.09A1.51 1.51 0 0 0 18.94 3H5.06A1.51 1.51 0 0 0 3.62 4.09L2.28 8.79A.74 .74 0 0 0 2.25 9v1.5a3.75 3.75 0 0 0 1.5 3v6.75a.75 .75 0 0 0 .75 .75H19.5a.75 .75 0 0 0 .75-.75V13.5a3.75 3.75 0 0 0 1.5-3V9A.74 .74 0 0 0 21.72 8.79ZM5.06 4.5H18.94l1.07 3.75H3.99Zm9.19 5.25v.75a2.25 2.25 0 0 1-4.5 0v-.75ZM4.79 12.39A2.25 2.25 0 0 1 3.75 10.5v-.75H8.25v.75a2.25 2.25 0 0 1-3.29 1.99A.74 .74 0 0 0 4.79 12.39ZM18.75 19.5H5.25V14.18a3.8 3.8 0 0 0 .75 .08 3.75 3.75 0 0 0 3-1.5 3.75 3.75 0 0 0 6 0 3.75 3.75 0 0 0 3 1.5 3.8 3.8 0 0 0 .75-.08Zm1.5-9a2.25 2.25 0 0 1-1.04 1.89 .76 .76 0 0 0-.17 .1A2.25 2.25 0 0 1 15.75 10.5v-.75h4.5Z\"],\"faded\":[0]},{\"id\":\"ph-package-duo\",\"label\":\"Package duotone\",\"set\":\"duotone\",\"paths\":[\"M12 12.1V21.75a.75 .75 0 0 1-.36-.09l-8.25-4.52a.75 .75 0 0 1-.39-.66V7.52a.75 .75 0 0 1 .07-.3Z\",\"M20.97 6.2 12.72 1.69a1.49 1.49 0 0 0-1.44 0l-8.25 4.52a1.5 1.5 0 0 0-.78 1.31v8.97a1.5 1.5 0 0 0 .78 1.31l8.25 4.52a1.49 1.49 0 0 0 1.44 0l8.25-4.52a1.5 1.5 0 0 0 .78-1.31V7.52A1.5 1.5 0 0 0 20.97 6.2ZM12 3l7.53 4.13-2.79 1.53-7.53-4.12ZM12 11.25 4.47 7.13l3.18-1.74 7.53 4.13ZM3.75 8.44l7.5 4.1v8.04L3.75 16.48Zm16.5 8.04h0l-7.5 4.11V12.55l3-1.64V14.25a.75 .75 0 0 0 1.5 0V10.08L20.25 8.44v8.04Z\"],\"faded\":[0]},{\"id\":\"ph-truck-duo\",\"label\":\"Delivery duotone\",\"set\":\"duotone\",\"paths\":[\"M23.25 11.25v6a.75 .75 0 0 1-.75 .75H20.25a2.25 2.25 0 0 0-4.5 0H9.75a2.25 2.25 0 0 0-4.5 0H3a.75 .75 0 0 1-.75-.75V13.5H17.25V11.25Z\",\"M23.95 10.97l-1.31-3.28A1.49 1.49 0 0 0 21.24 6.75H18V6a.75 .75 0 0 0-.75-.75H3A1.5 1.5 0 0 0 1.5 6.75V17.25a1.5 1.5 0 0 0 1.5 1.5H4.59a3 3 0 0 0 5.81 0h4.69a3 3 0 0 0 5.81 0h1.59a1.5 1.5 0 0 0 1.5-1.5V11.25A.74 .74 0 0 0 23.95 10.97ZM18 8.25h3.24l.9 2.25H18ZM3 6.75H16.5v6H3ZM7.5 19.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 7.5 19.5Zm7.59-2.25H10.41a3 3 0 0 0-5.81 0H3V14.25H16.5v1.15A3.01 3.01 0 0 0 15.09 17.25Zm2.91 2.25a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 18 19.5Zm4.5-2.25H20.91a3.01 3.01 0 0 0-2.91-2.25V12h4.5Z\"],\"faded\":[0]},{\"id\":\"ph-credit-card-duo\",\"label\":\"Card duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 9v9a.75 .75 0 0 1-.75 .75H3a.75 .75 0 0 1-.75-.75V9Z\",\"M21 4.5H3A1.5 1.5 0 0 0 1.5 6V18a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V6A1.5 1.5 0 0 0 21 4.5Zm0 1.5V8.25H3V6Zm0 12H3V9.75H21v8.25Zm-1.5-2.25a.75 .75 0 0 1-.75 .75H15.75a.75 .75 0 0 1 0-1.5h3A.75 .75 0 0 1 19.5 15.75Zm-6 0a.75 .75 0 0 1-.75 .75H11.25a.75 .75 0 0 1 0-1.5h1.5A.75 .75 0 0 1 13.5 15.75Z\"],\"faded\":[0]},{\"id\":\"ph-wallet-duo\",\"label\":\"Wallet duotone\",\"set\":\"duotone\",\"paths\":[\"M21 7.5V18a.75 .75 0 0 1-.75 .75H5.25a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 0 5.25 6.75H20.25A.75 .75 0 0 1 21 7.5Z\",\"M20.25 6H5.25a.75 .75 0 0 1 0-1.5H18a.75 .75 0 0 0 0-1.5H5.25A2.25 2.25 0 0 0 3 5.25V17.25a2.25 2.25 0 0 0 2.25 2.25H20.25a1.5 1.5 0 0 0 1.5-1.5V7.5A1.5 1.5 0 0 0 20.25 6Zm0 12H5.25a.75 .75 0 0 1-.75-.75V7.37A2.24 2.24 0 0 0 5.25 7.5H20.25Zm-4.5-5.62a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 15.75 12.38Z\"],\"faded\":[0]},{\"id\":\"ph-money-duo\",\"label\":\"Money duotone\",\"set\":\"duotone\",\"paths\":[\"M15 12a3 3 0 1 1-3-3A3 3 0 0 1 15 12Zm3.75-6a4.58 4.58 0 0 0 3.75 3.75V6Zm0 12h3.75V14.25A4.58 4.58 0 0 0 18.75 18ZM1.5 14.25v3.75H5.25A4.58 4.58 0 0 0 1.5 14.25Zm0-4.5A4.58 4.58 0 0 0 5.25 6H1.5Z\",\"M12 8.25a3.75 3.75 0 1 0 3.75 3.75A3.75 3.75 0 0 0 12 8.25Zm0 6a2.25 2.25 0 1 1 2.25-2.25A2.25 2.25 0 0 1 12 14.25ZM22.5 5.25H1.5a.75 .75 0 0 0-.75 .75V18a.75 .75 0 0 0 .75 .75H22.5a.75 .75 0 0 0 .75-.75V6A.75 .75 0 0 0 22.5 5.25ZM2.25 6.75H4.25A3.83 3.83 0 0 1 2.25 8.75Zm0 10.5V15.25A3.83 3.83 0 0 1 4.25 17.25Zm19.5 0H19.75A3.83 3.83 0 0 1 21.75 15.25Zm0-3.6A5.32 5.32 0 0 0 18.15 17.25H5.85A5.32 5.32 0 0 0 2.25 13.65v-3.31A5.32 5.32 0 0 0 5.85 6.75h12.31A5.32 5.32 0 0 0 21.75 10.35Zm0-4.9A3.83 3.83 0 0 1 19.75 6.75H21.75Z\"],\"faded\":[0]},{\"id\":\"ph-coins-duo\",\"label\":\"Coins duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 12.38c0 1.86-3.36 3.38-7.5 3.38-1.84 0-3.52-.3-4.83-.79h0C13.76 14.7 16.5 13.31 16.5 11.63V9.07h0C19.92 9.38 22.5 10.74 22.5 12.38ZM16.5 7.88c0-1.86-3.36-3.37-7.5-3.37S1.5 6.01 1.5 7.88s3.36 3.38 7.5 3.38S16.5 9.74 16.5 7.88Z\",\"M17.25 8.4V7.88c0-2.35-3.55-4.12-8.25-4.12S.75 5.52 .75 7.88v3.75c0 1.96 2.46 3.51 6 3.98V16.13c0 2.35 3.55 4.13 8.25 4.13s8.25-1.77 8.25-4.12V12.38C23.25 10.43 20.87 8.88 17.25 8.4ZM21.75 12.38c0 1.24-2.89 2.63-6.75 2.63-.35 0-.7-.01-1.04-.03C15.98 14.23 17.25 13.03 17.25 11.63V9.91C20.05 10.33 21.75 11.46 21.75 12.38ZM6.75 14.09V11.86A17.23 17.23 0 0 0 9 12a17.23 17.23 0 0 0 2.25-.14v2.23A15.28 15.28 0 0 1 9 14.25 15.28 15.28 0 0 1 6.75 14.09Zm9-3.78V11.63c0 .79-1.16 1.63-3 2.14V11.58C13.96 11.28 14.99 10.85 15.75 10.31ZM9 5.25c3.86 0 6.75 1.39 6.75 2.63s-2.89 2.63-6.75 2.63S2.25 9.11 2.25 7.88 5.14 5.25 9 5.25ZM2.25 11.63V10.31c.77 .54 1.79 .98 3 1.27v2.19C3.41 13.26 2.25 12.41 2.25 11.63Zm6 4.5v-.39c.25 .01 .5 .02 .75 .02 .36 0 .72-.01 1.07-.03A11.43 11.43 0 0 0 11.25 16.07v2.2C9.41 17.76 8.25 16.91 8.25 16.13Zm4.5 2.46V16.35a16.83 16.83 0 0 0 2.25 .15 17.23 17.23 0 0 0 2.25-.14v2.23a15.51 15.51 0 0 1-4.5 0Zm6-.32V16.08c1.21-.29 2.24-.73 3-1.27V16.13C21.75 16.91 20.59 17.76 18.75 18.27Z\"],\"faded\":[0]},{\"id\":\"ph-piggy-bank-duo\",\"label\":\"Piggy bank duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 10.5v3a1.5 1.5 0 0 1-1.5 1.5h-.75l-1.7 4.75a.75 .75 0 0 1-.71 .5H16.65a.75 .75 0 0 1-.71-.5L15.59 18.75H9.16L8.8 19.75A.75 .75 0 0 1 8.1 20.25H6.9a.75 .75 0 0 1-.71-.5L4.97 16.31a7.47 7.47 0 0 1-1.97-5.06h0a7.5 7.5 0 0 1 7.5-7.5h3a7.5 7.5 0 0 1 6.89 4.52 7.71 7.71 0 0 1 .27 .73H21A1.5 1.5 0 0 1 22.5 10.5Z\",\"M18 10.88a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18 10.88ZM14.25 6H10.5a.75 .75 0 0 0 0 1.5h3.75a.75 .75 0 0 0 0-1.5Zm9 4.5v3a2.25 2.25 0 0 1-2.25 2.25h-.22l-1.52 4.25A1.5 1.5 0 0 1 17.85 21H16.65a1.5 1.5 0 0 1-1.41-1L15.06 19.5h-5.37l-.18 .5A1.5 1.5 0 0 1 8.1 21H6.9a1.5 1.5 0 0 1-1.41-1L4.31 16.71a8.22 8.22 0 0 1-2.01-4.54A1.5 1.5 0 0 0 1.5 13.5a.75 .75 0 0 1-1.5 0 3 3 0 0 1 2.28-2.91A8.26 8.26 0 0 1 10.5 3H20.25a.75 .75 0 0 1 0 1.5H18.24a8.24 8.24 0 0 1 2.83 3.47c.04 .09 .08 .19 .12 .28A2.25 2.25 0 0 1 23.25 10.5Zm-1.5 0a.75 .75 0 0 0-.75-.75h-.34a.75 .75 0 0 1-.72-.52A6.74 6.74 0 0 0 13.5 4.5H10.5A6.75 6.75 0 0 0 5.52 15.81a.75 .75 0 0 1 .15 .25L6.9 19.5H8.1l.36-1A.75 .75 0 0 1 9.16 18h6.43a.75 .75 0 0 1 .71 .5L16.65 19.5h1.19l1.7-4.75A.75 .75 0 0 1 20.25 14.25h.75a.75 .75 0 0 0 .75-.75Z\"],\"faded\":[0]},{\"id\":\"ph-hand-coins-duo\",\"label\":\"Pay duotone\",\"set\":\"duotone\",\"paths\":[\"M1.5 14.25H4.5v5.25H1.5a.75 .75 0 0 1-.75-.75V15A.75 .75 0 0 1 1.5 14.25ZM19.13 5.25a2.63 2.63 0 0 0-1.12 .25h0A2.63 2.63 0 1 0 16.5 8h0A2.63 2.63 0 1 0 19.13 5.25Z\",\"M21.59 13.22a2.29 2.29 0 0 0-1.99-.4l-3.92 .9A2.63 2.63 0 0 0 13.13 10.5H8.43a2.98 2.98 0 0 0-2.12 .88L4.19 13.5H1.5A1.5 1.5 0 0 0 0 15v3.75a1.5 1.5 0 0 0 1.5 1.5H11.25a.74 .74 0 0 0 .18-.02l6-1.5a.65 .65 0 0 0 .11-.04L21.19 17.14l.04-.02a2.31 2.31 0 0 0 .37-3.9ZM1.5 15H3.75v3.75H1.5Zm19.07 .77-3.56 1.52L11.16 18.75H5.25V14.56l2.12-2.12A1.49 1.49 0 0 1 8.43 12H13.13a1.13 1.13 0 0 1 0 2.25H10.5a.75 .75 0 0 0 0 1.5h3a.78 .78 0 0 0 .17-.02l6.28-1.44 .03-.01a.81 .81 0 0 1 .59 1.49ZM15.38 9a3.38 3.38 0 0 0 .55-.04 3.38 3.38 0 1 0 2.65-4.41A3.38 3.38 0 1 0 15.38 9Zm5.63-1.12a1.88 1.88 0 1 1-1.87-1.87A1.88 1.88 0 0 1 21 7.88ZM15.38 3.75a1.88 1.88 0 0 1 1.8 1.37 3.38 3.38 0 0 0-1.41 2.34A1.91 1.91 0 0 1 15.38 7.5a1.88 1.88 0 0 1 0-3.75Z\"],\"faded\":[0]},{\"id\":\"ph-receipt-duo\",\"label\":\"Receipt duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V19.5l-3-1.5-3 1.5-3-1.5L9 19.5 6 18 3 19.5V5.25a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 5.25Z\",\"M6.75 9.75a.75 .75 0 0 1 .75-.75h9a.75 .75 0 0 1 0 1.5H7.5A.75 .75 0 0 1 6.75 9.75Zm.75 3.75h9a.75 .75 0 0 0 0-1.5H7.5a.75 .75 0 0 0 0 1.5ZM21.75 5.25V19.5a.75 .75 0 0 1-1.09 .67L18 18.84l-2.66 1.33a.75 .75 0 0 1-.67 0L12 18.84 9.34 20.17a.75 .75 0 0 1-.67 0L6 18.84 3.34 20.17A.75 .75 0 0 1 2.25 19.5V5.25A1.5 1.5 0 0 1 3.75 3.75H20.25A1.5 1.5 0 0 1 21.75 5.25Zm-1.5 0H3.75V18.29l1.91-.96a.75 .75 0 0 1 .67 0L9 18.66l2.66-1.33a.75 .75 0 0 1 .67 0L15 18.66l2.66-1.33a.75 .75 0 0 1 .67 0L20.25 18.29Z\"],\"faded\":[0]},{\"id\":\"ph-currency-dollar-duo\",\"label\":\"Dollar duotone\",\"set\":\"duotone\",\"paths\":[\"M18 15.75a3.75 3.75 0 0 1-3.75 3.75H12V12h2.25A3.75 3.75 0 0 1 18 15.75ZM10.5 4.5a3.75 3.75 0 0 0 0 7.5h1.5V4.5Z\",\"M14.25 11.25H12.75V5.25h.75a3 3 0 0 1 3 3 .75 .75 0 0 0 1.5 0 4.5 4.5 0 0 0-4.5-4.5h-.75V2.25a.75 .75 0 0 0-1.5 0V3.75h-.75a4.5 4.5 0 0 0 0 9h.75v6H9.75a3 3 0 0 1-3-3 .75 .75 0 0 0-1.5 0 4.5 4.5 0 0 0 4.5 4.5h1.5v1.5a.75 .75 0 0 0 1.5 0V20.25h1.5a4.5 4.5 0 0 0 0-9Zm-3.75 0a3 3 0 0 1 0-6h.75v6Zm3.75 7.5H12.75V12.75h1.5a3 3 0 0 1 0 6Z\"],\"faded\":[0]},{\"id\":\"ph-currency-eur-duo\",\"label\":\"Euro duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 5.47V18.53A6.75 6.75 0 0 1 6 13.5V10.5A6.75 6.75 0 0 1 17.25 5.47Z\",\"M17.81 18.03a.75 .75 0 0 1-.06 1.06A7.5 7.5 0 0 1 5.29 14.25H3.75a.75 .75 0 0 1 0-1.5H5.25V11.25H3.75a.75 .75 0 0 1 0-1.5H5.29A7.5 7.5 0 0 1 17.75 4.91 .75 .75 0 0 1 16.75 6.03 6 6 0 0 0 6.8 9.75H12.75a.75 .75 0 0 1 0 1.5H6.75v1.5h4.5a.75 .75 0 0 1 0 1.5H6.8a6 6 0 0 0 9.95 3.72A.75 .75 0 0 1 17.81 18.03Z\"],\"faded\":[0]},{\"id\":\"ph-currency-btc-duo\",\"label\":\"Bitcoin duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 15a3.75 3.75 0 0 1-3.75 3.75H8.25V4.5h5.63a3.38 3.38 0 0 1 0 6.75h1.13A3.75 3.75 0 0 1 18.75 15Z\",\"M16.73 10.85A4.13 4.13 0 0 0 14.25 3.77V2.25a.75 .75 0 0 0-1.5 0V3.75H11.25V2.25a.75 .75 0 0 0-1.5 0V3.75H6.75a.75 .75 0 0 0 0 1.5h.75V18H6.75a.75 .75 0 0 0 0 1.5h3v1.5a.75 .75 0 0 0 1.5 0V19.5h1.5v1.5a.75 .75 0 0 0 1.5 0V19.5h.75a4.5 4.5 0 0 0 1.73-8.65ZM9 5.25h4.88a2.63 2.63 0 0 1 0 5.25H9Zm6 12.75H9V12h6a3 3 0 0 1 0 6Z\"],\"faded\":[0]},{\"id\":\"ph-bank-duo\",\"label\":\"Bank duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 9H2.25L12 3Z\",\"M2.25 9.75H4.5v6H3a.75 .75 0 0 0 0 1.5H21a.75 .75 0 0 0 0-1.5H19.5V9.75h2.25a.75 .75 0 0 0 .39-1.39l-9.75-6a.75 .75 0 0 0-.79 0l-9.75 6A.75 .75 0 0 0 2.25 9.75Zm3.75 0H9v6H6Zm7.5 0v6H10.5V9.75Zm4.5 6H15V9.75h3ZM12 3.88 19.1 8.25H4.9ZM23.25 19.5a.75 .75 0 0 1-.75 .75H1.5a.75 .75 0 0 1 0-1.5H22.5A.75 .75 0 0 1 23.25 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-vault-duo\",\"label\":\"Vault duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5H3.75a.75 .75 0 0 0-.75 .75V18a.75 .75 0 0 0 .75 .75H20.25a.75 .75 0 0 0 .75-.75V5.25A.75 .75 0 0 0 20.25 4.5ZM14.25 15.75a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 14.25 15.75Z\",\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18a1.5 1.5 0 0 0 1.5 1.5H5.25v1.5a.75 .75 0 0 0 1.5 0V19.5H17.25v1.5a.75 .75 0 0 0 1.5 0V19.5h1.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm0 14.25H3.75V5.25H20.25v6H18.69a4.5 4.5 0 1 0 0 1.5H20.25v5.25Zm-4.7-6.75a1.5 1.5 0 1 0 0 1.5H17.16a3 3 0 1 1 0-1.5Z\"],\"faded\":[0]},{\"id\":\"ph-calculator-duo\",\"label\":\"Calculator duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 6v4.5H7.5V6Z\",\"M7.5 11.25h9a.75 .75 0 0 0 .75-.75V6a.75 .75 0 0 0-.75-.75H7.5a.75 .75 0 0 0-.75 .75v4.5A.75 .75 0 0 0 7.5 11.25Zm.75-4.5h7.5v3H8.25ZM18.75 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V3.75A1.5 1.5 0 0 0 18.75 2.25Zm0 18H5.25V3.75H18.75ZM9.38 13.88a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.38 13.88Zm3.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 13.88Zm3.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.88 13.88Zm-7.5 3.75a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.38 17.63Zm3.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 17.63Zm3.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.88 17.63Z\"],\"faded\":[0]},{\"id\":\"ph-seal-check-duo\",\"label\":\"Badge duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12c0 1.17-1.67 2.06-2.13 3.16-.44 1.06 .13 2.87-.73 3.74s-2.67 .29-3.74 .73C14.06 20.08 13.17 21.75 12 21.75s-2.06-1.67-3.16-2.13c-1.06-.44-2.87 .13-3.74-.73s-.29-2.67-.73-3.74C3.92 14.06 2.25 13.17 2.25 12s1.67-2.06 2.13-3.16C4.81 7.78 4.24 5.97 5.11 5.11S7.78 4.81 8.84 4.38C9.94 3.92 10.83 2.25 12 2.25S14.06 3.92 15.16 4.38c1.06 .44 2.87-.13 3.74 .73s.29 2.67 .73 3.74C20.08 9.94 21.75 10.83 21.75 12Z\",\"M21.17 9.64c-.35-.37-.72-.75-.86-1.08-.13-.31-.13-.81-.14-1.31-.01-.91-.03-1.95-.75-2.67s-1.76-.74-2.67-.75c-.49-.01-1-.01-1.31-.14-.33-.14-.72-.5-1.08-.86C13.71 2.2 12.98 1.5 12 1.5s-1.71 .7-2.36 1.33c-.37 .35-.75 .72-1.08 .86C8.25 3.81 7.74 3.82 7.25 3.83c-.91 .01-1.95 .03-2.67 .75S3.84 6.33 3.83 7.25c-.01 .49-.01 1-.14 1.31-.14 .33-.5 .72-.86 1.08C2.2 10.29 1.5 11.02 1.5 12s.7 1.71 1.33 2.36c.35 .37 .72 .75 .86 1.08 .13 .31 .14 .81 .14 1.31 .01 .92 .03 1.95 .75 2.67s1.76 .74 2.67 .75c.49 .01 1 .02 1.31 .14 .33 .14 .72 .5 1.08 .86C10.29 21.8 11.02 22.5 12 22.5s1.71-.7 2.36-1.33c.37-.35 .75-.72 1.08-.86 .31-.13 .81-.13 1.31-.14 .92-.01 1.95-.03 2.67-.75s.74-1.76 .75-2.67c.01-.49 .02-1 .14-1.31 .14-.33 .5-.72 .86-1.08C21.8 13.71 22.5 12.98 22.5 12S21.8 10.29 21.17 9.64Zm-1.08 3.68c-.45 .47-.91 .95-1.16 1.55-.24 .57-.25 1.23-.26 1.86-.01 .66-.02 1.34-.31 1.63s-.97 .3-1.63 .31c-.63 .01-1.29 .02-1.86 .26-.6 .25-1.08 .71-1.55 1.16S12.38 21 12 21s-.86-.46-1.32-.91-.95-.91-1.55-1.16c-.57-.24-1.23-.25-1.86-.26-.66-.01-1.34-.02-1.63-.31s-.3-.97-.31-1.63c-.01-.63-.02-1.29-.26-1.86-.25-.6-.71-1.08-1.16-1.55S3 12.38 3 12s.46-.86 .91-1.32 .91-.95 1.16-1.55c.24-.57 .25-1.23 .26-1.86 .01-.66 .02-1.34 .31-1.63S6.61 5.33 7.27 5.32c.63-.01 1.29-.02 1.86-.26 .6-.25 1.08-.71 1.55-1.16S11.63 3 12 3s.86 .46 1.32 .91 .95 .91 1.55 1.16c.57 .24 1.23 .25 1.86 .26 .66 .01 1.34 .02 1.63 .31s.3 .97 .31 1.63c.01 .63 .02 1.29 .26 1.86 .25 .6 .71 1.08 1.16 1.55S21 11.63 21 12 20.54 12.86 20.09 13.32ZM16.28 9.22a.75 .75 0 0 1 0 1.06l-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72A.75 .75 0 0 1 16.28 9.22Z\"],\"faded\":[0]},{\"id\":\"ph-seal-percent-duo\",\"label\":\"Sale duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12c0 1.17-1.67 2.06-2.13 3.16-.44 1.06 .13 2.87-.73 3.74s-2.67 .29-3.74 .73C14.06 20.08 13.17 21.75 12 21.75s-2.06-1.67-3.16-2.13c-1.06-.44-2.87 .13-3.74-.73s-.29-2.67-.73-3.74C3.92 14.06 2.25 13.17 2.25 12s1.67-2.06 2.13-3.16C4.81 7.78 4.24 5.97 5.11 5.11S7.78 4.81 8.84 4.38C9.94 3.92 10.83 2.25 12 2.25S14.06 3.92 15.16 4.38c1.06 .44 2.87-.13 3.74 .73s.29 2.67 .73 3.74C20.08 9.94 21.75 10.83 21.75 12Z\",\"M21.17 9.64c-.35-.37-.72-.75-.86-1.08-.13-.31-.13-.81-.14-1.31-.01-.91-.03-1.95-.75-2.67s-1.76-.74-2.67-.75c-.49-.01-1-.01-1.31-.14-.33-.14-.72-.5-1.08-.86C13.71 2.2 12.98 1.5 12 1.5s-1.71 .7-2.36 1.33c-.37 .35-.75 .72-1.08 .86C8.25 3.81 7.74 3.82 7.25 3.83c-.91 .01-1.95 .03-2.67 .75S3.84 6.33 3.83 7.25c-.01 .49-.01 1-.14 1.31-.14 .33-.5 .72-.86 1.08C2.2 10.29 1.5 11.02 1.5 12s.7 1.71 1.33 2.36c.35 .37 .72 .75 .86 1.08 .13 .31 .14 .81 .14 1.31 .01 .92 .03 1.95 .75 2.67s1.76 .74 2.67 .75c.49 .01 1 .02 1.31 .14 .33 .14 .72 .5 1.08 .86C10.29 21.8 11.02 22.5 12 22.5s1.71-.7 2.36-1.33c.37-.35 .75-.72 1.08-.86 .31-.13 .81-.13 1.31-.14 .92-.01 1.95-.03 2.67-.75s.74-1.76 .75-2.67c.01-.49 .02-1 .14-1.31 .14-.33 .5-.72 .86-1.08C21.8 13.71 22.5 12.98 22.5 12S21.8 10.29 21.17 9.64Zm-1.08 3.68c-.45 .47-.91 .95-1.16 1.55-.24 .57-.25 1.23-.26 1.86-.01 .66-.02 1.34-.31 1.63s-.97 .3-1.63 .31c-.63 .01-1.29 .02-1.86 .26-.6 .25-1.08 .71-1.55 1.16S12.38 21 12 21s-.86-.46-1.32-.91-.95-.91-1.55-1.16c-.57-.24-1.23-.25-1.86-.26-.66-.01-1.34-.02-1.63-.31s-.3-.97-.31-1.63c-.01-.63-.02-1.29-.26-1.86-.25-.6-.71-1.08-1.16-1.55S3 12.38 3 12s.46-.86 .91-1.32 .91-.95 1.16-1.55c.24-.57 .25-1.23 .26-1.86 .01-.66 .02-1.34 .31-1.63S6.61 5.33 7.27 5.32c.63-.01 1.29-.02 1.86-.26 .6-.25 1.08-.71 1.55-1.16S11.63 3 12 3s.86 .46 1.32 .91 .95 .91 1.55 1.16c.57 .24 1.23 .25 1.86 .26 .66 .01 1.34 .02 1.63 .31s.3 .97 .31 1.63c.01 .63 .02 1.29 .26 1.86 .25 .6 .71 1.08 1.16 1.55S21 11.63 21 12 20.54 12.86 20.09 13.32ZM11.25 9a2.25 2.25 0 1 0-2.25 2.25A2.25 2.25 0 0 0 11.25 9ZM8.25 9a.75 .75 0 1 1 .75 .75A.75 .75 0 0 1 8.25 9Zm6.75 3.75a2.25 2.25 0 1 0 2.25 2.25A2.25 2.25 0 0 0 15 12.75Zm0 3a.75 .75 0 1 1 .75-.75A.75 .75 0 0 1 15 15.75Zm1.28-6.97-7.5 7.5a.75 .75 0 0 1-1.06-1.06l7.5-7.5a.75 .75 0 0 1 1.06 1.06Z\"],\"faded\":[0]},{\"id\":\"ph-seal-warning-duo\",\"label\":\"Notice duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12c0 1.17-1.67 2.06-2.13 3.16-.44 1.06 .13 2.87-.73 3.74s-2.67 .29-3.74 .73C14.06 20.08 13.17 21.75 12 21.75s-2.06-1.67-3.16-2.13c-1.06-.44-2.87 .13-3.74-.73s-.29-2.67-.73-3.74C3.92 14.06 2.25 13.17 2.25 12s1.67-2.06 2.13-3.16C4.81 7.78 4.24 5.97 5.11 5.11S7.78 4.81 8.84 4.38C9.94 3.92 10.83 2.25 12 2.25S14.06 3.92 15.16 4.38c1.06 .44 2.87-.13 3.74 .73s.29 2.67 .73 3.74C20.08 9.94 21.75 10.83 21.75 12Z\",\"M21.17 9.64c-.35-.37-.72-.75-.86-1.08-.13-.31-.13-.81-.14-1.31-.01-.91-.03-1.95-.75-2.67s-1.76-.74-2.67-.75c-.49-.01-1-.01-1.31-.14-.33-.14-.72-.5-1.08-.86C13.71 2.2 12.98 1.5 12 1.5s-1.71 .7-2.36 1.33c-.37 .35-.75 .72-1.08 .86C8.25 3.81 7.74 3.82 7.25 3.83c-.91 .01-1.95 .03-2.67 .75S3.84 6.33 3.83 7.25c-.01 .49-.01 1-.14 1.31-.14 .33-.5 .72-.86 1.08C2.2 10.29 1.5 11.02 1.5 12s.7 1.71 1.33 2.36c.35 .37 .72 .75 .86 1.08 .13 .31 .14 .81 .14 1.31 .01 .92 .03 1.95 .75 2.67s1.76 .74 2.67 .75c.49 .01 1 .02 1.31 .14 .33 .14 .72 .5 1.08 .86C10.29 21.8 11.02 22.5 12 22.5s1.71-.7 2.36-1.33c.37-.35 .75-.72 1.08-.86 .31-.13 .81-.13 1.31-.14 .92-.01 1.95-.03 2.67-.75s.74-1.76 .75-2.67c.01-.49 .02-1 .14-1.31 .14-.33 .5-.72 .86-1.08C21.8 13.71 22.5 12.98 22.5 12S21.8 10.29 21.17 9.64Zm-1.08 3.68c-.45 .47-.91 .95-1.16 1.55-.24 .57-.25 1.23-.26 1.86-.01 .66-.02 1.34-.31 1.63s-.97 .3-1.63 .31c-.63 .01-1.29 .02-1.86 .26-.6 .25-1.08 .71-1.55 1.16S12.38 21 12 21s-.86-.46-1.32-.91-.95-.91-1.55-1.16c-.57-.24-1.23-.25-1.86-.26-.66-.01-1.34-.02-1.63-.31s-.3-.97-.31-1.63c-.01-.63-.02-1.29-.26-1.86-.25-.6-.71-1.08-1.16-1.55S3 12.38 3 12s.46-.86 .91-1.32 .91-.95 1.16-1.55c.24-.57 .25-1.23 .26-1.86 .01-.66 .02-1.34 .31-1.63S6.61 5.33 7.27 5.32c.63-.01 1.29-.02 1.86-.26 .6-.25 1.08-.71 1.55-1.16S11.63 3 12 3s.86 .46 1.32 .91 .95 .91 1.55 1.16c.57 .24 1.23 .25 1.86 .26 .66 .01 1.34 .02 1.63 .31s.3 .97 .31 1.63c.01 .63 .02 1.29 .26 1.86 .25 .6 .71 1.08 1.16 1.55S21 11.63 21 12 20.54 12.86 20.09 13.32ZM11.25 12.75V7.5a.75 .75 0 0 1 1.5 0v5.25a.75 .75 0 0 1-1.5 0Zm1.88 3.38a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 16.13Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-right-duo\",\"label\":\"Arrow right duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12l-6.75 6.75V5.25Z\",\"M20.78 11.47l-6.75-6.75A.75 .75 0 0 0 12.75 5.25v6H3.75a.75 .75 0 0 0 0 1.5h9v6a.75 .75 0 0 0 1.28 .53l6.75-6.75A.75 .75 0 0 0 20.78 11.47ZM14.25 16.94V7.06L19.19 12Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-left-duo\",\"label\":\"Arrow left duotone\",\"set\":\"duotone\",\"paths\":[\"M10.5 5.25V18.75L3.75 12Z\",\"M20.25 11.25H11.25V5.25a.75 .75 0 0 0-1.28-.53l-6.75 6.75a.75 .75 0 0 0 0 1.06l6.75 6.75A.75 .75 0 0 0 11.25 18.75V12.75h9a.75 .75 0 0 0 0-1.5ZM9.75 16.94 4.81 12 9.75 7.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-up-duo\",\"label\":\"Arrow up duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 10.5H5.25l6.75-6.75Z\",\"M19.28 9.97l-6.75-6.75a.75 .75 0 0 0-1.06 0l-6.75 6.75A.75 .75 0 0 0 5.25 11.25h6v9a.75 .75 0 0 0 1.5 0V11.25h6a.75 .75 0 0 0 .53-1.28ZM7.06 9.75 12 4.81 16.94 9.75Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-down-duo\",\"label\":\"Arrow down duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 13.5l-6.75 6.75L5.25 13.5Z\",\"M19.44 13.21A.75 .75 0 0 0 18.75 12.75H12.75V3.75a.75 .75 0 0 0-1.5 0v9H5.25a.75 .75 0 0 0-.53 1.28l6.75 6.75a.75 .75 0 0 0 1.06 0l6.75-6.75A.75 .75 0 0 0 19.44 13.21ZM12 19.19 7.06 14.25H16.94Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-up-right-duo\",\"label\":\"Arrow up right duotone\",\"set\":\"duotone\",\"paths\":[\"M18 6V15.75L8.25 6Z\",\"M18 5.25H8.25a.75 .75 0 0 0-.53 1.28L12.06 10.88 5.47 17.47a.75 .75 0 0 0 1.06 1.06L13.13 11.94l4.34 4.35A.75 .75 0 0 0 18.75 15.75V6A.75 .75 0 0 0 18 5.25Zm-.75 8.69-3.59-3.59h0L10.06 6.75H17.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-down-right-duo\",\"label\":\"Arrow down right duotone\",\"set\":\"duotone\",\"paths\":[\"M18 8.25V18H8.25Z\",\"M18.29 7.56a.75 .75 0 0 0-.82 .16L13.13 12.06 6.53 5.47A.75 .75 0 0 0 5.47 6.53L12.06 13.13 7.72 17.47A.75 .75 0 0 0 8.25 18.75H18a.75 .75 0 0 0 .75-.75V8.25A.75 .75 0 0 0 18.29 7.56ZM17.25 17.25H10.06l3.59-3.59h0L17.25 10.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-up-left-duo\",\"label\":\"Arrow up left duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 6 6 15.75V6Z\",\"M18.53 17.47 11.94 10.88l4.35-4.34A.75 .75 0 0 0 15.75 5.25H6a.75 .75 0 0 0-.75 .75V15.75a.75 .75 0 0 0 1.28 .53L10.88 11.94l6.59 6.6a.75 .75 0 0 0 1.06-1.06ZM6.75 6.75h7.19l-3.59 3.59h0L6.75 13.94Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-down-left-duo\",\"label\":\"Arrow down left duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 18H6V8.25Z\",\"M18.53 5.47a.75 .75 0 0 0-1.06 0L10.88 12.06 6.53 7.72A.75 .75 0 0 0 5.25 8.25V18a.75 .75 0 0 0 .75 .75H15.75a.75 .75 0 0 0 .53-1.28L11.94 13.13l6.6-6.59A.75 .75 0 0 0 18.53 5.47ZM6.75 17.25V10.06l3.59 3.59h0L13.94 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-circle-right-duo\",\"label\":\"Circle arrow right duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm4.28-8.78a.75 .75 0 0 1 0 1.06l-3 3a.75 .75 0 0 1-1.06-1.06L13.94 12.75H8.25a.75 .75 0 0 1 0-1.5h5.69l-1.72-1.72a.75 .75 0 0 1 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-circle-left-duo\",\"label\":\"Circle arrow left duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm4.5-8.25a.75 .75 0 0 1-.75 .75H10.06l1.72 1.72a.75 .75 0 0 1-1.06 1.06l-3-3a.75 .75 0 0 1 0-1.06l3-3a.75 .75 0 0 1 1.06 1.06L10.06 11.25H15.75A.75 .75 0 0 1 16.5 12Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-circle-up-duo\",\"label\":\"Circle arrow up duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm3.53-9.53a.75 .75 0 0 1-1.06 1.06L12.75 10.06V15.75a.75 .75 0 0 1-1.5 0V10.06l-1.72 1.72a.75 .75 0 0 1-1.06-1.06l3-3a.75 .75 0 0 1 1.06 0Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-circle-down-duo\",\"label\":\"Circle arrow down duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm3.53-8.03a.75 .75 0 0 1 0 1.06l-3 3a.75 .75 0 0 1-1.06 0l-3-3a.75 .75 0 0 1 1.06-1.06L11.25 13.94V8.25a.75 .75 0 0 1 1.5 0v5.69l1.72-1.72A.75 .75 0 0 1 15.53 12.22Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-fat-right-duo\",\"label\":\"Fat arrow right duotone\",\"set\":\"duotone\",\"paths\":[\"M12.75 21V16.5H4.5a.75 .75 0 0 1-.75-.75V8.25a.75 .75 0 0 1 .75-.75h8.25V3l9 9Z\",\"M22.28 11.47l-9-9A.75 .75 0 0 0 12 3V6.75H4.5A1.5 1.5 0 0 0 3 8.25v7.5a1.5 1.5 0 0 0 1.5 1.5h7.5v3.75a.75 .75 0 0 0 1.28 .53l9-9A.75 .75 0 0 0 22.28 11.47ZM13.5 19.19V16.5a.75 .75 0 0 0-.75-.75H4.5V8.25h8.25a.75 .75 0 0 0 .75-.75V4.81L20.69 12Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-fat-left-duo\",\"label\":\"Fat arrow left duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 8.25v7.5a.75 .75 0 0 1-.75 .75H11.25v4.5L2.25 12l9-9V7.5h8.25A.75 .75 0 0 1 20.25 8.25Z\",\"M19.5 6.75H12V3a.75 .75 0 0 0-1.28-.53l-9 9a.75 .75 0 0 0 0 1.06l9 9A.75 .75 0 0 0 12 21V17.25h7.5a1.5 1.5 0 0 0 1.5-1.5V8.25A1.5 1.5 0 0 0 19.5 6.75Zm0 9H11.25a.75 .75 0 0 0-.75 .75v2.69L3.31 12 10.5 4.81V7.5a.75 .75 0 0 0 .75 .75h8.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-fat-up-duo\",\"label\":\"Fat arrow up duotone\",\"set\":\"duotone\",\"paths\":[\"M21 11.25H16.5v8.25a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1-.75-.75V11.25H3l9-9Z\",\"M21.53 10.72l-9-9a.75 .75 0 0 0-1.06 0l-9 9A.75 .75 0 0 0 3 12H6.75v7.5a1.5 1.5 0 0 0 1.5 1.5h7.5a1.5 1.5 0 0 0 1.5-1.5V12h3.75a.75 .75 0 0 0 .53-1.28ZM16.5 10.5a.75 .75 0 0 0-.75 .75v8.25H8.25V11.25a.75 .75 0 0 0-.75-.75H4.81L12 3.31 19.19 10.5Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-fat-down-duo\",\"label\":\"Fat arrow down duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12.75l-9 9L3 12.75H7.5V4.5a.75 .75 0 0 1 .75-.75h7.5a.75 .75 0 0 1 .75 .75v8.25Z\",\"M21.69 12.46A.75 .75 0 0 0 21 12H17.25V4.5a1.5 1.5 0 0 0-1.5-1.5H8.25A1.5 1.5 0 0 0 6.75 4.5v7.5H3a.75 .75 0 0 0-.53 1.28l9 9a.75 .75 0 0 0 1.06 0l9-9A.75 .75 0 0 0 21.69 12.46ZM12 20.69 4.81 13.5H7.5a.75 .75 0 0 0 .75-.75V4.5h7.5v8.25a.75 .75 0 0 0 .75 .75h2.69Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-fat-lines-right-duo\",\"label\":\"Fast arrow duotone\",\"set\":\"duotone\",\"paths\":[\"M12.75 21V16.5H9.75V7.5h3V3l9 9Z\",\"M22.28 11.47l-9-9A.75 .75 0 0 0 12 3V6.75H9.75a.75 .75 0 0 0-.75 .75v9a.75 .75 0 0 0 .75 .75h2.25v3.75a.75 .75 0 0 0 1.28 .53l9-9A.75 .75 0 0 0 22.28 11.47ZM13.5 19.19V16.5a.75 .75 0 0 0-.75-.75H10.5V8.25h2.25a.75 .75 0 0 0 .75-.75V4.81L20.69 12ZM4.5 7.5v9a.75 .75 0 0 1-1.5 0V7.5a.75 .75 0 0 1 1.5 0Zm3 0v9a.75 .75 0 0 1-1.5 0V7.5a.75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-bend-up-right-duo\",\"label\":\"Bend right duotone\",\"set\":\"duotone\",\"paths\":[\"M21 9.75l-4.5 4.5V5.25Z\",\"M21.53 9.22l-4.5-4.5A.75 .75 0 0 0 15.75 5.25V9H12A9.76 9.76 0 0 0 2.25 18.75a.75 .75 0 0 0 1.5 0 8.26 8.26 0 0 1 8.25-8.25h3.75v3.75a.75 .75 0 0 0 1.28 .53l4.5-4.5A.75 .75 0 0 0 21.53 9.22ZM17.25 12.44V7.06L19.94 9.75Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-bend-down-right-duo\",\"label\":\"Bend down duotone\",\"set\":\"duotone\",\"paths\":[\"M21 14.25l-4.5 4.5V9.75Z\",\"M21.53 13.72l-4.5-4.5A.75 .75 0 0 0 15.75 9.75v3.75H12A8.26 8.26 0 0 1 3.75 5.25a.75 .75 0 0 0-1.5 0A9.76 9.76 0 0 0 12 15h3.75v3.75a.75 .75 0 0 0 1.28 .53l4.5-4.5A.75 .75 0 0 0 21.53 13.72ZM17.25 16.94V11.56L19.94 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-u-up-left-duo\",\"label\":\"U-turn left duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 3.75v9L3 8.25Z\",\"M15.75 7.5H8.25V3.75a.75 .75 0 0 0-1.28-.53l-4.5 4.5a.75 .75 0 0 0 0 1.06l4.5 4.5A.75 .75 0 0 0 8.25 12.75V9h7.5a4.5 4.5 0 0 1 0 9H7.5a.75 .75 0 0 0 0 1.5h8.25a6 6 0 0 0 0-12ZM6.75 10.94 4.06 8.25 6.75 5.56Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-u-up-right-duo\",\"label\":\"U-turn right duotone\",\"set\":\"duotone\",\"paths\":[\"M21 8.25l-4.5 4.5V3.75Z\",\"M16.21 13.44a.75 .75 0 0 0 .82-.16l4.5-4.5a.75 .75 0 0 0 0-1.06l-4.5-4.5A.75 .75 0 0 0 15.75 3.75V7.5H8.25a6 6 0 0 0 0 12h8.25a.75 .75 0 0 0 0-1.5H8.25a4.5 4.5 0 0 1 0-9h7.5v3.75A.75 .75 0 0 0 16.21 13.44ZM17.25 5.56 19.94 8.25 17.25 10.94Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-elbow-down-right-duo\",\"label\":\"Elbow arrow duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 16.5l-4.5 4.5V12Z\",\"M20.78 15.97l-4.5-4.5A.75 .75 0 0 0 15 12v3.75H7.5V3a.75 .75 0 0 0-1.5 0V16.5a.75 .75 0 0 0 .75 .75h8.25v3.75a.75 .75 0 0 0 1.28 .53l4.5-4.5A.75 .75 0 0 0 20.78 15.97ZM16.5 19.19V13.81L19.19 16.5Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-square-out-duo\",\"label\":\"Open in new duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 7.5V19.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V7.5a.75 .75 0 0 1 .75-.75H16.5A.75 .75 0 0 1 17.25 7.5Z\",\"M21 9.75a.75 .75 0 0 1-1.5 0V5.56l-6.22 6.22a.75 .75 0 0 1-1.06-1.06L18.44 4.5H14.25a.75 .75 0 0 1 0-1.5h6a.75 .75 0 0 1 .75 .75Zm-3.75 2.25a.75 .75 0 0 0-.75 .75v6.75H4.5V7.5h6.75a.75 .75 0 0 0 0-1.5H4.5A1.5 1.5 0 0 0 3 7.5V19.5a1.5 1.5 0 0 0 1.5 1.5H16.5a1.5 1.5 0 0 0 1.5-1.5V12.75A.75 .75 0 0 0 17.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-line-right-duo\",\"label\":\"Arrow to line duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 12l-6.75 6.75V5.25Z\",\"M11.03 4.72A.75 .75 0 0 0 9.75 5.25v6H3a.75 .75 0 0 0 0 1.5h6.75v6a.75 .75 0 0 0 1.28 .53l6.75-6.75a.75 .75 0 0 0 0-1.06ZM11.25 16.94V7.06L16.19 12ZM21 3.75V20.25a.75 .75 0 0 1-1.5 0V3.75a.75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-line-down-duo\",\"label\":\"Arrow down to line duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 10.5l-6.75 6.75L5.25 10.5Z\",\"M11.47 17.78a.75 .75 0 0 0 1.06 0l6.75-6.75A.75 .75 0 0 0 18.75 9.75H12.75V3a.75 .75 0 0 0-1.5 0v6.75H5.25a.75 .75 0 0 0-.53 1.28ZM16.94 11.25 12 16.19 7.06 11.25ZM21 20.25a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1 0-1.5H20.25A.75 .75 0 0 1 21 20.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-left-right-duo\",\"label\":\"Arrows left right duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 7.5v9H4.5V7.5Z\",\"M20.03 17.03l-3 3a.75 .75 0 0 1-1.06-1.06L17.69 17.25H4.5a.75 .75 0 0 1 0-1.5H17.69l-1.72-1.72a.75 .75 0 0 1 1.06-1.06l3 3A.75 .75 0 0 1 20.03 17.03Zm-13.06-6a.75 .75 0 0 0 1.06-1.06L6.31 8.25H19.5a.75 .75 0 0 0 0-1.5H6.31L8.03 5.03A.75 .75 0 0 0 6.97 3.97l-3 3a.75 .75 0 0 0 0 1.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-down-up-duo\",\"label\":\"Arrows up down duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 4.5V19.5H7.5V4.5Z\",\"M11.03 15.97a.75 .75 0 0 1 0 1.06l-3 3a.75 .75 0 0 1-1.06 0l-3-3a.75 .75 0 0 1 1.06-1.06L6.75 17.69V4.5a.75 .75 0 0 1 1.5 0V17.69l1.72-1.72A.75 .75 0 0 1 11.03 15.97Zm9-9-3-3a.75 .75 0 0 0-1.06 0l-3 3a.75 .75 0 0 0 1.06 1.06L15.75 6.31V19.5a.75 .75 0 0 0 1.5 0V6.31l1.72 1.72a.75 .75 0 0 0 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-out-cardinal-duo\",\"label\":\"Move duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12 12 21.75 2.25 12 12 2.25Z\",\"M8.47 5.78a.75 .75 0 0 1 0-1.06l3-3a.75 .75 0 0 1 1.06 0l3 3a.75 .75 0 0 1-1.06 1.06L12.75 4.06V9a.75 .75 0 0 1-1.5 0V4.06L9.53 5.78A.75 .75 0 0 1 8.47 5.78Zm6 12.44L12.75 19.94V15a.75 .75 0 0 0-1.5 0v4.94l-1.72-1.72a.75 .75 0 0 0-1.06 1.06l3 3a.75 .75 0 0 0 1.06 0l3-3a.75 .75 0 0 0-1.06-1.06Zm7.81-6.75-3-3a.75 .75 0 0 0-1.06 1.06L19.94 11.25H15a.75 .75 0 0 0 0 1.5h4.94l-1.72 1.72a.75 .75 0 0 0 1.06 1.06l3-3A.75 .75 0 0 0 22.28 11.47ZM4.06 12.75H9a.75 .75 0 0 0 0-1.5H4.06l1.72-1.72A.75 .75 0 0 0 4.72 8.47l-3 3a.75 .75 0 0 0 0 1.06l3 3a.75 .75 0 0 0 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-in-duo\",\"label\":\"Collapse duotone\",\"set\":\"duotone\",\"paths\":[\"M21 4.5V19.5a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 4.5 3H19.5A1.5 1.5 0 0 1 21 4.5Z\",\"M13.5 9.75V6a.75 .75 0 0 1 1.5 0V7.94l3.97-3.97a.75 .75 0 0 1 1.06 1.06L16.06 9H18a.75 .75 0 0 1 0 1.5H14.25A.75 .75 0 0 1 13.5 9.75Zm-3.75 3.75H6a.75 .75 0 0 0 0 1.5H7.94L3.97 18.97a.75 .75 0 0 0 1.06 1.06L9 16.06V18a.75 .75 0 0 0 1.5 0V14.25A.75 .75 0 0 0 9.75 13.5Zm6.31 1.5H18a.75 .75 0 0 0 0-1.5H14.25a.75 .75 0 0 0-.75 .75v3.75a.75 .75 0 0 0 1.5 0V16.06l3.97 3.97a.75 .75 0 0 0 1.06-1.06ZM9.75 5.25a.75 .75 0 0 0-.75 .75V7.94L5.03 3.97A.75 .75 0 0 0 3.97 5.03L7.94 9H6a.75 .75 0 0 0 0 1.5h3.75a.75 .75 0 0 0 .75-.75V6A.75 .75 0 0 0 9.75 5.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-out-duo\",\"label\":\"Expand duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 4.5V19.5H4.5V4.5Z\",\"M20.25 4.5V9a.75 .75 0 0 1-1.5 0V6.31l-3.97 3.97a.75 .75 0 0 1-1.06-1.06L17.69 5.25H15a.75 .75 0 0 1 0-1.5h4.5A.75 .75 0 0 1 20.25 4.5ZM9.22 13.72 5.25 17.69V15a.75 .75 0 0 0-1.5 0v4.5a.75 .75 0 0 0 .75 .75H9a.75 .75 0 0 0 0-1.5H6.31l3.97-3.97a.75 .75 0 0 0-1.06-1.06ZM19.5 14.25a.75 .75 0 0 0-.75 .75v2.69l-3.97-3.97a.75 .75 0 0 0-1.06 1.06L17.69 18.75H15a.75 .75 0 0 0 0 1.5h4.5a.75 .75 0 0 0 .75-.75V15A.75 .75 0 0 0 19.5 14.25ZM6.31 5.25H9a.75 .75 0 0 0 0-1.5H4.5a.75 .75 0 0 0-.75 .75V9a.75 .75 0 0 0 1.5 0V6.31l3.97 3.97a.75 .75 0 0 0 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-counter-clockwise-duo\",\"label\":\"Undo duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12a8.25 8.25 0 1 1-8.25-8.25A8.25 8.25 0 0 1 20.25 12Z\",\"M8.25 9.75H3.75a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 1.5 0V7.19L5.87 5.82A8.95 8.95 0 0 1 12.19 3.18h.05a8.94 8.94 0 0 1 6.29 2.56 .75 .75 0 0 1-1.05 1.07 7.46 7.46 0 0 0-5.24-2.13h-.04A7.46 7.46 0 0 0 6.93 6.88L5.56 8.25H8.25a.75 .75 0 0 1 0 1.5Zm12 4.5H15.75a.75 .75 0 0 0 0 1.5h2.69l-1.37 1.37a7.46 7.46 0 0 1-5.26 2.2h-.04a7.46 7.46 0 0 1-5.24-2.13 .75 .75 0 1 0-1.05 1.07 8.94 8.94 0 0 0 6.29 2.56H11.81a8.95 8.95 0 0 0 6.32-2.64L19.5 16.81V19.5a.75 .75 0 0 0 1.5 0V15A.75 .75 0 0 0 20.25 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-caret-right-duo\",\"label\":\"Caret right duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 12 9 19.5V4.5Z\",\"M17.03 11.47l-7.5-7.5A.75 .75 0 0 0 8.25 4.5V19.5a.75 .75 0 0 0 1.28 .53l7.5-7.5A.75 .75 0 0 0 17.03 11.47ZM9.75 17.69V6.31L15.44 12Z\"],\"faded\":[0]},{\"id\":\"ph-caret-left-duo\",\"label\":\"Caret left duotone\",\"set\":\"duotone\",\"paths\":[\"M15 4.5V19.5L7.5 12Z\",\"M15.29 3.81a.75 .75 0 0 0-.82 .16l-7.5 7.5a.75 .75 0 0 0 0 1.06l7.5 7.5A.75 .75 0 0 0 15.75 19.5V4.5A.75 .75 0 0 0 15.29 3.81ZM14.25 17.69 8.56 12 14.25 6.31Z\"],\"faded\":[0]},{\"id\":\"ph-caret-up-duo\",\"label\":\"Caret up duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 15H4.5l7.5-7.5Z\",\"M20.03 14.47l-7.5-7.5a.75 .75 0 0 0-1.06 0l-7.5 7.5A.75 .75 0 0 0 4.5 15.75H19.5a.75 .75 0 0 0 .53-1.28ZM6.31 14.25 12 8.56 17.69 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-caret-down-duo\",\"label\":\"Caret down duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 9l-7.5 7.5L4.5 9Z\",\"M20.19 8.71A.75 .75 0 0 0 19.5 8.25H4.5a.75 .75 0 0 0-.53 1.28l7.5 7.5a.75 .75 0 0 0 1.06 0l7.5-7.5A.75 .75 0 0 0 20.19 8.71ZM12 15.44 6.31 9.75H17.69Z\"],\"faded\":[0]},{\"id\":\"ph-caret-double-right-duo\",\"label\":\"Next duotone\",\"set\":\"duotone\",\"paths\":[\"M12.75 12 5.25 19.5V4.5Z\",\"M13.28 11.47l-7.5-7.5A.75 .75 0 0 0 4.5 4.5V19.5a.75 .75 0 0 0 1.28 .53l7.5-7.5A.75 .75 0 0 0 13.28 11.47ZM6 17.69V6.31L11.69 12Zm14.78-5.16-7.5 7.5a.75 .75 0 0 1-1.06-1.06L19.19 12 12.22 5.03a.75 .75 0 0 1 1.06-1.06l7.5 7.5A.75 .75 0 0 1 20.78 12.53Z\"],\"faded\":[0]},{\"id\":\"ph-caret-double-left-duo\",\"label\":\"Back duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 4.5V19.5l-7.5-7.5Z\",\"M19.04 3.81a.75 .75 0 0 0-.82 .16l-7.5 7.5a.75 .75 0 0 0 0 1.06l7.5 7.5A.75 .75 0 0 0 19.5 19.5V4.5A.75 .75 0 0 0 19.04 3.81ZM18 17.69 12.31 12 18 6.31Zm-6.22 1.28a.75 .75 0 0 1-1.06 1.06l-7.5-7.5a.75 .75 0 0 1 0-1.06l7.5-7.5a.75 .75 0 0 1 1.06 1.06L4.81 12Z\"],\"faded\":[0]},{\"id\":\"ph-caret-circle-right-duo\",\"label\":\"Caret circle duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm2.78-8.78a.75 .75 0 0 1 0 1.06l-3.75 3.75a.75 .75 0 0 1-1.06-1.06L13.19 12 9.97 8.78a.75 .75 0 0 1 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-caret-circle-double-right-duo\",\"label\":\"Skip duotone\",\"set\":\"duotone\",\"paths\":[\"M18.36 18.36a9 9 0 1 1 0-12.73A9 9 0 0 1 18.36 18.36Z\",\"M18.89 5.11A9.75 9.75 0 0 0 5.11 18.89 9.75 9.75 0 0 0 18.89 5.11ZM17.83 17.83a8.25 8.25 0 1 1 0-11.67A8.26 8.26 0 0 1 17.83 17.83Zm-6.05-6.36a.75 .75 0 0 1 0 1.06l-3 3a.75 .75 0 0 1-1.06-1.06L10.19 12 7.72 9.53A.75 .75 0 0 1 8.78 8.47Zm5.25 0a.75 .75 0 0 1 0 1.06l-3 3a.75 .75 0 0 1-1.06-1.06L15.44 12l-2.47-2.47a.75 .75 0 0 1 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-cursor-duo\",\"label\":\"Cursor duotone\",\"set\":\"duotone\",\"paths\":[\"M20.03 18.84 18.84 20.03a.75 .75 0 0 1-1.06 0l-4.81-4.81a.75 .75 0 0 0-1.22 .23l-1.67 4.35a.75 .75 0 0 1-1.39-.07L3.79 4.73a.75 .75 0 0 1 .94-.94L19.74 8.69a.75 .75 0 0 1 .07 1.39l-4.35 1.67a.75 .75 0 0 0-.23 1.22l4.81 4.81A.75 .75 0 0 1 20.03 18.84Z\",\"M15.75 12.44 20.07 10.78l.03-.01A1.5 1.5 0 0 0 19.97 7.98L4.96 3.08A1.5 1.5 0 0 0 3.08 4.96L7.98 19.97a1.48 1.48 0 0 0 1.35 1.03l.07 0a1.49 1.49 0 0 0 1.37-.9l.01-.03L12.44 15.75 17.25 20.56a1.5 1.5 0 0 0 2.12 0l1.19-1.19a1.5 1.5 0 0 0 0-2.12ZM18.31 19.5 13.5 14.69a1.5 1.5 0 0 0-2.44 .46c0 .01-.01 .02-.01 .03l-1.65 4.31L4.5 4.5l14.99 4.89-4.31 1.65-.03 .01a1.5 1.5 0 0 0-.46 2.44h0L19.5 18.31Z\"],\"faded\":[0]},{\"id\":\"ph-cursor-click-duo\",\"label\":\"Click duotone\",\"set\":\"duotone\",\"paths\":[\"M20.03 18.84 18.84 20.03a.75 .75 0 0 1-1.06 0l-4.81-4.81a.75 .75 0 0 0-1.22 .23l-1.67 4.35a.75 .75 0 0 1-1.39-.07L3.79 4.73a.75 .75 0 0 1 .94-.94L19.74 8.69a.75 .75 0 0 1 .07 1.39l-4.35 1.67a.75 .75 0 0 0-.23 1.22l4.81 4.81A.75 .75 0 0 1 20.03 18.84Z\",\"M8.25 2.25V1.5a.75 .75 0 0 1 1.5 0v.75a.75 .75 0 0 1-1.5 0ZM1.5 9.75h.75a.75 .75 0 0 0 0-1.5H1.5a.75 .75 0 0 0 0 1.5ZM11.66 3.67a.75 .75 0 0 0 1.01-.34l.75-1.5a.75 .75 0 0 0-1.34-.67l-.75 1.5A.75 .75 0 0 0 11.66 3.67Zm-9 7.66-1.5 .75a.75 .75 0 0 0 .67 1.34l1.5-.75a.75 .75 0 1 0-.67-1.34ZM20.56 17.25a1.5 1.5 0 0 1 0 2.12l-1.19 1.19a1.5 1.5 0 0 1-2.12 0L12.44 15.75 10.78 20.07c0 .01-.01 .02-.01 .03a1.48 1.48 0 0 1-1.37 .9l-.07 0a1.48 1.48 0 0 1-1.35-1.03L3.08 4.96A1.5 1.5 0 0 1 4.96 3.08L19.97 7.98a1.5 1.5 0 0 1 .13 2.79l-.03 .01L15.75 12.44ZM19.5 18.31 14.69 13.5h0a1.5 1.5 0 0 1 .46-2.44l.03-.01 4.31-1.65L4.5 4.5l4.89 14.99 1.65-4.31c0-.01 .01-.02 .01-.03a1.5 1.5 0 0 1 1.1-.88 1.57 1.57 0 0 1 .28-.03 1.5 1.5 0 0 1 1.06 .44L18.31 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-line-segment-duo\",\"label\":\"Line duotone\",\"set\":\"duotone\",\"paths\":[\"M7.59 16.41A2.25 2.25 0 1 1 4.41 16.41 2.25 2.25 0 0 1 7.59 16.41ZM19.59 4.41A2.25 2.25 0 1 0 19.59 7.59 2.25 2.25 0 0 0 19.59 4.41Z\",\"M20.12 3.88a3 3 0 0 0-4.71 3.65L7.52 15.42a3.01 3.01 0 0 0-3.65 .46h0a3 3 0 1 0 4.71 .6l7.89-7.89a3 3 0 0 0 3.65-4.71Zm-13.06 15.19a1.5 1.5 0 0 1-2.12-2.12h0a1.5 1.5 0 0 1 2.12 0h0A1.5 1.5 0 0 1 7.06 19.06Zm12-12a1.5 1.5 0 1 1 0-2.12A1.5 1.5 0 0 1 19.06 7.06Z\"],\"faded\":[0]},{\"id\":\"ph-line-segments-duo\",\"label\":\"Zigzag duotone\",\"set\":\"duotone\",\"paths\":[\"M5.34 17.16A2.25 2.25 0 1 1 2.16 17.16 2.25 2.25 0 0 1 5.34 17.16ZM7.41 7.41A2.25 2.25 0 1 0 10.59 7.41 2.25 2.25 0 0 0 7.41 7.41Zm6 6A2.25 2.25 0 1 0 16.59 13.41 2.25 2.25 0 0 0 13.41 13.41ZM21.84 3.66A2.25 2.25 0 1 0 21.84 6.84 2.25 2.25 0 0 0 21.84 3.66Z\",\"M22.37 3.13a3 3 0 0 0-4.24 0h0a3 3 0 0 0 0 4.24c.03 .03 .06 .05 .08 .08l-2.5 4.64a3.02 3.02 0 0 0-2.24 .33l-1.89-1.89a3 3 0 0 0-4.71-3.65h0a3 3 0 0 0 0 4.24c.03 .03 .06 .05 .08 .08L4.47 15.84a3 3 0 0 0-2.84 .79h0a3 3 0 1 0 4.24 0c-.03-.03-.06-.05-.08-.08l2.5-4.64A3.04 3.04 0 0 0 9 12a3 3 0 0 0 1.52-.41l1.89 1.89a3 3 0 1 0 4.71-.6c-.03-.03-.06-.05-.08-.08l2.5-4.64A3.03 3.03 0 0 0 20.25 8.25a3 3 0 0 0 2.12-5.12ZM4.81 19.81a1.5 1.5 0 0 1-2.12-2.12h0A1.5 1.5 0 1 1 4.81 19.81Zm3.13-9.75a1.5 1.5 0 0 1 0-2.12h0a1.5 1.5 0 1 1 0 2.12Zm8.12 6a1.5 1.5 0 0 1-2.12-2.12h0a1.5 1.5 0 0 1 2.12 2.12Zm5.25-9.75A1.5 1.5 0 1 1 19.19 4.19h0a1.5 1.5 0 0 1 2.12 2.12Z\"],\"faded\":[0]},{\"id\":\"ph-line-vertical-duo\",\"label\":\"Vertical line duotone\",\"set\":\"duotone\",\"paths\":[\"M21 4.5V19.5a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 4.5 3H19.5A1.5 1.5 0 0 1 21 4.5Z\",\"M12.75 2.25V21.75a.75 .75 0 0 1-1.5 0V2.25a.75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-dots-three-duo\",\"label\":\"Dots duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 9v6a1.5 1.5 0 0 1-1.5 1.5H3a1.5 1.5 0 0 1-1.5-1.5V9A1.5 1.5 0 0 1 3 7.5H21A1.5 1.5 0 0 1 22.5 9Z\",\"M13.13 12a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 12Zm5.25-1.12a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 18.38 10.88ZM5.63 10.88a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 5.63 10.88Z\"],\"faded\":[0]},{\"id\":\"ph-dots-three-vertical-duo\",\"label\":\"Dots vertical duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 3V21a1.5 1.5 0 0 1-1.5 1.5H9a1.5 1.5 0 0 1-1.5-1.5V3A1.5 1.5 0 0 1 9 1.5h6A1.5 1.5 0 0 1 16.5 3Z\",\"M13.13 12a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 12ZM12 6.75a1.13 1.13 0 1 0-1.12-1.12A1.13 1.13 0 0 0 12 6.75Zm0 10.5a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 12 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-dot-outline-duo\",\"label\":\"Dot duotone\",\"set\":\"duotone\",\"paths\":[\"M14.25 12a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 14.25 12Z\",\"M12 9a3 3 0 1 0 3 3A3 3 0 0 0 12 9Zm0 4.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 12 13.5Z\"],\"faded\":[0]},{\"id\":\"ph-wave-sine-duo\",\"label\":\"Wave duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12c-4.87 10.39-7.31 5.2-9.75 0ZM2.25 12H12C9.56 6.8 7.13 1.61 2.25 12Z\",\"M22.43 12.32c-2.06 4.39-3.88 6.43-5.74 6.43-2.35 0-3.82-3.12-5.37-6.43C10.1 9.71 8.71 6.75 7.31 6.75c-1.54 0-3.4 3.49-4.38 5.57a.75 .75 0 0 1-1.36-.64C3.63 7.29 5.45 5.25 7.31 5.25c2.35 0 3.82 3.12 5.37 6.43C13.9 14.29 15.29 17.25 16.69 17.25c1.54 0 3.4-3.49 4.38-5.57a.75 .75 0 0 1 1.36 .64Z\"],\"faded\":[0]},{\"id\":\"ph-wave-square-duo\",\"label\":\"Square wave duotone\",\"set\":\"duotone\",\"paths\":[\"M12 6.75v5.25H2.25V6.75Zm0 5.25v5.25H21.75V12Z\",\"M22.5 12v5.25a.75 .75 0 0 1-.75 .75H12a.75 .75 0 0 1-.75-.75V7.5H3v4.5a.75 .75 0 0 1-1.5 0V6.75a.75 .75 0 0 1 .75-.75H12a.75 .75 0 0 1 .75 .75V16.5h8.25V12a.75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-wave-triangle-duo\",\"label\":\"Triangle wave duotone\",\"set\":\"duotone\",\"paths\":[\"M7.13 5.25l4.88 6.75H2.25Zm14.63 6.75H12l4.88 6.75Z\",\"M22.36 12.44l-4.87 6.75a.75 .75 0 0 1-1.22 0L7.13 6.53l-4.27 5.91a.75 .75 0 1 1-1.22-.88l4.88-6.75a.75 .75 0 0 1 1.22 0l9.14 12.66 4.27-5.91a.75 .75 0 1 1 1.22 .88Z\"],\"faded\":[0]},{\"id\":\"ph-waves-duo\",\"label\":\"Waves duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 6.6v10.5c-6.75 5.6-9.75-5.29-16.5 .3v-10.5C10.5 1.31 13.5 12.2 20.25 6.6Z\",\"M20.83 16.62a.75 .75 0 0 1-.09 1.05c-1.63 1.35-3.08 1.83-4.41 1.83-1.74 0-3.26-.83-4.68-1.59-2.38-1.29-4.43-2.4-7.41 .07a.75 .75 0 1 1-.96-1.15c3.77-3.12 6.59-1.59 9.09-.23 2.38 1.29 4.43 2.4 7.41-.07A.75 .75 0 0 1 20.83 16.62Zm-1.06-5.34c-2.98 2.47-5.04 1.36-7.41 .07-2.49-1.35-5.32-2.89-9.09 .23a.75 .75 0 0 0 .96 1.15c2.98-2.47 5.04-1.36 7.41-.07 1.42 .77 2.94 1.59 4.68 1.59 1.33 0 2.78-.48 4.41-1.83a.75 .75 0 1 0-.96-1.15ZM4.23 7.48c2.98-2.47 5.04-1.36 7.41-.07 1.42 .77 2.94 1.59 4.68 1.59 1.33 0 2.78-.48 4.41-1.83a.75 .75 0 1 0-.96-1.15c-2.98 2.47-5.04 1.36-7.41 .07C9.86 4.74 7.04 3.21 3.27 6.33A.75 .75 0 1 0 4.23 7.48Z\"],\"faded\":[0]},{\"id\":\"ph-equals-duo\",\"label\":\"Equals duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25V18.75a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 5.25 3.75H18.75A1.5 1.5 0 0 1 20.25 5.25Z\",\"M21 15a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1 0-1.5H20.25A.75 .75 0 0 1 21 15ZM3.75 9.75H20.25a.75 .75 0 0 0 0-1.5H3.75a.75 .75 0 0 0 0 1.5Z\"],\"faded\":[0]},{\"id\":\"ph-divide-duo\",\"label\":\"Divide duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25V18.75a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 5.25 3.75H18.75A1.5 1.5 0 0 1 20.25 5.25Z\",\"M21 12a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1 0-1.5H20.25A.75 .75 0 0 1 21 12ZM12 7.5a1.5 1.5 0 1 0-1.5-1.5A1.5 1.5 0 0 0 12 7.5Zm0 9a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 12 16.5Z\"],\"faded\":[0]},{\"id\":\"ph-asterisk-duo\",\"label\":\"Asterisk duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 12a6.75 6.75 0 1 1-6.75-6.75A6.75 6.75 0 0 1 18.75 12Z\",\"M20.14 16.89a.75 .75 0 0 1-1.03 .26L12.75 13.32V20.25a.75 .75 0 0 1-1.5 0V13.32L4.89 17.14a.75 .75 0 1 1-.77-1.29L10.54 12 4.11 8.14a.75 .75 0 1 1 .77-1.29L11.25 10.68V3.75a.75 .75 0 0 1 1.5 0v6.93l6.36-3.82a.75 .75 0 1 1 .77 1.29L13.46 12l6.43 3.86A.75 .75 0 0 1 20.14 16.89Z\"],\"faded\":[0]},{\"id\":\"ph-infinity-duo\",\"label\":\"Infinity duotone\",\"set\":\"duotone\",\"paths\":[\"M21.18 15.18a4.5 4.5 0 0 1-6.36 0L12 12l2.82-3.18a4.5 4.5 0 0 1 6.36 6.36ZM2.82 8.82a4.5 4.5 0 0 0 6.36 6.36L12 12 9.18 8.82A4.5 4.5 0 0 0 2.82 8.82Z\",\"M23.25 12a5.25 5.25 0 0 1-8.96 3.71l-.03-.03L8.64 9.33a3.75 3.75 0 1 0 0 5.33l.8-.9a.75 .75 0 1 1 1.13 .99l-.81 .92-.03 .03a5.25 5.25 0 1 1 0-7.43l.03 .03 5.62 6.35a3.75 3.75 0 1 0 0-5.33l-.8 .9a.75 .75 0 1 1-1.12-.99l.81-.92 .03-.03A5.25 5.25 0 0 1 23.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-spiral-duo\",\"label\":\"Spiral duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 13.5H19.5a7.5 7.5 0 0 1-7.5 7.5 8.25 8.25 0 0 1-8.25-8.25 9 9 0 0 1 9-9A9.75 9.75 0 0 1 22.5 13.5Z\",\"M23.25 13.5a.75 .75 0 0 1-1.5 0 9.01 9.01 0 0 0-9-9 8.26 8.26 0 0 0-8.25 8.25 7.51 7.51 0 0 0 7.5 7.5 6.76 6.76 0 0 0 6.75-6.75 6.01 6.01 0 0 0-6-6 5.26 5.26 0 0 0-5.25 5.25 4.5 4.5 0 0 0 4.5 4.5 3.75 3.75 0 0 0 3.75-3.75 3 3 0 0 0-3-3 2.25 2.25 0 0 0-2.25 2.25 1.5 1.5 0 0 0 1.5 1.5 .75 .75 0 0 0 .75-.75 .75 .75 0 0 1 0-1.5 1.5 1.5 0 0 1 1.5 1.5 2.25 2.25 0 0 1-2.25 2.25 3 3 0 0 1-3-3 3.75 3.75 0 0 1 3.75-3.75 4.5 4.5 0 0 1 4.5 4.5 5.26 5.26 0 0 1-5.25 5.25 6.01 6.01 0 0 1-6-6 6.76 6.76 0 0 1 6.75-6.75 7.51 7.51 0 0 1 7.5 7.5 8.26 8.26 0 0 1-8.25 8.25 9.01 9.01 0 0 1-9-9A9.76 9.76 0 0 1 12.75 3 10.51 10.51 0 0 1 23.25 13.5Z\"],\"faded\":[0]},{\"id\":\"ph-circle-notch-duo\",\"label\":\"Loading duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M21.75 12a9.75 9.75 0 0 1-19.5 0c0-3.84 2.23-7.35 5.69-8.93a.75 .75 0 0 1 .63 1.36C5.64 5.77 3.75 8.74 3.75 12a8.25 8.25 0 0 0 16.5 0c0-3.26-1.89-6.23-4.81-7.57a.75 .75 0 0 1 .63-1.36C19.52 4.65 21.75 8.16 21.75 12Z\"],\"faded\":[0]},{\"id\":\"ph-circles-three-duo\",\"label\":\"Circles duotone\",\"set\":\"duotone\",\"paths\":[\"M12 10.5a3.38 3.38 0 1 1 3.38-3.37A3.38 3.38 0 0 1 12 10.5Zm5.63 2.25a3.38 3.38 0 1 0 3.38 3.38A3.38 3.38 0 0 0 17.63 12.75ZM6.38 12.75a3.38 3.38 0 1 0 3.38 3.38A3.38 3.38 0 0 0 6.38 12.75Z\",\"M16.13 7.13a4.13 4.13 0 1 0-4.12 4.13A4.13 4.13 0 0 0 16.13 7.13Zm-4.12 2.63a2.63 2.63 0 1 1 2.63-2.62A2.63 2.63 0 0 1 12 9.75Zm5.63 2.25a4.13 4.13 0 1 0 4.13 4.13A4.13 4.13 0 0 0 17.63 12Zm0 6.75a2.63 2.63 0 1 1 2.63-2.62A2.63 2.63 0 0 1 17.63 18.75ZM6.38 12a4.13 4.13 0 1 0 4.13 4.13A4.13 4.13 0 0 0 6.38 12Zm0 6.75a2.63 2.63 0 1 1 2.63-2.62A2.63 2.63 0 0 1 6.38 18.75Z\"],\"faded\":[0]},{\"id\":\"ph-git-branch-duo\",\"label\":\"Branch duotone\",\"set\":\"duotone\",\"paths\":[\"M21 6a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 21 6Z\",\"M21.75 6a3 3 0 1 0-3.75 2.91v1.59a.75 .75 0 0 1-.75 .75H9a2.24 2.24 0 0 0-.75 .13V8.91a3 3 0 1 0-1.5 0v6.19a3 3 0 1 0 1.5 0V13.5a.75 .75 0 0 1 .75-.75h8.25a2.25 2.25 0 0 0 2.25-2.25V8.91A3.01 3.01 0 0 0 21.75 6ZM6 6A1.5 1.5 0 1 1 7.5 7.5 1.5 1.5 0 0 1 6 6ZM9 18a1.5 1.5 0 1 1-1.5-1.5A1.5 1.5 0 0 1 9 18ZM18.75 7.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 18.75 7.5Z\"],\"faded\":[0]},{\"id\":\"ph-flow-arrow-duo\",\"label\":\"Flow duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 16.5a3 3 0 1 1-3-3A3 3 0 0 1 7.5 16.5Z\",\"M23.03 6.97l-3-3a.75 .75 0 0 0-1.06 1.06L20.69 6.75H19.5c-4.62 0-5.72 2.64-6.69 4.96-.88 2.11-1.59 3.81-4.64 4.02a3.75 3.75 0 1 0 .01 1.5c4.06-.25 5.09-2.73 6.01-4.94C15.13 10.03 15.87 8.25 19.5 8.25h1.19l-1.72 1.72a.75 .75 0 0 0 1.06 1.06l3-3A.75 .75 0 0 0 23.03 6.97ZM4.5 18.75a2.25 2.25 0 1 1 2.25-2.25A2.25 2.25 0 0 1 4.5 18.75Z\"],\"faded\":[0]},{\"id\":\"ph-path-duo\",\"label\":\"Path duotone\",\"set\":\"duotone\",\"paths\":[\"M21 18.75a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 21 18.75Z\",\"M18.75 15.75a3.01 3.01 0 0 0-2.91 2.25H6.75a3 3 0 0 1 0-6h9a3.75 3.75 0 0 0 0-7.5H6.75a.75 .75 0 0 0 0 1.5h9a2.25 2.25 0 0 1 0 4.5H6.75a4.5 4.5 0 0 0 0 9h9.09a3 3 0 1 0 2.91-3.75Zm0 4.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 18.75 20.25Z\"],\"faded\":[0]},{\"id\":\"ph-numpad-duo\",\"label\":\"Numpad duotone\",\"set\":\"duotone\",\"paths\":[\"M18 4.5V18.75a1.5 1.5 0 0 1-1.5 1.5H7.5a1.5 1.5 0 0 1-1.5-1.5V4.5Z\",\"M7.5 4.5A1.5 1.5 0 1 1 6 3 1.5 1.5 0 0 1 7.5 4.5Zm4.5-1.5a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 12 3Zm6 3a1.5 1.5 0 1 0-1.5-1.5A1.5 1.5 0 0 0 18 6ZM6 8.25a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 6 8.25Zm6 0a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 12 8.25Zm6 0a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 18 8.25ZM6 13.5a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 6 13.5Zm6 0a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 12 13.5Zm0 5.25a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 12 18.75Zm6-5.25a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 18 13.5Z\"],\"faded\":[0]},{\"id\":\"brand-discord\",\"label\":\"Discord\",\"set\":\"brand\",\"paths\":[\"M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z\"],\"color\":\"#5865F2\"},{\"id\":\"brand-youtube\",\"label\":\"YouTube\",\"set\":\"brand\",\"paths\":[\"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\"],\"color\":\"#FF0000\"},{\"id\":\"brand-twitch\",\"label\":\"Twitch\",\"set\":\"brand\",\"paths\":[\"M11.571 4.714h1.715v5.143H11.57zm4.715 0H18v5.143h-1.714zM6 0L1.714 4.286v15.428h5.143V24l4.286-4.286h3.428L22.286 12V0zm14.571 11.143l-3.428 3.428h-3.429l-3 3v-3H6.857V1.714h13.714Z\"],\"color\":\"#9146FF\"},{\"id\":\"brand-tiktok\",\"label\":\"TikTok\",\"set\":\"brand\",\"paths\":[\"M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z\"],\"color\":\"#000000\"},{\"id\":\"brand-instagram\",\"label\":\"Instagram\",\"set\":\"brand\",\"paths\":[\"M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077\"],\"color\":\"#FF0069\"},{\"id\":\"brand-x\",\"label\":\"X\",\"set\":\"brand\",\"paths\":[\"M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z\"],\"color\":\"#000000\"},{\"id\":\"brand-telegram\",\"label\":\"Telegram\",\"set\":\"brand\",\"paths\":[\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\"],\"color\":\"#26A5E4\"},{\"id\":\"brand-whatsapp\",\"label\":\"WhatsApp\",\"set\":\"brand\",\"paths\":[\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z\"],\"color\":\"#25D366\"},{\"id\":\"brand-reddit\",\"label\":\"Reddit\",\"set\":\"brand\",\"paths\":[\"M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286C.775 23.225 1.097 24 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199c1.104 0 1.999.895 1.999 1.999 0 1.105-.895 2-1.999 2-.946 0-1.739-.657-1.947-1.539v.002c-1.147.162-2.032 1.15-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363.473-.363 1.064-.58 1.707-.58 1.547 0 2.802 1.254 2.802 2.802 0 1.117-.655 2.081-1.601 2.531-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87-.954-.447-1.614-1.415-1.614-2.538 0-1.548 1.255-2.802 2.803-2.802.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01c0-1.663 1.263-3.034 2.88-3.207.188-.911.993-1.595 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135-.147.015-.241.168-.183.305.483 1.154 1.622 1.964 2.953 1.964 1.33 0 2.47-.81 2.953-1.964.057-.137-.037-.29-.184-.305-.863-.087-1.795-.135-2.769-.135Z\"],\"color\":\"#FF4500\"},{\"id\":\"brand-facebook\",\"label\":\"Facebook\",\"set\":\"brand\",\"paths\":[\"M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z\"],\"color\":\"#0866FF\"},{\"id\":\"brand-snapchat\",\"label\":\"Snapchat\",\"set\":\"brand\",\"paths\":[\"M12.206.793c.99 0 4.347.276 5.93 3.821.529 1.193.403 3.219.299 4.847l-.003.06c-.012.18-.022.345-.03.51.075.045.203.09.401.09.3-.016.659-.12 1.033-.301.165-.088.344-.104.464-.104.182 0 .359.029.509.09.45.149.734.479.734.838.015.449-.39.839-1.213 1.168-.089.029-.209.075-.344.119-.45.135-1.139.36-1.333.81-.09.224-.061.524.12.868l.015.015c.06.136 1.526 3.475 4.791 4.014.255.044.435.27.42.509 0 .075-.015.149-.045.225-.24.569-1.273.988-3.146 1.271-.059.091-.12.375-.164.57-.029.179-.074.36-.134.553-.076.271-.27.405-.555.405h-.03c-.135 0-.313-.031-.538-.074-.36-.075-.765-.135-1.273-.135-.3 0-.599.015-.913.074-.6.104-1.123.464-1.723.884-.853.599-1.826 1.288-3.294 1.288-.06 0-.119-.015-.18-.015h-.149c-1.468 0-2.427-.675-3.279-1.288-.599-.42-1.107-.779-1.707-.884-.314-.045-.629-.074-.928-.074-.54 0-.958.089-1.272.149-.211.043-.391.074-.54.074-.374 0-.523-.224-.583-.42-.061-.192-.09-.389-.135-.567-.046-.181-.105-.494-.166-.57-1.918-.222-2.95-.642-3.189-1.226-.031-.063-.052-.15-.055-.225-.015-.243.165-.465.42-.509 3.264-.54 4.73-3.879 4.791-4.02l.016-.029c.18-.345.224-.645.119-.869-.195-.434-.884-.658-1.332-.809-.121-.029-.24-.074-.346-.119-1.107-.435-1.257-.93-1.197-1.273.09-.479.674-.793 1.168-.793.146 0 .27.029.383.074.42.194.789.3 1.104.3.234 0 .384-.06.465-.105l-.046-.569c-.098-1.626-.225-3.651.307-4.837C7.392 1.077 10.739.807 11.727.807l.419-.015h.06z\"],\"color\":\"#FFFC00\"},{\"id\":\"brand-kick\",\"label\":\"Kick\",\"set\":\"brand\",\"paths\":[\"M1.333 0h8v5.333H12V2.667h2.667V0h8v8H20v2.667h-2.667v2.666H20V16h2.667v8h-8v-2.667H12v-2.666H9.333V24h-8Z\"],\"color\":\"#53FC19\"},{\"id\":\"brand-github\",\"label\":\"GitHub\",\"set\":\"brand\",\"paths\":[\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"],\"color\":\"#181717\"},{\"id\":\"brand-spotify\",\"label\":\"Spotify\",\"set\":\"brand\",\"paths\":[\"M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z\"],\"color\":\"#1ED760\"},{\"id\":\"brand-netflix\",\"label\":\"Netflix\",\"set\":\"brand\",\"paths\":[\"m5.398 0 8.348 23.602c2.346.059 4.856.398 4.856.398L10.113 0H5.398zm8.489 0v9.172l4.715 13.33V0h-4.715zM5.398 1.5V24c1.873-.225 2.81-.312 4.715-.398V14.83L5.398 1.5z\"],\"color\":\"#E50914\"},{\"id\":\"brand-hbomax\",\"label\":\"HBO Max\",\"set\":\"brand\",\"paths\":[\"M3.784 8.716c-.655 0-1.32.29-2.173.946v-.78H0v6.236h1.715V11.24c.749-.592 1.091-.78 1.372-.78.333 0 .551.209.551.729v3.928h1.715V11.23c.748-.582 1.081-.769 1.372-.769.333 0 .55.208.55.728v3.928H8.99v-4.53c0-1.403-.8-1.871-1.57-1.871-.654 0-1.32.27-2.192.936-.28-.697-.894-.936-1.444-.936zm8.689 0c-1.705 0-3.118 1.466-3.118 3.284 0 1.82 1.413 3.285 3.118 3.285.842 0 1.57-.312 2.131-.988v.82h1.632V8.883h-1.632v.822c-.561-.676-1.29-.988-2.131-.988zm4.064.166c.707 1.102 1.507 2.09 2.443 3.077a26.593 26.593 0 0 0-2.443 3.16h2.069a13.603 13.603 0 0 1 1.673-2.183 14.067 14.067 0 0 1 1.632 2.182H24a25.142 25.142 0 0 0-2.432-3.16A23.918 23.918 0 0 0 24 8.883h-2.047a14.65 14.65 0 0 1-1.674 2.11 13.357 13.357 0 0 1-1.674-2.11zm-3.804 1.279c1.018 0 1.84.82 1.84 1.84a1.837 1.837 0 0 1-1.84 1.839c-1.019 0-1.84-.82-1.84-1.84 0-1.018.821-1.84 1.84-1.84zm0 .415c-.78 0-1.414.633-1.414 1.423s.634 1.424 1.413 1.424c.78 0 1.414-.634 1.414-1.424s-.634-1.424-1.414-1.424z\"],\"color\":\"#000000\"},{\"id\":\"brand-crunchyroll\",\"label\":\"Crunchyroll\",\"set\":\"brand\",\"paths\":[\"M2.909 13.436C2.914 7.61 7.642 2.893 13.468 2.898c5.576.005 10.137 4.339 10.51 9.819q.021-.351.022-.706C24.007 5.385 18.64.006 12.012 0S.007 5.36 0 11.988 5.36 23.994 11.988 24q.412 0 .815-.027c-5.526-.338-9.9-4.928-9.894-10.538Zm16.284.155a4.1 4.1 0 0 1-4.095-4.103 4.1 4.1 0 0 1 2.712-3.855 8.95 8.95 0 0 0-4.187-1.037 9.007 9.007 0 1 0 8.997 9.016q-.001-.847-.15-1.651a4.1 4.1 0 0 1-3.278 1.63Z\"],\"color\":\"#FF5E00\"},{\"id\":\"brand-steam\",\"label\":\"Steam\",\"set\":\"brand\",\"paths\":[\"M11.979 0C5.678 0 .511 4.86.022 11.037l6.432 2.658c.545-.371 1.203-.59 1.912-.59.063 0 .125.004.188.006l2.861-4.142V8.91c0-2.495 2.028-4.524 4.524-4.524 2.494 0 4.524 2.031 4.524 4.527s-2.03 4.525-4.524 4.525h-.105l-4.076 2.911c0 .052.004.105.004.159 0 1.875-1.515 3.396-3.39 3.396-1.635 0-3.016-1.173-3.331-2.727L.436 15.27C1.862 20.307 6.486 24 11.979 24c6.627 0 11.999-5.373 11.999-12S18.605 0 11.979 0zM7.54 18.21l-1.473-.61c.262.543.714.999 1.314 1.25 1.297.539 2.793-.076 3.332-1.375.263-.63.264-1.319.005-1.949s-.75-1.121-1.377-1.383c-.624-.26-1.29-.249-1.878-.03l1.523.63c.956.4 1.409 1.5 1.009 2.455-.397.957-1.497 1.41-2.454 1.012H7.54zm11.415-9.303c0-1.662-1.353-3.015-3.015-3.015-1.665 0-3.015 1.353-3.015 3.015 0 1.665 1.35 3.015 3.015 3.015 1.663 0 3.015-1.35 3.015-3.015zm-5.273-.005c0-1.252 1.013-2.266 2.265-2.266 1.249 0 2.266 1.014 2.266 2.266 0 1.251-1.017 2.265-2.266 2.265-1.253 0-2.265-1.014-2.265-2.265z\"],\"color\":\"#000000\"},{\"id\":\"brand-epicgames\",\"label\":\"Epic Games\",\"set\":\"brand\",\"paths\":[\"M3.537 0C2.165 0 1.66.506 1.66 1.879V18.44a4.262 4.262 0 00.02.433c.031.3.037.59.316.92.027.033.311.245.311.245.153.075.258.13.43.2l8.335 3.491c.433.199.614.276.928.27h.002c.314.006.495-.071.928-.27l8.335-3.492c.172-.07.277-.124.43-.2 0 0 .284-.211.311-.243.28-.33.285-.621.316-.92a4.261 4.261 0 00.02-.434V1.879c0-1.373-.506-1.88-1.878-1.88zm13.366 3.11h.68c1.138 0 1.688.553 1.688 1.696v1.88h-1.374v-1.8c0-.369-.17-.54-.523-.54h-.235c-.367 0-.537.17-.537.539v5.81c0 .369.17.54.537.54h.262c.353 0 .523-.171.523-.54V8.619h1.373v2.143c0 1.144-.562 1.71-1.7 1.71h-.694c-1.138 0-1.7-.566-1.7-1.71V4.82c0-1.144.562-1.709 1.7-1.709zm-12.186.08h3.114v1.274H6.117v2.603h1.648v1.275H6.117v2.774h1.74v1.275h-3.14zm3.816 0h2.198c1.138 0 1.7.564 1.7 1.708v2.445c0 1.144-.562 1.71-1.7 1.71h-.799v3.338h-1.4zm4.53 0h1.4v9.201h-1.4zm-3.13 1.235v3.392h.575c.354 0 .523-.171.523-.54V4.965c0-.368-.17-.54-.523-.54zm-3.74 10.147a1.708 1.708 0 01.591.108 1.745 1.745 0 01.49.299l-.452.546a1.247 1.247 0 00-.308-.195.91.91 0 00-.363-.068.658.658 0 00-.28.06.703.703 0 00-.224.163.783.783 0 00-.151.243.799.799 0 00-.056.299v.008a.852.852 0 00.056.31.7.7 0 00.157.245.736.736 0 00.238.16.774.774 0 00.303.058.79.79 0 00.445-.116v-.339h-.548v-.565H7.37v1.255a2.019 2.019 0 01-.524.307 1.789 1.789 0 01-.683.123 1.642 1.642 0 01-.602-.107 1.46 1.46 0 01-.478-.3 1.371 1.371 0 01-.318-.455 1.438 1.438 0 01-.115-.58v-.008a1.426 1.426 0 01.113-.57 1.449 1.449 0 01.312-.46 1.418 1.418 0 01.474-.309 1.58 1.58 0 01.598-.111 1.708 1.708 0 01.045 0zm11.963.008a2.006 2.006 0 01.612.094 1.61 1.61 0 01.507.277l-.386.546a1.562 1.562 0 00-.39-.205 1.178 1.178 0 00-.388-.07.347.347 0 00-.208.052.154.154 0 00-.07.127v.008a.158.158 0 00.022.084.198.198 0 00.076.066.831.831 0 00.147.06c.062.02.14.04.236.061a3.389 3.389 0 01.43.122 1.292 1.292 0 01.328.17.678.678 0 01.207.24.739.739 0 01.071.337v.008a.865.865 0 01-.081.382.82.82 0 01-.229.285 1.032 1.032 0 01-.353.18 1.606 1.606 0 01-.46.061 2.16 2.16 0 01-.71-.116 1.718 1.718 0 01-.593-.346l.43-.514c.277.223.578.335.9.335a.457.457 0 00.236-.05.157.157 0 00.082-.142v-.008a.15.15 0 00-.02-.077.204.204 0 00-.073-.066.753.753 0 00-.143-.062 2.45 2.45 0 00-.233-.062 5.036 5.036 0 01-.413-.113 1.26 1.26 0 01-.331-.16.72.72 0 01-.222-.243.73.73 0 01-.082-.36v-.008a.863.863 0 01.074-.359.794.794 0 01.214-.283 1.007 1.007 0 01.34-.185 1.423 1.423 0 01.448-.066 2.006 2.006 0 01.025 0zm-9.358.025h.742l1.183 2.81h-.825l-.203-.499H8.623l-.198.498h-.81zm2.197.02h.814l.663 1.08.663-1.08h.814v2.79h-.766v-1.602l-.711 1.091h-.016l-.707-1.083v1.593h-.754zm3.469 0h2.235v.658h-1.473v.422h1.334v.61h-1.334v.442h1.493v.658h-2.255zm-5.3.897l-.315.793h.624zm-1.145 5.19h8.014l-4.09 1.348z\"],\"color\":\"#313131\"},{\"id\":\"brand-playstation\",\"label\":\"PlayStation\",\"set\":\"brand\",\"paths\":[\"M8.984 2.596v17.547l3.915 1.261V6.688c0-.69.304-1.151.794-.991.636.18.76.814.76 1.505v5.875c2.441 1.193 4.362-.002 4.362-3.152 0-3.237-1.126-4.675-4.438-5.827-1.307-.448-3.728-1.186-5.39-1.502zm4.656 16.241l6.296-2.275c.715-.258.826-.625.246-.818-.586-.192-1.637-.139-2.357.123l-4.205 1.5V14.98l.24-.085s1.201-.42 2.913-.615c1.696-.18 3.785.03 5.437.661 1.848.601 2.04 1.472 1.576 2.072-.465.6-1.622 1.036-1.622 1.036l-8.544 3.107V18.86zM1.807 18.6c-1.9-.545-2.214-1.668-1.352-2.32.801-.586 2.16-1.052 2.16-1.052l5.615-2.013v2.313L4.205 17c-.705.271-.825.632-.239.826.586.195 1.637.15 2.343-.12L8.247 17v2.074c-.12.03-.256.044-.39.073-1.939.331-3.996.196-6.038-.479z\"],\"color\":\"#0070D1\"},{\"id\":\"brand-roblox\",\"label\":\"Roblox\",\"set\":\"brand\",\"paths\":[\"M18.926 23.998 0 18.892 5.075.002 24 5.108ZM15.348 10.09l-5.282-1.453-1.414 5.273 5.282 1.453z\"],\"color\":\"#000000\"},{\"id\":\"brand-fortnite\",\"label\":\"Fortnite\",\"set\":\"brand\",\"paths\":[\"m15.767 14.171.097-5.05H12.4V5.197h3.99L16.872 0H7.128v24l5.271-.985V14.17z\"],\"color\":\"#000000\"},{\"id\":\"brand-valorant\",\"label\":\"Valorant\",\"set\":\"brand\",\"paths\":[\"M23.792 2.152a.252.252 0 0 0-.098.083c-3.384 4.23-6.769 8.46-10.15 12.69-.107.093-.025.288.119.265 2.439.003 4.877 0 7.316.001a.66.66 0 0 0 .552-.25c.774-.967 1.55-1.934 2.324-2.903a.72.72 0 0 0 .144-.49c-.002-3.077 0-6.153-.003-9.23.016-.11-.1-.206-.204-.167zM.077 2.166c-.077.038-.074.132-.076.205.002 3.074.001 6.15.001 9.225a.679.679 0 0 0 .158.463l7.64 9.55c.12.152.308.25.505.247 2.455 0 4.91.003 7.365 0 .142.02.222-.174.116-.265C10.661 15.176 5.526 8.766.4 2.35c-.08-.094-.174-.272-.322-.184z\"],\"color\":\"#FA4454\"},{\"id\":\"brand-riotgames\",\"label\":\"Riot Games\",\"set\":\"brand\",\"paths\":[\"M13.458.86 0 7.093l3.353 12.761 2.552-.313-.701-8.024.838-.373 1.447 8.202 4.361-.535-.775-8.857.83-.37 1.591 9.025 4.412-.542-.849-9.708.84-.374 1.74 9.87L24 17.318V3.5Zm.316 19.356.222 1.256L24 23.14v-4.18l-10.22 1.256Z\"],\"color\":\"#EB0029\"},{\"id\":\"brand-leagueoflegends\",\"label\":\"League of Legends\",\"set\":\"brand\",\"paths\":[\"m1.912 0 1.212 2.474v19.053L1.912 24h14.73l1.337-4.682H8.33V0ZM12 1.516c-.913 0-1.798.112-2.648.312v1.74a9.738 9.738 0 0 1 2.648-.368c5.267 0 9.536 4.184 9.536 9.348a9.203 9.203 0 0 1-2.3 6.086l-.273.954-.602 2.112c2.952-1.993 4.89-5.335 4.89-9.122C23.25 6.468 18.213 1.516 12 1.516Zm0 2.673c-.924 0-1.814.148-2.648.414v13.713h8.817a8.246 8.246 0 0 0 2.36-5.768c0-4.617-3.818-8.359-8.529-8.359zM2.104 7.312A10.858 10.858 0 0 0 .75 12.576c0 1.906.492 3.7 1.355 5.266z\"],\"color\":\"#C28F2C\"},{\"id\":\"brand-counterstrike\",\"label\":\"Counter-Strike\",\"set\":\"brand\",\"paths\":[\"M21.7101 3.2348a.0218.0218 0 0 1-.0216-.0215c.001-.0815.003-.3698.004-.424 0-.1292-.1428-.1831-.2117-.0829-.0113.016-.1457.212-.2287.3323a.0244.0244 0 0 1-.0198.0103h-6.5508a.0473.0473 0 0 1-.0473-.0463l-.0131-.177a.0477.0477 0 0 1 .056-.0477l.335.0319a.059.059 0 0 0 .0624-.0445l.2441-.989a.0475.0475 0 0 0-.0295-.0542l-.2268-.0848a.0427.0427 0 0 1-.0263-.0295c-.0412-.1722-.3766-1.3235-1.9935-1.581-.7867-.125-1.302.2107-1.577.4784a1.594 1.594 0 0 0-.3018.4095l-.0965.2125c-.008.0164-.046.2157-.046.234l.0513.9815a.109.109 0 0 0 .0422.0856l.3546.153-.1958.3244a.055.055 0 0 1-.053.0402s-.417.0108-.6227.0192c-.3856.0155-1.2444.4858-1.8773 1.8385-.6219 1.3282-.724 1.5496-.724 1.5496a.0736.0736 0 0 1-.0684.0398l-.5776.0019c-.0356 0-.0736.0285-.0886.0608l-.8982 2.5428c-.0149.0323-.006.081.0173.1081l.627.3918a.059.059 0 0 1 .0195.059l-.3274.9664a.1916.1916 0 0 1-.0235.0618l-.4343.3824a.1056.1056 0 0 0-.0356.059l-.5978 1.5308a.0632.0632 0 0 1-.0608.0455l-.3355.0018a.1633.1633 0 0 0-.162.1488l-.2007 2.2883a1.7194 1.7194 0 0 1-.0159.1207l-.1583.908a.128.128 0 0 1-.0333.0553l-.5584.4263c-.2559.2443-.5988.6903-.7665 1.0015l-1.86 3.9235c-.045.0833-.0811.227-.0788.3221l.1321.2354c.002.0842-.0319.4559-.0707.5307L.817 23.6545a.0985.0985 0 0 0-.003.0856l.0309.0706.0932.1859 1.8913.0029c.1173.0106.247-.1396.2507-.3005l.1027-1.2965-.0268-.1952 3.6063-4.232c.0942-.1146.222-.3168.2861-.4506l1.7186-3.7892a.1712.1712 0 0 1 .1004-.088l.1086-.035a.1694.1694 0 0 1 .1827.0528c.1505.1807.5042.781.6765 1.0315.1425.2079.8495 1.2304 1.1582 1.5675.0853.0926.3481.198.4658.2696a.083.083 0 0 1 .029.1119l-1.0298 1.8083-.4549 2.1357a.9542.9542 0 0 0-.0356.1526l-.4118 1.4831c.003.1873-.141.2856-.1527.5064l-.15 1.084a.0581.0581 0 0 0 .0582.0614l2.5445.014c.0951-.0003.1902-.0045.2854-.0067a1.1049 1.1049 0 0 0 .0755-.0069c.1242-.0158.5629-.0754.75-.1503.1097-.0388.1809-.0819.2268-.1295.1855-.1935.2002-.278.2034-.3975.001-.0212-.011-.0726-.0283-.1049-.0053-.0117-.0316-.0382-.059-.0477l-1.1815-.3562a.3693.3693 0 0 1-.1889-.1338l-.3172-.469a.0865.0865 0 0 1 .0173-.0973l.618-.609a.2017.2017 0 0 0 .0483-.072l1.9036-4.488c.089-.285.0595-.6056 0-.9445-.044-.2504-.6854-1.3264-.8532-1.6236-.1476-.262-1.0677-1.8707-1.286-2.2517-.0793-.1376-.1894-.1328-.2287-.276l-.0726-1.1173a.0398.0398 0 0 1 .0356-.0505l.3312-.0276a.093.093 0 0 0 .0741-.0487l1.147-2.1544a.0958.0958 0 0 0-.002-.094l-.2349-.2907a.0874.0874 0 0 1-.001-.0875l.3515-.3796a.054.054 0 0 1 .0736-.0206l.9343.5266a.3819.3819 0 0 0 .186.0505c.259-.0019.6858-.1549.908-.2906a.3833.3833 0 0 0 .1386-.148l.4583-1.0703c.006-.0136.0262-.0117.029.0028l.1278.5953a.0635.0635 0 0 0 .0788.0501l1.3494-.3a.0662.0662 0 0 0 .05-.0786l-.318-1.3437a.0716.0716 0 0 1 .009-.0534l.1313-.2036a.281.281 0 0 0 .036-.0814l.1589-.725a.0408.0408 0 0 1 .0397-.0323l3.7327.0047a.0916.0916 0 0 0 .0932-.0931v-.6336a.022.022 0 0 1 .0216-.0216h1.4393a.0465.0465 0 0 0 .0464-.0463v-.2855a.0465.0465 0 0 0-.0464-.0463h-1.4398z\"],\"color\":\"#000000\"},{\"id\":\"brand-paypal\",\"label\":\"PayPal\",\"set\":\"brand\",\"paths\":[\"M15.607 4.653H8.941L6.645 19.251H1.82L4.862 0h7.995c3.754 0 6.375 2.294 6.473 5.513-.648-.478-2.105-.86-3.722-.86m6.57 5.546c0 3.41-3.01 6.853-6.958 6.853h-2.493L11.595 24H6.74l1.845-11.538h3.592c4.208 0 7.346-3.634 7.153-6.949a5.24 5.24 0 0 1 2.848 4.686M9.653 5.546h6.408c.907 0 1.942.222 2.363.541-.195 2.741-2.655 5.483-6.441 5.483H8.714Z\"],\"color\":\"#002991\"},{\"id\":\"brand-stripe\",\"label\":\"Stripe\",\"set\":\"brand\",\"paths\":[\"M13.976 9.15c-2.172-.806-3.356-1.426-3.356-2.409 0-.831.683-1.305 1.901-1.305 2.227 0 4.515.858 6.09 1.631l.89-5.494C18.252.975 15.697 0 12.165 0 9.667 0 7.589.654 6.104 1.872 4.56 3.147 3.757 4.992 3.757 7.218c0 4.039 2.467 5.76 6.476 7.219 2.585.92 3.445 1.574 3.445 2.583 0 .98-.84 1.545-2.354 1.545-1.875 0-4.965-.921-6.99-2.109l-.9 5.555C5.175 22.99 8.385 24 11.714 24c2.641 0 4.843-.624 6.328-1.813 1.664-1.305 2.525-3.236 2.525-5.732 0-4.128-2.524-5.851-6.594-7.305h.003z\"],\"color\":\"#635BFF\"},{\"id\":\"brand-visa\",\"label\":\"Visa\",\"set\":\"brand\",\"paths\":[\"M9.112 8.262L5.97 15.758H3.92L2.374 9.775c-.094-.368-.175-.503-.461-.658C1.447 8.864.677 8.627 0 8.479l.046-.217h3.3a.904.904 0 01.894.764l.817 4.338 2.018-5.102zm8.033 5.049c.008-1.979-2.736-2.088-2.717-2.972.006-.269.262-.555.822-.628a3.66 3.66 0 011.913.336l.34-1.59a5.207 5.207 0 00-1.814-.333c-1.917 0-3.266 1.02-3.278 2.479-.012 1.079.963 1.68 1.698 2.04.756.367 1.01.603 1.006.931-.005.504-.602.725-1.16.734-.975.015-1.54-.263-1.992-.473l-.351 1.642c.453.208 1.289.39 2.156.398 2.037 0 3.37-1.006 3.377-2.564m5.061 2.447H24l-1.565-7.496h-1.656a.883.883 0 00-.826.55l-2.909 6.946h2.036l.405-1.12h2.488zm-2.163-2.656l1.02-2.815.588 2.815zm-8.16-4.84l-1.603 7.496H8.34l1.605-7.496z\"],\"color\":\"#1A1F71\"},{\"id\":\"brand-mastercard\",\"label\":\"MasterCard\",\"set\":\"brand\",\"paths\":[\"M11.343 18.031c.058.049.12.098.181.146-1.177.783-2.59 1.238-4.107 1.238C3.32 19.416 0 16.096 0 12c0-4.095 3.32-7.416 7.416-7.416 1.518 0 2.931.456 4.105 1.238-.06.051-.12.098-.165.15C9.6 7.489 8.595 9.688 8.595 12c0 2.311 1.001 4.51 2.748 6.031zm5.241-13.447c-1.52 0-2.931.456-4.105 1.238.06.051.12.098.165.15C14.4 7.489 15.405 9.688 15.405 12c0 2.31-1.001 4.507-2.748 6.031-.058.049-.12.098-.181.146 1.177.783 2.588 1.238 4.107 1.238C20.68 19.416 24 16.096 24 12c0-4.094-3.32-7.416-7.416-7.416zM12 6.174c-.096.075-.189.15-.28.231C10.156 7.764 9.169 9.765 9.169 12c0 2.236.987 4.236 2.551 5.595.09.08.185.158.28.232.096-.074.189-.152.28-.232 1.563-1.359 2.551-3.359 2.551-5.595 0-2.235-.987-4.236-2.551-5.595-.09-.08-.184-.156-.28-.231z\"],\"color\":\"#EB001B\"},{\"id\":\"brand-revolut\",\"label\":\"Revolut\",\"set\":\"brand\",\"paths\":[\"M20.9133 6.9566C20.9133 3.1208 17.7898 0 13.9503 0H2.424v3.8605h10.9782c1.7376 0 3.177 1.3651 3.2087 3.043.016.84-.2994 1.633-.8878 2.2324-.5886.5998-1.375.9303-2.2144.9303H9.2322a.2756.2756 0 0 0-.2755.2752v3.431c0 .0585.018.1142.052.1612L16.2646 24h5.3114l-7.2727-10.094c3.6625-.1838 6.61-3.2612 6.61-6.9494zM6.8943 5.9229H2.424V24h4.4704z\"],\"color\":\"#191C1F\"},{\"id\":\"brand-wise\",\"label\":\"Wise\",\"set\":\"brand\",\"paths\":[\"M6.488 7.469 0 15.05h11.585l1.301-3.576H7.922l3.033-3.507.01-.092L8.993 4.48h8.873l-6.878 18.925h4.706L24 .595H2.543l3.945 6.874Z\"],\"color\":\"#9FE870\"},{\"id\":\"brand-applepay\",\"label\":\"Apple Pay\",\"set\":\"brand\",\"paths\":[\"M2.15 4.318a42.16 42.16 0 0 0-.454.003c-.15.005-.303.013-.452.04a1.44 1.44 0 0 0-1.06.772c-.07.138-.114.278-.14.43-.028.148-.037.3-.04.45A10.2 10.2 0 0 0 0 6.222v11.557c0 .07.002.138.003.207.004.15.013.303.04.452.027.15.072.291.142.429a1.436 1.436 0 0 0 .63.63c.138.07.278.115.43.142.148.027.3.036.45.04l.208.003h20.194l.207-.003c.15-.004.303-.013.452-.04.15-.027.291-.071.428-.141a1.432 1.432 0 0 0 .631-.631c.07-.138.115-.278.141-.43.027-.148.036-.3.04-.45.002-.07.003-.138.003-.208l.001-.246V6.221c0-.07-.002-.138-.004-.207a2.995 2.995 0 0 0-.04-.452 1.446 1.446 0 0 0-1.2-1.201 3.022 3.022 0 0 0-.452-.04 10.448 10.448 0 0 0-.453-.003zm0 .512h19.942c.066 0 .131.002.197.003.115.004.25.01.375.032.109.02.2.05.287.094a.927.927 0 0 1 .407.407.997.997 0 0 1 .094.288c.022.123.028.258.031.374.002.065.003.13.003.197v11.552c0 .065 0 .13-.003.196-.003.115-.009.25-.032.375a.927.927 0 0 1-.5.693 1.002 1.002 0 0 1-.286.094 2.598 2.598 0 0 1-.373.032l-.2.003H1.906c-.066 0-.133-.002-.196-.003a2.61 2.61 0 0 1-.375-.032c-.109-.02-.2-.05-.288-.094a.918.918 0 0 1-.406-.407 1.006 1.006 0 0 1-.094-.288 2.531 2.531 0 0 1-.032-.373 9.588 9.588 0 0 1-.002-.197V6.224c0-.065 0-.131.002-.197.004-.114.01-.248.032-.375.02-.108.05-.199.094-.287a.925.925 0 0 1 .407-.406 1.03 1.03 0 0 1 .287-.094c.125-.022.26-.029.375-.032.065-.002.131-.002.196-.003zm4.71 3.7c-.3.016-.668.199-.88.456-.191.22-.36.58-.316.918.338.03.675-.169.888-.418.205-.258.345-.603.308-.955zm2.207.42v5.493h.852v-1.877h1.18c1.078 0 1.835-.739 1.835-1.812 0-1.07-.742-1.805-1.808-1.805zm.852.719h.982c.739 0 1.161.396 1.161 1.089 0 .692-.422 1.092-1.164 1.092h-.979zm-3.154.3c-.45.01-.83.28-1.05.28-.235 0-.593-.264-.981-.257a1.446 1.446 0 0 0-1.23.747c-.527.908-.139 2.255.374 2.995.249.366.549.769.944.754.373-.014.52-.242.973-.242.454 0 .586.242.98.235.41-.007.667-.366.915-.733.286-.417.403-.82.41-.841-.007-.008-.79-.308-.797-1.209-.008-.754.615-1.113.644-1.135-.352-.52-.9-.578-1.09-.593a1.123 1.123 0 0 0-.092-.002zm8.204.397c-.99 0-1.606.533-1.652 1.256h.777c.072-.358.369-.586.845-.586.502 0 .803.266.803.711v.309l-1.097.064c-.951.054-1.488.484-1.488 1.184 0 .72.548 1.207 1.332 1.207.526 0 1.032-.281 1.264-.727h.019v.659h.788v-2.76c0-.803-.62-1.317-1.591-1.317zm1.94.072l1.446 4.009c0 .003-.073.24-.073.247-.125.41-.33.571-.711.571-.069 0-.206 0-.267-.015v.666c.06.011.267.019.335.019.83 0 1.226-.312 1.568-1.283l1.5-4.214h-.868l-1.012 3.259h-.015l-1.013-3.26zm-1.167 2.189v.316c0 .521-.45.917-1.024.917-.442 0-.731-.228-.731-.579 0-.342.278-.56.769-.593z\"],\"color\":\"#000000\"},{\"id\":\"brand-googlepay\",\"label\":\"Google Pay\",\"set\":\"brand\",\"paths\":[\"M3.963 7.235A3.963 3.963 0 00.422 9.419a3.963 3.963 0 000 3.559 3.963 3.963 0 003.541 2.184c1.07 0 1.97-.352 2.627-.957.748-.69 1.18-1.71 1.18-2.916a4.722 4.722 0 00-.07-.806H3.964v1.526h2.14a1.835 1.835 0 01-.79 1.205c-.356.241-.814.379-1.35.379-1.034 0-1.911-.697-2.225-1.636a2.375 2.375 0 010-1.517c.314-.94 1.191-1.636 2.225-1.636a2.152 2.152 0 011.52.594l1.132-1.13a3.808 3.808 0 00-2.652-1.033zm6.501.55v6.9h.886V11.89h1.465c.603 0 1.11-.196 1.522-.588a1.911 1.911 0 00.635-1.464 1.92 1.92 0 00-.635-1.456 2.125 2.125 0 00-1.522-.598zm2.427.85a1.156 1.156 0 01.823.365 1.176 1.176 0 010 1.686 1.171 1.171 0 01-.877.357H11.35V8.635h1.487a1.156 1.156 0 01.054 0zm4.124 1.175c-.842 0-1.477.308-1.907.925l.781.491c.288-.417.68-.626 1.175-.626a1.255 1.255 0 01.856.323 1.009 1.009 0 01.366.785v.202c-.34-.193-.774-.289-1.3-.289-.617 0-1.11.145-1.479.434-.37.288-.554.677-.554 1.165a1.476 1.476 0 00.525 1.156c.35.308.785.463 1.305.463.61 0 1.098-.27 1.465-.81h.038v.655h.848v-2.909c0-.61-.19-1.09-.568-1.44-.38-.35-.896-.525-1.551-.525zm2.263.154l1.946 4.422-1.098 2.38h.915L24 9.963h-.965l-1.368 3.391h-.02l-1.406-3.39zm-2.146 2.368c.494 0 .88.11 1.156.33 0 .372-.147.696-.44.973a1.413 1.413 0 01-.997.414 1.081 1.081 0 01-.69-.232.708.708 0 01-.293-.578c0-.257.12-.47.363-.647.24-.173.54-.26.9-.26Z\"],\"color\":\"#4285F4\"},{\"id\":\"brand-bitcoin\",\"label\":\"Bitcoin\",\"set\":\"crypto\",\"paths\":[\"M23.638 14.904c-1.602 6.43-8.113 10.34-14.542 8.736C2.67 22.05-1.244 15.525.362 9.105 1.962 2.67 8.475-1.243 14.9.358c6.43 1.605 10.342 8.115 8.738 14.548v-.002zm-6.35-4.613c.24-1.59-.974-2.45-2.64-3.03l.54-2.153-1.315-.33-.525 2.107c-.345-.087-.705-.167-1.064-.25l.526-2.127-1.32-.33-.54 2.165c-.285-.067-.565-.132-.84-.2l-1.815-.45-.35 1.407s.975.225.955.236c.535.136.63.486.615.766l-1.477 5.92c-.075.166-.24.406-.614.314.015.02-.96-.24-.96-.24l-.66 1.51 1.71.426.93.242-.54 2.19 1.32.327.54-2.17c.36.1.705.19 1.05.273l-.51 2.154 1.32.33.545-2.19c2.24.427 3.93.257 4.64-1.774.57-1.637-.03-2.58-1.217-3.196.854-.193 1.5-.76 1.68-1.93h.01zm-3.01 4.22c-.404 1.64-3.157.75-4.05.53l.72-2.9c.896.23 3.757.67 3.33 2.37zm.41-4.24c-.37 1.49-2.662.735-3.405.55l.654-2.64c.744.18 3.137.524 2.75 2.084v.006z\"],\"color\":\"#F7931A\"},{\"id\":\"brand-ethereum\",\"label\":\"Ethereum\",\"set\":\"crypto\",\"paths\":[\"M11.944 17.97L4.58 13.62 11.943 24l7.37-10.38-7.372 4.35h.003zM12.056 0L4.69 12.223l7.365 4.354 7.365-4.35L12.056 0z\"],\"color\":\"#3C3C3D\"},{\"id\":\"brand-litecoin\",\"label\":\"Litecoin\",\"set\":\"crypto\",\"paths\":[\"M12 0a12 12 0 1012 12A12 12 0 0012 0zm-.2617 3.6777h2.584a.3425.3425 0 01.33.4356l-2.0312 6.918 1.9062-.582-.4082 1.3847-1.9238.5605-1.248 4.213h6.6757a.3425.3425 0 01.3282.4374l-.582 2a.4586.4586 0 01-.4395.3301H6.7324l1.7227-5.8223-1.9063.5801.42-1.3613 1.9101-.58 2.4219-8.1798a.4557.4557 0 01.4375-.334Z\"],\"color\":\"#A6A9AA\"},{\"id\":\"brand-solana\",\"label\":\"Solana\",\"set\":\"crypto\",\"paths\":[\"m23.8764 18.0313-3.962 4.1393a.9201.9201 0 0 1-.306.2106.9407.9407 0 0 1-.367.0742H.4599a.4689.4689 0 0 1-.2522-.0733.4513.4513 0 0 1-.1696-.1962.4375.4375 0 0 1-.0314-.2545.4438.4438 0 0 1 .117-.2298l3.9649-4.1393a.92.92 0 0 1 .3052-.2102.9407.9407 0 0 1 .3658-.0746H23.54a.4692.4692 0 0 1 .2523.0734.4531.4531 0 0 1 .1697.196.438.438 0 0 1 .0313.2547.4442.4442 0 0 1-.1169.2297zm-3.962-8.3355a.9202.9202 0 0 0-.306-.2106.941.941 0 0 0-.367-.0742H.4599a.4687.4687 0 0 0-.2522.0734.4513.4513 0 0 0-.1696.1961.4376.4376 0 0 0-.0314.2546.444.444 0 0 0 .117.2297l3.9649 4.1394a.9204.9204 0 0 0 .3052.2102c.1154.049.24.0744.3658.0746H23.54a.469.469 0 0 0 .2523-.0734.453.453 0 0 0 .1697-.1961.4382.4382 0 0 0 .0313-.2546.4444.4444 0 0 0-.1169-.2297zM.46 6.7225h18.7815a.9411.9411 0 0 0 .367-.0742.9202.9202 0 0 0 .306-.2106l3.962-4.1394a.4442.4442 0 0 0 .117-.2297.4378.4378 0 0 0-.0314-.2546.453.453 0 0 0-.1697-.196.469.469 0 0 0-.2523-.0734H4.7596a.941.941 0 0 0-.3658.0745.9203.9203 0 0 0-.3052.2102L.1246 5.9687a.4438.4438 0 0 0-.1169.2295.4375.4375 0 0 0 .0312.2544.4512.4512 0 0 0 .1692.196.4689.4689 0 0 0 .2518.0739z\"],\"color\":\"#9945FF\"},{\"id\":\"brand-tether\",\"label\":\"Tether\",\"set\":\"crypto\",\"paths\":[\"M18.7538 10.5176c0 .6251-2.2379 1.1483-5.2381 1.2812l.0028.0007c-.0848.0064-.5233.0325-1.5012.0325-.7778 0-1.33-.0233-1.5237-.0325-3.0059-.1322-5.2495-.6555-5.2495-1.2819s2.2436-1.149 5.2495-1.2834v2.0442c.1965.0142.7594.0474 1.5372.0474.9334 0 1.4008-.0389 1.4849-.0466V9.2356c2.9994.1337 5.2381.657 5.2381 1.282zm5.19.5466L12.1248 22.389a.1803.1803 0 0 1-.2496 0L.0562 11.0635a.1781.1781 0 0 1-.0382-.2079l4.3762-9.1921a.1767.1767 0 0 1 .1626-.1026h14.8878a.1768.1768 0 0 1 .1612.1032l4.3762 9.1922a.1782.1782 0 0 1-.0382.2079zm-4.478-.4038c0-.8068-2.5515-1.4799-5.9473-1.6369V7.195h4.186V4.4055H6.3076V7.195h4.1852v1.8286c-3.4018.1562-5.9601.83-5.9601 1.6376 0 .8075 2.5583 1.4806 5.9601 1.6376v5.8618h3.025v-5.8639c3.394-.1563 5.948-.8295 5.948-1.6363z\"],\"color\":\"#50AF95\"},{\"id\":\"brand-dogecoin\",\"label\":\"Dogecoin\",\"set\":\"crypto\",\"paths\":[\"M12.288 7.908h-1.715v3.38h2.697v1.415h-2.697v3.38h1.799c.462 0 3.794.052 3.789-3.933-.005-3.984-3.232-4.242-3.873-4.242zM12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm.472 18.481H8.126v-5.778H6.594v-1.415h1.532V5.511h3.73c.882 0 6.727-.183 6.727 6.594-.001 6.888-6.111 6.376-6.111 6.376z\"],\"color\":\"#C2A633\"},{\"id\":\"brand-monero\",\"label\":\"Monero\",\"set\":\"crypto\",\"paths\":[\"M12 0C5.365 0 0 5.373 0 12.015c0 1.335.228 2.607.618 3.81h3.577V5.729L12 13.545l7.805-7.815v10.095h3.577c.389-1.203.618-2.475.618-3.81C24 5.375 18.635 0 12 0zm-1.788 15.307l-3.417-3.421v6.351H1.758C3.87 21.689 7.678 24 12 24s8.162-2.311 10.245-5.764h-5.04v-6.351l-3.386 3.421-1.788 1.79-1.814-1.79h-.005z\"],\"color\":\"#FF6600\"},{\"id\":\"brand-binance\",\"label\":\"Binance\",\"set\":\"crypto\",\"paths\":[\"M16.624 13.9202l2.7175 2.7154-7.353 7.353-7.353-7.352 2.7175-2.7164 4.6355 4.6595 4.6356-4.6595zm4.6366-4.6366L24 12l-2.7154 2.7164L18.5682 12l2.6924-2.7164zm-9.272.001l2.7163 2.6914-2.7164 2.7174v-.001L9.2721 12l2.7164-2.7154zm-9.2722-.001L5.4088 12l-2.6914 2.6924L0 12l2.7164-2.7164zM11.9885.0115l7.353 7.329-2.7174 2.7154-4.6356-4.6356-4.6355 4.6595-2.7174-2.7154 7.353-7.353z\"],\"color\":\"#F0B90B\"},{\"id\":\"brand-ripple\",\"label\":\"Ripple\",\"set\":\"crypto\",\"paths\":[\"M20.55 14.65c-.846-.486-1.805-.632-2.752-.666-.79-.023-1.974-.541-1.974-1.985 0-1.072.868-1.94 1.985-1.985.947-.034 1.906-.18 2.752-.666A5.018 5.018 0 0022.4 2.502 5.04 5.04 0 0015.53.674a4.993 4.993 0 00-2.504 4.343c0 .97.35 1.861.79 2.696.372.699.553 1.996-.71 2.73-.948.54-2.132.202-2.719-.745-.496-.801-1.094-1.545-1.94-2.03C6.045 6.28 2.977 7.104 1.6 9.495A5.018 5.018 0 003.44 16.34a5.025 5.025 0 005.008 0c.846-.485 1.444-1.23 1.94-2.03.406-.654 1.433-1.489 2.718-.744.948.541 1.241 1.737.711 2.73-.44.823-.79 1.725-.79 2.695A5.011 5.011 0 0018.034 24a5.011 5.011 0 005.008-5.008 4.982 4.982 0 00-2.492-4.343z\"],\"color\":\"#0085C0\"},{\"id\":\"brand-cardano\",\"label\":\"Cardano\",\"set\":\"crypto\",\"paths\":[\"M6.5765 11.92c-.0488.8906.6316 1.653 1.5219 1.7056h.0934c.8928-.0006 1.6161-.725 1.6155-1.6178-.0006-.8928-.725-1.6161-1.6178-1.6155-.8578.0006-1.5658.6711-1.613 1.5277Zm-6.025-.416c-.288-.0161-.5345.2042-.5507.4922-.0161.288.2042.5345.4922.5507.2878.0161.5343-.204.5506-.4918.0167-.2876-.2029-.5343-.4905-.5509H.5514Zm5.9226-8.9645c.257-.1309.3593-.4453.2284-.7024-.1309-.257-.4453-.3593-.7024-.2284-.2558.1302-.3585.4424-.2301.6991.13.2582.4448.3622.703.2322.0003-.0002.0007-.0003.001-.0005Zm1.6397 2.8589c.398-.2006.558-.6859.3573-1.0839-.2006-.398-.6859-.558-1.0839-.3573-.3978.2006-.5579.6856-.3575 1.0835.2007.398.686.5581 1.0842.3578ZM2.597 7.3645c.3072.2013.7194.1154.9206-.1918.2013-.3072.1154-.7194-.1918-.9206-.3072-.2013-.7194-.1154-.9206.1918 0 .0001-.0001.0002-.0002.0003-.201.3072-.1151.7191.192.9203Zm.9824 3.8515c-.4453-.0254-.827.3149-.8524.7603s.3149.827.7603.8524c.4453.0254.827-.3149.8524-.7603v-.0006c.0251-.4451-.3152-.8264-.7603-.8518Zm-.8915 5.4221c-.328.1652-.46.565-.2948.893.1652.328.565.46.893.2948.328-.1652.46-.565.2948-.893l-.0002-.0004c-.1645-.3276-.5633-.4598-.8909-.2954-.0006.0003-.0013.0006-.0019.001Zm3.136-7.0931c.4386.2876 1.0274.1653 1.315-.2734.2876-.4386.1653-1.0274-.2734-1.315-.4386-.2876-1.0273-.1653-1.3149.2732-.2878.4381-.166 1.0266.2721 1.3144.0004.0003.0008.0005.0012.0008Zm9.9501-4.2106c.3729.2447.8737.1408 1.1184-.2321.2447-.3729.1408-.8737-.2321-1.1184-.3729-.2447-.8737-.1408-1.1184.2321 0 .0001-.0001.0002-.0002.0003-.2447.3726-.141.8729.2316 1.1176.0003.0002.0005.0003.0008.0005Zm1.6563-2.8499c.2413.1579.565.0904.723-.151s.0904-.565-.151-.723c-.241-.1577-.5642-.0906-.7224.1501-.1584.241-.0915.5648.1495.7233l.0009.0006Zm-1.5296 7.8938c-.8911-.0507-1.6546.6305-1.7053 1.5216-.0507.8911.6305 1.6546 1.5216 1.7053h.0928c.8925 0 1.616-.7235 1.616-1.616 0-.8572-.6693-1.5652-1.5251-1.6134v.0026ZM8.645 9.433c.2737.5459.8331.8896 1.4438.887.8925-.0002 1.6159-.7238 1.6157-1.6163 0-.2526-.0593-.5018-.1731-.7273-.4017-.7971-1.3735-1.1176-2.1706-.7158-.7971.4017-1.1176 1.3735-.7158 2.1706v.0019Zm12.6669-2.0704c.3273-.1666.4575-.567.2909-.8943-.1666-.3273-.567-.4575-.8943-.2909-.3259.1659-.4567.5639-.2927.8908.1652.3284.5653.4607.8937.2956.0008-.0004.0015-.0008.0023-.0012Zm-4.096.5146c-.4683.2362-.6565.8074-.4203 1.2757.2362.4683.8074.6565 1.2757.4203.468-.2361.6563-.8066.4207-1.2749-.2364-.4683-.8074-.6568-1.2762-.4211Zm-5.2768-5.6365c.3667.0205.6806-.2601.7011-.6267s-.2601-.6806-.6267-.7011c-.3655-.0205-.6789.2584-.7009.6238-.0225.3662.2562.6813.6224.7038.0014 0 .0028.0002.0042.0002Zm-.0077 4.1837c.5237.0288.9717-.3724 1.0006-.8961.0288-.5237-.3723-.9717-.8961-1.0006-.5231-.0288-.9707.3714-1.0005.8944-.0298.5237.3706.9724.8943 1.0021h.0017Zm-5.1475 9.6992c.4685-.2359.657-.807.421-1.2755-.2359-.4685-.807-.657-1.2755-.421-.4684.2359-.6569.8069-.4211 1.2754.2362.4682.807.6567 1.2755.4211Zm5.76-8.313c-.4881.7459-.2792 1.7463.4667 2.2344s1.7463.2792 2.2344-.4667.2792-1.7463-.4667-2.2344c-.262-.1715-.5683-.263-.8815-.2635-.5452-.0001-1.0538.2744-1.353.7302Zm2.8109 6.7571c-.4015-.7975-1.3735-1.1185-2.171-.7169-.7975.4015-1.1185 1.3735-.7169 2.171.4015.7975 1.3735 1.1185 2.171.7169.0005-.0002.0009-.0005.0014-.0007.7947-.3952 1.1186-1.3598.7235-2.1545-.0026-.0053-.0053-.0105-.0079-.0158Zm2.8211-.112c-.4386-.2876-1.0274-.1653-1.315.2734-.2876.4386-.1653 1.0274.2734 1.315.4386.2876 1.0273.1653 1.3149-.2732.2877-.4386.1654-1.0274-.2731-1.3151h-.0002Zm3.0963-2.4282c.0254-.4453-.3149-.827-.7603-.8524-.4453-.0254-.827.3149-.8524.7603-.0254.4453.3149.827.7603.8524h.0006c.4451.0251.8264-.3152.8518-.7603Zm2.2349-.5741c-.288-.0161-.5345.2042-.5507.4922s.2042.5345.4922.5507c.2878.0161.5343-.204.5506-.4918.016-.288-.2042-.5345-.4922-.551Zm-2.1043 5.1821c-.3073-.2011-.7194-.115-.9205.1923-.2011.3073-.115.7194.1923.9205.3071.201.719.1151.9202-.1918.2013-.3071.1156-.7193-.1916-.9207l-.0004-.0003ZM6.5695 21.5161c-.2411-.1584-.5649-.0913-.7232.1497-.1584.2411-.0913.5649.1497.7232.2411.1584.5649.0913.7232-.1497.158-.2411.091-.5646-.1498-.7232Zm10.9555-.055c-.257.1309-.3593.4453-.2284.7024.1309.257.4453.3593.7023.2284.2558-.1302.3585-.4424.2301-.6991-.1291-.2579-.4428-.3624-.7007-.2333-.0011.0005-.0022.0011-.0033.0016Zm-6.0691-5.2717c.4892-.7465.2806-1.7482-.4659-2.2374-.7465-.4892-1.7482-.2806-2.2374.4659s-.2806 1.7482.4659 2.2374c.2628.1722.5702.2641.8844.2644.5458.0022 1.0553-.2728 1.353-.7302Zm-3.2301 2.4768c-.3729-.2447-.8737-.1408-1.1184.2321-.2447.3729-.1408.8737.2321 1.1184s.8737.1408 1.1184-.2321c0-.0001.0001-.0002.0002-.0003.2445-.3729.1405-.8734-.2323-1.1181Zm3.7664 3.0931c-.3667-.0209-.6808.2594-.7017.6261s.2594.6808.6261.7017c.3658.0208.6795-.2581.7016-.6238.0222-.3666-.2571-.6817-.6236-.7039-.0008 0-.0015 0-.0023-.0001Zm.007-4.1837c-.5237-.0288-.9717.3724-1.0005.8961-.0288.5237.3724.9717.8961 1.0005.5228.0288.9703-.371 1.0004-.8938.0298-.524-.3709-.973-.8949-1.0028h-.0011Zm3.8861 1.0259c-.3976.2022-.556.6884-.3539 1.086.2022.3976.6884.556 1.086.3539.3961-.2014.5551-.685.3558-1.0821-.2-.3987-.6854-.5598-1.0841-.3597-.0013.0007-.0026.0013-.0039.002Z\"],\"color\":\"#0133AD\"},{\"id\":\"brand-polygon\",\"label\":\"Polygon\",\"set\":\"crypto\",\"paths\":[\"m17.82 16.342 5.692-3.287A.98.98 0 0 0 24 12.21V5.635a.98.98 0 0 0-.488-.846l-5.693-3.286a.98.98 0 0 0-.977 0L11.15 4.789a.98.98 0 0 0-.489.846v11.747L6.67 19.686l-3.992-2.304v-4.61l3.992-2.304 2.633 1.52V8.896L7.158 7.658a.98.98 0 0 0-.977 0L.488 10.945a.98.98 0 0 0-.488.846v6.573a.98.98 0 0 0 .488.847l5.693 3.286a.981.981 0 0 0 .977 0l5.692-3.286a.98.98 0 0 0 .489-.846V6.618l.072-.041 3.92-2.263 3.99 2.305v4.609l-3.99 2.304-2.63-1.517v3.092l2.14 1.236a.981.981 0 0 0 .978 0v-.001Z\"],\"color\":\"#7B3FE4\"},{\"id\":\"brand-bnbchain\",\"label\":\"BNB Chain\",\"set\":\"crypto\",\"paths\":[\"M5.631 3.676 12.001 0l6.367 3.676-2.34 1.358L12 2.716 7.972 5.034l-2.34-1.358Zm12.737 4.636-2.34-1.358L12 9.272 7.972 6.954l-2.34 1.358v2.716l4.026 2.318v4.636L12 19.341l2.341-1.359v-4.636l4.027-2.318V8.312Zm0 7.352v-2.716l-2.34 1.358v2.716l2.34-1.358Zm1.663.96-4.027 2.318v2.717l6.368-3.677V10.63l-2.34 1.358v4.636Zm-2.34-10.63 2.34 1.358v2.716l2.341-1.358V5.994l-2.34-1.358-2.342 1.358ZM9.657 19.926v2.716L12 24l2.341-1.358v-2.716l-2.34 1.358-2.343-1.358Zm-4.027-4.262 2.341 1.358v-2.716l-2.34-1.358v2.716Zm4.027-9.67L12 7.352l2.341-1.358-2.34-1.358-2.343 1.358Zm-5.69 1.358L6.31 5.994 3.968 4.636l-2.34 1.358V8.71l2.34 1.358V7.352Zm0 4.636-2.34-1.358v7.352l6.368 3.677v-2.717l-4.028-2.318v-4.636Z\"],\"color\":\"#F0B90B\"},{\"id\":\"brand-bitcoincash\",\"label\":\"Bitcoin Cash\",\"set\":\"crypto\",\"paths\":[\"m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z\"],\"color\":\"#0AC18E\"},{\"id\":\"brand-chainlink\",\"label\":\"Chainlink\",\"set\":\"crypto\",\"paths\":[\"M12 0L9.798 1.266l-6 3.468L1.596 6v12l2.202 1.266 6.055 3.468L12.055 24l2.202-1.266 5.945-3.468L22.404 18V6l-2.202-1.266-6-3.468zM6 15.468V8.532l6-3.468 6 3.468v6.936l-6 3.468z\"],\"color\":\"#375BD2\"},{\"id\":\"brand-shopify\",\"label\":\"Shopify\",\"set\":\"brand\",\"paths\":[\"M15.337 23.979l7.216-1.561s-2.604-17.613-2.625-17.73c-.018-.116-.114-.192-.211-.192s-1.929-.136-1.929-.136-1.275-1.274-1.439-1.411c-.045-.037-.075-.057-.121-.074l-.914 21.104h.023zM11.71 11.305s-.81-.424-1.774-.424c-1.447 0-1.504.906-1.504 1.141 0 1.232 3.24 1.715 3.24 4.629 0 2.295-1.44 3.76-3.406 3.76-2.354 0-3.54-1.465-3.54-1.465l.646-2.086s1.245 1.066 2.28 1.066c.675 0 .975-.545.975-.932 0-1.619-2.654-1.694-2.654-4.359-.034-2.237 1.571-4.416 4.827-4.416 1.257 0 1.875.361 1.875.361l-.945 2.715-.02.01zM11.17.83c.136 0 .271.038.405.135-.984.465-2.064 1.639-2.508 3.992-.656.213-1.293.405-1.889.578C7.697 3.75 8.951.84 11.17.84V.83zm1.235 2.949v.135c-.754.232-1.583.484-2.394.736.466-1.777 1.333-2.645 2.085-2.971.193.501.309 1.176.309 2.1zm.539-2.234c.694.074 1.141.867 1.429 1.755-.349.114-.735.231-1.158.366v-.252c0-.752-.096-1.371-.271-1.871v.002zm2.992 1.289c-.02 0-.06.021-.078.021s-.289.075-.714.21c-.423-1.233-1.176-2.37-2.508-2.37h-.115C12.135.209 11.669 0 11.265 0 8.159 0 6.675 3.877 6.21 5.846c-1.194.365-2.063.636-2.16.674-.675.213-.694.232-.772.87-.075.462-1.83 14.063-1.83 14.063L15.009 24l.927-21.166z\"],\"color\":\"#7AB55C\"},{\"id\":\"brand-ebay\",\"label\":\"eBay\",\"set\":\"brand\",\"paths\":[\"M6.056 12.132v-4.92h1.2v3.026c.59-.703 1.402-.906 2.202-.906 1.34 0 2.828.904 2.828 2.855 0 .233-.015.457-.06.668.24-.953 1.274-1.305 2.896-1.344.51-.018 1.095-.018 1.56-.018v-.135c0-.885-.556-1.244-1.53-1.244-.72 0-1.245.3-1.305.81h-1.275c.136-1.29 1.5-1.62 2.686-1.62 1.064 0 1.995.27 2.415 1.02l-.436-.84h1.41l2.055 4.125 2.055-4.126H24l-3.72 7.305h-1.346l1.07-2.04-2.33-4.38c.13.255.2.555.2.93v2.46c0 .346.01.69.04 1.005H16.8a6.543 6.543 0 01-.046-.765c-.603.734-1.32.96-2.32.96-1.48 0-2.272-.78-2.272-1.695 0-.15.015-.284.037-.405-.3 1.246-1.36 2.086-2.767 2.086-.87 0-1.694-.315-2.2-.93 0 .24-.015.494-.04.734h-1.18c.02-.39.04-.855.04-1.245v-1.05h-4.83c.065 1.095.818 1.74 1.853 1.74.718 0 1.355-.3 1.568-.93h1.24c-.24 1.29-1.61 1.725-2.79 1.725C.95 15.009 0 13.822 0 12.232c0-1.754.982-2.91 3.116-2.91 1.688 0 2.93.886 2.94 2.806v.005zm9.137.183c-1.095.034-1.77.233-1.77.95 0 .465.36.97 1.305.97 1.26 0 1.935-.69 1.935-1.814v-.13c-.45 0-.99.006-1.484.022h.012zm-6.06 1.875c1.11 0 1.876-.806 1.876-2.02s-.768-2.02-1.893-2.02c-1.11 0-1.89.806-1.89 2.02s.765 2.02 1.875 2.02h.03zm-4.35-2.514c-.044-1.125-.854-1.546-1.725-1.546-.944 0-1.694.474-1.815 1.546z\"],\"color\":\"#E53238\"},{\"id\":\"brand-allegro\",\"label\":\"Allegro\",\"set\":\"brand\",\"paths\":[\"M4.59 7.981a.124.124 0 0 0-.122.124v5.917a.124.124 0 0 0 .124.124h.72a.124.124 0 0 0 .124-.124h-.002V8.105a.124.124 0 0 0-.124-.124Zm1.691 0a.124.124 0 0 0-.124.124v5.917a.124.124 0 0 0 .124.124h.72a.124.124 0 0 0 .123-.124V8.105a.124.124 0 0 0-.122-.124Zm12.667 1.776a1.868 1.868 0 0 0-1.317.532 1.674 1.674 0 0 0-.531 1.254v2.48a.124.124 0 0 0 .123.123h.72a.124.124 0 0 0 .124-.124v-2.427c0-.752.5-1.113 1.314-.946a.13.13 0 0 0 .168-.142v-.495c0-.13-.014-.18-.1-.208a2.794 2.794 0 0 0-.501-.047Zm-4.626 0a2.193 2.193 0 0 0-1.732.849 2.355 2.355 0 0 0 0 2.678 2.13 2.131 0 0 0 1.732.849 2.21 2.21 0 0 0 1.234-.372v.53c0 .717-.627.848-1.03.873a4.73 4.73 0 0 1-.826-.045c-.11-.017-.188 0-.188.119v.636a.109.109 0 0 0 .114.103c.933.08 1.56.064 2.032-.206a1.537 1.537 0 0 0 .69-.875 2.928 2.928 0 0 0 .117-.874v-2.077h.002a2.245 2.245 0 0 0-.412-1.34 2.193 2.193 0 0 0-1.733-.848Zm-12.255.002a2.903 2.903 0 0 0-1.465.39.092.092 0 0 0-.045.08l.038.63a.112.112 0 0 0 .185.065c.627-.387 1.38-.459 1.764-.265a.67.67 0 0 1 .335.605v.092H1.832c-.45 0-1.83.167-1.83 1.434v.014a1.229 1.229 0 0 0 .45 1.017 1.768 1.768 0 0 0 1.118.32h2.118a.124.124 0 0 0 .124-.125v-2.51l-.002.004c0-.57-.127-1.004-.402-1.303-.274-.3-.827-.45-1.34-.45zm7.707 0c-1.28 0-1.84.858-2.02 1.585a2.44 2.44 0 0 0-.074.6 2.277 2.277 0 0 0 .412 1.338 2.198 2.198 0 0 0 1.733.85c.691.024 1.153-.093 1.506-.294a.196.196 0 0 0 .084-.212v-.558c0-.114-.069-.167-.167-.098a2.185 2.185 0 0 1-1.393.334 1.14 1.14 0 0 1-1.118-1.016h2.845a.117.117 0 0 0 .117-.116c.05-.778-.175-2.413-1.925-2.413Zm12.08 0a2.193 2.193 0 0 0-1.731.848 2.275 2.275 0 0 0-.412 1.34 2.275 2.275 0 0 0 .412 1.339 2.193 2.193 0 0 0 3.465 0 2.277 2.277 0 0 0 .412-1.34 2.277 2.277 0 0 0-.412-1.339 2.193 2.193 0 0 0-1.733-.848Zm-7.532.833c1.157 0 1.196 1.18 1.196 1.351 0 .171-.039 1.351-1.196 1.351-.517 0-.89-.378-1.047-.849a1.552 1.552 0 0 1 0-1.004c.157-.47.53-.849 1.047-.849zm-4.546.004a.86.86 0 0 1 .91.922H8.754a.968.968 0 0 1 1.024-.922zm12.078 0c.515-.012.89.378 1.048.848a1.553 1.553 0 0 1 0 1.003v.002c-.158.47-.531.837-1.048.848-.518.012-.89-.378-1.047-.848a1.552 1.552 0 0 1 0-1.005c.158-.47.53-.837 1.047-.848zM1.89 12.121h.99v1.246H1.63a.773.773 0 0 1-.444-.156.492.492 0 0 1-.21-.412c0-.226.153-.678.914-.678z\"],\"color\":\"#FF5A00\"},{\"id\":\"brand-vinted\",\"label\":\"Vinted\",\"set\":\"brand\",\"paths\":[\"M19.316 0c-.258 0-.571.217-1.415.953-.3.108-.627.027-1.008.613-2.15 3.09-3.825 14.648-5.255 17.984-.286-1.444-.885-10.837-1.116-13.41-.028-.477.027-1.076.027-1.43 0-2.368-.516-3.567-2.886-3.567-1.198 0-2.382.436-3.008 1.226-.299.408-.409.708-.409 1.443 0 4.915 1.171 12.973 2.478 18.228C7.132 23.688 8.603 24 9.99 24c.654 0 1.307-.081 2.233-.544 3.212-1.567 4.07-5.84 4.9-9.993.15-.749.899-4.37 1.253-6.275.476-2.6 1.02-5.54 1.347-6.617C19.833.245 19.63 0 19.317 0z\"],\"color\":\"#007782\"},{\"id\":\"brand-apple\",\"label\":\"Apple\",\"set\":\"brand\",\"paths\":[\"M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701\"],\"color\":\"#000000\"},{\"id\":\"brand-android\",\"label\":\"Android\",\"set\":\"brand\",\"paths\":[\"M18.4395 5.5586c-.675 1.1664-1.352 2.3318-2.0274 3.498-.0366-.0155-.0742-.0286-.1113-.043-1.8249-.6957-3.484-.8-4.42-.787-1.8551.0185-3.3544.4643-4.2597.8203-.084-.1494-1.7526-3.021-2.0215-3.4864a1.1451 1.1451 0 0 0-.1406-.1914c-.3312-.364-.9054-.4859-1.379-.203-.475.282-.7136.9361-.3886 1.5019 1.9466 3.3696-.0966-.2158 1.9473 3.3593.0172.031-.4946.2642-1.3926 1.0177C2.8987 12.176.452 14.772 0 18.9902h24c-.119-1.1108-.3686-2.099-.7461-3.0683-.7438-1.9118-1.8435-3.2928-2.7402-4.1836a12.1048 12.1048 0 0 0-2.1309-1.6875c.6594-1.122 1.312-2.2559 1.9649-3.3848.2077-.3615.1886-.7956-.0079-1.1191a1.1001 1.1001 0 0 0-.8515-.5332c-.5225-.0536-.9392.3128-1.0488.5449zm-.0391 8.461c.3944.5926.324 1.3306-.1563 1.6503-.4799.3197-1.188.0985-1.582-.4941-.3944-.5927-.324-1.3307.1563-1.6504.4727-.315 1.1812-.1086 1.582.4941zM7.207 13.5273c.4803.3197.5506 1.0577.1563 1.6504-.394.5926-1.1038.8138-1.584.4941-.48-.3197-.5503-1.0577-.1563-1.6504.4008-.6021 1.1087-.8106 1.584-.4941z\"],\"color\":\"#3DDC84\"},{\"id\":\"brand-claude\",\"label\":\"Claude\",\"set\":\"brand\",\"paths\":[\"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z\"],\"color\":\"#D97757\"},{\"id\":\"brand-anthropic\",\"label\":\"Anthropic\",\"set\":\"brand\",\"paths\":[\"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z\"],\"color\":\"#191919\"},{\"id\":\"brand-klarna\",\"label\":\"Klarna\",\"set\":\"brand\",\"paths\":[\"M4.592 2v20H0V2h4.592zm11.46 0c0 4.194-1.583 8.105-4.415 11.068l-.278.283L17.702 22h-5.668l-6.893-9.4 1.779-1.332c2.858-2.14 4.535-5.378 4.637-8.924L11.562 2h4.49zM21.5 17a2.5 2.5 0 110 5 2.5 2.5 0 010-5z\"],\"color\":\"#FFB3C7\"},{\"id\":\"brand-cashapp\",\"label\":\"Cash App\",\"set\":\"brand\",\"paths\":[\"M23.59 3.475a5.1 5.1 0 00-3.05-3.05c-1.31-.42-2.5-.42-4.92-.42H8.36c-2.4 0-3.61 0-4.9.4a5.1 5.1 0 00-3.05 3.06C0 4.765 0 5.965 0 8.365v7.27c0 2.41 0 3.6.4 4.9a5.1 5.1 0 003.05 3.05c1.3.41 2.5.41 4.9.41h7.28c2.41 0 3.61 0 4.9-.4a5.1 5.1 0 003.06-3.06c.41-1.3.41-2.5.41-4.9v-7.25c0-2.41 0-3.61-.41-4.91zm-6.17 4.63l-.93.93a.5.5 0 01-.67.01 5 5 0 00-3.22-1.18c-.97 0-1.94.32-1.94 1.21 0 .9 1.04 1.2 2.24 1.65 2.1.7 3.84 1.58 3.84 3.64 0 2.24-1.74 3.78-4.58 3.95l-.26 1.2a.49.49 0 01-.48.39H9.63l-.09-.01a.5.5 0 01-.38-.59l.28-1.27a6.54 6.54 0 01-2.88-1.57v-.01a.48.48 0 010-.68l1-.97a.49.49 0 01.67 0c.91.86 2.13 1.34 3.39 1.32 1.3 0 2.17-.55 2.17-1.42 0-.87-.88-1.1-2.54-1.72-1.76-.63-3.43-1.52-3.43-3.6 0-2.42 2.01-3.6 4.39-3.71l.25-1.23a.48.48 0 01.48-.38h1.78l.1.01c.26.06.43.31.37.57l-.27 1.37c.9.3 1.75.77 2.48 1.39l.02.02c.19.2.19.5 0 .68z\"],\"color\":\"#00C244\"},{\"id\":\"brand-venmo\",\"label\":\"Venmo\",\"set\":\"brand\",\"paths\":[\"M21.772 13.119c-.267 0-.381-.251-.38-.655 0-.533.121-1.575.712-1.575.267 0 .357.243.357.598 0 .533-.13 1.632-.689 1.632Zm.502-3.377c-1.677 0-2.405 1.285-2.405 2.658 0 1.042.421 1.874 1.693 1.874 1.717 0 2.438-1.406 2.438-2.763 0-1.025-.462-1.769-1.726-1.769Zm-3.833 0c-.558 0-.964.17-1.393.477-.154-.275-.462-.477-.932-.477-.542 0-.947.219-1.247.437l-.04-.364H13.54l-.688 4.354h1.506l.479-3.053c.129-.065.323-.154.518-.154.145 0 .267.049.267.267 0 .056-.016.145-.024.218l-.429 2.722h1.498l.478-3.053c.138-.073.324-.154.51-.154.146 0 .268.049.268.267 0 .056-.017.145-.025.218l-.429 2.722h1.499l.461-2.908c.025-.153.049-.388.049-.549 0-.582-.267-.97-1.037-.97Zm-6.871 0c-.575 0-.98.219-1.287.421l-.017-.348H8.962l-.689 4.354H9.78l.478-3.053c.13-.065.324-.154.518-.154.147 0 .268.049.268.242 0 .081-.024.227-.032.299l-.422 2.666h1.499l.462-2.908c.024-.153.049-.388.049-.549 0-.582-.268-.97-1.03-.97Zm-5.631 1.834c.041-.485.413-.824.697-.824.162 0 .299.097.299.291 0 .404-.713.533-.996.533Zm.843-1.834c-1.604 0-2.382 1.39-2.382 2.698 0 1.01.478 1.817 1.814 1.817.527 0 1.07-.113 1.418-.282l.186-1.26c-.494.25-.874.347-1.271.347-.365 0-.64-.194-.64-.687.826-.008 2.252-.347 2.252-1.453 0-.687-.494-1.18-1.377-1.18Zm-4.239.267c.089.186.146.412.146.743 0 .606-.429 1.494-.777 2.06l-.373-2.989L0 9.969l.705 4.2h1.757c.77-1.01 1.718-2.448 1.718-3.554 0-.347-.073-.622-.235-.889l-1.402.283Z\"],\"color\":\"#008CFF\"},{\"id\":\"brand-alipay\",\"label\":\"Alipay\",\"set\":\"brand\",\"paths\":[\"M19.695 15.07c3.426 1.158 4.203 1.22 4.203 1.22V3.846c0-2.124-1.705-3.845-3.81-3.845H3.914C1.808.001.102 1.722.102 3.846v16.31c0 2.123 1.706 3.845 3.813 3.845h16.173c2.105 0 3.81-1.722 3.81-3.845v-.157s-6.19-2.602-9.315-4.119c-2.096 2.602-4.8 4.181-7.607 4.181-4.75 0-6.361-4.19-4.112-6.949.49-.602 1.324-1.175 2.617-1.497 2.025-.502 5.247.313 8.266 1.317a16.796 16.796 0 0 0 1.341-3.302H5.781v-.952h4.799V6.975H4.77v-.953h5.81V3.591s0-.409.411-.409h2.347v2.84h5.744v.951h-5.744v1.704h4.69a19.453 19.453 0 0 1-1.986 5.06c1.424.52 2.702 1.011 3.654 1.333m-13.81-2.032c-.596.06-1.71.325-2.321.869-1.83 1.608-.735 4.55 2.968 4.55 2.151 0 4.301-1.388 5.99-3.61-2.403-1.182-4.438-2.028-6.637-1.809\"],\"color\":\"#1677FF\"},{\"id\":\"brand-wechat\",\"label\":\"WeChat\",\"set\":\"brand\",\"paths\":[\"M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.12 2.361-.336a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z\"],\"color\":\"#07C160\"},{\"id\":\"brand-americanexpress\",\"label\":\"American Express\",\"set\":\"brand\",\"paths\":[\"M16.015 14.378c0-.32-.135-.496-.344-.622-.21-.12-.464-.135-.81-.135h-1.543v2.82h.675v-1.027h.72c.24 0 .39.024.478.125.12.13.104.38.104.55v.35h.66v-.555c-.002-.25-.017-.376-.108-.516-.06-.08-.18-.18-.33-.234l.02-.008c.18-.072.48-.297.48-.747zm-.87.407l-.028-.002c-.09.053-.195.058-.33.058h-.81v-.63h.824c.12 0 .24 0 .33.05.098.048.156.147.15.255 0 .12-.045.215-.134.27zM20.297 15.837H19v.6h1.304c.676 0 1.05-.278 1.05-.884 0-.28-.066-.448-.187-.582-.153-.133-.392-.193-.73-.207l-.376-.015c-.104 0-.18 0-.255-.03-.09-.03-.15-.105-.15-.21 0-.09.017-.166.09-.21.083-.046.177-.066.272-.06h1.23v-.602h-1.35c-.704 0-.958.437-.958.84 0 .9.776.855 1.407.87.104 0 .18.015.225.06.046.03.082.106.082.18 0 .077-.035.15-.08.18-.06.053-.15.07-.277.07zM0 0v10.096L.81 8.22h1.75l.225.464V8.22h2.043l.45 1.02.437-1.013h6.502c.295 0 .56.057.756.236v-.23h1.787v.23c.307-.17.686-.23 1.12-.23h2.606l.24.466v-.466h1.918l.254.465v-.466h1.858v3.948H20.87l-.36-.6v.585h-2.353l-.256-.63h-.583l-.27.614h-1.213c-.48 0-.84-.104-1.08-.24v.24h-2.89v-.884c0-.12-.03-.12-.105-.135h-.105v1.036H6.067v-.48l-.21.48H4.69l-.202-.48v.465H2.235l-.256-.624H1.4l-.256.624H0V24h23.786v-7.108c-.27.135-.613.18-.973.18H21.09v-.255c-.21.165-.57.255-.914.255H14.71v-.9c0-.12-.018-.12-.12-.12h-.075v1.022h-1.8v-1.066c-.298.136-.643.15-.928.136h-.214v.915h-2.18l-.54-.617-.57.6H4.742v-3.93h3.61l.518.602.554-.6h2.412c.28 0 .74.03.942.225v-.24h2.177c.202 0 .644.045.903.225v-.24h3.265v.24c.163-.164.508-.24.803-.24h1.89v.24c.194-.15.464-.24.84-.24h1.176V0H0zM21.156 14.955c.004.005.006.012.01.016.01.01.024.01.032.02l-.042-.035zM23.828 13.082h.065v.555h-.065zM23.865 15.03v-.005c-.03-.025-.046-.048-.075-.07-.15-.153-.39-.215-.764-.225l-.36-.012c-.12 0-.194-.007-.27-.03-.09-.03-.15-.105-.15-.21 0-.09.03-.16.09-.204.076-.045.15-.05.27-.05h1.223v-.588h-1.283c-.69 0-.96.437-.96.84 0 .9.78.855 1.41.87.104 0 .18.015.224.06.046.03.076.106.076.18 0 .07-.034.138-.09.18-.045.056-.136.07-.27.07h-1.288v.605h1.287c.42 0 .734-.118.9-.36h.03c.09-.134.135-.3.135-.523 0-.24-.045-.39-.135-.526zM18.597 14.208v-.583h-2.235V16.458h2.235v-.585h-1.57v-.57h1.533v-.584h-1.532v-.51M13.51 8.787h.685V11.6h-.684zM13.126 9.543l-.007.006c0-.314-.13-.5-.34-.624-.217-.125-.47-.135-.81-.135H10.43v2.82h.674v-1.034h.72c.24 0 .39.03.487.12.122.136.107.378.107.548v.354h.677v-.553c0-.25-.016-.375-.11-.516-.09-.107-.202-.19-.33-.237.172-.07.472-.3.472-.75zm-.855.396h-.015c-.09.054-.195.056-.33.056H11.1v-.623h.825c.12 0 .24.004.33.05.09.04.15.128.15.25s-.047.22-.134.266zM15.92 9.373h.632v-.6h-.644c-.464 0-.804.105-1.02.33-.286.3-.362.69-.362 1.11 0 .512.123.833.36 1.074.232.238.645.31.97.31h.78l.255-.627h1.39l.262.627h1.36v-2.11l1.272 2.11h.95l.002.002V8.786h-.684v1.963l-1.18-1.96h-1.02V11.4L18.11 8.744h-1.004l-.943 2.22h-.3c-.177 0-.362-.03-.468-.134-.125-.15-.186-.36-.186-.662 0-.285.08-.51.194-.63.133-.135.272-.165.516-.165zm1.668-.108l.464 1.118v.002h-.93l.466-1.12zM2.38 10.97l.254.628H4V9.393l.972 2.205h.584l.973-2.202.015 2.202h.69v-2.81H6.118l-.807 1.904-.876-1.905H3.343v2.663L2.205 8.787h-.997L.01 11.597h.72l.26-.626h1.39zm-.688-1.705l.46 1.118-.003.002h-.915l.457-1.12zM11.856 13.62H9.714l-.85.923-.825-.922H5.346v2.82H8l.855-.932.824.93h1.302v-.94h.838c.6 0 1.17-.164 1.17-.945l-.006-.003c0-.78-.598-.93-1.128-.93zM7.67 15.853l-.014-.002H6.02v-.557h1.47v-.574H6.02v-.51H7.7l.733.82-.764.824zm2.642.33l-1.03-1.147 1.03-1.108v2.253zm1.553-1.258h-.885v-.717h.885c.24 0 .42.098.42.344 0 .243-.15.372-.42.372zM9.967 9.373v-.586H7.73V11.6h2.237v-.58H8.4v-.564h1.527V9.88H8.4v-.507\"],\"color\":\"#2E77BC\"},{\"id\":\"brand-discover\",\"label\":\"Discover\",\"set\":\"brand\",\"paths\":[\"M14.58 12a2.023 2.023 0 1 1-2.025-2.023h.002c1.118 0 2.023.906 2.023 2.023zm-5.2-2.001c-1.124 0-2.025.884-2.025 1.99 0 1.118.878 1.984 2.007 1.984.319 0 .593-.063.93-.221v-.873c-.296.297-.559.416-.895.416-.747 0-1.277-.542-1.277-1.312 0-.73.547-1.306 1.243-1.306.354 0 .622.126.93.428v-.873a1.898 1.898 0 0 0-.913-.233zm-3.352 1.545c-.445-.165-.576-.273-.576-.479 0-.239.233-.422.553-.422.222 0 .405.091.598.308l.388-.508a1.665 1.665 0 0 0-1.117-.422c-.673 0-1.186.467-1.186 1.089 0 .524.239.792.936 1.043.291.103.438.171.513.217a.456.456 0 0 1 .222.394c0 .308-.245.536-.576.536-.354 0-.639-.177-.809-.507l-.479.461c.342.502.752.724 1.317.724.771 0 1.311-.513 1.311-1.249-.002-.603-.252-.876-1.095-1.185zM24 10.3a.29.29 0 0 1-.288.291.29.29 0 0 1-.291-.291v-.003A.29.29 0 1 1 24 10.3zm-.059.001a.235.235 0 0 0-.231-.239.234.234 0 0 0-.232.239c0 .132.104.239.232.239a.235.235 0 0 0 .231-.239zM3.472 13.887h.742v-3.803h-.742v3.803zm12.702-1.248l-1.014-2.554h-.81l1.614 3.9h.399l1.643-3.9h-.804l-1.028 2.554zm2.166 1.248h2.104v-.644h-1.362v-1.027h1.312v-.644h-1.312v-.844h1.362v-.644H18.34v3.803zm5.409-3.557l.11.138h-.097l-.094-.13v.13h-.08v-.334h.107c.081 0 .126.036.126.103.001.046-.025.08-.072.093zm-.006-.092c0-.029-.021-.043-.06-.043h-.014v.087h.014c.039 0 .06-.014.06-.044zm-1.228 2.047l1.197 1.602H22.8l-1.027-1.528h-.097v1.528h-.741v-3.803h1.1c.855 0 1.346.411 1.346 1.123 0 .583-.308.965-.866 1.078zm.103-1.038c0-.37-.251-.563-.713-.563h-.228v1.152h.217c.473-.001.724-.207.724-.589zm-19.487.742a1.91 1.91 0 0 1-.69 1.46c-.365.303-.781.439-1.357.439H.001v-3.803H1.09c1.202 0 2.041.781 2.041 1.904zm-.764-.006c0-.364-.154-.718-.411-.947-.245-.222-.536-.308-1.015-.308H.742v2.515h.199c.479 0 .782-.092 1.015-.302.256-.228.411-.593.411-.958z\"],\"color\":\"#FF6000\"},{\"id\":\"brand-sepa\",\"label\":\"SEPA\",\"set\":\"brand\",\"paths\":[\"M12.553 8.72v6.56h1.766v-1.694h1.052l.293-.01c.579-.009.907-.02.984-.033.656-.086 1.09-.418 1.3-.994.106-.29.16-.769.16-1.434 0-.553-.049-.968-.145-1.243-.185-.524-.548-.871-1.09-1.04-.236-.074-.58-.111-1.031-.111zm6.79 0l-1.971 6.56h1.826l.317-1.134h2.36l.337 1.133H24l-1.995-6.558zm-9.339.031a3.36 3.36 0 0 0-1.888.574 3.272 3.272 0 0 0-1.199 1.455h-.742l-.464.996h.969a3.17 3.17 0 0 0 .004.526h-.467l-.465.995H6.94a3.333 3.333 0 0 0 3.064 1.973 3.37 3.37 0 0 0 1.876-.564l.013-.009v-1.241l-.05.056a2.293 2.293 0 0 1-3.618-.215h2.396l.465-.995H7.838a2.356 2.356 0 0 1-.012-.526h3.505l.008-.017.438-.939.019-.04H8.154a2.308 2.308 0 0 1 1.963-1.108c.694 0 1.344.31 1.783.85l.028.035.409-.875-.015-.014a3.359 3.359 0 0 0-2.318-.917zm-7.2.004c-.439 0-.837.016-1.196.048-.43.034-.785.15-1.062.348a1.082 1.082 0 0 0-.41.565c-.086.248-.128.578-.128.99 0 .54.079.943.236 1.21.179.314.537.52 1.074.621.205.035.57.071 1.094.109.654.044 1.02.078 1.098.103.211.063.316.239.316.528a1.1 1.1 0 0 1-.037.315.48.48 0 0 1-.298.287c-.084.032-.281.048-.589.048h-.604a.963.963 0 0 1-.41-.09c-.164-.081-.246-.264-.246-.549v-.136H0c0 .533.04.915.118 1.143.142.412.435.685.879.82.362.11 1.003.164 1.922.164.551 0 .96-.025 1.228-.075.64-.12 1.05-.404 1.233-.853.101-.245.151-.632.151-1.16 0-.23-.01-.435-.033-.617a1.186 1.186 0 0 0-.355-.74c-.252-.242-.66-.392-1.22-.448-.177-.019-.62-.052-1.33-.1l-.331-.023a.768.768 0 0 1-.35-.094c-.124-.075-.185-.233-.185-.471 0-.264.07-.435.208-.514.139-.079.423-.118.852-.118.441 0 .71.068.808.205.063.092.095.272.095.542h1.642c.01-.145.016-.253.016-.326 0-.884-.357-1.421-1.072-1.613-.293-.079-.784-.119-1.473-.119zm17.894 1.27l.827 2.843h-1.63zm-6.38.13h1.116c.18 0 .294.004.342.01.24.042.393.157.456.345.045.134.067.34.067.617a2.9 2.9 0 0 1-.033.512c-.035.172-.105.287-.21.344-.076.042-.288.069-.637.082h-1.1Z\"],\"color\":\"#2350A9\"},{\"id\":\"brand-westernunion\",\"label\":\"Western Union\",\"set\":\"brand\",\"paths\":[\"M15.799 5.188h5.916L24 9.155l-4.643 8.043c-1.246 2.153-3.28 2.153-4.526 0L7.893 5.188h5.919l4.273 7.39a1.127 1.127 0 0 0 1.981.002l-4.267-7.392ZM0 5.188h5.921l6.237 10.802-.697 1.204c-1.246 2.153-3.285 2.153-4.531 0L0 5.188Z\"],\"color\":\"#FFDD00\"},{\"id\":\"brand-mercadopago\",\"label\":\"Mercado Pago\",\"set\":\"brand\",\"paths\":[\"M11.115 16.479a.93.927 0 0 1-.939-.886c-.002-.042-.006-.155-.103-.155-.04 0-.074.023-.113.059-.112.103-.254.206-.46.206a.816.814 0 0 1-.305-.066c-.535-.214-.542-.578-.521-.725.006-.038.007-.08-.02-.11l-.032-.03h-.034c-.027 0-.055.012-.093.039a.788.786 0 0 1-.454.16.7.699 0 0 1-.253-.05c-.708-.27-.65-.928-.617-1.126.005-.041-.005-.072-.03-.092l-.05-.04-.047.043a.728.726 0 0 1-.505.203.73.728 0 0 1-.732-.725c0-.4.328-.722.732-.722.364 0 .675.27.721.63l.026.195.11-.165c.01-.018.307-.46.852-.46.102 0 .21.016.316.05.434.13.508.52.519.68.008.094.075.1.09.1.037 0 .064-.024.083-.045a.746.744 0 0 1 .54-.225c.128 0 .263.03.402.09.69.293.379 1.158.374 1.167-.058.144-.061.207-.005.244l.027.013h.02c.03 0 .07-.014.134-.035.093-.032.235-.08.367-.08a.944.942 0 0 1 .94.93.936.934 0 0 1-.94.928zm7.302-4.171c-1.138-.98-3.768-3.24-4.481-3.77-.406-.302-.685-.462-.928-.533a1.559 1.554 0 0 0-.456-.07c-.182 0-.376.032-.58.095-.46.145-.918.505-1.362.854l-.023.018c-.414.324-.84.66-1.164.73a1.986 1.98 0 0 1-.43.049c-.362 0-.687-.104-.81-.258-.02-.025-.007-.066.04-.125l.008-.008 1-1.067c.783-.774 1.525-1.506 3.23-1.545h.085c1.062 0 2.12.469 2.24.524a7.03 7.03 0 0 0 3.056.724c1.076 0 2.188-.263 3.354-.795a9.135 9.11 0 0 0-.405-.317c-1.025.44-2.003.66-2.946.66-.962 0-1.925-.229-2.858-.68-.05-.022-1.22-.567-2.44-.57-.032 0-.065 0-.096.002-1.434.033-2.24.536-2.782.976-.528.013-.982.138-1.388.25-.361.1-.673.186-.979.185-.125 0-.35-.01-.37-.012-.35-.01-2.115-.437-3.518-.962-.143.1-.28.203-.415.31 1.466.593 3.25 1.053 3.812 1.089.157.01.323.027.491.027.372 0 .744-.103 1.104-.203.213-.059.446-.123.692-.17l-.196.194-1.017 1.087c-.08.08-.254.294-.14.557a.705.703 0 0 0 .268.292c.243.162.677.27 1.08.271.152 0 .297-.015.43-.044.427-.095.874-.448 1.349-.82.377-.296.913-.672 1.323-.782a1.494 1.49 0 0 1 .37-.05.611.61 0 0 1 .095.005c.27.034.533.125 1.003.472.835.62 4.531 3.815 4.566 3.846.002.002.238.203.22.537-.007.186-.11.352-.294.466a.902.9 0 0 1-.484.15.804.802 0 0 1-.428-.124c-.014-.01-1.28-1.157-1.746-1.543-.074-.06-.146-.115-.22-.115a.122.122 0 0 0-.096.045c-.073.09.01.212.105.294l1.48 1.47c.002 0 .184.17.204.395.012.244-.106.447-.35.606a.957.955 0 0 1-.526.171.766.764 0 0 1-.42-.127l-.214-.206a21.035 20.978 0 0 0-1.08-1.009c-.072-.058-.148-.112-.221-.112a.127.127 0 0 0-.094.038c-.033.037-.056.103.028.212a.698.696 0 0 0 .075.083l1.078 1.198c.01.01.222.26.024.511l-.038.048a1.18 1.178 0 0 1-.1.096c-.184.15-.43.164-.527.164a.8.798 0 0 1-.147-.012c-.106-.018-.178-.048-.212-.089l-.013-.013c-.06-.06-.602-.609-1.054-.98-.059-.05-.133-.11-.21-.11a.128.128 0 0 0-.096.042c-.09.096.044.24.1.293l.92 1.003a.204.204 0 0 1-.033.062c-.033.044-.144.155-.479.196a.91.907 0 0 1-.122.007c-.345 0-.712-.164-.902-.264a1.343 1.34 0 0 0 .13-.576 1.368 1.365 0 0 0-1.42-1.357c.024-.342-.025-.99-.697-1.274a1.455 1.452 0 0 0-.575-.125c-.146 0-.287.025-.42.075a1.153 1.15 0 0 0-.671-.564 1.52 1.515 0 0 0-.494-.085c-.28 0-.537.08-.767.242a1.168 1.165 0 0 0-.903-.43 1.173 1.17 0 0 0-.82.335c-.287-.217-1.425-.93-4.467-1.613a17.39 17.344 0 0 1-.692-.189 4.822 4.82 0 0 0-.077.494l.67.157c3.108.682 4.136 1.391 4.309 1.525a1.145 1.142 0 0 0-.09.442 1.16 1.158 0 0 0 1.378 1.132c.096.467.406.821.879 1.003a1.165 1.162 0 0 0 .415.08c.09 0 .179-.012.266-.034.086.22.282.493.722.668a1.233 1.23 0 0 0 .457.094c.122 0 .241-.022.355-.063a1.373 1.37 0 0 0 1.269.841c.37.002.726-.147.985-.41.221.121.688.341 1.163.341.06 0 .118-.002.175-.01.47-.059.689-.24.789-.382a.571.57 0 0 0 .048-.078c.11.032.234.058.373.058.255 0 .501-.086.75-.265.244-.174.418-.424.444-.637v-.01c.083.017.167.026.251.026.265 0 .527-.082.773-.242.48-.31.562-.715.554-.98a1.28 1.279 0 0 0 .978-.194 1.04 1.04 0 0 0 .502-.808 1.088 1.085 0 0 0-.16-.653c.804-.342 2.636-1.003 4.795-1.483a4.734 4.721 0 0 0-.067-.492 27.742 27.667 0 0 0-5.049 1.62zm5.123-.763c0 4.027-5.166 7.293-11.537 7.293-6.372 0-11.538-3.266-11.538-7.293 0-4.028 5.165-7.293 11.539-7.293 6.371 0 11.537 3.265 11.537 7.293zm.46.004c0-4.272-5.374-7.755-12-7.755S.002 7.277.002 11.55L0 12.004c0 4.533 4.695 8.203 11.999 8.203 7.347 0 12-3.67 12-8.204z\"],\"color\":\"#00B1EA\"},{\"id\":\"brand-coinbase\",\"label\":\"Coinbase\",\"set\":\"crypto\",\"paths\":[\"M4.844 11.053c-.872 0-1.553.662-1.553 1.548s.664 1.542 1.553 1.542c.889 0 1.564-.667 1.564-1.547 0-.875-.664-1.543-1.564-1.543zm.006 2.452c-.497 0-.86-.386-.86-.904 0-.523.357-.909.854-.909.502 0 .866.392.866.91 0 .517-.364.903-.86.903zm1.749-1.778h.433v2.36h.693V11.11H6.599zm-5.052-.035c.364 0 .653.224.762.558h.734c-.133-.713-.722-1.197-1.49-1.197-.872 0-1.553.662-1.553 1.548 0 .887.664 1.543 1.553 1.543.75 0 1.351-.484 1.484-1.203h-.728a.78.78 0 01-.756.564c-.502 0-.855-.386-.855-.904 0-.523.347-.909.85-.909zm18.215.622l-.508-.075c-.242-.035-.415-.115-.415-.305 0-.207.225-.31.53-.31.336 0 .55.143.595.379h.67c-.075-.599-.537-.95-1.247-.95-.733 0-1.218.375-1.218.904 0 .506.317.8.958.892l.508.075c.249.034.387.132.387.316 0 .236-.242.334-.577.334-.41 0-.641-.167-.676-.42h-.681c.064.581.52.99 1.35.99.757 0 1.26-.346 1.26-.938 0-.53-.364-.806-.936-.892zM7.378 9.885a.429.429 0 00-.444.437c0 .254.19.438.444.438a.429.429 0 00.445-.438.429.429 0 00-.445-.437zm10.167 2.245c0-.645-.392-1.076-1.224-1.076-.785 0-1.224.397-1.31 1.007h.687c.035-.236.22-.432.612-.432.352 0 .525.155.525.345 0 .248-.317.311-.71.351-.531.058-1.19.242-1.19.933 0 .535.4.88 1.034.88.497 0 .809-.207.965-.535.023.293.242.483.548.483h.404v-.616h-.34v-1.34zm-.68.748c0 .397-.347.69-.769.69-.26 0-.48-.11-.48-.34 0-.293.353-.373.676-.408.312-.028.485-.097.572-.23zm-3.679-1.825c-.386 0-.71.162-.94.432V9.856h-.693v4.23h.68v-.391c.232.282.56.449.953.449.832 0 1.461-.656 1.461-1.543 0-.886-.64-1.548-1.46-1.548zm-.103 2.452c-.497 0-.86-.386-.86-.904 0-.517.369-.909.865-.909.503 0 .855.386.855.91 0 .517-.364.903-.86.903zm-3.187-2.452c-.45 0-.745.184-.919.443v-.385H8.29v2.975h.693v-1.617c0-.455.289-.777.716-.777.398 0 .647.282.647.69v1.704h.692v-1.755c0-.748-.386-1.278-1.142-1.278zM24 12.503c0-.851-.624-1.45-1.46-1.45-.89 0-1.542.668-1.542 1.548 0 .927.698 1.543 1.553 1.543.722 0 1.287-.426 1.432-1.03h-.722c-.104.264-.358.414-.699.414-.445 0-.78-.276-.854-.76H24v-.264zm-2.252-.23c.11-.414.422-.615.78-.615.392 0 .693.224.762.615Z\"],\"color\":\"#0052FF\"},{\"id\":\"brand-okx\",\"label\":\"OKX\",\"set\":\"crypto\",\"paths\":[\"M 7.15 8.685 C 7.18 8.705 7.2 8.745 7.2 8.785 L 7.2 15.225 C 7.2 15.265 7.18 15.305 7.15 15.325 C 7.121 15.355 7.082 15.372 7.04 15.375 L 0.16 15.375 C 0.118 15.372 0.079 15.355 0.05 15.325 C 0.02 15.3 0.002 15.264 0 15.225 L 0 8.785 C 0 8.745 0.02 8.705 0.05 8.685 C 0.079 8.655 0.118 8.638 0.16 8.635 L 7.04 8.635 C 7.08 8.635 7.12 8.655 7.15 8.685 Z M 4.8 11.035 C 4.798 10.996 4.78 10.96 4.75 10.935 C 4.721 10.905 4.682 10.887 4.64 10.885 L 2.56 10.885 C 2.52 10.885 2.481 10.899 2.45 10.925 C 2.42 10.95 2.402 10.986 2.4 11.025 L 2.4 12.975 C 2.4 13.015 2.42 13.055 2.45 13.075 C 2.48 13.115 2.52 13.125 2.56 13.125 L 4.64 13.125 C 4.68 13.125 4.72 13.115 4.75 13.085 C 4.78 13.06 4.798 13.024 4.8 12.985 L 4.8 11.035 Z M 21.6 11.035 L 21.6 12.975 C 21.6 13.065 21.53 13.125 21.44 13.125 L 19.36 13.125 C 19.27 13.125 19.2 13.065 19.2 12.975 L 19.2 11.035 C 19.2 10.955 19.27 10.885 19.36 10.885 L 21.44 10.885 C 21.53 10.885 21.6 10.945 21.6 11.035 Z M 19.2 8.785 L 19.2 10.735 C 19.2 10.815 19.13 10.885 19.04 10.885 L 16.96 10.885 C 16.87 10.885 16.8 10.815 16.8 10.735 L 16.8 8.785 C 16.8 8.705 16.87 8.635 16.96 8.635 L 19.04 8.635 C 19.13 8.635 19.2 8.705 19.2 8.785 Z M 24 8.785 L 24 10.735 C 24 10.815 23.93 10.885 23.84 10.885 L 21.76 10.885 C 21.67 10.885 21.6 10.815 21.6 10.735 L 21.6 8.785 C 21.6 8.705 21.67 8.635 21.76 8.635 L 23.84 8.635 C 23.93 8.635 24 8.705 24 8.785 Z M 19.2 13.285 L 19.2 15.225 C 19.2 15.305 19.13 15.375 19.04 15.375 L 16.96 15.375 C 16.87 15.375 16.8 15.305 16.8 15.225 L 16.8 13.275 C 16.8 13.195 16.87 13.125 16.96 13.125 L 19.04 13.125 C 19.13 13.125 19.2 13.195 19.2 13.275 L 19.2 13.285 Z M 24 13.285 L 24 15.225 C 24 15.305 23.93 15.375 23.84 15.375 L 21.76 15.375 C 21.67 15.375 21.6 15.305 21.6 15.225 L 21.6 13.275 C 21.6 13.195 21.67 13.125 21.76 13.125 L 23.84 13.125 C 23.93 13.125 24 13.195 24 13.275 L 24 13.285 Z M 15.6 8.785 L 15.6 10.735 C 15.6 10.815 15.53 10.885 15.44 10.885 L 13.36 10.885 C 13.27 10.885 13.2 10.815 13.2 10.735 L 13.2 8.785 C 13.2 8.705 13.27 8.635 13.36 8.635 L 15.44 8.635 C 15.53 8.635 15.6 8.705 15.6 8.785 Z M 15.6 13.285 L 15.6 15.225 C 15.6 15.305 15.53 15.375 15.44 15.375 L 13.36 15.375 C 13.27 15.375 13.2 15.305 13.2 15.225 L 13.2 13.275 C 13.2 13.195 13.27 13.125 13.36 13.125 L 15.44 13.125 C 15.53 13.125 15.6 13.195 15.6 13.275 L 15.6 13.285 Z M 13.2 12.985 C 13.195 13.069 13.125 13.135 13.04 13.135 L 10.8 13.135 L 10.8 15.215 C 10.8 15.255 10.78 15.295 10.75 15.325 C 10.719 15.351 10.68 15.365 10.64 15.365 L 8.56 15.365 C 8.516 15.368 8.473 15.353 8.44 15.325 C 8.414 15.298 8.399 15.262 8.4 15.225 L 8.4 8.775 C 8.4 8.735 8.41 8.695 8.44 8.675 C 8.472 8.643 8.515 8.625 8.56 8.625 L 10.64 8.625 C 10.68 8.625 10.72 8.645 10.75 8.675 C 10.78 8.695 10.8 8.735 10.8 8.775 L 10.8 10.875 L 13.04 10.875 C 13.08 10.875 13.12 10.885 13.15 10.915 C 13.18 10.945 13.2 10.985 13.2 11.015 L 13.2 12.965 L 13.2 12.985 Z\"],\"color\":\"#000000\"},{\"id\":\"brand-kucoin\",\"label\":\"KuCoin\",\"set\":\"crypto\",\"paths\":[\"m7.928 11.996 7.122 7.122 4.49-4.49a2.004 2.004 0 0 1 2.865 0 2.004 2.004 0 0 1 0 2.865l-5.918 5.918a2.058 2.058 0 0 1-2.883 0l-8.541-8.542v5.07a2.034 2.034 0 1 1-4.07 0V4.043a2.034 2.034 0 1 1 4.07 0v5.088L13.604.589a2.058 2.058 0 0 1 2.883 0l5.918 5.918c.785.803.785 2.088 0 2.865-.804.785-2.089.785-2.865 0l-4.49-4.49zM15.05 9.96a2.038 2.038 0 0 0-2.053 2.035c0 1.133.902 2.052 2.035 2.052a2.038 2.038 0 0 0 2.053-2.035v-.018a2.07 2.07 0 0 0-2.035-2.034z\"],\"color\":\"#01BC8D\"},{\"id\":\"brand-ton\",\"label\":\"TON\",\"set\":\"crypto\",\"paths\":[\"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zM7.902 6.697h8.196c1.505 0 2.462 1.628 1.705 2.94l-5.059 8.765a.86.86 0 0 1-1.488 0L6.199 9.637c-.758-1.314.197-2.94 1.703-2.94zm4.844 1.496v7.58l1.102-2.128 2.656-4.756a.465.465 0 0 0-.408-.696h-3.35zM7.9 8.195a.464.464 0 0 0-.408.694l2.658 4.754 1.102 2.13V8.195H7.9z\"],\"color\":\"#0098EA\"},{\"id\":\"brand-n26\",\"label\":\"N26\",\"set\":\"brand\",\"paths\":[\"M0 3.803v1.195h7.436V3.803H0zM12.69 7.29c-2.034 0-3.038 1.252-3.038 2.684 0 .234.027.468.092.728l1.393.135a3.697 3.697 0 0 1-.09-.793c0-1.072.71-1.586 1.598-1.586.866 0 1.507.485 1.507 1.652 0 1.186-.58 1.995-1.464 2.88-.925.923-2.4 2.027-3.112 2.534v1.092h6.135v-1.195h-4.168c.695-.48 1.69-1.279 2.133-1.72.502-.503 1.931-1.794 1.931-3.636 0-1.903-1.24-2.775-2.918-2.775zm8.34 0c-1.976 0-3.454 1.517-3.454 4.916 0 3.017 1.233 4.508 3.356 4.508 1.754 0 3.068-1.198 3.068-3.172 0-1.542-.823-3.066-2.793-3.066-1.1 0-1.884.51-2.281 1.263 0-1.78.62-3.33 2.094-3.33.937 0 1.309.538 1.507 1.422l1.366-.271c-.321-1.527-1.292-2.27-2.864-2.27zM.075 7.389v9.228h1.33v-6.312c0-.56-.013-.898-.039-1.223h.026c.136.372.298.699.539 1.123l3.732 6.412h1.69V7.39H6.04v6.31c0 .56.013.898.04 1.223h-.028a7.252 7.252 0 0 0-.537-1.123L1.783 7.389H.076zm20.817 4.185c1.114 0 1.744.822 1.744 1.992 0 1.256-.717 2.034-1.701 2.034-1.09 0-1.843-1.001-1.973-2.329.33-1.133 1.063-1.697 1.93-1.697zM0 19.008v1.19h7.436v-1.19H0z\"],\"color\":\"#48AC98\"},{\"id\":\"brand-monzo\",\"label\":\"Monzo\",\"set\":\"brand\",\"paths\":[\"M4.244 1.174a.443.443 0 00-.271.13l-3.97 3.97-.001.001c3.884 3.882 8.093 8.092 11.748 11.748v-8.57L4.602 1.305a.443.443 0 00-.358-.131zm15.483 0a.443.443 0 00-.329.13L12.25 8.456v8.568L24 5.275c-1.316-1.322-2.647-2.648-3.97-3.97a.443.443 0 00-.301-.131zM0 5.979l.002 10.955c0 .294.118.577.326.785l4.973 4.976c.28.282.76.083.758-.314V12.037zm23.998.003l-6.06 6.061v10.338c-.004.399.48.6.76.314l4.974-4.976c.208-.208.326-.49.326-.785z\"],\"color\":\"#14233C\"},{\"id\":\"brand-g2a\",\"label\":\"G2A\",\"set\":\"brand\",\"paths\":[\"M24 15.419s-1.8844-3.5895-3.1571-6.0153a1.6802 1.6802 0 0 0-.4674-.5659 1.3021 1.3021 0 0 0-.7927-.2572 1.239 1.239 0 0 0-.7715.2572 1.6802 1.6802 0 0 0-.4674.5659c-1.2726 2.4258-3.1783 6.0153-3.1783 6.0153l1.7391.0004 2.6781-5.1339 1.2586 2.4128h-1.9378l.6832 1.3053h1.9356l.7386 1.4154H24zM3.4872 13.9588c-1.071 0-1.9392-.8682-1.9392-1.9392s.8682-1.9392 1.9392-1.9392l3.9342-.0031V8.6212H3.3946C1.5174 8.6236-.0024 10.1473 0 12.0244c.0024 1.8738 1.5208 3.3922 3.3946 3.3946h4.0268v-4.1277H3.053v1.4571l2.8447-.0001v1.2141l-2.4105-.0036zm7.2305-1.2109 3.0641-.0002c1.1395 0 2.0633-.9238 2.0633-2.0633s-.9238-2.0633-2.0633-2.0633h-3.6463c-.804-.0002-1.4559.6515-1.4561 1.4555v.0006l4.9963-.0001a.6157.6157 0 0 1 .6201.591.6064.6064 0 0 1-.5894.6229l-.0159.0002h-3.185c-1.0725.0004-1.9417.8701-1.9413 1.9426v2.185h5.4523l.7727-1.4566h-4.7014v-.5841a.63.63 0 0 1 .6299-.6302z\"],\"color\":\"#F05F00\"},{\"id\":\"brand-aliexpress\",\"label\":\"AliExpress\",\"set\":\"brand\",\"paths\":[\"M5.166 9.096a.022.022 0 0 0-.022.021c0 .396-.32.717-.713.717a.021.021 0 0 0-.021.022c0 .012.01.021.021.021.394 0 .713.322.713.718 0 .012.01.021.022.021.011 0 .021-.01.021-.021A.717.717 0 0 1 5.9 9.88a.021.021 0 0 0 0-.043.716.716 0 0 1-.713-.718v-.002a.021.021 0 0 0-.006-.015.022.022 0 0 0-.015-.006zm-3.693.526L0 13.462h.48l.355-.922h1.782l.354.922h.481L1.98 9.622zm2.264.002v3.838h.491V9.624zm2.375 0v3.838h2.413v-.502H6.613v-1.19H8.19v-.477H6.613v-1.166h1.773v-.502zm-4.386.592l.698 1.82H1.028zm14.689.402a1.466 1.466 0 0 0-.966.366V10.7h-.491v2.763h.49c.002-.477 0-.955.002-1.433a.969.969 0 0 1 .965-.918zm4.18.007c-.053 0-.105.003-.158.01-.315.031-.606.175-.753.377a.689.689 0 0 0-.14.465c.007.2.066.357.233.496.184.147.42.2.657.259.311.067.426.095.546.186.08.07.133.127.136.27 0 .25-.221.372-.42.41a.89.89 0 0 1-.894-.344l-.371.288c.33.382.777.505 1.09.5.54-.01.891-.217 1.029-.534.066-.153.063-.309.063-.38a.677.677 0 0 0-.267-.545c-.228-.177-.583-.228-.636-.242-.437-.078-.658-.196-.697-.341-.043-.192.102-.35.297-.411a.76.76 0 0 1 .857.277l.367-.247a1.166 1.166 0 0 0-.939-.494zm2.387 0c-.052 0-.105.003-.157.01-.316.031-.607.175-.753.377a.689.689 0 0 0-.14.465c.006.2.065.357.233.496.183.147.42.2.657.259.31.067.426.095.545.186.081.07.134.127.136.27.001.25-.221.372-.42.41a.89.89 0 0 1-.894-.344l-.371.288c.33.382.777.505 1.09.5.541-.01.891-.217 1.03-.534.065-.153.062-.309.062-.38a.677.677 0 0 0-.267-.545c-.227-.177-.583-.228-.636-.242-.437-.078-.658-.196-.696-.341-.043-.192.101-.35.297-.411a.76.76 0 0 1 .857.277l.367-.247a1.167 1.167 0 0 0-.94-.494zm-9.84.002a1.461 1.461 0 0 0-1.42 1.117 1.305 1.305 0 0 0-.041.327v2.833h.491v-1.813c.17.18.487.42.96.454a1.447 1.447 0 0 0 1.208-.627 1.457 1.457 0 0 0-1.199-2.292zm4.804 0a1.448 1.448 0 0 0-1.288 2.08c.255.53.811.87 1.412.833a1.452 1.452 0 0 0 1.012-.51l-.363-.291a.968.968 0 0 1-1.106.273 1.01 1.01 0 0 1-.602-.69h2.239l.002-.427a1.295 1.295 0 0 0-1.306-1.268zm-9.2.08l1.062 1.377-1.062 1.378h.581l.779-1.01.778 1.01h.581l-1.062-1.378 1.062-1.378h-.581l-.778 1.01-.779-1.01zm-3.825.015v2.74h.49v-2.74zm8.233.37a.96.96 0 0 1 .95.993.963.963 0 0 1-.863.998.962.962 0 0 1-1.034-.739c-.074-.382 0-.746.307-1.019a.959.959 0 0 1 .64-.233zm4.79.015a.823.823 0 0 1 .819.755h-1.76a.964.964 0 0 1 .94-.755z\"],\"color\":\"#FF4747\"},{\"id\":\"brand-etsy\",\"label\":\"Etsy\",\"set\":\"brand\",\"paths\":[\"M8.559 2.445c0-.325.033-.52.59-.52h7.465c1.3 0 2.02 1.11 2.54 3.193l.42 1.666h1.27c.23-4.728.43-6.784.43-6.784s-3.196.36-5.09.36H6.635L1.521.196v1.37l1.725.326c1.21.24 1.5.496 1.6 1.606 0 0 .11 3.27.11 8.64 0 5.385-.09 8.61-.09 8.61 0 .973-.39 1.333-1.59 1.573l-1.722.33V24l5.13-.165h8.55c1.935 0 6.39.165 6.39.165.105-1.17.75-6.48.855-7.064h-1.2l-1.284 2.91c-1.005 2.28-2.476 2.445-4.11 2.445h-4.906c-1.63 0-2.415-.64-2.415-2.05V12.8s3.62 0 4.79.096c.912.064 1.463.325 1.76 1.598l.39 1.695h1.41l-.09-4.278.192-4.305h-1.391l-.45 1.89c-.283 1.244-.48 1.47-1.754 1.6-1.666.17-4.815.14-4.815.14V2.45h-.05z\"],\"color\":\"#F16521\"},{\"id\":\"brand-trustpilot\",\"label\":\"Trustpilot\",\"set\":\"brand\",\"paths\":[\"M17.227 16.67l2.19 6.742-7.413-5.388 5.223-1.354zM24 9.31h-9.165L12.005.589l-2.84 8.723L0 9.3l7.422 5.397-2.84 8.714 7.422-5.388 4.583-3.326L24 9.311z\"],\"color\":\"#00B67A\"},{\"id\":\"brand-patreon\",\"label\":\"Patreon\",\"set\":\"brand\",\"paths\":[\"M22.957 7.21c-.004-3.064-2.391-5.576-5.191-6.482-3.478-1.125-8.064-.962-11.384.604C2.357 3.231 1.093 7.391 1.046 11.54c-.039 3.411.302 12.396 5.369 12.46 3.765.047 4.326-4.804 6.068-7.141 1.24-1.662 2.836-2.132 4.801-2.618 3.376-.836 5.678-3.501 5.673-7.031Z\"],\"color\":\"#000000\"},{\"id\":\"brand-kofi\",\"label\":\"Ko-fi\",\"set\":\"brand\",\"paths\":[\"M11.351 2.715c-2.7 0-4.986.025-6.83.26C2.078 3.285 0 5.154 0 8.61c0 3.506.182 6.13 1.585 8.493 1.584 2.701 4.233 4.182 7.662 4.182h.83c4.209 0 6.494-2.234 7.637-4a9.5 9.5 0 0 0 1.091-2.338C21.792 14.688 24 12.22 24 9.208v-.415c0-3.247-2.13-5.507-5.792-5.87-1.558-.156-2.65-.208-6.857-.208m0 1.947c4.208 0 5.09.052 6.571.182 2.624.311 4.13 1.584 4.13 4v.39c0 2.156-1.792 3.844-3.87 3.844h-.935l-.156.649c-.208 1.013-.597 1.818-1.039 2.546-.909 1.428-2.545 3.064-5.922 3.064h-.805c-2.571 0-4.831-.883-6.078-3.195-1.09-2-1.298-4.155-1.298-7.506 0-2.181.857-3.402 3.012-3.714 1.533-.233 3.559-.26 6.39-.26m6.547 2.287c-.416 0-.65.234-.65.546v2.935c0 .311.234.545.65.545 1.324 0 2.051-.754 2.051-2s-.727-2.026-2.052-2.026m-10.39.182c-1.818 0-3.013 1.48-3.013 3.142 0 1.533.858 2.857 1.949 3.897.727.701 1.87 1.429 2.649 1.896a1.47 1.47 0 0 0 1.507 0c.78-.467 1.922-1.195 2.623-1.896 1.117-1.039 1.974-2.364 1.974-3.897 0-1.662-1.247-3.142-3.039-3.142-1.065 0-1.792.545-2.338 1.298-.493-.753-1.246-1.298-2.312-1.298\"],\"color\":\"#FF6433\"},{\"id\":\"brand-buymeacoffee\",\"label\":\"Buy Me A Coffee\",\"set\":\"brand\",\"paths\":[\"M20.216 6.415l-.132-.666c-.119-.598-.388-1.163-1.001-1.379-.197-.069-.42-.098-.57-.241-.152-.143-.196-.366-.231-.572-.065-.378-.125-.756-.192-1.133-.057-.325-.102-.69-.25-.987-.195-.4-.597-.634-.996-.788a5.723 5.723 0 00-.626-.194c-1-.263-2.05-.36-3.077-.416a25.834 25.834 0 00-3.7.062c-.915.083-1.88.184-2.75.5-.318.116-.646.256-.888.501-.297.302-.393.77-.177 1.146.154.267.415.456.692.58.36.162.737.284 1.123.366 1.075.238 2.189.331 3.287.37 1.218.05 2.437.01 3.65-.118.299-.033.598-.073.896-.119.352-.054.578-.513.474-.834-.124-.383-.457-.531-.834-.473-.466.074-.96.108-1.382.146-1.177.08-2.358.082-3.536.006a22.228 22.228 0 01-1.157-.107c-.086-.01-.18-.025-.258-.036-.243-.036-.484-.08-.724-.13-.111-.027-.111-.185 0-.212h.005c.277-.06.557-.108.838-.147h.002c.131-.009.263-.032.394-.048a25.076 25.076 0 013.426-.12c.674.019 1.347.067 2.017.144l.228.031c.267.04.533.088.798.145.392.085.895.113 1.07.542.055.137.08.288.111.431l.319 1.484a.237.237 0 01-.199.284h-.003c-.037.006-.075.01-.112.015a36.704 36.704 0 01-4.743.295 37.059 37.059 0 01-4.699-.304c-.14-.017-.293-.042-.417-.06-.326-.048-.649-.108-.973-.161-.393-.065-.768-.032-1.123.161-.29.16-.527.404-.675.701-.154.316-.199.66-.267 1-.069.34-.176.707-.135 1.056.087.753.613 1.365 1.37 1.502a39.69 39.69 0 0011.343.376.483.483 0 01.535.53l-.071.697-1.018 9.907c-.041.41-.047.832-.125 1.237-.122.637-.553 1.028-1.182 1.171-.577.131-1.165.2-1.756.205-.656.004-1.31-.025-1.966-.022-.699.004-1.556-.06-2.095-.58-.475-.458-.54-1.174-.605-1.793l-.731-7.013-.322-3.094c-.037-.351-.286-.695-.678-.678-.336.015-.718.3-.678.679l.228 2.185.949 9.112c.147 1.344 1.174 2.068 2.446 2.272.742.12 1.503.144 2.257.156.966.016 1.942.053 2.892-.122 1.408-.258 2.465-1.198 2.616-2.657.34-3.332.683-6.663 1.024-9.995l.215-2.087a.484.484 0 01.39-.426c.402-.078.787-.212 1.074-.518.455-.488.546-1.124.385-1.766zm-1.478.772c-.145.137-.363.201-.578.233-2.416.359-4.866.54-7.308.46-1.748-.06-3.477-.254-5.207-.498-.17-.024-.353-.055-.47-.18-.22-.236-.111-.71-.054-.995.052-.26.152-.609.463-.646.484-.057 1.046.148 1.526.22.577.088 1.156.159 1.737.212 2.48.226 5.002.19 7.472-.14.45-.06.899-.13 1.345-.21.399-.072.84-.206 1.08.206.166.281.188.657.162.974a.544.544 0 01-.169.364zm-6.159 3.9c-.862.37-1.84.788-3.109.788a5.884 5.884 0 01-1.569-.217l.877 9.004c.065.78.717 1.38 1.5 1.38 0 0 1.243.065 1.658.065.447 0 1.786-.065 1.786-.065.783 0 1.434-.6 1.499-1.38l.94-9.95a3.996 3.996 0 00-1.322-.238c-.826 0-1.491.284-2.26.613z\"],\"color\":\"#FFDD00\"},{\"id\":\"brand-bluesky\",\"label\":\"Bluesky\",\"set\":\"brand\",\"paths\":[\"M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037-.856 3.061-3.978 3.842-6.755 3.37 4.854.826 6.089 3.562 3.422 6.299-5.065 5.196-7.28-1.304-7.847-2.97-.104-.305-.152-.448-.153-.327 0-.121-.05.022-.153.327-.568 1.666-2.782 8.166-7.847 2.97-2.667-2.737-1.432-5.473 3.422-6.3-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026\"],\"color\":\"#1185FE\"},{\"id\":\"brand-threads\",\"label\":\"Threads\",\"set\":\"brand\",\"paths\":[\"M18.263 11.097c-.03-3.486-1.92-5.586-5.111-5.586-2.13 0-3.922.963-4.863 2.499l2.062 1.438c.535-.843 1.272-1.543 2.628-1.543 1.528 0 2.318.85 2.544 2.431a15 15 0 0 0-2.236-.173c-4.125 0-6.068 1.867-6.068 4.336s1.943 3.99 4.804 3.99c3.139 0 5.013-2.115 5.781-4.735.798.361 1.348 1.204 1.348 2.47 0 3.387-3.907 5.232-7.22 5.232-4.885 0-8.077-3.207-8.077-8.424 0-6.392 4.223-10.487 9.9-10.487 3.808 0 5.69 1.671 6.97 3.914l2.108-1.475C21.44 2.078 18.331 0 13.663 0 6.227 0 1.168 5.277 1.168 12.934c0 7 4.953 11.066 10.856 11.066 4.878 0 9.809-2.846 9.809-7.716 0-2.545-1.46-4.231-3.569-5.187m-6.33 4.855c-1.077 0-2.026-.512-2.026-1.453 0-1.483 1.822-1.934 3.606-1.934.678 0 1.34.045 1.927.173-.422 1.927-1.671 3.215-3.508 3.214Z\"],\"color\":\"#000000\"},{\"id\":\"brand-pinterest\",\"label\":\"Pinterest\",\"set\":\"brand\",\"paths\":[\"M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026L12.017 0z\"],\"color\":\"#BD081C\"},{\"id\":\"brand-signal\",\"label\":\"Signal\",\"set\":\"brand\",\"paths\":[\"M12 0q-.934 0-1.83.139l.17 1.111a11 11 0 0 1 3.32 0l.172-1.111A12 12 0 0 0 12 0M9.152.34A12 12 0 0 0 5.77 1.742l.584.961a10.8 10.8 0 0 1 3.066-1.27zm5.696 0-.268 1.094a10.8 10.8 0 0 1 3.066 1.27l.584-.962A12 12 0 0 0 14.848.34M12 2.25a9.75 9.75 0 0 0-8.539 14.459c.074.134.1.292.064.441l-1.013 4.338 4.338-1.013a.62.62 0 0 1 .441.064A9.7 9.7 0 0 0 12 21.75c5.385 0 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25m-7.092.068a12 12 0 0 0-2.59 2.59l.909.664a11 11 0 0 1 2.345-2.345zm14.184 0-.664.909a11 11 0 0 1 2.345 2.345l.909-.664a12 12 0 0 0-2.59-2.59M1.742 5.77A12 12 0 0 0 .34 9.152l1.094.268a10.8 10.8 0 0 1 1.269-3.066zm20.516 0-.961.584a10.8 10.8 0 0 1 1.27 3.066l1.093-.268a12 12 0 0 0-1.402-3.383M.138 10.168A12 12 0 0 0 0 12q0 .934.139 1.83l1.111-.17A11 11 0 0 1 1.125 12q0-.848.125-1.66zm23.723.002-1.111.17q.125.812.125 1.66c0 .848-.042 1.12-.125 1.66l1.111.172a12.1 12.1 0 0 0 0-3.662M1.434 14.58l-1.094.268a12 12 0 0 0 .96 2.591l-.265 1.14 1.096.255.36-1.539-.188-.365a10.8 10.8 0 0 1-.87-2.35m21.133 0a10.8 10.8 0 0 1-1.27 3.067l.962.584a12 12 0 0 0 1.402-3.383zm-1.793 3.848a11 11 0 0 1-2.345 2.345l.664.909a12 12 0 0 0 2.59-2.59zm-19.959 1.1L.357 21.48a1.8 1.8 0 0 0 2.162 2.161l1.954-.455-.256-1.095-1.953.455a.675.675 0 0 1-.81-.81l.454-1.954zm16.832 1.769a10.8 10.8 0 0 1-3.066 1.27l.268 1.093a12 12 0 0 0 3.382-1.402zm-10.94.213-1.54.36.256 1.095 1.139-.266c.814.415 1.683.74 2.591.961l.268-1.094a10.8 10.8 0 0 1-2.35-.869zm3.634 1.24-.172 1.111a12.1 12.1 0 0 0 3.662 0l-.17-1.111q-.812.125-1.66.125a11 11 0 0 1-1.66-.125\"],\"color\":\"#3B45FD\"},{\"id\":\"brand-battledotnet\",\"label\":\"Battle.net\",\"set\":\"brand\",\"paths\":[\"M18.94 8.296C15.9 6.892 11.534 6 7.426 6.332c.206-1.36.714-2.308 1.548-2.508 1.148-.275 2.4.48 3.594 1.854.782.102 1.71.28 2.355.429C12.747 2.013 9.828-.282 7.607.565c-1.688.644-2.553 2.97-2.448 6.094-2.2.468-3.915 1.3-5.013 2.495-.056.065-.181.227-.137.305.034.058.146-.008.194-.04 1.274-.89 2.904-1.373 5.027-1.676.303 3.333 1.713 7.56 4.055 10.952-1.28.502-2.356.536-2.946-.087-.812-.856-.784-2.318-.19-4.04a26.764 26.764 0 0 1-.807-2.254c-2.459 3.934-2.986 7.61-1.143 9.11 1.402 1.14 3.847.725 6.502-.926 1.505 1.672 3.083 2.74 4.667 3.094.084.015.287.043.332-.034.034-.06-.08-.124-.131-.149-1.408-.657-2.64-1.828-3.964-3.515 2.735-1.929 5.691-5.263 7.457-8.988 1.076.86 1.64 1.773 1.398 2.595-.336 1.131-1.615 1.84-3.403 2.185a27.697 27.697 0 0 1-1.548 1.826c4.634.16 8.08-1.22 8.458-3.565.286-1.786-1.295-3.696-4.053-5.17.696-2.139.832-4.04.346-5.588-.029-.08-.106-.27-.196-.27-.068 0-.067.13-.063.187.135 1.547-.263 3.2-1.062 5.19zm-8.533 9.869c-1.96-3.145-3.09-6.849-3.082-10.594 3.702-.124 7.474.748 10.714 2.627-1.743 3.269-4.385 6.1-7.633 7.966h.001z\"],\"color\":\"#4381C3\"},{\"id\":\"brand-ubisoft\",\"label\":\"Ubisoft\",\"set\":\"brand\",\"paths\":[\"M23.561 11.988C23.301-.304 6.954-4.89.656 6.634c.282.206.661.477.943.672a11.747 11.747 0 00-.976 3.067 11.885 11.885 0 00-.184 2.071C.439 18.818 5.621 24 12.005 24c6.385 0 11.556-5.17 11.556-11.556v-.455zm-20.27 2.06c-.152 1.246-.054 1.636-.054 1.788l-.282.098c-.108-.206-.37-.932-.488-1.908C2.163 10.308 4.7 6.96 8.57 6.33c3.544-.52 6.937 1.68 7.728 4.758l-.282.098c-.087-.087-.228-.336-.77-.878-4.281-4.281-11.002-2.32-11.956 3.74zm11.002 2.081a3.145 3.145 0 01-2.59 1.355 3.15 3.15 0 01-3.155-3.155 3.159 3.159 0 012.927-3.144c1.018-.043 1.972.51 2.416 1.398a2.58 2.58 0 01-.455 2.95c.293.205.575.4.856.595zm6.58.12c-1.669 3.782-5.106 5.766-8.77 5.712-7.034-.347-9.083-8.466-4.38-11.393l.207.206c-.076.108-.358.325-.791 1.182-.51 1.041-.672 2.081-.607 2.732.369 5.67 8.314 6.83 11.045 1.214C21.057 8.217 11.822.401 3.626 6.374l-.184-.184C5.599 2.808 9.816 1.3 13.837 2.309c6.147 1.55 9.453 7.956 7.035 13.94z\"],\"color\":\"#000000\"},{\"id\":\"brand-amazonpay\",\"label\":\"Amazon Pay\",\"set\":\"brand\",\"paths\":[\"M14.378 4.995q-.56-.485-1.74-.485q-.585 0-1.168.106q-.585.105-.983.28a.5.5 0 0 0-.199.13q-.05.068-.05.242v.335q0 .224.162.224a.3.3 0 0 0 .106-.019l.093-.03a6.4 6.4 0 0 1 1.827-.287q.745 0 1.045.274q.298.274.298.945v.82a6.7 6.7 0 0 0-1.567-.211q-1.093 0-1.74.54q-.646.541-.646 1.448q0 .846.522 1.35q.522.502 1.417.502q.534 0 1.075-.21q.541-.211.988-.597l.063.41q.037.236.274.236h.534q.248 0 .249-.249V6.5q0-1.02-.56-1.504m-.609 4.6q-.41.31-.858.472a2.5 2.5 0 0 1-.857.162q-.485 0-.746-.255t-.261-.727q0-1.082 1.404-1.082q.323 0 .665.044q.342.045.653.118zM8.773 6.402a3 3 0 0 0-.516-1.025a2.2 2.2 0 0 0-.82-.647a2.55 2.55 0 0 0-1.082-.224q-.56 0-1.094.211a3.5 3.5 0 0 0-1.007.622l-.062-.398q-.037-.249-.286-.249h-.547q-.249 0-.249.249v8.366q0 .248.249.248h.733q.249 0 .249-.248v-2.909a2.77 2.77 0 0 0 1.926.734q.61 0 1.106-.242q.497-.243.845-.678q.35-.435.54-1.057a4.7 4.7 0 0 0 .194-1.392a4.7 4.7 0 0 0-.18-1.361m-2.791 3.735q-.846 0-1.64-.597V6.072q.78-.57 1.665-.571q1.69 0 1.69 2.324q0 2.313-1.715 2.312m13 1.963l2.736-6.961a1 1 0 0 0 .086-.299q0-.149-.174-.149h-.696q-.198 0-.274.063q-.075.062-.149.274L18.833 9.85l-1.74-4.822q-.075-.212-.15-.274q-.074-.063-.274-.063h-.746q-.174 0-.174.15q0 .086.087.298l2.4 5.917l-.237.634q-.21.597-.472.82q-.261.225-.733.224q-.212 0-.336-.025a1 1 0 0 0-.186-.025q-.186 0-.187.236v.323q0 .174.063.255a.36.36 0 0 0 .199.118q.31.086.708.087q.71 0 1.15-.373q.442-.372.778-1.23m2.71 4.423c-2.627 1.94-6.436 2.97-9.717 2.97c-4.597 0-8.737-1.699-11.87-4.528c-.246-.222-.027-.525.27-.353c3.38 1.967 7.559 3.151 11.876 3.151a23.6 23.6 0 0 0 9.06-1.853c.444-.19.816.292.382.613m1.093-1.248c.336.43-.374 2.204-.691 2.996c-.096.24.11.336.327.155c1.41-1.18 1.774-3.65 1.485-4.007c-.286-.354-2.75-.659-4.254.397c-.232.163-.192.387.064.356c.847-.101 2.733-.328 3.069.103\"],\"color\":\"#FF9900\"},{\"id\":\"brand-amazon\",\"label\":\"Amazon\",\"set\":\"brand\",\"paths\":[\"M.045 18.02q.107-.174.348-.022q5.455 3.165 11.87 3.166q4.278-.001 8.447-1.595l.315-.14c.138-.06.234-.1.293-.13c.226-.088.39-.046.525.13c.12.174.09.336-.12.48c-.256.19-.6.41-1.006.654q-1.867 1.113-4.185 1.726a17.6 17.6 0 0 1-10.951-.577a17.9 17.9 0 0 1-5.43-3.35q-.15-.113-.151-.22c0-.047.021-.09.051-.13zm6.565-6.218q0-1.507.743-2.577c.495-.71 1.17-1.25 2.04-1.615c.796-.335 1.756-.575 2.912-.72c.39-.046 1.033-.103 1.92-.174v-.37c0-.93-.105-1.558-.3-1.875c-.302-.43-.78-.65-1.44-.65h-.182c-.48.046-.896.196-1.246.46c-.35.27-.575.63-.675 1.096c-.06.3-.206.465-.435.51l-2.52-.315c-.248-.06-.372-.18-.372-.39c0-.046.007-.09.022-.15q.372-1.935 1.82-2.88c.976-.616 2.1-.975 3.39-1.05h.54c1.65 0 2.957.434 3.888 1.29c.135.15.27.3.405.48c.12.165.224.314.283.45c.075.134.15.33.195.57c.06.254.105.42.135.51c.03.104.062.3.076.615c.01.313.02.493.02.553v5.28c0 .376.06.72.165 1.036q.157.471.315.674l.51.674q.136.204.136.36q0 .181-.18.314c-1.2 1.05-1.86 1.62-1.963 1.71q-.247.203-.63.045a6 6 0 0 1-.526-.496l-.31-.347a9 9 0 0 1-.317-.42l-.3-.435c-.81.886-1.603 1.44-2.4 1.665c-.494.15-1.093.227-1.83.227c-1.11 0-2.04-.343-2.76-1.034c-.72-.69-1.08-1.665-1.08-2.94l-.05-.076zm3.753-.438q-.001.848.425 1.364c.285.34.675.512 1.155.512c.045 0 .106-.007.195-.02c.09-.016.134-.023.166-.023c.614-.16 1.08-.553 1.424-1.178c.165-.28.285-.58.36-.91c.09-.32.12-.59.135-.8c.015-.195.015-.54.015-1.005v-.54c-.84 0-1.484.06-1.92.18c-1.275.36-1.92 1.17-1.92 2.43l-.035-.02zm9.162 7.027c.03-.06.075-.11.132-.17q.544-.365 1.05-.5a8 8 0 0 1 1.612-.24c.14-.012.28 0 .41.03c.65.06 1.05.168 1.172.33c.063.09.099.228.099.39v.15c0 .51-.149 1.11-.424 1.8q-.418 1.034-1.156 1.68q-.11.09-.197.09c-.03 0-.06 0-.09-.012c-.09-.044-.107-.12-.064-.24c.54-1.26.806-2.143.806-2.64c0-.15-.03-.27-.087-.344c-.145-.166-.55-.257-1.224-.257q-.364 0-.87.046c-.363.045-.7.09-1 .135q-.134 0-.18-.044c-.03-.03-.036-.047-.02-.077c0-.017.006-.03.02-.063v-.06z\"],\"color\":\"#FF9900\"},{\"id\":\"brand-xbox\",\"label\":\"Xbox\",\"set\":\"brand\",\"paths\":[\"M4.102 21.033A11.95 11.95 0 0 0 12 24a11.96 11.96 0 0 0 7.902-2.967c1.877-1.912-4.316-8.709-7.902-11.417c-3.582 2.708-9.779 9.505-7.898 11.417m11.16-14.406c2.5 2.961 7.484 10.313 6.076 12.912A11.94 11.94 0 0 0 24 12.004a11.95 11.95 0 0 0-3.57-8.536s-.027-.022-.082-.042a.8.8 0 0 0-.281-.045c-.592 0-1.985.434-4.805 3.246M3.654 3.426c-.057.02-.082.041-.086.042A11.96 11.96 0 0 0 0 12.004c0 2.854.998 5.473 2.661 7.533c-1.401-2.605 3.579-9.951 6.08-12.91c-2.82-2.813-4.216-3.245-4.806-3.245a.7.7 0 0 0-.281.046zM12 3.551S9.055 1.828 6.755 1.746c-.903-.033-1.454.295-1.521.339C7.379.646 9.659 0 11.984 0H12c2.334 0 4.605.646 6.766 2.085c-.068-.046-.615-.372-1.52-.339C14.946 1.828 12 3.545 12 3.545z\"],\"color\":\"#107C10\"},{\"id\":\"brand-nintendoswitch\",\"label\":\"Nintendo Switch\",\"set\":\"brand\",\"paths\":[\"M14.176 24h3.674c3.376 0 6.15-2.774 6.15-6.15V6.15C24 2.775 21.226 0 17.85 0H14.1c-.074 0-.15.074-.15.15v23.7c-.001.076.075.15.226.15m4.574-13.199c1.351 0 2.399 1.125 2.399 2.398c0 1.352-1.125 2.4-2.399 2.4c-1.35 0-2.4-1.049-2.4-2.4c-.075-1.349 1.05-2.398 2.4-2.398M11.4 0H6.15C2.775 0 0 2.775 0 6.15v11.7C0 21.226 2.775 24 6.15 24h5.25c.074 0 .15-.074.15-.149V.15c.001-.076-.075-.15-.15-.15M9.676 22.051H6.15a4.194 4.194 0 0 1-4.201-4.201V6.15A4.194 4.194 0 0 1 6.15 1.949H9.6zM3.75 7.199c0 1.275.975 2.25 2.25 2.25s2.25-.975 2.25-2.25c0-1.273-.975-2.25-2.25-2.25s-2.25.977-2.25 2.25\"],\"color\":\"#E60012\"},{\"id\":\"brand-minecraft\",\"label\":\"Minecraft\",\"set\":\"brand\",\"paths\":[\"m23.74 10.006l-2.443.002l-.076.12l-.03-.118h-2.458l-.06.136l-.023-.136l-2.48.003l-.043.161l-.016-.161l-2.503.002l-.023.265l-.007-.265l-2.518.005l-.01.242l-.025-.242l-2.495.002l-.016.157l-.044-.157H7.267l-.097.67l-.055-.138l-.025-.002l-.21-.53l-1.189.002l-.023.13l-.062-.13H4.431l-.03.12l-.07-.12l-1.165.003l-.136.523h-.316l-.06.228l-.55-.751l-1.134.002L0 13.04l1.03.954h1.124l.178-.67l.087.097h.3l.5.573h1.154l.023-.108l.081.108h1.164l.02-.117l.074.117H6.91l.09-.629l.302.63H8.49l.014-.146l.05.145h2.475l.01-.228l.027.228h2.495l.023-.25l.01.25h1.223l.04-.175l.01.175h1.21l.051-.152l.014.152h1.196l.062-.133l.018.133h1.185l.071-.122l.021.122h1.175l.68-.967l-.032-.155h.375l.535-.74l.456 1.86h1.152l.963-.959l-.018-.073l-.074-.254l-.07-.233l-.246-.806l-.103-.346l-.005-.018l.484-.583zm-2.325.168h2.2l.157.493h-.638l.004.016q.04.164.085.33c.03.113.065.226.097.343l.106.353q.056.178.109.357l.066.219q.034.112.07.223l.069.228l.066.228h-.997l-.627-2.297h-.64zm-.355.002l.122.493h-1.295l.118.56h1.313l.136.553H20.12l.246 1.182l-.995.003l-.51-2.788zm-2.553.003l.481 2.788h-.995l-.129-.899h-.373l.122.899h-.996l-.306-2.786zm-2.549.002l.104 1.032h-.327l.03.311h.327l.145 1.443h-.993l-.09-1.176l-.368-.009l.076 1.185h-.993l-.104-2.784zm-2.546.002l.014.493h-1.272l-.03 1.72h1.35l.017.573h-2.364l.094-2.783zm-2.543.003l-.021.493H9.56l-.041.569l1.304.002l-.023.537l-1.33.002l-.044.602l1.346.004l-.025.574h-2.36l.293-2.781zm-2.54.002l-.322 2.78h-.99l.124-.884l-.328-.01l.083-.573l-.36-.007l-.234 1.477H5.31l.518-2.78h.917l-.08.513l.315.01l-.076.536l.355.005l.15-1.065zm-5.034.004h.917l-.648 2.78h-.988l.297-1.18h-.357l-.154.573h-.64l.158-.573h-.36l-.35 1.18H.2l.892-2.777h.899l-.148.504l.314.012l-.157.546h.696l.145-.54h.318zm2.182.005l-.546 2.781h-.989L4.56 10.2zm12.168.422l.04.325l-.342-.003l-.043-.32h-.422l.044.353h.387l.018.128h-.193l.071.547h.233l-.019-.185l.346-.002l.03.187h.237l-.083-.542h-.193l-.016-.131l.396-.003l-.055-.354zm-2.928.055l.036.574h.364l-.043-.574zm-1.196 1.005l.018.548l-1.216-.002l.011-.41h1.177Z\"],\"color\":\"#62B47A\"},{\"id\":\"brand-linkedin\",\"label\":\"LinkedIn\",\"set\":\"brand\",\"paths\":[\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z\"],\"color\":\"#0A66C2\"},{\"id\":\"brand-slack\",\"label\":\"Slack\",\"set\":\"brand\",\"paths\":[\"M5.042 15.165a2.53 2.53 0 0 1-2.52 2.523A2.53 2.53 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52a2.527 2.527 0 0 1 2.521 2.52v6.313A2.53 2.53 0 0 1 8.834 24a2.53 2.53 0 0 1-2.521-2.522zM8.834 5.042a2.53 2.53 0 0 1-2.521-2.52A2.53 2.53 0 0 1 8.834 0a2.53 2.53 0 0 1 2.521 2.522v2.52zm0 1.271a2.53 2.53 0 0 1 2.521 2.521a2.53 2.53 0 0 1-2.521 2.521H2.522A2.53 2.53 0 0 1 0 8.834a2.53 2.53 0 0 1 2.522-2.521zm10.122 2.521a2.53 2.53 0 0 1 2.522-2.521A2.53 2.53 0 0 1 24 8.834a2.53 2.53 0 0 1-2.522 2.521h-2.522zm-1.268 0a2.53 2.53 0 0 1-2.523 2.521a2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.53 2.53 0 0 1 2.523 2.522zm-2.523 10.122a2.53 2.53 0 0 1 2.523 2.522A2.53 2.53 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522zm0-1.268a2.527 2.527 0 0 1-2.52-2.523a2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.53 2.53 0 0 1-2.522 2.523z\"],\"color\":\"#4A154B\"},{\"id\":\"brand-openai\",\"label\":\"OpenAI\",\"set\":\"brand\",\"paths\":[\"M22.282 9.821a6 6 0 0 0-.516-4.91a6.05 6.05 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a6 6 0 0 0-3.998 2.9a6.05 6.05 0 0 0 .743 7.097a5.98 5.98 0 0 0 .51 4.911a6.05 6.05 0 0 0 6.515 2.9A6 6 0 0 0 13.26 24a6.06 6.06 0 0 0 5.772-4.206a6 6 0 0 0 3.997-2.9a6.06 6.06 0 0 0-.747-7.073M13.26 22.43a4.48 4.48 0 0 1-2.876-1.04l.141-.081l4.779-2.758a.8.8 0 0 0 .392-.681v-6.737l2.02 1.168a.07.07 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494M3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085l4.783 2.759a.77.77 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646M2.34 7.896a4.5 4.5 0 0 1 2.366-1.973V11.6a.77.77 0 0 0 .388.677l5.815 3.354l-2.02 1.168a.08.08 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.08.08 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667m2.01-3.023l-.141-.085l-4.774-2.782a.78.78 0 0 0-.785 0L9.409 9.23V6.897a.07.07 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.8.8 0 0 0-.393.681zm1.097-2.365l2.602-1.5l2.607 1.5v2.999l-2.597 1.5l-2.607-1.5Z\"],\"color\":\"#412991\"},{\"id\":\"brand-canva\",\"label\":\"Canva\",\"set\":\"brand\",\"paths\":[\"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12s12-5.373 12-12S18.627 0 12 0M6.962 7.68c.754 0 1.337.549 1.405 1.2c.069.583-.171 1.097-.822 1.406c-.343.171-.48.172-.549.069c-.034-.069 0-.137.069-.206c.617-.514.617-.926.548-1.508c-.034-.378-.308-.618-.583-.618c-1.2 0-2.914 2.674-2.674 4.629c.103.754.549 1.646 1.509 1.646c.308 0 .65-.103.96-.24c.5-.264.799-.47 1.097-.8c-.073-.885.704-2.046 1.851-2.046c.515 0 .926.205.96.583c.068.514-.377.582-.514.582s-.378-.034-.378-.17c-.034-.138.309-.07.275-.378c-.035-.206-.24-.274-.446-.274c-.72 0-1.131.994-1.029 1.611c.035.275.172.549.447.549c.205 0 .514-.31.617-.755c.068-.308.343-.514.583-.514c.102 0 .17.034.205.171v.138c-.034.137-.137.548-.102.651c0 .069.034.171.17.171c.092 0 .436-.18.777-.459c.117-.59.253-1.298.253-1.357c.034-.24.137-.48.617-.48c.103 0 .171.034.205.171v.138l-.136.617c.445-.583 1.097-.994 1.508-.994c.172 0 .309.102.309.274c0 .103 0 .274-.069.446c-.137.377-.309.96-.412 1.474c0 .137.035.274.207.274s.685-.206 1.096-.754l.007-.004c-.002-.068-.007-.134-.007-.202c0-.411.035-.754.104-.994c.068-.274.411-.514.617-.514c.103 0 .205.069.205.171c0 .035 0 .103-.034.137c-.137.446-.24.857-.24 1.269c0 .24.034.582.102.788c0 .034.035.069.07.069c.068 0 .548-.445.89-1.028c-.308-.206-.48-.549-.48-.96c0-.72.446-1.097.858-1.097c.343 0 .617.24.617.72c0 .308-.103.65-.274.96h.102a.77.77 0 0 0 .584-.24a.3.3 0 0 1 .134-.117c.335-.425.83-.74 1.41-.74c.48 0 .924.205.959.582c.068.515-.378.618-.515.618l-.002-.002c-.138 0-.377-.035-.377-.172s.309-.068.274-.376c-.034-.206-.24-.275-.446-.275c-.686 0-1.13.891-1.028 1.611c.034.275.171.583.445.583c.206 0 .515-.308.652-.754c.068-.274.343-.514.583-.514c.103 0 .17.034.205.171c0 .069 0 .206-.137.652c-.17.308-.171.48-.137.617c.034.274.171.48.309.583c.034.034.068.102.068.102c0 .069-.034.138-.137.138c-.034 0-.068 0-.103-.035c-.514-.205-.72-.548-.789-.891c-.205.24-.445.377-.72.377c-.445 0-.89-.411-.96-.926a1.6 1.6 0 0 1 .075-.649c-.203.13-.422.203-.623.203h-.17c-.447.652-.927 1.098-1.27 1.303a.9.9 0 0 1-.377.104c-.068 0-.171-.035-.205-.104c-.095-.152-.156-.392-.193-.667c-.481.527-1.145.805-1.453.805c-.343 0-.548-.206-.582-.55v-.376c.102-.754.377-1.2.377-1.337a.074.074 0 0 0-.069-.07c-.24 0-1.028.824-1.166 1.373l-.103.445c-.068.309-.377.515-.582.515c-.103 0-.172-.035-.206-.172v-.137l.046-.233c-.435.31-.87.508-1.075.508c-.308 0-.48-.172-.514-.412c-.206.274-.445.412-.754.412c-.352 0-.696-.24-.862-.593c-.244.275-.523.553-.852.764c-.48.309-1.028.549-1.68.549c-.582 0-1.097-.309-1.371-.583c-.412-.377-.651-.96-.686-1.509c-.205-1.68.823-3.84 2.4-4.8c.378-.205.755-.343 1.132-.343m9.77 3.291c-.104 0-.172.172-.172.343c0 .274.137.583.309.755a1.7 1.7 0 0 0 .102-.583c0-.343-.137-.515-.24-.515z\"],\"color\":\"#00C4CC\"},{\"id\":\"brand-tron\",\"label\":\"Tron\",\"set\":\"crypto\",\"paths\":[\"M12 0c6.63 0 12 5.37 12 12s-5.37 12-12 12S0 18.63 0 12 5.37 0 12 0zM5.63 5.44l5.7 14.33 7.94-9.67-2.81-2.67L5.63 5.44zm12.19 5.23l-5.75 7.01 .74-6.1 5.02-.91zM7.1 7.12l4.97 4.13-.78 6.44L7.1 7.12zM16.27 8.31l1.66 1.57-4.53 .82 2.87-2.39zM7.65 6.58l7.8 1.44-3.03 2.52-4.77-3.96z\"],\"color\":\"#EF0027\"},{\"id\":\"brand-avalanche\",\"label\":\"Avalanche\",\"set\":\"crypto\",\"paths\":[\"M12 0c6.63 0 12 5.37 12 12s-5.37 12-12 12S0 18.63 0 12 5.37 0 12 0zm.23 5.12a.58 .58 0 0 0-.52 0c-.15 .08-.27 .29-.51 .71L5.6 15.73c-.24 .41-.35 .62-.34 .79a.58 .58 0 0 0 .26 .45c.14 .09 .38 .09 .86 .09h2.27c.53 0 .8 0 1.04-.07 .26-.08 .5-.22 .7-.41 .18-.17 .31-.4 .57-.86l.01-.01 2.94-5.21c.26-.46 .39-.69 .45-.93a1.69 1.69 0 0 0 0-.8c-.06-.24-.19-.47-.44-.92l-.01-.01-1.15-2.01c-.24-.42-.36-.63-.51-.71zm3.5 7.11c-.15 .08-.27 .28-.51 .69l-1.62 2.79-.01 .01c-.24 .41-.36 .62-.35 .78a.58 .58 0 0 0 .26 .45c.11 .07 .29 .09 .6 .09l3.51 0c.48 0 .72 0 .87-.09a.58 .58 0 0 0 .26-.46c.01-.16-.11-.36-.33-.75l-.02-.04-1.63-2.79-.02-.03c-.23-.39-.34-.58-.49-.66a.57 .57 0 0 0-.52 0z\"],\"color\":\"#E84142\"},{\"id\":\"brand-usdcoin\",\"label\":\"USD Coin\",\"set\":\"crypto\",\"paths\":[\"M12 0c6.63 0 12 5.37 12 12s-5.37 12-12 12S0 18.63 0 12 5.37 0 12 0zm2.51 4.17c-.18-.09-.37 0-.41 .18-.05 .05-.05 .09-.05 .18v.64l.01 .08a.65 .65 0 0 0 .27 .38c3.57 1.27 5.39 5.24 4.07 8.74-.69 1.91-2.19 3.37-4.07 4.05-.18 .09-.27 .23-.27 .46v.64l0 .07a.34 .34 0 0 0 .27 .3c.05 0 .14 0 .18-.04a8.17 8.17 0 0 0 5.35-10.29c-.82-2.59-2.83-4.55-5.35-5.37zm-4.84-.04c-.05 0-.14 0-.18 .05a8.17 8.17 0 0 0-5.35 10.29c.82 2.55 2.79 4.51 5.35 5.33 .18 .09 .37 0 .41-.18 .05-.04 .05-.09 .05-.18v-.64l-.01-.06c-.03-.13-.15-.27-.27-.35-3.57-1.27-5.39-5.23-4.07-8.74 .69-1.91 2.19-3.37 4.07-4.05 .18-.09 .27-.23 .27-.46v-.64l0-.07a.34 .34 0 0 0-.27-.3zm2.65 2.37h-.69l-.07 .01c-.15 .03-.26 .16-.3 .36v1.05l-.16 .02c-1.28 .23-2.08 1.11-2.08 2.21 0 1.5 .91 2.09 2.83 2.32 1.28 .23 1.69 .5 1.69 1.23 0 .73-.64 1.23-1.51 1.23-1.19 0-1.6-.5-1.74-1.18-.04-.18-.18-.27-.32-.27h-.78l-.06 .01a.31 .31 0 0 0-.26 .31v.05l.02 .14c.22 1.07 .95 1.83 2.4 2.05v1.09l.01 .07c.03 .15 .16 .26 .36 .3h.69l.07-.01c.15-.03 .26-.16 .3-.36V16.01l.16-.03c1.28-.27 2.13-1.2 2.13-2.38 0-1.59-.96-2.14-2.88-2.37-1.37-.18-1.65-.55-1.65-1.18 0-.64 .46-1.05 1.37-1.05 .82 0 1.28 .27 1.51 .96a.34 .34 0 0 0 .32 .23h.73l.06 0a.31 .31 0 0 0 .26-.31v-.04l-.03-.13a2.28 2.28 0 0 0-2.03-1.74V6.86l-.01-.07c-.03-.15-.16-.26-.36-.3z\"],\"color\":\"#2775CA\"},{\"id\":\"brand-dai\",\"label\":\"Dai\",\"set\":\"crypto\",\"paths\":[\"M12 0c6.63 0 12 5.37 12 12s-5.37 12-12 12S0 18.63 0 12 5.37 0 12 0zm-.13 6H6.96v3.9H5.25v1.4h1.71v1.46H5.25v1.4h1.71V18h4.91c2.96 0 5.2-1.57 6.07-3.85H19.5v-1.39h-1.22c.03-.25 .05-.5 .05-.76v-.03c0-.23-.01-.45-.04-.67H19.5v-1.39h-1.53C17.13 7.59 14.86 6 11.87 6zm4.56 8.15c-.76 1.56-2.38 2.6-4.56 2.6h-3.54v-2.6zm.42-2.86c.03 .23 .05 .47 .05 .71v.03c0 .25-.02 .49-.05 .72H8.33v-1.46h8.53zM11.87 7.25c2.19 0 3.82 1.07 4.57 2.65h-8.11V7.25h3.54z\"],\"color\":\"#F4B731\"},{\"id\":\"brand-stellar\",\"label\":\"Stellar\",\"set\":\"crypto\",\"paths\":[\"M12 24C5.37 24 0 18.63 0 12S5.37 0 12 0s12 5.37 12 12-5.37 12-12 12zm5.35-17.03l-1.8 .92-8.7 4.43A5.18 5.18 0 0 1 14.51 7.12l1.03-.52 .15-.08a6.33 6.33 0 0 0-10.03 5.6 1.15 1.15 0 0 1-.63 1.11l-.54 .28v1.29l1.6-.82 .52-.26 .51-.26 9.17-4.67 1.03-.52 2.13-1.09V5.89L17.35 6.97zm2.11 1.51L7.65 14.49l-1.03 .52L4.5 16.1v1.29l2.11-1.07 1.8-.92 8.71-4.44a5.18 5.18 0 0 1-7.67 5.2l-.06 .03-1.12 .57a6.33 6.33 0 0 0 10.03-5.61 1.15 1.15 0 0 1 .62-1.11l.54-.28v-1.29z\"],\"color\":\"#14B6E7\"},{\"id\":\"brand-polkadot\",\"label\":\"Polkadot\",\"set\":\"crypto\",\"paths\":[\"M12 0c6.63 0 12 5.37 12 12s-5.37 12-12 12S0 18.63 0 12 5.37 0 12 0zm-.44 17.25c-.09 .45 .19 .91 .65 1a.84 .84 0 0 0 1-.66c.09-.47-.19-.91-.66-1a.84 .84 0 0 0-1 .65zm.64-12.28c-2.78 0-5.05 2.26-5.05 5.05 0 .56 .09 1.11 .27 1.64a.71 .71 0 0 0 .9 .44 .71 .71 0 0 0 .44-.9 3.56 3.56 0 0 1-.2-1.3c.05-1.88 1.58-3.43 3.46-3.53a3.65 3.65 0 0 1 3.84 3.64 3.65 3.65 0 0 1-3.43 3.64s-.71 .04-1.06 .09c-.17 .03-.31 .05-.4 .07-.04 .01-.08-.03-.07-.07l.12-.59 .65-3.02a.7 .7 0 0 0-.53-.83 .7 .7 0 0 0-.83 .53s-1.58 7.35-1.59 7.43a.7 .7 0 0 0 .53 .83 .7 .7 0 0 0 .83-.53c.01-.08 .23-1.06 .23-1.06a1.78 1.78 0 0 1 1.5-1.39 16.07 16.07 0 0 1 .79-.07 5.06 5.06 0 0 0 4.67-5.04c0-2.79-2.27-5.05-5.05-5.05z\"],\"color\":\"#E6007A\"},{\"id\":\"brand-cosmos\",\"label\":\"Cosmos\",\"set\":\"crypto\",\"paths\":[\"M12 24C5.37 24 0 18.63 0 12S5.37 0 12 0s12 5.37 12 12-5.37 12-12 12zm-1.2-6.31c.32 1.36 .75 2.2 1.22 2.2 .75 0 1.38-2.08 1.64-5.02 2.67 1.25 4.79 1.74 5.17 1.1 .37-.65-1.11-2.24-3.52-3.94 2.42-1.68 3.91-3.27 3.54-3.92-.24-.42-1.21-.36-2.59 .06a.53 .53 0 0 0-.46-.27 .55 .55 0 0 0-.53 .62c-.5 .19-1.04 .42-1.6 .68-.25-2.94-.89-5.03-1.64-5.03-.75 0-1.38 2.08-1.64 5.02-2.67-1.25-4.79-1.74-5.17-1.09-.23 .41 .26 1.18 1.25 2.12a.57 .57 0 0 0-.02 .14c0 .31 .24 .55 .54 .55a.52 .52 0 0 0 .21-.04 23.72 23.72 0 0 0 1.54 1.17c-2.42 1.68-3.91 3.27-3.54 3.92 .37 .65 2.5 .16 5.18-1.08 .06 .66 .13 1.28 .22 1.84a.56 .56 0 0 0-.23 .46c0 .27 .18 .49 .43 .54zm.35-.05a.56 .56 0 0 0 .3-.5 .55 .55 0 0 0-.51-.55c-.09-.6-.16-1.25-.2-1.91a32.57 32.57 0 0 0 1.28-.65c.44 .24 .88 .46 1.3 .67a32.22 32.22 0 0 1-.28 2.18c-.37 2.11-.89 2.55-.89 2.55-.11 .15-.22 .04-.22 .04-.45-.52-.67-1.48-.67-1.48a6.89 6.89 0 0 1-.1-.35zm-3.69-7.05a.57 .57 0 0 0 .06-.25c0-.31-.24-.55-.54-.55a.52 .52 0 0 0-.32 .11c-1.04-1-1.13-1.49-1.13-1.49v0c-.07-.17 .08-.21 .08-.21 .67-.13 1.62 .16 1.62 .16 .89 .2 2.02 .68 3.12 1.21a32.52 32.52 0 0 0-.07 1.44c-.43 .26-.84 .53-1.23 .79a34.02 34.02 0 0 1-1.59-1.21zM15.42 8.84a.53 .53 0 0 0 .37 .16c.27 0 .49-.2 .53-.47 1.37-.43 1.93-.38 2.12-.33a.14 .14 0 0 1 .1 .15c-.04 .4-.75 1.13-.75 1.13a22.14 22.14 0 0 1-2.79 2.33 32.48 32.48 0 0 0-1.25-.81 32.51 32.51 0 0 0-.07-1.45 30.41 30.41 0 0 1 1.73-.71zm-.43 3.39c2.99 2.17 3.47 3.14 3.54 3.43a.14 .14 0 0 1-.08 .16c-.37 .17-1.35-.08-1.35-.08a22.21 22.21 0 0 1-3.42-1.25c.04-.47 .06-.97 .08-1.48 .43-.26 .84-.53 1.23-.79zm-4.73 .39a28.87 28.87 0 0 1-.89-.6c.3-.2 .6-.39 .89-.57a35.64 35.64 0 0 0 0 1.17zm.01 .4c.02 .5 .04 .99 .07 1.45a31.95 31.95 0 0 1-2.05 .85c-2.02 .73-2.66 .5-2.66 .5-.18-.02-.14-.18-.14-.18 .23-.64 .95-1.32 .95-1.32 .62-.67 1.6-1.41 2.61-2.09 .39 .26 .79 .53 1.22 .79zm3.5-1.59c.38 .23 .61 .37 .61 .37 .11 .08 .22 .15 .32 .23-.36 .25-.67 .45-.93 .61a35.58 35.58 0 0 0 0-1.21zm-.42 2.91c-.39-.19-.73-.36-.99-.5a35.63 35.63 0 0 0 1.07-.61c-.02 .38-.04 .76-.08 1.11zm-2.69-1.09a35.69 35.69 0 0 0 1.01 .58c-.33 .17-.65 .32-.96 .47a40.41 40.41 0 0 1-.05-1.05zm-.01-.39a53.86 53.86 0 0 1-.02-1.64 53.97 53.97 0 0 1 1.37-.81c.55 .3 1.04 .58 1.44 .81 0 .25 0 .39 0 .39a19.94 19.94 0 0 1 0 1.22c-.24 .14-.37 .22-.37 .22a20.02 20.02 0 0 1-1.05 .6c-.24-.13-.37-.22-.37-.22a19.5 19.5 0 0 1-.99-.57zm1.75-2.66c.39-.22 .63-.34 .63-.34 .12-.05 .23-.11 .35-.16 .04 .43 .05 .8 .07 1.11a35.6 35.6 0 0 0-1.04-.6zm-1.71-.48c.32 .16 .64 .33 .95 .49a35.69 35.69 0 0 0-.99 .57c.01-.45 .02-.71 .02-.71l.03-.34zm.04-.4c.38-3.67 .98-4.58 1.19-4.79a.14 .14 0 0 1 .18-.01c.33 .23 .61 1.21 .61 1.21 .35 1.3 .54 2.57 .64 3.59a33.42 33.42 0 0 0-1.31 .67 32.37 32.37 0 0 0-1.3-.67zm1.28 3.59a.93 .93 0 1 0 0-1.85 .93 .93 0 0 0 0 1.85z\"],\"color\":\"#2E3148\"},{\"id\":\"brand-przelewy24\",\"label\":\"Przelewy24\",\"set\":\"brand\",\"paths\":[\"M2.89 16.38L0.00 16.38L0.00 7.82L4.12 7.82Q5.32 7.82 6.20 8.21Q7.07 8.60 7.55 9.33Q8.02 10.06 8.02 11.05L8.02 11.05Q8.02 12.04 7.55 12.76Q7.07 13.48 6.20 13.88Q5.32 14.28 4.12 14.28L4.12 14.28L1.60 14.28L2.89 13.04L2.89 16.38M2.89 8.73L2.89 13.36L1.60 12.05L3.94 12.05Q4.54 12.05 4.83 11.78Q5.11 11.51 5.11 11.05L5.11 11.05Q5.11 10.58 4.83 10.31Q4.54 10.04 3.94 10.04L3.94 10.04L1.60 10.04L2.89 8.73M15.35 16.38L8.49 16.38L8.49 14.61L11.58 11.74Q11.88 11.46 12.02 11.25Q12.16 11.05 12.21 10.88Q12.26 10.72 12.26 10.57L12.26 10.57Q12.26 10.25 12.05 10.07Q11.84 9.90 11.43 9.90L11.43 9.90Q11.05 9.90 10.70 10.10Q10.36 10.30 10.17 10.69L10.17 10.69L7.99 9.60Q8.45 8.72 9.38 8.17Q10.31 7.62 11.69 7.62L11.69 7.62Q12.71 7.62 13.49 7.95Q14.28 8.28 14.72 8.88Q15.16 9.48 15.16 10.30L15.16 10.30Q15.16 10.72 15.05 11.13Q14.95 11.55 14.63 12.01Q14.31 12.46 13.69 13.03L13.69 13.03L11.36 15.14L10.91 14.14L15.35 14.14L15.35 16.38M24.00 14.91L15.62 14.91L15.62 13.08L19.25 7.82L22.21 7.82L18.72 13.08L17.37 12.67L24.00 12.67L24.00 14.91M22.86 16.38L20.06 16.38L20.06 14.91L20.15 12.67L20.15 11.36L22.86 11.36L22.86 16.38\"],\"color\":\"#D13239\"},{\"id\":\"brand-payu\",\"label\":\"PayU\",\"set\":\"brand\",\"paths\":[\"M2.14 14.25L0.00 14.25L0.00 7.89L3.06 7.89Q3.95 7.89 4.60 8.18Q5.25 8.48 5.60 9.02Q5.96 9.56 5.96 10.29L5.96 10.29Q5.96 11.03 5.60 11.56Q5.25 12.10 4.60 12.40Q3.95 12.69 3.06 12.69L3.06 12.69L1.19 12.69L2.14 11.77L2.14 14.25M2.14 8.58L2.14 12.01L1.19 11.04L2.93 11.04Q3.37 11.04 3.58 10.84Q3.80 10.64 3.80 10.29L3.80 10.29Q3.80 9.95 3.58 9.75Q3.37 9.55 2.93 9.55L2.93 9.55L1.19 9.55L2.14 8.58M11.42 14.25L9.51 14.25L9.51 13.37L9.37 13.14L9.37 11.46Q9.37 11.10 9.14 10.91Q8.92 10.72 8.42 10.72L8.42 10.72Q8.08 10.72 7.74 10.82Q7.39 10.93 7.15 11.11L7.15 11.11L6.50 9.76Q6.93 9.48 7.54 9.34Q8.15 9.19 8.73 9.19L8.73 9.19Q10.01 9.19 10.71 9.77Q11.42 10.34 11.42 11.58L11.42 11.58L11.42 14.25M8.10 14.34L8.10 14.34Q7.49 14.34 7.09 14.13Q6.68 13.93 6.47 13.58Q6.26 13.23 6.26 12.80L6.26 12.80Q6.26 12.32 6.50 11.98Q6.75 11.65 7.25 11.47Q7.76 11.30 8.53 11.30L8.53 11.30L9.57 11.30L9.57 12.29L8.86 12.29Q8.53 12.29 8.38 12.40Q8.23 12.50 8.23 12.71L8.23 12.71Q8.23 12.88 8.36 12.99Q8.49 13.11 8.72 13.11L8.72 13.11Q8.93 13.11 9.11 12.99Q9.28 12.88 9.37 12.64L9.37 12.64L9.63 13.24Q9.51 13.80 9.13 14.07Q8.75 14.34 8.10 14.34M13.22 16.11L13.22 16.11Q12.81 16.11 12.39 15.98Q11.96 15.86 11.71 15.66L11.71 15.66L12.39 14.25Q12.55 14.37 12.74 14.44Q12.94 14.52 13.12 14.52L13.12 14.52Q13.39 14.52 13.54 14.40Q13.68 14.29 13.77 14.06L13.77 14.06L13.98 13.54L14.13 13.34L15.72 9.28L17.66 9.28L15.62 14.35Q15.34 15.03 14.98 15.42Q14.63 15.80 14.18 15.95Q13.74 16.11 13.22 16.11M15.13 13.15L13.70 14.48L11.54 9.28L13.64 9.28L15.13 13.15M20.90 14.40L20.90 14.40Q19.44 14.40 18.62 13.61Q17.80 12.82 17.80 11.39L17.80 11.39L17.80 7.89L19.95 7.89L19.95 11.33Q19.95 12.05 20.21 12.36Q20.48 12.66 20.92 12.66L20.92 12.66Q21.37 12.66 21.63 12.36Q21.89 12.05 21.89 11.33L21.89 11.33L21.89 7.89L24.00 7.89L24.00 11.39Q24.00 12.82 23.18 13.61Q22.36 14.40 20.90 14.40\"],\"color\":\"#A6C307\"},{\"id\":\"brand-mypaysafecard\",\"label\":\"myPaysafecard\",\"set\":\"brand\",\"paths\":[\"M6.14 14.86C4.62 13.33 3.38 12.02 3.38 11.92C3.38 11.83 4.64 10.49 6.2 8.94L9.02 6.11L11.78 8.87C13.29 10.38 14.6 11.63 14.69 11.62C14.77 11.62 14.83 10.46 14.81 9.05C14.8 7.63 14.79 6.39 14.8 6.28C14.82 6.05 20.44 11.65 20.44 11.91C20.44 12.16 14.81 17.77 14.81 17.53C14.8 17.43 14.8 16.18 14.8 14.77C14.79 13.35 14.73 12.19 14.66 12.19C14.59 12.19 13.31 13.41 11.81 14.91C10.32 16.4 9.05 17.62 9 17.62C8.95 17.62 7.66 16.38 6.14 14.86Z\"],\"color\":\"#008AC9\"},{\"id\":\"brand-zen\",\"label\":\"ZEN\",\"set\":\"brand\",\"paths\":[\"M9.94 19.77C8.29 19.31 7.34 18.77 6.16 17.61C5.42 16.89 4.85 16.1 4.45 15.25C3.88 14.05 3.85 13.84 3.84 11.91C3.84 9.97 3.88 9.77 4.45 8.55C5.31 6.75 7 5.12 8.73 4.41C10.39 3.74 12.7 3.54 13.18 4.02C13.91 4.74 13.44 5.32 12.1 5.36C10.98 5.4 10.43 5.69 10.56 6.19C10.68 6.67 10.37 7.09 9.59 7.49C8.74 7.92 7.56 9.18 7.2 10.05C7.06 10.39 6.94 11.21 6.94 11.85C6.95 14.72 9.02 16.77 11.91 16.77C14.02 16.77 15.64 15.72 16.52 13.78C17.01 12.71 16.98 12.03 16.44 11.82C15.72 11.55 15 10.55 15 9.82C15 7.59 17.55 6.61 19.08 8.25C19.71 8.92 20.13 10.84 20.01 12.42C19.75 15.73 17.78 18.33 14.64 19.51C13.26 20.03 11.26 20.14 9.94 19.77ZM14.26 5.64C13.88 4.93 14.65 4.11 15.35 4.49C16.19 4.93 15.94 6 15 6C14.65 6 14.38 5.87 14.26 5.64Z\"],\"color\":\"#00C38A\"},{\"id\":\"brand-skrill\",\"label\":\"Skrill\",\"set\":\"brand\",\"paths\":[\"M3.56 14.83C3.21 14.74 3.08 14.56 3.04 14.13L2.98 13.56L4.26 13.58C5.39 13.59 5.53 13.55 5.53 13.24C5.53 12.97 5.31 12.83 4.65 12.66C3.6 12.39 3.28 12.15 3.03 11.44C2.8 10.77 3.25 9.77 3.94 9.43C4.43 9.18 5.98 9.11 6.7 9.31C7.04 9.39 7.12 9.55 7.12 10.06C7.12 10.74 7.11 10.74 5.77 10.38C5.25 10.24 4.69 10.49 4.69 10.87C4.69 11.13 4.89 11.24 5.55 11.34C6.7 11.51 7.31 12.11 7.31 13.07C7.31 13.47 7.18 13.98 7.03 14.2C6.56 14.87 4.83 15.18 3.56 14.83ZM7.88 12.12L7.88 9.42L8.46 9.3C8.78 9.24 9.12 9.19 9.2 9.19C9.29 9.19 9.38 9.84 9.41 10.64L9.47 12.09L9.83 11.39C10.17 10.74 10.26 10.69 11 10.69C11.95 10.69 11.99 10.83 11.34 11.97C10.91 12.73 10.9 12.81 11.16 13.33C11.32 13.63 11.53 14.08 11.62 14.34C11.8 14.8 11.79 14.81 10.91 14.81C10.06 14.81 10 14.78 9.78 14.16C9.65 13.8 9.48 13.5 9.4 13.5C9.32 13.5 9.3 13.8 9.34 14.16C9.42 14.81 9.42 14.81 8.65 14.81L7.88 14.81L7.88 12.12ZM12.19 13.3C12.19 11.87 12.22 11.75 12.74 11.24C13.14 10.83 13.46 10.69 13.95 10.69C14.58 10.69 14.62 10.73 14.62 11.25C14.62 11.69 14.51 11.86 14.16 12C13.72 12.17 13.69 12.26 13.69 13.5L13.69 14.81L12.94 14.81L12.19 14.81L12.19 13.3ZM15.04 12.8L15.09 10.78L15.84 10.78L16.59 10.78L16.65 12.8L16.7 14.81L15.84 14.81L14.99 14.81L15.04 12.8ZM17.25 12.12L17.25 9.42L17.84 9.3C18.16 9.24 18.5 9.19 18.59 9.19C18.68 9.19 18.75 10.45 18.75 12L18.75 14.81L18 14.81L17.25 14.81L17.25 12.12ZM19.31 12.2C19.31 10.76 19.38 9.55 19.45 9.5C19.53 9.46 19.87 9.36 20.2 9.29L20.81 9.16L20.81 11.99L20.81 14.81L20.06 14.81L19.31 14.81L19.31 12.2ZM15.29 10.02C14.91 9.63 14.92 9.5 15.39 9.08C15.68 8.82 15.85 8.78 16.09 8.93C16.5 9.19 16.59 9.69 16.31 10.04C16.01 10.39 15.66 10.39 15.29 10.02Z\"],\"color\":\"#862165\"},{\"id\":\"brand-neteller\",\"label\":\"Neteller\",\"set\":\"brand\",\"paths\":[\"M1.99 13.34C1.93 13.25 2.03 12.55 2.22 11.79C2.52 10.55 2.61 10.4 3.04 10.35C3.46 10.3 3.57 10.4 3.85 11.15C4.03 11.62 4.24 12 4.32 12C4.39 12 4.51 11.62 4.58 11.16L4.71 10.31L7.89 10.31C10.9 10.31 11.06 10.33 11.06 10.68C11.06 10.93 10.91 11.06 10.55 11.1C9.91 11.17 9.85 11.69 10.46 11.78C11.04 11.86 10.89 12.27 10.25 12.34C9.96 12.38 9.75 12.52 9.75 12.68C9.75 12.89 9.94 12.95 10.54 12.9C11.32 12.84 11.34 12.83 11.48 12C11.74 10.41 11.79 10.31 12.31 10.31C12.79 10.31 12.8 10.33 12.67 11.25C12.61 11.77 12.5 12.33 12.44 12.49C12.35 12.71 12.43 12.77 12.77 12.72C13.15 12.66 13.24 12.5 13.4 11.53C13.58 10.48 13.63 10.4 14.14 10.34C14.64 10.29 14.67 10.32 14.57 10.81C14.19 12.76 14.19 12.75 14.57 12.75C14.86 12.75 14.99 12.52 15.2 11.58L15.47 10.41L16.47 10.35C17.34 10.3 17.46 10.33 17.41 10.62C17.37 10.8 17.14 11 16.89 11.06C16.3 11.2 16.16 11.62 16.67 11.75C17.22 11.9 17.16 12.34 16.59 12.41C15.81 12.51 15.97 12.84 16.82 12.9C17.69 12.96 17.63 13.06 17.95 11.25C18.1 10.44 18.13 10.4 18.83 10.35C19.88 10.26 20.42 10.45 20.66 10.97C20.83 11.34 20.8 11.52 20.51 11.95C20.32 12.23 20.16 12.68 20.16 12.94C20.16 13.59 19.29 13.62 19.13 12.97C19.08 12.74 18.95 12.54 18.84 12.54C18.74 12.54 18.61 12.74 18.55 12.97L18.45 13.41L13.52 13.46L8.59 13.51L8.72 12.38C8.83 11.44 8.8 11.25 8.57 11.25C8.38 11.25 8.24 11.52 8.16 12.05C7.92 13.59 8.06 13.5 5.9 13.5L3.95 13.5L3.73 12.75C3.6 12.34 3.45 12 3.38 12C3.31 12 3.18 12.32 3.08 12.7C2.95 13.21 2.79 13.42 2.5 13.46C2.28 13.5 2.05 13.44 1.99 13.34ZM6.86 12.73C6.93 12.61 7.05 12.23 7.13 11.88C7.26 11.32 7.23 11.24 6.84 11.14C6.6 11.08 6.25 11.06 6.06 11.1C5.65 11.17 5.6 11.72 6 11.72C6.15 11.72 6.3 11.87 6.34 12.05C6.39 12.29 6.28 12.38 5.93 12.38C5.45 12.38 5.17 12.6 5.38 12.82C5.58 13.02 6.72 12.95 6.86 12.73ZM19.69 11.52C19.69 11.17 19.32 10.98 19.08 11.22C18.8 11.5 19.05 12.02 19.4 11.88C19.56 11.82 19.69 11.66 19.69 11.52Z\"],\"color\":\"#8DC640\"},{\"id\":\"brand-blik\",\"label\":\"BLIK\",\"set\":\"brand\",\"paths\":[\"M9.64 19.99C8.23 19.33 7.19 18.16 6.74 16.72C6.41 15.64 6.38 14.96 6.38 9.82L6.38 4.11L7.83 4.16L9.28 4.22L9.33 7.19C9.38 9.86 9.42 10.15 9.69 10.04C11.86 9.21 14.12 9.66 15.68 11.23C16.58 12.12 17 12.93 17.24 14.19C17.68 16.5 16.27 19.04 13.98 20.08C12.84 20.6 10.86 20.56 9.64 19.99ZM13.12 17.35C14.7 16.53 14.98 14.45 13.69 13.16C11.94 11.41 8.82 13.05 9.27 15.48C9.4 16.19 10.18 17.2 10.77 17.44C11.39 17.7 12.54 17.65 13.12 17.35ZM13.99 8.24C11.67 7.55 11.7 4.01 14.04 3.38C17.01 2.58 18.67 6.81 15.88 8.07C15.02 8.46 14.79 8.48 13.99 8.24Z\"],\"color\":\"#000000\"},{\"id\":\"brand-paysafecard\",\"label\":\"paysafecard\",\"set\":\"brand\",\"paths\":[\"M6.92 20.38C5.87 19.68 5.82 19.42 5.82 15.12C5.81 10.63 5.92 10.18 7.16 9.54C7.85 9.19 8.2 9.17 12.19 9.22C18.26 9.3 18.09 9.14 18.09 15.09C18.09 21.01 18.3 20.81 11.94 20.81C7.69 20.81 7.54 20.8 6.92 20.38ZM6.08 8.21C6.53 4.8 9.66 2.43 12.93 3.03C14.9 3.4 16.36 4.52 17.19 6.31C17.63 7.26 17.99 9.19 17.74 9.19C17.67 9.19 17.29 9.02 16.89 8.82C16.4 8.57 16.1 8.25 15.95 7.84C15.62 6.89 14.32 5.68 13.25 5.32C11.19 4.64 8.82 5.72 7.98 7.73C7.78 8.21 7.45 8.55 6.94 8.81C6.54 9.02 6.15 9.19 6.08 9.19C6.01 9.19 6.01 8.75 6.08 8.21Z\"],\"color\":\"#008AC9\"},{\"id\":\"crypto-coins\",\"label\":\"Crypto coins\",\"set\":\"crypto\",\"paths\":[\"M11.01 19.86C9.56 19.52 8.33 18.51 7.79 17.21C7.19 15.77 7.6 13.57 8.68 12.4C9.27 11.77 10.39 11.25 11.4 11.13C14.68 10.74 17.14 13.91 16.02 17.09C15.33 19.04 13.01 20.33 11.01 19.86ZM13.88 18.91C16.57 17.4 16.43 13.4 13.64 11.98C13.03 11.67 12.62 11.6 11.62 11.66C10.17 11.74 9.34 12.24 8.48 13.55C7.47 15.07 7.99 17.63 9.52 18.72C10.73 19.58 12.55 19.66 13.88 18.91ZM10.35 18.64C8.55 17.74 7.86 15.71 8.76 13.97C9.23 13.05 9.65 12.66 10.55 12.29C11.76 11.78 13.36 12.04 14.31 12.9C15.24 13.74 15.65 15.57 15.18 16.82C14.73 17.98 13.13 19.11 11.9 19.12C11.58 19.12 10.88 18.91 10.35 18.64ZM11.46 18.05C11.48 17.73 11.49 17.73 11.57 18.05C11.67 18.45 12.19 18.49 12.19 18.1C12.19 17.94 12.4 17.77 12.66 17.7C13.56 17.48 13.97 16.38 13.4 15.74C13.16 15.48 13.15 15.34 13.34 14.93C13.63 14.28 13.31 13.55 12.66 13.39C12.4 13.33 12.19 13.16 12.19 13.02C12.19 12.57 11.79 12.51 11.68 12.95L11.56 13.38L11.39 12.92L11.21 12.47L11.05 12.89C10.96 13.14 10.73 13.31 10.51 13.31C10.3 13.31 10.12 13.4 10.12 13.5C10.12 13.6 10.21 13.69 10.31 13.69C10.59 13.69 10.56 17.2 10.28 17.29C9.95 17.4 10.28 17.81 10.7 17.81C10.9 17.81 11.06 17.94 11.06 18.09C11.06 18.49 11.43 18.45 11.46 18.05ZM11.06 16.41L11.06 15.56L11.88 15.56C12.68 15.56 13.31 15.96 13.31 16.45C13.31 16.91 12.7 17.25 11.89 17.25L11.06 17.25L11.06 16.41ZM11.06 14.44C11.06 13.69 11.06 13.69 11.8 13.69C12.48 13.69 13.12 14.05 13.12 14.44C13.12 14.83 12.48 15.19 11.8 15.19C11.06 15.19 11.06 15.19 11.06 14.44ZM6.84 12.55C5.99 12.3 4.78 11.18 4.3 10.19C2.9 7.3 5.05 3.93 8.29 3.94C9.32 3.94 10.94 4.55 11.4 5.11C11.83 5.63 11.28 5.69 10.69 5.18C10 4.6 8.41 4.26 7.46 4.48C4.71 5.13 3.49 8.26 5.08 10.59C5.59 11.33 6.56 12.01 7.32 12.16C7.64 12.23 7.89 12.37 7.89 12.47C7.9 12.72 7.52 12.75 6.84 12.55ZM15.89 12.64C15.67 12.42 15.94 12.19 16.38 12.19C16.96 12.19 18.21 11.34 18.72 10.6C19.68 9.2 19.69 7.57 18.75 6.16C16.66 3 11.59 4.45 11.55 8.23C11.55 8.85 11.67 9.53 11.85 9.89C12.02 10.22 12.08 10.54 11.99 10.6C11.7 10.78 11.2 9.75 11.1 8.8C10.69 4.5 15.92 2.22 18.82 5.44C20.66 7.47 20.14 10.71 17.76 12.16C17.08 12.57 16.08 12.83 15.89 12.64ZM6.84 11.55C5.8 11.1 4.69 9.44 4.69 8.34C4.69 7.35 5.71 5.71 6.63 5.21C7.84 4.57 9.32 4.7 10.47 5.57C10.96 5.94 11.07 6.13 10.97 6.44C10.52 7.89 10.52 8.76 10.96 10.22C11.05 10.54 10.87 10.69 9.77 11.2C8.36 11.86 7.72 11.94 6.84 11.55ZM13.88 11.14C12.9 10.65 12.59 10.38 12.33 9.81C11.56 8.09 12.29 5.98 13.96 5.11C14.69 4.74 16.26 4.74 16.99 5.12C18.08 5.68 19.12 7.26 19.12 8.34C19.12 8.95 18.65 10.04 18.13 10.63C16.96 11.96 15.78 12.1 13.88 11.14ZM16.56 10.24C17.87 8.45 17.75 8.34 15.84 9.55C15.5 9.76 15.34 9.72 14.59 9.21C13.67 8.58 13.5 8.52 13.5 8.81C13.5 9.1 15.26 11.44 15.48 11.44C15.59 11.44 16.07 10.9 16.56 10.24ZM15.12 10.53C14.72 10.08 14.73 9.88 15.15 10.1C15.36 10.22 15.6 10.21 15.8 10.1C16.23 9.86 16.22 10.17 15.78 10.57C15.46 10.86 15.42 10.86 15.12 10.53ZM7.31 9.66C7.66 9.3 8.12 9 8.33 9C8.53 9 9.02 9.31 9.41 9.69C9.8 10.07 10.18 10.32 10.26 10.24C10.45 10.05 8.73 8.44 8.34 8.44C8.17 8.44 7.6 8.86 7.06 9.37C6.48 9.93 6.21 10.31 6.39 10.31C6.55 10.31 6.96 10.02 7.31 9.66ZM16.27 8.82C17.56 8.14 17.54 8.24 16.58 6.68C16.09 5.9 15.6 5.25 15.49 5.25C15.3 5.26 13.42 8.06 13.54 8.15C13.85 8.38 15.32 9.18 15.43 9.19C15.51 9.19 15.89 9.02 16.27 8.82ZM14.76 8.38L14.08 7.97L14.72 6.96C15.07 6.41 15.39 5.93 15.43 5.88C15.5 5.81 16.88 7.78 16.88 7.96C16.88 8.01 16.55 8.22 16.16 8.42L15.44 8.79L14.76 8.38ZM9.65 7.32C10.58 6.37 10.36 6.07 9.41 7C9.02 7.38 8.53 7.69 8.33 7.69C8.12 7.69 7.66 7.39 7.31 7.03C6.96 6.67 6.55 6.38 6.39 6.38C6.22 6.38 6.43 6.71 6.94 7.22C8.03 8.33 8.64 8.36 9.65 7.32Z\"]}];\n\nconst BY_ID = new Map(STUDIO_ICONS.map((i) => [i.id, i]));\n\nexport function studioIcon(id: string): StudioIcon | undefined {\n  return BY_ID.get(id);\n}\n","runtime/src/studio/variables.ts":"/* AUTO-GENERATED FILE — do not edit.\n * Source: src/lib/studio/variables.ts (web app)\n * Regenerate: npm run sync:contract (inside runtime/)\n */\n/**\n * Variables in Graphics Studio designs saved to a bot: text such as\n * \"Welcome {user}!\" and pictures whose source is a variable ({user.avatar}).\n * Shared by the studio (placeholders while editing) and the bot runtime, which\n * fills them in for the member who joined, ran the command and so on.\n */\nimport type { Design, Layer } from \"./render.js\";\n\nexport interface ImageVariable {\n  token: string;\n  label: string;\n  /** Shown in the studio's preview. */\n  sample: string;\n}\n\n/** Text variables an image understands (custom flow variables work too). */\nexport const IMAGE_TEXT_VARIABLES: ImageVariable[] = [\n  { token: \"user\", label: \"Member name\", sample: \"Natalia\" },\n  { token: \"username\", label: \"Username\", sample: \"natalia\" },\n  { token: \"server.name\", label: \"Server name\", sample: \"Bottly Community\" },\n  { token: \"server.memberCount\", label: \"Member count\", sample: \"1,248\" },\n  { token: \"server.memberOrdinal\", label: \"Member number (1,248th)\", sample: \"1,248th\" },\n  { token: \"channel.name\", label: \"Channel name\", sample: \"welcome\" },\n  { token: \"date\", label: \"Today's date\", sample: \"24 Oct 2026\" },\n];\n\n/** Pictures a layer or background can take from the event. */\nexport const IMAGE_PICTURE_VARIABLES: ImageVariable[] = [\n  { token: \"user.avatar\", label: \"Member avatar\", sample: \"\" },\n  { token: \"server.icon\", label: \"Server icon\", sample: \"\" },\n];\n\nconst PICTURE = /^\\{([a-zA-Z0-9_.-]+)\\}$/;\n\n/** \"{user.avatar}\" → \"user.avatar\"; null for a normal picture. */\nexport function pictureVariable(src: string): string | null {\n  return PICTURE.exec(src.trim())?.[1] ?? null;\n}\n\n/** True when the design changes per member (worth saving to a bot as a template). */\nexport function designHasVariables(d: Design): boolean {\n  if (d.background.image && pictureVariable(d.background.image.src)) return true;\n  return d.layers.some(\n    (l) =>\n      (l.type === \"text\" && /\\{[a-zA-Z0-9_.-]+\\}/.test(l.text)) ||\n      (l.type === \"image\" && pictureVariable(l.src) !== null),\n  );\n}\n\n/**\n * A copy of the design with variables filled in: `text` replaces tokens in\n * text layers, `picture` turns a picture variable into an image source.\n */\nexport function fillDesign(\n  d: Design,\n  text: (token: string) => string,\n  picture: (token: string) => string,\n): Design {\n  const fillText = (s: string) =>\n    s.replace(/\\{([a-zA-Z0-9_.-]+)\\}/g, (_m, token: string) => text(token));\n  const fillSrc = (src: string) => {\n    const token = pictureVariable(src);\n    return token === null ? src : picture(token);\n  };\n  const layers = d.layers.map((l): Layer => {\n    if (l.type === \"text\") return { ...l, text: fillText(l.text) };\n    if (l.type === \"image\") return { ...l, src: fillSrc(l.src) };\n    return l;\n  });\n  const bg = d.background.image\n    ? { ...d.background, image: { ...d.background.image, src: fillSrc(d.background.image.src) } }\n    : d.background;\n  return { ...d, background: bg, layers };\n}\n\n/** Every picture variable a design uses. */\nexport function designPictureVariables(d: Design): string[] {\n  const out = new Set<string>();\n  const add = (src: string) => {\n    const t = pictureVariable(src);\n    if (t) out.add(t);\n  };\n  if (d.background.image) add(d.background.image.src);\n  for (const l of d.layers) if (l.type === \"image\") add(l.src);\n  return [...out];\n}\n\n/** English ordinal: 1st, 2nd, 3rd, 11th, 1,248th. */\nexport function ordinal(n: number): string {\n  const s = n.toLocaleString(\"en-US\");\n  const tens = n % 100;\n  if (tens >= 11 && tens <= 13) return `${s}th`;\n  return s + ([\"th\", \"st\", \"nd\", \"rd\"][n % 10] ?? \"th\");\n}\n\n/** The file a bot image is sent as: \"Welcome card\" → \"welcome-card.png\". */\nexport function imageFileName(name: string): string {\n  const base = name\n    .normalize(\"NFKD\")\n    .replace(/[\\u0300-\\u036f]/g, \"\")\n    .replace(/ł/g, \"l\")\n    .replace(/Ł/g, \"L\")\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, \"-\")\n    .replace(/^-+|-+$/g, \"\")\n    .slice(0, 40);\n  return `${base || \"image\"}.png`;\n}\n","runtime/src/studio-image.ts":"/**\n * Bot images: Graphics Studio designs saved to the bot (welcome cards…),\n * rendered here with @napi-rs/canvas when a message attaches one. Text\n * variables ({user}, {server.memberCount}…) and picture variables\n * ({user.avatar}) are filled in for the run before rendering.\n *\n * The renderer is the studio's own (synced into ./studio by\n * scripts/sync-studio.mjs), so the PNG matches what the owner designed.\n */\nimport { readdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createCanvas, GlobalFonts, loadImage, Path2D } from \"@napi-rs/canvas\";\nimport { STUDIO_FONTS } from \"./studio/font-list.js\";\nimport {\n  designAssets,\n  registerImage,\n  renderDesign,\n  setCanvasBackend,\n  type Design,\n} from \"./studio/render.js\";\nimport { designPictureVariables, fillDesign } from \"./studio/variables.js\";\n\nexport { imageFileName } from \"./studio/variables.js\";\n\nexport interface BotImage {\n  name: string;\n  design: Design;\n}\n\nconst MAX_SIDE = 2048;\nconst MAX_LAYERS = 120;\n\nlet ready = false;\n\n/** Fonts and the canvas backend, once per process. */\nfunction setup(): void {\n  if (ready) return;\n  ready = true;\n  setCanvasBackend({\n    createCanvas: (w, h) => createCanvas(w, h) as unknown as HTMLCanvasElement,\n    path: (d) => new Path2D(d) as unknown as globalThis.Path2D,\n  });\n  // dist/studio-image.js → ../fonts (the image ships runtime/fonts there).\n  const dir = resolve(dirname(fileURLToPath(import.meta.url)), \"../fonts\");\n  let files: string[] = [];\n  try {\n    files = readdirSync(dir).filter((f) => f.endsWith(\".woff2\"));\n  } catch {\n    return;\n  }\n  // Canvas here does not merge two files of one family: the latin-ext subset\n  // (Polish and other accented letters) is its own family, named in fontCss.\n  for (const font of STUDIO_FONTS) {\n    // A licensed font file (no fontsource subsets).\n    const ownFile = font.file?.split(\"/\").pop();\n    if (ownFile) {\n      if (files.includes(ownFile)) GlobalFonts.registerFromPath(resolve(dir, ownFile), font.family);\n      continue;\n    }\n    for (const [subset, family] of [\n      [\"latin\", font.family],\n      [\"latin-ext\", `${font.family} Ext`],\n    ] as const) {\n      const file = `${font.pkg}-${subset}-${font.weight}-normal.woff2`;\n      if (files.includes(file)) GlobalFonts.registerFromPath(resolve(dir, file), family);\n    }\n  }\n}\n\n/** Checks a design from the deployment before spending CPU on it. */\nexport function isDesign(value: unknown): value is Design {\n  if (typeof value !== \"object\" || value === null) return false;\n  const d = value as Partial<Design>;\n  return (\n    typeof d.width === \"number\" &&\n    typeof d.height === \"number\" &&\n    d.width >= 16 &&\n    d.height >= 16 &&\n    d.width <= MAX_SIDE &&\n    d.height <= MAX_SIDE &&\n    Array.isArray(d.layers) &&\n    d.layers.length <= MAX_LAYERS &&\n    typeof d.background === \"object\" &&\n    d.background !== null\n  );\n}\n\n/** Data URL pictures already decoded (uploaded backgrounds, stickers). */\nconst decoded = new Set<string>();\n\nasync function loadDataUrls(srcs: string[]): Promise<void> {\n  for (const src of srcs) {\n    if (decoded.has(src) || !src.startsWith(\"data:image/\")) continue;\n    const comma = src.indexOf(\",\");\n    if (comma < 0) continue;\n    try {\n      const img = await loadImage(Buffer.from(src.slice(comma + 1), \"base64\"));\n      registerImage(src, img as unknown as HTMLImageElement);\n      decoded.add(src);\n      if (decoded.size > 100) decoded.delete(decoded.values().next().value as string);\n    } catch {\n      /* a broken picture is left out */\n    }\n  }\n}\n\n/** Studio pictures served by the site (ready-made backgrounds), kept once loaded. */\nconst siteLoaded = new Set<string>();\n\nasync function loadSiteAssets(\n  srcs: string[],\n  siteAsset: (path: string) => string | null,\n  download: (url: string) => Promise<Buffer | null>,\n): Promise<void> {\n  for (const src of srcs) {\n    if (siteLoaded.has(src) || !/^\\/studio\\/[\\w/.-]+$/.test(src)) continue;\n    const url = siteAsset(src);\n    if (!url) continue;\n    const data = await download(url).catch(() => null);\n    if (!data) continue;\n    try {\n      registerImage(src, (await loadImage(data)) as unknown as HTMLImageElement);\n      siteLoaded.add(src);\n    } catch {\n      /* a broken picture is left out */\n    }\n  }\n}\n\nlet renderCount = 0;\n\n/**\n * Renders a bot image to PNG. `text` resolves a text variable, `picture` a\n * picture variable to a URL, and `download` fetches that URL (public https\n * only, size-capped by the caller).\n */\nexport async function renderBotImage(\n  design: Design,\n  text: (token: string) => string,\n  picture: (token: string) => string,\n  download: (url: string) => Promise<Buffer | null>,\n  /** Absolute URL of a site path (\"/studio/backgrounds/…\"), or null to skip. */\n  siteAsset: (path: string) => string | null = () => null,\n): Promise<Buffer> {\n  setup();\n  // Each run gets its own keys, so two members never share a cached avatar.\n  const run = ++renderCount;\n  const pictures = new Map<string, string>();\n  for (const token of designPictureVariables(design)) {\n    const url = picture(token);\n    if (!url) continue;\n    const data = await download(url).catch(() => null);\n    if (!data) continue;\n    try {\n      const key = `bot-image:${run}:${token}`;\n      registerImage(key, (await loadImage(data)) as unknown as HTMLImageElement);\n      pictures.set(token, key);\n    } catch {\n      /* unreadable picture: the layer stays empty */\n    }\n  }\n  const filled = fillDesign(design, text, (token) => pictures.get(token) ?? \"\");\n  const images = designAssets(filled).images;\n  await loadSiteAssets(images, siteAsset, download);\n  await loadDataUrls(images);\n  const canvas = createCanvas(filled.width, filled.height);\n  renderDesign(canvas.getContext(\"2d\") as unknown as CanvasRenderingContext2D, filled);\n  return canvas.encode(\"png\");\n}\n","runtime/src/supervisor.ts":"/**\n * Owns the live BotSession map and the process-wide capacity limit.\n *\n * Sessions are keyed by userId + botId: bot ids are per-user strings from the\n * dashboard, so they are only unique within an owner.\n */\nimport { config } from \"./config.js\";\nimport { logger } from \"./logger.js\";\nimport { BotSession } from \"./session.js\";\nimport { OFFLINE_STATUS, type RuntimeStatusPayload } from \"./types.js\";\n\nconst SWEEP_INTERVAL_MS = 5 * 60_000;\n\nexport class CapacityError extends Error {\n  constructor(limit: number) {\n    super(`This runtime is already hosting its maximum of ${limit} bots.`);\n    this.name = \"CapacityError\";\n  }\n}\n\nconst sessions = new Map<string, BotSession>();\n\nfunction key(userId: string, botId: string): string {\n  return `${userId}:${botId}`;\n}\n\nfunction activeCount(): number {\n  let count = 0;\n  for (const session of sessions.values()) {\n    if (session.isActive()) count += 1;\n  }\n  return count;\n}\n\nexport function statusOf(userId: string, botId: string): RuntimeStatusPayload {\n  // An unknown bot is simply offline — the control plane treats this as \"not running\".\n  return sessions.get(key(userId, botId))?.status() ?? OFFLINE_STATUS;\n}\n\nexport async function startBot(userId: string, botId: string): Promise<RuntimeStatusPayload> {\n  const mapKey = key(userId, botId);\n  let session = sessions.get(mapKey);\n\n  if (!session) {\n    if (activeCount() >= config.maxConcurrentBots) {\n      throw new CapacityError(config.maxConcurrentBots);\n    }\n    session = new BotSession(botId, userId);\n    sessions.set(mapKey, session);\n  }\n\n  const status = await session.start();\n  // A failed start leaves nothing to hold on to.\n  if (session.isIdle()) sessions.delete(mapKey);\n  return status;\n}\n\nexport async function stopBot(userId: string, botId: string): Promise<RuntimeStatusPayload> {\n  const mapKey = key(userId, botId);\n  const session = sessions.get(mapKey);\n  if (!session) return OFFLINE_STATUS;\n\n  const status = await session.stop();\n  if (session.isIdle()) sessions.delete(mapKey);\n  return status;\n}\n\n/** Applies the owner's latest saved presence without restarting the bot. */\nexport async function refreshBotPresence(userId: string, botId: string): Promise<boolean> {\n  const session = sessions.get(key(userId, botId));\n  if (!session) return false;\n  return session.refreshPresence();\n}\n\n/**\n * Pulls the newly published deployment into a RUNNING bot.\n *\n * Returns false when this runtime does not host the bot (it may be running on\n * the owner's own VPS, which picks the change up through its own poll).\n */\nexport async function reloadBot(userId: string, botId: string): Promise<boolean> {\n  const session = sessions.get(key(userId, botId));\n  if (!session) return false;\n  return session.reload();\n}\n\nexport function runtimeSnapshot(): { total: number; active: number } {\n  return { total: sessions.size, active: activeCount() };\n}\n\n/** Drops sessions that hold no connection, so the map cannot grow without bound. */\nfunction sweep(): void {\n  let removed = 0;\n  for (const [mapKey, session] of sessions) {\n    if (session.isIdle()) {\n      sessions.delete(mapKey);\n      removed += 1;\n    }\n  }\n  if (removed > 0) logger.debug(`Swept ${removed} idle bot session(s).`);\n}\n\nexport function startSweeper(): () => void {\n  const timer = setInterval(sweep, SWEEP_INTERVAL_MS);\n  timer.unref();\n  return () => clearInterval(timer);\n}\n\n/** Disconnects everything and tells the control plane, so no bot is left \"online\". */\nexport async function shutdownAll(): Promise<void> {\n  const live = [...sessions.values()].filter((session) => !session.isIdle());\n  if (live.length === 0) return;\n\n  logger.info(`Disconnecting ${live.length} bot(s) before shutdown.`);\n  await Promise.allSettled(live.map((session) => session.stop(\"shutdown\")));\n  sessions.clear();\n}\n","runtime/src/types.ts":"/**\n * Wire types shared with the control plane.\n *\n * These MUST stay in sync with:\n *   src/types/runtime.ts                (dashboard-facing shapes)\n *   src/lib/runtime-client.server.ts    (runtimeStatusSchema — our HTTP responses)\n *   src/lib/bot-runtime-store.server.ts (callbackSchema — our callback payloads)\n */\n\nexport type RuntimeState = \"offline\" | \"starting\" | \"online\" | \"stopping\" | \"error\";\n\nexport type RuntimeEventLevel = \"info\" | \"success\" | \"warning\" | \"error\";\n\n/** Exactly the payload `runtimeStatusSchema` in the control plane parses. */\nexport interface RuntimeStatusPayload {\n  state: RuntimeState;\n  startedAt: string | null;\n  lastError: string | null;\n  guildCount: number | null;\n  username: string | null;\n}\n\n/** One activity entry pushed to /api/internal/runtime/events. */\nexport interface RuntimeEvent {\n  event: string;\n  level: RuntimeEventLevel;\n  description: string;\n  /** ISO 8601 timestamp on the runtime. */\n  at: string;\n  /** The flow and block an error came from, when known. */\n  flowId?: string;\n  nodeId?: string;\n}\n\n/** Full callback body accepted by the control plane. */\nexport interface RuntimeReport extends RuntimeStatusPayload {\n  botId: string;\n  userId: string;\n  events: RuntimeEvent[];\n}\n\n/** Encrypted token record as served by /api/internal/bots/:botId/token. */\nexport interface EncryptedBotToken {\n  ciphertext: string;\n  iv: string;\n  keyVersion: number;\n  applicationId: string | null;\n}\n\nexport const OFFLINE_STATUS: RuntimeStatusPayload = {\n  state: \"offline\",\n  startedAt: null,\n  lastError: null,\n  guildCount: null,\n  username: null,\n};\n\nexport function nowIso(): string {\n  return new Date().toISOString();\n}\n","runtime/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"lib\": [\"ES2023\"],\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"types\": [\"node\"],\n    \"rootDir\": \"src\",\n    \"outDir\": \"dist\",\n    \"strict\": true,\n    \"noUncheckedIndexedAccess\": true,\n    \"exactOptionalPropertyTypes\": true,\n    \"noImplicitOverride\": true,\n    \"noFallthroughCasesInSwitch\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"verbatimModuleSyntax\": true,\n    \"isolatedModules\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": false,\n    \"sourceMap\": true,\n    \"removeComments\": false\n  },\n  \"include\": [\"src/**/*.ts\"]\n}\n","runtime/Dockerfile":"# Bot runtime service.\n# Build from the repo root:  docker build -f runtime/Dockerfile -t bottly-runtime .\nFROM node:22-alpine AS build\nWORKDIR /app\nCOPY runtime/package.json ./\nRUN npm install --no-audit --no-fund\nCOPY runtime/tsconfig.json ./\nCOPY runtime/src ./src\nCOPY runtime/scripts ./scripts\n\n# sync-contract.mjs resolves the web app contract from\n# ../../src/lib/flow/contract.ts relative to runtime/scripts.\n# Because the runtime is copied to /app, that becomes /src/lib/flow/contract.ts.\nCOPY src/lib/flow/contract.ts /src/lib/flow/contract.ts\n# sync-studio.mjs copies the Graphics Studio renderer the same way.\nCOPY src/lib/studio/render.ts src/lib/studio/font-list.ts src/lib/studio/variables.ts /src/lib/studio/\nCOPY src/data/studio-icons.ts /src/data/studio-icons.ts\n\nRUN npm run build\n\nFROM node:22-alpine AS release\nWORKDIR /app\nENV NODE_ENV=production\nCOPY runtime/package.json ./\nRUN npm install --omit=dev --no-audit --no-fund && npm cache clean --force\nCOPY --from=build /app/dist ./dist\n# Graphics Studio fonts for bot images (latin + latin-ext).\nCOPY runtime/fonts ./fonts\n\n# Long-lived gateway connections: never run as root, and let the platform\n# restart the container on failure rather than swallowing crashes.\nUSER node\nEXPOSE 8787\nCMD [\"node\", \"dist/index.js\"]\n","runtime/fonts/README.md":"# Studio fonts\n\nGraphics Studio fonts for bot images, copied from the web app's fontsource\npackages by `scripts/sync-studio.mjs` (latin + latin-ext subsets). All are\nGoogle Fonts under the SIL Open Font License 1.1.\n","src/lib/flow/contract.ts":"/**\n * SHARED FLOW CONTRACT — single source of truth for what a Bottly flow means.\n *\n * This file is deliberately dependency-free (no imports at all) because it is\n * copied verbatim into the bot runtime as `runtime/src/flow-contract.ts` by\n * `runtime/scripts/sync-contract.mjs`. Web app and runtime therefore validate\n * and interpret the exact same graph semantics.\n *\n * Pipeline:\n *   Flow Builder → Flow JSON → validateFlow() → compileFlow() → CompiledFlow\n *   → runtime executor → discord.js → Discord API\n *\n * Every node's discord.js mapping, required gateway intents and required bot\n * permissions are declared in NODE_SPECS below. Nodes marked \"unsupported\" are\n * NOT executed by the runtime and are reported as validation warnings — they\n * are never silently faked.\n */\n\nexport const FLOW_CONTRACT_VERSION = 1 as const;\n\n/* ------------------------------------------------------------------ *\n * Graph shapes (structurally identical to src/types/flow.ts)\n * ------------------------------------------------------------------ */\n\nexport type ConfigValue = string | number | boolean;\n\nexport interface RawFlowNode {\n  id: string;\n  /** Canvas position: several blocks on one output run left to right. */\n  position?: { x: number; y: number } | undefined;\n  data: {\n    type: string;\n    title?: string;\n    enabled?: boolean;\n    config?: Record<string, ConfigValue>;\n    embed?: unknown;\n    embeds?: unknown;\n    components?: unknown;\n    messageType?: \"embed\" | \"components\";\n    options?: unknown;\n  };\n}\n\nexport interface RawFlowEdge {\n  id: string;\n  source: string;\n  target: string;\n  sourceHandle?: string | null | undefined;\n  targetHandle?: string | null | undefined;\n}\n\nexport interface RawFlow {\n  id: string;\n  name: string;\n  description?: string;\n  nodes: RawFlowNode[];\n  edges: RawFlowEdge[];\n}\n\n/* ------------------------------------------------------------------ *\n * Node specifications\n * ------------------------------------------------------------------ */\n\n/** How faithfully the runtime implements a node against discord.js. */\nexport type NodeSupport = \"full\" | \"partial\" | \"unsupported\";\n\nexport type NodeKind = \"trigger\" | \"action\" | \"condition\";\n\n/**\n * Context a node needs from the event that started the flow.\n *  interaction  — a repliable interaction (slash/button/select/modal)\n *  message      — a Message object\n *  guild        — the event happened in a guild, not a DM\n *  member       — a GuildMember for the acting user\n */\nexport type ContextKind = \"interaction\" | \"message\" | \"guild\" | \"member\";\n\nexport interface NodeSpec {\n  kind: NodeKind;\n  support: NodeSupport;\n  /** The discord.js API this node actually calls. Documentation, not code. */\n  discord: string;\n  /** GatewayIntentBits names required for this node to work. */\n  intents: string[];\n  /** PermissionFlagsBits names the BOT needs in the guild. */\n  permissions: string[];\n  /** Context the node reads from the trigger. */\n  requires: ContextKind[];\n  /** Context a trigger provides to everything downstream. */\n  provides?: ContextKind[];\n  /** True when the node acknowledges a Discord interaction. */\n  acknowledges?: boolean;\n  /** Output handles, in the order the builder draws them. */\n  outputs: string[];\n  /** Config keys that must be non-empty. */\n  required?: string[];\n  /** Why the node is partial/unsupported. Surfaced in the builder. */\n  note?: string;\n}\n\nconst INTERACTION_CTX: ContextKind[] = [\"interaction\"];\n\nexport const NODE_SPECS: Record<string, NodeSpec> = {\n  /* ----------------------------- Triggers ---------------------------- */\n  \"slash-command\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord:\n      \"Client#on(Events.InteractionCreate) filtered by ChatInputCommandInteraction#commandName; registered through REST Routes.applicationCommands()\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"interaction\", \"guild\", \"member\"],\n    outputs: [\"out\"],\n    required: [\"name\", \"description\"],\n  },\n  \"button-click\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Events.InteractionCreate + ButtonInteraction#customId\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"interaction\", \"guild\", \"member\", \"message\"],\n    outputs: [\"out\"],\n    required: [\"customId\"],\n  },\n  \"dropdown-select\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord:\n      \"Events.InteractionCreate + AnySelectMenuInteraction#customId (string/user/role/channel/mentionable)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"interaction\", \"guild\", \"member\", \"message\"],\n    outputs: [\"out\"],\n    required: [\"customId\"],\n  },\n  \"modal-submit\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Events.InteractionCreate + ModalSubmitInteraction#customId\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"interaction\", \"guild\", \"member\"],\n    outputs: [\"out\"],\n    required: [\"customId\"],\n  },\n  \"message-received\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Client#on(Events.MessageCreate)\",\n    intents: [\"Guilds\", \"GuildMessages\", \"MessageContent\"],\n    permissions: [],\n    requires: [],\n    provides: [\"message\", \"guild\", \"member\"],\n    outputs: [\"out\"],\n  },\n  \"member-joined\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Client#on(Events.GuildMemberAdd)\",\n    intents: [\"Guilds\", \"GuildMembers\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\", \"member\"],\n    outputs: [\"out\"],\n  },\n  \"member-left\": {\n    kind: \"trigger\",\n    support: \"partial\",\n    discord: \"Client#on(Events.GuildMemberRemove)\",\n    intents: [\"Guilds\", \"GuildMembers\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\", \"member\"],\n    outputs: [\"out\"],\n    note: \"The member has already left: {user} always works, but member details (roles, nickname) are only there when Discord still had them cached.\",\n  },\n  \"reaction-added\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Client#on(Events.MessageReactionAdd)\",\n    intents: [\"Guilds\", \"GuildMessageReactions\"],\n    permissions: [],\n    requires: [],\n    provides: [\"message\", \"guild\", \"member\"],\n    outputs: [\"out\"],\n  },\n  \"reaction-removed\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Client#on(Events.MessageReactionRemove)\",\n    intents: [\"Guilds\", \"GuildMessageReactions\"],\n    permissions: [],\n    requires: [],\n    provides: [\"message\", \"guild\", \"member\"],\n    outputs: [\"out\"],\n  },\n  \"bot-ready\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Client#once(Events.ClientReady)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [],\n    outputs: [\"out\"],\n  },\n  \"scheduled-event\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord:\n      \"setInterval inside the runtime — 5-field cron with *, numbers, lists, ranges and steps, in UTC or the chosen time zone\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [],\n    outputs: [\"out\"],\n    required: [\"cron\"],\n    note: \"Runs at minute resolution while the bot is online.\",\n  },\n\n  /* ----------------------------- Messages ---------------------------- */\n  \"send-message\": {\n    kind: \"action\",\n    support: \"full\",\n    discord:\n      \"TextChannel#send() — or Interaction#reply({ flags: Ephemeral }) when Ephemeral is on (only possible from an interaction)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\", \"SendMessages\", \"EmbedLinks\"],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"content\"],\n  },\n  reply: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Interaction#reply()/followUp() or Message#reply()\",\n    intents: [\"Guilds\"],\n    permissions: [\"SendMessages\", \"EmbedLinks\", \"ReadMessageHistory\"],\n    requires: [],\n    acknowledges: true,\n    outputs: [\"out\"],\n    required: [\"content\"],\n  },\n  \"send-embed\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"EmbedBuilder + TextChannel#send({ embeds, components })\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\", \"SendMessages\", \"EmbedLinks\"],\n    requires: [],\n    outputs: [\"out\"],\n  },\n  \"edit-message\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"TextChannel#messages.fetch() then Message#edit() — only messages the bot sent\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\", \"ReadMessageHistory\"],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"messageId\"],\n  },\n  \"delete-message\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Message#delete()\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageMessages\", \"ReadMessageHistory\"],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"messageId\"],\n  },\n  \"send-dm\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"User#createDM() then DMChannel#send()\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"user\"],\n  },\n\n  /* ---------------------------- Components --------------------------- */\n  // Components are authored on the message nodes themselves (the Components\n  // editor writes node.data.components). The standalone component nodes are\n  // builder-only scaffolding and are skipped by the runtime.\n  \"component-button\": componentNode(\"ButtonBuilder / ActionRowBuilder\"),\n  \"component-dropdown\": componentNode(\"StringSelectMenuBuilder\"),\n  \"component-string-select\": componentNode(\"StringSelectMenuBuilder\"),\n  \"component-user-select\": componentNode(\"UserSelectMenuBuilder\"),\n  \"component-role-select\": componentNode(\"RoleSelectMenuBuilder\"),\n  \"component-channel-select\": componentNode(\"ChannelSelectMenuBuilder\"),\n  \"component-mentionable-select\": componentNode(\"MentionableSelectMenuBuilder\"),\n  // Older \"Modal\" block: now opens the same form as Show Modal.\n  \"component-modal\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Interaction#showModal() — answer it with a Modal Submit trigger\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: INTERACTION_CTX,\n    acknowledges: true,\n    outputs: [\"out\"],\n    required: [\"title\"],\n  },\n  \"component-text-input\": {\n    kind: \"action\",\n    support: \"unsupported\",\n    discord: \"TextInputBuilder (modal field)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    note: \"Modal fields belong to a modal; standalone text-input nodes are skipped at runtime.\",\n  },\n\n  /* ---------------------------- Moderation --------------------------- */\n  \"ban-user\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMemberManager#ban({ reason, deleteMessageSeconds })\",\n    intents: [\"Guilds\"],\n    permissions: [\"BanMembers\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\"],\n  },\n  \"kick-user\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMember#kick(reason)\",\n    intents: [\"Guilds\"],\n    permissions: [\"KickMembers\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\"],\n  },\n  \"timeout-user\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMember#timeout(ms, reason)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ModerateMembers\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\", \"duration\"],\n  },\n  \"warn-user\": {\n    kind: \"action\",\n    support: \"partial\",\n    discord: \"User#send() for the DM — Bottly has no warning store, so nothing is persisted\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\"],\n    note: \"Sends the warning DM (when enabled) and logs a runtime event. Warnings are not counted or stored.\",\n  },\n  \"delete-messages\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"TextChannel#bulkDelete(amount, true)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageMessages\", \"ReadMessageHistory\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"amount\"],\n  },\n  \"add-role\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMemberRoleManager#add(role)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\", \"role\"],\n  },\n  \"remove-role\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMemberRoleManager#remove(role)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\", \"role\"],\n  },\n  \"move-member\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMember#voice.setChannel(channel)\",\n    intents: [\"Guilds\", \"GuildVoiceStates\"],\n    permissions: [\"MoveMembers\"],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\", \"channel\"],\n  },\n\n  /* ------------------------------- Logic ----------------------------- */\n  \"if-else\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Pure runtime logic on resolved variables\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"true\", \"false\"],\n  },\n  \"check-permission\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"GuildMember#permissions.has(PermissionFlagsBits[...])\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"true\", \"false\"],\n    required: [\"permission\"],\n  },\n  \"check-role\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"GuildMemberRoleManager#cache lookup by id or name\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"true\", \"false\"],\n    required: [\"role\"],\n  },\n  \"check-channel\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Compares the event channel id/name\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    outputs: [\"true\", \"false\"],\n    required: [\"channel\"],\n  },\n  compare: {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Numeric comparison of resolved values\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"true\", \"false\"],\n  },\n  contains: {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"String comparison of resolved values\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"true\", \"false\"],\n  },\n  equals: {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"String comparison of resolved values\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"true\", \"false\"],\n  },\n  random: {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Math.random() branch\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"a\", \"b\"],\n  },\n  delay: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"await setTimeout(ms) inside the flow run\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n  },\n  cooldown: {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"In-memory per user/channel/guild rate limit inside the runtime\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"blocked\"],\n    note: \"The cooldown map lives in the runtime process and resets when the bot restarts.\",\n  },\n  \"rate-counter\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"In-memory sliding-window counter per key inside the runtime\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"under\", \"over\"],\n    required: [\"key\"],\n    note: \"Counts runs per key (e.g. spam:{user.id}) in the last N seconds and sets {rate.count}. The counter lives in the bot process and resets when the bot restarts.\",\n  },\n\n  /* ---------------------------- Discord data -------------------------- */\n  \"get-user\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"UserManager#fetch(id)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"user\", \"storeAs\"],\n  },\n  \"get-member\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMemberManager#fetch(id)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"user\", \"storeAs\"],\n  },\n  \"get-server\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Interaction/Message#guild\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"storeAs\"],\n  },\n  \"get-channel\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"ChannelManager#fetch(id)\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\"],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"channel\", \"storeAs\"],\n  },\n  \"get-role\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"RoleManager#fetch() / cache lookup\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"out\"],\n    required: [\"role\", \"storeAs\"],\n  },\n\n  /* ----------------------------- Variables ---------------------------- */\n  \"set-variable\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime-local flow variable (per run)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\"],\n    note: \"Variables live for the duration of one flow run; they are not persisted between events.\",\n  },\n  \"run-code\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Sandboxed QuickJS call to a function exported by the flow's code file\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"error\"],\n    required: [\"fn\"],\n    note: \"Runs in an isolated sandbox (5 s, 16 MB, 20 db/fetch calls). Only bot storage and public HTTPS are reachable. Returned keys become {code.key} variables.\",\n  },\n  \"get-variable\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime-local flow variable (per run)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\"],\n  },\n  increment: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime-local flow variable (per run)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\"],\n  },\n  decrement: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime-local flow variable (per run)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\"],\n  },\n  \"format-text\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Template interpolation of flow variables\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"storeAs\"],\n  },\n\n  /* --------------------------- Extra triggers -------------------------- */\n  \"message-edited\": trg(\n    \"Client#on(Events.MessageUpdate)\",\n    [\"GuildMessages\", \"MessageContent\"],\n    [\"message\", \"guild\", \"member\"],\n  ),\n  \"message-deleted\": {\n    ...trg(\n      \"Client#on(Events.MessageDelete)\",\n      [\"GuildMessages\", \"MessageContent\"],\n      [\"message\", \"guild\", \"member\"],\n    ),\n    support: \"partial\",\n    note: \"Discord only says which message was deleted: its text and author are known only for messages the bot saw since it started.\",\n  },\n  // Message content of DMs needs no privileged intent.\n  \"dm-received\": trg(\n    \"Client#on(Events.MessageCreate) filtered to DM channels\",\n    [\"DirectMessages\"],\n    [\"message\"],\n  ),\n  \"voice-join\": trg(\n    \"Client#on(Events.VoiceStateUpdate) — joined a channel\",\n    [\"GuildVoiceStates\"],\n    [\"guild\", \"member\"],\n  ),\n  \"voice-leave\": trg(\n    \"Client#on(Events.VoiceStateUpdate) — left a channel\",\n    [\"GuildVoiceStates\"],\n    [\"guild\", \"member\"],\n  ),\n  \"voice-move\": trg(\n    \"Client#on(Events.VoiceStateUpdate) — moved channel\",\n    [\"GuildVoiceStates\"],\n    [\"guild\", \"member\"],\n  ),\n  \"channel-created\": trg(\"Client#on(Events.ChannelCreate)\", [], [\"guild\"]),\n  \"channel-deleted\": trg(\"Client#on(Events.ChannelDelete)\", [], [\"guild\"]),\n  \"thread-created\": trg(\"Client#on(Events.ThreadCreate)\", [], [\"guild\"]),\n  \"role-created\": trg(\"Client#on(Events.GuildRoleCreate)\", [], [\"guild\"]),\n  \"role-deleted\": trg(\"Client#on(Events.GuildRoleDelete)\", [], [\"guild\"]),\n  \"member-banned\": trg(\"Client#on(Events.GuildBanAdd)\", [\"GuildModeration\"], [\"guild\"]),\n  \"member-unbanned\": trg(\"Client#on(Events.GuildBanRemove)\", [\"GuildModeration\"], [\"guild\"]),\n  \"member-updated\": trg(\n    \"Client#on(Events.GuildMemberUpdate)\",\n    [\"GuildMembers\"],\n    [\"guild\", \"member\"],\n  ),\n  \"invite-created\": {\n    ...trg(\"Client#on(Events.InviteCreate)\", [\"GuildInvites\"], [\"guild\"]),\n    // Discord only sends INVITE_CREATE to bots that can manage the channel.\n    permissions: [\"ManageChannels\"],\n  },\n  \"typing-start\": trg(\"Client#on(Events.TypingStart)\", [\"GuildMessageTyping\"], [\"guild\", \"member\"]),\n  \"guild-joined\": trg(\"Client#on(Events.GuildCreate)\", [], [\"guild\"]),\n  \"server-event-created\": trg(\n    \"Client#on(Events.GuildScheduledEventCreate)\",\n    [\"GuildScheduledEvents\"],\n    [\"guild\"],\n  ),\n  \"server-event-started\": trg(\n    \"Client#on(Events.GuildScheduledEventUpdate) when the status becomes Active\",\n    [\"GuildScheduledEvents\"],\n    [\"guild\"],\n  ),\n  \"server-event-interested\": trg(\n    \"Client#on(Events.GuildScheduledEventUserAdd)\",\n    [\"GuildScheduledEvents\"],\n    [\"guild\", \"member\"],\n  ),\n  \"automod-action\": {\n    ...trg(\"Client#on(Events.AutoModerationActionExecution)\", [\"AutoModerationExecution\"], [\"guild\", \"member\"]),\n    permissions: [\"ManageGuild\"],\n  },\n\n  /* --------------------------- Extra messages -------------------------- */\n  \"add-reaction\": act(\"Message#react()\", {\n    permissions: [\"AddReactions\", \"ReadMessageHistory\"],\n    required: [\"emoji\"],\n  }),\n  \"remove-reactions\": act(\"MessageReaction#remove() / Message#reactions.removeAll()\", {\n    permissions: [\"ManageMessages\"],\n  }),\n  \"pin-message\": act(\"Message#pin()\", {\n    permissions: [\"PinMessages\", \"ReadMessageHistory\"],\n    note: \"A channel holds at most 250 pinned messages.\",\n  }),\n  \"unpin-message\": act(\"Message#unpin()\", { permissions: [\"PinMessages\", \"ReadMessageHistory\"] }),\n  \"publish-message\": act(\"Message#crosspost()\", {\n    permissions: [\"SendMessages\", \"ManageMessages\"],\n    note: \"Only in announcement channels; Discord allows 10 publishes per hour per channel.\",\n  }),\n  \"get-message\": act(\"TextChannel#messages.fetch()\", {\n    permissions: [\"ReadMessageHistory\"],\n    required: [\"messageId\", \"storeAs\"],\n  }),\n  \"send-file\": act(\"TextChannel#send({ files: [url] })\", {\n    permissions: [\"ViewChannel\", \"SendMessages\", \"AttachFiles\"],\n    required: [\"url\"],\n  }),\n  \"file-from-text\": act(\"TextChannel#send({ files: [AttachmentBuilder(text)] }) / interaction reply\", {\n    permissions: [\"ViewChannel\", \"SendMessages\", \"AttachFiles\"],\n    required: [\"fileName\", \"fileContent\"],\n    note: \"File names end in .txt, .json, .csv or .md; the file holds at most 1 MB of text.\",\n  }),\n  \"webhook-send\": act(\"TextChannel#fetchWebhooks()/createWebhook() + Webhook#send({ username, avatarURL })\", {\n    permissions: [\"ViewChannel\", \"ManageWebhooks\"],\n    requires: [\"guild\"],\n    note: 'Reuses (or creates) one webhook named \"Bottly\" per channel. Sets {webhook.messageId}.',\n  }),\n  \"fetch-channel-messages\": act(\"TextChannel#messages.fetch({ limit })\", {\n    intents: [\"Guilds\", \"GuildMessages\", \"MessageContent\"],\n    permissions: [\"ViewChannel\", \"ReadMessageHistory\"],\n    note: \"Reads up to 50 recent messages. Sets {history.text} (\\\"name: content\\\" lines, at most 4000 characters), {history.count}, {history.lastAuthorId} and {history.lastAt} (unix seconds).\",\n  }),\n  \"create-poll\": act(\"TextChannel#send({ poll })\", {\n    permissions: [\"ViewChannel\", \"SendMessages\", \"SendPolls\"],\n    required: [\"question\", \"answers\"],\n  }),\n  \"start-typing\": act(\"TextChannel#sendTyping()\", { permissions: [\"ViewChannel\", \"SendMessages\"] }),\n  \"defer-reply\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"RepliableInteraction#deferReply()\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: INTERACTION_CTX,\n    acknowledges: true,\n    outputs: [\"out\"],\n  },\n  \"show-modal\": {\n    kind: \"action\",\n    support: \"full\",\n    discord:\n      \"Interaction#showModal() with Label fields (text, dropdowns, pickers, file upload) — answer it on the Submitted output (awaitModalSubmit) or with a Modal Submit trigger\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: INTERACTION_CTX,\n    acknowledges: true,\n    outputs: [\"out\", \"submitted\"],\n    required: [\"customId\", \"title\"],\n    note: 'Fields go in config \"modalFields\" as a JSON array (max 5) of {id, kind: \"short\"|\"paragraph\"|\"select\"|\"user-select\"|\"role-select\"|\"channel-select\"|\"mentionable-select\"|\"file\"|\"radio\"|\"checkbox-group\"|\"checkbox\"|\"text\", label, description?, placeholder?, required?, minLength?, maxLength?, value?, options?: [{label, value, description?, emoji?, default?}], minValues?, maxValues?, content? (for \"text\")}. Radio buttons take 2-10 options, checkboxes 1-10; a single checkbox answers \"yes\"/\"no\" (value \"true\" = checked by default). Blocks on the \"submitted\" output run in the same flow when the form is sent (waits up to 15 minutes; the submit is a new interaction to reply to, earlier variables are kept), and a Modal Submit trigger with the same customId also works. Each answer is {id} (pickers: mentions, files: links) plus {id.values} and {id.count}. \"out\" runs right after the form is shown and cannot reply.',\n  },\n\n  /* -------------------------- Server management ------------------------ */\n  \"create-channel\": act(\"Guild#channels.create()\", {\n    permissions: [\"ManageChannels\"],\n    requires: [\"guild\"],\n    required: [\"name\"],\n  }),\n  \"delete-channel\": act(\"GuildChannel#delete()\", {\n    permissions: [\"ManageChannels\"],\n    requires: [\"guild\"],\n    required: [\"channel\"],\n  }),\n  \"rename-channel\": act(\"GuildChannel#setName()\", {\n    permissions: [\"ManageChannels\"],\n    requires: [\"guild\"],\n    required: [\"name\"],\n    note: \"Discord allows 2 name or topic changes per channel every 10 minutes; more wait in a queue.\",\n  }),\n  \"set-channel-topic\": act(\"TextChannel#setTopic()\", {\n    permissions: [\"ManageChannels\"],\n    requires: [\"guild\"],\n    note: \"Discord allows 2 name or topic changes per channel every 10 minutes; more wait in a queue.\",\n  }),\n  \"set-slowmode\": act(\"TextChannel#setRateLimitPerUser()\", {\n    permissions: [\"ManageChannels\"],\n    requires: [\"guild\"],\n  }),\n  \"set-channel-permission\": act(\"GuildChannel#permissionOverwrites.edit()\", {\n    permissions: [\"ManageRoles\", \"ManageChannels\"],\n    requires: [\"guild\"],\n    required: [\"target\", \"permission\"],\n  }),\n  \"create-private-channel\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Guild#channels.create({ permissionOverwrites }) — @everyone denied ViewChannel\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageChannels\", \"ManageRoles\"],\n    requires: [\"guild\"],\n    outputs: [\"out\", \"failed\"],\n    required: [\"name\"],\n    note: \"Only the listed members and roles (and the bot) can see the channel. Sets {name}, {name.id} and {name.name} (default prefix privateChannel); failures land in {name.error}.\",\n  },\n  \"lockdown-channels\": act(\"GuildChannel#permissionOverwrites.edit(@everyone, { SendMessages })\", {\n    permissions: [\"ManageRoles\", \"ManageChannels\"],\n    requires: [\"guild\"],\n    note: \"Lock denies Send Messages (and in threads) to @everyone; unlock resets them. Sets {lockdown.count}.\",\n  }),\n  \"apply-server-template\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Guild#roles.create() + Guild#channels.create() for every missing role, category and channel\",\n    intents: [\"Guilds\"],\n    permissions: [\"ManageRoles\", \"ManageChannels\"],\n    requires: [\"guild\"],\n    outputs: [\"out\", \"failed\"],\n    required: [\"structure\"],\n    note: 'Config \"structure\" is JSON: {roles: [{name, color?, hoist?, mentionable?}], categories: [{name, private?, allowRoles?, channels: [{name, type?: \"text\"|\"voice\"|\"announcement\"|\"forum\"|\"stage\", topic?, private?, allowRoles?}]}], channels?: [...]}. Roles, categories and channels that already exist (same name) are reused. At most 50 roles and 100 categories and channels. Sets {template.created}, {template.skipped}, {template.failed}, {template.error}.',\n  },\n  \"server-backup\": act(\"Guild#roles + Guild#channels → JSON file sent with TextChannel#send({ files })\", {\n    permissions: [\"ViewChannel\", \"SendMessages\", \"AttachFiles\"],\n    requires: [\"guild\"],\n    note: \"Sends roles (permissions, colours) and categories/channels (overwrites by role name) as a JSON file and sets {backup.size}. Apply Server Template can recreate the structure from it.\",\n  }),\n  \"create-thread\": act(\"TextChannel#threads.create() / Message#startThread() / ForumChannel#threads.create()\", {\n    permissions: [\"CreatePublicThreads\", \"CreatePrivateThreads\", \"SendMessagesInThreads\"],\n    requires: [\"guild\"],\n    required: [\"name\"],\n  }),\n  \"archive-thread\": act(\"ThreadChannel#setArchived(true)\", {\n    permissions: [\"ManageThreads\"],\n    requires: [\"guild\"],\n  }),\n  \"lock-thread\": act(\"ThreadChannel#setLocked()\", {\n    permissions: [\"ManageThreads\"],\n    requires: [\"guild\"],\n  }),\n  \"create-invite\": act(\"GuildChannel#createInvite()\", {\n    permissions: [\"CreateInstantInvite\"],\n    requires: [\"guild\"],\n    required: [\"storeAs\"],\n  }),\n  \"create-role\": act(\"Guild#roles.create()\", {\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    required: [\"name\", \"storeAs\"],\n  }),\n  \"edit-role\": act(\"Role#edit()\", {\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    required: [\"role\"],\n  }),\n  \"delete-role\": act(\"Role#delete()\", {\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    required: [\"role\"],\n  }),\n  \"set-nickname\": act(\"GuildMember#setNickname()\", {\n    permissions: [\"ManageNicknames\"],\n    requires: [\"guild\"],\n    required: [\"user\"],\n  }),\n  \"unban-user\": act(\"Guild#bans.remove()\", {\n    permissions: [\"BanMembers\"],\n    requires: [\"guild\"],\n    required: [\"user\"],\n  }),\n  \"set-presence\": act(\"Client#user.setPresence()\", { intents: [] }),\n\n  /* -------------------------------- Voice ------------------------------ */\n  \"voice-mute\": act(\"GuildMember#voice.setMute()\", {\n    permissions: [\"MuteMembers\"],\n    intents: [\"GuildVoiceStates\"],\n    requires: [\"guild\"],\n    required: [\"user\"],\n  }),\n  \"voice-deafen\": act(\"GuildMember#voice.setDeaf()\", {\n    permissions: [\"DeafenMembers\"],\n    intents: [\"GuildVoiceStates\"],\n    requires: [\"guild\"],\n    required: [\"user\"],\n  }),\n  \"disconnect-member\": act(\"GuildMember#voice.disconnect()\", {\n    permissions: [\"MoveMembers\"],\n    intents: [\"GuildVoiceStates\"],\n    requires: [\"guild\"],\n    required: [\"user\"],\n  }),\n\n  /* ----------------------------- Extra logic --------------------------- */\n  condition: cond(\n    \"Runtime checks (text, numbers, lists, roles, permissions, users) per branch; first match wins\",\n    [\"else\"],\n    {\n      note: 'Branches go in config \"branches\" as a JSON array of {id (\"b_\" + up to 16 lowercase letters/digits), label, match: \"all\"|\"any\", rules: [{left, op, right}]}. Each branch id is also its output handle; \"else\" runs when no branch matches. Operators: see CONDITION_OPERATORS.',\n    },\n  ),\n  switch: cond(\"Runtime string comparison\", [\"case1\", \"case2\", \"case3\", \"case4\", \"default\"], {\n    required: [\"value\"],\n  }),\n  \"regex-match\": cond(\"RegExp#exec() inside the runtime\", [\"true\", \"false\"], {\n    required: [\"pattern\"],\n  }),\n  \"check-bot-permission\": cond(\n    \"GuildMember#permissions.has() for the bot member\",\n    [\"true\", \"false\"],\n    { requires: [\"guild\"], required: [\"permission\"] },\n  ),\n  \"check-context\": cond(\"Checks whether the event carries a Guild\", [\"true\", \"false\"], {}),\n  \"is-bot\": cond(\"User#bot\", [\"true\", \"false\"], {}),\n  \"has-attachment\": cond(\"Message#attachments.size\", [\"true\", \"false\"], { requires: [\"message\"] }),\n  \"for-each\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime loop over a split string; the 'each' branch runs once per item\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"each\", \"out\"],\n    required: [\"list\", \"itemVar\"],\n    note: \"Loops are capped by the runtime step limit (200 steps per run).\",\n  },\n  \"stop-flow\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime control — ends this branch\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [],\n  },\n\n  /* ------------------------ Bottly storage ------------------------- */\n  // Each storage block has config \"database\": \"\" (Bottly storage, default) or\n  // \"postgres\" (the owner's own PostgreSQL at config \"connection\"; empty means\n  // {env.DATABASE_URL}); the outputs and variables are the same.\n  \"storage-save\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) — inserts one record\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"table\", \"fields\"],\n  },\n  \"storage-find\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) — first record where field = value\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"found\", \"missing\"],\n    required: [\"table\", \"field\", \"storeAs\"],\n  },\n  \"storage-update\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) — updates records where field = value\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"table\", \"field\", \"fields\"],\n  },\n  \"storage-delete\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) — deletes records where field = value\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"table\", \"field\"],\n  },\n  \"storage-count\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) — counts records (optionally where field = value)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"table\", \"storeAs\"],\n  },\n  \"storage-query\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) or your PostgreSQL — records matching filter lines, sorted, with limit/offset\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"found\", \"empty\"],\n    required: [\"table\", \"storeAs\"],\n    note: \"Config filters (lines field = value; = != > < >= <= contains; numbers compare as numbers), sortField + sortOrder (asc/desc, default newest first), limit 1-100 (default 25), offset, lineTemplate. Exposes {records.count}, {records.list} (one line per record; For Each reads it with the separator \\\\n), {records.json} and {records.N.field} for the first 25.\",\n  },\n  \"storage-take\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) or your PostgreSQL — atomically picks one matching record and sets the mark fields (UPDATE … FOR UPDATE SKIP LOCKED)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"taken\", \"empty\"],\n    required: [\"table\", \"mark\", \"storeAs\"],\n    note: \"Config filters, sortField + sortOrder (default oldest first) and mark (lines field = value). Two runs never take the same record. Exposes {item.field} and {item} (JSON).\",\n  },\n  \"storage-aggregate\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Bottly storage (control plane) or your PostgreSQL — count/sum/avg/min/max of a field, optionally grouped\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"table\", \"operation\", \"storeAs\"],\n    note: \"Config filters, operation, field, groupBy, top (1-25). Exposes {agg.result}; grouped also {agg.top} (lines value: result), {agg.count} and {agg.N.key}/{agg.N.value}.\",\n  },\n  \"sql-query\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"The owner's own PostgreSQL (pg, from the runtime) — one statement with $1..$n parameters\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"connection\", \"sql\"],\n    note: \"Config sql (the statement) and sqlParams (one value per line). Values only travel as parameters ($1..$20, one line each in Parameters); variables are never put into the SQL text. The database host must be public (private, local and metadata addresses are refused); TLS is used unless sslmode=disable; 10 s statement timeout. Exposes {sql} and {sql.rows} (JSON, first 100 rows), {sql.count}, {sql.affected}, {sql.0.column} per row, {sql.column} for the first row and {sql.error}.\",\n  },\n\n  /* --------------------------- Plugins: SellAuth ------------------------ */\n  \"sellauth-new-order\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"SellAuth API polled every 60 s by the runtime (plugin keys)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [],\n    outputs: [\"out\"],\n    note: \"Runs once per newly completed SellAuth invoice. Exposes {invoice.id}, {invoice.email}, {invoice.product}, {invoice.total}.\",\n  },\n  \"sellauth-get-invoice\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"GET api.sellauth.com/v1/shops/{shop}/invoices/{id}\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"found\", \"missing\"],\n    required: [\"invoiceId\", \"storeAs\"],\n  },\n  \"sellauth-verify-purchase\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"GET api.sellauth.com invoice, checks status=completed (+ product / email)\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"yes\", \"no\"],\n    required: [\"invoiceId\"],\n  },\n  \"sellauth-product-stock\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GET api.sellauth.com/v1/shops/{shop}/products/{id}\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"productId\", \"storeAs\"],\n  },\n\n  \"sellauth-api\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord:\n      \"Any SellAuth API v1 endpoint (api.sellauth.com/v1/shops/{shop}/...) with the plugin's API key\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"operation\", \"storeAs\"],\n    note: \"Stores {sa.status}, {sa.json}, every top-level field as {sa.<field>}; lists also get {sa.count}, {sa.total}, {sa.list} and {sa.first.<field>}. Errors land in {sa.error}.\",\n  },\n\n  /* --------------------------- Plugins: Anti-Nuke ----------------------- */\n  \"antinuke-guard\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord:\n      \"Events.GuildAuditLogEntryCreate (fallback Guild#fetchAuditLogs()) → executor; per-executor sliding-window counter in the bot process\",\n    intents: [\"GuildModeration\"],\n    permissions: [\"ViewAuditLog\"],\n    requires: [\"guild\"],\n    outputs: [\"triggered\", \"safe\"],\n    required: [\"action\", \"limit\", \"windowSeconds\"],\n    note: \"Exposes {executor}, {executor.id}, {executor.tag}, {antinuke.count}, {antinuke.action}. The server owner, the bot itself and whitelisted users/roles are always safe.\",\n  },\n  \"antinuke-punish\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"GuildMemberManager#ban() / GuildMember#kick() / GuildMemberRoleManager#set()\",\n    intents: [],\n    permissions: [\"BanMembers\", \"KickMembers\", \"ManageRoles\"],\n    requires: [\"guild\"],\n    outputs: [\"out\", \"failed\"],\n    required: [\"user\", \"mode\"],\n  },\n\n  /* ------------------------- Plugin: Converter ------------------------ */\n  convert: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Exchange rates from open.er-api.com (currencies) and api.coinbase.com (crypto), cached; unit maths in the runtime\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"amount\", \"from\", \"to\", \"storeAs\"],\n    note: \"Currencies (USD, PLN, EUR…), crypto (BTC, ETH…) or units (km, mi, kg, lb, C, F, GB…). Exposes {name.result}, {name.rate}, {name.text}, {name.from}, {name.to}, {name.amount}, {name.error}.\",\n  },\n\n  /* ----------------------- Plugin: Sticky Message ---------------------- */\n  \"sticky-message\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"TextChannel#send() after deleting the channel's previous sticky (Message#delete()); debounced per channel, ids kept in Bottly storage\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\", \"SendMessages\", \"EmbedLinks\", \"ReadMessageHistory\"],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"channel\"],\n    note: \"Waits the quiet delay so a burst of messages moves the sticky once.\",\n  },\n  \"sticky-clear\": act(\"Message#delete() for the channel's sticky message\", {\n    permissions: [\"ViewChannel\", \"ReadMessageHistory\"],\n    required: [\"channel\"],\n  }),\n\n  /* --------------------------- Plugin: Roblox -------------------------- */\n  \"roblox-api\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Public Roblox web APIs (users, thumbnails, groups, games, presence) — no key\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"operation\", \"query\", \"storeAs\"],\n    note: \"See ROBLOX_OPERATIONS for the variables each operation exposes under {name.…}.\",\n  },\n\n  /* ------------------------ Plugin: Crypto Tools ----------------------- */\n  \"crypto-api\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Keyless public APIs: CoinGecko, Coinbase, alternative.me, mempool.space, litecoinspace.org, Ethereum/Solana RPC, TronGrid\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"operation\", \"storeAs\"],\n    note: \"See CRYPTO_OPERATIONS for the variables each operation exposes under {name.…}; every operation also sets {name.text}, a ready-made summary.\",\n  },\n  \"crypto-alert\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Price alerts kept in Bottly storage (crypto_alerts); the runtime checks prices every minute and runs Crypto Price Alert flows\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"action\"],\n    note: \"Actions add (coin, direction above/below/auto, price like 70000 or 70k, currency), list, remove (alertId or coin). Exposes {alert.text}, {alert.id}, {alert.target}, {alert.current}, {alert.list}, {alert.count}, {alert.error}. Max 10 alerts per member.\",\n  },\n  \"crypto-watch\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Watched wallets kept in Bottly storage (crypto_watches); the runtime checks them every 3 minutes and runs Crypto Wallet Activity flows\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"action\"],\n    note: \"Actions add (address, chain auto, label, channel), list, remove (id, address or label). Exposes {watch.text}, {watch.list}, {watch.count}, {watch.error}. Max 20 wallets per server.\",\n  },\n  \"ai-chat\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Asks Bottly's AI (the bot owner's daily AI requests) through the control plane; the answer is plain text for a reply\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"prompt\"],\n    note: \"Provider empty/bottly = Bottly's AI on the owner's daily requests; or the owner's own key (openai, gemini, anthropic, groq, openrouter, mistral, deepseek, xai) with an optional model. Memory off, per member or per channel (last 6 turns, kept in Bottly storage). Exposes {ai.reply} and {ai.error}. AI Chat plugin.\",\n  },\n  \"crypto-portfolio\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"A member's wallets kept in Bottly storage (crypto_portfolio), valued at live prices\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"action\"],\n    note: \"Actions add (address, chain auto, label), remove, show (currency). Exposes {portfolio.text}, {portfolio.total}, {portfolio.list}, {portfolio.count}, {portfolio.error}. Max 10 wallets per member.\",\n  },\n  \"crypto-alert-hit\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Runs when a price alert set with Crypto Price Alert is reached (the alert is then removed)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\"],\n    outputs: [\"out\"],\n    note: \"The channel is where the alert was set. Exposes {alert.text}, {alert.coin}, {alert.direction}, {alert.target}, {alert.price}, {alert.user} (mention), {alert.userId}, {alert.id}.\",\n  },\n  \"crypto-wallet-activity\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Runs when a watched wallet's balance changes\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\"],\n    outputs: [\"out\"],\n    note: \"The channel is the one chosen when the wallet was watched. Exposes {wallet.text}, {wallet.label}, {wallet.address}, {wallet.chain}, {wallet.direction} (received/sent), {wallet.amount}, {wallet.usd}, {wallet.balance}, {wallet.url}.\",\n  },\n\n  /* -------------------------- Plugin: Leveling ------------------------- */\n  \"xp-gain\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"XP per message with a per-member cooldown, kept in Bottly storage (levels table)\",\n    intents: [\"Guilds\", \"GuildMessages\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"levelup\", \"out\"],\n    note: \"Exposes {level} (new level), {level.old}, {level.xp}, {level.into}, {level.needed}, {level.bar}, {level.percent}, {level.gained}. Level-up when the XP curve (5L²+50L+100) is crossed.\",\n  },\n  \"xp-rank\": {\n    kind: \"condition\",\n    support: \"full\",\n    discord: \"Reads the member's XP and their place on the server leaderboard\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"found\", \"missing\"],\n    note: \"Exposes {rank.level}, {rank.xp}, {rank.into}, {rank.needed}, {rank.bar}, {rank.percent}, {rank.position}, {rank.members}, {rank.messages}.\",\n  },\n  \"xp-leaderboard\": act(\"Top members by XP from Bottly storage\", { requires: [\"guild\"], note: \"Exposes {top.text} (one line per member) and {top.count}.\" }),\n  \"xp-edit\": act(\"Adds, removes or sets a member's XP or level\", { requires: [\"guild\"], required: [\"user\", \"mode\"] }),\n  \"level-rewards\": act(\"GuildMemberRoleManager#add() for every reward level reached\", {\n    permissions: [\"ManageRoles\"],\n    requires: [\"guild\"],\n    required: [\"rewards\"],\n  }),\n\n  /* -------------------------- Plugin: Economy -------------------------- */\n  economy: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Server wallets, daily/work rewards, payments, shop and inventory in Bottly storage (locked per wallet)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"ok\", \"failed\"],\n    required: [\"operation\"],\n    note: \"Exposes {eco.text} (ready-made answer), {eco.balance}, {eco.amount}, {eco.next}, {eco.item}, {eco.error}. Currency name and emoji come from ECONOMY_CURRENCY / ECONOMY_EMOJI.\",\n  },\n  casino: {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Coin flip, dice, slots and roulette settle at once; blackjack and video poker reply with buttons the runtime handles\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [\"guild\"],\n    outputs: [\"ok\", \"started\", \"failed\"],\n    required: [\"game\", \"bet\"],\n    note: \"ok: {casino.text}, {casino.won} (yes/no/push), {casino.payout}, {casino.net}, {casino.balance}. started: blackjack / poker already answered with its game. failed: {casino.error}.\",\n  },\n\n  /* ------------------------- Plugin: Giveaways ------------------------- */\n  \"giveaway-start\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Posts a Components V2 giveaway with Enter / Leave buttons; the runtime checks requirements, counts entries and ends it on time\",\n    intents: [\"Guilds\", \"GuildMembers\"],\n    permissions: [\"ViewChannel\", \"SendMessages\"],\n    requires: [\"guild\"],\n    outputs: [\"out\", \"failed\"],\n    required: [\"prize\", \"duration\"],\n    note: \"Exposes {giveaway.id} (message id), {giveaway.url}, {giveaway.ends}, {giveaway.error}.\",\n  },\n  \"giveaway-end\": act(\"Ends a giveaway now and draws its winners\", { required: [\"messageId\"] }),\n  \"giveaway-reroll\": act(\"Draws new winners for an ended giveaway\", { required: [\"messageId\"] }),\n  \"giveaway-ended\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Runs when the runtime ends a giveaway (on time or with End Giveaway)\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\"],\n    outputs: [\"out\"],\n    note: \"Exposes {giveaway.prize}, {giveaway.winners}, {giveaway.winnerIds}, {giveaway.entries}, {giveaway.host}, {giveaway.url}.\",\n  },\n\n  /* ------------------------ Plugin: Suggestions ------------------------ */\n  \"suggestion-post\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Posts the suggestion as a Components V2 card with votes and staff review buttons the runtime handles, then opens a discussion thread\",\n    intents: [\"Guilds\"],\n    permissions: [\"ViewChannel\", \"SendMessages\", \"ManageMessages\", \"CreatePublicThreads\"],\n    requires: [\"guild\"],\n    outputs: [\"out\", \"failed\"],\n    required: [\"text\"],\n    note: \"Exposes {suggestion.id}, {suggestion.number}, {suggestion.url}, {suggestion.thread}, {suggestion.error}.\",\n  },\n  \"suggestion-reviewed\": {\n    kind: \"trigger\",\n    support: \"full\",\n    discord: \"Runs when staff accept, deny or consider a suggestion\",\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [\"guild\"],\n    outputs: [\"out\"],\n    note: \"Exposes {suggestion.status}, {suggestion.reason}, {suggestion.text}, {suggestion.number}, {suggestion.author}, {suggestion.authorId}, {suggestion.reviewer}, {suggestion.url}, {suggestion.up}, {suggestion.down}.\",\n  },\n\n  /* -------------------------- Plugin: Tickets -------------------------- */\n  \"ticket-transcript\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"TextChannel#messages.fetch() (up to 1000) → HTML transcript file sent to a channel\",\n    intents: [\"Guilds\", \"GuildMessages\"],\n    permissions: [\"ViewChannel\", \"ReadMessageHistory\", \"AttachFiles\", \"SendMessages\"],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    note: \"Exposes {transcript.count}, {transcript.url}, {transcript.participants}, {transcript.name}, {transcript.error}.\",\n  },\n\n  /* ------------------------ Plugins: social feeds ---------------------- */\n  \"youtube-new-video\": feedTrigger(\n    \"YouTube channel RSS feed polled every 5 minutes\",\n    \"Exposes {video.title}, {video.url}, {video.id}, {video.thumbnail}, {video.author}, {video.published}, {video.isShort}.\",\n  ),\n  \"twitch-live\": feedTrigger(\n    \"Twitch Helix GET /streams polled every 2 minutes (plugin keys: Client ID + secret)\",\n    \"Exposes {stream.user}, {stream.login}, {stream.title}, {stream.game}, {stream.viewers}, {stream.url}, {stream.thumbnail}, {stream.avatar}.\",\n  ),\n  \"bluesky-new-post\": feedTrigger(\n    \"Bluesky public API app.bsky.feed.getAuthorFeed polled every 3 minutes\",\n    \"Exposes {post.text}, {post.url}, {post.author}, {post.handle}, {post.avatar}, {post.image}, {post.published}.\",\n  ),\n  \"rss-new-item\": feedTrigger(\n    \"RSS / Atom feed polled every 10 minutes\",\n    \"Exposes {item.title}, {item.url}, {item.summary}, {item.author}, {item.image}, {item.published}, {feed.title}.\",\n  ),\n\n  /* --------------------------- Utility and web ------------------------- */\n  \"http-request\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Node fetch() from the bot process; response stored as {name.status}/{name.body}\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\", \"failed\"],\n    required: [\"url\", \"storeAs\"],\n  },\n  \"parse-json\": act(\"JSON.parse() + dotted path lookup\", { required: [\"source\", \"storeAs\"] }),\n  \"random-number\": act(\"Runtime Math.random()\", { required: [\"storeAs\"] }),\n  \"random-choice\": act(\"Runtime Math.random() over a split list\", {\n    required: [\"list\", \"storeAs\"],\n  }),\n  math: act(\"Runtime arithmetic\", { required: [\"storeAs\"] }),\n  \"string-op\": act(\"Runtime string transform\", { required: [\"storeAs\"] }),\n  \"timestamp-format\": act(\"Discord <t:unix:style> markdown\", { required: [\"storeAs\"] }),\n  \"log-event\": act(\"Runtime log stream shown in the Bottly console\", { required: [\"message\"] }),\n  \"global-set\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime key/value store shared across runs of this bot process\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\"],\n    note: \"Shared values live in the running bot process; they reset when the bot restarts.\",\n  },\n  \"global-get\": {\n    kind: \"action\",\n    support: \"full\",\n    discord: \"Runtime key/value store shared across runs of this bot process\",\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    required: [\"name\", \"storeAs\"],\n  },\n\n  /* -------------------------- Extra Discord data ----------------------- */\n  \"count-members\": act(\"Role#members (member list refreshed at most every 10 minutes)\", {\n    intents: [\"GuildMembers\"],\n    requires: [\"guild\"],\n    required: [\"storeAs\"],\n  }),\n  \"list-roles\": act(\"Guild#roles.cache\", { requires: [\"guild\"], required: [\"storeAs\"] }),\n  \"list-channels\": act(\"Guild#channels.cache\", { requires: [\"guild\"], required: [\"storeAs\"] }),\n};\n\ninterface SpecOptions {\n  intents?: string[];\n  permissions?: string[];\n  requires?: ContextKind[];\n  required?: string[];\n  note?: string;\n}\n\nfunction act(discord: string, options: SpecOptions = {}): NodeSpec {\n  return {\n    kind: \"action\",\n    support: \"full\",\n    discord,\n    intents: options.intents ?? [\"Guilds\"],\n    permissions: options.permissions ?? [],\n    requires: options.requires ?? [],\n    outputs: [\"out\"],\n    ...(options.required ? { required: options.required } : {}),\n    ...(options.note ? { note: options.note } : {}),\n  };\n}\n\n/** A plugin trigger the runtime polls; \"source\" may list several, comma separated. */\nfunction feedTrigger(discord: string, note: string): NodeSpec {\n  return {\n    kind: \"trigger\",\n    support: \"full\",\n    discord,\n    intents: [\"Guilds\"],\n    permissions: [],\n    requires: [],\n    provides: [],\n    outputs: [\"out\"],\n    required: [\"source\"],\n    note: `Runs once per new item; existing items are never replayed. ${note}`,\n  };\n}\n\nfunction cond(discord: string, outputs: string[], options: SpecOptions): NodeSpec {\n  return {\n    kind: \"condition\",\n    support: \"full\",\n    discord,\n    intents: options.intents ?? [],\n    permissions: [],\n    requires: options.requires ?? [],\n    outputs,\n    ...(options.required ? { required: options.required } : {}),\n  };\n}\n\nfunction trg(discord: string, intents: string[], provides: ContextKind[]): NodeSpec {\n  return {\n    kind: \"trigger\",\n    support: \"full\",\n    discord,\n    intents: [\"Guilds\", ...intents],\n    permissions: [],\n    requires: [],\n    provides,\n    outputs: [\"out\"],\n  };\n}\n\nfunction componentNode(discord: string): NodeSpec {\n  return {\n    kind: \"action\",\n    support: \"unsupported\",\n    discord,\n    intents: [],\n    permissions: [],\n    requires: [],\n    outputs: [\"out\"],\n    note: \"Standalone component nodes are builder scaffolding. Attach components with the Components editor on a Send Message / Send Embed / Reply node — those are sent for real.\",\n  };\n}\n\nexport function getNodeSpec(type: string): NodeSpec | null {\n  return Object.prototype.hasOwnProperty.call(NODE_SPECS, type)\n    ? (NODE_SPECS[type] as NodeSpec)\n    : null;\n}\n\n/* ------------------------------------------------------------------ *\n * Compiled flow — exactly what the runtime executes\n * ------------------------------------------------------------------ */\n\nexport interface CompiledCommandOption {\n  name: string;\n  description: string;\n  type: string;\n  required: boolean;\n  autocomplete: boolean;\n  /** Autocomplete suggestions (max 25), filtered by what the user types. */\n  suggestions?: string[];\n}\n\nexport interface CompiledCommand {\n  name: string;\n  description: string;\n  nodeId: string;\n  options: CompiledCommandOption[];\n  /** Only offered inside servers (the flow needs one), not in DMs. */\n  guildOnly?: boolean;\n  /** default_member_permissions: who sees the command (decimal bit string). */\n  memberPermissions?: string;\n}\n\n/** Permissions a command can require of the member (PermissionFlagsBits bit). */\nexport const COMMAND_PERMISSION_BITS: Record<string, number> = {\n  Administrator: 3,\n  ManageGuild: 5,\n  ManageRoles: 28,\n  ManageChannels: 4,\n  ManageMessages: 13,\n  KickMembers: 1,\n  BanMembers: 2,\n  ModerateMembers: 40,\n  ManageNicknames: 27,\n  ManageEvents: 33,\n  ManageThreads: 34,\n  ViewAuditLog: 7,\n  MentionEveryone: 17,\n  ManageWebhooks: 29,\n};\n\n/** Discord's command payload extras for one compiled command (identical on both registration paths). */\nexport function commandScope(command: CompiledCommand): {\n  contexts?: number[];\n  default_member_permissions?: string;\n} {\n  return {\n    ...(command.guildOnly ? { contexts: [0] } : {}),\n    ...(command.memberPermissions ? { default_member_permissions: command.memberPermissions } : {}),\n  };\n}\n\nexport interface CompiledNode {\n  id: string;\n  type: string;\n  title: string;\n  config: Record<string, ConfigValue>;\n  embed: unknown;\n  /** Standard messages: up to 10 embeds (null = use `embed`). */\n  embeds?: unknown;\n  components: unknown;\n  /** \"components\" = a Components V2 message (containers, sections…); otherwise classic. */\n  messageType?: \"embed\" | \"components\" | null;\n  /** handle -> ordered target node ids */\n  next: Record<string, string[]>;\n}\n\nexport interface CompiledTrigger {\n  nodeId: string;\n  type: string;\n  config: Record<string, ConfigValue>;\n}\n\nexport interface CompiledFlow {\n  contractVersion: typeof FLOW_CONTRACT_VERSION;\n  flowId: string;\n  flowName: string;\n  /** GatewayIntentBits names the runtime must request. */\n  intents: string[];\n  triggers: CompiledTrigger[];\n  commands: CompiledCommand[];\n  nodes: Record<string, CompiledNode>;\n}\n\n/* ------------------------------------------------------------------ *\n * Validation\n * ------------------------------------------------------------------ */\n\nexport type IssueLevel = \"error\" | \"warning\";\n\nexport interface FlowIssue {\n  level: IssueLevel;\n  code: string;\n  message: string;\n  nodeId?: string;\n}\n\nconst CONTEXT_LABEL: Record<ContextKind, string> = {\n  interaction: \"a slash command, button, select menu or modal trigger\",\n  message: \"a message context (Message Received, Reaction or a component trigger)\",\n  guild: \"a server (guild) context — it cannot run in DMs\",\n  member: \"a member context\",\n};\n\nconst COMMAND_NAME_PATTERN = /^[-_\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}]{1,32}$/u;\n\nfunction str(value: ConfigValue | undefined): string {\n  return value === undefined || value === null ? \"\" : String(value).trim();\n}\n\nfunction nodeLabel(node: RawFlowNode): string {\n  return str(node.data.title as ConfigValue) || node.data.type;\n}\n\n/** Handles that leave a node, mapped to their targets. */\nfunction outgoing(edges: RawFlowEdge[], nodeId: string): Record<string, string[]> {\n  const out: Record<string, string[]> = {};\n  for (const edge of edges) {\n    if (edge.source !== nodeId) continue;\n    const handle = edge.sourceHandle ?? \"out\";\n    const list = out[handle] ?? [];\n    list.push(edge.target);\n    out[handle] = list;\n  }\n  return out;\n}\n\n/**\n * Full static analysis of a flow: structure, required fields, intents,\n * permissions, interaction-acknowledgement and trigger-context reachability.\n */\ninterface RawSelect {\n  type?: unknown;\n  options?: { label?: unknown; action?: unknown }[];\n  children?: unknown;\n  accessory?: unknown;\n}\n\n/** Every string select in a message's components, however deeply nested. */\nfunction stringSelects(raw: unknown, depth = 0): RawSelect[] {\n  if (!Array.isArray(raw) || depth > 3) return [];\n  return raw.flatMap((entry): RawSelect[] => {\n    if (typeof entry !== \"object\" || entry === null) return [];\n    const c = entry as RawSelect;\n    if (c.type === \"string-select\") return [c];\n    return stringSelects(c.children, depth + 1);\n  });\n}\n\n/** Discord's limits the builder checks before publishing. */\nexport const DISCORD_LIMITS = {\n  content: 2000,\n  embedTitle: 256,\n  embedDescription: 4096,\n  embedFields: 25,\n  embedFooter: 2048,\n  embedTotal: 6000,\n  v2Text: 4000,\n  name: 100,\n  nickname: 32,\n  topic: 1024,\n  inviteMaxAge: 604800,\n  inviteMaxUses: 100,\n} as const;\n\ninterface MessageComponentsInfo {\n  customIds: string[];\n  duplicateOptionValues: string[];\n  text: number;\n}\n\n/** Custom IDs, select option values and text length of a message's components. */\nexport function componentsInfo(raw: unknown): MessageComponentsInfo {\n  const info: MessageComponentsInfo = { customIds: [], duplicateOptionValues: [], text: 0 };\n  const walk = (list: unknown, depth: number) => {\n    if (!Array.isArray(list) || depth > 4) return;\n    for (const entry of list) {\n      if (typeof entry !== \"object\" || entry === null) continue;\n      const c = entry as Record<string, unknown>;\n      const type = String(c[\"type\"] ?? \"\");\n      const action = typeof c[\"action\"] === \"string\" ? c[\"action\"].trim() : \"\";\n      if (typeof c[\"content\"] === \"string\") info.text += c[\"content\"].length;\n      if (type === \"button\" && c[\"style\"] !== \"link\" && action !== \"\") info.customIds.push(action);\n      if (/^(user|role|channel|mentionable)-select$/.test(type) && action !== \"\")\n        info.customIds.push(action);\n      if (type === \"string-select\" && Array.isArray(c[\"options\"])) {\n        const seen = new Set<string>();\n        for (const option of c[\"options\"] as Record<string, unknown>[]) {\n          const value = String(option?.[\"action\"] ?? option?.[\"value\"] ?? \"\").trim();\n          if (value === \"\") continue;\n          if (seen.has(value)) info.duplicateOptionValues.push(value);\n          seen.add(value);\n        }\n      }\n      if (c[\"accessory\"]) walk([c[\"accessory\"]], depth + 1);\n      walk(c[\"children\"], depth + 1);\n    }\n  };\n  walk(raw, 0);\n  return info;\n}\n\n/** Characters an embed adds to Discord's 6000-per-message total. */\nfunction embedSize(raw: unknown): number {\n  if (typeof raw !== \"object\" || raw === null) return 0;\n  const e = raw as Record<string, unknown>;\n  const s = (v: unknown) => (typeof v === \"string\" ? v.length : 0);\n  const fields = Array.isArray(e[\"fields\"]) ? (e[\"fields\"] as Record<string, unknown>[]) : [];\n  return (\n    s(e[\"title\"]) +\n    s(e[\"description\"]) +\n    s((e[\"footer\"] as Record<string, unknown> | undefined)?.[\"text\"]) +\n    s((e[\"author\"] as Record<string, unknown> | undefined)?.[\"name\"]) +\n    fields.reduce((n, f) => n + s(f?.[\"name\"]) + s(f?.[\"value\"]), 0)\n  );\n}\n\n/** Storage blocks that can use the owner's PostgreSQL instead of Bottly storage. */\nexport const DATABASE_STORAGE_TYPES = [\n  \"storage-save\",\n  \"storage-find\",\n  \"storage-update\",\n  \"storage-delete\",\n  \"storage-count\",\n  \"storage-query\",\n  \"storage-take\",\n  \"storage-aggregate\",\n];\n\n/** True when a storage block is set to the owner's own PostgreSQL. */\nexport function usesOwnDatabase(config: Record<string, ConfigValue> | undefined): boolean {\n  return String(config?.[\"database\"] ?? \"\") === \"postgres\";\n}\n\n/**\n * Problems with \"Your PostgreSQL\" storage blocks and the SQL Query block:\n * names Postgres would not accept as written, parameters the query needs,\n * and {variables} typed into SQL text (they are never put there). An empty\n * connection on a storage block means {env.DATABASE_URL}; the SQL Query block\n * requires its connection (spec `required`).\n */\nexport function databaseIssues(type: string, config: Record<string, ConfigValue>): { level: \"error\" | \"warning\"; message: string }[] {\n  const out: { level: \"error\" | \"warning\"; message: string }[] = [];\n  const value = (key: string) => String(config[key] ?? \"\").trim();\n  const name = /^[A-Za-z_][A-Za-z0-9_]{0,62}$/;\n  if (DATABASE_STORAGE_TYPES.includes(type) && usesOwnDatabase(config)) {\n    const table = value(\"table\");\n    const parts = table.split(\".\");\n    if (table && !table.includes(\"{\") && (parts.length > 2 || !parts.every((part) => name.test(part))))\n      out.push({ level: \"error\", message: `\"${table}\" is not a valid PostgreSQL table name: use letters, numbers and _ (optionally schema.table).` });\n    const field = value(\"field\");\n    if (field && !field.includes(\"{\") && !name.test(field))\n      out.push({ level: \"error\", message: `\"${field}\" is not a valid PostgreSQL column name: use letters, numbers and _.` });\n  }\n  if (type === \"sql-query\") {\n    const query = value(\"sql\");\n    if (/\\{[A-Za-z][\\w.-]*\\}/.test(query))\n      out.push({ level: \"warning\", message: \"variables in the SQL text are not filled in. Write $1, $2… and put the values in Parameters, one per line.\" });\n    const max = Math.max(0, ...[...query.matchAll(/\\$(\\d{1,3})(?!\\d)/g)].map((m) => Number(m[1])));\n    if (max > 20) out.push({ level: \"error\", message: \"a query can use at most 20 parameters ($1-$20).\" });\n    const lines = String(config[\"sqlParams\"] ?? \"\").split(\"\\n\").length;\n    if (max > 0 && (String(config[\"sqlParams\"] ?? \"\") === \"\" || lines < max))\n      out.push({ level: \"error\", message: `the query uses $${max}, so Parameters needs ${max} line${max === 1 ? \"\" : \"s\"}.` });\n  }\n  return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Find Many Records / Take One Item / Sum-Average Records\n * (storage-query, storage-take, storage-aggregate). The same filter,\n * sort and aggregate rules run in Bottly storage (SQL functions in\n * database/migrations/20261102170000_storage_take.sql), the owner's\n * PostgreSQL (runtime/src/postgres-sql.ts) and the Live Preview\n * (matchesStorageFilters / sortStorageRecords / aggregateStorageRecords).\n * ------------------------------------------------------------------ */\n\nexport type StorageFilterOp = \"=\" | \"!=\" | \">\" | \"<\" | \">=\" | \"<=\" | \"contains\";\nexport const STORAGE_FILTER_OPS: StorageFilterOp[] = [\"=\", \"!=\", \">\", \"<\", \">=\", \"<=\", \"contains\"];\n\nexport interface StorageFilter {\n  field: string;\n  op: StorageFilterOp;\n  value: string;\n}\n\nexport type StorageAggregateOp = \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\";\nexport const STORAGE_AGGREGATE_OPS: StorageAggregateOp[] = [\"count\", \"sum\", \"avg\", \"min\", \"max\"];\n\n/** Filters per block, record lines kept as {key.N.field}, rows per query. */\nexport const STORAGE_MAX_FILTERS = 10;\nexport const STORAGE_INDEXED_RECORDS = 25;\nexport const STORAGE_QUERY_MAX = 100;\nexport const STORAGE_OFFSET_MAX = 10_000;\nexport const STORAGE_TOP_MAX = 25;\n\nconst STORAGE_FIELD_NAME = /^[A-Za-z0-9_]{1,40}$/;\n\n/**\n * Filter lines \"field = value\" (operators = != > < >= <= and \"contains\").\n * Empty lines are skipped; values keep {variables} for the caller to fill.\n */\nexport function parseStorageFilters(raw: string): { filters: StorageFilter[]; problems: string[] } {\n  const filters: StorageFilter[] = [];\n  const problems: string[] = [];\n  for (const line of String(raw ?? \"\").split(/\\r?\\n/)) {\n    const trimmed = line.trim();\n    if (!trimmed) continue;\n    const word = /^([^\\s=!<>]+)\\s+contains\\s+(.*)$/i.exec(trimmed);\n    const symbol = word ? null : /^([^\\s=!<>]+)\\s*(>=|<=|!=|=|>|<)\\s*(.*)$/.exec(trimmed);\n    if (!word && !symbol) {\n      problems.push(`\"${trimmed.slice(0, 40)}\" is not a filter: write field = value (or != > < >= <= contains).`);\n      continue;\n    }\n    const field = ((word ?? symbol)?.[1] ?? \"\").trim();\n    if (!STORAGE_FIELD_NAME.test(field)) {\n      problems.push(`\"${field.slice(0, 40)}\" is not a valid field name: use letters, numbers and _.`);\n      continue;\n    }\n    if (word) filters.push({ field, op: \"contains\", value: (word[2] ?? \"\").trim() });\n    else if (symbol) filters.push({ field, op: symbol[2] as StorageFilterOp, value: (symbol[3] ?? \"\").trim() });\n  }\n  if (filters.length > STORAGE_MAX_FILTERS) problems.push(`use at most ${STORAGE_MAX_FILTERS} filter lines.`);\n  return { filters, problems };\n}\n\n/** \"field = value\" mark lines of Take One Item (what is set on the taken record). */\nexport function parseStorageMarks(raw: string): { marks: Record<string, string>; problems: string[] } {\n  const marks: Record<string, string> = {};\n  const problems: string[] = [];\n  for (const line of String(raw ?? \"\").split(/\\r?\\n/)) {\n    const trimmed = line.trim();\n    if (!trimmed) continue;\n    const at = trimmed.indexOf(\"=\");\n    const key = at > 0 ? trimmed.slice(0, at).trim() : \"\";\n    if (!STORAGE_FIELD_NAME.test(key)) {\n      problems.push(`\"${trimmed.slice(0, 40)}\" is not a mark line: write field = value, e.g. sold = yes.`);\n      continue;\n    }\n    marks[key] = trimmed.slice(at + 1).trim();\n  }\n  return { marks, problems };\n}\n\nconst STORAGE_NUMBER = /^\\s*-?[0-9]+(\\.[0-9]+)?\\s*$/;\n\n/** A stored value as a number when it is one (\"12\", \"-3.5\"), else null. Same rule as the SQL side. */\nexport function storageNumber(value: string | undefined): number | null {\n  return value !== undefined && STORAGE_NUMBER.test(value) ? Number(value) : null;\n}\n\n/** True when a record passes every filter (missing fields count as \"\"). */\nexport function matchesStorageFilters(row: Record<string, string>, filters: StorageFilter[]): boolean {\n  return filters.every((filter) => {\n    const have = String(row[filter.field] ?? \"\");\n    const want = filter.value;\n    switch (filter.op) {\n      case \"=\":\n        return have === want;\n      case \"!=\":\n        return have !== want;\n      case \"contains\":\n        return have.toLowerCase().includes(want.toLowerCase());\n      default: {\n        const a = storageNumber(have);\n        const b = storageNumber(want);\n        const cmp = a !== null && b !== null ? a - b : have < want ? -1 : have > want ? 1 : 0;\n        if (filter.op === \">\") return cmp > 0;\n        if (filter.op === \"<\") return cmp < 0;\n        if (filter.op === \">=\") return cmp >= 0;\n        return cmp <= 0;\n      }\n    }\n  });\n}\n\n/**\n * Records sorted by a field: numbers first (by value), then text, then\n * records without the field; ties keep their saved order. An empty field\n * keeps the saved order (oldest first), reversed when not ascending.\n */\nexport function sortStorageRecords<T extends Record<string, string>>(rows: T[], field: string, asc: boolean): T[] {\n  const indexed = rows.map((row, index) => ({ row, index }));\n  const dir = asc ? 1 : -1;\n  const rank = (value: string | undefined) => (value === undefined ? 2 : storageNumber(value) !== null ? 0 : 1);\n  indexed.sort((x, y) => {\n    if (field) {\n      const a = x.row[field];\n      const b = y.row[field];\n      const ra = rank(a);\n      const rb = rank(b);\n      if (ra !== rb) return ra - rb;\n      if (ra === 0) {\n        const d = (storageNumber(a) as number) - (storageNumber(b) as number);\n        if (d !== 0) return d * dir;\n      } else if (ra === 1 && a !== b) {\n        return ((a as string) < (b as string) ? -1 : 1) * dir;\n      }\n    }\n    return (x.index - y.index) * dir;\n  });\n  return indexed.map((entry) => entry.row);\n}\n\nexport interface StorageGroup {\n  /** Group value (\"\" for records without the field); \"\" when not grouped. */\n  key: string;\n  /** null when there was nothing to add up (no numbers). */\n  value: number | null;\n}\n\n/** Count / sum / average / min / max of a field, optionally per group (highest first, top N). */\nexport function aggregateStorageRecords(\n  rows: Record<string, string>[],\n  op: StorageAggregateOp,\n  field: string,\n  groupBy = \"\",\n  top = 10,\n): StorageGroup[] {\n  const groups = new Map<string, Record<string, string>[]>();\n  for (const row of rows) {\n    const key = groupBy ? String(row[groupBy] ?? \"\") : \"\";\n    const list = groups.get(key) ?? [];\n    list.push(row);\n    groups.set(key, list);\n  }\n  const out: StorageGroup[] = [];\n  for (const [key, list] of groups) {\n    const numbers = list.map((row) => storageNumber(row[field])).filter((n): n is number => n !== null);\n    let value: number | null;\n    if (op === \"count\") value = list.length;\n    else if (!numbers.length) value = null;\n    else if (op === \"sum\") value = numbers.reduce((a, b) => a + b, 0);\n    else if (op === \"avg\") value = numbers.reduce((a, b) => a + b, 0) / numbers.length;\n    else if (op === \"min\") value = Math.min(...numbers);\n    else value = Math.max(...numbers);\n    out.push({ key, value });\n  }\n  out.sort((a, b) => {\n    if (a.value === null || b.value === null) return a.value === null ? (b.value === null ? 0 : 1) : -1;\n    if (a.value !== b.value) return b.value - a.value;\n    return a.key < b.key ? -1 : a.key > b.key ? 1 : 0;\n  });\n  return groupBy ? out.slice(0, Math.min(STORAGE_TOP_MAX, Math.max(1, Math.round(top) || 10))) : out.slice(0, 1);\n}\n\n/** An aggregate as flow text: at most 2 decimals; nothing to add up is \"0\" for count/sum, else \"\". */\nexport function formatStorageAggregate(op: StorageAggregateOp, value: number | null | undefined): string {\n  if (value === null || value === undefined || !Number.isFinite(value)) return op === \"count\" || op === \"sum\" ? \"0\" : \"\";\n  return String(Math.round(value * 100) / 100);\n}\n\n/**\n * Flow variables of Sum / Average Records under `key`: {key.result} (and\n * {key}); grouped also {key.count} groups, {key.top} (\"value: result\" per\n * line) and {key.N.key} / {key.N.value}.\n */\nexport function aggregateVariables(key: string, op: StorageAggregateOp, groups: StorageGroup[], grouped: boolean): Record<string, string> {\n  const out: Record<string, string> = {};\n  const result = formatStorageAggregate(op, groups[0]?.value);\n  out[key] = result;\n  out[`${key}.result`] = result;\n  if (!grouped) return out;\n  const kept = groups.slice(0, STORAGE_TOP_MAX);\n  out[`${key}.count`] = String(kept.length);\n  out[`${key}.top`] = kept.map((g) => `${g.key || \"(none)\"}: ${formatStorageAggregate(op, g.value)}`).join(\"\\n\");\n  kept.forEach((g, i) => {\n    out[`${key}.${i}.key`] = g.key;\n    out[`${key}.${i}.value`] = formatStorageAggregate(op, g.value);\n  });\n  return out;\n}\n\n/** Fields that describe a record rather than its content (left out of default list lines). */\nconst RECORD_META = new Set([\"id\", \"created_at\", \"updated_at\"]);\n\n/**\n * One list line for a record: the template with {field} filled from the\n * record (other {names} go to `fallback`, e.g. flow variables; unknown ones\n * stay as written), or \"field: value, …\" without a template. One pass, so a\n * stored value is never filled in again.\n */\nexport function renderRecordLine(template: string, row: Record<string, string>, fallback?: (name: string) => string | undefined): string {\n  if (!template.trim()) {\n    return Object.entries(row)\n      .filter(([k]) => !RECORD_META.has(k))\n      .map(([k, v]) => `${k}: ${v}`)\n      .join(\", \");\n  }\n  return template.replace(/\\{([a-zA-Z0-9_.-]+)\\}/g, (match, name: string) => {\n    if (Object.prototype.hasOwnProperty.call(row, name)) return String(row[name] ?? \"\");\n    return fallback?.(name) ?? match;\n  });\n}\n\n/**\n * Flow variables of Find Many Records under `key`: {key} and {key.json}\n * (JSON array), {key.count}, {key.list} (one line per record; For Each reads\n * it with the separator \\n) and {key.N.field} for the first 25 records.\n */\nexport function recordListVariables(\n  key: string,\n  rows: Record<string, string>[],\n  template: string,\n  fallback?: (name: string) => string | undefined,\n): Record<string, string> {\n  const out: Record<string, string> = {};\n  let json = JSON.stringify(rows);\n  if (json.length > 20_000) json = json.slice(0, 20_000);\n  out[key] = json;\n  out[`${key}.json`] = json;\n  out[`${key}.count`] = String(rows.length);\n  out[`${key}.list`] = rows.map((row) => renderRecordLine(template, row, fallback).replace(/\\r?\\n/g, \" \")).join(\"\\n\");\n  rows.slice(0, STORAGE_INDEXED_RECORDS).forEach((row, i) => {\n    for (const [k, v] of Object.entries(row)) out[`${key}.${i}.${k}`] = v;\n  });\n  return out;\n}\n\n/** Text of a stored record field (\"\" for null). */\nexport function recordText(row: Record<string, unknown>): Record<string, string> {\n  const out: Record<string, string> = {};\n  for (const [k, v] of Object.entries(row)) out[k] = v === null || v === undefined ? \"\" : typeof v === \"object\" ? JSON.stringify(v) : String(v);\n  return out;\n}\n\n/** What a storage-query / storage-take / storage-aggregate block asks for, values filled with `fill`. */\nexport interface StorageBlockRequest {\n  table: string;\n  filters: StorageFilter[];\n  sort: { field: string; asc: boolean };\n  limit: number;\n  offset: number;\n  marks: Record<string, string>;\n  aggregate: { op: StorageAggregateOp; field: string; groupBy: string; top: number };\n}\n\nfunction intIn(value: ConfigValue | undefined, fallback: number, min: number, max: number): number {\n  const raw = String(value ?? \"\").trim();\n  const n = raw === \"\" ? fallback : Math.round(Number(raw));\n  return Number.isFinite(n) ? Math.min(max, Math.max(min, n)) : fallback;\n}\n\n/** Reads one of the three blocks' config; throws on bad filter or mark lines. */\nexport function storageBlockRequest(type: string, config: Record<string, ConfigValue>, fill: (value: string) => string): StorageBlockRequest {\n  const value = (key: string) => String(config[key] ?? \"\");\n  const parsed = parseStorageFilters(value(\"filters\"));\n  if (parsed.problems.length) throw new Error(parsed.problems[0]);\n  const marks = type === \"storage-take\" ? parseStorageMarks(value(\"mark\")) : { marks: {}, problems: [] };\n  if (marks.problems.length) throw new Error(marks.problems[0]);\n  const order = value(\"sortOrder\");\n  const op = value(\"operation\") as StorageAggregateOp;\n  return {\n    table: fill(value(\"table\")).trim(),\n    filters: parsed.filters.map((f) => ({ ...f, value: fill(f.value) })),\n    sort: { field: fill(value(\"sortField\")).trim(), asc: order ? order === \"asc\" : type === \"storage-take\" },\n    limit: intIn(config[\"limit\"], 25, 1, STORAGE_QUERY_MAX),\n    offset: intIn(fill(value(\"offset\")), 0, 0, STORAGE_OFFSET_MAX),\n    marks: Object.fromEntries(Object.entries(marks.marks).map(([k, v]) => [k, fill(v)])),\n    aggregate: {\n      op: STORAGE_AGGREGATE_OPS.includes(op) ? op : \"count\",\n      field: fill(value(\"field\")).trim(),\n      groupBy: fill(value(\"groupBy\")).trim(),\n      top: intIn(config[\"top\"], 10, 1, STORAGE_TOP_MAX),\n    },\n  };\n}\n\n/** Validator problems of the three blocks (filters, marks, ranges, names). */\nexport function storageBlockIssues(type: string, config: Record<string, ConfigValue>): string[] {\n  if (type !== \"storage-query\" && type !== \"storage-take\" && type !== \"storage-aggregate\") return [];\n  const out: string[] = [];\n  const value = (key: string) => String(config[key] ?? \"\").trim();\n  const filters = parseStorageFilters(value(\"filters\"));\n  out.push(...filters.problems);\n  const nameCheck = (key: string, label: string) => {\n    const v = value(key);\n    if (v && !v.includes(\"{\") && !STORAGE_FIELD_NAME.test(v)) out.push(`${label} \"${v.slice(0, 40)}\" is not a valid field name: use letters, numbers and _.`);\n  };\n  nameCheck(\"sortField\", \"sort field\");\n  const order = value(\"sortOrder\");\n  if (order && order !== \"asc\" && order !== \"desc\") out.push(`sort order must be asc or desc.`);\n  if (type === \"storage-query\") {\n    const limit = value(\"limit\");\n    if (limit && !(/^\\d+$/.test(limit) && Number(limit) >= 1 && Number(limit) <= STORAGE_QUERY_MAX))\n      out.push(`limit must be a whole number from 1 to ${STORAGE_QUERY_MAX}.`);\n    const offset = value(\"offset\");\n    if (offset && !offset.includes(\"{\") && !(/^\\d+$/.test(offset) && Number(offset) <= STORAGE_OFFSET_MAX))\n      out.push(`offset must be a whole number from 0 to ${STORAGE_OFFSET_MAX}.`);\n  }\n  let markNames: string[] = [];\n  if (type === \"storage-take\") {\n    const marks = parseStorageMarks(value(\"mark\"));\n    out.push(...marks.problems);\n    markNames = Object.keys(marks.marks);\n  }\n  if (type === \"storage-aggregate\") {\n    const op = value(\"operation\") || \"count\";\n    if (!STORAGE_AGGREGATE_OPS.includes(op as StorageAggregateOp)) out.push(`\"${op}\" is not an operation: use count, sum, avg, min or max.`);\n    else if (op !== \"count\" && !value(\"field\")) out.push(`${op} needs a field.`);\n    nameCheck(\"field\", \"field\");\n    nameCheck(\"groupBy\", \"group by\");\n    const top = value(\"top\");\n    if (top && !(/^\\d+$/.test(top) && Number(top) >= 1 && Number(top) <= STORAGE_TOP_MAX)) out.push(`top must be a whole number from 1 to ${STORAGE_TOP_MAX}.`);\n  }\n  if (usesOwnDatabase(config)) {\n    const pg = /^[A-Za-z_][A-Za-z0-9_]{0,62}$/;\n    const names = [\n      ...filters.filters.map((f) => f.field),\n      ...markNames,\n      ...[\"sortField\", \"field\", \"groupBy\"].map(value).filter((v) => v && !v.includes(\"{\")),\n    ];\n    for (const name of new Set(names)) {\n      if (STORAGE_FIELD_NAME.test(name) && !pg.test(name))\n        out.push(`\"${name}\" is not a valid PostgreSQL column name: use letters, numbers and _ (not starting with a number).`);\n    }\n  }\n  return out;\n}\n\n/**\n * Cron fields: \"*\", numbers, lists (1,3), ranges (1-5) and steps (star/15,\n * 0-30/5). Returns the problem with the expression, or null when it is valid.\n */\nexport function cronProblem(expression: string): string | null {\n  const parts = expression.trim().split(/\\s+/);\n  if (parts.length !== 5) return \"A schedule needs 5 fields: minute hour day month weekday.\";\n  const ranges: [number, number][] = [\n    [0, 59],\n    [0, 23],\n    [1, 31],\n    [1, 12],\n    [0, 7],\n  ];\n  for (let i = 0; i < 5; i++) {\n    const [min, max] = ranges[i] as [number, number];\n    for (const item of (parts[i] as string).split(\",\")) {\n      const m = /^(\\*|\\d+(?:-\\d+)?)(?:\\/(\\d+))?$/.exec(item);\n      if (!m) return `\"${item}\" is not a valid cron value.`;\n      if (m[1] !== \"*\") {\n        const [a, b = a] = (m[1] as string).split(\"-\").map(Number) as [number, number?];\n        if (a < min || (b as number) > max || a > (b as number))\n          return `\"${item}\" is outside ${min}-${max}.`;\n      }\n      if (m[2] !== undefined && Number(m[2]) < 1) return `\"${item}\" has a step below 1.`;\n    }\n  }\n  return null;\n}\n\n/** Does a valid cron expression match these clock values? */\nexport function cronFieldsMatch(\n  expression: string,\n  actual: [minute: number, hour: number, day: number, month: number, weekday: number],\n): boolean {\n  if (cronProblem(expression) !== null) return false;\n  const parts = expression.trim().split(/\\s+/);\n  const mins = [0, 0, 1, 1, 0];\n  const maxs = [59, 23, 31, 12, 7];\n  return parts.every((field, i) => {\n    const value = actual[i] as number;\n    return field.split(\",\").some((item) => {\n      const [rangePart, stepPart] = item.split(\"/\");\n      const step = stepPart === undefined ? 1 : Number(stepPart);\n      let from = mins[i] as number;\n      let to = maxs[i] as number;\n      if (rangePart !== \"*\") {\n        const [a, b] = (rangePart as string).split(\"-\").map(Number);\n        from = a as number;\n        to = b === undefined ? (stepPart === undefined ? (a as number) : (maxs[i] as number)) : b;\n      }\n      const matches = (v: number) => v >= from && v <= to && (v - from) % step === 0;\n      // Sunday is 0 or 7.\n      return i === 4 && value === 0 ? matches(0) || matches(7) : matches(value);\n    });\n  });\n}\n\nexport function validateFlow(flow: RawFlow): FlowIssue[] {\n  const issues: FlowIssue[] = [];\n  const nodes = (flow.nodes ?? []).filter((node) => node?.data && node.data.enabled !== false);\n  const byId = new Map<string, RawFlowNode>();\n  for (const node of nodes) byId.set(node.id, node);\n\n  const triggers = nodes.filter((node) => getNodeSpec(node.data.type)?.kind === \"trigger\");\n\n  if (nodes.length === 0) {\n    issues.push({ level: \"error\", code: \"empty\", message: \"This flow has no nodes yet.\" });\n    return issues;\n  }\n  if (triggers.length === 0) {\n    issues.push({\n      level: \"error\",\n      code: \"no-trigger\",\n      message: \"Add a trigger node — without one the bot has no reason to run this flow.\",\n    });\n  }\n\n  const seenCommands = new Set<string>();\n  let slashSeen = 0;\n  const seenCustomIds = new Set<string>();\n\n  for (const node of nodes) {\n    const spec = getNodeSpec(node.data.type);\n    const config = node.data.config ?? {};\n\n    if (!spec) {\n      issues.push({\n        level: \"error\",\n        code: \"unknown-node\",\n        nodeId: node.id,\n        message: `\"${node.data.type}\" is not a node this bot runtime knows how to run.`,\n      });\n      continue;\n    }\n\n    if (spec.support === \"unsupported\") {\n      issues.push({\n        level: \"warning\",\n        code: \"unsupported-node\",\n        nodeId: node.id,\n        message: `${nodeLabel(node)} is skipped at runtime. ${spec.note ?? \"\"}`.trim(),\n      });\n    } else if (spec.support === \"partial\" && spec.note) {\n      issues.push({\n        level: \"warning\",\n        code: \"partial-node\",\n        nodeId: node.id,\n        message: `${nodeLabel(node)}: ${spec.note}`,\n      });\n    }\n\n    // Discord accepts a message with only embeds or components.\n    const hasRichBody = Boolean(\n      node.data.embed ||\n      (Array.isArray(node.data.embeds) && node.data.embeds.length > 0) ||\n      (Array.isArray(node.data.components) && node.data.components.length > 0),\n    );\n    for (const key of spec.required ?? []) {\n      if (key === \"content\" && hasRichBody) continue;\n      if (str(config[key]) === \"\") {\n        issues.push({\n          level: \"error\",\n          code: \"missing-field\",\n          nodeId: node.id,\n          message: `${nodeLabel(node)} needs a value for \"${key}\".`,\n        });\n      }\n    }\n\n    if (node.data.type === \"condition\") {\n      for (const problem of conditionIssues(config)) {\n        issues.push({\n          level: \"error\",\n          code: \"bad-condition\",\n          nodeId: node.id,\n          message: `${nodeLabel(node)}: ${problem}`,\n        });\n      }\n    }\n\n    for (const problem of storageBlockIssues(node.data.type, config)) {\n      issues.push({\n        level: \"error\",\n        code: \"bad-storage\",\n        nodeId: node.id,\n        message: `${nodeLabel(node)}: ${problem}`,\n      });\n    }\n\n    for (const problem of databaseIssues(node.data.type, config)) {\n      issues.push({\n        level: problem.level,\n        code: \"database\",\n        nodeId: node.id,\n        message: `${nodeLabel(node)}: ${problem.message}`,\n      });\n    }\n\n    if (node.data.type === \"show-modal\" || node.data.type === \"component-modal\") {\n      // The older Modal block did nothing before, so it only warns (and is skipped\n      // at runtime) until it has fields.\n      for (const problem of modalFieldIssues(parseModalFields(config))) {\n        issues.push({\n          level: node.data.type === \"component-modal\" ? \"warning\" : \"error\",\n          code: \"bad-modal\",\n          nodeId: node.id,\n          message: `${nodeLabel(node)}: ${problem}`,\n        });\n      }\n    }\n\n    if (node.data.type === \"slash-command\") {\n      const name = str(config[\"name\"]).toLowerCase();\n      if (name !== \"\" && !COMMAND_NAME_PATTERN.test(name)) {\n        issues.push({\n          level: \"error\",\n          code: \"bad-command-name\",\n          nodeId: node.id,\n          message: `\"${name}\" is not a valid slash command name. Use 1-32 lowercase letters, numbers, - or _.`,\n        });\n      }\n      if (name !== \"\" && seenCommands.has(name)) {\n        issues.push({\n          level: \"error\",\n          code: \"duplicate-command\",\n          nodeId: node.id,\n          message: `Two triggers register /${name}. Discord only allows one command per name.`,\n        });\n      }\n      seenCommands.add(name);\n      slashSeen += 1;\n      if (slashSeen === 2) {\n        issues.push({\n          level: \"error\",\n          code: \"one-slash-command\",\n          nodeId: node.id,\n          message:\n            \"A command flow has one Slash Command trigger. Make another command for a second slash command; Button Click, Dropdown Select and Modal Submit triggers (or Show Modal's SUBMITTED output) can be added as often as you like.\",\n        });\n      }\n\n      if (str(config[\"description\"]).length > 100) {\n        issues.push({\n          level: \"error\",\n          code: \"long-description\",\n          nodeId: node.id,\n          message: \"Slash command descriptions are limited to 100 characters by Discord.\",\n        });\n      }\n\n      const rawOptions = Array.isArray(node.data.options) ? node.data.options : [];\n      const optionNames = new Set<string>();\n      for (const entry of rawOptions) {\n        if (typeof entry !== \"object\" || entry === null) continue;\n        const optionName = String((entry as Record<string, unknown>)[\"name\"] ?? \"\")\n          .trim()\n          .toLowerCase();\n        if (optionName === \"\" || !COMMAND_NAME_PATTERN.test(optionName)) {\n          issues.push({\n            level: \"error\",\n            code: \"bad-option-name\",\n            nodeId: node.id,\n            message: `Option \"${optionName}\" is not a valid name. Use 1-32 lowercase letters, numbers, - or _.`,\n          });\n          continue;\n        }\n        if (optionNames.has(optionName)) {\n          issues.push({\n            level: \"error\",\n            code: \"duplicate-option\",\n            nodeId: node.id,\n            message: `Two options are named \"${optionName}\". Discord rejects the command.`,\n          });\n        }\n        optionNames.add(optionName);\n      }\n      if (rawOptions.length > 25) {\n        issues.push({\n          level: \"error\",\n          code: \"too-many-options\",\n          nodeId: node.id,\n          message: \"Discord allows at most 25 options per slash command.\",\n        });\n      }\n    }\n\n    if (\n      node.data.type === \"button-click\" ||\n      node.data.type === \"dropdown-select\" ||\n      node.data.type === \"modal-submit\"\n    ) {\n      const customId = str(config[\"customId\"]);\n      if (customId.length > 100) {\n        issues.push({\n          level: \"error\",\n          code: \"long-custom-id\",\n          nodeId: node.id,\n          message: \"Discord custom IDs are limited to 100 characters.\",\n        });\n      }\n      if (customId !== \"\" && seenCustomIds.has(customId)) {\n        issues.push({\n          level: \"warning\",\n          code: \"duplicate-custom-id\",\n          nodeId: node.id,\n          message: `Another trigger already listens for \"${customId}\"; both will run.`,\n        });\n      }\n      seenCustomIds.add(customId);\n    }\n\n    for (const menu of stringSelects(node.data.components)) {\n      const options = Array.isArray(menu.options) ? menu.options : [];\n      if (options.length > SELECT_LIMITS.options) {\n        issues.push({\n          level: \"warning\",\n          code: \"too-many-select-options\",\n          nodeId: node.id,\n          message: `A select menu has ${options.length} options; Discord shows only the first ${SELECT_LIMITS.options}.`,\n        });\n      }\n      for (const option of options) {\n        const action = typeof option?.action === \"string\" ? option.action.trim() : \"\";\n        if (action.length > SELECT_LIMITS.value) {\n          issues.push({\n            level: \"error\",\n            code: \"long-option-action\",\n            nodeId: node.id,\n            message: `Select option \"${typeof option?.label === \"string\" ? option.label : \"\"}\" has an action ID over ${SELECT_LIMITS.value} characters.`,\n          });\n        }\n      }\n    }\n\n    // Discord limits that would make the API reject the request.\n    const limit = (code: string, message: string, level: FlowIssue[\"level\"] = \"error\") =>\n      issues.push({ level, code, nodeId: node.id, message: `${nodeLabel(node)}: ${message}` });\n    const literal = (key: string) => str(config[key]);\n    if (literal(\"content\").length > DISCORD_LIMITS.content && !literal(\"content\").includes(\"{\"))\n      limit(\"long-content\", `the message text is over ${DISCORD_LIMITS.content} characters.`);\n    const embeds = Array.isArray(node.data.embeds)\n      ? node.data.embeds\n      : node.data.embed\n        ? [node.data.embed]\n        : [];\n    if (node.data.messageType !== \"components\" && embeds.length > 0) {\n      const total = embeds.reduce((n: number, e) => n + embedSize(e), 0);\n      if (total > DISCORD_LIMITS.embedTotal)\n        limit(\"long-embeds\", `the embeds hold ${total} characters; Discord allows ${DISCORD_LIMITS.embedTotal} per message.`);\n      for (const e of embeds) {\n        const embed = (e ?? {}) as Record<string, unknown>;\n        if (str(embed[\"title\"] as ConfigValue).length > DISCORD_LIMITS.embedTitle)\n          limit(\"long-embed-title\", `an embed title is over ${DISCORD_LIMITS.embedTitle} characters.`, \"warning\");\n        if (str(embed[\"description\"] as ConfigValue).length > DISCORD_LIMITS.embedDescription)\n          limit(\"long-embed-description\", `an embed description is over ${DISCORD_LIMITS.embedDescription} characters.`, \"warning\");\n        if (Array.isArray(embed[\"fields\"]) && embed[\"fields\"].length > DISCORD_LIMITS.embedFields)\n          limit(\"too-many-embed-fields\", `an embed has more than ${DISCORD_LIMITS.embedFields} fields.`, \"warning\");\n      }\n    }\n    if (Array.isArray(node.data.components) && node.data.components.length > 0) {\n      const info = componentsInfo(node.data.components);\n      if (node.data.messageType === \"components\" && info.text > DISCORD_LIMITS.v2Text)\n        limit(\"long-v2-text\", `the layout holds ${info.text} characters of text; Discord allows ${DISCORD_LIMITS.v2Text} per message.`);\n      const dup = info.customIds.find((id, i) => info.customIds.indexOf(id) !== i);\n      if (dup)\n        limit(\"duplicate-component-id\", `two buttons or menus use the action \"${dup}\"; Discord rejects the whole message. Give each its own action.`);\n      if (info.duplicateOptionValues.length > 0)\n        limit(\"duplicate-option-value\", `a menu has two options with the action \"${info.duplicateOptionValues[0]}\".`);\n    }\n    const NAME_KEYS: Record<string, string> = {\n      \"create-channel\": \"name\",\n      \"rename-channel\": \"name\",\n      \"create-role\": \"name\",\n      \"edit-role\": \"name\",\n      \"create-thread\": \"name\",\n    };\n    const nameKey = NAME_KEYS[node.data.type];\n    if (nameKey && literal(nameKey).length > DISCORD_LIMITS.name && !literal(nameKey).includes(\"{\"))\n      limit(\"long-name\", `names are limited to ${DISCORD_LIMITS.name} characters.`);\n    if (node.data.type === \"set-nickname\" && literal(\"nickname\").length > DISCORD_LIMITS.nickname && !literal(\"nickname\").includes(\"{\"))\n      limit(\"long-nickname\", `nicknames are limited to ${DISCORD_LIMITS.nickname} characters.`);\n    if ((node.data.type === \"set-channel-topic\" || node.data.type === \"create-channel\") && literal(\"topic\").length > DISCORD_LIMITS.topic && !literal(\"topic\").includes(\"{\"))\n      limit(\"long-topic\", `channel topics are limited to ${DISCORD_LIMITS.topic} characters.`);\n    if (node.data.type === \"create-invite\") {\n      const age = Number(config[\"maxAge\"] ?? 0);\n      const uses = Number(config[\"maxUses\"] ?? 0);\n      if (age > DISCORD_LIMITS.inviteMaxAge)\n        limit(\"invite-max-age\", `invites can last at most ${DISCORD_LIMITS.inviteMaxAge} seconds (7 days); use 0 for never.`);\n      if (uses > DISCORD_LIMITS.inviteMaxUses)\n        limit(\"invite-max-uses\", `invites allow at most ${DISCORD_LIMITS.inviteMaxUses} uses; use 0 for unlimited.`);\n    }\n    if (node.data.type === \"create-poll\") {\n      const answers = literal(\"answers\").split(/\\r?\\n/).map((a) => a.trim()).filter(Boolean);\n      if (answers.length > 10) limit(\"poll-answers\", \"a poll has at most 10 answers.\");\n      if (answers.some((a) => a.length > 55 && !a.includes(\"{\")))\n        limit(\"poll-answer-length\", \"poll answers are limited to 55 characters.\");\n      if (literal(\"question\").length > 300 && !literal(\"question\").includes(\"{\"))\n        limit(\"poll-question-length\", \"poll questions are limited to 300 characters.\");\n      const hours = Number(config[\"hours\"] ?? 24);\n      if (!Number.isFinite(hours) || hours < 1 || hours > 768)\n        limit(\"poll-duration\", \"a poll stays open between 1 and 768 hours (32 days).\");\n    }\n    for (const problem of shopBlockIssues(node.data.type, config)) limit(\"block-config\", problem);\n    if (node.data.type === \"scheduled-event\" && literal(\"cron\") !== \"\") {\n      const problem = cronProblem(literal(\"cron\"));\n      if (problem) limit(\"bad-cron\", problem);\n    }\n\n    if (node.data.type === \"delete-messages\") {\n      const amount = Number(config[\"amount\"] ?? 0);\n      if (!Number.isFinite(amount) || amount < 1 || amount > 100) {\n        issues.push({\n          level: \"error\",\n          code: \"bulk-delete-range\",\n          nodeId: node.id,\n          message: \"Bulk delete accepts between 1 and 100 messages (Discord limit).\",\n        });\n      }\n    }\n\n    if (spec.permissions.length > 0) {\n      issues.push({\n        level: \"warning\",\n        code: \"needs-permission\",\n        nodeId: node.id,\n        message: `${nodeLabel(node)} requires the bot to have ${spec.permissions.join(\", \")} in the target channel/server.`,\n      });\n    }\n  }\n\n  // Reachability + context analysis per trigger.\n  for (const trigger of triggers) {\n    const triggerSpec = getNodeSpec(trigger.data.type);\n    if (!triggerSpec) continue;\n    const provided = new Set<ContextKind>(triggerSpec.provides ?? []);\n\n    let acknowledgedDepth = -1;\n    let delayDepth = -1;\n    let depth = 0;\n    let frontier = [trigger.id];\n    const visited = new Set<string>([trigger.id]);\n\n    while (frontier.length > 0) {\n      const nextFrontier: string[] = [];\n      depth += 1;\n\n      for (const id of frontier) {\n        const handles = outgoing(flow.edges, id);\n        for (const targets of Object.values(handles)) {\n          for (const targetId of targets) {\n            if (visited.has(targetId)) continue;\n            visited.add(targetId);\n            // Disabled and unknown nodes are skipped at runtime but the chain continues\n            // past them (see compileFlow), so keep walking without checking them.\n            nextFrontier.push(targetId);\n            const target = byId.get(targetId);\n            if (!target) continue;\n            const spec = getNodeSpec(target.data.type);\n            if (!spec || spec.support === \"unsupported\") continue;\n\n            for (const need of spec.requires) {\n              if (!provided.has(need)) {\n                issues.push({\n                  level: \"error\",\n                  code: \"missing-context\",\n                  nodeId: target.id,\n                  message: `${nodeLabel(target)} needs ${CONTEXT_LABEL[need]}, but \"${nodeLabel(trigger)}\" does not provide it.`,\n                });\n              }\n            }\n\n            if (\n              (target.data.type === \"send-message\" || target.data.type === \"send-embed\") &&\n              (target.data.config?.[\"ephemeral\"] === true || target.data.config?.[\"ephemeral\"] === \"true\")\n            ) {\n              if (!provided.has(\"interaction\")) {\n                issues.push({\n                  level: \"warning\",\n                  code: \"ephemeral-without-interaction\",\n                  nodeId: target.id,\n                  message: `${nodeLabel(target)} is set to ephemeral, but \"${nodeLabel(trigger)}\" is not an interaction, so everyone sees it.`,\n                });\n              } else if (str(target.data.config?.[\"channel\"]) !== \"\" && str(target.data.config?.[\"channel\"]) !== \"{channel}\") {\n                issues.push({\n                  level: \"warning\",\n                  code: \"ephemeral-ignores-channel\",\n                  nodeId: target.id,\n                  message: `${nodeLabel(target)} is ephemeral, so it answers the person privately and its Channel is ignored.`,\n                });\n              }\n            }\n\n            if (spec.acknowledges && acknowledgedDepth < 0) acknowledgedDepth = depth;\n            if (target.data.type === \"delay\" && delayDepth < 0) delayDepth = depth;\n          }\n        }\n      }\n      frontier = nextFrontier;\n    }\n\n    // Interaction triggers must be answered; Discord invalidates the token after 3s.\n    if (provided.has(\"interaction\")) {\n      const answered = [...visited].some((id) => {\n        const node = byId.get(id);\n        if (!node) return false;\n        const spec = getNodeSpec(node.data.type);\n        return Boolean(spec?.acknowledges) || node.data.type === \"send-message\";\n      });\n      if (!answered) {\n        issues.push({\n          level: \"warning\",\n          code: \"unacknowledged-interaction\",\n          nodeId: trigger.id,\n          message:\n            'This interaction is never answered. Discord shows \"The application did not respond\" unless a Reply node runs. The runtime defers the reply automatically, but add a Reply to control what the user sees.',\n        });\n      }\n      if (delayDepth >= 0 && (acknowledgedDepth < 0 || delayDepth < acknowledgedDepth)) {\n        issues.push({\n          level: \"warning\",\n          code: \"delay-before-ack\",\n          nodeId: trigger.id,\n          message:\n            \"A Delay runs before this interaction is answered. Discord's interaction token expires after 3 seconds, so reply (or defer) first.\",\n        });\n      }\n    }\n  }\n\n  // A modal has to be the interaction's first answer, and it has no message to\n  // follow up: answer it in the Modal Submit trigger's flow instead.\n  const PURE_BEFORE_MODAL = new Set([\n    \"if-else\",\n    \"check-permission\",\n    \"check-role\",\n    \"check-channel\",\n    \"check-context\",\n    \"is-bot\",\n    \"compare\",\n    \"contains\",\n    \"equals\",\n    \"random\",\n    \"switch\",\n    \"regex-match\",\n    \"set-variable\",\n    \"get-variable\",\n    \"format-text\",\n    \"math\",\n    \"string-op\",\n    \"random-number\",\n    \"random-choice\",\n    \"timestamp-format\",\n    \"increment\",\n    \"decrement\",\n    \"global-get\",\n    \"global-set\",\n    \"cooldown\",\n    \"rate-counter\",\n    \"log-event\",\n  ]);\n  for (const trigger of triggers) {\n    if (!(getNodeSpec(trigger.data.type)?.provides ?? []).includes(\"interaction\")) continue;\n    const before: RawFlowNode[] = [];\n    const seen = new Set<string>([trigger.id]);\n    let frontier = [trigger.id];\n    while (frontier.length > 0) {\n      const next: string[] = [];\n      for (const id of frontier) {\n        for (const targets of Object.values(outgoing(flow.edges, id))) {\n          for (const targetId of targets) {\n            if (seen.has(targetId)) continue;\n            seen.add(targetId);\n            const target = byId.get(targetId);\n            if (!target || getNodeSpec(target.data.type)?.kind === \"trigger\") continue;\n            const type = target.data.type;\n            if (type === \"show-modal\" || type === \"component-modal\") {\n              const slow = before.filter((n) => !PURE_BEFORE_MODAL.has(n.data.type));\n              if (slow.length > 0) {\n                issues.push({\n                  level: \"warning\",\n                  code: \"slow-before-modal\",\n                  nodeId: target.id,\n                  message: `${nodeLabel(target)} must be the first answer within 3 seconds; ${slow\n                    .slice(0, 3)\n                    .map(nodeLabel)\n                    .join(\", \")} run before it. Show the modal first.`,\n                });\n              }\n              // Anything that answers on SHOWN fails at runtime; SUBMITTED is a new interaction.\n              const after = new Set<string>([target.id]);\n              let walk = [target.id];\n              while (walk.length > 0) {\n                const more: string[] = [];\n                for (const from of walk) {\n                  const lists =\n                    from === target.id\n                      ? [outgoing(flow.edges, from)[\"out\"] ?? []]\n                      : Object.values(outgoing(flow.edges, from));\n                  for (const list of lists) {\n                    for (const to of list) {\n                      if (after.has(to)) continue;\n                      after.add(to);\n                      const node = byId.get(to);\n                      if (!node || getNodeSpec(node.data.type)?.kind === \"trigger\") continue;\n                      more.push(to);\n                      const answers =\n                        node.data.type === \"reply\" ||\n                        node.data.type === \"defer-reply\" ||\n                        ((node.data.type === \"send-message\" || node.data.type === \"send-embed\") &&\n                          (node.data.config?.[\"ephemeral\"] === true ||\n                            node.data.config?.[\"ephemeral\"] === \"true\"));\n                      if (answers) {\n                        issues.push({\n                          level: \"error\",\n                          code: \"answer-after-modal\",\n                          nodeId: node.id,\n                          message: `${nodeLabel(node)} runs after ${nodeLabel(target)}, but blocks on its SHOWN output run before the form is sent. Connect it to the SUBMITTED output (or a Modal Submit trigger) to answer the form.`,\n                        });\n                      }\n                    }\n                  }\n                }\n                walk = more;\n              }\n              continue;\n            }\n            before.push(target);\n            next.push(targetId);\n          }\n        }\n      }\n      frontier = next;\n    }\n  }\n\n  // Unreachable analysis runs once, across all triggers.\n  if (triggers.length > 0) {\n    for (const node of nodes) {\n      const spec = getNodeSpec(node.data.type);\n      if (spec?.kind === \"trigger\") continue;\n      if (!isReachableFromAnyTrigger(flow, triggers, node.id)) {\n        issues.push({\n          level: \"warning\",\n          code: \"unreachable\",\n          nodeId: node.id,\n          message: `${nodeLabel(node)} is not connected to any trigger, so it never runs.`,\n        });\n      }\n    }\n  }\n\n  return dedupeIssues(issues);\n}\n\nfunction isReachableFromAnyTrigger(\n  flow: RawFlow,\n  triggers: RawFlowNode[],\n  nodeId: string,\n): boolean {\n  for (const trigger of triggers) {\n    const visited = new Set<string>([trigger.id]);\n    const stack = [trigger.id];\n    while (stack.length > 0) {\n      const current = stack.pop() as string;\n      for (const targets of Object.values(outgoing(flow.edges, current))) {\n        for (const target of targets) {\n          if (target === nodeId) return true;\n          if (visited.has(target)) continue;\n          visited.add(target);\n          stack.push(target);\n        }\n      }\n    }\n  }\n  return false;\n}\n\nfunction dedupeIssues(issues: FlowIssue[]): FlowIssue[] {\n  const seen = new Set<string>();\n  const out: FlowIssue[] = [];\n  for (const issue of issues) {\n    const key = `${issue.level}|${issue.code}|${issue.nodeId ?? \"\"}|${issue.message}`;\n    if (seen.has(key)) continue;\n    seen.add(key);\n    out.push(issue);\n  }\n  return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Compilation\n * ------------------------------------------------------------------ */\n\nconst OPTION_TYPES = new Set([\n  \"string\",\n  \"integer\",\n  \"number\",\n  \"boolean\",\n  \"user\",\n  \"role\",\n  \"channel\",\n  \"mentionable\",\n  \"attachment\",\n]);\n\n/** \"a, b, c\" (or an array) → up to 25 unique suggestions of max 100 characters. */\nexport function suggestionList(raw: unknown): string[] {\n  const parts = Array.isArray(raw) ? raw.map(String) : String(raw ?? \"\").split(\",\");\n  const out: string[] = [];\n  for (const part of parts) {\n    const value = part.trim().slice(0, 100);\n    if (value !== \"\" && !out.includes(value)) out.push(value);\n    if (out.length >= 25) break;\n  }\n  return out;\n}\n\nfunction compileOptions(raw: unknown): CompiledCommandOption[] {\n  if (!Array.isArray(raw)) return [];\n  const options: CompiledCommandOption[] = [];\n  for (const entry of raw) {\n    if (typeof entry !== \"object\" || entry === null) continue;\n    const record = entry as Record<string, unknown>;\n    const name = String(record[\"name\"] ?? \"\")\n      .trim()\n      .toLowerCase();\n    if (name === \"\" || !COMMAND_NAME_PATTERN.test(name)) continue;\n    const type = String(record[\"type\"] ?? \"string\");\n    options.push({\n      name,\n      description: String(record[\"description\"] ?? \"\").slice(0, 100) || name,\n      type: OPTION_TYPES.has(type) ? type : \"string\",\n      required: record[\"required\"] === true,\n      autocomplete: record[\"autocomplete\"] === true,\n      ...(record[\"autocomplete\"] === true ? { suggestions: suggestionList(record[\"suggestions\"]) } : {}),\n    });\n  }\n  // Discord requires required options before optional ones.\n  return [...options.filter((o) => o.required), ...options.filter((o) => !o.required)];\n}\n\nexport interface CompileResult {\n  compiled: CompiledFlow | null;\n  issues: FlowIssue[];\n}\n\n/**\n * Turns a builder graph into the executable form. Returns `compiled: null`\n * when validation produced errors — the runtime must never receive a graph\n * that the control plane knows is broken.\n */\nexport function compileFlow(flow: RawFlow): CompileResult {\n  const issues = validateFlow(flow);\n  if (issues.some((issue) => issue.level === \"error\")) return { compiled: null, issues };\n\n  const enabled = (flow.nodes ?? []).filter((node) => node?.data && node.data.enabled !== false);\n  const known = enabled.filter((node) => {\n    const spec = getNodeSpec(node.data.type);\n    return spec !== null && spec.support !== \"unsupported\";\n  });\n  const keep = new Set(known.map((node) => node.id));\n\n  const nodes: Record<string, CompiledNode> = {};\n  for (const node of known) {\n    const handles = outgoing(flow.edges, node.id);\n    const next: Record<string, string[]> = {};\n    for (const [handle, targets] of Object.entries(handles)) {\n      // Skipped (unsupported) nodes are bridged over, so the rest of the chain\n      // still runs instead of silently dead-ending.\n      const resolved: string[] = [];\n      for (const target of targets) resolved.push(...resolveTarget(flow, keep, target, new Set()));\n      // A line into a trigger (message → its Button Click) is only a visual\n      // hint: the trigger starts its own run, it is never a step of this one.\n      const steps = resolved.filter((id) => {\n        const target = known.find((n) => n.id === id);\n        return getNodeSpec(target?.data.type ?? \"\")?.kind !== \"trigger\";\n      });\n      if (steps.length > 0) next[handle] = sortLeftToRight(steps, known);\n    }\n\n    nodes[node.id] = {\n      id: node.id,\n      type: node.data.type,\n      title: str(node.data.title as ConfigValue) || node.data.type,\n      config: node.data.config ?? {},\n      embed: node.data.embed ?? null,\n      embeds: node.data.embeds ?? null,\n      components: node.data.components ?? null,\n      messageType: node.data.messageType ?? null,\n      next,\n    };\n  }\n\n  const triggers: CompiledTrigger[] = [];\n  const commands: CompiledCommand[] = [];\n  const intents = new Set<string>([\"Guilds\"]);\n\n  for (const node of known) {\n    const spec = getNodeSpec(node.data.type) as NodeSpec;\n    for (const intent of spec.intents) intents.add(intent);\n\n    if (spec.kind !== \"trigger\") continue;\n    const config = node.data.config ?? {};\n    triggers.push({ nodeId: node.id, type: node.data.type, config });\n\n    if (node.data.type === \"slash-command\") {\n      const scope = str(config[\"scope\"]);\n      // \"auto\" (and older flows): server only when a block needs a server.\n      const needsGuild = known.some((n) =>\n        (getNodeSpec(n.data.type)?.requires ?? []).some((r) => r === \"guild\" || r === \"member\"),\n      );\n      const bit = COMMAND_PERMISSION_BITS[str(config[\"memberPermission\"])];\n      commands.push({\n        name: str(config[\"name\"]).toLowerCase(),\n        description: str(config[\"description\"]).slice(0, 100) || \"A Bottly command\",\n        nodeId: node.id,\n        options: compileOptions(node.data.options),\n        ...(scope === \"guild\" || (scope !== \"everywhere\" && needsGuild) ? { guildOnly: true } : {}),\n        ...(bit !== undefined ? { memberPermissions: (BigInt(1) << BigInt(bit)).toString() } : {}),\n      });\n    }\n  }\n\n  return {\n    compiled: {\n      contractVersion: FLOW_CONTRACT_VERSION,\n      flowId: flow.id,\n      flowName: flow.name,\n      intents: [...intents],\n      triggers,\n      commands,\n      nodes,\n    },\n    issues,\n  };\n}\n\n/**\n * Several blocks on one output run one after another, left to right as they\n * sit on the canvas (then top to bottom), so the order is the one people see.\n * Blocks without a position keep the order their connections were made.\n */\nexport function sortLeftToRight(ids: string[], nodes: RawFlowNode[]): string[] {\n  const pos = new Map(nodes.map((n) => [n.id, n.position]));\n  return ids\n    .map((id, index) => ({ id, index, p: pos.get(id) }))\n    .sort((a, b) => {\n      if (!a.p || !b.p) return a.index - b.index;\n      return a.p.x - b.p.x || a.p.y - b.p.y || a.index - b.index;\n    })\n    .map((t) => t.id);\n}\n\n/** Walks past skipped nodes to the first executable descendant(s). */\nfunction resolveTarget(\n  flow: RawFlow,\n  keep: Set<string>,\n  target: string,\n  seen: Set<string>,\n): string[] {\n  if (keep.has(target)) return [target];\n  if (seen.has(target)) return [];\n  seen.add(target);\n\n  const out: string[] = [];\n  for (const targets of Object.values(outgoing(flow.edges, target))) {\n    for (const next of targets) out.push(...resolveTarget(flow, keep, next, seen));\n  }\n  return out;\n}\n\n/** Node-support matrix, used by the docs page and the builder's help panel. */\nexport function supportMatrix(): {\n  type: string;\n  support: NodeSupport;\n  discord: string;\n  note: string;\n}[] {\n  return Object.entries(NODE_SPECS).map(([type, spec]) => ({\n    type,\n    support: spec.support,\n    discord: spec.discord,\n    note: spec.note ?? \"\",\n  }));\n}\n\n/* ------------------------------------------------------------------ *\n * SellAuth API operations (1:1 with https://docs.sellauth.com/openapi.yaml)\n * Shared by the builder (operation picker) and the runtime (request maker).\n * Paths are relative to /v1/shops/{shopId}; {id} / {id2} come from the node.\n * ------------------------------------------------------------------ */\n\nexport interface SellAuthOperation {\n  id: string;\n  label: string;\n  method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n  path: string;\n  /** Documented parameter names (query for GET, JSON body otherwise). */\n  params: string[];\n  /** Response is a (paginated) list. */\n  list?: boolean;\n}\n\nexport const SELLAUTH_OPERATIONS: SellAuthOperation[] = [\n  { id: \"shop.stats\", label: \"Shop: Get stats\", method: \"GET\", path: \"/stats\", params: [] },\n  {\n    id: \"invoices.list\",\n    label: \"Invoices: List\",\n    method: \"GET\",\n    path: \"/invoices\",\n    params: [\n      \"page\",\n      \"perPage\",\n      \"orderColumn\",\n      \"orderDirection\",\n      \"id\",\n      \"statuses\",\n      \"email\",\n      \"gateways\",\n    ],\n    list: true,\n  },\n  { id: \"invoices.get\", label: \"Invoices: Get\", method: \"GET\", path: \"/invoices/{id}\", params: [] },\n  {\n    id: \"invoices.process\",\n    label: \"Invoices: Process\",\n    method: \"GET\",\n    path: \"/invoices/{id}/process\",\n    params: [\"mark_as_paid\"],\n  },\n  {\n    id: \"invoices.status\",\n    label: \"Invoices: Update status\",\n    method: \"POST\",\n    path: \"/invoices/{id}/status\",\n    params: [\"status\"],\n  },\n  {\n    id: \"invoices.archive\",\n    label: \"Invoices: Archive\",\n    method: \"POST\",\n    path: \"/invoices/{id}/archive\",\n    params: [],\n  },\n  {\n    id: \"invoices.unarchive\",\n    label: \"Invoices: Unarchive\",\n    method: \"POST\",\n    path: \"/invoices/{id}/unarchive\",\n    params: [],\n  },\n  {\n    id: \"invoices.note\",\n    label: \"Invoices: Update dashboard note\",\n    method: \"PUT\",\n    path: \"/invoices/{id}/dashboard-note\",\n    params: [\"dashboard_note\"],\n  },\n  {\n    id: \"invoices.paid\",\n    label: \"Invoices: Update paid amount\",\n    method: \"PUT\",\n    path: \"/invoices/{id}/paid-amount\",\n    params: [\"paid\", \"paid_usd\"],\n  },\n  {\n    id: \"invoices.ship\",\n    label: \"Invoices: Mark as shipped\",\n    method: \"POST\",\n    path: \"/invoices/{id}/ship\",\n    params: [\"tracking_code\", \"tracking_link\"],\n  },\n  {\n    id: \"invoices.deliver\",\n    label: \"Invoices: Deliver\",\n    method: \"POST\",\n    path: \"/invoices/{id}/deliver\",\n    params: [],\n  },\n  {\n    id: \"invoices.replace\",\n    label: \"Invoices: Replace delivered\",\n    method: \"POST\",\n    path: \"/invoices/{id}/replace-delivered\",\n    params: [\"invoice_item_id\", \"replacements\"],\n  },\n  {\n    id: \"invoices.redo-dynamic\",\n    label: \"Invoices: Redo dynamic delivery\",\n    method: \"POST\",\n    path: \"/invoices/{id}/redo-dynamic-delivery\",\n    params: [\"invoice_item_id\"],\n  },\n  {\n    id: \"invoices.resend\",\n    label: \"Invoices: Resend email\",\n    method: \"POST\",\n    path: \"/invoices/{id}/resend-email\",\n    params: [\"email\"],\n  },\n  {\n    id: \"invoices.reverse-affiliate\",\n    label: \"Invoices: Reverse affiliate commission\",\n    method: \"POST\",\n    path: \"/invoices/{id}/reverse-affiliate-commission\",\n    params: [],\n  },\n  {\n    id: \"invoices.reverse-cashback\",\n    label: \"Invoices: Reverse cashback\",\n    method: \"POST\",\n    path: \"/invoices/{id}/reverse-cashback\",\n    params: [],\n  },\n  {\n    id: \"products.list\",\n    label: \"Products: List\",\n    method: \"GET\",\n    path: \"/products\",\n    params: [\"page\", \"perPage\", \"orderColumn\", \"orderDirection\", \"type\", \"ids\", \"name\"],\n    list: true,\n  },\n  { id: \"products.get\", label: \"Products: Get\", method: \"GET\", path: \"/products/{id}\", params: [] },\n  {\n    id: \"products.delete\",\n    label: \"Products: Delete\",\n    method: \"DELETE\",\n    path: \"/products/{id}\",\n    params: [],\n  },\n  {\n    id: \"products.clone\",\n    label: \"Products: Clone\",\n    method: \"POST\",\n    path: \"/products/{id}/clone\",\n    params: [],\n  },\n  {\n    id: \"products.stock\",\n    label: \"Products: Update stock (variant)\",\n    method: \"PUT\",\n    path: \"/products/{id}/stock/{id2}\",\n    params: [\"stock\"],\n  },\n  {\n    id: \"products.deliverables\",\n    label: \"Products: Get deliverables (variant)\",\n    method: \"GET\",\n    path: \"/products/{id}/deliverables/{id2}\",\n    params: [],\n  },\n  {\n    id: \"products.deliverables-append\",\n    label: \"Products: Append deliverables\",\n    method: \"PUT\",\n    path: \"/products/{id}/deliverables/append/{id2}\",\n    params: [\"deliverables\"],\n  },\n  {\n    id: \"products.deliverables-overwrite\",\n    label: \"Products: Overwrite deliverables\",\n    method: \"PUT\",\n    path: \"/products/{id}/deliverables/overwrite/{id2}\",\n    params: [\"deliverables\", \"confirm_empty\"],\n  },\n  {\n    id: \"coupons.list\",\n    label: \"Coupons: List\",\n    method: \"GET\",\n    path: \"/coupons\",\n    params: [\"page\", \"perPage\", \"code\", \"statuses\", \"type\"],\n    list: true,\n  },\n  { id: \"coupons.get\", label: \"Coupons: Get\", method: \"GET\", path: \"/coupons/{id}\", params: [] },\n  {\n    id: \"coupons.create\",\n    label: \"Coupons: Create\",\n    method: \"POST\",\n    path: \"/coupons\",\n    params: [\n      \"code\",\n      \"global\",\n      \"discount\",\n      \"type\",\n      \"max_uses\",\n      \"max_uses_per_customer\",\n      \"min_invoice_price\",\n      \"start_date\",\n      \"expiration_date\",\n      \"items\",\n    ],\n  },\n  {\n    id: \"coupons.update\",\n    label: \"Coupons: Update\",\n    method: \"PUT\",\n    path: \"/coupons/{id}/update\",\n    params: [\n      \"code\",\n      \"global\",\n      \"discount\",\n      \"type\",\n      \"max_uses\",\n      \"max_uses_per_customer\",\n      \"min_invoice_price\",\n      \"start_date\",\n      \"expiration_date\",\n    ],\n  },\n  {\n    id: \"coupons.delete\",\n    label: \"Coupons: Delete\",\n    method: \"DELETE\",\n    path: \"/coupons/{id}\",\n    params: [],\n  },\n  {\n    id: \"coupons.delete-used\",\n    label: \"Coupons: Delete used\",\n    method: \"DELETE\",\n    path: \"/coupons/used\",\n    params: [],\n  },\n  {\n    id: \"customers.list\",\n    label: \"Customers: List\",\n    method: \"GET\",\n    path: \"/customers\",\n    params: [\"page\", \"perPage\", \"id\", \"email\", \"discord_id\", \"discord_username\"],\n    list: true,\n  },\n  {\n    id: \"customers.get\",\n    label: \"Customers: Get\",\n    method: \"GET\",\n    path: \"/customers/{id}\",\n    params: [],\n  },\n  {\n    id: \"customers.create\",\n    label: \"Customers: Create\",\n    method: \"POST\",\n    path: \"/customers\",\n    params: [\"email\", \"newsletter\"],\n  },\n  {\n    id: \"customers.delete\",\n    label: \"Customers: Delete\",\n    method: \"DELETE\",\n    path: \"/customers/{id}\",\n    params: [],\n  },\n  {\n    id: \"customers.balance\",\n    label: \"Customers: Edit balance\",\n    method: \"PUT\",\n    path: \"/customers/{id}/balance\",\n    params: [\"amount\", \"description\", \"invoice_id\"],\n  },\n  {\n    id: \"customers.balance-history\",\n    label: \"Customers: Balance transactions\",\n    method: \"GET\",\n    path: \"/customers/{id}/balance-transactions\",\n    params: [],\n    list: true,\n  },\n  {\n    id: \"customers.newsletter\",\n    label: \"Customers: Set newsletter\",\n    method: \"PUT\",\n    path: \"/customers/{id}/newsletter\",\n    params: [\"newsletter\"],\n  },\n  {\n    id: \"customers.discord-revoke\",\n    label: \"Customers: Revoke Discord login\",\n    method: \"POST\",\n    path: \"/customers/{id}/discord/revoke\",\n    params: [],\n  },\n  {\n    id: \"customers.tfa-disable\",\n    label: \"Customers: Disable 2FA\",\n    method: \"POST\",\n    path: \"/customers/{id}/tfa/disable\",\n    params: [],\n  },\n  {\n    id: \"subscriptions.list\",\n    label: \"Subscriptions: List\",\n    method: \"GET\",\n    path: \"/subscriptions\",\n    params: [\"status\", \"product_id\", \"customer_id\", \"perPage\"],\n    list: true,\n  },\n  {\n    id: \"subscriptions.get\",\n    label: \"Subscriptions: Get\",\n    method: \"GET\",\n    path: \"/subscriptions/{id}\",\n    params: [],\n  },\n  {\n    id: \"subscriptions.cancel\",\n    label: \"Subscriptions: Cancel\",\n    method: \"POST\",\n    path: \"/subscriptions/{id}/cancel\",\n    params: [\"at_period_end\"],\n  },\n  {\n    id: \"checkout.create\",\n    label: \"Checkout: Create session\",\n    method: \"POST\",\n    path: \"/checkout\",\n    params: [\"cart\", \"email\", \"discord_user_id\", \"coupon\", \"gateway\", \"currency\"],\n  },\n  {\n    id: \"tickets.list\",\n    label: \"Tickets: List\",\n    method: \"GET\",\n    path: \"/tickets\",\n    params: [\"page\", \"perPage\", \"statuses\", \"customer_email\"],\n    list: true,\n  },\n  {\n    id: \"tickets.stats\",\n    label: \"Tickets: Stats\",\n    method: \"GET\",\n    path: \"/tickets/stats\",\n    params: [],\n  },\n  { id: \"tickets.get\", label: \"Tickets: Get\", method: \"GET\", path: \"/tickets/{id}\", params: [] },\n  {\n    id: \"tickets.create\",\n    label: \"Tickets: Create\",\n    method: \"POST\",\n    path: \"/tickets\",\n    params: [\"customer_id\", \"subject\", \"invoice_id\"],\n  },\n  {\n    id: \"tickets.close\",\n    label: \"Tickets: Close\",\n    method: \"POST\",\n    path: \"/tickets/{id}/close\",\n    params: [],\n  },\n  {\n    id: \"tickets.reopen\",\n    label: \"Tickets: Reopen\",\n    method: \"POST\",\n    path: \"/tickets/{id}/reopen\",\n    params: [],\n  },\n  {\n    id: \"tickets.message\",\n    label: \"Tickets: Send message\",\n    method: \"POST\",\n    path: \"/tickets/{id}/messages\",\n    params: [\"content\"],\n  },\n  {\n    id: \"feedbacks.list\",\n    label: \"Feedback: List\",\n    method: \"GET\",\n    path: \"/feedbacks\",\n    params: [\"page\", \"perPage\", \"statuses\", \"invoice_id\", \"rating\"],\n    list: true,\n  },\n  {\n    id: \"feedbacks.stats\",\n    label: \"Feedback: Stats\",\n    method: \"GET\",\n    path: \"/feedbacks/stats\",\n    params: [\"created_at_start\", \"created_at_end\"],\n  },\n  {\n    id: \"feedbacks.get\",\n    label: \"Feedback: Get\",\n    method: \"GET\",\n    path: \"/feedbacks/{id}\",\n    params: [],\n  },\n  {\n    id: \"feedbacks.reply\",\n    label: \"Feedback: Reply\",\n    method: \"POST\",\n    path: \"/feedbacks/{id}/reply\",\n    params: [\"reply\"],\n  },\n  {\n    id: \"feedbacks.dispute\",\n    label: \"Feedback: Dispute\",\n    method: \"POST\",\n    path: \"/feedbacks/{id}/dispute\",\n    params: [\"reason\"],\n  },\n  {\n    id: \"abandoned.list\",\n    label: \"Abandoned checkouts: List\",\n    method: \"GET\",\n    path: \"/abandoned-checkouts\",\n    params: [\"page\", \"perPage\", \"search\", \"date_from\", \"date_to\"],\n    list: true,\n  },\n  {\n    id: \"abandoned.stats\",\n    label: \"Abandoned checkouts: Stats\",\n    method: \"GET\",\n    path: \"/abandoned-checkouts/stats\",\n    params: [],\n  },\n  {\n    id: \"abandoned.recover\",\n    label: \"Abandoned checkouts: Send recovery\",\n    method: \"POST\",\n    path: \"/abandoned-checkouts/{id}/recover\",\n    params: [],\n  },\n  {\n    id: \"analytics.top-products\",\n    label: \"Analytics: Top products\",\n    method: \"GET\",\n    path: \"/analytics/top-products\",\n    params: [],\n    list: true,\n  },\n  {\n    id: \"analytics.top-customers\",\n    label: \"Analytics: Top customers\",\n    method: \"GET\",\n    path: \"/analytics/top-customers\",\n    params: [],\n    list: true,\n  },\n  {\n    id: \"analytics.traffic\",\n    label: \"Analytics: Traffic stats\",\n    method: \"GET\",\n    path: \"/analytics/traffic/stats\",\n    params: [],\n  },\n  { id: \"custom\", label: \"Custom endpoint\", method: \"GET\", path: \"\", params: [] },\n];\n\n/** Parameters the SellAuth API documents as text: never coerced to numbers or booleans. */\nconst SELLAUTH_TEXT_PARAMS = new Set([\n  \"code\",\n  \"content\",\n  \"coupon\",\n  \"created_at_end\",\n  \"created_at_start\",\n  \"currency\",\n  \"customer_email\",\n  \"dashboard_note\",\n  \"date_from\",\n  \"date_to\",\n  \"description\",\n  \"discord_id\",\n  \"discord_user_id\",\n  \"discord_username\",\n  \"email\",\n  \"expiration_date\",\n  \"gateway\",\n  \"id\",\n  \"name\",\n  \"orderColumn\",\n  \"orderDirection\",\n  \"reason\",\n  \"reply\",\n  \"search\",\n  \"start_date\",\n  \"status\",\n  \"subject\",\n  \"tracking_code\",\n  \"tracking_link\",\n  \"type\",\n]);\n\n/** Array parameters: a plain value is split on commas / new lines (e.g. keys=a,b,c). */\nconst SELLAUTH_LIST_PARAMS = new Set([\"deliverables\", \"ids\", \"statuses\"]);\n\nconst VARIABLE_TOKEN = /\\{([a-zA-Z0-9_.-]+)\\}/g;\n\n/**\n * Parse \"key=value\" lines into typed values (numbers, booleans, JSON arrays/objects).\n * `resolve` fills {variables} per value AFTER the line is split, so user input can\n * never add lines, change types of text fields or break out of a JSON value.\n */\nexport function parseSellAuthParams(\n  raw: string,\n  resolve: (token: string) => string = (t) => t,\n): Record<string, unknown> {\n  const out: Record<string, unknown> = {};\n  for (const line of raw.split(/\\r?\\n/)) {\n    const eq = line.indexOf(\"=\");\n    if (eq <= 0) continue;\n    const key = line.slice(0, eq).trim();\n    const template = line.slice(eq + 1).trim();\n    if (!key || template === \"\") continue;\n    if (/^(\\[|\\{\\s*[\"}])/.test(template)) {\n      // JSON array/object template: substituted values are JSON-escaped (quoted fields stay strings).\n      const json = template.replace(VARIABLE_TOKEN, (token) =>\n        JSON.stringify(resolve(token)).slice(1, -1),\n      );\n      try {\n        out[key] = JSON.parse(json);\n      } catch {\n        out[key] = json;\n      }\n      continue;\n    }\n    const value = template.replace(VARIABLE_TOKEN, (token) => resolve(token)).trim();\n    if (value === \"\") continue;\n    if (SELLAUTH_LIST_PARAMS.has(key))\n      out[key] = value\n        .split(/[\\n,]/)\n        .map((item) => item.trim())\n        .filter(Boolean);\n    else if (SELLAUTH_TEXT_PARAMS.has(key)) out[key] = value;\n    else if (/^-?(0|[1-9]\\d{0,14})(\\.\\d+)?$/.test(value)) out[key] = Number(value);\n    else if (value === \"true\" || value === \"false\") out[key] = value === \"true\";\n    else out[key] = value;\n  }\n  return out;\n}\n\n/** Build the SellAuth request (path relative to /v1/shops/{shop}) for an operation. */\nexport function buildSellAuthRequest(\n  operationId: string,\n  input: { id?: string; id2?: string; params?: string; method?: string; path?: string },\n  resolve?: (token: string) => string,\n): { method: string; path: string; body?: Record<string, unknown> } {\n  const op = SELLAUTH_OPERATIONS.find((o) => o.id === operationId);\n  if (!op) throw new Error(`Unknown SellAuth operation \"${operationId}\".`);\n  const method = op.id === \"custom\" ? (input.method || \"GET\").toUpperCase() : op.method;\n  let path = op.id === \"custom\" ? (input.path || \"\").trim() : op.path;\n  if (!path.startsWith(\"/\")) path = `/${path}`;\n  for (const [token, value] of [\n    [\"{id}\", input.id],\n    [\"{id2}\", input.id2],\n  ] as const) {\n    if (!path.includes(token)) continue;\n    if (!value)\n      throw new Error(\n        `SellAuth \"${op.label}\" needs ${token === \"{id}\" ? \"an ID\" : \"a second ID (variant)\"}.`,\n      );\n    path = path.replace(token, encodeURIComponent(value));\n  }\n  const params = parseSellAuthParams(input.params ?? \"\", resolve);\n  if (method === \"GET\" || method === \"DELETE\") {\n    const qs = new URLSearchParams();\n    for (const [k, v] of Object.entries(params)) {\n      if (Array.isArray(v)) for (const item of v) qs.append(`${k}[]`, String(item));\n      else qs.append(k, typeof v === \"object\" ? JSON.stringify(v) : String(v));\n    }\n    const q = qs.toString();\n    return { method, path: q ? `${path}?${q}` : path };\n  }\n  return { method, path, body: params };\n}\n\n/* ------------------------------------------------------------------ *\n * Message components shared by the editor, preview and runtime\n * ------------------------------------------------------------------ */\n\n/** Discord's limits for select menus (same rules Discohook enforces). */\nexport const SELECT_LIMITS = {\n  options: 25,\n  label: 100,\n  description: 100,\n  value: 100,\n  placeholder: 150,\n  customId: 100,\n} as const;\n\n/** A partial Discord emoji: unicode (`name` only) or custom (`id` + `name`). */\nexport interface ComponentEmoji {\n  id?: string;\n  name: string;\n  animated?: boolean;\n}\n\nconst EMOJI_CDN =\n  /^https?:\\/\\/(?:media\\.|cdn\\.)?discord(?:app)?\\.(?:com|net)\\/emojis\\/(\\d{17,20})\\.(png|webp|gif|jpe?g)(\\?[^\\s]*)?$/i;\nconst PICTOGRAPHIC = /\\p{Extended_Pictographic}|\\p{Regional_Indicator}/u;\n\n/**\n * Parses what a user typed in an emoji field: a unicode emoji (\"🔥\"), Discord's\n * custom emoji syntax (\"<:name:id>\", \"<a:name:id>\", \"name:id\"), a bare emoji ID\n * or an emoji CDN URL. Returns null when it is not a usable emoji.\n */\nexport function parseComponentEmoji(raw: string | null | undefined): ComponentEmoji | null {\n  const value = (raw ?? \"\").trim();\n  if (value === \"\") return null;\n  const custom =\n    /^<(a)?:([\\w~]{1,32}):(\\d{1,20})>$/.exec(value) ??\n    /^(?:(a):)?:?([\\w~]{1,32}):(\\d{17,20})$/.exec(value);\n  if (custom) return { id: custom[3]!, name: custom[2]!, ...(custom[1] ? { animated: true } : {}) };\n  if (/^\\d{17,20}$/.test(value)) return { id: value, name: \"emoji\" };\n  const url = EMOJI_CDN.exec(value);\n  if (url) {\n    const animated = url[2]!.toLowerCase() === \"gif\" || /[?&]animated=true/i.test(url[3] ?? \"\");\n    return { id: url[1]!, name: \"emoji\", ...(animated ? { animated: true } : {}) };\n  }\n  // A unicode emoji (with skin tones / ZWJ sequences) never contains plain text.\n  const bare = value.replace(/[0-9#*]\\ufe0f?\\u20e3/g, \"\\u{1f522}\"); // keycaps such as 1️⃣\n  if (value.length <= 32 && PICTOGRAPHIC.test(bare) && !/[\\s\\w<>:]/.test(bare))\n    return { name: value };\n  return null;\n}\n\n/** Image URL of a custom emoji, or null for unicode emojis. */\nexport function componentEmojiUrl(emoji: ComponentEmoji | null): string | null {\n  if (!emoji?.id) return null;\n  return `https://cdn.discordapp.com/emojis/${emoji.id}.webp?size=48${emoji.animated ? \"&animated=true\" : \"\"}`;\n}\n\n/**\n * custom_id of a select menu. String selects have no user-facing ID any more\n * (each option carries its own action ID), so it is derived from the stable\n * component id; an older menu keeps the action ID it was saved with.\n */\nexport function selectMenuCustomId(component: { id?: string; action?: string }, index = 0): string {\n  const legacy = (component.action ?? \"\").trim();\n  if (legacy !== \"\") return legacy.slice(0, SELECT_LIMITS.customId);\n  const id = (component.id ?? \"\").trim();\n  return (id !== \"\" ? `sel_${id}` : `bottly_${index}`).slice(0, SELECT_LIMITS.customId);\n}\n\n/** True for a custom_id generated by selectMenuCustomId (no legacy menu ID). */\nexport function isGeneratedSelectId(customId: string): boolean {\n  return customId.startsWith(\"sel_\");\n}\n\n/**\n * The value Discord sends back for each option: its action ID (falling back to\n * the legacy value or the label). Values must be unique within a menu, so a\n * repeated one gets a \"~2\", \"~3\"… suffix that optionActionId strips again.\n */\nexport function selectOptionValues(\n  options: { action?: string; value?: string; label?: string }[],\n): string[] {\n  const seen = new Set<string>();\n  return options.map((option, i) => {\n    const base = (\n      (option.action ?? \"\").trim() ||\n      (option.value ?? \"\").trim() ||\n      (option.label ?? \"\").trim() ||\n      `option_${i + 1}`\n    ).slice(0, SELECT_LIMITS.value);\n    let value = base;\n    for (let n = 2; seen.has(value); n++) {\n      const suffix = `~${n}`;\n      value = base.slice(0, SELECT_LIMITS.value - suffix.length) + suffix;\n    }\n    seen.add(value);\n    return value;\n  });\n}\n\n/** The action ID behind a selected option value (undoes the \"~n\" de-duplication). */\nexport function optionActionId(value: string): string {\n  return value.replace(/~\\d+$/, \"\");\n}\n\n/** Clamps a select menu's min/max values to what Discord accepts. */\nexport function selectValueRange(\n  component: { minValues?: number | undefined; maxValues?: number | undefined },\n  optionCount: number = SELECT_LIMITS.options,\n): { min: number; max: number } {\n  const cap = Math.max(1, Math.min(SELECT_LIMITS.options, optionCount));\n  const int = (v: unknown, fallback: number) =>\n    typeof v === \"number\" && Number.isFinite(v) ? Math.trunc(v) : fallback;\n  const min = Math.max(0, Math.min(cap, int(component.minValues, 1)));\n  const max = Math.max(Math.max(1, min), Math.min(cap, int(component.maxValues, 1)));\n  return { min, max };\n}\n\n/* ------------------------------------------------------------------ *\n * Modals (Show Modal): up to 5 fields — text inputs, dropdowns, user /\n * role / channel / mentionable pickers, file uploads and info text.\n * Stored as JSON in the node's `modalFields` config value.\n * ------------------------------------------------------------------ */\n\nexport const MODAL_LIMITS = {\n  fields: 5,\n  title: 45,\n  label: 45,\n  description: 100,\n  placeholder: 100,\n  textLength: 4000,\n  textDisplay: 4000,\n  files: 10,\n} as const;\n\nexport type ModalFieldKind =\n  | \"short\"\n  | \"paragraph\"\n  | \"select\"\n  | \"user-select\"\n  | \"role-select\"\n  | \"channel-select\"\n  | \"mentionable-select\"\n  | \"file\"\n  | \"radio\"\n  | \"checkbox-group\"\n  | \"checkbox\"\n  | \"text\";\n\n/** Choice fields with their own options list, and how many options they take. */\nexport const MODAL_OPTION_LIMITS: Partial<Record<ModalFieldKind, { min: number; max: number }>> = {\n  select: { min: 1, max: 25 },\n  radio: { min: 2, max: 10 },\n  \"checkbox-group\": { min: 1, max: 10 },\n};\n\nexport interface ModalFieldOption {\n  label: string;\n  value: string;\n  description?: string | undefined;\n  emoji?: string | undefined;\n  /** Picked when the form opens. */\n  default?: boolean | undefined;\n}\n\nexport interface ModalField {\n  /** The answer's variable name ({id} in the Modal Submit flow). */\n  id: string;\n  kind: ModalFieldKind;\n  label: string;\n  /** Small text under the label. */\n  description?: string | undefined;\n  placeholder?: string | undefined;\n  required?: boolean | undefined;\n  /** Text inputs. */\n  minLength?: number | undefined;\n  maxLength?: number | undefined;\n  /** Text inputs: text already filled in. */\n  value?: string | undefined;\n  /** Dropdowns. */\n  options?: ModalFieldOption[] | undefined;\n  /** Dropdowns, pickers and file uploads: how many may be chosen. */\n  minValues?: number | undefined;\n  maxValues?: number | undefined;\n  /** \"text\" fields: markdown shown in the form. */\n  content?: string | undefined;\n}\n\nexport const MODAL_FIELD_KINDS: { kind: ModalFieldKind; label: string }[] = [\n  { kind: \"short\", label: \"Short text\" },\n  { kind: \"paragraph\", label: \"Paragraph\" },\n  { kind: \"select\", label: \"Dropdown\" },\n  { kind: \"user-select\", label: \"User picker\" },\n  { kind: \"role-select\", label: \"Role picker\" },\n  { kind: \"channel-select\", label: \"Channel picker\" },\n  { kind: \"mentionable-select\", label: \"User or role picker\" },\n  { kind: \"file\", label: \"File upload\" },\n  { kind: \"radio\", label: \"Radio buttons (one choice)\" },\n  { kind: \"checkbox-group\", label: \"Checkboxes (several choices)\" },\n  { kind: \"checkbox\", label: \"Single checkbox (yes / no)\" },\n  { kind: \"text\", label: \"Info text (no answer)\" },\n];\n\nconst MODAL_KINDS = new Set(MODAL_FIELD_KINDS.map((k) => k.kind));\n\n/**\n * The fields of a Show Modal node: `modalFields` JSON, or the older\n * field1…field3 settings when there is none.\n */\nexport function parseModalFields(config: Record<string, ConfigValue | undefined>): ModalField[] {\n  const raw = config[\"modalFields\"];\n  if (typeof raw === \"string\" && raw.trim().startsWith(\"[\")) {\n    try {\n      const list = JSON.parse(raw) as unknown;\n      if (Array.isArray(list)) {\n        return list\n          .filter(\n            (f): f is ModalField =>\n              typeof f === \"object\" &&\n              f !== null &&\n              MODAL_KINDS.has((f as ModalField).kind) &&\n              typeof (f as ModalField).id === \"string\",\n          )\n          .slice(0, MODAL_LIMITS.fields);\n      }\n    } catch {\n      // fall back to the legacy fields\n    }\n  }\n  const out: ModalField[] = [];\n  for (const index of [1, 2, 3]) {\n    const id = str(config[`field${index}Id`]);\n    const label = str(config[`field${index}Label`]);\n    if (!id || !label) continue;\n    out.push({\n      id,\n      label,\n      kind: str(config[`field${index}Style`]) === \"paragraph\" ? \"paragraph\" : \"short\",\n      required:\n        index === 1\n          ? config[\"field1Required\"] === true || config[\"field1Required\"] === \"true\"\n          : false,\n    });\n  }\n  return out;\n}\n\n/** Problems that would make Discord reject the form, in plain words. */\nexport function modalFieldIssues(fields: ModalField[]): string[] {\n  const issues: string[] = [];\n  const answers = fields.filter((f) => f.kind !== \"text\");\n  if (!answers.length) issues.push(\"Add at least one field people can answer.\");\n  if (fields.length > MODAL_LIMITS.fields)\n    issues.push(`A modal holds at most ${MODAL_LIMITS.fields} fields.`);\n  const seen = new Set<string>();\n  for (const [i, f] of fields.entries()) {\n    const name = f.label?.trim() || `Field ${i + 1}`;\n    if (f.kind === \"text\") {\n      if (!f.content?.trim()) issues.push(`${name}: the info text is empty.`);\n      continue;\n    }\n    const id = f.id.trim();\n    if (!id) issues.push(`${name}: needs an ID.`);\n    else if (seen.has(id)) issues.push(`${name}: the ID \"${id}\" is used twice.`);\n    seen.add(id);\n    if (!f.label?.trim()) issues.push(`Field ${i + 1}: needs a label.`);\n    // Labels and descriptions are plain text in Discord: <:name:id> would show as code.\n    if (CUSTOM_EMOJI_MARKUP.test(`${f.label ?? \"\"} ${f.description ?? \"\"}`))\n      issues.push(`${name}: custom emojis only show in dropdown options and info text, not in labels or descriptions.`);\n    const limits = MODAL_OPTION_LIMITS[f.kind];\n    if (limits) {\n      const count = (f.options ?? []).filter((o) => o.label.trim()).length;\n      if (count < limits.min)\n        issues.push(`${name}: add at least ${limits.min} option${limits.min === 1 ? \"\" : \"s\"}.`);\n      if (count > limits.max) issues.push(`${name}: at most ${limits.max} options.`);\n      for (const [j, o] of (f.options ?? []).entries()) {\n        const label = o.label.trim() || `option ${j + 1}`;\n        if (CUSTOM_EMOJI_MARKUP.test(`${o.label} ${o.description ?? \"\"}`))\n          issues.push(`${name}: put the custom emoji of \"${label}\" in its emoji field, not in the text.`);\n        if (!o.emoji?.trim()) continue;\n        if (!MODAL_EMOJI_KINDS.has(f.kind))\n          issues.push(`${name}: Discord shows no emojis on radio buttons or checkboxes; remove the emoji of \"${label}\" or use a dropdown.`);\n        else if (!parseComponentEmoji(o.emoji))\n          issues.push(`${name}: the emoji of \"${label}\" must be like 🔥 or a custom one: <:name:id>, <a:name:id> or its ID.`);\n      }\n    }\n  }\n  return issues;\n}\n\n/**\n * Where Discord shows emojis in a modal (discord.js StringSelectMenuOptionBuilder.setEmoji):\n * only on dropdown options. Radio groups and checkboxes have no emoji field.\n */\nexport const MODAL_EMOJI_KINDS: ReadonlySet<ModalFieldKind> = new Set([\"select\"]);\nconst CUSTOM_EMOJI_MARKUP = /<a?:[\\w~]{1,32}:\\d{17,20}>/;\n\nconst clampInt = (v: unknown, lo: number, hi: number): number | undefined =>\n  typeof v === \"number\" && Number.isFinite(v)\n    ? Math.max(lo, Math.min(hi, Math.trunc(v)))\n    : undefined;\n\n/**\n * The Discord API modal (Label components, so dropdowns, pickers and file\n * uploads work). `fill` replaces {variables} in text.\n */\nexport function modalPayload(\n  customId: string,\n  title: string,\n  fields: ModalField[],\n  fill: (text: string) => string = (t) => t,\n): { custom_id: string; title: string; components: Record<string, unknown>[] } {\n  const components: Record<string, unknown>[] = [];\n  for (const f of fields.slice(0, MODAL_LIMITS.fields)) {\n    if (f.kind === \"text\") {\n      const content = fill(f.content ?? \"\").slice(0, MODAL_LIMITS.textDisplay);\n      if (content.trim()) components.push({ type: 10, content });\n      continue;\n    }\n    const label = fill(f.label).slice(0, MODAL_LIMITS.label) || \"Answer\";\n    const description = fill(f.description ?? \"\").slice(0, MODAL_LIMITS.description);\n    const placeholder = fill(f.placeholder ?? \"\").slice(0, MODAL_LIMITS.placeholder);\n    const required = f.required !== false;\n    const custom_id = f.id.trim().slice(0, SELECT_LIMITS.customId) || \"answer\";\n    let inner: Record<string, unknown>;\n    if (f.kind === \"short\" || f.kind === \"paragraph\") {\n      const min = clampInt(f.minLength, 0, MODAL_LIMITS.textLength);\n      const max = clampInt(f.maxLength, 1, MODAL_LIMITS.textLength);\n      const value = fill(f.value ?? \"\").slice(0, max ?? MODAL_LIMITS.textLength);\n      inner = {\n        type: 4,\n        custom_id,\n        style: f.kind === \"paragraph\" ? 2 : 1,\n        required,\n        ...(placeholder ? { placeholder } : {}),\n        ...(min !== undefined && min > 0 ? { min_length: Math.min(min, max ?? min) } : {}),\n        ...(max !== undefined ? { max_length: max } : {}),\n        ...(value ? { value } : {}),\n      };\n    } else if (f.kind === \"checkbox\") {\n      inner = { type: 23, custom_id, ...(f.value === \"true\" ? { default: true } : {}) };\n    } else if (f.kind === \"radio\" || f.kind === \"checkbox-group\") {\n      const max = MODAL_OPTION_LIMITS[f.kind]?.max ?? 10;\n      const options = (f.options ?? [])\n        .filter((o) => o.label.trim())\n        .slice(0, max)\n        .map((o, i) => ({\n          label: fill(o.label).slice(0, SELECT_LIMITS.label),\n          value: (o.value.trim() || o.label.trim() || `option_${i + 1}`).slice(0, SELECT_LIMITS.value),\n          ...(o.description\n            ? { description: fill(o.description).slice(0, SELECT_LIMITS.description) }\n            : {}),\n          ...(o.default ? { default: true } : {}),\n        }));\n      if (f.kind === \"radio\") {\n        inner = { type: 21, custom_id, required, options };\n      } else {\n        const hi = clampInt(f.maxValues, 1, options.length || 1) ?? options.length;\n        const lo = Math.min(clampInt(f.minValues, 0, 10) ?? (required ? 1 : 0), hi);\n        inner = {\n          type: 22,\n          custom_id,\n          required,\n          options,\n          min_values: required ? Math.max(1, lo) : lo,\n          max_values: Math.max(1, hi),\n        };\n      }\n    } else if (f.kind === \"file\") {\n      const max = clampInt(f.maxValues, 1, MODAL_LIMITS.files) ?? 1;\n      inner = {\n        type: 19,\n        custom_id,\n        required,\n        min_values: Math.min(\n          Math.max(clampInt(f.minValues, 0, MODAL_LIMITS.files) ?? 1, required ? 1 : 0),\n          max,\n        ),\n        max_values: max,\n      };\n    } else {\n      const options =\n        f.kind === \"select\"\n          ? (f.options ?? [])\n              .filter((o) => o.label.trim())\n              .slice(0, SELECT_LIMITS.options)\n              .map((o, i) => {\n                const emoji = o.emoji ? parseComponentEmoji(o.emoji) : null;\n                return {\n                  label: fill(o.label).slice(0, SELECT_LIMITS.label),\n                  value: (o.value.trim() || o.label.trim() || `option_${i + 1}`).slice(\n                    0,\n                    SELECT_LIMITS.value,\n                  ),\n                  ...(o.description\n                    ? { description: fill(o.description).slice(0, SELECT_LIMITS.description) }\n                    : {}),\n                  ...(emoji ? { emoji } : {}),\n                  ...(o.default ? { default: true } : {}),\n                };\n              })\n          : [];\n      const { min, max } = selectValueRange(\n        f,\n        f.kind === \"select\" ? Math.max(1, options.length) : SELECT_LIMITS.options,\n      );\n      inner = {\n        type:\n          { select: 3, \"user-select\": 5, \"role-select\": 6, \"channel-select\": 8 }[\n            f.kind as string\n          ] ?? 7,\n        custom_id,\n        required,\n        min_values: required ? Math.max(1, min) : min,\n        max_values: max,\n        ...(placeholder ? { placeholder } : {}),\n        ...(f.kind === \"select\" ? { options } : {}),\n      };\n    }\n    components.push({ type: 18, label, ...(description ? { description } : {}), component: inner });\n  }\n  return {\n    custom_id: customId.slice(0, SELECT_LIMITS.customId) || \"modal\",\n    title: title.slice(0, MODAL_LIMITS.title) || \"Form\",\n    components,\n  };\n}\n\n/* ------------------------------------------------------------------ *\n * Condition: several branches, each a list of rules\n * ------------------------------------------------------------------ */\n\nexport type ConditionOperatorGroup = \"text\" | \"number\" | \"list\" | \"discord\";\n\nexport interface ConditionOperator {\n  id: string;\n  label: string;\n  group: ConditionOperatorGroup;\n  /** False when the rule only reads its left value (e.g. \"is empty\"). */\n  needsRight: boolean;\n  /** Hint for the right-hand value in the builder. */\n  rightHint?: string;\n}\n\n/** Every rule operator, in the order the builder lists them. */\nexport const CONDITION_OPERATORS: ConditionOperator[] = [\n  { id: \"equals\", label: \"equals\", group: \"text\", needsRight: true },\n  { id: \"not-equals\", label: \"does not equal\", group: \"text\", needsRight: true },\n  { id: \"equals-ignore-case\", label: \"equals (ignore case)\", group: \"text\", needsRight: true },\n  { id: \"contains\", label: \"contains\", group: \"text\", needsRight: true },\n  { id: \"not-contains\", label: \"does not contain\", group: \"text\", needsRight: true },\n  { id: \"starts-with\", label: \"starts with\", group: \"text\", needsRight: true },\n  { id: \"ends-with\", label: \"ends with\", group: \"text\", needsRight: true },\n  {\n    id: \"matches\",\n    label: \"matches regex\",\n    group: \"text\",\n    needsRight: true,\n    rightHint: \"^hello|hi$\",\n  },\n  { id: \"is-empty\", label: \"is empty\", group: \"text\", needsRight: false },\n  { id: \"not-empty\", label: \"is not empty\", group: \"text\", needsRight: false },\n  {\n    id: \"longer-than\",\n    label: \"is longer than (chars)\",\n    group: \"text\",\n    needsRight: true,\n    rightHint: \"20\",\n  },\n  { id: \"gt\", label: \"is greater than\", group: \"number\", needsRight: true },\n  { id: \"gte\", label: \"is at least\", group: \"number\", needsRight: true },\n  { id: \"lt\", label: \"is less than\", group: \"number\", needsRight: true },\n  { id: \"lte\", label: \"is at most\", group: \"number\", needsRight: true },\n  { id: \"between\", label: \"is between\", group: \"number\", needsRight: true, rightHint: \"1-10\" },\n  { id: \"is-number\", label: \"is a number\", group: \"number\", needsRight: false },\n  {\n    id: \"in-list\",\n    label: \"is one of\",\n    group: \"list\",\n    needsRight: true,\n    rightHint: \"red, green, blue\",\n  },\n  {\n    id: \"not-in-list\",\n    label: \"is not one of\",\n    group: \"list\",\n    needsRight: true,\n    rightHint: \"red, green, blue\",\n  },\n  {\n    id: \"has-role\",\n    label: \"has role\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"@Moderator\",\n  },\n  {\n    id: \"not-has-role\",\n    label: \"does not have role\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"@Moderator\",\n  },\n  {\n    id: \"has-permission\",\n    label: \"has permission\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"BanMembers\",\n  },\n  {\n    id: \"not-has-permission\",\n    label: \"lacks permission\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"BanMembers\",\n  },\n  { id: \"is-bot\", label: \"is a bot\", group: \"discord\", needsRight: false },\n  { id: \"is-human\", label: \"is not a bot\", group: \"discord\", needsRight: false },\n  { id: \"is-owner\", label: \"is the server owner\", group: \"discord\", needsRight: false },\n  { id: \"is-booster\", label: \"boosts the server\", group: \"discord\", needsRight: false },\n  {\n    id: \"account-older-than\",\n    label: \"account is older than (days)\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"7\",\n  },\n  {\n    id: \"joined-more-than\",\n    label: \"joined more than (days) ago\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"3\",\n  },\n  {\n    id: \"in-channel\",\n    label: \"is in channel\",\n    group: \"discord\",\n    needsRight: true,\n    rightHint: \"#general\",\n  },\n];\n\nconst CONDITION_OPERATOR_IDS = new Set(CONDITION_OPERATORS.map((o) => o.id));\n\nexport interface ConditionRule {\n  left: string;\n  op: string;\n  right: string;\n}\n\nexport interface ConditionBranch {\n  /** Also the branch's output handle. */\n  id: string;\n  label: string;\n  match: \"all\" | \"any\";\n  rules: ConditionRule[];\n}\n\nexport const CONDITION_LIMITS = { branches: 10, rules: 10 } as const;\n\n/** Handle id rules: never \"else\" or \"out\", safe in a React Flow handle id. */\nconst BRANCH_ID = /^b_[a-z0-9]{1,16}$/;\n\n/** The branches of a Condition node (invalid entries dropped). */\nexport function parseConditionBranches(\n  config: Record<string, ConfigValue | undefined>,\n): ConditionBranch[] {\n  const raw = config[\"branches\"];\n  if (typeof raw !== \"string\" || !raw.trim().startsWith(\"[\")) return [];\n  let list: unknown;\n  try {\n    list = JSON.parse(raw);\n  } catch {\n    return [];\n  }\n  if (!Array.isArray(list)) return [];\n  const seen = new Set<string>();\n  const out: ConditionBranch[] = [];\n  for (const item of list) {\n    if (typeof item !== \"object\" || item === null) continue;\n    const b = item as Record<string, unknown>;\n    const id = typeof b[\"id\"] === \"string\" ? b[\"id\"] : \"\";\n    if (!BRANCH_ID.test(id) || seen.has(id)) continue;\n    seen.add(id);\n    const rules = Array.isArray(b[\"rules\"])\n      ? (b[\"rules\"] as unknown[])\n          .filter((r): r is Record<string, unknown> => typeof r === \"object\" && r !== null)\n          .map((r) => ({\n            left: typeof r[\"left\"] === \"string\" ? r[\"left\"] : \"\",\n            op: typeof r[\"op\"] === \"string\" ? r[\"op\"] : \"equals\",\n            right: typeof r[\"right\"] === \"string\" ? r[\"right\"] : \"\",\n          }))\n          .slice(0, CONDITION_LIMITS.rules)\n      : [];\n    out.push({\n      id,\n      label: typeof b[\"label\"] === \"string\" ? b[\"label\"].slice(0, 40) : \"\",\n      match: b[\"match\"] === \"any\" ? \"any\" : \"all\",\n      rules,\n    });\n    if (out.length >= CONDITION_LIMITS.branches) break;\n  }\n  return out;\n}\n\n/** Output handles of a Condition node: one per branch, then \"else\". */\nexport function conditionHandles(config: Record<string, ConfigValue | undefined>): string[] {\n  return [...parseConditionBranches(config).map((b) => b.id), \"else\"];\n}\n\n/** Problems that stop a Condition node from compiling. */\nexport function conditionIssues(config: Record<string, ConfigValue | undefined>): string[] {\n  const branches = parseConditionBranches(config);\n  if (branches.length === 0) return [\"add at least one branch.\"];\n  const problems: string[] = [];\n  branches.forEach((branch, i) => {\n    const name = branch.label || `Branch ${i + 1}`;\n    if (branch.rules.length === 0) problems.push(`\"${name}\" has no rules.`);\n    for (const rule of branch.rules) {\n      const op = CONDITION_OPERATORS.find((o) => o.id === rule.op);\n      if (!op || !CONDITION_OPERATOR_IDS.has(rule.op)) {\n        problems.push(`\"${name}\" uses an unknown operator \"${rule.op}\".`);\n        continue;\n      }\n      if (rule.left.trim() === \"\" && op.group !== \"discord\")\n        problems.push(`\"${name}\": a \"${op.label}\" rule needs a value to check.`);\n      if (op.needsRight && rule.right.trim() === \"\" && ![\"equals\", \"not-equals\"].includes(op.id))\n        problems.push(`\"${name}\": \"${op.label}\" needs a value to compare with.`);\n      if (op.id === \"matches\" && rule.right.length > 300)\n        problems.push(`\"${name}\": regex patterns are limited to 300 characters.`);\n    }\n  });\n  return problems;\n}\n\n/**\n * Rules that need no Discord data, evaluated the same way in the builder's\n * tests and the runtime. Returns null for Discord operators.\n */\nexport function evaluatePlainRule(op: string, left: string, right: string): boolean | null {\n  const l = left.trim();\n  const r = right.trim();\n  const list = () =>\n    r\n      .split(\",\")\n      .map((v) => v.trim().toLowerCase())\n      .filter(Boolean);\n  const n = (v: string) => (v === \"\" ? Number.NaN : Number(v));\n  switch (op) {\n    case \"equals\":\n      return left === right;\n    case \"not-equals\":\n      return left !== right;\n    case \"equals-ignore-case\":\n      return l.toLowerCase() === r.toLowerCase();\n    case \"contains\":\n      return left.toLowerCase().includes(right.toLowerCase());\n    case \"not-contains\":\n      return !left.toLowerCase().includes(right.toLowerCase());\n    case \"starts-with\":\n      return left.toLowerCase().startsWith(right.toLowerCase());\n    case \"ends-with\":\n      return left.toLowerCase().endsWith(right.toLowerCase());\n    case \"is-empty\":\n      return l === \"\";\n    case \"not-empty\":\n      return l !== \"\";\n    case \"longer-than\":\n      return Number.isFinite(n(r)) && left.length > n(r);\n    case \"gt\":\n      return n(l) > n(r);\n    case \"gte\":\n      return n(l) >= n(r);\n    case \"lt\":\n      return n(l) < n(r);\n    case \"lte\":\n      return n(l) <= n(r);\n    case \"between\": {\n      const m = /^\\s*(-?[\\d.]+)\\s*(?:-|\\.\\.|,|to)\\s*(-?[\\d.]+)\\s*$/i.exec(r);\n      if (!m) return false;\n      const value = n(l);\n      const a = Number(m[1]);\n      const b = Number(m[2]);\n      return value >= Math.min(a, b) && value <= Math.max(a, b);\n    }\n    case \"is-number\":\n      return l !== \"\" && Number.isFinite(Number(l));\n    case \"in-list\":\n      return list().includes(l.toLowerCase());\n    case \"not-in-list\":\n      return !list().includes(l.toLowerCase());\n    default:\n      return null;\n  }\n}\n\n/* ------------------------------------------------------------------ *\n * Converter: units (currencies and crypto are fetched by the runtime)\n * ------------------------------------------------------------------ */\n\n/** Units per dimension, as the factor to the dimension's base unit. */\nexport const UNIT_GROUPS: Record<string, Record<string, number>> = {\n  length: { mm: 0.001, cm: 0.01, m: 1, km: 1000, in: 0.0254, ft: 0.3048, yd: 0.9144, mi: 1609.344, nmi: 1852 },\n  mass: { mg: 1e-6, g: 0.001, kg: 1, t: 1000, oz: 0.028349523125, lb: 0.45359237, st: 6.35029318 },\n  volume: { ml: 0.001, cl: 0.01, l: 1, m3: 1000, tsp: 0.00492892, tbsp: 0.0147868, floz: 0.0295735, cup: 0.236588, pt: 0.473176, qt: 0.946353, gal: 3.78541 },\n  speed: { \"m/s\": 1, \"km/h\": 1 / 3.6, mph: 0.44704, kn: 0.514444 },\n  data: { b: 1, kb: 1000, mb: 1e6, gb: 1e9, tb: 1e12, kib: 1024, mib: 1024 ** 2, gib: 1024 ** 3, tib: 1024 ** 4 },\n  time: { ms: 0.001, s: 1, min: 60, h: 3600, d: 86400, wk: 604800, mo: 2629746, yr: 31556952 },\n  area: { \"m2\": 1, \"km2\": 1e6, ha: 10000, \"ft2\": 0.09290304, ac: 4046.8564224, \"mi2\": 2589988.110336 },\n};\n\nconst UNIT_ALIASES: Record<string, string> = {\n  meter: \"m\", meters: \"m\", metre: \"m\", kilometer: \"km\", kilometers: \"km\", mile: \"mi\", miles: \"mi\",\n  inch: \"in\", inches: \"in\", foot: \"ft\", feet: \"ft\", yard: \"yd\", yards: \"yd\",\n  gram: \"g\", grams: \"g\", kilogram: \"kg\", kilograms: \"kg\", kgs: \"kg\", pound: \"lb\", pounds: \"lb\", lbs: \"lb\", ounce: \"oz\", ounces: \"oz\", ton: \"t\", tonne: \"t\",\n  liter: \"l\", litre: \"l\", liters: \"l\", litres: \"l\", gallon: \"gal\", gallons: \"gal\",\n  kmh: \"km/h\", kph: \"km/h\", ms: \"ms\", mps: \"m/s\", knots: \"kn\", knot: \"kn\",\n  byte: \"b\", bytes: \"b\", sec: \"s\", second: \"s\", seconds: \"s\", minute: \"min\", minutes: \"min\", hour: \"h\", hours: \"h\", day: \"d\", days: \"d\", week: \"wk\", weeks: \"wk\", month: \"mo\", months: \"mo\", year: \"yr\", years: \"yr\",\n  c: \"c\", \"°c\": \"c\", celsius: \"c\", f: \"f\", \"°f\": \"f\", fahrenheit: \"f\", k: \"k\", kelvin: \"k\",\n};\n\nfunction unitKey(raw: string): string {\n  const key = raw.trim().toLowerCase().replace(/\\s+/g, \"\");\n  return UNIT_ALIASES[key] ?? key;\n}\n\n/**\n * Converts between units of the same kind (temperatures included). Returns\n * null when either unit is unknown or they measure different things.\n */\nexport function convertUnits(amount: number, from: string, to: string): number | null {\n  const a = unitKey(from);\n  const b = unitKey(to);\n  const temps = [\"c\", \"f\", \"k\"];\n  if (temps.includes(a) && temps.includes(b)) {\n    const celsius = a === \"c\" ? amount : a === \"f\" ? ((amount - 32) * 5) / 9 : amount - 273.15;\n    return b === \"c\" ? celsius : b === \"f\" ? (celsius * 9) / 5 + 32 : celsius + 273.15;\n  }\n  for (const units of Object.values(UNIT_GROUPS)) {\n    const fa = units[a];\n    const fb = units[b];\n    if (fa !== undefined && fb !== undefined) return (amount * fa) / fb;\n  }\n  return null;\n}\n\n/** True when the code names a unit (as opposed to a currency or coin). */\nexport function isUnit(raw: string): boolean {\n  const key = unitKey(raw);\n  return [\"c\", \"f\", \"k\"].includes(key) || Object.values(UNIT_GROUPS).some((u) => key in u);\n}\n\n/** Rounds for display: up to 2 decimals for money, more for small values. */\nexport function formatAmount(value: number): string {\n  if (!Number.isFinite(value)) return \"\";\n  const abs = Math.abs(value);\n  const digits = abs >= 100 ? 2 : abs >= 1 ? 4 : abs === 0 ? 0 : Math.min(10, 2 - Math.floor(Math.log10(abs)) + 2);\n  return Number(value.toFixed(digits)).toLocaleString(\"en-US\", { maximumFractionDigits: digits });\n}\n\n/* ------------------------------------------------------------------ *\n * Roblox: operations of the Roblox API block\n * ------------------------------------------------------------------ */\n\nexport interface RobloxOperation {\n  id: string;\n  label: string;\n  /** What the \"query\" field takes. */\n  query: string;\n  /** Variables set under {storeAs.…}. */\n  vars: string[];\n}\n\nexport const ROBLOX_OPERATIONS: RobloxOperation[] = [\n  {\n    id: \"user\",\n    label: \"User profile\",\n    query: \"Username or user ID\",\n    vars: [\"id\", \"name\", \"displayName\", \"description\", \"created\", \"createdUnix\", \"banned\", \"verified\", \"url\", \"avatar\", \"friends\", \"followers\", \"following\"],\n  },\n  { id: \"avatar\", label: \"Avatar images\", query: \"Username or user ID\", vars: [\"id\", \"name\", \"headshot\", \"bust\", \"fullBody\"] },\n  { id: \"presence\", label: \"Online status\", query: \"Username or user ID\", vars: [\"id\", \"name\", \"status\", \"lastLocation\", \"lastOnline\", \"gameId\"] },\n  { id: \"groups\", label: \"User's groups\", query: \"Username or user ID\", vars: [\"id\", \"name\", \"count\", \"list\"] },\n  { id: \"group\", label: \"Group info\", query: \"Group ID\", vars: [\"id\", \"name\", \"description\", \"owner\", \"ownerId\", \"members\", \"url\", \"icon\", \"verified\"] },\n  {\n    id: \"game\",\n    label: \"Game / experience\",\n    query: \"Place ID or game link\",\n    vars: [\"id\", \"placeId\", \"name\", \"description\", \"creator\", \"playing\", \"visits\", \"favorites\", \"maxPlayers\", \"created\", \"updated\", \"url\", \"icon\", \"genre\"],\n  },\n];\n\n/* ------------------------------------------------------------------ *\n * Crypto Tools: operations of the Crypto block\n * ------------------------------------------------------------------ */\n\nexport interface CryptoOperation {\n  id: string;\n  label: string;\n  /** What the \"query\" field takes (\"\" = not used). */\n  query: string;\n  /** What the \"extra\" field takes (\"\" = not used). */\n  extra: string;\n  /** Variables set under {storeAs.…} (besides text and error). */\n  vars: string[];\n}\n\nexport const CRYPTO_OPERATIONS: CryptoOperation[] = [\n  {\n    id: \"price\",\n    label: \"Coin price\",\n    query: \"Coin symbol, e.g. BTC\",\n    extra: \"Currency (USD, EUR, PLN…)\",\n    vars: [\"coin\", \"name\", \"currency\", \"price\", \"priceRaw\", \"change\", \"trend\", \"high\", \"low\", \"marketCap\", \"volume\", \"rank\", \"image\"],\n  },\n  { id: \"market\", label: \"Top coins by market cap\", query: \"How many (1-25)\", extra: \"Currency\", vars: [\"count\", \"currency\", \"list\"] },\n  { id: \"trending\", label: \"Trending coins\", query: \"\", extra: \"\", vars: [\"count\", \"list\"] },\n  { id: \"feargreed\", label: \"Fear & Greed index\", query: \"\", extra: \"\", vars: [\"value\", \"label\", \"emoji\", \"updated\"] },\n  { id: \"fees\", label: \"Network fees / gas\", query: \"Chain: BTC, LTC or ETH\", extra: \"\", vars: [\"chain\", \"fast\", \"medium\", \"slow\", \"unit\"] },\n  {\n    id: \"wallet\",\n    label: \"Wallet balance\",\n    query: \"Address (BTC, LTC, ETH, SOL, TRON)\",\n    extra: \"Chain (blank = detect)\",\n    vars: [\"chain\", \"symbol\", \"address\", \"balance\", \"balanceRaw\", \"usd\", \"received\", \"sent\", \"txCount\", \"usdt\", \"url\"],\n  },\n  {\n    id: \"tx\",\n    label: \"Transaction status\",\n    query: \"Transaction hash\",\n    extra: \"Chain (blank = detect)\",\n    vars: [\"chain\", \"hash\", \"status\", \"confirmations\", \"block\", \"time\", \"amount\", \"fee\", \"from\", \"to\", \"url\"],\n  },\n  { id: \"address\", label: \"Check an address\", query: \"Address\", extra: \"\", vars: [\"valid\", \"chain\", \"symbol\"] },\n];\n\n/* ------------------------------------------------------------------ *\n * Prefix commands: \"!ban @user spam\" runs the /ban flow\n * ------------------------------------------------------------------ */\n\n/** Bot prefixes from settings: trimmed, no spaces, at most 5 and 5 characters each. */\nexport function cleanPrefixes(raw: unknown): string[] {\n  const list = Array.isArray(raw) ? raw : typeof raw === \"string\" ? raw.split(/[\\s,]+/) : [];\n  const out: string[] = [];\n  for (const item of list) {\n    const p = String(item ?? \"\").trim();\n    if (p && p.length <= 5 && !/\\s/.test(p) && !p.startsWith(\"/\") && !out.includes(p)) out.push(p);\n    if (out.length >= 5) break;\n  }\n  return out;\n}\n\n/** \"?ban @x spam\" with prefixes [\"!\", \"?\"] → { prefix: \"?\", name: \"ban\", rest: \"@x spam\" }. */\nexport function matchPrefixCommand(\n  content: string,\n  prefixes: string[],\n): { prefix: string; name: string; rest: string } | null {\n  const text = content.trimStart();\n  // Longest first, so \"!!\" wins over \"!\".\n  for (const prefix of [...prefixes].sort((a, b) => b.length - a.length)) {\n    if (!text.toLowerCase().startsWith(prefix.toLowerCase())) continue;\n    const m = /^(\\S+)\\s*([\\s\\S]*)$/.exec(text.slice(prefix.length));\n    if (!m) return null;\n    return { prefix, name: m[1]!.toLowerCase(), rest: m[2]!.trim() };\n  }\n  return null;\n}\n\n/** Splits arguments on spaces, keeping \"quoted text\" together. */\nexport function splitArgs(rest: string): string[] {\n  const out: string[] = [];\n  for (const m of rest.matchAll(/\"([^\"]*)\"|'([^']*)'|(\\S+)/g)) out.push(m[1] ?? m[2] ?? m[3] ?? \"\");\n  return out;\n}\n\n/**\n * Maps prefix arguments onto a command's options in order. Mentions become\n * ids (like slash options); the last text option takes the rest of the line.\n * Returns the values and the required options that are missing.\n */\nexport function prefixOptionValues(\n  rest: string,\n  options: { name: string; type: string; required: boolean }[],\n): { values: Record<string, string>; missing: string[] } {\n  const args = splitArgs(rest);\n  const values: Record<string, string> = {};\n  const missing: string[] = [];\n  const lastString = [...options].reverse().find((o) => o.type === \"string\")?.name;\n  let i = 0;\n  for (const option of options) {\n    let value: string | undefined;\n    if (option.name === lastString && options[options.length - 1]?.name === option.name) {\n      value = args.slice(i).join(\" \");\n      i = args.length;\n    } else {\n      value = args[i];\n      i += 1;\n    }\n    if (value === undefined || value === \"\") {\n      if (option.required) missing.push(option.name);\n      continue;\n    }\n    if ([\"user\", \"role\", \"channel\", \"mentionable\"].includes(option.type)) value = /(\\d{5,25})/.exec(value)?.[1] ?? value;\n    if (option.type === \"boolean\") value = /^(yes|true|on|1|tak)$/i.test(value) ? \"true\" : \"false\";\n    values[option.name] = value;\n  }\n  return { values, missing };\n}\n\n/* ------------------------------------------------------------------ *\n * Shop / ticket blocks: shared parsing for runtime and preview\n * ------------------------------------------------------------------ */\n\n/**\n * Members or roles typed one per line (or comma separated). Several mentions\n * or IDs on one line are each their own entry; anything else is a name.\n */\nexport function splitTargets(raw: string): string[] {\n  const out: string[] = [];\n  for (const chunk of raw.split(/\\r?\\n|,/)) {\n    const value = chunk.trim();\n    if (value === \"\") continue;\n    const refs = value.match(/<[@#][!&]?\\d{15,25}>|\\d{15,25}/g);\n    if (refs && refs.join(\"\").length >= value.replace(/\\s+/g, \"\").length) out.push(...refs);\n    else out.push(value);\n  }\n  return [...new Set(out)];\n}\n\n/** Send Text as File: allowed extensions and size. */\nexport const TEXT_FILE_EXTENSIONS = [\"txt\", \"json\", \"csv\", \"md\"] as const;\nexport const TEXT_FILE_MAX_BYTES = 1_000_000;\n\n/** A safe attachment name ending in .txt/.json/.csv/.md, or null when the extension is not allowed. */\nexport function textFileName(raw: string): string | null {\n  const cleaned = raw\n    .trim()\n    .replace(/[^\\w.\\- ]+/g, \"_\")\n    .replace(/\\s+/g, \"-\")\n    .replace(/^\\.+/, \"\")\n    .slice(-100);\n  const ext = /\\.([a-z0-9]+)$/i.exec(cleaned)?.[1]?.toLowerCase() ?? \"\";\n  if (!(TEXT_FILE_EXTENSIONS as readonly string[]).includes(ext)) return null;\n  if (cleaned.length <= ext.length + 1) return null;\n  return cleaned;\n}\n\nexport const SERVER_TEMPLATE_LIMITS = { roles: 50, channels: 100 } as const;\nexport const SERVER_TEMPLATE_CHANNEL_TYPES = [\"text\", \"voice\", \"announcement\", \"forum\", \"stage\"] as const;\nexport type ServerTemplateChannelType = (typeof SERVER_TEMPLATE_CHANNEL_TYPES)[number];\n\nexport interface ServerTemplateRole {\n  name: string;\n  /** #rrggbb or \"\" */\n  color: string;\n  hoist: boolean;\n  mentionable: boolean;\n}\n\nexport interface ServerTemplateChannel {\n  name: string;\n  type: ServerTemplateChannelType;\n  topic: string;\n  /** Hidden from @everyone; allowRoles (and the bot) can see it. */\n  private: boolean;\n  allowRoles: string[];\n}\n\nexport interface ServerTemplateCategory {\n  name: string;\n  private: boolean;\n  allowRoles: string[];\n  channels: ServerTemplateChannel[];\n}\n\nexport interface ServerTemplate {\n  roles: ServerTemplateRole[];\n  categories: ServerTemplateCategory[];\n  /** Channels outside any category. */\n  channels: ServerTemplateChannel[];\n}\n\n/**\n * Apply Server Template's JSON. Unknown fields are ignored, so a Back Up\n * Server file can be pasted in as it is.\n */\nexport function parseServerTemplate(raw: string): { template: ServerTemplate | null; error: string | null } {\n  let value: unknown;\n  try {\n    value = JSON.parse(raw);\n  } catch {\n    return { template: null, error: \"the template is not valid JSON.\" };\n  }\n  if (typeof value !== \"object\" || value === null || Array.isArray(value))\n    return { template: null, error: 'the template must be a JSON object like {\"roles\": [], \"categories\": []}.' };\n  const obj = value as Record<string, unknown>;\n  const fail = (error: string) => ({ template: null, error });\n  const nameOf = (v: unknown) => (typeof v === \"string\" ? v.trim() : \"\");\n  const list = (v: unknown): unknown[] => (Array.isArray(v) ? v : []);\n  const record = (v: unknown): Record<string, unknown> =>\n    typeof v === \"string\" ? { name: v } : typeof v === \"object\" && v !== null ? (v as Record<string, unknown>) : {};\n  const strings = (v: unknown) =>\n    (Array.isArray(v) ? v : typeof v === \"string\" ? v.split(/\\r?\\n|,/) : [])\n      .filter((x): x is string => typeof x === \"string\")\n      .map((x) => x.trim())\n      .filter(Boolean)\n      .slice(0, 25);\n  for (const key of [\"roles\", \"categories\", \"channels\"])\n    if (obj[key] !== undefined && !Array.isArray(obj[key])) return fail(`\"${key}\" must be a list.`);\n\n  const roles: ServerTemplateRole[] = [];\n  for (const r of list(obj[\"roles\"])) {\n    const role = record(r);\n    const name = nameOf(role[\"name\"]);\n    if (name === \"\") return fail(\"every role needs a name.\");\n    if (name.length > 100) return fail(`the role name \"${name.slice(0, 20)}…\" is over 100 characters.`);\n    const color = nameOf(role[\"color\"]);\n    if (color !== \"\" && !/^#?[0-9a-f]{6}$/i.test(color))\n      return fail(`the role \"${name}\" has the colour \"${color}\"; use #rrggbb.`);\n    roles.push({\n      name,\n      color: color === \"\" ? \"\" : `#${color.replace(/^#/, \"\").toLowerCase()}`,\n      hoist: role[\"hoist\"] === true,\n      mentionable: role[\"mentionable\"] === true,\n    });\n  }\n  if (roles.length > SERVER_TEMPLATE_LIMITS.roles)\n    return fail(`a template holds at most ${SERVER_TEMPLATE_LIMITS.roles} roles.`);\n\n  const channel = (c: unknown): ServerTemplateChannel | string => {\n    const ch = record(c);\n    const name = nameOf(ch[\"name\"]);\n    if (name === \"\") return \"every channel needs a name.\";\n    if (name.length > 100) return `the channel name \"${name.slice(0, 20)}…\" is over 100 characters.`;\n    const type = (nameOf(ch[\"type\"]) || \"text\").toLowerCase();\n    if (!(SERVER_TEMPLATE_CHANNEL_TYPES as readonly string[]).includes(type))\n      return `the channel \"${name}\" has the type \"${type}\"; use ${SERVER_TEMPLATE_CHANNEL_TYPES.join(\", \")}.`;\n    return {\n      name,\n      type: type as ServerTemplateChannelType,\n      topic: nameOf(ch[\"topic\"]).slice(0, 1024),\n      private: ch[\"private\"] === true,\n      allowRoles: strings(ch[\"allowRoles\"]),\n    };\n  };\n  const categories: ServerTemplateCategory[] = [];\n  for (const c of list(obj[\"categories\"])) {\n    const cat = record(c);\n    const name = nameOf(cat[\"name\"]);\n    if (name === \"\") return fail(\"every category needs a name.\");\n    if (name.length > 100) return fail(`the category name \"${name.slice(0, 20)}…\" is over 100 characters.`);\n    if (cat[\"channels\"] !== undefined && !Array.isArray(cat[\"channels\"]))\n      return fail(`\"channels\" of the category \"${name}\" must be a list.`);\n    const channels: ServerTemplateChannel[] = [];\n    for (const ch of list(cat[\"channels\"])) {\n      const parsed = channel(ch);\n      if (typeof parsed === \"string\") return fail(parsed);\n      channels.push(parsed);\n    }\n    categories.push({ name, private: cat[\"private\"] === true, allowRoles: strings(cat[\"allowRoles\"]), channels });\n  }\n  const loose: ServerTemplateChannel[] = [];\n  for (const ch of list(obj[\"channels\"])) {\n    const parsed = channel(ch);\n    if (typeof parsed === \"string\") return fail(parsed);\n    loose.push(parsed);\n  }\n  const total = categories.length + categories.reduce((n, c) => n + c.channels.length, 0) + loose.length;\n  if (total > SERVER_TEMPLATE_LIMITS.channels)\n    return fail(\n      `a template holds at most ${SERVER_TEMPLATE_LIMITS.channels} categories and channels (this one has ${total}).`,\n    );\n  if (roles.length === 0 && total === 0) return fail(\"the template has no roles, categories or channels.\");\n  return { template: { roles, categories, channels: loose }, error: null };\n}\n\n/** A whole field that is one {variable} (filled in at run time, so not checked here). */\nconst ONLY_VARIABLE = /^\\{[a-zA-Z0-9_.-]+\\}$/;\n\n/** Validator checks for the shop/ticket blocks. */\nfunction shopBlockIssues(type: string, config: Record<string, ConfigValue>): string[] {\n  const value = (key: string) => (config[key] === undefined ? \"\" : String(config[key]).trim());\n  const out: string[] = [];\n  if (type === \"apply-server-template\") {\n    const raw = value(\"structure\");\n    if (raw !== \"\" && !ONLY_VARIABLE.test(raw)) {\n      const { error } = parseServerTemplate(raw);\n      if (error) out.push(error);\n    }\n  }\n  if (type === \"file-from-text\") {\n    const name = value(\"fileName\");\n    if (name !== \"\" && !name.includes(\"{\") && textFileName(name) === null)\n      out.push(`the file name must end in ${TEXT_FILE_EXTENSIONS.map((e) => `.${e}`).join(\", \")}.`);\n  }\n  if (type === \"fetch-channel-messages\") {\n    const limit = Number(config[\"limit\"] ?? 20);\n    if (!Number.isFinite(limit) || limit < 1 || limit > 50) out.push(\"read between 1 and 50 messages.\");\n  }\n  if (type === \"rate-counter\") {\n    const windowSeconds = Number(config[\"windowSeconds\"] ?? 10);\n    const threshold = Number(config[\"threshold\"] ?? 5);\n    if (!Number.isFinite(windowSeconds) || windowSeconds < 1 || windowSeconds > 86_400)\n      out.push(\"the time window is between 1 and 86400 seconds.\");\n    if (!Number.isFinite(threshold) || threshold < 1) out.push(\"the limit must be 1 or more.\");\n  }\n  return out;\n}\n\n","src/lib/studio/render.ts":"/**\n * Canvas rendering shared by Emoji Studio and Graphics Studio. Every shape\n * (icon, text, image) is drawn first as a white mask; effects work on masks,\n * so a gradient, outline, 3D extrusion, glow, drop shadow, shine or hollow\n * \"ghost\" outline looks the same on text, icons and pictures.\n */\nimport { studioIcon, type StudioIcon } from \"@/data/studio-icons\";\nimport { fontCss } from \"./font-list\";\n\nexport interface Paint {\n  type: \"solid\" | \"gradient\";\n  color: string;\n  color2: string;\n  /** Degrees, 90 = top to bottom. */\n  angle: number;\n}\n\nexport type Glyph =\n  | { kind: \"icon\"; id: string }\n  | { kind: \"text\"; text: string; font: string }\n  | { kind: \"image\"; src: string; tint: boolean };\n\nexport interface Effects {\n  fill: Paint;\n  /** Outline hugging the shape. */\n  stroke: { width: number; color: string } | null;\n  /** 3D depth towards `angle`. */\n  extrude: { depth: number; angle: number; color: string } | null;\n  glow: { blur: number; color: string } | null;\n  shadow: { x: number; y: number; blur: number; color: string } | null;\n  /** White sheen on the top half, 0-1. */\n  shine: number;\n  /** Hollow outline copy offset behind the shape. */\n  ghost: { x: number; y: number; width: number; color: string } | null;\n  /** A second outline around the first (a dark rim around a white sticker edge). */\n  outline2?: { width: number; color: string } | null;\n  /** Lit top edges and shaded bottom edges for a raised look, 0-1. */\n  bevel?: number;\n}\n\nexport const NO_EFFECTS: Effects = {\n  fill: { type: \"solid\", color: \"#ffffff\", color2: \"#ffffff\", angle: 90 },\n  stroke: null,\n  extrude: null,\n  glow: null,\n  shadow: null,\n  shine: 0,\n  ghost: null,\n};\n\n/* ------------------------------------------------------------------ *\n * Canvas helpers\n * ------------------------------------------------------------------ */\n\n/**\n * Where canvases, paths and pictures come from. The browser by default; the\n * bot runtime swaps in @napi-rs/canvas (runtime/src/studio-image.ts) so a\n * design renders the same on a server.\n */\nexport interface CanvasBackend {\n  createCanvas(w: number, h: number): HTMLCanvasElement;\n  path(d: string): Path2D;\n}\n\nlet backend: CanvasBackend = {\n  createCanvas: (w, h) => {\n    const c = document.createElement(\"canvas\");\n    c.width = w;\n    c.height = h;\n    return c;\n  },\n  path: (d) => new Path2D(d),\n};\n\nexport function setCanvasBackend(b: CanvasBackend): void {\n  backend = b;\n}\n\nexport function makeCanvas(w: number, h: number): HTMLCanvasElement {\n  return backend.createCanvas(Math.max(1, Math.ceil(w)), Math.max(1, Math.ceil(h)));\n}\n\nfunction ctx2d(c: HTMLCanvasElement): CanvasRenderingContext2D {\n  return c.getContext(\"2d\")!;\n}\n\nconst images = new Map<string, HTMLImageElement>();\n\n/** Loads pictures used by a design; rendering skips the ones not ready yet. */\nexport function loadImages(srcs: Iterable<string>): Promise<void> {\n  const jobs: Promise<void>[] = [];\n  for (const src of srcs) {\n    if (!src || images.has(src)) continue;\n    const img = new Image();\n    img.decoding = \"async\";\n    images.set(src, img);\n    jobs.push(\n      new Promise<void>((resolve) => {\n        img.onload = () => resolve();\n        img.onerror = () => resolve();\n        img.src = src;\n      }),\n    );\n  }\n  return Promise.all(jobs).then(() => undefined);\n}\n\n/** Hands the renderer a picture loaded elsewhere (the runtime's avatars). */\nexport function registerImage(src: string, img: HTMLImageElement): void {\n  images.set(src, img);\n  if (images.size > 200) images.delete(images.keys().next().value as string);\n}\n\nfunction image(src: string): HTMLImageElement | null {\n  const img = images.get(src);\n  return img && img.complete !== false && img.naturalWidth > 0 ? img : null;\n}\n\n/** A canvas paint for a box. */\nexport function paintStyle(\n  ctx: CanvasRenderingContext2D,\n  paint: Paint,\n  x: number,\n  y: number,\n  w: number,\n  h: number,\n): string | CanvasGradient {\n  if (paint.type === \"solid\") return paint.color;\n  const a = (paint.angle * Math.PI) / 180;\n  const cx = x + w / 2;\n  const cy = y + h / 2;\n  const r = (Math.abs(Math.cos(a)) * w + Math.abs(Math.sin(a)) * h) / 2;\n  const g = ctx.createLinearGradient(\n    cx - Math.cos(a) * r,\n    cy - Math.sin(a) * r,\n    cx + Math.cos(a) * r,\n    cy + Math.sin(a) * r,\n  );\n  g.addColorStop(0, paint.color);\n  g.addColorStop(1, paint.color2);\n  return g;\n}\n\nfunction tinted(\n  mask: HTMLCanvasElement,\n  style: string | ((c: CanvasRenderingContext2D) => string | CanvasGradient),\n) {\n  const out = makeCanvas(mask.width, mask.height);\n  const c = ctx2d(out);\n  c.drawImage(mask, 0, 0);\n  c.globalCompositeOperation = \"source-in\";\n  c.fillStyle = typeof style === \"function\" ? style(c) : style;\n  c.fillRect(0, 0, out.width, out.height);\n  return out;\n}\n\n/** The mask grown by `width` px in every direction. */\nfunction dilate(mask: HTMLCanvasElement, width: number): HTMLCanvasElement {\n  const out = makeCanvas(mask.width, mask.height);\n  const c = ctx2d(out);\n  const rings =\n    width > 6 ? [width, width * 0.66, width * 0.33] : width > 2 ? [width, width / 2] : [width];\n  for (const r of rings) {\n    const steps = Math.max(8, Math.min(32, Math.round(r * 2)));\n    for (let i = 0; i < steps; i++) {\n      const a = (i / steps) * Math.PI * 2;\n      c.drawImage(mask, Math.cos(a) * r, Math.sin(a) * r);\n    }\n  }\n  c.drawImage(mask, 0, 0);\n  return out;\n}\n\n/**\n * Draws a white mask onto ctx at (x, y) with effects. `box` is the shape's\n * own area inside the mask, used to lay out gradients.\n */\nexport function compose(\n  ctx: CanvasRenderingContext2D,\n  mask: HTMLCanvasElement,\n  x: number,\n  y: number,\n  fx: Effects,\n  box: { x: number; y: number; w: number; h: number },\n  options: { raw?: HTMLCanvasElement | null; bevelSize?: number } = {},\n): void {\n  const strokeW = fx.stroke && fx.stroke.width > 0 ? fx.stroke.width : 0;\n  const rim = fx.outline2 && fx.outline2.width > 0 ? fx.outline2 : null;\n  const inner = strokeW ? dilate(mask, strokeW) : mask;\n  // The outer silhouette: shadows and 3D depth follow the outermost outline.\n  const base = rim ? dilate(mask, strokeW + rim.width) : inner;\n\n  // Shadows work in device pixels: scale them with the current transform.\n  const t = ctx.getTransform();\n  const k = Math.hypot(t.a, t.b) || 1;\n\n  if (fx.shadow) {\n    ctx.save();\n    ctx.shadowColor = fx.shadow.color;\n    ctx.shadowBlur = fx.shadow.blur * k;\n    // Draw far off-canvas so only the shadow lands on it.\n    const far = 100000;\n    ctx.setTransform(t.a, t.b, t.c, t.d, t.e - far, t.f);\n    ctx.shadowOffsetX = far + t.a * fx.shadow.x + t.c * fx.shadow.y;\n    ctx.shadowOffsetY = t.b * fx.shadow.x + t.d * fx.shadow.y;\n    ctx.drawImage(tinted(base, \"#000\"), x, y);\n    ctx.restore();\n  }\n\n  if (fx.ghost && fx.ghost.width > 0) {\n    const grown = dilate(mask, fx.ghost.width);\n    const ring = ctx2d(grown);\n    ring.globalCompositeOperation = \"destination-out\";\n    ring.drawImage(mask, 0, 0);\n    ctx.drawImage(tinted(grown, fx.ghost.color), x + fx.ghost.x, y + fx.ghost.y);\n  }\n\n  if (fx.extrude && fx.extrude.depth > 0) {\n    const side = tinted(base, fx.extrude.color);\n    const a = (fx.extrude.angle * Math.PI) / 180;\n    const steps = Math.ceil(fx.extrude.depth);\n    for (let i = steps; i >= 1; i--) ctx.drawImage(side, x + Math.cos(a) * i, y + Math.sin(a) * i);\n  }\n\n  if (rim) ctx.drawImage(tinted(base, rim.color), x, y);\n  if (fx.stroke && strokeW) ctx.drawImage(tinted(inner, fx.stroke.color), x, y);\n\n  let face = options.raw ?? tinted(mask, (c) => paintStyle(c, fx.fill, box.x, box.y, box.w, box.h));\n  if (fx.bevel && fx.bevel > 0)\n    face = beveled(face, mask, options.bevelSize ?? Math.min(box.w, box.h), fx.bevel);\n  if (fx.shine > 0) {\n    const shiny = makeCanvas(face.width, face.height);\n    const s = ctx2d(shiny);\n    s.drawImage(face, 0, 0);\n    s.globalCompositeOperation = \"source-atop\";\n    const g = s.createLinearGradient(0, box.y, 0, box.y + box.h);\n    g.addColorStop(0, `rgba(255,255,255,${0.55 * fx.shine})`);\n    g.addColorStop(0.48, `rgba(255,255,255,${0.12 * fx.shine})`);\n    g.addColorStop(0.5, \"rgba(255,255,255,0)\");\n    g.addColorStop(1, \"rgba(0,0,0,0)\");\n    s.fillStyle = g;\n    s.fillRect(0, 0, shiny.width, shiny.height);\n    face = shiny;\n  }\n\n  ctx.save();\n  if (fx.glow && fx.glow.blur > 0) {\n    ctx.shadowColor = fx.glow.color;\n    ctx.shadowBlur = fx.glow.blur * k;\n  }\n  ctx.drawImage(face, x, y);\n  if (fx.glow && fx.glow.blur > 0) ctx.drawImage(face, x, y);\n  ctx.restore();\n}\n\n/**\n * The face with light on its top edges and shade on its bottom edges, like a\n * raised letter. Each band is the mask minus itself shifted down (or up),\n * built up in many thin steps so it fades smoothly into the face.\n * `size` is the shape's own scale (a text layer's font size).\n */\nfunction beveled(\n  face: HTMLCanvasElement,\n  mask: HTMLCanvasElement,\n  size: number,\n  amount: number,\n): HTMLCanvasElement {\n  const out = makeCanvas(face.width, face.height);\n  const c = ctx2d(out);\n  c.drawImage(face, 0, 0);\n  const depth = Math.max(1, size * 0.035);\n  const steps = Math.max(2, Math.min(10, Math.round(depth)));\n  const band = (dy: number) => {\n    const e = makeCanvas(mask.width, mask.height);\n    const ec = ctx2d(e);\n    ec.drawImage(mask, 0, 0);\n    ec.globalCompositeOperation = \"destination-out\";\n    ec.drawImage(mask, 0, dy);\n    return e;\n  };\n  const light = makeCanvas(mask.width, mask.height);\n  const shade = makeCanvas(mask.width, mask.height);\n  const lc = ctx2d(light);\n  const sc = ctx2d(shade);\n  // Bands of growing depth stacked at equal strength: strongest at the edge, fading inwards.\n  lc.globalAlpha = 1 / steps;\n  sc.globalAlpha = 1 / steps;\n  for (let i = 1; i <= steps; i++) {\n    const d = (depth * i) / steps;\n    lc.drawImage(band(d), 0, 0);\n    sc.drawImage(band(-d), 0, 0);\n  }\n  c.globalCompositeOperation = \"source-atop\";\n  c.globalAlpha = Math.min(1, 0.55 * amount);\n  c.drawImage(tinted(light, \"#ffffff\"), 0, 0);\n  c.globalAlpha = Math.min(1, 0.4 * amount);\n  c.drawImage(tinted(shade, \"#000000\"), 0, 0);\n  return out;\n}\n\n/** Margin a mask needs around its shape for these effects. */\nexport function effectsMargin(fx: Effects): number {\n  return Math.ceil(\n    (fx.stroke?.width ?? 0) +\n      (fx.outline2?.width ?? 0) +\n      (fx.ghost ? fx.ghost.width + Math.hypot(fx.ghost.x, fx.ghost.y) : 0) +\n      2,\n  );\n}\n\n/* ------------------------------------------------------------------ *\n * Glyph masks\n * ------------------------------------------------------------------ */\n\nexport interface GlyphOptions {\n  /** Line width of line icons on the 24px grid. */\n  lineWidth: number;\n  /** Fill line icons as well as stroking them. */\n  solid: boolean;\n  /** Fit an icon's drawn shape to the box instead of its 24px grid. */\n  fit?: boolean;\n}\n\n/** Draws an icon in the current colour on its 24px grid. */\nfunction drawIconPaths(c: CanvasRenderingContext2D, icon: StudioIcon, opts: GlyphOptions): void {\n  c.lineCap = \"round\";\n  c.lineJoin = \"round\";\n  if (icon.set !== \"line\") {\n    // Solid, duotone and brand icons are drawn filled; the duotone light layer see-through.\n    const faded = new Set(icon.faded ?? []);\n    icon.paths.forEach((d, i) => {\n      c.globalAlpha = faded.has(i) ? 0.35 : 1;\n      c.fill(backend.path(d));\n    });\n    c.globalAlpha = 1;\n    return;\n  }\n  const inner = new Set(opts.solid ? (icon.inner ?? []) : []);\n  const open = new Set(icon.open ?? []);\n  c.lineWidth = opts.lineWidth;\n  icon.paths.forEach((d, i) => {\n    if (inner.has(i)) return;\n    const p = backend.path(d);\n    if (opts.solid && !open.has(i)) c.fill(p, \"nonzero\");\n    c.stroke(p);\n  });\n  // Filled icons keep their details as cut-outs (the \"i\" of info, clock hands…).\n  if (inner.size > 0) {\n    c.globalCompositeOperation = \"destination-out\";\n    for (const i of inner) c.stroke(backend.path(icon.paths[i]!));\n    c.globalCompositeOperation = \"source-over\";\n    // The cut-outs end at the outline instead of nicking through it.\n    icon.paths.forEach((d, i) => {\n      if (!inner.has(i) && !open.has(i)) c.stroke(backend.path(d));\n    });\n  }\n}\n\n/** Share of the box the longer side of a fitted icon takes. */\nconst ICON_FIT = 0.86;\n\ninterface IconBounds {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n  /** Size correction so compact shapes don't look bigger than airy ones. */\n  optical: number;\n}\n\nconst iconBoundsCache = new Map<string, IconBounds | null>();\n\n/**\n * Where an icon really draws on its 24px grid (strokes included). Icon sets\n * pad their artwork differently, so fitting this box, not the grid, makes a\n * pack's icons the same size.\n */\nfunction iconBounds(icon: StudioIcon, opts: GlyphOptions): IconBounds | null {\n  const key = `${icon.id}|${opts.lineWidth}|${opts.solid}`;\n  if (iconBoundsCache.has(key)) return iconBoundsCache.get(key)!;\n  const scale = 8;\n  const pad = 4;\n  const px = (24 + pad * 2) * scale;\n  let result: IconBounds | null = null;\n  try {\n    const canvas = makeCanvas(px, px);\n    const c = ctx2d(canvas);\n    c.fillStyle = \"#fff\";\n    c.strokeStyle = \"#fff\";\n    c.scale(scale, scale);\n    c.translate(pad, pad);\n    drawIconPaths(c, icon, opts);\n    const data = c.getImageData(0, 0, px, px).data;\n    let x0 = px;\n    let y0 = px;\n    let x1 = -1;\n    let y1 = -1;\n    let ink = 0;\n    for (let y = 0; y < px; y++) {\n      for (let x = 0; x < px; x++) {\n        const a = data[(y * px + x) * 4 + 3]!;\n        if (a < 24) continue;\n        ink += a / 255;\n        if (x < x0) x0 = x;\n        if (x > x1) x1 = x;\n        if (y < y0) y0 = y;\n        if (y > y1) y1 = y;\n      }\n    }\n    if (x1 >= x0 && y1 >= y0) {\n      const w = (x1 - x0 + 1) / scale;\n      const h = (y1 - y0 + 1) / scale;\n      // A square-ish, densely inked icon (a filled circle) reads larger than a\n      // thin or lopsided one at the same width: nudge both towards the middle.\n      const fill = ink / scale ** 2 / Math.max(w, h) ** 2;\n      const optical = Math.min(1.1, Math.max(0.86, (0.55 / Math.max(0.05, fill)) ** 0.3));\n      result = { x: x0 / scale - pad, y: y0 / scale - pad, w, h, optical };\n    }\n  } catch {\n    result = null;\n  }\n  iconBoundsCache.set(key, result);\n  return result;\n}\n\n/** Draws a glyph in white, centred in a size×size box at (cx, cy). */\nexport function drawGlyphMask(\n  c: CanvasRenderingContext2D,\n  glyph: Glyph,\n  cx: number,\n  cy: number,\n  size: number,\n  opts: GlyphOptions,\n): void {\n  c.save();\n  c.fillStyle = \"#fff\";\n  c.strokeStyle = \"#fff\";\n  if (glyph.kind === \"icon\") {\n    const icon = studioIcon(glyph.id);\n    if (icon) {\n      const b = opts.fit ? iconBounds(icon, opts) : null;\n      if (b) {\n        // Every icon gets the same visual size, whatever padding its set draws it with.\n        const s = (size * ICON_FIT * b.optical) / Math.max(b.w, b.h);\n        c.translate(cx, cy);\n        c.scale(s, s);\n        c.translate(-(b.x + b.w / 2), -(b.y + b.h / 2));\n      } else {\n        const s = size / 24;\n        c.translate(cx - size / 2, cy - size / 2);\n        c.scale(s, s);\n      }\n      drawIconPaths(c, icon, opts);\n    }\n  } else if (glyph.kind === \"text\") {\n    const text = glyph.text || \"?\";\n    let px = size;\n    c.font = fontCss(glyph.font, px);\n    const m = c.measureText(text);\n    const w = m.width;\n    const h = (m.actualBoundingBoxAscent || px * 0.7) + (m.actualBoundingBoxDescent || 0);\n    const fit = Math.min(size / Math.max(1, w), size / Math.max(1, h), 1.6);\n    px *= fit;\n    c.font = fontCss(glyph.font, px);\n    const m2 = c.measureText(text);\n    const asc = m2.actualBoundingBoxAscent || px * 0.7;\n    const desc = m2.actualBoundingBoxDescent || 0;\n    c.textAlign = \"center\";\n    c.textBaseline = \"alphabetic\";\n    c.fillText(text, cx, cy + (asc - desc) / 2);\n  } else {\n    const img = image(glyph.src);\n    if (img) {\n      const r = Math.min(size / img.naturalWidth, size / img.naturalHeight);\n      const w = img.naturalWidth * r;\n      const h = img.naturalHeight * r;\n      c.drawImage(img, cx - w / 2, cy - h / 2, w, h);\n    }\n  }\n  c.restore();\n}\n\n/** The glyph's own colours (an untinted picture), or null. */\nfunction glyphRaw(\n  glyph: Glyph,\n  w: number,\n  h: number,\n  cx: number,\n  cy: number,\n  size: number,\n): HTMLCanvasElement | null {\n  if (glyph.kind !== \"image\" || glyph.tint) return null;\n  const img = image(glyph.src);\n  if (!img) return null;\n  const out = makeCanvas(w, h);\n  const r = Math.min(size / img.naturalWidth, size / img.naturalHeight);\n  const iw = img.naturalWidth * r;\n  const ih = img.naturalHeight * r;\n  ctx2d(out).drawImage(img, cx - iw / 2, cy - ih / 2, iw, ih);\n  return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Emoji\n * ------------------------------------------------------------------ */\n\nexport type TileStyle =\n  \"none\" | \"tile\" | \"outline\" | \"tinted\" | \"solid\" | \"circle\" | \"ring\" | \"bracket\" | \"framed\";\n\nexport type EmojiTexture = \"none\" | \"silver\" | \"gold\" | \"rose-gold\" | \"bronze\" | \"chrome\" | \"holo\";\n\n/**\n * Metal finishes for emoji: a light-to-dark fill with a bevel and shine, so\n * the glyph (and the frame of a \"framed\" tile) reads as polished metal.\n */\nexport const EMOJI_TEXTURES: Record<\n  Exclude<EmojiTexture, \"none\">,\n  { name: string; fill: Paint; rim: Paint; bevel: number; shine: number }\n> = {\n  silver: {\n    name: \"Silver\",\n    fill: { type: \"gradient\", color: \"#FFFFFF\", color2: \"#A6A9B2\", angle: 90 },\n    rim: { type: \"gradient\", color: \"#F4F5F7\", color2: \"#8D9099\", angle: 90 },\n    bevel: 0.55,\n    shine: 0.55,\n  },\n  gold: {\n    name: \"Gold\",\n    fill: { type: \"gradient\", color: \"#FFF4C2\", color2: \"#C08A1A\", angle: 90 },\n    rim: { type: \"gradient\", color: \"#FFE9A0\", color2: \"#9C6B0E\", angle: 90 },\n    bevel: 0.6,\n    shine: 0.55,\n  },\n  \"rose-gold\": {\n    name: \"Rose gold\",\n    fill: { type: \"gradient\", color: \"#FFE6DC\", color2: \"#C27766\", angle: 90 },\n    rim: { type: \"gradient\", color: \"#FBD5C8\", color2: \"#A55E50\", angle: 90 },\n    bevel: 0.55,\n    shine: 0.5,\n  },\n  bronze: {\n    name: \"Bronze\",\n    fill: { type: \"gradient\", color: \"#F7CBA0\", color2: \"#8A4B1F\", angle: 90 },\n    rim: { type: \"gradient\", color: \"#E8B588\", color2: \"#6E3A16\", angle: 90 },\n    bevel: 0.6,\n    shine: 0.45,\n  },\n  chrome: {\n    name: \"Chrome\",\n    fill: { type: \"gradient\", color: \"#FFFFFF\", color2: \"#4E5462\", angle: 90 },\n    rim: { type: \"gradient\", color: \"#FFFFFF\", color2: \"#5B6170\", angle: 90 },\n    bevel: 0.85,\n    shine: 0.75,\n  },\n  holo: {\n    name: \"Holo\",\n    fill: { type: \"gradient\", color: \"#B8F6FF\", color2: \"#E9B4FF\", angle: 135 },\n    rim: { type: \"gradient\", color: \"#C9FFF4\", color2: \"#D6B8FF\", angle: 135 },\n    bevel: 0.4,\n    shine: 0.6,\n  },\n};\n\nexport interface EmojiStyle {\n  tile: TileStyle;\n  tileColor: string;\n  accent: Paint;\n  /** Glyph colour on solid / circle tiles. */\n  glyphOnSolid: string;\n  lineWidth: number;\n  solid: boolean;\n  /** Glyph size, 0.3-1 of the emoji. */\n  size: number;\n  glow: number;\n  shadow: boolean;\n  outline: number;\n  outlineColor: string;\n  shine: number;\n  rotation: number;\n  /** Tile corner radius, 0-0.5 of the size. */\n  radius: number;\n  /** Brand logos in their own colour instead of the accent. */\n  brandColors: boolean;\n  /** Metal finish of the glyph and of a framed tile's border (older packs: none). */\n  texture?: EmojiTexture;\n}\n\nexport const DEFAULT_EMOJI_STYLE: EmojiStyle = {\n  tile: \"none\",\n  tileColor: \"#1c1f24\",\n  accent: { type: \"solid\", color: \"#FFFFFF\", color2: \"#FFFFFF\", angle: 90 },\n  glyphOnSolid: \"#ffffff\",\n  lineWidth: 2.4,\n  solid: true,\n  size: 0.78,\n  glow: 0,\n  shadow: false,\n  outline: 0,\n  outlineColor: \"#0b0d10\",\n  shine: 0,\n  rotation: 0,\n  radius: 0.26,\n  brandColors: false,\n};\n\nfunction roundRect(\n  c: CanvasRenderingContext2D,\n  x: number,\n  y: number,\n  w: number,\n  h: number,\n  r: number,\n) {\n  c.beginPath();\n  c.roundRect(x, y, w, h, Math.max(0, Math.min(r, w / 2, h / 2)));\n}\n\nfunction alpha(hex: string, a: number): string {\n  const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n  if (!m) return hex;\n  const n = Number.parseInt(m[1]!, 16);\n  return `rgba(${(n >> 16) & 255},${(n >> 8) & 255},${n & 255},${a})`;\n}\n\nfunction shade(hex: string, amount: number): string {\n  const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n  if (!m) return hex;\n  const n = Number.parseInt(m[1]!, 16);\n  const f = (v: number) =>\n    Math.max(0, Math.min(255, Math.round(amount < 0 ? v * (1 + amount) : v + (255 - v) * amount)));\n  return `#${[(n >> 16) & 255, (n >> 8) & 255, n & 255].map((v) => f(v).toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nexport { alpha as withAlpha, shade as shadeColor };\n\n/** Draws one emoji filling a size×size canvas context. */\nexport function renderEmoji(\n  ctx: CanvasRenderingContext2D,\n  size: number,\n  glyph: Glyph,\n  s: EmojiStyle,\n): void {\n  ctx.clearRect(0, 0, size, size);\n  const pad = size * 0.04;\n  const tileBox = { x: pad, y: pad, w: size - pad * 2, h: size - pad * 2 };\n  const accentFill = (c: CanvasRenderingContext2D) =>\n    paintStyle(c, s.accent, tileBox.x, tileBox.y, tileBox.w, tileBox.h);\n  const round = s.tile === \"circle\" || s.tile === \"ring\";\n  const metal = s.texture && s.texture !== \"none\" ? EMOJI_TEXTURES[s.texture] : null;\n  const radius = round ? tileBox.w / 2 : tileBox.w * s.radius;\n\n  // Bracket: two rounded corners of an outline (top left, bottom right), as on role badges.\n  if (s.tile === \"bracket\") {\n    const { x, y, w, h } = tileBox;\n    const r = Math.max(w * s.radius, w * 0.12);\n    const lw = size * 0.065;\n    const inset = lw / 2;\n    const reach = 0.58;\n    ctx.save();\n    ctx.lineWidth = lw;\n    ctx.lineCap = \"round\";\n    ctx.lineJoin = \"round\";\n    ctx.strokeStyle = accentFill(ctx);\n    if (s.glow > 0) {\n      ctx.shadowColor = alpha(s.accent.color, 0.55);\n      ctx.shadowBlur = size * 0.08 * s.glow;\n    }\n    const x0 = x + inset;\n    const y0 = y + inset;\n    const x1 = x + w - inset;\n    const y1 = y + h - inset;\n    ctx.beginPath();\n    ctx.moveTo(x0 + w * reach, y0);\n    ctx.arcTo(x0, y0, x0, y1, r);\n    ctx.lineTo(x0, y0 + h * reach);\n    ctx.moveTo(x1 - w * reach, y1);\n    ctx.arcTo(x1, y1, x1, y0, r);\n    ctx.lineTo(x1, y1 - h * reach);\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  // Tile\n  if (s.tile !== \"none\" && s.tile !== \"bracket\") {\n    ctx.save();\n    if (s.tile === \"outline\" || s.tile === \"ring\") {\n      ctx.shadowColor = alpha(s.accent.color, 0.55);\n      ctx.shadowBlur = size * 0.08 * Math.max(0.3, s.glow);\n    }\n    roundRect(ctx, tileBox.x, tileBox.y, tileBox.w, tileBox.h, radius);\n    if (s.tile === \"solid\" || s.tile === \"circle\") ctx.fillStyle = accentFill(ctx);\n    else {\n      const g = ctx.createLinearGradient(0, tileBox.y, 0, tileBox.y + tileBox.h);\n      g.addColorStop(0, shade(s.tileColor, 0.08));\n      g.addColorStop(1, shade(s.tileColor, -0.25));\n      ctx.fillStyle = g;\n    }\n    ctx.fill();\n    ctx.restore();\n    ctx.save();\n    roundRect(ctx, tileBox.x, tileBox.y, tileBox.w, tileBox.h, radius);\n    ctx.clip();\n    if (s.tile === \"tinted\") {\n      ctx.fillStyle = alpha(s.accent.color2, 0.28);\n      ctx.fillRect(0, 0, size, size);\n    }\n    // soft top light\n    const light = ctx.createRadialGradient(size * 0.3, 0, 0, size * 0.3, 0, size * 0.9);\n    light.addColorStop(0, \"rgba(255,255,255,0.10)\");\n    light.addColorStop(1, \"rgba(255,255,255,0)\");\n    ctx.fillStyle = light;\n    ctx.fillRect(0, 0, size, size);\n    ctx.restore();\n    ctx.save();\n    if (s.tile === \"framed\") {\n      // A thick light frame (metal when a texture is on), inset so it stays inside.\n      const lw = Math.max(1.5, size * 0.045);\n      roundRect(\n        ctx,\n        tileBox.x + lw / 2,\n        tileBox.y + lw / 2,\n        tileBox.w - lw,\n        tileBox.h - lw,\n        Math.max(0, radius - lw / 2),\n      );\n      ctx.lineWidth = lw;\n      ctx.strokeStyle = paintStyle(\n        ctx,\n        metal?.rim ?? { type: \"gradient\", color: \"#F2F3F5\", color2: \"#A3A6AD\", angle: 90 },\n        tileBox.x,\n        tileBox.y,\n        tileBox.w,\n        tileBox.h,\n      );\n      ctx.stroke();\n      ctx.restore();\n    } else {\n      roundRect(ctx, tileBox.x + 0.5, tileBox.y + 0.5, tileBox.w - 1, tileBox.h - 1, radius);\n      ctx.lineWidth = Math.max(\n        1,\n        size * (s.tile === \"outline\" || s.tile === \"ring\" ? 0.035 : 0.012),\n      );\n      ctx.strokeStyle =\n        s.tile === \"outline\" || s.tile === \"ring\"\n          ? accentFill(ctx)\n          : s.tile === \"tinted\"\n            ? alpha(s.accent.color, 0.6)\n            : \"rgba(255,255,255,0.08)\";\n      ctx.stroke();\n      ctx.restore();\n    }\n  }\n\n  // Glyph\n  const glyphSize =\n    (s.tile === \"none\" ? size : s.tile === \"bracket\" ? tileBox.w * 0.52 : tileBox.w * 0.8) * s.size;\n  const mask = makeCanvas(size, size);\n  const m = ctx2d(mask);\n  m.translate(size / 2, size / 2);\n  m.rotate((s.rotation * Math.PI) / 180);\n  m.translate(-size / 2, -size / 2);\n  drawGlyphMask(m, glyph, size / 2, size / 2, glyphSize, {\n    lineWidth: s.lineWidth,\n    solid: s.solid,\n    fit: true,\n  });\n  const onSolid = s.tile === \"solid\" || s.tile === \"circle\";\n  const brand = glyph.kind === \"icon\" ? studioIcon(glyph.id) : undefined;\n  const fill: Paint = onSolid\n    ? { type: \"solid\", color: s.glyphOnSolid, color2: s.glyphOnSolid, angle: 90 }\n    : s.brandColors && brand?.color\n      ? { type: \"solid\", color: brand.color, color2: brand.color, angle: 90 }\n      : (metal?.fill ?? s.accent);\n  const box = { x: (size - glyphSize) / 2, y: (size - glyphSize) / 2, w: glyphSize, h: glyphSize };\n  compose(\n    ctx,\n    mask,\n    0,\n    0,\n    {\n      fill,\n      stroke: s.outline > 0 ? { width: (s.outline * size) / 64, color: s.outlineColor } : null,\n      extrude: null,\n      glow:\n        s.glow > 0\n          ? {\n              blur: size * 0.12 * s.glow,\n              color: alpha(onSolid ? \"#000000\" : fill.color, onSolid ? 0.35 : 0.85),\n            }\n          : null,\n      shadow: s.shadow\n        ? { x: 0, y: size * 0.025, blur: size * 0.04, color: \"rgba(0,0,0,0.45)\" }\n        : null,\n      shine: metal ? Math.max(s.shine, metal.shine) : s.shine,\n      ghost: null,\n      ...(metal && !onSolid ? { bevel: metal.bevel } : {}),\n    },\n    box,\n    {\n      raw: glyphRaw(glyph, size, size, size / 2, size / 2, glyphSize),\n      ...(metal && !onSolid ? { bevelSize: glyphSize } : {}),\n    },\n  );\n}\n\n/* ------------------------------------------------------------------ *\n * Graphics designs\n * ------------------------------------------------------------------ */\n\nexport type PatternType =\n  | \"none\"\n  | \"grid\"\n  | \"dots\"\n  | \"bricks\"\n  | \"stripes\"\n  | \"noise\"\n  | \"pixels\"\n  | \"scanlines\"\n  | \"halftone\"\n  | \"stars\"\n  | \"hexagons\"\n  | \"topo\"\n  | \"perspective\"\n  | \"rays\"\n  | \"bokeh\"\n  | \"waves\";\n\nexport interface Light {\n  x: number;\n  y: number;\n  r: number;\n  color: string;\n  alpha: number;\n}\n\nexport interface Background {\n  paint: Paint;\n  image: { src: string; opacity: number; blur: number } | null;\n  lights: Light[];\n  pattern: { type: PatternType; color: string; opacity: number; scale: number };\n  vignette: number;\n}\n\ninterface LayerBase {\n  id: string;\n  name: string;\n  /** Centre, in design pixels. */\n  x: number;\n  y: number;\n  rotation: number;\n  opacity: number;\n  visible: boolean;\n  /** Mirrored left-right / upside down. */\n  flipX?: boolean;\n  flipY?: boolean;\n  /** How the layer mixes with what is under it (canvas composite operation). */\n  blend?: BlendMode;\n  /** Locked layers cannot be picked or dragged on the canvas. */\n  locked?: boolean;\n}\n\nexport const BLEND_MODES = [\n  \"normal\",\n  \"multiply\",\n  \"screen\",\n  \"overlay\",\n  \"darken\",\n  \"lighten\",\n  \"color-dodge\",\n  \"soft-light\",\n  \"difference\",\n  \"hue\",\n  \"color\",\n] as const;\nexport type BlendMode = (typeof BLEND_MODES)[number];\n\n/** Photo adjustments of an image layer (1 = unchanged, 0 for the rest). */\nexport interface ImageFilters {\n  brightness: number;\n  contrast: number;\n  saturate: number;\n  /** Degrees. */\n  hue: number;\n  grayscale: number;\n  sepia: number;\n  /** Pixels. */\n  blur: number;\n}\n\nexport const NO_FILTERS: ImageFilters = {\n  brightness: 1,\n  contrast: 1,\n  saturate: 1,\n  hue: 0,\n  grayscale: 0,\n  sepia: 0,\n  blur: 0,\n};\n\n/** CSS filter string, or \"none\" when nothing changes. */\nexport function filterCss(f: Partial<ImageFilters> | undefined): string {\n  if (!f) return \"none\";\n  const v = { ...NO_FILTERS, ...f };\n  const parts: string[] = [];\n  if (v.brightness !== 1) parts.push(`brightness(${v.brightness})`);\n  if (v.contrast !== 1) parts.push(`contrast(${v.contrast})`);\n  if (v.saturate !== 1) parts.push(`saturate(${v.saturate})`);\n  if (v.hue !== 0) parts.push(`hue-rotate(${v.hue}deg)`);\n  if (v.grayscale !== 0) parts.push(`grayscale(${v.grayscale})`);\n  if (v.sepia !== 0) parts.push(`sepia(${v.sepia})`);\n  if (v.blur !== 0) parts.push(`blur(${v.blur}px)`);\n  return parts.length ? parts.join(\" \") : \"none\";\n}\n\nexport interface TextLayer extends LayerBase {\n  type: \"text\";\n  text: string;\n  font: string;\n  size: number;\n  letterSpacing: number;\n  lineHeight: number;\n  /** Italic slant, -0.5..0.5. */\n  skew: number;\n  uppercase: boolean;\n  align: \"left\" | \"center\" | \"right\";\n  /** Wider text is drawn smaller to fit (templates set it so names never spill out). */\n  maxWidth?: number;\n  fx: Effects;\n}\n\nexport interface IconLayer extends LayerBase {\n  type: \"icon\";\n  glyph: Glyph;\n  size: number;\n  lineWidth: number;\n  solid: boolean;\n  /** Fit the icon's drawn shape to the box (new layers), not its 24px grid (older designs). */\n  fit?: boolean;\n  fx: Effects;\n}\n\nexport interface ImageLayer extends LayerBase {\n  type: \"image\";\n  src: string;\n  width: number;\n  height: number;\n  radius: number;\n  filters?: Partial<ImageFilters>;\n  fx: Effects;\n}\n\nexport interface ShapeLayer extends LayerBase {\n  type: \"shape\";\n  shape:\n    | \"rect\"\n    | \"circle\"\n    | \"tape\"\n    | \"line\"\n    | \"sparkle\"\n    | \"triangle\"\n    | \"star\"\n    | \"hexagon\"\n    | \"heart\"\n    | \"ring\"\n    | \"arrow\";\n  width: number;\n  height: number;\n  radius: number;\n  paint: Paint;\n  /** Tape: the stripe colour and its text. */\n  color2: string;\n  label: string;\n  fx: Effects;\n}\n\nexport type Layer = TextLayer | IconLayer | ImageLayer | ShapeLayer;\n\nexport interface Design {\n  version: 1;\n  format: string;\n  width: number;\n  height: number;\n  background: Background;\n  layers: Layer[];\n}\n\nexport type Watermark = \"banner\" | \"subtle\" | null;\n\nexport interface LayerBox {\n  id: string;\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\nfunction seeded(seed: number) {\n  let s = seed >>> 0 || 1;\n  return () => {\n    s ^= s << 13;\n    s ^= s >>> 17;\n    s ^= s << 5;\n    return ((s >>> 0) % 100000) / 100000;\n  };\n}\n\nfunction drawPattern(ctx: CanvasRenderingContext2D, d: Design): void {\n  const p = d.background.pattern;\n  if (p.type === \"none\" || p.opacity <= 0) return;\n  const { width: W, height: H } = d;\n  const unit = Math.max(4, (Math.min(W, H) / 18) * p.scale);\n  const rand = seeded(W * 31 + H);\n  ctx.save();\n  ctx.globalAlpha = p.opacity;\n  ctx.fillStyle = p.color;\n  ctx.strokeStyle = p.color;\n  switch (p.type) {\n    case \"grid\": {\n      ctx.lineWidth = Math.max(1, unit / 40);\n      ctx.beginPath();\n      for (let x = 0; x <= W; x += unit) {\n        ctx.moveTo(x, 0);\n        ctx.lineTo(x, H);\n      }\n      for (let y = 0; y <= H; y += unit) {\n        ctx.moveTo(0, y);\n        ctx.lineTo(W, y);\n      }\n      ctx.stroke();\n      ctx.globalAlpha = p.opacity * 0.5;\n      ctx.lineWidth = Math.max(0.5, unit / 90);\n      ctx.beginPath();\n      for (let x = 0; x <= W; x += unit / 4) {\n        ctx.moveTo(x, 0);\n        ctx.lineTo(x, H);\n      }\n      for (let y = 0; y <= H; y += unit / 4) {\n        ctx.moveTo(0, y);\n        ctx.lineTo(W, y);\n      }\n      ctx.stroke();\n      break;\n    }\n    case \"dots\": {\n      const r = Math.max(1, unit / 14);\n      for (let y = unit / 2; y < H; y += unit / 2)\n        for (let x = unit / 2; x < W; x += unit / 2) {\n          ctx.beginPath();\n          ctx.arc(x, y, r, 0, Math.PI * 2);\n          ctx.fill();\n        }\n      break;\n    }\n    case \"bricks\": {\n      const bh = unit * 0.7;\n      const bw = unit * 1.6;\n      const gap = Math.max(1, unit / 14);\n      for (let row = 0, y = 0; y < H; row++, y += bh) {\n        const off = row % 2 ? bw / 2 : 0;\n        for (let x = -off; x < W; x += bw) {\n          ctx.globalAlpha = p.opacity * (0.35 + rand() * 0.65);\n          ctx.fillRect(x + gap / 2, y + gap / 2, bw - gap, bh - gap);\n        }\n      }\n      break;\n    }\n    case \"stripes\": {\n      ctx.lineWidth = unit / 3;\n      ctx.beginPath();\n      for (let x = -H; x < W + H; x += unit) {\n        ctx.moveTo(x, 0);\n        ctx.lineTo(x + H, H);\n      }\n      ctx.stroke();\n      break;\n    }\n    case \"noise\": {\n      const n = Math.round((W * H) / 220);\n      const s = Math.max(1, Math.round(Math.min(W, H) / 500));\n      for (let i = 0; i < n; i++) {\n        ctx.globalAlpha = p.opacity * rand();\n        ctx.fillRect(rand() * W, rand() * H, s, s);\n      }\n      break;\n    }\n    case \"pixels\": {\n      const s = unit / 2;\n      for (let y = 0; y < H; y += s)\n        for (let x = 0; x < W; x += s) {\n          const v = rand();\n          if (v < 0.45) continue;\n          ctx.globalAlpha = p.opacity * (v - 0.4);\n          ctx.fillRect(x, y, s - 1, s - 1);\n        }\n      break;\n    }\n    case \"scanlines\": {\n      const s = Math.max(2, unit / 6);\n      for (let y = 0; y < H; y += s * 2) ctx.fillRect(0, y, W, s * 0.6);\n      break;\n    }\n    case \"halftone\": {\n      const s = unit / 2;\n      for (let y = 0; y < H; y += s)\n        for (let x = (y / s) % 2 ? s / 2 : 0; x < W; x += s) {\n          const r = (s / 2) * (0.15 + 0.85 * (x / W));\n          ctx.beginPath();\n          ctx.arc(x, y, r * 0.8, 0, Math.PI * 2);\n          ctx.fill();\n        }\n      break;\n    }\n    case \"stars\": {\n      const n = Math.round((W * H) / (unit * unit * 1.5));\n      for (let i = 0; i < n; i++) {\n        const x = rand() * W;\n        const y = rand() * H;\n        const r = unit * (0.06 + rand() * 0.16);\n        ctx.globalAlpha = p.opacity * (0.3 + rand() * 0.7);\n        sparkle(ctx, x, y, r);\n      }\n      break;\n    }\n    case \"topo\":\n      drawTopo(ctx, W, H, unit, rand);\n      break;\n    case \"perspective\": {\n      // A floor grid running to the horizon, fading as it goes.\n      const horizon = H * 0.52;\n      const vx = W / 2;\n      ctx.lineWidth = Math.max(1, unit / 26);\n      for (let i = 1; i <= 18; i++) {\n        const t = i / 18;\n        const y = horizon + (H - horizon) * t * t;\n        ctx.globalAlpha = p.opacity * (0.2 + 0.8 * t);\n        ctx.beginPath();\n        ctx.moveTo(0, y);\n        ctx.lineTo(W, y);\n        ctx.stroke();\n      }\n      ctx.globalAlpha = p.opacity;\n      const spread = W * 2.4;\n      for (let i = -14; i <= 14; i++) {\n        ctx.beginPath();\n        ctx.moveTo(vx, horizon);\n        ctx.lineTo(vx + (i / 14) * spread, H);\n        ctx.stroke();\n      }\n      ctx.globalAlpha = p.opacity * 0.6;\n      ctx.fillRect(0, horizon - ctx.lineWidth, W, ctx.lineWidth * 2);\n      break;\n    }\n    case \"rays\": {\n      const cx = W / 2;\n      const cy = H * 0.45;\n      const n = Math.max(8, Math.round(22 * p.scale));\n      const r = Math.hypot(W, H);\n      for (let i = 0; i < n; i++) {\n        const a0 = (i / n) * Math.PI * 2;\n        const a1 = a0 + (Math.PI / n) * 0.9;\n        ctx.globalAlpha = p.opacity * (0.55 + 0.45 * rand());\n        ctx.beginPath();\n        ctx.moveTo(cx, cy);\n        ctx.lineTo(cx + Math.cos(a0) * r, cy + Math.sin(a0) * r);\n        ctx.lineTo(cx + Math.cos(a1) * r, cy + Math.sin(a1) * r);\n        ctx.closePath();\n        ctx.fill();\n      }\n      break;\n    }\n    case \"bokeh\": {\n      const n = Math.round((W * H) / (unit * unit * 6)) + 6;\n      for (let i = 0; i < n; i++) {\n        const x = rand() * W;\n        const y = rand() * H;\n        const r = unit * (0.25 + rand() * rand() * 1.6);\n        const g = ctx.createRadialGradient(x, y, 0, x, y, r);\n        g.addColorStop(0, alpha(p.color, 0.9));\n        g.addColorStop(0.7, alpha(p.color, 0.5));\n        g.addColorStop(1, alpha(p.color, 0));\n        ctx.globalAlpha = p.opacity * (0.25 + rand() * 0.75);\n        ctx.fillStyle = g;\n        ctx.beginPath();\n        ctx.arc(x, y, r, 0, Math.PI * 2);\n        ctx.fill();\n      }\n      break;\n    }\n    case \"waves\": {\n      ctx.lineWidth = Math.max(1, unit / 22);\n      const amp = unit * 0.35;\n      const len = unit * 2.2;\n      for (let y = -amp; y < H + amp; y += unit * 0.55) {\n        const phase = rand() * Math.PI * 2;\n        ctx.globalAlpha = p.opacity * (0.4 + 0.6 * rand());\n        ctx.beginPath();\n        for (let x = 0; x <= W; x += Math.max(2, unit / 8)) {\n          const yy = y + Math.sin((x / len) * Math.PI * 2 + phase) * amp;\n          if (x === 0) ctx.moveTo(x, yy);\n          else ctx.lineTo(x, yy);\n        }\n        ctx.stroke();\n      }\n      break;\n    }\n    case \"hexagons\": {\n      const r = unit / 2;\n      const h = Math.sqrt(3) * r;\n      ctx.lineWidth = Math.max(1, unit / 30);\n      for (let row = 0, y = 0; y < H + h; row++, y += h / 2)\n        for (let x = row % 2 ? r * 1.5 : 0; x < W + r; x += r * 3) {\n          ctx.beginPath();\n          for (let i = 0; i < 6; i++) {\n            const a = (Math.PI / 3) * i;\n            ctx.lineTo(x + Math.cos(a) * r, y + Math.sin(a) * r);\n          }\n          ctx.closePath();\n          ctx.stroke();\n        }\n      break;\n    }\n  }\n  ctx.restore();\n}\n\n/** Contour lines of a smooth wavy field (a topographic map), by marching squares. */\nfunction drawTopo(\n  ctx: CanvasRenderingContext2D,\n  W: number,\n  H: number,\n  unit: number,\n  rand: () => number,\n) {\n  const waves = Array.from({ length: 5 }, () => ({\n    a: (rand() - 0.5) * 2.2,\n    b: (rand() - 0.5) * 2.2,\n    p: rand() * Math.PI * 2,\n    k: 0.5 + rand(),\n  }));\n  const scale = 1 / (unit * 3);\n  const field = (x: number, y: number) =>\n    waves.reduce(\n      (v, w) => v + Math.sin((x * w.a + y * w.b) * scale * w.k + w.p) / waves.length,\n      0,\n    ) +\n    0.35 * Math.sin(x * scale * 0.7 + y * scale * 0.4);\n  const cell = Math.max(3, unit / 4);\n  const cols = Math.ceil(W / cell) + 1;\n  const rows = Math.ceil(H / cell) + 1;\n  const v = new Float32Array(cols * rows);\n  for (let j = 0; j < rows; j++)\n    for (let i = 0; i < cols; i++) v[j * cols + i] = field(i * cell, j * cell);\n  ctx.lineWidth = Math.max(1, unit / 30);\n  ctx.beginPath();\n  for (let level = -1.2; level <= 1.2; level += 0.12) {\n    for (let j = 0; j < rows - 1; j++)\n      for (let i = 0; i < cols - 1; i++) {\n        const a = v[j * cols + i]! - level;\n        const b = v[j * cols + i + 1]! - level;\n        const c = v[(j + 1) * cols + i + 1]! - level;\n        const d = v[(j + 1) * cols + i]! - level;\n        const pts: [number, number][] = [];\n        const x0 = i * cell;\n        const y0 = j * cell;\n        if (a > 0 !== b > 0) pts.push([x0 + (cell * a) / (a - b), y0]);\n        if (b > 0 !== c > 0) pts.push([x0 + cell, y0 + (cell * b) / (b - c)]);\n        if (c > 0 !== d > 0) pts.push([x0 + cell - (cell * c) / (c - d), y0 + cell]);\n        if (d > 0 !== a > 0) pts.push([x0, y0 + cell - (cell * d) / (d - a)]);\n        for (let k = 0; k + 1 < pts.length; k += 2) {\n          ctx.moveTo(pts[k]![0], pts[k]![1]);\n          ctx.lineTo(pts[k + 1]![0], pts[k + 1]![1]);\n        }\n      }\n  }\n  ctx.stroke();\n}\n\nfunction sparkle(c: CanvasRenderingContext2D, x: number, y: number, r: number) {\n  c.beginPath();\n  c.moveTo(x, y - r);\n  c.quadraticCurveTo(x, y, x + r, y);\n  c.quadraticCurveTo(x, y, x, y + r);\n  c.quadraticCurveTo(x, y, x - r, y);\n  c.quadraticCurveTo(x, y, x, y - r);\n  c.fill();\n}\n\nfunction drawBackground(ctx: CanvasRenderingContext2D, d: Design): void {\n  const { width: W, height: H, background: bg } = d;\n  ctx.fillStyle = paintStyle(ctx, bg.paint, 0, 0, W, H);\n  ctx.fillRect(0, 0, W, H);\n  const img = bg.image ? image(bg.image.src) : null;\n  if (img && bg.image) {\n    const r = Math.max(W / img.naturalWidth, H / img.naturalHeight);\n    const w = img.naturalWidth * r;\n    const h = img.naturalHeight * r;\n    ctx.save();\n    ctx.globalAlpha = bg.image.opacity;\n    if (bg.image.blur > 0) ctx.filter = `blur(${bg.image.blur}px)`;\n    ctx.drawImage(img, (W - w) / 2, (H - h) / 2, w, h);\n    ctx.restore();\n  }\n  for (const l of bg.lights) {\n    const g = ctx.createRadialGradient(l.x * W, l.y * H, 0, l.x * W, l.y * H, l.r * Math.max(W, H));\n    g.addColorStop(0, alpha(l.color, l.alpha));\n    g.addColorStop(1, alpha(l.color, 0));\n    ctx.fillStyle = g;\n    ctx.fillRect(0, 0, W, H);\n  }\n  drawPattern(ctx, d);\n  if (bg.vignette > 0) {\n    const g = ctx.createRadialGradient(\n      W / 2,\n      H / 2,\n      Math.min(W, H) * 0.35,\n      W / 2,\n      H / 2,\n      Math.hypot(W, H) / 2,\n    );\n    g.addColorStop(0, \"rgba(0,0,0,0)\");\n    g.addColorStop(1, `rgba(0,0,0,${bg.vignette})`);\n    ctx.fillStyle = g;\n    ctx.fillRect(0, 0, W, H);\n  }\n}\n\nfunction textLines(l: TextLayer): string[] {\n  return (l.uppercase ? l.text.toUpperCase() : l.text).split(\"\\n\");\n}\n\n/** The layer's font size, shrunk until the text fits its maxWidth. */\nfunction fittedSize(l: TextLayer): number {\n  if (!l.maxWidth || l.maxWidth <= 0) return l.size;\n  const probe = ctx2d(makeCanvas(2, 2));\n  probe.font = fontCss(l.font, l.size);\n  const spacing = l.letterSpacing * l.size;\n  const lines = textLines(l);\n  const width = Math.max(\n    1,\n    ...lines.map((t) => probe.measureText(t).width + spacing * Math.max(0, [...t].length - 1)),\n  );\n  const lineCount = lines.length;\n  const slant = Math.abs(l.skew) * l.size * (0.9 + l.lineHeight * (lineCount - 1));\n  return width + slant > l.maxWidth ? l.size * (l.maxWidth / (width + slant)) : l.size;\n}\n\n/** Mask of a text layer, its size and the text box inside it. */\nfunction textMask(layer: TextLayer, margin: number) {\n  const size = fittedSize(layer);\n  const l = size === layer.size ? layer : { ...layer, size };\n  const probe = ctx2d(makeCanvas(2, 2));\n  probe.font = fontCss(l.font, l.size);\n  const spacing = l.letterSpacing * l.size;\n  const lines = textLines(l);\n  const widths = lines.map(\n    (t) => probe.measureText(t).width + spacing * Math.max(0, [...t].length - 1),\n  );\n  const m = probe.measureText(\"ÁjHg\");\n  const asc = m.actualBoundingBoxAscent || l.size * 0.8;\n  const desc = m.actualBoundingBoxDescent || l.size * 0.2;\n  const lineGap = l.size * l.lineHeight;\n  const textW = Math.max(1, ...widths);\n  const textH = asc + desc + lineGap * (lines.length - 1);\n  const slant = Math.abs(l.skew) * textH;\n  const w = textW + slant + margin * 2;\n  const h = textH + margin * 2;\n  const mask = makeCanvas(w, h);\n  const c = ctx2d(mask);\n  c.fillStyle = \"#fff\";\n  c.font = fontCss(l.font, l.size);\n  if (\"letterSpacing\" in c)\n    (c as unknown as { letterSpacing: string }).letterSpacing = `${spacing}px`;\n  c.textBaseline = \"alphabetic\";\n  c.translate(margin + slant / 2, 0);\n  c.transform(1, 0, -l.skew, 1, l.skew * (margin + textH / 2), 0);\n  lines.forEach((t, i) => {\n    const lw = widths[i]!;\n    const x = l.align === \"left\" ? 0 : l.align === \"right\" ? textW - lw : (textW - lw) / 2;\n    c.fillText(t, x, margin + asc + i * lineGap);\n  });\n  return { mask, w, h, box: { x: margin, y: margin, w: textW + slant, h: textH } };\n}\n\nfunction shapeMask(l: ShapeLayer, margin: number) {\n  const w = l.width + margin * 2;\n  const h = l.height + margin * 2;\n  const mask = makeCanvas(w, h);\n  const c = ctx2d(mask);\n  c.fillStyle = \"#fff\";\n  c.strokeStyle = \"#fff\";\n  const x = margin;\n  const y = margin;\n  switch (l.shape) {\n    case \"rect\":\n    case \"tape\":\n      roundRect(c, x, y, l.width, l.height, l.shape === \"tape\" ? 0 : l.radius);\n      c.fill();\n      break;\n    case \"circle\":\n      c.beginPath();\n      c.ellipse(x + l.width / 2, y + l.height / 2, l.width / 2, l.height / 2, 0, 0, Math.PI * 2);\n      c.fill();\n      break;\n    case \"line\":\n      c.fillRect(x, y + l.height / 2 - Math.max(1, l.height) / 2, l.width, Math.max(1, l.height));\n      break;\n    case \"sparkle\":\n      sparkle(c, x + l.width / 2, y + l.height / 2, Math.min(l.width, l.height) / 2);\n      break;\n    case \"triangle\":\n      polygon(c, [\n        [x + l.width / 2, y],\n        [x + l.width, y + l.height],\n        [x, y + l.height],\n      ]);\n      break;\n    case \"star\": {\n      const pts: [number, number][] = [];\n      for (let i = 0; i < 10; i++) {\n        const a = -Math.PI / 2 + (i * Math.PI) / 5;\n        const r = i % 2 === 0 ? 1 : 0.45;\n        pts.push([\n          x + l.width / 2 + (Math.cos(a) * r * l.width) / 2,\n          y + l.height / 2 + (Math.sin(a) * r * l.height) / 2,\n        ]);\n      }\n      polygon(c, pts);\n      break;\n    }\n    case \"hexagon\": {\n      const pts: [number, number][] = [];\n      for (let i = 0; i < 6; i++) {\n        const a = (i * Math.PI) / 3;\n        pts.push([\n          x + l.width / 2 + (Math.cos(a) * l.width) / 2,\n          y + l.height / 2 + (Math.sin(a) * l.height) / 2,\n        ]);\n      }\n      polygon(c, pts);\n      break;\n    }\n    case \"heart\": {\n      const w = l.width;\n      const h = l.height;\n      c.beginPath();\n      c.moveTo(x + w / 2, y + h);\n      c.bezierCurveTo(\n        x - w * 0.1,\n        y + h * 0.55,\n        x + w * 0.05,\n        y - h * 0.1,\n        x + w / 2,\n        y + h * 0.25,\n      );\n      c.bezierCurveTo(x + w * 0.95, y - h * 0.1, x + w * 1.1, y + h * 0.55, x + w / 2, y + h);\n      c.fill();\n      break;\n    }\n    case \"ring\": {\n      // The corner radius doubles as the ring's thickness.\n      const t = Math.max(\n        1,\n        Math.min(l.radius || Math.min(l.width, l.height) * 0.12, Math.min(l.width, l.height) / 2),\n      );\n      c.beginPath();\n      c.ellipse(x + l.width / 2, y + l.height / 2, l.width / 2, l.height / 2, 0, 0, Math.PI * 2);\n      c.ellipse(\n        x + l.width / 2,\n        y + l.height / 2,\n        Math.max(0, l.width / 2 - t),\n        Math.max(0, l.height / 2 - t),\n        0,\n        0,\n        Math.PI * 2,\n      );\n      c.fill(\"evenodd\");\n      break;\n    }\n    case \"arrow\": {\n      const shaft = l.height * 0.38;\n      const head = Math.min(l.width * 0.45, l.height * 0.9);\n      polygon(c, [\n        [x, y + (l.height - shaft) / 2],\n        [x + l.width - head, y + (l.height - shaft) / 2],\n        [x + l.width - head, y],\n        [x + l.width, y + l.height / 2],\n        [x + l.width - head, y + l.height],\n        [x + l.width - head, y + (l.height + shaft) / 2],\n        [x, y + (l.height + shaft) / 2],\n      ]);\n      break;\n    }\n  }\n  return { mask, w, h, box: { x, y, w: l.width, h: l.height } };\n}\n\nfunction polygon(c: CanvasRenderingContext2D, pts: [number, number][]) {\n  c.beginPath();\n  pts.forEach(([px, py], i) => (i === 0 ? c.moveTo(px, py) : c.lineTo(px, py)));\n  c.closePath();\n  c.fill();\n}\n\n/** Tape stripes and text drawn over the tape's face. */\nfunction tapeFace(l: ShapeLayer, w: number, h: number, margin: number): HTMLCanvasElement {\n  const face = makeCanvas(w, h);\n  const c = ctx2d(face);\n  c.fillStyle = paintStyle(c, l.paint, margin, margin, l.width, l.height);\n  c.fillRect(margin, margin, l.width, l.height);\n  c.save();\n  c.beginPath();\n  c.rect(margin, margin, l.width, l.height);\n  c.clip();\n  c.fillStyle = l.color2;\n  const s = l.height;\n  for (let x = margin - s; x < margin + l.width + s; x += s * 1.2) {\n    c.beginPath();\n    c.moveTo(x, margin + l.height);\n    c.lineTo(x + s * 0.5, margin);\n    c.lineTo(x + s * 0.95, margin);\n    c.lineTo(x + s * 0.45, margin + l.height);\n    c.fill();\n  }\n  if (l.label) {\n    c.font = fontCss(\"Russo One\", l.height * 0.62);\n    c.textAlign = \"center\";\n    c.textBaseline = \"middle\";\n    const t = `${l.label}   `;\n    const tw = c.measureText(t).width;\n    c.fillStyle = l.paint.color;\n    for (let x = margin + tw / 2; x < margin + l.width + tw; x += tw) {\n      c.fillRect(x - tw * 0.32, margin + l.height * 0.12, tw * 0.64, l.height * 0.76);\n    }\n    c.fillStyle = l.color2;\n    for (let x = margin + tw / 2; x < margin + l.width + tw; x += tw)\n      c.fillText(l.label, x, margin + l.height / 2 + 1);\n  }\n  c.restore();\n  return face;\n}\n\nfunction layerMask(l: Layer, margin: number) {\n  if (l.type === \"text\") return textMask(l, margin);\n  if (l.type === \"shape\") return shapeMask(l, margin);\n  if (l.type === \"icon\") {\n    const w = l.size + margin * 2;\n    const mask = makeCanvas(w, w);\n    drawGlyphMask(ctx2d(mask), l.glyph, w / 2, w / 2, l.size, {\n      lineWidth: l.lineWidth,\n      solid: l.solid,\n      fit: l.fit === true,\n    });\n    return { mask, w, h: w, box: { x: margin, y: margin, w: l.size, h: l.size } };\n  }\n  const w = l.width + margin * 2;\n  const h = l.height + margin * 2;\n  const mask = makeCanvas(w, h);\n  const c = ctx2d(mask);\n  const img = image(l.src);\n  if (img) {\n    roundRect(c, margin, margin, l.width, l.height, l.radius);\n    c.clip();\n    const r = Math.max(l.width / img.naturalWidth, l.height / img.naturalHeight);\n    const iw = img.naturalWidth * r;\n    const ih = img.naturalHeight * r;\n    const filter = filterCss(l.filters);\n    if (filter !== \"none\") c.filter = filter;\n    c.drawImage(img, margin + (l.width - iw) / 2, margin + (l.height - ih) / 2, iw, ih);\n  }\n  return { mask, w, h, box: { x: margin, y: margin, w: l.width, h: l.height } };\n}\n\nconst sprites = new Map<\n  string,\n  { canvas: HTMLCanvasElement; ox: number; oy: number; box: { w: number; h: number } }\n>();\n\n/** A layer composed with its effects at 1:1, cached while it doesn't change. */\nfunction layerSprite(l: Layer) {\n  // Position, turn, mirroring and blending happen when the sprite is drawn.\n  const key = JSON.stringify({\n    ...l,\n    x: 0,\n    y: 0,\n    rotation: 0,\n    opacity: 1,\n    name: \"\",\n    flipX: false,\n    flipY: false,\n    blend: \"normal\",\n    locked: false,\n  });\n  const hit = sprites.get(key);\n  if (hit) return hit;\n  const margin = effectsMargin(l.fx) + 4;\n  const { mask, w, h, box } = layerMask(l, margin);\n  let raw: HTMLCanvasElement | null = null;\n  if (l.type === \"image\") raw = mask;\n  else if (l.type === \"shape\" && l.shape === \"tape\") raw = tapeFace(l, w, h, margin);\n  else if (l.type === \"icon\") raw = glyphRaw(l.glyph, w, h, w / 2, h / 2, l.size);\n  const fx: Effects = l.type === \"shape\" && l.shape !== \"tape\" ? { ...l.fx, fill: l.paint } : l.fx;\n  const pad = Math.ceil(\n    (fx.extrude?.depth ?? 0) +\n      (fx.shadow\n        ? Math.max(Math.abs(fx.shadow.x), Math.abs(fx.shadow.y)) + fx.shadow.blur * 2\n        : 0) +\n      (fx.glow ? fx.glow.blur * 2 : 0) +\n      4,\n  );\n  const canvas = makeCanvas(w + pad * 2, h + pad * 2);\n  // A text layer bevels by its letter size, not by the whole (multi-line) block.\n  const bevelSize =\n    l.type === \"text\" ? fittedSize(l) : l.type === \"icon\" ? l.size : Math.min(box.w, box.h);\n  compose(ctx2d(canvas), mask, pad, pad, fx, box, { raw, bevelSize });\n  const sprite = { canvas, ox: pad + w / 2, oy: pad + h / 2, box: { w: box.w, h: box.h } };\n  // Only fully loaded pictures are worth keeping.\n  const pending =\n    (l.type === \"image\" && !image(l.src)) ||\n    (l.type === \"icon\" && l.glyph.kind === \"image\" && !image(l.glyph.src));\n  if (!pending) {\n    sprites.set(key, sprite);\n    if (sprites.size > 80) sprites.delete(sprites.keys().next().value as string);\n  }\n  return sprite;\n}\n\n/** Forget cached layers (after fonts finish loading). */\nexport function clearRenderCache(): void {\n  sprites.clear();\n}\n\nfunction drawLayer(ctx: CanvasRenderingContext2D, l: Layer): LayerBox {\n  const sprite = layerSprite(l);\n  ctx.save();\n  ctx.globalAlpha = l.opacity;\n  if (l.blend && l.blend !== \"normal\") ctx.globalCompositeOperation = l.blend;\n  ctx.translate(l.x, l.y);\n  ctx.rotate((l.rotation * Math.PI) / 180);\n  if (l.flipX || l.flipY) ctx.scale(l.flipX ? -1 : 1, l.flipY ? -1 : 1);\n  ctx.drawImage(sprite.canvas, -sprite.ox, -sprite.oy);\n  ctx.restore();\n  return {\n    id: l.id,\n    x: l.x - sprite.box.w / 2,\n    y: l.y - sprite.box.h / 2,\n    w: sprite.box.w,\n    h: sprite.box.h,\n  };\n}\n\n/** The Bottly icon used as the free-plan watermark (public/icon-512.png). */\nexport const WATERMARK_LOGO = \"/icon-512.png\";\n\n/** Free-plan mark: the Bottly icon at 50% in the bottom-right corner. */\nfunction drawWatermark(ctx: CanvasRenderingContext2D, d: Design, kind: Watermark): void {\n  if (!kind) return;\n  const logo = image(WATERMARK_LOGO);\n  if (!logo) return;\n  const { width: W, height: H } = d;\n  const m = Math.min(W, H);\n  // Banners carry a clear mark; pictures (avatars, icons) a smaller one.\n  const size = Math.max(16, m * (kind === \"banner\" ? 0.13 : 0.09));\n  const margin = Math.max(6, m * 0.035);\n  ctx.save();\n  ctx.globalAlpha = 0.5;\n  ctx.drawImage(logo, W - size - margin, H - size - margin, size, size);\n  ctx.restore();\n}\n\n/** Renders a design at `scale`; returns each visible layer's box (design px). */\nexport function renderDesign(\n  ctx: CanvasRenderingContext2D,\n  d: Design,\n  options: { scale?: number; watermark?: Watermark } = {},\n): LayerBox[] {\n  const scale = options.scale ?? 1;\n  ctx.save();\n  ctx.setTransform(scale, 0, 0, scale, 0, 0);\n  drawBackground(ctx, d);\n  const boxes: LayerBox[] = [];\n  for (const l of d.layers) if (l.visible) boxes.push(drawLayer(ctx, l));\n  drawWatermark(ctx, d, options.watermark ?? null);\n  ctx.restore();\n  return boxes;\n}\n\n/** Every font and picture a design needs before it renders right. */\nexport function designAssets(d: Design): { fonts: string[]; images: string[] } {\n  const fonts = new Set<string>([\"Figtree\", \"Russo One\"]);\n  // The watermark is drawn only once its picture is loaded.\n  const imgs = new Set<string>([WATERMARK_LOGO]);\n  if (d.background.image) imgs.add(d.background.image.src);\n  for (const l of d.layers) {\n    if (l.type === \"text\") fonts.add(l.font);\n    if (l.type === \"image\") imgs.add(l.src);\n    if (l.type === \"icon\" && l.glyph.kind === \"text\") fonts.add(l.glyph.font);\n    if (l.type === \"icon\" && l.glyph.kind === \"image\") imgs.add(l.glyph.src);\n  }\n  return { fonts: [...fonts], images: [...imgs] };\n}\n\n/** A PNG/JPEG data URL of a design at full size. */\nexport function exportDesign(\n  d: Design,\n  type: \"image/png\" | \"image/jpeg\" | \"image/webp\",\n  watermark: Watermark,\n): string {\n  const c = makeCanvas(d.width, d.height);\n  renderDesign(ctx2d(c), d, { watermark });\n  return c.toDataURL(type, 0.92);\n}\n","src/lib/studio/font-list.ts":"/**\n * The studios' font list, without loaders: shared by the web app and the bot\n * runtime (which registers the same fontsource files with @napi-rs/canvas,\n * see runtime/scripts/sync-studio.mjs).\n */\n\nexport interface StudioFont {\n  family: string;\n  label: string;\n  weight: number;\n  style: \"display\" | \"pixel\" | \"tech\" | \"hand\" | \"clean\";\n  /** fontsource package, e.g. \"russo-one\"; empty for a licensed font file. */\n  pkg: string;\n  /**\n   * Licensed fonts bought for Bottly: a WOFF2 in public/studio/fonts (the\n   * runtime gets a copy in runtime/fonts, see sync-studio.mjs).\n   */\n  file?: string;\n}\n\n/** A licensed font served from public/studio/fonts/<slug>.woff2. */\nconst own = (\n  family: string,\n  label: string,\n  style: StudioFont[\"style\"],\n  slug: string,\n): StudioFont => ({\n  family,\n  label,\n  weight: 400,\n  style,\n  pkg: \"\",\n  file: `/studio/fonts/${slug}.woff2`,\n});\n\nexport const STUDIO_FONTS: StudioFont[] = [\n  { family: \"Russo One\", label: \"Russo One\", weight: 400, style: \"display\", pkg: \"russo-one\" },\n  { family: \"Bungee\", label: \"Bungee\", weight: 400, style: \"display\", pkg: \"bungee\" },\n  {\n    family: \"Racing Sans One\",\n    label: \"Racing Sans\",\n    weight: 400,\n    style: \"display\",\n    pkg: \"racing-sans-one\",\n  },\n  { family: \"Anton\", label: \"Anton\", weight: 400, style: \"display\", pkg: \"anton\" },\n  { family: \"Bebas Neue\", label: \"Bebas Neue\", weight: 400, style: \"display\", pkg: \"bebas-neue\" },\n  {\n    family: \"Rubik Mono One\",\n    label: \"Rubik Mono\",\n    weight: 400,\n    style: \"display\",\n    pkg: \"rubik-mono-one\",\n  },\n  { family: \"Bangers\", label: \"Bangers\", weight: 400, style: \"display\", pkg: \"bangers\" },\n  { family: \"Righteous\", label: \"Righteous\", weight: 400, style: \"display\", pkg: \"righteous\" },\n  {\n    family: \"Black Ops One\",\n    label: \"Black Ops\",\n    weight: 400,\n    style: \"display\",\n    pkg: \"black-ops-one\",\n  },\n  {\n    family: \"Saira Stencil One\",\n    label: \"Saira Stencil\",\n    weight: 400,\n    style: \"display\",\n    pkg: \"saira-stencil-one\",\n  },\n  {\n    family: \"Press Start 2P\",\n    label: \"Press Start (pixel)\",\n    weight: 400,\n    style: \"pixel\",\n    pkg: \"press-start-2p\",\n  },\n  {\n    family: \"Silkscreen\",\n    label: \"Silkscreen (pixel)\",\n    weight: 700,\n    style: \"pixel\",\n    pkg: \"silkscreen\",\n  },\n  { family: \"Orbitron\", label: \"Orbitron\", weight: 900, style: \"tech\", pkg: \"orbitron\" },\n  { family: \"Audiowide\", label: \"Audiowide\", weight: 400, style: \"tech\", pkg: \"audiowide\" },\n  {\n    family: \"Chakra Petch\",\n    label: \"Chakra Petch\",\n    weight: 700,\n    style: \"tech\",\n    pkg: \"chakra-petch\",\n  },\n  { family: \"Teko\", label: \"Teko\", weight: 600, style: \"tech\", pkg: \"teko\" },\n  { family: \"Monoton\", label: \"Monoton (neon)\", weight: 400, style: \"tech\", pkg: \"monoton\" },\n  {\n    family: \"Permanent Marker\",\n    label: \"Permanent Marker\",\n    weight: 400,\n    style: \"hand\",\n    pkg: \"permanent-marker\",\n  },\n  { family: \"Figtree\", label: \"Figtree\", weight: 800, style: \"clean\", pkg: \"figtree\" },\n  { family: \"Outfit\", label: \"Outfit\", weight: 800, style: \"clean\", pkg: \"outfit\" },\n  own(\"Burbank Big Condensed\", \"Burbank Big Condensed\", \"display\", \"burbank-big-condensed-black\"),\n  own(\"Monument Extended\", \"Monument Extended\", \"display\", \"monument-extended-ultrabold\"),\n  own(\"Hiruko Black Alternate\", \"Hiruko Black\", \"display\", \"hiruko-black-alternate\"),\n  own(\"Americorps Bold Condensed\", \"Americorps Bold\", \"display\", \"americorps-bold-condensed\"),\n  own(\n    \"Americorps Outline Condensed\",\n    \"Americorps Outline\",\n    \"display\",\n    \"americorps-outline-condensed\",\n  ),\n  own(\"Astigma\", \"Astigma\", \"display\", \"astigma\"),\n  own(\"Vampire Wars\", \"Vampire Wars\", \"display\", \"vampire-wars\"),\n  own(\"Spiced Rum Supernova\", \"Spiced Rum Supernova\", \"hand\", \"spiced-rum-supernova\"),\n  own(\"Michroma\", \"Michroma\", \"tech\", \"michroma\"),\n  own(\"Autobahn\", \"Autobahn\", \"tech\", \"autobahn\"),\n  own(\"X-Heighting\", \"X-Heighting\", \"tech\", \"x-heighting\"),\n];\n\nconst BY_FAMILY = new Map(STUDIO_FONTS.map((f) => [f.family, f]));\n\nexport function studioFont(family: string): StudioFont {\n  return BY_FAMILY.get(family) ?? STUDIO_FONTS[0]!;\n}\n\n/**\n * \"<family> Ext\" is the latin-ext half of a font on the bot runtime, which\n * registers each fontsource subset as its own family (browsers merge them\n * through unicode-range and simply skip the unknown name). Letters a font\n * lacks (pixel fonts without \"Ł\") fall back to Figtree on both sides.\n */\nexport function fontCss(family: string, px: number): string {\n  const f = studioFont(family);\n  return `${f.weight} ${Math.max(1, px)}px \"${f.family}\", \"${f.family} Ext\", \"Figtree\", \"Figtree Ext\", sans-serif`;\n}\n","src/lib/studio/variables.ts":"/**\n * Variables in Graphics Studio designs saved to a bot: text such as\n * \"Welcome {user}!\" and pictures whose source is a variable ({user.avatar}).\n * Shared by the studio (placeholders while editing) and the bot runtime, which\n * fills them in for the member who joined, ran the command and so on.\n */\nimport type { Design, Layer } from \"./render\";\n\nexport interface ImageVariable {\n  token: string;\n  label: string;\n  /** Shown in the studio's preview. */\n  sample: string;\n}\n\n/** Text variables an image understands (custom flow variables work too). */\nexport const IMAGE_TEXT_VARIABLES: ImageVariable[] = [\n  { token: \"user\", label: \"Member name\", sample: \"Natalia\" },\n  { token: \"username\", label: \"Username\", sample: \"natalia\" },\n  { token: \"server.name\", label: \"Server name\", sample: \"Bottly Community\" },\n  { token: \"server.memberCount\", label: \"Member count\", sample: \"1,248\" },\n  { token: \"server.memberOrdinal\", label: \"Member number (1,248th)\", sample: \"1,248th\" },\n  { token: \"channel.name\", label: \"Channel name\", sample: \"welcome\" },\n  { token: \"date\", label: \"Today's date\", sample: \"24 Oct 2026\" },\n];\n\n/** Pictures a layer or background can take from the event. */\nexport const IMAGE_PICTURE_VARIABLES: ImageVariable[] = [\n  { token: \"user.avatar\", label: \"Member avatar\", sample: \"\" },\n  { token: \"server.icon\", label: \"Server icon\", sample: \"\" },\n];\n\nconst PICTURE = /^\\{([a-zA-Z0-9_.-]+)\\}$/;\n\n/** \"{user.avatar}\" → \"user.avatar\"; null for a normal picture. */\nexport function pictureVariable(src: string): string | null {\n  return PICTURE.exec(src.trim())?.[1] ?? null;\n}\n\n/** True when the design changes per member (worth saving to a bot as a template). */\nexport function designHasVariables(d: Design): boolean {\n  if (d.background.image && pictureVariable(d.background.image.src)) return true;\n  return d.layers.some(\n    (l) =>\n      (l.type === \"text\" && /\\{[a-zA-Z0-9_.-]+\\}/.test(l.text)) ||\n      (l.type === \"image\" && pictureVariable(l.src) !== null),\n  );\n}\n\n/**\n * A copy of the design with variables filled in: `text` replaces tokens in\n * text layers, `picture` turns a picture variable into an image source.\n */\nexport function fillDesign(\n  d: Design,\n  text: (token: string) => string,\n  picture: (token: string) => string,\n): Design {\n  const fillText = (s: string) =>\n    s.replace(/\\{([a-zA-Z0-9_.-]+)\\}/g, (_m, token: string) => text(token));\n  const fillSrc = (src: string) => {\n    const token = pictureVariable(src);\n    return token === null ? src : picture(token);\n  };\n  const layers = d.layers.map((l): Layer => {\n    if (l.type === \"text\") return { ...l, text: fillText(l.text) };\n    if (l.type === \"image\") return { ...l, src: fillSrc(l.src) };\n    return l;\n  });\n  const bg = d.background.image\n    ? { ...d.background, image: { ...d.background.image, src: fillSrc(d.background.image.src) } }\n    : d.background;\n  return { ...d, background: bg, layers };\n}\n\n/** Every picture variable a design uses. */\nexport function designPictureVariables(d: Design): string[] {\n  const out = new Set<string>();\n  const add = (src: string) => {\n    const t = pictureVariable(src);\n    if (t) out.add(t);\n  };\n  if (d.background.image) add(d.background.image.src);\n  for (const l of d.layers) if (l.type === \"image\") add(l.src);\n  return [...out];\n}\n\n/** English ordinal: 1st, 2nd, 3rd, 11th, 1,248th. */\nexport function ordinal(n: number): string {\n  const s = n.toLocaleString(\"en-US\");\n  const tens = n % 100;\n  if (tens >= 11 && tens <= 13) return `${s}th`;\n  return s + ([\"th\", \"st\", \"nd\", \"rd\"][n % 10] ?? \"th\");\n}\n\n/** The file a bot image is sent as: \"Welcome card\" → \"welcome-card.png\". */\nexport function imageFileName(name: string): string {\n  const base = name\n    .normalize(\"NFKD\")\n    .replace(/[\\u0300-\\u036f]/g, \"\")\n    .replace(/ł/g, \"l\")\n    .replace(/Ł/g, \"L\")\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, \"-\")\n    .replace(/^-+|-+$/g, \"\")\n    .slice(0, 40);\n  return `${base || \"image\"}.png`;\n}\n","src/data/studio-icons.ts":"/**\n * Icons of Emoji Studio and Graphics Studio as SVG path data on a 24×24 grid.\n * Generated by scripts/gen-studio-icons.mts from lucide (ISC), Phosphor (MIT),\n * simple-icons and cryptocurrency-icons (CC0) and Bottly's own icons; edit the\n * lists there, not this file.\n */\n\nexport interface StudioIcon {\n  id: string;\n  label: string;\n  /** \"line\" icons are stroked; the other sets are filled. */\n  set: \"line\" | \"solid\" | \"duotone\" | \"brand\" | \"crypto\";\n  paths: string[];\n  /** Line icons: paths inside a closed shape, cut out when the icon is filled. */\n  inner?: number[];\n  /** Line icons: open strokes, never filled. */\n  open?: number[];\n  /** Duotone icons: the light layer, drawn see-through. */\n  faded?: number[];\n  /** Brand colour. */\n  color?: string;\n}\n\nexport const STUDIO_ICONS: StudioIcon[] = [{\"id\":\"thumbs-up\",\"label\":\"Like\",\"set\":\"line\",\"paths\":[\"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\",\"M7 10v12\"],\"inner\":[1]},{\"id\":\"thumbs-down\",\"label\":\"Dislike\",\"set\":\"line\",\"paths\":[\"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z\",\"M17 14V2\"],\"inner\":[1]},{\"id\":\"check\",\"label\":\"Check\",\"set\":\"line\",\"paths\":[\"M20 6 9 17l-5-5\"],\"open\":[0]},{\"id\":\"x\",\"label\":\"Cross\",\"set\":\"line\",\"paths\":[\"M18 6 6 18\",\"m6 6 12 12\"],\"open\":[0,1]},{\"id\":\"circle-check\",\"label\":\"Check circle\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m9 12 2 2 4-4\"],\"inner\":[1]},{\"id\":\"circle-x\",\"label\":\"Cross circle\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m15 9-6 6\",\"m9 9 6 6\"],\"inner\":[1,2]},{\"id\":\"triangle-alert\",\"label\":\"Warning\",\"set\":\"line\",\"paths\":[\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\"M12 9v4\",\"M12 17h.01\"],\"inner\":[1,2]},{\"id\":\"info\",\"label\":\"Info\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M12 16v-4\",\"M12 8h.01\"],\"inner\":[1,2]},{\"id\":\"circle-question-mark\",\"label\":\"Question\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\",\"M12 17h.01\"],\"inner\":[1,2]},{\"id\":\"ban\",\"label\":\"Ban\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M4.929 4.929 19.07 19.071\"],\"inner\":[1]},{\"id\":\"heart\",\"label\":\"Heart\",\"set\":\"line\",\"paths\":[\"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\"]},{\"id\":\"star\",\"label\":\"Star\",\"set\":\"line\",\"paths\":[\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\"]},{\"id\":\"sparkles\",\"label\":\"Sparkles\",\"set\":\"line\",\"paths\":[\"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\",\"M20 2v4\",\"M22 4h-4\",\"M2 20a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"inner\":[1,2,3]},{\"id\":\"flame\",\"label\":\"Fire\",\"set\":\"line\",\"paths\":[\"M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4\"]},{\"id\":\"zap\",\"label\":\"Bolt\",\"set\":\"line\",\"paths\":[\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\"]},{\"id\":\"crown\",\"label\":\"Crown\",\"set\":\"line\",\"paths\":[\"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z\",\"M5 21h14\"],\"open\":[1]},{\"id\":\"trophy\",\"label\":\"Trophy\",\"set\":\"line\",\"paths\":[\"M10 14.66v1.626a2 2 0 0 1-.976 1.696A5 5 0 0 0 7 21.978\",\"M14 14.66v1.626a2 2 0 0 0 .976 1.696A5 5 0 0 1 17 21.978\",\"M18 9h1.5a1 1 0 0 0 0-5H18\",\"M4 22h16\",\"M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z\",\"M6 9H4.5a1 1 0 0 1 0-5H6\"],\"open\":[0,1,2,3,5]},{\"id\":\"medal\",\"label\":\"Medal\",\"set\":\"line\",\"paths\":[\"M7.21 15 2.66 7.14a2 2 0 0 1 .13-2.2L4.4 2.8A2 2 0 0 1 6 2h12a2 2 0 0 1 1.6.8l1.6 2.14a2 2 0 0 1 .14 2.2L16.79 15\",\"M11 12 5.12 2.2\",\"m13 12 5.88-9.8\",\"M8 7h8\",\"M7 17a5 5 0 1 0 10 0a5 5 0 1 0 -10 0Z\",\"M12 18v-2h-.5\"],\"inner\":[5],\"open\":[0,1,2,3]},{\"id\":\"award\",\"label\":\"Award\",\"set\":\"line\",\"paths\":[\"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526\",\"M6 8a6 6 0 1 0 12 0a6 6 0 1 0 -12 0Z\"],\"open\":[0]},{\"id\":\"gem\",\"label\":\"Gem\",\"set\":\"line\",\"paths\":[\"M10.5 3 8 9l4 13 4-13-2.5-6\",\"M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z\",\"M2 9h20\"],\"inner\":[0,2]},{\"id\":\"party-popper\",\"label\":\"Party\",\"set\":\"line\",\"paths\":[\"M5.8 11.3 2 22l10.7-3.79\",\"M4 3h.01\",\"M22 8h.01\",\"M15 2h.01\",\"M22 20h.01\",\"m22 2-2.24.75a2.9 2.9 0 0 0-1.96 3.12c.1.86-.57 1.63-1.45 1.63h-.38c-.86 0-1.6.6-1.76 1.44L14 10\",\"m22 13-.82-.33c-.86-.34-1.82.2-1.98 1.11c-.11.7-.72 1.22-1.43 1.22H17\",\"m11 2 .33.82c.34.86-.2 1.82-1.11 1.98C9.52 4.9 9 5.52 9 6.23V7\",\"M11 13c1.93 1.93 2.83 4.17 2 5-.83.83-3.07-.07-5-2-1.93-1.93-2.83-4.17-2-5 .83-.83 3.07.07 5 2Z\"],\"open\":[0,1,2,3,4,5,6,7,8]},{\"id\":\"gift\",\"label\":\"Gift\",\"set\":\"line\",\"paths\":[\"M12 7v14\",\"M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8\",\"M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5\",\"M4 7h16a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-16a1 1 0 0 1 -1 -1v-2a1 1 0 0 1 1 -1Z\"],\"open\":[0,1,2]},{\"id\":\"smile\",\"label\":\"Smile\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M8 14s1.5 2 4 2 4-2 4-2\",\"M9 9L9.01 9\",\"M15 9L15.01 9\"],\"inner\":[1,2,3]},{\"id\":\"laugh\",\"label\":\"Laugh\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M18 13a6 6 0 0 1-6 5 6 6 0 0 1-6-5h12Z\",\"M9 9L9.01 9\",\"M15 9L15.01 9\"],\"inner\":[1,2,3]},{\"id\":\"frown\",\"label\":\"Sad\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M16 16s-1.5-2-4-2-4 2-4 2\",\"M9 9L9.01 9\",\"M15 9L15.01 9\"],\"inner\":[1,2,3]},{\"id\":\"angry\",\"label\":\"Angry\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M16 16s-1.5-2-4-2-4 2-4 2\",\"M7.5 8 10 9\",\"m14 9 2.5-1\",\"M9 10h.01\",\"M15 10h.01\"],\"inner\":[1,2,3,4,5]},{\"id\":\"skull\",\"label\":\"Skull\",\"set\":\"line\",\"paths\":[\"m12.5 17-.5-1-.5 1h1z\",\"M15 22a1 1 0 0 0 1-1v-1a2 2 0 0 0 1.56-3.25 8 8 0 1 0-11.12 0A2 2 0 0 0 8 20v1a1 1 0 0 0 1 1z\",\"M14 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M8 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\"],\"inner\":[0,2,3]},{\"id\":\"ghost\",\"label\":\"Ghost\",\"set\":\"line\",\"paths\":[\"M9 10h.01\",\"M15 10h.01\",\"M12 2a8 8 0 0 0-8 8v12l3-3 2.5 2.5L12 19l2.5 2.5L17 19l3 3V10a8 8 0 0 0-8-8z\"],\"inner\":[0,1]},{\"id\":\"hand\",\"label\":\"Wave\",\"set\":\"line\",\"paths\":[\"M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2\",\"M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2\",\"M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8\",\"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\"],\"open\":[0,1,2,3]},{\"id\":\"hand-heart\",\"label\":\"Hand heart\",\"set\":\"line\",\"paths\":[\"M11 14h2a2 2 0 0 0 0-4h-3c-.6 0-1.1.2-1.4.6L3 16\",\"m14.45 13.39 5.05-4.694C20.196 8 21 6.85 21 5.75a2.75 2.75 0 0 0-4.797-1.837.276.276 0 0 1-.406 0A2.75 2.75 0 0 0 11 5.75c0 1.2.802 2.248 1.5 2.946L16 11.95\",\"m2 15 6 6\",\"m7 20 1.6-1.4c.3-.4.8-.6 1.4-.6h4c1.1 0 2.1-.4 2.8-1.2l4.6-4.4a1 1 0 0 0-2.75-2.91\"],\"open\":[0,1,2,3]},{\"id\":\"handshake\",\"label\":\"Handshake\",\"set\":\"line\",\"paths\":[\"m11 17 2 2a1 1 0 1 0 3-3\",\"m14 14 2.5 2.5a1 1 0 1 0 3-3l-3.88-3.88a3 3 0 0 0-4.24 0l-.88.88a1 1 0 1 1-3-3l2.81-2.81a5.79 5.79 0 0 1 7.06-.87l.47.28a2 2 0 0 0 1.42.25L21 4\",\"m21 3 1 11h-2\",\"M3 3 2 14l6.5 6.5a1 1 0 1 0 3-3\",\"M3 4h8\"],\"open\":[0,1,2,3,4]},{\"id\":\"user\",\"label\":\"User\",\"set\":\"line\",\"paths\":[\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\",\"M8 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\"],\"open\":[0]},{\"id\":\"users\",\"label\":\"Users\",\"set\":\"line\",\"paths\":[\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\"M16 3.128a4 4 0 0 1 0 7.744\",\"M22 21v-2a4 4 0 0 0-3-3.87\",\"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\"],\"open\":[0,1,2]},{\"id\":\"user-plus\",\"label\":\"Add user\",\"set\":\"line\",\"paths\":[\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\",\"M19 8L19 14\",\"M22 11L16 11\"],\"open\":[0,2,3]},{\"id\":\"user-minus\",\"label\":\"Remove user\",\"set\":\"line\",\"paths\":[\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\",\"M22 11L16 11\"],\"open\":[0,2]},{\"id\":\"user-check\",\"label\":\"Verified user\",\"set\":\"line\",\"paths\":[\"m16 11 2 2 4-4\",\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\"],\"open\":[0,1]},{\"id\":\"user-x\",\"label\":\"Blocked user\",\"set\":\"line\",\"paths\":[\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\",\"M17 8L22 13\",\"M22 8L17 13\"],\"open\":[0,2,3]},{\"id\":\"user-round\",\"label\":\"Person\",\"set\":\"line\",\"paths\":[\"M7 8a5 5 0 1 0 10 0a5 5 0 1 0 -10 0Z\",\"M20 21a8 8 0 0 0-16 0\"],\"open\":[1]},{\"id\":\"contact\",\"label\":\"Contact\",\"set\":\"line\",\"paths\":[\"M16 2v2\",\"M7 22v-2a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v2\",\"M8 2v2\",\"M9 11a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\"],\"inner\":[1,3],\"open\":[0,2]},{\"id\":\"megaphone\",\"label\":\"Announcement\",\"set\":\"line\",\"paths\":[\"M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z\",\"M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14\",\"M8 6v8\"],\"inner\":[2],\"open\":[1]},{\"id\":\"bell\",\"label\":\"Bell\",\"set\":\"line\",\"paths\":[\"M10.268 21a2 2 0 0 0 3.464 0\",\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\"],\"open\":[0]},{\"id\":\"bell-ring\",\"label\":\"Ping\",\"set\":\"line\",\"paths\":[\"M10.268 21a2 2 0 0 0 3.464 0\",\"M22 8c0-2.3-.8-4.3-2-6\",\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\",\"M4 2C2.8 3.7 2 5.7 2 8\"],\"open\":[0,1,3]},{\"id\":\"message-circle\",\"label\":\"Message\",\"set\":\"line\",\"paths\":[\"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719\"]},{\"id\":\"messages-square\",\"label\":\"Chat\",\"set\":\"line\",\"paths\":[\"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\",\"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1\"],\"open\":[1]},{\"id\":\"mail\",\"label\":\"Mail\",\"set\":\"line\",\"paths\":[\"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7\",\"M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2Z\"],\"inner\":[0]},{\"id\":\"send\",\"label\":\"Send\",\"set\":\"line\",\"paths\":[\"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\",\"m21.854 2.147-10.94 10.939\"],\"inner\":[1]},{\"id\":\"at-sign\",\"label\":\"Mention\",\"set\":\"line\",\"paths\":[\"M8 12a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\",\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8\"],\"open\":[1]},{\"id\":\"hash\",\"label\":\"Channel\",\"set\":\"line\",\"paths\":[\"M4 9L20 9\",\"M4 15L20 15\",\"M10 3L8 21\",\"M16 3L14 21\"],\"open\":[0,1,2,3]},{\"id\":\"mic\",\"label\":\"Mic\",\"set\":\"line\",\"paths\":[\"M12 19v3\",\"M19 10v2a7 7 0 0 1-14 0v-2\",\"M12 2h0a3 3 0 0 1 3 3v7a3 3 0 0 1 -3 3h0a3 3 0 0 1 -3 -3v-7a3 3 0 0 1 3 -3Z\"],\"open\":[0,1]},{\"id\":\"headphones\",\"label\":\"Headphones\",\"set\":\"line\",\"paths\":[\"M3 14h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a9 9 0 0 1 18 0v7a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3\"],\"open\":[0]},{\"id\":\"volume-2\",\"label\":\"Volume\",\"set\":\"line\",\"paths\":[\"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\",\"M16 9a5 5 0 0 1 0 6\",\"M19.364 18.364a9 9 0 0 0 0-12.728\"],\"open\":[1,2]},{\"id\":\"calendar\",\"label\":\"Calendar\",\"set\":\"line\",\"paths\":[\"M8 2v4\",\"M16 2v4\",\"M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"M3 10h18\"],\"inner\":[3],\"open\":[0,1]},{\"id\":\"calendar-days\",\"label\":\"Events\",\"set\":\"line\",\"paths\":[\"M8 2v4\",\"M16 2v4\",\"M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"M3 10h18\",\"M8 14h.01\",\"M12 14h.01\",\"M16 14h.01\",\"M8 18h.01\",\"M12 18h.01\",\"M16 18h.01\"],\"inner\":[3,4,5,6,7,8,9],\"open\":[0,1]},{\"id\":\"clock\",\"label\":\"Clock\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M12 6v6l4 2\"],\"inner\":[1]},{\"id\":\"timer\",\"label\":\"Timer\",\"set\":\"line\",\"paths\":[\"M10 2L14 2\",\"M12 14L15 11\",\"M4 14a8 8 0 1 0 16 0a8 8 0 1 0 -16 0Z\"],\"inner\":[1],\"open\":[0]},{\"id\":\"hourglass\",\"label\":\"Hourglass\",\"set\":\"line\",\"paths\":[\"M5 22h14\",\"M5 2h14\",\"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22\",\"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2\"],\"open\":[0,1,2,3]},{\"id\":\"pin\",\"label\":\"Pin\",\"set\":\"line\",\"paths\":[\"M12 17v5\",\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\"],\"open\":[0]},{\"id\":\"bookmark\",\"label\":\"Bookmark\",\"set\":\"line\",\"paths\":[\"M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z\"]},{\"id\":\"flag\",\"label\":\"Flag\",\"set\":\"line\",\"paths\":[\"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\"],\"open\":[0]},{\"id\":\"link\",\"label\":\"Link\",\"set\":\"line\",\"paths\":[\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\",\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"],\"open\":[0,1]},{\"id\":\"paperclip\",\"label\":\"Attachment\",\"set\":\"line\",\"paths\":[\"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\"],\"open\":[0]},{\"id\":\"image\",\"label\":\"Image\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"M7 9a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"],\"inner\":[1,2]},{\"id\":\"camera\",\"label\":\"Camera\",\"set\":\"line\",\"paths\":[\"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z\",\"M9 13a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"inner\":[1]},{\"id\":\"video\",\"label\":\"Video\",\"set\":\"line\",\"paths\":[\"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\",\"M4 6h10a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-8a2 2 0 0 1 2 -2Z\"],\"open\":[0]},{\"id\":\"music\",\"label\":\"Music\",\"set\":\"line\",\"paths\":[\"M9 18V5l12-2v13\",\"M3 18a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M15 16a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"open\":[0]},{\"id\":\"book-open\",\"label\":\"Rules\",\"set\":\"line\",\"paths\":[\"M12 7v14\",\"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"],\"inner\":[0]},{\"id\":\"scroll-text\",\"label\":\"Scroll\",\"set\":\"line\",\"paths\":[\"M15 12h-5\",\"M15 8h-5\",\"M19 17V5a2 2 0 0 0-2-2H4\",\"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\"],\"open\":[0,1,2,3]},{\"id\":\"file-text\",\"label\":\"Document\",\"set\":\"line\",\"paths\":[\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\"M14 2v5a1 1 0 0 0 1 1h5\",\"M10 9H8\",\"M16 13H8\",\"M16 17H8\"],\"inner\":[1,2,3,4]},{\"id\":\"clipboard-list\",\"label\":\"Checklist\",\"set\":\"line\",\"paths\":[\"M9 2h6a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-6a1 1 0 0 1 -1 -1v-2a1 1 0 0 1 1 -1Z\",\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\"M12 11h4\",\"M12 16h4\",\"M8 11h.01\",\"M8 16h.01\"],\"open\":[1,2,3]},{\"id\":\"newspaper\",\"label\":\"News\",\"set\":\"line\",\"paths\":[\"M15 18h-5\",\"M18 14h-8\",\"M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-4 0v-9a2 2 0 0 1 2-2h2\",\"M11 6h6a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-6a1 1 0 0 1 -1 -1v-2a1 1 0 0 1 1 -1Z\"],\"open\":[0,1,2]},{\"id\":\"lightbulb\",\"label\":\"Idea\",\"set\":\"line\",\"paths\":[\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\",\"M9 18h6\",\"M10 22h4\"],\"open\":[0,1,2]},{\"id\":\"rocket\",\"label\":\"Rocket\",\"set\":\"line\",\"paths\":[\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\",\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09\",\"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z\",\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\"],\"open\":[0,1,2,3]},{\"id\":\"globe\",\"label\":\"Globe\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\",\"M2 12h20\"],\"open\":[0,1,2]},{\"id\":\"map-pin\",\"label\":\"Location\",\"set\":\"line\",\"paths\":[\"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\",\"M9 10a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"inner\":[1]},{\"id\":\"house\",\"label\":\"Home\",\"set\":\"line\",\"paths\":[\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\",\"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"],\"inner\":[0]},{\"id\":\"shield\",\"label\":\"Shield\",\"set\":\"line\",\"paths\":[\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"]},{\"id\":\"shield-check\",\"label\":\"Verified\",\"set\":\"line\",\"paths\":[\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\"m9 12 2 2 4-4\"],\"inner\":[1]},{\"id\":\"shield-alert\",\"label\":\"Security\",\"set\":\"line\",\"paths\":[\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\"M12 8v4\",\"M12 16h.01\"],\"inner\":[1,2]},{\"id\":\"lock\",\"label\":\"Lock\",\"set\":\"line\",\"paths\":[\"M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-7a2 2 0 0 1 2 -2Z\",\"M7 11V7a5 5 0 0 1 10 0v4\"],\"open\":[1]},{\"id\":\"lock-open\",\"label\":\"Unlock\",\"set\":\"line\",\"paths\":[\"M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-7a2 2 0 0 1 2 -2Z\",\"M7 11V7a5 5 0 0 1 9.9-1\"],\"open\":[1]},{\"id\":\"key-round\",\"label\":\"Key\",\"set\":\"line\",\"paths\":[\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\",\"M16 7.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\"],\"inner\":[1]},{\"id\":\"eye\",\"label\":\"Eye\",\"set\":\"line\",\"paths\":[\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\"M9 12a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"inner\":[1]},{\"id\":\"eye-off\",\"label\":\"Hidden\",\"set\":\"line\",\"paths\":[\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\"M14.084 14.158a3 3 0 0 1-4.242-4.242\",\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\"m2 2 20 20\"],\"open\":[0,1,2,3]},{\"id\":\"gavel\",\"label\":\"Gavel\",\"set\":\"line\",\"paths\":[\"m14 13-8.381 8.38a1 1 0 0 1-3.001-3l8.384-8.381\",\"m16 16 6-6\",\"m21.5 10.5-8-8\",\"m8 8 6-6\",\"m8.5 7.5 8 8\"],\"open\":[0,1,2,3,4]},{\"id\":\"scale\",\"label\":\"Scale\",\"set\":\"line\",\"paths\":[\"M12 3v18\",\"m19 8 3 8a5 5 0 0 1-6 0zV7\",\"M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1\",\"m5 8 3 8a5 5 0 0 1-6 0zV7\",\"M7 21h10\"],\"open\":[0,2,4]},{\"id\":\"siren\",\"label\":\"Siren\",\"set\":\"line\",\"paths\":[\"M7 18v-6a5 5 0 1 1 10 0v6\",\"M5 21a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-1a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2z\",\"M21 12h1\",\"M18.5 4.5 18 5\",\"M2 12h1\",\"M12 2v1\",\"m4.929 4.929.707.707\",\"M12 12v6\"],\"open\":[0,2,3,4,5,6,7]},{\"id\":\"bug\",\"label\":\"Bug\",\"set\":\"line\",\"paths\":[\"M12 20v-9\",\"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z\",\"M14.12 3.88 16 2\",\"M21 21a4 4 0 0 0-3.81-4\",\"M21 5a4 4 0 0 1-3.55 3.97\",\"M22 13h-4\",\"M3 21a4 4 0 0 1 3.81-4\",\"M3 5a4 4 0 0 0 3.55 3.97\",\"M6 13H2\",\"m8 2 1.88 1.88\",\"M9 7.13V6a3 3 0 1 1 6 0v1.13\"],\"inner\":[0],\"open\":[2,3,4,5,6,7,8,9,10]},{\"id\":\"bot\",\"label\":\"Bot\",\"set\":\"line\",\"paths\":[\"M12 8V4H8\",\"M6 8h12a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-8a2 2 0 0 1 2 -2Z\",\"M2 14h2\",\"M20 14h2\",\"M15 13v2\",\"M9 13v2\"],\"inner\":[4,5],\"open\":[0,2,3]},{\"id\":\"cpu\",\"label\":\"CPU\",\"set\":\"line\",\"paths\":[\"M12 20v2\",\"M12 2v2\",\"M17 20v2\",\"M17 2v2\",\"M2 12h2\",\"M2 17h2\",\"M2 7h2\",\"M20 12h2\",\"M20 17h2\",\"M20 7h2\",\"M7 20v2\",\"M7 2v2\",\"M6 4h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2Z\",\"M9 8h6a1 1 0 0 1 1 1v6a1 1 0 0 1 -1 1h-6a1 1 0 0 1 -1 -1v-6a1 1 0 0 1 1 -1Z\"],\"inner\":[13],\"open\":[0,1,2,3,4,5,6,7,8,9,10,11]},{\"id\":\"server\",\"label\":\"Server\",\"set\":\"line\",\"paths\":[\"M4 2h16a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-4a2 2 0 0 1 2 -2Z\",\"M4 14h16a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-4a2 2 0 0 1 2 -2Z\",\"M6 6L6.01 6\",\"M6 18L6.01 18\"],\"inner\":[2,3]},{\"id\":\"code\",\"label\":\"Code\",\"set\":\"line\",\"paths\":[\"m16 18 6-6-6-6\",\"m8 6-6 6 6 6\"],\"open\":[0,1]},{\"id\":\"terminal\",\"label\":\"Terminal\",\"set\":\"line\",\"paths\":[\"M12 19h8\",\"m4 17 6-6-6-6\"],\"open\":[0,1]},{\"id\":\"wrench\",\"label\":\"Wrench\",\"set\":\"line\",\"paths\":[\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z\"]},{\"id\":\"hammer\",\"label\":\"Hammer\",\"set\":\"line\",\"paths\":[\"m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9\",\"m18 15 4-4\",\"m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172v-.344a2 2 0 0 0-.586-1.414l-1.657-1.657A6 6 0 0 0 12.516 3H9l1.243 1.243A6 6 0 0 1 12 8.485V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5\"],\"open\":[0,1,2]},{\"id\":\"settings\",\"label\":\"Settings\",\"set\":\"line\",\"paths\":[\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\",\"M9 12a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"inner\":[1]},{\"id\":\"sliders-horizontal\",\"label\":\"Sliders\",\"set\":\"line\",\"paths\":[\"M10 5H3\",\"M12 19H3\",\"M14 3v4\",\"M16 17v4\",\"M21 12h-9\",\"M21 19h-5\",\"M21 5h-7\",\"M8 10v4\",\"M8 12H3\"],\"open\":[0,1,2,3,4,5,6,7,8]},{\"id\":\"pencil\",\"label\":\"Pencil\",\"set\":\"line\",\"paths\":[\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\"m15 5 4 4\"],\"inner\":[1]},{\"id\":\"brush\",\"label\":\"Brush\",\"set\":\"line\",\"paths\":[\"m11 10 3 3\",\"M6.5 21A3.5 3.5 0 1 0 3 17.5a2.62 2.62 0 0 1-.708 1.792A1 1 0 0 0 3 21z\",\"M9.969 17.031 21.378 5.624a1 1 0 0 0-3.002-3.002L6.967 14.031\"],\"open\":[0,2]},{\"id\":\"palette\",\"label\":\"Palette\",\"set\":\"line\",\"paths\":[\"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z\",\"M13 6.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"M17 10.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"M6 12.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"M8 7.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\"],\"inner\":[1,2,4]},{\"id\":\"trash-2\",\"label\":\"Trash\",\"set\":\"line\",\"paths\":[\"M10 11v6\",\"M14 11v6\",\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\",\"M3 6h18\",\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"],\"open\":[0,1,2,3,4]},{\"id\":\"search\",\"label\":\"Search\",\"set\":\"line\",\"paths\":[\"m21 21-4.34-4.34\",\"M3 11a8 8 0 1 0 16 0a8 8 0 1 0 -16 0Z\"],\"open\":[0]},{\"id\":\"funnel\",\"label\":\"Filter\",\"set\":\"line\",\"paths\":[\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\"]},{\"id\":\"list\",\"label\":\"List\",\"set\":\"line\",\"paths\":[\"M3 5h.01\",\"M3 12h.01\",\"M3 19h.01\",\"M8 5h13\",\"M8 12h13\",\"M8 19h13\"],\"open\":[3,4,5]},{\"id\":\"layout-grid\",\"label\":\"Grid\",\"set\":\"line\",\"paths\":[\"M4 3h5a1 1 0 0 1 1 1v5a1 1 0 0 1 -1 1h-5a1 1 0 0 1 -1 -1v-5a1 1 0 0 1 1 -1Z\",\"M15 3h5a1 1 0 0 1 1 1v5a1 1 0 0 1 -1 1h-5a1 1 0 0 1 -1 -1v-5a1 1 0 0 1 1 -1Z\",\"M15 14h5a1 1 0 0 1 1 1v5a1 1 0 0 1 -1 1h-5a1 1 0 0 1 -1 -1v-5a1 1 0 0 1 1 -1Z\",\"M4 14h5a1 1 0 0 1 1 1v5a1 1 0 0 1 -1 1h-5a1 1 0 0 1 -1 -1v-5a1 1 0 0 1 1 -1Z\"]},{\"id\":\"folder\",\"label\":\"Folder\",\"set\":\"line\",\"paths\":[\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"]},{\"id\":\"download\",\"label\":\"Download\",\"set\":\"line\",\"paths\":[\"M12 15V3\",\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\",\"m7 10 5 5 5-5\"],\"open\":[0,1,2]},{\"id\":\"upload\",\"label\":\"Upload\",\"set\":\"line\",\"paths\":[\"M12 3v12\",\"m17 8-5-5-5 5\",\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"],\"open\":[0,1,2]},{\"id\":\"refresh-cw\",\"label\":\"Refresh\",\"set\":\"line\",\"paths\":[\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\",\"M21 3v5h-5\",\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\",\"M8 16H3v5\"],\"open\":[0,1,2,3]},{\"id\":\"power\",\"label\":\"Power\",\"set\":\"line\",\"paths\":[\"M12 2v10\",\"M18.4 6.6a9 9 0 1 1-12.77.04\"],\"open\":[0,1]},{\"id\":\"log-in\",\"label\":\"Join\",\"set\":\"line\",\"paths\":[\"m10 17 5-5-5-5\",\"M15 12H3\",\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\"],\"open\":[0,1,2]},{\"id\":\"log-out\",\"label\":\"Leave\",\"set\":\"line\",\"paths\":[\"m16 17 5-5-5-5\",\"M21 12H9\",\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"],\"open\":[0,1,2]},{\"id\":\"arrow-right\",\"label\":\"Arrow right\",\"set\":\"line\",\"paths\":[\"M5 12h14\",\"m12 5 7 7-7 7\"],\"open\":[0,1]},{\"id\":\"arrow-left\",\"label\":\"Arrow left\",\"set\":\"line\",\"paths\":[\"m12 19-7-7 7-7\",\"M19 12H5\"],\"open\":[0,1]},{\"id\":\"arrow-up\",\"label\":\"Arrow up\",\"set\":\"line\",\"paths\":[\"m5 12 7-7 7 7\",\"M12 19V5\"],\"open\":[0,1]},{\"id\":\"arrow-down\",\"label\":\"Arrow down\",\"set\":\"line\",\"paths\":[\"M12 5v14\",\"m19 12-7 7-7-7\"],\"open\":[0,1]},{\"id\":\"arrow-up-right\",\"label\":\"Arrow up right\",\"set\":\"line\",\"paths\":[\"M7 7h10v10\",\"M7 17 17 7\"],\"open\":[0,1]},{\"id\":\"arrow-down-right\",\"label\":\"Arrow down right\",\"set\":\"line\",\"paths\":[\"m7 7 10 10\",\"M17 7v10H7\"],\"open\":[0,1]},{\"id\":\"arrow-up-left\",\"label\":\"Arrow up left\",\"set\":\"line\",\"paths\":[\"M7 17V7h10\",\"M17 17 7 7\"],\"open\":[0,1]},{\"id\":\"arrow-down-left\",\"label\":\"Arrow down left\",\"set\":\"line\",\"paths\":[\"M17 7 7 17\",\"M17 17H7V7\"],\"open\":[0,1]},{\"id\":\"arrow-big-right\",\"label\":\"Big arrow right\",\"set\":\"line\",\"paths\":[\"M11 9a1 1 0 0 0 1-1V5.061a1 1 0 0 1 1.811-.75l6.836 6.836a1.207 1.207 0 0 1 0 1.707l-6.836 6.835a1 1 0 0 1-1.811-.75V16a1 1 0 0 0-1-1H5a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1z\"]},{\"id\":\"arrow-big-left\",\"label\":\"Big arrow left\",\"set\":\"line\",\"paths\":[\"M13 9a1 1 0 0 1-1-1V5.061a1 1 0 0 0-1.811-.75l-6.835 6.836a1.207 1.207 0 0 0 0 1.707l6.835 6.835a1 1 0 0 0 1.811-.75V16a1 1 0 0 1 1-1h6a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1z\"]},{\"id\":\"arrow-big-up\",\"label\":\"Big arrow up\",\"set\":\"line\",\"paths\":[\"M9 13a1 1 0 0 0-1-1H5.061a1 1 0 0 1-.75-1.811l6.836-6.835a1.207 1.207 0 0 1 1.707 0l6.835 6.835a1 1 0 0 1-.75 1.811H16a1 1 0 0 0-1 1v6a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1z\"]},{\"id\":\"arrow-big-down\",\"label\":\"Big arrow down\",\"set\":\"line\",\"paths\":[\"M15 11a1 1 0 0 0 1 1h2.939a1 1 0 0 1 .75 1.811l-6.835 6.836a1.207 1.207 0 0 1-1.707 0L4.31 13.81a1 1 0 0 1 .75-1.811H8a1 1 0 0 0 1-1V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1z\"]},{\"id\":\"circle-arrow-right\",\"label\":\"Circle arrow right\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m12 16 4-4-4-4\",\"M8 12h8\"],\"inner\":[1,2]},{\"id\":\"circle-arrow-left\",\"label\":\"Circle arrow left\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m12 8-4 4 4 4\",\"M16 12H8\"],\"inner\":[1,2]},{\"id\":\"circle-arrow-up\",\"label\":\"Circle arrow up\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m16 12-4-4-4 4\",\"M12 16V8\"],\"inner\":[1,2]},{\"id\":\"circle-arrow-down\",\"label\":\"Circle arrow down\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M12 8v8\",\"m8 12 4 4 4-4\"],\"inner\":[1,2]},{\"id\":\"arrow-up-down\",\"label\":\"Arrows up down\",\"set\":\"line\",\"paths\":[\"m21 16-4 4-4-4\",\"M17 20V4\",\"m3 8 4-4 4 4\",\"M7 4v16\"],\"open\":[0,1,2,3]},{\"id\":\"arrow-right-to-line\",\"label\":\"Arrow to line\",\"set\":\"line\",\"paths\":[\"M17 12H3\",\"m11 18 6-6-6-6\",\"M21 5v14\"],\"open\":[0,1,2]},{\"id\":\"arrow-down-to-line\",\"label\":\"Arrow down to line\",\"set\":\"line\",\"paths\":[\"M12 17V3\",\"m6 11 6 6 6-6\",\"M19 21H5\"],\"open\":[0,1,2]},{\"id\":\"arrow-up-from-line\",\"label\":\"Arrow up from line\",\"set\":\"line\",\"paths\":[\"m18 9-6-6-6 6\",\"M12 3v14\",\"M5 21h14\"],\"open\":[0,1,2]},{\"id\":\"square-arrow-out-up-right\",\"label\":\"Open in new\",\"set\":\"line\",\"paths\":[\"M21 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h6\",\"m21 3-9 9\",\"M15 3h6v6\"],\"open\":[0,1,2]},{\"id\":\"corner-down-right\",\"label\":\"Corner down right\",\"set\":\"line\",\"paths\":[\"m15 10 5 5-5 5\",\"M4 4v7a4 4 0 0 0 4 4h12\"],\"open\":[0,1]},{\"id\":\"corner-up-right\",\"label\":\"Corner up right\",\"set\":\"line\",\"paths\":[\"m15 14 5-5-5-5\",\"M4 20v-7a4 4 0 0 1 4-4h12\"],\"open\":[0,1]},{\"id\":\"corner-down-left\",\"label\":\"Corner down left\",\"set\":\"line\",\"paths\":[\"M20 4v7a4 4 0 0 1-4 4H4\",\"m9 10-5 5 5 5\"],\"open\":[0,1]},{\"id\":\"corner-up-left\",\"label\":\"Corner up left\",\"set\":\"line\",\"paths\":[\"M20 20v-7a4 4 0 0 0-4-4H4\",\"M9 14 4 9l5-5\"],\"open\":[0,1]},{\"id\":\"move\",\"label\":\"Move\",\"set\":\"line\",\"paths\":[\"M12 2v20\",\"m15 19-3 3-3-3\",\"m19 9 3 3-3 3\",\"M2 12h20\",\"m5 9-3 3 3 3\",\"m9 5 3-3 3 3\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"move-right\",\"label\":\"Long arrow right\",\"set\":\"line\",\"paths\":[\"M18 8L22 12L18 16\",\"M2 12H22\"],\"open\":[0,1]},{\"id\":\"move-up-right\",\"label\":\"Long arrow up right\",\"set\":\"line\",\"paths\":[\"M13 5H19V11\",\"M19 5L5 19\"],\"open\":[0,1]},{\"id\":\"move-horizontal\",\"label\":\"Arrows left right\",\"set\":\"line\",\"paths\":[\"m18 8 4 4-4 4\",\"M2 12h20\",\"m6 8-4 4 4 4\"],\"open\":[0,1,2]},{\"id\":\"move-vertical\",\"label\":\"Arrows up down long\",\"set\":\"line\",\"paths\":[\"M12 2v20\",\"m8 18 4 4 4-4\",\"m8 6 4-4 4 4\"],\"open\":[0,1,2]},{\"id\":\"move-diagonal\",\"label\":\"Arrows diagonal\",\"set\":\"line\",\"paths\":[\"M11 19H5v-6\",\"M13 5h6v6\",\"M19 5 5 19\"],\"open\":[0,1,2]},{\"id\":\"maximize-2\",\"label\":\"Expand\",\"set\":\"line\",\"paths\":[\"M15 3h6v6\",\"m21 3-7 7\",\"m3 21 7-7\",\"M9 21H3v-6\"],\"open\":[0,1,2,3]},{\"id\":\"minimize-2\",\"label\":\"Collapse\",\"set\":\"line\",\"paths\":[\"m14 10 7-7\",\"M20 10h-6V4\",\"m3 21 7-7\",\"M4 14h6v6\"],\"open\":[0,1,2,3]},{\"id\":\"rotate-cw\",\"label\":\"Rotate\",\"set\":\"line\",\"paths\":[\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\",\"M21 3v5h-5\"],\"open\":[0,1]},{\"id\":\"rotate-ccw\",\"label\":\"Rotate back\",\"set\":\"line\",\"paths\":[\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\",\"M3 3v5h5\"],\"open\":[0,1]},{\"id\":\"iteration-cw\",\"label\":\"Loop\",\"set\":\"line\",\"paths\":[\"M4 10a8 8 0 1 1 8 8H4\",\"m8 22-4-4 4-4\"],\"open\":[0,1]},{\"id\":\"shuffle\",\"label\":\"Shuffle\",\"set\":\"line\",\"paths\":[\"m18 14 4 4-4 4\",\"m18 2 4 4-4 4\",\"M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22\",\"M2 6h1.972a4 4 0 0 1 3.6 2.2\",\"M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45\"],\"open\":[0,1,2,3,4]},{\"id\":\"repeat-2\",\"label\":\"Repeat arrows\",\"set\":\"line\",\"paths\":[\"m2 9 3-3 3 3\",\"M13 18H7a2 2 0 0 1-2-2V6\",\"m22 15-3 3-3-3\",\"M11 6h6a2 2 0 0 1 2 2v10\"],\"open\":[0,1,2,3]},{\"id\":\"forward\",\"label\":\"Forward\",\"set\":\"line\",\"paths\":[\"m15 17 5-5-5-5\",\"M4 18v-2a4 4 0 0 1 4-4h12\"],\"open\":[0,1]},{\"id\":\"reply\",\"label\":\"Reply\",\"set\":\"line\",\"paths\":[\"M20 18v-2a4 4 0 0 0-4-4H4\",\"m9 17-5-5 5-5\"],\"open\":[0,1]},{\"id\":\"share-2\",\"label\":\"Share\",\"set\":\"line\",\"paths\":[\"M15 5a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M3 12a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M15 19a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M8.59 13.51L15.42 17.49\",\"M15.41 6.51L8.59 10.49\"],\"open\":[3,4]},{\"id\":\"split\",\"label\":\"Split\",\"set\":\"line\",\"paths\":[\"M16 3h5v5\",\"M8 3H3v5\",\"M12 22v-8.3a4 4 0 0 0-1.172-2.872L3 3\",\"m15 9 6-6\"],\"open\":[0,1,2,3]},{\"id\":\"merge\",\"label\":\"Merge\",\"set\":\"line\",\"paths\":[\"m8 6 4-4 4 4\",\"M12 2v10.3a4 4 0 0 1-1.172 2.872L4 22\",\"m20 22-5-5\"],\"open\":[0,1,2]},{\"id\":\"chevron-right\",\"label\":\"Chevron right\",\"set\":\"line\",\"paths\":[\"m9 18 6-6-6-6\"],\"open\":[0]},{\"id\":\"chevron-left\",\"label\":\"Chevron left\",\"set\":\"line\",\"paths\":[\"m15 18-6-6 6-6\"],\"open\":[0]},{\"id\":\"chevron-up\",\"label\":\"Chevron up\",\"set\":\"line\",\"paths\":[\"m18 15-6-6-6 6\"],\"open\":[0]},{\"id\":\"chevron-down\",\"label\":\"Chevron down\",\"set\":\"line\",\"paths\":[\"m6 9 6 6 6-6\"],\"open\":[0]},{\"id\":\"chevrons-right\",\"label\":\"Next\",\"set\":\"line\",\"paths\":[\"m6 17 5-5-5-5\",\"m13 17 5-5-5-5\"],\"open\":[0,1]},{\"id\":\"chevrons-left\",\"label\":\"Back\",\"set\":\"line\",\"paths\":[\"m11 17-5-5 5-5\",\"m18 17-5-5 5-5\"],\"open\":[0,1]},{\"id\":\"chevrons-up\",\"label\":\"Double up\",\"set\":\"line\",\"paths\":[\"m17 11-5-5-5 5\",\"m17 18-5-5-5 5\"],\"open\":[0,1]},{\"id\":\"chevrons-down\",\"label\":\"Double down\",\"set\":\"line\",\"paths\":[\"m7 6 5 5 5-5\",\"m7 13 5 5 5-5\"],\"open\":[0,1]},{\"id\":\"circle-chevron-right\",\"label\":\"Circle chevron\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m10 8 4 4-4 4\"],\"inner\":[1]},{\"id\":\"mouse-pointer-click\",\"label\":\"Click\",\"set\":\"line\",\"paths\":[\"M14 4.1 12 6\",\"m5.1 8-2.9-.8\",\"m6 12-1.9 2\",\"M7.2 2.2 8 5.1\",\"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z\"],\"open\":[0,1,2,3]},{\"id\":\"pointer\",\"label\":\"Pointer\",\"set\":\"line\",\"paths\":[\"M22 14a8 8 0 0 1-8 8\",\"M18 11v-1a2 2 0 0 0-2-2a2 2 0 0 0-2 2\",\"M14 10V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1\",\"M10 9.5V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v10\",\"M18 11a2 2 0 1 1 4 0v3a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\"],\"open\":[0,1,2,3,4]},{\"id\":\"spline\",\"label\":\"Curve\",\"set\":\"line\",\"paths\":[\"M17 5a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M3 19a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M5 17A12 12 0 0 1 17 5\"],\"open\":[2]},{\"id\":\"route\",\"label\":\"Route\",\"set\":\"line\",\"paths\":[\"M3 19a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15\",\"M15 5a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"open\":[1]},{\"id\":\"waypoints\",\"label\":\"Waypoints\",\"set\":\"line\",\"paths\":[\"m10.586 5.414-5.172 5.172\",\"m18.586 13.414-5.172 5.172\",\"M6 12h12\",\"M10 20a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M10 4a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M18 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M2 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"open\":[0,1,2]},{\"id\":\"git-branch\",\"label\":\"Branch\",\"set\":\"line\",\"paths\":[\"M15 6a9 9 0 0 0-9 9V3\",\"M15 6a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M3 18a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"open\":[0]},{\"id\":\"git-merge\",\"label\":\"Git merge\",\"set\":\"line\",\"paths\":[\"M15 18a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M3 6a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\",\"M6 21V9a9 9 0 0 0 9 9\"],\"open\":[2]},{\"id\":\"workflow\",\"label\":\"Workflow\",\"set\":\"line\",\"paths\":[\"M5 3h4a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-4a2 2 0 0 1 -2 -2v-4a2 2 0 0 1 2 -2Z\",\"M7 11v4a2 2 0 0 0 2 2h4\",\"M15 13h4a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-4a2 2 0 0 1 -2 -2v-4a2 2 0 0 1 2 -2Z\"],\"open\":[1]},{\"id\":\"milestone\",\"label\":\"Milestone\",\"set\":\"line\",\"paths\":[\"M12 13v8\",\"M12 3v3\",\"M4 6a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h13a2 2 0 0 0 1.152-.365l3.424-2.317a1 1 0 0 0 0-1.635l-3.424-2.318A2 2 0 0 0 17 6z\"],\"open\":[0,1]},{\"id\":\"signpost\",\"label\":\"Signpost\",\"set\":\"line\",\"paths\":[\"M12 13v8\",\"M12 3v3\",\"M18 6a2 2 0 0 1 1.387.56l2.307 2.22a1 1 0 0 1 0 1.44l-2.307 2.22A2 2 0 0 1 18 13H6a2 2 0 0 1-1.387-.56l-2.306-2.22a1 1 0 0 1 0-1.44l2.306-2.22A2 2 0 0 1 6 6z\"],\"open\":[0,1]},{\"id\":\"waves\",\"label\":\"Waves\",\"set\":\"line\",\"paths\":[\"M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\",\"M2 12c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\",\"M2 18c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\"],\"open\":[0,1,2]},{\"id\":\"audio-lines\",\"label\":\"Sound lines\",\"set\":\"line\",\"paths\":[\"M2 10v3\",\"M6 6v11\",\"M10 3v18\",\"M14 8v7\",\"M18 5v13\",\"M22 10v3\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"chart-spline\",\"label\":\"Spline chart\",\"set\":\"line\",\"paths\":[\"M3 3v16a2 2 0 0 0 2 2h16\",\"M7 16c.5-2 1.5-7 4-7 2 0 2 3 4 3 2.5 0 4.5-5 5-7\"],\"open\":[0,1]},{\"id\":\"separator-horizontal\",\"label\":\"Divider\",\"set\":\"line\",\"paths\":[\"m16 16-4 4-4-4\",\"M3 12h18\",\"m8 8 4-4 4 4\"],\"open\":[0,1,2]},{\"id\":\"grip-horizontal\",\"label\":\"Grip\",\"set\":\"line\",\"paths\":[\"M11 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M18 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M4 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M11 15a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M18 15a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M4 15a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\"]},{\"id\":\"ellipsis\",\"label\":\"Dots\",\"set\":\"line\",\"paths\":[\"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\"]},{\"id\":\"ellipsis-vertical\",\"label\":\"Dots vertical\",\"set\":\"line\",\"paths\":[\"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M11 5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M11 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\"]},{\"id\":\"slash\",\"label\":\"Slash\",\"set\":\"line\",\"paths\":[\"M22 2 2 22\"],\"open\":[0]},{\"id\":\"equal\",\"label\":\"Equal\",\"set\":\"line\",\"paths\":[\"M5 9L19 9\",\"M5 15L19 15\"],\"open\":[0,1]},{\"id\":\"asterisk\",\"label\":\"Asterisk\",\"set\":\"line\",\"paths\":[\"M12 6v12\",\"M17.196 9 6.804 15\",\"m6.804 9 10.392 6\"],\"open\":[0,1,2]},{\"id\":\"infinity\",\"label\":\"Infinity\",\"set\":\"line\",\"paths\":[\"M6 16c5 0 7-8 12-8a4 4 0 0 1 0 8c-5 0-7-8-12-8a4 4 0 1 0 0 8\"],\"open\":[0]},{\"id\":\"circle-plus\",\"label\":\"Plus circle\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M8 12h8\",\"M12 8v8\"],\"inner\":[1,2]},{\"id\":\"circle-minus\",\"label\":\"Minus circle\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M8 12h8\"],\"inner\":[1]},{\"id\":\"square-check\",\"label\":\"Check square\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"m9 12 2 2 4-4\"],\"inner\":[1]},{\"id\":\"square-x\",\"label\":\"Cross square\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"m15 9-6 6\",\"m9 9 6 6\"],\"inner\":[1,2]},{\"id\":\"hand-metal\",\"label\":\"Rock on\",\"set\":\"line\",\"paths\":[\"M18 12.5V10a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1.4\",\"M14 11V9a2 2 0 1 0-4 0v2\",\"M10 10.5V5a2 2 0 1 0-4 0v9\",\"m7 15-1.76-1.76a2 2 0 0 0-2.83 2.82l3.6 3.6C7.5 21.14 9.2 22 12 22h2a8 8 0 0 0 8-8V7a2 2 0 1 0-4 0v5\"],\"open\":[0,1,2,3]},{\"id\":\"undo-2\",\"label\":\"Undo\",\"set\":\"line\",\"paths\":[\"M9 14 4 9l5-5\",\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\"],\"open\":[0,1]},{\"id\":\"redo-2\",\"label\":\"Redo\",\"set\":\"line\",\"paths\":[\"m15 14 5-5-5-5\",\"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\"],\"open\":[0,1]},{\"id\":\"external-link\",\"label\":\"Open\",\"set\":\"line\",\"paths\":[\"M15 3h6v6\",\"M10 14 21 3\",\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"],\"open\":[0,1,2]},{\"id\":\"plus\",\"label\":\"Plus\",\"set\":\"line\",\"paths\":[\"M5 12h14\",\"M12 5v14\"],\"open\":[0,1]},{\"id\":\"minus\",\"label\":\"Minus\",\"set\":\"line\",\"paths\":[\"M5 12h14\"],\"open\":[0]},{\"id\":\"circle-dot\",\"label\":\"Dot\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\"],\"inner\":[1]},{\"id\":\"circle\",\"label\":\"Circle\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\"]},{\"id\":\"square\",\"label\":\"Square\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\"]},{\"id\":\"triangle\",\"label\":\"Triangle\",\"set\":\"line\",\"paths\":[\"M13.73 4a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\"]},{\"id\":\"hexagon\",\"label\":\"Hexagon\",\"set\":\"line\",\"paths\":[\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"]},{\"id\":\"badge-check\",\"label\":\"Badge\",\"set\":\"line\",\"paths\":[\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\",\"m9 12 2 2 4-4\"],\"inner\":[1]},{\"id\":\"ticket\",\"label\":\"Ticket\",\"set\":\"line\",\"paths\":[\"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z\",\"M13 5v2\",\"M13 17v2\",\"M13 11v2\"],\"inner\":[1,2,3]},{\"id\":\"tag\",\"label\":\"Tag\",\"set\":\"line\",\"paths\":[\"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\",\"M7 7.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\"],\"inner\":[1]},{\"id\":\"tags\",\"label\":\"Tags\",\"set\":\"line\",\"paths\":[\"M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z\",\"M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193\",\"M10 6.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\"],\"inner\":[2],\"open\":[1]},{\"id\":\"percent\",\"label\":\"Percent\",\"set\":\"line\",\"paths\":[\"M19 5L5 19\",\"M4 6.5a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0 -5 0Z\",\"M15 17.5a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0 -5 0Z\"],\"open\":[0]},{\"id\":\"sticker\",\"label\":\"Sticker\",\"set\":\"line\",\"paths\":[\"M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z\",\"M15 3v5a1 1 0 0 0 1 1h5\",\"M8 13h.01\",\"M16 13h.01\",\"M10 16s.8 1 2 1c1.3 0 2-1 2-1\"],\"inner\":[1,2,3,4]},{\"id\":\"dice-5\",\"label\":\"Dice\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"M16 8h.01\",\"M8 8h.01\",\"M8 16h.01\",\"M16 16h.01\",\"M12 12h.01\"],\"inner\":[1,2,3,4,5]},{\"id\":\"gamepad-2\",\"label\":\"Gamepad\",\"set\":\"line\",\"paths\":[\"M6 11L10 11\",\"M8 9L8 13\",\"M15 12L15.01 12\",\"M18 10L18.01 10\",\"M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z\"],\"inner\":[0,1,2,3]},{\"id\":\"swords\",\"label\":\"Swords\",\"set\":\"line\",\"paths\":[\"M14.5 17.5L3 6L3 3L6 3L17.5 14.5\",\"M13 19L19 13\",\"M16 16L20 20\",\"M19 21L21 19\",\"M14.5 6.5L18 3L21 3L21 6L17.5 9.5\",\"M5 14L9 18\",\"M7 17L4 20\",\"M3 19L5 21\"],\"open\":[0,1,2,3,4,5,6,7]},{\"id\":\"sword\",\"label\":\"Sword\",\"set\":\"line\",\"paths\":[\"m11 19-6-6\",\"m5 21-2-2\",\"m8 16-4 4\",\"M9.5 17.5 21 6V3h-3L6.5 14.5\"],\"open\":[0,1,2,3]},{\"id\":\"target\",\"label\":\"Target\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M6 12a6 6 0 1 0 12 0a6 6 0 1 0 -12 0Z\",\"M10 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"inner\":[1,2]},{\"id\":\"puzzle\",\"label\":\"Puzzle\",\"set\":\"line\",\"paths\":[\"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z\"]},{\"id\":\"chart-bar\",\"label\":\"Chart\",\"set\":\"line\",\"paths\":[\"M3 3v16a2 2 0 0 0 2 2h16\",\"M7 16h8\",\"M7 11h12\",\"M7 6h3\"],\"open\":[0,1,2,3]},{\"id\":\"chart-line\",\"label\":\"Trend\",\"set\":\"line\",\"paths\":[\"M3 3v16a2 2 0 0 0 2 2h16\",\"m19 9-5 5-4-4-3 3\"],\"open\":[0,1]},{\"id\":\"trending-up\",\"label\":\"Trending up\",\"set\":\"line\",\"paths\":[\"M16 7h6v6\",\"m22 7-8.5 8.5-5-5L2 17\"],\"open\":[0,1]},{\"id\":\"trending-down\",\"label\":\"Trending down\",\"set\":\"line\",\"paths\":[\"M16 17h6v-6\",\"m22 17-8.5-8.5-5 5L2 7\"],\"open\":[0,1]},{\"id\":\"activity\",\"label\":\"Activity\",\"set\":\"line\",\"paths\":[\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\"],\"open\":[0]},{\"id\":\"sun\",\"label\":\"Sun\",\"set\":\"line\",\"paths\":[\"M8 12a4 4 0 1 0 8 0a4 4 0 1 0 -8 0Z\",\"M12 2v2\",\"M12 20v2\",\"m4.93 4.93 1.41 1.41\",\"m17.66 17.66 1.41 1.41\",\"M2 12h2\",\"M20 12h2\",\"m6.34 17.66-1.41 1.41\",\"m19.07 4.93-1.41 1.41\"],\"open\":[1,2,3,4,5,6,7,8]},{\"id\":\"moon\",\"label\":\"Moon\",\"set\":\"line\",\"paths\":[\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"]},{\"id\":\"cloud\",\"label\":\"Cloud\",\"set\":\"line\",\"paths\":[\"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z\"]},{\"id\":\"snowflake\",\"label\":\"Snow\",\"set\":\"line\",\"paths\":[\"m10 20-1.25-2.5L6 18\",\"M10 4 8.75 6.5 6 6\",\"m14 20 1.25-2.5L18 18\",\"m14 4 1.25 2.5L18 6\",\"m17 21-3-6h-4\",\"m17 3-3 6 1.5 3\",\"M2 12h6.5L10 9\",\"m20 10-1.5 2 1.5 2\",\"M22 12h-6.5L14 15\",\"m4 10 1.5 2L4 14\",\"m7 21 3-6-1.5-3\",\"m7 3 3 6h4\"],\"open\":[0,1,2,3,4,5,6,7,8,9,10,11]},{\"id\":\"umbrella\",\"label\":\"Umbrella\",\"set\":\"line\",\"paths\":[\"M12 13v7a2 2 0 0 0 4 0\",\"M12 2v2\",\"M20.992 13a1 1 0 0 0 .97-1.274 10.284 10.284 0 0 0-19.923 0A1 1 0 0 0 3 13z\"],\"open\":[0,1,2]},{\"id\":\"leaf\",\"label\":\"Leaf\",\"set\":\"line\",\"paths\":[\"M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z\",\"M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12\"],\"open\":[1]},{\"id\":\"tree-pine\",\"label\":\"Tree\",\"set\":\"line\",\"paths\":[\"m17 14 3 3.3a1 1 0 0 1-.7 1.7H4.7a1 1 0 0 1-.7-1.7L7 14h-.3a1 1 0 0 1-.7-1.7L9 9h-.2A1 1 0 0 1 8 7.3L12 3l4 4.3a1 1 0 0 1-.8 1.7H15l3 3.3a1 1 0 0 1-.7 1.7H17Z\",\"M12 22v-3\"],\"open\":[1]},{\"id\":\"flower-2\",\"label\":\"Flower\",\"set\":\"line\",\"paths\":[\"M12 5a3 3 0 1 1 3 3m-3-3a3 3 0 1 0-3 3m3-3v1M9 8a3 3 0 1 0 3 3M9 8h1m5 0a3 3 0 1 1-3 3m3-3h-1m-2 3v-1\",\"M10 8a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M12 10v12\",\"M12 22c4.2 0 7-1.667 7-5-4.2 0-7 1.667-7 5Z\",\"M12 22c-4.2 0-7-1.667-7-5 4.2 0 7 1.667 7 5Z\"],\"open\":[0,2]},{\"id\":\"paw-print\",\"label\":\"Paw\",\"set\":\"line\",\"paths\":[\"M9 4a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M16 8a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M18 16a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M9 10a5 5 0 0 1 5 5v3.5a3.5 3.5 0 0 1-6.84 1.045Q6.52 17.48 4.46 16.84A3.5 3.5 0 0 1 5.5 10Z\"]},{\"id\":\"dog\",\"label\":\"Dog\",\"set\":\"line\",\"paths\":[\"M11.25 16.25h1.5L12 17z\",\"M16 14v.5\",\"M4.42 11.247A13.152 13.152 0 0 0 4 14.556C4 18.728 7.582 21 12 21s8-2.272 8-6.444a11.702 11.702 0 0 0-.493-3.309\",\"M8 14v.5\",\"M8.5 8.5c-.384 1.05-1.083 2.028-2.344 2.5-1.931.722-3.576-.297-3.656-1-.113-.994 1.177-6.53 4-7 1.923-.321 3.651.845 3.651 2.235A7.497 7.497 0 0 1 14 5.277c0-1.39 1.844-2.598 3.767-2.277 2.823.47 4.113 6.006 4 7-.08.703-1.725 1.722-3.656 1-1.261-.472-1.855-1.45-2.239-2.5\"],\"open\":[1,2,3,4]},{\"id\":\"cat\",\"label\":\"Cat\",\"set\":\"line\",\"paths\":[\"M12 5c.67 0 1.35.09 2 .26 1.78-2 5.03-2.84 6.42-2.26 1.4.58-.42 7-.42 7 .57 1.07 1 2.24 1 3.44C21 17.9 16.97 21 12 21s-9-3-9-7.56c0-1.25.5-2.4 1-3.44 0 0-1.89-6.42-.5-7 1.39-.58 4.72.23 6.5 2.23A9.04 9.04 0 0 1 12 5Z\",\"M8 14v.5\",\"M16 14v.5\",\"M11.25 16.25h1.5L12 17l-.75-.75Z\"],\"inner\":[1,2,3]},{\"id\":\"fish\",\"label\":\"Fish\",\"set\":\"line\",\"paths\":[\"M6.5 12c.94-3.46 4.94-6 8.5-6 3.56 0 6.06 2.54 7 6-.94 3.47-3.44 6-7 6s-7.56-2.53-8.5-6Z\",\"M18 12v.5\",\"M16 17.93a9.77 9.77 0 0 1 0-11.86\",\"M7 10.67C7 8 5.58 5.97 2.73 5.5c-1 1.5-1 5 .23 6.5-1.24 1.5-1.24 5-.23 6.5C5.58 18.03 7 16 7 13.33\",\"M10.46 7.26C10.2 5.88 9.17 4.24 8 3h5.8a2 2 0 0 1 1.98 1.67l.23 1.4\",\"m16.01 17.93-.23 1.4A2 2 0 0 1 13.8 21H9.5a5.96 5.96 0 0 0 1.49-3.98\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"bird\",\"label\":\"Bird\",\"set\":\"line\",\"paths\":[\"M16 7h.01\",\"M3.4 18H12a8 8 0 0 0 8-8V7a4 4 0 0 0-7.28-2.3L2 20\",\"m20 7 2 .5-2 .5\",\"M10 18v3\",\"M14 17.75V21\",\"M7 18a6 6 0 0 0 3.84-10.61\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"pizza\",\"label\":\"Pizza\",\"set\":\"line\",\"paths\":[\"m12 14-1 1\",\"m13.75 18.25-1.25 1.42\",\"M17.775 5.654a15.68 15.68 0 0 0-12.121 12.12\",\"M18.8 9.3a1 1 0 0 0 2.1 7.7\",\"M21.964 20.732a1 1 0 0 1-1.232 1.232l-18-5a1 1 0 0 1-.695-1.232A19.68 19.68 0 0 1 15.732 2.037a1 1 0 0 1 1.232.695z\"],\"open\":[0,1,2,3,4]},{\"id\":\"coffee\",\"label\":\"Coffee\",\"set\":\"line\",\"paths\":[\"M10 2v2\",\"M14 2v2\",\"M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1\",\"M6 2v2\"],\"open\":[0,1,2,3]},{\"id\":\"cake\",\"label\":\"Cake\",\"set\":\"line\",\"paths\":[\"M20 21v-8a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8\",\"M4 16s.5-1 2-1 2.5 2 4 2 2.5-2 4-2 2.5 2 4 2 2-1 2-1\",\"M2 21h20\",\"M7 8v3\",\"M12 8v3\",\"M17 8v3\",\"M7 4h.01\",\"M12 4h.01\",\"M17 4h.01\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"beer\",\"label\":\"Beer\",\"set\":\"line\",\"paths\":[\"M17 11h1a3 3 0 0 1 0 6h-1\",\"M9 12v6\",\"M13 12v6\",\"M14 7.5c-1 0-1.44.5-3 .5s-2-.5-3-.5-1.72.5-2.5.5a2.5 2.5 0 0 1 0-5c.78 0 1.57.5 2.5.5S9.44 2 11 2s2 1.5 3 1.5 1.72-.5 2.5-.5a2.5 2.5 0 0 1 0 5c-.78 0-1.5-.5-2.5-.5Z\",\"M5 8v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V8\"],\"open\":[0,1,2,4]},{\"id\":\"car\",\"label\":\"Car\",\"set\":\"line\",\"paths\":[\"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2\",\"M5 17a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M9 17h6\",\"M15 17a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"open\":[0,1,2,3]},{\"id\":\"plane\",\"label\":\"Plane\",\"set\":\"line\",\"paths\":[\"M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.1-1.1.5l-.3.5c-.2.5-.1 1 .3 1.3L9 12l-2 3H4l-1 1 3 2 2 3 1-1v-3l3-2 3.5 5.3c.3.4.8.5 1.3.3l.5-.2c.4-.3.6-.7.5-1.2z\"]},{\"id\":\"ship\",\"label\":\"Ship\",\"set\":\"line\",\"paths\":[\"M12 10.189V14\",\"M12 2v3\",\"M19 13V7a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v6\",\"M19.38 20A11.6 11.6 0 0 0 21 14l-8.188-3.639a2 2 0 0 0-1.624 0L3 14a11.6 11.6 0 0 0 2.81 7.76\",\"M2 21c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1s1.2 1 2.5 1c2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\"],\"open\":[0,1,2,3,4]},{\"id\":\"anchor\",\"label\":\"Anchor\",\"set\":\"line\",\"paths\":[\"M12 6v16\",\"m19 13 2-1a9 9 0 0 1-18 0l2 1\",\"M9 11h6\",\"M10 4a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"open\":[0,1,2]},{\"id\":\"mountain\",\"label\":\"Mountain\",\"set\":\"line\",\"paths\":[\"m8 3 4 8 5-5 5 15H2L8 3z\"]},{\"id\":\"tent\",\"label\":\"Tent\",\"set\":\"line\",\"paths\":[\"M3.5 21 14 3\",\"M20.5 21 10 3\",\"M15.5 21 12 15l-3.5 6\",\"M2 21h20\"],\"open\":[0,1,2,3]},{\"id\":\"compass\",\"label\":\"Compass\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z\"],\"inner\":[1]},{\"id\":\"map\",\"label\":\"Map\",\"set\":\"line\",\"paths\":[\"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z\",\"M15 5.764v15\",\"M9 3.236v15\"],\"inner\":[1,2]},{\"id\":\"phone\",\"label\":\"Phone\",\"set\":\"line\",\"paths\":[\"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384\"]},{\"id\":\"smartphone\",\"label\":\"Smartphone\",\"set\":\"line\",\"paths\":[\"M7 2h10a2 2 0 0 1 2 2v16a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-16a2 2 0 0 1 2 -2Z\",\"M12 18h.01\"],\"inner\":[1]},{\"id\":\"laptop\",\"label\":\"Laptop\",\"set\":\"line\",\"paths\":[\"M18 5a2 2 0 0 1 2 2v8.526a2 2 0 0 0 .212.897l1.068 2.127a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45l1.068-2.127A2 2 0 0 0 4 15.526V7a2 2 0 0 1 2-2z\",\"M20.054 15.987H3.946\"],\"inner\":[1]},{\"id\":\"monitor\",\"label\":\"Monitor\",\"set\":\"line\",\"paths\":[\"M4 3h16a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2Z\",\"M8 21L16 21\",\"M12 17L12 21\"],\"open\":[1,2]},{\"id\":\"keyboard\",\"label\":\"Keyboard\",\"set\":\"line\",\"paths\":[\"M10 8h.01\",\"M12 12h.01\",\"M14 8h.01\",\"M16 12h.01\",\"M18 8h.01\",\"M6 8h.01\",\"M7 16h10\",\"M8 12h.01\",\"M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2Z\"],\"inner\":[0,1,2,3,4,5,6,7]},{\"id\":\"mouse\",\"label\":\"Mouse\",\"set\":\"line\",\"paths\":[\"M12 2h0a7 7 0 0 1 7 7v6a7 7 0 0 1 -7 7h0a7 7 0 0 1 -7 -7v-6a7 7 0 0 1 7 -7Z\",\"M12 6v4\"],\"inner\":[1]},{\"id\":\"wifi\",\"label\":\"Wi-Fi\",\"set\":\"line\",\"paths\":[\"M12 20h.01\",\"M2 8.82a15 15 0 0 1 20 0\",\"M5 12.859a10 10 0 0 1 14 0\",\"M8.5 16.429a5 5 0 0 1 7 0\"],\"open\":[1,2,3]},{\"id\":\"battery-full\",\"label\":\"Battery\",\"set\":\"line\",\"paths\":[\"M10 10v4\",\"M14 10v4\",\"M22 14v-4\",\"M6 10v4\",\"M4 6h12a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-8a2 2 0 0 1 2 -2Z\"],\"inner\":[0,1,3],\"open\":[2]},{\"id\":\"plug\",\"label\":\"Plug\",\"set\":\"line\",\"paths\":[\"M12 22v-5\",\"M15 8V2\",\"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z\",\"M9 8V2\"],\"open\":[0,1,3]},{\"id\":\"magnet\",\"label\":\"Magnet\",\"set\":\"line\",\"paths\":[\"m12 15 4 4\",\"M2.352 10.648a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l6.029-6.029a1 1 0 1 1 3 3l-6.029 6.029a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l6.365-6.367A1 1 0 0 0 8.716 4.282z\",\"m5 8 4 4\"],\"open\":[0,1,2]},{\"id\":\"atom\",\"label\":\"Atom\",\"set\":\"line\",\"paths\":[\"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M20.2 20.2c2.04-2.03.02-7.36-4.5-11.9-4.54-4.52-9.87-6.54-11.9-4.5-2.04 2.03-.02 7.36 4.5 11.9 4.54 4.52 9.87 6.54 11.9 4.5Z\",\"M15.7 15.7c4.52-4.54 6.54-9.87 4.5-11.9-2.03-2.04-7.36-.02-11.9 4.5-4.52 4.54-6.54 9.87-4.5 11.9 2.03 2.04 7.36.02 11.9-4.5Z\"],\"open\":[0,1,2]},{\"id\":\"flask-conical\",\"label\":\"Flask\",\"set\":\"line\",\"paths\":[\"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2\",\"M6.453 15h11.094\",\"M8.5 2h7\"],\"open\":[0,1,2]},{\"id\":\"dna\",\"label\":\"DNA\",\"set\":\"line\",\"paths\":[\"m10 16 1.5 1.5\",\"m14 8-1.5-1.5\",\"M15 2c-1.798 1.998-2.518 3.995-2.807 5.993\",\"m16.5 10.5 1 1\",\"m17 6-2.891-2.891\",\"M2 15c6.667-6 13.333 0 20-6\",\"m20 9 .891.891\",\"M3.109 14.109 4 15\",\"m6.5 12.5 1 1\",\"m7 18 2.891 2.891\",\"M9 22c1.798-1.998 2.518-3.995 2.807-5.993\"],\"open\":[0,1,2,3,4,5,6,7,8,9,10]},{\"id\":\"pill\",\"label\":\"Pill\",\"set\":\"line\",\"paths\":[\"m10.5 20.5 10-10a4.95 4.95 0 1 0-7-7l-10 10a4.95 4.95 0 1 0 7 7Z\",\"m8.5 8.5 7 7\"],\"inner\":[1]},{\"id\":\"syringe\",\"label\":\"Syringe\",\"set\":\"line\",\"paths\":[\"m18 2 4 4\",\"m17 7 3-3\",\"M19 9 8.7 19.3c-1 1-2.5 1-3.4 0l-.6-.6c-1-1-1-2.5 0-3.4L15 5\",\"m9 11 4 4\",\"m5 19-3 3\",\"m14 4 6 6\"],\"open\":[0,1,2,3,4,5]},{\"id\":\"heart-pulse\",\"label\":\"Health\",\"set\":\"line\",\"paths\":[\"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\",\"M3.22 13H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27\"],\"inner\":[1]},{\"id\":\"dumbbell\",\"label\":\"Gym\",\"set\":\"line\",\"paths\":[\"M17.596 12.768a2 2 0 1 0 2.829-2.829l-1.768-1.767a2 2 0 0 0 2.828-2.829l-2.828-2.828a2 2 0 0 0-2.829 2.828l-1.767-1.768a2 2 0 1 0-2.829 2.829z\",\"m2.5 21.5 1.4-1.4\",\"m20.1 3.9 1.4-1.4\",\"M5.343 21.485a2 2 0 1 0 2.829-2.828l1.767 1.768a2 2 0 1 0 2.829-2.829l-6.364-6.364a2 2 0 1 0-2.829 2.829l1.768 1.767a2 2 0 0 0-2.828 2.829z\",\"m9.6 14.4 4.8-4.8\"],\"inner\":[1,2],\"open\":[4]},{\"id\":\"bike\",\"label\":\"Bike\",\"set\":\"line\",\"paths\":[\"M15 17.5a3.5 3.5 0 1 0 7 0a3.5 3.5 0 1 0 -7 0Z\",\"M2 17.5a3.5 3.5 0 1 0 7 0a3.5 3.5 0 1 0 -7 0Z\",\"M14 5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M12 17.5V14l-3-3 4-3 2 3h2\"],\"open\":[0,1,2,3]},{\"id\":\"graduation-cap\",\"label\":\"Graduation\",\"set\":\"line\",\"paths\":[\"M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z\",\"M22 10v6\",\"M6 12.5V16a6 3 0 0 0 12 0v-3.5\"],\"inner\":[1],\"open\":[2]},{\"id\":\"school\",\"label\":\"School\",\"set\":\"line\",\"paths\":[\"M14 21v-3a2 2 0 0 0-4 0v3\",\"M18 5v16\",\"m4 6 7.106-3.79a2 2 0 0 1 1.788 0L20 6\",\"m6 11-3.52 2.147a1 1 0 0 0-.48.854V19a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5a1 1 0 0 0-.48-.853L18 11\",\"M6 5v16\",\"M10 9a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"open\":[0,1,2,3,4]},{\"id\":\"briefcase\",\"label\":\"Briefcase\",\"set\":\"line\",\"paths\":[\"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\",\"M4 6h16a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2Z\"],\"open\":[0]},{\"id\":\"building-2\",\"label\":\"Building\",\"set\":\"line\",\"paths\":[\"M10 12h4\",\"M10 8h4\",\"M14 21v-3a2 2 0 0 0-4 0v3\",\"M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2\",\"M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16\"],\"open\":[0,1,2,3,4]},{\"id\":\"landmark\",\"label\":\"Bank\",\"set\":\"line\",\"paths\":[\"M10 18v-7\",\"M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z\",\"M14 18v-7\",\"M18 18v-7\",\"M3 22h18\",\"M6 18v-7\"],\"open\":[0,2,3,4,5]},{\"id\":\"store\",\"label\":\"Store\",\"set\":\"line\",\"paths\":[\"M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5\",\"M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244\",\"M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05\"],\"open\":[0,2]},{\"id\":\"shopping-cart\",\"label\":\"Cart\",\"set\":\"line\",\"paths\":[\"M7 21a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M18 21a1 1 0 1 0 2 0a1 1 0 1 0 -2 0Z\",\"M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12\"],\"open\":[2]},{\"id\":\"shopping-bag\",\"label\":\"Bag\",\"set\":\"line\",\"paths\":[\"M16 10a4 4 0 0 1-8 0\",\"M3.103 6.034h17.794\",\"M3.4 5.467a2 2 0 0 0-.4 1.2V20a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.667a2 2 0 0 0-.4-1.2l-2-2.667A2 2 0 0 0 17 2H7a2 2 0 0 0-1.6.8z\"],\"inner\":[0,1]},{\"id\":\"shopping-basket\",\"label\":\"Basket\",\"set\":\"line\",\"paths\":[\"m15 11-1 9\",\"m19 11-4-7\",\"M2 11h20\",\"m3.5 11 1.6 7.4a2 2 0 0 0 2 1.6h9.8a2 2 0 0 0 2-1.6l1.7-7.4\",\"M4.5 15.5h15\",\"m5 11 4-7\",\"m9 11 1 9\"],\"open\":[0,1,2,3,4,5,6]},{\"id\":\"package\",\"label\":\"Package\",\"set\":\"line\",\"paths\":[\"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\",\"M12 22V12\",\"M3.29 7L12 12L20.71 7\",\"m7.5 4.27 9 5.15\"],\"inner\":[1,2,3]},{\"id\":\"truck\",\"label\":\"Delivery\",\"set\":\"line\",\"paths\":[\"M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2\",\"M15 18H9\",\"M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14\",\"M15 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M5 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"open\":[0,1,2]},{\"id\":\"credit-card\",\"label\":\"Card\",\"set\":\"line\",\"paths\":[\"M4 5h16a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2Z\",\"M2 10L22 10\"],\"inner\":[1]},{\"id\":\"wallet\",\"label\":\"Wallet\",\"set\":\"line\",\"paths\":[\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\",\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\"],\"open\":[0,1]},{\"id\":\"banknote\",\"label\":\"Banknote\",\"set\":\"line\",\"paths\":[\"M4 6h16a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-8a2 2 0 0 1 2 -2Z\",\"M10 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\",\"M6 12h.01M18 12h.01\"],\"inner\":[1,2]},{\"id\":\"coins\",\"label\":\"Coins\",\"set\":\"line\",\"paths\":[\"M13.744 17.736a6 6 0 1 1-7.48-7.48\",\"M15 6h1v4\",\"m6.134 14.768.866-.5 2 3.464\",\"M10 8a6 6 0 1 0 12 0a6 6 0 1 0 -12 0Z\"],\"open\":[0,1,2,3]},{\"id\":\"piggy-bank\",\"label\":\"Piggy bank\",\"set\":\"line\",\"paths\":[\"M11 17h3v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-3a3.16 3.16 0 0 0 2-2h1a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1h-1a5 5 0 0 0-2-4V3a4 4 0 0 0-3.2 1.6l-.3.4H11a6 6 0 0 0-6 6v1a5 5 0 0 0 2 4v3a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1z\",\"M16 10h.01\",\"M2 8v1a2 2 0 0 0 2 2h1\"],\"inner\":[1,2]},{\"id\":\"hand-coins\",\"label\":\"Pay\",\"set\":\"line\",\"paths\":[\"M11 15h2a2 2 0 1 0 0-4h-3c-.6 0-1.1.2-1.4.6L3 17\",\"m7 21 1.6-1.4c.3-.4.8-.6 1.4-.6h4c1.1 0 2.1-.4 2.8-1.2l4.6-4.4a2 2 0 0 0-2.75-2.91l-4.2 3.9\",\"m2 16 6 6\",\"M13.1 9a2.9 2.9 0 1 0 5.8 0a2.9 2.9 0 1 0 -5.8 0Z\",\"M3 5a3 3 0 1 0 6 0a3 3 0 1 0 -6 0Z\"],\"open\":[0,1,2,3,4]},{\"id\":\"receipt\",\"label\":\"Receipt\",\"set\":\"line\",\"paths\":[\"M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z\",\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\",\"M12 17.5v-11\"],\"inner\":[1,2]},{\"id\":\"badge-dollar-sign\",\"label\":\"Dollar badge\",\"set\":\"line\",\"paths\":[\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\",\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\",\"M12 18V6\"],\"inner\":[1,2]},{\"id\":\"badge-percent\",\"label\":\"Sale\",\"set\":\"line\",\"paths\":[\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\",\"m15 9-6 6\",\"M9 9h.01\",\"M15 15h.01\"],\"inner\":[1,2,3]},{\"id\":\"dollar-sign\",\"label\":\"Dollar\",\"set\":\"line\",\"paths\":[\"M12 2L12 22\",\"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\"],\"open\":[0,1]},{\"id\":\"euro\",\"label\":\"Euro\",\"set\":\"line\",\"paths\":[\"M4 10h12\",\"M4 14h9\",\"M19 6a7.7 7.7 0 0 0-5.2-2A7.9 7.9 0 0 0 6 12c0 4.4 3.5 8 7.8 8 2 0 3.8-.8 5.2-2\"],\"open\":[0,1,2]},{\"id\":\"pound-sterling\",\"label\":\"Pound\",\"set\":\"line\",\"paths\":[\"M18 7c0-5.333-8-5.333-8 0\",\"M10 7v14\",\"M6 21h12\",\"M6 13h10\"],\"open\":[0,1,2,3]},{\"id\":\"bitcoin\",\"label\":\"Bitcoin line\",\"set\":\"line\",\"paths\":[\"M11.767 19.089c4.924.868 6.14-6.025 1.216-6.894m-1.216 6.894L5.86 18.047m5.908 1.042-.347 1.97m1.563-8.864c4.924.869 6.14-6.025 1.215-6.893m-1.215 6.893-3.94-.694m5.155-6.2L8.29 4.26m5.908 1.042.348-1.97M7.48 20.364l3.126-17.727\"],\"open\":[0]},{\"id\":\"arrow-left-right\",\"label\":\"Exchange\",\"set\":\"line\",\"paths\":[\"M8 3 4 7l4 4\",\"M4 7h16\",\"m16 21 4-4-4-4\",\"M20 17H4\"],\"open\":[0,1,2,3]},{\"id\":\"repeat\",\"label\":\"Repeat\",\"set\":\"line\",\"paths\":[\"m17 2 4 4-4 4\",\"M3 11v-1a4 4 0 0 1 4-4h14\",\"m7 22-4-4 4-4\",\"M21 13v1a4 4 0 0 1-4 4H3\"],\"open\":[0,1,2,3]},{\"id\":\"circle-dollar-sign\",\"label\":\"Money\",\"set\":\"line\",\"paths\":[\"M2 12a10 10 0 1 0 20 0a10 10 0 1 0 -20 0Z\",\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\",\"M12 18V6\"],\"inner\":[1,2]},{\"id\":\"vault\",\"label\":\"Vault\",\"set\":\"line\",\"paths\":[\"M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2Z\",\"M7 7.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"m7.9 7.9 2.7 2.7\",\"M16 7.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"m13.4 10.6 2.7-2.7\",\"M7 16.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"m7.9 16.1 2.7-2.7\",\"M16 16.5a0.5 0.5 0 1 0 1 0a0.5 0.5 0 1 0 -1 0Z\",\"m13.4 13.4 2.7 2.7\",\"M10 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0Z\"],\"inner\":[1,2,3,4,5,6,7,8,9]},{\"id\":\"chart-candlestick\",\"label\":\"Candles\",\"set\":\"line\",\"paths\":[\"M9 5v4\",\"M8 9h2a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-4a1 1 0 0 1 1 -1Z\",\"M9 15v2\",\"M17 3v2\",\"M16 5h2a1 1 0 0 1 1 1v6a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-6a1 1 0 0 1 1 -1Z\",\"M17 13v3\",\"M3 3v16a2 2 0 0 0 2 2h16\"],\"open\":[0,2,3,5,6]},{\"id\":\"calculator\",\"label\":\"Calculator\",\"set\":\"line\",\"paths\":[\"M6 2h12a2 2 0 0 1 2 2v16a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-16a2 2 0 0 1 2 -2Z\",\"M8 6L16 6\",\"M16 14L16 18\",\"M16 10h.01\",\"M12 10h.01\",\"M8 10h.01\",\"M12 14h.01\",\"M8 14h.01\",\"M12 18h.01\",\"M8 18h.01\"],\"inner\":[1,2,3,4,5,6,7,8,9]},{\"id\":\"bt-arrow\",\"label\":\"Arrow\",\"set\":\"solid\",\"paths\":[\"M12.69 20.5C12.62 20.43 12.56 19.68 12.56 18.82L12.56 17.27L11.86 17.15C8.28 16.58 5.51 14.75 3.7 11.77C2.67 10.08 2.25 8.53 2.12 6C2.03 4.14 2.05 3.8 2.31 3.59C2.8 3.19 3.09 3.44 3.52 4.62C4.81 8.14 8.02 10.8 11.66 11.35L12.55 11.48L12.6 9.82C12.66 8.18 12.66 8.16 13.12 8.17C13.41 8.17 15.15 9.28 17.67 11.04C21.97 14.06 22.28 14.4 21.33 14.98C21.1 15.12 19.2 16.45 17.12 17.93C13.53 20.48 12.98 20.8 12.69 20.5Z\"]},{\"id\":\"bt-arrows\",\"label\":\"Double arrow\",\"set\":\"solid\",\"paths\":[\"M2.51 18.66C2.45 18.51 2.43 18.31 2.47 18.21C2.5 18.11 3.71 16.71 5.16 15.1C6.6 13.49 7.78 12.09 7.78 12C7.78 11.91 6.6 10.51 5.16 8.9C3.51 7.06 2.53 5.81 2.53 5.56C2.53 5.17 2.62 5.15 4.89 5.1L7.26 5.05L10.14 8.27C11.73 10.03 13.1 11.6 13.18 11.74C13.39 12.11 13.35 12.17 10.15 15.73L7.27 18.94L4.94 18.94C3.07 18.94 2.59 18.88 2.51 18.66ZM10.8 18.63C10.64 18.22 10.82 17.98 13.68 14.82C15.02 13.33 16.12 12.06 16.12 12C16.12 11.94 15.02 10.67 13.68 9.18C10.82 6.02 10.64 5.78 10.8 5.37C10.9 5.11 11.26 5.06 13.23 5.06L15.54 5.06L18.51 8.36C20.14 10.17 21.47 11.81 21.47 12C21.47 12.19 20.14 13.83 18.51 15.64L15.54 18.94L13.23 18.94C11.26 18.94 10.9 18.89 10.8 18.63Z\"]},{\"id\":\"bt-basket\",\"label\":\"Basket\",\"set\":\"solid\",\"paths\":[\"M5.5 20.25C5.28 20.16 5.01 19.81 4.9 19.47C4.75 18.97 3.75 13.57 3.75 13.21C3.75 13.16 3.59 13.12 3.4 13.12C2.95 13.13 2.44 12.55 2.44 12.03C2.44 11.81 2.61 11.46 2.81 11.25C3.18 10.89 3.44 10.87 12.08 10.88L20.98 10.88L21.27 11.29C21.43 11.52 21.56 11.89 21.56 12.11C21.56 12.57 21.02 13.12 20.57 13.12C20.37 13.12 20.23 13.34 20.16 13.73C19.14 19.55 19.04 19.95 18.56 20.19C18.01 20.47 6.18 20.52 5.5 20.25ZM7.3 18.11C7.62 17.73 7.36 13.76 6.99 13.39C6.65 13.06 6.48 13.06 6.2 13.39C6.04 13.58 6.03 14.19 6.16 15.74C6.37 18.13 6.7 18.83 7.3 18.11ZM10.65 18.15C10.91 17.89 10.96 13.93 10.71 13.53C10.62 13.39 10.35 13.31 10.1 13.34C9.66 13.41 9.66 13.45 9.6 15.63C9.55 17.83 9.67 18.38 10.2 18.38C10.33 18.38 10.53 18.27 10.65 18.15ZM14.23 18.11C14.38 17.94 14.43 17.11 14.4 15.63C14.34 13.45 14.34 13.41 13.9 13.34C13.65 13.31 13.38 13.39 13.29 13.53C13.04 13.93 13.09 17.89 13.35 18.15C13.65 18.45 13.97 18.43 14.23 18.11ZM17.39 18.22C17.65 18.06 18.1 14.04 17.92 13.57C17.87 13.43 17.62 13.31 17.37 13.31C16.81 13.31 16.76 13.51 16.58 16.1C16.47 17.66 16.5 18.07 16.71 18.2C17.03 18.41 17.09 18.41 17.39 18.22ZM4.88 10.07C4.88 9.45 5.83 5.73 6.09 5.33C6.56 4.6 7.21 4.3 8.4 4.24C9.14 4.2 9.64 4.08 9.84 3.87C10.28 3.43 13.96 3.42 14.2 3.85C14.31 4.04 14.75 4.17 15.56 4.23C17.57 4.37 18 4.86 18.67 7.73C19.24 10.16 19.24 10.12 18.58 10.12C18.04 10.12 18.02 10.1 17.62 8.3C17.19 6.42 16.97 5.82 16.61 5.58C16.22 5.32 14.5 5.42 14.25 5.72C13.91 6.13 10.09 6.13 9.75 5.72C9.6 5.53 9.18 5.44 8.52 5.44C7.67 5.44 7.47 5.51 7.14 5.93C6.92 6.2 6.75 6.53 6.75 6.67C6.75 6.8 6.57 7.67 6.36 8.61C5.97 10.28 5.95 10.31 5.42 10.31C5.1 10.31 4.88 10.21 4.88 10.07Z\"]},{\"id\":\"bt-bell\",\"label\":\"Bell\",\"set\":\"solid\",\"paths\":[\"M10.78 21.3C10.1 20.99 9.47 20.33 9.2 19.64L9.01 19.12L11.91 19.12C15.12 19.12 15.15 19.14 14.39 20.25C13.59 21.42 12.06 21.87 10.78 21.3ZM4.73 18.25C4.6 18.2 4.37 17.91 4.22 17.62C3.88 16.96 4.04 16.46 4.87 15.57C6.03 14.33 6.24 13.66 6.38 10.78C6.52 7.8 6.84 6.88 8.19 5.59C8.91 4.89 10.32 4.14 10.91 4.13C11.14 4.13 11.24 3.93 11.29 3.44C11.4 2.12 12.6 2.1 12.71 3.42C12.77 4.03 12.83 4.1 13.59 4.29C15.29 4.72 17.03 6.61 17.42 8.44C17.53 8.97 17.63 10.21 17.63 11.21C17.63 13.3 18.01 14.39 19.2 15.71C20 16.59 20.1 17.4 19.46 17.99C19.07 18.36 18.85 18.37 12.01 18.36C8.14 18.35 4.86 18.3 4.73 18.25ZM3.36 10.77C3.16 10.52 3.16 10.18 3.34 8.94C3.61 7.06 4.49 5.14 5.66 3.85C6.46 2.97 6.54 2.93 7.01 3.14C7.68 3.45 7.63 3.93 6.82 4.9C5.81 6.1 5.04 7.86 4.93 9.23C4.87 9.88 4.75 10.55 4.66 10.73C4.45 11.14 3.69 11.16 3.36 10.77ZM19.36 10.83C19.26 10.7 19.13 10.09 19.07 9.47C18.94 7.91 18.3 6.34 17.32 5.14C16.37 3.97 16.29 3.46 16.99 3.14C17.46 2.93 17.54 2.97 18.3 3.81C19.39 5.02 20.2 6.73 20.57 8.59C20.8 9.78 20.82 10.23 20.66 10.59C20.43 11.11 19.69 11.24 19.36 10.83Z\"]},{\"id\":\"bt-box\",\"label\":\"Box\",\"set\":\"solid\",\"paths\":[\"M7.41 19.37C5.03 18.18 3.03 17.11 2.96 16.99C2.88 16.88 2.82 14.57 2.82 11.86L2.81 6.94L4.73 5.98L6.66 5.01L11.01 7.24L15.37 9.47L15.37 11.86C15.37 13.38 15.45 14.25 15.57 14.25C15.68 14.25 16.18 14.04 16.69 13.78L17.62 13.31L17.62 10.88L17.62 8.46L13.32 6.24C10.95 5.03 9.01 3.98 9 3.93C9 3.87 9.68 3.49 10.51 3.09L12.02 2.35L16.6 4.65L21.19 6.94L21.18 11.86C21.18 14.57 21.12 16.88 21.04 17C20.88 17.25 12.22 21.57 11.91 21.55C11.81 21.55 9.78 20.57 7.41 19.37Z\"]},{\"id\":\"bt-calendar\",\"label\":\"Calendar\",\"set\":\"solid\",\"paths\":[\"M4.95 20.17C4.63 20.03 4.31 19.77 4.25 19.6C4.18 19.42 4.12 17.09 4.12 14.42L4.12 9.56L12.09 9.56L20.06 9.56L20.06 14.02C20.06 18.98 19.95 19.73 19.13 20.16C18.36 20.55 5.85 20.56 4.95 20.17ZM8.59 18.15C8.71 18.03 8.81 17.57 8.81 17.13C8.81 16.53 8.72 16.28 8.45 16.13C7.91 15.84 7.01 15.9 6.67 16.23C6.33 16.57 6.28 17.48 6.57 18.01C6.71 18.28 6.96 18.38 7.56 18.38C8 18.38 8.46 18.27 8.59 18.15ZM12.9 18.15C13.19 17.86 13.19 16.45 12.9 16.16C12.78 16.04 12.37 15.94 12 15.94C11.13 15.94 10.88 16.21 10.88 17.16C10.88 17.58 10.98 18.03 11.1 18.15C11.39 18.44 12.61 18.44 12.9 18.15ZM17.43 18.01C17.72 17.48 17.67 16.57 17.33 16.23C16.99 15.9 16.09 15.84 15.55 16.13C15.28 16.28 15.19 16.53 15.19 17.13C15.19 17.57 15.29 18.03 15.41 18.15C15.54 18.27 16 18.38 16.44 18.38C17.04 18.38 17.29 18.28 17.43 18.01ZM8.52 13.77C8.87 13.42 8.91 12.17 8.59 11.85C8.46 11.73 8 11.62 7.56 11.62C6.67 11.62 6.38 11.94 6.38 12.91C6.38 13.89 7.82 14.47 8.52 13.77ZM12.76 13.87C13.03 13.72 13.12 13.47 13.12 12.87C13.12 12.43 13.02 11.97 12.9 11.85C12.61 11.56 11.39 11.56 11.1 11.85C10.74 12.21 10.82 13.63 11.2 13.86C11.63 14.11 12.31 14.11 12.76 13.87ZM17.21 13.77C17.66 13.45 17.77 12.62 17.43 11.99C17.29 11.72 17.04 11.62 16.44 11.62C16 11.62 15.54 11.73 15.41 11.85C15.09 12.17 15.13 13.42 15.48 13.77C15.86 14.14 16.67 14.15 17.21 13.77ZM4.12 7.23C4.12 5.75 4.16 5.63 4.62 5.26C5.4 4.65 5.93 4.75 6.08 5.53C6.23 6.31 6.79 6.75 7.64 6.75C8.4 6.75 9.19 6.04 9.19 5.35L9.19 4.88L12 4.88L14.81 4.88L14.81 5.35C14.81 6.04 15.6 6.75 16.36 6.75C17.21 6.75 17.77 6.31 17.92 5.53C18.02 4.97 18.12 4.88 18.55 4.88C18.85 4.88 19.24 5.07 19.5 5.34C19.86 5.73 19.95 6.07 20.02 7.31L20.11 8.81L12.12 8.81L4.12 8.81L4.12 7.23ZM6.94 5.64C6.64 5.07 6.72 4.35 7.12 3.94C7.58 3.49 7.76 3.47 8.14 3.86C8.49 4.2 8.54 5.45 8.21 5.78C7.87 6.12 7.16 6.04 6.94 5.64ZM15.8 5.78C15.43 5.42 15.51 4.23 15.92 3.86C16.66 3.19 17.52 4.31 17.13 5.42C16.94 5.96 16.18 6.17 15.8 5.78Z\"]},{\"id\":\"bt-cards\",\"label\":\"Cards\",\"set\":\"solid\",\"paths\":[\"M4.12 17.58C3.81 17.06 3.75 16.63 3.75 14.67L3.75 12.38L10.69 12.38L17.62 12.38L17.62 14.87C17.62 18.5 18.29 18.19 10.68 18.19L4.49 18.19L4.12 17.58ZM15.53 15.49C15.63 14.99 15.25 14.82 14.04 14.82C12.92 14.81 12.46 15.09 12.68 15.64C12.78 15.9 13.03 15.94 14.13 15.9C15.26 15.85 15.47 15.79 15.53 15.49ZM18.75 12.42C18.75 8.91 18.61 8.43 17.39 7.69C16.82 7.34 16.44 7.31 11.8 7.31C9.06 7.31 6.76 7.26 6.69 7.19C6.52 7.02 7.06 6.06 7.41 5.93C7.58 5.86 10.32 5.81 13.49 5.81C19.05 5.81 19.28 5.83 19.76 6.2L20.25 6.59L20.25 10.77L20.25 14.96L19.79 15.26C18.78 15.92 18.75 15.84 18.75 12.42ZM3.94 11.09C3.66 11 3.71 10 4.02 9.4C4.49 8.49 4.83 8.44 10.9 8.44L16.53 8.44L17.09 9C17.56 9.46 17.64 9.68 17.59 10.32L17.53 11.08L10.83 11.12C7.14 11.14 4.04 11.13 3.94 11.09Z\"]},{\"id\":\"bt-cart\",\"label\":\"Cart\",\"set\":\"solid\",\"paths\":[\"M7.77 21.1C6.81 20.14 7.47 18.38 8.79 18.38C10.21 18.38 10.92 20.22 9.85 21.13C9.19 21.7 8.36 21.69 7.77 21.1ZM17.34 21.1C16.71 20.48 16.71 19.46 17.34 18.84C18.31 17.86 19.91 18.56 19.91 19.97C19.91 21.37 18.31 22.08 17.34 21.1ZM8.91 17.45C7.8 16.99 7.47 16.04 7.77 14.22C7.9 13.45 7.8 12.98 6.84 10.1C6.25 8.31 5.6 6.4 5.4 5.86L5.04 4.88L4.03 4.88C2.63 4.88 2.01 4.2 2.73 3.48C3.06 3.15 5.51 3.06 5.99 3.36C6.14 3.46 6.48 4.15 6.74 4.91L7.22 6.28L14.04 6.38C20.6 6.47 20.87 6.48 21.1 6.84C21.3 7.16 21.17 7.7 20.23 10.59C19.62 12.45 18.98 14.07 18.81 14.2C18.57 14.38 17.31 14.44 14.03 14.44C9.82 14.44 9.57 14.46 9.38 14.8C9.27 15 9.19 15.34 9.19 15.55C9.19 15.92 9.29 15.93 14.37 15.98C19.35 16.03 19.56 16.05 19.8 16.41C20.02 16.74 20.01 16.86 19.77 17.21C19.48 17.62 19.43 17.62 14.38 17.61C11.58 17.61 9.11 17.53 8.91 17.45Z\"]},{\"id\":\"bt-clock\",\"label\":\"Clock\",\"set\":\"solid\",\"paths\":[\"M9.68 21.27C6.34 20.46 3.52 17.61 2.73 14.23C1.09 7.29 7.29 1.09 14.23 2.73C17.65 3.53 20.47 6.35 21.27 9.77C22.92 16.73 16.65 22.95 9.68 21.27ZM15.9 15.15C16.32 14.73 16.12 14.44 14.44 13.09L12.75 11.74L12.75 9.07C12.75 6.89 12.7 6.35 12.46 6.11C12.09 5.74 11.91 5.74 11.54 6.11C11.3 6.35 11.25 6.91 11.25 9.29L11.25 12.18L11.77 12.64C13.23 13.93 15.13 15.36 15.38 15.37C15.54 15.37 15.78 15.27 15.9 15.15Z\"]},{\"id\":\"bt-dislike\",\"label\":\"Dislike\",\"set\":\"solid\",\"paths\":[\"M10.31 20.58C9.25 19.85 8.92 19.25 8.85 17.85C8.82 17.15 8.91 16.16 9.06 15.61L9.32 14.62L7.33 14.62C6.24 14.62 5.04 14.54 4.66 14.43C3.8 14.19 2.69 12.99 2.52 12.12C2.34 11.16 3.31 5.53 3.81 4.63C4.03 4.24 4.5 3.73 4.87 3.51C5.47 3.13 5.77 3.09 8.06 3.11C10.66 3.12 12.86 3.45 14.59 4.09L15.47 4.42L15.52 9.34L15.57 14.26L14.45 15.3C13.14 16.51 12.56 17.59 12.56 18.8C12.56 20.83 11.69 21.52 10.31 20.58ZM17.25 14.81C16.89 14.46 16.88 14.19 16.88 9.2L16.88 3.96L17.39 3.56C17.84 3.2 18.09 3.16 19.38 3.22C21.65 3.32 21.56 3.08 21.56 9.22L21.56 14.27L21.1 14.73C20.69 15.14 20.49 15.19 19.13 15.19C17.88 15.19 17.56 15.13 17.25 14.81Z\"]},{\"id\":\"bt-dot\",\"label\":\"Dot\",\"set\":\"solid\",\"paths\":[\"M10.27 13.69C9.54 12.96 9.52 12.91 9.6 11.89C9.67 11.03 9.79 10.74 10.29 10.25C10.82 9.71 10.99 9.66 12.02 9.66C13.09 9.66 13.19 9.7 13.8 10.36C14.35 10.96 14.44 11.19 14.44 12.02C14.44 12.89 14.37 13.05 13.71 13.71C13.05 14.37 12.89 14.44 12 14.44C11.1 14.44 10.95 14.37 10.27 13.69Z\"]},{\"id\":\"bt-eur\",\"label\":\"EUR\",\"set\":\"solid\",\"paths\":[\"M3.3 13.92C3.36 13.54 3.55 12.42 3.72 11.44L4.03 9.66L6.35 9.6L8.67 9.55L8.56 10.14C8.49 10.47 8.44 10.81 8.44 10.9C8.44 10.99 7.8 11.06 7.03 11.06C6.22 11.06 5.62 11.14 5.62 11.25C5.62 11.36 6.16 11.44 6.84 11.44C7.92 11.44 8.06 11.48 8.06 11.8C8.06 12.63 7.89 12.75 6.64 12.75C5.96 12.75 5.44 12.83 5.44 12.94C5.44 13.04 6 13.12 6.76 13.12L8.09 13.12L7.96 13.73C7.89 14.07 7.79 14.41 7.75 14.48C7.7 14.56 6.66 14.62 5.42 14.62L3.18 14.62L3.3 13.92ZM9.03 14.19C8.54 13.67 8.54 13.54 8.94 11.31L9.25 9.56L10.05 9.56C10.49 9.56 10.89 9.63 10.94 9.71C10.99 9.79 10.92 10.4 10.77 11.07C10.63 11.74 10.51 12.43 10.51 12.61C10.5 12.98 11.22 13.22 11.79 13.04C12.22 12.9 12.27 12.78 12.57 10.92L12.78 9.56L13.6 9.56C14.05 9.56 14.46 9.63 14.51 9.71C14.65 9.94 13.92 13.51 13.66 13.81C13.18 14.39 12.39 14.62 10.92 14.62C9.62 14.62 9.39 14.57 9.03 14.19ZM14.55 13.92C14.61 13.54 14.8 12.42 14.97 11.44L15.28 9.66L17.32 9.6C19.23 9.55 19.4 9.58 19.83 9.98C20.21 10.34 20.27 10.53 20.2 11.21C20.14 11.68 19.94 12.2 19.71 12.45C19.17 13.02 19.21 13.12 19.97 13.12C20.66 13.12 20.75 13.3 20.51 14.2C20.4 14.6 20.29 14.62 18.82 14.62C17.25 14.62 17.24 14.62 16.88 14.03C16.5 13.4 16.5 13.39 16.21 14.39C16.16 14.53 15.8 14.62 15.28 14.62L14.43 14.62L14.55 13.92ZM18.28 11.34C18.28 11.24 17.96 11.13 17.58 11.1C17.03 11.05 16.88 11.11 16.88 11.34C16.88 11.58 17.03 11.63 17.58 11.59C17.96 11.56 18.28 11.45 18.28 11.34Z\"]},{\"id\":\"bt-gift\",\"label\":\"Gift\",\"set\":\"solid\",\"paths\":[\"M6.66 20.51C6.25 20.36 5.64 19.98 5.31 19.65C4.26 18.64 4.12 18.13 4.12 15.3L4.12 12.75L7.69 12.75L11.25 12.75L11.25 16.78L11.25 20.81L9.33 20.8C8.14 20.79 7.12 20.68 6.66 20.51ZM12.75 16.78L12.75 12.74L16.36 12.79L19.97 12.84L19.97 15C19.97 17.78 19.84 18.34 18.93 19.37C17.94 20.49 16.98 20.81 14.59 20.81L12.75 20.81L12.75 16.78ZM4.13 11.01C3.23 10.55 2.91 9.14 3.46 8.08C3.81 7.41 4.07 7.31 5.47 7.31L6.6 7.31L6.47 6.57C5.99 3.72 9.74 2.04 11.58 4.27L12 4.78L12.42 4.27C14.26 2.04 18.01 3.72 17.53 6.57L17.4 7.31L18.64 7.31C19.62 7.31 19.95 7.39 20.25 7.68C20.98 8.41 20.98 10.04 20.25 10.77C19.88 11.15 19.66 11.16 12.23 11.2C6.34 11.24 4.49 11.2 4.13 11.01ZM11.06 7.04C11.06 6.58 10.68 5.74 10.27 5.3C9.5 4.47 8.06 4.93 8.06 6C8.06 6.85 8.75 7.27 10.17 7.3C10.83 7.31 11.06 7.24 11.06 7.04ZM15.56 6.85C16.35 6.13 15.82 4.88 14.72 4.88C13.87 4.88 12.94 6.02 12.94 7.07C12.94 7.5 15.03 7.32 15.56 6.85Z\"]},{\"id\":\"bt-happy\",\"label\":\"Happy\",\"set\":\"solid\",\"paths\":[\"M10.2 20.35C8.56 19.99 7.21 19.24 5.96 17.99C2.61 14.64 2.62 9.35 5.99 5.98C9.36 2.61 14.64 2.61 18.01 5.98C21.38 9.35 21.39 14.64 18.04 17.99C16.76 19.27 15.44 19.99 13.71 20.35C12.22 20.67 11.69 20.67 10.2 20.35ZM13.48 17.52C15.16 17.02 16.54 15.49 16.86 13.76C17.16 12.13 17.34 12.19 12 12.19C6.66 12.19 6.84 12.13 7.14 13.76C7.55 15.94 9.68 17.75 11.92 17.8C12.24 17.81 12.94 17.68 13.48 17.52ZM8.81 9.91C9.07 9.9 9.52 9.96 9.82 10.04C10.18 10.13 10.4 10.1 10.5 9.93C11.07 9.02 8.96 8.25 7.7 8.9C6.74 9.4 6.78 10.24 7.76 10.03C8.08 9.97 8.55 9.91 8.81 9.91ZM15.19 9.91C15.45 9.9 15.9 9.96 16.19 10.04C16.55 10.13 16.78 10.1 16.88 9.93C17.44 9.02 15.34 8.25 14.07 8.9C13.11 9.4 13.16 10.24 14.14 10.03C14.46 9.97 14.93 9.91 15.19 9.91Z\"]},{\"id\":\"bt-hashtag\",\"label\":\"Hashtag\",\"set\":\"solid\",\"paths\":[\"M5.11 20.95C4.73 20.45 4.73 20.05 5.15 18.4L5.59 16.69L4.62 16.69C3.3 16.69 2.77 16.31 2.85 15.41C2.92 14.54 3.44 14.26 5.01 14.25L6.17 14.25L6.36 13.55C6.46 13.16 6.68 12.3 6.84 11.62C7.01 10.95 7.19 10.26 7.24 10.08C7.33 9.78 7.17 9.75 5.59 9.75C3.44 9.74 2.93 9.53 2.85 8.6C2.76 7.57 3.09 7.42 5.69 7.31L7.95 7.22L8.43 5.32C8.69 4.28 9.02 3.29 9.16 3.12C9.49 2.73 10.38 2.72 10.77 3.11C11.15 3.49 11.14 4.1 10.69 5.81C10.48 6.59 10.32 7.24 10.32 7.27C10.31 7.29 11.6 7.31 13.18 7.31L16.05 7.31L16.48 5.48C17.05 3.1 17.25 2.77 18.15 2.85C19.26 2.94 19.39 3.47 18.85 5.58L18.41 7.31L19.38 7.31C20.7 7.31 21.23 7.69 21.15 8.59C21.08 9.46 20.56 9.74 18.99 9.75L17.83 9.75L17.64 10.45C17.54 10.84 17.32 11.7 17.16 12.38C16.99 13.05 16.81 13.74 16.76 13.92C16.67 14.22 16.83 14.25 18.41 14.25C20.56 14.26 21.07 14.47 21.15 15.4C21.24 16.43 20.91 16.58 18.31 16.69L16.05 16.78L15.57 18.68C15.31 19.72 14.98 20.71 14.84 20.88C14.51 21.27 13.62 21.28 13.23 20.89C12.85 20.51 12.86 19.9 13.31 18.19C13.52 17.41 13.68 16.76 13.68 16.73C13.69 16.71 12.4 16.69 10.82 16.69L7.95 16.69L7.52 18.52C6.97 20.81 6.75 21.19 5.92 21.19C5.58 21.19 5.21 21.08 5.11 20.95ZM14.84 12.09C15.13 10.96 15.37 9.97 15.37 9.89C15.37 9.81 14.09 9.76 12.53 9.79L9.68 9.84L9.16 11.91C8.87 13.04 8.63 14.03 8.63 14.11C8.63 14.19 9.91 14.24 11.47 14.21L14.32 14.16L14.84 12.09Z\"]},{\"id\":\"bt-heart\",\"label\":\"Heart\",\"set\":\"solid\",\"paths\":[\"M9.19 18.24C4.69 14.35 3.27 12.71 2.69 10.7C1.94 8.13 3.08 5.28 5.34 4.07C5.92 3.76 6.43 3.66 7.51 3.66C8.77 3.66 9.04 3.72 9.85 4.22C10.36 4.54 11.03 5.14 11.34 5.57C11.65 6 11.95 6.35 12 6.36C12.05 6.36 12.37 5.99 12.7 5.53C13.04 5.08 13.71 4.47 14.2 4.18C14.97 3.73 15.29 3.66 16.5 3.66C18.1 3.67 19 4.04 20 5.09C21.11 6.27 21.46 7.23 21.47 9C21.47 10.43 21.4 10.73 20.86 11.84C20.45 12.67 19.76 13.59 18.79 14.57C16.97 16.44 12.31 20.44 11.97 20.43C11.83 20.43 10.58 19.44 9.19 18.24Z\"]},{\"id\":\"bt-info\",\"label\":\"Info\",\"set\":\"solid\",\"paths\":[\"M9.68 21.27C6.34 20.46 3.52 17.61 2.73 14.23C1.09 7.29 7.29 1.09 14.23 2.73C17.65 3.53 20.47 6.35 21.27 9.77C22.92 16.73 16.65 22.95 9.68 21.27ZM13.31 17.51C14.16 17.17 14.39 16.57 13.59 16.77C12.96 16.92 12.37 16.59 12.38 16.07C12.38 15.84 12.59 14.9 12.85 13.97C13.44 11.82 13.44 11.18 12.85 10.59C12.3 10.03 11.37 9.98 10.06 10.42C9.08 10.76 8.79 11.37 9.7 11.2C10.38 11.07 10.88 11.35 10.87 11.87C10.87 12.09 10.66 13.04 10.4 13.97C9.81 16.12 9.81 16.76 10.4 17.35C10.95 17.91 12.15 17.97 13.31 17.51ZM13.88 8.44C14.73 7.59 14.08 6.19 12.84 6.19C12.03 6.19 11.44 6.74 11.44 7.49C11.44 8.65 13.04 9.27 13.88 8.44Z\"]},{\"id\":\"bt-lightbulb\",\"label\":\"Idea\",\"set\":\"solid\",\"paths\":[\"M10.3 21.01C9.93 20.65 9.75 20.28 9.75 19.89L9.75 19.31L12 19.31L14.25 19.31L14.25 19.89C14.25 20.28 14.07 20.65 13.7 21.01C13.21 21.5 13.03 21.56 12 21.56C10.97 21.56 10.79 21.5 10.3 21.01ZM9.29 17.96C9.25 17.83 9.17 17.4 9.12 17.01C9.06 16.57 8.74 15.94 8.26 15.34C6.13 12.67 6.74 9.16 9.59 7.59C10.45 7.12 10.79 7.04 12 7.05C13.58 7.05 14.52 7.42 15.55 8.45C16.58 9.48 16.95 10.42 16.95 12C16.95 13.52 16.72 14.13 15.53 15.7C15.17 16.18 14.89 16.82 14.82 17.3L14.72 18.09L12.04 18.15C10 18.19 9.35 18.14 9.29 17.96ZM2.51 12.29C2.23 11.57 2.55 11.42 4.17 11.48C5.68 11.53 5.72 11.54 5.72 12C5.72 12.46 5.68 12.47 4.17 12.52C2.91 12.57 2.6 12.52 2.51 12.29ZM18.26 12.29C17.98 11.57 18.3 11.42 19.92 11.48C21.43 11.53 21.47 11.54 21.47 12C21.47 12.46 21.43 12.47 19.92 12.52C18.66 12.57 18.35 12.52 18.26 12.29ZM10.39 11.47C10.75 10.77 11.13 10.48 11.86 10.33C12.35 10.23 12.47 10.11 12.47 9.74C12.47 9.38 12.36 9.27 11.97 9.22C10.86 9.1 9.38 10.34 9.38 11.4C9.38 12.17 10 12.22 10.39 11.47ZM6.26 7.09C5.2 6.11 4.96 5.69 5.26 5.33C5.59 4.93 5.74 4.99 6.67 5.85C7.74 6.83 7.98 7.25 7.68 7.61C7.35 8 7.2 7.95 6.26 7.09ZM16.41 7.62C15.98 7.3 16.19 6.9 17.34 5.84C18.23 5.01 18.49 4.95 18.83 5.49C18.99 5.74 18.86 5.97 18.18 6.67C17.1 7.77 16.83 7.92 16.41 7.62ZM11.52 5.57C11.47 5.43 11.44 4.68 11.48 3.92C11.53 2.58 11.55 2.53 12 2.53C12.46 2.53 12.47 2.55 12.47 4.12C12.47 5.64 12.45 5.72 12.05 5.78C11.81 5.81 11.58 5.72 11.52 5.57Z\"]},{\"id\":\"bt-like\",\"label\":\"Like\",\"set\":\"solid\",\"paths\":[\"M13.24 20.79C11.8 20.6 9.98 20.16 9.05 19.77L8.44 19.52L8.44 14.62L8.44 9.73L9.55 8.7C10.85 7.5 11.44 6.41 11.44 5.22C11.44 4.01 11.76 3.21 12.3 3.07C13.2 2.85 14.56 3.79 14.99 4.93C15.26 5.66 15.24 7.22 14.93 8.4L14.68 9.37L16.67 9.38C17.76 9.38 18.96 9.46 19.34 9.57C20.21 9.81 21.31 11.01 21.48 11.91C21.68 12.96 20.7 18.46 20.14 19.44C19.46 20.62 18.51 21.01 16.3 20.98C15.33 20.96 13.95 20.88 13.24 20.79ZM3.25 20.62C2.49 20.32 2.44 19.92 2.44 14.72L2.44 9.73L2.9 9.27C3.31 8.86 3.51 8.81 4.87 8.81C7.24 8.81 7.12 8.5 7.12 14.8L7.12 20.04L6.63 20.42C6.24 20.73 5.88 20.81 4.9 20.8C4.21 20.79 3.47 20.71 3.25 20.62Z\"]},{\"id\":\"bt-lock\",\"label\":\"Lock\",\"set\":\"solid\",\"paths\":[\"M5.42 21.01L4.88 20.47L4.88 15.66C4.87 12.72 4.95 10.71 5.07 10.49C5.31 10.03 6.21 9.56 6.83 9.56L7.31 9.56L7.31 7.78C7.31 6.25 7.38 5.85 7.77 5.08C8.53 3.59 9.86 2.66 11.51 2.49C13.43 2.3 15.22 3.25 16.17 4.98C16.62 5.81 16.68 6.1 16.68 7.73L16.69 9.56L17.17 9.56C17.79 9.56 18.69 10.03 18.93 10.49C19.05 10.71 19.12 12.72 19.12 15.66L19.13 20.47L18.58 21.01L18.03 21.56L12 21.56L5.97 21.56L5.42 21.01ZM12.52 18.15C12.65 18.03 12.75 17.45 12.75 16.87C12.75 16.05 12.83 15.73 13.12 15.47C13.53 15.1 13.63 14.09 13.32 13.51C13.22 13.33 12.88 13.07 12.57 12.94C11.9 12.66 10.99 12.94 10.68 13.51C10.37 14.09 10.47 15.1 10.88 15.47C11.17 15.73 11.25 16.05 11.25 16.87C11.25 17.95 11.46 18.38 12 18.38C12.16 18.38 12.4 18.27 12.52 18.15ZM15.18 8.02C15.18 6.76 15.1 6.33 14.76 5.72C14.13 4.61 13.29 4.12 12 4.12C9.91 4.13 8.81 5.5 8.81 8.1L8.81 9.56L12 9.56L15.19 9.56L15.18 8.02Z\"]},{\"id\":\"bt-megaphone\",\"label\":\"Announcement\",\"set\":\"solid\",\"paths\":[\"M11.09 20.16L9.66 18.76L10.45 17.97L11.24 17.17L11.82 17.73L12.4 18.28L12.86 17.76C13.42 17.1 13.42 17.04 12.85 16.51L12.39 16.07L12.86 15.71C13.4 15.28 13.7 15.43 14.18 16.36C14.55 17.07 14.37 17.81 13.69 18.47L13.14 18.99L13.6 19.54C14.16 20.21 14.19 20.69 13.69 21.19C13.05 21.83 12.6 21.65 11.09 20.16ZM5.91 18.97C5.11 18.48 3.78 16.99 3.64 16.42C3.43 15.59 3.69 15.14 5.29 13.55L6.85 12L8.82 13.97L10.78 15.95L9.07 17.63C7.23 19.44 6.91 19.58 5.91 18.97ZM7.68 15.85C8.21 15.31 8.27 15.16 8.07 14.91C7.71 14.48 7.41 14.56 6.78 15.28C5.73 16.47 6.57 17 7.68 15.85ZM9.61 13.26C8.55 12.2 7.69 11.28 7.69 11.2C7.69 11.13 7.98 10.65 8.34 10.15C9.1 9.09 9.86 7.47 10.04 6.49C10.11 6.12 10.23 5.77 10.3 5.73C10.37 5.68 11.97 7.19 13.86 9.08L17.29 12.51L16.38 12.74C15.1 13.06 14 13.57 12.73 14.44C12.12 14.85 11.61 15.19 11.58 15.19C11.55 15.19 10.66 14.32 9.61 13.26ZM18.66 12.19C17.99 11.91 10.5 4.23 10.5 3.83C10.5 3.21 11.04 2.62 11.59 2.63C12.01 2.63 12.86 3.39 16.18 6.71C18.42 8.96 20.25 10.95 20.25 11.13C20.25 11.46 19.45 12.38 19.18 12.36C19.1 12.36 18.86 12.28 18.66 12.19ZM18.38 7.78C17.92 7.23 18.3 6.91 19.36 6.97C20.14 7.02 20.35 7.1 20.41 7.38C20.44 7.58 20.36 7.81 20.22 7.9C19.81 8.16 18.63 8.09 18.38 7.78ZM17.29 5.59C16.93 5.23 17.02 5 17.79 4.24C18.23 3.81 18.66 3.55 18.87 3.59C19.48 3.71 19.39 4.31 18.64 5.08C17.88 5.86 17.65 5.95 17.29 5.59ZM15.04 4.47C14.78 4.21 14.74 3.03 14.98 2.65C15.07 2.51 15.3 2.43 15.49 2.47C15.79 2.53 15.84 2.71 15.84 3.56C15.84 4.63 15.54 4.97 15.04 4.47Z\"]},{\"id\":\"bt-money\",\"label\":\"Money\",\"set\":\"solid\",\"paths\":[\"M2.73 18.83C2.48 18.58 2.44 17.87 2.44 13.99C2.44 10.71 2.5 9.39 2.66 9.22C2.99 8.9 21.01 8.9 21.34 9.22C21.5 9.39 21.56 10.71 21.56 13.99C21.56 17.87 21.52 18.58 21.27 18.83C21.01 19.09 19.91 19.12 12 19.12C4.09 19.12 2.99 19.09 2.73 18.83ZM8.91 17.62C8.91 17.4 8.53 17.33 7.03 17.25C4.34 17.12 4.31 17.09 4.32 14.07C4.32 11.85 4.35 11.69 4.78 11.2C5.22 10.7 5.3 10.69 7.12 10.69C8.67 10.69 9 10.64 9 10.41C9 10.17 8.63 10.12 6.83 10.12C4.86 10.12 4.64 10.16 4.56 10.48C4.51 10.67 4.26 10.92 4.02 11.04C3.57 11.24 3.56 11.26 3.56 14.06L3.56 16.88L4.03 17.06C4.29 17.16 4.5 17.36 4.5 17.51C4.5 17.92 4.81 17.98 6.94 17.94C8.55 17.91 8.91 17.85 8.91 17.62ZM13.22 17.68C13.92 17.51 14.93 16.69 15.32 15.98C16.24 14.33 16.02 12.63 14.71 11.32C12.85 9.47 9.91 9.89 8.63 12.2C7.7 13.87 8.19 16.07 9.74 17.15C10.8 17.88 11.81 18.04 13.22 17.68ZM19.2 17.89C19.37 17.82 19.5 17.65 19.5 17.51C19.5 17.36 19.71 17.16 19.97 17.06L20.44 16.88L20.44 14.06C20.44 11.26 20.43 11.24 19.98 11.04C19.74 10.92 19.49 10.67 19.44 10.48C19.36 10.16 19.14 10.12 17.17 10.12C15.37 10.12 15 10.17 15 10.41C15 10.64 15.33 10.69 16.88 10.69C18.7 10.69 18.78 10.7 19.22 11.2C19.65 11.69 19.68 11.85 19.68 14.06C19.68 16.29 19.66 16.43 19.24 16.83C18.84 17.21 18.6 17.25 17 17.25C15.3 17.25 14.83 17.39 15.09 17.81C15.22 18.01 18.71 18.08 19.2 17.89ZM10.69 17.04C9.52 16.57 8.81 15.45 8.81 14.06C8.81 12.98 9.1 12.32 9.87 11.6C11.91 9.69 15.24 11.24 15.22 14.08C15.21 15.46 14.45 16.6 13.25 17.05C12.6 17.3 11.32 17.29 10.69 17.04ZM12.32 16.36C12.39 16.18 12.6 15.92 12.78 15.79C13.2 15.49 13.24 14.39 12.86 14.07C12.71 13.95 12.35 13.79 12.06 13.71C11.66 13.6 11.53 13.45 11.53 13.11C11.53 12.43 12.31 12.37 12.56 13.03C12.66 13.3 12.83 13.47 12.94 13.41C13.27 13.2 13.12 12.67 12.55 12.01L12 11.36L11.45 12.01C11.14 12.36 10.89 12.88 10.88 13.16C10.87 13.73 11.31 14.25 11.79 14.25C12.47 14.25 12.87 15.22 12.28 15.44C11.87 15.6 11.49 15.4 11.38 14.99C11.33 14.79 11.19 14.62 11.08 14.62C10.74 14.62 10.85 15.52 11.22 15.79C11.4 15.92 11.61 16.18 11.68 16.36C11.75 16.54 11.89 16.69 12 16.69C12.11 16.69 12.25 16.54 12.32 16.36ZM6.57 14.66C6.9 14.39 6.97 14.2 6.87 13.82C6.69 13.1 5.87 12.92 5.41 13.49C4.97 14.03 4.98 14.16 5.44 14.62C5.9 15.09 6.03 15.09 6.57 14.66ZM18.56 14.62C19.02 14.16 19.03 14.03 18.59 13.49C18.33 13.17 18.14 13.1 17.75 13.19C17.04 13.37 16.86 14.19 17.43 14.66C17.97 15.09 18.1 15.09 18.56 14.62ZM5.81 13.95C5.81 13.79 5.91 13.69 6.04 13.73C6.38 13.85 6.44 14.25 6.11 14.25C5.95 14.25 5.81 14.12 5.81 13.95ZM17.67 14.03C17.78 13.68 18.19 13.62 18.19 13.95C18.19 14.12 18.05 14.25 17.89 14.25C17.73 14.25 17.63 14.15 17.67 14.03ZM8.22 8.31C8.36 8.25 10.97 7.85 14.03 7.4C20.17 6.52 20.31 6.52 20.48 7.68C20.52 7.99 20.52 8.29 20.47 8.34C20.42 8.4 17.58 8.43 14.17 8.42C10.76 8.41 8.08 8.36 8.22 8.31ZM8.83 7.43C9.08 7.19 17.91 4.88 18.21 4.97C18.52 5.07 18.91 5.92 18.73 6.08C18.65 6.14 9.23 7.51 8.92 7.5C8.83 7.5 8.79 7.47 8.83 7.43Z\"]},{\"id\":\"bt-no\",\"label\":\"No\",\"set\":\"solid\",\"paths\":[\"M3.23 21.25C2.88 21.11 2.44 20.16 2.44 19.57C2.44 19.15 3.11 18.38 5.95 15.52L9.46 12L6.06 8.58C4.18 6.69 2.64 4.99 2.62 4.78C2.49 3.39 3.1 2.62 4.34 2.63C5.12 2.63 5.2 2.69 8.57 6.04L12 9.46L15.43 6.04C18.67 2.82 18.91 2.62 19.57 2.62C20.1 2.62 20.42 2.76 20.83 3.17C21.24 3.58 21.38 3.9 21.38 4.43C21.38 5.09 21.18 5.33 17.95 8.57L14.53 12.01L17.87 15.33C19.71 17.16 21.29 18.78 21.38 18.94C21.7 19.45 21.57 20.21 21.08 20.8C20.66 21.29 20.46 21.37 19.73 21.37L18.87 21.37L15.43 17.96L12 14.54L8.57 17.96L5.13 21.38L4.3 21.36C3.84 21.35 3.36 21.3 3.23 21.25Z\"]},{\"id\":\"bt-notes\",\"label\":\"Notes\",\"set\":\"solid\",\"paths\":[\"M2.99 21.01L2.44 20.47L2.44 12L2.44 3.53L2.99 2.99L3.53 2.44L8.04 2.44L12.55 2.44L12.6 4.64L12.66 6.84L14.86 6.9L17.06 6.95L17.06 8.11L17.06 9.26L14.93 11.43C12.98 13.41 12.77 13.7 12.39 14.85C12.03 15.95 12.01 16.18 12.22 16.63C12.6 17.41 13.29 17.57 14.58 17.17C15.17 16.99 15.97 16.59 16.36 16.29L17.06 15.73L17.06 17.91C17.06 20.21 16.85 20.98 16.14 21.37C15.91 21.49 13.49 21.56 9.65 21.56L3.53 21.56L2.99 21.01ZM13.48 19.06C13.6 18.91 13.64 18.66 13.57 18.49C13.47 18.22 13.17 18.18 11.37 18.23C9.5 18.28 9.28 18.32 9.22 18.63C9.11 19.18 9.52 19.31 11.46 19.31C12.77 19.31 13.33 19.24 13.48 19.06ZM13.26 16.2C13.2 16.14 13.23 15.86 13.33 15.59C13.43 15.32 13.55 14.97 13.61 14.83C13.67 14.63 13.87 14.73 14.36 15.2L15.01 15.84L14.4 16.06C13.67 16.32 13.42 16.35 13.26 16.2ZM11.23 15.68C11.35 15.54 11.39 15.29 11.33 15.12C11.23 14.85 10.79 14.81 8.04 14.81C5.38 14.81 4.85 14.86 4.75 15.1C4.69 15.25 4.75 15.51 4.88 15.66C5.2 16.05 10.91 16.07 11.23 15.68ZM15.09 14.25L14.35 13.49L16.18 11.67L18 9.85L18.79 10.64L19.59 11.44L17.81 13.22C16.84 14.2 15.99 15 15.93 15C15.87 15 15.49 14.66 15.09 14.25ZM11.23 13.43C11.35 13.29 11.39 13.04 11.33 12.87C11.23 12.6 10.79 12.56 8.04 12.56C5.38 12.56 4.85 12.61 4.75 12.85C4.69 13 4.75 13.26 4.88 13.41C5.2 13.8 10.91 13.82 11.23 13.43ZM11.23 11.18C11.35 11.04 11.39 10.78 11.33 10.61C11.22 10.34 10.84 10.31 8 10.36C5.03 10.4 4.78 10.43 4.72 10.76C4.68 10.95 4.76 11.18 4.9 11.27C5.04 11.36 6.47 11.43 8.09 11.43C10.34 11.44 11.07 11.38 11.23 11.18ZM19.63 9.98C19.25 9.59 18.94 9.17 18.94 9.05C18.94 8.69 19.9 8.06 20.45 8.06C21.64 8.06 21.91 9.16 20.94 10.09L20.33 10.69L19.63 9.98ZM13.5 8.91C13.69 8.68 13.69 8.57 13.5 8.34C13.3 8.1 12.63 8.06 9.02 8.11C5.05 8.15 4.78 8.18 4.72 8.51C4.68 8.7 4.76 8.93 4.9 9.02C5.04 9.11 6.98 9.18 9.21 9.18C12.59 9.19 13.31 9.14 13.5 8.91ZM13.69 4.12C13.69 2.7 13.73 2.44 13.99 2.44C14.39 2.44 16.81 4.84 16.97 5.39C17.09 5.81 17.06 5.81 15.39 5.81L13.69 5.81L13.69 4.12Z\"]},{\"id\":\"bt-partner\",\"label\":\"Partner\",\"set\":\"solid\",\"paths\":[\"M14.03 19.56L13.15 19.07L13.6 18.17C14.25 16.89 14.21 15.94 13.48 15.1C13.16 14.74 12.78 14.44 12.64 14.44C12.5 14.44 12.26 14.14 12.11 13.78C11.95 13.4 11.55 12.96 11.17 12.74C10.81 12.52 10.47 12.19 10.41 12C10.34 11.81 10 11.39 9.64 11.07C9.12 10.62 8.82 10.5 8.14 10.5C7.68 10.5 7.09 10.36 6.83 10.19C5.77 9.5 4.08 10 3.43 11.19C3.09 11.83 2.58 11.96 2.48 11.43C2.42 11.1 5.51 5.21 5.92 4.87C6.15 4.67 6.75 4.91 7.65 5.54C7.68 5.56 7.53 5.87 7.32 6.21C6.52 7.53 6.94 9.17 8.26 9.85C9.22 10.34 9.91 10.19 11.91 9.07C12.94 8.48 13.87 8 13.97 8C14.22 8 20.41 11.56 20.87 11.96C21.1 12.17 21.19 12.47 21.15 12.93C21.1 13.46 20.98 13.65 20.49 13.9C19.89 14.2 19.89 14.2 20.25 14.53C21.11 15.31 20.26 16.84 19.11 16.59C18.66 16.49 18.62 16.52 18.7 16.96C18.84 17.68 18.3 18.38 17.61 18.38C17.29 18.38 16.88 18.29 16.69 18.19C16.37 18.02 16.35 18.06 16.44 18.63C16.52 19.12 16.45 19.36 16.15 19.67C15.63 20.19 15.1 20.16 14.03 19.56ZM10.5 19.54C9.99 19.38 9.56 18.89 9.56 18.46C9.56 18.07 9.52 18.05 9.02 18.24C8.35 18.49 7.57 18.06 7.39 17.36C7.3 16.97 7.19 16.92 6.68 17C5.91 17.13 5.2 16.59 5.2 15.87C5.2 15.5 5.15 15.4 5 15.55C4.68 15.87 3.65 15.78 3.31 15.41C2.82 14.86 2.94 14.25 3.85 12.69C4.78 11.11 5.33 10.71 6.06 11.09C6.59 11.37 6.74 11.61 6.75 12.17L6.75 12.61L7.15 12.11C7.47 11.7 7.67 11.62 8.22 11.66C9.13 11.74 9.57 12.45 9.24 13.32C9.06 13.81 9.06 13.87 9.28 13.69C9.7 13.34 10.52 13.55 10.94 14.11C11.28 14.57 11.3 14.71 11.11 15.23C10.93 15.68 10.93 15.77 11.1 15.6C11.41 15.29 12.03 15.32 12.52 15.67C13.11 16.08 13.06 16.9 12.37 18.1C11.65 19.37 11.15 19.75 10.5 19.54ZM17.62 8.71C15.82 7.64 14.19 6.76 14.01 6.76C13.83 6.75 12.81 7.26 11.75 7.88C10.69 8.49 9.59 9 9.32 9C8.17 9 7.61 7.41 8.48 6.63C9.04 6.13 11.82 4.55 12.41 4.4C12.69 4.33 13.34 4.46 14.07 4.74L15.28 5.19L16.31 4.57C16.88 4.23 17.48 3.95 17.64 3.94C18.01 3.94 21.63 10.05 21.49 10.43C21.43 10.57 21.28 10.68 21.15 10.67C21.01 10.66 19.43 9.78 17.62 8.71Z\"]},{\"id\":\"bt-payment-confirmed\",\"label\":\"Payment confirmed\",\"set\":\"solid\",\"paths\":[\"M15.38 17.89C13.91 17.25 13.07 16.01 13.06 14.44C13.04 12.25 14.59 10.69 16.78 10.69C18.73 10.69 20.16 11.91 20.53 13.9C21.03 16.57 17.91 18.99 15.38 17.89ZM4.69 17.11C3.56 16.55 3.36 15.87 3.42 12.84L3.47 10.22L9.16 10.17L14.85 10.12L14.04 10.73C12.3 12.07 11.73 14.67 12.79 16.55L13.29 17.44L9.31 17.44C5.91 17.44 5.25 17.39 4.69 17.11ZM17.7 14.99C18.63 13.79 18.73 13.26 18.07 13.16C17.79 13.12 17.49 13.34 17.06 13.88C16.63 14.42 16.39 14.59 16.25 14.45C15.94 14.14 15.24 14.21 15.11 14.56C14.97 14.93 16.03 16.12 16.51 16.12C16.68 16.12 17.21 15.61 17.7 14.99ZM9.28 14.44C9.28 13.98 9.25 13.97 7.64 13.91C6.29 13.87 5.97 13.91 5.88 14.15C5.64 14.79 6.17 15.02 7.76 14.96C9.24 14.91 9.28 14.89 9.28 14.44ZM3.42 8.13C3.53 7.19 4.01 6.41 4.71 6.05C5.04 5.88 6.78 5.82 11.21 5.82C17.86 5.81 18.09 5.85 18.65 6.93C18.81 7.23 18.94 7.82 18.94 8.24L18.94 9L11.13 9L3.33 9L3.42 8.13Z\"]},{\"id\":\"bt-pencil\",\"label\":\"Pencil\",\"set\":\"solid\",\"paths\":[\"M2.54 21.39C2.48 21.3 2.69 20.13 3.01 18.8L3.58 16.39L8.91 11.05L14.25 5.72L16.26 7.74L18.28 9.75L12.95 15.08L7.63 20.41L5.32 20.98C2.76 21.62 2.69 21.63 2.54 21.39ZM17.44 6.47L15.48 4.5L16.4 3.57C17.83 2.11 18.73 2.08 20.2 3.43C21.9 5.01 22 5.94 20.6 7.42C20.07 7.98 19.58 8.44 19.52 8.44C19.45 8.44 18.52 7.55 17.44 6.47Z\"]},{\"id\":\"bt-pin\",\"label\":\"Pin\",\"set\":\"solid\",\"paths\":[\"M3.86 20.08C3.47 19.65 3.35 19.86 5.5 16.9L7.17 14.59L5.65 13.06C3.98 11.38 3.79 10.88 4.55 10.17C5.64 9.14 7.61 8.73 8.89 9.26L9.52 9.52L10.93 8.09L12.35 6.66L12.25 5.8C12.16 5.08 12.22 4.87 12.63 4.37C13.18 3.73 13.9 3.51 14.62 3.78C15.33 4.05 20.03 8.8 20.26 9.49C20.5 10.22 20.27 10.87 19.58 11.41C19.04 11.84 17.92 11.95 17.71 11.61C17.63 11.48 16.97 12 16.03 12.94L14.48 14.48L14.74 15.11C15.43 16.77 14.51 19.43 13.06 19.94C12.79 20.04 12.3 19.67 10.95 18.35L9.2 16.63L6.94 18.45C5.7 19.45 4.57 20.31 4.44 20.36C4.3 20.41 4.04 20.28 3.86 20.08Z\"]},{\"id\":\"bt-rocket\",\"label\":\"Rocket\",\"set\":\"solid\",\"paths\":[\"M9.81 20.23C9.71 20.14 9.7 19.59 9.77 18.98C10.02 16.98 9.99 16.69 9.51 16.69C8.95 16.69 7.31 15.04 7.31 14.48C7.31 14.01 7.01 13.98 5.01 14.23C4.3 14.32 3.87 14.29 3.75 14.16C3.65 14.04 3.76 13.46 4.02 12.66C4.71 10.62 6.27 9.38 8.16 9.38C8.61 9.37 9.04 9.06 10.32 7.83C12.56 5.67 15.38 4.22 18.25 3.75C20.36 3.41 20.66 3.81 20.15 6.26C19.59 9.02 18.09 11.82 16.13 13.79C15.47 14.45 14.86 15 14.78 15C14.69 15 14.62 15.32 14.62 15.7C14.62 17.28 13.67 18.92 12.39 19.59C11.53 20.03 9.99 20.41 9.81 20.23ZM4.31 18.95C4.31 17.51 4.7 16.26 5.35 15.61C5.69 15.28 6.14 15 6.35 15C6.72 15 6.72 15.03 6.45 15.68C5.88 17.04 6.84 18.04 8.25 17.55C8.96 17.31 9 17.31 9 17.67C9 17.87 8.72 18.31 8.39 18.65C7.74 19.3 6.49 19.69 5.05 19.69C4.32 19.69 4.31 19.68 4.31 18.95ZM15.8 10.69C16.77 9.93 16.61 8.32 15.51 7.76C14.77 7.37 13.81 7.56 13.32 8.19C12.05 9.8 14.2 11.95 15.8 10.69Z\"]},{\"id\":\"bt-rules\",\"label\":\"Rules\",\"set\":\"solid\",\"paths\":[\"M6.2 19.19C5.83 18.72 5.81 18.48 5.81 13.1L5.81 7.5L10.88 7.5C15.25 7.5 15.94 7.46 15.94 7.22C15.94 7.06 15.78 6.94 15.6 6.94C15.06 6.94 14.44 6.23 14.44 5.62C14.44 4.54 15.72 3.93 16.6 4.58C16.95 4.83 16.97 5.19 17.06 11.94C17.11 15.84 17.23 19.18 17.32 19.36C17.47 19.67 17.15 19.69 12.03 19.69L6.59 19.69L6.2 19.19ZM18.01 19.19C17.76 18.87 17.62 18.43 17.62 17.88L17.62 17.06L18.54 17.06C20.08 17.06 20.87 18.16 20.06 19.18C19.51 19.88 18.56 19.88 18.01 19.19ZM15.33 16.73C15.39 16.55 14.55 16.5 11.56 16.5C8.05 16.5 7.28 16.59 7.63 16.95C7.7 17.01 9.44 17.05 11.5 17.02C14.3 16.98 15.27 16.91 15.33 16.73ZM15.33 14.3C15.39 14.11 14.55 14.06 11.56 14.06C8.05 14.06 7.28 14.15 7.63 14.51C7.7 14.58 9.44 14.61 11.5 14.58C14.3 14.54 15.27 14.47 15.33 14.3ZM15.33 11.86C15.39 11.68 14.53 11.62 11.45 11.62C7.83 11.62 7.25 11.69 7.63 12.07C7.7 12.14 9.44 12.17 11.5 12.14C14.3 12.11 15.27 12.03 15.33 11.86ZM15.28 9.38C15.28 9.14 14.73 9.09 11.62 9.05C8.09 9 7.31 9.1 7.58 9.55C7.68 9.69 8.83 9.74 11.5 9.71C14.71 9.66 15.28 9.61 15.28 9.38ZM4.11 6.59C3.59 6.16 3.55 5.22 4.03 4.69C4.35 4.33 4.6 4.31 9.32 4.31C14.15 4.31 14.26 4.32 14.07 4.68C13.82 5.14 13.82 6.11 14.07 6.57C14.26 6.93 14.15 6.94 9.4 6.94C4.96 6.94 4.5 6.91 4.11 6.59Z\"]},{\"id\":\"bt-search\",\"label\":\"Search\",\"set\":\"solid\",\"paths\":[\"M2.99 21.01C2.61 20.63 2.44 20.28 2.44 19.86C2.44 19.33 2.75 18.93 4.78 16.88C6.07 15.58 7.12 14.44 7.12 14.35C7.12 14.26 6.9 13.63 6.62 12.95C5.34 9.8 6.45 5.94 9.22 3.94C10.58 2.95 11.89 2.56 13.88 2.54C15.5 2.53 15.77 2.58 16.92 3.13C22.25 5.65 23.15 12.57 18.63 16.24C17.21 17.39 15.82 17.87 13.88 17.87C12.57 17.88 12.06 17.79 11.05 17.38C10.37 17.1 9.74 16.87 9.65 16.88C9.56 16.88 8.42 17.93 7.12 19.22C5.07 21.25 4.67 21.56 4.14 21.56C3.72 21.56 3.37 21.39 2.99 21.01ZM16.25 15.36C19.15 13.95 20.36 10.31 18.84 7.52C17.84 5.69 16.25 4.68 14.16 4.55C11.77 4.4 9.68 5.62 8.62 7.78C7.98 9.09 7.98 11.33 8.61 12.56C9.41 14.12 10.89 15.36 12.47 15.77C13.44 16.03 15.28 15.83 16.25 15.36ZM9.68 9.35C9.36 8.9 9.43 8.61 10.1 7.67C11.02 6.36 12.48 5.62 14.16 5.62C16.03 5.63 17.02 6.3 16.34 7.13C16.02 7.53 15.96 7.54 15.05 7.31C13.35 6.87 12.34 7.38 10.67 9.52C10.39 9.87 9.99 9.8 9.68 9.35Z\"]},{\"id\":\"bt-settings\",\"label\":\"Settings\",\"set\":\"solid\",\"paths\":[\"M9.6 21.32C9.49 21.19 9.31 20.55 9.2 19.89C9.1 19.24 8.99 18.69 8.96 18.67C8.93 18.65 8.66 18.48 8.35 18.29C7.81 17.95 7.78 17.95 6.55 18.38C5.87 18.62 5.18 18.76 5.03 18.7C4.87 18.65 4.27 17.75 3.68 16.71C2.46 14.56 2.46 14.51 3.83 13.48C4.61 12.89 4.68 12.78 4.68 12C4.68 11.23 4.62 11.11 3.93 10.62C3.51 10.33 3.04 9.89 2.88 9.65C2.61 9.23 2.64 9.12 3.67 7.3C4.26 6.26 4.88 5.35 5.03 5.29C5.19 5.23 5.85 5.37 6.5 5.61C8.28 6.25 8.92 5.9 9.21 4.11C9.31 3.45 9.49 2.81 9.6 2.68C9.88 2.34 14.12 2.34 14.4 2.68C14.51 2.81 14.7 3.47 14.81 4.14C15.01 5.25 15.09 5.4 15.66 5.71C16.27 6.04 16.31 6.03 17.48 5.61C18.14 5.38 18.81 5.23 18.97 5.29C19.12 5.35 19.74 6.26 20.33 7.3C21.37 9.11 21.4 9.21 21.12 9.64C20.96 9.89 20.49 10.33 20.07 10.62C19.39 11.11 19.32 11.23 19.32 12C19.32 12.77 19.39 12.89 20.07 13.38C20.49 13.67 20.96 14.11 21.12 14.36C21.4 14.79 21.37 14.89 20.33 16.7C19.74 17.74 19.12 18.65 18.97 18.71C18.81 18.77 18.14 18.62 17.48 18.39C16.3 17.96 16.27 17.96 15.64 18.3C15.29 18.49 15 18.69 15 18.75C14.99 19.31 14.59 21.1 14.42 21.3C14.12 21.66 9.89 21.68 9.6 21.32ZM13.51 14.76C15.49 13.71 15.74 11.14 14 9.62C12.71 8.48 11.08 8.56 9.82 9.82C8.56 11.08 8.48 12.71 9.62 14C10.7 15.24 12.09 15.51 13.51 14.76Z\"]},{\"id\":\"bt-share\",\"label\":\"Share\",\"set\":\"solid\",\"paths\":[\"M2.66 19.84C2.33 19.51 2.39 18.31 2.82 16.52C3.66 12.99 5.96 10.05 9.22 8.34C10.5 7.67 12.94 6.94 13.9 6.94C14.43 6.94 14.44 6.92 14.44 5.81C14.44 4.94 14.52 4.6 14.81 4.31C15.02 4.11 15.28 3.94 15.38 3.94C15.9 3.94 16.78 4.66 18.97 6.88C22.47 10.42 22.47 10.46 18.69 14.21C16.61 16.27 15.89 16.88 15.51 16.88C14.81 16.88 14.44 16.24 14.44 15.03L14.44 14.01L13.22 14.14C9.87 14.48 6.22 16.44 3.97 19.1C3.11 20.13 3.01 20.19 2.66 19.84Z\"]},{\"id\":\"bt-stars\",\"label\":\"Stars\",\"set\":\"solid\",\"paths\":[\"M16.79 19.35C16.61 18.54 15.66 17.52 14.75 17.14L13.93 16.8L14.81 16.39C15.76 15.95 16.58 15.05 16.79 14.2C16.92 13.68 17.25 13.48 17.25 13.93C17.25 14.56 18.36 15.9 19.24 16.33L20.16 16.79L19.25 17.23C18.37 17.66 17.25 19 17.25 19.63C17.25 20.09 16.91 19.88 16.79 19.35ZM9.4 18.66C8.72 15.97 6.86 13.96 4.22 13.03C3.91 12.93 4.01 12.84 4.78 12.54C6.91 11.72 8.33 10.17 9.2 7.71L9.69 6.32L9.81 7.05C10 8.2 10.78 9.66 11.73 10.68C12.56 11.56 14.51 12.74 15.17 12.76C15.33 12.76 14.86 13.05 14.12 13.4C11.92 14.43 10.49 16.18 9.87 18.6L9.62 19.56L9.4 18.66ZM14.81 10.07C14.81 9.44 13.7 8.1 12.82 7.67L11.91 7.21L12.82 6.77C13.69 6.34 14.81 5 14.81 4.37C14.81 3.87 15.1 4.15 15.44 4.97C15.83 5.91 16.56 6.61 17.52 6.96L18.16 7.19L17.27 7.6C16.29 8.06 15.7 8.69 15.34 9.67C15.11 10.31 14.81 10.53 14.81 10.07Z\"]},{\"id\":\"bt-unlock\",\"label\":\"Unlock\",\"set\":\"solid\",\"paths\":[\"M5.54 21.15C5.3 20.79 5.25 19.96 5.25 15.84C5.25 10.25 5.28 10.13 6.57 10.13L7.31 10.12L7.31 8.15C7.31 6.52 7.38 6.03 7.72 5.31C9.45 1.64 14.37 1.49 16.17 5.05C16.83 6.34 16.89 7.75 16.31 8.07C15.5 8.5 14.96 7.98 14.73 6.56C14.55 5.42 13.16 4.31 11.9 4.31C11.09 4.31 10.06 4.97 9.61 5.77C9.25 6.4 9.19 6.8 9.19 8.32L9.19 10.12L13.68 10.12C18.1 10.12 18.17 10.13 18.46 10.54C18.89 11.16 18.89 20.52 18.46 21.15C18.17 21.56 18.16 21.56 12 21.56C5.84 21.56 5.83 21.56 5.54 21.15ZM12.59 18.44C12.82 18.24 12.94 17.87 12.94 17.39C12.94 16.87 13.08 16.48 13.41 16.09C14.06 15.32 14.03 14.43 13.33 13.65C12.88 13.14 12.65 13.04 12 13.04C11.35 13.04 11.12 13.14 10.67 13.65C9.97 14.43 9.94 15.32 10.59 16.09C10.91 16.47 11.06 16.87 11.06 17.36C11.06 18.53 11.86 19.1 12.59 18.44Z\"]},{\"id\":\"bt-usd\",\"label\":\"USD\",\"set\":\"solid\",\"paths\":[\"M3.82 14.15C3.31 13.64 3.31 13.66 3.81 10.88L4.03 9.66L4.94 9.6L5.85 9.54L5.7 10.54C5.61 11.08 5.54 11.87 5.54 12.28C5.53 12.98 5.57 13.03 6.11 13.09C6.43 13.12 6.78 13.03 6.88 12.9C6.99 12.77 7.2 11.98 7.35 11.16L7.61 9.66L8.52 9.6C9.42 9.54 9.43 9.54 9.32 10.07C9.27 10.36 9.12 11.25 8.99 12.05C8.79 13.33 8.68 13.57 8.12 14.07C7.52 14.59 7.39 14.62 5.89 14.62C4.44 14.62 4.25 14.58 3.82 14.15ZM9.07 14.33C9.14 14.17 9.19 13.83 9.19 13.58C9.19 13.15 9.25 13.12 10.28 13.12C10.88 13.12 11.43 13.07 11.49 13.01C11.55 12.95 11.35 12.56 11.05 12.14C10.38 11.21 10.35 10.63 10.96 10.02C11.38 9.6 11.56 9.56 13.21 9.56C14.98 9.56 15 9.57 15 10.02C15 10.9 14.83 11.06 13.87 11.06C12.82 11.06 12.61 11.25 13.13 11.72C13.34 11.91 13.6 12.39 13.72 12.79C13.91 13.43 13.89 13.57 13.56 14.02C13.19 14.52 13.12 14.53 11.07 14.58C9.19 14.63 8.97 14.6 9.07 14.33ZM14.71 14.2C14.76 13.97 14.93 13.02 15.09 12.09C15.58 9.25 15.26 9.56 17.64 9.56C19.61 9.56 19.73 9.59 20.19 10.05C20.62 10.48 20.66 10.62 20.54 11.5C20.18 14.31 19.8 14.62 16.71 14.62C14.64 14.62 14.62 14.62 14.71 14.2ZM18.33 12.89C18.43 12.76 18.58 12.37 18.65 12.02C18.81 11.29 18.59 11.07 17.7 11.07C17.14 11.06 17.1 11.11 16.93 12C16.83 12.51 16.79 12.97 16.84 13.03C17.03 13.22 18.15 13.12 18.33 12.89Z\"]},{\"id\":\"bt-user\",\"label\":\"User\",\"set\":\"solid\",\"paths\":[\"M6.11 21.37C5.24 21.11 4.36 20.12 4.13 19.14C3.81 17.82 4.16 15.4 4.89 13.92C5.33 13.02 5.64 12.65 6.25 12.3C7.62 11.51 8.02 11.52 9.64 12.37C11.6 13.4 12.39 13.4 14.38 12.36C15.81 11.62 15.89 11.6 16.69 11.81C18.68 12.35 19.88 14.6 19.88 17.8C19.88 19.76 19.52 20.47 18.19 21.14C17.38 21.55 17.2 21.56 12.01 21.55C9.06 21.54 6.41 21.46 6.11 21.37ZM10.24 11.35C9.32 11.02 8.12 9.88 7.67 8.91C7.21 7.92 7.21 6.15 7.66 5.15C8.1 4.2 9.5 2.95 10.46 2.66C12.58 2.02 14.75 2.89 15.88 4.82C16.56 5.98 16.61 7.94 16 9.09C14.89 11.17 12.43 12.13 10.24 11.35Z\"]},{\"id\":\"bt-users\",\"label\":\"Users\",\"set\":\"solid\",\"paths\":[\"M3.17 19.82C2.58 19.37 2.44 18.77 2.44 16.73C2.44 14.91 2.49 14.61 2.86 14.06C3.51 13.11 4.11 12.76 5.34 12.63L6.47 12.52L6.47 16.29L6.47 20.06L4.97 20.06C4.09 20.05 3.35 19.96 3.17 19.82ZM7.61 19.77C7.55 19.6 7.5 18.14 7.5 16.52C7.5 13.84 7.54 13.51 7.92 12.76C8.58 11.48 9.19 11.25 12 11.25C14.81 11.25 15.42 11.48 16.08 12.76C16.46 13.51 16.5 13.84 16.5 16.52C16.5 18.14 16.45 19.6 16.39 19.77C16.29 20.02 15.72 20.06 12 20.06C8.28 20.06 7.71 20.02 7.61 19.77ZM17.53 16.29L17.53 12.52L18.66 12.63C19.89 12.76 20.49 13.11 21.14 14.06C21.51 14.61 21.56 14.91 21.56 16.73C21.56 19.71 21.31 20.05 19.03 20.06L17.53 20.06L17.53 16.29ZM5.09 11.68C3.28 10.79 3.32 8.1 5.15 7.23C6.76 6.47 8.62 7.66 8.62 9.45C8.63 10.45 8.03 11.33 7.12 11.7C6.18 12.07 5.88 12.07 5.09 11.68ZM16.78 11.65C14.86 10.76 14.92 8.02 16.88 7.24C17.82 6.86 18.07 6.86 18.88 7.25C20.7 8.11 20.7 10.83 18.88 11.69C18.05 12.08 17.71 12.08 16.78 11.65ZM10.41 10.07C9.06 9.31 8.42 7.83 8.81 6.39C9.68 3.14 14.32 3.14 15.19 6.39C15.93 9.14 12.9 11.48 10.41 10.07Z\"]},{\"id\":\"bt-wallet\",\"label\":\"Wallet\",\"set\":\"solid\",\"paths\":[\"M2.85 20.9L2.44 20.6L2.44 14.17C2.44 8.18 2.46 7.72 2.78 7.44C3.09 7.16 3.97 7.12 11.49 7.13C18.84 7.13 19.88 7.16 20.14 7.42C20.37 7.64 20.44 8.12 20.44 9.39L20.44 11.06L16.97 11.06L13.51 11.06L12.92 11.59C12.39 12.06 12.32 12.25 12.23 13.45C12.11 15.19 12.29 16.06 12.88 16.61C13.36 17.05 13.43 17.06 16.9 17.06L20.44 17.06L20.44 18.81C20.44 20.27 20.38 20.62 20.09 20.88C19.79 21.16 18.92 21.19 11.51 21.19C4.36 21.19 3.22 21.15 2.85 20.9ZM13.29 16C13.11 15.79 13.03 15.16 13.03 14.02C13.03 11.73 12.88 11.81 17.24 11.81C21.67 11.81 21.56 11.76 21.56 14.04C21.56 16.4 21.73 16.31 17.21 16.31C14.03 16.31 13.51 16.27 13.29 16ZM16.28 14.22C16.38 13.33 15.17 13.05 14.9 13.9C14.74 14.41 15.15 14.84 15.73 14.78C16.1 14.73 16.23 14.6 16.28 14.22ZM9.45 4.57C13.3 2.63 13.64 2.56 14.17 3.58C14.33 3.9 14.44 4.19 14.4 4.22C14.27 4.35 6.62 6.37 6.28 6.37C6.07 6.36 7.5 5.55 9.45 4.57ZM9.58 6.3C9.72 6.17 16.71 4.31 17.07 4.31C17.5 4.31 17.95 4.94 18.11 5.78L18.23 6.38L13.87 6.38C11.47 6.38 9.54 6.34 9.58 6.3Z\"]},{\"id\":\"bt-wave\",\"label\":\"Wave\",\"set\":\"solid\",\"paths\":[\"M13.36 19.32C12.92 19.12 12.12 18.54 11.58 18.03C11.04 17.52 9.77 16.62 8.77 16.03C7.76 15.45 6.89 14.88 6.83 14.78C6.76 14.68 6.77 14.4 6.83 14.15C6.99 13.51 7.55 13.55 9.27 14.33C10.05 14.69 10.69 14.95 10.69 14.91C10.69 14.88 9.8 14.19 8.73 13.39C7.65 12.59 6.72 11.81 6.66 11.66C6.48 11.2 6.75 10.69 7.24 10.57C7.61 10.48 8.15 10.75 9.9 11.91L12.09 13.37L10.24 11.42C8.07 9.14 7.86 8.79 8.34 8.25C8.53 8.04 8.82 7.88 8.98 7.88C9.14 7.88 10.19 8.78 11.32 9.89L13.36 11.91L12.12 9.54C11.43 8.24 10.88 7 10.88 6.78C10.88 6.33 11.49 5.93 11.96 6.08C12.14 6.14 13.06 7.43 14 8.95C14.95 10.47 15.86 11.89 16.03 12.09L16.34 12.47L16.22 12.09C16.15 11.89 16.05 11.25 15.99 10.68C15.88 9.48 16.21 8.64 16.98 8.13C17.61 7.72 17.84 7.96 18.01 9.26C18.09 9.82 18.47 10.98 18.86 11.84C20.07 14.49 19.95 16.68 18.49 18.33C18.17 18.7 17.57 19.15 17.16 19.34C16.14 19.8 14.4 19.79 13.36 19.32ZM5.67 18.25C4.92 17.88 4.31 16.93 4.31 16.13C4.31 15.34 4.73 15.47 4.9 16.32C5.05 17.06 5.8 17.78 6.58 17.94C7.22 18.07 7.32 18.56 6.7 18.56C6.47 18.56 6.01 18.42 5.67 18.25ZM6.46 17.18C5.92 16.94 5.44 16.22 5.44 15.65C5.44 15.16 5.91 15.36 6.13 15.94C6.27 16.31 6.55 16.58 6.93 16.71C7.25 16.83 7.49 17.01 7.45 17.12C7.35 17.43 7.08 17.44 6.46 17.18ZM14.9 6.89C14.76 6.43 14.57 6.24 14.11 6.1C13.38 5.89 13.3 5.44 13.98 5.44C14.62 5.44 15.56 6.38 15.56 7.02C15.56 7.7 15.11 7.62 14.9 6.89ZM16.12 6.64C16.12 5.99 15.01 4.88 14.36 4.88C14.05 4.88 13.88 4.77 13.88 4.59C13.88 4.19 14.78 4.24 15.51 4.68C15.84 4.88 16.24 5.3 16.4 5.61C16.77 6.33 16.78 7.12 16.41 7.12C16.23 7.12 16.12 6.95 16.12 6.64Z\"]},{\"id\":\"bt-yes\",\"label\":\"Yes\",\"set\":\"solid\",\"paths\":[\"M8.72 18.76C8.51 18.67 7.01 17.26 5.39 15.61C2.81 13 2.44 12.55 2.44 12.03C2.44 11.22 3.15 10.5 3.96 10.5C4.48 10.5 4.89 10.82 6.92 12.84L9.28 15.18L14.25 10.23C17.47 7.02 19.4 5.23 19.74 5.15C20.69 4.91 21.75 6.01 21.5 6.97C21.34 7.59 10.15 18.7 9.56 18.83C9.3 18.88 8.93 18.85 8.72 18.76Z\"]},{\"id\":\"bt-boost\",\"label\":\"Boost\",\"set\":\"solid\",\"paths\":[\"M11.32 20.4C11.02 20.17 9.79 19.15 8.58 18.14L6.38 16.29L6.38 12L6.38 7.71L8.58 5.86C9.79 4.84 11.06 3.81 11.39 3.56L12 3.12L12.61 3.56C12.94 3.81 14.21 4.84 15.42 5.86L17.63 7.71L17.62 12L17.62 16.29L15.42 18.14C12.82 20.32 12.18 20.81 12 20.81C11.92 20.81 11.62 20.63 11.32 20.4ZM13.69 16.3L15.19 14.98L15.19 12L15.19 9.02L13.69 7.7C12.86 6.97 12.1 6.37 12 6.37C11.9 6.37 11.14 6.97 10.31 7.7L8.81 9.02L8.81 12L8.81 14.98L10.31 16.3C11.14 17.03 11.9 17.62 12 17.62C12.1 17.62 12.86 17.03 13.69 16.3ZM11.2 14.99L10.5 14.41L10.5 12L10.5 9.59L11.26 8.99L12.02 8.39L12.71 8.95L13.41 9.51L13.46 11.96L13.51 14.4L12.81 14.98C12.42 15.3 12.06 15.56 12 15.56C11.94 15.56 11.58 15.3 11.2 14.99Z\"]},{\"id\":\"bt-event-add\",\"label\":\"Add event\",\"set\":\"solid\",\"paths\":[\"M2.42 22.86C1.83 22.65 1.51 22.37 1.24 21.82L1 21.33L1.02 13.47L1.04 5.61L1.21 5.3C1.46 4.82 2 4.36 2.48 4.22C2.7 4.15 3.16 4.1 3.49 4.1L4.09 4.1L4.12 3.07L4.14 2.05L5.18 2.05L6.23 2.05L6.25 3.07L6.27 4.1L9.41 4.1L12.54 4.1L12.54 6.73L12.54 9.37L7.82 9.37L3.09 9.37L3.09 15.14L3.09 20.91L10.41 20.91L17.73 20.91L17.73 16.18L17.73 11.46L18.78 11.46L19.83 11.46L19.81 16.52L19.79 21.58L19.55 21.96C19.3 22.37 18.74 22.79 18.29 22.92C18.1 22.97 15.35 23 10.41 23C3.33 23 2.79 22.99 2.42 22.86ZM5.18 14.09L5.18 11.46L7.82 11.46L10.45 11.46L10.43 14.07L10.41 16.69L7.8 16.71L5.18 16.73L5.18 14.09ZM17.73 7.78L17.73 6.19L16.18 6.19L14.63 6.19L14.63 5.14L14.63 4.1L16.18 4.1L17.73 4.1L17.73 2.55L17.73 1L18.78 1L19.82 1L19.82 2.55L19.82 4.1L21.41 4.1L23 4.1L23 5.14L23 6.19L21.43 6.21L19.86 6.23L19.84 7.8L19.82 9.37L18.78 9.37L17.73 9.37L17.73 7.78Z\"]},{\"id\":\"bt-statistics\",\"label\":\"Statistics\",\"set\":\"solid\",\"paths\":[\"M5.38 20.77L5.38 18.58L3.88 18.55C2.4 18.52 2.37 18.51 1.93 18.2C1.68 18.03 1.38 17.68 1.24 17.43L1 16.97L1 9.84C1 2.99 1.01 2.7 1.2 2.32C1.47 1.8 2.04 1.3 2.54 1.16C3.08 1.01 20.92 1.01 21.46 1.16C21.96 1.3 22.53 1.8 22.8 2.32C22.99 2.7 23 2.99 23 9.84L23 16.97L22.76 17.43C22.62 17.68 22.31 18.03 22.07 18.2L21.63 18.52L16.47 18.55L11.3 18.57L8.47 20.69C6.91 21.85 5.58 22.84 5.51 22.88C5.41 22.94 5.38 22.5 5.38 20.77ZM9.38 17.23L10.52 16.38L15.67 16.38L20.81 16.38L20.81 9.81L20.81 3.24L12 3.24L3.19 3.24L3.19 9.81L3.19 16.38L5.38 16.38L7.57 16.38L7.57 17.49L7.57 18.59L7.91 18.34C8.09 18.2 8.76 17.7 9.38 17.23ZM6.45 9.84L6.47 5.48L7.59 5.45L8.72 5.42L8.72 9.81L8.72 14.19L7.57 14.19L6.42 14.19L6.45 9.84ZM10.91 12L10.91 9.81L12 9.81L13.09 9.81L13.09 12L13.09 14.19L12 14.19L10.91 14.19L10.91 12ZM15.28 10.91L15.28 7.62L16.38 7.62L17.47 7.62L17.47 10.91L17.47 14.19L16.38 14.19L15.28 14.19L15.28 10.91Z\"]},{\"id\":\"bt-developer\",\"label\":\"Developer\",\"set\":\"solid\",\"paths\":[\"M3.76 16.76L1.01 12L3.76 7.24L6.51 2.48L12.02 2.5L17.53 2.52L20.14 7.01C21.57 9.48 22.8 11.61 22.88 11.75L23.03 11.99L22.33 13.19C21.95 13.86 20.72 15.99 19.59 17.94L17.54 21.48L12.02 21.5L6.51 21.52L3.76 16.76ZM13.33 12.31C14.26 9.33 14.99 6.85 14.96 6.82C14.84 6.72 12.84 6.14 12.79 6.2C12.71 6.28 9.36 17.11 9.4 17.16C9.49 17.24 11.55 17.84 11.59 17.8C11.62 17.77 12.4 15.3 13.33 12.31ZM7.26 12.9L6.37 12L7.26 11.1L8.16 10.21L8.16 8.69L8.16 7.17L5.74 9.58L3.32 12L5.72 14.4L8.12 16.8L8.14 15.3L8.16 13.79L7.26 12.9ZM18.32 9.62L15.96 7.24L15.94 8.72L15.92 10.21L16.81 11.1L17.71 12L16.81 12.9L15.92 13.79L15.92 15.27L15.92 16.76L18.3 14.38L20.67 12L18.32 9.62Z\"]},{\"id\":\"bt-channel\",\"label\":\"Channel\",\"set\":\"solid\",\"paths\":[\"M5.03 22.1C4.64 21.94 4.63 21.75 4.96 19.88C5.13 18.92 5.29 18.03 5.31 17.91L5.36 17.67L3.44 17.67C1.39 17.67 1.12 17.63 1.03 17.27C1 17.16 1.03 16.76 1.09 16.38C1.25 15.32 1.13 15.37 3.65 15.37L5.76 15.37L5.86 14.79C5.91 14.48 6.17 12.97 6.44 11.45L6.93 8.67L4.9 8.63C2.86 8.59 2.86 8.59 2.69 8.38C2.51 8.16 2.52 8.13 2.71 7.13C2.87 6.34 2.74 6.38 5.19 6.33L7.35 6.29L7.7 4.33C7.89 3.25 8.07 2.28 8.11 2.19C8.19 1.92 8.52 1.81 9.24 1.81C9.8 1.81 9.9 1.83 10.09 2.02C10.2 2.13 10.29 2.28 10.29 2.34C10.29 2.45 9.76 5.57 9.65 6.09L9.6 6.33L12.96 6.33L16.33 6.33L16.46 5.63C16.53 5.24 16.69 4.31 16.83 3.56C17.13 1.85 17.16 1.81 18.1 1.81C18.72 1.81 19.05 1.9 19.18 2.1C19.3 2.27 19.24 2.77 18.92 4.56L18.6 6.33L20.55 6.33C22.54 6.33 22.75 6.36 22.92 6.67C23.03 6.89 22.8 8.27 22.61 8.46C22.5 8.57 22.12 8.6 20.34 8.63L18.19 8.67L17.62 11.91C17.3 13.7 17.04 15.2 17.04 15.26C17.03 15.34 17.49 15.37 19.03 15.37C20.93 15.37 21.05 15.38 21.21 15.54C21.41 15.74 21.42 16.04 21.26 16.82C21.07 17.69 21.13 17.67 18.69 17.67L16.62 17.67L16.58 17.86C16.56 17.97 16.39 18.89 16.21 19.92C16 21.14 15.84 21.85 15.74 21.97C15.63 22.11 15.48 22.15 14.95 22.18C14.17 22.22 13.81 22.1 13.73 21.77C13.7 21.64 13.79 20.85 13.96 19.89C14.12 18.97 14.26 18.1 14.28 17.95L14.32 17.67L10.97 17.69L7.61 17.71L7.26 19.67C7.07 20.75 6.89 21.72 6.85 21.81C6.82 21.91 6.7 22.04 6.58 22.09C6.33 22.21 5.31 22.21 5.03 22.1ZM14.77 15.18C14.82 14.98 15.92 8.74 15.92 8.67C15.92 8.65 14.41 8.63 12.55 8.63C10.7 8.63 9.19 8.66 9.19 8.69C9.19 8.79 8.07 15.15 8.03 15.26C8.01 15.35 8.71 15.37 11.36 15.37L14.73 15.37L14.77 15.18Z\"]},{\"id\":\"bt-upload\",\"label\":\"Upload\",\"set\":\"solid\",\"paths\":[\"M2.91 21.71L2.91 20.42L12 20.42L21.09 20.42L21.09 21.71L21.09 23L12 23L2.91 23L2.91 21.71ZM8.14 17.77C8.11 17.74 8.08 15.98 8.08 13.86L8.08 10L5.52 10L2.96 10L7.48 5.48L12 0.96L16.52 5.48L21.04 10L18.48 10L15.92 10L15.92 13.91L15.92 17.83L12.06 17.83C9.94 17.83 8.17 17.81 8.14 17.77Z\"]},{\"id\":\"bt-member\",\"label\":\"Member\",\"set\":\"solid\",\"paths\":[\"M1 21.96C1 19.68 1.68 17.98 3.19 16.47C4.62 15.04 6.63 14.09 9.23 13.61C10.6 13.36 13.41 13.36 14.81 13.62C17.88 14.18 20.43 15.65 21.74 17.63C22.57 18.88 22.89 19.96 22.97 21.8L23.03 23L12.01 23L1 23L1 21.96ZM10.74 11.88C8.37 11.22 6.86 9.53 6.54 7.2C6.16 4.41 8.11 1.67 10.88 1.12C12.16 0.87 13.22 1.02 14.44 1.62C15.06 1.93 15.33 2.12 15.83 2.62C16.91 3.72 17.37 4.74 17.44 6.26C17.49 7.35 17.35 7.99 16.87 8.99C16.6 9.55 16.41 9.81 15.84 10.37C15.12 11.09 14.56 11.44 13.65 11.77C13.03 11.99 11.34 12.06 10.74 11.88Z\"]},{\"id\":\"bt-copy\",\"label\":\"Copy\",\"set\":\"solid\",\"paths\":[\"M7.87 22.88C7.38 22.71 7.04 22.42 6.78 21.98L6.54 21.58L6.54 14.02L6.54 6.46L6.73 6.1C6.97 5.66 7.43 5.27 7.87 5.14C8.09 5.07 9.36 5.04 11.84 5.04L15.48 5.04L18.47 8.03L21.45 11.01L21.45 16.22C21.45 21.88 21.47 21.72 20.97 22.31C20.85 22.46 20.58 22.66 20.39 22.77L20.04 22.96L14.11 22.98C9.41 22.99 8.11 22.97 7.87 22.88ZM19.48 16.51L19.48 12L16.98 12L14.49 12L14.49 9.51L14.49 7.01L11.51 7.04L8.52 7.06L8.5 13.93C8.49 17.71 8.49 20.86 8.52 20.92C8.55 21 9.73 21.02 14.02 21.02L19.48 21.02L19.48 16.51ZM2.55 9.76C2.55 2.58 2.55 2.54 2.73 2.16C2.83 1.94 3.05 1.65 3.22 1.51C3.84 1 3.8 1 10.43 1L16.47 1L16.47 2.03L16.47 3.06L10.5 3.06L4.52 3.06L4.52 10.02L4.52 16.98L3.54 16.98L2.55 16.98L2.55 9.76Z\"]},{\"id\":\"bt-media\",\"label\":\"Media\",\"set\":\"solid\",\"paths\":[\"M4.05 22.79C2.51 22.26 1.41 21.05 1.09 19.54C1.03 19.22 1 16.64 1.02 11.72L1.05 4.37L1.3 3.79C1.8 2.62 2.7 1.72 3.84 1.26L4.37 1.05L11.91 1.05C19.05 1.05 19.47 1.06 19.98 1.22C21.15 1.61 22.26 2.66 22.74 3.84L22.95 4.37L22.98 11.72C23 16.61 22.97 19.22 22.91 19.52C22.77 20.15 22.34 21.03 21.92 21.51C21.46 22.05 20.62 22.59 19.88 22.82C19.31 22.99 19.01 23 11.97 23L4.65 23L4.05 22.79ZM18.44 18.26C17.54 16.12 15.38 11.1 15.33 11.05C15.29 11.01 14.29 12.18 13.11 13.66C11.93 15.14 10.94 16.34 10.91 16.34C10.87 16.34 10.37 15.86 9.78 15.28L8.7 14.21L7.07 16.38L5.44 18.56L12 18.56L18.57 18.56L18.44 18.26ZM8.73 9.45C9.31 9.09 9.71 8.46 9.76 7.8C9.92 5.85 7.66 4.7 6.16 5.98C5.67 6.4 5.44 6.91 5.44 7.6C5.44 8.29 5.68 8.83 6.2 9.28C6.68 9.68 6.99 9.78 7.72 9.75C8.16 9.73 8.38 9.67 8.73 9.45Z\"]},{\"id\":\"bt-owner\",\"label\":\"Owner\",\"set\":\"solid\",\"paths\":[\"M3.22 21.26L3.22 20.19L12.04 20.19L20.85 20.19L20.85 21.26L20.85 22.33L12.04 22.33L3.22 22.33L3.22 21.26ZM3.8 18.92C3.64 18.84 3.47 18.69 3.4 18.59C3.27 18.39 1 9.46 1 9.15C1 9.05 1.07 8.83 1.14 8.66C1.32 8.27 1.83 8 2.24 8.06C2.4 8.09 3.44 8.67 4.86 9.52C6.15 10.29 7.23 10.93 7.25 10.93C7.28 10.93 8.18 9.6 9.26 7.99L11.22 5.05L10.63 4.44C9.82 3.61 9.81 3.64 10.91 2.54C11.62 1.83 11.82 1.67 12 1.67C12.17 1.67 12.38 1.83 13.09 2.53C14.21 3.65 14.21 3.65 13.37 4.52C13.04 4.86 12.8 5.14 12.84 5.16C12.87 5.17 13.75 6.45 14.78 8C15.81 9.55 16.68 10.85 16.71 10.88C16.75 10.92 17.77 10.35 19.16 9.52C20.98 8.43 21.61 8.08 21.84 8.06C22.45 8 23 8.5 23 9.12C23 9.3 22.49 11.47 21.88 13.93C20.67 18.77 20.68 18.75 20.14 18.97C19.94 19.06 18.5 19.07 11.98 19.07C4.26 19.07 4.07 19.06 3.8 18.92Z\"]},{\"id\":\"bt-edit\",\"label\":\"Edit\",\"set\":\"solid\",\"paths\":[\"M1.49 22.57C0.87 22.15 0.87 22.09 1.7 18.84L2.44 15.91L3.99 17.4C4.85 18.22 6.11 19.45 6.79 20.14C7.94 21.29 8.02 21.39 7.79 21.44C7.66 21.48 6.37 21.79 4.92 22.15C3.48 22.51 2.19 22.8 2.06 22.8C1.93 22.8 1.68 22.7 1.49 22.57ZM6.81 17.13L3.67 14.05L8.38 9.42L13.09 4.79L16.17 7.82C17.86 9.48 19.26 10.87 19.28 10.9C19.3 10.96 18.11 12.15 12 18.18L9.94 20.2L6.81 17.13ZM17.75 6.35L14.65 3.32L15.25 2.7C17.05 0.86 19.82 0.78 21.65 2.51C23 3.78 23.36 5.81 22.54 7.47C22.31 7.96 21.08 9.41 20.91 9.4C20.88 9.39 19.45 8.03 17.75 6.35Z\"]},{\"id\":\"bt-location\",\"label\":\"Location\",\"set\":\"solid\",\"paths\":[\"M10.7 22.94C7 22.67 4.51 22.02 2.7 20.88C0.24 19.32 0.56 17.28 3.5 15.81C4.19 15.47 6.08 14.8 6.36 14.8C6.47 14.8 6.5 15 6.5 15.86C6.5 16.85 6.49 16.92 6.31 16.92C6.2 16.92 5.71 17.05 5.22 17.21C1.94 18.26 2.86 19.66 7.32 20.4C13 21.33 20.78 20.28 20.78 18.58C20.78 17.96 19.68 17.33 17.93 16.95L17.55 16.87L17.52 15.83C17.5 14.96 17.52 14.8 17.64 14.8C17.9 14.8 19.65 15.39 20.38 15.72C23.78 17.29 23.89 19.65 20.64 21.29C19.21 22.01 17.56 22.47 15.37 22.75C14.24 22.9 11.56 23.01 10.7 22.94ZM11.85 19.49C11.8 19.42 11.34 18.82 10.83 18.16C7.33 13.66 5.44 9.92 5.44 7.5C5.44 5.62 6.47 3.53 7.97 2.39C9.33 1.37 10.69 0.95 12.39 1.03C14.14 1.12 15.4 1.69 16.69 2.97C18.16 4.45 18.86 6.45 18.57 8.33C18.26 10.32 16.79 13.27 14.5 16.49C13.58 17.78 12.12 19.62 12.02 19.62C11.98 19.62 11.91 19.56 11.85 19.49ZM13.04 9.5C14.12 8.95 14.52 7.67 13.95 6.6C12.94 4.67 10.05 5.23 9.9 7.38C9.84 8.11 10.04 8.66 10.54 9.14C10.75 9.34 11.08 9.57 11.29 9.64C11.77 9.82 12.53 9.76 13.04 9.5Z\"]},{\"id\":\"bt-manager\",\"label\":\"Manager\",\"set\":\"solid\",\"paths\":[\"M11.02 22.62C9.06 21.52 7.17 20.13 5.8 18.77C4.51 17.48 3.78 16.37 3.47 15.23C3.34 14.77 3.34 14.58 3.34 10.5C3.34 7.66 3.36 6.2 3.41 6.08C3.51 5.81 3.84 5.5 4.09 5.43C4.22 5.39 4.47 5.36 4.65 5.36C6.53 5.36 8.97 3.93 10.85 1.74C11.35 1.15 11.58 1 11.97 1C12.37 1 12.67 1.17 13.01 1.6C13.48 2.2 14.75 3.38 15.42 3.86C16.16 4.39 17.23 4.93 17.97 5.14C18.3 5.24 18.83 5.33 19.21 5.35C20.09 5.42 20.35 5.56 20.56 6.07C20.71 6.43 20.71 14.24 20.56 14.96C20.18 16.8 18.53 18.8 15.6 20.92C14.78 21.52 13.43 22.37 12.72 22.75C12.04 23.11 11.88 23.1 11.02 22.62ZM11.36 14.61C11.68 14.38 11.98 14.22 12.02 14.23C12.06 14.25 12.77 14.71 13.58 15.27C14.4 15.82 15.1 16.3 15.14 16.32C15.18 16.34 14.97 15.63 14.68 14.74L14.16 13.12L14.84 12.38C15.22 11.98 15.69 11.5 15.89 11.3L16.24 10.96L14.65 10.93L13.06 10.89L12.52 9.25L11.98 7.61L11.44 9.25L10.89 10.89L9.3 10.93L7.7 10.96L8.74 12C9.32 12.57 9.79 13.09 9.79 13.14C9.79 13.19 9.56 13.92 9.28 14.75C9 15.58 8.78 16.29 8.78 16.32C8.78 16.36 9.67 15.77 11.36 14.61Z\"]},{\"id\":\"bt-verified\",\"label\":\"Verified\",\"set\":\"solid\",\"paths\":[\"M8.49 22.34C8.15 22.18 7.88 21.83 7.41 20.89C6.72 19.51 6.48 19.33 5.08 19.13C4 18.98 3.56 18.84 3.24 18.54C2.87 18.19 2.83 17.85 3.03 16.64C3.31 14.89 3.26 14.74 2.13 13.64C1.34 12.88 1 12.38 1 12C1 11.63 1.29 11.19 2.05 10.42C2.46 10 2.88 9.54 2.96 9.42C3.19 9.08 3.21 8.59 3.05 7.57C2.96 7.09 2.9 6.55 2.9 6.36C2.9 5.47 3.32 5.16 4.85 4.94C6.47 4.7 6.73 4.52 7.41 3.14C8.06 1.82 8.35 1.53 9.04 1.53C9.3 1.53 9.56 1.63 10.44 2.08C11.03 2.39 11.65 2.66 11.81 2.68C12.21 2.75 12.72 2.59 13.73 2.07C14.37 1.75 14.66 1.64 14.95 1.61C15.7 1.55 15.92 1.76 16.64 3.14C16.91 3.66 17.24 4.2 17.38 4.34C17.68 4.64 17.93 4.72 19.2 4.93C20.28 5.11 20.68 5.28 20.94 5.67C21.15 5.98 21.16 6.57 20.96 7.73C20.8 8.62 20.81 8.97 21.01 9.35C21.07 9.48 21.49 9.95 21.94 10.42C22.85 11.34 23 11.57 23 12C23 12.46 22.82 12.75 21.94 13.65C21.49 14.12 21.07 14.6 21.01 14.72C20.86 15.01 20.86 15.73 21 16.51C21.17 17.38 21.17 18.03 20.99 18.33C20.76 18.72 20.37 18.89 19.21 19.08C17.54 19.35 17.38 19.47 16.6 20.98C15.97 22.22 15.53 22.58 14.81 22.44C14.67 22.42 14.11 22.17 13.57 21.89C12.6 21.39 12.57 21.38 12.04 21.38C11.52 21.38 11.48 21.4 10.45 21.89C9.26 22.46 8.91 22.54 8.49 22.34ZM14.54 12.81C16.23 10.53 17.61 8.63 17.62 8.58C17.62 8.51 15.95 7.22 15.84 7.22C15.81 7.22 15.21 7.97 14.53 8.89C13.84 9.81 12.73 11.28 12.06 12.16L10.85 13.76L9.56 12.76C8.85 12.22 8.24 11.75 8.2 11.71C8.15 11.67 7.89 11.97 7.48 12.55C7.12 13.04 6.82 13.47 6.82 13.51C6.82 13.61 11.28 16.99 11.38 16.97C11.43 16.96 12.85 15.09 14.54 12.81Z\"]},{\"id\":\"bt-voice\",\"label\":\"Voice channel\",\"set\":\"solid\",\"paths\":[\"M10.99 22.31C10.86 22.26 9.61 20.97 8.18 19.41L5.61 16.59L3.74 16.59C1.68 16.59 1.55 16.56 1.21 16.05L1 15.75L1 12.03C1 7.99 1 8 1.51 7.6C1.74 7.42 1.86 7.41 3.68 7.41L5.61 7.41L8.18 4.6C10.97 1.54 11.05 1.47 11.73 1.67C11.92 1.73 12.18 1.9 12.31 2.05L12.55 2.33L12.55 11.99L12.55 21.66L12.35 21.91C12.14 22.17 11.67 22.41 11.39 22.4C11.3 22.4 11.12 22.36 10.99 22.31ZM14.91 18.94L14.91 17.8L15.64 17.7C16.99 17.51 18.12 16.92 19.09 15.9C20.13 14.81 20.64 13.52 20.64 12C20.64 10.49 20.13 9.2 19.12 8.13C18.09 7.04 16.89 6.43 15.47 6.27L14.91 6.2L14.91 5.08L14.91 3.95L15.44 3.95C16.2 3.95 17.59 4.33 18.49 4.78C20.52 5.78 22.01 7.58 22.69 9.82C22.91 10.54 22.94 10.79 22.95 11.95C22.95 13.43 22.81 14.13 22.24 15.37C21.02 18 18.46 19.81 15.66 20.02L14.91 20.07L14.91 18.94ZM14.91 14.32L14.91 13.15L15.16 13.09C15.85 12.94 16.23 12.06 15.88 11.43C15.74 11.18 15.29 10.87 15.07 10.86C14.92 10.86 14.91 10.75 14.91 9.67L14.91 8.48L15.3 8.55C17.21 8.87 18.47 10.4 18.34 12.25C18.28 13.13 17.78 14.11 17.12 14.65C16.62 15.05 15.92 15.35 15.3 15.43L14.91 15.48L14.91 14.32Z\"]},{\"id\":\"bt-media-add\",\"label\":\"Add media\",\"set\":\"solid\",\"paths\":[\"M4.24 22.91C3.74 22.81 2.85 22.38 2.42 22.03C1.93 21.63 1.41 20.82 1.21 20.15C1.04 19.61 1.04 19.41 1.06 12.84L1.08 6.08L1.28 5.59C1.71 4.54 2.68 3.6 3.73 3.22C4.16 3.07 4.47 3.06 8.25 3.03C12.12 3.01 12.31 3.01 12.26 3.16C12.01 3.99 11.96 5.66 12.17 6.53C12.78 9.1 14.75 11.14 17.25 11.78C18.28 12.05 19.64 12.05 20.76 11.78L20.95 11.73L20.92 15.87L20.9 20.02L20.59 20.68C20.03 21.84 18.95 22.68 17.72 22.91C17.11 23.02 4.8 23.02 4.24 22.91ZM16.91 18.91C16.91 18.77 14.01 12.09 13.96 12.1C13.93 12.12 13.05 13.2 11.99 14.52C10.94 15.84 10.07 16.93 10.05 16.95C10.04 16.97 9.57 16.54 9.03 15.99L8.03 15L6.62 16.88C5.85 17.91 5.18 18.81 5.13 18.86C5.07 18.95 6.25 18.97 10.98 18.97C14.24 18.97 16.91 18.94 16.91 18.91ZM7.63 10.9C7.86 10.84 8.11 10.66 8.4 10.36C8.75 10.01 8.85 9.83 8.94 9.46C9.36 7.57 7.06 6.24 5.67 7.57C4.84 8.37 4.81 9.54 5.6 10.38C6.13 10.94 6.83 11.12 7.63 10.9ZM18 7.55L18 6.04L16.49 6.04L14.98 6.04L14.98 5.03L14.98 4.02L16.49 4.02L18 4.02L18 2.51L18 0.99L18.99 1.02L19.98 1.04L20 2.53L20.02 4.02L21.49 4.02L22.96 4.02L22.96 5.03L22.96 6.04L21.49 6.04L20.02 6.04L20 7.53L19.98 9.02L18.99 9.04L18 9.07L18 7.55Z\"]},{\"id\":\"bt-public\",\"label\":\"Public\",\"set\":\"solid\",\"paths\":[\"M10.08 22.85C6.63 22.2 3.65 19.97 2.16 16.93C1.26 15.1 0.95 13.59 1.03 11.54C1.24 6.5 4.8 2.33 9.8 1.25C10.78 1.04 13 1.01 13.9 1.2C14.92 1.4 16.11 1.82 17.04 2.3C22.61 5.16 24.61 12.17 21.42 17.62C19.99 20.06 17.5 21.93 14.72 22.65C13.45 22.98 11.25 23.08 10.08 22.85ZM10.87 19.67L10.87 18.61L10.44 18.55C9.87 18.47 9.24 18.01 8.95 17.46C8.76 17.09 8.71 16.85 8.71 16.17L8.71 15.34L6.09 12.72C4.65 11.28 3.45 10.13 3.43 10.16C3.26 10.32 3.16 12.11 3.26 12.97C3.72 16.76 6.44 19.78 10.1 20.59C10.44 20.66 10.75 20.73 10.79 20.73C10.83 20.73 10.87 20.26 10.87 19.67ZM19.04 17.19C19.63 16.4 20.16 15.33 20.45 14.3C20.75 13.23 20.78 10.97 20.5 9.96C19.81 7.41 18.23 5.41 16 4.24L15.32 3.88L15.26 4.46C15.17 5.28 14.77 5.9 14.07 6.26C13.55 6.54 13.44 6.55 12.19 6.55L10.87 6.55L10.87 7.85L10.87 9.14L10.52 9.49L10.17 9.84L8.87 9.84L7.58 9.84L7.58 10.92L7.58 12L10.98 12C14.71 12 14.83 12.02 15.13 12.61C15.26 12.85 15.29 13.3 15.29 14.66L15.29 16.4L16.21 16.44C17.03 16.47 17.17 16.5 17.57 16.78C17.81 16.96 18.11 17.27 18.22 17.48C18.33 17.69 18.46 17.85 18.5 17.83C18.54 17.82 18.78 17.53 19.04 17.19Z\"]},{\"id\":\"bt-link\",\"label\":\"Link\",\"set\":\"solid\",\"paths\":[\"M6.07 22.91C5.82 22.87 5.35 22.75 5.03 22.64C1.84 21.54 0.22 17.97 1.48 14.85C1.84 13.95 2.21 13.44 3.36 12.26L4.5 11.09L4.61 11.97C4.66 12.46 4.78 13.11 4.88 13.41L5.04 13.97L4.51 14.53C3.34 15.74 3.11 17.16 3.85 18.65C4.2 19.36 4.76 19.9 5.52 20.26C6.02 20.5 6.11 20.51 6.99 20.51C7.89 20.51 7.95 20.5 8.5 20.24C9 19.99 9.33 19.7 11.42 17.63C12.71 16.35 13.89 15.12 14.05 14.91C15.02 13.6 14.93 11.7 13.84 10.5C13.44 10.07 13.34 9.88 13.34 9.51C13.34 8.84 13.86 8.31 14.52 8.31C14.99 8.31 15.32 8.5 15.78 9.09C16.64 10.15 17.09 11.44 17.09 12.84C17.09 13.86 16.94 14.51 16.46 15.5L16.09 16.28L13.4 18.99C10.11 22.29 9.72 22.58 7.99 22.88C7.23 23.01 6.8 23.02 6.07 22.91ZM9.14 15.66C8.99 15.62 8.7 15.38 8.44 15.11C6.55 13.05 6.41 10 8.09 7.64C8.62 6.9 13.37 2.24 13.93 1.91C14.62 1.51 15.32 1.24 16.07 1.11C18.21 0.72 20.59 1.69 21.85 3.47C22.65 4.6 22.96 5.56 22.96 6.95C22.96 8.02 22.77 8.82 22.29 9.74C22 10.31 21.76 10.6 20.72 11.66L19.5 12.91L19.44 12.19C19.42 11.79 19.31 11.14 19.21 10.75L19.03 10.03L19.44 9.61C20.3 8.73 20.65 7.83 20.58 6.68C20.49 5.3 19.42 3.96 18.09 3.56C17.17 3.28 15.88 3.47 15.12 4C14.93 4.14 13.66 5.36 12.31 6.72C9.63 9.41 9.54 9.53 9.35 10.62C9.18 11.62 9.47 12.59 10.23 13.54C10.46 13.83 10.68 14.18 10.7 14.33C10.81 14.91 10.41 15.49 9.78 15.66C9.61 15.71 9.46 15.74 9.43 15.74C9.41 15.74 9.28 15.7 9.14 15.66Z\"]},{\"id\":\"bt-slowmode\",\"label\":\"Slowmode\",\"set\":\"solid\",\"paths\":[\"M10.45 22.92C7.16 22.33 4.4 20.11 3.2 17.11C2.75 15.97 2.62 15.33 2.57 13.91C2.54 12.9 2.56 12.45 2.66 11.9C3.22 8.93 5.08 6.47 7.76 5.12C10.82 3.59 14.38 3.83 17.31 5.78L17.88 6.16L18.59 5.45C18.98 5.06 19.33 4.75 19.38 4.75C19.48 4.75 20.8 6.07 20.8 6.17C20.8 6.22 20.48 6.57 20.1 6.96L19.39 7.67L19.81 8.29C21.98 11.54 21.97 15.64 19.77 18.95C19.26 19.7 18.16 20.8 17.36 21.36C16.5 21.94 15.35 22.48 14.39 22.73C13.71 22.91 13.38 22.94 12.2 22.97C11.44 22.98 10.65 22.96 10.45 22.92ZM13.02 20.84C14.52 20.68 16.24 19.77 17.36 18.55C20.3 15.36 19.86 10.39 16.4 7.72C15.07 6.7 13.73 6.26 11.92 6.27C10.57 6.28 9.89 6.44 8.7 7.03C6.77 7.99 5.46 9.6 4.86 11.72C4.78 12.02 4.71 12.64 4.69 13.34C4.66 14.31 4.68 14.6 4.82 15.2C5.57 18.33 8.11 20.57 11.27 20.88C11.87 20.94 12.07 20.94 13.02 20.84ZM10.94 11.47L10.94 8.33L12 8.33L13.06 8.33L13.06 11.47L13.06 14.61L12 14.61L10.94 14.61L10.94 11.47ZM8.82 2.02L8.82 1L11.96 1L15.1 1L15.1 2.02L15.1 3.04L11.96 3.04L8.82 3.04L8.82 2.02Z\"]},{\"id\":\"bt-delete\",\"label\":\"Delete\",\"set\":\"solid\",\"paths\":[\"M5.32 22.84C4.88 22.65 4.38 22.17 4.11 21.67C3.9 21.28 3.9 21.28 3.9 14.06L3.9 6.84L11.98 6.82L20.05 6.79L20.05 14.02C20.05 21.98 20.08 21.62 19.43 22.3C18.75 23.03 19.08 23 12 22.99C6.56 22.99 5.62 22.97 5.32 22.84ZM10.82 14.9L10.82 11.41L9.69 11.41L8.56 11.41L8.56 14.9L8.56 18.38L9.69 18.38L10.82 18.38L10.82 14.9ZM15.44 14.9L15.44 11.41L14.31 11.41L13.18 11.41L13.18 14.9L13.18 18.38L14.31 18.38L15.44 18.38L15.44 14.9ZM1.59 4.49L1.59 3.36L5.05 3.33L8.51 3.31L8.54 2.15L8.57 1L12 1L15.44 1L15.44 2.18L15.44 3.36L18.92 3.36L22.41 3.36L22.41 4.49L22.41 5.62L12 5.62L1.59 5.62L1.59 4.49Z\"]},{\"id\":\"bt-discovery\",\"label\":\"Discovery\",\"set\":\"solid\",\"paths\":[\"M10.1 22.57C5.81 21.81 2.31 18.57 1.33 14.45C0.06 9.1 3.16 3.61 8.45 1.85C9.67 1.45 10.64 1.3 12.01 1.3C13.95 1.3 15.36 1.63 17.05 2.48C19.23 3.58 20.81 5.15 21.9 7.3C23.14 9.77 23.35 12.7 22.49 15.29C21.22 19.07 17.91 21.89 13.95 22.57C12.97 22.74 11.04 22.74 10.1 22.57ZM10.01 16.36C12.39 15.28 14.36 14.36 14.41 14.32C14.5 14.23 18.59 5.67 18.56 5.63C18.52 5.59 9.76 9.59 9.66 9.7C9.58 9.78 5.75 17.71 5.51 18.3C5.44 18.45 4.91 18.68 10.01 16.36ZM11.36 12.98C11.22 12.9 11.03 12.69 10.96 12.53C10.36 11.27 12 10.19 12.91 11.23C13.39 11.77 13.34 12.4 12.8 12.88C12.55 13.1 12.43 13.14 12.06 13.14C11.78 13.14 11.53 13.08 11.36 12.98Z\"]},{\"id\":\"bt-reply\",\"label\":\"Reply\",\"set\":\"solid\",\"paths\":[\"M22.37 20.93C21.63 19.92 20.23 18.54 19.23 17.84C16.92 16.19 13.9 15.27 10.49 15.16L9.57 15.14L9.55 17.79L9.53 20.45L5.71 16.37C3.61 14.13 1.69 12.08 1.44 11.82L0.99 11.36L5.24 6.82L9.49 2.28L9.53 4.85L9.57 7.42L10.51 7.61C12.42 8.01 14.42 8.83 16.01 9.89C17.25 10.7 18.98 12.46 19.9 13.83C20.68 15 21.48 16.61 21.98 17.98C22.29 18.84 23.04 21.61 22.97 21.67C22.96 21.69 22.69 21.36 22.37 20.93Z\"]},{\"id\":\"bt-forum\",\"label\":\"Forum\",\"set\":\"solid\",\"paths\":[\"M14.05 22.17C13.04 22.05 11.81 21.61 10.83 21.03C9.78 20.4 8.56 19.12 8.03 18.06L7.84 17.69L5.13 17.69C2.45 17.69 2.41 17.69 1.98 17.49C1.52 17.27 1.26 16.99 1.1 16.5C0.97 16.13 0.97 9.44 1.09 8.58C1.46 5.99 3.25 3.61 5.65 2.49C6.94 1.9 8.72 1.64 10.07 1.85C11 1.99 12.28 2.45 13.09 2.94C13.97 3.46 15.05 4.5 15.62 5.39C15.86 5.76 16.08 6.13 16.11 6.21C16.14 6.32 16.36 6.42 16.9 6.55C18.35 6.9 20.12 7.97 20.99 9.02C21.83 10.02 22.44 11.19 22.75 12.39C22.93 13.06 22.94 13.36 22.98 16.84C23.02 20.92 23 21.08 22.55 21.6C21.99 22.23 22.03 22.23 17.95 22.21C15.95 22.21 14.2 22.19 14.05 22.17ZM20.67 16.56L20.64 13.2L20.4 12.51C19.98 11.3 19.3 10.37 18.35 9.7C17.82 9.32 17.17 8.96 17.02 8.96C16.98 8.96 16.92 9.41 16.9 9.97C16.79 12.1 16.01 13.92 14.58 15.35C13.59 16.34 12.48 16.98 11.07 17.39L10.38 17.59L10.89 18.12C11.71 18.98 12.51 19.46 13.6 19.75C14.16 19.89 14.56 19.91 17.46 19.91L20.7 19.92L20.67 16.56ZM10.74 15.11C11.67 14.77 12.26 14.39 12.99 13.67C14.73 11.93 15.12 9.29 13.95 7.05C13.52 6.22 12.48 5.18 11.64 4.74C10.39 4.09 8.89 3.91 7.56 4.25C6.54 4.51 5.77 4.96 4.98 5.75C4.19 6.54 3.74 7.31 3.48 8.33C3.33 8.93 3.31 9.28 3.31 12.19L3.31 15.39L6.71 15.37L10.12 15.34L10.74 15.11Z\"]},{\"id\":\"bt-exchange\",\"label\":\"Exchange\",\"set\":\"solid\",\"paths\":[\"M14.35 22.87C13.18 22.69 12.23 22.11 11.31 21.01C10.57 20.13 10.24 19.29 10.1 17.97C10.02 17.2 10.04 17.04 10.31 16.19C10.55 15.46 10.78 15.01 11.18 14.47C11.7 13.78 12.67 12.97 13.15 12.83C13.27 12.79 13.44 12.71 13.54 12.65C13.64 12.59 14.11 12.46 14.59 12.36L15.46 12.19L16.31 12.36C16.78 12.45 17.4 12.64 17.69 12.78C19.16 13.46 20.34 14.88 20.71 16.42C21.27 18.8 20.21 21.16 18.01 22.4C17.48 22.7 17.28 22.76 16.5 22.87C15.45 23.02 15.34 23.02 14.35 22.87ZM16.83 20.85C17.1 20.79 17.4 20.68 17.5 20.58C17.73 20.37 17.74 20.01 17.51 19.78C17.37 19.63 17.29 19.62 17.04 19.68C16.21 19.87 15.09 19.66 14.85 19.27C14.7 19.03 14.91 18.92 15.56 18.92C16.12 18.92 16.16 18.91 16.28 18.69C16.4 18.47 16.4 18.45 16.18 18.26C15.96 18.07 15.9 18.06 15.39 18.11C14.7 18.17 14.47 18.07 14.47 17.72C14.47 17.37 14.74 17.29 15.65 17.35C16.34 17.39 16.39 17.39 16.58 17.19C16.81 16.96 16.83 16.8 16.65 16.62C16.47 16.44 16.25 16.4 15.5 16.43C14.92 16.45 14.84 16.43 14.82 16.3C14.77 16.06 15.12 15.76 15.61 15.62C16.03 15.49 16.54 15.5 17.05 15.63C17.22 15.67 17.32 15.65 17.44 15.54C17.66 15.35 17.66 14.84 17.45 14.64C17.21 14.43 16.36 14.34 15.59 14.44C14.56 14.58 14.1 14.91 13.39 16.02C13.22 16.28 13.06 16.42 12.92 16.45C12.54 16.53 12.45 16.62 12.45 16.91C12.45 17.14 12.5 17.2 12.78 17.35C13.03 17.48 13.11 17.57 13.11 17.72C13.11 17.87 13.03 17.96 12.78 18.09C12.26 18.36 12.29 18.84 12.83 18.95C13.05 19 13.18 19.11 13.45 19.5C13.88 20.13 14.53 20.67 14.94 20.73C15.11 20.76 15.38 20.81 15.54 20.85C15.97 20.95 16.28 20.95 16.83 20.85ZM7.39 19.21C7.14 19.17 6.22 19.14 5.35 19.14L3.76 19.13L3.76 18.94C3.76 18.81 3.9 18.64 4.22 18.39C4.79 17.93 4.87 17.69 4.53 17.4C4.09 17.02 3.45 16.21 3.2 15.71C2.86 15.04 2.78 14.67 2.81 13.9C2.82 13.36 2.88 13.12 3.09 12.65C3.23 12.32 3.35 12 3.35 11.94C3.35 11.72 3.69 11.37 3.87 11.4C4.03 11.42 4.05 11.49 4.09 12C4.12 12.46 4.19 12.68 4.4 13.05C4.73 13.61 6.59 15.61 6.82 15.65C7.03 15.69 7.17 15.57 7.57 15.02C7.81 14.69 7.94 14.59 8.07 14.61C8.25 14.64 8.25 14.66 8.22 15.87C8.2 16.55 8.24 17.53 8.29 18.04C8.38 18.9 8.38 18.99 8.25 19.13C8.09 19.3 8.08 19.3 7.39 19.21ZM20.26 12.77C20.2 12.71 20.16 12.47 20.16 12.24C20.16 11.72 19.84 11.04 19.32 10.43C18.7 9.71 17.47 8.5 17.36 8.5C17.25 8.5 16.96 8.78 16.56 9.28C16.34 9.56 16.28 9.6 16.15 9.52C16.01 9.44 16 9.33 16.02 8.61C16.03 8.16 15.99 7.24 15.92 6.56C15.82 5.47 15.82 5.3 15.93 5.13L16.05 4.94L18.08 4.99C20.32 5.05 20.49 5.07 20.49 5.24C20.49 5.35 20.38 5.47 19.66 6.12C19.52 6.24 19.42 6.38 19.42 6.42C19.42 6.46 19.66 6.74 19.95 7.05C20.51 7.63 20.98 8.29 21.11 8.7C21.16 8.84 21.19 9.53 21.18 10.23C21.17 11.48 21.16 11.52 20.9 12.13C20.58 12.86 20.46 12.97 20.26 12.77ZM7.61 11.7C6.49 11.41 5.61 10.87 4.84 10.01C3.9 8.97 3.49 7.89 3.48 6.48C3.47 5.14 3.76 4.3 4.64 3.13C5.24 2.34 6.37 1.52 7.08 1.37C7.22 1.33 7.56 1.24 7.83 1.15C8.41 0.97 9.22 0.95 9.71 1.12C9.9 1.18 10.23 1.28 10.44 1.32C11.41 1.54 12.87 2.72 13.51 3.81C14 4.65 14.14 5.2 14.15 6.46C14.16 7.66 14.08 8.01 13.55 9.02C13.16 9.77 12.04 10.87 11.28 11.24C10.05 11.85 8.76 12.01 7.61 11.7ZM9.18 9.81C9.48 9.43 9.66 9.31 10.07 9.19C10.59 9.04 11.19 8.45 11.35 7.93C11.43 7.65 11.43 7.54 11.31 7.23C11.12 6.74 10.58 6.29 10.05 6.2C9.51 6.1 9.28 5.82 9.28 5.28C9.28 4.96 9.32 4.86 9.46 4.75C9.7 4.59 9.95 4.59 10.3 4.76C10.86 5.03 11.24 4.69 11.01 4.13C10.88 3.81 10.55 3.64 10.06 3.64C9.68 3.64 9.56 3.56 9.13 3.03C8.94 2.79 8.64 2.87 8.42 3.22C8.25 3.48 8.13 3.56 7.78 3.67C6.61 4.01 6.04 4.97 6.47 5.9C6.65 6.31 7.11 6.63 7.7 6.77C8.23 6.89 8.46 7.14 8.46 7.63C8.46 8.16 8.31 8.3 7.75 8.28C7.47 8.27 7.23 8.21 7.14 8.13C6.98 7.98 6.63 7.96 6.5 8.1C6.38 8.22 6.37 8.7 6.48 8.91C6.59 9.12 7.16 9.32 7.67 9.32C8.09 9.32 8.13 9.34 8.37 9.65C8.67 10.03 8.95 10.08 9.18 9.81ZM9.38 8.15C9.22 7.99 9.25 7.28 9.43 7.19C9.88 6.96 10.24 7.7 9.86 8.09C9.67 8.27 9.52 8.29 9.38 8.15ZM7.72 5.56C7.49 5.26 7.51 5.09 7.8 4.84C8.1 4.59 8.15 4.58 8.33 4.75C8.46 4.88 8.5 5.4 8.41 5.65C8.33 5.86 7.92 5.81 7.72 5.56Z\"]},{\"id\":\"bt-giveaway\",\"label\":\"Giveaway\",\"set\":\"solid\",\"paths\":[\"M1.39 22.61C0.92 22.14 0.89 21.83 1.25 21.07C2 19.47 2.95 17.26 3.06 16.84C3.32 15.89 3.59 15.88 4.01 16.81C4.57 18.07 5.79 20.59 6.08 21.09C6.16 21.23 6.22 21.44 6.22 21.56C6.22 21.79 6.14 21.83 4.92 22.24C4.5 22.38 3.84 22.6 3.44 22.74C3.04 22.89 2.5 23 2.25 23C1.84 23 1.73 22.95 1.39 22.61ZM7.55 21.07C7.49 21 7.3 20.62 7.13 20.23C6.81 19.54 5.37 16.56 4.59 15L4.17 14.18L4.64 13.14C4.89 12.57 5.18 11.86 5.28 11.57C5.38 11.28 5.54 10.96 5.65 10.87C5.89 10.65 6.01 10.78 6.43 11.75C6.6 12.16 7.26 13.56 7.89 14.85C8.52 16.13 9.04 17.22 9.04 17.26C9.04 17.3 9.33 17.92 9.69 18.63C10.06 19.34 10.34 20.01 10.32 20.12C10.3 20.28 10.06 20.42 9.29 20.72C8.11 21.18 7.71 21.26 7.55 21.07ZM11.56 19.38C11.39 19.15 11.23 18.86 11.19 18.75C11.16 18.63 10.78 17.81 10.34 16.92C9.91 16.04 9.41 15 9.23 14.61C8.91 13.91 7.62 11.23 6.96 9.86C6.64 9.22 6.61 9.07 6.66 8.62C6.7 8.26 6.67 8.02 6.57 7.81C6.36 7.42 6.42 7.14 6.75 6.89C6.95 6.75 7.07 6.72 7.21 6.78C7.37 6.87 9.59 9.19 10.84 10.59C11.42 11.24 12.91 12.88 13.82 13.85C14.21 14.27 14.73 14.84 14.97 15.11C15.22 15.39 15.81 16.04 16.3 16.56C16.79 17.09 17.26 17.65 17.34 17.81C17.48 18.08 17.48 18.12 17.3 18.37C17.07 18.66 16.73 18.7 16.19 18.47C15.92 18.36 15.81 18.36 15.54 18.47C14.84 18.76 12.29 19.7 12.08 19.75C11.91 19.79 11.8 19.71 11.56 19.38ZM17.07 15.27C16.7 14.91 16.7 14.67 17.03 14.27C17.23 14.03 17.38 13.96 17.63 13.96C17.92 13.96 18.02 14.02 18.23 14.35C18.48 14.73 18.49 14.76 18.34 15.05C18.03 15.64 17.52 15.73 17.07 15.27ZM14 12.41C13.87 12.27 13.76 12.1 13.76 12.03C13.76 11.73 14.08 11.45 14.6 11.3C15.08 11.16 15.26 11.01 15.26 10.74C15.26 10.7 15.15 10.53 15.01 10.36C14.77 10.08 14.36 8.98 14.36 8.61C14.36 8.51 14.47 8.21 14.61 7.94C14.88 7.41 15.38 7.03 15.81 7.03C16.39 7.03 17.16 7.63 17.57 8.41C17.71 8.7 17.75 9.73 17.64 10.3C17.53 10.83 17.72 11.05 18.31 11.05C19.28 11.04 20.25 10.54 20.84 9.74C21.33 9.08 21.52 8.18 21.48 6.79C21.44 5.7 21.44 5.7 21.72 5.49C21.94 5.32 22.03 5.3 22.23 5.4C22.62 5.57 22.73 6.08 22.67 7.52C22.63 8.64 22.59 8.87 22.33 9.51C21.8 10.76 21 11.56 19.85 12C18.95 12.34 17.86 12.35 17.09 12.03L16.55 11.8L16.15 12.04C15.68 12.3 14.72 12.65 14.44 12.65C14.34 12.65 14.14 12.54 14 12.41ZM16.57 9.34C16.57 8.65 15.93 8.15 15.66 8.64C15.51 8.94 15.72 9.51 16.05 9.68C16.42 9.88 16.57 9.78 16.57 9.34ZM11.29 9.29C10.97 8.97 10.97 8.54 11.29 8.2C11.61 7.85 12.01 7.85 12.37 8.2C12.75 8.57 12.74 8.94 12.34 9.28C11.96 9.61 11.61 9.61 11.29 9.29ZM18.3 6.5C18.05 6.23 18.01 6.06 18.11 5.7C18.17 5.45 18.61 5.12 18.87 5.12C18.92 5.12 19.11 5.24 19.28 5.38C19.51 5.57 19.58 5.72 19.58 5.97C19.58 6.62 18.74 6.97 18.3 6.5ZM11.95 5.91C11.78 5.68 11.49 5.38 11.3 5.25C10.88 4.97 10.83 4.63 11.17 4.32C11.29 4.21 11.42 4.11 11.46 4.11C11.5 4.11 11.68 3.91 11.86 3.67C12.03 3.42 12.24 3.2 12.32 3.17C12.57 3.07 12.95 3.3 13.12 3.65C13.21 3.84 13.45 4.09 13.66 4.2C14.29 4.56 14.27 4.96 13.61 5.28C13.42 5.37 13.24 5.52 13.21 5.62C13.09 5.98 12.74 6.32 12.5 6.32C12.33 6.32 12.16 6.2 11.95 5.91ZM20.35 4.31C19.98 4.08 19.81 3.88 19.61 3.44C19.38 2.93 19.37 2.84 19.48 2.52C19.8 1.6 20.51 1 21.28 1C21.93 1 22.81 1.67 22.96 2.27C23.07 2.7 22.94 3.47 22.71 3.8C22.43 4.19 21.62 4.62 21.16 4.62C20.96 4.62 20.64 4.49 20.35 4.31ZM15.71 3.35C15.11 3.06 15.06 2.43 15.6 2.07C15.99 1.82 16.32 1.86 16.61 2.21C16.95 2.61 16.94 2.86 16.58 3.22C16.24 3.55 16.14 3.57 15.71 3.35Z\"]},{\"id\":\"bt-mail\",\"label\":\"Mail\",\"set\":\"solid\",\"paths\":[\"M2.46 19.68C2.32 19.54 2.47 19.27 2.94 18.81C3.23 18.53 4.63 17.13 6.04 15.71C7.45 14.28 8.68 13.11 8.77 13.11C8.86 13.11 9.33 13.52 9.83 14.03C10.83 15.05 11.31 15.32 12.03 15.33C12.72 15.33 13.13 15.08 14.17 14.03C14.67 13.52 15.15 13.11 15.23 13.11C15.34 13.11 21.02 18.67 21.68 19.42C21.7 19.44 21.66 19.53 21.59 19.62C21.47 19.76 20.47 19.78 11.98 19.75C6.77 19.74 2.49 19.71 2.46 19.68ZM19.5 15.42C17.79 13.7 16.37 12.2 16.36 12.09C16.33 11.93 17.1 11.12 19.48 8.76C21.22 7.04 22.69 5.66 22.76 5.68C22.86 5.72 22.89 7.12 22.9 11.81C22.9 15.15 22.93 17.92 22.96 17.97C23.04 18.1 22.91 18.43 22.75 18.49C22.66 18.53 21.47 17.4 19.5 15.42ZM1.16 18.37C1.13 18.32 1.1 15.45 1.09 12C1.08 5.57 1.09 5.38 1.45 5.63C1.51 5.67 2.93 7.09 4.62 8.78C6.99 11.18 7.67 11.92 7.64 12.09C7.61 12.33 1.54 18.46 1.34 18.46C1.27 18.46 1.19 18.42 1.16 18.37ZM11.7 14.02C11.39 13.82 2.31 4.7 2.31 4.58C2.31 4.21 2.33 4.2 12.07 4.27C17.28 4.3 21.54 4.33 21.55 4.33C21.56 4.33 21.59 4.41 21.63 4.5C21.69 4.66 21.16 5.21 14.55 11.86C12.29 14.13 12.1 14.28 11.7 14.02Z\"]},{\"id\":\"bt-menu\",\"label\":\"Menu\",\"set\":\"solid\",\"paths\":[\"M11 20.99C10.4 20.39 10.37 19.59 10.92 18.92C11.4 18.35 11.34 18.36 16.75 18.36C21.56 18.36 21.71 18.37 22.11 18.56C23.07 19.03 23.27 20.33 22.47 21.03L22.13 21.33L16.73 21.33L11.34 21.33L11 20.99ZM1.92 13.39C1.38 13.04 0.95 12.27 1.1 11.89C1.3 11.37 1.5 11.1 1.88 10.81L2.28 10.52L12.05 10.52L21.82 10.52L22.22 10.8C22.78 11.21 22.95 11.51 22.95 12.1C22.95 12.67 22.79 12.96 22.27 13.36L21.91 13.63L12.15 13.65L2.38 13.68L1.92 13.39ZM2.1 5.69C1.72 5.53 1.33 5.1 1.15 4.65C1 4.31 1.01 4.27 1.19 3.84C1.38 3.42 1.53 3.25 2.02 2.9C2.2 2.78 3.44 2.76 12.06 2.77L21.9 2.77L22.26 3.03C22.8 3.4 22.94 3.74 22.91 4.56C22.9 4.93 22.42 5.51 21.98 5.7C21.52 5.89 2.53 5.89 2.1 5.69Z\"]},{\"id\":\"bt-brush\",\"label\":\"Brush\",\"set\":\"solid\",\"paths\":[\"M2.13 22.06C1.51 21.75 1 21.33 1 21.14C1 21.07 1.29 20.71 1.64 20.34C2.41 19.54 3.02 18.54 3.17 17.82C3.5 16.25 4.8 15.17 6.35 15.18C7.57 15.19 8.58 15.84 9.2 17.03C9.58 17.77 9.59 18.81 9.2 19.58C8.66 20.69 7.59 21.5 5.85 22.1C5.23 22.32 4.96 22.36 3.92 22.36C2.78 22.36 2.68 22.34 2.13 22.06ZM10.57 16.43C10.53 16.39 10.44 16.23 10.37 16.06C10.15 15.58 9.35 14.75 8.76 14.4C7.89 13.9 7.89 13.91 8.82 12.76C9.27 12.2 9.67 11.75 9.72 11.75C9.9 11.75 12.9 14.87 12.85 15C12.82 15.08 12.79 15.16 12.79 15.18C12.79 15.2 12.66 15.29 12.49 15.37C12.33 15.46 11.95 15.75 11.65 16.02C11.14 16.48 10.76 16.62 10.57 16.43ZM12.42 12.34C11.38 11.3 10.81 10.67 10.81 10.54C10.81 10.42 11.11 10.02 11.53 9.59C15.42 5.56 18.04 3.35 20.3 2.23C21.78 1.5 22.44 1.47 22.84 2.15C23.46 3.19 21.78 6.14 18.65 9.52C17.54 10.71 14.25 13.93 14.13 13.93C14.08 13.93 13.31 13.21 12.42 12.34Z\"]},{\"id\":\"bt-blacklist\",\"label\":\"Blacklist\",\"set\":\"solid\",\"paths\":[\"M10.61 22.95C8.06 22.57 6.11 21.65 4.43 20.02C2.77 18.41 1.79 16.6 1.29 14.27C1.13 13.51 1.09 13.09 1.09 11.91C1.1 9.81 1.41 8.53 2.34 6.76C3.32 4.89 5.1 3.17 7.06 2.19C10.22 0.62 14.08 0.68 17.21 2.34C18.59 3.07 20.14 4.43 21.01 5.68C21.78 6.77 22.42 8.28 22.72 9.7C22.98 10.95 22.98 12.99 22.71 14.21C22.17 16.64 21.25 18.39 19.69 19.89C17.51 21.99 15.3 22.9 12.26 22.96C11.5 22.97 10.76 22.97 10.61 22.95ZM13.72 19.8C14.53 19.61 15.65 19.16 16.16 18.82C16.35 18.69 16.64 18.49 16.81 18.38C17.15 18.14 18.2 17.05 18.57 16.54C19 15.95 19.51 14.76 19.72 13.88C20.13 12.18 19.93 10.5 19.11 8.76C18.79 8.07 18.69 7.93 18.53 7.93C18.39 7.93 17.48 8.78 15.3 10.94C11.27 14.94 7.71 18.53 7.71 18.59C7.71 19 9.81 19.81 11.35 20C11.87 20.07 12.98 19.97 13.72 19.8ZM8.12 13.8C9.49 12.41 11.04 10.84 11.57 10.31C14.78 7.1 16.2 5.6 16.15 5.47C16.02 5.13 13.99 4.43 12.74 4.29C11.97 4.21 11.69 4.22 10.94 4.33C9.72 4.53 8.23 5.09 7.51 5.62C7.01 5.99 6.04 6.94 5.68 7.41C4.67 8.74 4.07 10.5 4.07 12.14C4.08 13.85 4.9 16.33 5.47 16.33C5.57 16.33 6.57 15.37 8.12 13.8Z\"]},{\"id\":\"bt-nitro\",\"label\":\"Nitro\",\"set\":\"solid\",\"paths\":[\"M12.78 20.18C10.89 19.75 9.19 18.63 8.02 17.06C7.44 16.28 6.77 14.89 6.61 14.11C6.58 13.97 6.48 13.78 6.38 13.68C6.2 13.51 6.13 13.5 4.86 13.54C3.14 13.59 3.17 13.61 3.17 12.57C3.17 12.01 3.21 11.78 3.3 11.7C3.38 11.63 3.82 11.6 4.74 11.62C5.82 11.64 6.07 11.62 6.18 11.51C6.34 11.35 6.67 9.9 6.6 9.68C6.54 9.46 6.27 9.41 5.64 9.48C4.82 9.56 4.74 9.47 4.74 8.43C4.74 7.81 4.77 7.6 4.88 7.52C4.98 7.43 5.34 7.41 6.27 7.43L7.53 7.45L8.13 6.84C8.7 6.27 8.9 5.88 8.63 5.86C8.57 5.86 7.84 5.86 7.01 5.87C5.12 5.89 5.17 5.92 5.17 4.78C5.17 4.19 5.21 3.95 5.3 3.87C5.46 3.74 15.45 3.74 16.26 3.87C17.15 4.01 18.49 4.61 19.49 5.31C20.62 6.11 21.8 7.64 22.33 9C22.87 10.37 22.96 10.8 22.95 12C22.94 13.22 22.87 13.56 22.34 14.93C21.85 16.19 21.64 16.55 20.83 17.52C20.18 18.31 19.3 19 18.36 19.46C16.9 20.18 16.64 20.24 14.87 20.27C13.76 20.29 13.15 20.26 12.78 20.18ZM17.35 16.09C17.68 15.78 19.75 12.68 19.88 12.3C19.96 12.09 19.94 11.98 19.78 11.68C19.68 11.47 19.51 11.2 19.4 11.08C19.3 10.95 19 10.52 18.74 10.13C17.67 8.53 17.39 8.17 17.09 8.02C16.82 7.89 16.51 7.87 14.63 7.87C12.32 7.87 12.1 7.9 11.73 8.31C11.62 8.43 11.05 9.26 10.44 10.17C9.68 11.32 9.35 11.89 9.35 12.06C9.35 12.31 9.5 12.68 9.79 13.09C9.87 13.21 10.11 13.58 10.32 13.91C11.58 15.88 11.77 16.11 12.22 16.3C12.35 16.35 13.34 16.38 14.76 16.37L17.08 16.35L17.35 16.09ZM13.03 13.85C12.73 13.53 11.89 12.36 11.81 12.17C11.76 12.03 12.76 10.47 13.08 10.18C13.23 10.04 13.43 10.02 14.61 10.02C15.8 10.02 15.98 10.04 16.14 10.18C16.29 10.32 16.45 10.54 17.23 11.69C17.49 12.05 17.48 12.12 17.22 12.49C17.11 12.65 16.83 13.05 16.61 13.37C16.4 13.69 16.14 13.99 16.05 14.04C15.95 14.09 15.31 14.13 14.59 14.13L13.29 14.13L13.03 13.85ZM1.26 9.46C1.19 9.43 1.1 9.37 1.07 9.31C0.97 9.17 0.99 7.67 1.09 7.52C1.19 7.36 2.32 7.36 2.52 7.52C2.62 7.6 2.65 7.82 2.65 8.39C2.65 9.35 2.58 9.46 1.9 9.49C1.62 9.51 1.33 9.49 1.26 9.46Z\"]},{\"id\":\"bt-gamepad\",\"label\":\"Gamepad\",\"set\":\"solid\",\"paths\":[\"M3.42 19.37C2.2 18.72 1.33 17.24 1.09 15.41C0.85 13.51 1.1 11.33 1.77 9.58C2.72 7.12 4.02 5.5 5.71 4.68C6.21 4.43 6.33 4.41 7.24 4.41C8.17 4.41 8.25 4.43 8.68 4.68C8.92 4.82 9.36 5.13 9.64 5.37C10.5 6.08 10.84 6.19 12.09 6.2C13.36 6.2 13.72 6.08 14.55 5.37C15.42 4.62 15.83 4.43 16.67 4.38C17.61 4.34 18.17 4.46 18.87 4.87C20.54 5.85 21.89 7.82 22.69 10.44L23 11.47L23 13.8C23 15.93 22.98 16.19 22.81 16.69C22.4 17.95 21.52 19.05 20.65 19.44C20.06 19.71 18.81 19.71 18.12 19.45C17.46 19.2 16.5 18.46 15.85 17.71C14.27 15.85 14.1 15.77 12.04 15.77L10.64 15.77L10.06 16.06C9.59 16.3 9.35 16.51 8.72 17.26C7.83 18.33 7.22 18.87 6.45 19.28C5.93 19.56 5.83 19.58 4.91 19.61C3.96 19.63 3.9 19.62 3.42 19.37ZM18.88 14.05C19.39 13.83 19.77 13.31 19.77 12.81C19.77 12.25 19.16 11.59 18.59 11.54C18.14 11.5 17.96 11.56 17.61 11.87C17.23 12.22 17.04 12.69 17.14 13.07C17.23 13.44 17.63 13.9 18.02 14.08C18.46 14.28 18.35 14.28 18.88 14.05ZM7.58 13.61C7.77 13.41 7.82 13.26 7.82 12.96C7.82 12.52 7.94 12.36 8.28 12.36C8.69 12.36 9.08 12.17 9.22 11.9C9.41 11.53 9.38 11.33 9.09 11.02C8.87 10.78 8.77 10.74 8.38 10.74C8.13 10.74 7.9 10.7 7.87 10.65C7.84 10.6 7.8 10.37 7.77 10.14C7.71 9.47 7.25 9.1 6.75 9.3C6.45 9.43 6.3 9.73 6.3 10.19C6.3 10.62 6.17 10.74 5.71 10.74C5.36 10.74 4.95 10.95 4.75 11.23C4.47 11.63 4.95 12.25 5.59 12.33C6.12 12.4 6.3 12.57 6.3 13.03C6.3 13.44 6.48 13.77 6.78 13.89C7.05 13.99 7.29 13.91 7.58 13.61ZM16.34 11.51C16.91 11.21 17.31 10.56 17.2 10.09C17.12 9.73 16.5 9.06 16.17 8.99C15.55 8.85 14.85 9.31 14.65 10C14.55 10.33 14.56 10.41 14.73 10.78C14.87 11.06 15.06 11.26 15.31 11.42C15.73 11.67 15.99 11.7 16.34 11.51Z\"]},{\"id\":\"bt-palette\",\"label\":\"Palette\",\"set\":\"solid\",\"paths\":[\"M8.45 22.64C5.22 21.51 2.77 19.04 1.69 15.82C1.12 14.14 0.89 12.2 1.09 10.88C1.7 6.95 3.72 4.07 7.11 2.31C9.53 1.05 12.66 0.77 15.13 1.58C15.52 1.7 15.88 1.81 15.94 1.81C16.04 1.81 17.17 2.36 17.61 2.62C18.83 3.34 20.38 4.77 21.08 5.82C22.07 7.31 22.7 8.87 22.91 10.32C23.09 11.5 22.99 13.82 22.74 14.56C22.24 16.02 21.57 16.72 20.35 17.04C19.7 17.22 18.02 17.19 16.49 16.98C15.03 16.79 13.8 16.75 13.27 16.9C12.81 17.03 12.25 17.55 12.13 17.97C12.04 18.25 12.05 18.36 12.2 18.7C12.3 18.92 12.52 19.27 12.68 19.49C13.38 20.39 13.38 20.4 13.39 21.08C13.39 21.68 13.37 21.76 13.1 22.12C12.52 22.87 12.4 22.91 10.71 22.91C9.29 22.9 9.18 22.89 8.45 22.64ZM6.75 13.17C6.94 13.05 7.23 12.76 7.39 12.52C7.81 11.91 7.81 11.44 7.37 10.83C7.19 10.58 6.89 10.29 6.7 10.18C5.63 9.56 4.13 10.57 4.27 11.82C4.34 12.43 4.69 12.91 5.31 13.24C5.89 13.54 6.22 13.52 6.75 13.17ZM18.77 13.24C19.11 13.06 19.34 12.86 19.55 12.54C19.96 11.94 19.97 11.47 19.58 10.87C18.77 9.61 17.27 9.72 16.59 11.09L16.34 11.61L16.53 12.13C16.76 12.73 17.04 13.04 17.61 13.29C18.13 13.53 18.19 13.53 18.77 13.24ZM10.06 8.19C10.97 7.73 11.29 6.69 10.78 5.86C10.53 5.45 9.85 5.04 9.41 5.04C8.67 5.04 7.86 5.75 7.69 6.54C7.58 7.1 8.11 7.94 8.74 8.2C9.25 8.4 9.64 8.4 10.06 8.19ZM15.55 8.15C16.78 7.52 16.72 5.86 15.44 5.21C14.67 4.82 13.78 5.18 13.35 6.06C13.05 6.67 13.09 7.09 13.49 7.65C13.99 8.33 14.81 8.53 15.55 8.15Z\"]},{\"id\":\"bt-bolt\",\"label\":\"Bolt\",\"set\":\"solid\",\"paths\":[\"M5.49 22.87C5.43 22.71 5.45 22.63 5.76 21.5C5.89 21.04 6.09 20.22 6.22 19.69C6.34 19.15 6.54 18.4 6.66 18.01C6.86 17.31 7.24 15.82 7.41 15.05C7.46 14.83 7.55 14.5 7.63 14.32C7.82 13.84 7.8 13.48 7.58 13.37C7.46 13.3 6.72 13.28 5.38 13.29C4.28 13.3 3.32 13.28 3.27 13.25C2.99 13.08 3.09 12.86 4.82 9.84C5.09 9.37 5.42 8.78 5.57 8.51C6.11 7.52 6.44 6.93 7.76 4.63C8.32 3.65 8.98 2.48 9.23 2.04C9.48 1.6 9.76 1.18 9.84 1.12C9.97 1.02 10.99 1 15.13 1.02L20.26 1.04L20.29 1.25C20.31 1.4 20.22 1.56 20.01 1.78C19.85 1.96 19.31 2.62 18.81 3.25C16.72 5.94 15.76 7.14 15.47 7.43C15.36 7.54 15.27 7.73 15.27 7.86L15.27 8.08L17.94 8.06C19.41 8.04 20.67 8.06 20.73 8.1C20.97 8.25 20.83 8.57 20.28 9.08C19.98 9.36 19.04 10.26 18.19 11.06C17.34 11.87 16.58 12.59 16.5 12.66C15.8 13.31 14.6 14.46 12 16.99C10.32 18.63 8.39 20.5 7.71 21.15C7.02 21.8 6.33 22.49 6.17 22.67C5.87 23.01 5.58 23.1 5.49 22.87Z\"]},{\"id\":\"bt-plus\",\"label\":\"Plus\",\"set\":\"solid\",\"paths\":[\"M11.27 22.83C10.82 22.62 10.54 22.33 10.34 21.85C10.21 21.52 10.2 21.13 10.26 17.82C10.32 14.18 10.32 14.15 10.13 13.98C9.95 13.82 9.75 13.81 6.37 13.83C4.01 13.84 2.67 13.81 2.43 13.74C1.71 13.55 1.05 12.73 1.05 12.03C1.04 11.43 1.62 10.64 2.26 10.37C2.45 10.29 3.57 10.26 6.22 10.26C9.48 10.26 9.94 10.24 10.07 10.11C10.2 9.98 10.21 9.58 10.16 6.29C10.09 2.27 10.09 2.29 10.61 1.67C10.92 1.31 11.57 1 12.02 1C12.63 1.01 13.36 1.53 13.7 2.2L13.91 2.6L13.84 6.26C13.79 9.62 13.79 9.93 13.94 10.09C14.08 10.25 14.29 10.26 17.78 10.26C21.88 10.26 21.82 10.25 22.42 10.87C22.87 11.34 23.03 11.92 22.87 12.47C22.71 13 22.11 13.6 21.59 13.74C21.32 13.81 20.09 13.84 17.63 13.83C14.25 13.81 14.05 13.82 13.87 13.98C13.68 14.15 13.68 14.18 13.74 17.82C13.8 21.13 13.79 21.52 13.66 21.85C13.36 22.55 12.72 23 12 23C11.8 23 11.47 22.92 11.27 22.83Z\"]},{\"id\":\"bt-sms\",\"label\":\"SMS\",\"set\":\"solid\",\"paths\":[\"M18.83 21.33C18.72 21.22 18.02 20.62 17.28 20.01C16.55 19.39 15.49 18.52 14.94 18.06C14.39 17.6 13.86 17.18 13.76 17.12C13.62 17.05 12.37 17.02 9.34 17.02C5.42 17.02 5.07 17.01 4.53 16.86C3.27 16.5 2.18 15.56 1.54 14.3C1.15 13.52 1.1 12.93 1.08 9.57C1.07 6.58 1.08 6.39 1.25 5.91C1.76 4.46 2.82 3.41 4.42 2.76L5.03 2.52L12.04 2.52L19.06 2.52L19.72 2.79C21.29 3.43 22.3 4.44 22.8 5.88L23.01 6.48L22.98 9.83C22.94 13.56 22.94 13.62 22.31 14.69C21.77 15.6 20.68 16.54 19.95 16.72C19.81 16.76 19.62 16.89 19.53 17.01C19.35 17.23 19.35 17.32 19.38 19.38C19.41 21.52 19.41 21.53 19.22 21.53C19.12 21.53 18.95 21.44 18.83 21.33ZM6.85 11.9C7.05 11.85 7.34 11.66 7.56 11.44C7.91 11.09 7.93 11.04 7.93 10.58C7.93 10.14 7.9 10.06 7.62 9.75C7.44 9.56 7.27 9.4 7.22 9.4C7.18 9.4 6.95 9.32 6.71 9.22C6.25 9.02 6.08 8.73 6.29 8.48C6.4 8.35 6.48 8.35 7.21 8.5C7.47 8.55 7.51 8.53 7.62 8.26C7.77 7.91 7.68 7.72 7.31 7.59C6.63 7.35 5.73 7.53 5.22 8.01C4.93 8.28 4.87 8.39 4.83 8.77C4.79 9.19 4.81 9.23 5.13 9.57C5.33 9.79 5.66 10.01 5.98 10.13C6.55 10.36 6.69 10.57 6.49 10.86C6.33 11.09 6.15 11.09 5.62 10.89C5.12 10.7 4.95 10.73 4.82 11.01C4.62 11.45 4.78 11.76 5.3 11.91C5.66 12.02 6.45 12.01 6.85 11.9ZM18.5 11.73C18.9 11.52 19.05 11.38 19.19 11.09C19.55 10.34 19.23 9.76 18.14 9.24C17.47 8.91 17.35 8.74 17.6 8.49C17.74 8.35 17.82 8.35 18.55 8.5C18.78 8.54 18.85 8.52 18.97 8.33C19.27 7.87 18.83 7.5 18 7.5C17.32 7.5 16.93 7.65 16.53 8.07C16.21 8.4 16.16 8.5 16.16 8.82C16.16 9.35 16.57 9.82 17.32 10.14C17.83 10.36 17.89 10.41 17.89 10.63C17.89 11.03 17.58 11.12 16.98 10.89C16.43 10.68 16.3 10.7 16.16 11.05C16.01 11.41 16.12 11.65 16.53 11.83C17.12 12.1 17.88 12.06 18.5 11.73ZM9.97 11.79C10.12 11.68 10.13 11.57 10.11 10.38C10.08 9.09 10.08 9.08 10.31 8.81C10.59 8.48 10.81 8.46 11.09 8.75C11.3 8.96 11.31 8.99 11.31 10.28C11.31 11.82 11.35 11.91 11.98 11.91C12.66 11.91 12.69 11.83 12.69 10.31C12.69 9.03 12.7 8.99 12.91 8.76C13.17 8.48 13.42 8.47 13.69 8.75C13.9 8.96 13.91 8.99 13.91 10.28C13.91 11.83 13.94 11.91 14.6 11.91C15.28 11.91 15.31 11.84 15.28 10.12C15.25 8.67 15.25 8.66 14.98 8.23C14.64 7.68 14.27 7.48 13.68 7.52C13.43 7.54 13.14 7.62 13.03 7.7C12.91 7.78 12.74 7.9 12.64 7.97C12.48 8.09 12.44 8.08 12.09 7.83C11.6 7.46 11.01 7.4 10.59 7.66C10.24 7.87 9.93 7.89 9.7 7.72C9.44 7.52 8.91 7.55 8.8 7.75C8.74 7.86 8.71 8.63 8.71 9.77C8.72 11.89 8.73 11.91 9.4 11.91C9.62 11.91 9.88 11.86 9.97 11.79Z\"]},{\"id\":\"bt-refresh\",\"label\":\"Refresh\",\"set\":\"solid\",\"paths\":[\"M10.17 22.86C7.31 22.44 4.58 20.68 2.84 18.14C2.44 17.55 1.8 16.19 1.54 15.35C0.51 12.02 1 8.62 2.93 5.72C3.35 5.09 5.05 3.41 5.72 2.96C9.52 0.4 14.29 0.38 18.06 2.89C18.39 3.11 18.8 3.44 18.97 3.61C19.41 4.07 19.65 4.04 20.13 3.49C20.34 3.24 20.74 2.84 21.02 2.61C21.62 2.1 21.97 2.04 22.43 2.37C22.96 2.77 22.97 2.83 22.91 6.4L22.86 9.64L22.5 9.95L22.14 10.26L18.95 10.26C15.41 10.26 15.37 10.25 15.02 9.68C14.67 9.11 14.79 8.87 15.98 7.69C16.57 7.11 16.86 6.75 16.86 6.62C16.86 6.46 16.68 6.29 16.09 5.9C15.67 5.63 15.3 5.4 15.26 5.4C15.23 5.4 15.01 5.32 14.79 5.21C12.12 4 8.66 4.73 6.57 6.94C5.58 7.99 5.07 8.9 4.66 10.3C4.36 11.33 4.36 12.92 4.65 13.95C5.04 15.26 5.59 16.24 6.52 17.23C7.44 18.21 8.63 18.91 10.03 19.31C11.08 19.61 12.61 19.64 13.6 19.39C14.38 19.19 15.56 18.67 16.07 18.31C17.09 17.59 17.13 17.56 17.31 17.65C17.41 17.69 17.93 18.15 18.46 18.67C19.15 19.35 19.42 19.68 19.42 19.83C19.42 20.18 18.29 21.09 17.03 21.75C14.98 22.82 12.56 23.22 10.17 22.86Z\"]},{\"id\":\"bt-ticket\",\"label\":\"Ticket\",\"set\":\"solid\",\"paths\":[\"M7.73 22.86C7.34 22.66 5.91 21.21 5.91 21.02C5.91 20.93 6.06 20.73 6.24 20.57C6.66 20.21 6.99 19.63 7.06 19.1C7.2 18.04 5.96 16.81 4.88 16.94C4.37 17 3.78 17.33 3.44 17.76C3.3 17.94 3.12 18.1 3.05 18.13C2.88 18.2 1.37 16.66 1.16 16.2C0.96 15.76 0.96 15.27 1.16 14.83C1.35 14.42 1.07 14.71 8.36 7.34C12.53 3.13 14.43 1.27 14.67 1.16C15.07 0.97 15.71 0.95 16.09 1.12C16.32 1.21 16.81 1.64 17.98 2.76C18.19 2.97 18.11 3.24 17.76 3.52C17.35 3.85 16.91 4.71 16.91 5.16C16.91 5.8 17.43 6.54 18.13 6.91C18.84 7.29 19.82 7.02 20.42 6.3C20.62 6.07 20.82 5.91 20.92 5.91C21.14 5.91 22.7 7.56 22.88 7.97C23.04 8.37 23.03 8.84 22.84 9.25C22.74 9.47 22.03 10.23 20.89 11.37C19.9 12.34 16.96 15.29 14.34 17.91C11.71 20.55 9.45 22.75 9.27 22.84C8.89 23.04 8.09 23.05 7.73 22.86ZM14.77 14.85C17.02 12.61 18.85 10.73 18.85 10.68C18.85 10.59 13.49 5.29 13.35 5.24C13.3 5.23 11.56 6.92 9.47 9C7.37 11.08 5.55 12.86 5.4 12.96C4.83 13.36 4.78 13.29 7.74 16.23C9.22 17.71 10.49 18.93 10.56 18.93C10.63 18.94 12.53 17.1 14.77 14.85ZM9.23 14.78C8.52 14.07 7.94 13.47 7.94 13.43C7.94 13.39 8.6 12.7 9.4 11.89C10.2 11.09 11.39 9.89 12.03 9.23C12.67 8.56 13.26 8.02 13.34 8.02C13.51 8.02 15.98 10.51 15.98 10.69C15.98 10.76 15.74 11.04 15.45 11.31C15.16 11.57 13.95 12.75 12.77 13.93C11.58 15.1 10.59 16.06 10.56 16.06C10.54 16.06 9.94 15.48 9.23 14.78Z\"]},{\"id\":\"bt-chat\",\"label\":\"Chat\",\"set\":\"solid\",\"paths\":[\"M1.12 21.75C0.93 21.55 0.98 21.24 1.26 20.96C1.6 20.62 2.41 19.48 2.64 19.03C3.62 17.08 3.6 17.22 3.09 16.6C1.98 15.22 1.37 14 1.14 12.68C0.51 9.09 2.09 6.13 5.88 3.79C6.19 3.6 7.16 3.2 7.95 2.94C10.93 1.94 12.77 1.93 15.87 2.88C19.44 3.98 22.17 6.67 22.83 9.74C22.99 10.51 22.96 12.27 22.77 13.01C22.25 15.06 20.99 16.85 19.13 18.17C16.23 20.23 11.82 20.91 8.4 19.82C7.94 19.67 7.5 19.55 7.43 19.55C7.36 19.55 7.01 19.75 6.66 19.99C5.63 20.69 4.84 21.06 3.27 21.53C2.37 21.81 1.28 21.92 1.12 21.75ZM6.96 12.7C7.25 12.55 7.65 12.14 7.8 11.84C8.13 11.2 7.52 10.13 6.68 9.93C6.14 9.79 5.4 10.3 5.1 11.01C4.96 11.34 4.97 11.39 5.15 11.81C5.51 12.65 6.31 13.04 6.96 12.7ZM12.7 12.57C12.99 12.38 13.17 12.18 13.32 11.84L13.54 11.37L13.31 10.93C12.63 9.63 11.27 9.61 10.67 10.89C10.42 11.41 10.45 11.62 10.83 12.15C11.34 12.85 12.02 13 12.7 12.57ZM18.23 12.55C18.65 12.28 18.95 11.78 18.95 11.37C18.95 11.04 18.68 10.54 18.34 10.27C17.76 9.79 17.17 9.81 16.62 10.33C16.35 10.58 16 11.17 16 11.36C16 11.63 16.44 12.31 16.78 12.56C17.27 12.92 17.68 12.92 18.23 12.55Z\"]},{\"id\":\"bt-alert\",\"label\":\"Alert\",\"set\":\"solid\",\"paths\":[\"M11.12 22.88C10.94 22.81 10.67 22.67 10.52 22.57C9 21.47 8.87 19.51 10.24 18.28C11.53 17.11 13.45 17.46 14.4 19.04C14.63 19.43 14.66 19.56 14.66 20.3C14.66 21.04 14.63 21.16 14.4 21.55C14.11 22.03 13.58 22.54 13.13 22.78C12.73 22.99 11.56 23.05 11.12 22.88ZM10.24 15.92C10.19 15.86 10.12 15.52 10.08 15.16C10.05 14.81 9.96 14.19 9.89 13.79C9.82 13.38 9.7 12.48 9.62 11.77C9.48 10.53 9.42 10.03 9.02 6.73C8.91 5.87 8.75 4.51 8.65 3.7C8.56 2.9 8.45 2.01 8.41 1.74C8.36 1.32 8.38 1.23 8.52 1.12C8.65 1.03 9.37 1 12.05 1C14.95 1 15.43 1.02 15.53 1.14C15.65 1.28 15.64 1.42 15.16 5.35C15.11 5.76 14.97 6.95 14.84 8.01C14.57 10.24 14.31 12.4 14.15 13.65C14.08 14.13 14.01 14.79 13.98 15.13C13.9 16.06 13.95 16.03 12 16.03C10.77 16.03 10.3 16 10.24 15.92Z\"]},{\"id\":\"bt-list\",\"label\":\"List\",\"set\":\"solid\",\"paths\":[\"M1.64 19.89C0.87 19.23 0.94 18.36 1.81 17.78C2.09 17.59 2.23 17.57 3.09 17.57C3.99 17.57 4.1 17.59 4.44 17.81C4.8 18.04 5.14 18.57 5.14 18.89C5.14 19.17 4.81 19.73 4.53 19.92C4.26 20.11 4.12 20.12 3.08 20.12C1.97 20.12 1.92 20.12 1.64 19.89ZM8.47 19.9C8.15 19.68 8.08 19.58 7.94 19.11C7.82 18.72 8.19 18.03 8.65 17.77L9.02 17.56L15.48 17.59L21.95 17.61L22.28 17.87C23.02 18.43 23.08 19.18 22.44 19.78L22.08 20.12L15.44 20.12L8.8 20.12L8.47 19.9ZM1.71 13.14C0.87 12.57 0.9 11.52 1.76 10.96C2.1 10.74 2.21 10.72 3.1 10.72C4.04 10.72 4.09 10.73 4.46 11C5.32 11.62 5.33 12.43 4.48 13.12C4.19 13.36 4.14 13.37 3.11 13.37C2.12 13.37 2.02 13.35 1.71 13.14ZM8.55 13.14C7.69 12.55 7.71 11.48 8.61 10.95L9 10.72L15.44 10.72L21.87 10.72L22.24 11C23.01 11.56 23.08 12.27 22.45 12.95L22.1 13.32L15.5 13.35L8.9 13.37L8.55 13.14ZM1.76 6.44C1.37 6.2 1 5.63 1 5.27C1 4.86 1.32 4.36 1.77 4.1C2.11 3.9 2.26 3.88 3.09 3.88C4.21 3.88 4.61 4.04 4.99 4.63C5.29 5.12 5.29 5.41 4.98 5.88C4.56 6.51 4.31 6.61 3.1 6.61C2.22 6.61 2 6.58 1.76 6.44ZM8.71 6.53C8.42 6.4 8.02 5.93 7.89 5.55C7.79 5.25 7.79 5.15 7.9 4.88C8.07 4.47 8.61 3.99 8.98 3.92C9.13 3.89 12.12 3.88 15.61 3.89L21.96 3.92L22.29 4.15C22.67 4.4 23 4.93 23 5.26C23 5.62 22.49 6.33 22.13 6.48C21.87 6.59 20.79 6.61 15.36 6.61C11.8 6.61 8.81 6.57 8.71 6.53Z\"]},{\"id\":\"role-admin\",\"label\":\"Admin role\",\"set\":\"solid\",\"paths\":[\"M11.42 22.82C11.28 22.72 11.09 22.65 11 22.65C10.87 22.65 10.62 22.55 9.69 22.12C8.79 21.7 7.54 20.82 6.75 20.04C6.04 19.35 5.12 18.25 4.85 17.78C4.76 17.62 4.62 17.38 4.55 17.25C4.47 17.12 4.33 16.87 4.23 16.7C4.12 16.53 4.01 16.29 3.97 16.17C3.94 16.05 3.85 15.89 3.79 15.81C3.73 15.74 3.63 15.5 3.57 15.28C3.51 15.06 3.43 14.83 3.37 14.77C3.29 14.67 3.15 14.23 2.84 13.02C2.76 12.73 2.59 11.92 2.46 11.22C2.23 9.98 2.23 9.86 2.26 7.12L2.29 4.29L2.59 3.98C2.78 3.78 3.01 3.64 3.21 3.61C3.51 3.56 3.97 3.42 5.48 2.94C5.82 2.84 6.3 2.7 6.54 2.63C6.79 2.57 7.19 2.46 7.43 2.38C7.87 2.23 8.7 1.98 10.14 1.56C10.55 1.44 11.09 1.26 11.34 1.17C11.87 0.97 12.19 0.96 12.52 1.13C12.66 1.2 13.01 1.32 13.29 1.39C13.58 1.46 14 1.58 14.22 1.65C14.44 1.72 14.98 1.89 15.42 2.02C15.85 2.15 16.53 2.35 16.92 2.47C17.31 2.58 18.05 2.81 18.56 2.96C19.08 3.11 19.72 3.31 19.98 3.4C20.25 3.49 20.61 3.58 20.79 3.61C20.99 3.64 21.21 3.78 21.41 3.98L21.71 4.29L21.74 7.1C21.76 8.65 21.73 10.13 21.69 10.4C21.49 11.55 21.29 12.52 21.16 13.02C20.85 14.22 20.71 14.67 20.63 14.77C20.57 14.83 20.49 15.06 20.43 15.28C20.37 15.5 20.27 15.74 20.21 15.81C20.15 15.89 20.06 16.05 20.03 16.17C19.99 16.29 19.88 16.53 19.77 16.7C19.67 16.87 19.53 17.12 19.45 17.25C19.38 17.38 19.24 17.62 19.15 17.78C18.9 18.23 17.81 19.52 17.15 20.14C16.39 20.86 15.15 21.73 14.31 22.12C13.38 22.55 13.13 22.65 13 22.65C12.91 22.65 12.71 22.73 12.55 22.82C12.19 23.04 11.77 23.04 11.42 22.82ZM13.07 20.12C13.68 19.82 14.06 19.6 14.72 19.14C15.18 18.82 16.25 17.73 16.59 17.23C16.77 16.97 16.98 16.67 17.07 16.57C17.26 16.34 18.21 14.52 18.21 14.37C18.21 14.31 18.31 14.06 18.43 13.82C18.55 13.57 18.65 13.3 18.65 13.2C18.65 13.11 18.75 12.71 18.87 12.32C19.25 11.07 19.46 9.4 19.45 7.55L19.45 5.9L19.04 5.62C18.81 5.47 18.54 5.35 18.44 5.35C18.34 5.35 17.96 5.25 17.59 5.13C16.96 4.93 16.36 4.75 14.6 4.22C14.17 4.09 13.52 3.89 13.15 3.77C12.3 3.48 11.7 3.48 10.85 3.77C10.48 3.89 9.84 4.09 9.43 4.22C7.75 4.71 7.05 4.93 6.41 5.13C6.04 5.25 5.66 5.35 5.56 5.35C5.46 5.35 5.19 5.47 4.96 5.62L4.55 5.9L4.55 7.59C4.55 9.48 4.74 11.04 5.13 12.32C5.25 12.71 5.35 13.11 5.35 13.2C5.35 13.3 5.45 13.57 5.57 13.82C5.69 14.06 5.79 14.31 5.79 14.37C5.79 14.52 6.74 16.34 6.93 16.57C7.01 16.67 7.22 16.95 7.39 17.19C7.82 17.82 8.31 18.33 9.09 18.95C9.89 19.59 10.22 19.79 11.11 20.21C11.92 20.59 12.14 20.58 13.07 20.12ZM11.11 19.34C10.05 18.81 9.01 17.95 8.22 16.97C7.53 16.12 7.45 15.99 6.94 14.93C6.74 14.51 6.53 14.09 6.48 14C6.31 13.69 5.9 12.21 5.61 10.89C5.36 9.75 5.24 6.51 5.45 6.36C5.58 6.25 6.51 5.93 7.7 5.58C8.14 5.45 8.7 5.28 8.94 5.2C9.18 5.12 9.62 4.98 9.92 4.9C10.21 4.82 10.79 4.65 11.21 4.52C12.05 4.27 12.18 4.28 13.51 4.72C13.78 4.81 14.34 4.98 14.75 5.11C17.85 6.03 18.23 6.15 18.47 6.3L18.68 6.43L18.63 8.17C18.6 9.5 18.54 10.14 18.39 10.85C18.12 12.16 17.7 13.68 17.52 14C17.47 14.09 17.26 14.51 17.06 14.93C16.55 15.99 16.46 16.12 15.78 16.97C14.9 18.06 14.22 18.62 12.95 19.3C12.17 19.71 11.86 19.72 11.11 19.34Z\"]},{\"id\":\"role-booster\",\"label\":\"Booster role\",\"set\":\"solid\",\"paths\":[\"M11.6 22.85C11.36 22.72 10.52 22.06 10.11 21.68C10.03 21.61 9.53 21.19 8.99 20.74C8.45 20.29 7.96 19.88 7.89 19.82C7.82 19.76 7.22 19.26 6.56 18.72C5.84 18.13 5.29 17.61 5.2 17.43C5.07 17.17 5.06 16.53 5.06 12C5.06 7.47 5.07 6.83 5.2 6.57C5.29 6.39 5.84 5.87 6.56 5.28C7.22 4.74 7.82 4.24 7.89 4.18C7.96 4.12 8.45 3.71 8.99 3.26C9.53 2.81 10.03 2.39 10.11 2.32C10.57 1.89 11.49 1.19 11.73 1.09C11.95 1 12.05 1 12.29 1.1C12.52 1.19 15.4 3.52 16.07 4.15C16.16 4.23 16.77 4.74 17.44 5.28C18.16 5.87 18.71 6.39 18.8 6.57C18.93 6.83 18.94 7.47 18.94 12C18.94 16.53 18.93 17.17 18.8 17.43C18.71 17.61 18.16 18.13 17.44 18.72C16.77 19.26 16.16 19.77 16.07 19.85C15.5 20.39 12.62 22.73 12.39 22.85C12.03 23.03 11.94 23.03 11.6 22.85ZM12.96 18.25C13.35 17.92 13.93 17.4 14.25 17.09C14.58 16.78 15.01 16.39 15.22 16.22C15.43 16.06 15.62 15.85 15.65 15.76C15.68 15.68 15.71 13.98 15.71 12C15.71 10.02 15.68 8.32 15.65 8.24C15.62 8.15 15.43 7.94 15.22 7.78C15.01 7.61 14.58 7.22 14.25 6.91C13.08 5.78 12.27 5.15 11.99 5.15C11.72 5.15 11.52 5.3 9.88 6.81C9.48 7.17 8.99 7.61 8.78 7.77C8.57 7.94 8.38 8.15 8.35 8.24C8.27 8.44 8.27 15.56 8.35 15.76C8.38 15.85 8.57 16.06 8.78 16.23C8.99 16.39 9.48 16.83 9.88 17.19C12.06 19.19 11.91 19.14 12.96 18.25ZM11.12 16.35C10.72 15.97 10.23 15.5 10.03 15.31L9.66 14.97L9.66 12L9.66 9.03L10.03 8.69C10.23 8.5 10.72 8.03 11.12 7.65C11.51 7.27 11.91 6.95 12 6.95C12.09 6.95 12.49 7.27 12.88 7.65C13.28 8.03 13.77 8.5 13.97 8.68L14.34 9.01L14.34 12L14.34 14.99L13.97 15.32C13.77 15.5 13.28 15.97 12.88 16.35C12.49 16.73 12.09 17.05 12 17.05C11.91 17.05 11.51 16.73 11.12 16.35Z\"]},{\"id\":\"role-premium\",\"label\":\"Premium client role\",\"set\":\"solid\",\"paths\":[\"M4.6 22.85C4.46 22.79 4.28 22.64 4.2 22.52C4.06 22.3 3.75 20.81 3.64 19.81C3.6 19.51 3.53 19.09 3.48 18.89C3.43 18.69 3.31 18 3.21 17.36C2.94 15.52 2.74 14.46 2.64 14.33C2.59 14.27 2.37 14.22 2.14 14.22C1.81 14.22 1.67 14.16 1.41 13.92L1.08 13.61L1.07 12.01L1.07 10.4L1.41 10.09L1.75 9.77L2.93 9.79C4.27 9.81 4.46 9.75 4.59 9.27C4.64 9.1 4.77 8.84 4.87 8.71C4.98 8.57 5.07 8.39 5.07 8.31C5.07 8.22 5.17 8.01 5.3 7.84C5.43 7.67 5.53 7.46 5.53 7.38C5.53 7.3 5.63 7.09 5.76 6.92C5.89 6.74 5.99 6.54 5.99 6.45C5.99 6.37 6.1 6.16 6.22 5.99C6.35 5.82 6.45 5.61 6.45 5.53C6.45 5.45 6.56 5.24 6.68 5.07C6.81 4.89 6.92 4.69 6.92 4.61C6.92 4.52 7.02 4.32 7.15 4.14C7.27 3.97 7.38 3.76 7.38 3.68C7.38 3.6 7.48 3.39 7.61 3.22C7.74 3.05 7.84 2.84 7.84 2.75C7.84 2.67 7.92 2.5 8.01 2.37C8.11 2.25 8.25 2 8.33 1.82C8.4 1.64 8.6 1.4 8.75 1.29C9.03 1.09 9.1 1.08 12 1.08C14.9 1.08 14.97 1.09 15.25 1.29C15.4 1.4 15.6 1.64 15.67 1.82C15.75 2 15.89 2.25 15.99 2.37C16.08 2.5 16.16 2.67 16.16 2.75C16.16 2.84 16.26 3.05 16.39 3.22C16.52 3.39 16.62 3.6 16.62 3.68C16.62 3.76 16.73 3.97 16.85 4.14C16.98 4.32 17.08 4.52 17.08 4.61C17.08 4.69 17.19 4.89 17.32 5.07C17.44 5.24 17.55 5.45 17.55 5.53C17.55 5.61 17.65 5.82 17.78 5.99C17.9 6.16 18.01 6.37 18.01 6.45C18.01 6.54 18.11 6.74 18.24 6.92C18.37 7.09 18.47 7.3 18.47 7.38C18.47 7.46 18.57 7.67 18.7 7.84C18.83 8.01 18.93 8.22 18.93 8.31C18.93 8.39 19.02 8.57 19.13 8.71C19.23 8.84 19.36 9.1 19.41 9.27C19.54 9.75 19.73 9.81 21.07 9.79L22.25 9.77L22.59 10.08L22.93 10.39L22.93 12L22.93 13.61L22.59 13.91C22.33 14.16 22.19 14.22 21.86 14.22C21.37 14.22 21.28 14.31 21.2 14.91C21.16 15.17 21.07 15.64 21 15.97C20.93 16.31 20.81 16.99 20.74 17.5C20.61 18.45 20.46 19.36 20.12 21.29C19.95 22.23 19.89 22.43 19.67 22.65C19.53 22.79 19.35 22.91 19.29 22.91C12.9 22.97 4.81 22.93 4.6 22.85ZM8.86 19.68L9.13 19.41L9.13 16.68L9.13 13.96L8.81 13.67C8.45 13.36 8.38 13.34 8.11 13.48C7.69 13.71 7.66 13.96 7.66 16.71C7.66 18.83 7.68 19.36 7.79 19.58C8.03 20.03 8.47 20.08 8.86 19.68ZM12.5 19.67C12.63 19.51 12.74 19.31 12.74 19.23C12.74 19.14 12.75 17.94 12.75 16.55C12.75 14.1 12.74 14.03 12.54 13.76C12.32 13.45 12.09 13.35 11.83 13.43C11.74 13.46 11.57 13.61 11.46 13.76C11.26 14.03 11.25 14.1 11.25 16.55C11.25 17.94 11.26 19.14 11.26 19.23C11.26 19.51 11.72 19.95 12 19.95C12.18 19.95 12.34 19.86 12.5 19.67ZM15.92 19.89C16.3 19.75 16.34 19.43 16.34 16.71C16.34 13.96 16.31 13.71 15.89 13.48C15.62 13.34 15.55 13.36 15.19 13.67L14.87 13.96L14.87 16.68L14.87 19.41L15.14 19.68C15.4 19.94 15.63 20.01 15.92 19.89ZM17.92 9.73C18.07 9.64 18.02 9.44 17.78 9.15C17.65 9 17.55 8.82 17.55 8.75C17.55 8.67 17.44 8.47 17.32 8.3C17.19 8.13 17.08 7.92 17.08 7.83C17.08 7.75 17 7.57 16.9 7.44C16.79 7.31 16.66 7.06 16.6 6.9C16.55 6.73 16.42 6.49 16.33 6.37C16.24 6.25 16.16 6.08 16.16 5.99C16.16 5.9 16.07 5.72 15.97 5.59C15.87 5.46 15.74 5.22 15.68 5.05C15.62 4.88 15.5 4.64 15.41 4.52C15.31 4.4 15.24 4.23 15.24 4.14C15.24 4.05 15.15 3.87 15.04 3.74C14.94 3.6 14.81 3.36 14.77 3.19C14.61 2.62 14.41 2.57 12 2.57C9.59 2.57 9.39 2.62 9.23 3.19C9.19 3.36 9.06 3.6 8.96 3.74C8.85 3.87 8.76 4.05 8.76 4.14C8.76 4.23 8.69 4.4 8.59 4.52C8.5 4.64 8.38 4.88 8.32 5.05C8.26 5.22 8.13 5.46 8.03 5.59C7.93 5.72 7.84 5.9 7.84 5.99C7.84 6.07 7.74 6.28 7.61 6.45C7.48 6.63 7.38 6.83 7.38 6.92C7.38 7 7.27 7.21 7.15 7.38C7.02 7.55 6.92 7.76 6.92 7.85C6.92 7.93 6.84 8.1 6.74 8.22C6.65 8.34 6.54 8.55 6.5 8.67C6.46 8.8 6.33 9.02 6.21 9.16C5.98 9.45 5.94 9.6 6.08 9.74C6.18 9.84 17.76 9.83 17.92 9.73Z\"]},{\"id\":\"role-client\",\"label\":\"Client role\",\"set\":\"solid\",\"paths\":[\"M4.6 22.85C4.46 22.79 4.28 22.64 4.2 22.52C4.06 22.3 3.75 20.81 3.64 19.81C3.6 19.51 3.53 19.09 3.48 18.89C3.43 18.69 3.31 18 3.21 17.36C2.94 15.52 2.74 14.46 2.64 14.33C2.59 14.27 2.37 14.22 2.14 14.22C1.81 14.22 1.67 14.16 1.41 13.92L1.08 13.61L1.07 12.01L1.07 10.4L1.41 10.09L1.75 9.77L2.93 9.79C4.27 9.81 4.46 9.75 4.59 9.27C4.64 9.1 4.77 8.84 4.87 8.71C4.98 8.57 5.07 8.39 5.07 8.31C5.07 8.22 5.17 8.01 5.3 7.84C5.43 7.67 5.53 7.46 5.53 7.38C5.53 7.3 5.63 7.09 5.76 6.92C5.89 6.74 5.99 6.54 5.99 6.45C5.99 6.37 6.1 6.16 6.22 5.99C6.35 5.82 6.45 5.61 6.45 5.53C6.45 5.45 6.56 5.24 6.68 5.07C6.81 4.89 6.92 4.69 6.92 4.61C6.92 4.52 7.02 4.32 7.15 4.14C7.27 3.97 7.38 3.76 7.38 3.68C7.38 3.6 7.48 3.39 7.61 3.22C7.74 3.05 7.84 2.84 7.84 2.75C7.84 2.67 7.92 2.5 8.01 2.37C8.11 2.25 8.25 2 8.33 1.82C8.4 1.64 8.6 1.4 8.75 1.29C9.03 1.09 9.1 1.08 12 1.08C14.9 1.08 14.97 1.09 15.25 1.29C15.4 1.4 15.6 1.64 15.67 1.82C15.75 2 15.89 2.25 15.99 2.37C16.08 2.5 16.16 2.67 16.16 2.75C16.16 2.84 16.26 3.05 16.39 3.22C16.52 3.39 16.62 3.6 16.62 3.68C16.62 3.76 16.73 3.97 16.85 4.14C16.98 4.32 17.08 4.52 17.08 4.61C17.08 4.69 17.19 4.89 17.32 5.07C17.44 5.24 17.55 5.45 17.55 5.53C17.55 5.61 17.65 5.82 17.78 5.99C17.9 6.16 18.01 6.37 18.01 6.45C18.01 6.54 18.11 6.74 18.24 6.92C18.37 7.09 18.47 7.3 18.47 7.38C18.47 7.46 18.57 7.67 18.7 7.84C18.83 8.01 18.93 8.22 18.93 8.31C18.93 8.39 19.02 8.57 19.13 8.71C19.23 8.84 19.36 9.1 19.41 9.27C19.54 9.75 19.73 9.81 21.07 9.79L22.25 9.77L22.59 10.08L22.93 10.39L22.93 12L22.93 13.61L22.59 13.91C22.33 14.16 22.19 14.22 21.86 14.22C21.37 14.22 21.28 14.31 21.2 14.91C21.16 15.17 21.07 15.64 21 15.97C20.93 16.31 20.81 16.99 20.74 17.5C20.61 18.45 20.46 19.36 20.12 21.29C19.95 22.23 19.89 22.43 19.67 22.65C19.53 22.79 19.35 22.91 19.29 22.91C12.9 22.97 4.81 22.93 4.6 22.85ZM8.86 19.68L9.13 19.41L9.13 16.68L9.13 13.96L8.81 13.67C8.45 13.36 8.38 13.34 8.11 13.48C7.69 13.71 7.66 13.96 7.66 16.71C7.66 18.83 7.68 19.36 7.79 19.58C8.03 20.03 8.47 20.08 8.86 19.68ZM12.5 19.67C12.63 19.51 12.74 19.31 12.74 19.23C12.74 19.14 12.75 17.94 12.75 16.55C12.75 14.1 12.74 14.03 12.54 13.76C12.32 13.45 12.09 13.35 11.83 13.43C11.74 13.46 11.57 13.61 11.46 13.76C11.26 14.03 11.25 14.1 11.25 16.55C11.25 17.94 11.26 19.14 11.26 19.23C11.26 19.51 11.72 19.95 12 19.95C12.18 19.95 12.34 19.86 12.5 19.67ZM15.92 19.89C16.3 19.75 16.34 19.43 16.34 16.71C16.34 13.96 16.31 13.71 15.89 13.48C15.62 13.34 15.55 13.36 15.19 13.67L14.87 13.96L14.87 16.68L14.87 19.41L15.14 19.68C15.4 19.94 15.63 20.01 15.92 19.89ZM17.92 9.73C18.07 9.64 18.02 9.44 17.78 9.15C17.65 9 17.55 8.82 17.55 8.75C17.55 8.67 17.44 8.47 17.32 8.3C17.19 8.13 17.08 7.92 17.08 7.83C17.08 7.75 17 7.57 16.9 7.44C16.79 7.31 16.66 7.06 16.6 6.9C16.55 6.73 16.42 6.49 16.33 6.37C16.24 6.25 16.16 6.08 16.16 5.99C16.16 5.9 16.07 5.72 15.97 5.59C15.87 5.46 15.74 5.22 15.68 5.05C15.62 4.88 15.5 4.64 15.41 4.52C15.31 4.4 15.24 4.23 15.24 4.14C15.24 4.05 15.15 3.87 15.04 3.74C14.94 3.6 14.81 3.36 14.77 3.19C14.61 2.62 14.41 2.57 12 2.57C9.59 2.57 9.39 2.62 9.23 3.19C9.19 3.36 9.06 3.6 8.96 3.74C8.85 3.87 8.76 4.05 8.76 4.14C8.76 4.23 8.69 4.4 8.59 4.52C8.5 4.64 8.38 4.88 8.32 5.05C8.26 5.22 8.13 5.46 8.03 5.59C7.93 5.72 7.84 5.9 7.84 5.99C7.84 6.07 7.74 6.28 7.61 6.45C7.48 6.63 7.38 6.83 7.38 6.92C7.38 7 7.27 7.21 7.15 7.38C7.02 7.55 6.92 7.76 6.92 7.85C6.92 7.93 6.84 8.1 6.74 8.22C6.65 8.34 6.54 8.55 6.5 8.67C6.46 8.8 6.33 9.02 6.21 9.16C5.98 9.45 5.94 9.6 6.08 9.74C6.18 9.84 17.76 9.83 17.92 9.73Z\"]},{\"id\":\"role-owner\",\"label\":\"Owner role\",\"set\":\"solid\",\"paths\":[\"M3.83 22.34C3.71 22.21 3.68 21.97 3.68 21.03C3.69 20.39 3.72 19.82 3.76 19.75C3.82 19.66 5.43 19.64 11.96 19.64C19.01 19.64 20.11 19.66 20.19 19.78C20.25 19.86 20.28 20.37 20.28 21.08C20.27 22.12 20.25 22.27 20.1 22.38C19.96 22.48 18.57 22.5 11.96 22.5C4.36 22.51 3.97 22.5 3.83 22.34ZM3.69 17.98C3.49 17.72 3.48 17.7 3.29 16.74C3.22 16.4 3.09 15.87 3.01 15.58C2.63 14.18 2.44 13.4 2.38 13.04C2.35 12.82 2.27 12.52 2.2 12.36C2.14 12.2 2.04 11.8 1.98 11.46C1.92 11.12 1.84 10.77 1.79 10.68C1.75 10.6 1.63 10.18 1.54 9.74C1.45 9.31 1.29 8.68 1.18 8.34C0.98 7.64 0.95 7.34 1.09 7.26C1.14 7.23 1.92 7.56 2.81 8C3.71 8.44 4.54 8.85 4.67 8.9C4.79 8.96 4.95 9.04 5.02 9.09C5.1 9.13 5.51 9.34 5.94 9.54C6.37 9.74 6.76 9.99 6.81 10.08C6.86 10.17 6.9 10.54 6.9 10.9C6.91 11.47 6.94 11.6 7.17 11.94C7.31 12.15 7.6 12.44 7.81 12.59C8.13 12.8 8.29 12.85 8.74 12.85C9.2 12.85 9.34 12.81 9.65 12.58C9.85 12.43 10.13 12.16 10.27 11.98C10.52 11.65 10.52 11.61 10.56 10.39L10.59 9.13L10.29 8.76C10.12 8.55 9.79 8.11 9.54 7.79C9.29 7.46 8.92 7.01 8.71 6.77C8.5 6.54 8.33 6.26 8.33 6.15C8.33 6.04 8.6 5.63 8.94 5.22C9.27 4.82 9.78 4.17 10.08 3.77C10.37 3.38 10.67 3 10.73 2.93C10.8 2.85 11.06 2.51 11.32 2.16C11.86 1.44 12.08 1.35 12.32 1.75C12.61 2.2 14.08 4.12 15.24 5.55C15.6 6 15.6 6.3 15.23 6.74C14.59 7.49 13.72 8.62 13.52 8.95C13.32 9.28 13.31 9.39 13.33 10.32C13.36 11.49 13.51 11.95 14.02 12.4C14.44 12.76 14.67 12.85 15.25 12.85C15.95 12.85 16.49 12.46 16.87 11.69C17.08 11.29 17.11 11.14 17.06 10.79C16.98 10.16 17.12 9.94 17.81 9.62C18.13 9.46 19.09 9 19.93 8.59C20.78 8.18 21.49 7.84 21.51 7.84C21.53 7.84 21.84 7.68 22.19 7.48C22.54 7.28 22.87 7.14 22.91 7.17C23.06 7.26 23.01 7.76 22.83 8.05C22.74 8.21 22.63 8.51 22.6 8.74C22.57 8.96 22.44 9.5 22.33 9.94C22.21 10.39 22.01 11.16 21.89 11.66C21.76 12.17 21.56 12.98 21.43 13.48C21.31 13.97 21.11 14.77 20.99 15.26C20.45 17.42 20.28 18 20.15 18.1C20.04 18.19 18.27 18.22 11.94 18.22L3.87 18.22L3.69 17.98Z\"]},{\"id\":\"role-seller\",\"label\":\"Seller role\",\"set\":\"solid\",\"paths\":[\"M9.07 22.94C8.4 22.82 6.94 22.42 6.46 22.22C4.97 21.63 4.15 20.98 3.36 19.76C3.33 19.7 3.19 19.41 3.05 19.11C2.85 18.66 2.8 18.4 2.76 17.56C2.7 16.04 2.96 14.67 3.53 13.54C3.65 13.3 3.75 13.05 3.75 12.99C3.75 12.93 3.86 12.71 4 12.51C4.13 12.3 4.35 11.97 4.47 11.77C4.6 11.57 4.82 11.26 4.97 11.08C5.11 10.91 5.25 10.72 5.29 10.67C5.67 10.18 7.16 8.52 7.67 8.04L8.32 7.42L12 7.42L15.68 7.42L16.33 8.04C16.84 8.52 18.33 10.18 18.71 10.67C18.75 10.72 18.89 10.91 19.03 11.08C19.18 11.26 19.4 11.57 19.53 11.77C19.65 11.97 19.87 12.3 20 12.51C20.14 12.71 20.25 12.93 20.25 12.99C20.25 13.05 20.35 13.3 20.47 13.54C21.04 14.67 21.3 16.04 21.24 17.56C21.2 18.41 21.15 18.66 20.95 19.09C20.82 19.37 20.71 19.62 20.71 19.65C20.71 19.68 20.54 19.93 20.34 20.21C19.85 20.87 19.06 21.51 18.28 21.89C17.93 22.06 17.56 22.24 17.46 22.29C17.37 22.34 16.81 22.51 16.22 22.66L15.16 22.94L12.23 22.96C10.62 22.97 9.19 22.96 9.07 22.94ZM12.58 18.71C12.74 18.41 12.97 18.14 13.18 18.01C13.76 17.64 14.27 16.99 14.34 16.53C14.44 15.9 14.31 15.32 13.99 14.92C13.65 14.49 12.8 14.07 11.93 13.88C11.26 13.74 10.99 13.52 10.99 13.11C10.99 12.75 11.2 12.51 11.63 12.37C11.95 12.26 12.07 12.26 12.35 12.36C12.8 12.52 12.92 12.62 12.92 12.88C12.92 13.14 13.39 13.7 13.66 13.77C13.91 13.84 14.38 13.39 14.38 13.08C14.37 12.35 14.02 11.78 13.27 11.26C12.96 11.06 12.73 10.81 12.59 10.51C12.23 9.81 11.73 9.82 11.4 10.53C11.29 10.78 11.07 11.03 10.75 11.25C10.49 11.44 10.15 11.74 10 11.93C9.5 12.56 9.5 13.77 10.01 14.35C10.33 14.72 11.22 15.17 11.82 15.26C12.32 15.34 12.87 15.61 12.95 15.81C13.12 16.25 12.82 16.73 12.24 16.95C11.75 17.13 10.99 16.6 10.99 16.08C10.99 16.01 10.84 15.84 10.66 15.7C10.39 15.5 10.3 15.47 10.09 15.54C9.23 15.84 9.64 17.29 10.78 17.99C11.02 18.14 11.24 18.37 11.37 18.62C11.65 19.19 11.72 19.25 12.04 19.22C12.27 19.2 12.36 19.12 12.58 18.71ZM8.79 6.01C8.66 5.95 8.5 5.78 8.42 5.63C8.35 5.48 8.19 5.22 8.08 5.07C7.97 4.91 7.88 4.72 7.88 4.64C7.88 4.57 7.8 4.41 7.7 4.29C7.61 4.17 7.46 3.92 7.38 3.75C7.29 3.57 7.11 3.22 6.96 2.97C6.31 1.86 6.31 1.65 6.93 1.27C7.26 1.06 7.37 1.05 9.07 1.02C10.48 1 10.96 1.02 11.36 1.13C12.27 1.39 14.14 1.73 14.64 1.73C15.15 1.73 15.91 1.56 16.5 1.31C16.8 1.18 16.86 1.18 17.13 1.32C17.69 1.61 17.68 1.88 17.04 2.97C16.89 3.22 16.71 3.57 16.62 3.75C16.54 3.92 16.39 4.17 16.3 4.29C16.2 4.41 16.12 4.57 16.12 4.64C16.12 4.72 16.03 4.91 15.92 5.07C15.81 5.22 15.65 5.48 15.58 5.63C15.5 5.78 15.34 5.95 15.21 6.01C14.89 6.17 9.11 6.17 8.79 6.01Z\"]},{\"id\":\"role-user\",\"label\":\"User role\",\"set\":\"solid\",\"paths\":[\"M3.84 22.74C3.3 22.42 3 22.1 2.68 21.52C2.38 20.97 2.35 20.42 2.59 19.85C2.68 19.65 2.79 19.22 2.84 18.89C2.89 18.55 3.01 18.01 3.1 17.68C3.19 17.36 3.31 16.92 3.37 16.72C3.86 14.84 5.09 12.73 6.22 11.83C6.43 11.66 6.85 11.44 7.15 11.34L7.7 11.15L8.32 11.36C8.65 11.47 9.06 11.64 9.22 11.74C9.78 12.08 11.06 12.36 12 12.36C12.94 12.36 14.22 12.08 14.78 11.74C14.94 11.64 15.35 11.47 15.68 11.36L16.3 11.15L16.85 11.34C17.15 11.44 17.57 11.66 17.78 11.83C18.91 12.73 20.14 14.84 20.63 16.72C20.69 16.92 20.81 17.36 20.9 17.68C20.99 18.01 21.11 18.55 21.16 18.89C21.21 19.22 21.32 19.65 21.4 19.84C21.83 20.87 21.31 22.08 20.14 22.75L19.71 23L11.98 23L4.25 22.99L3.84 22.74ZM10.81 11.09C10.15 10.96 9.13 10.39 8.53 9.81C8.03 9.33 7.5 8.62 7.37 8.24C7.29 8.02 7.19 7.8 7.15 7.74C7.1 7.69 7.02 7.31 6.96 6.89C6.66 4.68 7.67 2.68 9.65 1.58C10.45 1.13 10.84 1.05 12 1.05C13.16 1.05 13.55 1.13 14.35 1.58C16.33 2.68 17.34 4.68 17.04 6.89C16.98 7.31 16.9 7.69 16.85 7.74C16.81 7.8 16.71 8.02 16.63 8.24C16.5 8.62 15.97 9.34 15.48 9.8C15.06 10.2 14.63 10.49 13.99 10.8C13.42 11.08 13.29 11.1 12.3 11.13C11.7 11.15 11.04 11.13 10.81 11.09Z\"]},{\"id\":\"role-bot\",\"label\":\"Bot role\",\"set\":\"solid\",\"paths\":[\"M8.69 22.7C6.49 22.14 5.36 21.72 4.07 20.98C3.14 20.43 1.97 19.3 1.51 18.47L1.15 17.84L1.2 15.72C1.23 13.74 1.26 13.53 1.56 12.68C1.88 11.76 2.38 10.68 2.77 10.06C2.96 9.75 2.99 9.46 3 7.21C3.01 4.82 2.97 4.31 2.76 4.31C2.71 4.31 2.49 4.06 2.26 3.75C1.74 3.03 1.71 2.48 2.18 1.84C2.65 1.18 3 1 3.74 1C4.25 1 4.46 1.06 4.76 1.29C5.25 1.67 5.62 2.28 5.62 2.73C5.62 3.15 5.2 3.91 4.77 4.28C4.46 4.55 4.47 4.42 4.43 7.18C4.42 7.73 4.74 7.73 5.25 7.18C5.65 6.76 6.65 6.02 6.82 6.02C6.86 6.02 7.03 5.92 7.19 5.8C8.11 5.15 10.3 4.61 12 4.61C13.7 4.61 15.89 5.15 16.81 5.8C16.97 5.92 17.14 6.02 17.17 6.02C17.35 6.02 18.49 6.84 18.81 7.21C19.27 7.73 19.58 7.72 19.57 7.18C19.53 4.42 19.54 4.55 19.23 4.28C18.8 3.91 18.38 3.15 18.38 2.73C18.38 2.28 18.75 1.67 19.24 1.29C19.54 1.06 19.75 1 20.26 1C21 1 21.35 1.18 21.82 1.84C22.29 2.48 22.26 3.03 21.74 3.75C21.51 4.06 21.29 4.31 21.24 4.31C21.03 4.31 20.99 4.82 21 7.21C21.01 9.46 21.04 9.75 21.23 10.06C21.7 10.8 22.16 11.86 22.49 12.92C22.81 13.96 22.83 14.13 22.83 15.95C22.83 17.85 22.82 17.89 22.52 18.42C22.11 19.13 21.78 19.51 20.95 20.23C19.69 21.31 17.93 22.07 15.23 22.7C14.08 22.97 13.74 23 11.87 22.99C10.06 22.98 9.63 22.94 8.69 22.7ZM15.27 18.1C17.36 17.82 18.59 17.32 18.85 16.65C19.1 15.98 18.51 12.98 17.87 11.72C17.53 11.05 17.33 11 16.25 11.37C15.21 11.72 13.9 11.87 12 11.87C10.1 11.87 8.79 11.72 7.75 11.37C6.67 11 6.47 11.05 6.13 11.72C5.49 12.98 4.9 15.98 5.15 16.65C5.47 17.49 7.33 18.04 10.97 18.37C11.77 18.44 13.5 18.33 15.27 18.1ZM8.05 16.33C7.22 15.84 7.17 15 7.93 14.49C8.52 14.08 8.61 14.08 9.12 14.46C9.92 15.04 9.92 15.71 9.13 16.28C8.87 16.46 8.63 16.62 8.59 16.62C8.55 16.61 8.31 16.49 8.05 16.33ZM15.01 16.4C14.36 16.01 14.12 15.42 14.39 14.92C14.45 14.81 14.7 14.58 14.95 14.41C15.38 14.11 15.41 14.1 15.72 14.27C16.84 14.88 16.93 15.75 15.94 16.33C15.36 16.67 15.44 16.67 15.01 16.4Z\"]},{\"id\":\"role-dev\",\"label\":\"Developer role\",\"set\":\"solid\",\"paths\":[\"M9.56 21.85C9.04 21.69 8.5 21.03 8.5 20.55C8.5 20.44 8.61 20 8.74 19.57C8.99 18.79 9.19 18.03 9.5 16.6C9.75 15.5 9.98 14.55 10.25 13.55C10.38 13.08 10.6 12.21 10.74 11.6C10.89 10.99 11.3 9.31 11.66 7.85C12.03 6.39 12.4 4.82 12.5 4.35C12.6 3.88 12.78 3.29 12.9 3.03C13.14 2.47 13.69 2.05 14.16 2.05C14.62 2.05 15.36 2.65 15.49 3.12C15.6 3.52 15.59 3.63 15.25 4.8C15.13 5.24 14.93 6.01 14.81 6.5C14.29 8.75 13.88 10.44 13.73 10.95C13.54 11.6 13.25 12.83 13.05 13.8C12.91 14.48 12.79 14.97 12.26 16.95C12.13 17.47 11.87 18.51 11.7 19.25C11.52 19.99 11.31 20.77 11.23 20.97C10.92 21.7 10.25 22.06 9.56 21.85ZM6.54 18.44C6.24 18.36 5.8 17.91 3.86 15.76C3.54 15.39 3 14.8 2.66 14.44C0.76 12.39 0.64 12.04 1.51 10.94C1.8 10.59 2.26 10.05 2.54 9.74C2.82 9.44 3.43 8.76 3.9 8.24C4.36 7.72 5.13 6.91 5.61 6.42C6.44 5.59 6.49 5.55 6.91 5.55C7.46 5.55 7.97 5.93 8.25 6.54C8.43 6.94 8.43 6.96 8.24 7.37C8.13 7.61 7.27 8.65 6.23 9.8C4.95 11.19 4.4 11.87 4.4 12.03C4.4 12.19 4.72 12.62 5.39 13.33C7.41 15.52 7.99 16.2 8.2 16.61C8.41 17.04 8.41 17.05 8.22 17.48C8.03 17.91 7.49 18.45 7.25 18.45C7.18 18.45 7.06 18.47 6.98 18.49C6.91 18.51 6.71 18.49 6.54 18.44ZM16.86 18.45C16.33 18.29 15.8 17.63 15.8 17.12C15.8 16.71 16.06 16.23 16.57 15.68C16.83 15.4 17.36 14.82 17.75 14.38C18.13 13.95 18.73 13.3 19.07 12.94C19.43 12.57 19.7 12.19 19.7 12.07C19.7 11.86 19.45 11.54 17.7 9.59C16.1 7.81 15.91 7.56 15.84 7.2C15.75 6.71 15.96 6.2 16.4 5.85C17.17 5.24 17.91 5.56 19.12 7.03C19.27 7.21 19.74 7.75 20.17 8.22C20.6 8.7 21.22 9.38 21.54 9.74C21.86 10.1 22.18 10.44 22.24 10.5C22.3 10.56 22.5 10.8 22.68 11.04C22.95 11.42 23 11.58 23 12.06C23 12.7 22.96 12.76 21.57 14.28C21.11 14.79 20.51 15.45 20.24 15.75C18.63 17.59 17.9 18.34 17.66 18.41C17.24 18.52 17.15 18.53 16.86 18.45Z\"]},{\"id\":\"role-middleman\",\"label\":\"Middleman role\",\"set\":\"solid\",\"paths\":[\"M2.42 21.08C1.84 20.88 1.51 20.6 1.25 20.07C1.02 19.6 1.01 19.47 1 16.22C1 13 1.01 12.84 1.21 12.65C1.43 12.45 1.48 12.46 2.28 12.75C2.68 12.9 3.32 12.92 6.34 12.92C10.43 12.91 10.29 12.88 10.16 13.76C10.1 14.16 10.13 14.26 10.36 14.49C10.63 14.76 10.68 14.76 12.09 14.76C13.8 14.76 13.83 14.74 13.84 13.78C13.84 13.43 13.9 13.1 13.96 13.03C14.04 12.95 15.21 12.91 17.73 12.92C21.17 12.93 21.42 12.91 21.88 12.71C22.43 12.46 22.73 12.43 22.84 12.6C22.88 12.66 22.91 14.37 22.91 16.39L22.9 20.07L22.61 20.44C22.01 21.2 22.55 21.16 12.17 21.19C5.11 21.21 2.7 21.18 2.42 21.08ZM5.81 11.95L2.23 11.89L1.82 11.58C1.13 11.05 1.01 10.62 1 8.78C1 6.88 1.13 6.44 1.87 5.93L2.34 5.61L4.71 5.59C6.01 5.58 7.15 5.54 7.24 5.51C7.35 5.47 7.39 5.28 7.39 4.88C7.39 4.41 7.46 4.2 7.75 3.77C8.37 2.82 8.34 2.82 11.97 2.82C15.48 2.81 15.46 2.8 16.16 3.53C16.48 3.87 16.54 4 16.6 4.67C16.64 5.09 16.71 5.47 16.75 5.52C16.8 5.56 17.82 5.59 19.02 5.57C20.23 5.56 21.4 5.59 21.64 5.65C21.89 5.71 22.23 5.92 22.48 6.18L22.91 6.6L22.91 8.75C22.91 11.16 22.89 11.23 22.07 11.7C21.65 11.94 21.58 11.94 17.89 11.94C14.61 11.95 14.11 11.92 13.96 11.78C13.86 11.68 13.79 11.54 13.79 11.45C13.79 11.17 13.36 11.08 12 11.08L10.64 11.08L10.16 11.57C9.9 11.83 9.62 12.04 9.54 12.03C9.46 12.02 7.79 11.98 5.81 11.95ZM14.66 5.44C14.77 5.32 14.87 5.18 14.87 5.12C14.87 5.06 14.77 4.91 14.66 4.79C14.45 4.59 14.29 4.58 12.05 4.58C9.81 4.58 9.66 4.59 9.45 4.79C9.33 4.91 9.24 5.06 9.24 5.12C9.24 5.18 9.33 5.32 9.45 5.44C9.66 5.65 9.81 5.66 12.05 5.66C14.29 5.66 14.45 5.65 14.66 5.44Z\"]},{\"id\":\"role-moderator\",\"label\":\"Moderator role\",\"set\":\"solid\",\"paths\":[\"M11.01 22.92C10.93 22.89 10.73 22.76 10.57 22.62C10.4 22.49 10.22 22.38 10.17 22.38C10.11 22.38 9.84 22.23 9.58 22.04C7.16 20.35 5.02 17.91 3.92 15.57C3.7 15.12 3.46 14.62 3.38 14.46C2.87 13.45 2.24 10.98 2.15 9.61C2.06 8.37 1.9 6.48 1.82 5.91C1.76 5.48 1.77 5.47 2.16 5.3C3.27 4.82 3.68 4.57 4.26 4.05C5 3.37 5.39 2.85 5.82 1.93C6 1.56 6.22 1.2 6.32 1.13C6.45 1.03 7.75 1 12 1L17.52 1L17.74 1.24C17.86 1.37 18.03 1.67 18.11 1.91C18.29 2.4 18.92 3.28 19.43 3.76C19.97 4.25 20.41 4.54 21.33 5L22.17 5.42L22.16 5.88C22.12 7.39 21.73 11.21 21.59 11.5C21.54 11.6 21.43 12 21.34 12.4C21.26 12.81 21.09 13.31 20.98 13.53C20.86 13.74 20.77 13.97 20.77 14.04C20.77 14.38 19.66 16.46 18.88 17.59C18.03 18.82 16.14 20.83 15.37 21.32C15.23 21.42 15.09 21.52 15.06 21.56C14.98 21.67 14 22.32 13.37 22.68C12.86 22.97 12.72 23 11.99 22.99C11.54 22.99 11.1 22.96 11.01 22.92ZM13.2 20.4C13.57 20.11 14.15 19.66 14.49 19.39C15.6 18.51 17.02 16.91 17.66 15.78C18.06 15.09 18.47 14.35 18.57 14.13C19.28 12.58 19.8 10.54 19.89 8.95C19.92 8.43 19.97 7.79 20 7.52C20.03 7.25 20.01 6.94 19.95 6.83C19.89 6.71 19.52 6.41 19.13 6.15C18.05 5.43 17.2 4.54 16.64 3.54C16.38 3.07 16.31 3.06 14.21 3.07C13.11 3.08 12.17 3.12 12.13 3.16C12.07 3.22 12 19.36 12.05 20.85C12.06 21.08 12.62 20.86 13.2 20.4Z\"]},{\"id\":\"role-partner\",\"label\":\"Partnerships role\",\"set\":\"solid\",\"paths\":[\"M10.33 18.68C9.03 18.29 8.07 17.71 7.18 16.76C6.59 16.15 6.52 15.9 6.81 15.56C7.02 15.33 8.98 13.98 9.12 13.98C9.16 13.98 9.29 13.89 9.39 13.78C9.72 13.41 10.09 13.42 10.8 13.79C11.79 14.31 12.61 14.24 13.84 13.55C14.77 13.03 16.1 12.14 17.11 11.37C18.85 10.05 20.07 9.39 20.77 9.39C21.67 9.39 22.72 10.23 22.91 11.09C23.22 12.45 22.59 13.24 19.63 15.2C19.12 15.53 18.53 15.92 18.31 16.07C16.79 17.09 15.48 17.88 14.97 18.1C14.77 18.19 14.47 18.33 14.29 18.42C13.38 18.87 11.41 19 10.33 18.68ZM2.62 14.61C2.13 14.39 1.74 14.01 1.31 13.36C0.87 12.68 0.88 12.12 1.36 11.41C1.71 10.88 2.52 10.14 3.15 9.75C3.33 9.64 3.82 9.32 4.23 9.03C4.65 8.74 5.17 8.39 5.39 8.25C5.61 8.1 6.04 7.82 6.34 7.61C8.47 6.17 8.95 5.9 10.23 5.48C12.48 4.74 14.98 5.54 16.93 7.61C17.47 8.2 17.4 8.44 16.51 9.1C15.37 9.94 14.2 10.64 13.95 10.64C13.86 10.64 13.49 10.48 13.13 10.28C11.78 9.54 11.42 9.67 7.46 12.42C5.1 14.06 4.49 14.45 4.03 14.63C3.43 14.86 3.14 14.86 2.62 14.61Z\"]},{\"id\":\"role-shop\",\"label\":\"Shop role\",\"set\":\"solid\",\"paths\":[\"M2.92 22.44L2.53 22.1L2.56 18.14L2.59 14.19L3.57 14.18C4.63 14.17 5.02 14.04 6 13.34L6.46 13.01L6.79 13.29C6.97 13.44 7.41 13.71 7.76 13.88C8.28 14.14 8.53 14.19 9.21 14.19C10.09 14.18 10.52 14.02 11.48 13.34L11.94 13.01L12.23 13.22C13.47 14.09 14.1 14.32 15.04 14.21C15.64 14.14 16.64 13.68 16.94 13.35C17.16 13.11 17.67 13.09 17.85 13.31C18.04 13.54 18.88 13.99 19.3 14.1C19.5 14.14 20.03 14.19 20.48 14.19L21.3 14.19L21.33 18C21.36 21.72 21.35 21.83 21.13 22.19C21 22.4 20.81 22.61 20.7 22.67C20.58 22.74 18.71 22.78 15.9 22.78C11.34 22.78 11.3 22.78 11.17 22.55C11.09 22.4 11.06 21.34 11.07 19.24C11.08 17.55 11.09 16.1 11.08 16.02C11.07 15.94 10.91 15.78 10.71 15.67C10.39 15.47 10.16 15.45 8.18 15.45C6.17 15.45 5.98 15.46 5.64 15.68C5.43 15.8 5.27 15.99 5.26 16.09C5.26 16.19 5.26 17.63 5.27 19.3C5.28 21.32 5.24 22.41 5.16 22.56C5.06 22.75 4.94 22.78 4.17 22.78C3.36 22.78 3.28 22.76 2.92 22.44ZM18.34 19.25L18.68 18.9L18.67 17.48L18.66 16.07L18.31 15.76L17.96 15.45L16.1 15.45C14.13 15.45 13.73 15.53 13.48 15.99C13.42 16.1 13.37 16.82 13.37 17.58C13.37 18.97 13.37 18.97 13.69 19.29L14.01 19.61L16 19.61L17.99 19.61L18.34 19.25ZM3.04 13.08C2.22 12.89 1.54 12.34 1.25 11.64C1.06 11.18 1.04 10.88 1.06 8.97L1.08 6.81L1.54 5.9C1.8 5.4 2.07 4.92 2.15 4.83C2.23 4.74 2.37 4.49 2.47 4.28C2.56 4.07 2.79 3.68 2.97 3.41C3.15 3.14 3.37 2.77 3.45 2.59C3.64 2.19 4.22 1.63 4.69 1.4C5 1.24 5.81 1.22 11.94 1.22C18.56 1.22 18.87 1.23 19.27 1.43C19.74 1.67 20.29 2.26 20.54 2.78C20.72 3.16 20.87 3.42 21.47 4.42C22.02 5.33 22.54 6.25 22.75 6.69C22.91 7 22.95 7.44 22.98 9.01C23.01 10.78 23 10.98 22.79 11.38C22.46 12.02 21.54 12.9 21.06 13.03C19.7 13.41 18.31 12.86 17.8 11.73C17.57 11.21 17.33 11.19 17.1 11.66C16.68 12.54 15.7 13.16 14.7 13.17C13.69 13.18 12.64 12.54 12.31 11.71C12.1 11.19 11.81 11.15 11.61 11.62C11.54 11.81 11.26 12.18 10.99 12.44C9.77 13.66 7.56 13.29 6.82 11.74C6.72 11.53 6.58 11.34 6.51 11.32C6.44 11.3 6.22 11.52 6.02 11.82C5.24 12.96 4.29 13.36 3.04 13.08Z\"]},{\"id\":\"role-support\",\"label\":\"Support role\",\"set\":\"solid\",\"paths\":[\"M13.78 22.73C12.29 22.2 11.43 21.6 10.33 20.32C9.76 19.66 9.68 19.51 9.78 19.33C9.87 19.16 10.01 19.11 10.42 19.11C10.71 19.11 11.39 18.98 11.94 18.82C14.81 17.97 17.15 15.93 18.31 13.26C18.63 12.53 19.07 10.87 19.14 10.17C19.16 9.92 19.23 9.82 19.42 9.8C19.77 9.75 21.72 11.72 22.15 12.56C23.27 14.73 23.3 17.16 22.23 19.19L21.98 19.66L22.27 20.58C22.44 21.09 22.62 21.65 22.68 21.83C22.92 22.5 22.93 22.7 22.73 22.84C22.58 22.95 22.42 22.94 21.91 22.77C19.73 22.05 19.52 22.01 19.14 22.28C19.01 22.37 18.54 22.57 18.09 22.72C17.39 22.96 17.09 23 15.89 22.99C14.74 22.98 14.38 22.94 13.78 22.73ZM7.69 17.66C7.12 17.55 6.35 17.3 5.98 17.12C5.6 16.93 5.19 16.78 5.07 16.78C4.94 16.78 4.41 16.91 3.89 17.06C1.59 17.74 1.26 17.79 1.15 17.49C1.11 17.4 1.14 17.18 1.22 17.02C1.45 16.51 2.11 14.14 2.11 13.81C2.11 13.64 1.99 13.29 1.84 13.03C1.43 12.31 1.09 10.95 1.03 9.77C0.98 8.86 1.01 8.53 1.26 7.58C1.42 6.96 1.65 6.26 1.78 6.03C1.9 5.8 2 5.57 2 5.52C2 5.47 2.28 5.06 2.62 4.61C3.19 3.84 4.13 2.94 4.95 2.38C5.88 1.73 8.22 1.01 9.41 1C9.67 1 10.37 1.11 10.97 1.24C12.75 1.63 14.64 2.67 15.62 3.82C16.2 4.5 16.98 5.69 17.06 6.03C17.1 6.2 17.18 6.36 17.23 6.39C17.37 6.48 17.52 7.12 17.71 8.38C17.86 9.35 17.86 9.61 17.71 10.6C17.5 12.03 17.52 11.98 16.91 13.22C16.49 14.07 16.21 14.45 15.44 15.23C14.02 16.68 12.85 17.33 11.06 17.68C9.72 17.93 9.05 17.93 7.69 17.66ZM10.03 13.76C10.28 13.46 10.27 13.32 9.99 12.96C9.71 12.6 9.21 12.57 8.89 12.89C8.58 13.2 8.61 13.6 8.97 13.89C9.32 14.16 9.73 14.12 10.03 13.76ZM9.82 11.38C9.93 11.34 10.03 11.12 10.07 10.87C10.13 10.53 10.28 10.28 10.71 9.85C11.74 8.8 11.93 8.48 11.98 7.7C12.03 6.94 11.81 6.35 11.24 5.74C10.85 5.31 9.94 4.89 9.41 4.89C8.5 4.89 7.1 5.99 6.94 6.82C6.84 7.33 7.02 7.56 7.5 7.56C7.81 7.56 7.93 7.47 8.25 7.02C8.47 6.72 8.8 6.42 8.99 6.34C9.52 6.12 10.14 6.34 10.5 6.86C10.97 7.56 10.9 7.77 9.82 8.86C9.29 9.4 8.82 9.96 8.76 10.11C8.64 10.41 8.73 11.08 8.91 11.31C9.03 11.45 9.53 11.49 9.82 11.38Z\"]},{\"id\":\"role-management\",\"label\":\"Management role\",\"set\":\"solid\",\"paths\":[\"M17.23 22.77C17.13 22.64 16.6 22.04 16.05 21.44C15.51 20.84 14.64 19.72 14.13 18.96C13.62 18.2 13.11 17.52 13 17.44C12.62 17.17 12.77 16.86 13.69 15.94C14.18 15.46 14.62 15.06 14.66 15.06C14.71 15.06 15.2 15.43 15.76 15.89C16.31 16.35 17.08 16.96 17.48 17.26C17.87 17.55 18.33 17.96 18.51 18.17C18.69 18.38 19.2 18.91 19.63 19.36C20.09 19.83 20.42 20.27 20.42 20.39C20.42 20.52 20.23 20.77 19.97 20.99C19.72 21.2 19.14 21.74 18.68 22.18C17.81 23.05 17.54 23.16 17.23 22.77ZM3.84 22.64C2.97 22.31 2.18 21.31 2.18 20.54C2.18 20.18 2.28 20.06 3.56 18.87C4.31 18.16 5.07 17.51 5.25 17.43C5.71 17.2 11.46 11.46 11.92 10.77C12.14 10.44 12.84 9.61 13.49 8.92C14.14 8.23 14.71 7.6 14.75 7.51C14.81 7.41 14.71 7.19 14.43 6.83C14.21 6.55 13.93 6.13 13.82 5.92C12.55 3.48 12.33 3.07 11.7 2.01C11.38 1.45 11.35 1.32 11.54 1.13C11.74 0.93 12.09 0.97 12.5 1.25C12.7 1.38 13.01 1.57 13.18 1.66C13.36 1.75 13.77 1.98 14.09 2.16C14.42 2.34 15.14 2.72 15.69 3.01C16.25 3.29 16.9 3.7 17.14 3.92C17.62 4.38 17.94 4.43 18.22 4.11C18.33 3.99 18.49 3.9 18.57 3.9C18.87 3.9 19.65 4.45 20.3 5.12C20.88 5.72 20.96 5.86 20.96 6.23C20.96 6.45 20.89 6.75 20.79 6.88C20.7 7.01 20.66 7.2 20.7 7.31C20.73 7.41 21.24 7.93 21.82 8.46C22.4 8.99 22.88 9.49 22.89 9.58C22.9 9.83 20.3 12.37 20.04 12.37C19.89 12.38 19.46 12.01 18.8 11.32C18.24 10.74 17.71 10.24 17.61 10.2C17.49 10.16 17.01 10.55 16.02 11.52C15.18 12.33 14.47 12.93 14.31 12.97C13.87 13.06 7.57 19.42 7.44 19.89C7.37 20.13 7.16 20.4 6.88 20.63C6.63 20.83 6.13 21.35 5.78 21.78C4.93 22.8 4.61 22.94 3.84 22.64ZM5.19 9.46C2.93 7.16 2.75 7 2.45 7.05C2.27 7.08 2.04 7.13 1.94 7.17C1.71 7.26 1.11 6.69 1.11 6.38C1.11 5.87 2.96 3.94 3.98 3.39C4.37 3.18 4.55 3.24 4.9 3.71C5.1 3.98 5.1 4.01 4.93 4.26C4.84 4.41 4.76 4.6 4.76 4.67C4.76 4.75 5.12 5.18 5.57 5.62C6.02 6.06 7.16 7.23 8.1 8.22C9.61 9.8 9.8 10.04 9.7 10.22C9.47 10.64 8.04 11.95 7.82 11.93C7.68 11.93 6.66 10.96 5.19 9.46Z\"]},{\"id\":\"role-exchanger\",\"label\":\"Exchanger role\",\"set\":\"solid\",\"paths\":[\"M16.12 22.71C15.85 22.36 15.84 22.17 16.06 21.23C16.21 20.6 16.21 20.49 16.07 20.35C15.93 20.22 15.29 20.19 11.98 20.21C6.59 20.24 6.72 20.29 3.93 17.51C1.65 15.25 1.67 15.27 1.67 14.2C1.67 13.39 1.69 13.29 2 12.9C2.49 12.29 3.22 11.95 3.85 12.04C4.52 12.13 4.81 12.35 6.44 13.95C7.23 14.73 8.07 15.44 8.38 15.6L8.92 15.89L12.46 15.89C16.58 15.89 16.37 15.96 16.06 14.77C15.83 13.87 15.84 13.53 16.12 13.24C16.62 12.7 16.8 12.81 19.33 15.33C21.33 17.33 21.67 17.71 21.67 18C21.67 18.28 21.33 18.66 19.33 20.66C17.36 22.64 16.95 23 16.67 23C16.46 23 16.27 22.9 16.12 22.71ZM19.69 12C19.27 11.9 19.2 11.85 17.37 10.09C16.59 9.33 15.78 8.67 15.46 8.51L14.9 8.22L11.39 8.22L7.88 8.22L7.77 8.48C7.68 8.67 7.69 8.91 7.82 9.41C8.06 10.32 8.05 10.52 7.73 10.84C7.18 11.39 7.05 11.31 4.54 8.8C2.39 6.66 2.22 6.47 2.22 6.1C2.22 5.73 2.38 5.54 4.6 3.35C5.91 2.06 7.07 1 7.17 1C7.42 1 8 1.6 8 1.85C8 1.96 7.92 2.36 7.84 2.72C7.63 3.57 7.63 3.62 7.84 3.82C7.99 3.97 8.55 4 12.09 4C16.6 4 16.87 4.03 17.83 4.67C18.61 5.2 21.99 8.61 22.18 9.06C22.37 9.54 22.38 10.23 22.18 10.7C21.98 11.18 21.22 11.85 20.7 11.99C20.23 12.12 20.2 12.12 19.69 12Z\"]},{\"id\":\"role-recruiter\",\"label\":\"Recruiter role\",\"set\":\"solid\",\"paths\":[\"M20.92 22.89C20.78 22.83 19.97 22.1 19.13 21.28L17.59 19.77L17.17 20.02C16.94 20.16 16.63 20.36 16.48 20.46C15.96 20.8 14.94 21.22 13.89 21.5C12.4 21.91 10.38 21.91 8.86 21.5C7.73 21.19 6.07 20.43 5.52 19.96C5.33 19.81 5.14 19.68 5.1 19.68C4.9 19.68 3.34 18.04 2.94 17.41C2.71 17.05 2.43 16.63 2.32 16.47C2.04 16.06 1.51 14.67 1.27 13.71C0.97 12.56 0.97 10.33 1.27 9.18C1.51 8.23 2.04 6.84 2.32 6.42C2.43 6.27 2.71 5.85 2.94 5.5C3.7 4.35 4.99 3.17 6.31 2.42C7.59 1.68 10.05 1 11.43 1C12.2 1 14.42 1.49 15.32 1.87C17.36 2.72 19.12 4.19 20.18 5.96C20.23 6.06 20.37 6.27 20.47 6.42C21.11 7.4 21.78 9.97 21.78 11.45C21.78 12.48 21.42 14.33 21.06 15.14C20.91 15.46 20.79 15.78 20.79 15.85C20.79 15.96 20.56 16.34 20 17.16C19.89 17.33 19.79 17.53 19.79 17.62C19.79 17.7 20.35 18.31 21.02 18.98C22.69 20.62 22.94 20.95 22.93 21.47C22.92 21.9 22.51 22.57 22.14 22.77C21.82 22.94 21.19 23 20.92 22.89ZM13.09 18.62C14.71 18.29 16.61 16.95 17.56 15.48C19.16 12.98 19.17 9.81 17.57 7.41C17.12 6.74 15.85 5.5 15.22 5.12C12.34 3.38 8.48 3.87 6.17 6.27C4.93 7.56 4.3 8.84 4.09 10.47C3.69 13.69 5.29 16.65 8.19 18.06C9.87 18.88 11.15 19.02 13.09 18.62ZM10.01 16.9C8.8 16.81 7.84 16.56 7.6 16.28C7.38 16.01 7.5 15.27 7.86 14.56C8.29 13.73 8.42 13.58 9.16 13.03C11.11 11.58 13.78 12.33 14.89 14.65C15.35 15.6 15.37 16.04 14.97 16.36C14.59 16.66 14.08 16.79 12.94 16.86C12.42 16.9 11.83 16.94 11.61 16.96C11.4 16.98 10.68 16.95 10.01 16.9ZM10.29 11.3C9.75 11.05 9.28 10.67 8.95 10.2C8.59 9.7 8.57 9.64 8.57 8.68C8.57 7.74 8.59 7.66 8.94 7.12C9.44 6.35 10.18 5.88 11.02 5.8C12.21 5.67 13.03 6.09 13.81 7.21C14.18 7.74 14.21 7.83 14.21 8.62C14.21 9.41 14.18 9.51 13.8 10.09C13.57 10.43 13.16 10.86 12.87 11.05C12.39 11.37 12.28 11.39 11.4 11.38C10.88 11.38 10.38 11.34 10.29 11.3Z\"]},{\"id\":\"ph-tree-palm\",\"label\":\"Palm tree\",\"set\":\"solid\",\"paths\":[\"M22.49 5.66a.75 .75 0 0 1-.44 .54L16.78 8.49a6.7 6.7 0 0 1 4.06 3.11 6.62 6.62 0 0 1 .68 5.09A.75 .75 0 0 1 20.34 17.1l-7.59-5.78V21a.75 .75 0 0 1-1.5 0V11.31L3.66 17.1a.75 .75 0 0 1-1.18-.4 6.62 6.62 0 0 1 .68-5.09A6.7 6.7 0 0 1 7.22 8.49L1.95 6.2a.75 .75 0 0 1-.24-1.2 6.27 6.27 0 0 1 9.16 0 6.77 6.77 0 0 1 1.13 1.59 6.77 6.77 0 0 1 1.13-1.59 6.27 6.27 0 0 1 9.16 0A.75 .75 0 0 1 22.49 5.66Z\"]},{\"id\":\"ph-island\",\"label\":\"Island\",\"set\":\"solid\",\"paths\":[\"M22.46 21.25A.75 .75 0 0 1 21.75 21.75H2.25a.75 .75 0 0 1-.47-1.34c.15-.12 3.61-2.84 9.21-3.14A11.25 11.25 0 0 1 10.69 13.72c.16-2.04 1.02-4.75 4.03-6.79a6.21 6.21 0 0 0-1.41-.18l-.16 0c-1.78 .06-2.9 1.1-3.42 3.18A.75 .75 0 0 1 9 10.5a.72 .72 0 0 1-.19-.02 .75 .75 0 0 1-.55-.91c.87-3.46 3.1-4.26 4.83-4.31a7.63 7.63 0 0 1 2.03 .23c-.36-.59-.88-1.21-1.61-1.52-.94-.4-2.08-.22-3.4 .52a.75 .75 0 0 1-.73-1.31c1.76-.98 3.35-1.18 4.73-.58 1.17 .5 1.94 1.48 2.43 2.34 .58-.9 1.3-1.52 2.1-1.78 1.11-.36 2.31-.07 3.56 .88a.75 .75 0 0 1-.9 1.2c-.84-.63-1.57-.85-2.19-.65-.68 .22-1.21 .94-1.54 1.56A6.61 6.61 0 0 1 19.5 6.85c1.37 .78 3 2.44 3 5.9a.75 .75 0 0 1-1.5 0c0-2.2-.76-3.75-2.25-4.59a4.73 4.73 0 0 0-.54-.26 5.22 5.22 0 0 1 .47 3.1 5.57 5.57 0 0 1-.83 2.19 .75 .75 0 0 1-1.23-.86c.07-.1 1.53-2.29-.31-4.63-2.53 1.43-3.93 3.49-4.14 6.15a9.78 9.78 0 0 0 .36 3.42c5.87 .17 9.52 3.03 9.68 3.16A.75 .75 0 0 1 22.46 21.25ZM4.88 15.75a2.63 2.63 0 1 0-2.62-2.62A2.63 2.63 0 0 0 4.88 15.75Z\"]},{\"id\":\"ph-sailboat\",\"label\":\"Sailboat\",\"set\":\"solid\",\"paths\":[\"M15 13.13V6.83a.38 .38 0 0 1 .66-.25l5.16 5.67a.75 .75 0 0 1 .04 .96 .77 .77 0 0 1-.62 .29H15.38A.38 .38 0 0 1 15 13.13Zm8.18 3.05A.75 .75 0 0 0 22.5 15.75H13.5V.75a.75 .75 0 0 0-1.33-.47l-9.75 12A.75 .75 0 0 0 3 13.5h9v2.25H1.5a.75 .75 0 0 0-.59 1.22l2.78 3.47a1.49 1.49 0 0 0 1.17 .56H19.14a1.49 1.49 0 0 0 1.17-.56l2.78-3.47A.75 .75 0 0 0 23.18 16.17Z\"]},{\"id\":\"ph-anchor\",\"label\":\"Anchor\",\"set\":\"solid\",\"paths\":[\"M21 13.5c0 3.57-2.59 4.28-4.68 4.85C14.04 18.97 12.75 19.44 12.75 21.75a.75 .75 0 0 1-1.5 0c0-2.31-1.29-2.78-3.57-3.4C5.59 17.78 3 17.07 3 13.5a.75 .75 0 0 1 1.5 0c0 2.31 1.29 2.78 3.57 3.4 1.07 .29 2.26 .62 3.18 1.34V12H8.25a.75 .75 0 0 1 0-1.5h3V7.77a2.63 2.63 0 1 1 1.5 0V10.5h3a.75 .75 0 0 1 0 1.5H12.75v6.25c.92-.73 2.11-1.05 3.18-1.34C18.21 16.28 19.5 15.81 19.5 13.5a.75 .75 0 0 1 1.5 0Z\"]},{\"id\":\"ph-treasure-chest\",\"label\":\"Treasure chest\",\"set\":\"solid\",\"paths\":[\"M22.5 11.63v6.38a1.5 1.5 0 0 1-1.5 1.5H3a1.5 1.5 0 0 1-1.5-1.5V11.63a.38 .38 0 0 1 .38-.37H5.25v6a.75 .75 0 0 0 .8 .75A.77 .77 0 0 0 6.75 17.22V11.25h3.75v1.88a.38 .38 0 0 0 .38 .38h2.25a.38 .38 0 0 0 .38-.37V11.25h3.75v6a.75 .75 0 0 0 .8 .75 .77 .77 0 0 0 .7-.77V11.25h3.38A.38 .38 0 0 1 22.5 11.63ZM17.25 3.75H6.75A5.25 5.25 0 0 0 1.5 9v.38a.38 .38 0 0 0 .38 .38H5.25V6.03A.77 .77 0 0 1 5.95 5.25 .75 .75 0 0 1 6.75 6v3.75h3.75V8.63a.38 .38 0 0 1 .38-.37h2.25a.38 .38 0 0 1 .38 .38v1.13h3.75V6.03A.77 .77 0 0 1 17.95 5.25 .75 .75 0 0 1 18.75 6v3.75h3.38a.38 .38 0 0 0 .38-.37V9A5.25 5.25 0 0 0 17.25 3.75Z\"]},{\"id\":\"ph-flag-pennant\",\"label\":\"Pennant\",\"set\":\"solid\",\"paths\":[\"M23.25 9.75a.75 .75 0 0 1-.5 .71L6 16.28V20.25a.75 .75 0 0 1-1.5 0V3.75a.75 .75 0 0 1 1-.71l17.25 6A.75 .75 0 0 1 23.25 9.75Z\"]},{\"id\":\"ph-flag-banner\",\"label\":\"Banner\",\"set\":\"solid\",\"paths\":[\"M22.43 5.57l-4.28 8.98a.33 .33 0 0 1-.01 .03l-3.21 6.74a.75 .75 0 1 1-1.35-.64L16.28 15H3.75a.75 .75 0 0 1-.53-1.28L7.19 9.75 3.22 5.78A.75 .75 0 0 1 3.75 4.5H21.75a.75 .75 0 0 1 .68 1.07Z\"]},{\"id\":\"ph-sun-horizon\",\"label\":\"Sunset\",\"set\":\"solid\",\"paths\":[\"M23.25 15a.75 .75 0 0 1-.75 .75H1.5a.75 .75 0 0 1 0-1.5H5.29a6.89 6.89 0 0 1-.04-.75 6.75 6.75 0 0 1 13.5 0 6.89 6.89 0 0 1-.04 .75H22.5A.75 .75 0 0 1 23.25 15Zm-3.75 3H4.5a.75 .75 0 0 0 0 1.5H19.5a.75 .75 0 0 0 0-1.5ZM7.58 5.59a.75 .75 0 0 0 1.34-.67l-.75-1.5a.75 .75 0 0 0-1.34 .67ZM1.91 9.67l1.5 .75a.75 .75 0 1 0 .67-1.34l-1.5-.75a.75 .75 0 1 0-.67 1.34ZM20.25 10.5a.75 .75 0 0 0 .33-.08l1.5-.75a.75 .75 0 1 0-.67-1.34l-1.5 .75A.75 .75 0 0 0 20.25 10.5ZM15.41 5.92a.75 .75 0 0 0 1.01-.34l.75-1.5a.75 .75 0 0 0-1.34-.67l-.75 1.5A.75 .75 0 0 0 15.41 5.92Z\"]},{\"id\":\"ph-moon-stars\",\"label\":\"Moon and stars\",\"set\":\"solid\",\"paths\":[\"M22.5 9a.75 .75 0 0 1-.75 .75H20.25v1.5a.75 .75 0 0 1-1.5 0V9.75H17.25a.75 .75 0 0 1 0-1.5h1.5V6.75a.75 .75 0 0 1 1.5 0V8.25h1.5A.75 .75 0 0 1 22.5 9ZM13.5 5.25h.75v.75a.75 .75 0 0 0 1.5 0V5.25h.75a.75 .75 0 0 0 0-1.5h-.75V3a.75 .75 0 0 0-1.5 0v.75h-.75a.75 .75 0 0 0 0 1.5Zm6.11 8.84A8.26 8.26 0 0 1 9.91 4.39a.75 .75 0 0 0-.99-.85A9 9 0 1 0 20.46 15.09a.75 .75 0 0 0-.85-.99Z\"]},{\"id\":\"ph-cloud-moon\",\"label\":\"Night\",\"set\":\"solid\",\"paths\":[\"M16.13 6.75a7.16 7.16 0 0 0-1.16 .09A6.74 6.74 0 0 0 9.77 .92a.75 .75 0 0 0-.9 .9A5.25 5.25 0 0 1 3.75 8.25a5.29 5.29 0 0 1-1.18-.13 .75 .75 0 0 0-.9 .9 6.77 6.77 0 0 0 3.03 4.22A4.88 4.88 0 0 0 8.63 21h7.5a7.13 7.13 0 0 0 0-14.25ZM3.5 9.75c.08 0 .16 0 .25 0a6.76 6.76 0 0 0 6.75-6.75c0-.08 0-.17 0-.25a5.22 5.22 0 0 1 3 4.5A7.16 7.16 0 0 0 9.47 11.32a4.91 4.91 0 0 0-.84-.07 4.85 4.85 0 0 0-2.81 .9A5.27 5.27 0 0 1 3.5 9.75Z\"]},{\"id\":\"ph-shooting-star\",\"label\":\"Shooting star\",\"set\":\"solid\",\"paths\":[\"M22.05 7.91l-2.63 2.22 .8 3.32a1.25 1.25 0 0 1-.48 1.3 1.27 1.27 0 0 1-1.41 .06L15.38 13.03l-2.97 1.79a1.27 1.27 0 0 1-1.41-.06 1.25 1.25 0 0 1-.48-1.3l.8-3.32L8.7 7.91a1.26 1.26 0 0 1 .72-2.21l3.46-.27 1.33-3.16a1.27 1.27 0 0 1 2.33 0l1.33 3.16 3.46 .27a1.26 1.26 0 0 1 .72 2.21ZM8.26 10.49a.75 .75 0 0 0-1.06 0L1.72 15.97a.75 .75 0 0 0 1.06 1.06l5.48-5.48A.75 .75 0 0 0 8.26 10.49Zm-.05 5.74L3.22 21.22a.75 .75 0 0 0 1.06 1.06l4.99-4.99a.75 .75 0 0 0-1.06-1.06Zm6.84-.09-5.09 5.09a.75 .75 0 0 0 1.06 1.06l5.09-5.09a.75 .75 0 0 0-1.06-1.06Z\"]},{\"id\":\"ph-planet\",\"label\":\"Planet\",\"set\":\"solid\",\"paths\":[\"M22.98 5.69c-.72-1.24-2.61-1.51-5.48-.81A9 9 0 0 0 3.08 13.15C.48 15.84 .51 17.44 1.02 18.31 1.5 19.14 2.5 19.5 3.81 19.5a11.64 11.64 0 0 0 2.7-.37 9 9 0 0 0 14.42-8.27c1.17-1.22 1.95-2.38 2.22-3.37C23.33 6.8 23.27 6.19 22.98 5.69Zm-1.28 1.41c-.57 2.14-4.56 5.37-8.2 7.47-6.36 3.66-10.65 3.89-11.17 3-.14-.24-.06-.68 .21-1.22a7.51 7.51 0 0 1 .96-1.41 8.96 8.96 0 0 0 .58 1.33 .38 .38 0 0 0 .38 .2 11.45 11.45 0 0 0 1.59-.31c1.99-.52 4.37-1.54 6.71-2.89s4.41-2.87 5.85-4.33A11.51 11.51 0 0 0 19.66 7.73a.38 .38 0 0 0 .02-.42 9.02 9.02 0 0 0-.85-1.17c1.33-.22 2.57-.2 2.86 .3C21.77 6.59 21.77 6.81 21.7 7.1Z\"]},{\"id\":\"ph-alien\",\"label\":\"Alien\",\"set\":\"solid\",\"paths\":[\"M12 1.5a9.01 9.01 0 0 0-9 9c0 2.25 1.18 5.16 3.15 7.78 1.99 2.64 4.17 4.22 5.85 4.22s3.86-1.58 5.85-4.22c1.97-2.62 3.15-5.53 3.15-7.78A9.01 9.01 0 0 0 12 1.5ZM6 10.88a1.13 1.13 0 0 1 1.13-1.12 3.38 3.38 0 0 1 3.38 3.38 1.13 1.13 0 0 1-1.12 1.13A3.38 3.38 0 0 1 6 10.88Zm7.5 7.88H10.5a.75 .75 0 0 1 0-1.5h3a.75 .75 0 0 1 0 1.5Zm1.13-4.5a1.13 1.13 0 0 1-1.12-1.12 3.38 3.38 0 0 1 3.38-3.37 1.13 1.13 0 0 1 1.13 1.13A3.38 3.38 0 0 1 14.63 14.25Z\"]},{\"id\":\"ph-butterfly\",\"label\":\"Butterfly\",\"set\":\"solid\",\"paths\":[\"M12 9.39a10.16 10.16 0 0 0-.75-1.18V5.25a.75 .75 0 0 1 1.5 0V8.21A10.16 10.16 0 0 0 12 9.39ZM21.82 4.73C21.47 4.28 20.8 3.75 19.59 3.75c-1.58 0-3.61 1.06-5.42 2.83A13.13 13.13 0 0 0 12.75 8.21V16.88a.75 .75 0 0 1-1.5 0V8.21a13.13 13.13 0 0 0-1.42-1.63C8.01 4.81 5.99 3.75 4.41 3.75 3.2 3.75 2.53 4.28 2.18 4.73c-.64 .82-1.14 2.26-.02 6.68 .57 2.23 1.83 3.09 2.87 3.41A4.13 4.13 0 0 0 12 19.24a4.13 4.13 0 0 0 6.96-4.42c1.04-.32 2.3-1.18 2.87-3.41C22.47 8.93 22.95 6.2 21.82 4.73Z\"]},{\"id\":\"ph-graduation-cap\",\"label\":\"Graduation cap\",\"set\":\"solid\",\"paths\":[\"M16.5 19.43a11.16 11.16 0 0 0 1.5-.72V22.5a.75 .75 0 0 1-1.5 0Zm1.1-8.29-5.25-2.8a.75 .75 0 0 0-.7 1.32L16.03 12l1.59-.85Zm6-2.8-11.25-6a.75 .75 0 0 0-.7 0l-11.25 6a.75 .75 0 0 0 0 1.32L3 11.05v4.54a1.49 1.49 0 0 0 .38 1C4.61 17.96 7.36 20.25 12 20.25a12.19 12.19 0 0 0 4.5-.82V12.25L16.03 12l-4.03 2.15L4.11 9.94l0 0L2.34 9 12 3.85 21.66 9l-1.76 .94-.01 0L17.63 11.15a.75 .75 0 0 1 .38 .65v6.9a10.84 10.84 0 0 0 2.62-2.12A1.49 1.49 0 0 0 21 15.59V11.05l2.6-1.39a.75 .75 0 0 0 0-1.32Z\"]},{\"id\":\"ph-detective\",\"label\":\"Detective\",\"set\":\"solid\",\"paths\":[\"M24 11.25a.75 .75 0 0 1-.75 .75H.75a.75 .75 0 0 1 0-1.5H3.37l4.45-6.13a1.5 1.5 0 0 1 2.37-.07l1.2 1.4 .02 .02a.75 .75 0 0 0 1.17 0l.02-.02 1.2-1.4a1.5 1.5 0 0 1 2.37 .07L20.63 10.5H23.25A.75 .75 0 0 1 24 11.25Zm-7.12 2.25a3.38 3.38 0 0 0-3.35 3H10.48a3.38 3.38 0 1 0-.17 1.5h3.39A3.38 3.38 0 1 0 16.88 13.5Z\"]},{\"id\":\"ph-briefcase\",\"label\":\"Briefcase\",\"set\":\"solid\",\"paths\":[\"M14.25 10.5a.75 .75 0 0 1-.75 .75H10.5a.75 .75 0 0 1 0-1.5h3A.75 .75 0 0 1 14.25 10.5Zm7.5-3.75V18.75a1.5 1.5 0 0 1-1.5 1.5H3.75a1.5 1.5 0 0 1-1.5-1.5V6.75A1.5 1.5 0 0 1 3.75 5.25H7.5V4.5a2.25 2.25 0 0 1 2.25-2.25h4.5a2.25 2.25 0 0 1 2.25 2.25v.75h3.75A1.5 1.5 0 0 1 21.75 6.75ZM9 5.25h6V4.5a.75 .75 0 0 0-.75-.75H9.75a.75 .75 0 0 0-.75 .75Zm11.25 5.4V6.75H3.75v3.9A17.25 17.25 0 0 0 12 12.75 17.25 17.25 0 0 0 20.25 10.65Z\"]},{\"id\":\"ph-money-wavy\",\"label\":\"Cash\",\"set\":\"solid\",\"paths\":[\"M22.9 5.63a.75 .75 0 0 0-.73-.04c-4.02 1.97-6.9 1.05-9.94 .07C9.04 4.64 5.74 3.59 1.17 5.82A.75 .75 0 0 0 .75 6.49V17.73a.75 .75 0 0 0 1.08 .67c4.02-1.97 6.9-1.05 9.94-.07 1.8 .58 3.64 1.16 5.72 1.16 1.6 0 3.35-.35 5.34-1.32a.75 .75 0 0 0 .42-.67V6.27A.75 .75 0 0 0 22.9 5.63ZM4.5 14.25a.75 .75 0 0 1-1.5 0V8.25a.75 .75 0 0 1 1.5 0Zm7.5 .75a3 3 0 1 1 3-3A3 3 0 0 1 12 15Zm9 .75a.75 .75 0 0 1-1.5 0V9.75a.75 .75 0 0 1 1.5 0Z\"]},{\"id\":\"ph-coin-vertical\",\"label\":\"Coin\",\"set\":\"solid\",\"paths\":[\"M18.61 5.26C17.48 3.32 15.93 2.25 14.25 2.25H9.75C8.07 2.25 6.52 3.32 5.39 5.26 4.33 7.07 3.75 9.47 3.75 12s.58 4.93 1.64 6.74C6.52 20.68 8.07 21.75 9.75 21.75h4.5c1.68 0 3.23-1.07 4.36-3.01C19.67 16.93 20.25 14.53 20.25 12S19.67 7.07 18.61 5.26ZM18.73 11.25h-3a14.32 14.32 0 0 0-.91-4.5H17.69C18.26 8 18.64 9.56 18.73 11.25Zm-1.93-6H14.11a7.79 7.79 0 0 0-1.12-1.5H14.25C15.19 3.75 16.07 4.31 16.8 5.25ZM14.25 20.25H12.98a7.79 7.79 0 0 0 1.13-1.5h2.69C16.07 19.69 15.19 20.25 14.25 20.25Zm3.44-3H14.82a14.32 14.32 0 0 0 .91-4.5h3C18.64 14.44 18.26 16 17.69 17.25Z\"]},{\"id\":\"ph-currency-circle-dollar\",\"label\":\"Dollar coin\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm1.13 14.25h-.37v.75a.75 .75 0 0 1-1.5 0v-.75H9.75a.75 .75 0 0 1 0-1.5h3.38a1.13 1.13 0 0 0 0-2.25H10.88a2.63 2.63 0 0 1 0-5.25h.38V6.75a.75 .75 0 0 1 1.5 0v.75h1.5a.75 .75 0 0 1 0 1.5H10.88a1.13 1.13 0 0 0 0 2.25h2.25a2.63 2.63 0 0 1 0 5.25Z\"]},{\"id\":\"ph-shield-star\",\"label\":\"Shield star\",\"set\":\"solid\",\"paths\":[\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v5.25c0 4.94 2.39 7.94 4.4 9.58 2.16 1.77 4.31 2.37 4.41 2.39a.75 .75 0 0 0 .39 0c.09-.02 2.24-.63 4.41-2.39C18.61 18.44 21 15.44 21 10.5V5.25A1.5 1.5 0 0 0 19.5 3.75Zm-3.47 8.2-2.84 1.14L14.85 15.3a.75 .75 0 1 1-1.2 .9L12 14 10.35 16.2a.75 .75 0 1 1-1.2-.9l1.66-2.22L7.97 11.95A.75 .75 0 1 1 8.53 10.55l2.72 1.09V9a.75 .75 0 0 1 1.5 0v2.64l2.72-1.09A.75 .75 0 1 1 16.03 11.95Z\"]},{\"id\":\"ph-headset\",\"label\":\"Headset\",\"set\":\"solid\",\"paths\":[\"M21.75 12v7.5a3.75 3.75 0 0 1-3.75 3.75H12.75a.75 .75 0 0 1 0-1.5h5.25a2.25 2.25 0 0 0 2.25-2.25H18a2.25 2.25 0 0 1-2.25-2.25V13.5a2.25 2.25 0 0 1 2.25-2.25h2.22A8.25 8.25 0 0 0 6.19 6.14 8.18 8.18 0 0 0 3.78 11.25H6a2.25 2.25 0 0 1 2.25 2.25v3.75a2.25 2.25 0 0 1-2.25 2.25H4.5a2.25 2.25 0 0 1-2.25-2.25V12A9.76 9.76 0 0 1 18.93 5.12 9.69 9.69 0 0 1 21.75 12Z\"]},{\"id\":\"ph-soccer-ball\",\"label\":\"Football\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm.75 3.69 2.32-1.6a8.29 8.29 0 0 1 3.39 2.53l-.75 2.53c-.02 0-.04 .01-.06 .02l-2.14 .69a.71 .71 0 0 0-.09 .04L12.75 8.31c0-.02 0-.04 0-.06V6C12.75 5.98 12.75 5.96 12.75 5.94ZM8.93 4.34 11.25 5.94c0 .02 0 .04 0 .06V8.25c0 .02 0 .04 0 .06L8.57 10.15a.71 .71 0 0 0-.09-.04l-2.14-.69c-.02-.01-.04-.01-.06-.02l-.75-2.53A8.29 8.29 0 0 1 8.93 4.34Zm-1.22 12.1H5.05a8.19 8.19 0 0 1-1.29-4.04l2.06-1.58a.54 .54 0 0 0 .05 .02l2.14 .7a.73 .73 0 0 0 .09 .02l1.01 2.95c-.01 .02-.03 .03-.04 .05L7.75 16.38A.73 .73 0 0 0 7.71 16.45ZM14.13 19.97a8.27 8.27 0 0 1-4.25 0L8.93 17.31c.01-.01 .03-.03 .04-.04l1.32-1.82a.72 .72 0 0 0 .04-.07h3.34a.72 .72 0 0 0 .04 .07l1.32 1.82c.01 .02 .02 .03 .04 .05Zm2.16-3.53a.73 .73 0 0 0-.04-.07L14.92 14.56c-.01-.02-.03-.03-.04-.05l1.01-2.95a.73 .73 0 0 0 .09-.02l2.14-.7a.54 .54 0 0 0 .05-.02l2.06 1.58a8.19 8.19 0 0 1-1.29 4.04Z\"]},{\"id\":\"ph-basketball\",\"label\":\"Basketball\",\"set\":\"solid\",\"paths\":[\"M5.96 4.35a9.7 9.7 0 0 1 4.88-2.03 .38 .38 0 0 1 .42 .38V11.25H8.97A9.73 9.73 0 0 0 5.94 4.92 .38 .38 0 0 1 5.96 4.35ZM4.31 6.01a9.7 9.7 0 0 0-2 4.82 .38 .38 0 0 0 .38 .42H7.47A8.24 8.24 0 0 0 4.86 5.96 .38 .38 0 0 0 4.31 6.01ZM18.04 4.35a9.7 9.7 0 0 0-4.87-2.03 .38 .38 0 0 0-.42 .38V11.25h2.28a9.73 9.73 0 0 1 3.03-6.33A.38 .38 0 0 0 18.04 4.35Zm3.64 6.48A9.7 9.7 0 0 0 19.69 6.01a.38 .38 0 0 0-.55-.04A8.24 8.24 0 0 0 16.53 11.25h4.77A.38 .38 0 0 0 21.68 10.83ZM2.32 13.17A9.7 9.7 0 0 0 4.31 17.99a.38 .38 0 0 0 .55 .05A8.24 8.24 0 0 0 7.47 12.75H2.69A.38 .38 0 0 0 2.32 13.17ZM19.69 17.99a9.7 9.7 0 0 0 2-4.82 .38 .38 0 0 0-.37-.42H16.53a8.24 8.24 0 0 0 2.6 5.29A.38 .38 0 0 0 19.69 17.99ZM5.96 19.65a9.7 9.7 0 0 0 4.88 2.03 .38 .38 0 0 0 .42-.37V12.75H8.97a9.73 9.73 0 0 1-3.03 6.33A.38 .38 0 0 0 5.96 19.65ZM15.03 12.75H12.75v8.56a.38 .38 0 0 0 .42 .38 9.7 9.7 0 0 0 4.88-2.03 .38 .38 0 0 0 .02-.57A9.73 9.73 0 0 1 15.03 12.75Z\"]},{\"id\":\"ph-heartbeat\",\"label\":\"Heartbeat\",\"set\":\"solid\",\"paths\":[\"M22.5 9.56c0 6.56-9.73 11.87-10.14 12.09a.75 .75 0 0 1-.71 0c-.31-.17-5.96-3.25-8.69-7.58A.38 .38 0 0 1 3.27 13.5H6.75a.75 .75 0 0 0 .62-.33l.88-1.31 2.38 3.56a.75 .75 0 0 0 .86 .3 .77 .77 0 0 0 .4-.31L13.15 13.5H15a.75 .75 0 0 0 .75-.8 .77 .77 0 0 0-.77-.7H12.75a.75 .75 0 0 0-.62 .33l-.88 1.31-2.38-3.56a.75 .75 0 0 0-.86-.3 .77 .77 0 0 0-.4 .31L6.35 12H2.21a.38 .38 0 0 1-.36-.26A7.21 7.21 0 0 1 1.5 9.56 5.82 5.82 0 0 1 7.31 3.75c1.94 0 3.63 .83 4.69 2.24C13.06 4.58 14.75 3.75 16.69 3.75A5.82 5.82 0 0 1 22.5 9.56Z\"]},{\"id\":\"ph-thumbs-up\",\"label\":\"Like\",\"set\":\"solid\",\"paths\":[\"M21.94 7.51A2.25 2.25 0 0 0 20.25 6.75H15V5.25a3.75 3.75 0 0 0-3.75-3.75 .75 .75 0 0 0-.67 .41L7.04 9H3a1.5 1.5 0 0 0-1.5 1.5v8.25a1.5 1.5 0 0 0 1.5 1.5H19.13a2.25 2.25 0 0 0 2.23-1.97l1.13-9A2.25 2.25 0 0 0 21.94 7.51ZM3 10.5H6.75v8.25H3Z\"]},{\"id\":\"ph-thumbs-down\",\"label\":\"Dislike\",\"set\":\"solid\",\"paths\":[\"M22.48 14.72l-1.12-9A2.25 2.25 0 0 0 19.13 3.75H3A1.5 1.5 0 0 0 1.5 5.25v8.25a1.5 1.5 0 0 0 1.5 1.5H7.04l3.54 7.09A.75 .75 0 0 0 11.25 22.5a3.75 3.75 0 0 0 3.75-3.75V17.25h5.25a2.25 2.25 0 0 0 2.23-2.53ZM6.75 13.5H3V5.25H6.75Z\"]},{\"id\":\"ph-check-circle\",\"label\":\"Check\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm4.28 8.03-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-x-circle\",\"label\":\"Cross\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.53 12.22a.75 .75 0 0 1-1.06 1.06L12 13.06l-2.47 2.47a.75 .75 0 0 1-1.06-1.06L10.94 12 8.47 9.53a.75 .75 0 0 1 1.06-1.06L12 10.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06L13.06 12Z\"]},{\"id\":\"ph-check-fat\",\"label\":\"Check mark\",\"set\":\"solid\",\"paths\":[\"M22.81 8.52l-12.04 12.04a1.5 1.5 0 0 1-2.12 0l-6.71-6.75a1.5 1.5 0 0 1 0-2.12l1.88-1.87a1.5 1.5 0 0 1 2.12 0L9.75 13.52l9.07-8.96a1.5 1.5 0 0 1 2.12 0l1.87 1.83A1.5 1.5 0 0 1 22.81 8.52Z\"]},{\"id\":\"ph-x\",\"label\":\"Close\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM17.03 15.97a.75 .75 0 0 1-1.06 1.06L12 13.06 8.03 17.03a.75 .75 0 0 1-1.06-1.06L10.94 12 6.97 8.03A.75 .75 0 0 1 8.03 6.97L12 10.94l3.97-3.97a.75 .75 0 0 1 1.06 1.06L13.06 12Z\"]},{\"id\":\"ph-check-square\",\"label\":\"Check square\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3Zm-3.22 7.28-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-x-square\",\"label\":\"Cross square\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM15.53 14.47a.75 .75 0 0 1-1.06 1.06L12 13.06l-2.47 2.47a.75 .75 0 0 1-1.06-1.06L10.94 12 8.47 9.53a.75 .75 0 0 1 1.06-1.06L12 10.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06L13.06 12Z\"]},{\"id\":\"ph-warning\",\"label\":\"Warning\",\"set\":\"solid\",\"paths\":[\"M22.2 17.63 14 3.4h0a2.32 2.32 0 0 0-4 0L1.8 17.63a2.2 2.2 0 0 0 0 2.22A2.28 2.28 0 0 0 3.8 21h16.4a2.28 2.28 0 0 0 2-1.14A2.2 2.2 0 0 0 22.2 17.63ZM11.25 9.75a.75 .75 0 0 1 1.5 0v3.75a.75 .75 0 0 1-1.5 0Zm.75 8.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 18Z\"]},{\"id\":\"ph-warning-circle\",\"label\":\"Alert\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm-.75 5.25a.75 .75 0 0 1 1.5 0v5.25a.75 .75 0 0 1-1.5 0Zm.75 9.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 17.25Z\"]},{\"id\":\"ph-info\",\"label\":\"Info\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm-.37 4.5a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 11.63 6.75Zm1.13 10.5a1.5 1.5 0 0 1-1.5-1.5V12a.75 .75 0 0 1 0-1.5 1.5 1.5 0 0 1 1.5 1.5v3.75a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-question\",\"label\":\"Question\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 15.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 18Zm.75-4.57V13.5a.75 .75 0 0 1-1.5 0v-.75a.75 .75 0 0 1 .75-.75c1.24 0 2.25-.84 2.25-1.87s-1.01-1.87-2.25-1.87-2.25 .84-2.25 1.88v.38a.75 .75 0 0 1-1.5 0v-.37c0-1.86 1.68-3.37 3.75-3.37s3.75 1.51 3.75 3.38C15.75 11.75 14.46 13.12 12.75 13.43Z\"]},{\"id\":\"ph-prohibit\",\"label\":\"Ban\",\"set\":\"solid\",\"paths\":[\"M18.75 12a6.72 6.72 0 0 1-1.48 4.21L7.79 6.73A6.75 6.75 0 0 1 18.75 12ZM5.25 12a6.75 6.75 0 0 0 10.96 5.27L6.73 7.79A6.72 6.72 0 0 0 5.25 12Zm16.88 0A10.13 10.13 0 1 1 12 1.88 10.14 10.14 0 0 1 22.13 12Zm-1.87 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12Z\"]},{\"id\":\"ph-heart\",\"label\":\"Heart\",\"set\":\"solid\",\"paths\":[\"M22.5 9.56c0 6.56-9.73 11.87-10.14 12.09a.75 .75 0 0 1-.71 0C11.23 21.44 1.5 16.13 1.5 9.56A5.82 5.82 0 0 1 7.31 3.75c1.94 0 3.63 .83 4.69 2.24C13.06 4.58 14.75 3.75 16.69 3.75A5.82 5.82 0 0 1 22.5 9.56Z\"]},{\"id\":\"ph-heart-straight\",\"label\":\"Heart straight\",\"set\":\"solid\",\"paths\":[\"M22.5 9.19a5.4 5.4 0 0 1-1.59 3.84L12.53 21.53a.75 .75 0 0 1-1.07 0L3.09 13.03a5.44 5.44 0 0 1 7.69-7.7L12 6.47l1.23-1.14A5.44 5.44 0 0 1 22.5 9.19Z\"]},{\"id\":\"ph-star\",\"label\":\"Star\",\"set\":\"solid\",\"paths\":[\"M21.96 10.77l-4.22 3.64L19.03 19.85a1.54 1.54 0 0 1-2.3 1.67L12 18.61 7.26 21.52A1.54 1.54 0 0 1 4.97 19.85l1.29-5.44-4.22-3.64A1.54 1.54 0 0 1 2.91 8.06l5.53-.45 2.13-5.16a1.53 1.53 0 0 1 2.84 0l2.13 5.16 5.53 .45a1.54 1.54 0 0 1 .88 2.71Z\"]},{\"id\":\"ph-star-four\",\"label\":\"Twinkle\",\"set\":\"solid\",\"paths\":[\"M22.5 12a1.48 1.48 0 0 1-.98 1.41l-5.95 2.16L13.41 21.52a1.5 1.5 0 0 1-2.81 0L8.43 15.57 2.48 13.41a1.5 1.5 0 0 1 0-2.81L8.43 8.43 10.59 2.48a1.5 1.5 0 0 1 2.81 0l2.16 5.95L21.52 10.59A1.48 1.48 0 0 1 22.5 12Z\"]},{\"id\":\"ph-sparkle\",\"label\":\"Sparkle\",\"set\":\"solid\",\"paths\":[\"M19.5 13.5a1.48 1.48 0 0 1-.98 1.4L13.69 16.69l-1.78 4.84a1.49 1.49 0 0 1-2.8 0L7.31 16.69l-4.84-1.78a1.49 1.49 0 0 1 0-2.8L7.31 10.31l1.78-4.84a1.49 1.49 0 0 1 2.8 0L13.69 10.31l4.84 1.78A1.48 1.48 0 0 1 19.5 13.5ZM14.25 4.5h1.5V6a.75 .75 0 0 0 1.5 0V4.5h1.5a.75 .75 0 0 0 0-1.5H17.25V1.5a.75 .75 0 0 0-1.5 0V3H14.25a.75 .75 0 0 0 0 1.5Zm8.25 3h-.75V6.75a.75 .75 0 0 0-1.5 0v.75h-.75a.75 .75 0 0 0 0 1.5h.75v.75a.75 .75 0 0 0 1.5 0V9h.75a.75 .75 0 0 0 0-1.5Z\"]},{\"id\":\"ph-fire\",\"label\":\"Fire\",\"set\":\"solid\",\"paths\":[\"M13.44 1.67a.75 .75 0 0 0-1.18 .32l-2.06 5.66L7.93 5.46a.75 .75 0 0 0-1.12 .08C4.78 8.21 3.75 10.88 3.75 13.5a8.25 8.25 0 0 0 16.5 0C20.25 7.93 15.49 3.38 13.44 1.67Zm3.8 12.7a5.4 5.4 0 0 1-4.36 4.36A.72 .72 0 0 1 12.75 18.75a.75 .75 0 0 1-.12-1.49c1.55-.26 2.87-1.58 3.14-3.14a.75 .75 0 0 1 1.48 .25Z\"]},{\"id\":\"ph-lightning\",\"label\":\"Bolt\",\"set\":\"solid\",\"paths\":[\"M20.05 11.76l-10.5 11.25a.75 .75 0 0 1-1.28-.66l1.37-6.87L4.24 13.45a.75 .75 0 0 1-.28-1.22l10.5-11.25a.75 .75 0 0 1 1.28 .66L14.36 8.52l5.4 2.03a.75 .75 0 0 1 .28 1.21Z\"]},{\"id\":\"ph-crown\",\"label\":\"Crown\",\"set\":\"solid\",\"paths\":[\"M23.25 7.5a2.63 2.63 0 1 0-4.79 1.48l-2.51 3.09L13.69 6.88a2.63 2.63 0 1 0-3.38 0L8.05 12.07l-2.51-3.09a2.63 2.63 0 1 0-2.49 1.13L4.41 18.25A1.5 1.5 0 0 0 5.89 19.5H18.11A1.5 1.5 0 0 0 19.59 18.25l1.36-8.14A2.63 2.63 0 0 0 23.25 7.5ZM12 3.75a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 12 3.75ZM2.25 7.5A1.13 1.13 0 1 1 3.38 8.63 1.13 1.13 0 0 1 2.25 7.5ZM20.63 8.63a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 20.63 8.63Z\"]},{\"id\":\"ph-crown-simple\",\"label\":\"Crown simple\",\"set\":\"solid\",\"paths\":[\"M22.48 8.51c0 .01 0 .02-.01 .03L20.34 18.28a1.5 1.5 0 0 1-1.47 1.22H5.13A1.5 1.5 0 0 1 3.66 18.28L1.53 8.54c0-.01 0-.02-.01-.03A1.5 1.5 0 0 1 4.13 7.26l3.16 3.4 3.36-7.53a.09 .09 0 0 0 0-.01 1.5 1.5 0 0 1 2.72 0 .09 .09 0 0 0 0 .01l3.36 7.53L19.88 7.26a1.5 1.5 0 0 1 2.6 1.26Z\"]},{\"id\":\"ph-trophy\",\"label\":\"Trophy\",\"set\":\"solid\",\"paths\":[\"M21.75 6H19.5V4.5a.75 .75 0 0 0-.75-.75H5.25a.75 .75 0 0 0-.75 .75V6H2.25A1.5 1.5 0 0 0 .75 7.5V9a3.75 3.75 0 0 0 3.75 3.75h.34A7.51 7.51 0 0 0 11.25 17.96V20.25H9a.75 .75 0 0 0 0 1.5h6a.75 .75 0 0 0 0-1.5H12.75V17.96c2.99-.3 5.48-2.4 6.38-5.21H19.5a3.75 3.75 0 0 0 3.75-3.75V7.5A1.5 1.5 0 0 0 21.75 6ZM4.5 11.25A2.25 2.25 0 0 1 2.25 9V7.5H4.5v3q0 .38 .04 .75ZM21.75 9a2.25 2.25 0 0 1-2.25 2.25h-.05a7.67 7.67 0 0 0 .05-.83V7.5h2.25Z\"]},{\"id\":\"ph-medal\",\"label\":\"Medal\",\"set\":\"solid\",\"paths\":[\"M20.25 9A8.25 8.25 0 1 0 6.75 15.36V22.5a.75 .75 0 0 0 1.09 .67L12 21.09l4.17 2.08A.76 .76 0 0 0 16.5 23.25a.75 .75 0 0 0 .75-.75V15.36A8.24 8.24 0 0 0 20.25 9ZM5.25 9a6.75 6.75 0 1 1 6.75 6.75A6.76 6.76 0 0 1 5.25 9Zm1.5 0a5.25 5.25 0 1 1 5.25 5.25A5.26 5.26 0 0 1 6.75 9Z\"]},{\"id\":\"ph-medal-military\",\"label\":\"Military medal\",\"set\":\"solid\",\"paths\":[\"M19.41 3.75H4.59A1.59 1.59 0 0 0 3 5.34v4.61a1.59 1.59 0 0 0 .94 1.45l5.87 2.67a4.5 4.5 0 1 0 4.4 0L20.06 11.41a1.59 1.59 0 0 0 .94-1.45V5.34A1.59 1.59 0 0 0 19.41 3.75ZM9 5.25h6v6.81l-3 1.36L9 12.06Zm3 15.75a3 3 0 1 1 3-3A3 3 0 0 1 12 21Z\"]},{\"id\":\"ph-diamond\",\"label\":\"Diamond\",\"set\":\"solid\",\"paths\":[\"M22.5 12a1.49 1.49 0 0 1-.44 1.06l-9 9.01a1.5 1.5 0 0 1-2.11 0h0l-9-9.01a1.5 1.5 0 0 1 0-2.11l9-9.01a1.5 1.5 0 0 1 2.11 0l9 9.01A1.49 1.49 0 0 1 22.5 12Z\"]},{\"id\":\"ph-diamonds-four\",\"label\":\"Diamonds\",\"set\":\"solid\",\"paths\":[\"M7.72 6.53a.75 .75 0 0 1 0-1.06l3.75-3.75a.75 .75 0 0 1 1.06 0l3.75 3.75a.75 .75 0 0 1 0 1.06l-3.75 3.75a.75 .75 0 0 1-1.06 0Zm4.81 7.19a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75a.75 .75 0 0 0 0-1.06Zm9.75-2.25-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75A.75 .75 0 0 0 22.28 11.47Zm-12 0-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75A.75 .75 0 0 0 10.28 11.47Z\"]},{\"id\":\"ph-gift\",\"label\":\"Gift\",\"set\":\"solid\",\"paths\":[\"M20.25 6.75H16.96c.04-.03 .07-.06 .11-.09A2.77 2.77 0 0 0 18 4.65 3.06 3.06 0 0 0 14.85 1.5 2.77 2.77 0 0 0 12.84 2.43a5.15 5.15 0 0 0-.84 1.36 5.15 5.15 0 0 0-.84-1.36A2.77 2.77 0 0 0 9.15 1.5 3.06 3.06 0 0 0 6 4.65 2.77 2.77 0 0 0 6.93 6.66c.04 .03 .07 .06 .11 .09H3.75A1.5 1.5 0 0 0 2.25 8.25v3a1.5 1.5 0 0 0 1.5 1.5v6a1.5 1.5 0 0 0 1.5 1.5h5.63a.38 .38 0 0 0 .38-.37V11.25H3.75V8.25h7.5v3h1.5V8.25h7.5v3H12.75v8.63a.38 .38 0 0 0 .38 .38h5.63a1.5 1.5 0 0 0 1.5-1.5V12.75a1.5 1.5 0 0 0 1.5-1.5V8.25A1.5 1.5 0 0 0 20.25 6.75ZM7.92 5.53a1.28 1.28 0 0 1-.42-.94A1.56 1.56 0 0 1 9.06 3h.05a1.28 1.28 0 0 1 .94 .42c.79 .89 1.06 2.36 1.16 3.27C10.29 6.6 8.81 6.32 7.92 5.53Zm8.16 0c-.89 .79-2.37 1.07-3.28 1.16C12.91 5.71 13.22 4.27 13.97 3.42a1.28 1.28 0 0 1 .94-.42h.05A1.56 1.56 0 0 1 16.5 4.6 1.28 1.28 0 0 1 16.08 5.53Z\"]},{\"id\":\"ph-confetti\",\"label\":\"Party\",\"set\":\"solid\",\"paths\":[\"M10.45 4.93a1.48 1.48 0 0 0-2.44 .54L3.09 19.01A1.48 1.48 0 0 0 4.48 21a1.5 1.5 0 0 0 .51-.09l13.53-4.92a1.48 1.48 0 0 0 .54-2.44ZM6.11 15.11l1.8-4.95 5.94 5.94-4.95 1.8ZM15 6.75a3.54 3.54 0 0 1 .36-1.46C15.86 4.3 16.79 3.75 18 3.75c.63 0 1.03-.21 1.28-.68A2.06 2.06 0 0 0 19.5 2.24 .75 .75 0 0 1 21 2.25c0 1.21-.8 3-3 3-.63 0-1.03 .21-1.28 .68A2.06 2.06 0 0 0 16.5 6.76 .75 .75 0 0 1 15 6.75ZM12.75 3.75V1.5a.75 .75 0 0 1 1.5 0V3.75a.75 .75 0 0 1-1.5 0Zm9.53 7.72a.75 .75 0 1 1-1.06 1.06l-1.5-1.5a.75 .75 0 0 1 1.06-1.06Zm.46-4.01-2.25 .75a.75 .75 0 0 1-.47-1.42l2.25-.75a.75 .75 0 0 1 .47 1.42Z\"]},{\"id\":\"ph-smiley\",\"label\":\"Smile\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25ZM8.63 9a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 8.63 9Zm7.77 5.63c-.96 1.67-2.57 2.63-4.4 2.63s-3.43-.96-4.4-2.62a.75 .75 0 1 1 1.3-.75c.7 1.21 1.8 1.88 3.1 1.88s2.4-.67 3.1-1.87a.75 .75 0 1 1 1.3 .75ZM15.38 11.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.38 11.25Z\"]},{\"id\":\"ph-smiley-wink\",\"label\":\"Wink\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25ZM8.63 9a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 8.63 9Zm7.77 5.63c-.96 1.67-2.57 2.63-4.4 2.63s-3.43-.96-4.4-2.62a.75 .75 0 1 1 1.3-.75c.7 1.21 1.8 1.88 3.1 1.88s2.4-.67 3.1-1.87a.75 .75 0 1 1 1.3 .75ZM17.25 10.88H14.25a.75 .75 0 0 1 0-1.5h3a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-smiley-sad\",\"label\":\"Sad\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25ZM8.63 9a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 8.63 9Zm7.5 8.15A.75 .75 0 0 1 15.1 16.88c-.7-1.21-1.8-1.87-3.1-1.87s-2.4 .67-3.1 1.88a.75 .75 0 1 1-1.3-.75c.96-1.67 2.57-2.62 4.4-2.62s3.43 .96 4.4 2.63A.75 .75 0 0 1 16.13 17.15ZM15.38 11.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.38 11.25Z\"]},{\"id\":\"ph-smiley-angry\",\"label\":\"Angry\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25ZM7.5 13.13a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 7.5 13.13Zm7.37 4.54a.75 .75 0 0 1-1.04 .21C13.23 17.47 12.75 17.25 12 17.25s-1.23 .22-1.83 .62a.75 .75 0 0 1-.83-1.25C10.13 16.1 10.88 15.75 12 15.75s1.88 .35 2.67 .88A.75 .75 0 0 1 14.87 17.67ZM15.38 14.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.38 14.25Zm1.54-5.38-4.5 3a.75 .75 0 0 1-.83 0l-4.5-3a.75 .75 0 1 1 .83-1.25L12 10.35l4.08-2.72a.75 .75 0 0 1 .83 1.25Z\"]},{\"id\":\"ph-smiley-x-eyes\",\"label\":\"Dizzy\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm-1.72 9.22a.75 .75 0 0 1-1.06 1.06L8.25 11.56 7.28 12.53a.75 .75 0 0 1-1.06-1.06L7.19 10.5 6.22 9.53A.75 .75 0 0 1 7.28 8.47L8.25 9.44 9.22 8.47a.75 .75 0 0 1 1.06 1.06L9.31 10.5ZM12 18a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 18Zm5.78-6.53a.75 .75 0 0 1-1.06 1.06L15.75 11.56l-.97 .97a.75 .75 0 0 1-1.06-1.06L14.69 10.5l-.97-.97a.75 .75 0 0 1 1.06-1.06L15.75 9.44l.97-.97a.75 .75 0 0 1 1.06 1.06L16.81 10.5Z\"]},{\"id\":\"ph-skull\",\"label\":\"Skull\",\"set\":\"solid\",\"paths\":[\"M12 1.5C6.62 1.5 2.25 5.71 2.25 10.88c0 3.2 1.71 6.19 4.5 7.9V20.25a1.5 1.5 0 0 0 1.5 1.5h.75a.38 .38 0 0 0 .38-.37V18.78a.77 .77 0 0 1 .7-.77 .75 .75 0 0 1 .8 .75v2.63a.38 .38 0 0 0 .38 .38h1.5a.38 .38 0 0 0 .38-.37V18.78a.77 .77 0 0 1 .7-.77 .75 .75 0 0 1 .8 .75v2.63a.38 .38 0 0 0 .38 .38h.75a1.5 1.5 0 0 0 1.5-1.5V18.78C20.04 17.06 21.75 14.07 21.75 10.88 21.75 5.71 17.38 1.5 12 1.5ZM8.63 14.25a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 8.63 14.25Zm6.75 0a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 15.38 14.25Z\"]},{\"id\":\"ph-ghost\",\"label\":\"Ghost\",\"set\":\"solid\",\"paths\":[\"M12 2.25a9.01 9.01 0 0 0-9 9v9a.75 .75 0 0 0 1.23 .58l2.27-1.86L8.77 20.83a.75 .75 0 0 0 .95 0L12 18.97l2.28 1.86a.75 .75 0 0 0 .95 0l2.28-1.86 2.27 1.86A.75 .75 0 0 0 21 20.25V11.25A9.01 9.01 0 0 0 12 2.25ZM9.38 12a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 9.38 12Zm5.25 0a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 14.63 12Z\"]},{\"id\":\"ph-hand-waving\",\"label\":\"Wave\",\"set\":\"solid\",\"paths\":[\"M20.56 9.23A8.25 8.25 0 1 1 6.29 17.51h0L2.45 10.86a1.5 1.5 0 0 1 2.6-1.5L6.79 12.38a.75 .75 0 0 0 1.3-.75L4.41 5.25A1.5 1.5 0 0 1 7 3.75L10.69 10.13a.75 .75 0 1 0 1.3-.75l-2.81-4.87a1.5 1.5 0 0 1 2.6-1.5L15.56 9.57A4.52 4.52 0 0 0 14.25 12.75a4.46 4.46 0 0 0 .9 2.7 .75 .75 0 1 0 1.2-.9A3 3 0 0 1 16.97 10.34a.75 .75 0 0 0 .2-.98L16.1 7.5a1.5 1.5 0 0 1 2.6-1.5l1.86 3.23Zm-2.75-5.34A4.1 4.1 0 0 1 20.32 5.81l.03 .05a.75 .75 0 0 0 1.3-.75L21.62 5.06a5.59 5.59 0 0 0-3.43-2.62 .75 .75 0 0 0-.39 1.45ZM7.46 21.16A9.71 9.71 0 0 1 5.06 18.38a.75 .75 0 0 0-1.3 .75 11.21 11.21 0 0 0 2.78 3.21 .75 .75 0 0 0 .93-1.18Z\"]},{\"id\":\"ph-hand-heart\",\"label\":\"Hand heart\",\"set\":\"solid\",\"paths\":[\"M21.59 13.22a2.28 2.28 0 0 0-1.74-.45C21.61 11 22.5 9.23 22.5 7.5c0-2.48-2-4.5-4.45-4.5A4.46 4.46 0 0 0 14.63 4.57 4.46 4.46 0 0 0 11.2 3C8.75 3 6.75 5.02 6.75 7.5c0 1.03 .3 2.03 .94 3.09a2.99 2.99 0 0 0-1.38 .79L4.19 13.5H1.5A1.5 1.5 0 0 0 0 15v3.75a1.5 1.5 0 0 0 1.5 1.5H11.25a.74 .74 0 0 0 .18-.02l6-1.5a.65 .65 0 0 0 .11-.04L21.19 17.14l.04-.02a2.31 2.31 0 0 0 .37-3.9Zm-1.02 2.55-3.56 1.52L11.16 18.75H5.25V14.56l2.12-2.12A1.49 1.49 0 0 1 8.43 12H13.13a1.13 1.13 0 0 1 0 2.25H10.5a.75 .75 0 0 0 0 1.5h3a.78 .78 0 0 0 .17-.02l6.28-1.44 .03-.01a.81 .81 0 0 1 .59 1.49Z\"]},{\"id\":\"ph-handshake\",\"label\":\"Handshake\",\"set\":\"solid\",\"paths\":[\"M23.84 10.12 21.45 5.33a1.5 1.5 0 0 0-2.01-.67L17.1 5.82 12.19 4.53a.76 .76 0 0 0-.38 0L6.9 5.82 4.56 4.66a1.5 1.5 0 0 0-2.01 .67L.16 10.12a1.5 1.5 0 0 0 .67 2.01l2.53 1.27 5.2 3.72a.76 .76 0 0 0 .25 .12l6 1.5a.75 .75 0 0 0 .71-.2l3.75-3.75 1.41-1.41 2.48-1.24a1.5 1.5 0 0 0 .67-2.01Zm-5.15 3.13L15.47 10.66a.75 .75 0 0 0-1 .06C12.8 12.4 10.94 12.19 9.75 11.44L13.8 7.5h2.98l2.55 5.1Zm-3.93 3.92L9.32 15.81l-4.61-3.29 2.63-5.25L12 6.03l.92 .24-4.22 4.1-.01 .01a1.5 1.5 0 0 0 .26 2.33c1.93 1.23 4.25 1.03 6.09-.47L17.63 14.31Zm-2.41 3.26a.75 .75 0 0 1-.73 .57 .76 .76 0 0 1-.18-.02L7.54 20a.74 .74 0 0 1-.25-.12L4.81 18.12a.75 .75 0 0 1 .87-1.22l2.35 1.68L11.81 19.52A.75 .75 0 0 1 12.36 20.43Z\"]},{\"id\":\"ph-hands-clapping\",\"label\":\"Clap\",\"set\":\"solid\",\"paths\":[\"M17.71 6.09A1.69 1.69 0 0 0 14.78 7.78L12.5 3.84a1.69 1.69 0 0 0-2.93 1.69L9.04 4.59A1.69 1.69 0 0 0 6.11 6.28l.31 .54A2.44 2.44 0 0 0 3.73 10.41l.28 .49A2.44 2.44 0 0 0 2.2 14.53l3.31 5.72a7.51 7.51 0 0 0 14.02-3.71A6.74 6.74 0 0 0 19.69 9.52Zm.11 11.96A6.01 6.01 0 0 1 6.81 19.5L3.5 13.78a.94 .94 0 0 1 1.63-.94L7.03 16.13a.75 .75 0 0 0 1.3-.75L5.03 9.66A.94 .94 0 0 1 6.66 8.72l2.98 5.16a.75 .75 0 0 0 1.3-.75l-2.44-4.22a.94 .94 0 0 1 1.63-.94l3.42 5.91a.75 .75 0 0 0 1.3-.75l-1.18-2.04A.94 .94 0 0 1 15.32 10.22l1.9 3.28A5.96 5.96 0 0 1 17.82 18.05ZM15.02 2.25V.75a.75 .75 0 0 1 1.5 0V2.25a.75 .75 0 0 1-1.5 0Zm3.11 .56 .75-1.23a.75 .75 0 0 1 1.28 .78l-.75 1.23a.75 .75 0 0 1-.64 .36A.75 .75 0 0 1 18.13 2.81Zm4.22 3.16-1.41 .45a.76 .76 0 0 1-.23 .04 .75 .75 0 0 1-.23-1.46l1.41-.45a.75 .75 0 1 1 .46 1.43Z\"]},{\"id\":\"ph-hand-pointing\",\"label\":\"Point\",\"set\":\"solid\",\"paths\":[\"M21 9.75v4.77c0 4.33-3.45 7.93-7.78 7.97A7.85 7.85 0 0 1 7.56 20.19C5.51 18.03 3.2 12.75 3.2 12.75a1.5 1.5 0 0 1 .61-2.08c.72-.37 1.6-.08 2.01 .62l1.97 3.42a.57 .57 0 0 0 .56 .29l.01 0A.77 .77 0 0 0 9 14.23V3a1.5 1.5 0 0 1 1.57-1.5c.81 .04 1.43 .73 1.43 1.54V9.75a.75 .75 0 0 0 .8 .75 .77 .77 0 0 0 .7-.77V8.25a1.5 1.5 0 0 1 1.57-1.5c.81 .04 1.43 .73 1.43 1.54V10.5a.75 .75 0 0 0 .8 .75 .77 .77 0 0 0 .7-.77v-.68c0-.81 .62-1.5 1.43-1.54A1.5 1.5 0 0 1 21 9.75Z\"]},{\"id\":\"ph-user\",\"label\":\"User\",\"set\":\"solid\",\"paths\":[\"M21.65 20.63a.75 .75 0 0 1-.65 .38H3a.75 .75 0 0 1-.65-1.12c1.43-2.47 3.63-4.24 6.2-5.08a6.75 6.75 0 1 1 6.91 0c2.57 .84 4.77 2.61 6.2 5.08A.75 .75 0 0 1 21.65 20.63Z\"]},{\"id\":\"ph-users\",\"label\":\"Users\",\"set\":\"solid\",\"paths\":[\"M15.42 18.34a.75 .75 0 0 1-.63 1.16H.96a.75 .75 0 0 1-.63-1.16 8.98 8.98 0 0 1 4.43-3.54 5.63 5.63 0 1 1 6.23 0A8.98 8.98 0 0 1 15.42 18.34Zm8.24-.01a8.99 8.99 0 0 0-4.42-3.52A5.63 5.63 0 0 0 13.57 5.12a.38 .38 0 0 0-.12 .56A7.11 7.11 0 0 1 13.78 14.11a.38 .38 0 0 0 .1 .52 10.53 10.53 0 0 1 2.8 2.89 2.24 2.24 0 0 1 .34 1.54 .38 .38 0 0 0 .37 .43h5.65a.75 .75 0 0 0 .72-.56A.77 .77 0 0 0 23.66 18.33Z\"]},{\"id\":\"ph-user-plus\",\"label\":\"Add user\",\"set\":\"solid\",\"paths\":[\"M24 12.75a.75 .75 0 0 1-.75 .75H21.75v1.5a.75 .75 0 0 1-1.5 0V13.5H18.75a.75 .75 0 0 1 0-1.5h1.5V10.5a.75 .75 0 0 1 1.5 0v1.5h1.5A.75 .75 0 0 1 24 12.75ZM13.5 14.78a6.38 6.38 0 1 0-6.74 0c-1.94 .63-3.68 1.82-5.08 3.48A.75 .75 0 0 0 2.25 19.5H18a.75 .75 0 0 0 .57-1.23C17.17 16.6 15.43 15.42 13.5 14.78Z\"]},{\"id\":\"ph-user-minus\",\"label\":\"Remove user\",\"set\":\"solid\",\"paths\":[\"M18.57 18.27A.75 .75 0 0 1 18 19.5H2.25a.75 .75 0 0 1-.57-1.23c1.4-1.67 3.14-2.85 5.08-3.48a6.38 6.38 0 1 1 6.74 0C15.43 15.42 17.17 16.6 18.57 18.27ZM23.25 12H18.75a.75 .75 0 0 0 0 1.5h4.5a.75 .75 0 0 0 0-1.5Z\"]},{\"id\":\"ph-user-check\",\"label\":\"Verified user\",\"set\":\"solid\",\"paths\":[\"M23.78 12.53l-3 3a.75 .75 0 0 1-1.06 0l-1.5-1.5a.75 .75 0 0 1 1.06-1.06L20.25 13.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06ZM13.5 14.78a6.38 6.38 0 1 0-6.74 0c-1.94 .63-3.68 1.82-5.08 3.48A.75 .75 0 0 0 2.25 19.5H18a.75 .75 0 0 0 .57-1.23C17.17 16.6 15.43 15.42 13.5 14.78Z\"]},{\"id\":\"ph-identification-badge\",\"label\":\"ID badge\",\"set\":\"solid\",\"paths\":[\"M18.75 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V3.75A1.5 1.5 0 0 0 18.75 2.25ZM9 4.5h6a.75 .75 0 0 1 0 1.5H9a.75 .75 0 0 1 0-1.5Zm7.95 14.1a.75 .75 0 0 1-1.05-.15 4.88 4.88 0 0 0-7.8 0 .75 .75 0 1 1-1.2-.9A6.36 6.36 0 0 1 9.47 15.52a3.75 3.75 0 1 1 5.06 0A6.36 6.36 0 0 1 17.1 17.55 .75 .75 0 0 1 16.95 18.6ZM14.25 12.75a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 14.25 12.75Z\"]},{\"id\":\"ph-megaphone\",\"label\":\"Announcement\",\"set\":\"solid\",\"paths\":[\"M18.75 6.75H15.02c-.27-.02-5.03-.35-9.55-4.15A1.5 1.5 0 0 0 3 3.75V18.75a1.5 1.5 0 0 0 2.46 1.15c3.54-2.97 7.22-3.82 8.79-4.06v2.97A1.5 1.5 0 0 0 14.92 20.06l1.03 .69A1.5 1.5 0 0 0 18.23 19.88l1.1-4.16A4.5 4.5 0 0 0 18.75 6.75ZM16.78 19.49l0 .01-1.03-.69V15.75h2.03ZM18.75 14.25H15.75V8.25h3a3 3 0 1 1 0 6Z\"]},{\"id\":\"ph-bell\",\"label\":\"Bell\",\"set\":\"solid\",\"paths\":[\"M20.79 16.49C20.27 15.6 19.5 13.06 19.5 9.75a7.5 7.5 0 1 0-15 0c0 3.31-.77 5.85-1.29 6.74A1.5 1.5 0 0 0 4.5 18.75H8.33a3.75 3.75 0 0 0 7.35 0H19.5a1.5 1.5 0 0 0 1.29-2.26ZM12 20.25a2.25 2.25 0 0 1-2.12-1.5h4.24A2.25 2.25 0 0 1 12 20.25Z\"]},{\"id\":\"ph-bell-ringing\",\"label\":\"Ping\",\"set\":\"solid\",\"paths\":[\"M21 6.67a.75 .75 0 0 1-1.01-.32 8.82 8.82 0 0 0-3.14-3.46 .75 .75 0 1 1 .8-1.27 10.45 10.45 0 0 1 3.67 4.04A.75 .75 0 0 1 21 6.67ZM3.35 6.75a.75 .75 0 0 0 .67-.4A8.82 8.82 0 0 1 7.15 2.88a.75 .75 0 1 0-.8-1.27A10.45 10.45 0 0 0 2.68 5.66 .75 .75 0 0 0 3.35 6.75Zm17.45 9.74A1.5 1.5 0 0 1 19.5 18.75H15.68a3.75 3.75 0 0 1-7.35 0H4.5a1.5 1.5 0 0 1-1.29-2.26C4.05 15.04 4.5 12.96 4.5 10.5a7.5 7.5 0 0 1 15 0C19.5 12.96 19.95 15.04 20.79 16.49ZM14.12 18.75H9.88a2.25 2.25 0 0 0 4.24 0Z\"]},{\"id\":\"ph-chat-circle\",\"label\":\"Message\",\"set\":\"solid\",\"paths\":[\"M21.75 12A9.75 9.75 0 0 1 7.42 20.61L4.23 21.67a1.5 1.5 0 0 1-1.9-1.9l1.06-3.19A9.75 9.75 0 1 1 21.75 12Z\"]},{\"id\":\"ph-chat-circle-dots\",\"label\":\"Typing\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 0 0 3.39 16.58L2.33 19.77a1.5 1.5 0 0 0 1.9 1.9l3.19-1.06A9.75 9.75 0 1 0 12 2.25ZM7.88 13.13a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.88 13.13Zm4.13 0a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 13.13Zm4.13 0a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.13 13.13Z\"]},{\"id\":\"ph-chats\",\"label\":\"Chat\",\"set\":\"solid\",\"paths\":[\"M21.75 9a1.5 1.5 0 0 0-1.5-1.5H17.25V4.5a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 4.5V16.5a.75 .75 0 0 0 1.22 .58L6.75 14.44V17.25a1.5 1.5 0 0 0 1.5 1.5h8.77L20.53 21.58a.75 .75 0 0 0 .47 .17 .75 .75 0 0 0 .75-.75Zm-3.99 8.42a.75 .75 0 0 0-.47-.17H8.25V14.25h7.5a1.5 1.5 0 0 0 1.5-1.5V9h3V19.43Z\"]},{\"id\":\"ph-envelope\",\"label\":\"Mail\",\"set\":\"solid\",\"paths\":[\"M21 4.5H3a.75 .75 0 0 0-.75 .75V18a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A.75 .75 0 0 0 21 4.5ZM9.25 12 3.75 17.04V6.96Zm1.11 1.02 1.13 1.04a.75 .75 0 0 0 1.01 0l1.13-1.04 5.44 4.98H4.93ZM14.75 12 20.25 6.95V17.05Z\"]},{\"id\":\"ph-paper-plane-tilt\",\"label\":\"Send\",\"set\":\"solid\",\"paths\":[\"M21.69 4.16s0 .01 0 .01l-5.46 17.99a1.49 1.49 0 0 1-1.31 1.08q-.06 .01-.13 .01a1.49 1.49 0 0 1-1.35-.86L10.03 15.39a.38 .38 0 0 1 .07-.43l5.43-5.43a.75 .75 0 0 0-1.06-1.06L9.04 13.9a.38 .38 0 0 1-.43 .07L1.6 10.56a1.5 1.5 0 0 1 .23-2.79l17.99-5.46 .01 0A1.5 1.5 0 0 1 21.69 4.16Z\"]},{\"id\":\"ph-at\",\"label\":\"Mention\",\"set\":\"solid\",\"paths\":[\"M21.75 12c0 .05 0 .09 0 .14-.03 1.34-.53 2.86-2.62 2.86-2.17 0-2.62-1.63-2.62-3V8.25a.75 .75 0 0 0-.8-.75A.77 .77 0 0 0 15 8.28v.38a4.5 4.5 0 1 0 .63 6 3.77 3.77 0 0 0 .32 .47C16.45 15.75 17.41 16.5 19.13 16.5a5.14 5.14 0 0 0 .86-.07 .38 .38 0 0 1 .38 .56A9.75 9.75 0 0 1 11.8 21.75C6.67 21.65 2.46 17.52 2.26 12.39A9.75 9.75 0 1 1 21.75 12ZM9 12a3 3 0 1 0 3-3A3 3 0 0 0 9 12Z\"]},{\"id\":\"ph-hash\",\"label\":\"Channel\",\"set\":\"solid\",\"paths\":[\"M10.9 10.5h2.95l-.75 3h-2.95ZM21 4.5V19.5a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 4.5 3H19.5A1.5 1.5 0 0 1 21 4.5Zm-1.5 5.25a.75 .75 0 0 0-.75-.75H15.77l.7-2.82a.75 .75 0 0 0-1.45-.36L14.23 9h-2.95l.7-2.82a.75 .75 0 0 0-1.45-.36L9.73 9H6a.75 .75 0 0 0 0 1.5H9.35l-.75 3H5.25a.75 .75 0 0 0 0 1.5H8.23l-.7 2.82a.75 .75 0 0 0 .55 .91 .76 .76 0 0 0 .19 .02 .75 .75 0 0 0 .73-.57L9.77 15h2.95l-.7 2.82a.75 .75 0 0 0 .55 .91A.76 .76 0 0 0 12.75 18.75a.75 .75 0 0 0 .73-.57L14.27 15H18a.75 .75 0 0 0 0-1.5H14.65l.75-3H18.75A.75 .75 0 0 0 19.5 9.75Z\"]},{\"id\":\"ph-microphone\",\"label\":\"Mic\",\"set\":\"solid\",\"paths\":[\"M7.5 12V6a4.5 4.5 0 0 1 9 0v6a4.5 4.5 0 0 1-9 0Zm12 0a.75 .75 0 0 0-1.5 0 6 6 0 0 1-12 0 .75 .75 0 0 0-1.5 0 7.51 7.51 0 0 0 6.75 7.46V22.5a.75 .75 0 0 0 1.5 0V19.46A7.51 7.51 0 0 0 19.5 12Z\"]},{\"id\":\"ph-headphones\",\"label\":\"Headphones\",\"set\":\"solid\",\"paths\":[\"M21.75 12v5.25a2.25 2.25 0 0 1-2.25 2.25H18a2.25 2.25 0 0 1-2.25-2.25V13.5a2.25 2.25 0 0 1 2.25-2.25h2.22a8.22 8.22 0 0 0-8.16-7.5H12a8.25 8.25 0 0 0-8.22 7.5H6a2.25 2.25 0 0 1 2.25 2.25v3.75a2.25 2.25 0 0 1-2.25 2.25H4.5a2.25 2.25 0 0 1-2.25-2.25V12A9.76 9.76 0 0 1 18.93 5.12 9.69 9.69 0 0 1 21.75 12Z\"]},{\"id\":\"ph-speaker-high\",\"label\":\"Volume\",\"set\":\"solid\",\"paths\":[\"M15 3.02V20.97a.78 .78 0 0 1-.37 .67 .75 .75 0 0 1-.84-.05l-6.15-4.78A.38 .38 0 0 1 7.5 16.52V7.49a.38 .38 0 0 1 .15-.3l6.15-4.78a.75 .75 0 0 1 .94 .02A.78 .78 0 0 1 15 3.02ZM5.63 7.5H3A1.5 1.5 0 0 0 1.5 9v6a1.5 1.5 0 0 0 1.5 1.5H5.63a.38 .38 0 0 0 .38-.37V7.88A.38 .38 0 0 0 5.63 7.5Zm11.88 1.95a.75 .75 0 0 0-.07 1.06 2.25 2.25 0 0 1 0 2.97 .75 .75 0 1 0 1.13 .99 3.75 3.75 0 0 0 0-4.96A.75 .75 0 0 0 17.51 9.45Zm3.83-2.45a.75 .75 0 1 0-1.12 1 6 6 0 0 1 0 8 .75 .75 0 1 0 1.12 1 7.5 7.5 0 0 0 0-10Z\"]},{\"id\":\"ph-calendar\",\"label\":\"Calendar\",\"set\":\"solid\",\"paths\":[\"M19.5 3H17.25V2.25a.75 .75 0 0 0-1.5 0v.75H8.25V2.25a.75 .75 0 0 0-1.5 0v.75H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM10.5 17.25a.75 .75 0 0 1-1.5 0V12.46l-.41 .21a.75 .75 0 0 1-.67-1.34l1.5-.75A.75 .75 0 0 1 10.5 11.25Zm5.25-.75a.75 .75 0 0 1 0 1.5H12.75a.75 .75 0 0 1-.6-1.2l2.7-3.6A.75 .75 0 1 0 13.6 12.38a.75 .75 0 1 1-1.3-.75A2.25 2.25 0 0 1 16.5 12.75a2.23 2.23 0 0 1-.45 1.35L14.25 16.5ZM4.5 7.5V4.5H6.75v.75a.75 .75 0 0 0 1.5 0V4.5h7.5v.75a.75 .75 0 0 0 1.5 0V4.5h2.25V7.5Z\"]},{\"id\":\"ph-calendar-check\",\"label\":\"Event\",\"set\":\"solid\",\"paths\":[\"M19.5 3H17.25V2.25a.75 .75 0 0 0-1.5 0v.75H8.25V2.25a.75 .75 0 0 0-1.5 0v.75H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM15.91 12.53l-4.5 4.5a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.88 15.44l3.97-3.97a.75 .75 0 0 1 1.06 1.06ZM4.5 7.5V4.5H6.75v.75a.75 .75 0 0 0 1.5 0V4.5h7.5v.75a.75 .75 0 0 0 1.5 0V4.5h2.25V7.5Z\"]},{\"id\":\"ph-clock\",\"label\":\"Clock\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm5.25 10.5H12a.75 .75 0 0 1-.75-.75V6.75a.75 .75 0 0 1 1.5 0v4.5h4.5a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-timer\",\"label\":\"Timer\",\"set\":\"solid\",\"paths\":[\"M12 3.75a9 9 0 1 0 9 9A9.01 9.01 0 0 0 12 3.75Zm4.28 5.78-3.75 3.75a.75 .75 0 0 1-1.06-1.06l3.75-3.75a.75 .75 0 0 1 1.06 1.06ZM9 1.5a.75 .75 0 0 1 .75-.75h4.5a.75 .75 0 0 1 0 1.5H9.75A.75 .75 0 0 1 9 1.5Z\"]},{\"id\":\"ph-hourglass\",\"label\":\"Hourglass\",\"set\":\"solid\",\"paths\":[\"M18.75 7.09V3.75a1.5 1.5 0 0 0-1.5-1.5H6.75A1.5 1.5 0 0 0 5.25 3.75V7.13a1.51 1.51 0 0 0 .6 1.2L10.75 12 5.85 15.68A1.51 1.51 0 0 0 5.25 16.88v3.38a1.5 1.5 0 0 0 1.5 1.5H17.25a1.5 1.5 0 0 0 1.5-1.5V16.91a1.5 1.5 0 0 0-.6-1.2L13.24 12l4.91-3.71A1.5 1.5 0 0 0 18.75 7.09Z\"]},{\"id\":\"ph-push-pin\",\"label\":\"Pin\",\"set\":\"solid\",\"paths\":[\"M22.06 9.75l-5.01 5.03c.43 1.19 .6 3.18-1.24 5.63A1.49 1.49 0 0 1 14.72 21c-.04 0-.07 0-.11 0a1.5 1.5 0 0 1-1.06-.44L9.03 16.03 5.03 20.03a.75 .75 0 0 1-1.06-1.06L7.97 14.97l-4.53-4.53A1.5 1.5 0 0 1 3.56 8.22c2.38-1.92 4.66-1.54 5.66-1.23L14.25 1.94a1.5 1.5 0 0 1 2.12 0l5.69 5.69A1.5 1.5 0 0 1 22.06 9.75Z\"]},{\"id\":\"ph-bookmark-simple\",\"label\":\"Bookmark\",\"set\":\"solid\",\"paths\":[\"M17.25 3H6.75A1.5 1.5 0 0 0 5.25 4.5V21a.75 .75 0 0 0 1.15 .64L12 18.13l5.6 3.5A.75 .75 0 0 0 18.75 21V4.5A1.5 1.5 0 0 0 17.25 3Z\"]},{\"id\":\"ph-flag\",\"label\":\"Flag\",\"set\":\"solid\",\"paths\":[\"M21.75 5.25V16.5a.75 .75 0 0 1-.26 .56c-1.43 1.24-2.8 1.69-4.11 1.69-1.77 0-3.43-.82-4.97-1.58C9.93 15.94 7.76 14.87 5.25 16.85V21a.75 .75 0 0 1-1.5 0V5.25a.75 .75 0 0 1 .26-.56h0c3.38-2.92 6.4-1.43 9.07-.11C15.66 5.86 17.89 6.96 20.51 4.69A.75 .75 0 0 1 21.75 5.25Z\"]},{\"id\":\"ph-link\",\"label\":\"Link\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM10.85 18.05a4.06 4.06 0 0 1-5.16-6.23l2.38-2.38a4.06 4.06 0 0 1 5.74 0 4.02 4.02 0 0 1 .93 1.45 .75 .75 0 1 1-1.41 .52A2.56 2.56 0 0 0 9.13 10.5L6.75 12.88a2.56 2.56 0 0 0 3.25 3.93 .75 .75 0 1 1 .84 1.24Zm7.46-5.86-2.38 2.38A4.03 4.03 0 0 1 13.06 15.75h0a4.06 4.06 0 0 1-3.8-2.64 .75 .75 0 1 1 1.41-.52A2.56 2.56 0 0 0 13.06 14.25h0a2.54 2.54 0 0 0 1.81-.75L17.25 11.12a2.56 2.56 0 0 0-3.25-3.93 .75 .75 0 1 1-.84-1.24 4.06 4.06 0 0 1 5.16 6.23Z\"]},{\"id\":\"ph-paperclip\",\"label\":\"Attachment\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.53 4.72a.75 .75 0 0 0-1.06 0L8.16 13.41A2.25 2.25 0 1 0 11.34 16.59l4.62-4.72a.75 .75 0 1 1 1.07 1.05l-4.63 4.72a3.75 3.75 0 1 1-5.31-5.3L13.41 5.91A2.25 2.25 0 1 1 16.59 9.09L10.29 15.52a.75 .75 0 1 1-1.07-1.05L15.52 8.04a.75 .75 0 0 0 .01-1.07Z\"]},{\"id\":\"ph-image\",\"label\":\"Image\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM14.63 8.25a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 14.63 8.25Zm5.63 10.5H3.75V15.06l4.34-4.35a.75 .75 0 0 1 1.06 0h0L15.47 17.03a.75 .75 0 0 0 1.06-1.06l-1.66-1.65L16.22 12.97a.75 .75 0 0 1 1.06 0L20.25 15.94V18.75Z\"]},{\"id\":\"ph-camera\",\"label\":\"Camera\",\"set\":\"solid\",\"paths\":[\"M19.5 5.25H16.9L15.62 3.33A.75 .75 0 0 0 15 3H9a.75 .75 0 0 0-.62 .33L7.1 5.25H4.5A2.25 2.25 0 0 0 2.25 7.5V18a2.25 2.25 0 0 0 2.25 2.25H19.5a2.25 2.25 0 0 0 2.25-2.25V7.5A2.25 2.25 0 0 0 19.5 5.25Zm-4.12 7.13a3.38 3.38 0 1 1-3.37-3.37A3.38 3.38 0 0 1 15.38 12.38Z\"]},{\"id\":\"ph-video-camera\",\"label\":\"Video\",\"set\":\"solid\",\"paths\":[\"M18 6.75V17.25a1.5 1.5 0 0 1-1.5 1.5H3a1.5 1.5 0 0 1-1.5-1.5V6.75A1.5 1.5 0 0 1 3 5.25H16.5A1.5 1.5 0 0 1 18 6.75Zm5.44 .02a.77 .77 0 0 0-.62 .11L19.67 8.99A.38 .38 0 0 0 19.5 9.3v5.4a.38 .38 0 0 0 .17 .31l3.17 2.11a.75 .75 0 0 0 .8 .02 .78 .78 0 0 0 .36-.67V7.5A.75 .75 0 0 0 23.44 6.77Z\"]},{\"id\":\"ph-music-notes\",\"label\":\"Music\",\"set\":\"solid\",\"paths\":[\"M19.96 1.66a.74 .74 0 0 0-.64-.14l-12 3A.75 .75 0 0 0 6.75 5.25V15.57A3.38 3.38 0 1 0 8.25 18.38V9.59l10.5-2.62V12.57A3.38 3.38 0 1 0 20.25 15.38V2.25A.75 .75 0 0 0 19.96 1.66Z\"]},{\"id\":\"ph-book-open\",\"label\":\"Rules\",\"set\":\"solid\",\"paths\":[\"M22.5 5.25V18.75a.75 .75 0 0 1-.75 .75H15a2.25 2.25 0 0 0-2.25 2.24 .74 .74 0 0 1-.48 .71A.75 .75 0 0 1 11.25 21.75a2.25 2.25 0 0 0-2.25-2.25H2.25a.75 .75 0 0 1-.75-.75V5.25a.75 .75 0 0 1 .75-.75H8.25a3 3 0 0 1 3 3v8.22a.77 .77 0 0 0 .7 .77 .75 .75 0 0 0 .8-.75V7.5a3 3 0 0 1 3-3h6A.75 .75 0 0 1 22.5 5.25Z\"]},{\"id\":\"ph-scroll\",\"label\":\"Scroll\",\"set\":\"solid\",\"paths\":[\"M20.7 15.9A.75 .75 0 0 0 20.25 15.75h-.75V6a3 3 0 0 0-3-3H3.75A3 3 0 0 0 .75 6C.75 7.28 1.69 8.02 1.8 8.1h0A.74 .74 0 0 0 2.25 8.25a.75 .75 0 0 0 .46-1.34h0C2.7 6.9 2.25 6.54 2.25 6a1.5 1.5 0 0 1 3 0V18a3 3 0 0 0 3 3H18.75a3 3 0 0 0 3-3C21.75 16.72 20.81 15.98 20.7 15.9ZM9.75 9h6a.75 .75 0 0 1 0 1.5H9.75a.75 .75 0 0 1 0-1.5Zm-.75 3.75a.75 .75 0 0 1 .75-.75h6a.75 .75 0 0 1 0 1.5H9.75A.75 .75 0 0 1 9 12.75Zm9.75 6.75H10.1A2.98 2.98 0 0 0 10.5 18a2.52 2.52 0 0 0-.11-.75h9.56a1.18 1.18 0 0 1 .3 .75A1.5 1.5 0 0 1 18.75 19.5Z\"]},{\"id\":\"ph-file-text\",\"label\":\"Document\",\"set\":\"solid\",\"paths\":[\"M20.03 7.72l-5.25-5.25A.75 .75 0 0 0 14.25 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V8.25A.75 .75 0 0 0 20.03 7.72ZM15 16.5H9a.75 .75 0 0 1 0-1.5h6a.75 .75 0 0 1 0 1.5Zm0-3H9a.75 .75 0 0 1 0-1.5h6a.75 .75 0 0 1 0 1.5Zm-.75-5.25V4.13l4.13 4.13Z\"]},{\"id\":\"ph-clipboard-text\",\"label\":\"Clipboard\",\"set\":\"solid\",\"paths\":[\"M18.75 3H15.35a4.49 4.49 0 0 0-6.7 0H5.25A1.5 1.5 0 0 0 3.75 4.5V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 18.75 3Zm-6.75 0a3 3 0 0 1 3 3H9A3 3 0 0 1 12 3Zm3 12H9a.75 .75 0 0 1 0-1.5h6a.75 .75 0 0 1 0 1.5Zm0-3H9a.75 .75 0 0 1 0-1.5h6a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-newspaper\",\"label\":\"News\",\"set\":\"solid\",\"paths\":[\"M20.25 4.5H5.25A1.5 1.5 0 0 0 3.75 6V17.25a.75 .75 0 0 1-1.5 0V8.25A.75 .75 0 0 0 .75 8.25v9.01A2.25 2.25 0 0 0 3 19.5H19.5a2.25 2.25 0 0 0 2.25-2.25V6A1.5 1.5 0 0 0 20.25 4.5ZM16.5 14.25H9a.75 .75 0 0 1 0-1.5h7.5a.75 .75 0 0 1 0 1.5Zm0-3H9a.75 .75 0 0 1 0-1.5h7.5a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-lightbulb\",\"label\":\"Idea\",\"set\":\"solid\",\"paths\":[\"M16.5 21.75a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1 0-1.5h7.5A.75 .75 0 0 1 16.5 21.75Zm3.75-12a8.21 8.21 0 0 1-3.15 6.49A1.52 1.52 0 0 0 16.5 17.44v.56a1.5 1.5 0 0 1-1.5 1.5H9a1.5 1.5 0 0 1-1.5-1.5v-.56a1.5 1.5 0 0 0-.58-1.19A8.21 8.21 0 0 1 3.75 9.8C3.73 5.33 7.34 1.61 11.8 1.5A8.25 8.25 0 0 1 20.25 9.75Zm-3.01-.88a5.4 5.4 0 0 0-4.36-4.36 .75 .75 0 0 0-.25 1.48c1.55 .26 2.87 1.58 3.14 3.14A.75 .75 0 0 0 16.5 9.75a.84 .84 0 0 0 .13-.01A.75 .75 0 0 0 17.24 8.87Z\"]},{\"id\":\"ph-rocket\",\"label\":\"Rocket\",\"set\":\"solid\",\"paths\":[\"M14.25 21a.75 .75 0 0 1-.75 .75H10.5a.75 .75 0 0 1 0-1.5h3A.75 .75 0 0 1 14.25 21Zm6.71-6.39-1.16 5.22a1.5 1.5 0 0 1-2.39 .85L14.86 18.75h-5.72L6.59 20.68a1.5 1.5 0 0 1-2.39-.85L3.04 14.61a1.51 1.51 0 0 1 .31-1.29l2.68-3.21a11.54 11.54 0 0 1 .8-3.44c1.21-3.03 3.38-4.93 4.25-5.61a1.5 1.5 0 0 1 1.84 0c.88 .68 3.04 2.58 4.25 5.61a11.54 11.54 0 0 1 .8 3.44l2.68 3.21A1.51 1.51 0 0 1 20.96 14.61Zm-13.05 3.19Q6.4 15.05 6.08 12.39L4.5 14.28 5.66 19.5l.02-.01ZM13.13 9.38a1.13 1.13 0 1 0-1.12 1.13A1.13 1.13 0 0 0 13.13 9.38Zm6.38 4.91-1.58-1.89q-.32 2.65-1.83 5.41l2.24 1.69 .02 .01Z\"]},{\"id\":\"ph-rocket-launch\",\"label\":\"Launch\",\"set\":\"solid\",\"paths\":[\"M9.55 17.92C9.13 18.84 7.71 21 3.75 21a.75 .75 0 0 1-.75-.75c0-3.96 2.16-5.38 3.08-5.8a.75 .75 0 0 1 .62 1.37c-.6 .27-1.93 1.16-2.17 3.65 2.49-.23 3.38-1.56 3.65-2.17a.75 .75 0 1 1 1.37 .62Zm11.44-13.5a1.5 1.5 0 0 0-1.41-1.41c-1.18-.07-4.19 .04-6.69 2.54h0L8.25 10.19A.75 .75 0 0 1 7.19 9.13l2.49-2.49A.38 .38 0 0 0 9.41 6H6.97A1.49 1.49 0 0 0 5.91 6.44L2.69 9.66a1.5 1.5 0 0 0 .85 2.55l3.61 .5 4.14 4.14 .5 3.61a1.49 1.49 0 0 0 1.01 1.21 1.51 1.51 0 0 0 .48 .08A1.49 1.49 0 0 0 14.34 21.31L17.56 18.09A1.5 1.5 0 0 0 18 17.03V14.59a.38 .38 0 0 0-.64-.26l-2.49 2.49a.75 .75 0 0 1-1.1-.04 .77 .77 0 0 1 .06-1.04l4.62-4.62h0C20.95 8.61 21.06 5.6 20.99 4.42Z\"]},{\"id\":\"ph-globe\",\"label\":\"Globe\",\"set\":\"solid\",\"paths\":[\"M12 2.25h0A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm7.35 6H16a12.68 12.68 0 0 0-2.09-4.28A8.28 8.28 0 0 1 19.35 8.25ZM20.25 12a8.21 8.21 0 0 1-.31 2.25H16.33a14.76 14.76 0 0 0 0-4.5h3.61A8.21 8.21 0 0 1 20.25 12ZM12 4.03a10.81 10.81 0 0 1 2.44 4.22H9.56A10.79 10.79 0 0 1 12 4.03ZM9.56 15.75H14.44a10.79 10.79 0 0 1-2.44 4.22A10.81 10.81 0 0 1 9.56 15.75Zm-.37-1.5a13.2 13.2 0 0 1 0-4.5h5.61a13.2 13.2 0 0 1 0 4.5Zm4.72 5.78a12.68 12.68 0 0 0 2.09-4.28h3.34A8.28 8.28 0 0 1 13.91 20.02Z\"]},{\"id\":\"ph-map-pin\",\"label\":\"Location\",\"set\":\"solid\",\"paths\":[\"M12 1.5a8.26 8.26 0 0 0-8.25 8.25c0 7.06 7.5 12.39 7.82 12.61a.75 .75 0 0 0 .86 0C12.75 22.14 20.25 16.81 20.25 9.75A8.26 8.26 0 0 0 12 1.5Zm0 5.25a3 3 0 1 1-3 3A3 3 0 0 1 12 6.75Z\"]},{\"id\":\"ph-house\",\"label\":\"Home\",\"set\":\"solid\",\"paths\":[\"M21 11.25v9a.75 .75 0 0 1-.75 .75H15a.75 .75 0 0 1-.75-.75V15.38a.38 .38 0 0 0-.37-.37H10.13a.38 .38 0 0 0-.37 .38v4.88a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V11.25a1.5 1.5 0 0 1 .44-1.06l7.5-7.5a1.5 1.5 0 0 1 2.12 0l7.5 7.5A1.5 1.5 0 0 1 21 11.25Z\"]},{\"id\":\"ph-shield\",\"label\":\"Shield\",\"set\":\"solid\",\"paths\":[\"M21 5.25v5.25c0 4.94-2.39 7.94-4.4 9.58-2.16 1.77-4.31 2.37-4.41 2.39a.75 .75 0 0 1-.39 0c-.09-.02-2.24-.63-4.41-2.39C5.39 18.44 3 15.44 3 10.5V5.25A1.5 1.5 0 0 1 4.5 3.75H19.5A1.5 1.5 0 0 1 21 5.25Z\"]},{\"id\":\"ph-shield-check\",\"label\":\"Verified\",\"set\":\"solid\",\"paths\":[\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v5.25c0 4.94 2.39 7.94 4.4 9.58 2.16 1.77 4.31 2.37 4.41 2.39a.75 .75 0 0 0 .39 0c.09-.03 2.24-.63 4.41-2.39C18.61 18.44 21 15.44 21 10.5V5.25A1.5 1.5 0 0 0 19.5 3.75Zm-3.22 6.53-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-shield-warning\",\"label\":\"Security\",\"set\":\"solid\",\"paths\":[\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v5.25c0 4.94 2.39 7.94 4.4 9.58 2.16 1.77 4.31 2.37 4.41 2.39a.75 .75 0 0 0 .39 0c.09-.02 2.24-.63 4.41-2.39C18.61 18.44 21 15.44 21 10.5V5.25A1.5 1.5 0 0 0 19.5 3.75ZM11.25 9a.75 .75 0 0 1 1.5 0v3.75a.75 .75 0 0 1-1.5 0Zm.75 8.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 17.25Z\"]},{\"id\":\"ph-lock\",\"label\":\"Lock\",\"set\":\"solid\",\"paths\":[\"M19.5 7.5H16.5V5.25a4.5 4.5 0 0 0-9 0V7.5H4.5A1.5 1.5 0 0 0 3 9V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V9A1.5 1.5 0 0 0 19.5 7.5Zm-7.5 7.88a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 15.38Zm3-7.87H9V5.25a3 3 0 0 1 6 0Z\"]},{\"id\":\"ph-lock-open\",\"label\":\"Unlock\",\"set\":\"solid\",\"paths\":[\"M19.5 7.5H9V5.25a3 3 0 0 1 3-3c1.44 0 2.74 1.03 3.01 2.4a.75 .75 0 0 0 1.47-.3C16.06 2.26 14.18 .75 12 .75A4.5 4.5 0 0 0 7.5 5.25V7.5H4.5A1.5 1.5 0 0 0 3 9V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V9A1.5 1.5 0 0 0 19.5 7.5Zm-7.5 7.88a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 15.38Z\"]},{\"id\":\"ph-key\",\"label\":\"Key\",\"set\":\"solid\",\"paths\":[\"M20.3 3.7A7.5 7.5 0 0 0 7.87 11.32L2.69 16.5A1.49 1.49 0 0 0 2.25 17.56V20.25a1.5 1.5 0 0 0 1.5 1.5H6.75a.75 .75 0 0 0 .75-.75V19.5H9a.75 .75 0 0 0 .75-.75V17.25h1.5a.75 .75 0 0 0 .53-.22l.9-.9A7.47 7.47 0 0 0 15 16.5h.01A7.5 7.5 0 0 0 20.3 3.7ZM16.88 8.63a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 16.88 8.63Z\"]},{\"id\":\"ph-eye\",\"label\":\"Eye\",\"set\":\"solid\",\"paths\":[\"M23.19 11.7c-.03-.07-.83-1.84-2.59-3.6C18.24 5.74 15.27 4.5 12 4.5S5.76 5.74 3.41 8.1C1.64 9.86 .84 11.63 .81 11.7a.75 .75 0 0 0 0 .61c.03 .07 .83 1.83 2.59 3.6C5.76 18.26 8.73 19.5 12 19.5s6.24-1.24 8.59-3.59c1.77-1.77 2.56-3.53 2.59-3.6A.75 .75 0 0 0 23.19 11.7ZM12 15.75a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 12 15.75Z\"]},{\"id\":\"ph-eye-slash\",\"label\":\"Hidden\",\"set\":\"solid\",\"paths\":[\"M9.06 5.43a.38 .38 0 0 1 .2-.62A12.2 12.2 0 0 1 12 4.5c3.27 0 6.24 1.24 8.59 3.6 1.77 1.77 2.56 3.53 2.59 3.6a.75 .75 0 0 1 0 .61c-.03 .07-.83 1.83-2.59 3.6q-.4 .4-.82 .76a.38 .38 0 0 1-.52-.03ZM20.06 19.75a.75 .75 0 1 1-1.11 1.01L16.88 18.48A11.93 11.93 0 0 1 12 19.5c-3.27 0-6.24-1.24-8.59-3.59C1.64 14.14 .84 12.38 .81 12.31a.75 .75 0 0 1 0-.61C.84 11.63 1.64 9.86 3.41 8.1a12.66 12.66 0 0 1 2.34-1.85L3.95 4.25A.75 .75 0 1 1 5.06 3.25Zm-6.14-4.52-4.94-5.44a3.75 3.75 0 0 0 4.94 5.44Z\"]},{\"id\":\"ph-gavel\",\"label\":\"Gavel\",\"set\":\"solid\",\"paths\":[\"M4.94 9.31a1.5 1.5 0 0 1 0-2.12l6-6a1.5 1.5 0 0 1 2.12 2.12l-6 6a1.5 1.5 0 0 1-2.12 0Zm17.87 1.63a1.5 1.5 0 0 0-2.12 0l-6 6a1.5 1.5 0 0 0 0 2.12h0a1.5 1.5 0 0 0 2.12 0l6-6A1.5 1.5 0 0 0 22.81 10.94Zm-3.29-1.48L14.54 4.48a.38 .38 0 0 0-.53 0L8.23 10.26a.38 .38 0 0 0 0 .53L9.66 12.22 2.69 19.19a1.5 1.5 0 0 0 2.12 2.12L11.78 14.34l1.43 1.43a.38 .38 0 0 0 .53 0l5.78-5.78A.38 .38 0 0 0 19.52 9.46Z\"]},{\"id\":\"ph-scales\",\"label\":\"Scales\",\"set\":\"solid\",\"paths\":[\"M22.45 12.47l-3-7.5A.75 .75 0 0 0 18.75 4.5a.78 .78 0 0 0-.16 .02L12.75 5.81V3.75a.75 .75 0 0 0-1.5 0V6.15L5.09 7.52A.75 .75 0 0 0 4.55 7.97l-3 7.5a.74 .74 0 0 0-.05 .28c0 2.19 2.3 3 3.75 3s3.75-.81 3.75-3a.74 .74 0 0 0-.05-.28L6.27 8.79 11.25 7.69V19.5H9.75a.75 .75 0 0 0 0 1.5h4.5a.75 .75 0 0 0 0-1.5H12.75V7.35L17.53 6.29 15.05 12.47a.74 .74 0 0 0-.05 .28c0 2.19 2.3 3 3.75 3s3.75-.81 3.75-3A.74 .74 0 0 0 22.45 12.47Zm-15 3.28H3.06L5.25 10.27Zm9.12-3L18.75 7.27 20.94 12.75Z\"]},{\"id\":\"ph-siren\",\"label\":\"Siren\",\"set\":\"solid\",\"paths\":[\"M11.25 1.5V.75a.75 .75 0 0 1 1.5 0v.75a.75 .75 0 0 1-1.5 0Zm7.5 3a.75 .75 0 0 0 .53-.22l.75-.75a.75 .75 0 0 0-1.06-1.06l-.75 .75A.75 .75 0 0 0 18.75 4.5ZM4.72 4.28A.75 .75 0 0 0 5.78 3.22l-.75-.75A.75 .75 0 0 0 3.97 3.53ZM21.75 16.5v2.25a1.5 1.5 0 0 1-1.5 1.5H3.75a1.5 1.5 0 0 1-1.5-1.5V16.5a1.5 1.5 0 0 1 1.5-1.5V12a8.25 8.25 0 0 1 8.31-8.25c4.51 .03 8.19 3.78 8.19 8.34v2.91A1.5 1.5 0 0 1 21.75 16.5ZM12.63 8.24C14.41 8.54 15.75 10.15 15.75 12a.75 .75 0 0 0 1.5 0c0-2.57-1.88-4.82-4.38-5.24a.75 .75 0 1 0-.25 1.48ZM20.25 18.75V16.5H3.75v2.25H20.25Z\"]},{\"id\":\"ph-bug\",\"label\":\"Bug\",\"set\":\"solid\",\"paths\":[\"M15.75 8.63a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 15.75 8.63ZM9.38 7.5a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 9.38 7.5Zm10.88 6A8.23 8.23 0 0 1 19.97 15.66l2.09 .91A.75 .75 0 0 1 21.75 18a.74 .74 0 0 1-.3-.06L19.44 17.06a8.25 8.25 0 0 1-14.88 0L2.55 17.94A.74 .74 0 0 1 2.25 18a.75 .75 0 0 1-.3-1.44L4.03 15.66A8.23 8.23 0 0 1 3.75 13.5v-.75H1.5a.75 .75 0 0 1 0-1.5H3.75v-.75a8.23 8.23 0 0 1 .28-2.16L1.95 7.44a.75 .75 0 1 1 .6-1.37L4.56 6.94a8.25 8.25 0 0 1 14.88 0l2.01-.88a.75 .75 0 0 1 .6 1.37L19.97 8.35a8.23 8.23 0 0 1 .28 2.16v.75h2.25a.75 .75 0 0 1 0 1.5H20.25Zm-7.5 0a.75 .75 0 0 0-1.5 0v6a.75 .75 0 0 0 1.5 0Zm6-3a6.75 6.75 0 0 0-13.5 0v.75H18.75Z\"]},{\"id\":\"ph-robot\",\"label\":\"Bot\",\"set\":\"solid\",\"paths\":[\"M18.75 4.5H12.75V1.5a.75 .75 0 0 0-1.5 0V4.5H5.25A3 3 0 0 0 2.25 7.5V18a3 3 0 0 0 3 3H18.75a3 3 0 0 0 3-3V7.5A3 3 0 0 0 18.75 4.5ZM16.13 9a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 16.13 9ZM9 17.25H7.5a1.5 1.5 0 0 1 0-3H9ZM7.88 11.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.88 11.25Zm5.63 6H10.5V14.25h3Zm3 0H15V14.25h1.5a1.5 1.5 0 0 1 0 3Z\"]},{\"id\":\"ph-cpu\",\"label\":\"CPU\",\"set\":\"solid\",\"paths\":[\"M9.75 9.75h4.5v4.5H9.75Zm12.75 4.5a.75 .75 0 0 1-.75 .75H20.25v3.75a1.5 1.5 0 0 1-1.5 1.5H15v1.5a.75 .75 0 0 1-1.5 0V20.25H10.5v1.5a.75 .75 0 0 1-1.5 0V20.25H5.25a1.5 1.5 0 0 1-1.5-1.5V15H2.25a.75 .75 0 0 1 0-1.5H3.75V10.5H2.25a.75 .75 0 0 1 0-1.5H3.75V5.25A1.5 1.5 0 0 1 5.25 3.75H9V2.25a.75 .75 0 0 1 1.5 0V3.75h3V2.25a.75 .75 0 0 1 1.5 0V3.75h3.75a1.5 1.5 0 0 1 1.5 1.5V9h1.5a.75 .75 0 0 1 0 1.5H20.25v3h1.5A.75 .75 0 0 1 22.5 14.25ZM15.75 9a.75 .75 0 0 0-.75-.75H9a.75 .75 0 0 0-.75 .75v6a.75 .75 0 0 0 .75 .75h6a.75 .75 0 0 0 .75-.75Z\"]},{\"id\":\"ph-hard-drives\",\"label\":\"Server\",\"set\":\"solid\",\"paths\":[\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v4.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 19.5 3.75ZM16.88 8.63a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.88 8.63Z\",\"M19.5 12.75H4.5a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 19.5 12.75Zm-2.62 4.88a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.88 17.63Z\"]},{\"id\":\"ph-code\",\"label\":\"Code\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM8.7 13.65a.75 .75 0 1 1-.9 1.2l-3-2.25a.75 .75 0 0 1 0-1.2l3-2.25a.75 .75 0 0 1 .9 1.2L6.5 12Zm5.52-6.69-3 10.5a.75 .75 0 1 1-1.44-.41l3-10.5a.75 .75 0 0 1 1.44 .41Zm4.98 5.64-3 2.25a.75 .75 0 0 1-.9-1.2L17.5 12 15.3 10.35a.75 .75 0 1 1 .9-1.2l3 2.25a.75 .75 0 0 1 0 1.2Z\"]},{\"id\":\"ph-terminal-window\",\"label\":\"Terminal\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-8.53 8.84-3.75 3a.75 .75 0 1 1-.94-1.17L10.05 12 7.03 9.59a.75 .75 0 1 1 .94-1.17l3.75 3a.75 .75 0 0 1 0 1.17ZM16.5 15.75H12.75a.75 .75 0 0 1 0-1.5h3.75a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-wrench\",\"label\":\"Wrench\",\"set\":\"solid\",\"paths\":[\"M21.75 9a6.75 6.75 0 0 1-9.46 6.19L7.41 20.83c-.01 .01-.02 .03-.04 .04a3 3 0 0 1-4.24-4.24c.01-.01 .03-.03 .04-.04L8.81 11.71a6.76 6.76 0 0 1 7.83-9.26 .75 .75 0 0 1 .37 1.24L13.5 7.5l.53 2.47L16.5 10.5l3.81-3.52a.75 .75 0 0 1 1.24 .37A6.81 6.81 0 0 1 21.75 9Z\"]},{\"id\":\"ph-hammer\",\"label\":\"Hammer\",\"set\":\"solid\",\"paths\":[\"M23.56 10.5 17.24 4.13a9.01 9.01 0 0 0-12.73 0l-.01 .01L3.21 5.48A.75 .75 0 0 0 4.29 6.52L5.58 5.19a7.49 7.49 0 0 1 1.75-1.3L11.69 8.25l-9 9a1.5 1.5 0 0 0 0 2.12l1.94 1.94a1.5 1.5 0 0 0 2.12 0l9-9 3 3a1.5 1.5 0 0 0 2.12 0l2.69-2.69A1.5 1.5 0 0 0 23.56 10.5Zm-8.34 .22L13.13 12.81 11.19 10.88l2.1-2.1a.75 .75 0 0 0 0-1.06L8.84 3.28a7.5 7.5 0 0 1 7.33 1.91l4.15 4.17L17.63 12.06l-1.34-1.34A.75 .75 0 0 0 15.22 10.72Zm4.59 3.53-1.12-1.12L21.38 10.43l1.13 1.13Z\"]},{\"id\":\"ph-gear\",\"label\":\"Settings\",\"set\":\"solid\",\"paths\":[\"M20.25 12.2q.01-.2 0-.4l1.4-1.75a.75 .75 0 0 0 .14-.66 10.09 10.09 0 0 0-1.02-2.46 .75 .75 0 0 0-.56-.37l-2.22-.25q-.14-.15-.28-.28L17.44 3.8a.75 .75 0 0 0-.37-.56 10.06 10.06 0 0 0-2.46-1.02 .75 .75 0 0 0-.66 .14L12.2 3.75Q12 3.75 11.8 3.75L10.05 2.35a.75 .75 0 0 0-.66-.14A10.09 10.09 0 0 0 6.93 3.24a.75 .75 0 0 0-.37 .56L6.31 6.03q-.15 .14-.28 .28L3.8 6.56a.75 .75 0 0 0-.56 .37 10.1 10.1 0 0 0-1.02 2.46 .75 .75 0 0 0 .14 .66L3.75 11.8Q3.75 12 3.75 12.2L2.35 13.95a.75 .75 0 0 0-.14 .66 10.09 10.09 0 0 0 1.02 2.46 .75 .75 0 0 0 .56 .37l2.22 .25q.14 .15 .28 .28L6.56 20.2a.75 .75 0 0 0 .37 .56 10.1 10.1 0 0 0 2.46 1.02 .75 .75 0 0 0 .66-.14L11.8 20.25q.2 .01 .41 0l1.75 1.4a.75 .75 0 0 0 .66 .14 10.05 10.05 0 0 0 2.46-1.02 .75 .75 0 0 0 .37-.56l.25-2.22q.15-.14 .28-.28L20.2 17.44a.75 .75 0 0 0 .56-.37 10.1 10.1 0 0 0 1.02-2.46 .75 .75 0 0 0-.14-.66ZM12 15.75a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 12 15.75Z\"]},{\"id\":\"ph-sliders-horizontal\",\"label\":\"Sliders\",\"set\":\"solid\",\"paths\":[\"M3 7.5a.75 .75 0 0 1 .75-.75H7.23a2.63 2.63 0 0 1 5.03 0H20.25a.75 .75 0 0 1 0 1.5H12.27a2.63 2.63 0 0 1-5.03 0H3.75A.75 .75 0 0 1 3 7.5Zm17.25 8.25H18.27a2.63 2.63 0 0 0-5.03 0H3.75a.75 .75 0 0 0 0 1.5H13.23a2.63 2.63 0 0 0 5.03 0H20.25a.75 .75 0 0 0 0-1.5Z\"]},{\"id\":\"ph-pencil-simple\",\"label\":\"Pencil\",\"set\":\"solid\",\"paths\":[\"M21.31 6.88 17.12 2.69a1.5 1.5 0 0 0-2.12 0L3.44 14.25A1.49 1.49 0 0 0 3 15.31V19.5a1.5 1.5 0 0 0 1.5 1.5H8.69A1.49 1.49 0 0 0 9.75 20.56L21.31 9a1.5 1.5 0 0 0 0-2.12ZM18 10.19 13.81 6l2.25-2.25L20.25 7.94Z\"]},{\"id\":\"ph-paint-brush\",\"label\":\"Brush\",\"set\":\"solid\",\"paths\":[\"M21.75 3a.75 .75 0 0 0-.75-.75c-4.13 0-8.37 4.66-10.73 7.75A5.63 5.63 0 0 0 3 15.38c0 2.9-1.83 4.19-1.92 4.25A.75 .75 0 0 0 1.5 21H8.63a5.63 5.63 0 0 0 5.38-7.27C17.09 11.37 21.75 7.13 21.75 3ZM11.66 10.65q.48-.62 .95-1.18A7.15 7.15 0 0 1 14.53 11.39q-.55 .46-1.18 .95A5.68 5.68 0 0 0 11.66 10.65Zm4-.25a8.68 8.68 0 0 0-2.06-2.06c2.98-3.24 5.23-4.22 6.55-4.49C19.89 5.17 18.9 7.41 15.67 10.39Z\"]},{\"id\":\"ph-palette\",\"label\":\"Palette\",\"set\":\"solid\",\"paths\":[\"M18.82 5.05A9.68 9.68 0 0 0 12 2.25h-.1A9.75 9.75 0 0 0 2.25 12c0 4.03 2.49 7.41 6.5 8.83A3 3 0 0 0 12.75 18a1.5 1.5 0 0 1 1.5-1.5h4.33a2.98 2.98 0 0 0 2.93-2.33 9.79 9.79 0 0 0 .24-2.25A9.68 9.68 0 0 0 18.82 5.05ZM7.88 15.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.88 15.75Zm0-5.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.88 10.5Zm4.13-2.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 8.25Zm4.13 2.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.13 10.5Z\"]},{\"id\":\"ph-trash\",\"label\":\"Trash\",\"set\":\"solid\",\"paths\":[\"M20.25 4.5H16.5V3.75a2.25 2.25 0 0 0-2.25-2.25H9.75A2.25 2.25 0 0 0 7.5 3.75v.75H3.75a.75 .75 0 0 0 0 1.5h.75V19.5a1.5 1.5 0 0 0 1.5 1.5H18a1.5 1.5 0 0 0 1.5-1.5V6h.75a.75 .75 0 0 0 0-1.5ZM10.5 15.75a.75 .75 0 0 1-1.5 0V9.75a.75 .75 0 0 1 1.5 0Zm4.5 0a.75 .75 0 0 1-1.5 0V9.75a.75 .75 0 0 1 1.5 0Zm0-11.25H9V3.75a.75 .75 0 0 1 .75-.75h4.5a.75 .75 0 0 1 .75 .75Z\"]},{\"id\":\"ph-magnifying-glass\",\"label\":\"Search\",\"set\":\"solid\",\"paths\":[\"M15.75 10.5a5.25 5.25 0 1 1-5.25-5.25A5.25 5.25 0 0 1 15.75 10.5Zm5.78 11.03a.75 .75 0 0 1-1.06 0l-4.69-4.69a8.25 8.25 0 1 1 1.06-1.06l4.69 4.69A.75 .75 0 0 1 21.53 21.53ZM10.5 17.25a6.75 6.75 0 1 0-6.75-6.75A6.76 6.76 0 0 0 10.5 17.25Z\"]},{\"id\":\"ph-funnel\",\"label\":\"Filter\",\"set\":\"solid\",\"paths\":[\"M21.36 6.26l-.01 .01L15 13.05v5.2A1.5 1.5 0 0 1 14.33 19.5l-3 2A1.5 1.5 0 0 1 9 20.25V13.05L2.65 6.27l-.01-.01A1.5 1.5 0 0 1 3.75 3.75H20.25a1.5 1.5 0 0 1 1.11 2.51Z\"]},{\"id\":\"ph-list\",\"label\":\"List\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM18 17.25H6a.75 .75 0 0 1 0-1.5H18a.75 .75 0 0 1 0 1.5Zm0-4.5H6a.75 .75 0 0 1 0-1.5H18a.75 .75 0 0 1 0 1.5Zm0-4.5H6a.75 .75 0 0 1 0-1.5H18a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-squares-four\",\"label\":\"Grid\",\"set\":\"solid\",\"paths\":[\"M11.25 5.25v4.5a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 5.25 3.75h4.5A1.5 1.5 0 0 1 11.25 5.25Zm7.5-1.5H14.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 18.75 3.75Zm-9 9H5.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 9.75 12.75Zm9 0H14.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 18.75 12.75Z\"]},{\"id\":\"ph-folder\",\"label\":\"Folder\",\"set\":\"solid\",\"paths\":[\"M20.25 6.75H12.31L9.75 4.19A1.49 1.49 0 0 0 8.69 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.81A1.44 1.44 0 0 0 3.69 20.25h16.64A1.42 1.42 0 0 0 21.75 18.83V8.25A1.5 1.5 0 0 0 20.25 6.75ZM3.75 5.25H8.69l1.5 1.5H3.75Z\"]},{\"id\":\"ph-download-simple\",\"label\":\"Download\",\"set\":\"solid\",\"paths\":[\"M21 13.5v6a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 1.5 0v5.25H19.5V13.5a.75 .75 0 0 1 1.5 0Zm-9.53 .53a.75 .75 0 0 0 1.06 0l3.75-3.75A.75 .75 0 0 0 15.75 9H12.75V3a.75 .75 0 0 0-1.5 0V9H8.25a.75 .75 0 0 0-.53 1.28Z\"]},{\"id\":\"ph-upload-simple\",\"label\":\"Upload\",\"set\":\"solid\",\"paths\":[\"M21 13.5v6a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 1.5 0v5.25H19.5V13.5a.75 .75 0 0 1 1.5 0ZM8.25 7.5h3v6a.75 .75 0 0 0 1.5 0V7.5h3a.75 .75 0 0 0 .53-1.28l-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75A.75 .75 0 0 0 8.25 7.5Z\"]},{\"id\":\"ph-arrows-clockwise\",\"label\":\"Refresh\",\"set\":\"solid\",\"paths\":[\"M21 4.5V9a.75 .75 0 0 1-.75 .75H15.75a.75 .75 0 0 1-.53-1.28L16.94 6.75a7.45 7.45 0 0 0-5.13-2.07h-.04A7.46 7.46 0 0 0 6.52 6.82 .75 .75 0 0 1 5.48 5.74 9 9 0 0 1 18 5.69l1.72-1.72A.75 .75 0 0 1 21 4.5ZM17.48 17.18A7.5 7.5 0 0 1 7.06 17.25l1.72-1.72A.75 .75 0 0 0 8.25 14.25H3.75a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 1.28 .53L6 18.31a8.95 8.95 0 0 0 6.19 2.51h.05a8.94 8.94 0 0 0 6.29-2.56 .75 .75 0 0 0-1.05-1.07Z\"]},{\"id\":\"ph-power\",\"label\":\"Power\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.75 9.75 0 0 0 12 2.25Zm-.75 3.75a.75 .75 0 0 1 1.5 0v6a.75 .75 0 0 1-1.5 0Zm.75 13.5A7.5 7.5 0 0 1 7.83 5.76a.75 .75 0 1 1 .83 1.25 6 6 0 1 0 6.67 0 .75 .75 0 1 1 .83-1.25A7.5 7.5 0 0 1 12 19.5Z\"]},{\"id\":\"ph-sign-in\",\"label\":\"Join\",\"set\":\"solid\",\"paths\":[\"M13.28 12.53l-3.75 3.75A.75 .75 0 0 1 8.25 15.75V12.75H2.25a.75 .75 0 0 1 0-1.5H8.25V8.25a.75 .75 0 0 1 1.28-.53l3.75 3.75A.75 .75 0 0 1 13.28 12.53ZM18.75 3H12.75a.75 .75 0 0 0 0 1.5h5.25V19.5H12.75a.75 .75 0 0 0 0 1.5h6a.75 .75 0 0 0 .75-.75V3.75A.75 .75 0 0 0 18.75 3Z\"]},{\"id\":\"ph-sign-out\",\"label\":\"Leave\",\"set\":\"solid\",\"paths\":[\"M11.25 20.25a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V3.75a.75 .75 0 0 1 .75-.75h6a.75 .75 0 0 1 0 1.5H5.25V19.5h5.25A.75 .75 0 0 1 11.25 20.25Zm10.28-8.78-3.75-3.75A.75 .75 0 0 0 16.5 8.25v3H10.5a.75 .75 0 0 0 0 1.5h6v3a.75 .75 0 0 0 1.28 .53l3.75-3.75A.75 .75 0 0 0 21.53 11.47Z\"]},{\"id\":\"ph-plus-circle\",\"label\":\"Plus\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.75 10.5H12.75v3a.75 .75 0 0 1-1.5 0V12.75H8.25a.75 .75 0 0 1 0-1.5h3V8.25a.75 .75 0 0 1 1.5 0v3h3a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-minus-circle\",\"label\":\"Minus\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.75 10.5H8.25a.75 .75 0 0 1 0-1.5h7.5a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-ticket\",\"label\":\"Ticket\",\"set\":\"solid\",\"paths\":[\"M21.75 9.75a.75 .75 0 0 0 .75-.75V6a1.5 1.5 0 0 0-1.5-1.5H3A1.5 1.5 0 0 0 1.5 6V9a.75 .75 0 0 0 .75 .75 2.25 2.25 0 0 1 0 4.5 .75 .75 0 0 0-.75 .75v3a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V15a.75 .75 0 0 0-.75-.75 2.25 2.25 0 0 1 0-4.5ZM3 15.68a3.75 3.75 0 0 0 0-7.35V6H8.25V18H3Z\"]},{\"id\":\"ph-tag\",\"label\":\"Tag\",\"set\":\"solid\",\"paths\":[\"M22.81 12.75 13.5 3.44A1.49 1.49 0 0 0 12.44 3H3.75a.75 .75 0 0 0-.75 .75v8.69A1.49 1.49 0 0 0 3.44 13.5L12.75 22.81a1.5 1.5 0 0 0 2.12 0l7.94-7.94a1.5 1.5 0 0 0 0-2.12ZM7.88 9A1.13 1.13 0 1 1 9 7.88 1.13 1.13 0 0 1 7.88 9Z\"]},{\"id\":\"ph-percent\",\"label\":\"Percent\",\"set\":\"solid\",\"paths\":[\"M16.5 16.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 16.13ZM8.63 9A1.13 1.13 0 1 0 7.5 7.88 1.13 1.13 0 0 0 8.63 9ZM21 4.5V19.5a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 4.5 3H19.5A1.5 1.5 0 0 1 21 4.5ZM6 7.88A2.63 2.63 0 1 0 8.63 5.25 2.63 2.63 0 0 0 6 7.88Zm12 8.25a2.63 2.63 0 1 0-2.62 2.63A2.63 2.63 0 0 0 18 16.13ZM17.78 6.22a.75 .75 0 0 0-1.06 0l-10.5 10.5a.75 .75 0 0 0 1.06 1.06l10.5-10.5A.75 .75 0 0 0 17.78 6.22Z\"]},{\"id\":\"ph-sticker\",\"label\":\"Sticker\",\"set\":\"solid\",\"paths\":[\"M15.75 3H8.25A5.26 5.26 0 0 0 3 8.25v7.5a5.26 5.26 0 0 0 5.25 5.25h4.5a.76 .76 0 0 0 .24-.04c2.46-.82 7.15-5.52 7.97-7.97A.76 .76 0 0 0 21 12.75V8.25A5.26 5.26 0 0 0 15.75 3ZM12.75 19.45V16.5a3.75 3.75 0 0 1 3.75-3.75h2.95C18.58 14.77 14.77 18.58 12.75 19.45Z\"]},{\"id\":\"ph-game-controller\",\"label\":\"Gamepad\",\"set\":\"solid\",\"paths\":[\"M23.2 16.29a.06 .06 0 0 0 0-.01L21.66 8.39c0-.01 0-.01 0-.02A5.63 5.63 0 0 0 16.13 3.75H7.86a5.61 5.61 0 0 0-5.53 4.64L.8 16.28a.06 .06 0 0 0 0 .01 3.38 3.38 0 0 0 5.71 2.97l.03-.03L10.27 15h3.47l3.72 4.23c.01 .01 .02 .02 .03 .03A3.38 3.38 0 0 0 19.88 20.25a3.38 3.38 0 0 0 3.32-3.96ZM9.75 10.5H9v.75a.75 .75 0 0 1-1.5 0v-.75H6.75a.75 .75 0 0 1 0-1.5h.75V8.25a.75 .75 0 0 1 1.5 0v.75h.75a.75 .75 0 0 1 0 1.5Zm3.75-.75a.75 .75 0 0 1 .75-.75h2.25a.75 .75 0 0 1 0 1.5H14.25A.75 .75 0 0 1 13.5 9.75Zm7.91 8.2a1.86 1.86 0 0 1-1.21 .77A1.88 1.88 0 0 1 18.56 18.22L15.73 15H16.13a5.63 5.63 0 0 0 4.78-2.66l.82 4.22A1.86 1.86 0 0 1 21.41 17.95Z\"]},{\"id\":\"ph-sword\",\"label\":\"Sword\",\"set\":\"solid\",\"paths\":[\"M20.25 3H14.25a.75 .75 0 0 0-.59 .29l-6 7.8L6.75 10.19a1.5 1.5 0 0 0-2.12 0l-.81 .82a1.5 1.5 0 0 0 0 2.12l2.06 2.06-3 3a1.5 1.5 0 0 0 0 2.12l.81 .81a1.5 1.5 0 0 0 2.12 0l3-3 2.06 2.06a1.5 1.5 0 0 0 2.12 0l.81-.82a1.5 1.5 0 0 0 0-2.12l-.9-.9 7.8-6A.75 .75 0 0 0 21 9.75V3.75A.75 .75 0 0 0 20.25 3Zm-.75 6.38-7.66 5.9L10.81 14.25l4.72-4.72a.75 .75 0 0 0-1.06-1.06L9.75 13.19 8.73 12.16 14.62 4.5H19.5Z\"]},{\"id\":\"ph-target\",\"label\":\"Target\",\"set\":\"solid\",\"paths\":[\"M20.8 7.8A9.76 9.76 0 1 1 18.34 4.59l2.13-2.13a.75 .75 0 0 1 1.06 1.06L15.71 9.35h0l-3.54 3.54-2.25 2.25a3.75 3.75 0 0 0 5.81-3.34 .75 .75 0 1 1 1.5-.08 5.25 5.25 0 0 1-8.95 4.01h0a5.25 5.25 0 0 1 6.86-7.92L17.28 5.66a8.24 8.24 0 1 0 2.17 2.78 .75 .75 0 0 1 1.35-.65Z\"]},{\"id\":\"ph-puzzle-piece\",\"label\":\"Puzzle\",\"set\":\"solid\",\"paths\":[\"M15.54 21H19.5a1.5 1.5 0 0 0 1.5-1.5V15.97A.75 .75 0 0 0 19.96 15.28a2.19 2.19 0 0 1-.84 .17c-1.24 0-2.25-1.04-2.25-2.32s1.01-2.32 2.25-2.32a2.19 2.19 0 0 1 .84 .17A.75 .75 0 0 0 21 10.28V6.75a1.5 1.5 0 0 0-1.5-1.5H16.1a3.32 3.32 0 0 0 .02-.37 3.38 3.38 0 0 0-6.75 0 3.32 3.32 0 0 0 .02 .38H6A1.5 1.5 0 0 0 4.5 6.75v3.02a3.32 3.32 0 0 0-.37-.02 3.38 3.38 0 0 0 0 6.75 3.32 3.32 0 0 0 .38-.02V19.5a1.5 1.5 0 0 0 1.5 1.5h3.96\"]},{\"id\":\"ph-chart-bar\",\"label\":\"Chart\",\"set\":\"solid\",\"paths\":[\"M21.75 19.5a.75 .75 0 0 1-.75 .75H3a.75 .75 0 0 1 0-1.5h.75V12.75a.75 .75 0 0 1 .75-.75H6.75a.75 .75 0 0 1 .75 .75v6H9V8.25a.75 .75 0 0 1 .75-.75h3a.75 .75 0 0 1 .75 .75V18.75h1.5V3.75a.75 .75 0 0 1 .75-.75h3.75a.75 .75 0 0 1 .75 .75V18.75h.75A.75 .75 0 0 1 21.75 19.5Z\"]},{\"id\":\"ph-chart-line-up\",\"label\":\"Growth\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM18.75 18H5.25a.75 .75 0 0 1-.75-.75V6.75a.75 .75 0 0 1 1.5 0v7.19l3.22-3.22a.75 .75 0 0 1 1.06 0L12 12.44 16.19 8.25H13.5a.75 .75 0 0 1 0-1.5h4.5a.75 .75 0 0 1 .75 .75v4.5a.75 .75 0 0 1-1.5 0V9.31l-4.72 4.72a.75 .75 0 0 1-1.06 0L9.75 12.31l-3.75 3.75V16.5H18.75a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-trend-up\",\"label\":\"Trending up\",\"set\":\"solid\",\"paths\":[\"M22.5 5.25v6a.75 .75 0 0 1-1.28 .53L18.75 9.31l-5.47 5.47a.75 .75 0 0 1-1.06 0L9 11.56 2.78 17.78a.75 .75 0 0 1-1.06-1.06l6.75-6.75a.75 .75 0 0 1 1.06 0L12.75 13.19 17.69 8.25 15.22 5.78A.75 .75 0 0 1 15.75 4.5h6A.75 .75 0 0 1 22.5 5.25Z\"]},{\"id\":\"ph-trend-down\",\"label\":\"Trending down\",\"set\":\"solid\",\"paths\":[\"M22.5 12v6a.75 .75 0 0 1-.75 .75H15.75a.75 .75 0 0 1-.53-1.28L17.69 15 12.75 10.06l-3.22 3.22a.75 .75 0 0 1-1.06 0l-6.75-6.75A.75 .75 0 0 1 2.78 5.47L9 11.69l3.22-3.22a.75 .75 0 0 1 1.06 0L18.75 13.94l2.47-2.47A.75 .75 0 0 1 22.5 12Z\"]},{\"id\":\"ph-pulse\",\"label\":\"Activity\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-.75 9H17.68L14.91 17.63a.75 .75 0 0 1-.65 .38h-.04a.75 .75 0 0 1-.65-.45L9.66 8.43 7.41 12.38a.75 .75 0 0 1-.66 .38H4.5a.75 .75 0 0 1 0-1.5H6.32L9.1 6.38a.75 .75 0 0 1 1.34 .08L14.34 15.57l2.25-3.94a.75 .75 0 0 1 .65-.37h2.25a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-sun\",\"label\":\"Sun\",\"set\":\"solid\",\"paths\":[\"M11.25 3.75V1.5a.75 .75 0 0 1 1.5 0V3.75a.75 .75 0 0 1-1.5 0Zm.75 2.25a6 6 0 1 0 6 6A6.01 6.01 0 0 0 12 6ZM5.47 6.53A.75 .75 0 0 0 6.53 5.47l-1.5-1.5A.75 .75 0 0 0 3.97 5.03Zm0 10.94-1.5 1.5a.75 .75 0 0 0 1.06 1.06l1.5-1.5a.75 .75 0 0 0-1.06-1.06ZM18 6.75a.75 .75 0 0 0 .53-.22l1.5-1.5a.75 .75 0 0 0-1.06-1.06l-1.5 1.5A.75 .75 0 0 0 18 6.75Zm.53 10.72a.75 .75 0 0 0-1.06 1.06l1.5 1.5a.75 .75 0 0 0 1.06-1.06ZM4.5 12a.75 .75 0 0 0-.75-.75H1.5a.75 .75 0 0 0 0 1.5H3.75A.75 .75 0 0 0 4.5 12Zm7.5 7.5a.75 .75 0 0 0-.75 .75v2.25a.75 .75 0 0 0 1.5 0V20.25A.75 .75 0 0 0 12 19.5Zm10.5-8.25H20.25a.75 .75 0 0 0 0 1.5h2.25a.75 .75 0 0 0 0-1.5Z\"]},{\"id\":\"ph-moon\",\"label\":\"Moon\",\"set\":\"solid\",\"paths\":[\"M22.08 14.08a9.83 9.83 0 0 1-3.47 4.96A9.75 9.75 0 0 1 3 11.25 9.66 9.66 0 0 1 4.96 5.39a9.83 9.83 0 0 1 4.96-3.47 .75 .75 0 0 1 .94 .94 8.26 8.26 0 0 0 10.29 10.29 .75 .75 0 0 1 .94 .94Z\"]},{\"id\":\"ph-cloud\",\"label\":\"Cloud\",\"set\":\"solid\",\"paths\":[\"M15.01 3.75A8.26 8.26 0 0 0 7.62 8.31h0A8.2 8.2 0 0 0 6.75 11.97 .77 .77 0 0 1 6.05 12.75 .75 .75 0 0 1 5.25 12a9.72 9.72 0 0 1 .5-3.09 .38 .38 0 0 0-.45-.49A6.01 6.01 0 0 0 .75 14.25c0 3.3 2.79 6 6.09 6H15a8.26 8.26 0 0 0 8.24-8.58C23.07 7.27 19.41 3.75 15.01 3.75Z\"]},{\"id\":\"ph-snowflake\",\"label\":\"Snow\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.97 11.18 1.78-.63a.75 .75 0 1 1 .5 1.41l-1.45 .52 .42 1.58a.75 .75 0 0 1-.53 .92A.77 .77 0 0 1 16.5 17.25a.75 .75 0 0 1-.72-.56l-.52-1.95L12.75 13.3v2.89l1.28 1.28a.75 .75 0 0 1-1.06 1.06L12 17.56l-.97 .97a.75 .75 0 0 1-1.06-1.06L11.25 16.19V13.3L8.75 14.74l-.52 1.95A.75 .75 0 0 1 7.5 17.25a.77 .77 0 0 1-.19-.03 .75 .75 0 0 1-.53-.92l.42-1.58-1.45-.52a.75 .75 0 0 1 .5-1.41l1.78 .63L10.5 12 8.03 10.57l-1.78 .63A.77 .77 0 0 1 6 11.25a.75 .75 0 0 1-.25-1.46l1.45-.52L6.78 7.69a.75 .75 0 0 1 1.45-.39l.52 1.95L11.25 10.7V7.81L9.97 6.53a.75 .75 0 0 1 1.06-1.06L12 6.44l.97-.97a.75 .75 0 0 1 1.06 1.06L12.75 7.81v2.89l2.5-1.44 .52-1.95a.75 .75 0 0 1 1.45 .39l-.42 1.58 1.45 .52A.75 .75 0 0 1 18 11.25a.77 .77 0 0 1-.25-.04l-1.78-.63L13.5 12Z\"]},{\"id\":\"ph-leaf\",\"label\":\"Leaf\",\"set\":\"solid\",\"paths\":[\"M20.95 3.76a.75 .75 0 0 0-.7-.7C13.11 2.63 7.39 4.78 4.95 8.81a8.16 8.16 0 0 0-1.2 4.59A9.54 9.54 0 0 0 4.38 16.42a.38 .38 0 0 0 .62 .13l7.97-8.09a.75 .75 0 0 1 1.06 1.06L5.32 18.37 3.99 19.7a.77 .77 0 0 0-.06 1.04 .75 .75 0 0 0 1.1 .04l1.57-1.57c1.33 .64 2.66 .99 3.99 1.04q.16 .01 .31 .01A8.15 8.15 0 0 0 15.19 19.05C19.22 16.61 21.37 10.89 20.95 3.76Z\"]},{\"id\":\"ph-tree\",\"label\":\"Tree\",\"set\":\"solid\",\"paths\":[\"M12 17.61a6.79 6.79 0 0 0 .75 .43V21.75a.75 .75 0 0 1-1.5 0V18.04A6.79 6.79 0 0 0 12 17.61ZM18.57 5.87a7.13 7.13 0 0 0-13.14 0A6.72 6.72 0 0 0 1.5 11.98C1.49 15.56 4.5 18.66 8.08 18.75A6.77 6.77 0 0 0 11.25 18.04V14.71L7.16 12.67a.75 .75 0 1 1 .67-1.34L11.25 13.04V8.25a.75 .75 0 0 1 1.5 0v2.54l3.41-1.71a.75 .75 0 1 1 .67 1.34L12.75 12.46v5.58A6.77 6.77 0 0 0 15.75 18.75l.17 0C19.5 18.66 22.51 15.56 22.5 11.98A6.72 6.72 0 0 0 18.57 5.87Z\"]},{\"id\":\"ph-flower\",\"label\":\"Flower\",\"set\":\"solid\",\"paths\":[\"M19.72 12.13c-.08-.04-.16-.09-.25-.13 .09-.04 .17-.08 .25-.13a3.75 3.75 0 1 0-3.75-6.49c-.08 .04-.15 .09-.23 .15 .01-.09 .01-.19 .01-.28a3.75 3.75 0 0 0-7.5 0c0 .09 0 .18 .01 .28-.08-.05-.16-.11-.23-.15a3.75 3.75 0 1 0-3.75 6.5c.08 .04 .16 .09 .25 .13-.09 .04-.17 .08-.25 .13a3.75 3.75 0 1 0 3.75 6.5c.08-.04 .15-.09 .23-.15-.01 .09-.01 .19-.01 .28a3.75 3.75 0 0 0 7.5 0c0-.09 0-.18-.01-.28 .08 .05 .16 .11 .23 .15A3.73 3.73 0 0 0 17.84 19.13a3.79 3.79 0 0 0 .98-.13 3.75 3.75 0 0 0 .9-6.87ZM12 14.63a2.63 2.63 0 1 1 2.63-2.62A2.63 2.63 0 0 1 12 14.63Z\"]},{\"id\":\"ph-paw-print\",\"label\":\"Paw\",\"set\":\"solid\",\"paths\":[\"M22.5 10.13a2.63 2.63 0 1 1-2.62-2.62A2.63 2.63 0 0 1 22.5 10.13ZM6.75 10.13a2.63 2.63 0 1 0-2.62 2.63A2.63 2.63 0 0 0 6.75 10.13ZM8.63 8.25A2.63 2.63 0 1 0 6 5.63 2.63 2.63 0 0 0 8.63 8.25Zm6.75 0a2.63 2.63 0 1 0-2.62-2.62A2.63 2.63 0 0 0 15.38 8.25Zm2.17 5.71a3.31 3.31 0 0 1-1.58-1.98 4.13 4.13 0 0 0-7.92 0A3.3 3.3 0 0 1 6.47 13.95 3.75 3.75 0 0 0 8.25 21a3.7 3.7 0 0 0 1.46-.29 6.01 6.01 0 0 1 4.58 0 3.75 3.75 0 0 0 3.26-6.75Z\"]},{\"id\":\"ph-dog\",\"label\":\"Dog\",\"set\":\"solid\",\"paths\":[\"M22.47 11.72l-1.54-8.25a1.5 1.5 0 0 0-1.84-1.18l-.03 .01L14.14 3.75h-4.28L4.93 2.3l-.03-.01A1.5 1.5 0 0 0 3.07 3.47L1.53 11.72a1.48 1.48 0 0 0 .86 1.64A1.52 1.52 0 0 0 3.01 13.5 1.45 1.45 0 0 0 3.75 13.3V17.25a3.75 3.75 0 0 0 3.75 3.75h9a3.75 3.75 0 0 0 3.75-3.75V13.3a1.45 1.45 0 0 0 .74 .2 1.53 1.53 0 0 0 .63-.14A1.48 1.48 0 0 0 22.47 11.72ZM16.5 19.5H12.75V18.31l1.28-1.28a.75 .75 0 0 0-1.06-1.06L12 16.94l-.97-.97a.75 .75 0 0 0-1.06 1.06L11.25 18.31V19.5H7.5a2.25 2.25 0 0 1-2.25-2.25V11.54L10.12 5.25h3.76L18.75 11.54V17.25A2.25 2.25 0 0 1 16.5 19.5Zm-6.75-6.37a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.75 13.13Zm6.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 13.13Z\"]},{\"id\":\"ph-cat\",\"label\":\"Cat\",\"set\":\"solid\",\"paths\":[\"M20.89 3.14a1.5 1.5 0 0 0-1.7 .3c-.01 .01-.02 .03-.04 .04L17.54 5.34A10.43 10.43 0 0 0 6.47 5.34L4.85 3.48c-.01-.01-.02-.03-.04-.04a1.5 1.5 0 0 0-1.7-.3A1.54 1.54 0 0 0 2.25 4.54V12.75c0 4.59 3.76 8.4 8.58 8.94a.38 .38 0 0 0 .42-.37v-3l-1.26-1.26a.77 .77 0 0 1-.04-1.07 .75 .75 0 0 1 1.08-.02L12 16.94l.97-.97a.75 .75 0 0 1 1.08 .02 .77 .77 0 0 1-.04 1.07L12.75 18.31v3a.38 .38 0 0 0 .42 .38C17.99 21.15 21.75 17.34 21.75 12.75V4.54A1.54 1.54 0 0 0 20.89 3.14ZM7.88 14.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.88 14.25Zm1.88-6a.75 .75 0 1 1-1.5 0V6.47a.75 .75 0 0 1 1.5 0Zm3 0a.75 .75 0 1 1-1.5 0V6a.75 .75 0 0 1 1.5 0Zm1.5 0V6.47a.75 .75 0 0 1 1.5 0V8.25a.75 .75 0 1 1-1.5 0Zm1.88 6a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.13 14.25Z\"]},{\"id\":\"ph-fish\",\"label\":\"Fish\",\"set\":\"solid\",\"paths\":[\"M15.75 7.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 15.75 7.13Zm4.57 6.34c-1.82 3.27-5.2 5.04-10.05 5.26l-2.06 4.82A.75 .75 0 0 1 7.51 24l-.05 0a.75 .75 0 0 1-.67-.54L5.4 18.6 .54 17.21a.75 .75 0 0 1-.09-1.41l4.82-2.06c.22-4.85 1.99-8.23 5.26-10.05 2.32-1.29 4.94-1.48 6.74-1.42 1.75 .06 3.38 .4 3.64 .56a.75 .75 0 0 1 .27 .27c.16 .27 .5 1.89 .56 3.64C21.8 8.52 21.61 11.15 20.32 13.47Zm-.4-9.38c-1.33-.28-6.01-1.03-9.4 1.38a7.61 7.61 0 0 0-1.5 1.41 3.38 3.38 0 0 0 3.69 3.6 .75 .75 0 0 1 .82 .82 3.38 3.38 0 0 0 3.61 3.69 7.58 7.58 0 0 0 1.41-1.5C20.95 10.1 20.2 5.41 19.91 4.08Z\"]},{\"id\":\"ph-bird\",\"label\":\"Bird\",\"set\":\"solid\",\"paths\":[\"M22.17 6.88 19.99 5.42A5.63 5.63 0 0 0 14.63 1.5h-.03C11.51 1.52 9 4.08 9 7.21V9.06L1.09 18.55l-.01 .01A1.5 1.5 0 0 0 2.25 21h8.25A9.76 9.76 0 0 0 20.25 11.25V9.4l1.92-1.28a.75 .75 0 0 0 0-1.25ZM11.83 12.48l-5.62 6.75a.75 .75 0 1 1-1.15-.96l5.63-6.75a.75 .75 0 1 1 1.15 .96ZM15.38 7.5a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.38 7.5Z\"]},{\"id\":\"ph-pizza\",\"label\":\"Pizza\",\"set\":\"solid\",\"paths\":[\"M22.46 5.91a1.49 1.49 0 0 0-.68-.93 18.89 18.89 0 0 0-19.55 0 1.5 1.5 0 0 0-.5 2.06l9 14.74a1.5 1.5 0 0 0 2.57 0l9-14.74A1.48 1.48 0 0 0 22.46 5.91Zm-5.17 6.42a3.75 3.75 0 0 0-3.88 6.35L12 21 9.05 16.17a3.75 3.75 0 1 0-3.88-6.35L4.57 8.84a14.25 14.25 0 0 1 14.85 0Z\"]},{\"id\":\"ph-coffee\",\"label\":\"Coffee\",\"set\":\"solid\",\"paths\":[\"M19.5 7.5H3a.75 .75 0 0 0-.75 .75v4.5a9.03 9.03 0 0 0 3.05 6.75H3a.75 .75 0 0 0 0 1.5H19.5a.75 .75 0 0 0 0-1.5H17.2a9.06 9.06 0 0 0 2.53-3.76A3.75 3.75 0 0 0 23.25 12v-.75A3.75 3.75 0 0 0 19.5 7.5Zm2.25 4.5a2.25 2.25 0 0 1-1.61 2.16 8.98 8.98 0 0 0 .11-1.41V9.13A2.25 2.25 0 0 1 21.75 11.25ZM10.5 5.25V2.25a.75 .75 0 0 1 1.5 0V5.25a.75 .75 0 0 1-1.5 0Zm3 0V2.25a.75 .75 0 0 1 1.5 0V5.25a.75 .75 0 0 1-1.5 0ZM7.5 5.25V2.25a.75 .75 0 0 1 1.5 0V5.25a.75 .75 0 0 1-1.5 0Z\"]},{\"id\":\"ph-cake\",\"label\":\"Cake\",\"set\":\"solid\",\"paths\":[\"M19.5 8.25H12.75V7.41a3.01 3.01 0 0 0 2.25-2.91c0-2.62-2.48-4.3-2.58-4.37a.75 .75 0 0 0-.83 0C11.48 .2 9 1.88 9 4.5a3.01 3.01 0 0 0 2.25 2.91v.84H4.5a2.25 2.25 0 0 0-2.25 2.25v2.19a3.83 3.83 0 0 0 .75 2.27V18.75a2.25 2.25 0 0 0 2.25 2.25H18.75a2.25 2.25 0 0 0 2.25-2.25V14.96a3.83 3.83 0 0 0 .75-2.27V10.5A2.25 2.25 0 0 0 19.5 8.25ZM10.5 4.5c0-1.27 .94-2.29 1.5-2.79 .56 .5 1.5 1.52 1.5 2.79a1.5 1.5 0 0 1-3 0Zm9.75 8.19c0 1.24-.98 2.28-2.19 2.31A2.25 2.25 0 0 1 15.75 12.75a.75 .75 0 0 0-1.5 0 2.25 2.25 0 0 1-4.5 0 .75 .75 0 0 0-1.5 0 2.25 2.25 0 0 1-2.31 2.25C4.73 14.97 3.75 13.93 3.75 12.69V10.5a.75 .75 0 0 1 .75-.75H19.5a.75 .75 0 0 1 .75 .75Z\"]},{\"id\":\"ph-beer-bottle\",\"label\":\"Beer\",\"set\":\"solid\",\"paths\":[\"M23.03 3.97l-3-3a.75 .75 0 0 0-1.06 1.06l.14 .14L13.94 6.05l-3.58 .72a.75 .75 0 0 0-.38 .2L2.16 14.78a2.25 2.25 0 0 0 0 3.18L6.04 21.84a2.25 2.25 0 0 0 3.18 0l7.81-7.81a.75 .75 0 0 0 .2-.38l.72-3.58 3.88-5.17 .14 .14a.75 .75 0 0 0 1.06-1.06ZM7.63 21a.74 .74 0 0 1-.53-.22L3.22 16.9a.75 .75 0 0 1 0-1.06L3.75 15.31 8.69 20.25 8.16 20.78A.75 .75 0 0 1 7.63 21ZM16.65 9.3a.74 .74 0 0 0-.13 .3l-.71 3.53L15 13.94 10.06 9l.81-.81 3.53-.71a.74 .74 0 0 0 .3-.13l5.48-4.11 .58 .58Z\"]},{\"id\":\"ph-car\",\"label\":\"Car\",\"set\":\"solid\",\"paths\":[\"M22.5 9.75H21.49L18.88 3.89A1.5 1.5 0 0 0 17.51 3H6.49a1.5 1.5 0 0 0-1.37 .89L2.51 9.75H1.5a.75 .75 0 0 0 0 1.5h.75v7.5a1.5 1.5 0 0 0 1.5 1.5H6a1.5 1.5 0 0 0 1.5-1.5v-.75h9v.75a1.5 1.5 0 0 0 1.5 1.5h2.25a1.5 1.5 0 0 0 1.5-1.5V11.25h.75a.75 .75 0 0 0 0-1.5ZM7.5 14.25H5.25a.75 .75 0 0 1 0-1.5H7.5a.75 .75 0 0 1 0 1.5Zm11.25 0H16.5a.75 .75 0 0 1 0-1.5h2.25a.75 .75 0 0 1 0 1.5ZM4.15 9.75 6.49 4.5H17.51l2.33 5.25Z\"]},{\"id\":\"ph-airplane\",\"label\":\"Plane\",\"set\":\"solid\",\"paths\":[\"M22.5 12.75v3a.75 .75 0 0 1-.75 .75 .71 .71 0 0 1-.15-.01L14.63 15.09v2.22l1.66 1.65A.75 .75 0 0 1 16.5 19.5v2.25a.75 .75 0 0 1-1.03 .7l-3.47-1.39L8.53 22.45A.75 .75 0 0 1 7.5 21.75V19.5a.75 .75 0 0 1 .22-.53L9.38 17.31V15.09L2.4 16.49A.71 .71 0 0 1 2.25 16.5a.75 .75 0 0 1-.75-.75V12.75a.75 .75 0 0 1 .41-.67L9.38 8.35V4.13a2.63 2.63 0 0 1 5.25 0V8.35l7.46 3.73A.75 .75 0 0 1 22.5 12.75Z\"]},{\"id\":\"ph-shopping-cart\",\"label\":\"Cart\",\"set\":\"solid\",\"paths\":[\"M21.58 5.52A.75 .75 0 0 0 21 5.25H5.88L5.31 2.12A.75 .75 0 0 0 4.57 1.5H2.25a.75 .75 0 0 0 0 1.5h1.69L6.33 16.15a2.25 2.25 0 0 0 .5 1.06 2.63 2.63 0 1 0 4.16 .79h4.26A2.6 2.6 0 0 0 15 19.13a2.63 2.63 0 1 0 2.63-2.62H8.55a.75 .75 0 0 1-.74-.62L7.51 14.25h10.88a2.25 2.25 0 0 0 2.21-1.85l1.14-6.27A.75 .75 0 0 0 21.58 5.52ZM9.75 19.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.75 19.13Zm9 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18.75 19.13Z\"]},{\"id\":\"ph-shopping-bag\",\"label\":\"Bag\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-8.25 9A4.5 4.5 0 0 1 7.5 8.25a.75 .75 0 0 1 1.5 0 3 3 0 0 0 6 0 .75 .75 0 0 1 1.5 0A4.5 4.5 0 0 1 12 12.75Z\"]},{\"id\":\"ph-shopping-bag-open\",\"label\":\"Open bag\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM12 15a4.5 4.5 0 0 1-4.5-4.5 .75 .75 0 0 1 1.5 0 3 3 0 0 0 6 0 .75 .75 0 0 1 1.5 0A4.5 4.5 0 0 1 12 15ZM3.75 6.75V5.25H20.25V6.75Z\"]},{\"id\":\"ph-storefront\",\"label\":\"Store\",\"set\":\"solid\",\"paths\":[\"M21.72 8.79 20.38 4.09A1.51 1.51 0 0 0 18.94 3H5.06A1.51 1.51 0 0 0 3.62 4.09L2.28 8.79A.74 .74 0 0 0 2.25 9v1.5a3.75 3.75 0 0 0 1.5 3v6.75a.75 .75 0 0 0 .75 .75H19.5a.75 .75 0 0 0 .75-.75V13.5a3.75 3.75 0 0 0 1.5-3V9A.74 .74 0 0 0 21.72 8.79ZM8.25 10.5a2.25 2.25 0 0 1-3.29 1.99 .74 .74 0 0 0-.17-.1A2.25 2.25 0 0 1 3.75 10.5v-.75H8.25Zm6 0a2.25 2.25 0 0 1-4.5 0v-.75h4.5Zm6 0a2.25 2.25 0 0 1-1.04 1.89 .76 .76 0 0 0-.17 .1A2.25 2.25 0 0 1 15.75 10.5v-.75h4.5Z\"]},{\"id\":\"ph-package\",\"label\":\"Package\",\"set\":\"solid\",\"paths\":[\"M20.97 6.2 12.72 1.69a1.49 1.49 0 0 0-1.44 0l-8.25 4.52a1.5 1.5 0 0 0-.78 1.31v8.97a1.5 1.5 0 0 0 .78 1.31l8.25 4.52a1.49 1.49 0 0 0 1.44 0l8.25-4.52a1.5 1.5 0 0 0 .78-1.31V7.52A1.5 1.5 0 0 0 20.97 6.2ZM12 3l7.53 4.13L16.74 8.65l-7.53-4.12Zm0 8.25L4.47 7.13 7.65 5.38l7.53 4.13Zm8.25 5.24h0l-7.5 4.11V12.55l3-1.64V14.25a.75 .75 0 0 0 1.5 0V10.08l3-1.64v8.04Z\"]},{\"id\":\"ph-truck\",\"label\":\"Delivery\",\"set\":\"solid\",\"paths\":[\"M23.95 10.97l-1.31-3.28A1.49 1.49 0 0 0 21.24 6.75H18V6a.75 .75 0 0 0-.75-.75H3A1.5 1.5 0 0 0 1.5 6.75V17.25a1.5 1.5 0 0 0 1.5 1.5H4.59a3 3 0 0 0 5.81 0h4.69a3 3 0 0 0 5.81 0h1.59a1.5 1.5 0 0 0 1.5-1.5V11.25A.76 .76 0 0 0 23.95 10.97ZM7.5 19.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 7.5 19.5ZM3 12.75V6.75H16.5v6Zm15 6.75a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 18 19.5Zm0-9V8.25h3.24l.9 2.25Z\"]},{\"id\":\"ph-credit-card\",\"label\":\"Card\",\"set\":\"solid\",\"paths\":[\"M21 4.5H3A1.5 1.5 0 0 0 1.5 6V18a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V6A1.5 1.5 0 0 0 21 4.5ZM12.75 16.5H11.25a.75 .75 0 0 1 0-1.5h1.5a.75 .75 0 0 1 0 1.5Zm6 0H15.75a.75 .75 0 0 1 0-1.5h3a.75 .75 0 0 1 0 1.5ZM3 8.25V6H21V8.25Z\"]},{\"id\":\"ph-wallet\",\"label\":\"Wallet\",\"set\":\"solid\",\"paths\":[\"M20.25 6H5.25a.75 .75 0 0 1 0-1.5H18a.75 .75 0 0 0 0-1.5H5.25A2.25 2.25 0 0 0 3 5.25V17.25a2.25 2.25 0 0 0 2.25 2.25H20.25a1.5 1.5 0 0 0 1.5-1.5V7.5A1.5 1.5 0 0 0 20.25 6Zm-3.37 7.5a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.88 13.5Z\"]},{\"id\":\"ph-money\",\"label\":\"Money\",\"set\":\"solid\",\"paths\":[\"M15.75 12a3.75 3.75 0 1 1-3.75-3.75A3.75 3.75 0 0 1 15.75 12Zm7.5-6V18a.75 .75 0 0 1-.75 .75H1.5a.75 .75 0 0 1-.75-.75V6a.75 .75 0 0 1 .75-.75H22.5A.75 .75 0 0 1 23.25 6Zm-1.5 4.35A5.32 5.32 0 0 1 18.15 6.75H5.85A5.32 5.32 0 0 1 2.25 10.35v3.31A5.32 5.32 0 0 1 5.85 17.25h12.31A5.32 5.32 0 0 1 21.75 13.65Z\"]},{\"id\":\"ph-coins\",\"label\":\"Coins\",\"set\":\"solid\",\"paths\":[\"M17.25 8.4V7.88c0-2.35-3.55-4.12-8.25-4.12S.75 5.52 .75 7.88v3.75c0 1.96 2.46 3.51 6 3.98V16.13c0 2.35 3.55 4.13 8.25 4.13s8.25-1.77 8.25-4.12V12.38C23.25 10.43 20.87 8.88 17.25 8.4ZM5.25 13.77C3.41 13.26 2.25 12.41 2.25 11.63V10.31c.77 .54 1.79 .98 3 1.27Zm7.5-2.19c1.21-.29 2.24-.73 3-1.27V11.63c0 .79-1.16 1.63-3 2.14Zm-1.5 6.69C9.41 17.76 8.25 16.91 8.25 16.13v-.39c.25 .01 .5 .02 .75 .02 .36 0 .72-.01 1.07-.03A11.43 11.43 0 0 0 11.25 16.07Zm0-4.18A15.28 15.28 0 0 1 9 14.25a15.28 15.28 0 0 1-2.25-.16V11.86A17.23 17.23 0 0 0 9 12a17.23 17.23 0 0 0 2.25-.14Zm6 4.5a15.51 15.51 0 0 1-4.5 0V16.35a16.83 16.83 0 0 0 2.25 .15 17.23 17.23 0 0 0 2.25-.14ZM21.75 16.13c0 .79-1.16 1.63-3 2.14V16.08c1.21-.29 2.24-.73 3-1.27Z\"]},{\"id\":\"ph-piggy-bank\",\"label\":\"Piggy bank\",\"set\":\"solid\",\"paths\":[\"M21.19 8.26c-.04-.09-.08-.19-.12-.28a8.24 8.24 0 0 0-2.83-3.47H20.25a.75 .75 0 0 0 0-1.5H10.5a8.26 8.26 0 0 0-8.22 7.59A3 3 0 0 0 0 13.5a.75 .75 0 0 0 1.5 0 1.5 1.5 0 0 1 .8-1.33A8.22 8.22 0 0 0 4.31 16.71l1.18 3.3A1.5 1.5 0 0 0 6.9 21H8.1a1.5 1.5 0 0 0 1.41-1l.18-.5h5.37l.18 .5A1.5 1.5 0 0 0 16.65 21h1.19a1.5 1.5 0 0 0 1.41-1L20.78 15.75H21a2.25 2.25 0 0 0 2.25-2.25V10.5A2.25 2.25 0 0 0 21.19 8.26ZM14.25 6.75H10.5a.75 .75 0 0 1 0-1.5h3.75a.75 .75 0 0 1 0 1.5Zm2.63 5.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.88 12Z\"]},{\"id\":\"ph-hand-coins\",\"label\":\"Pay\",\"set\":\"solid\",\"paths\":[\"M12.01 5.38a3.38 3.38 0 0 1 5.17-2.61 .38 .38 0 0 1-.05 .66A4.88 4.88 0 0 0 14.25 7.88c0 .11 0 .22 .01 .33a.38 .38 0 0 1-.56 .35A3.38 3.38 0 0 1 12.01 5.38ZM22.5 15.06a2.29 2.29 0 0 1-1.27 2.06l-.04 .02-3.64 1.55a.65 .65 0 0 1-.11 .04l-6 1.5A.74 .74 0 0 1 11.25 20.25H1.5A1.5 1.5 0 0 1 0 18.75V15a1.5 1.5 0 0 1 1.5-1.5H4.19l2.12-2.12A2.98 2.98 0 0 1 8.43 10.5H13.13a2.63 2.63 0 0 1 2.55 3.23l3.92-.9A2.31 2.31 0 0 1 22.5 15.06Zm-1.5 0a.81 .81 0 0 0-1.02-.78l-.03 .01-6.28 1.44a.78 .78 0 0 1-.17 .02H10.5a.75 .75 0 0 1 0-1.5h2.63a1.13 1.13 0 0 0 0-2.25H8.43a1.49 1.49 0 0 0-1.06 .44L5.25 14.56V18.75h5.91l5.85-1.46 3.56-1.52A.8 .8 0 0 0 21 15.06ZM15.75 7.88a3.38 3.38 0 1 0 3.38-3.37A3.38 3.38 0 0 0 15.75 7.88Z\"]},{\"id\":\"ph-receipt\",\"label\":\"Receipt\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V19.5a.75 .75 0 0 0 1.09 .67L6 18.84l2.66 1.33a.75 .75 0 0 0 .67 0L12 18.84l2.66 1.33a.75 .75 0 0 0 .67 0L18 18.84l2.66 1.33A.75 .75 0 0 0 21.75 19.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM16.5 13.5H7.5a.75 .75 0 0 1 0-1.5h9a.75 .75 0 0 1 0 1.5Zm0-3H7.5a.75 .75 0 0 1 0-1.5h9a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-currency-dollar\",\"label\":\"Dollar\",\"set\":\"solid\",\"paths\":[\"M15 14.25a1.5 1.5 0 0 1-1.5 1.5h-.75V12.75h.75A1.5 1.5 0 0 1 15 14.25Zm6.75-2.25A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-5.25 2.25a3 3 0 0 0-3-3h-.75V8.25h.38a1.5 1.5 0 0 1 1.5 1.5 .75 .75 0 0 0 1.5 0 3 3 0 0 0-3-3h-.37V6a.75 .75 0 0 0-1.5 0v.75h-.37a3 3 0 0 0 0 6h.38v3h-.75a1.5 1.5 0 0 1-1.5-1.5 .75 .75 0 0 0-1.5 0 3 3 0 0 0 3 3h.75v.75a.75 .75 0 0 0 1.5 0v-.75h.75A3 3 0 0 0 16.5 14.25Zm-7.12-4.5a1.5 1.5 0 0 0 1.5 1.5h.38V8.25h-.37A1.5 1.5 0 0 0 9.38 9.75Z\"]},{\"id\":\"ph-currency-eur\",\"label\":\"Euro\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 7.5a.75 .75 0 0 1 0 1.5H8.25v1.5h2.25a.75 .75 0 0 1 0 1.5H8.33a3.75 3.75 0 0 0 6.17 2.05 .75 .75 0 1 1 1 1.12A5.25 5.25 0 0 1 6.8 14.25H6a.75 .75 0 0 1 0-1.5h.75V11.25H6a.75 .75 0 0 1 0-1.5h.8a5.25 5.25 0 0 1 8.7-3.16 .75 .75 0 1 1-1 1.12A3.75 3.75 0 0 0 8.33 9.75Z\"]},{\"id\":\"ph-currency-btc\",\"label\":\"Bitcoin\",\"set\":\"solid\",\"paths\":[\"M16.5 14.25a1.5 1.5 0 0 1-1.5 1.5H10.5V12.75h4.5A1.5 1.5 0 0 1 16.5 14.25Zm6-2.25A9.75 9.75 0 1 1 12.75 2.25 9.76 9.76 0 0 1 22.5 12Zm-4.5 2.25a3 3 0 0 0-1.45-2.57A3 3 0 0 0 15 6.84V6a.75 .75 0 0 0-1.5 0v.75H12V6a.75 .75 0 0 0-1.5 0v.75H9a.75 .75 0 0 0 0 1.5v7.5a.75 .75 0 0 0 0 1.5h1.5v.75a.75 .75 0 0 0 1.5 0v-.75h1.5v.75a.75 .75 0 0 0 1.5 0v-.75A3 3 0 0 0 18 14.25Zm-2.25-4.5a1.5 1.5 0 0 0-1.5-1.5H10.5v3h3.75A1.5 1.5 0 0 0 15.75 9.75Z\"]},{\"id\":\"ph-bank\",\"label\":\"Bank\",\"set\":\"solid\",\"paths\":[\"M23.25 19.5a.75 .75 0 0 1-.75 .75H1.5a.75 .75 0 0 1 0-1.5H22.5A.75 .75 0 0 1 23.25 19.5ZM1.53 9.2a.75 .75 0 0 1 .33-.84l9.75-6a.75 .75 0 0 1 .79 0l9.75 6A.75 .75 0 0 1 21.75 9.75H19.5v6h1.5a.75 .75 0 0 1 0 1.5H3a.75 .75 0 0 1 0-1.5H4.5V9.75H2.25A.75 .75 0 0 1 1.53 9.2ZM13.5 15a.75 .75 0 0 0 1.5 0V10.5a.75 .75 0 0 0-1.5 0Zm-4.5 0a.75 .75 0 0 0 1.5 0V10.5a.75 .75 0 0 0-1.5 0Z\"]},{\"id\":\"ph-vault\",\"label\":\"Vault\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18a1.5 1.5 0 0 0 1.5 1.5H5.25v1.5a.75 .75 0 0 0 1.5 0V19.5H17.25v1.5a.75 .75 0 0 0 1.5 0V19.5h1.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-.75 9H16.79a3.38 3.38 0 1 1 0-1.5H19.5a.75 .75 0 0 1 0 1.5Zm-4.12-.75a1.88 1.88 0 1 1-1.87-1.87A1.88 1.88 0 0 1 15.38 12Z\"]},{\"id\":\"ph-calculator\",\"label\":\"Calculator\",\"set\":\"solid\",\"paths\":[\"M18.75 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V3.75A1.5 1.5 0 0 0 18.75 2.25ZM8.25 18.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 8.25 18.75Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 8.25 15Zm3.75 3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 18.75Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 15Zm3.75 3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.75 18.75Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.75 15Zm1.5-5.25a.75 .75 0 0 1-.75 .75H7.5a.75 .75 0 0 1-.75-.75V6a.75 .75 0 0 1 .75-.75h9a.75 .75 0 0 1 .75 .75Z\"]},{\"id\":\"ph-seal-check\",\"label\":\"Badge\",\"set\":\"solid\",\"paths\":[\"M21.17 9.64c-.35-.37-.72-.75-.86-1.08-.13-.31-.13-.81-.14-1.31-.01-.91-.03-1.95-.75-2.67s-1.76-.74-2.67-.75c-.49-.01-1-.01-1.31-.14-.33-.14-.72-.5-1.08-.86C13.71 2.2 12.98 1.5 12 1.5s-1.71 .7-2.36 1.33c-.37 .35-.75 .72-1.08 .86C8.25 3.81 7.74 3.82 7.25 3.83c-.91 .01-1.95 .03-2.67 .75S3.84 6.33 3.83 7.25c-.01 .49-.01 1-.14 1.31-.14 .33-.5 .72-.86 1.08C2.2 10.29 1.5 11.02 1.5 12s.7 1.71 1.33 2.36c.35 .37 .72 .75 .86 1.08 .13 .31 .14 .81 .14 1.31 .01 .92 .03 1.95 .75 2.67s1.76 .74 2.67 .75c.49 .01 1 .02 1.31 .14 .33 .14 .72 .5 1.08 .86C10.29 21.8 11.02 22.5 12 22.5s1.71-.7 2.36-1.33c.37-.35 .75-.72 1.08-.86 .31-.13 .81-.13 1.31-.14 .92-.01 1.95-.03 2.67-.75s.74-1.76 .75-2.67c.01-.49 .02-1 .14-1.31 .14-.33 .5-.72 .86-1.08C21.8 13.71 22.5 12.98 22.5 12S21.8 10.29 21.17 9.64Zm-4.89 .64-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-seal-percent\",\"label\":\"Sale\",\"set\":\"solid\",\"paths\":[\"M9 9.75a.75 .75 0 1 1 .75-.75A.75 .75 0 0 1 9 9.75Zm6 4.5a.75 .75 0 1 0 .75 .75A.75 .75 0 0 0 15 14.25Zm7.5-2.25c0 .98-.7 1.71-1.33 2.36-.35 .37-.72 .75-.86 1.08-.13 .31-.13 .81-.14 1.31-.01 .92-.03 1.95-.75 2.67s-1.76 .74-2.67 .75c-.49 .01-1 .02-1.31 .14-.33 .14-.72 .5-1.08 .86C13.71 21.8 12.98 22.5 12 22.5s-1.71-.7-2.36-1.33c-.37-.35-.75-.72-1.08-.86-.31-.13-.81-.13-1.31-.14-.91-.01-1.95-.03-2.67-.75s-.74-1.76-.75-2.67c-.01-.49-.01-1-.14-1.31-.14-.33-.5-.72-.86-1.08C2.2 13.71 1.5 12.98 1.5 12s.7-1.71 1.33-2.36c.35-.37 .72-.75 .86-1.08 .13-.31 .14-.81 .14-1.31 .01-.91 .03-1.95 .75-2.67s1.76-.74 2.67-.75c.49-.01 1-.01 1.31-.14 .33-.14 .72-.5 1.08-.86C10.29 2.2 11.02 1.5 12 1.5s1.71 .7 2.36 1.33c.37 .35 .75 .72 1.08 .86 .31 .13 .81 .14 1.31 .14 .92 .01 1.95 .03 2.67 .75s.74 1.76 .75 2.67c.01 .49 .02 1 .14 1.31 .14 .33 .5 .72 .86 1.08C21.8 10.29 22.5 11.02 22.5 12ZM9 11.25A2.25 2.25 0 1 0 6.75 9 2.25 2.25 0 0 0 9 11.25Zm7.28-2.47a.75 .75 0 0 0-1.06-1.06l-7.5 7.5a.75 .75 0 0 0 1.06 1.06ZM17.25 15a2.25 2.25 0 1 0-2.25 2.25A2.25 2.25 0 0 0 17.25 15Z\"]},{\"id\":\"ph-seal-warning\",\"label\":\"Notice\",\"set\":\"solid\",\"paths\":[\"M21.17 9.64c-.35-.37-.72-.75-.86-1.08-.13-.31-.13-.81-.14-1.31-.01-.91-.03-1.95-.75-2.67s-1.76-.74-2.67-.75c-.49-.01-1-.01-1.31-.14-.33-.14-.72-.5-1.08-.86C13.71 2.2 12.98 1.5 12 1.5s-1.71 .7-2.36 1.33c-.37 .35-.75 .72-1.08 .86C8.25 3.81 7.74 3.82 7.25 3.83c-.91 .01-1.95 .03-2.67 .75S3.84 6.33 3.83 7.25c-.01 .49-.01 1-.14 1.31-.14 .33-.5 .72-.86 1.08C2.2 10.29 1.5 11.02 1.5 12s.7 1.71 1.33 2.36c.35 .37 .72 .75 .86 1.08 .13 .31 .14 .81 .14 1.31 .01 .92 .03 1.95 .75 2.67s1.76 .74 2.67 .75c.49 .01 1 .02 1.31 .14 .33 .14 .72 .5 1.08 .86C10.29 21.8 11.02 22.5 12 22.5s1.71-.7 2.36-1.33c.37-.35 .75-.72 1.08-.86 .31-.13 .81-.13 1.31-.14 .92-.01 1.95-.03 2.67-.75s.74-1.76 .75-2.67c.01-.49 .02-1 .14-1.31 .14-.33 .5-.72 .86-1.08C21.8 13.71 22.5 12.98 22.5 12S21.8 10.29 21.17 9.64ZM11.25 7.5a.75 .75 0 0 1 1.5 0v5.25a.75 .75 0 0 1-1.5 0Zm.75 9.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 17.25Z\"]},{\"id\":\"ph-arrow-right\",\"label\":\"Arrow right\",\"set\":\"solid\",\"paths\":[\"M20.78 12.53l-6.75 6.75A.75 .75 0 0 1 12.75 18.75V12.75H3.75a.75 .75 0 0 1 0-1.5h9V5.25a.75 .75 0 0 1 1.28-.53l6.75 6.75A.75 .75 0 0 1 20.78 12.53Z\"]},{\"id\":\"ph-arrow-left\",\"label\":\"Arrow left\",\"set\":\"solid\",\"paths\":[\"M21 12a.75 .75 0 0 1-.75 .75H11.25v6a.75 .75 0 0 1-1.28 .53l-6.75-6.75a.75 .75 0 0 1 0-1.06l6.75-6.75A.75 .75 0 0 1 11.25 5.25v6h9A.75 .75 0 0 1 21 12Z\"]},{\"id\":\"ph-arrow-up\",\"label\":\"Arrow up\",\"set\":\"solid\",\"paths\":[\"M19.44 10.79A.75 .75 0 0 1 18.75 11.25H12.75v9a.75 .75 0 0 1-1.5 0V11.25H5.25a.75 .75 0 0 1-.53-1.28l6.75-6.75a.75 .75 0 0 1 1.06 0l6.75 6.75A.75 .75 0 0 1 19.44 10.79Z\"]},{\"id\":\"ph-arrow-down\",\"label\":\"Arrow down\",\"set\":\"solid\",\"paths\":[\"M19.28 14.03l-6.75 6.75a.75 .75 0 0 1-1.06 0l-6.75-6.75A.75 .75 0 0 1 5.25 12.75h6V3.75a.75 .75 0 0 1 1.5 0v9h6a.75 .75 0 0 1 .53 1.28Z\"]},{\"id\":\"ph-arrow-up-right\",\"label\":\"Arrow up right\",\"set\":\"solid\",\"paths\":[\"M18.75 6V15.75a.75 .75 0 0 1-1.28 .53L13.13 11.94 6.53 18.53a.75 .75 0 0 1-1.06-1.06L12.06 10.88 7.72 6.53A.75 .75 0 0 1 8.25 5.25H18A.75 .75 0 0 1 18.75 6Z\"]},{\"id\":\"ph-arrow-down-right\",\"label\":\"Arrow down right\",\"set\":\"solid\",\"paths\":[\"M18.75 8.25V18a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1-.53-1.28L12.06 13.13 5.47 6.53A.75 .75 0 0 1 6.53 5.47L13.13 12.06l4.34-4.35A.75 .75 0 0 1 18.75 8.25Z\"]},{\"id\":\"ph-arrow-up-left\",\"label\":\"Arrow up left\",\"set\":\"solid\",\"paths\":[\"M18.53 18.53a.75 .75 0 0 1-1.06 0L10.88 11.94 6.53 16.28A.75 .75 0 0 1 5.25 15.75V6a.75 .75 0 0 1 .75-.75H15.75a.75 .75 0 0 1 .53 1.28L11.94 10.88l6.6 6.59A.75 .75 0 0 1 18.53 18.53Z\"]},{\"id\":\"ph-arrow-down-left\",\"label\":\"Arrow down left\",\"set\":\"solid\",\"paths\":[\"M18.53 6.53 11.94 13.13l4.35 4.34A.75 .75 0 0 1 15.75 18.75H6a.75 .75 0 0 1-.75-.75V8.25a.75 .75 0 0 1 1.28-.53L10.88 12.06l6.59-6.6a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-arrow-circle-right\",\"label\":\"Circle arrow right\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm4.28 10.28-3 3a.75 .75 0 0 1-1.06-1.06L13.94 12.75H8.25a.75 .75 0 0 1 0-1.5h5.69l-1.72-1.72a.75 .75 0 0 1 1.06-1.06l3 3A.75 .75 0 0 1 16.28 12.53Z\"]},{\"id\":\"ph-arrow-circle-left\",\"label\":\"Circle arrow left\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.75 10.5H10.06l1.72 1.72a.75 .75 0 0 1-1.06 1.06l-3-3a.75 .75 0 0 1 0-1.06l3-3a.75 .75 0 0 1 1.06 1.06L10.06 11.25H15.75a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-arrow-circle-up\",\"label\":\"Circle arrow up\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.53 9.53a.75 .75 0 0 1-1.06 0L12.75 10.06V15.75a.75 .75 0 0 1-1.5 0V10.06l-1.72 1.72a.75 .75 0 0 1-1.06-1.06l3-3a.75 .75 0 0 1 1.06 0l3 3A.75 .75 0 0 1 15.53 11.78Z\"]},{\"id\":\"ph-arrow-circle-down\",\"label\":\"Circle arrow down\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm3.53 11.03-3 3a.75 .75 0 0 1-1.06 0l-3-3a.75 .75 0 0 1 1.06-1.06L11.25 13.94V8.25a.75 .75 0 0 1 1.5 0v5.69l1.72-1.72a.75 .75 0 0 1 1.06 1.06Z\"]},{\"id\":\"ph-arrow-fat-right\",\"label\":\"Fat arrow right\",\"set\":\"solid\",\"paths\":[\"M22.28 12.53l-9 9A.75 .75 0 0 1 12 21V17.25H4.5a1.5 1.5 0 0 1-1.5-1.5V8.25A1.5 1.5 0 0 1 4.5 6.75h7.5V3a.75 .75 0 0 1 1.28-.53l9 9A.75 .75 0 0 1 22.28 12.53Z\"]},{\"id\":\"ph-arrow-fat-left\",\"label\":\"Fat arrow left\",\"set\":\"solid\",\"paths\":[\"M21 8.25v7.5a1.5 1.5 0 0 1-1.5 1.5H12v3.75a.75 .75 0 0 1-1.28 .53l-9-9a.75 .75 0 0 1 0-1.06l9-9A.75 .75 0 0 1 12 3V6.75h7.5A1.5 1.5 0 0 1 21 8.25Z\"]},{\"id\":\"ph-arrow-fat-up\",\"label\":\"Fat arrow up\",\"set\":\"solid\",\"paths\":[\"M21.69 11.54A.75 .75 0 0 1 21 12H17.25v7.5a1.5 1.5 0 0 1-1.5 1.5H8.25a1.5 1.5 0 0 1-1.5-1.5V12H3a.75 .75 0 0 1-.53-1.28l9-9a.75 .75 0 0 1 1.06 0l9 9A.75 .75 0 0 1 21.69 11.54Z\"]},{\"id\":\"ph-arrow-fat-down\",\"label\":\"Fat arrow down\",\"set\":\"solid\",\"paths\":[\"M21.53 13.28l-9 9a.75 .75 0 0 1-1.06 0l-9-9A.75 .75 0 0 1 3 12H6.75V4.5A1.5 1.5 0 0 1 8.25 3h7.5a1.5 1.5 0 0 1 1.5 1.5v7.5h3.75a.75 .75 0 0 1 .53 1.28Z\"]},{\"id\":\"ph-arrow-fat-lines-right\",\"label\":\"Fast arrow\",\"set\":\"solid\",\"paths\":[\"M4.5 7.5v9a.75 .75 0 0 1-1.5 0V7.5a.75 .75 0 0 1 1.5 0Zm2.25-.75a.75 .75 0 0 0-.75 .75v9a.75 .75 0 0 0 1.5 0V7.5A.75 .75 0 0 0 6.75 6.75Zm15.53 4.72-9-9A.75 .75 0 0 0 12 3V6.75H9.75a.75 .75 0 0 0-.75 .75v9a.75 .75 0 0 0 .75 .75h2.25v3.75a.75 .75 0 0 0 1.28 .53l9-9A.75 .75 0 0 0 22.28 11.47Z\"]},{\"id\":\"ph-arrow-bend-up-right\",\"label\":\"Bend right\",\"set\":\"solid\",\"paths\":[\"M21.53 10.28l-4.5 4.5A.75 .75 0 0 1 15.75 14.25V10.5H12a8.26 8.26 0 0 0-8.25 8.25 .75 .75 0 0 1-1.5 0A9.76 9.76 0 0 1 12 9h3.75V5.25a.75 .75 0 0 1 1.28-.53l4.5 4.5A.75 .75 0 0 1 21.53 10.28Z\"]},{\"id\":\"ph-arrow-bend-down-right\",\"label\":\"Bend down\",\"set\":\"solid\",\"paths\":[\"M21.53 14.78l-4.5 4.5A.75 .75 0 0 1 15.75 18.75V15H12A9.76 9.76 0 0 1 2.25 5.25a.75 .75 0 0 1 1.5 0 8.26 8.26 0 0 0 8.25 8.25h3.75V9.75a.75 .75 0 0 1 1.28-.53l4.5 4.5A.75 .75 0 0 1 21.53 14.78Z\"]},{\"id\":\"ph-arrow-u-up-left\",\"label\":\"U-turn left\",\"set\":\"solid\",\"paths\":[\"M21.75 13.5a6.01 6.01 0 0 1-6 6H7.5a.75 .75 0 0 1 0-1.5h8.25a4.5 4.5 0 0 0 0-9H8.25v3.75a.75 .75 0 0 1-1.28 .53l-4.5-4.5a.75 .75 0 0 1 0-1.06l4.5-4.5A.75 .75 0 0 1 8.25 3.75V7.5h7.5A6.01 6.01 0 0 1 21.75 13.5Z\"]},{\"id\":\"ph-arrow-u-up-right\",\"label\":\"U-turn right\",\"set\":\"solid\",\"paths\":[\"M15.75 12.75V9H8.25a4.5 4.5 0 0 0 0 9h8.25a.75 .75 0 0 1 0 1.5H8.25A6 6 0 0 1 8.25 7.5h7.5V3.75a.75 .75 0 0 1 1.28-.53l4.5 4.5a.75 .75 0 0 1 0 1.06l-4.5 4.5A.75 .75 0 0 1 15.75 12.75Z\"]},{\"id\":\"ph-arrow-elbow-down-right\",\"label\":\"Elbow arrow\",\"set\":\"solid\",\"paths\":[\"M20.78 17.03l-4.5 4.5A.75 .75 0 0 1 15 21V17.25H6.75a.75 .75 0 0 1-.75-.75V3a.75 .75 0 0 1 1.5 0V15.75h7.5V12a.75 .75 0 0 1 1.28-.53l4.5 4.5A.75 .75 0 0 1 20.78 17.03Z\"]},{\"id\":\"ph-arrow-square-out\",\"label\":\"Open in new\",\"set\":\"solid\",\"paths\":[\"M18 12.75v6.75a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V7.5A1.5 1.5 0 0 1 4.5 6h6.75a.75 .75 0 0 1 0 1.5H4.5V19.5H16.5V12.75a.75 .75 0 0 1 1.5 0Zm3-9a.75 .75 0 0 0-.75-.75H14.25a.75 .75 0 0 0-.53 1.28L16.19 6.75l-3.97 3.97a.75 .75 0 0 0 1.06 1.06L17.25 7.81l2.47 2.47A.75 .75 0 0 0 21 9.75Z\"]},{\"id\":\"ph-arrow-line-right\",\"label\":\"Arrow to line\",\"set\":\"solid\",\"paths\":[\"M21 3.75V20.25a.75 .75 0 0 1-1.5 0V3.75a.75 .75 0 0 1 1.5 0ZM11.03 4.72A.75 .75 0 0 0 9.75 5.25v6H3a.75 .75 0 0 0 0 1.5h6.75v6a.75 .75 0 0 0 1.28 .53l6.75-6.75a.75 .75 0 0 0 0-1.06Z\"]},{\"id\":\"ph-arrow-line-down\",\"label\":\"Arrow down to line\",\"set\":\"solid\",\"paths\":[\"M4.72 11.03A.75 .75 0 0 1 5.25 9.75h6V3a.75 .75 0 0 1 1.5 0v6.75h6a.75 .75 0 0 1 .53 1.28l-6.75 6.75a.75 .75 0 0 1-1.06 0ZM20.25 19.5H3.75a.75 .75 0 0 0 0 1.5H20.25a.75 .75 0 0 0 0-1.5Z\"]},{\"id\":\"ph-arrows-left-right\",\"label\":\"Arrows left right\",\"set\":\"solid\",\"paths\":[\"M3.97 8.03a.75 .75 0 0 1 0-1.06l3-3A.75 .75 0 0 1 8.25 4.5V6.75H19.5a.75 .75 0 0 1 0 1.5H8.25v2.25a.75 .75 0 0 1-1.28 .53Zm16.06 7.94-3-3A.75 .75 0 0 0 15.75 13.5v2.25H4.5a.75 .75 0 0 0 0 1.5H15.75v2.25a.75 .75 0 0 0 1.28 .53l3-3A.75 .75 0 0 0 20.03 15.97Z\"]},{\"id\":\"ph-arrows-down-up\",\"label\":\"Arrows up down\",\"set\":\"solid\",\"paths\":[\"M11.19 16.21a.75 .75 0 0 1-.16 .82l-3 3a.75 .75 0 0 1-1.06 0l-3-3A.75 .75 0 0 1 4.5 15.75H6.75V4.5a.75 .75 0 0 1 1.5 0V15.75h2.25A.75 .75 0 0 1 11.19 16.21Zm8.84-9.24-3-3a.75 .75 0 0 0-1.06 0l-3 3A.75 .75 0 0 0 13.5 8.25h2.25V19.5a.75 .75 0 0 0 1.5 0V8.25h2.25a.75 .75 0 0 0 .53-1.28Z\"]},{\"id\":\"ph-arrows-out-cardinal\",\"label\":\"Move\",\"set\":\"solid\",\"paths\":[\"M9 12.75H6v2.25a.75 .75 0 0 1-1.28 .53l-3-3a.75 .75 0 0 1 0-1.06l3-3A.75 .75 0 0 1 6 9v2.25H9a.75 .75 0 0 1 0 1.5Zm0-6.75h2.25V9a.75 .75 0 0 0 1.5 0V6h2.25a.75 .75 0 0 0 .53-1.28l-3-3a.75 .75 0 0 0-1.06 0l-3 3A.75 .75 0 0 0 9 6Zm13.28 5.47-3-3A.75 .75 0 0 0 18 9v2.25H15a.75 .75 0 0 0 0 1.5h3v2.25a.75 .75 0 0 0 1.28 .53l3-3A.75 .75 0 0 0 22.28 11.47ZM15 18H12.75V15a.75 .75 0 0 0-1.5 0v3H9a.75 .75 0 0 0-.53 1.28l3 3a.75 .75 0 0 0 1.06 0l3-3A.75 .75 0 0 0 15 18Z\"]},{\"id\":\"ph-arrows-in\",\"label\":\"Collapse\",\"set\":\"solid\",\"paths\":[\"M13.5 9.75V6a.75 .75 0 0 1 1.28-.53L16.13 6.81l2.84-2.85a.75 .75 0 0 1 1.06 1.06L17.19 7.88l1.35 1.34A.75 .75 0 0 1 18 10.5H14.25A.75 .75 0 0 1 13.5 9.75Zm-3.75 3.75H6a.75 .75 0 0 0-.53 1.28L6.81 16.13 3.97 18.97a.75 .75 0 0 0 1.06 1.06L7.88 17.19l1.34 1.35A.75 .75 0 0 0 10.5 18V14.25A.75 .75 0 0 0 9.75 13.5Zm.29-8.19a.75 .75 0 0 0-.82 .16L7.88 6.81 5.03 3.97A.75 .75 0 0 0 3.97 5.03L6.81 7.88 5.47 9.22A.75 .75 0 0 0 6 10.5h3.75a.75 .75 0 0 0 .75-.75V6A.75 .75 0 0 0 10.04 5.31ZM17.19 16.13l1.35-1.34A.75 .75 0 0 0 18 13.5H14.25a.75 .75 0 0 0-.75 .75v3.75a.75 .75 0 0 0 1.28 .53L16.13 17.19l2.84 2.85a.75 .75 0 0 0 1.06-1.06Z\"]},{\"id\":\"ph-arrows-out\",\"label\":\"Expand\",\"set\":\"solid\",\"paths\":[\"M10.28 13.72a.75 .75 0 0 1 0 1.06L7.81 17.25l1.72 1.72A.75 .75 0 0 1 9 20.25H4.5a.75 .75 0 0 1-.75-.75V15a.75 .75 0 0 1 1.28-.53L6.75 16.19l2.47-2.47A.75 .75 0 0 1 10.28 13.72ZM7.81 6.75l1.72-1.72A.75 .75 0 0 0 9 3.75H4.5a.75 .75 0 0 0-.75 .75V9a.75 .75 0 0 0 1.28 .53L6.75 7.81l2.47 2.47a.75 .75 0 0 0 1.06-1.06ZM19.5 3.75H15a.75 .75 0 0 0-.53 1.28L16.19 6.75 13.72 9.22a.75 .75 0 0 0 1.06 1.06L17.25 7.81l1.72 1.72A.75 .75 0 0 0 20.25 9V4.5A.75 .75 0 0 0 19.5 3.75Zm.29 10.56a.75 .75 0 0 0-.82 .16L17.25 16.19l-2.47-2.47a.75 .75 0 0 0-1.06 1.06L16.19 17.25l-1.72 1.72A.75 .75 0 0 0 15 20.25h4.5a.75 .75 0 0 0 .75-.75V15A.75 .75 0 0 0 19.79 14.31Z\"]},{\"id\":\"ph-arrows-counter-clockwise\",\"label\":\"Undo\",\"set\":\"solid\",\"paths\":[\"M8.25 9.75H3.75a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 1.28-.53L6 5.69a8.95 8.95 0 0 1 6.19-2.51h.05a8.94 8.94 0 0 1 6.29 2.56 .75 .75 0 0 1-1.05 1.07 7.46 7.46 0 0 0-5.24-2.13h-.04A7.45 7.45 0 0 0 7.06 6.75L8.78 8.47A.75 .75 0 0 1 8.25 9.75Zm12 4.5H15.75a.75 .75 0 0 0-.53 1.28L16.94 17.25a7.45 7.45 0 0 1-5.13 2.07h-.04a7.46 7.46 0 0 1-5.24-2.13 .75 .75 0 1 0-1.05 1.07 8.94 8.94 0 0 0 6.29 2.56H11.81a8.95 8.95 0 0 0 6.19-2.51l1.72 1.72A.75 .75 0 0 0 21 19.5V15A.75 .75 0 0 0 20.25 14.25Z\"]},{\"id\":\"ph-caret-right\",\"label\":\"Caret right\",\"set\":\"solid\",\"paths\":[\"M17.03 12.53l-7.5 7.5A.75 .75 0 0 1 8.25 19.5V4.5a.75 .75 0 0 1 1.28-.53l7.5 7.5A.75 .75 0 0 1 17.03 12.53Z\"]},{\"id\":\"ph-caret-left\",\"label\":\"Caret left\",\"set\":\"solid\",\"paths\":[\"M15.75 4.5V19.5a.75 .75 0 0 1-1.28 .53l-7.5-7.5a.75 .75 0 0 1 0-1.06l7.5-7.5A.75 .75 0 0 1 15.75 4.5Z\"]},{\"id\":\"ph-caret-up\",\"label\":\"Caret up\",\"set\":\"solid\",\"paths\":[\"M20.19 15.29A.75 .75 0 0 1 19.5 15.75H4.5a.75 .75 0 0 1-.53-1.28l7.5-7.5a.75 .75 0 0 1 1.06 0l7.5 7.5A.75 .75 0 0 1 20.19 15.29Z\"]},{\"id\":\"ph-caret-down\",\"label\":\"Caret down\",\"set\":\"solid\",\"paths\":[\"M20.03 9.53l-7.5 7.5a.75 .75 0 0 1-1.06 0l-7.5-7.5A.75 .75 0 0 1 4.5 8.25H19.5a.75 .75 0 0 1 .53 1.28Z\"]},{\"id\":\"ph-caret-double-right\",\"label\":\"Next\",\"set\":\"solid\",\"paths\":[\"M20.78 12.53l-7.5 7.5A.75 .75 0 0 1 12 19.5V13.81L5.78 20.03A.75 .75 0 0 1 4.5 19.5V4.5a.75 .75 0 0 1 1.28-.53L12 10.19V4.5a.75 .75 0 0 1 1.28-.53l7.5 7.5A.75 .75 0 0 1 20.78 12.53Z\"]},{\"id\":\"ph-caret-double-left\",\"label\":\"Back\",\"set\":\"solid\",\"paths\":[\"M19.5 4.5V19.5a.75 .75 0 0 1-1.28 .53L12 13.81V19.5a.75 .75 0 0 1-1.28 .53l-7.5-7.5a.75 .75 0 0 1 0-1.06l7.5-7.5A.75 .75 0 0 1 12 4.5v5.69l6.22-6.22A.75 .75 0 0 1 19.5 4.5Z\"]},{\"id\":\"ph-caret-circle-right\",\"label\":\"Caret circle\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm2.78 10.28-3.75 3.75a.75 .75 0 0 1-1.06-1.06L13.19 12 9.97 8.78a.75 .75 0 0 1 1.06-1.06l3.75 3.75A.75 .75 0 0 1 14.78 12.53Z\"]},{\"id\":\"ph-caret-circle-double-right\",\"label\":\"Skip\",\"set\":\"solid\",\"paths\":[\"M18.9 5.1a9.75 9.75 0 1 0 0 13.8A9.77 9.77 0 0 0 18.9 5.1Zm-7.12 7.43-3 3a.75 .75 0 1 1-1.06-1.06L10.19 12 7.72 9.53A.75 .75 0 1 1 8.78 8.47l3 3A.75 .75 0 0 1 11.78 12.53Zm5.25 0-3 3a.75 .75 0 0 1-1.06-1.06L15.44 12l-2.47-2.47a.75 .75 0 1 1 1.06-1.06l3 3A.75 .75 0 0 1 17.03 12.53Z\"]},{\"id\":\"ph-cursor\",\"label\":\"Cursor\",\"set\":\"solid\",\"paths\":[\"M20.67 19.48 19.48 20.67a1.13 1.13 0 0 1-1.59 0l-5.3-5.3L10.78 20.07l-.01 .03A1.49 1.49 0 0 1 9.4 21l-.07 0a1.48 1.48 0 0 1-1.35-1.03L3.08 4.96A1.5 1.5 0 0 1 4.96 3.08L19.97 7.98a1.5 1.5 0 0 1 .13 2.79l-.03 .01-4.7 1.81 5.3 5.3A1.13 1.13 0 0 1 20.67 19.48Z\"]},{\"id\":\"ph-cursor-click\",\"label\":\"Click\",\"set\":\"solid\",\"paths\":[\"M20.67 17.89a1.13 1.13 0 0 1 0 1.59L19.48 20.67a1.13 1.13 0 0 1-1.59 0l-5.3-5.3L10.78 20.07c0 .01-.01 .02-.01 .03a1.48 1.48 0 0 1-1.37 .9l-.07 0a1.48 1.48 0 0 1-1.35-1.03L3.08 4.96A1.5 1.5 0 0 1 4.96 3.08L19.97 7.98a1.5 1.5 0 0 1 .13 2.79l-.03 .01-4.7 1.81ZM9 3a.75 .75 0 0 0 .75-.75V1.5a.75 .75 0 0 0-1.5 0v.75A.75 .75 0 0 0 9 3ZM1.5 9.75h.75a.75 .75 0 0 0 0-1.5H1.5a.75 .75 0 0 0 0 1.5ZM11.66 3.67a.75 .75 0 0 0 1.01-.34l.75-1.5a.75 .75 0 0 0-1.34-.67l-.75 1.5A.75 .75 0 0 0 11.66 3.67Zm-9 7.66-1.5 .75a.75 .75 0 0 0 .67 1.34l1.5-.75a.75 .75 0 1 0-.67-1.34Z\"]},{\"id\":\"ph-line-segment\",\"label\":\"Line\",\"set\":\"solid\",\"paths\":[\"M19.86 7.86a2.63 2.63 0 0 1-3.1 .45L8.31 16.75a2.63 2.63 0 1 1-4.17-.61h0a2.63 2.63 0 0 1 3.1-.45l8.44-8.44a2.63 2.63 0 1 1 4.17 .61Z\"]},{\"id\":\"ph-line-segments\",\"label\":\"Zigzag\",\"set\":\"solid\",\"paths\":[\"M22.11 7.11A2.62 2.62 0 0 1 20.25 7.88a2.67 2.67 0 0 1-.53-.05l-2.87 5.32 0 0a2.63 2.63 0 1 1-4.17 .61l-2.44-2.44A2.63 2.63 0 0 1 9 11.63a2.66 2.66 0 0 1-.53-.05L5.6 16.89l0 0a2.63 2.63 0 1 1-3.71 0h0a2.63 2.63 0 0 1 2.39-.71l2.87-5.32 0 0a2.63 2.63 0 0 1 0-3.71h0a2.63 2.63 0 0 1 4.17 3.1l2.44 2.44a2.63 2.63 0 0 1 1.78-.26l2.87-5.32 0 0a2.63 2.63 0 0 1 0-3.71h0a2.63 2.63 0 0 1 3.71 3.71Z\"]},{\"id\":\"ph-line-vertical\",\"label\":\"Vertical line\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM12.75 18a.75 .75 0 0 1-1.5 0V6a.75 .75 0 0 1 1.5 0Z\"]},{\"id\":\"ph-dots-three\",\"label\":\"Dots\",\"set\":\"solid\",\"paths\":[\"M21 7.5H3A1.5 1.5 0 0 0 1.5 9v6a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V9A1.5 1.5 0 0 0 21 7.5ZM5.63 13.13a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 5.63 13.13Zm6.38 0a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 13.13Zm6.38 0a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 18.38 13.13Z\"]},{\"id\":\"ph-dots-three-vertical\",\"label\":\"Dots vertical\",\"set\":\"solid\",\"paths\":[\"M15 1.5H9A1.5 1.5 0 0 0 7.5 3V21a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V3A1.5 1.5 0 0 0 15 1.5ZM12 19.5a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 19.5Zm0-6.37a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 13.13Zm0-6.37a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 6.75Z\"]},{\"id\":\"ph-dot-outline\",\"label\":\"Dot\",\"set\":\"solid\",\"paths\":[\"M14.63 12a2.63 2.63 0 1 1-2.62-2.62A2.63 2.63 0 0 1 14.63 12Z\"]},{\"id\":\"ph-wave-sine\",\"label\":\"Wave\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-.45 8.57c-1.56 3.28-2.91 4.74-4.37 4.74-1.84 0-2.94-2.3-4.11-4.74C10.5 10.59 9.47 8.44 8.57 8.44c-.35 0-1.35 .38-3.02 3.89a.75 .75 0 0 1-1.35-.64C5.76 8.4 7.11 6.94 8.57 6.94c1.85 0 2.94 2.3 4.11 4.74C13.5 13.41 14.53 15.56 15.43 15.56c.35 0 1.35-.37 3.02-3.88a.75 .75 0 1 1 1.35 .65Z\"]},{\"id\":\"ph-wave-square\",\"label\":\"Square wave\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-.75 12a.75 .75 0 0 1-.75 .75H12a.75 .75 0 0 1-.75-.75V9H6v3a.75 .75 0 0 1-1.5 0V8.25a.75 .75 0 0 1 .75-.75h6.75a.75 .75 0 0 1 .75 .75v6.75h5.25V12a.75 .75 0 0 1 1.5 0Z\"]},{\"id\":\"ph-wave-triangle\",\"label\":\"Triangle wave\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm-.92 8.73-3.75 4.5A.75 .75 0 0 1 15 17.25h-.04a.75 .75 0 0 1-.58-.33l-5.44-8.16L5.83 12.48a.75 .75 0 0 1-1.15-.96l3.75-4.5a.75 .75 0 0 1 1.2 .06l5.44 8.16 3.11-3.73a.75 .75 0 1 1 1.15 .96Z\"]},{\"id\":\"ph-waves\",\"label\":\"Waves\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM18.49 16.58c-1.23 1.05-2.33 1.42-3.34 1.42-1.34 0-2.5-.65-3.51-1.22-1.73-.97-3.09-1.73-5.15 .03a.75 .75 0 1 1-.98-1.14c2.85-2.44 5.07-1.2 6.85-.2 1.73 .97 3.09 1.73 5.15-.03a.75 .75 0 0 1 .98 1.14Zm0-4.12c-1.23 1.05-2.33 1.42-3.34 1.42-1.34 0-2.5-.65-3.51-1.22-1.73-.97-3.09-1.73-5.15 .03a.75 .75 0 0 1-.98-1.14c2.85-2.44 5.07-1.2 6.85-.2 1.73 .97 3.09 1.73 5.15-.03a.75 .75 0 1 1 .98 1.14Zm0-4.12c-1.23 1.05-2.33 1.42-3.34 1.42-1.34 0-2.5-.65-3.51-1.22-1.73-.97-3.09-1.73-5.15 .03A.75 .75 0 0 1 5.51 7.42c2.85-2.44 5.07-1.2 6.85-.2 1.73 .97 3.09 1.73 5.15-.03a.75 .75 0 1 1 .98 1.14Z\"]},{\"id\":\"ph-equals\",\"label\":\"Equals\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM17.25 15H6.75a.75 .75 0 0 1 0-1.5H17.25a.75 .75 0 0 1 0 1.5Zm0-4.5H6.75a.75 .75 0 0 1 0-1.5H17.25a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-divide\",\"label\":\"Divide\",\"set\":\"solid\",\"paths\":[\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM12 6a1.5 1.5 0 1 1-1.5 1.5A1.5 1.5 0 0 1 12 6Zm0 12a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 12 18Zm5.25-5.25H6.75a.75 .75 0 0 1 0-1.5H17.25a.75 .75 0 0 1 0 1.5Z\"]},{\"id\":\"ph-asterisk\",\"label\":\"Asterisk\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm5.57 12.1a.75 .75 0 0 1-.37 1.4 .74 .74 0 0 1-.37-.1L12.75 13.3V18a.75 .75 0 0 1-1.5 0V13.3L7.18 15.65A.75 .75 0 0 1 6.15 15.38a.75 .75 0 0 1 .27-1.02L10.5 12 6.43 9.65a.75 .75 0 0 1 .75-1.3L11.25 10.7V6a.75 .75 0 0 1 1.5 0v4.7l4.07-2.35a.75 .75 0 0 1 .75 1.3L13.5 12Z\"]},{\"id\":\"ph-infinity\",\"label\":\"Infinity\",\"set\":\"solid\",\"paths\":[\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75ZM19.15 14.65a3.75 3.75 0 0 1-5.29 .02L9.12 10.44 9.09 10.41A2.25 2.25 0 1 0 9.09 13.59c.03-.03 .07-.07 .09-.1a.75 .75 0 1 1 1.13 .99c-.05 .06-.11 .12-.16 .17a3.75 3.75 0 1 1-.02-5.32l4.74 4.23 .03 .03A2.25 2.25 0 1 0 14.91 10.41c-.03 .03-.07 .07-.09 .1a.75 .75 0 0 1-1.12-.99c.05-.06 .11-.12 .16-.17a3.75 3.75 0 0 1 5.3 5.3Z\"]},{\"id\":\"ph-spiral\",\"label\":\"Spiral\",\"set\":\"solid\",\"paths\":[\"M23.25 13.5a.75 .75 0 0 1-1.5 0 9.01 9.01 0 0 0-9-9c-.13 0-.26 0-.39 .01A7.51 7.51 0 0 0 5.25 12a6.01 6.01 0 0 0 6 6 4.13 4.13 0 0 0 4.13-4.12 3 3 0 0 0-3-3 .75 .75 0 0 0 0 1.5 1.5 1.5 0 0 1 1.5 1.5 2.63 2.63 0 0 1-2.62 2.63 4.5 4.5 0 0 1-4.5-4.5 6.01 6.01 0 0 1 6-6 7.51 7.51 0 0 1 7.5 7.5 8.26 8.26 0 0 1-8.25 8.25 9.01 9.01 0 0 1-9-9A9.76 9.76 0 0 1 12.75 3 10.51 10.51 0 0 1 23.25 13.5Z\"]},{\"id\":\"ph-circle-notch\",\"label\":\"Loading\",\"set\":\"solid\",\"paths\":[\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 16.5A6.75 6.75 0 0 1 8.63 6.15a.75 .75 0 0 1 .75 1.3 5.25 5.25 0 1 0 5.25 0 .75 .75 0 0 1 .75-1.3A6.75 6.75 0 0 1 12 18.75Z\"]},{\"id\":\"ph-circles-three\",\"label\":\"Circles\",\"set\":\"solid\",\"paths\":[\"M12 11.25a4.13 4.13 0 1 1 4.13-4.12A4.13 4.13 0 0 1 12 11.25Zm5.63 .75a4.13 4.13 0 1 0 4.13 4.13A4.13 4.13 0 0 0 17.63 12ZM6.38 12a4.13 4.13 0 1 0 4.13 4.13A4.13 4.13 0 0 0 6.38 12Z\"]},{\"id\":\"ph-git-branch\",\"label\":\"Branch\",\"set\":\"solid\",\"paths\":[\"M21.75 6a3 3 0 1 0-3.75 2.91v1.59a.75 .75 0 0 1-.75 .75H9a2.24 2.24 0 0 0-.75 .13V8.91a3 3 0 1 0-1.5 0v6.19a3 3 0 1 0 1.5 0V13.5a.75 .75 0 0 1 .75-.75h8.25a2.25 2.25 0 0 0 2.25-2.25V8.91A3.01 3.01 0 0 0 21.75 6ZM6 6A1.5 1.5 0 1 1 7.5 7.5 1.5 1.5 0 0 1 6 6ZM9 18a1.5 1.5 0 1 1-1.5-1.5A1.5 1.5 0 0 1 9 18Z\"]},{\"id\":\"ph-flow-arrow\",\"label\":\"Flow\",\"set\":\"solid\",\"paths\":[\"M23.03 8.03l-3 3a.75 .75 0 0 1-1.06-1.06L20.69 8.25H19.5c-3.63 0-4.37 1.78-5.31 4.04C13.22 14.61 12.12 17.25 7.5 17.25H7.41a3 3 0 1 1 0-1.5h.09c3.63 0 4.37-1.78 5.31-4.04C13.78 9.39 14.88 6.75 19.5 6.75h1.19L18.97 5.03a.75 .75 0 0 1 1.06-1.06l3 3A.75 .75 0 0 1 23.03 8.03Z\"]},{\"id\":\"ph-path\",\"label\":\"Path\",\"set\":\"solid\",\"paths\":[\"M21.38 18.75a2.63 2.63 0 0 1-5.14 .75H6.75a4.5 4.5 0 0 1 0-9h9a2.25 2.25 0 0 0 0-4.5H6.75a.75 .75 0 0 1 0-1.5h9a3.75 3.75 0 0 1 0 7.5H6.75a3 3 0 0 0 0 6H16.23A2.63 2.63 0 0 1 21.38 18.75Z\"]},{\"id\":\"ph-numpad\",\"label\":\"Numpad\",\"set\":\"solid\",\"paths\":[\"M18.75 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V3.75A1.5 1.5 0 0 0 18.75 2.25ZM7.5 15.38a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.5 15.38Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 7.5 11.63Zm0-3.75A1.13 1.13 0 1 1 8.63 6.75 1.13 1.13 0 0 1 7.5 7.88Zm4.5 11.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 19.13Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 15.38Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 11.63Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 12 7.88Zm4.5 7.5a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.5 15.38Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.5 11.63Zm0-3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 16.5 7.88Z\"]},{\"id\":\"ph-tree-palm-duo\",\"label\":\"Palm tree duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 5.51 12 9.75a6.14 6.14 0 0 1 1.67-4.24 5.52 5.52 0 0 1 8.08 0ZM16.55 9.2A6.02 6.02 0 0 0 12 9.8L20.79 16.5a5.91 5.91 0 0 0-.6-4.52A5.97 5.97 0 0 0 16.55 9.2Zm-6.22-3.7a5.52 5.52 0 0 0-8.08 0L12 9.75A6.14 6.14 0 0 0 10.33 5.51ZM7.45 9.2a5.97 5.97 0 0 0-3.64 2.78A5.91 5.91 0 0 0 3.21 16.5L12 9.8A6.02 6.02 0 0 0 7.45 9.2Z\",\"M22.29 4.99a6.27 6.27 0 0 0-9.16 0 6.77 6.77 0 0 0-1.13 1.59 6.77 6.77 0 0 0-1.12-1.59 6.27 6.27 0 0 0-9.16 0 .75 .75 0 0 0 .24 1.2L7.22 8.49a6.7 6.7 0 0 0-4.06 3.11 6.62 6.62 0 0 0-.67 5.09A.75 .75 0 0 0 3.66 17.1l7.59-5.78V21a.75 .75 0 0 0 1.5 0V11.31l7.59 5.78a.75 .75 0 0 0 1.18-.4 6.62 6.62 0 0 0-.67-5.09A6.7 6.7 0 0 0 16.78 8.49l5.27-2.29a.75 .75 0 0 0 .24-1.2ZM6.29 4.5a4.79 4.79 0 0 1 3.5 1.52 5.3 5.3 0 0 1 1.34 2.52L3.66 5.3A4.73 4.73 0 0 1 6.29 4.5ZM3.75 15.14a5.14 5.14 0 0 1 .7-2.78 5.21 5.21 0 0 1 3.19-2.43A5.3 5.3 0 0 1 9.01 9.75a5.23 5.23 0 0 1 1.52 .23ZM19.55 12.36A5.14 5.14 0 0 1 20.25 15.14l-6.78-5.17a5.28 5.28 0 0 1 6.08 2.38ZM12.88 8.55a5.3 5.3 0 0 1 1.34-2.52A4.79 4.79 0 0 1 17.71 4.5 4.73 4.73 0 0 1 20.34 5.3Z\"],\"faded\":[0]},{\"id\":\"ph-island-duo\",\"label\":\"Island duotone\",\"set\":\"duotone\",\"paths\":[\"M3 13.13a1.88 1.88 0 1 1 1.88 1.88A1.88 1.88 0 0 1 3 13.13Zm9 4.88c-6 0-9.75 3-9.75 3H21.75S18 18 12 18Z\",\"M22.34 21.47A.75 .75 0 0 1 21.28 21.59c-.03-.03-3.64-2.84-9.28-2.84S2.75 21.56 2.72 21.59a.75 .75 0 0 1-.94-1.17c.15-.12 3.61-2.84 9.21-3.14A11.24 11.24 0 0 1 10.69 13.72c.16-2.04 1.02-4.75 4.03-6.79a6.21 6.21 0 0 0-1.41-.18l-.16 0c-1.78 .06-2.9 1.1-3.42 3.18A.75 .75 0 0 1 9 10.5a.72 .72 0 0 1-.18-.02 .75 .75 0 0 1-.55-.91c.87-3.46 3.1-4.26 4.83-4.31a7.64 7.64 0 0 1 2.03 .23c-.36-.59-.88-1.21-1.61-1.52-.94-.4-2.08-.22-3.4 .52a.75 .75 0 0 1-.73-1.31c1.76-.98 3.35-1.18 4.73-.58 1.17 .5 1.94 1.48 2.43 2.34 .58-.9 1.3-1.52 2.1-1.78 1.11-.36 2.31-.07 3.56 .88a.75 .75 0 0 1-.9 1.2c-.84-.63-1.57-.85-2.19-.65-.68 .22-1.21 .94-1.53 1.56A6.61 6.61 0 0 1 19.5 6.85c1.37 .78 3 2.44 3 5.9a.75 .75 0 0 1-1.5 0c0-2.2-.76-3.75-2.25-4.59a4.73 4.73 0 0 0-.54-.26 5.22 5.22 0 0 1 .47 3.1 5.57 5.57 0 0 1-.83 2.19 .75 .75 0 0 1-1.23-.86c.07-.1 1.53-2.29-.31-4.63-2.53 1.43-3.93 3.49-4.14 6.15a9.78 9.78 0 0 0 .36 3.42c5.87 .17 9.52 3.03 9.68 3.16A.75 .75 0 0 1 22.34 21.47ZM2.25 13.13a2.63 2.63 0 1 1 2.63 2.63A2.63 2.63 0 0 1 2.25 13.13Zm1.5 0a1.13 1.13 0 1 0 1.13-1.12A1.13 1.13 0 0 0 3.75 13.13Z\"],\"faded\":[0]},{\"id\":\"ph-sailboat-duo\",\"label\":\"Sailboat duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 16.5l-2.78 3.47a.75 .75 0 0 1-.58 .28H4.86a.75 .75 0 0 1-.58-.28L1.5 16.5ZM12.75 .75 3 12.75H12.75Z\",\"M23.18 16.17A.75 .75 0 0 0 22.5 15.75H13.5V13.5h6.75a.75 .75 0 0 0 .55-1.25L13.5 4.21V.75a.75 .75 0 0 0-1.33-.47l-9.75 12A.75 .75 0 0 0 3 13.5h9v2.25H1.5a.75 .75 0 0 0-.59 1.22l2.78 3.47a1.49 1.49 0 0 0 1.17 .56H19.14a1.49 1.49 0 0 0 1.17-.56l2.78-3.47A.75 .75 0 0 0 23.18 16.17ZM18.56 12H13.5V6.44ZM4.58 12 12 2.86V12Zm14.56 7.5H4.86l-1.8-2.25H20.94Z\"],\"faded\":[0]},{\"id\":\"ph-anchor-duo\",\"label\":\"Anchor duotone\",\"set\":\"duotone\",\"paths\":[\"M14.25 5.25a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 14.25 5.25Z\",\"M20.25 12.75a.75 .75 0 0 0-.75 .75c0 2.31-1.29 2.78-3.57 3.4-1.06 .29-2.26 .62-3.18 1.34V12h3a.75 .75 0 0 0 0-1.5H12.75V8.16a3 3 0 1 0-1.5 0v2.34H8.25a.75 .75 0 0 0 0 1.5h3v6.25c-.92-.73-2.11-1.05-3.18-1.34C5.79 16.28 4.5 15.81 4.5 13.5a.75 .75 0 0 0-1.5 0c0 3.57 2.59 4.28 4.68 4.85C9.96 18.97 11.25 19.44 11.25 21.75a.75 .75 0 0 0 1.5 0c0-2.31 1.29-2.78 3.57-3.4C18.41 17.78 21 17.07 21 13.5A.75 .75 0 0 0 20.25 12.75ZM10.5 5.25a1.5 1.5 0 1 1 1.5 1.5A1.5 1.5 0 0 1 10.5 5.25Z\"],\"faded\":[0]},{\"id\":\"ph-treasure-chest-duo\",\"label\":\"Treasure chest duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 10.5v7.5a.75 .75 0 0 1-.75 .75H3a.75 .75 0 0 1-.75-.75V10.5h8.25v3h3V10.5Z\",\"M17.25 3.75H6.75A5.26 5.26 0 0 0 1.5 9v9a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V9A5.26 5.26 0 0 0 17.25 3.75Zm3.75 5.25v.75H18V5.32A3.76 3.76 0 0 1 21 9Zm-8.25 3.75H11.25V9.75h1.5Zm-2.25 1.5h3a.75 .75 0 0 0 .75-.75V11.25h2.25v6.75H7.5V11.25h2.25v2.25A.75 .75 0 0 0 10.5 14.25Zm3.75-4.5V9a.75 .75 0 0 0-.75-.75H10.5a.75 .75 0 0 0-.75 .75v.75H7.5V5.25h9v4.5ZM6 5.32V9.75H3V9A3.76 3.76 0 0 1 6 5.32ZM3 11.25H6v6.75H3Zm18 6.75H18V11.25h3v6.75Z\"],\"faded\":[0]},{\"id\":\"ph-flag-pennant-duo\",\"label\":\"Pennant duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 9.75 5.25 15.75V3.75Z\",\"M22.75 9.04l-17.25-6A.75 .75 0 0 0 4.5 3.75V20.25a.75 .75 0 0 0 1.5 0V16.28l16.75-5.82a.75 .75 0 0 0 0-1.42ZM6 14.7V4.8L20.22 9.75Z\"],\"faded\":[0]},{\"id\":\"ph-flag-banner-duo\",\"label\":\"Banner duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 5.25l-4.29 9H3.75l4.5-4.5L3.75 5.25Z\",\"M22.38 4.85A.75 .75 0 0 0 21.75 4.5H3.75a.75 .75 0 0 0-.53 1.28L7.19 9.75 3.22 13.72A.75 .75 0 0 0 3.75 15H16.28l-2.7 5.68a.75 .75 0 1 0 1.35 .65l7.5-15.75A.75 .75 0 0 0 22.38 4.85ZM16.99 13.5H5.56l3.22-3.22a.75 .75 0 0 0 0-1.06L5.56 6h15Z\"],\"faded\":[0]},{\"id\":\"ph-sun-horizon-duo\",\"label\":\"Sunset duotone\",\"set\":\"duotone\",\"paths\":[\"M18 13.5a6.03 6.03 0 0 1-.19 1.5H6.19a6 6 0 1 1 11.81-1.5Z\",\"M22.5 14.25H18.71a6.89 6.89 0 0 0 .04-.75 6.75 6.75 0 0 0-13.5 0 6.89 6.89 0 0 0 .04 .75H1.5a.75 .75 0 0 0 0 1.5H22.5a.75 .75 0 0 0 0-1.5ZM6.75 13.5a5.25 5.25 0 1 1 10.44 .75H6.81A5.26 5.26 0 0 1 6.75 13.5Zm13.5 5.25a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1 0-1.5H19.5A.75 .75 0 0 1 20.25 18.75ZM6.83 4.09a.75 .75 0 0 1 1.34-.67l.75 1.5a.75 .75 0 0 1-1.34 .67Zm-5.25 4.58a.75 .75 0 0 1 1.01-.33l1.5 .75a.75 .75 0 0 1-.67 1.34l-1.5-.75A.75 .75 0 0 1 1.58 8.66Zm18 1.42a.75 .75 0 0 1 .34-1.01l1.5-.75a.75 .75 0 1 1 .67 1.34l-1.5 .75a.75 .75 0 0 1-1.01-.34Zm-4.5-5.17 .75-1.5a.75 .75 0 0 1 1.34 .67l-.75 1.5a.75 .75 0 1 1-1.34-.67Z\"],\"faded\":[0]},{\"id\":\"ph-moon-stars-duo\",\"label\":\"Moon and stars duotone\",\"set\":\"duotone\",\"paths\":[\"M19.75 14.83A8.25 8.25 0 1 1 9.17 4.25 9.01 9.01 0 0 0 18 15 9.07 9.07 0 0 0 19.75 14.83Z\",\"M22.5 9a.75 .75 0 0 1-.75 .75H20.25v1.5a.75 .75 0 0 1-1.5 0V9.75H17.25a.75 .75 0 0 1 0-1.5h1.5V6.75a.75 .75 0 0 1 1.5 0V8.25h1.5A.75 .75 0 0 1 22.5 9ZM13.5 5.25h.75v.75a.75 .75 0 0 0 1.5 0V5.25h.75a.75 .75 0 0 0 0-1.5h-.75V3a.75 .75 0 0 0-1.5 0v.75h-.75a.75 .75 0 0 0 0 1.5Zm6.82 9.09a.75 .75 0 0 1 .13 .75A9 9 0 1 1 8.91 3.54a.75 .75 0 0 1 .99 .85A8.26 8.26 0 0 0 19.61 14.09 .75 .75 0 0 1 20.32 14.34Zm-1.82 1.4c-.17 .01-.34 .01-.5 .01A9.76 9.76 0 0 1 8.25 6c0-.17 0-.34 .01-.5A7.5 7.5 0 1 0 18.5 15.74Z\"],\"faded\":[0]},{\"id\":\"ph-cloud-moon-duo\",\"label\":\"Night duotone\",\"set\":\"duotone\",\"paths\":[\"M9.97 12.22ZM9.6 1.65h0A6.01 6.01 0 0 1 2.4 8.85h0A6.01 6.01 0 0 0 5.91 13.02h0a4.13 4.13 0 0 1 4.06-.8 6.39 6.39 0 0 1 4.26-4.44l.01 0c0-.09 .01-.19 .01-.28A6 6 0 0 0 9.6 1.65Z\",\"M16.13 6.75a7.17 7.17 0 0 0-1.16 .09A6.74 6.74 0 0 0 9.77 .92a.75 .75 0 0 0-.9 .9A5.25 5.25 0 0 1 3.75 8.25a5.29 5.29 0 0 1-1.18-.13 .75 .75 0 0 0-.9 .9 6.77 6.77 0 0 0 3.03 4.22A4.88 4.88 0 0 0 8.63 21h7.5a7.13 7.13 0 0 0 0-14.25ZM3.5 9.75c.08 0 .16 0 .25 0a6.76 6.76 0 0 0 6.75-6.75c0-.08 0-.17 0-.25a5.22 5.22 0 0 1 3 4.5 7.15 7.15 0 0 0-4.03 4.07A4.88 4.88 0 0 0 5.81 12.15 5.27 5.27 0 0 1 3.5 9.75ZM16.13 19.5H8.63a3.38 3.38 0 1 1 .45-6.72c-.03 .22-.06 .45-.07 .68a.75 .75 0 0 0 1.5 .09 5.52 5.52 0 0 1 .18-1.11c0-.01 .01-.03 .01-.04A5.63 5.63 0 1 1 16.13 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-shooting-star-duo\",\"label\":\"Shooting star duotone\",\"set\":\"duotone\",\"paths\":[\"M21.57 7.34l-2.98 2.52L19.5 13.62a.51 .51 0 0 1-.77 .55L15.38 12.16l-3.35 2.02a.51 .51 0 0 1-.77-.55l.91-3.77L9.18 7.34a.5 .5 0 0 1 .29-.89l3.92-.31 1.51-3.58a.52 .52 0 0 1 .95 0l1.51 3.58L21.28 6.45A.5 .5 0 0 1 21.57 7.34Z\",\"M22.44 6.57a1.26 1.26 0 0 0-1.1-.87l-3.46-.27L16.54 2.27a1.27 1.27 0 0 0-2.33 0L12.88 5.43 9.41 5.7a1.26 1.26 0 0 0-.72 2.21l2.63 2.22-.8 3.32a1.25 1.25 0 0 0 .48 1.3 1.27 1.27 0 0 0 1.41 .06L15.38 13.03l2.97 1.79a1.27 1.27 0 0 0 1.41-.06 1.25 1.25 0 0 0 .48-1.3l-.8-3.32 2.63-2.22A1.25 1.25 0 0 0 22.44 6.57ZM18.1 9.28a.75 .75 0 0 0-.24 .75l.78 3.21L15.76 11.51a.75 .75 0 0 0-.77 0l-2.87 1.73L12.89 10.03a.75 .75 0 0 0-.25-.75L10.13 7.15l3.33-.26a.75 .75 0 0 0 .63-.46L15.38 3.37l1.29 3.06a.75 .75 0 0 0 .63 .46l3.33 .26Zm-9.84 2.27L2.78 17.03a.75 .75 0 0 1-1.06-1.06l5.48-5.48a.75 .75 0 0 1 1.06 1.06Zm1.01 4.68a.75 .75 0 0 1 0 1.06L4.28 22.28a.75 .75 0 0 1-1.06-1.06l4.99-4.99A.75 .75 0 0 1 9.27 16.23Zm6.84-.09a.75 .75 0 0 1 0 1.06l-5.09 5.09a.75 .75 0 0 1-1.06-1.06l5.09-5.09A.75 .75 0 0 1 16.12 16.13Z\"],\"faded\":[0]},{\"id\":\"ph-planet-duo\",\"label\":\"Planet duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12a8.25 8.25 0 1 1-8.25-8.25A8.25 8.25 0 0 1 20.25 12Z\",\"M22.98 5.69c-.72-1.24-2.61-1.51-5.48-.81A8.99 8.99 0 0 0 3 12a9.19 9.19 0 0 0 .07 1.15C.48 15.84 .51 17.44 1.02 18.31 1.5 19.14 2.5 19.5 3.81 19.5a11.64 11.64 0 0 0 2.7-.37A8.99 8.99 0 0 0 21 12a9.1 9.1 0 0 0-.07-1.15c1.17-1.22 1.95-2.38 2.22-3.37C23.33 6.8 23.27 6.19 22.98 5.69ZM12 4.5a7.51 7.51 0 0 1 7.31 5.83c-1.6 1.51-3.76 3.05-5.82 4.23C10.91 16.04 8.67 16.97 6.88 17.48A7.49 7.49 0 0 1 12 4.5ZM2.32 17.56c-.14-.24-.06-.68 .21-1.22a7.41 7.41 0 0 1 .96-1.41 9 9 0 0 0 1.69 2.94C3.56 18.14 2.55 17.96 2.32 17.56ZM12 19.5a7.45 7.45 0 0 1-3.61-.93 34.69 34.69 0 0 0 5.85-2.71c2.02-1.16 3.81-2.42 5.26-3.66A7.51 7.51 0 0 1 12 19.5ZM21.7 7.1c-.16 .59-.58 1.27-1.18 1.98a8.97 8.97 0 0 0-1.69-2.94c1.33-.22 2.57-.2 2.86 .3C21.77 6.59 21.77 6.81 21.7 7.1Z\"],\"faded\":[0]},{\"id\":\"ph-alien-duo\",\"label\":\"Alien duotone\",\"set\":\"duotone\",\"paths\":[\"M12 2.25a8.25 8.25 0 0 0-8.25 8.25c0 4.56 5.25 11.25 8.25 11.25s8.25-6.69 8.25-11.25A8.25 8.25 0 0 0 12 2.25ZM9.75 13.5a3 3 0 0 1-3-3 .75 .75 0 0 1 .75-.75 3 3 0 0 1 3 3A.75 .75 0 0 1 9.75 13.5Zm4.5 0a.75 .75 0 0 1-.75-.75 3 3 0 0 1 3-3 .75 .75 0 0 1 .75 .75A3 3 0 0 1 14.25 13.5Z\",\"M12 1.5a9.01 9.01 0 0 0-9 9c0 2.25 1.18 5.16 3.15 7.78 1.99 2.64 4.17 4.22 5.85 4.22s3.86-1.58 5.85-4.22c1.97-2.62 3.15-5.53 3.15-7.78A9.01 9.01 0 0 0 12 1.5Zm4.65 15.88C15.02 19.55 13.15 21 12 21s-3.02-1.45-4.65-3.62C5.59 15.05 4.5 12.41 4.5 10.5a7.5 7.5 0 0 1 15 0C19.5 12.41 18.41 15.05 16.65 17.38ZM11.25 12.75A3.75 3.75 0 0 0 7.5 9a1.5 1.5 0 0 0-1.5 1.5 3.75 3.75 0 0 0 3.75 3.75A1.5 1.5 0 0 0 11.25 12.75ZM7.5 10.5a2.25 2.25 0 0 1 2.25 2.25h0A2.25 2.25 0 0 1 7.5 10.5Zm9-1.5a3.75 3.75 0 0 0-3.75 3.75 1.5 1.5 0 0 0 1.5 1.5 3.75 3.75 0 0 0 3.75-3.75A1.5 1.5 0 0 0 16.5 9Zm-2.25 3.75a2.25 2.25 0 0 1 2.25-2.25A2.25 2.25 0 0 1 14.25 12.75Zm0 4.5a.75 .75 0 0 1-.75 .75H10.5a.75 .75 0 0 1 0-1.5h3A.75 .75 0 0 1 14.25 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-butterfly-duo\",\"label\":\"Butterfly duotone\",\"set\":\"duotone\",\"paths\":[\"M21.11 11.22c-.74 2.9-2.75 3.07-3.5 3.02h-.09A3.38 3.38 0 1 1 12 16.88a3.38 3.38 0 1 1-5.5-2.63h-.09c-.75 .05-2.77-.12-3.5-3.02C2.14 8.24 1.48 4.5 4.41 4.5S12 8.98 12 11.97C12 8.98 16.65 4.5 19.59 4.5S21.86 8.24 21.11 11.22Z\",\"M21.82 4.73C21.47 4.28 20.8 3.75 19.59 3.75c-1.58 0-3.61 1.06-5.42 2.83A13.13 13.13 0 0 0 12.75 8.21V5.25a.75 .75 0 0 0-1.5 0V8.21a13.13 13.13 0 0 0-1.42-1.63C8.01 4.81 5.99 3.75 4.41 3.75 3.2 3.75 2.53 4.28 2.18 4.73c-.64 .82-1.14 2.26-.02 6.68 .57 2.23 1.83 3.09 2.87 3.41A4.13 4.13 0 0 0 12 19.24a4.13 4.13 0 0 0 6.96-4.42c1.04-.32 2.3-1.18 2.87-3.41C22.47 8.93 22.95 6.2 21.82 4.73ZM8.63 19.5A2.64 2.64 0 0 1 8.33 14.25a.75 .75 0 1 0-.16-1.49A4.09 4.09 0 0 0 6.22 13.5c-.79 .01-2.06-.33-2.6-2.46C3.35 9.97 2.53 6.74 3.37 5.65 3.5 5.48 3.76 5.25 4.41 5.25c2.56 0 6.84 4.21 6.84 6.72V16.88A2.63 2.63 0 0 1 8.63 19.5ZM20.38 11.04c-.54 2.13-1.81 2.47-2.6 2.46a4.09 4.09 0 0 0-1.94-.75 .75 .75 0 1 0-.16 1.49A2.64 2.64 0 1 1 12.75 16.88V11.97C12.75 9.46 17.03 5.25 19.59 5.25c.65 0 .91 .23 1.04 .4C21.47 6.74 20.65 9.97 20.38 11.04Z\"],\"faded\":[0]},{\"id\":\"ph-graduation-cap-duo\",\"label\":\"Graduation cap duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 10.6v4.99a.75 .75 0 0 1-.19 .5c-1.06 1.18-3.65 3.41-8.06 3.41s-7-2.23-8.06-3.41a.75 .75 0 0 1-.19-.5V10.6L12 15Z\",\"M23.6 8.34l-11.25-6a.75 .75 0 0 0-.7 0l-11.25 6a.75 .75 0 0 0 0 1.32L3 11.05v4.54a1.49 1.49 0 0 0 .38 1C4.61 17.96 7.36 20.25 12 20.25a12.19 12.19 0 0 0 4.5-.82V22.5a.75 .75 0 0 0 1.5 0V18.7a10.84 10.84 0 0 0 2.62-2.12A1.49 1.49 0 0 0 21 15.59V11.05l2.6-1.39a.75 .75 0 0 0 0-1.32ZM12 18.75c-4.06 0-6.44-1.98-7.5-3.16V11.85l7.15 3.81a.75 .75 0 0 0 .71 0L16.5 13.45v4.34C15.32 18.35 13.83 18.75 12 18.75Zm7.5-3.16a9.17 9.17 0 0 1-1.5 1.34V12.65l1.5-.8ZM17.63 11.15l-.02-.01-5.25-2.8a.75 .75 0 0 0-.7 1.32L16.03 12l-4.03 2.15L2.34 9 12 3.85 21.66 9Z\"],\"faded\":[0]},{\"id\":\"ph-detective-duo\",\"label\":\"Detective duotone\",\"set\":\"duotone\",\"paths\":[\"M9.75 16.88a2.63 2.63 0 1 1-2.62-2.62A2.63 2.63 0 0 1 9.75 16.88Zm7.13-2.62a2.63 2.63 0 1 0 2.63 2.63A2.63 2.63 0 0 0 16.88 14.25ZM15.57 4.81a.75 .75 0 0 0-1.19-.03L13.17 6.19a1.5 1.5 0 0 1-2.34 0L9.62 4.78a.75 .75 0 0 0-1.19 .03L3.75 11.25H20.25Z\",\"M23.25 10.5H20.63l-4.45-6.13a1.5 1.5 0 0 0-2.37-.07l-1.2 1.4-.02 .02a.75 .75 0 0 1-1.17 0l-.02-.02-1.2-1.4a1.5 1.5 0 0 0-2.37 .07L3.37 10.5H.75a.75 .75 0 0 0 0 1.5H23.25a.75 .75 0 0 0 0-1.5ZM9.03 5.25l.02 .02 1.2 1.4a2.25 2.25 0 0 0 3.49 0l1.2-1.4c.01-.01 .01-.01 .02-.02l3.81 5.25H5.22ZM16.88 13.5a3.38 3.38 0 0 0-3.35 3H10.48a3.38 3.38 0 1 0-.17 1.5h3.39A3.38 3.38 0 1 0 16.88 13.5ZM7.13 18.75a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 7.13 18.75Zm9.75 0a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 16.88 18.75Z\"],\"faded\":[0]},{\"id\":\"ph-briefcase-duo\",\"label\":\"Briefcase duotone\",\"set\":\"duotone\",\"paths\":[\"M21 11.09V18.75a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V11.09h0A17.92 17.92 0 0 0 12 13.5 17.91 17.91 0 0 0 21 11.09Z\",\"M9.75 10.5a.75 .75 0 0 1 .75-.75h3a.75 .75 0 0 1 0 1.5H10.5A.75 .75 0 0 1 9.75 10.5ZM21.75 6.75V18.75a1.5 1.5 0 0 1-1.5 1.5H3.75a1.5 1.5 0 0 1-1.5-1.5V6.75A1.5 1.5 0 0 1 3.75 5.25H7.5V4.5a2.25 2.25 0 0 1 2.25-2.25h4.5a2.25 2.25 0 0 1 2.25 2.25v.75h3.75A1.5 1.5 0 0 1 21.75 6.75ZM9 5.25h6V4.5a.75 .75 0 0 0-.75-.75H9.75a.75 .75 0 0 0-.75 .75ZM3.75 6.75v3.9A17.26 17.26 0 0 0 12 12.75a17.25 17.25 0 0 0 8.25-2.1V6.75ZM20.25 18.75V12.34A18.77 18.77 0 0 1 12 14.25a18.77 18.77 0 0 1-8.25-1.91V18.75H20.25Z\"],\"faded\":[0]},{\"id\":\"ph-money-wavy-duo\",\"label\":\"Cash duotone\",\"set\":\"duotone\",\"paths\":[\"M1.5 6.49v11.25c8.59-4.2 12.41 3.97 21-.23v-11.25C13.91 10.46 10.09 2.29 1.5 6.49ZM12 14.25a2.25 2.25 0 1 1 2.25-2.25A2.25 2.25 0 0 1 12 14.25Z\",\"M22.9 5.63a.75 .75 0 0 0-.73-.04c-4.02 1.97-6.9 1.05-9.94 .07-3.19-1.02-6.49-2.08-11.06 .15A.75 .75 0 0 0 .75 6.49V17.73a.75 .75 0 0 0 1.08 .67c4.02-1.97 6.9-1.05 9.94-.07 1.8 .58 3.64 1.16 5.72 1.16 1.6 0 3.35-.35 5.34-1.32a.75 .75 0 0 0 .42-.67V6.27A.75 .75 0 0 0 22.9 5.63ZM21.75 17.03c-3.81 1.7-6.59 .81-9.52-.12-1.8-.58-3.64-1.16-5.72-1.16a11.44 11.44 0 0 0-4.26 .84V6.97c3.81-1.7 6.59-.81 9.52 .12S17.73 9 21.75 7.41ZM12 9a3 3 0 1 0 3 3A3 3 0 0 0 12 9Zm0 4.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 12 13.5ZM5.25 9v4.5a.75 .75 0 0 1-1.5 0V9a.75 .75 0 1 1 1.5 0Zm13.5 6V10.5a.75 .75 0 1 1 1.5 0v4.5a.75 .75 0 1 1-1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-coin-vertical-duo\",\"label\":\"Coin duotone\",\"set\":\"duotone\",\"paths\":[\"M15 12c0 4.97-2.35 9-5.25 9s-5.25-4.03-5.25-9 2.35-9 5.25-9S15 7.03 15 12Z\",\"M18.61 5.26C17.48 3.32 15.93 2.25 14.25 2.25H9.75C8.07 2.25 6.52 3.32 5.39 5.26 4.33 7.07 3.75 9.47 3.75 12s.58 4.93 1.64 6.74C6.52 20.68 8.07 21.75 9.75 21.75h4.5c1.68 0 3.23-1.07 4.36-3.01C19.67 16.93 20.25 14.53 20.25 12S19.67 7.07 18.61 5.26ZM18.73 11.25h-3a14.32 14.32 0 0 0-.91-4.5H17.69C18.26 8 18.64 9.56 18.73 11.25Zm-1.93-6H14.11a7.79 7.79 0 0 0-1.12-1.5H14.25C15.19 3.75 16.07 4.31 16.8 5.25ZM5.25 12c0-4.47 2.06-8.25 4.5-8.25s4.5 3.78 4.5 8.25-2.06 8.25-4.5 8.25S5.25 16.47 5.25 12Zm9 8.25H12.98a7.79 7.79 0 0 0 1.13-1.5h2.69C16.07 19.69 15.19 20.25 14.25 20.25Zm3.44-3H14.82a14.32 14.32 0 0 0 .91-4.5h3C18.64 14.44 18.26 16 17.69 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-currency-circle-dollar-duo\",\"label\":\"Dollar coin duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm3.75-6.37a2.63 2.63 0 0 1-2.62 2.63h-.37v.75a.75 .75 0 0 1-1.5 0v-.75H9.75a.75 .75 0 0 1 0-1.5h3.38a1.13 1.13 0 0 0 0-2.25H10.88a2.63 2.63 0 0 1 0-5.25h.38V6.75a.75 .75 0 0 1 1.5 0v.75h1.5a.75 .75 0 0 1 0 1.5H10.88a1.13 1.13 0 0 0 0 2.25h2.25A2.63 2.63 0 0 1 15.75 13.88Z\"],\"faded\":[0]},{\"id\":\"ph-shield-star-duo\",\"label\":\"Shield star duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25v5.25c0 9-8.25 11.25-8.25 11.25S3.75 19.5 3.75 10.5V5.25a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 5.25Z\",\"M7.55 10.97A.75 .75 0 0 1 8.53 10.55l2.72 1.09V9a.75 .75 0 0 1 1.5 0v2.64l2.72-1.09A.75 .75 0 1 1 16.03 11.95l-2.84 1.14L14.85 15.3a.75 .75 0 1 1-1.2 .9L12 14 10.35 16.2a.75 .75 0 1 1-1.2-.9l1.66-2.22L7.97 11.95A.75 .75 0 0 1 7.55 10.97ZM21 5.25v5.25c0 4.94-2.39 7.94-4.4 9.58-2.16 1.77-4.31 2.37-4.41 2.39a.75 .75 0 0 1-.39 0c-.09-.02-2.24-.63-4.41-2.39C5.39 18.44 3 15.44 3 10.5V5.25A1.5 1.5 0 0 1 4.5 3.75H19.5A1.5 1.5 0 0 1 21 5.25Zm-1.5 0L4.5 5.25l0 5.25c0 3.5 1.3 6.33 3.85 8.42A12.02 12.02 0 0 0 12 20.96a12.12 12.12 0 0 0 3.69-2.08C18.22 16.8 19.5 13.98 19.5 10.5Z\"],\"faded\":[0]},{\"id\":\"ph-headset-duo\",\"label\":\"Headset duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 13.5v3.75a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V12H6A1.5 1.5 0 0 1 7.5 13.5Zm10.5-1.5a1.5 1.5 0 0 0-1.5 1.5v3.75a1.5 1.5 0 0 0 1.5 1.5h3V12Z\",\"M18.93 5.12A9.76 9.76 0 0 0 2.25 12v5.25a2.25 2.25 0 0 0 2.25 2.25H6a2.25 2.25 0 0 0 2.25-2.25V13.5a2.25 2.25 0 0 0-2.25-2.25H3.78A8.26 8.26 0 0 1 17.86 6.18 8.19 8.19 0 0 1 20.22 11.25H18a2.25 2.25 0 0 0-2.25 2.25v3.75a2.25 2.25 0 0 0 2.25 2.25h2.25a2.25 2.25 0 0 1-2.25 2.25H12.75a.75 .75 0 0 0 0 1.5h5.25a3.75 3.75 0 0 0 3.75-3.75V12A9.69 9.69 0 0 0 18.93 5.12ZM6 12.75a.75 .75 0 0 1 .75 .75v3.75a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V12.75Zm12 5.25a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 .75-.75h2.25v5.25Z\"],\"faded\":[0]},{\"id\":\"ph-soccer-ball-duo\",\"label\":\"Football duotone\",\"set\":\"duotone\",\"paths\":[\"M6.11 10.13l-3.09 2.38c-.01-.17-.01-.34-.01-.51A8.96 8.96 0 0 1 4.99 6.35ZM4.4 16.82a9.01 9.01 0 0 0 5.34 3.89l-1.38-3.89Zm9.86 3.89a9.01 9.01 0 0 0 5.34-3.89H15.64ZM19.01 6.35l-1.12 3.78 3.09 2.38c.01-.17 .01-.34 .01-.51A8.96 8.96 0 0 0 19.01 6.35Zm-3.61-2.69a9.03 9.03 0 0 0-6.8 0L12 6ZM14.32 15 15.75 10.83 12 8.25 8.25 10.83 9.68 15Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm7.17 13.82H16.02l-.87-1.2 1.18-3.45 1.41-.46 2.46 1.89A8.19 8.19 0 0 1 19.17 16.07Zm-15.37-3.22L6.25 10.97l1.41 .46 1.18 3.45L7.98 16.07H4.83A8.19 8.19 0 0 1 3.79 12.86Zm.94-4.75 .52 1.74L3.82 10.95A8.19 8.19 0 0 1 4.73 8.11ZM10.22 14.25 9.14 11.12 12 9.16l2.86 1.96L13.78 14.25Zm8.54-4.4 .52-1.74a8.19 8.19 0 0 1 .91 2.84Zm-.58-3.32-.89 3.01-1.41 .46L12.75 7.86V6.39l2.73-1.87A8.3 8.3 0 0 1 18.17 6.53ZM13.69 3.93 12 5.09 10.31 3.93a8.27 8.27 0 0 1 3.39 0ZM8.52 4.52l2.73 1.88V7.86L8.13 10l-1.41-.46L5.83 6.53A8.3 8.3 0 0 1 8.52 4.52ZM5.92 17.57H7.83l.67 1.9A8.29 8.29 0 0 1 5.92 17.57ZM10.31 20.07 9.2 16.94 10.06 15.75h3.87l.87 1.19-1.11 3.13a8.25 8.25 0 0 1-3.38 0Zm5.19-.6 .67-1.9h1.91A8.29 8.29 0 0 1 15.5 19.47Z\"],\"faded\":[0]},{\"id\":\"ph-basketball-duo\",\"label\":\"Basketball duotone\",\"set\":\"duotone\",\"paths\":[\"M5.63 18.36h0l.01 .01ZM5.63 5.63h0a9.04 9.04 0 0 0 0 12.74 9.01 9.01 0 0 0 2.63-6.37A9.01 9.01 0 0 0 5.63 5.63Zm12.75 0h0a9.04 9.04 0 0 0 0 12.74A9.04 9.04 0 0 0 18.38 5.63Zm0 12.74 .01 .01-.01-.01Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25ZM3.78 12.75H7.47A8.18 8.18 0 0 1 5.63 17.23 8.21 8.21 0 0 1 3.78 12.75ZM12.75 11.25V3.78a8.21 8.21 0 0 1 4.56 1.91A9.66 9.66 0 0 0 15.03 11.25Zm-1.5 0H8.97A9.66 9.66 0 0 0 6.69 5.69 8.21 8.21 0 0 1 11.25 3.78Zm-3.78 0H3.78A8.21 8.21 0 0 1 5.63 6.77 8.18 8.18 0 0 1 7.47 11.25ZM8.97 12.75H11.25v7.47a8.21 8.21 0 0 1-4.56-1.91A9.66 9.66 0 0 0 8.97 12.75Zm3.78 0h2.28a9.66 9.66 0 0 0 2.29 5.56A8.21 8.21 0 0 1 12.75 20.22Zm3.78 0h3.68A8.21 8.21 0 0 1 18.38 17.23 8.18 8.18 0 0 1 16.53 12.75Zm0-1.5A8.18 8.18 0 0 1 18.38 6.77 8.21 8.21 0 0 1 20.22 11.25Z\"],\"faded\":[0]},{\"id\":\"ph-heartbeat-duo\",\"label\":\"Heartbeat duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 9.56c0 6.19-9.75 11.44-9.75 11.44S2.25 15.75 2.25 9.56A5.06 5.06 0 0 1 7.31 4.5c2.12 0 3.93 1.15 4.69 3 .76-1.85 2.57-3 4.69-3A5.06 5.06 0 0 1 21.75 9.56Z\",\"M6.75 13.5H3a.75 .75 0 0 1 0-1.5H6.35l1.28-1.92a.75 .75 0 0 1 1.25 0l2.38 3.56 .88-1.31A.75 .75 0 0 1 12.75 12h2.25a.75 .75 0 0 1 0 1.5H13.15l-1.28 1.92a.75 .75 0 0 1-1.25 0L8.25 11.85l-.88 1.31A.75 .75 0 0 1 6.75 13.5ZM16.69 3.75c-1.94 0-3.63 .83-4.69 2.24C10.94 4.58 9.25 3.75 7.31 3.75a5.82 5.82 0 0 0-5.81 5.81c0 .07 0 .14 0 .21a.75 .75 0 1 0 1.5-.05c0-.05 0-.11 0-.16A4.32 4.32 0 0 1 7.31 5.25c1.82 0 3.35 .97 3.99 2.53a.75 .75 0 0 0 1.39 0c.64-1.56 2.17-2.53 3.99-2.53a4.32 4.32 0 0 1 4.31 4.31c0 5.03-7.29 9.58-9 10.58-1.02-.59-4-2.44-6.25-4.89a.75 .75 0 1 0-1.11 1.01c2.92 3.19 6.84 5.31 7 5.4a.75 .75 0 0 0 .71 0C12.77 21.44 22.5 16.13 22.5 9.56A5.82 5.82 0 0 0 16.69 3.75Z\"],\"faded\":[0]},{\"id\":\"ph-thumbs-up-duo\",\"label\":\"Like duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 9.75V19.5H3a.75 .75 0 0 1-.75-.75V10.5a.75 .75 0 0 1 .75-.75Z\",\"M21.94 7.51A2.25 2.25 0 0 0 20.25 6.75H15V5.25a3.75 3.75 0 0 0-3.75-3.75 .75 .75 0 0 0-.67 .41L7.04 9H3a1.5 1.5 0 0 0-1.5 1.5v8.25a1.5 1.5 0 0 0 1.5 1.5H19.13a2.25 2.25 0 0 0 2.23-1.97l1.13-9A2.25 2.25 0 0 0 21.94 7.51ZM3 10.5H6.75v8.25H3ZM20.99 9.09l-1.12 9a.75 .75 0 0 1-.74 .66H8.25V9.93l3.44-6.88A2.25 2.25 0 0 1 13.5 5.25V7.5a.75 .75 0 0 0 .75 .75h6a.75 .75 0 0 1 .74 .84Z\"],\"faded\":[0]},{\"id\":\"ph-thumbs-down-duo\",\"label\":\"Dislike duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 4.5V14.25H3a.75 .75 0 0 1-.75-.75V5.25a.75 .75 0 0 1 .75-.75Z\",\"M22.48 14.72l-1.12-9A2.25 2.25 0 0 0 19.13 3.75H3A1.5 1.5 0 0 0 1.5 5.25v8.25a1.5 1.5 0 0 0 1.5 1.5H7.04l3.54 7.09A.75 .75 0 0 0 11.25 22.5a3.75 3.75 0 0 0 3.75-3.75V17.25h5.25a2.25 2.25 0 0 0 2.23-2.53ZM6.75 13.5H3V5.25H6.75Zm14.06 2a.74 .74 0 0 1-.56 .25H14.25a.75 .75 0 0 0-.75 .75v2.25a2.25 2.25 0 0 1-1.81 2.21L8.25 14.07V5.25H19.13a.75 .75 0 0 1 .74 .66l1.13 9A.74 .74 0 0 1 20.81 15.5Z\"],\"faded\":[0]},{\"id\":\"ph-check-circle-duo\",\"label\":\"Check duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M16.28 9.22a.75 .75 0 0 1 0 1.06l-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72A.75 .75 0 0 1 16.28 9.22ZM21.75 12A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-x-circle-duo\",\"label\":\"Cross duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M15.53 9.53 13.06 12l2.47 2.47a.75 .75 0 0 1-1.06 1.06L12 13.06l-2.47 2.47a.75 .75 0 0 1-1.06-1.06L10.94 12 8.47 9.53a.75 .75 0 0 1 1.06-1.06L12 10.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06ZM21.75 12A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-check-fat-duo\",\"label\":\"Check mark duotone\",\"set\":\"duotone\",\"paths\":[\"M22.28 7.99l-12.04 12.04a.75 .75 0 0 1-1.06 0l-6.71-6.75a.75 .75 0 0 1 0-1.06l2.25-2.25a.75 .75 0 0 1 1.06 0L9.75 13.82l9.22-9.1a.75 .75 0 0 1 1.06 0l2.25 2.21A.75 .75 0 0 1 22.28 7.99Z\",\"M22.81 6.4l-2.25-2.21a1.5 1.5 0 0 0-2.12 0L9.75 12.77l-3.44-3.34a1.5 1.5 0 0 0-2.12 0l-2.25 2.25a1.5 1.5 0 0 0 0 2.12l6.71 6.75a1.5 1.5 0 0 0 2.12 0L22.81 8.52A1.5 1.5 0 0 0 22.81 6.4ZM9.71 19.5 3 12.75l2.25-2.25a.06 .06 0 0 1 .01 .01l3.97 3.85a.75 .75 0 0 0 1.05 0L19.51 5.25 21.75 7.46Z\"],\"faded\":[0]},{\"id\":\"ph-x-duo\",\"label\":\"Close duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25V18.75a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 5.25 3.75H18.75A1.5 1.5 0 0 1 20.25 5.25Z\",\"M19.28 18.22a.75 .75 0 0 1-1.06 1.06L12 13.06 5.78 19.28a.75 .75 0 0 1-1.06-1.06L10.94 12 4.72 5.78A.75 .75 0 0 1 5.78 4.72L12 10.94l6.22-6.22a.75 .75 0 0 1 1.06 1.06L13.06 12Z\"],\"faded\":[0]},{\"id\":\"ph-check-square-duo\",\"label\":\"Check square duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V19.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 4.5Z\",\"M16.28 9.22a.75 .75 0 0 1 0 1.06l-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72A.75 .75 0 0 1 16.28 9.22ZM21 4.5V19.5a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 4.5 3H19.5A1.5 1.5 0 0 1 21 4.5ZM19.5 19.5V4.5H4.5V19.5H19.5Z\"],\"faded\":[0]},{\"id\":\"ph-x-square-duo\",\"label\":\"Cross square duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V19.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 4.5Z\",\"M19.5 3H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3Zm0 16.5H4.5V4.5H19.5V19.5ZM15.53 9.53 13.06 12l2.47 2.47a.75 .75 0 0 1-1.06 1.06L12 13.06l-2.47 2.47a.75 .75 0 0 1-1.06-1.06L10.94 12 8.47 9.53a.75 .75 0 0 1 1.06-1.06L12 10.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06Z\"],\"faded\":[0]},{\"id\":\"ph-warning-duo\",\"label\":\"Warning duotone\",\"set\":\"duotone\",\"paths\":[\"M20.2 20.25H3.8C2.62 20.25 1.88 19.01 2.45 18.01L10.65 3.77c.59-1.03 2.11-1.03 2.7 0l8.2 14.24C22.13 19.01 21.38 20.25 20.2 20.25Z\",\"M22.2 17.63 14 3.4h0a2.32 2.32 0 0 0-4 0L1.8 17.63a2.2 2.2 0 0 0 0 2.22A2.28 2.28 0 0 0 3.8 21h16.4a2.28 2.28 0 0 0 2-1.14A2.2 2.2 0 0 0 22.2 17.63ZM20.9 19.11a.8 .8 0 0 1-.7 .39H3.8a.8 .8 0 0 1-.7-.39 .71 .71 0 0 1 0-.72L11.3 4.14a.82 .82 0 0 1 1.41 0l8.2 14.24A.71 .71 0 0 1 20.9 19.11ZM11.25 13.5V9.75a.75 .75 0 0 1 1.5 0v3.75a.75 .75 0 0 1-1.5 0Zm1.88 3.38a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 16.88Z\"],\"faded\":[0]},{\"id\":\"ph-warning-circle-duo\",\"label\":\"Alert duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm-.75-7.5V7.5a.75 .75 0 0 1 1.5 0v5.25a.75 .75 0 0 1-1.5 0Zm1.88 3.38a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 16.13Z\"],\"faded\":[0]},{\"id\":\"ph-info-duo\",\"label\":\"Info duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M13.5 16.5a.75 .75 0 0 1-.75 .75 1.5 1.5 0 0 1-1.5-1.5V12a.75 .75 0 0 1 0-1.5 1.5 1.5 0 0 1 1.5 1.5v3.75A.75 .75 0 0 1 13.5 16.5Zm8.25-4.5A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12ZM11.63 9a1.13 1.13 0 1 0-1.12-1.12A1.13 1.13 0 0 0 11.63 9Z\"],\"faded\":[0]},{\"id\":\"ph-question-duo\",\"label\":\"Question duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M13.13 16.88a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 16.88ZM12 6.75c-2.07 0-3.75 1.51-3.75 3.38v.38a.75 .75 0 0 0 1.5 0v-.37c0-1.03 1.01-1.87 2.25-1.87s2.25 .84 2.25 1.88-1.01 1.88-2.25 1.88a.75 .75 0 0 0-.75 .75v.75a.75 .75 0 0 0 1.5 0v-.07c1.71-.31 3-1.68 3-3.31C15.75 8.26 14.07 6.75 12 6.75Zm9.75 5.25A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-prohibit-duo\",\"label\":\"Ban duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm8.25 9.75a8.21 8.21 0 0 1-1.91 5.28L6.72 5.66A8.25 8.25 0 0 1 20.25 12ZM3.75 12A8.21 8.21 0 0 1 5.66 6.72L17.28 18.34A8.25 8.25 0 0 1 3.75 12Z\"],\"faded\":[0]},{\"id\":\"ph-heart-duo\",\"label\":\"Heart duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 9.56c0 6.19-9.75 11.44-9.75 11.44S2.25 15.75 2.25 9.56A5.06 5.06 0 0 1 7.31 4.5c2.12 0 3.93 1.15 4.69 3 .76-1.85 2.57-3 4.69-3A5.06 5.06 0 0 1 21.75 9.56Z\",\"M16.69 3.75c-1.94 0-3.63 .83-4.69 2.24C10.94 4.58 9.25 3.75 7.31 3.75a5.82 5.82 0 0 0-5.81 5.81c0 6.56 9.73 11.87 10.14 12.09a.75 .75 0 0 0 .71 0C12.77 21.44 22.5 16.13 22.5 9.56A5.82 5.82 0 0 0 16.69 3.75ZM12 20.14C10.29 19.14 3 14.6 3 9.56A4.32 4.32 0 0 1 7.31 5.25c1.82 0 3.35 .97 3.99 2.53a.75 .75 0 0 0 1.39 0c.64-1.56 2.17-2.53 3.99-2.53a4.32 4.32 0 0 1 4.31 4.31C21 14.59 13.71 19.14 12 20.14Z\"],\"faded\":[0]},{\"id\":\"ph-heart-straight-duo\",\"label\":\"Heart straight duotone\",\"set\":\"duotone\",\"paths\":[\"M20.38 12.5 12 21 3.62 12.5a4.69 4.69 0 0 1 6.63-6.63L12 7.5l1.75-1.63a4.69 4.69 0 1 1 6.63 6.63Z\",\"M20.91 5.34a5.44 5.44 0 0 0-7.68-.01L12 6.47 10.77 5.33A5.44 5.44 0 0 0 3.09 13.03l8.38 8.5a.75 .75 0 0 0 1.07 0L20.91 13.03a5.44 5.44 0 0 0 0-7.69Zm-1.06 6.63L12 19.93 4.15 11.97a3.94 3.94 0 0 1 5.57-5.57l.02 .02 1.75 1.63a.75 .75 0 0 0 1.02 0L14.26 6.42l.02-.02a3.94 3.94 0 1 1 5.57 5.57Z\"],\"faded\":[0]},{\"id\":\"ph-star-duo\",\"label\":\"Star duotone\",\"set\":\"duotone\",\"paths\":[\"M21.47 10.2l-4.57 3.94 1.4 5.89a.79 .79 0 0 1-1.17 .86L12 17.73 6.87 20.88a.79 .79 0 0 1-1.17-.86l1.4-5.89-4.57-3.94A.79 .79 0 0 1 2.97 8.81L8.97 8.32l2.31-5.59a.78 .78 0 0 1 1.45 0l2.31 5.59L21.03 8.81A.79 .79 0 0 1 21.47 10.2Z\",\"M22.42 9.12A1.54 1.54 0 0 0 21.09 8.06l-5.53-.45L13.42 2.45a1.53 1.53 0 0 0-2.84 0L8.45 7.62 2.91 8.06a1.54 1.54 0 0 0-.88 2.71l4.22 3.64L4.97 19.85a1.54 1.54 0 0 0 2.3 1.67L12 18.61l4.74 2.91A1.54 1.54 0 0 0 19.03 19.85l-1.29-5.44 4.22-3.64A1.54 1.54 0 0 0 22.42 9.12Zm-1.44 .51-4.57 3.94a.75 .75 0 0 0-.24 .74l1.4 5.89a.03 .03 0 0 1-.02 .05c-.02 .01-.02 .01-.04 0l-5.13-3.15a.75 .75 0 0 0-.79 0L6.48 20.24c-.01 .01-.02 .01-.04 0a.03 .03 0 0 1-.02-.04l1.4-5.89a.75 .75 0 0 0-.24-.74l-4.57-3.94c-.01-.01-.02-.02-.01-.05s.02-.03 .03-.03l5.99-.48A.75 .75 0 0 0 9.66 8.61l2.31-5.59c.01-.02 .01-.02 .03-.02s.03 .01 .03 .02L14.34 8.61a.75 .75 0 0 0 .63 .46l5.99 .48c.01 0 .02 0 .03 .03S21 9.62 20.99 9.63Z\"],\"faded\":[0]},{\"id\":\"ph-star-four-duo\",\"label\":\"Twinkle duotone\",\"set\":\"duotone\",\"paths\":[\"M21.26 12.7l-6.28 2.28-2.28 6.28a.75 .75 0 0 1-1.41 0L9.02 14.98 2.74 12.7a.75 .75 0 0 1 0-1.41L9.02 9.02l2.28-6.28a.75 .75 0 0 1 1.41 0l2.28 6.28 6.28 2.28A.75 .75 0 0 1 21.26 12.7Z\",\"M21.52 10.59 15.57 8.43 13.41 2.48a1.5 1.5 0 0 0-2.81 0L8.43 8.43 2.48 10.59a1.5 1.5 0 0 0 0 2.81l5.95 2.16L10.59 21.52a1.5 1.5 0 0 0 2.81 0l2.16-5.95L21.52 13.41a1.5 1.5 0 0 0 0-2.81ZM14.73 14.28a.75 .75 0 0 0-.45 .45L12 20.99l-2.28-6.26a.75 .75 0 0 0-.45-.45L3.01 12l6.26-2.28a.75 .75 0 0 0 .45-.45L12 3.01l2.28 6.26a.75 .75 0 0 0 .45 .45L20.99 12Z\"],\"faded\":[0]},{\"id\":\"ph-sparkle-duo\",\"label\":\"Sparkle duotone\",\"set\":\"duotone\",\"paths\":[\"M18.26 14.2l-5.16 1.9-1.9 5.16a.74 .74 0 0 1-1.39 0l-1.9-5.16-5.16-1.9a.74 .74 0 0 1 0-1.39l5.16-1.9 1.9-5.16a.74 .74 0 0 1 1.39 0l1.9 5.16 5.16 1.9A.74 .74 0 0 1 18.26 14.2Z\",\"M18.52 12.1 13.69 10.31l-1.78-4.84a1.49 1.49 0 0 0-2.8 0L7.31 10.31l-4.84 1.78a1.49 1.49 0 0 0 0 2.8L7.31 16.69l1.78 4.84a1.49 1.49 0 0 0 2.8 0L13.69 16.69l4.84-1.78a1.49 1.49 0 0 0 0-2.8ZM12.84 15.4a.75 .75 0 0 0-.44 .44L10.5 20.99 8.6 15.84A.75 .75 0 0 0 8.16 15.4L3.01 13.5 8.16 11.6A.75 .75 0 0 0 8.6 11.16L10.5 6.01 12.4 11.16a.75 .75 0 0 0 .44 .44L17.99 13.5ZM13.5 3.75a.75 .75 0 0 1 .75-.75h1.5V1.5a.75 .75 0 0 1 1.5 0V3h1.5a.75 .75 0 0 1 0 1.5H17.25V6a.75 .75 0 0 1-1.5 0V4.5H14.25A.75 .75 0 0 1 13.5 3.75ZM23.25 8.25a.75 .75 0 0 1-.75 .75h-.75v.75a.75 .75 0 0 1-1.5 0V9h-.75a.75 .75 0 0 1 0-1.5h.75V6.75a.75 .75 0 0 1 1.5 0v.75h.75A.75 .75 0 0 1 23.25 8.25Z\"],\"faded\":[0]},{\"id\":\"ph-fire-duo\",\"label\":\"Fire duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 13.5a7.5 7.5 0 0 1-15 0c0-2.87 1.35-5.46 2.91-7.5l3.09 3 2.46-6.75C14.99 3.93 19.5 8.26 19.5 13.5Z\",\"M17.24 14.38a5.4 5.4 0 0 1-4.36 4.36A.82 .82 0 0 1 12.75 18.75a.75 .75 0 0 1-.12-1.49c1.55-.26 2.87-1.58 3.14-3.14a.75 .75 0 0 1 1.48 .25ZM20.25 13.5a8.25 8.25 0 0 1-16.5 0c0-2.62 1.03-5.29 3.06-7.95a.75 .75 0 0 1 1.12-.08l2.26 2.19 2.06-5.66a.75 .75 0 0 1 1.18-.32C15.49 3.38 20.25 7.93 20.25 13.5Zm-1.5 0c0-4.32-3.36-8.05-5.46-9.97L11.21 9.26a.75 .75 0 0 1-1.23 .28L7.51 7.14C6.01 9.3 5.25 11.44 5.25 13.5a6.75 6.75 0 0 0 13.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-lightning-duo\",\"label\":\"Bolt duotone\",\"set\":\"duotone\",\"paths\":[\"M9 22.5l1.5-7.5L4.5 12.75 15 1.5 13.5 9l6 2.25Z\",\"M20.23 11.08a.75 .75 0 0 0-.47-.53L14.36 8.52l1.37-6.87a.75 .75 0 0 0-1.28-.66l-10.5 11.25a.75 .75 0 0 0 .28 1.22l5.4 2.03L8.27 22.35a.75 .75 0 0 0 1.28 .66l10.5-11.25A.75 .75 0 0 0 20.23 11.08ZM10.25 20.06l.98-4.91a.75 .75 0 0 0-.47-.85L5.81 12.44l7.93-8.5L12.77 8.85a.75 .75 0 0 0 .47 .85l4.95 1.86Z\"],\"faded\":[0]},{\"id\":\"ph-crown-duo\",\"label\":\"Crown duotone\",\"set\":\"duotone\",\"paths\":[\"M20.32 9.35l-1.46 8.77a.75 .75 0 0 1-.74 .63H5.89a.75 .75 0 0 1-.74-.63L3.68 9.35l.01 0a1.86 1.86 0 0 0 .86-.39h0L8.25 13.5l3-6.9h0a1.88 1.88 0 0 0 1.49 0h0L15.75 13.5l3.69-4.54h0a1.86 1.86 0 0 0 .86 .39Z\",\"M23.25 7.5a2.63 2.63 0 1 0-4.79 1.48l-2.51 3.09L13.69 6.88a2.63 2.63 0 1 0-3.38 0L8.05 12.07l-2.51-3.09a2.63 2.63 0 1 0-2.49 1.13L4.41 18.25A1.5 1.5 0 0 0 5.89 19.5H18.11A1.5 1.5 0 0 0 19.59 18.25l1.36-8.14A2.63 2.63 0 0 0 23.25 7.5ZM12 3.75a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 12 3.75ZM2.25 7.5A1.13 1.13 0 1 1 3.38 8.63 1.13 1.13 0 0 1 2.25 7.5ZM18.11 18H5.89L4.58 10.17 7.67 13.97A.75 .75 0 0 0 8.25 14.25a.73 .73 0 0 0 .1-.01 .75 .75 0 0 0 .59-.44l2.75-6.32a2.53 2.53 0 0 0 .63 0l2.75 6.32a.75 .75 0 0 0 .59 .44A.73 .73 0 0 0 15.75 14.25a.75 .75 0 0 0 .58-.28l3.09-3.8ZM20.63 8.63a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 20.63 8.63Z\"],\"faded\":[0]},{\"id\":\"ph-crown-simple-duo\",\"label\":\"Crown simple duotone\",\"set\":\"duotone\",\"paths\":[\"M21.74 8.38l-2.13 9.75a.75 .75 0 0 1-.74 .62H5.13a.75 .75 0 0 1-.74-.62l-2.13-9.75A.75 .75 0 0 1 3.56 7.76L7.5 12l3.82-8.56a.75 .75 0 0 1 1.36 0L16.5 12l3.94-4.24A.75 .75 0 0 1 21.74 8.38Z\",\"M21.65 6.9A1.49 1.49 0 0 0 19.88 7.26l-3.16 3.4-3.36-7.53a.09 .09 0 0 1 0-.01 1.5 1.5 0 0 0-2.72 0 .09 .09 0 0 1 0 .01l-3.36 7.53L4.13 7.26A1.5 1.5 0 0 0 1.52 8.51c0 .01 0 .02 .01 .03L3.66 18.28a1.5 1.5 0 0 0 1.47 1.22H18.87A1.5 1.5 0 0 0 20.34 18.28L22.47 8.54c0-.01 0-.02 .01-.03A1.49 1.49 0 0 0 21.65 6.9ZM18.88 17.97l-.01 .03H5.13l-.01-.03L3 8.25l.01 .02 3.94 4.24a.75 .75 0 0 0 1.24-.2L12 3.75l3.81 8.55a.75 .75 0 0 0 1.24 .2l3.94-4.24L21 8.25Z\"],\"faded\":[0]},{\"id\":\"ph-trophy-duo\",\"label\":\"Trophy duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 4.5v5.92c0 3.72-2.98 6.81-6.7 6.83A6.75 6.75 0 0 1 5.25 10.5V4.5Z\",\"M21.75 6H19.5V4.5a.75 .75 0 0 0-.75-.75H5.25a.75 .75 0 0 0-.75 .75V6H2.25A1.5 1.5 0 0 0 .75 7.5V9a3.75 3.75 0 0 0 3.75 3.75h.34A7.51 7.51 0 0 0 11.25 17.96V20.25H9a.75 .75 0 0 0 0 1.5h6a.75 .75 0 0 0 0-1.5H12.75V17.96c2.99-.3 5.48-2.4 6.38-5.21H19.5a3.75 3.75 0 0 0 3.75-3.75V7.5A1.5 1.5 0 0 0 21.75 6ZM4.5 11.25A2.25 2.25 0 0 1 2.25 9V7.5H4.5v3q0 .38 .04 .75Zm13.5-.83c0 3.33-2.72 6.06-6 6.08a6 6 0 0 1-6-6V5.25H18ZM21.75 9a2.25 2.25 0 0 1-2.25 2.25h-.05a7.67 7.67 0 0 0 .05-.83V7.5h2.25Z\"],\"faded\":[0]},{\"id\":\"ph-medal-duo\",\"label\":\"Medal duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 9a4.5 4.5 0 1 1-4.5-4.5A4.5 4.5 0 0 1 16.5 9Z\",\"M20.25 9A8.25 8.25 0 1 0 6.75 15.36V22.5a.75 .75 0 0 0 1.09 .67L12 21.09l4.17 2.08A.76 .76 0 0 0 16.5 23.25a.75 .75 0 0 0 .75-.75V15.36A8.24 8.24 0 0 0 20.25 9ZM5.25 9a6.75 6.75 0 1 1 6.75 6.75A6.76 6.76 0 0 1 5.25 9ZM15.75 21.29l-3.42-1.71a.75 .75 0 0 0-.67 0L8.25 21.29V16.35a8.24 8.24 0 0 0 7.5 0ZM12 14.25A5.25 5.25 0 1 0 6.75 9 5.26 5.26 0 0 0 12 14.25Zm0-9A3.75 3.75 0 1 1 8.25 9 3.75 3.75 0 0 1 12 5.25Z\"],\"faded\":[0]},{\"id\":\"ph-medal-military-duo\",\"label\":\"Military medal duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 18a3.75 3.75 0 1 1-3.75-3.75A3.75 3.75 0 0 1 15.75 18ZM19.41 4.5H15.75v8.05l4.01-1.82a.84 .84 0 0 0 .5-.77V5.34A.84 .84 0 0 0 19.41 4.5ZM8.25 4.5H4.59a.84 .84 0 0 0-.84 .84v4.61a.84 .84 0 0 0 .5 .77L8.25 12.55Z\",\"M19.41 3.75H4.59A1.59 1.59 0 0 0 3 5.34v4.61a1.59 1.59 0 0 0 .94 1.45l5.87 2.67a4.5 4.5 0 1 0 4.4 0L20.06 11.41a1.59 1.59 0 0 0 .94-1.45V5.34A1.59 1.59 0 0 0 19.41 3.75ZM15 5.25v6.81l-3 1.36L9 12.06V5.25ZM4.5 9.96V5.34a.09 .09 0 0 1 .09-.09H7.5v6.13L4.56 10.04A.09 .09 0 0 1 4.5 9.96ZM12 21a3 3 0 1 1 3-3A3 3 0 0 1 12 21Zm7.5-11.04a.09 .09 0 0 1-.06 .09L16.5 11.38V5.25h2.91a.09 .09 0 0 1 .09 .09Z\"],\"faded\":[0]},{\"id\":\"ph-diamond-duo\",\"label\":\"Diamond duotone\",\"set\":\"duotone\",\"paths\":[\"M21.53 12.53l-9 9a.74 .74 0 0 1-1.05 0l-9-9a.74 .74 0 0 1 0-1.05l9-9a.74 .74 0 0 1 1.05 0l9 9A.74 .74 0 0 1 21.53 12.53Z\",\"M22.06 10.94 13.06 1.94a1.5 1.5 0 0 0-2.11 0l-9 9.01a1.5 1.5 0 0 0 0 2.11l9 9.01h0a1.5 1.5 0 0 0 2.11 0l9-9.01a1.5 1.5 0 0 0 0-2.11ZM12 21h0L3 12 12 3 21 12Z\"],\"faded\":[0]},{\"id\":\"ph-diamonds-four-duo\",\"label\":\"Diamonds duotone\",\"set\":\"duotone\",\"paths\":[\"M12 9.75 8.25 6l3.75-3.75 3.75 3.75ZM8.25 18l3.75 3.75 3.75-3.75-3.75-3.75ZM18 8.25l-3.75 3.75 3.75 3.75 3.75-3.75ZM6 8.25 2.25 12l3.75 3.75 3.75-3.75Z\",\"M11.47 10.28a.75 .75 0 0 0 1.06 0l3.75-3.75a.75 .75 0 0 0 0-1.06l-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06ZM12 3.31 14.69 6 12 8.69 9.31 6Zm.53 10.41a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75a.75 .75 0 0 0 0-1.06ZM12 20.69 9.31 18 12 15.31 14.69 18Zm10.28-9.22-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75A.75 .75 0 0 0 22.28 11.47ZM18 14.69 15.31 12 18 9.31 20.69 12Zm-7.72-3.22-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75a.75 .75 0 0 0 0 1.06l3.75 3.75a.75 .75 0 0 0 1.06 0l3.75-3.75A.75 .75 0 0 0 10.28 11.47ZM6 14.69 3.31 12 6 9.31 8.69 12Z\"],\"faded\":[0]},{\"id\":\"ph-gift-duo\",\"label\":\"Gift duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 12v6.75a.75 .75 0 0 1-.75 .75H5.25a.75 .75 0 0 1-.75-.75V12Z\",\"M20.25 6.75H16.96c.04-.03 .07-.06 .11-.09A2.77 2.77 0 0 0 18 4.65 3.06 3.06 0 0 0 14.85 1.5 2.77 2.77 0 0 0 12.84 2.43a5.15 5.15 0 0 0-.84 1.36 5.15 5.15 0 0 0-.84-1.36A2.77 2.77 0 0 0 9.15 1.5 3.06 3.06 0 0 0 6 4.65 2.77 2.77 0 0 0 6.93 6.66c.04 .03 .07 .06 .11 .09H3.75A1.5 1.5 0 0 0 2.25 8.25v3a1.5 1.5 0 0 0 1.5 1.5v6a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V12.75a1.5 1.5 0 0 0 1.5-1.5V8.25A1.5 1.5 0 0 0 20.25 6.75ZM13.97 3.42a1.28 1.28 0 0 1 .94-.42h.05A1.56 1.56 0 0 1 16.5 4.6a1.28 1.28 0 0 1-.42 .94c-.89 .79-2.37 1.07-3.28 1.16C12.91 5.71 13.22 4.27 13.97 3.42Zm-6.01 .03A1.56 1.56 0 0 1 9.06 3h.05a1.28 1.28 0 0 1 .94 .42c.79 .89 1.06 2.36 1.16 3.27-.91-.09-2.39-.37-3.27-1.16a1.28 1.28 0 0 1-.42-.94A1.56 1.56 0 0 1 7.96 3.46ZM3.75 8.25h7.5v3H3.75Zm1.5 4.5h6v6H5.25Zm13.5 6H12.75V12.75h6Zm1.5-7.5H12.75V8.25h7.5v3Z\"],\"faded\":[0]},{\"id\":\"ph-confetti-duo\",\"label\":\"Party duotone\",\"set\":\"duotone\",\"paths\":[\"M5.52 14.52l3.96 3.96-4.75 1.73a.73 .73 0 0 1-.94-.94Zm13.01-.44L9.92 5.46A.73 .73 0 0 0 8.72 5.73l-1.4 3.84 7.11 7.11 3.84-1.4A.73 .73 0 0 0 18.54 14.08Z\",\"M10.45 4.93a1.48 1.48 0 0 0-2.44 .54L3.09 19.01A1.48 1.48 0 0 0 4.48 21a1.5 1.5 0 0 0 .51-.09l13.53-4.92a1.48 1.48 0 0 0 .54-2.44Zm-.78 12.68-3.28-3.28 1.23-3.39 5.44 5.44Zm-5.16 1.88 1.31-3.6 2.29 2.29ZM14.63 15.81 8.19 9.38l1.22-3.36 8.57 8.57ZM15 6.75a3.54 3.54 0 0 1 .36-1.46C15.86 4.3 16.79 3.75 18 3.75c.63 0 1.03-.21 1.28-.68A2.06 2.06 0 0 0 19.5 2.24 .75 .75 0 0 1 21 2.25c0 1.21-.8 3-3 3-.63 0-1.03 .21-1.28 .68A2.06 2.06 0 0 0 16.5 6.76 .75 .75 0 0 1 15 6.75ZM12.75 3.75V1.5a.75 .75 0 0 1 1.5 0V3.75a.75 .75 0 0 1-1.5 0Zm9.53 7.72a.75 .75 0 1 1-1.06 1.06l-1.5-1.5a.75 .75 0 0 1 1.06-1.06Zm.46-4.01-2.25 .75a.75 .75 0 0 1-.47-1.42l2.25-.75a.75 .75 0 0 1 .47 1.42Z\"],\"faded\":[0]},{\"id\":\"ph-smiley-duo\",\"label\":\"Smile duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25ZM7.5 10.13a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 7.5 10.13Zm9 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 10.13Zm-.1 4.5c-.96 1.67-2.57 2.63-4.4 2.63s-3.43-.96-4.4-2.62a.75 .75 0 1 1 1.3-.75c.7 1.21 1.8 1.88 3.1 1.88s2.4-.67 3.1-1.87a.75 .75 0 1 1 1.3 .75Z\"],\"faded\":[0]},{\"id\":\"ph-smiley-wink-duo\",\"label\":\"Wink duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25ZM7.5 10.13a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 7.5 10.13Zm9.75 0a.75 .75 0 0 1-.75 .75H14.25a.75 .75 0 0 1 0-1.5h2.25A.75 .75 0 0 1 17.25 10.13Zm-.85 4.5c-.96 1.67-2.57 2.63-4.4 2.63s-3.43-.96-4.4-2.62a.75 .75 0 1 1 1.3-.75c.7 1.21 1.8 1.88 3.1 1.88s2.4-.67 3.1-1.87a.75 .75 0 1 1 1.3 .75Z\"],\"faded\":[0]},{\"id\":\"ph-smiley-sad-duo\",\"label\":\"Sad duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25ZM7.5 10.13a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 7.5 10.13Zm9 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 10.13Zm-.1 6a.75 .75 0 1 1-1.3 .75c-.7-1.21-1.8-1.87-3.1-1.87s-2.4 .67-3.1 1.88a.75 .75 0 1 1-1.3-.75c.96-1.67 2.57-2.62 4.4-2.62S15.43 14.46 16.4 16.13Z\"],\"faded\":[0]},{\"id\":\"ph-smiley-angry-duo\",\"label\":\"Angry duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M8.63 14.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 8.63 14.25Zm6.75-2.25a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 15.38 12Zm6.38 0A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12ZM16.08 7.63 12 10.35l-4.08-2.72a.75 .75 0 1 0-.83 1.25l4.5 3a.75 .75 0 0 0 .83 0l4.5-3a.75 .75 0 0 0-.83-1.25Zm-1.42 9C13.88 16.1 13.12 15.75 12 15.75s-1.87 .35-2.67 .88a.75 .75 0 0 0 .83 1.25C10.77 17.47 11.25 17.25 12 17.25s1.23 .22 1.83 .62a.75 .75 0 1 0 .83-1.25Z\"],\"faded\":[0]},{\"id\":\"ph-smiley-x-eyes-duo\",\"label\":\"Dizzy duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm5.78-8.78a.75 .75 0 0 1-1.06 1.06L15.75 11.56l-.97 .97a.75 .75 0 0 1-1.06-1.06L14.69 10.5l-.97-.97a.75 .75 0 0 1 1.06-1.06L15.75 9.44l.97-.97a.75 .75 0 0 1 1.06 1.06L16.81 10.5Zm-7.5-1.94L9.31 10.5l.97 .97a.75 .75 0 0 1-1.06 1.06L8.25 11.56 7.28 12.53a.75 .75 0 0 1-1.06-1.06L7.19 10.5 6.22 9.53A.75 .75 0 0 1 7.28 8.47L8.25 9.44 9.22 8.47a.75 .75 0 0 1 1.06 1.06ZM13.13 16.88a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 16.88Z\"],\"faded\":[0]},{\"id\":\"ph-skull-duo\",\"label\":\"Skull duotone\",\"set\":\"duotone\",\"paths\":[\"M12 2.25c-4.97 0-9 3.86-9 8.63 0 3.19 1.81 5.98 4.5 7.47V20.25a.75 .75 0 0 0 .75 .75h7.5a.75 .75 0 0 0 .75-.75V18.35c2.69-1.49 4.5-4.28 4.5-7.47C21 6.11 16.97 2.25 12 2.25ZM8.63 14.25a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 8.63 14.25Zm6.75 0a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 15.38 14.25Z\",\"M8.63 9.75a2.63 2.63 0 1 0 2.63 2.63A2.63 2.63 0 0 0 8.63 9.75Zm0 3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 8.63 13.5Zm6.75-3.75a2.63 2.63 0 1 0 2.63 2.63A2.63 2.63 0 0 0 15.38 9.75Zm0 3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 15.38 13.5ZM12 1.5C6.62 1.5 2.25 5.71 2.25 10.88c0 3.2 1.71 6.19 4.5 7.9V20.25a1.5 1.5 0 0 0 1.5 1.5h7.5a1.5 1.5 0 0 0 1.5-1.5V18.78C20.04 17.06 21.75 14.07 21.75 10.88 21.75 5.71 17.38 1.5 12 1.5Zm4.14 16.19a.75 .75 0 0 0-.39 .66V20.25H14.25V18a.75 .75 0 0 0-1.5 0v2.25H11.25V18a.75 .75 0 0 0-1.5 0v2.25H8.25V18.35a.75 .75 0 0 0-.39-.66C5.33 16.28 3.75 13.67 3.75 10.88c0-4.34 3.7-7.87 8.25-7.87s8.25 3.53 8.25 7.88C20.25 13.67 18.67 16.28 16.14 17.69Z\"],\"faded\":[0]},{\"id\":\"ph-ghost-duo\",\"label\":\"Ghost duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 11.25v9l-2.75-2.25-2.75 2.25L12 18 9.25 20.25 6.5 18 3.75 20.25V11.25a8.25 8.25 0 0 1 16.5 0Z\",\"M10.5 10.88a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 10.5 10.88Zm4.13-1.12a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 14.63 9.75Zm6.38 1.5v9a.75 .75 0 0 1-1.23 .58l-2.27-1.86L15.23 20.83a.75 .75 0 0 1-.95 0L12 18.97l-2.28 1.86a.75 .75 0 0 1-.95 0L6.5 18.97 4.23 20.83A.75 .75 0 0 1 3 20.25V11.25a9 9 0 0 1 18 0Zm-1.5 0a7.5 7.5 0 0 0-15 0v7.42l1.53-1.25a.75 .75 0 0 1 .95 0l2.28 1.86 2.27-1.86a.75 .75 0 0 1 .95 0l2.27 1.86 2.28-1.86a.75 .75 0 0 1 .95 0L19.5 18.67Z\"],\"faded\":[0]},{\"id\":\"ph-hand-waving-duo\",\"label\":\"Wave duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 19.99A7.5 7.5 0 0 1 7 17.25l-3.75-6.5a1.88 1.88 0 0 1 3.25-1.87L5.16 6.56A1.88 1.88 0 0 1 8.41 4.69l.65 1.13h0a1.88 1.88 0 0 1 3.25-1.87l2.81 4.88A1.88 1.88 0 0 1 18.38 6.94l1.62 2.81A7.5 7.5 0 0 1 17.25 19.99Z\",\"M20.64 9.38 19.02 6.56a2.63 2.63 0 0 0-3.58-.96 2.6 2.6 0 0 0-.84 .78L12.96 3.56a2.63 2.63 0 0 0-4.54 0A2.63 2.63 0 0 0 4.51 6.94l.15 .26A2.59 2.59 0 0 0 3.56 7.54a2.63 2.63 0 0 0-.96 3.59l3.75 6.5a8.2 8.2 0 0 0 5.01 3.84 8.3 8.3 0 0 0 2.15 .28 8.25 8.25 0 0 0 7.13-12.37Zm-.62 5.87A6.75 6.75 0 0 1 7.65 16.88l-3.75-6.5a1.13 1.13 0 0 1 1.95-1.12L7.65 12.38a.75 .75 0 1 0 1.3-.75L5.81 6.19A1.13 1.13 0 1 1 7.76 5.06L10.69 10.13a.75 .75 0 1 0 1.3-.75L9.71 5.44h0a1.13 1.13 0 1 1 1.95-1.12l3.13 5.43a4.5 4.5 0 0 0-.52 5.68 .75 .75 0 0 0 1.24-.84A3 3 0 0 1 16.2 10.5a.75 .75 0 0 0 .2-.98L15.77 8.44A1.13 1.13 0 1 1 17.72 7.31l1.62 2.81A6.71 6.71 0 0 1 20.02 15.25ZM17.27 2.97A.75 .75 0 0 1 18.19 2.44a5.59 5.59 0 0 1 3.42 2.63l.03 .05a.75 .75 0 1 1-1.3 .75l-.03-.05a4.09 4.09 0 0 0-2.51-1.92A.75 .75 0 0 1 17.27 2.97ZM7.58 22.22a.75 .75 0 0 1-1.05 .12A11.21 11.21 0 0 1 3.76 19.13a.75 .75 0 0 1 1.3-.75 9.72 9.72 0 0 0 2.4 2.79A.75 .75 0 0 1 7.58 22.22Z\"],\"faded\":[0]},{\"id\":\"ph-hand-heart-duo\",\"label\":\"Hand heart duotone\",\"set\":\"duotone\",\"paths\":[\"M1.5 14.25H4.5v5.25H1.5a.75 .75 0 0 1-.75-.75V15A.75 .75 0 0 1 1.5 14.25ZM18.05 3.75A3.67 3.67 0 0 0 14.63 6a3.67 3.67 0 0 0-3.43-2.25C9.16 3.75 7.5 5.47 7.5 7.5c0 1.37 .66 2.6 1.57 3.75H13.13a1.88 1.88 0 0 1 0 3.75h.38l3.54-.81C19.11 12.66 21.75 10.24 21.75 7.5 21.75 5.47 20.09 3.75 18.05 3.75Z\",\"M21.59 13.22a2.28 2.28 0 0 0-1.74-.45C21.61 11 22.5 9.23 22.5 7.5c0-2.48-2-4.5-4.45-4.5A4.46 4.46 0 0 0 14.63 4.57 4.46 4.46 0 0 0 11.2 3C8.75 3 6.75 5.02 6.75 7.5c0 1.03 .3 2.03 .94 3.09a2.99 2.99 0 0 0-1.38 .79L4.19 13.5H1.5A1.5 1.5 0 0 0 0 15v3.75a1.5 1.5 0 0 0 1.5 1.5H11.25a.74 .74 0 0 0 .18-.02l6-1.5a.65 .65 0 0 0 .11-.04L21.19 17.14l.04-.02a2.31 2.31 0 0 0 .37-3.9ZM11.2 4.5A2.92 2.92 0 0 1 13.93 6.28a.75 .75 0 0 0 1.39 0 2.92 2.92 0 0 1 2.73-1.78C19.65 4.5 21 5.87 21 7.5c0 1.83-1.48 3.9-4.28 5.99l-1.04 .24A2.63 2.63 0 0 0 13.13 10.5H9.44C8.63 9.41 8.25 8.45 8.25 7.5 8.25 5.87 9.6 4.5 11.2 4.5ZM1.5 15H3.75v3.75H1.5Zm19.07 .77-3.56 1.52L11.16 18.75H5.25V14.56l2.12-2.12A1.49 1.49 0 0 1 8.43 12H13.13a1.13 1.13 0 0 1 0 2.25H10.5a.75 .75 0 0 0 0 1.5h3a.78 .78 0 0 0 .17-.02l6.28-1.44 .03-.01a.81 .81 0 0 1 .59 1.49Z\"],\"faded\":[0]},{\"id\":\"ph-handshake-duo\",\"label\":\"Handshake duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 14.25l-3.75 3.75L9 16.5 3.75 12.75 6.81 6.62 12 5.25l5.19 1.37L17.21 6.75H13.5L9.22 10.9a.75 .75 0 0 0 .13 1.16C10.99 13.12 13.22 13.04 15 11.25Z\",\"M23.84 10.12 21.45 5.33a1.5 1.5 0 0 0-2.01-.67L17.1 5.82 12.19 4.53a.76 .76 0 0 0-.38 0L6.9 5.82 4.56 4.66a1.5 1.5 0 0 0-2.01 .67L.16 10.12a1.5 1.5 0 0 0 .67 2.01l2.53 1.27 5.2 3.72a.76 .76 0 0 0 .25 .12l6 1.5a.75 .75 0 0 0 .71-.2l5.16-5.16 2.48-1.24a1.5 1.5 0 0 0 .67-2.01Zm-5.15 3.13L15.47 10.66a.75 .75 0 0 0-1 .06C12.8 12.4 10.94 12.19 9.75 11.44L13.8 7.5h2.98l2.55 5.1ZM3.89 6 5.81 6.96 3.42 11.74 1.5 10.79Zm10.88 11.17L9.32 15.81l-4.61-3.29 2.63-5.25L12 6.03l.92 .24-4.22 4.1-.01 .01a1.5 1.5 0 0 0 .26 2.33c1.93 1.23 4.25 1.03 6.09-.47L17.63 14.31Zm5.81-5.43-2.39-4.78L20.11 6 22.5 10.79Zm-8.23 8.69a.75 .75 0 0 1-.73 .57 .76 .76 0 0 1-.18-.02L7.54 20a.74 .74 0 0 1-.25-.12L4.81 18.12a.75 .75 0 0 1 .87-1.22l2.35 1.68L11.81 19.52A.75 .75 0 0 1 12.36 20.43Z\"],\"faded\":[0]},{\"id\":\"ph-hands-clapping-duo\",\"label\":\"Clap duotone\",\"set\":\"duotone\",\"paths\":[\"M18.66 17.6h0A6.72 6.72 0 0 0 17.84 13.13l-1.89-3.28a1.69 1.69 0 0 0-2.96 1.62L10.75 7.59A1.69 1.69 0 1 0 7.83 9.28L7.29 8.34 6.1 6.28A1.69 1.69 0 1 1 9.03 4.59L9.56 5.53a1.69 1.69 0 1 1 2.92-1.69l2.27 3.94a1.69 1.69 0 0 1 2.93-1.69l1.98 3.43A6.75 6.75 0 0 1 18.66 17.6Z\",\"M15.02 2.25V.75a.75 .75 0 0 1 1.5 0V2.25a.75 .75 0 0 1-1.5 0ZM18.38 3.84a.74 .74 0 0 0 .39 .11 .75 .75 0 0 0 .64-.36l.75-1.23a.75 .75 0 0 0-1.28-.78l-.75 1.23A.75 .75 0 0 0 18.38 3.84Zm4.45 1.18a.75 .75 0 0 0-.94-.48l-1.41 .45a.75 .75 0 0 0 .23 1.46 .76 .76 0 0 0 .23-.04l1.41-.45A.75 .75 0 0 0 22.84 5.02ZM20.34 9.15a7.52 7.52 0 0 1-.96 8.81c-.03 .16-.07 .32-.11 .49A7.52 7.52 0 0 1 5.51 20.25L2.2 14.53a2.44 2.44 0 0 1 1.8-3.64l-.28-.49a2.44 2.44 0 0 1 1.8-3.64L5.46 6.66A2.44 2.44 0 0 1 8.95 3.42 2.44 2.44 0 0 1 13.15 3.47l1.15 1.99A2.44 2.44 0 0 1 18.36 5.72ZM10.23 5.16l0 0h0l2.34 4.05a2.44 2.44 0 0 1 1.62-.94L11.85 4.22a.94 .94 0 1 0-1.63 .94ZM6.76 5.91l.61 1.05a2.44 2.44 0 0 1 1.62-.94L8.39 4.97A.94 .94 0 1 0 6.76 5.91Zm10.46 7.59-1.9-3.28a.94 .94 0 0 0-1.66 .87L14.84 13.13a.75 .75 0 0 1-1.3 .75l-3.42-5.91A.94 .94 0 1 0 8.49 8.91l2.44 4.22a.75 .75 0 0 1-1.3 .75L6.66 8.72h0l0 0a.94 .94 0 0 0-1.62 .94l3.3 5.72A.75 .75 0 0 1 7.03 16.13L5.13 12.84a.94 .94 0 0 0-1.63 .94l3.31 5.72a6.01 6.01 0 0 0 11.01-1.45A5.96 5.96 0 0 0 17.22 13.5Zm1.82-3.6L17.06 6.47A.94 .94 0 0 0 15.43 7.41l3.09 5.35A7.52 7.52 0 0 1 19.41 15.14 6.02 6.02 0 0 0 19.04 9.9Z\"],\"faded\":[0]},{\"id\":\"ph-hand-pointing-duo\",\"label\":\"Point duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 10.88v3.38a7.5 7.5 0 0 1-7.5 7.5c-4.14 0-5.23-2.25-8.75-8.44a1.88 1.88 0 0 1 3.25-1.87L9 14.25V4.13a1.88 1.88 0 0 1 3.75 0v5.25a1.88 1.88 0 0 1 3.75 0v1.5a1.88 1.88 0 0 1 3.75 0Z\",\"M18.38 8.25a2.61 2.61 0 0 0-1.25 .32A2.63 2.63 0 0 0 13.5 7V4.13a2.63 2.63 0 0 0-5.25 0v7.5l-.36-.57A2.63 2.63 0 0 0 3.35 13.69l.44 .77C7.01 20.15 8.35 22.5 12.75 22.5a8.26 8.26 0 0 0 8.25-8.25V10.88A2.63 2.63 0 0 0 18.38 8.25Zm1.13 6a6.76 6.76 0 0 1-6.75 6.75c-3.53 0-4.49-1.69-7.66-7.28l-.44-.78 0 0A1.13 1.13 0 0 1 5.06 11.4a1.11 1.11 0 0 1 .56-.15 1.13 1.13 0 0 1 .98 .56 .17 .17 0 0 0 .01 .02l1.75 2.81A.75 .75 0 0 0 9.75 14.25V4.13a1.13 1.13 0 0 1 2.25 0v6.38a.75 .75 0 0 0 1.5 0V9.38a1.13 1.13 0 0 1 2.25 0v1.88a.75 .75 0 0 0 1.5 0v-.37a1.13 1.13 0 0 1 2.25 0Z\"],\"faded\":[0]},{\"id\":\"ph-user-duo\",\"label\":\"User duotone\",\"set\":\"duotone\",\"paths\":[\"M18 9a6 6 0 1 1-6-6A6 6 0 0 1 18 9Z\",\"M21.65 19.88c-1.43-2.47-3.63-4.24-6.2-5.08a6.75 6.75 0 1 0-6.91 0C5.98 15.64 3.78 17.41 2.35 19.88a.75 .75 0 1 0 1.3 .75c1.77-3.05 4.89-4.87 8.35-4.87s6.58 1.82 8.35 4.88a.75 .75 0 1 0 1.3-.75ZM6.75 9a5.25 5.25 0 1 1 5.25 5.25A5.26 5.26 0 0 1 6.75 9Z\"],\"faded\":[0]},{\"id\":\"ph-users-duo\",\"label\":\"Users duotone\",\"set\":\"duotone\",\"paths\":[\"M12.75 10.13A4.88 4.88 0 1 1 7.88 5.25 4.88 4.88 0 0 1 12.75 10.13Z\",\"M10.99 14.81a5.63 5.63 0 1 0-6.23 0A8.98 8.98 0 0 0 .33 18.34a.75 .75 0 1 0 1.26 .82 7.5 7.5 0 0 1 12.58 0 .75 .75 0 0 0 1.26-.82A8.98 8.98 0 0 0 10.99 14.81ZM3.75 10.13a4.13 4.13 0 1 1 4.13 4.13A4.13 4.13 0 0 1 3.75 10.13Zm19.7 9.25a.75 .75 0 0 1-1.04-.22A7.48 7.48 0 0 0 16.13 15.75a.75 .75 0 0 1 0-1.5 4.13 4.13 0 1 0-1.53-7.96 .75 .75 0 1 1-.56-1.39 5.63 5.63 0 0 1 5.21 9.9 8.98 8.98 0 0 1 4.43 3.54A.75 .75 0 0 1 23.45 19.38Z\"],\"faded\":[0]},{\"id\":\"ph-user-plus-duo\",\"label\":\"Add user duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 9.38a5.63 5.63 0 1 1-5.62-5.62A5.63 5.63 0 0 1 15.75 9.38Z\",\"M24 12.75a.75 .75 0 0 1-.75 .75H21.75v1.5a.75 .75 0 0 1-1.5 0V13.5H18.75a.75 .75 0 0 1 0-1.5h1.5V10.5a.75 .75 0 0 1 1.5 0v1.5h1.5A.75 .75 0 0 1 24 12.75Zm-5.43 5.52a.75 .75 0 0 1-1.15 .97C15.54 16.99 12.95 15.75 10.13 15.75s-5.41 1.24-7.3 3.48a.75 .75 0 0 1-1.15-.97c1.4-1.67 3.14-2.85 5.08-3.48a6.38 6.38 0 1 1 6.74 0C15.43 15.42 17.17 16.6 18.57 18.27ZM10.13 14.25a4.88 4.88 0 1 0-4.87-4.87A4.88 4.88 0 0 0 10.13 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-user-minus-duo\",\"label\":\"Remove user duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 9.38a5.63 5.63 0 1 1-5.62-5.62A5.63 5.63 0 0 1 15.75 9.38Z\",\"M24 12.75a.75 .75 0 0 1-.75 .75H18.75a.75 .75 0 0 1 0-1.5h4.5A.75 .75 0 0 1 24 12.75Zm-5.43 5.52a.75 .75 0 0 1-1.15 .97C15.54 16.99 12.95 15.75 10.13 15.75s-5.41 1.24-7.3 3.48a.75 .75 0 0 1-1.15-.97c1.4-1.67 3.14-2.85 5.08-3.48a6.38 6.38 0 1 1 6.74 0C15.43 15.42 17.17 16.6 18.57 18.27ZM10.13 14.25a4.88 4.88 0 1 0-4.87-4.87A4.88 4.88 0 0 0 10.13 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-user-check-duo\",\"label\":\"Verified user duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 9.38a5.63 5.63 0 1 1-5.62-5.62A5.63 5.63 0 0 1 15.75 9.38Z\",\"M13.5 14.78a6.38 6.38 0 1 0-6.74 0c-1.94 .63-3.68 1.82-5.08 3.48a.75 .75 0 0 0 1.15 .97C4.71 16.99 7.3 15.75 10.13 15.75s5.41 1.24 7.3 3.48a.75 .75 0 0 0 1.15-.97C17.17 16.6 15.43 15.42 13.5 14.78ZM5.25 9.38a4.88 4.88 0 1 1 4.88 4.88A4.88 4.88 0 0 1 5.25 9.38Zm18.53 3.16-3 3a.75 .75 0 0 1-1.06 0l-1.5-1.5a.75 .75 0 0 1 1.06-1.06L20.25 13.94l2.47-2.47a.75 .75 0 0 1 1.06 1.06Z\"],\"faded\":[0]},{\"id\":\"ph-identification-badge-duo\",\"label\":\"ID badge duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 3H5.25a.75 .75 0 0 0-.75 .75V20.25a.75 .75 0 0 0 .75 .75H18.75a.75 .75 0 0 0 .75-.75V3.75A.75 .75 0 0 0 18.75 3ZM12 15.75a3 3 0 1 1 3-3A3 3 0 0 1 12 15.75Z\",\"M7.05 18.6a.75 .75 0 0 0 1.05-.15 4.88 4.88 0 0 1 7.8 0 .75 .75 0 1 0 1.2-.9A6.36 6.36 0 0 0 14.53 15.52a3.75 3.75 0 1 0-5.06 0A6.36 6.36 0 0 0 6.9 17.55 .75 .75 0 0 0 7.05 18.6ZM12 10.5a2.25 2.25 0 1 1-2.25 2.25A2.25 2.25 0 0 1 12 10.5Zm6.75-8.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V3.75A1.5 1.5 0 0 0 18.75 2.25Zm0 18H5.25V3.75H18.75ZM8.25 6a.75 .75 0 0 1 .75-.75h6a.75 .75 0 0 1 0 1.5H9A.75 .75 0 0 1 8.25 6Z\"],\"faded\":[0]},{\"id\":\"ph-megaphone-duo\",\"label\":\"Announcement duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 11.25a3.75 3.75 0 0 1-3.75 3.75H15V7.5h3.75A3.75 3.75 0 0 1 22.5 11.25Z\",\"M23.25 11.25a4.5 4.5 0 0 0-4.5-4.5H15.02c-.27-.02-5.03-.35-9.55-4.15A1.5 1.5 0 0 0 3 3.75V18.75a1.5 1.5 0 0 0 2.46 1.15c3.54-2.97 7.22-3.82 8.79-4.06v2.97A1.5 1.5 0 0 0 14.92 20.06l1.03 .69A1.5 1.5 0 0 0 18.23 19.88l1.1-4.16A4.51 4.51 0 0 0 23.25 11.25ZM4.5 18.74V3.75h0c4.01 3.37 8.12 4.22 9.75 4.43v6.14C12.62 14.53 8.52 15.38 4.5 18.74Zm12.28 .75 0 .01-1.03-.69V15.75h2.03ZM18.75 14.25H15.75V8.25h3a3 3 0 1 1 0 6Z\"],\"faded\":[0]},{\"id\":\"ph-bell-duo\",\"label\":\"Bell duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 18H4.5a.75 .75 0 0 1-.64-1.12C4.47 15.81 5.25 13.11 5.25 9.75a6.75 6.75 0 0 1 13.5 0c0 3.36 .78 6.06 1.4 7.13A.75 .75 0 0 1 19.5 18Z\",\"M20.79 16.49C20.27 15.6 19.5 13.06 19.5 9.75a7.5 7.5 0 1 0-15 0c0 3.31-.77 5.85-1.29 6.74A1.5 1.5 0 0 0 4.5 18.75H8.33a3.75 3.75 0 0 0 7.35 0H19.5a1.5 1.5 0 0 0 1.29-2.26ZM12 20.25a2.25 2.25 0 0 1-2.12-1.5h4.24A2.25 2.25 0 0 1 12 20.25ZM4.5 17.25c.72-1.24 1.5-4.12 1.5-7.5a6 6 0 1 1 12 0c0 3.38 .78 6.26 1.5 7.5Z\"],\"faded\":[0]},{\"id\":\"ph-bell-ringing-duo\",\"label\":\"Ping duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 18H4.5a.75 .75 0 0 1-.64-1.12C4.47 15.81 5.25 13.86 5.25 10.5a6.75 6.75 0 0 1 13.5 0c0 3.36 .78 5.31 1.4 6.38A.75 .75 0 0 1 19.5 18Z\",\"M21 6.67a.75 .75 0 0 1-1.01-.32 8.82 8.82 0 0 0-3.14-3.46 .75 .75 0 1 1 .8-1.27 10.45 10.45 0 0 1 3.67 4.04A.75 .75 0 0 1 21 6.67ZM3.35 6.75a.75 .75 0 0 0 .67-.4A8.82 8.82 0 0 1 7.15 2.88a.75 .75 0 1 0-.8-1.27A10.45 10.45 0 0 0 2.68 5.66 .75 .75 0 0 0 3.35 6.75Zm17.45 9.74A1.5 1.5 0 0 1 19.5 18.75H15.68a3.75 3.75 0 0 1-7.35 0H4.5a1.5 1.5 0 0 1-1.29-2.26C4.05 15.04 4.5 12.96 4.5 10.5a7.5 7.5 0 0 1 15 0C19.5 12.96 19.95 15.04 20.79 16.49ZM14.12 18.75H9.88a2.25 2.25 0 0 0 4.24 0ZM19.5 17.25c-1-1.71-1.5-3.98-1.5-6.75a6 6 0 0 0-12 0c0 2.77-.5 5.04-1.5 6.75Z\"],\"faded\":[0]},{\"id\":\"ph-chat-circle-duo\",\"label\":\"Message duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12A9 9 0 0 1 7.49 19.79h0L3.99 20.96a.75 .75 0 0 1-.95-.95l1.17-3.51h0A9 9 0 1 1 21 12Z\",\"M12 2.25A9.75 9.75 0 0 0 3.39 16.58L2.33 19.77a1.5 1.5 0 0 0 1.9 1.9l3.19-1.06A9.75 9.75 0 1 0 12 2.25Zm0 18a8.24 8.24 0 0 1-4.13-1.11 .75 .75 0 0 0-.61-.06L3.75 20.25 4.92 16.74a.75 .75 0 0 0-.06-.61A8.25 8.25 0 1 1 12 20.25Z\"],\"faded\":[0]},{\"id\":\"ph-chat-circle-dots-duo\",\"label\":\"Typing duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12A9 9 0 0 1 7.49 19.79h0L3.99 20.96a.75 .75 0 0 1-.95-.95l1.17-3.51h0A9 9 0 1 1 21 12Z\",\"M12 2.25A9.75 9.75 0 0 0 3.39 16.58L2.33 19.77a1.5 1.5 0 0 0 1.9 1.9l3.19-1.06A9.75 9.75 0 1 0 12 2.25Zm0 18a8.24 8.24 0 0 1-4.13-1.11 .75 .75 0 0 0-.37-.1 .74 .74 0 0 0-.24 .04L3.75 20.25 4.92 16.74a.75 .75 0 0 0-.06-.61A8.25 8.25 0 1 1 12 20.25Zm1.13-8.25a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 12Zm-4.12 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9 12Zm8.25 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 17.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-chats-duo\",\"label\":\"Chat duotone\",\"set\":\"duotone\",\"paths\":[\"M21 9V21l-3.71-3H8.25a.75 .75 0 0 1-.75-.75V13.5h8.25a.75 .75 0 0 0 .75-.75V8.25h3.75A.75 .75 0 0 1 21 9Z\",\"M20.25 7.5H17.25V4.5a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 4.5V16.5a.75 .75 0 0 0 1.22 .58L6.75 14.44V17.25a1.5 1.5 0 0 0 1.5 1.5h8.77L20.53 21.58a.75 .75 0 0 0 .47 .17 .75 .75 0 0 0 .75-.75V9A1.5 1.5 0 0 0 20.25 7.5ZM6.24 12.92 3.75 14.93V4.5H15.75v8.25H6.71A.75 .75 0 0 0 6.24 12.92ZM20.25 19.43l-2.49-2.01a.75 .75 0 0 0-.47-.17H8.25V14.25h7.5a1.5 1.5 0 0 0 1.5-1.5V9h3Z\"],\"faded\":[0]},{\"id\":\"ph-envelope-duo\",\"label\":\"Mail duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25l-9 8.25L3 5.25Z\",\"M21 4.5H3a.75 .75 0 0 0-.75 .75V18a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A.75 .75 0 0 0 21 4.5Zm-9 7.98L4.93 6H19.07ZM9.25 12 3.75 17.04V6.96Zm1.11 1.02 1.13 1.04a.75 .75 0 0 0 1.01 0l1.13-1.04 5.44 4.98H4.93ZM14.75 12 20.25 6.95V17.05Z\"],\"faded\":[0]},{\"id\":\"ph-paper-plane-tilt-duo\",\"label\":\"Send duotone\",\"set\":\"duotone\",\"paths\":[\"M20.97 3.95l-5.46 18a.75 .75 0 0 1-1.4 .12L10.13 13.88 1.93 9.89a.75 .75 0 0 1 .12-1.4l18-5.46A.75 .75 0 0 1 20.97 3.95Z\",\"M21.31 2.69a1.5 1.5 0 0 0-1.47-.38l-.01 0L1.83 7.77a1.5 1.5 0 0 0-.23 2.79L9.56 14.44l3.87 7.96A1.49 1.49 0 0 0 14.79 23.25q.06 0 .13-.01a1.49 1.49 0 0 0 1.31-1.08l5.46-17.99c0 0 0-.01 0-.01A1.5 1.5 0 0 0 21.31 2.69ZM14.8 21.74l0 .01 0-.01-3.76-7.72 4.5-4.5a.75 .75 0 0 0-1.06-1.06l-4.5 4.5L2.26 9.21l-.01 0 .01 0L20.25 3.75Z\"],\"faded\":[0]},{\"id\":\"ph-at-duo\",\"label\":\"Mention duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25a9.75 9.75 0 0 0 0 19.5c2.02 0 4.13-.61 5.67-1.62a.75 .75 0 0 0-.83-1.25C15.56 19.72 13.71 20.25 12 20.25a8.25 8.25 0 1 1 8.25-8.25c0 2.48-1.02 3-1.87 3s-1.87-.52-1.87-3V8.25a.75 .75 0 0 0-1.5 0v.4a4.5 4.5 0 1 0 .56 6.1c.56 1.13 1.53 1.75 2.82 1.75 2.11 0 3.38-1.68 3.38-4.5A9.76 9.76 0 0 0 12 2.25Zm0 12.75a3 3 0 1 1 3-3A3 3 0 0 1 12 15Z\"],\"faded\":[0]},{\"id\":\"ph-hash-duo\",\"label\":\"Channel duotone\",\"set\":\"duotone\",\"paths\":[\"M15.55 9l-1.09 6h-6l1.09-6Z\",\"M21 8.25H16.44l.79-4.37a.75 .75 0 0 0-1.48-.27l-.84 4.63H10.44l.79-4.37a.75 .75 0 0 0-1.48-.27L8.92 8.25H4.5a.75 .75 0 0 0 0 1.5H8.65L7.83 14.25H3a.75 .75 0 0 0 0 1.5H7.56l-.79 4.37a.75 .75 0 0 0 .6 .87A.73 .73 0 0 0 7.5 21a.75 .75 0 0 0 .74-.62l.84-4.63H13.56l-.79 4.37a.75 .75 0 0 0 .6 .87A.73 .73 0 0 0 13.5 21a.75 .75 0 0 0 .74-.62l.84-4.63H19.5a.75 .75 0 0 0 0-1.5H15.35l.82-4.5H21a.75 .75 0 0 0 0-1.5Zm-7.17 6H9.35l.82-4.5h4.47Z\"],\"faded\":[0]},{\"id\":\"ph-microphone-duo\",\"label\":\"Mic duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 6v6a3.75 3.75 0 0 1-3.75 3.75h0a3.75 3.75 0 0 1-3.75-3.75V6a3.75 3.75 0 0 1 3.75-3.75h0A3.75 3.75 0 0 1 15.75 6Z\",\"M12 16.5a4.5 4.5 0 0 0 4.5-4.5V6a4.5 4.5 0 0 0-9 0v6A4.5 4.5 0 0 0 12 16.5ZM9 6a3 3 0 0 1 6 0v6a3 3 0 0 1-6 0Zm3.75 13.46V22.5a.75 .75 0 0 1-1.5 0V19.46A7.51 7.51 0 0 1 4.5 12a.75 .75 0 0 1 1.5 0 6 6 0 0 0 12 0 .75 .75 0 0 1 1.5 0A7.51 7.51 0 0 1 12.75 19.46Z\"],\"faded\":[0]},{\"id\":\"ph-headphones-duo\",\"label\":\"Headphones duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 13.5v3.75a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V12H6A1.5 1.5 0 0 1 7.5 13.5Zm10.5-1.5a1.5 1.5 0 0 0-1.5 1.5v3.75a1.5 1.5 0 0 0 1.5 1.5h1.5a1.5 1.5 0 0 0 1.5-1.5V12Z\",\"M18.93 5.12A9.76 9.76 0 0 0 2.25 12v5.25a2.25 2.25 0 0 0 2.25 2.25H6a2.25 2.25 0 0 0 2.25-2.25V13.5a2.25 2.25 0 0 0-2.25-2.25H3.78A8.25 8.25 0 0 1 12 3.75h.06a8.22 8.22 0 0 1 8.16 7.5H18a2.25 2.25 0 0 0-2.25 2.25v3.75a2.25 2.25 0 0 0 2.25 2.25h1.5a2.25 2.25 0 0 0 2.25-2.25V12A9.69 9.69 0 0 0 18.93 5.12ZM6 12.75a.75 .75 0 0 1 .75 .75v3.75a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V12.75Zm14.25 4.5a.75 .75 0 0 1-.75 .75H18a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 .75-.75h2.25Z\"],\"faded\":[0]},{\"id\":\"ph-speaker-high-duo\",\"label\":\"Volume duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 8.25v7.5H3a.75 .75 0 0 1-.75-.75V9a.75 .75 0 0 1 .75-.75Z\",\"M14.58 2.33a.75 .75 0 0 0-.79 .08L7.24 7.5H3A1.5 1.5 0 0 0 1.5 9v6a1.5 1.5 0 0 0 1.5 1.5H7.24l6.55 5.09A.75 .75 0 0 0 15 21V3A.75 .75 0 0 0 14.58 2.33ZM3 9H6.75v6H3ZM13.5 19.47 8.25 15.38V8.62l5.25-4.08Zm5.06-9.94a3.75 3.75 0 0 1 0 4.96 .75 .75 0 0 1-1.12-.99 2.25 2.25 0 0 0 0-2.97 .75 .75 0 0 1 1.13-.99ZM23.25 12a7.49 7.49 0 0 1-1.91 5 .75 .75 0 0 1-1.12-1 6 6 0 0 0 0-8 .75 .75 0 1 1 1.12-1A7.48 7.48 0 0 1 23.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-calendar-duo\",\"label\":\"Calendar duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V8.25H3.75V4.5a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 4.5Z\",\"M19.5 3H17.25V2.25a.75 .75 0 0 0-1.5 0v.75H8.25V2.25a.75 .75 0 0 0-1.5 0v.75H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM6.75 4.5v.75a.75 .75 0 0 0 1.5 0V4.5h7.5v.75a.75 .75 0 0 0 1.5 0V4.5h2.25V7.5H4.5V4.5ZM19.5 19.5H4.5V9H19.5V19.5Zm-9-8.25v6a.75 .75 0 0 1-1.5 0V12.46l-.41 .21a.75 .75 0 0 1-.67-1.34l1.5-.75A.75 .75 0 0 1 10.5 11.25Zm5.55 2.85L14.25 16.5h1.5a.75 .75 0 0 1 0 1.5H12.75a.75 .75 0 0 1-.6-1.2l2.7-3.6A.75 .75 0 1 0 13.6 12.38a.75 .75 0 1 1-1.3-.75A2.25 2.25 0 0 1 16.5 12.75 2.23 2.23 0 0 1 16.05 14.1Z\"],\"faded\":[0]},{\"id\":\"ph-calendar-check-duo\",\"label\":\"Event duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V8.25H3.75V4.5a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 4.5Z\",\"M19.5 3H17.25V2.25a.75 .75 0 0 0-1.5 0v.75H8.25V2.25a.75 .75 0 0 0-1.5 0v.75H4.5A1.5 1.5 0 0 0 3 4.5V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V4.5A1.5 1.5 0 0 0 19.5 3ZM6.75 4.5v.75a.75 .75 0 0 0 1.5 0V4.5h7.5v.75a.75 .75 0 0 0 1.5 0V4.5h2.25V7.5H4.5V4.5ZM19.5 19.5H4.5V9H19.5V19.5Zm-3.59-8.03a.75 .75 0 0 1 0 1.06l-4.5 4.5a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.88 15.44l3.97-3.97A.75 .75 0 0 1 15.91 11.47Z\"],\"faded\":[0]},{\"id\":\"ph-clock-duo\",\"label\":\"Clock duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm6-8.25a.75 .75 0 0 1-.75 .75H12a.75 .75 0 0 1-.75-.75V6.75a.75 .75 0 0 1 1.5 0v4.5h4.5A.75 .75 0 0 1 18 12Z\"],\"faded\":[0]},{\"id\":\"ph-timer-duo\",\"label\":\"Timer duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12.75a8.25 8.25 0 1 1-8.25-8.25A8.25 8.25 0 0 1 20.25 12.75Z\",\"M12 3.75a9 9 0 1 0 9 9A9.01 9.01 0 0 0 12 3.75Zm0 16.5a7.5 7.5 0 1 1 7.5-7.5A7.51 7.51 0 0 1 12 20.25ZM16.28 8.47a.75 .75 0 0 1 0 1.06l-3.75 3.75a.75 .75 0 0 1-1.06-1.06l3.75-3.75A.75 .75 0 0 1 16.28 8.47ZM9 1.5a.75 .75 0 0 1 .75-.75h4.5a.75 .75 0 0 1 0 1.5H9.75A.75 .75 0 0 1 9 1.5Z\"],\"faded\":[0]},{\"id\":\"ph-hourglass-duo\",\"label\":\"Hourglass duotone\",\"set\":\"duotone\",\"paths\":[\"M17.7 7.69 12 12 6.3 7.73A.75 .75 0 0 1 6 7.13V3.75a.75 .75 0 0 1 .75-.75H17.25a.75 .75 0 0 1 .75 .75V7.09A.75 .75 0 0 1 17.7 7.69ZM6 16.88v3.38a.75 .75 0 0 0 .75 .75H17.25a.75 .75 0 0 0 .75-.75V16.91a.75 .75 0 0 0-.3-.6L12 12 6.3 16.27A.75 .75 0 0 0 6 16.88Z\",\"M18.75 7.09V3.75a1.5 1.5 0 0 0-1.5-1.5H6.75A1.5 1.5 0 0 0 5.25 3.75V7.13a1.51 1.51 0 0 0 .6 1.2L10.75 12 5.85 15.68A1.51 1.51 0 0 0 5.25 16.88v3.38a1.5 1.5 0 0 0 1.5 1.5H17.25a1.5 1.5 0 0 0 1.5-1.5V16.91a1.51 1.51 0 0 0-.6-1.2L13.24 12l4.91-3.71A1.51 1.51 0 0 0 18.75 7.09ZM17.25 20.25H6.75V16.88l5.25-3.94 5.25 3.97Zm0-13.16L12 11.06 6.75 7.13V3.75H17.25Z\"],\"faded\":[0]},{\"id\":\"ph-push-pin-duo\",\"label\":\"Pin duotone\",\"set\":\"duotone\",\"paths\":[\"M21.53 9.22 16.16 14.61c1.07 2.15-.16 4.3-.95 5.34a.75 .75 0 0 1-1.12 .08L3.97 9.92A.75 .75 0 0 1 4.03 8.8c2.78-2.24 5.38-.94 5.38-.94l5.37-5.39a.75 .75 0 0 1 1.06 0L21.53 8.16A.75 .75 0 0 1 21.53 9.22Z\",\"M22.06 7.63 16.37 1.94a1.5 1.5 0 0 0-2.12 0L9.22 6.98c-1-.31-3.28-.69-5.66 1.23a1.5 1.5 0 0 0-.12 2.23L7.97 14.97 3.97 18.97a.75 .75 0 0 0 1.06 1.06L9.03 16.03l4.53 4.53A1.5 1.5 0 0 0 14.62 21c.04 0 .07 0 .11 0a1.49 1.49 0 0 0 1.09-.59c1.84-2.45 1.66-4.44 1.24-5.62L22.06 9.75A1.5 1.5 0 0 0 22.06 7.63ZM21 8.69h0l-5.37 5.39a.75 .75 0 0 0-.14 .86c.89 1.77-.17 3.62-.88 4.56L4.5 9.38c1.13-.91 2.22-1.15 3.05-1.15A3.76 3.76 0 0 1 9.08 8.53a.75 .75 0 0 0 .87-.14L15.31 3 21 8.69Z\"],\"faded\":[0]},{\"id\":\"ph-bookmark-simple-duo\",\"label\":\"Bookmark duotone\",\"set\":\"duotone\",\"paths\":[\"M18 4.5V21l-6-3.75L6 21V4.5a.75 .75 0 0 1 .75-.75H17.25A.75 .75 0 0 1 18 4.5Z\",\"M17.25 3H6.75A1.5 1.5 0 0 0 5.25 4.5V21a.75 .75 0 0 0 1.15 .64L12 18.13l5.6 3.5A.75 .75 0 0 0 18.75 21V4.5A1.5 1.5 0 0 0 17.25 3Zm0 16.65-4.85-3.03a.75 .75 0 0 0-.79 0L6.75 19.65V4.5H17.25Z\"],\"faded\":[0]},{\"id\":\"ph-flag-duo\",\"label\":\"Flag duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V16.5c-6 5.2-10.5-5.2-16.5 0V5.25C10.5 .05 15 10.45 21 5.25Z\",\"M4.01 4.69A.75 .75 0 0 0 3.75 5.25V21a.75 .75 0 0 0 1.5 0V16.85c2.51-1.98 4.68-.91 7.17 .32 1.54 .76 3.19 1.58 4.97 1.58 1.31 0 2.68-.45 4.11-1.69a.75 .75 0 0 0 .26-.56V5.25A.75 .75 0 0 0 20.51 4.69c-2.62 2.27-4.85 1.17-7.43-.11C10.41 3.26 7.39 1.76 4.01 4.69ZM20.25 16.15c-2.51 1.98-4.68 .91-7.17-.32-2.34-1.16-4.95-2.45-7.83-.79V5.61c2.51-1.98 4.68-.91 7.17 .32 2.34 1.16 4.95 2.45 7.83 .79Z\"],\"faded\":[0]},{\"id\":\"ph-link-duo\",\"label\":\"Link duotone\",\"set\":\"duotone\",\"paths\":[\"M20.47 11.21 17.21 14.47a4.37 4.37 0 0 1-4.15 1.15c-.03 .03-.06 .06-.09 .09L9.71 18.97A4.37 4.37 0 1 1 3.53 12.79L6.79 9.53A4.37 4.37 0 0 1 10.94 8.38c.03-.03 .06-.06 .09-.09L14.29 5.03a4.37 4.37 0 0 1 6.18 6.18Z\",\"M22.5 8.27a5.1 5.1 0 0 1-1.5 3.47L17.74 15a5.09 5.09 0 0 1-3.62 1.5h0A5.12 5.12 0 0 1 9 11.24a.75 .75 0 0 1 1.5 .04A3.62 3.62 0 0 0 14.12 15h0a3.6 3.6 0 0 0 2.56-1.06l3.26-3.26a3.62 3.62 0 0 0-5.12-5.12l-1.03 1.03A.75 .75 0 0 1 12.72 5.53l1.03-1.03A5.12 5.12 0 0 1 21 4.5 5.14 5.14 0 0 1 22.5 8.27ZM10.22 17.41l-1.03 1.03A3.6 3.6 0 0 1 6.62 19.5h0a3.62 3.62 0 0 1-2.56-6.18L7.31 10.06A3.62 3.62 0 0 1 13.5 12.72a.75 .75 0 0 0 .73 .77H14.25a.75 .75 0 0 0 .75-.73A5.14 5.14 0 0 0 13.5 9a5.12 5.12 0 0 0-7.24 0L3 12.26A5.12 5.12 0 0 0 6.62 21h0a5.09 5.09 0 0 0 3.62-1.5l1.03-1.03A.75 .75 0 0 0 10.22 17.41Z\"],\"faded\":[0]},{\"id\":\"ph-paperclip-duo\",\"label\":\"Attachment duotone\",\"set\":\"duotone\",\"paths\":[\"M16.95 9.82 19.13 12l-7.69 7.68a4.5 4.5 0 0 1-6.36-6.36L14.38 3.88a3 3 0 0 1 4.24 4.24Z\",\"M19.66 11.47a.75 .75 0 0 1 0 1.06l-7.69 7.69a5.25 5.25 0 0 1-7.43-7.43L13.84 3.35a3.75 3.75 0 1 1 5.31 5.3L9.84 18.09A2.25 2.25 0 1 1 6.66 14.91L14.47 6.97A.75 .75 0 1 1 15.53 8.02L7.72 15.97a.75 .75 0 1 0 1.06 1.07L18.09 7.59A2.25 2.25 0 1 0 14.91 4.41L5.6 13.85a3.75 3.75 0 1 0 5.3 5.31l7.69-7.69A.75 .75 0 0 1 19.66 11.47Z\"],\"faded\":[0]},{\"id\":\"ph-image-duo\",\"label\":\"Image duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V16.69l-3.72-3.72a.75 .75 0 0 0-1.06 0L13.81 15.38 9.16 10.72a.75 .75 0 0 0-1.06 0L3 15.81V5.25a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 5.25Z\",\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm0 1.5V14.88l-2.44-2.44a1.5 1.5 0 0 0-2.12 0l-1.87 1.88-4.12-4.12a1.5 1.5 0 0 0-2.12 0L3.75 14V5.25ZM3.75 16.13l4.88-4.87 7.5 7.5H3.75Zm16.5 2.63H18.25l-3.37-3.37 1.88-1.87L20.25 17V18.75ZM13.5 9.38a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 13.5 9.38Z\"],\"faded\":[0]},{\"id\":\"ph-camera-duo\",\"label\":\"Camera duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 6H16.5L15 3.75H9L7.5 6H4.5A1.5 1.5 0 0 0 3 7.5V18a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V7.5A1.5 1.5 0 0 0 19.5 6ZM12 15.75a3.38 3.38 0 1 1 3.38-3.37A3.38 3.38 0 0 1 12 15.75Z\",\"M19.5 5.25H16.9L15.62 3.33A.75 .75 0 0 0 15 3H9a.75 .75 0 0 0-.62 .33L7.1 5.25H4.5A2.25 2.25 0 0 0 2.25 7.5V18a2.25 2.25 0 0 0 2.25 2.25H19.5a2.25 2.25 0 0 0 2.25-2.25V7.5A2.25 2.25 0 0 0 19.5 5.25Zm.75 12.75a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V7.5a.75 .75 0 0 1 .75-.75H7.5a.75 .75 0 0 0 .62-.33L9.4 4.5h5.2l1.28 1.92A.75 .75 0 0 0 16.5 6.75h3a.75 .75 0 0 1 .75 .75ZM12 8.25a4.13 4.13 0 1 0 4.13 4.13A4.13 4.13 0 0 0 12 8.25Zm0 6.75a2.63 2.63 0 1 1 2.63-2.62A2.63 2.63 0 0 1 12 15Z\"],\"faded\":[0]},{\"id\":\"ph-video-camera-duo\",\"label\":\"Video duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 6.75V17.25a.75 .75 0 0 1-.75 .75H3a.75 .75 0 0 1-.75-.75V6.75a.75 .75 0 0 1 .75-.75H18A.75 .75 0 0 1 18.75 6.75Z\",\"M23.6 6.84a.75 .75 0 0 0-.77 .04L19.5 9.1V6.75a1.5 1.5 0 0 0-1.5-1.5H3A1.5 1.5 0 0 0 1.5 6.75V17.25a1.5 1.5 0 0 0 1.5 1.5H18a1.5 1.5 0 0 0 1.5-1.5V14.91l3.33 2.22A.75 .75 0 0 0 23.25 17.25a.75 .75 0 0 0 .75-.75V7.5A.75 .75 0 0 0 23.6 6.84ZM18 17.25H3V6.75H18V17.25Zm4.5-2.15-3-2V10.9L22.5 8.91Z\"],\"faded\":[0]},{\"id\":\"ph-music-notes-duo\",\"label\":\"Music duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 15.38a2.63 2.63 0 1 1-2.62-2.62A2.63 2.63 0 0 1 19.5 15.38ZM4.88 15.75a2.63 2.63 0 1 0 2.63 2.63A2.63 2.63 0 0 0 4.88 15.75Z\",\"M19.96 1.66a.75 .75 0 0 0-.64-.14l-12 3A.75 .75 0 0 0 6.75 5.25V15.57A3.38 3.38 0 1 0 8.25 18.38V10.34l10.5-2.62v4.86A3.38 3.38 0 1 0 20.25 15.38V2.25A.75 .75 0 0 0 19.96 1.66ZM4.88 20.25a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 4.88 20.25ZM8.25 8.79V5.84l10.5-2.62v2.95ZM16.88 17.25a1.88 1.88 0 1 1 1.88-1.87A1.88 1.88 0 0 1 16.88 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-book-open-duo\",\"label\":\"Rules duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 5.25V18.75H15a3 3 0 0 0-3 3 3 3 0 0 0-3-3H2.25V5.25H9a3 3 0 0 1 3 3 3 3 0 0 1 3-3Z\",\"M21.75 4.5H15a3.75 3.75 0 0 0-3 1.5A3.75 3.75 0 0 0 9 4.5H2.25a.75 .75 0 0 0-.75 .75V18.75a.75 .75 0 0 0 .75 .75H9a2.25 2.25 0 0 1 2.25 2.25 .75 .75 0 0 0 1.5 0 2.25 2.25 0 0 1 2.25-2.25h6.75a.75 .75 0 0 0 .75-.75V5.25A.75 .75 0 0 0 21.75 4.5ZM9 18H3V6H9a2.25 2.25 0 0 1 2.25 2.25V18.75A3.73 3.73 0 0 0 9 18Zm12 0H15a3.73 3.73 0 0 0-2.25 .75V8.25a2.25 2.25 0 0 1 2.25-2.25h6Z\"],\"faded\":[0]},{\"id\":\"ph-scroll-duo\",\"label\":\"Scroll duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 16.5H9.75s.75 .56 .75 1.5a2.25 2.25 0 0 1-4.5 0V6A2.25 2.25 0 0 0 3.75 3.75H16.5a2.25 2.25 0 0 1 2.25 2.25Z\",\"M9 9.75a.75 .75 0 0 1 .75-.75h6a.75 .75 0 0 1 0 1.5H9.75A.75 .75 0 0 1 9 9.75Zm.75 3.75h6a.75 .75 0 0 0 0-1.5H9.75a.75 .75 0 0 0 0 1.5Zm12 4.5a3 3 0 0 1-3 3H8.25a3 3 0 0 1-3-3V6a1.5 1.5 0 0 0-3 0c0 .54 .45 .9 .46 .91h0A.75 .75 0 0 1 2.25 8.25a.74 .74 0 0 1-.45-.15h0C1.69 8.02 .75 7.28 .75 6A3 3 0 0 1 3.75 3H16.5a3 3 0 0 1 3 3V15.75h.75a.75 .75 0 0 1 .45 .15C20.81 15.98 21.75 16.72 21.75 18ZM9.02 16.26A.76 .76 0 0 1 9.75 15.75h8.25V6a1.5 1.5 0 0 0-1.5-1.5H6.35A2.97 2.97 0 0 1 6.75 6V18a1.5 1.5 0 0 0 3 0c0-.54-.45-.9-.46-.91A.73 .73 0 0 1 9.02 16.26ZM20.25 18a1.18 1.18 0 0 0-.3-.75h-8.81a2.52 2.52 0 0 1 .11 .75 2.98 2.98 0 0 1-.4 1.5H18.75A1.5 1.5 0 0 0 20.25 18Z\"],\"faded\":[0]},{\"id\":\"ph-file-text-duo\",\"label\":\"Document duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 8.25H14.25V3Z\",\"M20.03 7.72l-5.25-5.25A.75 .75 0 0 0 14.25 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V8.25A.75 .75 0 0 0 20.03 7.72ZM15 4.81 17.69 7.5H15ZM18.75 20.25H5.25V3.75h8.25V8.25a.75 .75 0 0 0 .75 .75h4.5V20.25Zm-3-7.5a.75 .75 0 0 1-.75 .75H9a.75 .75 0 0 1 0-1.5h6A.75 .75 0 0 1 15.75 12.75Zm0 3a.75 .75 0 0 1-.75 .75H9a.75 .75 0 0 1 0-1.5h6A.75 .75 0 0 1 15.75 15.75Z\"],\"faded\":[0]},{\"id\":\"ph-clipboard-text-duo\",\"label\":\"Clipboard duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 4.5V20.25a.75 .75 0 0 1-.75 .75H5.25a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 .75-.75H9a3.73 3.73 0 0 0-.75 2.25v.75h7.5V6a3.73 3.73 0 0 0-.75-2.25h3.75A.75 .75 0 0 1 19.5 4.5Z\",\"M15.75 14.25a.75 .75 0 0 1-.75 .75H9a.75 .75 0 0 1 0-1.5h6A.75 .75 0 0 1 15.75 14.25Zm-.75-3.75H9a.75 .75 0 0 0 0 1.5h6a.75 .75 0 0 0 0-1.5Zm5.25-6V20.25a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 5.25 3H8.65a4.49 4.49 0 0 1 6.7 0H18.75A1.5 1.5 0 0 1 20.25 4.5ZM9 6h6a3 3 0 0 0-6 0ZM18.75 4.5H16.24A4.49 4.49 0 0 1 16.5 6v.75a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1-.75-.75V6a4.49 4.49 0 0 1 .26-1.5H5.25V20.25H18.75Z\"],\"faded\":[0]},{\"id\":\"ph-newspaper-duo\",\"label\":\"News duotone\",\"set\":\"duotone\",\"paths\":[\"M21 6V17.25a1.5 1.5 0 0 1-1.5 1.5H3a1.5 1.5 0 0 0 1.5-1.5V6a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 6Z\",\"M8.25 10.5a.75 .75 0 0 1 .75-.75h7.5a.75 .75 0 0 1 0 1.5H9A.75 .75 0 0 1 8.25 10.5Zm.75 3.75h7.5a.75 .75 0 0 0 0-1.5H9a.75 .75 0 0 0 0 1.5ZM21.75 6V17.25a2.25 2.25 0 0 1-2.25 2.25H3A2.25 2.25 0 0 1 .75 17.26V8.25a.75 .75 0 0 1 1.5 0v9a.75 .75 0 0 0 1.5 0V6A1.5 1.5 0 0 1 5.25 4.5H20.25A1.5 1.5 0 0 1 21.75 6Zm-1.5 0H5.25V17.25a2.24 2.24 0 0 1-.13 .75H19.5a.75 .75 0 0 0 .75-.75Z\"],\"faded\":[0]},{\"id\":\"ph-lightbulb-duo\",\"label\":\"Idea duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 9.75a7.49 7.49 0 0 1-2.87 5.9A2.28 2.28 0 0 0 15.75 17.44v.56a.75 .75 0 0 1-.75 .75H9a.75 .75 0 0 1-.75-.75v-.56a2.26 2.26 0 0 0-.87-1.78A7.49 7.49 0 0 1 4.5 9.79C4.48 5.73 7.76 2.34 11.82 2.25A7.5 7.5 0 0 1 19.5 9.75Z\",\"M16.5 21.75a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1 0-1.5h7.5A.75 .75 0 0 1 16.5 21.75Zm3.75-12a8.21 8.21 0 0 1-3.15 6.49A1.52 1.52 0 0 0 16.5 17.44v.56a1.5 1.5 0 0 1-1.5 1.5H9a1.5 1.5 0 0 1-1.5-1.5v-.56a1.5 1.5 0 0 0-.58-1.19A8.21 8.21 0 0 1 3.75 9.8C3.73 5.33 7.34 1.61 11.8 1.5A8.25 8.25 0 0 1 20.25 9.75Zm-1.5 0a6.75 6.75 0 0 0-6.91-6.75c-3.66 .09-6.61 3.13-6.59 6.79a6.72 6.72 0 0 0 2.59 5.28A3 3 0 0 1 9 17.44v.56h6v-.56a3.01 3.01 0 0 1 1.17-2.38A6.72 6.72 0 0 0 18.75 9.75Zm-1.51-.88a5.4 5.4 0 0 0-4.36-4.36 .75 .75 0 0 0-.25 1.48c1.55 .26 2.87 1.58 3.14 3.14A.75 .75 0 0 0 16.5 9.75a.84 .84 0 0 0 .13-.01A.75 .75 0 0 0 17.24 8.87Z\"],\"faded\":[0]},{\"id\":\"ph-rocket-duo\",\"label\":\"Rocket duotone\",\"set\":\"duotone\",\"paths\":[\"M8.89 18 6.13 20.09a.75 .75 0 0 1-1.2-.42L3.77 14.45a.75 .75 0 0 1 .16-.64l2.84-3.41C6.66 12.59 7.19 15.13 8.89 18Zm11.19-4.2-2.84-3.41c.11 2.19-.43 4.74-2.12 7.6l2.76 2.09a.75 .75 0 0 0 1.2-.42l1.16-5.22A.75 .75 0 0 0 20.08 13.8Z\",\"M14.25 21a.75 .75 0 0 1-.75 .75H10.5a.75 .75 0 0 1 0-1.5h3A.75 .75 0 0 1 14.25 21ZM12 10.5a1.13 1.13 0 1 0-1.12-1.12A1.13 1.13 0 0 0 12 10.5Zm8.96 4.11-1.16 5.22a1.5 1.5 0 0 1-2.39 .85L14.86 18.75h-5.72L6.59 20.68a1.5 1.5 0 0 1-2.39-.85L3.04 14.61a1.51 1.51 0 0 1 .31-1.29l2.68-3.21a11.54 11.54 0 0 1 .8-3.44c1.21-3.03 3.38-4.93 4.25-5.61a1.5 1.5 0 0 1 1.84 0c.88 .68 3.04 2.58 4.25 5.61a11.54 11.54 0 0 1 .8 3.44l2.68 3.21A1.51 1.51 0 0 1 20.96 14.61ZM9.32 17.25h5.36c1.98-3.52 2.35-6.89 1.1-10.02C14.68 4.47 12.61 2.72 12 2.25c-.61 .47-2.68 2.22-3.78 4.98C6.97 10.36 7.34 13.73 9.32 17.25Zm-1.41 .55Q6.4 15.05 6.08 12.39L4.5 14.28 5.66 19.5l.02-.01ZM19.5 14.28l-1.58-1.89q-.32 2.65-1.83 5.41l2.24 1.69 .02 .01Z\"],\"faded\":[0]},{\"id\":\"ph-rocket-launch-duo\",\"label\":\"Launch duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 11.25v5.78a.75 .75 0 0 1-.22 .53l-3.22 3.22a.75 .75 0 0 1-1.27-.42L12 16.5ZM12.75 6.75H6.97a.75 .75 0 0 0-.53 .22L3.22 10.19a.75 .75 0 0 0 .42 1.27L7.5 12ZM3.75 20.25c3.53 0 4.75-1.85 5.12-2.64L6.39 15.14C5.6 15.5 3.75 16.72 3.75 20.25Z\",\"M20.99 4.42a1.5 1.5 0 0 0-1.41-1.41c-1.18-.07-4.19 .04-6.69 2.54L12.44 6H6.97A1.49 1.49 0 0 0 5.91 6.44L2.69 9.66a1.5 1.5 0 0 0 .85 2.55l3.61 .5 4.14 4.14 .5 3.61a1.49 1.49 0 0 0 1.01 1.21 1.51 1.51 0 0 0 .48 .08A1.49 1.49 0 0 0 14.34 21.31L17.56 18.09A1.49 1.49 0 0 0 18 17.03V11.56l.45-.45C20.95 8.61 21.06 5.6 20.99 4.42ZM6.97 7.5h3.97L7.23 11.21 3.75 10.72Zm6.98-.89a7.19 7.19 0 0 1 5.54-2.11 7.17 7.17 0 0 1-2.1 5.55L12 15.44 8.56 12ZM16.5 17.03 13.28 20.25l-.49-3.48L16.5 13.06Zm-6.95 .89C9.13 18.84 7.71 21 3.75 21a.75 .75 0 0 1-.75-.75c0-3.96 2.16-5.38 3.08-5.8a.75 .75 0 0 1 .62 1.37c-.6 .27-1.93 1.16-2.17 3.65 2.49-.23 3.38-1.56 3.65-2.17a.75 .75 0 1 1 1.37 .62Z\"],\"faded\":[0]},{\"id\":\"ph-globe-duo\",\"label\":\"Globe duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25h0A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm8.25 9.75a8.21 8.21 0 0 1-.31 2.25H16.33a14.76 14.76 0 0 0 0-4.5h3.61A8.21 8.21 0 0 1 20.25 12ZM9.56 15.75H14.44a10.79 10.79 0 0 1-2.44 4.22A10.81 10.81 0 0 1 9.56 15.75Zm-.37-1.5a13.2 13.2 0 0 1 0-4.5h5.61a13.2 13.2 0 0 1 0 4.5ZM3.75 12a8.21 8.21 0 0 1 .31-2.25H7.67a14.76 14.76 0 0 0 0 4.5H4.06A8.21 8.21 0 0 1 3.75 12ZM14.44 8.25H9.56a10.79 10.79 0 0 1 2.44-4.22A10.81 10.81 0 0 1 14.44 8.25Zm4.91 0H16a12.68 12.68 0 0 0-2.09-4.28A8.28 8.28 0 0 1 19.35 8.25ZM10.09 3.97A12.68 12.68 0 0 0 8 8.25H4.65A8.28 8.28 0 0 1 10.09 3.97ZM4.65 15.75H8a12.68 12.68 0 0 0 2.09 4.28A8.28 8.28 0 0 1 4.65 15.75Zm9.26 4.28a12.68 12.68 0 0 0 2.09-4.28h3.34A8.28 8.28 0 0 1 13.91 20.02Z\"],\"faded\":[0]},{\"id\":\"ph-map-pin-duo\",\"label\":\"Location duotone\",\"set\":\"duotone\",\"paths\":[\"M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 6.75 7.5 12 7.5 12s7.5-5.25 7.5-12A7.5 7.5 0 0 0 12 2.25Zm0 10.5a3 3 0 1 1 3-3A3 3 0 0 1 12 12.75Z\",\"M12 6a3.75 3.75 0 1 0 3.75 3.75A3.75 3.75 0 0 0 12 6Zm0 6a2.25 2.25 0 1 1 2.25-2.25A2.25 2.25 0 0 1 12 12Zm0-10.5a8.26 8.26 0 0 0-8.25 8.25c0 2.94 1.36 6.06 3.94 9.02a23.83 23.83 0 0 0 3.89 3.59 .75 .75 0 0 0 .86 0A23.83 23.83 0 0 0 16.31 18.77c2.57-2.96 3.94-6.08 3.94-9.02A8.26 8.26 0 0 0 12 1.5Zm0 19.31c-1.55-1.22-6.75-5.7-6.75-11.06a6.75 6.75 0 0 1 13.5 0C18.75 15.12 13.55 19.59 12 20.81Z\"],\"faded\":[0]},{\"id\":\"ph-house-duo\",\"label\":\"Home duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 11.25v9H14.25V14.25H9.75v6H3.75V11.25a.75 .75 0 0 1 .22-.53l7.5-7.5a.75 .75 0 0 1 1.06 0l7.5 7.5A.75 .75 0 0 1 20.25 11.25Z\",\"M20.56 10.19l-7.5-7.5a1.5 1.5 0 0 0-2.12 0l-7.5 7.5A1.49 1.49 0 0 0 3 11.25v9a.75 .75 0 0 0 .75 .75h6a.75 .75 0 0 0 .75-.75V15h3v5.25a.75 .75 0 0 0 .75 .75h6a.75 .75 0 0 0 .75-.75V11.25A1.49 1.49 0 0 0 20.56 10.19ZM19.5 19.5H15V14.25a.75 .75 0 0 0-.75-.75H9.75a.75 .75 0 0 0-.75 .75v5.25H4.5V11.25l7.5-7.5 7.5 7.5Z\"],\"faded\":[0]},{\"id\":\"ph-shield-duo\",\"label\":\"Shield duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25v5.25c0 9-8.25 11.25-8.25 11.25S3.75 19.5 3.75 10.5V5.25a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 5.25Z\",\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v5.25c0 4.94 2.39 7.94 4.4 9.58 2.16 1.77 4.31 2.37 4.41 2.39a.75 .75 0 0 0 .39 0c.09-.02 2.24-.63 4.41-2.39C18.61 18.44 21 15.44 21 10.5V5.25A1.5 1.5 0 0 0 19.5 3.75Zm0 6.75c0 3.48-1.28 6.3-3.81 8.38A12.12 12.12 0 0 1 12 20.96a12.02 12.02 0 0 1-3.65-2.04C5.8 16.83 4.5 14 4.5 10.5l0-5.25 15 0Z\"],\"faded\":[0]},{\"id\":\"ph-shield-check-duo\",\"label\":\"Verified duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25v5.25c0 9-8.25 11.25-8.25 11.25S3.75 19.5 3.75 10.5V5.25a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 5.25Z\",\"M19.5 3.75H4.5A1.5 1.5 0 0 0 3 5.25v5.25c0 4.94 2.39 7.94 4.4 9.58 2.16 1.77 4.31 2.37 4.41 2.39a.75 .75 0 0 0 .39 0c.09-.03 2.24-.63 4.41-2.39C18.61 18.44 21 15.44 21 10.5V5.25A1.5 1.5 0 0 0 19.5 3.75Zm0 6.75c0 3.48-1.28 6.3-3.81 8.38A12.12 12.12 0 0 1 12 20.96a12.02 12.02 0 0 1-3.65-2.04C5.8 16.83 4.5 14 4.5 10.5l0-5.25 15 0ZM7.72 13.28a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72a.75 .75 0 0 1 1.06 1.06l-5.25 5.25a.75 .75 0 0 1-1.06 0Z\"],\"faded\":[0]},{\"id\":\"ph-shield-warning-duo\",\"label\":\"Security duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25v5.25c0 9-8.25 11.25-8.25 11.25S3.75 19.5 3.75 10.5V5.25a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 5.25Z\",\"M11.25 12.75V9a.75 .75 0 0 1 1.5 0v3.75a.75 .75 0 0 1-1.5 0Zm.75 4.5a1.13 1.13 0 1 0-1.12-1.12A1.13 1.13 0 0 0 12 17.25ZM21 5.25v5.25c0 4.94-2.39 7.94-4.4 9.58-2.16 1.77-4.31 2.37-4.41 2.39a.75 .75 0 0 1-.39 0c-.09-.02-2.24-.63-4.41-2.39C5.39 18.44 3 15.44 3 10.5V5.25A1.5 1.5 0 0 1 4.5 3.75H19.5A1.5 1.5 0 0 1 21 5.25Zm-1.5 0L4.5 5.25l0 5.25c0 3.5 1.3 6.33 3.85 8.42A12.02 12.02 0 0 0 12 20.96a12.12 12.12 0 0 0 3.69-2.08C18.22 16.8 19.5 13.98 19.5 10.5Z\"],\"faded\":[0]},{\"id\":\"ph-lock-duo\",\"label\":\"Lock duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 9V19.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V9a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 9Z\",\"M19.5 7.5H16.5V5.25a4.5 4.5 0 0 0-9 0V7.5H4.5A1.5 1.5 0 0 0 3 9V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V9A1.5 1.5 0 0 0 19.5 7.5ZM9 5.25a3 3 0 0 1 6 0V7.5H9ZM19.5 19.5H4.5V9H19.5V19.5Zm-6.37-5.25a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-lock-open-duo\",\"label\":\"Unlock duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 9V19.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V9a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 9Z\",\"M19.5 7.5H9V5.25a3 3 0 0 1 3-3c1.44 0 2.74 1.03 3.01 2.4a.75 .75 0 0 0 1.47-.3C16.06 2.26 14.18 .75 12 .75A4.5 4.5 0 0 0 7.5 5.25V7.5H4.5A1.5 1.5 0 0 0 3 9V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V9A1.5 1.5 0 0 0 19.5 7.5Zm0 12H4.5V9H19.5V19.5Zm-6.37-5.25a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-key-duo\",\"label\":\"Key duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 9.22C21.63 12.84 18.63 15.75 15.01 15.75a6.72 6.72 0 0 1-2.52-.48h0L11.25 16.5H9v2.25H6.75v2.25H3.75a.75 .75 0 0 1-.75-.75V17.56a.75 .75 0 0 1 .22-.53l5.52-5.52h0A6.72 6.72 0 0 1 8.25 8.99c0-3.62 2.91-6.62 6.53-6.74A6.75 6.75 0 0 1 21.75 9.22Z\",\"M20.3 3.7A7.5 7.5 0 0 0 7.87 11.32L2.69 16.5A1.49 1.49 0 0 0 2.25 17.56V20.25a1.5 1.5 0 0 0 1.5 1.5H6.75a.75 .75 0 0 0 .75-.75V19.5H9a.75 .75 0 0 0 .75-.75V17.25h1.5a.75 .75 0 0 0 .53-.22l.9-.9A7.47 7.47 0 0 0 15 16.5h.01A7.5 7.5 0 0 0 20.3 3.7ZM21 9.2c-.1 3.2-2.79 5.8-5.99 5.8H15a5.97 5.97 0 0 1-2.22-.42 .75 .75 0 0 0-.83 .16L10.94 15.75H9a.75 .75 0 0 0-.75 .75v1.5H6.75a.75 .75 0 0 0-.75 .75v1.5H3.75V17.56l5.52-5.51a.75 .75 0 0 0 .16-.83A5.97 5.97 0 0 1 9 8.99c0-3.2 2.61-5.89 5.8-5.99A6 6 0 0 1 21 9.2ZM18 7.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18 7.13Z\"],\"faded\":[0]},{\"id\":\"ph-eye-duo\",\"label\":\"Eye duotone\",\"set\":\"duotone\",\"paths\":[\"M12 5.25C4.5 5.25 1.5 12 1.5 12s3 6.75 10.5 6.75 10.5-6.75 10.5-6.75S19.5 5.25 12 5.25Zm0 10.5a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 12 15.75Z\",\"M23.19 11.7c-.03-.07-.83-1.84-2.59-3.6C18.24 5.74 15.27 4.5 12 4.5S5.76 5.74 3.41 8.1C1.64 9.86 .84 11.63 .81 11.7a.75 .75 0 0 0 0 .61c.03 .07 .83 1.83 2.59 3.6C5.76 18.26 8.73 19.5 12 19.5s6.24-1.24 8.59-3.59c1.77-1.77 2.56-3.53 2.59-3.6A.75 .75 0 0 0 23.19 11.7ZM12 18c-2.89 0-5.41-1.05-7.49-3.12A12.51 12.51 0 0 1 2.34 12 12.5 12.5 0 0 1 4.51 9.12C6.59 7.05 9.11 6 12 6s5.41 1.05 7.49 3.12A12.51 12.51 0 0 1 21.66 12C20.99 13.26 18.04 18 12 18Zm0-10.5a4.5 4.5 0 1 0 4.5 4.5A4.5 4.5 0 0 0 12 7.5Zm0 7.5a3 3 0 1 1 3-3A3 3 0 0 1 12 15Z\"],\"faded\":[0]},{\"id\":\"ph-eye-slash-duo\",\"label\":\"Hidden duotone\",\"set\":\"duotone\",\"paths\":[\"M12 5.25C4.5 5.25 1.5 12 1.5 12s3 6.75 10.5 6.75 10.5-6.75 10.5-6.75S19.5 5.25 12 5.25Zm0 10.5a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 12 15.75Z\",\"M5.06 3.25A.75 .75 0 1 0 3.95 4.25L5.75 6.24C2.34 8.33 .88 11.55 .81 11.7a.75 .75 0 0 0 0 .61c.03 .07 .83 1.83 2.59 3.6C5.76 18.26 8.73 19.5 12 19.5a11.92 11.92 0 0 0 4.88-1.02l2.06 2.27a.75 .75 0 1 0 1.11-1.01Zm4.44 7.11 3.91 4.3a3 3 0 0 1-3.91-4.3ZM12 18c-2.89 0-5.41-1.05-7.49-3.12A12.48 12.48 0 0 1 2.34 12c.44-.82 1.84-3.13 4.44-4.63l1.69 1.85a4.5 4.5 0 0 0 5.97 6.56l1.38 1.52A10.5 10.5 0 0 1 12 18Zm.56-8.95a.75 .75 0 0 1 .28-1.47 4.51 4.51 0 0 1 3.63 4 .75 .75 0 0 1-.68 .82 .6 .6 0 0 1-.07 0 .75 .75 0 0 1-.75-.68A3.01 3.01 0 0 0 12.56 9.05Zm10.62 3.25c-.04 .09-.99 2.19-3.13 4.11a.75 .75 0 1 1-1-1.12A12.45 12.45 0 0 0 21.66 12a12.48 12.48 0 0 0-2.17-2.88C17.41 7.05 14.89 6 12 6a11.1 11.1 0 0 0-1.81 .15A.75 .75 0 1 1 9.94 4.67 12.56 12.56 0 0 1 12 4.5c3.27 0 6.24 1.24 8.59 3.6 1.77 1.77 2.56 3.53 2.59 3.6A.75 .75 0 0 1 23.19 12.31Z\"],\"faded\":[0]},{\"id\":\"ph-gavel-duo\",\"label\":\"Gavel duotone\",\"set\":\"duotone\",\"paths\":[\"M14.03 4.28l-6 6a.75 .75 0 0 1-1.06 0l-1.5-1.5a.75 .75 0 0 1 0-1.06l6-6a.75 .75 0 0 1 1.06 0l1.5 1.5A.75 .75 0 0 1 14.03 4.28Zm8.25 7.19-1.5-1.5a.75 .75 0 0 0-1.06 0l-6 6a.75 .75 0 0 0 0 1.06l1.5 1.5a.75 .75 0 0 0 1.06 0l6-6A.75 .75 0 0 0 22.28 11.47Z\",\"M22.81 10.94l-1.5-1.5a1.5 1.5 0 0 0-1.95-.14L14.7 4.64a1.5 1.5 0 0 0-.14-1.95l-1.5-1.5a1.5 1.5 0 0 0-2.12 0l-6 6a1.5 1.5 0 0 0 0 2.12l1.5 1.5a1.5 1.5 0 0 0 1.95 .14L9.06 11.63 2.94 17.75A2.34 2.34 0 0 0 6.25 21.07L12.38 14.94l.67 .67a1.5 1.5 0 0 0 .14 1.95l1.5 1.5a1.5 1.5 0 0 0 2.12 0l6-6A1.5 1.5 0 0 0 22.81 10.94ZM7.5 9.75 6 8.25l6-6 1.5 1.5ZM5.19 20a.84 .84 0 0 1-1.19 0 .84 .84 0 0 1 0-1.19L10.13 12.69 11.31 13.88ZM9.47 9.91 13.66 5.72 18.28 10.34 14.1 14.53ZM15.75 18l-1.5-1.5 .38-.37h0l5.25-5.25h0l.38-.37 1.5 1.5Z\"],\"faded\":[0]},{\"id\":\"ph-scales-duo\",\"label\":\"Scales duotone\",\"set\":\"duotone\",\"paths\":[\"M5.25 8.25l3 7.5c0 1.66-1.87 2.25-3 2.25s-3-.59-3-2.25ZM18.75 5.25l-3 7.5c0 1.66 1.88 2.25 3 2.25s3-.59 3-2.25Z\",\"M22.45 12.47l-3-7.5h0a.75 .75 0 0 0-.86-.45L12.75 5.81V3.75a.75 .75 0 0 0-1.5 0V6.15L5.09 7.52A.75 .75 0 0 0 4.55 7.97h0v.01L1.55 15.47a.74 .74 0 0 0-.05 .28c0 2.19 2.3 3 3.75 3s3.75-.81 3.75-3a.74 .74 0 0 0-.05-.28L6.27 8.79 11.25 7.69V19.5H9.75a.75 .75 0 0 0 0 1.5h4.5a.75 .75 0 0 0 0-1.5H12.75V7.35L17.53 6.29 15.05 12.47a.74 .74 0 0 0-.05 .28c0 2.19 2.3 3 3.75 3s3.75-.81 3.75-3A.74 .74 0 0 0 22.45 12.47ZM5.25 17.25c-.71 0-2.13-.34-2.24-1.37L5.25 10.27l2.24 5.61C7.38 16.91 5.96 17.25 5.25 17.25Zm13.5-3c-.71 0-2.13-.34-2.24-1.37L18.75 7.27l2.24 5.61C20.88 13.91 19.46 14.25 18.75 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-siren-duo\",\"label\":\"Siren duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 12.09v3.66H4.5V12a7.5 7.5 0 0 1 7.56-7.5C16.19 4.53 19.5 7.96 19.5 12.09Z\",\"M11.25 1.5V.75a.75 .75 0 0 1 1.5 0v.75a.75 .75 0 0 1-1.5 0Zm7.5 3a.75 .75 0 0 0 .53-.22l.75-.75a.75 .75 0 0 0-1.06-1.06l-.75 .75A.75 .75 0 0 0 18.75 4.5ZM4.72 4.28A.75 .75 0 0 0 5.78 3.22l-.75-.75A.75 .75 0 0 0 3.97 3.53Zm8.16 2.48a.75 .75 0 1 0-.25 1.48C14.41 8.54 15.75 10.15 15.75 12a.75 .75 0 0 0 1.5 0C17.25 9.43 15.37 7.18 12.87 6.76ZM21.75 16.5v2.25a1.5 1.5 0 0 1-1.5 1.5H3.75a1.5 1.5 0 0 1-1.5-1.5V16.5a1.5 1.5 0 0 1 1.5-1.5V12a8.25 8.25 0 0 1 8.25-8.25h.06c4.51 .03 8.19 3.78 8.19 8.34v2.91A1.5 1.5 0 0 1 21.75 16.5ZM5.25 15H18.75V12.09c0-3.75-3-6.82-6.7-6.84H12a6.75 6.75 0 0 0-6.75 6.75Zm15 3.75V16.5H3.75v2.25H20.25Z\"],\"faded\":[0]},{\"id\":\"ph-bug-duo\",\"label\":\"Bug duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 12v1.5a7.5 7.5 0 0 1-15 0V12Z\",\"M13.5 8.63a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 13.5 8.63ZM9.38 7.5a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 9.38 7.5Zm10.88 6A8.23 8.23 0 0 1 19.97 15.66l2.09 .91A.75 .75 0 0 1 21.75 18a.74 .74 0 0 1-.3-.06L19.44 17.06a8.25 8.25 0 0 1-14.88 0L2.55 17.94A.74 .74 0 0 1 2.25 18a.75 .75 0 0 1-.3-1.44L4.03 15.66A8.23 8.23 0 0 1 3.75 13.5v-.75H1.5a.75 .75 0 0 1 0-1.5H3.75v-.75a8.23 8.23 0 0 1 .28-2.16L1.95 7.44a.75 .75 0 1 1 .6-1.37L4.56 6.94a8.25 8.25 0 0 1 14.88 0l2.01-.88a.75 .75 0 0 1 .6 1.37L19.97 8.35a8.23 8.23 0 0 1 .28 2.16v.75h2.25a.75 .75 0 0 1 0 1.5H20.25ZM5.25 11.25H18.75v-.75a6.75 6.75 0 0 0-13.5 0Zm6 8.96V12.75H5.25v.75A6.76 6.76 0 0 0 11.25 20.21ZM18.75 13.5v-.75H12.75v7.46A6.76 6.76 0 0 0 18.75 13.5Z\"],\"faded\":[0]},{\"id\":\"ph-robot-duo\",\"label\":\"Bot duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 5.25H5.25A2.25 2.25 0 0 0 3 7.5V18a2.25 2.25 0 0 0 2.25 2.25H18.75a2.25 2.25 0 0 0 2.25-2.25V7.5A2.25 2.25 0 0 0 18.75 5.25ZM15.38 17.25H8.63a1.88 1.88 0 0 1 0-3.75h6.75a1.88 1.88 0 0 1 0 3.75Z\",\"M18.75 4.5H12.75V1.5a.75 .75 0 0 0-1.5 0V4.5H5.25A3 3 0 0 0 2.25 7.5V18a3 3 0 0 0 3 3H18.75a3 3 0 0 0 3-3V7.5A3 3 0 0 0 18.75 4.5Zm1.5 13.5a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V7.5A1.5 1.5 0 0 1 5.25 6H18.75a1.5 1.5 0 0 1 1.5 1.5ZM6.75 10.13a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 6.75 10.13Zm8.25 0a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 15 10.13Zm.38 2.63H8.63a2.63 2.63 0 0 0 0 5.25h6.75a2.63 2.63 0 0 0 0-5.25Zm-2.25 1.5v2.25H10.88V14.25ZM7.5 15.38a1.13 1.13 0 0 1 1.13-1.12h.75v2.25H8.63A1.13 1.13 0 0 1 7.5 15.38Zm7.88 1.13h-.75V14.25h.75a1.13 1.13 0 0 1 0 2.25Z\"],\"faded\":[0]},{\"id\":\"ph-cpu-duo\",\"label\":\"CPU duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 4.5H5.25a.75 .75 0 0 0-.75 .75V18.75a.75 .75 0 0 0 .75 .75H18.75a.75 .75 0 0 0 .75-.75V5.25A.75 .75 0 0 0 18.75 4.5ZM14.25 14.25H9.75V9.75h4.5Z\",\"M14.25 9H9.75a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 .75 .75h4.5a.75 .75 0 0 0 .75-.75V9.75A.75 .75 0 0 0 14.25 9Zm-.75 4.5H10.5V10.5h3Zm8.25 0H20.25V10.5h1.5a.75 .75 0 0 0 0-1.5H20.25V5.25a1.5 1.5 0 0 0-1.5-1.5H15V2.25a.75 .75 0 0 0-1.5 0V3.75H10.5V2.25a.75 .75 0 0 0-1.5 0V3.75H5.25A1.5 1.5 0 0 0 3.75 5.25V9H2.25a.75 .75 0 0 0 0 1.5H3.75v3H2.25a.75 .75 0 0 0 0 1.5H3.75v3.75a1.5 1.5 0 0 0 1.5 1.5H9v1.5a.75 .75 0 0 0 1.5 0V20.25h3v1.5a.75 .75 0 0 0 1.5 0V20.25h3.75a1.5 1.5 0 0 0 1.5-1.5V15h1.5a.75 .75 0 0 0 0-1.5Zm-3 5.25H5.25V5.25H18.75v8.99s0 .01 0 .01 0 .01 0 .01V18.75Z\"],\"faded\":[0]},{\"id\":\"ph-hard-drives-duo\",\"label\":\"Server duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 14.25v4.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V14.25a.75 .75 0 0 1 .75-.75H19.5A.75 .75 0 0 1 20.25 14.25ZM19.5 4.5H4.5a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 .75 .75H19.5a.75 .75 0 0 0 .75-.75V5.25A.75 .75 0 0 0 19.5 4.5Z\",\"M19.5 12.75H4.5a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 19.5 12.75Zm0 6H4.5V14.25H19.5v4.5Zm0-15H4.5A1.5 1.5 0 0 0 3 5.25v4.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 19.5 3.75Zm0 6H4.5V5.25H19.5v4.5ZM18 7.5a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18 7.5Zm0 9a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18 16.5Z\"],\"faded\":[0]},{\"id\":\"ph-code-duo\",\"label\":\"Code duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 12l-4.5 3.75H6L1.5 12 6 8.25H18Z\",\"M6.48 8.83 2.67 12l3.81 3.17a.75 .75 0 1 1-.96 1.15l-4.5-3.75a.75 .75 0 0 1 0-1.15l4.5-3.75a.75 .75 0 0 1 .96 1.15Zm16.5 2.6-4.5-3.75a.75 .75 0 1 0-.96 1.15L21.33 12l-3.81 3.17a.75 .75 0 1 0 .96 1.15l4.5-3.75a.75 .75 0 0 0 0-1.15ZM15.26 3.05a.75 .75 0 0 0-.96 .45l-6 16.5a.75 .75 0 0 0 .45 .96A.76 .76 0 0 0 9 21a.75 .75 0 0 0 .71-.49l6-16.5A.75 .75 0 0 0 15.26 3.05Z\"],\"faded\":[0]},{\"id\":\"ph-terminal-window-duo\",\"label\":\"Terminal duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V18.75a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V5.25a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 5.25Z\",\"M12 12a.75 .75 0 0 1-.28 .59l-3.75 3a.75 .75 0 1 1-.94-1.17L10.05 12 7.03 9.59a.75 .75 0 1 1 .94-1.17l3.75 3A.75 .75 0 0 1 12 12Zm4.5 2.25H12.75a.75 .75 0 0 0 0 1.5h3.75a.75 .75 0 0 0 0-1.5Zm5.25-9V18.75a1.5 1.5 0 0 1-1.5 1.5H3.75a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 3.75 3.75H20.25A1.5 1.5 0 0 1 21.75 5.25ZM20.25 18.75V5.25H3.75V18.75H20.25Z\"],\"faded\":[0]},{\"id\":\"ph-wrench-duo\",\"label\":\"Wrench duotone\",\"set\":\"duotone\",\"paths\":[\"M21 9a6 6 0 0 1-8.9 5.25L6.84 20.34A2.25 2.25 0 0 1 3.66 17.16L9.75 11.9a6 6 0 0 1 7.5-8.46L13.5 7.5l.53 2.47L16.5 10.5l4.06-3.75A5.98 5.98 0 0 1 21 9Z\",\"M21.26 6.47a.75 .75 0 0 0-1.2-.27l-3.78 3.49-1.62-.35-.35-1.62 3.49-3.78A.75 .75 0 0 0 17.53 2.74 6.75 6.75 0 0 0 8.25 9 6.78 6.78 0 0 0 8.81 11.71L3.17 16.59c-.01 .01-.03 .02-.04 .04a3 3 0 0 0 4.24 4.24c.01-.01 .03-.03 .04-.04L12.29 15.19A6.75 6.75 0 0 0 21.75 9 6.71 6.71 0 0 0 21.26 6.47ZM15 14.25a5.26 5.26 0 0 1-2.54-.66 .75 .75 0 0 0-.93 .17L6.29 19.83a1.5 1.5 0 0 1-2.12-2.12L10.24 12.47a.75 .75 0 0 0 .17-.93 5.25 5.25 0 0 1 5.47-7.72l-2.92 3.17a.75 .75 0 0 0-.18 .67L13.3 10.13a.75 .75 0 0 0 .58 .58l2.47 .53a.75 .75 0 0 0 .67-.18l3.17-2.92A5.26 5.26 0 0 1 15 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-hammer-duo\",\"label\":\"Hammer duotone\",\"set\":\"duotone\",\"paths\":[\"M23.03 12.09 20.34 14.78a.75 .75 0 0 1-1.06 0L15.76 11.25l-2.62 2.63-3-3 2.63-2.62L7.5 2.98a8.23 8.23 0 0 1 9.22 1.69l6.31 6.36A.75 .75 0 0 1 23.03 12.09Z\",\"M23.56 10.5 17.24 4.13a9.01 9.01 0 0 0-12.73 0l-.01 .01L3.21 5.48A.75 .75 0 0 0 4.29 6.52L5.58 5.19a7.49 7.49 0 0 1 1.75-1.3L11.69 8.25l-9 9a1.5 1.5 0 0 0 0 2.12l1.94 1.94a1.5 1.5 0 0 0 2.12 0l9-9 1.34 1.34h0L18.75 15.31a1.5 1.5 0 0 0 2.12 0l2.69-2.69A1.5 1.5 0 0 0 23.56 10.5ZM5.69 20.25 3.75 18.31l6.38-6.37L12.06 13.88ZM15.22 10.72 13.13 12.81 11.19 10.88l2.1-2.1a.75 .75 0 0 0 0-1.06L8.84 3.28a7.5 7.5 0 0 1 7.33 1.91l4.15 4.17L17.63 12.06l-1.34-1.34A.75 .75 0 0 0 15.22 10.72Zm4.59 3.53-1.12-1.12L21.38 10.43l1.13 1.13Z\"],\"faded\":[0]},{\"id\":\"ph-gear-duo\",\"label\":\"Settings duotone\",\"set\":\"duotone\",\"paths\":[\"M19.49 11.55l1.57-1.97a9.29 9.29 0 0 0-.94-2.28l-2.5-.28a7.59 7.59 0 0 0-.64-.64l-.28-2.5a9.32 9.32 0 0 0-2.28-.94l-1.97 1.57a7.65 7.65 0 0 0-.9 0l-1.97-1.57A9.29 9.29 0 0 0 7.3 3.88l-.28 2.5a7.59 7.59 0 0 0-.64 .64l-2.5 .28a9.32 9.32 0 0 0-.94 2.28l1.57 1.97a7.65 7.65 0 0 0 0 .9l-1.57 1.97a9.29 9.29 0 0 0 .94 2.28l2.5 .28a7.59 7.59 0 0 0 .64 .64l.28 2.5a9.32 9.32 0 0 0 2.28 .94l1.97-1.57a7.65 7.65 0 0 0 .9 0l1.97 1.57a9.29 9.29 0 0 0 2.28-.94l.28-2.5a7.59 7.59 0 0 0 .64-.64l2.5-.28a9.32 9.32 0 0 0 .94-2.28l-1.57-1.97A7.65 7.65 0 0 0 19.49 11.55ZM12 15.75a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 12 15.75Z\",\"M12 7.5a4.5 4.5 0 1 0 4.5 4.5A4.5 4.5 0 0 0 12 7.5Zm0 7.5a3 3 0 1 1 3-3A3 3 0 0 1 12 15Zm8.25-2.8q.01-.2 0-.4l1.4-1.75a.75 .75 0 0 0 .14-.66 10.09 10.09 0 0 0-1.02-2.46 .75 .75 0 0 0-.56-.37l-2.22-.25q-.14-.15-.28-.28L17.44 3.8a.75 .75 0 0 0-.37-.56 10.06 10.06 0 0 0-2.46-1.02 .75 .75 0 0 0-.66 .14L12.2 3.75Q12 3.75 11.8 3.75L10.05 2.35a.75 .75 0 0 0-.66-.14A10.09 10.09 0 0 0 6.93 3.24a.75 .75 0 0 0-.37 .56L6.31 6.03q-.15 .14-.28 .28L3.8 6.56a.75 .75 0 0 0-.56 .37 10.1 10.1 0 0 0-1.02 2.46 .75 .75 0 0 0 .14 .66L3.75 11.8Q3.75 12 3.75 12.2L2.35 13.95a.75 .75 0 0 0-.14 .66 10.09 10.09 0 0 0 1.02 2.46 .75 .75 0 0 0 .56 .37l2.22 .25q.14 .15 .28 .28L6.56 20.2a.75 .75 0 0 0 .37 .56 10.1 10.1 0 0 0 2.46 1.02 .75 .75 0 0 0 .66-.14L11.8 20.25q.2 .01 .41 0l1.75 1.4a.75 .75 0 0 0 .66 .14 10.05 10.05 0 0 0 2.46-1.02 .75 .75 0 0 0 .37-.56l.25-2.22q.15-.14 .28-.28L20.2 17.44a.75 .75 0 0 0 .56-.37 10.1 10.1 0 0 0 1.02-2.46 .75 .75 0 0 0-.14-.66Zm-1.51-.61a6.93 6.93 0 0 1 0 .81 .75 .75 0 0 0 .16 .51l1.33 1.66a8.58 8.58 0 0 1-.58 1.41L17.53 16.23a.75 .75 0 0 0-.48 .25 6.95 6.95 0 0 1-.58 .58 .75 .75 0 0 0-.25 .48l-.24 2.12a8.56 8.56 0 0 1-1.41 .58l-1.66-1.33a.75 .75 0 0 0-.47-.16h-.04a6.93 6.93 0 0 1-.81 0 .76 .76 0 0 0-.51 .16L9.42 20.23a8.58 8.58 0 0 1-1.41-.58L7.77 17.53a.75 .75 0 0 0-.25-.48 6.95 6.95 0 0 1-.58-.58 .75 .75 0 0 0-.48-.25L4.35 15.99a8.56 8.56 0 0 1-.58-1.41l1.33-1.66a.75 .75 0 0 0 .16-.51 6.93 6.93 0 0 1 0-.81 .75 .75 0 0 0-.16-.51L3.77 9.42a8.58 8.58 0 0 1 .58-1.41L6.47 7.77a.75 .75 0 0 0 .48-.25 6.95 6.95 0 0 1 .58-.58A.75 .75 0 0 0 7.77 6.47L8.01 4.35a8.56 8.56 0 0 1 1.41-.58l1.66 1.33a.75 .75 0 0 0 .51 .16 6.93 6.93 0 0 1 .81 0 .76 .76 0 0 0 .51-.16L14.58 3.77a8.58 8.58 0 0 1 1.41 .58L16.23 6.47a.75 .75 0 0 0 .25 .48 6.95 6.95 0 0 1 .58 .58 .75 .75 0 0 0 .48 .25l2.12 .24a8.56 8.56 0 0 1 .58 1.41l-1.33 1.66A.75 .75 0 0 0 18.74 11.59Z\"],\"faded\":[0]},{\"id\":\"ph-sliders-horizontal-duo\",\"label\":\"Sliders duotone\",\"set\":\"duotone\",\"paths\":[\"M12 7.5a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 12 7.5Zm3.75 6.75a2.25 2.25 0 1 0 2.25 2.25A2.25 2.25 0 0 0 15.75 14.25Z\",\"M3.75 8.25H6.84a3 3 0 0 0 5.81 0h7.59a.75 .75 0 0 0 0-1.5H12.66a3 3 0 0 0-5.81 0H3.75a.75 .75 0 0 0 0 1.5Zm6-2.25A1.5 1.5 0 1 1 8.25 7.5 1.5 1.5 0 0 1 9.75 6ZM20.25 15.75H18.66a3 3 0 0 0-5.81 0H3.75a.75 .75 0 0 0 0 1.5h9.09a3 3 0 0 0 5.81 0h1.59a.75 .75 0 0 0 0-1.5Zm-4.5 2.25a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 15.75 18Z\"],\"faded\":[0]},{\"id\":\"ph-pencil-simple-duo\",\"label\":\"Pencil duotone\",\"set\":\"duotone\",\"paths\":[\"M20.78 8.47 18 11.25 12.75 6l2.78-2.78a.75 .75 0 0 1 1.06 0L20.78 7.41A.75 .75 0 0 1 20.78 8.47Z\",\"M21.31 6.88 17.12 2.69a1.5 1.5 0 0 0-2.12 0L3.44 14.25A1.49 1.49 0 0 0 3 15.31V19.5a1.5 1.5 0 0 0 1.5 1.5H8.69A1.49 1.49 0 0 0 9.75 20.56L21.31 9a1.5 1.5 0 0 0 0-2.12ZM8.69 19.5H4.5V15.31l8.25-8.25L16.94 11.25ZM18 10.19 13.81 6l2.25-2.25L20.25 7.94Z\"],\"faded\":[0]},{\"id\":\"ph-paint-brush-duo\",\"label\":\"Brush duotone\",\"set\":\"duotone\",\"paths\":[\"M21 3c0 3.08-2.97 6.32-5.5 8.54A7.91 7.91 0 0 0 12.47 8.5C14.68 5.97 17.92 3 21 3Z\",\"M21.75 3a.75 .75 0 0 0-.75-.75c-4.13 0-8.37 4.66-10.73 7.75A5.63 5.63 0 0 0 3 15.38c0 2.9-1.83 4.19-1.92 4.25A.75 .75 0 0 0 1.5 21H8.63a5.63 5.63 0 0 0 5.38-7.27C17.09 11.37 21.75 7.13 21.75 3ZM8.63 19.5H3.25C3.88 18.6 4.5 17.24 4.5 15.38a4.13 4.13 0 1 1 4.13 4.13Zm3.04-8.85q.48-.62 .95-1.18A7.15 7.15 0 0 1 14.53 11.39q-.55 .46-1.18 .95A5.68 5.68 0 0 0 11.66 10.65Zm4-.25a8.68 8.68 0 0 0-2.06-2.06c2.98-3.24 5.23-4.22 6.55-4.49C19.89 5.17 18.9 7.41 15.67 10.39Z\"],\"faded\":[0]},{\"id\":\"ph-palette-duo\",\"label\":\"Palette duotone\",\"set\":\"duotone\",\"paths\":[\"M21 11.92a9.05 9.05 0 0 1-.22 2.08A2.25 2.25 0 0 1 18.58 15.75H14.25a2.25 2.25 0 0 0-2.25 2.25 2.25 2.25 0 0 1-3 2.12C5.51 18.88 3 15.92 3 12a9 9 0 0 1 8.91-9C16.86 2.95 20.96 6.97 21 11.92Z\",\"M18.82 5.05A9.68 9.68 0 0 0 12 2.25h-.1A9.75 9.75 0 0 0 2.25 12c0 4.03 2.49 7.41 6.5 8.83A3 3 0 0 0 12.75 18a1.5 1.5 0 0 1 1.5-1.5h4.33a2.98 2.98 0 0 0 2.93-2.33 9.79 9.79 0 0 0 .24-2.25A9.68 9.68 0 0 0 18.82 5.05Zm1.22 8.79A1.49 1.49 0 0 1 18.58 15H14.25a3 3 0 0 0-3 3 1.5 1.5 0 0 1-2 1.41C5.86 18.22 3.75 15.38 3.75 12a8.25 8.25 0 0 1 8.16-8.25h.08a8.28 8.28 0 0 1 8.25 8.18A8.33 8.33 0 0 1 20.04 13.84ZM13.13 7.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 7.13ZM9 9.38A1.13 1.13 0 1 1 7.88 8.25 1.13 1.13 0 0 1 9 9.38Zm0 5.25a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9 14.63Zm8.25-5.25a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 17.25 9.38Z\"],\"faded\":[0]},{\"id\":\"ph-trash-duo\",\"label\":\"Trash duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 5.25V19.5a.75 .75 0 0 1-.75 .75H6a.75 .75 0 0 1-.75-.75V5.25Z\",\"M20.25 4.5H16.5V3.75a2.25 2.25 0 0 0-2.25-2.25H9.75A2.25 2.25 0 0 0 7.5 3.75v.75H3.75a.75 .75 0 0 0 0 1.5h.75V19.5a1.5 1.5 0 0 0 1.5 1.5H18a1.5 1.5 0 0 0 1.5-1.5V6h.75a.75 .75 0 0 0 0-1.5ZM9 3.75a.75 .75 0 0 1 .75-.75h4.5a.75 .75 0 0 1 .75 .75v.75H9Zm9 15.75H6V6H18ZM10.5 9.75v6a.75 .75 0 0 1-1.5 0V9.75a.75 .75 0 0 1 1.5 0Zm4.5 0v6a.75 .75 0 0 1-1.5 0V9.75a.75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-magnifying-glass-duo\",\"label\":\"Search duotone\",\"set\":\"duotone\",\"paths\":[\"M18 10.5a7.5 7.5 0 1 1-7.5-7.5A7.5 7.5 0 0 1 18 10.5Z\",\"M21.53 20.47 16.84 15.78a8.27 8.27 0 1 0-1.06 1.06l4.69 4.69a.75 .75 0 0 0 1.06-1.06ZM3.75 10.5a6.75 6.75 0 1 1 6.75 6.75A6.76 6.76 0 0 1 3.75 10.5Z\"],\"faded\":[0]},{\"id\":\"ph-funnel-duo\",\"label\":\"Filter duotone\",\"set\":\"duotone\",\"paths\":[\"M20.8 5.75 14.25 12.75v5.5a.75 .75 0 0 1-.33 .62l-3 2A.75 .75 0 0 1 9.75 20.25V12.75L3.2 5.75A.75 .75 0 0 1 3.75 4.5H20.25A.75 .75 0 0 1 20.8 5.75Z\",\"M21.62 4.64A1.48 1.48 0 0 0 20.25 3.75H3.75A1.5 1.5 0 0 0 2.64 6.26l.01 .01L9 13.05V20.25a1.5 1.5 0 0 0 2.33 1.25l3-2A1.5 1.5 0 0 0 15 18.25V13.05l6.35-6.78 .01-.01A1.48 1.48 0 0 0 21.62 4.64ZM3.75 5.25h0Zm9.95 6.99A.75 .75 0 0 0 13.5 12.75v5.5L10.5 20.25V12.75a.75 .75 0 0 0-.2-.51L3.75 5.25H20.25Z\"],\"faded\":[0]},{\"id\":\"ph-list-duo\",\"label\":\"List duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 6V18H3.75V6Z\",\"M21 12a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1 0-1.5H20.25A.75 .75 0 0 1 21 12ZM3.75 6.75H20.25a.75 .75 0 0 0 0-1.5H3.75a.75 .75 0 0 0 0 1.5ZM20.25 17.25H3.75a.75 .75 0 0 0 0 1.5H20.25a.75 .75 0 0 0 0-1.5Z\"],\"faded\":[0]},{\"id\":\"ph-squares-four-duo\",\"label\":\"Grid duotone\",\"set\":\"duotone\",\"paths\":[\"M10.5 5.25v4.5a.75 .75 0 0 1-.75 .75H5.25a.75 .75 0 0 1-.75-.75V5.25a.75 .75 0 0 1 .75-.75h4.5A.75 .75 0 0 1 10.5 5.25Zm8.25-.75H14.25a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 .75 .75h4.5a.75 .75 0 0 0 .75-.75V5.25A.75 .75 0 0 0 18.75 4.5Zm-9 9H5.25a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 .75 .75h4.5a.75 .75 0 0 0 .75-.75V14.25A.75 .75 0 0 0 9.75 13.5Zm9 0H14.25a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 .75 .75h4.5a.75 .75 0 0 0 .75-.75V14.25A.75 .75 0 0 0 18.75 13.5Z\",\"M18.75 12.75H14.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 18.75 12.75Zm0 6H14.25V14.25h4.5v4.5ZM9.75 3.75H5.25A1.5 1.5 0 0 0 3.75 5.25v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 9.75 3.75Zm0 6H5.25V5.25h4.5v4.5Zm9-6H14.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 18.75 3.75Zm0 6H14.25V5.25h4.5v4.5Zm-9 3H5.25a1.5 1.5 0 0 0-1.5 1.5v4.5a1.5 1.5 0 0 0 1.5 1.5h4.5a1.5 1.5 0 0 0 1.5-1.5V14.25A1.5 1.5 0 0 0 9.75 12.75Zm0 6H5.25V14.25h4.5v4.5Z\"],\"faded\":[0]},{\"id\":\"ph-folder-duo\",\"label\":\"Folder duotone\",\"set\":\"duotone\",\"paths\":[\"M12 7.5H3V5.25a.75 .75 0 0 1 .75-.75H8.69a.75 .75 0 0 1 .53 .22Z\",\"M20.25 6.75H12.31L9.75 4.19A1.49 1.49 0 0 0 8.69 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.81A1.44 1.44 0 0 0 3.69 20.25H20.33A1.42 1.42 0 0 0 21.75 18.83V8.25A1.5 1.5 0 0 0 20.25 6.75ZM8.69 5.25l1.5 1.5H3.75V5.25ZM20.25 18.75H3.75V8.25H20.25Z\"],\"faded\":[0]},{\"id\":\"ph-download-simple-duo\",\"label\":\"Download duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V19.5H3.75V4.5A1.5 1.5 0 0 1 5.25 3H18.75A1.5 1.5 0 0 1 20.25 4.5Z\",\"M21 13.5v6a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 1.5 0v5.25H19.5V13.5a.75 .75 0 0 1 1.5 0Zm-9.53 .53a.75 .75 0 0 0 1.06 0l3.75-3.75a.75 .75 0 0 0-1.06-1.06L12.75 11.69V3a.75 .75 0 0 0-1.5 0v8.69L8.78 9.22a.75 .75 0 0 0-1.06 1.06Z\"],\"faded\":[0]},{\"id\":\"ph-upload-simple-duo\",\"label\":\"Upload duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5V19.5H3.75V4.5A1.5 1.5 0 0 1 5.25 3H18.75A1.5 1.5 0 0 1 20.25 4.5Z\",\"M21 13.5v6a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V13.5a.75 .75 0 0 1 1.5 0v5.25H19.5V13.5a.75 .75 0 0 1 1.5 0ZM8.78 7.28 11.25 4.81V13.5a.75 .75 0 0 0 1.5 0V4.81l2.47 2.47a.75 .75 0 0 0 1.06-1.06l-3.75-3.75a.75 .75 0 0 0-1.06 0l-3.75 3.75A.75 .75 0 0 0 8.78 7.28Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-clockwise-duo\",\"label\":\"Refresh duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12a8.25 8.25 0 1 1-8.25-8.25A8.25 8.25 0 0 1 20.25 12Z\",\"M21 4.5V9a.75 .75 0 0 1-.75 .75H15.75a.75 .75 0 0 1 0-1.5h2.69L17.07 6.88a7.46 7.46 0 0 0-5.26-2.2h-.04A7.46 7.46 0 0 0 6.52 6.82 .75 .75 0 0 1 5.48 5.74a9 9 0 0 1 12.66 .07L19.5 7.19V4.5a.75 .75 0 0 1 1.5 0ZM17.48 17.18a7.5 7.5 0 0 1-10.54-.06L5.56 15.75H8.25a.75 .75 0 0 0 0-1.5H3.75a.75 .75 0 0 0-.75 .75v4.5a.75 .75 0 0 0 1.5 0V16.81l1.37 1.37A8.95 8.95 0 0 0 12.19 20.82h.05a8.94 8.94 0 0 0 6.29-2.56 .75 .75 0 0 0-1.05-1.07Z\"],\"faded\":[0]},{\"id\":\"ph-power-duo\",\"label\":\"Power duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12a8.25 8.25 0 1 1-8.25-8.25A8.25 8.25 0 0 1 20.25 12Z\",\"M11.25 12V4.5a.75 .75 0 0 1 1.5 0v7.5a.75 .75 0 0 1-1.5 0Zm5.66-7.38a.75 .75 0 0 0-.82 1.26C18.26 7.29 19.5 9.52 19.5 12a7.5 7.5 0 0 1-15 0c0-2.48 1.24-4.71 3.41-6.12a.75 .75 0 0 0-.82-1.26C4.49 6.32 3 9.01 3 12a9 9 0 0 0 18 0C21 9.01 19.51 6.32 16.91 4.62Z\"],\"faded\":[0]},{\"id\":\"ph-sign-in-duo\",\"label\":\"Join duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 3.75V20.25H3.75a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 3.75 3.75Z\",\"M13.28 12.53l-3.75 3.75a.75 .75 0 0 1-1.06-1.06L10.94 12.75H2.25a.75 .75 0 0 1 0-1.5h8.69L8.47 8.78a.75 .75 0 0 1 1.06-1.06l3.75 3.75A.75 .75 0 0 1 13.28 12.53ZM18.75 3H12.75a.75 .75 0 0 0 0 1.5h5.25V19.5H12.75a.75 .75 0 0 0 0 1.5h6a.75 .75 0 0 0 .75-.75V3.75A.75 .75 0 0 0 18.75 3Z\"],\"faded\":[0]},{\"id\":\"ph-sign-out-duo\",\"label\":\"Leave duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V18.75a1.5 1.5 0 0 1-1.5 1.5H4.5V3.75H19.5A1.5 1.5 0 0 1 21 5.25Z\",\"M11.25 20.25a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V3.75a.75 .75 0 0 1 .75-.75h6a.75 .75 0 0 1 0 1.5H5.25V19.5h5.25A.75 .75 0 0 1 11.25 20.25Zm10.28-8.78-3.75-3.75a.75 .75 0 0 0-1.06 1.06L19.19 11.25H10.5a.75 .75 0 0 0 0 1.5h8.69l-2.47 2.47a.75 .75 0 0 0 1.06 1.06l3.75-3.75A.75 .75 0 0 0 21.53 11.47Z\"],\"faded\":[0]},{\"id\":\"ph-plus-circle-duo\",\"label\":\"Plus duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm4.5-8.25a.75 .75 0 0 1-.75 .75H12.75v3a.75 .75 0 0 1-1.5 0V12.75H8.25a.75 .75 0 0 1 0-1.5h3V8.25a.75 .75 0 0 1 1.5 0v3h3A.75 .75 0 0 1 16.5 12Z\"],\"faded\":[0]},{\"id\":\"ph-minus-circle-duo\",\"label\":\"Minus duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M16.5 12a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1 0-1.5h7.5A.75 .75 0 0 1 16.5 12Zm5.25 0A9.75 9.75 0 1 1 12 2.25 9.76 9.76 0 0 1 21.75 12Zm-1.5 0a8.25 8.25 0 1 0-8.25 8.25A8.26 8.26 0 0 0 20.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-ticket-duo\",\"label\":\"Ticket duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 12a3 3 0 0 0 3 3v3a.75 .75 0 0 1-.75 .75H9V5.25H21a.75 .75 0 0 1 .75 .75V9A3 3 0 0 0 18.75 12Z\",\"M21.75 9.75a.75 .75 0 0 0 .75-.75V6a1.5 1.5 0 0 0-1.5-1.5H3A1.5 1.5 0 0 0 1.5 6V9a.75 .75 0 0 0 .75 .75 2.25 2.25 0 0 1 0 4.5 .75 .75 0 0 0-.75 .75v3a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V15a.75 .75 0 0 0-.75-.75 2.25 2.25 0 0 1 0-4.5ZM3 15.68a3.75 3.75 0 0 0 0-7.35V6H8.25V18H3Zm18 0V18H9.75V6H21V8.32a3.75 3.75 0 0 0 0 7.35Z\"],\"faded\":[0]},{\"id\":\"ph-tag-duo\",\"label\":\"Tag duotone\",\"set\":\"duotone\",\"paths\":[\"M22.28 14.34 14.34 22.28a.75 .75 0 0 1-1.06 0L3.97 12.97A.75 .75 0 0 1 3.75 12.44V3.75h8.69a.75 .75 0 0 1 .53 .22l9.31 9.31A.75 .75 0 0 1 22.28 14.34Z\",\"M22.81 12.75 13.5 3.44A1.49 1.49 0 0 0 12.44 3H3.75a.75 .75 0 0 0-.75 .75v8.69A1.49 1.49 0 0 0 3.44 13.5L12.75 22.81a1.5 1.5 0 0 0 2.12 0l7.94-7.94a1.5 1.5 0 0 0 0-2.12Zm-9 9L4.5 12.44V4.5h7.94L21.75 13.81ZM9 7.88A1.13 1.13 0 1 1 7.88 6.75 1.13 1.13 0 0 1 9 7.88Z\"],\"faded\":[0]},{\"id\":\"ph-percent-duo\",\"label\":\"Percent duotone\",\"set\":\"duotone\",\"paths\":[\"M8.98 5.27a2.63 2.63 0 1 1-3.71 0A2.63 2.63 0 0 1 8.98 5.27Zm9.75 9.75a2.63 2.63 0 1 0 0 3.71A2.63 2.63 0 0 0 18.73 15.02Z\",\"M19.28 5.78l-13.5 13.5a.75 .75 0 0 1-1.06-1.06l13.5-13.5a.75 .75 0 0 1 1.06 1.06ZM4.74 9.51a3.38 3.38 0 0 1 4.77-4.77h0a3.38 3.38 0 0 1-4.77 4.77ZM5.25 7.13A1.88 1.88 0 1 0 8.45 5.8h0A1.88 1.88 0 0 0 5.25 7.13ZM20.25 16.88a3.38 3.38 0 1 1-.99-2.39h0A3.35 3.35 0 0 1 20.25 16.88Zm-1.5 0a1.88 1.88 0 1 0-.55 1.33A1.86 1.86 0 0 0 18.75 16.88Z\"],\"faded\":[0]},{\"id\":\"ph-sticker-duo\",\"label\":\"Sticker duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12.75c-.75 2.25-5.25 6.75-7.5 7.5V17.25a4.5 4.5 0 0 1 4.5-4.5Z\",\"M15.75 3H8.25A5.26 5.26 0 0 0 3 8.25v7.5a5.26 5.26 0 0 0 5.25 5.25h4.5a.76 .76 0 0 0 .24-.04c2.46-.82 7.15-5.52 7.97-7.97A.76 .76 0 0 0 21 12.75V8.25A5.26 5.26 0 0 0 15.75 3ZM4.5 15.75V8.25A3.75 3.75 0 0 1 8.25 4.5h7.5a3.75 3.75 0 0 1 3.75 3.75v3.75H17.25a5.26 5.26 0 0 0-5.25 5.25v2.25H8.25A3.75 3.75 0 0 1 4.5 15.75Zm9 3.29V17.25a3.75 3.75 0 0 1 3.75-3.75h1.79C17.91 15.33 15.33 17.91 13.5 19.04Z\"],\"faded\":[0]},{\"id\":\"ph-game-controller-duo\",\"label\":\"Gamepad duotone\",\"set\":\"duotone\",\"paths\":[\"M20.33 19.46a2.63 2.63 0 0 1-2.31-.73L14.07 14.25H16.13a4.87 4.87 0 0 0 4.8-5.72h0l1.53 7.89A2.63 2.63 0 0 1 20.33 19.46Z\",\"M16.5 10.5H14.25a.75 .75 0 0 1 0-1.5h2.25a.75 .75 0 0 1 0 1.5ZM9.75 9H9V8.25a.75 .75 0 0 0-1.5 0v.75H6.75a.75 .75 0 0 0 0 1.5h.75v.75a.75 .75 0 0 0 1.5 0v-.75h.75a.75 .75 0 0 0 0-1.5ZM22.64 18.81a3.38 3.38 0 0 1-5.15 .45c-.01-.01-.02-.02-.03-.03L13.73 15h-3.47L6.54 19.23l-.03 .03A3.38 3.38 0 0 1 4.13 20.25 3.38 3.38 0 0 1 .8 16.29a.06 .06 0 0 1 0-.01L2.34 8.39A5.61 5.61 0 0 1 7.86 3.75H16.13a5.63 5.63 0 0 1 5.53 4.62c0 .01 0 .01 0 .02l1.53 7.89a.06 .06 0 0 1 0 .01A3.35 3.35 0 0 1 22.64 18.81ZM16.13 13.5a4.13 4.13 0 0 0 0-8.25H7.86A4.12 4.12 0 0 0 3.81 8.66l0 .01L2.28 16.56A1.88 1.88 0 0 0 5.44 18.22l3.93-4.46a.75 .75 0 0 1 .56-.25Zm5.6 3.06-.82-4.22A5.63 5.63 0 0 1 16.13 15h-.39L18.56 18.22a1.88 1.88 0 0 0 1.64 .51 1.88 1.88 0 0 0 1.52-2.17Z\"],\"faded\":[0]},{\"id\":\"ph-sword-duo\",\"label\":\"Sword duotone\",\"set\":\"duotone\",\"paths\":[\"M13.28 18.84 12.09 20.03a.75 .75 0 0 1-1.06 0L8.63 17.63 5.47 20.78a.75 .75 0 0 1-1.06 0L3.22 19.59a.75 .75 0 0 1 0-1.06L6.38 15.38 3.97 12.97a.75 .75 0 0 1 0-1.06L5.16 10.72a.75 .75 0 0 1 1.06 0l7.06 7.06A.75 .75 0 0 1 13.28 18.84Z\",\"M20.25 3H14.25a.75 .75 0 0 0-.59 .29l-6 7.8L6.75 10.19a1.5 1.5 0 0 0-2.12 0l-1.19 1.19a1.5 1.5 0 0 0 0 2.12l1.88 1.88-2.62 2.63a1.5 1.5 0 0 0 0 2.12l1.19 1.19a1.5 1.5 0 0 0 2.12 0l2.63-2.62 1.88 1.88a1.5 1.5 0 0 0 2.12 0l1.19-1.19a1.5 1.5 0 0 0 0-2.12l-.9-.9 7.8-6A.75 .75 0 0 0 21 9.75V3.75A.75 .75 0 0 0 20.25 3ZM4.94 20.25 3.75 19.06l2.63-2.62L7.56 17.63Zm6.62-.75L4.5 12.44 5.69 11.25 12.75 18.31ZM19.5 9.38l-7.66 5.9L10.81 14.25l4.72-4.72a.75 .75 0 0 0-1.06-1.06L9.75 13.19 8.73 12.16 14.62 4.5H19.5Z\"],\"faded\":[0]},{\"id\":\"ph-target-duo\",\"label\":\"Target duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 12a4.5 4.5 0 1 1-4.5-4.5A4.5 4.5 0 0 1 16.5 12Z\",\"M20.8 7.8A9.76 9.76 0 1 1 18.34 4.59l2.13-2.13a.75 .75 0 0 1 1.06 1.06l-9 9a.75 .75 0 0 1-1.06-1.06l2.6-2.6a3.75 3.75 0 1 0 1.68 2.91 .75 .75 0 1 1 1.5-.08 5.25 5.25 0 1 1-2.1-3.9L17.28 5.66a8.24 8.24 0 1 0 2.17 2.78 .75 .75 0 0 1 1.35-.65Z\"],\"faded\":[0]},{\"id\":\"ph-puzzle-piece-duo\",\"label\":\"Puzzle duotone\",\"set\":\"duotone\",\"paths\":[\"M19.13 15.75a2.63 2.63 0 0 0 1.13-.25V19.5a.75 .75 0 0 1-.75 .75H6a.75 .75 0 0 1-.75-.75V15.5a2.63 2.63 0 1 1 0-4.75V6.75a.75 .75 0 0 1 .75-.75h4.38a2.63 2.63 0 1 1 4.74 0H19.5a.75 .75 0 0 1 .75 .75v4A2.63 2.63 0 1 0 19.13 15.75Z\",\"M20.65 14.86a.75 .75 0 0 0-.72-.04 1.88 1.88 0 1 1 0-3.39A.75 .75 0 0 0 21 10.75V6.75a1.5 1.5 0 0 0-1.5-1.5H16.1a3.32 3.32 0 0 0 .02-.37 3.39 3.39 0 0 0-1.06-2.46 3.38 3.38 0 0 0-5.68 2.22 3.43 3.43 0 0 0 .01 .62H6A1.5 1.5 0 0 0 4.5 6.75v3.02a3.32 3.32 0 0 0-.37-.02 3.39 3.39 0 0 0-2.46 1.07 3.35 3.35 0 0 0-.91 2.53 3.38 3.38 0 0 0 3.12 3.15 3.43 3.43 0 0 0 .62-.01V19.5a1.5 1.5 0 0 0 1.5 1.5H19.5a1.5 1.5 0 0 0 1.5-1.5V15.5A.75 .75 0 0 0 20.65 14.86ZM19.5 19.5H6V15.5a.75 .75 0 0 0-1.07-.68 1.88 1.88 0 1 1 0-3.39A.75 .75 0 0 0 6 10.75V6.75h4.38a.75 .75 0 0 0 .68-1.07 1.88 1.88 0 1 1 3.39 0A.75 .75 0 0 0 15.12 6.75H19.5v3.02a3.35 3.35 0 0 0-.62-.01A3.38 3.38 0 0 0 19.13 16.5a3.32 3.32 0 0 0 .38-.02Z\"],\"faded\":[0]},{\"id\":\"ph-chart-bar-duo\",\"label\":\"Chart duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 3.75V19.5H14.25V3.75Z\",\"M21 18.75h-.75V3.75a.75 .75 0 0 0-.75-.75H14.25a.75 .75 0 0 0-.75 .75V7.5H9a.75 .75 0 0 0-.75 .75v3.75H4.5a.75 .75 0 0 0-.75 .75v6H3a.75 .75 0 0 0 0 1.5H21a.75 .75 0 0 0 0-1.5ZM15 4.5h3.75V18.75H15ZM9.75 9h3.75V18.75H9.75ZM5.25 13.5H8.25v5.25H5.25Z\"],\"faded\":[0]},{\"id\":\"ph-chart-line-up-duo\",\"label\":\"Growth duotone\",\"set\":\"duotone\",\"paths\":[\"M21 6V19.5H3V4.5H19.5A1.5 1.5 0 0 1 21 6Z\",\"M21.75 19.5a.75 .75 0 0 1-.75 .75H3a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 1.5 0V14.69l4.72-4.72a.75 .75 0 0 1 1.06 0L12 12.44 16.94 7.5H15a.75 .75 0 0 1 0-1.5h3.75a.75 .75 0 0 1 .75 .75v3.75a.75 .75 0 0 1-1.5 0V8.56l-5.47 5.47a.75 .75 0 0 1-1.06 0L9 11.56l-5.25 5.25V18.75H21A.75 .75 0 0 1 21.75 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-trend-up-duo\",\"label\":\"Trending up duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 5.25v6L15.75 5.25Z\",\"M21.75 4.5H15.75a.75 .75 0 0 0-.53 1.28L17.69 8.25 12.75 13.19l-3.22-3.22a.75 .75 0 0 0-1.06 0l-6.75 6.75a.75 .75 0 0 0 1.06 1.06L9 11.56l3.22 3.22a.75 .75 0 0 0 1.06 0L18.75 9.31l2.47 2.47A.75 .75 0 0 0 22.5 11.25V5.25A.75 .75 0 0 0 21.75 4.5Zm-.75 4.94L17.56 6H21Z\"],\"faded\":[0]},{\"id\":\"ph-trend-down-duo\",\"label\":\"Trending down duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12v6H15.75Z\",\"M22.04 11.31a.75 .75 0 0 0-.82 .16L18.75 13.94 13.28 8.47a.75 .75 0 0 0-1.06 0L9 11.69 2.78 5.47A.75 .75 0 0 0 1.72 6.53l6.75 6.75a.75 .75 0 0 0 1.06 0L12.75 10.06 17.69 15l-2.47 2.47A.75 .75 0 0 0 15.75 18.75h6a.75 .75 0 0 0 .75-.75V12A.75 .75 0 0 0 22.04 11.31ZM21 17.25H17.56L21 13.81Z\"],\"faded\":[0]},{\"id\":\"ph-pulse-duo\",\"label\":\"Activity duotone\",\"set\":\"duotone\",\"paths\":[\"M9 3.75l3.14 8.25H5.25Zm9.75 8.25H12.14L15 19.5Z\",\"M22.5 12a.75 .75 0 0 1-.75 .75H19.21l-3.54 7.09A.75 .75 0 0 1 15 20.25h-.04a.75 .75 0 0 1-.66-.48L8.94 5.7 5.93 12.31A.75 .75 0 0 1 5.25 12.75H2.25a.75 .75 0 0 1 0-1.5H4.77L8.32 3.44a.75 .75 0 0 1 1.38 .04l5.39 14.16 2.99-5.97A.75 .75 0 0 1 18.75 11.25h3A.75 .75 0 0 1 22.5 12Z\"],\"faded\":[0]},{\"id\":\"ph-sun-duo\",\"label\":\"Sun duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 12a5.25 5.25 0 1 1-5.25-5.25A5.25 5.25 0 0 1 17.25 12Z\",\"M11.25 3.75V1.5a.75 .75 0 0 1 1.5 0V3.75a.75 .75 0 0 1-1.5 0Zm6.75 8.25a6 6 0 1 1-6-6A6.01 6.01 0 0 1 18 12Zm-1.5 0a4.5 4.5 0 1 0-4.5 4.5A4.5 4.5 0 0 0 16.5 12ZM5.47 6.53A.75 .75 0 0 0 6.53 5.47l-1.5-1.5A.75 .75 0 0 0 3.97 5.03Zm0 10.94-1.5 1.5a.75 .75 0 0 0 1.06 1.06l1.5-1.5a.75 .75 0 0 0-1.06-1.06ZM18 6.75a.75 .75 0 0 0 .53-.22l1.5-1.5a.75 .75 0 0 0-1.06-1.06l-1.5 1.5A.75 .75 0 0 0 18 6.75Zm.53 10.72a.75 .75 0 0 0-1.06 1.06l1.5 1.5a.75 .75 0 0 0 1.06-1.06ZM4.5 12a.75 .75 0 0 0-.75-.75H1.5a.75 .75 0 0 0 0 1.5H3.75A.75 .75 0 0 0 4.5 12Zm7.5 7.5a.75 .75 0 0 0-.75 .75v2.25a.75 .75 0 0 0 1.5 0V20.25A.75 .75 0 0 0 12 19.5Zm10.5-8.25H20.25a.75 .75 0 0 0 0 1.5h2.25a.75 .75 0 0 0 0-1.5Z\"],\"faded\":[0]},{\"id\":\"ph-moon-duo\",\"label\":\"Moon duotone\",\"set\":\"duotone\",\"paths\":[\"M21.36 13.86A9 9 0 1 1 10.14 2.64 9.01 9.01 0 0 0 21.36 13.86Z\",\"M21.89 13.33a.75 .75 0 0 0-.75-.19 8.26 8.26 0 0 1-10.29-10.29 .75 .75 0 0 0-.94-.94 9.83 9.83 0 0 0-4.96 3.47A9.75 9.75 0 0 0 12.75 21a9.66 9.66 0 0 0 5.86-1.96 9.83 9.83 0 0 0 3.47-4.96A.75 .75 0 0 0 21.89 13.33ZM17.71 17.84A8.25 8.25 0 0 1 6.16 6.29a8.34 8.34 0 0 1 2.94-2.44A9.94 9.94 0 0 0 9 5.25 9.76 9.76 0 0 0 18.75 15a9.94 9.94 0 0 0 1.4-.1A8.34 8.34 0 0 1 17.71 17.84Z\"],\"faded\":[0]},{\"id\":\"ph-cloud-duo\",\"label\":\"Cloud duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 12a7.5 7.5 0 0 1-7.5 7.5H6.75A5.25 5.25 0 1 1 8.06 9.16l0 .01A7.5 7.5 0 0 1 22.5 12Z\",\"M15 3.75A8.26 8.26 0 0 0 7.62 8.31 6 6 0 1 0 6.75 20.25h8.25a8.25 8.25 0 0 0 0-16.5Zm0 15H6.75a4.5 4.5 0 0 1 0-9c.1 0 .21 0 .31 .01A8.25 8.25 0 0 0 6.75 12a.75 .75 0 0 0 1.5 0 6.75 6.75 0 1 1 6.75 6.75Z\"],\"faded\":[0]},{\"id\":\"ph-snowflake-duo\",\"label\":\"Snow duotone\",\"set\":\"duotone\",\"paths\":[\"M20.63 12a8.63 8.63 0 1 1-8.62-8.62A8.63 8.63 0 0 1 20.63 12Z\",\"M20.98 14.07a.75 .75 0 0 1-.55 .91l-2.31 .56 .61 2.26a.75 .75 0 0 1-.53 .92A.77 .77 0 0 1 18 18.75a.75 .75 0 0 1-.72-.56l-.72-2.7L12.75 13.3v4.39l2.03 2.03a.75 .75 0 0 1-1.06 1.06L12 19.06l-1.72 1.72a.75 .75 0 0 1-1.06-1.06L11.25 17.69V13.3L7.45 15.49l-.72 2.7A.75 .75 0 0 1 6 18.75a.77 .77 0 0 1-.19-.03 .75 .75 0 0 1-.53-.92l.61-2.26-2.31-.56a.75 .75 0 0 1 .36-1.46l2.76 .68L10.5 12 6.69 9.8l-2.76 .68A.74 .74 0 0 1 3.75 10.5a.75 .75 0 0 1-.18-1.48l2.31-.56L5.28 6.19a.75 .75 0 0 1 1.45-.39l.72 2.7L11.25 10.7V6.31L9.22 4.28a.75 .75 0 0 1 1.06-1.06L12 4.94l1.72-1.72a.75 .75 0 0 1 1.06 1.06L12.75 6.31v4.39l3.8-2.19 .72-2.7a.75 .75 0 0 1 1.45 .39l-.61 2.26 2.31 .56A.75 .75 0 0 1 20.25 10.5a.74 .74 0 0 1-.18-.02l-2.76-.68L13.5 12l3.81 2.2 2.76-.68A.75 .75 0 0 1 20.98 14.07Z\"],\"faded\":[0]},{\"id\":\"ph-leaf-duo\",\"label\":\"Leaf duotone\",\"set\":\"duotone\",\"paths\":[\"M5.98 18.02c-4.49-7.48 1.5-14.96 14.22-14.22C20.95 16.52 13.46 22.51 5.98 18.02Z\",\"M20.95 3.76a.75 .75 0 0 0-.7-.7C13.11 2.63 7.39 4.78 4.95 8.81a8.16 8.16 0 0 0-1.2 4.59c.05 1.49 .49 3 1.29 4.49l-1.83 1.83a.75 .75 0 0 0 1.06 1.06l1.83-1.83C7.59 19.76 9.1 20.19 10.59 20.24q.16 .01 .31 .01A8.15 8.15 0 0 0 15.19 19.05C19.22 16.61 21.37 10.89 20.95 3.76ZM14.41 17.77c-2.13 1.29-4.66 1.31-7.19 .07l8.31-8.31a.75 .75 0 0 0-1.06-1.06L6.16 16.78c-1.24-2.53-1.22-5.06 .07-7.19 2.07-3.42 6.99-5.29 13.25-5.07C19.71 10.77 17.83 15.69 14.41 17.77Z\"],\"faded\":[0]},{\"id\":\"ph-tree-duo\",\"label\":\"Tree duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 11.98c.01 3.18-2.66 5.93-5.84 6.02a5.97 5.97 0 0 1-3.91-1.31 5.97 5.97 0 0 1-3.9 1.31c-3.18-.08-5.85-2.83-5.85-6.01a6 6 0 0 1 3.76-5.55 6.38 6.38 0 0 1 11.98 0A6 6 0 0 1 21.75 11.98Z\",\"M18.57 5.87a7.13 7.13 0 0 0-13.14 0A6.72 6.72 0 0 0 1.5 11.98C1.49 15.56 4.5 18.66 8.08 18.75A6.77 6.77 0 0 0 11.25 18.04V21.75a.75 .75 0 0 0 1.5 0V18.04A6.77 6.77 0 0 0 15.75 18.75l.17 0C19.5 18.66 22.51 15.56 22.5 11.98A6.72 6.72 0 0 0 18.57 5.87ZM15.89 17.25a5.26 5.26 0 0 1-3.14-.94v-3.84l4.09-2.04a.75 .75 0 1 0-.67-1.34L12.75 10.79V8.25a.75 .75 0 0 0-1.5 0v4.79L7.84 11.33a.75 .75 0 1 0-.67 1.34L11.25 14.71v1.59a5.25 5.25 0 0 1-3.14 .94C5.33 17.18 2.99 14.77 3 11.99A5.23 5.23 0 0 1 6.29 7.13a.75 .75 0 0 0 .42-.44 5.63 5.63 0 0 1 10.57 0A.75 .75 0 0 0 17.71 7.13 5.23 5.23 0 0 1 21 11.99C21.01 14.77 18.67 17.18 15.89 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-flower-duo\",\"label\":\"Flower duotone\",\"set\":\"duotone\",\"paths\":[\"M19.35 12.78c-.83-.48-2.29-.69-3.69-.78 1.4-.09 2.86-.3 3.69-.78a3 3 0 1 0-3-5.2c-.83 .48-1.74 1.64-2.52 2.81C14.45 7.58 15 6.21 15 5.25a3 3 0 0 0-6 0c0 .96 .55 2.33 1.17 3.59-.77-1.17-1.69-2.33-2.52-2.81a3 3 0 1 0-3 5.2c.83 .48 2.29 .69 3.69 .78-1.4 .09-2.86 .3-3.69 .78a3 3 0 1 0 3 5.2c.83-.48 1.74-1.64 2.52-2.81C9.55 16.42 9 17.79 9 18.75a3 3 0 0 0 6 0c0-.96-.55-2.33-1.17-3.59 .77 1.17 1.69 2.33 2.52 2.81a3 3 0 1 0 3-5.2ZM14.6 13.5A3 3 0 1 1 15 12 2.98 2.98 0 0 1 14.6 13.5Z\",\"M19.72 12.13c-.08-.04-.16-.09-.25-.13 .09-.04 .17-.08 .25-.13a3.75 3.75 0 1 0-3.75-6.49c-.08 .04-.15 .09-.23 .15 .01-.09 .01-.19 .01-.28a3.75 3.75 0 0 0-7.5 0c0 .09 0 .18 .01 .28-.08-.05-.16-.11-.23-.15a3.75 3.75 0 1 0-3.75 6.5c.08 .04 .16 .09 .25 .13-.09 .04-.17 .08-.25 .13a3.75 3.75 0 1 0 3.75 6.5c.08-.04 .15-.09 .23-.15-.01 .09-.01 .19-.01 .28a3.75 3.75 0 0 0 7.5 0c0-.09 0-.18-.01-.28 .08 .05 .16 .11 .23 .15A3.73 3.73 0 0 0 17.84 19.13a3.79 3.79 0 0 0 .98-.13 3.75 3.75 0 0 0 .9-6.87ZM9.75 12a2.25 2.25 0 1 1 2.25 2.25A2.25 2.25 0 0 1 9.75 12Zm6.97-5.32a2.25 2.25 0 1 1 2.25 3.9c-.59 .34-1.74 .57-3.3 .67A3.75 3.75 0 0 0 14.49 9.2C15.35 7.9 16.13 7.02 16.72 6.68ZM12 3a2.25 2.25 0 0 1 2.25 2.25c0 .68-.37 1.8-1.06 3.19a3.73 3.73 0 0 0-2.37 0C10.13 7.05 9.75 5.93 9.75 5.25A2.25 2.25 0 0 1 12 3ZM4.21 7.5a2.25 2.25 0 0 1 3.07-.82c.59 .34 1.37 1.23 2.23 2.52A3.75 3.75 0 0 0 8.33 11.25c-1.55-.1-2.71-.33-3.3-.67A2.25 2.25 0 0 1 4.21 7.5ZM7.28 17.32a2.25 2.25 0 1 1-2.25-3.9c.59-.34 1.74-.57 3.3-.67a3.75 3.75 0 0 0 1.19 2.05C8.65 16.1 7.87 16.98 7.28 17.32ZM12 21a2.25 2.25 0 0 1-2.25-2.25c0-.68 .38-1.8 1.07-3.19a3.73 3.73 0 0 0 2.37 0C13.88 16.95 14.25 18.07 14.25 18.75A2.25 2.25 0 0 1 12 21Zm7.79-4.5a2.25 2.25 0 0 1-3.07 .82c-.59-.34-1.37-1.23-2.23-2.52A3.75 3.75 0 0 0 15.67 12.75c1.55 .1 2.71 .33 3.3 .67A2.25 2.25 0 0 1 19.79 16.5Z\"],\"faded\":[0]},{\"id\":\"ph-paw-print-duo\",\"label\":\"Paw duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 10.13a1.88 1.88 0 1 1-1.87-1.87A1.88 1.88 0 0 1 21.75 10.13ZM6 10.13a1.88 1.88 0 1 0-1.87 1.88A1.88 1.88 0 0 0 6 10.13ZM8.63 7.5A1.88 1.88 0 1 0 6.75 5.63 1.88 1.88 0 0 0 8.63 7.5Zm6.75 0a1.88 1.88 0 1 0-1.87-1.87A1.88 1.88 0 0 0 15.38 7.5Zm1.8 7.11A4.07 4.07 0 0 1 15.24 12.19a3.38 3.38 0 0 0-6.48 0 4.08 4.08 0 0 1-1.94 2.43 3 3 0 0 0 2.6 5.4 6.8 6.8 0 0 1 5.16 0 3 3 0 0 0 2.6-5.4Z\",\"M19.88 7.5a2.63 2.63 0 1 0 2.63 2.63A2.63 2.63 0 0 0 19.88 7.5Zm0 3.75a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 19.88 11.25ZM6.75 10.13a2.63 2.63 0 1 0-2.62 2.63A2.63 2.63 0 0 0 6.75 10.13ZM4.13 11.25a1.13 1.13 0 1 1 1.13-1.12A1.13 1.13 0 0 1 4.13 11.25ZM8.63 8.25A2.63 2.63 0 1 0 6 5.63 2.63 2.63 0 0 0 8.63 8.25Zm0-3.75A1.13 1.13 0 1 1 7.5 5.63 1.13 1.13 0 0 1 8.63 4.5Zm6.75 3.75a2.63 2.63 0 1 0-2.62-2.62A2.63 2.63 0 0 0 15.38 8.25Zm0-3.75a1.13 1.13 0 1 1-1.12 1.13A1.13 1.13 0 0 1 15.38 4.5Zm2.17 9.46a3.31 3.31 0 0 1-1.58-1.98 4.13 4.13 0 0 0-7.92 0A3.3 3.3 0 0 1 6.47 13.95 3.75 3.75 0 0 0 8.25 21a3.7 3.7 0 0 0 1.46-.29 6.01 6.01 0 0 1 4.58 0 3.75 3.75 0 0 0 3.26-6.75ZM15.75 19.5a2.25 2.25 0 0 1-.89-.18 7.51 7.51 0 0 0-5.74 0 2.25 2.25 0 0 1-1.94-4.06 4.8 4.8 0 0 0 2.29-2.88 2.63 2.63 0 0 1 5.04 0 4.81 4.81 0 0 0 2.3 2.88A2.25 2.25 0 0 1 15.75 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-dog-duo\",\"label\":\"Dog duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 11.29V17.25a3 3 0 0 1-3 3H7.5a3 3 0 0 1-3-3V11.29L9.75 4.5h4.5Z\",\"M22.47 11.72l-1.54-8.25a1.5 1.5 0 0 0-1.84-1.18l-.03 .01L14.14 3.75h-4.28L4.93 2.3l-.03-.01A1.5 1.5 0 0 0 3.07 3.47L1.53 11.72a1.48 1.48 0 0 0 .86 1.64A1.52 1.52 0 0 0 3.01 13.5 1.45 1.45 0 0 0 3.75 13.3V17.25a3.75 3.75 0 0 0 3.75 3.75h9a3.75 3.75 0 0 0 3.75-3.75V13.3a1.45 1.45 0 0 0 .74 .2 1.53 1.53 0 0 0 .63-.14A1.48 1.48 0 0 0 22.47 11.72ZM3 12h0L4.54 3.75 8.48 4.91Zm13.5 7.5H12.75V18.31l1.28-1.28a.75 .75 0 0 0-1.06-1.06L12 16.94l-.97-.97a.75 .75 0 0 0-1.06 1.06L11.25 18.31V19.5H7.5a2.25 2.25 0 0 1-2.25-2.25V11.54L10.12 5.25h3.76L18.75 11.54V17.25A2.25 2.25 0 0 1 16.5 19.5Zm4.5-7.5L15.52 4.91 19.46 3.75 21 12ZM9.75 13.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.75 13.13Zm6.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 13.13Z\"],\"faded\":[0]},{\"id\":\"ph-cat-duo\",\"label\":\"Cat duotone\",\"set\":\"duotone\",\"paths\":[\"M21 4.5v8.25c0 4.56-4.03 8.25-9 8.25s-9-3.69-9-8.25V4.5a.75 .75 0 0 1 1.28-.53L6.34 6.34h0a9.64 9.64 0 0 1 11.33 0h0l2.06-2.37A.75 .75 0 0 1 21 4.5Z\",\"M9 13.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9 13.13Zm7.13-1.12a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 16.13 12Zm5.63-7.5v8.25c0 4.96-4.37 9-9.75 9S2.25 17.71 2.25 12.75V4.5A1.5 1.5 0 0 1 4.81 3.44c.01 .01 .02 .03 .04 .04L6.47 5.34a10.43 10.43 0 0 1 11.07 0L19.15 3.48c.01-.01 .02-.03 .04-.04A1.5 1.5 0 0 1 21.75 4.5Zm-1.5 0-2.02 2.33A.75 .75 0 0 1 17.22 6.94 8.33 8.33 0 0 0 15.75 6.07V8.25a.75 .75 0 1 1-1.5 0V5.54a9.13 9.13 0 0 0-1.5-.25V8.25a.75 .75 0 1 1-1.5 0V5.28a9.13 9.13 0 0 0-1.5 .26V8.25a.75 .75 0 1 1-1.5 0V6.07A8.33 8.33 0 0 0 6.78 6.94a.75 .75 0 0 1-1.01-.11L3.75 4.5v8.25c0 3.91 3.3 7.13 7.5 7.47V18.31l-1.28-1.28a.75 .75 0 0 1 1.06-1.06L12 16.94l.97-.97a.75 .75 0 0 1 1.06 1.06L12.75 18.31v1.91c4.2-.35 7.5-3.56 7.5-7.47Z\"],\"faded\":[0]},{\"id\":\"ph-fish-duo\",\"label\":\"Fish duotone\",\"set\":\"duotone\",\"paths\":[\"M17.42 15.71c-1.69 1.3-4.14 2.19-7.66 2.28L7.51 23.25l-1.5-5.26L.75 16.49l5.26-2.25c.08-3.51 .98-5.96 2.28-7.65A4.13 4.13 0 0 0 12.77 11.23a4.13 4.13 0 0 0 4.65 4.48Z\",\"M15.75 7.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 15.75 7.13Zm4.57 6.34c-1.82 3.27-5.2 5.04-10.05 5.26l-2.06 4.82A.75 .75 0 0 1 7.51 24l-.05 0a.75 .75 0 0 1-.67-.54L5.4 18.6 .54 17.21a.75 .75 0 0 1-.09-1.41l4.82-2.06c.22-4.85 1.99-8.23 5.26-10.05 2.32-1.29 4.94-1.48 6.74-1.42 1.75 .06 3.38 .4 3.64 .56a.75 .75 0 0 1 .27 .27c.16 .27 .5 1.89 .56 3.64C21.8 8.52 21.61 11.15 20.32 13.47Zm-5.17 2.72a4.89 4.89 0 0 1-3.13-4.2A4.88 4.88 0 0 1 7.82 8.86q-.98 2.23-1.06 5.4a.75 .75 0 0 1-.45 .67L2.98 16.35l3.23 .92a.75 .75 0 0 1 .51 .52l.92 3.23 1.42-3.32a.75 .75 0 0 1 .67-.45Q12.91 17.17 15.14 16.18ZM19.91 4.08c-1.33-.28-6.01-1.03-9.4 1.38a7.61 7.61 0 0 0-1.5 1.41 3.38 3.38 0 0 0 3.69 3.6 .75 .75 0 0 1 .82 .82 3.38 3.38 0 0 0 3.61 3.69 7.58 7.58 0 0 0 1.41-1.5C20.95 10.1 20.2 5.41 19.91 4.08Z\"],\"faded\":[0]},{\"id\":\"ph-bird-duo\",\"label\":\"Bird duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 7.5 19.5 9v2.25a9 9 0 0 1-9 9H2.25a.75 .75 0 0 1-.59-1.22L9.75 9.33V7.21c0-2.7 2.16-4.95 4.85-4.96a4.88 4.88 0 0 1 4.74 3.65Z\",\"M16.5 6.38a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.5 6.38Zm6 1.13a.75 .75 0 0 1-.33 .62L20.25 9.4V11.25A9.76 9.76 0 0 1 10.5 21H2.25a1.5 1.5 0 0 1-1.17-2.44l.01-.01L9 9.06V7.21C9 4.08 11.51 1.52 14.6 1.5H14.63a5.63 5.63 0 0 1 5.36 3.92l2.18 1.45A.75 .75 0 0 1 22.5 7.5Zm-2.1 0L18.93 6.52a.75 .75 0 0 1-.31-.43A4.13 4.13 0 0 0 14.63 3h-.02C12.34 3.01 10.5 4.9 10.5 7.21V9.33a.75 .75 0 0 1-.17 .48L2.25 19.5h2.52l6.65-7.98a.75 .75 0 1 1 1.15 .96L6.73 19.5H10.5a8.26 8.26 0 0 0 8.25-8.25V9a.75 .75 0 0 1 .33-.62Z\"],\"faded\":[0]},{\"id\":\"ph-pizza-duo\",\"label\":\"Pizza duotone\",\"set\":\"duotone\",\"paths\":[\"M20.44 8.6 17.54 13.35A3 3 0 1 0 14.44 18.45l-1.79 2.94a.75 .75 0 0 1-1.28 0L7.9 15.72a3 3 0 1 0-2.86-4.69L3.56 8.6a14.98 14.98 0 0 1 16.88 0Z\",\"M22.46 5.91a1.49 1.49 0 0 0-.68-.93 18.89 18.89 0 0 0-19.55 0 1.5 1.5 0 0 0-.5 2.06l9 14.74a1.5 1.5 0 0 0 2.57 0L18.19 13.74v0l4.09-6.7A1.48 1.48 0 0 0 22.46 5.91ZM5.96 11.11a2.25 2.25 0 1 1 2.29 3.76Zm8.24 6.28A2.25 2.25 0 0 1 16.5 13.63Zm3.09-5.06a3.75 3.75 0 0 0-3.88 6.35L12 21 9.05 16.17a3.75 3.75 0 1 0-3.88-6.35L4.57 8.84a14.25 14.25 0 0 1 14.85 0Zm2.92-4.77a15.76 15.76 0 0 0-16.41 0L3 6.26a17.4 17.4 0 0 1 18 0Z\"],\"faded\":[0]},{\"id\":\"ph-coffee-duo\",\"label\":\"Coffee duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 8.25v4.5a8.25 8.25 0 0 1-4.81 7.5H7.81A8.25 8.25 0 0 1 3 12.75V8.25Z\",\"M7.5 5.25V2.25a.75 .75 0 0 1 1.5 0V5.25a.75 .75 0 0 1-1.5 0Zm3.75 .75a.75 .75 0 0 0 .75-.75V2.25a.75 .75 0 0 0-1.5 0V5.25A.75 .75 0 0 0 11.25 6Zm3 0a.75 .75 0 0 0 .75-.75V2.25a.75 .75 0 0 0-1.5 0V5.25A.75 .75 0 0 0 14.25 6Zm9 5.25v.75a3.75 3.75 0 0 1-3.52 3.74 9.06 9.06 0 0 1-2.53 3.76H19.5a.75 .75 0 0 1 0 1.5H3a.75 .75 0 0 1 0-1.5H5.3A9.03 9.03 0 0 1 2.25 12.75V8.25a.75 .75 0 0 1 .75-.75H19.5A3.75 3.75 0 0 1 23.25 11.25ZM18.75 9H3.75v3.75a7.53 7.53 0 0 0 4.23 6.75h6.54A7.53 7.53 0 0 0 18.75 12.75Zm3 2.25a2.25 2.25 0 0 0-1.5-2.12V12.75a8.98 8.98 0 0 1-.11 1.41A2.25 2.25 0 0 0 21.75 12Z\"],\"faded\":[0]},{\"id\":\"ph-cake-duo\",\"label\":\"Cake duotone\",\"set\":\"duotone\",\"paths\":[\"M9.75 4.5c0-2.25 2.25-3.75 2.25-3.75s2.25 1.5 2.25 3.75a2.25 2.25 0 0 1-4.5 0ZM19.5 9H4.5a1.5 1.5 0 0 0-1.5 1.5v2.19c0 1.64 1.28 3.02 2.92 3.06A3 3 0 0 0 9 12.75a3 3 0 0 0 6 0 3 3 0 0 0 3.08 3c1.63-.04 2.92-1.43 2.92-3.06V10.5A1.5 1.5 0 0 0 19.5 9Z\",\"M21.75 10.5a2.25 2.25 0 0 0-2.25-2.25H12.75V7.41a3.01 3.01 0 0 0 2.25-2.91c0-2.62-2.48-4.3-2.58-4.37a.75 .75 0 0 0-.83 0C11.48 .2 9 1.88 9 4.5a3.01 3.01 0 0 0 2.25 2.91v.84H4.5a2.25 2.25 0 0 0-2.25 2.25v2.19a3.83 3.83 0 0 0 .75 2.27V18.75a2.25 2.25 0 0 0 2.25 2.25H18.75a2.25 2.25 0 0 0 2.25-2.25V14.96a3.83 3.83 0 0 0 .75-2.27ZM10.5 4.5c0-1.27 .94-2.29 1.5-2.79 .56 .5 1.5 1.52 1.5 2.79a1.5 1.5 0 0 1-3 0ZM3.75 10.5a.75 .75 0 0 1 .75-.75H19.5a.75 .75 0 0 1 .75 .75v2.19c0 1.24-.98 2.28-2.19 2.31A2.25 2.25 0 0 1 15.75 12.75a.75 .75 0 0 0-1.5 0 2.25 2.25 0 0 1-4.5 0 .75 .75 0 0 0-1.5 0 2.25 2.25 0 0 1-2.31 2.25C4.73 14.97 3.75 13.93 3.75 12.69Zm15 9H5.25a.75 .75 0 0 1-.75-.75V16.18A3.63 3.63 0 0 0 5.9 16.5a3.72 3.72 0 0 0 2.72-1.06A3.78 3.78 0 0 0 9 15a3.75 3.75 0 0 0 6 0 3.78 3.78 0 0 0 .39 .44A3.72 3.72 0 0 0 18 16.5c.04 0 .07 0 .11 0A3.63 3.63 0 0 0 19.5 16.18V18.75A.75 .75 0 0 1 18.75 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-beer-bottle-duo\",\"label\":\"Beer duotone\",\"set\":\"duotone\",\"paths\":[\"M15 15l-5.25 5.25L3.75 14.25 9 9Z\",\"M23.03 3.97l-3-3a.75 .75 0 0 0-1.06 1.06l.14 .14L13.94 6.05l-3.58 .72a.75 .75 0 0 0-.38 .2L2.16 14.78a2.25 2.25 0 0 0 0 3.18L6.04 21.84a2.25 2.25 0 0 0 3.18 0l7.81-7.81a.75 .75 0 0 0 .2-.38l.72-3.58 3.88-5.17 .14 .14a.75 .75 0 0 0 1.06-1.06ZM9.75 19.19 4.81 14.25 9 10.06 13.94 15ZM7.63 21a.74 .74 0 0 1-.53-.22L3.22 16.9a.75 .75 0 0 1 0-1.06L3.75 15.31 8.69 20.25 8.16 20.78A.75 .75 0 0 1 7.63 21ZM16.65 9.3a.74 .74 0 0 0-.13 .3l-.71 3.53L15 13.94 10.06 9l.81-.81 3.53-.71a.74 .74 0 0 0 .3-.13l5.48-4.11 .58 .58Z\"],\"faded\":[0]},{\"id\":\"ph-car-duo\",\"label\":\"Car duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 16.5h3.75v2.25a.75 .75 0 0 1-.75 .75H18a.75 .75 0 0 1-.75-.75ZM3 18.75a.75 .75 0 0 0 .75 .75H6a.75 .75 0 0 0 .75-.75V16.5H3ZM18.2 4.2A.75 .75 0 0 0 17.51 3.75H6.49a.75 .75 0 0 0-.69 .45L3 10.5H21Z\",\"M22.5 9.75H21.49L18.88 3.89A1.5 1.5 0 0 0 17.51 3H6.49a1.5 1.5 0 0 0-1.37 .89L2.51 9.75H1.5a.75 .75 0 0 0 0 1.5h.75v7.5a1.5 1.5 0 0 0 1.5 1.5H6a1.5 1.5 0 0 0 1.5-1.5V17.25h9v1.5a1.5 1.5 0 0 0 1.5 1.5h2.25a1.5 1.5 0 0 0 1.5-1.5V11.25h.75a.75 .75 0 0 0 0-1.5ZM6.49 4.5H17.51l2.33 5.25H4.15ZM6 18.75H3.75V17.25H6Zm12 0V17.25h2.25v1.5Zm2.25-3H3.75V11.25H20.25ZM5.25 13.5a.75 .75 0 0 1 .75-.75H7.5a.75 .75 0 0 1 0 1.5H6A.75 .75 0 0 1 5.25 13.5Zm10.5 0a.75 .75 0 0 1 .75-.75h1.5a.75 .75 0 0 1 0 1.5H16.5A.75 .75 0 0 1 15.75 13.5Z\"],\"faded\":[0]},{\"id\":\"ph-airplane-duo\",\"label\":\"Plane duotone\",\"set\":\"duotone\",\"paths\":[\"M14.25 14.25v3l1.5 1.5v3l-3.75-1.5L8.25 21.75V18.75l1.5-1.5V14.25L2.25 15.75V12.75l7.5-3.75V4.5a2.25 2.25 0 0 1 4.5 0V9l7.5 3.75v3Z\",\"M22.09 12.08 15 8.54V4.5a3 3 0 0 0-6 0V8.54L1.91 12.08A.75 .75 0 0 0 1.5 12.75v3a.75 .75 0 0 0 .9 .74L9 15.17v1.77L7.72 18.22A.75 .75 0 0 0 7.5 18.75v3a.75 .75 0 0 0 1.03 .7l3.47-1.39 3.47 1.39A.75 .75 0 0 0 16.5 21.75V18.75a.75 .75 0 0 0-.22-.53L15 16.94V15.17l6.6 1.32A.75 .75 0 0 0 22.5 15.75V12.75A.75 .75 0 0 0 22.09 12.08ZM21 14.84l-6.6-1.32A.75 .75 0 0 0 13.5 14.25v3a.75 .75 0 0 0 .22 .53L15 19.06v1.58l-2.72-1.09a.75 .75 0 0 0-.56 0L9 20.64V19.06l1.28-1.28A.75 .75 0 0 0 10.5 17.25V14.25a.75 .75 0 0 0-.9-.73L3 14.84v-1.62l7.09-3.54A.75 .75 0 0 0 10.5 9V4.5a1.5 1.5 0 0 1 3 0V9a.75 .75 0 0 0 .41 .67L21 13.21Z\"],\"faded\":[0]},{\"id\":\"ph-shopping-cart-duo\",\"label\":\"Cart duotone\",\"set\":\"duotone\",\"paths\":[\"M21 6l-1.14 6.27A1.5 1.5 0 0 1 18.38 13.5H6.61L5.25 6Z\",\"M21.58 5.52A.75 .75 0 0 0 21 5.25H5.88L5.31 2.12A.75 .75 0 0 0 4.57 1.5H2.25a.75 .75 0 0 0 0 1.5h1.69L6.33 16.15a2.25 2.25 0 0 0 .5 1.06 2.63 2.63 0 1 0 4.16 .79h4.26A2.6 2.6 0 0 0 15 19.13a2.63 2.63 0 1 0 2.63-2.62H8.55a.75 .75 0 0 1-.74-.62L7.51 14.25h10.88a2.25 2.25 0 0 0 2.21-1.85l1.14-6.27A.75 .75 0 0 0 21.58 5.52ZM9.75 19.13a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.75 19.13Zm9 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18.75 19.13Zm.38-6.99A.75 .75 0 0 1 18.38 12.75H7.24L6.15 6.75H20.1Z\"],\"faded\":[0]},{\"id\":\"ph-shopping-bag-duo\",\"label\":\"Bag duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V18.75a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1-.75-.75V5.25a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 5.25Z\",\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm0 15H3.75V5.25H20.25V18.75ZM16.5 8.25a4.5 4.5 0 0 1-9 0 .75 .75 0 0 1 1.5 0 3 3 0 0 0 6 0 .75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-shopping-bag-open-duo\",\"label\":\"Open bag duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V7.5H3V5.25a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 5.25Z\",\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18.75a1.5 1.5 0 0 0 1.5 1.5H20.25a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm0 1.5V6.75H3.75V5.25Zm0 13.5H3.75V8.25H20.25V18.75Zm-3.75-8.25a4.5 4.5 0 0 1-9 0 .75 .75 0 0 1 1.5 0 3 3 0 0 0 6 0 .75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-storefront-duo\",\"label\":\"Store duotone\",\"set\":\"duotone\",\"paths\":[\"M21 9v1.5a3 3 0 0 1-6 0V9H9v1.5a3 3 0 0 1-6 0V9L4.34 4.29A.75 .75 0 0 1 5.06 3.75H18.94a.75 .75 0 0 1 .72 .54Z\",\"M21.72 8.79 20.38 4.09A1.51 1.51 0 0 0 18.94 3H5.06A1.51 1.51 0 0 0 3.62 4.09L2.28 8.79A.74 .74 0 0 0 2.25 9v1.5a3.75 3.75 0 0 0 1.5 3v6.75a.75 .75 0 0 0 .75 .75H19.5a.75 .75 0 0 0 .75-.75V13.5a3.75 3.75 0 0 0 1.5-3V9A.74 .74 0 0 0 21.72 8.79ZM5.06 4.5H18.94l1.07 3.75H3.99Zm9.19 5.25v.75a2.25 2.25 0 0 1-4.5 0v-.75ZM4.79 12.39A2.25 2.25 0 0 1 3.75 10.5v-.75H8.25v.75a2.25 2.25 0 0 1-3.29 1.99A.74 .74 0 0 0 4.79 12.39ZM18.75 19.5H5.25V14.18a3.8 3.8 0 0 0 .75 .08 3.75 3.75 0 0 0 3-1.5 3.75 3.75 0 0 0 6 0 3.75 3.75 0 0 0 3 1.5 3.8 3.8 0 0 0 .75-.08Zm1.5-9a2.25 2.25 0 0 1-1.04 1.89 .76 .76 0 0 0-.17 .1A2.25 2.25 0 0 1 15.75 10.5v-.75h4.5Z\"],\"faded\":[0]},{\"id\":\"ph-package-duo\",\"label\":\"Package duotone\",\"set\":\"duotone\",\"paths\":[\"M12 12.1V21.75a.75 .75 0 0 1-.36-.09l-8.25-4.52a.75 .75 0 0 1-.39-.66V7.52a.75 .75 0 0 1 .07-.3Z\",\"M20.97 6.2 12.72 1.69a1.49 1.49 0 0 0-1.44 0l-8.25 4.52a1.5 1.5 0 0 0-.78 1.31v8.97a1.5 1.5 0 0 0 .78 1.31l8.25 4.52a1.49 1.49 0 0 0 1.44 0l8.25-4.52a1.5 1.5 0 0 0 .78-1.31V7.52A1.5 1.5 0 0 0 20.97 6.2ZM12 3l7.53 4.13-2.79 1.53-7.53-4.12ZM12 11.25 4.47 7.13l3.18-1.74 7.53 4.13ZM3.75 8.44l7.5 4.1v8.04L3.75 16.48Zm16.5 8.04h0l-7.5 4.11V12.55l3-1.64V14.25a.75 .75 0 0 0 1.5 0V10.08L20.25 8.44v8.04Z\"],\"faded\":[0]},{\"id\":\"ph-truck-duo\",\"label\":\"Delivery duotone\",\"set\":\"duotone\",\"paths\":[\"M23.25 11.25v6a.75 .75 0 0 1-.75 .75H20.25a2.25 2.25 0 0 0-4.5 0H9.75a2.25 2.25 0 0 0-4.5 0H3a.75 .75 0 0 1-.75-.75V13.5H17.25V11.25Z\",\"M23.95 10.97l-1.31-3.28A1.49 1.49 0 0 0 21.24 6.75H18V6a.75 .75 0 0 0-.75-.75H3A1.5 1.5 0 0 0 1.5 6.75V17.25a1.5 1.5 0 0 0 1.5 1.5H4.59a3 3 0 0 0 5.81 0h4.69a3 3 0 0 0 5.81 0h1.59a1.5 1.5 0 0 0 1.5-1.5V11.25A.74 .74 0 0 0 23.95 10.97ZM18 8.25h3.24l.9 2.25H18ZM3 6.75H16.5v6H3ZM7.5 19.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 7.5 19.5Zm7.59-2.25H10.41a3 3 0 0 0-5.81 0H3V14.25H16.5v1.15A3.01 3.01 0 0 0 15.09 17.25Zm2.91 2.25a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 18 19.5Zm4.5-2.25H20.91a3.01 3.01 0 0 0-2.91-2.25V12h4.5Z\"],\"faded\":[0]},{\"id\":\"ph-credit-card-duo\",\"label\":\"Card duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 9v9a.75 .75 0 0 1-.75 .75H3a.75 .75 0 0 1-.75-.75V9Z\",\"M21 4.5H3A1.5 1.5 0 0 0 1.5 6V18a1.5 1.5 0 0 0 1.5 1.5H21a1.5 1.5 0 0 0 1.5-1.5V6A1.5 1.5 0 0 0 21 4.5Zm0 1.5V8.25H3V6Zm0 12H3V9.75H21v8.25Zm-1.5-2.25a.75 .75 0 0 1-.75 .75H15.75a.75 .75 0 0 1 0-1.5h3A.75 .75 0 0 1 19.5 15.75Zm-6 0a.75 .75 0 0 1-.75 .75H11.25a.75 .75 0 0 1 0-1.5h1.5A.75 .75 0 0 1 13.5 15.75Z\"],\"faded\":[0]},{\"id\":\"ph-wallet-duo\",\"label\":\"Wallet duotone\",\"set\":\"duotone\",\"paths\":[\"M21 7.5V18a.75 .75 0 0 1-.75 .75H5.25a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 0 5.25 6.75H20.25A.75 .75 0 0 1 21 7.5Z\",\"M20.25 6H5.25a.75 .75 0 0 1 0-1.5H18a.75 .75 0 0 0 0-1.5H5.25A2.25 2.25 0 0 0 3 5.25V17.25a2.25 2.25 0 0 0 2.25 2.25H20.25a1.5 1.5 0 0 0 1.5-1.5V7.5A1.5 1.5 0 0 0 20.25 6Zm0 12H5.25a.75 .75 0 0 1-.75-.75V7.37A2.24 2.24 0 0 0 5.25 7.5H20.25Zm-4.5-5.62a1.13 1.13 0 1 1 1.13 1.13A1.13 1.13 0 0 1 15.75 12.38Z\"],\"faded\":[0]},{\"id\":\"ph-money-duo\",\"label\":\"Money duotone\",\"set\":\"duotone\",\"paths\":[\"M15 12a3 3 0 1 1-3-3A3 3 0 0 1 15 12Zm3.75-6a4.58 4.58 0 0 0 3.75 3.75V6Zm0 12h3.75V14.25A4.58 4.58 0 0 0 18.75 18ZM1.5 14.25v3.75H5.25A4.58 4.58 0 0 0 1.5 14.25Zm0-4.5A4.58 4.58 0 0 0 5.25 6H1.5Z\",\"M12 8.25a3.75 3.75 0 1 0 3.75 3.75A3.75 3.75 0 0 0 12 8.25Zm0 6a2.25 2.25 0 1 1 2.25-2.25A2.25 2.25 0 0 1 12 14.25ZM22.5 5.25H1.5a.75 .75 0 0 0-.75 .75V18a.75 .75 0 0 0 .75 .75H22.5a.75 .75 0 0 0 .75-.75V6A.75 .75 0 0 0 22.5 5.25ZM2.25 6.75H4.25A3.83 3.83 0 0 1 2.25 8.75Zm0 10.5V15.25A3.83 3.83 0 0 1 4.25 17.25Zm19.5 0H19.75A3.83 3.83 0 0 1 21.75 15.25Zm0-3.6A5.32 5.32 0 0 0 18.15 17.25H5.85A5.32 5.32 0 0 0 2.25 13.65v-3.31A5.32 5.32 0 0 0 5.85 6.75h12.31A5.32 5.32 0 0 0 21.75 10.35Zm0-4.9A3.83 3.83 0 0 1 19.75 6.75H21.75Z\"],\"faded\":[0]},{\"id\":\"ph-coins-duo\",\"label\":\"Coins duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 12.38c0 1.86-3.36 3.38-7.5 3.38-1.84 0-3.52-.3-4.83-.79h0C13.76 14.7 16.5 13.31 16.5 11.63V9.07h0C19.92 9.38 22.5 10.74 22.5 12.38ZM16.5 7.88c0-1.86-3.36-3.37-7.5-3.37S1.5 6.01 1.5 7.88s3.36 3.38 7.5 3.38S16.5 9.74 16.5 7.88Z\",\"M17.25 8.4V7.88c0-2.35-3.55-4.12-8.25-4.12S.75 5.52 .75 7.88v3.75c0 1.96 2.46 3.51 6 3.98V16.13c0 2.35 3.55 4.13 8.25 4.13s8.25-1.77 8.25-4.12V12.38C23.25 10.43 20.87 8.88 17.25 8.4ZM21.75 12.38c0 1.24-2.89 2.63-6.75 2.63-.35 0-.7-.01-1.04-.03C15.98 14.23 17.25 13.03 17.25 11.63V9.91C20.05 10.33 21.75 11.46 21.75 12.38ZM6.75 14.09V11.86A17.23 17.23 0 0 0 9 12a17.23 17.23 0 0 0 2.25-.14v2.23A15.28 15.28 0 0 1 9 14.25 15.28 15.28 0 0 1 6.75 14.09Zm9-3.78V11.63c0 .79-1.16 1.63-3 2.14V11.58C13.96 11.28 14.99 10.85 15.75 10.31ZM9 5.25c3.86 0 6.75 1.39 6.75 2.63s-2.89 2.63-6.75 2.63S2.25 9.11 2.25 7.88 5.14 5.25 9 5.25ZM2.25 11.63V10.31c.77 .54 1.79 .98 3 1.27v2.19C3.41 13.26 2.25 12.41 2.25 11.63Zm6 4.5v-.39c.25 .01 .5 .02 .75 .02 .36 0 .72-.01 1.07-.03A11.43 11.43 0 0 0 11.25 16.07v2.2C9.41 17.76 8.25 16.91 8.25 16.13Zm4.5 2.46V16.35a16.83 16.83 0 0 0 2.25 .15 17.23 17.23 0 0 0 2.25-.14v2.23a15.51 15.51 0 0 1-4.5 0Zm6-.32V16.08c1.21-.29 2.24-.73 3-1.27V16.13C21.75 16.91 20.59 17.76 18.75 18.27Z\"],\"faded\":[0]},{\"id\":\"ph-piggy-bank-duo\",\"label\":\"Piggy bank duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 10.5v3a1.5 1.5 0 0 1-1.5 1.5h-.75l-1.7 4.75a.75 .75 0 0 1-.71 .5H16.65a.75 .75 0 0 1-.71-.5L15.59 18.75H9.16L8.8 19.75A.75 .75 0 0 1 8.1 20.25H6.9a.75 .75 0 0 1-.71-.5L4.97 16.31a7.47 7.47 0 0 1-1.97-5.06h0a7.5 7.5 0 0 1 7.5-7.5h3a7.5 7.5 0 0 1 6.89 4.52 7.71 7.71 0 0 1 .27 .73H21A1.5 1.5 0 0 1 22.5 10.5Z\",\"M18 10.88a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 18 10.88ZM14.25 6H10.5a.75 .75 0 0 0 0 1.5h3.75a.75 .75 0 0 0 0-1.5Zm9 4.5v3a2.25 2.25 0 0 1-2.25 2.25h-.22l-1.52 4.25A1.5 1.5 0 0 1 17.85 21H16.65a1.5 1.5 0 0 1-1.41-1L15.06 19.5h-5.37l-.18 .5A1.5 1.5 0 0 1 8.1 21H6.9a1.5 1.5 0 0 1-1.41-1L4.31 16.71a8.22 8.22 0 0 1-2.01-4.54A1.5 1.5 0 0 0 1.5 13.5a.75 .75 0 0 1-1.5 0 3 3 0 0 1 2.28-2.91A8.26 8.26 0 0 1 10.5 3H20.25a.75 .75 0 0 1 0 1.5H18.24a8.24 8.24 0 0 1 2.83 3.47c.04 .09 .08 .19 .12 .28A2.25 2.25 0 0 1 23.25 10.5Zm-1.5 0a.75 .75 0 0 0-.75-.75h-.34a.75 .75 0 0 1-.72-.52A6.74 6.74 0 0 0 13.5 4.5H10.5A6.75 6.75 0 0 0 5.52 15.81a.75 .75 0 0 1 .15 .25L6.9 19.5H8.1l.36-1A.75 .75 0 0 1 9.16 18h6.43a.75 .75 0 0 1 .71 .5L16.65 19.5h1.19l1.7-4.75A.75 .75 0 0 1 20.25 14.25h.75a.75 .75 0 0 0 .75-.75Z\"],\"faded\":[0]},{\"id\":\"ph-hand-coins-duo\",\"label\":\"Pay duotone\",\"set\":\"duotone\",\"paths\":[\"M1.5 14.25H4.5v5.25H1.5a.75 .75 0 0 1-.75-.75V15A.75 .75 0 0 1 1.5 14.25ZM19.13 5.25a2.63 2.63 0 0 0-1.12 .25h0A2.63 2.63 0 1 0 16.5 8h0A2.63 2.63 0 1 0 19.13 5.25Z\",\"M21.59 13.22a2.29 2.29 0 0 0-1.99-.4l-3.92 .9A2.63 2.63 0 0 0 13.13 10.5H8.43a2.98 2.98 0 0 0-2.12 .88L4.19 13.5H1.5A1.5 1.5 0 0 0 0 15v3.75a1.5 1.5 0 0 0 1.5 1.5H11.25a.74 .74 0 0 0 .18-.02l6-1.5a.65 .65 0 0 0 .11-.04L21.19 17.14l.04-.02a2.31 2.31 0 0 0 .37-3.9ZM1.5 15H3.75v3.75H1.5Zm19.07 .77-3.56 1.52L11.16 18.75H5.25V14.56l2.12-2.12A1.49 1.49 0 0 1 8.43 12H13.13a1.13 1.13 0 0 1 0 2.25H10.5a.75 .75 0 0 0 0 1.5h3a.78 .78 0 0 0 .17-.02l6.28-1.44 .03-.01a.81 .81 0 0 1 .59 1.49ZM15.38 9a3.38 3.38 0 0 0 .55-.04 3.38 3.38 0 1 0 2.65-4.41A3.38 3.38 0 1 0 15.38 9Zm5.63-1.12a1.88 1.88 0 1 1-1.87-1.87A1.88 1.88 0 0 1 21 7.88ZM15.38 3.75a1.88 1.88 0 0 1 1.8 1.37 3.38 3.38 0 0 0-1.41 2.34A1.91 1.91 0 0 1 15.38 7.5a1.88 1.88 0 0 1 0-3.75Z\"],\"faded\":[0]},{\"id\":\"ph-receipt-duo\",\"label\":\"Receipt duotone\",\"set\":\"duotone\",\"paths\":[\"M21 5.25V19.5l-3-1.5-3 1.5-3-1.5L9 19.5 6 18 3 19.5V5.25a.75 .75 0 0 1 .75-.75H20.25A.75 .75 0 0 1 21 5.25Z\",\"M6.75 9.75a.75 .75 0 0 1 .75-.75h9a.75 .75 0 0 1 0 1.5H7.5A.75 .75 0 0 1 6.75 9.75Zm.75 3.75h9a.75 .75 0 0 0 0-1.5H7.5a.75 .75 0 0 0 0 1.5ZM21.75 5.25V19.5a.75 .75 0 0 1-1.09 .67L18 18.84l-2.66 1.33a.75 .75 0 0 1-.67 0L12 18.84 9.34 20.17a.75 .75 0 0 1-.67 0L6 18.84 3.34 20.17A.75 .75 0 0 1 2.25 19.5V5.25A1.5 1.5 0 0 1 3.75 3.75H20.25A1.5 1.5 0 0 1 21.75 5.25Zm-1.5 0H3.75V18.29l1.91-.96a.75 .75 0 0 1 .67 0L9 18.66l2.66-1.33a.75 .75 0 0 1 .67 0L15 18.66l2.66-1.33a.75 .75 0 0 1 .67 0L20.25 18.29Z\"],\"faded\":[0]},{\"id\":\"ph-currency-dollar-duo\",\"label\":\"Dollar duotone\",\"set\":\"duotone\",\"paths\":[\"M18 15.75a3.75 3.75 0 0 1-3.75 3.75H12V12h2.25A3.75 3.75 0 0 1 18 15.75ZM10.5 4.5a3.75 3.75 0 0 0 0 7.5h1.5V4.5Z\",\"M14.25 11.25H12.75V5.25h.75a3 3 0 0 1 3 3 .75 .75 0 0 0 1.5 0 4.5 4.5 0 0 0-4.5-4.5h-.75V2.25a.75 .75 0 0 0-1.5 0V3.75h-.75a4.5 4.5 0 0 0 0 9h.75v6H9.75a3 3 0 0 1-3-3 .75 .75 0 0 0-1.5 0 4.5 4.5 0 0 0 4.5 4.5h1.5v1.5a.75 .75 0 0 0 1.5 0V20.25h1.5a4.5 4.5 0 0 0 0-9Zm-3.75 0a3 3 0 0 1 0-6h.75v6Zm3.75 7.5H12.75V12.75h1.5a3 3 0 0 1 0 6Z\"],\"faded\":[0]},{\"id\":\"ph-currency-eur-duo\",\"label\":\"Euro duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 5.47V18.53A6.75 6.75 0 0 1 6 13.5V10.5A6.75 6.75 0 0 1 17.25 5.47Z\",\"M17.81 18.03a.75 .75 0 0 1-.06 1.06A7.5 7.5 0 0 1 5.29 14.25H3.75a.75 .75 0 0 1 0-1.5H5.25V11.25H3.75a.75 .75 0 0 1 0-1.5H5.29A7.5 7.5 0 0 1 17.75 4.91 .75 .75 0 0 1 16.75 6.03 6 6 0 0 0 6.8 9.75H12.75a.75 .75 0 0 1 0 1.5H6.75v1.5h4.5a.75 .75 0 0 1 0 1.5H6.8a6 6 0 0 0 9.95 3.72A.75 .75 0 0 1 17.81 18.03Z\"],\"faded\":[0]},{\"id\":\"ph-currency-btc-duo\",\"label\":\"Bitcoin duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 15a3.75 3.75 0 0 1-3.75 3.75H8.25V4.5h5.63a3.38 3.38 0 0 1 0 6.75h1.13A3.75 3.75 0 0 1 18.75 15Z\",\"M16.73 10.85A4.13 4.13 0 0 0 14.25 3.77V2.25a.75 .75 0 0 0-1.5 0V3.75H11.25V2.25a.75 .75 0 0 0-1.5 0V3.75H6.75a.75 .75 0 0 0 0 1.5h.75V18H6.75a.75 .75 0 0 0 0 1.5h3v1.5a.75 .75 0 0 0 1.5 0V19.5h1.5v1.5a.75 .75 0 0 0 1.5 0V19.5h.75a4.5 4.5 0 0 0 1.73-8.65ZM9 5.25h4.88a2.63 2.63 0 0 1 0 5.25H9Zm6 12.75H9V12h6a3 3 0 0 1 0 6Z\"],\"faded\":[0]},{\"id\":\"ph-bank-duo\",\"label\":\"Bank duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 9H2.25L12 3Z\",\"M2.25 9.75H4.5v6H3a.75 .75 0 0 0 0 1.5H21a.75 .75 0 0 0 0-1.5H19.5V9.75h2.25a.75 .75 0 0 0 .39-1.39l-9.75-6a.75 .75 0 0 0-.79 0l-9.75 6A.75 .75 0 0 0 2.25 9.75Zm3.75 0H9v6H6Zm7.5 0v6H10.5V9.75Zm4.5 6H15V9.75h3ZM12 3.88 19.1 8.25H4.9ZM23.25 19.5a.75 .75 0 0 1-.75 .75H1.5a.75 .75 0 0 1 0-1.5H22.5A.75 .75 0 0 1 23.25 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-vault-duo\",\"label\":\"Vault duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 4.5H3.75a.75 .75 0 0 0-.75 .75V18a.75 .75 0 0 0 .75 .75H20.25a.75 .75 0 0 0 .75-.75V5.25A.75 .75 0 0 0 20.25 4.5ZM14.25 15.75a3.75 3.75 0 1 1 3.75-3.75A3.75 3.75 0 0 1 14.25 15.75Z\",\"M20.25 3.75H3.75A1.5 1.5 0 0 0 2.25 5.25V18a1.5 1.5 0 0 0 1.5 1.5H5.25v1.5a.75 .75 0 0 0 1.5 0V19.5H17.25v1.5a.75 .75 0 0 0 1.5 0V19.5h1.5a1.5 1.5 0 0 0 1.5-1.5V5.25A1.5 1.5 0 0 0 20.25 3.75Zm0 14.25H3.75V5.25H20.25v6H18.69a4.5 4.5 0 1 0 0 1.5H20.25v5.25Zm-4.7-6.75a1.5 1.5 0 1 0 0 1.5H17.16a3 3 0 1 1 0-1.5Z\"],\"faded\":[0]},{\"id\":\"ph-calculator-duo\",\"label\":\"Calculator duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 6v4.5H7.5V6Z\",\"M7.5 11.25h9a.75 .75 0 0 0 .75-.75V6a.75 .75 0 0 0-.75-.75H7.5a.75 .75 0 0 0-.75 .75v4.5A.75 .75 0 0 0 7.5 11.25Zm.75-4.5h7.5v3H8.25ZM18.75 2.25H5.25A1.5 1.5 0 0 0 3.75 3.75V20.25a1.5 1.5 0 0 0 1.5 1.5H18.75a1.5 1.5 0 0 0 1.5-1.5V3.75A1.5 1.5 0 0 0 18.75 2.25Zm0 18H5.25V3.75H18.75ZM9.38 13.88a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.38 13.88Zm3.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 13.88Zm3.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.88 13.88Zm-7.5 3.75a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 9.38 17.63Zm3.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 17.63Zm3.75 0a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 16.88 17.63Z\"],\"faded\":[0]},{\"id\":\"ph-seal-check-duo\",\"label\":\"Badge duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12c0 1.17-1.67 2.06-2.13 3.16-.44 1.06 .13 2.87-.73 3.74s-2.67 .29-3.74 .73C14.06 20.08 13.17 21.75 12 21.75s-2.06-1.67-3.16-2.13c-1.06-.44-2.87 .13-3.74-.73s-.29-2.67-.73-3.74C3.92 14.06 2.25 13.17 2.25 12s1.67-2.06 2.13-3.16C4.81 7.78 4.24 5.97 5.11 5.11S7.78 4.81 8.84 4.38C9.94 3.92 10.83 2.25 12 2.25S14.06 3.92 15.16 4.38c1.06 .44 2.87-.13 3.74 .73s.29 2.67 .73 3.74C20.08 9.94 21.75 10.83 21.75 12Z\",\"M21.17 9.64c-.35-.37-.72-.75-.86-1.08-.13-.31-.13-.81-.14-1.31-.01-.91-.03-1.95-.75-2.67s-1.76-.74-2.67-.75c-.49-.01-1-.01-1.31-.14-.33-.14-.72-.5-1.08-.86C13.71 2.2 12.98 1.5 12 1.5s-1.71 .7-2.36 1.33c-.37 .35-.75 .72-1.08 .86C8.25 3.81 7.74 3.82 7.25 3.83c-.91 .01-1.95 .03-2.67 .75S3.84 6.33 3.83 7.25c-.01 .49-.01 1-.14 1.31-.14 .33-.5 .72-.86 1.08C2.2 10.29 1.5 11.02 1.5 12s.7 1.71 1.33 2.36c.35 .37 .72 .75 .86 1.08 .13 .31 .14 .81 .14 1.31 .01 .92 .03 1.95 .75 2.67s1.76 .74 2.67 .75c.49 .01 1 .02 1.31 .14 .33 .14 .72 .5 1.08 .86C10.29 21.8 11.02 22.5 12 22.5s1.71-.7 2.36-1.33c.37-.35 .75-.72 1.08-.86 .31-.13 .81-.13 1.31-.14 .92-.01 1.95-.03 2.67-.75s.74-1.76 .75-2.67c.01-.49 .02-1 .14-1.31 .14-.33 .5-.72 .86-1.08C21.8 13.71 22.5 12.98 22.5 12S21.8 10.29 21.17 9.64Zm-1.08 3.68c-.45 .47-.91 .95-1.16 1.55-.24 .57-.25 1.23-.26 1.86-.01 .66-.02 1.34-.31 1.63s-.97 .3-1.63 .31c-.63 .01-1.29 .02-1.86 .26-.6 .25-1.08 .71-1.55 1.16S12.38 21 12 21s-.86-.46-1.32-.91-.95-.91-1.55-1.16c-.57-.24-1.23-.25-1.86-.26-.66-.01-1.34-.02-1.63-.31s-.3-.97-.31-1.63c-.01-.63-.02-1.29-.26-1.86-.25-.6-.71-1.08-1.16-1.55S3 12.38 3 12s.46-.86 .91-1.32 .91-.95 1.16-1.55c.24-.57 .25-1.23 .26-1.86 .01-.66 .02-1.34 .31-1.63S6.61 5.33 7.27 5.32c.63-.01 1.29-.02 1.86-.26 .6-.25 1.08-.71 1.55-1.16S11.63 3 12 3s.86 .46 1.32 .91 .95 .91 1.55 1.16c.57 .24 1.23 .25 1.86 .26 .66 .01 1.34 .02 1.63 .31s.3 .97 .31 1.63c.01 .63 .02 1.29 .26 1.86 .25 .6 .71 1.08 1.16 1.55S21 11.63 21 12 20.54 12.86 20.09 13.32ZM16.28 9.22a.75 .75 0 0 1 0 1.06l-5.25 5.25a.75 .75 0 0 1-1.06 0l-2.25-2.25a.75 .75 0 0 1 1.06-1.06L10.5 13.94l4.72-4.72A.75 .75 0 0 1 16.28 9.22Z\"],\"faded\":[0]},{\"id\":\"ph-seal-percent-duo\",\"label\":\"Sale duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12c0 1.17-1.67 2.06-2.13 3.16-.44 1.06 .13 2.87-.73 3.74s-2.67 .29-3.74 .73C14.06 20.08 13.17 21.75 12 21.75s-2.06-1.67-3.16-2.13c-1.06-.44-2.87 .13-3.74-.73s-.29-2.67-.73-3.74C3.92 14.06 2.25 13.17 2.25 12s1.67-2.06 2.13-3.16C4.81 7.78 4.24 5.97 5.11 5.11S7.78 4.81 8.84 4.38C9.94 3.92 10.83 2.25 12 2.25S14.06 3.92 15.16 4.38c1.06 .44 2.87-.13 3.74 .73s.29 2.67 .73 3.74C20.08 9.94 21.75 10.83 21.75 12Z\",\"M21.17 9.64c-.35-.37-.72-.75-.86-1.08-.13-.31-.13-.81-.14-1.31-.01-.91-.03-1.95-.75-2.67s-1.76-.74-2.67-.75c-.49-.01-1-.01-1.31-.14-.33-.14-.72-.5-1.08-.86C13.71 2.2 12.98 1.5 12 1.5s-1.71 .7-2.36 1.33c-.37 .35-.75 .72-1.08 .86C8.25 3.81 7.74 3.82 7.25 3.83c-.91 .01-1.95 .03-2.67 .75S3.84 6.33 3.83 7.25c-.01 .49-.01 1-.14 1.31-.14 .33-.5 .72-.86 1.08C2.2 10.29 1.5 11.02 1.5 12s.7 1.71 1.33 2.36c.35 .37 .72 .75 .86 1.08 .13 .31 .14 .81 .14 1.31 .01 .92 .03 1.95 .75 2.67s1.76 .74 2.67 .75c.49 .01 1 .02 1.31 .14 .33 .14 .72 .5 1.08 .86C10.29 21.8 11.02 22.5 12 22.5s1.71-.7 2.36-1.33c.37-.35 .75-.72 1.08-.86 .31-.13 .81-.13 1.31-.14 .92-.01 1.95-.03 2.67-.75s.74-1.76 .75-2.67c.01-.49 .02-1 .14-1.31 .14-.33 .5-.72 .86-1.08C21.8 13.71 22.5 12.98 22.5 12S21.8 10.29 21.17 9.64Zm-1.08 3.68c-.45 .47-.91 .95-1.16 1.55-.24 .57-.25 1.23-.26 1.86-.01 .66-.02 1.34-.31 1.63s-.97 .3-1.63 .31c-.63 .01-1.29 .02-1.86 .26-.6 .25-1.08 .71-1.55 1.16S12.38 21 12 21s-.86-.46-1.32-.91-.95-.91-1.55-1.16c-.57-.24-1.23-.25-1.86-.26-.66-.01-1.34-.02-1.63-.31s-.3-.97-.31-1.63c-.01-.63-.02-1.29-.26-1.86-.25-.6-.71-1.08-1.16-1.55S3 12.38 3 12s.46-.86 .91-1.32 .91-.95 1.16-1.55c.24-.57 .25-1.23 .26-1.86 .01-.66 .02-1.34 .31-1.63S6.61 5.33 7.27 5.32c.63-.01 1.29-.02 1.86-.26 .6-.25 1.08-.71 1.55-1.16S11.63 3 12 3s.86 .46 1.32 .91 .95 .91 1.55 1.16c.57 .24 1.23 .25 1.86 .26 .66 .01 1.34 .02 1.63 .31s.3 .97 .31 1.63c.01 .63 .02 1.29 .26 1.86 .25 .6 .71 1.08 1.16 1.55S21 11.63 21 12 20.54 12.86 20.09 13.32ZM11.25 9a2.25 2.25 0 1 0-2.25 2.25A2.25 2.25 0 0 0 11.25 9ZM8.25 9a.75 .75 0 1 1 .75 .75A.75 .75 0 0 1 8.25 9Zm6.75 3.75a2.25 2.25 0 1 0 2.25 2.25A2.25 2.25 0 0 0 15 12.75Zm0 3a.75 .75 0 1 1 .75-.75A.75 .75 0 0 1 15 15.75Zm1.28-6.97-7.5 7.5a.75 .75 0 0 1-1.06-1.06l7.5-7.5a.75 .75 0 0 1 1.06 1.06Z\"],\"faded\":[0]},{\"id\":\"ph-seal-warning-duo\",\"label\":\"Notice duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12c0 1.17-1.67 2.06-2.13 3.16-.44 1.06 .13 2.87-.73 3.74s-2.67 .29-3.74 .73C14.06 20.08 13.17 21.75 12 21.75s-2.06-1.67-3.16-2.13c-1.06-.44-2.87 .13-3.74-.73s-.29-2.67-.73-3.74C3.92 14.06 2.25 13.17 2.25 12s1.67-2.06 2.13-3.16C4.81 7.78 4.24 5.97 5.11 5.11S7.78 4.81 8.84 4.38C9.94 3.92 10.83 2.25 12 2.25S14.06 3.92 15.16 4.38c1.06 .44 2.87-.13 3.74 .73s.29 2.67 .73 3.74C20.08 9.94 21.75 10.83 21.75 12Z\",\"M21.17 9.64c-.35-.37-.72-.75-.86-1.08-.13-.31-.13-.81-.14-1.31-.01-.91-.03-1.95-.75-2.67s-1.76-.74-2.67-.75c-.49-.01-1-.01-1.31-.14-.33-.14-.72-.5-1.08-.86C13.71 2.2 12.98 1.5 12 1.5s-1.71 .7-2.36 1.33c-.37 .35-.75 .72-1.08 .86C8.25 3.81 7.74 3.82 7.25 3.83c-.91 .01-1.95 .03-2.67 .75S3.84 6.33 3.83 7.25c-.01 .49-.01 1-.14 1.31-.14 .33-.5 .72-.86 1.08C2.2 10.29 1.5 11.02 1.5 12s.7 1.71 1.33 2.36c.35 .37 .72 .75 .86 1.08 .13 .31 .14 .81 .14 1.31 .01 .92 .03 1.95 .75 2.67s1.76 .74 2.67 .75c.49 .01 1 .02 1.31 .14 .33 .14 .72 .5 1.08 .86C10.29 21.8 11.02 22.5 12 22.5s1.71-.7 2.36-1.33c.37-.35 .75-.72 1.08-.86 .31-.13 .81-.13 1.31-.14 .92-.01 1.95-.03 2.67-.75s.74-1.76 .75-2.67c.01-.49 .02-1 .14-1.31 .14-.33 .5-.72 .86-1.08C21.8 13.71 22.5 12.98 22.5 12S21.8 10.29 21.17 9.64Zm-1.08 3.68c-.45 .47-.91 .95-1.16 1.55-.24 .57-.25 1.23-.26 1.86-.01 .66-.02 1.34-.31 1.63s-.97 .3-1.63 .31c-.63 .01-1.29 .02-1.86 .26-.6 .25-1.08 .71-1.55 1.16S12.38 21 12 21s-.86-.46-1.32-.91-.95-.91-1.55-1.16c-.57-.24-1.23-.25-1.86-.26-.66-.01-1.34-.02-1.63-.31s-.3-.97-.31-1.63c-.01-.63-.02-1.29-.26-1.86-.25-.6-.71-1.08-1.16-1.55S3 12.38 3 12s.46-.86 .91-1.32 .91-.95 1.16-1.55c.24-.57 .25-1.23 .26-1.86 .01-.66 .02-1.34 .31-1.63S6.61 5.33 7.27 5.32c.63-.01 1.29-.02 1.86-.26 .6-.25 1.08-.71 1.55-1.16S11.63 3 12 3s.86 .46 1.32 .91 .95 .91 1.55 1.16c.57 .24 1.23 .25 1.86 .26 .66 .01 1.34 .02 1.63 .31s.3 .97 .31 1.63c.01 .63 .02 1.29 .26 1.86 .25 .6 .71 1.08 1.16 1.55S21 11.63 21 12 20.54 12.86 20.09 13.32ZM11.25 12.75V7.5a.75 .75 0 0 1 1.5 0v5.25a.75 .75 0 0 1-1.5 0Zm1.88 3.38a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 16.13Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-right-duo\",\"label\":\"Arrow right duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12l-6.75 6.75V5.25Z\",\"M20.78 11.47l-6.75-6.75A.75 .75 0 0 0 12.75 5.25v6H3.75a.75 .75 0 0 0 0 1.5h9v6a.75 .75 0 0 0 1.28 .53l6.75-6.75A.75 .75 0 0 0 20.78 11.47ZM14.25 16.94V7.06L19.19 12Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-left-duo\",\"label\":\"Arrow left duotone\",\"set\":\"duotone\",\"paths\":[\"M10.5 5.25V18.75L3.75 12Z\",\"M20.25 11.25H11.25V5.25a.75 .75 0 0 0-1.28-.53l-6.75 6.75a.75 .75 0 0 0 0 1.06l6.75 6.75A.75 .75 0 0 0 11.25 18.75V12.75h9a.75 .75 0 0 0 0-1.5ZM9.75 16.94 4.81 12 9.75 7.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-up-duo\",\"label\":\"Arrow up duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 10.5H5.25l6.75-6.75Z\",\"M19.28 9.97l-6.75-6.75a.75 .75 0 0 0-1.06 0l-6.75 6.75A.75 .75 0 0 0 5.25 11.25h6v9a.75 .75 0 0 0 1.5 0V11.25h6a.75 .75 0 0 0 .53-1.28ZM7.06 9.75 12 4.81 16.94 9.75Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-down-duo\",\"label\":\"Arrow down duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 13.5l-6.75 6.75L5.25 13.5Z\",\"M19.44 13.21A.75 .75 0 0 0 18.75 12.75H12.75V3.75a.75 .75 0 0 0-1.5 0v9H5.25a.75 .75 0 0 0-.53 1.28l6.75 6.75a.75 .75 0 0 0 1.06 0l6.75-6.75A.75 .75 0 0 0 19.44 13.21ZM12 19.19 7.06 14.25H16.94Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-up-right-duo\",\"label\":\"Arrow up right duotone\",\"set\":\"duotone\",\"paths\":[\"M18 6V15.75L8.25 6Z\",\"M18 5.25H8.25a.75 .75 0 0 0-.53 1.28L12.06 10.88 5.47 17.47a.75 .75 0 0 0 1.06 1.06L13.13 11.94l4.34 4.35A.75 .75 0 0 0 18.75 15.75V6A.75 .75 0 0 0 18 5.25Zm-.75 8.69-3.59-3.59h0L10.06 6.75H17.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-down-right-duo\",\"label\":\"Arrow down right duotone\",\"set\":\"duotone\",\"paths\":[\"M18 8.25V18H8.25Z\",\"M18.29 7.56a.75 .75 0 0 0-.82 .16L13.13 12.06 6.53 5.47A.75 .75 0 0 0 5.47 6.53L12.06 13.13 7.72 17.47A.75 .75 0 0 0 8.25 18.75H18a.75 .75 0 0 0 .75-.75V8.25A.75 .75 0 0 0 18.29 7.56ZM17.25 17.25H10.06l3.59-3.59h0L17.25 10.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-up-left-duo\",\"label\":\"Arrow up left duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 6 6 15.75V6Z\",\"M18.53 17.47 11.94 10.88l4.35-4.34A.75 .75 0 0 0 15.75 5.25H6a.75 .75 0 0 0-.75 .75V15.75a.75 .75 0 0 0 1.28 .53L10.88 11.94l6.59 6.6a.75 .75 0 0 0 1.06-1.06ZM6.75 6.75h7.19l-3.59 3.59h0L6.75 13.94Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-down-left-duo\",\"label\":\"Arrow down left duotone\",\"set\":\"duotone\",\"paths\":[\"M15.75 18H6V8.25Z\",\"M18.53 5.47a.75 .75 0 0 0-1.06 0L10.88 12.06 6.53 7.72A.75 .75 0 0 0 5.25 8.25V18a.75 .75 0 0 0 .75 .75H15.75a.75 .75 0 0 0 .53-1.28L11.94 13.13l6.6-6.59A.75 .75 0 0 0 18.53 5.47ZM6.75 17.25V10.06l3.59 3.59h0L13.94 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-circle-right-duo\",\"label\":\"Circle arrow right duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm4.28-8.78a.75 .75 0 0 1 0 1.06l-3 3a.75 .75 0 0 1-1.06-1.06L13.94 12.75H8.25a.75 .75 0 0 1 0-1.5h5.69l-1.72-1.72a.75 .75 0 0 1 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-circle-left-duo\",\"label\":\"Circle arrow left duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm4.5-8.25a.75 .75 0 0 1-.75 .75H10.06l1.72 1.72a.75 .75 0 0 1-1.06 1.06l-3-3a.75 .75 0 0 1 0-1.06l3-3a.75 .75 0 0 1 1.06 1.06L10.06 11.25H15.75A.75 .75 0 0 1 16.5 12Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-circle-up-duo\",\"label\":\"Circle arrow up duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm3.53-9.53a.75 .75 0 0 1-1.06 1.06L12.75 10.06V15.75a.75 .75 0 0 1-1.5 0V10.06l-1.72 1.72a.75 .75 0 0 1-1.06-1.06l3-3a.75 .75 0 0 1 1.06 0Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-circle-down-duo\",\"label\":\"Circle arrow down duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm3.53-8.03a.75 .75 0 0 1 0 1.06l-3 3a.75 .75 0 0 1-1.06 0l-3-3a.75 .75 0 0 1 1.06-1.06L11.25 13.94V8.25a.75 .75 0 0 1 1.5 0v5.69l1.72-1.72A.75 .75 0 0 1 15.53 12.22Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-fat-right-duo\",\"label\":\"Fat arrow right duotone\",\"set\":\"duotone\",\"paths\":[\"M12.75 21V16.5H4.5a.75 .75 0 0 1-.75-.75V8.25a.75 .75 0 0 1 .75-.75h8.25V3l9 9Z\",\"M22.28 11.47l-9-9A.75 .75 0 0 0 12 3V6.75H4.5A1.5 1.5 0 0 0 3 8.25v7.5a1.5 1.5 0 0 0 1.5 1.5h7.5v3.75a.75 .75 0 0 0 1.28 .53l9-9A.75 .75 0 0 0 22.28 11.47ZM13.5 19.19V16.5a.75 .75 0 0 0-.75-.75H4.5V8.25h8.25a.75 .75 0 0 0 .75-.75V4.81L20.69 12Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-fat-left-duo\",\"label\":\"Fat arrow left duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 8.25v7.5a.75 .75 0 0 1-.75 .75H11.25v4.5L2.25 12l9-9V7.5h8.25A.75 .75 0 0 1 20.25 8.25Z\",\"M19.5 6.75H12V3a.75 .75 0 0 0-1.28-.53l-9 9a.75 .75 0 0 0 0 1.06l9 9A.75 .75 0 0 0 12 21V17.25h7.5a1.5 1.5 0 0 0 1.5-1.5V8.25A1.5 1.5 0 0 0 19.5 6.75Zm0 9H11.25a.75 .75 0 0 0-.75 .75v2.69L3.31 12 10.5 4.81V7.5a.75 .75 0 0 0 .75 .75h8.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-fat-up-duo\",\"label\":\"Fat arrow up duotone\",\"set\":\"duotone\",\"paths\":[\"M21 11.25H16.5v8.25a.75 .75 0 0 1-.75 .75H8.25a.75 .75 0 0 1-.75-.75V11.25H3l9-9Z\",\"M21.53 10.72l-9-9a.75 .75 0 0 0-1.06 0l-9 9A.75 .75 0 0 0 3 12H6.75v7.5a1.5 1.5 0 0 0 1.5 1.5h7.5a1.5 1.5 0 0 0 1.5-1.5V12h3.75a.75 .75 0 0 0 .53-1.28ZM16.5 10.5a.75 .75 0 0 0-.75 .75v8.25H8.25V11.25a.75 .75 0 0 0-.75-.75H4.81L12 3.31 19.19 10.5Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-fat-down-duo\",\"label\":\"Fat arrow down duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12.75l-9 9L3 12.75H7.5V4.5a.75 .75 0 0 1 .75-.75h7.5a.75 .75 0 0 1 .75 .75v8.25Z\",\"M21.69 12.46A.75 .75 0 0 0 21 12H17.25V4.5a1.5 1.5 0 0 0-1.5-1.5H8.25A1.5 1.5 0 0 0 6.75 4.5v7.5H3a.75 .75 0 0 0-.53 1.28l9 9a.75 .75 0 0 0 1.06 0l9-9A.75 .75 0 0 0 21.69 12.46ZM12 20.69 4.81 13.5H7.5a.75 .75 0 0 0 .75-.75V4.5h7.5v8.25a.75 .75 0 0 0 .75 .75h2.69Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-fat-lines-right-duo\",\"label\":\"Fast arrow duotone\",\"set\":\"duotone\",\"paths\":[\"M12.75 21V16.5H9.75V7.5h3V3l9 9Z\",\"M22.28 11.47l-9-9A.75 .75 0 0 0 12 3V6.75H9.75a.75 .75 0 0 0-.75 .75v9a.75 .75 0 0 0 .75 .75h2.25v3.75a.75 .75 0 0 0 1.28 .53l9-9A.75 .75 0 0 0 22.28 11.47ZM13.5 19.19V16.5a.75 .75 0 0 0-.75-.75H10.5V8.25h2.25a.75 .75 0 0 0 .75-.75V4.81L20.69 12ZM4.5 7.5v9a.75 .75 0 0 1-1.5 0V7.5a.75 .75 0 0 1 1.5 0Zm3 0v9a.75 .75 0 0 1-1.5 0V7.5a.75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-bend-up-right-duo\",\"label\":\"Bend right duotone\",\"set\":\"duotone\",\"paths\":[\"M21 9.75l-4.5 4.5V5.25Z\",\"M21.53 9.22l-4.5-4.5A.75 .75 0 0 0 15.75 5.25V9H12A9.76 9.76 0 0 0 2.25 18.75a.75 .75 0 0 0 1.5 0 8.26 8.26 0 0 1 8.25-8.25h3.75v3.75a.75 .75 0 0 0 1.28 .53l4.5-4.5A.75 .75 0 0 0 21.53 9.22ZM17.25 12.44V7.06L19.94 9.75Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-bend-down-right-duo\",\"label\":\"Bend down duotone\",\"set\":\"duotone\",\"paths\":[\"M21 14.25l-4.5 4.5V9.75Z\",\"M21.53 13.72l-4.5-4.5A.75 .75 0 0 0 15.75 9.75v3.75H12A8.26 8.26 0 0 1 3.75 5.25a.75 .75 0 0 0-1.5 0A9.76 9.76 0 0 0 12 15h3.75v3.75a.75 .75 0 0 0 1.28 .53l4.5-4.5A.75 .75 0 0 0 21.53 13.72ZM17.25 16.94V11.56L19.94 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-u-up-left-duo\",\"label\":\"U-turn left duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 3.75v9L3 8.25Z\",\"M15.75 7.5H8.25V3.75a.75 .75 0 0 0-1.28-.53l-4.5 4.5a.75 .75 0 0 0 0 1.06l4.5 4.5A.75 .75 0 0 0 8.25 12.75V9h7.5a4.5 4.5 0 0 1 0 9H7.5a.75 .75 0 0 0 0 1.5h8.25a6 6 0 0 0 0-12ZM6.75 10.94 4.06 8.25 6.75 5.56Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-u-up-right-duo\",\"label\":\"U-turn right duotone\",\"set\":\"duotone\",\"paths\":[\"M21 8.25l-4.5 4.5V3.75Z\",\"M16.21 13.44a.75 .75 0 0 0 .82-.16l4.5-4.5a.75 .75 0 0 0 0-1.06l-4.5-4.5A.75 .75 0 0 0 15.75 3.75V7.5H8.25a6 6 0 0 0 0 12h8.25a.75 .75 0 0 0 0-1.5H8.25a4.5 4.5 0 0 1 0-9h7.5v3.75A.75 .75 0 0 0 16.21 13.44ZM17.25 5.56 19.94 8.25 17.25 10.94Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-elbow-down-right-duo\",\"label\":\"Elbow arrow duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 16.5l-4.5 4.5V12Z\",\"M20.78 15.97l-4.5-4.5A.75 .75 0 0 0 15 12v3.75H7.5V3a.75 .75 0 0 0-1.5 0V16.5a.75 .75 0 0 0 .75 .75h8.25v3.75a.75 .75 0 0 0 1.28 .53l4.5-4.5A.75 .75 0 0 0 20.78 15.97ZM16.5 19.19V13.81L19.19 16.5Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-square-out-duo\",\"label\":\"Open in new duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 7.5V19.5a.75 .75 0 0 1-.75 .75H4.5a.75 .75 0 0 1-.75-.75V7.5a.75 .75 0 0 1 .75-.75H16.5A.75 .75 0 0 1 17.25 7.5Z\",\"M21 9.75a.75 .75 0 0 1-1.5 0V5.56l-6.22 6.22a.75 .75 0 0 1-1.06-1.06L18.44 4.5H14.25a.75 .75 0 0 1 0-1.5h6a.75 .75 0 0 1 .75 .75Zm-3.75 2.25a.75 .75 0 0 0-.75 .75v6.75H4.5V7.5h6.75a.75 .75 0 0 0 0-1.5H4.5A1.5 1.5 0 0 0 3 7.5V19.5a1.5 1.5 0 0 0 1.5 1.5H16.5a1.5 1.5 0 0 0 1.5-1.5V12.75A.75 .75 0 0 0 17.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-line-right-duo\",\"label\":\"Arrow to line duotone\",\"set\":\"duotone\",\"paths\":[\"M17.25 12l-6.75 6.75V5.25Z\",\"M11.03 4.72A.75 .75 0 0 0 9.75 5.25v6H3a.75 .75 0 0 0 0 1.5h6.75v6a.75 .75 0 0 0 1.28 .53l6.75-6.75a.75 .75 0 0 0 0-1.06ZM11.25 16.94V7.06L16.19 12ZM21 3.75V20.25a.75 .75 0 0 1-1.5 0V3.75a.75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-arrow-line-down-duo\",\"label\":\"Arrow down to line duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 10.5l-6.75 6.75L5.25 10.5Z\",\"M11.47 17.78a.75 .75 0 0 0 1.06 0l6.75-6.75A.75 .75 0 0 0 18.75 9.75H12.75V3a.75 .75 0 0 0-1.5 0v6.75H5.25a.75 .75 0 0 0-.53 1.28ZM16.94 11.25 12 16.19 7.06 11.25ZM21 20.25a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1 0-1.5H20.25A.75 .75 0 0 1 21 20.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-left-right-duo\",\"label\":\"Arrows left right duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 7.5v9H4.5V7.5Z\",\"M20.03 17.03l-3 3a.75 .75 0 0 1-1.06-1.06L17.69 17.25H4.5a.75 .75 0 0 1 0-1.5H17.69l-1.72-1.72a.75 .75 0 0 1 1.06-1.06l3 3A.75 .75 0 0 1 20.03 17.03Zm-13.06-6a.75 .75 0 0 0 1.06-1.06L6.31 8.25H19.5a.75 .75 0 0 0 0-1.5H6.31L8.03 5.03A.75 .75 0 0 0 6.97 3.97l-3 3a.75 .75 0 0 0 0 1.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-down-up-duo\",\"label\":\"Arrows up down duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 4.5V19.5H7.5V4.5Z\",\"M11.03 15.97a.75 .75 0 0 1 0 1.06l-3 3a.75 .75 0 0 1-1.06 0l-3-3a.75 .75 0 0 1 1.06-1.06L6.75 17.69V4.5a.75 .75 0 0 1 1.5 0V17.69l1.72-1.72A.75 .75 0 0 1 11.03 15.97Zm9-9-3-3a.75 .75 0 0 0-1.06 0l-3 3a.75 .75 0 0 0 1.06 1.06L15.75 6.31V19.5a.75 .75 0 0 0 1.5 0V6.31l1.72 1.72a.75 .75 0 0 0 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-out-cardinal-duo\",\"label\":\"Move duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12 12 21.75 2.25 12 12 2.25Z\",\"M8.47 5.78a.75 .75 0 0 1 0-1.06l3-3a.75 .75 0 0 1 1.06 0l3 3a.75 .75 0 0 1-1.06 1.06L12.75 4.06V9a.75 .75 0 0 1-1.5 0V4.06L9.53 5.78A.75 .75 0 0 1 8.47 5.78Zm6 12.44L12.75 19.94V15a.75 .75 0 0 0-1.5 0v4.94l-1.72-1.72a.75 .75 0 0 0-1.06 1.06l3 3a.75 .75 0 0 0 1.06 0l3-3a.75 .75 0 0 0-1.06-1.06Zm7.81-6.75-3-3a.75 .75 0 0 0-1.06 1.06L19.94 11.25H15a.75 .75 0 0 0 0 1.5h4.94l-1.72 1.72a.75 .75 0 0 0 1.06 1.06l3-3A.75 .75 0 0 0 22.28 11.47ZM4.06 12.75H9a.75 .75 0 0 0 0-1.5H4.06l1.72-1.72A.75 .75 0 0 0 4.72 8.47l-3 3a.75 .75 0 0 0 0 1.06l3 3a.75 .75 0 0 0 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-in-duo\",\"label\":\"Collapse duotone\",\"set\":\"duotone\",\"paths\":[\"M21 4.5V19.5a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 4.5 3H19.5A1.5 1.5 0 0 1 21 4.5Z\",\"M13.5 9.75V6a.75 .75 0 0 1 1.5 0V7.94l3.97-3.97a.75 .75 0 0 1 1.06 1.06L16.06 9H18a.75 .75 0 0 1 0 1.5H14.25A.75 .75 0 0 1 13.5 9.75Zm-3.75 3.75H6a.75 .75 0 0 0 0 1.5H7.94L3.97 18.97a.75 .75 0 0 0 1.06 1.06L9 16.06V18a.75 .75 0 0 0 1.5 0V14.25A.75 .75 0 0 0 9.75 13.5Zm6.31 1.5H18a.75 .75 0 0 0 0-1.5H14.25a.75 .75 0 0 0-.75 .75v3.75a.75 .75 0 0 0 1.5 0V16.06l3.97 3.97a.75 .75 0 0 0 1.06-1.06ZM9.75 5.25a.75 .75 0 0 0-.75 .75V7.94L5.03 3.97A.75 .75 0 0 0 3.97 5.03L7.94 9H6a.75 .75 0 0 0 0 1.5h3.75a.75 .75 0 0 0 .75-.75V6A.75 .75 0 0 0 9.75 5.25Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-out-duo\",\"label\":\"Expand duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 4.5V19.5H4.5V4.5Z\",\"M20.25 4.5V9a.75 .75 0 0 1-1.5 0V6.31l-3.97 3.97a.75 .75 0 0 1-1.06-1.06L17.69 5.25H15a.75 .75 0 0 1 0-1.5h4.5A.75 .75 0 0 1 20.25 4.5ZM9.22 13.72 5.25 17.69V15a.75 .75 0 0 0-1.5 0v4.5a.75 .75 0 0 0 .75 .75H9a.75 .75 0 0 0 0-1.5H6.31l3.97-3.97a.75 .75 0 0 0-1.06-1.06ZM19.5 14.25a.75 .75 0 0 0-.75 .75v2.69l-3.97-3.97a.75 .75 0 0 0-1.06 1.06L17.69 18.75H15a.75 .75 0 0 0 0 1.5h4.5a.75 .75 0 0 0 .75-.75V15A.75 .75 0 0 0 19.5 14.25ZM6.31 5.25H9a.75 .75 0 0 0 0-1.5H4.5a.75 .75 0 0 0-.75 .75V9a.75 .75 0 0 0 1.5 0V6.31l3.97 3.97a.75 .75 0 0 0 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-arrows-counter-clockwise-duo\",\"label\":\"Undo duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 12a8.25 8.25 0 1 1-8.25-8.25A8.25 8.25 0 0 1 20.25 12Z\",\"M8.25 9.75H3.75a.75 .75 0 0 1-.75-.75V4.5a.75 .75 0 0 1 1.5 0V7.19L5.87 5.82A8.95 8.95 0 0 1 12.19 3.18h.05a8.94 8.94 0 0 1 6.29 2.56 .75 .75 0 0 1-1.05 1.07 7.46 7.46 0 0 0-5.24-2.13h-.04A7.46 7.46 0 0 0 6.93 6.88L5.56 8.25H8.25a.75 .75 0 0 1 0 1.5Zm12 4.5H15.75a.75 .75 0 0 0 0 1.5h2.69l-1.37 1.37a7.46 7.46 0 0 1-5.26 2.2h-.04a7.46 7.46 0 0 1-5.24-2.13 .75 .75 0 1 0-1.05 1.07 8.94 8.94 0 0 0 6.29 2.56H11.81a8.95 8.95 0 0 0 6.32-2.64L19.5 16.81V19.5a.75 .75 0 0 0 1.5 0V15A.75 .75 0 0 0 20.25 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-caret-right-duo\",\"label\":\"Caret right duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 12 9 19.5V4.5Z\",\"M17.03 11.47l-7.5-7.5A.75 .75 0 0 0 8.25 4.5V19.5a.75 .75 0 0 0 1.28 .53l7.5-7.5A.75 .75 0 0 0 17.03 11.47ZM9.75 17.69V6.31L15.44 12Z\"],\"faded\":[0]},{\"id\":\"ph-caret-left-duo\",\"label\":\"Caret left duotone\",\"set\":\"duotone\",\"paths\":[\"M15 4.5V19.5L7.5 12Z\",\"M15.29 3.81a.75 .75 0 0 0-.82 .16l-7.5 7.5a.75 .75 0 0 0 0 1.06l7.5 7.5A.75 .75 0 0 0 15.75 19.5V4.5A.75 .75 0 0 0 15.29 3.81ZM14.25 17.69 8.56 12 14.25 6.31Z\"],\"faded\":[0]},{\"id\":\"ph-caret-up-duo\",\"label\":\"Caret up duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 15H4.5l7.5-7.5Z\",\"M20.03 14.47l-7.5-7.5a.75 .75 0 0 0-1.06 0l-7.5 7.5A.75 .75 0 0 0 4.5 15.75H19.5a.75 .75 0 0 0 .53-1.28ZM6.31 14.25 12 8.56 17.69 14.25Z\"],\"faded\":[0]},{\"id\":\"ph-caret-down-duo\",\"label\":\"Caret down duotone\",\"set\":\"duotone\",\"paths\":[\"M19.5 9l-7.5 7.5L4.5 9Z\",\"M20.19 8.71A.75 .75 0 0 0 19.5 8.25H4.5a.75 .75 0 0 0-.53 1.28l7.5 7.5a.75 .75 0 0 0 1.06 0l7.5-7.5A.75 .75 0 0 0 20.19 8.71ZM12 15.44 6.31 9.75H17.69Z\"],\"faded\":[0]},{\"id\":\"ph-caret-double-right-duo\",\"label\":\"Next duotone\",\"set\":\"duotone\",\"paths\":[\"M12.75 12 5.25 19.5V4.5Z\",\"M13.28 11.47l-7.5-7.5A.75 .75 0 0 0 4.5 4.5V19.5a.75 .75 0 0 0 1.28 .53l7.5-7.5A.75 .75 0 0 0 13.28 11.47ZM6 17.69V6.31L11.69 12Zm14.78-5.16-7.5 7.5a.75 .75 0 0 1-1.06-1.06L19.19 12 12.22 5.03a.75 .75 0 0 1 1.06-1.06l7.5 7.5A.75 .75 0 0 1 20.78 12.53Z\"],\"faded\":[0]},{\"id\":\"ph-caret-double-left-duo\",\"label\":\"Back duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 4.5V19.5l-7.5-7.5Z\",\"M19.04 3.81a.75 .75 0 0 0-.82 .16l-7.5 7.5a.75 .75 0 0 0 0 1.06l7.5 7.5A.75 .75 0 0 0 19.5 19.5V4.5A.75 .75 0 0 0 19.04 3.81ZM18 17.69 12.31 12 18 6.31Zm-6.22 1.28a.75 .75 0 0 1-1.06 1.06l-7.5-7.5a.75 .75 0 0 1 0-1.06l7.5-7.5a.75 .75 0 0 1 1.06 1.06L4.81 12Z\"],\"faded\":[0]},{\"id\":\"ph-caret-circle-right-duo\",\"label\":\"Caret circle duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M12 2.25A9.75 9.75 0 1 0 21.75 12 9.76 9.76 0 0 0 12 2.25Zm0 18a8.25 8.25 0 1 1 8.25-8.25A8.26 8.26 0 0 1 12 20.25Zm2.78-8.78a.75 .75 0 0 1 0 1.06l-3.75 3.75a.75 .75 0 0 1-1.06-1.06L13.19 12 9.97 8.78a.75 .75 0 0 1 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-caret-circle-double-right-duo\",\"label\":\"Skip duotone\",\"set\":\"duotone\",\"paths\":[\"M18.36 18.36a9 9 0 1 1 0-12.73A9 9 0 0 1 18.36 18.36Z\",\"M18.89 5.11A9.75 9.75 0 0 0 5.11 18.89 9.75 9.75 0 0 0 18.89 5.11ZM17.83 17.83a8.25 8.25 0 1 1 0-11.67A8.26 8.26 0 0 1 17.83 17.83Zm-6.05-6.36a.75 .75 0 0 1 0 1.06l-3 3a.75 .75 0 0 1-1.06-1.06L10.19 12 7.72 9.53A.75 .75 0 0 1 8.78 8.47Zm5.25 0a.75 .75 0 0 1 0 1.06l-3 3a.75 .75 0 0 1-1.06-1.06L15.44 12l-2.47-2.47a.75 .75 0 0 1 1.06-1.06Z\"],\"faded\":[0]},{\"id\":\"ph-cursor-duo\",\"label\":\"Cursor duotone\",\"set\":\"duotone\",\"paths\":[\"M20.03 18.84 18.84 20.03a.75 .75 0 0 1-1.06 0l-4.81-4.81a.75 .75 0 0 0-1.22 .23l-1.67 4.35a.75 .75 0 0 1-1.39-.07L3.79 4.73a.75 .75 0 0 1 .94-.94L19.74 8.69a.75 .75 0 0 1 .07 1.39l-4.35 1.67a.75 .75 0 0 0-.23 1.22l4.81 4.81A.75 .75 0 0 1 20.03 18.84Z\",\"M15.75 12.44 20.07 10.78l.03-.01A1.5 1.5 0 0 0 19.97 7.98L4.96 3.08A1.5 1.5 0 0 0 3.08 4.96L7.98 19.97a1.48 1.48 0 0 0 1.35 1.03l.07 0a1.49 1.49 0 0 0 1.37-.9l.01-.03L12.44 15.75 17.25 20.56a1.5 1.5 0 0 0 2.12 0l1.19-1.19a1.5 1.5 0 0 0 0-2.12ZM18.31 19.5 13.5 14.69a1.5 1.5 0 0 0-2.44 .46c0 .01-.01 .02-.01 .03l-1.65 4.31L4.5 4.5l14.99 4.89-4.31 1.65-.03 .01a1.5 1.5 0 0 0-.46 2.44h0L19.5 18.31Z\"],\"faded\":[0]},{\"id\":\"ph-cursor-click-duo\",\"label\":\"Click duotone\",\"set\":\"duotone\",\"paths\":[\"M20.03 18.84 18.84 20.03a.75 .75 0 0 1-1.06 0l-4.81-4.81a.75 .75 0 0 0-1.22 .23l-1.67 4.35a.75 .75 0 0 1-1.39-.07L3.79 4.73a.75 .75 0 0 1 .94-.94L19.74 8.69a.75 .75 0 0 1 .07 1.39l-4.35 1.67a.75 .75 0 0 0-.23 1.22l4.81 4.81A.75 .75 0 0 1 20.03 18.84Z\",\"M8.25 2.25V1.5a.75 .75 0 0 1 1.5 0v.75a.75 .75 0 0 1-1.5 0ZM1.5 9.75h.75a.75 .75 0 0 0 0-1.5H1.5a.75 .75 0 0 0 0 1.5ZM11.66 3.67a.75 .75 0 0 0 1.01-.34l.75-1.5a.75 .75 0 0 0-1.34-.67l-.75 1.5A.75 .75 0 0 0 11.66 3.67Zm-9 7.66-1.5 .75a.75 .75 0 0 0 .67 1.34l1.5-.75a.75 .75 0 1 0-.67-1.34ZM20.56 17.25a1.5 1.5 0 0 1 0 2.12l-1.19 1.19a1.5 1.5 0 0 1-2.12 0L12.44 15.75 10.78 20.07c0 .01-.01 .02-.01 .03a1.48 1.48 0 0 1-1.37 .9l-.07 0a1.48 1.48 0 0 1-1.35-1.03L3.08 4.96A1.5 1.5 0 0 1 4.96 3.08L19.97 7.98a1.5 1.5 0 0 1 .13 2.79l-.03 .01L15.75 12.44ZM19.5 18.31 14.69 13.5h0a1.5 1.5 0 0 1 .46-2.44l.03-.01 4.31-1.65L4.5 4.5l4.89 14.99 1.65-4.31c0-.01 .01-.02 .01-.03a1.5 1.5 0 0 1 1.1-.88 1.57 1.57 0 0 1 .28-.03 1.5 1.5 0 0 1 1.06 .44L18.31 19.5Z\"],\"faded\":[0]},{\"id\":\"ph-line-segment-duo\",\"label\":\"Line duotone\",\"set\":\"duotone\",\"paths\":[\"M7.59 16.41A2.25 2.25 0 1 1 4.41 16.41 2.25 2.25 0 0 1 7.59 16.41ZM19.59 4.41A2.25 2.25 0 1 0 19.59 7.59 2.25 2.25 0 0 0 19.59 4.41Z\",\"M20.12 3.88a3 3 0 0 0-4.71 3.65L7.52 15.42a3.01 3.01 0 0 0-3.65 .46h0a3 3 0 1 0 4.71 .6l7.89-7.89a3 3 0 0 0 3.65-4.71Zm-13.06 15.19a1.5 1.5 0 0 1-2.12-2.12h0a1.5 1.5 0 0 1 2.12 0h0A1.5 1.5 0 0 1 7.06 19.06Zm12-12a1.5 1.5 0 1 1 0-2.12A1.5 1.5 0 0 1 19.06 7.06Z\"],\"faded\":[0]},{\"id\":\"ph-line-segments-duo\",\"label\":\"Zigzag duotone\",\"set\":\"duotone\",\"paths\":[\"M5.34 17.16A2.25 2.25 0 1 1 2.16 17.16 2.25 2.25 0 0 1 5.34 17.16ZM7.41 7.41A2.25 2.25 0 1 0 10.59 7.41 2.25 2.25 0 0 0 7.41 7.41Zm6 6A2.25 2.25 0 1 0 16.59 13.41 2.25 2.25 0 0 0 13.41 13.41ZM21.84 3.66A2.25 2.25 0 1 0 21.84 6.84 2.25 2.25 0 0 0 21.84 3.66Z\",\"M22.37 3.13a3 3 0 0 0-4.24 0h0a3 3 0 0 0 0 4.24c.03 .03 .06 .05 .08 .08l-2.5 4.64a3.02 3.02 0 0 0-2.24 .33l-1.89-1.89a3 3 0 0 0-4.71-3.65h0a3 3 0 0 0 0 4.24c.03 .03 .06 .05 .08 .08L4.47 15.84a3 3 0 0 0-2.84 .79h0a3 3 0 1 0 4.24 0c-.03-.03-.06-.05-.08-.08l2.5-4.64A3.04 3.04 0 0 0 9 12a3 3 0 0 0 1.52-.41l1.89 1.89a3 3 0 1 0 4.71-.6c-.03-.03-.06-.05-.08-.08l2.5-4.64A3.03 3.03 0 0 0 20.25 8.25a3 3 0 0 0 2.12-5.12ZM4.81 19.81a1.5 1.5 0 0 1-2.12-2.12h0A1.5 1.5 0 1 1 4.81 19.81Zm3.13-9.75a1.5 1.5 0 0 1 0-2.12h0a1.5 1.5 0 1 1 0 2.12Zm8.12 6a1.5 1.5 0 0 1-2.12-2.12h0a1.5 1.5 0 0 1 2.12 2.12Zm5.25-9.75A1.5 1.5 0 1 1 19.19 4.19h0a1.5 1.5 0 0 1 2.12 2.12Z\"],\"faded\":[0]},{\"id\":\"ph-line-vertical-duo\",\"label\":\"Vertical line duotone\",\"set\":\"duotone\",\"paths\":[\"M21 4.5V19.5a1.5 1.5 0 0 1-1.5 1.5H4.5a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 4.5 3H19.5A1.5 1.5 0 0 1 21 4.5Z\",\"M12.75 2.25V21.75a.75 .75 0 0 1-1.5 0V2.25a.75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-dots-three-duo\",\"label\":\"Dots duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 9v6a1.5 1.5 0 0 1-1.5 1.5H3a1.5 1.5 0 0 1-1.5-1.5V9A1.5 1.5 0 0 1 3 7.5H21A1.5 1.5 0 0 1 22.5 9Z\",\"M13.13 12a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 12Zm5.25-1.12a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 18.38 10.88ZM5.63 10.88a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 5.63 10.88Z\"],\"faded\":[0]},{\"id\":\"ph-dots-three-vertical-duo\",\"label\":\"Dots vertical duotone\",\"set\":\"duotone\",\"paths\":[\"M16.5 3V21a1.5 1.5 0 0 1-1.5 1.5H9a1.5 1.5 0 0 1-1.5-1.5V3A1.5 1.5 0 0 1 9 1.5h6A1.5 1.5 0 0 1 16.5 3Z\",\"M13.13 12a1.13 1.13 0 1 1-1.12-1.12A1.13 1.13 0 0 1 13.13 12ZM12 6.75a1.13 1.13 0 1 0-1.12-1.12A1.13 1.13 0 0 0 12 6.75Zm0 10.5a1.13 1.13 0 1 0 1.13 1.13A1.13 1.13 0 0 0 12 17.25Z\"],\"faded\":[0]},{\"id\":\"ph-dot-outline-duo\",\"label\":\"Dot duotone\",\"set\":\"duotone\",\"paths\":[\"M14.25 12a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 14.25 12Z\",\"M12 9a3 3 0 1 0 3 3A3 3 0 0 0 12 9Zm0 4.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 12 13.5Z\"],\"faded\":[0]},{\"id\":\"ph-wave-sine-duo\",\"label\":\"Wave duotone\",\"set\":\"duotone\",\"paths\":[\"M21.75 12c-4.87 10.39-7.31 5.2-9.75 0ZM2.25 12H12C9.56 6.8 7.13 1.61 2.25 12Z\",\"M22.43 12.32c-2.06 4.39-3.88 6.43-5.74 6.43-2.35 0-3.82-3.12-5.37-6.43C10.1 9.71 8.71 6.75 7.31 6.75c-1.54 0-3.4 3.49-4.38 5.57a.75 .75 0 0 1-1.36-.64C3.63 7.29 5.45 5.25 7.31 5.25c2.35 0 3.82 3.12 5.37 6.43C13.9 14.29 15.29 17.25 16.69 17.25c1.54 0 3.4-3.49 4.38-5.57a.75 .75 0 0 1 1.36 .64Z\"],\"faded\":[0]},{\"id\":\"ph-wave-square-duo\",\"label\":\"Square wave duotone\",\"set\":\"duotone\",\"paths\":[\"M12 6.75v5.25H2.25V6.75Zm0 5.25v5.25H21.75V12Z\",\"M22.5 12v5.25a.75 .75 0 0 1-.75 .75H12a.75 .75 0 0 1-.75-.75V7.5H3v4.5a.75 .75 0 0 1-1.5 0V6.75a.75 .75 0 0 1 .75-.75H12a.75 .75 0 0 1 .75 .75V16.5h8.25V12a.75 .75 0 0 1 1.5 0Z\"],\"faded\":[0]},{\"id\":\"ph-wave-triangle-duo\",\"label\":\"Triangle wave duotone\",\"set\":\"duotone\",\"paths\":[\"M7.13 5.25l4.88 6.75H2.25Zm14.63 6.75H12l4.88 6.75Z\",\"M22.36 12.44l-4.87 6.75a.75 .75 0 0 1-1.22 0L7.13 6.53l-4.27 5.91a.75 .75 0 1 1-1.22-.88l4.88-6.75a.75 .75 0 0 1 1.22 0l9.14 12.66 4.27-5.91a.75 .75 0 1 1 1.22 .88Z\"],\"faded\":[0]},{\"id\":\"ph-waves-duo\",\"label\":\"Waves duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 6.6v10.5c-6.75 5.6-9.75-5.29-16.5 .3v-10.5C10.5 1.31 13.5 12.2 20.25 6.6Z\",\"M20.83 16.62a.75 .75 0 0 1-.09 1.05c-1.63 1.35-3.08 1.83-4.41 1.83-1.74 0-3.26-.83-4.68-1.59-2.38-1.29-4.43-2.4-7.41 .07a.75 .75 0 1 1-.96-1.15c3.77-3.12 6.59-1.59 9.09-.23 2.38 1.29 4.43 2.4 7.41-.07A.75 .75 0 0 1 20.83 16.62Zm-1.06-5.34c-2.98 2.47-5.04 1.36-7.41 .07-2.49-1.35-5.32-2.89-9.09 .23a.75 .75 0 0 0 .96 1.15c2.98-2.47 5.04-1.36 7.41-.07 1.42 .77 2.94 1.59 4.68 1.59 1.33 0 2.78-.48 4.41-1.83a.75 .75 0 1 0-.96-1.15ZM4.23 7.48c2.98-2.47 5.04-1.36 7.41-.07 1.42 .77 2.94 1.59 4.68 1.59 1.33 0 2.78-.48 4.41-1.83a.75 .75 0 1 0-.96-1.15c-2.98 2.47-5.04 1.36-7.41 .07C9.86 4.74 7.04 3.21 3.27 6.33A.75 .75 0 1 0 4.23 7.48Z\"],\"faded\":[0]},{\"id\":\"ph-equals-duo\",\"label\":\"Equals duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25V18.75a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 5.25 3.75H18.75A1.5 1.5 0 0 1 20.25 5.25Z\",\"M21 15a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1 0-1.5H20.25A.75 .75 0 0 1 21 15ZM3.75 9.75H20.25a.75 .75 0 0 0 0-1.5H3.75a.75 .75 0 0 0 0 1.5Z\"],\"faded\":[0]},{\"id\":\"ph-divide-duo\",\"label\":\"Divide duotone\",\"set\":\"duotone\",\"paths\":[\"M20.25 5.25V18.75a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V5.25A1.5 1.5 0 0 1 5.25 3.75H18.75A1.5 1.5 0 0 1 20.25 5.25Z\",\"M21 12a.75 .75 0 0 1-.75 .75H3.75a.75 .75 0 0 1 0-1.5H20.25A.75 .75 0 0 1 21 12ZM12 7.5a1.5 1.5 0 1 0-1.5-1.5A1.5 1.5 0 0 0 12 7.5Zm0 9a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 12 16.5Z\"],\"faded\":[0]},{\"id\":\"ph-asterisk-duo\",\"label\":\"Asterisk duotone\",\"set\":\"duotone\",\"paths\":[\"M18.75 12a6.75 6.75 0 1 1-6.75-6.75A6.75 6.75 0 0 1 18.75 12Z\",\"M20.14 16.89a.75 .75 0 0 1-1.03 .26L12.75 13.32V20.25a.75 .75 0 0 1-1.5 0V13.32L4.89 17.14a.75 .75 0 1 1-.77-1.29L10.54 12 4.11 8.14a.75 .75 0 1 1 .77-1.29L11.25 10.68V3.75a.75 .75 0 0 1 1.5 0v6.93l6.36-3.82a.75 .75 0 1 1 .77 1.29L13.46 12l6.43 3.86A.75 .75 0 0 1 20.14 16.89Z\"],\"faded\":[0]},{\"id\":\"ph-infinity-duo\",\"label\":\"Infinity duotone\",\"set\":\"duotone\",\"paths\":[\"M21.18 15.18a4.5 4.5 0 0 1-6.36 0L12 12l2.82-3.18a4.5 4.5 0 0 1 6.36 6.36ZM2.82 8.82a4.5 4.5 0 0 0 6.36 6.36L12 12 9.18 8.82A4.5 4.5 0 0 0 2.82 8.82Z\",\"M23.25 12a5.25 5.25 0 0 1-8.96 3.71l-.03-.03L8.64 9.33a3.75 3.75 0 1 0 0 5.33l.8-.9a.75 .75 0 1 1 1.13 .99l-.81 .92-.03 .03a5.25 5.25 0 1 1 0-7.43l.03 .03 5.62 6.35a3.75 3.75 0 1 0 0-5.33l-.8 .9a.75 .75 0 1 1-1.12-.99l.81-.92 .03-.03A5.25 5.25 0 0 1 23.25 12Z\"],\"faded\":[0]},{\"id\":\"ph-spiral-duo\",\"label\":\"Spiral duotone\",\"set\":\"duotone\",\"paths\":[\"M22.5 13.5H19.5a7.5 7.5 0 0 1-7.5 7.5 8.25 8.25 0 0 1-8.25-8.25 9 9 0 0 1 9-9A9.75 9.75 0 0 1 22.5 13.5Z\",\"M23.25 13.5a.75 .75 0 0 1-1.5 0 9.01 9.01 0 0 0-9-9 8.26 8.26 0 0 0-8.25 8.25 7.51 7.51 0 0 0 7.5 7.5 6.76 6.76 0 0 0 6.75-6.75 6.01 6.01 0 0 0-6-6 5.26 5.26 0 0 0-5.25 5.25 4.5 4.5 0 0 0 4.5 4.5 3.75 3.75 0 0 0 3.75-3.75 3 3 0 0 0-3-3 2.25 2.25 0 0 0-2.25 2.25 1.5 1.5 0 0 0 1.5 1.5 .75 .75 0 0 0 .75-.75 .75 .75 0 0 1 0-1.5 1.5 1.5 0 0 1 1.5 1.5 2.25 2.25 0 0 1-2.25 2.25 3 3 0 0 1-3-3 3.75 3.75 0 0 1 3.75-3.75 4.5 4.5 0 0 1 4.5 4.5 5.26 5.26 0 0 1-5.25 5.25 6.01 6.01 0 0 1-6-6 6.76 6.76 0 0 1 6.75-6.75 7.51 7.51 0 0 1 7.5 7.5 8.26 8.26 0 0 1-8.25 8.25 9.01 9.01 0 0 1-9-9A9.76 9.76 0 0 1 12.75 3 10.51 10.51 0 0 1 23.25 13.5Z\"],\"faded\":[0]},{\"id\":\"ph-circle-notch-duo\",\"label\":\"Loading duotone\",\"set\":\"duotone\",\"paths\":[\"M21 12a9 9 0 1 1-9-9A9 9 0 0 1 21 12Z\",\"M21.75 12a9.75 9.75 0 0 1-19.5 0c0-3.84 2.23-7.35 5.69-8.93a.75 .75 0 0 1 .63 1.36C5.64 5.77 3.75 8.74 3.75 12a8.25 8.25 0 0 0 16.5 0c0-3.26-1.89-6.23-4.81-7.57a.75 .75 0 0 1 .63-1.36C19.52 4.65 21.75 8.16 21.75 12Z\"],\"faded\":[0]},{\"id\":\"ph-circles-three-duo\",\"label\":\"Circles duotone\",\"set\":\"duotone\",\"paths\":[\"M12 10.5a3.38 3.38 0 1 1 3.38-3.37A3.38 3.38 0 0 1 12 10.5Zm5.63 2.25a3.38 3.38 0 1 0 3.38 3.38A3.38 3.38 0 0 0 17.63 12.75ZM6.38 12.75a3.38 3.38 0 1 0 3.38 3.38A3.38 3.38 0 0 0 6.38 12.75Z\",\"M16.13 7.13a4.13 4.13 0 1 0-4.12 4.13A4.13 4.13 0 0 0 16.13 7.13Zm-4.12 2.63a2.63 2.63 0 1 1 2.63-2.62A2.63 2.63 0 0 1 12 9.75Zm5.63 2.25a4.13 4.13 0 1 0 4.13 4.13A4.13 4.13 0 0 0 17.63 12Zm0 6.75a2.63 2.63 0 1 1 2.63-2.62A2.63 2.63 0 0 1 17.63 18.75ZM6.38 12a4.13 4.13 0 1 0 4.13 4.13A4.13 4.13 0 0 0 6.38 12Zm0 6.75a2.63 2.63 0 1 1 2.63-2.62A2.63 2.63 0 0 1 6.38 18.75Z\"],\"faded\":[0]},{\"id\":\"ph-git-branch-duo\",\"label\":\"Branch duotone\",\"set\":\"duotone\",\"paths\":[\"M21 6a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 21 6Z\",\"M21.75 6a3 3 0 1 0-3.75 2.91v1.59a.75 .75 0 0 1-.75 .75H9a2.24 2.24 0 0 0-.75 .13V8.91a3 3 0 1 0-1.5 0v6.19a3 3 0 1 0 1.5 0V13.5a.75 .75 0 0 1 .75-.75h8.25a2.25 2.25 0 0 0 2.25-2.25V8.91A3.01 3.01 0 0 0 21.75 6ZM6 6A1.5 1.5 0 1 1 7.5 7.5 1.5 1.5 0 0 1 6 6ZM9 18a1.5 1.5 0 1 1-1.5-1.5A1.5 1.5 0 0 1 9 18ZM18.75 7.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 18.75 7.5Z\"],\"faded\":[0]},{\"id\":\"ph-flow-arrow-duo\",\"label\":\"Flow duotone\",\"set\":\"duotone\",\"paths\":[\"M7.5 16.5a3 3 0 1 1-3-3A3 3 0 0 1 7.5 16.5Z\",\"M23.03 6.97l-3-3a.75 .75 0 0 0-1.06 1.06L20.69 6.75H19.5c-4.62 0-5.72 2.64-6.69 4.96-.88 2.11-1.59 3.81-4.64 4.02a3.75 3.75 0 1 0 .01 1.5c4.06-.25 5.09-2.73 6.01-4.94C15.13 10.03 15.87 8.25 19.5 8.25h1.19l-1.72 1.72a.75 .75 0 0 0 1.06 1.06l3-3A.75 .75 0 0 0 23.03 6.97ZM4.5 18.75a2.25 2.25 0 1 1 2.25-2.25A2.25 2.25 0 0 1 4.5 18.75Z\"],\"faded\":[0]},{\"id\":\"ph-path-duo\",\"label\":\"Path duotone\",\"set\":\"duotone\",\"paths\":[\"M21 18.75a2.25 2.25 0 1 1-2.25-2.25A2.25 2.25 0 0 1 21 18.75Z\",\"M18.75 15.75a3.01 3.01 0 0 0-2.91 2.25H6.75a3 3 0 0 1 0-6h9a3.75 3.75 0 0 0 0-7.5H6.75a.75 .75 0 0 0 0 1.5h9a2.25 2.25 0 0 1 0 4.5H6.75a4.5 4.5 0 0 0 0 9h9.09a3 3 0 1 0 2.91-3.75Zm0 4.5a1.5 1.5 0 1 1 1.5-1.5A1.5 1.5 0 0 1 18.75 20.25Z\"],\"faded\":[0]},{\"id\":\"ph-numpad-duo\",\"label\":\"Numpad duotone\",\"set\":\"duotone\",\"paths\":[\"M18 4.5V18.75a1.5 1.5 0 0 1-1.5 1.5H7.5a1.5 1.5 0 0 1-1.5-1.5V4.5Z\",\"M7.5 4.5A1.5 1.5 0 1 1 6 3 1.5 1.5 0 0 1 7.5 4.5Zm4.5-1.5a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 12 3Zm6 3a1.5 1.5 0 1 0-1.5-1.5A1.5 1.5 0 0 0 18 6ZM6 8.25a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 6 8.25Zm6 0a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 12 8.25Zm6 0a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 18 8.25ZM6 13.5a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 6 13.5Zm6 0a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 12 13.5Zm0 5.25a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 12 18.75Zm6-5.25a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 18 13.5Z\"],\"faded\":[0]},{\"id\":\"brand-discord\",\"label\":\"Discord\",\"set\":\"brand\",\"paths\":[\"M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z\"],\"color\":\"#5865F2\"},{\"id\":\"brand-youtube\",\"label\":\"YouTube\",\"set\":\"brand\",\"paths\":[\"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\"],\"color\":\"#FF0000\"},{\"id\":\"brand-twitch\",\"label\":\"Twitch\",\"set\":\"brand\",\"paths\":[\"M11.571 4.714h1.715v5.143H11.57zm4.715 0H18v5.143h-1.714zM6 0L1.714 4.286v15.428h5.143V24l4.286-4.286h3.428L22.286 12V0zm14.571 11.143l-3.428 3.428h-3.429l-3 3v-3H6.857V1.714h13.714Z\"],\"color\":\"#9146FF\"},{\"id\":\"brand-tiktok\",\"label\":\"TikTok\",\"set\":\"brand\",\"paths\":[\"M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z\"],\"color\":\"#000000\"},{\"id\":\"brand-instagram\",\"label\":\"Instagram\",\"set\":\"brand\",\"paths\":[\"M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077\"],\"color\":\"#FF0069\"},{\"id\":\"brand-x\",\"label\":\"X\",\"set\":\"brand\",\"paths\":[\"M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z\"],\"color\":\"#000000\"},{\"id\":\"brand-telegram\",\"label\":\"Telegram\",\"set\":\"brand\",\"paths\":[\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\"],\"color\":\"#26A5E4\"},{\"id\":\"brand-whatsapp\",\"label\":\"WhatsApp\",\"set\":\"brand\",\"paths\":[\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z\"],\"color\":\"#25D366\"},{\"id\":\"brand-reddit\",\"label\":\"Reddit\",\"set\":\"brand\",\"paths\":[\"M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286C.775 23.225 1.097 24 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199c1.104 0 1.999.895 1.999 1.999 0 1.105-.895 2-1.999 2-.946 0-1.739-.657-1.947-1.539v.002c-1.147.162-2.032 1.15-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363.473-.363 1.064-.58 1.707-.58 1.547 0 2.802 1.254 2.802 2.802 0 1.117-.655 2.081-1.601 2.531-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87-.954-.447-1.614-1.415-1.614-2.538 0-1.548 1.255-2.802 2.803-2.802.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01c0-1.663 1.263-3.034 2.88-3.207.188-.911.993-1.595 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135-.147.015-.241.168-.183.305.483 1.154 1.622 1.964 2.953 1.964 1.33 0 2.47-.81 2.953-1.964.057-.137-.037-.29-.184-.305-.863-.087-1.795-.135-2.769-.135Z\"],\"color\":\"#FF4500\"},{\"id\":\"brand-facebook\",\"label\":\"Facebook\",\"set\":\"brand\",\"paths\":[\"M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z\"],\"color\":\"#0866FF\"},{\"id\":\"brand-snapchat\",\"label\":\"Snapchat\",\"set\":\"brand\",\"paths\":[\"M12.206.793c.99 0 4.347.276 5.93 3.821.529 1.193.403 3.219.299 4.847l-.003.06c-.012.18-.022.345-.03.51.075.045.203.09.401.09.3-.016.659-.12 1.033-.301.165-.088.344-.104.464-.104.182 0 .359.029.509.09.45.149.734.479.734.838.015.449-.39.839-1.213 1.168-.089.029-.209.075-.344.119-.45.135-1.139.36-1.333.81-.09.224-.061.524.12.868l.015.015c.06.136 1.526 3.475 4.791 4.014.255.044.435.27.42.509 0 .075-.015.149-.045.225-.24.569-1.273.988-3.146 1.271-.059.091-.12.375-.164.57-.029.179-.074.36-.134.553-.076.271-.27.405-.555.405h-.03c-.135 0-.313-.031-.538-.074-.36-.075-.765-.135-1.273-.135-.3 0-.599.015-.913.074-.6.104-1.123.464-1.723.884-.853.599-1.826 1.288-3.294 1.288-.06 0-.119-.015-.18-.015h-.149c-1.468 0-2.427-.675-3.279-1.288-.599-.42-1.107-.779-1.707-.884-.314-.045-.629-.074-.928-.074-.54 0-.958.089-1.272.149-.211.043-.391.074-.54.074-.374 0-.523-.224-.583-.42-.061-.192-.09-.389-.135-.567-.046-.181-.105-.494-.166-.57-1.918-.222-2.95-.642-3.189-1.226-.031-.063-.052-.15-.055-.225-.015-.243.165-.465.42-.509 3.264-.54 4.73-3.879 4.791-4.02l.016-.029c.18-.345.224-.645.119-.869-.195-.434-.884-.658-1.332-.809-.121-.029-.24-.074-.346-.119-1.107-.435-1.257-.93-1.197-1.273.09-.479.674-.793 1.168-.793.146 0 .27.029.383.074.42.194.789.3 1.104.3.234 0 .384-.06.465-.105l-.046-.569c-.098-1.626-.225-3.651.307-4.837C7.392 1.077 10.739.807 11.727.807l.419-.015h.06z\"],\"color\":\"#FFFC00\"},{\"id\":\"brand-kick\",\"label\":\"Kick\",\"set\":\"brand\",\"paths\":[\"M1.333 0h8v5.333H12V2.667h2.667V0h8v8H20v2.667h-2.667v2.666H20V16h2.667v8h-8v-2.667H12v-2.666H9.333V24h-8Z\"],\"color\":\"#53FC19\"},{\"id\":\"brand-github\",\"label\":\"GitHub\",\"set\":\"brand\",\"paths\":[\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"],\"color\":\"#181717\"},{\"id\":\"brand-spotify\",\"label\":\"Spotify\",\"set\":\"brand\",\"paths\":[\"M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z\"],\"color\":\"#1ED760\"},{\"id\":\"brand-netflix\",\"label\":\"Netflix\",\"set\":\"brand\",\"paths\":[\"m5.398 0 8.348 23.602c2.346.059 4.856.398 4.856.398L10.113 0H5.398zm8.489 0v9.172l4.715 13.33V0h-4.715zM5.398 1.5V24c1.873-.225 2.81-.312 4.715-.398V14.83L5.398 1.5z\"],\"color\":\"#E50914\"},{\"id\":\"brand-hbomax\",\"label\":\"HBO Max\",\"set\":\"brand\",\"paths\":[\"M3.784 8.716c-.655 0-1.32.29-2.173.946v-.78H0v6.236h1.715V11.24c.749-.592 1.091-.78 1.372-.78.333 0 .551.209.551.729v3.928h1.715V11.23c.748-.582 1.081-.769 1.372-.769.333 0 .55.208.55.728v3.928H8.99v-4.53c0-1.403-.8-1.871-1.57-1.871-.654 0-1.32.27-2.192.936-.28-.697-.894-.936-1.444-.936zm8.689 0c-1.705 0-3.118 1.466-3.118 3.284 0 1.82 1.413 3.285 3.118 3.285.842 0 1.57-.312 2.131-.988v.82h1.632V8.883h-1.632v.822c-.561-.676-1.29-.988-2.131-.988zm4.064.166c.707 1.102 1.507 2.09 2.443 3.077a26.593 26.593 0 0 0-2.443 3.16h2.069a13.603 13.603 0 0 1 1.673-2.183 14.067 14.067 0 0 1 1.632 2.182H24a25.142 25.142 0 0 0-2.432-3.16A23.918 23.918 0 0 0 24 8.883h-2.047a14.65 14.65 0 0 1-1.674 2.11 13.357 13.357 0 0 1-1.674-2.11zm-3.804 1.279c1.018 0 1.84.82 1.84 1.84a1.837 1.837 0 0 1-1.84 1.839c-1.019 0-1.84-.82-1.84-1.84 0-1.018.821-1.84 1.84-1.84zm0 .415c-.78 0-1.414.633-1.414 1.423s.634 1.424 1.413 1.424c.78 0 1.414-.634 1.414-1.424s-.634-1.424-1.414-1.424z\"],\"color\":\"#000000\"},{\"id\":\"brand-crunchyroll\",\"label\":\"Crunchyroll\",\"set\":\"brand\",\"paths\":[\"M2.909 13.436C2.914 7.61 7.642 2.893 13.468 2.898c5.576.005 10.137 4.339 10.51 9.819q.021-.351.022-.706C24.007 5.385 18.64.006 12.012 0S.007 5.36 0 11.988 5.36 23.994 11.988 24q.412 0 .815-.027c-5.526-.338-9.9-4.928-9.894-10.538Zm16.284.155a4.1 4.1 0 0 1-4.095-4.103 4.1 4.1 0 0 1 2.712-3.855 8.95 8.95 0 0 0-4.187-1.037 9.007 9.007 0 1 0 8.997 9.016q-.001-.847-.15-1.651a4.1 4.1 0 0 1-3.278 1.63Z\"],\"color\":\"#FF5E00\"},{\"id\":\"brand-steam\",\"label\":\"Steam\",\"set\":\"brand\",\"paths\":[\"M11.979 0C5.678 0 .511 4.86.022 11.037l6.432 2.658c.545-.371 1.203-.59 1.912-.59.063 0 .125.004.188.006l2.861-4.142V8.91c0-2.495 2.028-4.524 4.524-4.524 2.494 0 4.524 2.031 4.524 4.527s-2.03 4.525-4.524 4.525h-.105l-4.076 2.911c0 .052.004.105.004.159 0 1.875-1.515 3.396-3.39 3.396-1.635 0-3.016-1.173-3.331-2.727L.436 15.27C1.862 20.307 6.486 24 11.979 24c6.627 0 11.999-5.373 11.999-12S18.605 0 11.979 0zM7.54 18.21l-1.473-.61c.262.543.714.999 1.314 1.25 1.297.539 2.793-.076 3.332-1.375.263-.63.264-1.319.005-1.949s-.75-1.121-1.377-1.383c-.624-.26-1.29-.249-1.878-.03l1.523.63c.956.4 1.409 1.5 1.009 2.455-.397.957-1.497 1.41-2.454 1.012H7.54zm11.415-9.303c0-1.662-1.353-3.015-3.015-3.015-1.665 0-3.015 1.353-3.015 3.015 0 1.665 1.35 3.015 3.015 3.015 1.663 0 3.015-1.35 3.015-3.015zm-5.273-.005c0-1.252 1.013-2.266 2.265-2.266 1.249 0 2.266 1.014 2.266 2.266 0 1.251-1.017 2.265-2.266 2.265-1.253 0-2.265-1.014-2.265-2.265z\"],\"color\":\"#000000\"},{\"id\":\"brand-epicgames\",\"label\":\"Epic Games\",\"set\":\"brand\",\"paths\":[\"M3.537 0C2.165 0 1.66.506 1.66 1.879V18.44a4.262 4.262 0 00.02.433c.031.3.037.59.316.92.027.033.311.245.311.245.153.075.258.13.43.2l8.335 3.491c.433.199.614.276.928.27h.002c.314.006.495-.071.928-.27l8.335-3.492c.172-.07.277-.124.43-.2 0 0 .284-.211.311-.243.28-.33.285-.621.316-.92a4.261 4.261 0 00.02-.434V1.879c0-1.373-.506-1.88-1.878-1.88zm13.366 3.11h.68c1.138 0 1.688.553 1.688 1.696v1.88h-1.374v-1.8c0-.369-.17-.54-.523-.54h-.235c-.367 0-.537.17-.537.539v5.81c0 .369.17.54.537.54h.262c.353 0 .523-.171.523-.54V8.619h1.373v2.143c0 1.144-.562 1.71-1.7 1.71h-.694c-1.138 0-1.7-.566-1.7-1.71V4.82c0-1.144.562-1.709 1.7-1.709zm-12.186.08h3.114v1.274H6.117v2.603h1.648v1.275H6.117v2.774h1.74v1.275h-3.14zm3.816 0h2.198c1.138 0 1.7.564 1.7 1.708v2.445c0 1.144-.562 1.71-1.7 1.71h-.799v3.338h-1.4zm4.53 0h1.4v9.201h-1.4zm-3.13 1.235v3.392h.575c.354 0 .523-.171.523-.54V4.965c0-.368-.17-.54-.523-.54zm-3.74 10.147a1.708 1.708 0 01.591.108 1.745 1.745 0 01.49.299l-.452.546a1.247 1.247 0 00-.308-.195.91.91 0 00-.363-.068.658.658 0 00-.28.06.703.703 0 00-.224.163.783.783 0 00-.151.243.799.799 0 00-.056.299v.008a.852.852 0 00.056.31.7.7 0 00.157.245.736.736 0 00.238.16.774.774 0 00.303.058.79.79 0 00.445-.116v-.339h-.548v-.565H7.37v1.255a2.019 2.019 0 01-.524.307 1.789 1.789 0 01-.683.123 1.642 1.642 0 01-.602-.107 1.46 1.46 0 01-.478-.3 1.371 1.371 0 01-.318-.455 1.438 1.438 0 01-.115-.58v-.008a1.426 1.426 0 01.113-.57 1.449 1.449 0 01.312-.46 1.418 1.418 0 01.474-.309 1.58 1.58 0 01.598-.111 1.708 1.708 0 01.045 0zm11.963.008a2.006 2.006 0 01.612.094 1.61 1.61 0 01.507.277l-.386.546a1.562 1.562 0 00-.39-.205 1.178 1.178 0 00-.388-.07.347.347 0 00-.208.052.154.154 0 00-.07.127v.008a.158.158 0 00.022.084.198.198 0 00.076.066.831.831 0 00.147.06c.062.02.14.04.236.061a3.389 3.389 0 01.43.122 1.292 1.292 0 01.328.17.678.678 0 01.207.24.739.739 0 01.071.337v.008a.865.865 0 01-.081.382.82.82 0 01-.229.285 1.032 1.032 0 01-.353.18 1.606 1.606 0 01-.46.061 2.16 2.16 0 01-.71-.116 1.718 1.718 0 01-.593-.346l.43-.514c.277.223.578.335.9.335a.457.457 0 00.236-.05.157.157 0 00.082-.142v-.008a.15.15 0 00-.02-.077.204.204 0 00-.073-.066.753.753 0 00-.143-.062 2.45 2.45 0 00-.233-.062 5.036 5.036 0 01-.413-.113 1.26 1.26 0 01-.331-.16.72.72 0 01-.222-.243.73.73 0 01-.082-.36v-.008a.863.863 0 01.074-.359.794.794 0 01.214-.283 1.007 1.007 0 01.34-.185 1.423 1.423 0 01.448-.066 2.006 2.006 0 01.025 0zm-9.358.025h.742l1.183 2.81h-.825l-.203-.499H8.623l-.198.498h-.81zm2.197.02h.814l.663 1.08.663-1.08h.814v2.79h-.766v-1.602l-.711 1.091h-.016l-.707-1.083v1.593h-.754zm3.469 0h2.235v.658h-1.473v.422h1.334v.61h-1.334v.442h1.493v.658h-2.255zm-5.3.897l-.315.793h.624zm-1.145 5.19h8.014l-4.09 1.348z\"],\"color\":\"#313131\"},{\"id\":\"brand-playstation\",\"label\":\"PlayStation\",\"set\":\"brand\",\"paths\":[\"M8.984 2.596v17.547l3.915 1.261V6.688c0-.69.304-1.151.794-.991.636.18.76.814.76 1.505v5.875c2.441 1.193 4.362-.002 4.362-3.152 0-3.237-1.126-4.675-4.438-5.827-1.307-.448-3.728-1.186-5.39-1.502zm4.656 16.241l6.296-2.275c.715-.258.826-.625.246-.818-.586-.192-1.637-.139-2.357.123l-4.205 1.5V14.98l.24-.085s1.201-.42 2.913-.615c1.696-.18 3.785.03 5.437.661 1.848.601 2.04 1.472 1.576 2.072-.465.6-1.622 1.036-1.622 1.036l-8.544 3.107V18.86zM1.807 18.6c-1.9-.545-2.214-1.668-1.352-2.32.801-.586 2.16-1.052 2.16-1.052l5.615-2.013v2.313L4.205 17c-.705.271-.825.632-.239.826.586.195 1.637.15 2.343-.12L8.247 17v2.074c-.12.03-.256.044-.39.073-1.939.331-3.996.196-6.038-.479z\"],\"color\":\"#0070D1\"},{\"id\":\"brand-roblox\",\"label\":\"Roblox\",\"set\":\"brand\",\"paths\":[\"M18.926 23.998 0 18.892 5.075.002 24 5.108ZM15.348 10.09l-5.282-1.453-1.414 5.273 5.282 1.453z\"],\"color\":\"#000000\"},{\"id\":\"brand-fortnite\",\"label\":\"Fortnite\",\"set\":\"brand\",\"paths\":[\"m15.767 14.171.097-5.05H12.4V5.197h3.99L16.872 0H7.128v24l5.271-.985V14.17z\"],\"color\":\"#000000\"},{\"id\":\"brand-valorant\",\"label\":\"Valorant\",\"set\":\"brand\",\"paths\":[\"M23.792 2.152a.252.252 0 0 0-.098.083c-3.384 4.23-6.769 8.46-10.15 12.69-.107.093-.025.288.119.265 2.439.003 4.877 0 7.316.001a.66.66 0 0 0 .552-.25c.774-.967 1.55-1.934 2.324-2.903a.72.72 0 0 0 .144-.49c-.002-3.077 0-6.153-.003-9.23.016-.11-.1-.206-.204-.167zM.077 2.166c-.077.038-.074.132-.076.205.002 3.074.001 6.15.001 9.225a.679.679 0 0 0 .158.463l7.64 9.55c.12.152.308.25.505.247 2.455 0 4.91.003 7.365 0 .142.02.222-.174.116-.265C10.661 15.176 5.526 8.766.4 2.35c-.08-.094-.174-.272-.322-.184z\"],\"color\":\"#FA4454\"},{\"id\":\"brand-riotgames\",\"label\":\"Riot Games\",\"set\":\"brand\",\"paths\":[\"M13.458.86 0 7.093l3.353 12.761 2.552-.313-.701-8.024.838-.373 1.447 8.202 4.361-.535-.775-8.857.83-.37 1.591 9.025 4.412-.542-.849-9.708.84-.374 1.74 9.87L24 17.318V3.5Zm.316 19.356.222 1.256L24 23.14v-4.18l-10.22 1.256Z\"],\"color\":\"#EB0029\"},{\"id\":\"brand-leagueoflegends\",\"label\":\"League of Legends\",\"set\":\"brand\",\"paths\":[\"m1.912 0 1.212 2.474v19.053L1.912 24h14.73l1.337-4.682H8.33V0ZM12 1.516c-.913 0-1.798.112-2.648.312v1.74a9.738 9.738 0 0 1 2.648-.368c5.267 0 9.536 4.184 9.536 9.348a9.203 9.203 0 0 1-2.3 6.086l-.273.954-.602 2.112c2.952-1.993 4.89-5.335 4.89-9.122C23.25 6.468 18.213 1.516 12 1.516Zm0 2.673c-.924 0-1.814.148-2.648.414v13.713h8.817a8.246 8.246 0 0 0 2.36-5.768c0-4.617-3.818-8.359-8.529-8.359zM2.104 7.312A10.858 10.858 0 0 0 .75 12.576c0 1.906.492 3.7 1.355 5.266z\"],\"color\":\"#C28F2C\"},{\"id\":\"brand-counterstrike\",\"label\":\"Counter-Strike\",\"set\":\"brand\",\"paths\":[\"M21.7101 3.2348a.0218.0218 0 0 1-.0216-.0215c.001-.0815.003-.3698.004-.424 0-.1292-.1428-.1831-.2117-.0829-.0113.016-.1457.212-.2287.3323a.0244.0244 0 0 1-.0198.0103h-6.5508a.0473.0473 0 0 1-.0473-.0463l-.0131-.177a.0477.0477 0 0 1 .056-.0477l.335.0319a.059.059 0 0 0 .0624-.0445l.2441-.989a.0475.0475 0 0 0-.0295-.0542l-.2268-.0848a.0427.0427 0 0 1-.0263-.0295c-.0412-.1722-.3766-1.3235-1.9935-1.581-.7867-.125-1.302.2107-1.577.4784a1.594 1.594 0 0 0-.3018.4095l-.0965.2125c-.008.0164-.046.2157-.046.234l.0513.9815a.109.109 0 0 0 .0422.0856l.3546.153-.1958.3244a.055.055 0 0 1-.053.0402s-.417.0108-.6227.0192c-.3856.0155-1.2444.4858-1.8773 1.8385-.6219 1.3282-.724 1.5496-.724 1.5496a.0736.0736 0 0 1-.0684.0398l-.5776.0019c-.0356 0-.0736.0285-.0886.0608l-.8982 2.5428c-.0149.0323-.006.081.0173.1081l.627.3918a.059.059 0 0 1 .0195.059l-.3274.9664a.1916.1916 0 0 1-.0235.0618l-.4343.3824a.1056.1056 0 0 0-.0356.059l-.5978 1.5308a.0632.0632 0 0 1-.0608.0455l-.3355.0018a.1633.1633 0 0 0-.162.1488l-.2007 2.2883a1.7194 1.7194 0 0 1-.0159.1207l-.1583.908a.128.128 0 0 1-.0333.0553l-.5584.4263c-.2559.2443-.5988.6903-.7665 1.0015l-1.86 3.9235c-.045.0833-.0811.227-.0788.3221l.1321.2354c.002.0842-.0319.4559-.0707.5307L.817 23.6545a.0985.0985 0 0 0-.003.0856l.0309.0706.0932.1859 1.8913.0029c.1173.0106.247-.1396.2507-.3005l.1027-1.2965-.0268-.1952 3.6063-4.232c.0942-.1146.222-.3168.2861-.4506l1.7186-3.7892a.1712.1712 0 0 1 .1004-.088l.1086-.035a.1694.1694 0 0 1 .1827.0528c.1505.1807.5042.781.6765 1.0315.1425.2079.8495 1.2304 1.1582 1.5675.0853.0926.3481.198.4658.2696a.083.083 0 0 1 .029.1119l-1.0298 1.8083-.4549 2.1357a.9542.9542 0 0 0-.0356.1526l-.4118 1.4831c.003.1873-.141.2856-.1527.5064l-.15 1.084a.0581.0581 0 0 0 .0582.0614l2.5445.014c.0951-.0003.1902-.0045.2854-.0067a1.1049 1.1049 0 0 0 .0755-.0069c.1242-.0158.5629-.0754.75-.1503.1097-.0388.1809-.0819.2268-.1295.1855-.1935.2002-.278.2034-.3975.001-.0212-.011-.0726-.0283-.1049-.0053-.0117-.0316-.0382-.059-.0477l-1.1815-.3562a.3693.3693 0 0 1-.1889-.1338l-.3172-.469a.0865.0865 0 0 1 .0173-.0973l.618-.609a.2017.2017 0 0 0 .0483-.072l1.9036-4.488c.089-.285.0595-.6056 0-.9445-.044-.2504-.6854-1.3264-.8532-1.6236-.1476-.262-1.0677-1.8707-1.286-2.2517-.0793-.1376-.1894-.1328-.2287-.276l-.0726-1.1173a.0398.0398 0 0 1 .0356-.0505l.3312-.0276a.093.093 0 0 0 .0741-.0487l1.147-2.1544a.0958.0958 0 0 0-.002-.094l-.2349-.2907a.0874.0874 0 0 1-.001-.0875l.3515-.3796a.054.054 0 0 1 .0736-.0206l.9343.5266a.3819.3819 0 0 0 .186.0505c.259-.0019.6858-.1549.908-.2906a.3833.3833 0 0 0 .1386-.148l.4583-1.0703c.006-.0136.0262-.0117.029.0028l.1278.5953a.0635.0635 0 0 0 .0788.0501l1.3494-.3a.0662.0662 0 0 0 .05-.0786l-.318-1.3437a.0716.0716 0 0 1 .009-.0534l.1313-.2036a.281.281 0 0 0 .036-.0814l.1589-.725a.0408.0408 0 0 1 .0397-.0323l3.7327.0047a.0916.0916 0 0 0 .0932-.0931v-.6336a.022.022 0 0 1 .0216-.0216h1.4393a.0465.0465 0 0 0 .0464-.0463v-.2855a.0465.0465 0 0 0-.0464-.0463h-1.4398z\"],\"color\":\"#000000\"},{\"id\":\"brand-paypal\",\"label\":\"PayPal\",\"set\":\"brand\",\"paths\":[\"M15.607 4.653H8.941L6.645 19.251H1.82L4.862 0h7.995c3.754 0 6.375 2.294 6.473 5.513-.648-.478-2.105-.86-3.722-.86m6.57 5.546c0 3.41-3.01 6.853-6.958 6.853h-2.493L11.595 24H6.74l1.845-11.538h3.592c4.208 0 7.346-3.634 7.153-6.949a5.24 5.24 0 0 1 2.848 4.686M9.653 5.546h6.408c.907 0 1.942.222 2.363.541-.195 2.741-2.655 5.483-6.441 5.483H8.714Z\"],\"color\":\"#002991\"},{\"id\":\"brand-stripe\",\"label\":\"Stripe\",\"set\":\"brand\",\"paths\":[\"M13.976 9.15c-2.172-.806-3.356-1.426-3.356-2.409 0-.831.683-1.305 1.901-1.305 2.227 0 4.515.858 6.09 1.631l.89-5.494C18.252.975 15.697 0 12.165 0 9.667 0 7.589.654 6.104 1.872 4.56 3.147 3.757 4.992 3.757 7.218c0 4.039 2.467 5.76 6.476 7.219 2.585.92 3.445 1.574 3.445 2.583 0 .98-.84 1.545-2.354 1.545-1.875 0-4.965-.921-6.99-2.109l-.9 5.555C5.175 22.99 8.385 24 11.714 24c2.641 0 4.843-.624 6.328-1.813 1.664-1.305 2.525-3.236 2.525-5.732 0-4.128-2.524-5.851-6.594-7.305h.003z\"],\"color\":\"#635BFF\"},{\"id\":\"brand-visa\",\"label\":\"Visa\",\"set\":\"brand\",\"paths\":[\"M9.112 8.262L5.97 15.758H3.92L2.374 9.775c-.094-.368-.175-.503-.461-.658C1.447 8.864.677 8.627 0 8.479l.046-.217h3.3a.904.904 0 01.894.764l.817 4.338 2.018-5.102zm8.033 5.049c.008-1.979-2.736-2.088-2.717-2.972.006-.269.262-.555.822-.628a3.66 3.66 0 011.913.336l.34-1.59a5.207 5.207 0 00-1.814-.333c-1.917 0-3.266 1.02-3.278 2.479-.012 1.079.963 1.68 1.698 2.04.756.367 1.01.603 1.006.931-.005.504-.602.725-1.16.734-.975.015-1.54-.263-1.992-.473l-.351 1.642c.453.208 1.289.39 2.156.398 2.037 0 3.37-1.006 3.377-2.564m5.061 2.447H24l-1.565-7.496h-1.656a.883.883 0 00-.826.55l-2.909 6.946h2.036l.405-1.12h2.488zm-2.163-2.656l1.02-2.815.588 2.815zm-8.16-4.84l-1.603 7.496H8.34l1.605-7.496z\"],\"color\":\"#1A1F71\"},{\"id\":\"brand-mastercard\",\"label\":\"MasterCard\",\"set\":\"brand\",\"paths\":[\"M11.343 18.031c.058.049.12.098.181.146-1.177.783-2.59 1.238-4.107 1.238C3.32 19.416 0 16.096 0 12c0-4.095 3.32-7.416 7.416-7.416 1.518 0 2.931.456 4.105 1.238-.06.051-.12.098-.165.15C9.6 7.489 8.595 9.688 8.595 12c0 2.311 1.001 4.51 2.748 6.031zm5.241-13.447c-1.52 0-2.931.456-4.105 1.238.06.051.12.098.165.15C14.4 7.489 15.405 9.688 15.405 12c0 2.31-1.001 4.507-2.748 6.031-.058.049-.12.098-.181.146 1.177.783 2.588 1.238 4.107 1.238C20.68 19.416 24 16.096 24 12c0-4.094-3.32-7.416-7.416-7.416zM12 6.174c-.096.075-.189.15-.28.231C10.156 7.764 9.169 9.765 9.169 12c0 2.236.987 4.236 2.551 5.595.09.08.185.158.28.232.096-.074.189-.152.28-.232 1.563-1.359 2.551-3.359 2.551-5.595 0-2.235-.987-4.236-2.551-5.595-.09-.08-.184-.156-.28-.231z\"],\"color\":\"#EB001B\"},{\"id\":\"brand-revolut\",\"label\":\"Revolut\",\"set\":\"brand\",\"paths\":[\"M20.9133 6.9566C20.9133 3.1208 17.7898 0 13.9503 0H2.424v3.8605h10.9782c1.7376 0 3.177 1.3651 3.2087 3.043.016.84-.2994 1.633-.8878 2.2324-.5886.5998-1.375.9303-2.2144.9303H9.2322a.2756.2756 0 0 0-.2755.2752v3.431c0 .0585.018.1142.052.1612L16.2646 24h5.3114l-7.2727-10.094c3.6625-.1838 6.61-3.2612 6.61-6.9494zM6.8943 5.9229H2.424V24h4.4704z\"],\"color\":\"#191C1F\"},{\"id\":\"brand-wise\",\"label\":\"Wise\",\"set\":\"brand\",\"paths\":[\"M6.488 7.469 0 15.05h11.585l1.301-3.576H7.922l3.033-3.507.01-.092L8.993 4.48h8.873l-6.878 18.925h4.706L24 .595H2.543l3.945 6.874Z\"],\"color\":\"#9FE870\"},{\"id\":\"brand-applepay\",\"label\":\"Apple Pay\",\"set\":\"brand\",\"paths\":[\"M2.15 4.318a42.16 42.16 0 0 0-.454.003c-.15.005-.303.013-.452.04a1.44 1.44 0 0 0-1.06.772c-.07.138-.114.278-.14.43-.028.148-.037.3-.04.45A10.2 10.2 0 0 0 0 6.222v11.557c0 .07.002.138.003.207.004.15.013.303.04.452.027.15.072.291.142.429a1.436 1.436 0 0 0 .63.63c.138.07.278.115.43.142.148.027.3.036.45.04l.208.003h20.194l.207-.003c.15-.004.303-.013.452-.04.15-.027.291-.071.428-.141a1.432 1.432 0 0 0 .631-.631c.07-.138.115-.278.141-.43.027-.148.036-.3.04-.45.002-.07.003-.138.003-.208l.001-.246V6.221c0-.07-.002-.138-.004-.207a2.995 2.995 0 0 0-.04-.452 1.446 1.446 0 0 0-1.2-1.201 3.022 3.022 0 0 0-.452-.04 10.448 10.448 0 0 0-.453-.003zm0 .512h19.942c.066 0 .131.002.197.003.115.004.25.01.375.032.109.02.2.05.287.094a.927.927 0 0 1 .407.407.997.997 0 0 1 .094.288c.022.123.028.258.031.374.002.065.003.13.003.197v11.552c0 .065 0 .13-.003.196-.003.115-.009.25-.032.375a.927.927 0 0 1-.5.693 1.002 1.002 0 0 1-.286.094 2.598 2.598 0 0 1-.373.032l-.2.003H1.906c-.066 0-.133-.002-.196-.003a2.61 2.61 0 0 1-.375-.032c-.109-.02-.2-.05-.288-.094a.918.918 0 0 1-.406-.407 1.006 1.006 0 0 1-.094-.288 2.531 2.531 0 0 1-.032-.373 9.588 9.588 0 0 1-.002-.197V6.224c0-.065 0-.131.002-.197.004-.114.01-.248.032-.375.02-.108.05-.199.094-.287a.925.925 0 0 1 .407-.406 1.03 1.03 0 0 1 .287-.094c.125-.022.26-.029.375-.032.065-.002.131-.002.196-.003zm4.71 3.7c-.3.016-.668.199-.88.456-.191.22-.36.58-.316.918.338.03.675-.169.888-.418.205-.258.345-.603.308-.955zm2.207.42v5.493h.852v-1.877h1.18c1.078 0 1.835-.739 1.835-1.812 0-1.07-.742-1.805-1.808-1.805zm.852.719h.982c.739 0 1.161.396 1.161 1.089 0 .692-.422 1.092-1.164 1.092h-.979zm-3.154.3c-.45.01-.83.28-1.05.28-.235 0-.593-.264-.981-.257a1.446 1.446 0 0 0-1.23.747c-.527.908-.139 2.255.374 2.995.249.366.549.769.944.754.373-.014.52-.242.973-.242.454 0 .586.242.98.235.41-.007.667-.366.915-.733.286-.417.403-.82.41-.841-.007-.008-.79-.308-.797-1.209-.008-.754.615-1.113.644-1.135-.352-.52-.9-.578-1.09-.593a1.123 1.123 0 0 0-.092-.002zm8.204.397c-.99 0-1.606.533-1.652 1.256h.777c.072-.358.369-.586.845-.586.502 0 .803.266.803.711v.309l-1.097.064c-.951.054-1.488.484-1.488 1.184 0 .72.548 1.207 1.332 1.207.526 0 1.032-.281 1.264-.727h.019v.659h.788v-2.76c0-.803-.62-1.317-1.591-1.317zm1.94.072l1.446 4.009c0 .003-.073.24-.073.247-.125.41-.33.571-.711.571-.069 0-.206 0-.267-.015v.666c.06.011.267.019.335.019.83 0 1.226-.312 1.568-1.283l1.5-4.214h-.868l-1.012 3.259h-.015l-1.013-3.26zm-1.167 2.189v.316c0 .521-.45.917-1.024.917-.442 0-.731-.228-.731-.579 0-.342.278-.56.769-.593z\"],\"color\":\"#000000\"},{\"id\":\"brand-googlepay\",\"label\":\"Google Pay\",\"set\":\"brand\",\"paths\":[\"M3.963 7.235A3.963 3.963 0 00.422 9.419a3.963 3.963 0 000 3.559 3.963 3.963 0 003.541 2.184c1.07 0 1.97-.352 2.627-.957.748-.69 1.18-1.71 1.18-2.916a4.722 4.722 0 00-.07-.806H3.964v1.526h2.14a1.835 1.835 0 01-.79 1.205c-.356.241-.814.379-1.35.379-1.034 0-1.911-.697-2.225-1.636a2.375 2.375 0 010-1.517c.314-.94 1.191-1.636 2.225-1.636a2.152 2.152 0 011.52.594l1.132-1.13a3.808 3.808 0 00-2.652-1.033zm6.501.55v6.9h.886V11.89h1.465c.603 0 1.11-.196 1.522-.588a1.911 1.911 0 00.635-1.464 1.92 1.92 0 00-.635-1.456 2.125 2.125 0 00-1.522-.598zm2.427.85a1.156 1.156 0 01.823.365 1.176 1.176 0 010 1.686 1.171 1.171 0 01-.877.357H11.35V8.635h1.487a1.156 1.156 0 01.054 0zm4.124 1.175c-.842 0-1.477.308-1.907.925l.781.491c.288-.417.68-.626 1.175-.626a1.255 1.255 0 01.856.323 1.009 1.009 0 01.366.785v.202c-.34-.193-.774-.289-1.3-.289-.617 0-1.11.145-1.479.434-.37.288-.554.677-.554 1.165a1.476 1.476 0 00.525 1.156c.35.308.785.463 1.305.463.61 0 1.098-.27 1.465-.81h.038v.655h.848v-2.909c0-.61-.19-1.09-.568-1.44-.38-.35-.896-.525-1.551-.525zm2.263.154l1.946 4.422-1.098 2.38h.915L24 9.963h-.965l-1.368 3.391h-.02l-1.406-3.39zm-2.146 2.368c.494 0 .88.11 1.156.33 0 .372-.147.696-.44.973a1.413 1.413 0 01-.997.414 1.081 1.081 0 01-.69-.232.708.708 0 01-.293-.578c0-.257.12-.47.363-.647.24-.173.54-.26.9-.26Z\"],\"color\":\"#4285F4\"},{\"id\":\"brand-bitcoin\",\"label\":\"Bitcoin\",\"set\":\"crypto\",\"paths\":[\"M23.638 14.904c-1.602 6.43-8.113 10.34-14.542 8.736C2.67 22.05-1.244 15.525.362 9.105 1.962 2.67 8.475-1.243 14.9.358c6.43 1.605 10.342 8.115 8.738 14.548v-.002zm-6.35-4.613c.24-1.59-.974-2.45-2.64-3.03l.54-2.153-1.315-.33-.525 2.107c-.345-.087-.705-.167-1.064-.25l.526-2.127-1.32-.33-.54 2.165c-.285-.067-.565-.132-.84-.2l-1.815-.45-.35 1.407s.975.225.955.236c.535.136.63.486.615.766l-1.477 5.92c-.075.166-.24.406-.614.314.015.02-.96-.24-.96-.24l-.66 1.51 1.71.426.93.242-.54 2.19 1.32.327.54-2.17c.36.1.705.19 1.05.273l-.51 2.154 1.32.33.545-2.19c2.24.427 3.93.257 4.64-1.774.57-1.637-.03-2.58-1.217-3.196.854-.193 1.5-.76 1.68-1.93h.01zm-3.01 4.22c-.404 1.64-3.157.75-4.05.53l.72-2.9c.896.23 3.757.67 3.33 2.37zm.41-4.24c-.37 1.49-2.662.735-3.405.55l.654-2.64c.744.18 3.137.524 2.75 2.084v.006z\"],\"color\":\"#F7931A\"},{\"id\":\"brand-ethereum\",\"label\":\"Ethereum\",\"set\":\"crypto\",\"paths\":[\"M11.944 17.97L4.58 13.62 11.943 24l7.37-10.38-7.372 4.35h.003zM12.056 0L4.69 12.223l7.365 4.354 7.365-4.35L12.056 0z\"],\"color\":\"#3C3C3D\"},{\"id\":\"brand-litecoin\",\"label\":\"Litecoin\",\"set\":\"crypto\",\"paths\":[\"M12 0a12 12 0 1012 12A12 12 0 0012 0zm-.2617 3.6777h2.584a.3425.3425 0 01.33.4356l-2.0312 6.918 1.9062-.582-.4082 1.3847-1.9238.5605-1.248 4.213h6.6757a.3425.3425 0 01.3282.4374l-.582 2a.4586.4586 0 01-.4395.3301H6.7324l1.7227-5.8223-1.9063.5801.42-1.3613 1.9101-.58 2.4219-8.1798a.4557.4557 0 01.4375-.334Z\"],\"color\":\"#A6A9AA\"},{\"id\":\"brand-solana\",\"label\":\"Solana\",\"set\":\"crypto\",\"paths\":[\"m23.8764 18.0313-3.962 4.1393a.9201.9201 0 0 1-.306.2106.9407.9407 0 0 1-.367.0742H.4599a.4689.4689 0 0 1-.2522-.0733.4513.4513 0 0 1-.1696-.1962.4375.4375 0 0 1-.0314-.2545.4438.4438 0 0 1 .117-.2298l3.9649-4.1393a.92.92 0 0 1 .3052-.2102.9407.9407 0 0 1 .3658-.0746H23.54a.4692.4692 0 0 1 .2523.0734.4531.4531 0 0 1 .1697.196.438.438 0 0 1 .0313.2547.4442.4442 0 0 1-.1169.2297zm-3.962-8.3355a.9202.9202 0 0 0-.306-.2106.941.941 0 0 0-.367-.0742H.4599a.4687.4687 0 0 0-.2522.0734.4513.4513 0 0 0-.1696.1961.4376.4376 0 0 0-.0314.2546.444.444 0 0 0 .117.2297l3.9649 4.1394a.9204.9204 0 0 0 .3052.2102c.1154.049.24.0744.3658.0746H23.54a.469.469 0 0 0 .2523-.0734.453.453 0 0 0 .1697-.1961.4382.4382 0 0 0 .0313-.2546.4444.4444 0 0 0-.1169-.2297zM.46 6.7225h18.7815a.9411.9411 0 0 0 .367-.0742.9202.9202 0 0 0 .306-.2106l3.962-4.1394a.4442.4442 0 0 0 .117-.2297.4378.4378 0 0 0-.0314-.2546.453.453 0 0 0-.1697-.196.469.469 0 0 0-.2523-.0734H4.7596a.941.941 0 0 0-.3658.0745.9203.9203 0 0 0-.3052.2102L.1246 5.9687a.4438.4438 0 0 0-.1169.2295.4375.4375 0 0 0 .0312.2544.4512.4512 0 0 0 .1692.196.4689.4689 0 0 0 .2518.0739z\"],\"color\":\"#9945FF\"},{\"id\":\"brand-tether\",\"label\":\"Tether\",\"set\":\"crypto\",\"paths\":[\"M18.7538 10.5176c0 .6251-2.2379 1.1483-5.2381 1.2812l.0028.0007c-.0848.0064-.5233.0325-1.5012.0325-.7778 0-1.33-.0233-1.5237-.0325-3.0059-.1322-5.2495-.6555-5.2495-1.2819s2.2436-1.149 5.2495-1.2834v2.0442c.1965.0142.7594.0474 1.5372.0474.9334 0 1.4008-.0389 1.4849-.0466V9.2356c2.9994.1337 5.2381.657 5.2381 1.282zm5.19.5466L12.1248 22.389a.1803.1803 0 0 1-.2496 0L.0562 11.0635a.1781.1781 0 0 1-.0382-.2079l4.3762-9.1921a.1767.1767 0 0 1 .1626-.1026h14.8878a.1768.1768 0 0 1 .1612.1032l4.3762 9.1922a.1782.1782 0 0 1-.0382.2079zm-4.478-.4038c0-.8068-2.5515-1.4799-5.9473-1.6369V7.195h4.186V4.4055H6.3076V7.195h4.1852v1.8286c-3.4018.1562-5.9601.83-5.9601 1.6376 0 .8075 2.5583 1.4806 5.9601 1.6376v5.8618h3.025v-5.8639c3.394-.1563 5.948-.8295 5.948-1.6363z\"],\"color\":\"#50AF95\"},{\"id\":\"brand-dogecoin\",\"label\":\"Dogecoin\",\"set\":\"crypto\",\"paths\":[\"M12.288 7.908h-1.715v3.38h2.697v1.415h-2.697v3.38h1.799c.462 0 3.794.052 3.789-3.933-.005-3.984-3.232-4.242-3.873-4.242zM12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm.472 18.481H8.126v-5.778H6.594v-1.415h1.532V5.511h3.73c.882 0 6.727-.183 6.727 6.594-.001 6.888-6.111 6.376-6.111 6.376z\"],\"color\":\"#C2A633\"},{\"id\":\"brand-monero\",\"label\":\"Monero\",\"set\":\"crypto\",\"paths\":[\"M12 0C5.365 0 0 5.373 0 12.015c0 1.335.228 2.607.618 3.81h3.577V5.729L12 13.545l7.805-7.815v10.095h3.577c.389-1.203.618-2.475.618-3.81C24 5.375 18.635 0 12 0zm-1.788 15.307l-3.417-3.421v6.351H1.758C3.87 21.689 7.678 24 12 24s8.162-2.311 10.245-5.764h-5.04v-6.351l-3.386 3.421-1.788 1.79-1.814-1.79h-.005z\"],\"color\":\"#FF6600\"},{\"id\":\"brand-binance\",\"label\":\"Binance\",\"set\":\"crypto\",\"paths\":[\"M16.624 13.9202l2.7175 2.7154-7.353 7.353-7.353-7.352 2.7175-2.7164 4.6355 4.6595 4.6356-4.6595zm4.6366-4.6366L24 12l-2.7154 2.7164L18.5682 12l2.6924-2.7164zm-9.272.001l2.7163 2.6914-2.7164 2.7174v-.001L9.2721 12l2.7164-2.7154zm-9.2722-.001L5.4088 12l-2.6914 2.6924L0 12l2.7164-2.7164zM11.9885.0115l7.353 7.329-2.7174 2.7154-4.6356-4.6356-4.6355 4.6595-2.7174-2.7154 7.353-7.353z\"],\"color\":\"#F0B90B\"},{\"id\":\"brand-ripple\",\"label\":\"Ripple\",\"set\":\"crypto\",\"paths\":[\"M20.55 14.65c-.846-.486-1.805-.632-2.752-.666-.79-.023-1.974-.541-1.974-1.985 0-1.072.868-1.94 1.985-1.985.947-.034 1.906-.18 2.752-.666A5.018 5.018 0 0022.4 2.502 5.04 5.04 0 0015.53.674a4.993 4.993 0 00-2.504 4.343c0 .97.35 1.861.79 2.696.372.699.553 1.996-.71 2.73-.948.54-2.132.202-2.719-.745-.496-.801-1.094-1.545-1.94-2.03C6.045 6.28 2.977 7.104 1.6 9.495A5.018 5.018 0 003.44 16.34a5.025 5.025 0 005.008 0c.846-.485 1.444-1.23 1.94-2.03.406-.654 1.433-1.489 2.718-.744.948.541 1.241 1.737.711 2.73-.44.823-.79 1.725-.79 2.695A5.011 5.011 0 0018.034 24a5.011 5.011 0 005.008-5.008 4.982 4.982 0 00-2.492-4.343z\"],\"color\":\"#0085C0\"},{\"id\":\"brand-cardano\",\"label\":\"Cardano\",\"set\":\"crypto\",\"paths\":[\"M6.5765 11.92c-.0488.8906.6316 1.653 1.5219 1.7056h.0934c.8928-.0006 1.6161-.725 1.6155-1.6178-.0006-.8928-.725-1.6161-1.6178-1.6155-.8578.0006-1.5658.6711-1.613 1.5277Zm-6.025-.416c-.288-.0161-.5345.2042-.5507.4922-.0161.288.2042.5345.4922.5507.2878.0161.5343-.204.5506-.4918.0167-.2876-.2029-.5343-.4905-.5509H.5514Zm5.9226-8.9645c.257-.1309.3593-.4453.2284-.7024-.1309-.257-.4453-.3593-.7024-.2284-.2558.1302-.3585.4424-.2301.6991.13.2582.4448.3622.703.2322.0003-.0002.0007-.0003.001-.0005Zm1.6397 2.8589c.398-.2006.558-.6859.3573-1.0839-.2006-.398-.6859-.558-1.0839-.3573-.3978.2006-.5579.6856-.3575 1.0835.2007.398.686.5581 1.0842.3578ZM2.597 7.3645c.3072.2013.7194.1154.9206-.1918.2013-.3072.1154-.7194-.1918-.9206-.3072-.2013-.7194-.1154-.9206.1918 0 .0001-.0001.0002-.0002.0003-.201.3072-.1151.7191.192.9203Zm.9824 3.8515c-.4453-.0254-.827.3149-.8524.7603s.3149.827.7603.8524c.4453.0254.827-.3149.8524-.7603v-.0006c.0251-.4451-.3152-.8264-.7603-.8518Zm-.8915 5.4221c-.328.1652-.46.565-.2948.893.1652.328.565.46.893.2948.328-.1652.46-.565.2948-.893l-.0002-.0004c-.1645-.3276-.5633-.4598-.8909-.2954-.0006.0003-.0013.0006-.0019.001Zm3.136-7.0931c.4386.2876 1.0274.1653 1.315-.2734.2876-.4386.1653-1.0274-.2734-1.315-.4386-.2876-1.0273-.1653-1.3149.2732-.2878.4381-.166 1.0266.2721 1.3144.0004.0003.0008.0005.0012.0008Zm9.9501-4.2106c.3729.2447.8737.1408 1.1184-.2321.2447-.3729.1408-.8737-.2321-1.1184-.3729-.2447-.8737-.1408-1.1184.2321 0 .0001-.0001.0002-.0002.0003-.2447.3726-.141.8729.2316 1.1176.0003.0002.0005.0003.0008.0005Zm1.6563-2.8499c.2413.1579.565.0904.723-.151s.0904-.565-.151-.723c-.241-.1577-.5642-.0906-.7224.1501-.1584.241-.0915.5648.1495.7233l.0009.0006Zm-1.5296 7.8938c-.8911-.0507-1.6546.6305-1.7053 1.5216-.0507.8911.6305 1.6546 1.5216 1.7053h.0928c.8925 0 1.616-.7235 1.616-1.616 0-.8572-.6693-1.5652-1.5251-1.6134v.0026ZM8.645 9.433c.2737.5459.8331.8896 1.4438.887.8925-.0002 1.6159-.7238 1.6157-1.6163 0-.2526-.0593-.5018-.1731-.7273-.4017-.7971-1.3735-1.1176-2.1706-.7158-.7971.4017-1.1176 1.3735-.7158 2.1706v.0019Zm12.6669-2.0704c.3273-.1666.4575-.567.2909-.8943-.1666-.3273-.567-.4575-.8943-.2909-.3259.1659-.4567.5639-.2927.8908.1652.3284.5653.4607.8937.2956.0008-.0004.0015-.0008.0023-.0012Zm-4.096.5146c-.4683.2362-.6565.8074-.4203 1.2757.2362.4683.8074.6565 1.2757.4203.468-.2361.6563-.8066.4207-1.2749-.2364-.4683-.8074-.6568-1.2762-.4211Zm-5.2768-5.6365c.3667.0205.6806-.2601.7011-.6267s-.2601-.6806-.6267-.7011c-.3655-.0205-.6789.2584-.7009.6238-.0225.3662.2562.6813.6224.7038.0014 0 .0028.0002.0042.0002Zm-.0077 4.1837c.5237.0288.9717-.3724 1.0006-.8961.0288-.5237-.3723-.9717-.8961-1.0006-.5231-.0288-.9707.3714-1.0005.8944-.0298.5237.3706.9724.8943 1.0021h.0017Zm-5.1475 9.6992c.4685-.2359.657-.807.421-1.2755-.2359-.4685-.807-.657-1.2755-.421-.4684.2359-.6569.8069-.4211 1.2754.2362.4682.807.6567 1.2755.4211Zm5.76-8.313c-.4881.7459-.2792 1.7463.4667 2.2344s1.7463.2792 2.2344-.4667.2792-1.7463-.4667-2.2344c-.262-.1715-.5683-.263-.8815-.2635-.5452-.0001-1.0538.2744-1.353.7302Zm2.8109 6.7571c-.4015-.7975-1.3735-1.1185-2.171-.7169-.7975.4015-1.1185 1.3735-.7169 2.171.4015.7975 1.3735 1.1185 2.171.7169.0005-.0002.0009-.0005.0014-.0007.7947-.3952 1.1186-1.3598.7235-2.1545-.0026-.0053-.0053-.0105-.0079-.0158Zm2.8211-.112c-.4386-.2876-1.0274-.1653-1.315.2734-.2876.4386-.1653 1.0274.2734 1.315.4386.2876 1.0273.1653 1.3149-.2732.2877-.4386.1654-1.0274-.2731-1.3151h-.0002Zm3.0963-2.4282c.0254-.4453-.3149-.827-.7603-.8524-.4453-.0254-.827.3149-.8524.7603-.0254.4453.3149.827.7603.8524h.0006c.4451.0251.8264-.3152.8518-.7603Zm2.2349-.5741c-.288-.0161-.5345.2042-.5507.4922s.2042.5345.4922.5507c.2878.0161.5343-.204.5506-.4918.016-.288-.2042-.5345-.4922-.551Zm-2.1043 5.1821c-.3073-.2011-.7194-.115-.9205.1923-.2011.3073-.115.7194.1923.9205.3071.201.719.1151.9202-.1918.2013-.3071.1156-.7193-.1916-.9207l-.0004-.0003ZM6.5695 21.5161c-.2411-.1584-.5649-.0913-.7232.1497-.1584.2411-.0913.5649.1497.7232.2411.1584.5649.0913.7232-.1497.158-.2411.091-.5646-.1498-.7232Zm10.9555-.055c-.257.1309-.3593.4453-.2284.7024.1309.257.4453.3593.7023.2284.2558-.1302.3585-.4424.2301-.6991-.1291-.2579-.4428-.3624-.7007-.2333-.0011.0005-.0022.0011-.0033.0016Zm-6.0691-5.2717c.4892-.7465.2806-1.7482-.4659-2.2374-.7465-.4892-1.7482-.2806-2.2374.4659s-.2806 1.7482.4659 2.2374c.2628.1722.5702.2641.8844.2644.5458.0022 1.0553-.2728 1.353-.7302Zm-3.2301 2.4768c-.3729-.2447-.8737-.1408-1.1184.2321-.2447.3729-.1408.8737.2321 1.1184s.8737.1408 1.1184-.2321c0-.0001.0001-.0002.0002-.0003.2445-.3729.1405-.8734-.2323-1.1181Zm3.7664 3.0931c-.3667-.0209-.6808.2594-.7017.6261s.2594.6808.6261.7017c.3658.0208.6795-.2581.7016-.6238.0222-.3666-.2571-.6817-.6236-.7039-.0008 0-.0015 0-.0023-.0001Zm.007-4.1837c-.5237-.0288-.9717.3724-1.0005.8961-.0288.5237.3724.9717.8961 1.0005.5228.0288.9703-.371 1.0004-.8938.0298-.524-.3709-.973-.8949-1.0028h-.0011Zm3.8861 1.0259c-.3976.2022-.556.6884-.3539 1.086.2022.3976.6884.556 1.086.3539.3961-.2014.5551-.685.3558-1.0821-.2-.3987-.6854-.5598-1.0841-.3597-.0013.0007-.0026.0013-.0039.002Z\"],\"color\":\"#0133AD\"},{\"id\":\"brand-polygon\",\"label\":\"Polygon\",\"set\":\"crypto\",\"paths\":[\"m17.82 16.342 5.692-3.287A.98.98 0 0 0 24 12.21V5.635a.98.98 0 0 0-.488-.846l-5.693-3.286a.98.98 0 0 0-.977 0L11.15 4.789a.98.98 0 0 0-.489.846v11.747L6.67 19.686l-3.992-2.304v-4.61l3.992-2.304 2.633 1.52V8.896L7.158 7.658a.98.98 0 0 0-.977 0L.488 10.945a.98.98 0 0 0-.488.846v6.573a.98.98 0 0 0 .488.847l5.693 3.286a.981.981 0 0 0 .977 0l5.692-3.286a.98.98 0 0 0 .489-.846V6.618l.072-.041 3.92-2.263 3.99 2.305v4.609l-3.99 2.304-2.63-1.517v3.092l2.14 1.236a.981.981 0 0 0 .978 0v-.001Z\"],\"color\":\"#7B3FE4\"},{\"id\":\"brand-bnbchain\",\"label\":\"BNB Chain\",\"set\":\"crypto\",\"paths\":[\"M5.631 3.676 12.001 0l6.367 3.676-2.34 1.358L12 2.716 7.972 5.034l-2.34-1.358Zm12.737 4.636-2.34-1.358L12 9.272 7.972 6.954l-2.34 1.358v2.716l4.026 2.318v4.636L12 19.341l2.341-1.359v-4.636l4.027-2.318V8.312Zm0 7.352v-2.716l-2.34 1.358v2.716l2.34-1.358Zm1.663.96-4.027 2.318v2.717l6.368-3.677V10.63l-2.34 1.358v4.636Zm-2.34-10.63 2.34 1.358v2.716l2.341-1.358V5.994l-2.34-1.358-2.342 1.358ZM9.657 19.926v2.716L12 24l2.341-1.358v-2.716l-2.34 1.358-2.343-1.358Zm-4.027-4.262 2.341 1.358v-2.716l-2.34-1.358v2.716Zm4.027-9.67L12 7.352l2.341-1.358-2.34-1.358-2.343 1.358Zm-5.69 1.358L6.31 5.994 3.968 4.636l-2.34 1.358V8.71l2.34 1.358V7.352Zm0 4.636-2.34-1.358v7.352l6.368 3.677v-2.717l-4.028-2.318v-4.636Z\"],\"color\":\"#F0B90B\"},{\"id\":\"brand-bitcoincash\",\"label\":\"Bitcoin Cash\",\"set\":\"crypto\",\"paths\":[\"m10.84 11.22-.688-2.568c.728-.18 2.839-1.051 3.39.506.27 1.682-1.978 1.877-2.702 2.062zm.289 1.313.755 2.829c.868-.228 3.496-.46 3.241-2.351-.433-1.666-3.125-.706-3.996-.478zM24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0s12 5.373 12 12zm-6.341.661c-.183-1.151-1.441-2.095-2.485-2.202.643-.57.969-1.401.57-2.488-.603-1.368-1.989-1.66-3.685-1.377l-.546-2.114-1.285.332.536 2.108c-.338.085-.685.158-1.029.256L9.198 5.08l-1.285.332.545 2.114c-.277.079-2.595.673-2.595.673l.353 1.377s.944-.265.935-.244c.524-.137.771.125.886.372l1.498 5.793c.018.168-.012.454-.372.551.021.012-.935.241-.935.241l.14 1.605s2.296-.588 2.598-.664l.551 2.138 1.285-.332-.551-2.153c.353-.082.697-.168 1.032-.256l.548 2.141 1.285-.332-.551-2.135c1.982-.482 3.38-1.73 3.094-3.64z\"],\"color\":\"#0AC18E\"},{\"id\":\"brand-chainlink\",\"label\":\"Chainlink\",\"set\":\"crypto\",\"paths\":[\"M12 0L9.798 1.266l-6 3.468L1.596 6v12l2.202 1.266 6.055 3.468L12.055 24l2.202-1.266 5.945-3.468L22.404 18V6l-2.202-1.266-6-3.468zM6 15.468V8.532l6-3.468 6 3.468v6.936l-6 3.468z\"],\"color\":\"#375BD2\"},{\"id\":\"brand-shopify\",\"label\":\"Shopify\",\"set\":\"brand\",\"paths\":[\"M15.337 23.979l7.216-1.561s-2.604-17.613-2.625-17.73c-.018-.116-.114-.192-.211-.192s-1.929-.136-1.929-.136-1.275-1.274-1.439-1.411c-.045-.037-.075-.057-.121-.074l-.914 21.104h.023zM11.71 11.305s-.81-.424-1.774-.424c-1.447 0-1.504.906-1.504 1.141 0 1.232 3.24 1.715 3.24 4.629 0 2.295-1.44 3.76-3.406 3.76-2.354 0-3.54-1.465-3.54-1.465l.646-2.086s1.245 1.066 2.28 1.066c.675 0 .975-.545.975-.932 0-1.619-2.654-1.694-2.654-4.359-.034-2.237 1.571-4.416 4.827-4.416 1.257 0 1.875.361 1.875.361l-.945 2.715-.02.01zM11.17.83c.136 0 .271.038.405.135-.984.465-2.064 1.639-2.508 3.992-.656.213-1.293.405-1.889.578C7.697 3.75 8.951.84 11.17.84V.83zm1.235 2.949v.135c-.754.232-1.583.484-2.394.736.466-1.777 1.333-2.645 2.085-2.971.193.501.309 1.176.309 2.1zm.539-2.234c.694.074 1.141.867 1.429 1.755-.349.114-.735.231-1.158.366v-.252c0-.752-.096-1.371-.271-1.871v.002zm2.992 1.289c-.02 0-.06.021-.078.021s-.289.075-.714.21c-.423-1.233-1.176-2.37-2.508-2.37h-.115C12.135.209 11.669 0 11.265 0 8.159 0 6.675 3.877 6.21 5.846c-1.194.365-2.063.636-2.16.674-.675.213-.694.232-.772.87-.075.462-1.83 14.063-1.83 14.063L15.009 24l.927-21.166z\"],\"color\":\"#7AB55C\"},{\"id\":\"brand-ebay\",\"label\":\"eBay\",\"set\":\"brand\",\"paths\":[\"M6.056 12.132v-4.92h1.2v3.026c.59-.703 1.402-.906 2.202-.906 1.34 0 2.828.904 2.828 2.855 0 .233-.015.457-.06.668.24-.953 1.274-1.305 2.896-1.344.51-.018 1.095-.018 1.56-.018v-.135c0-.885-.556-1.244-1.53-1.244-.72 0-1.245.3-1.305.81h-1.275c.136-1.29 1.5-1.62 2.686-1.62 1.064 0 1.995.27 2.415 1.02l-.436-.84h1.41l2.055 4.125 2.055-4.126H24l-3.72 7.305h-1.346l1.07-2.04-2.33-4.38c.13.255.2.555.2.93v2.46c0 .346.01.69.04 1.005H16.8a6.543 6.543 0 01-.046-.765c-.603.734-1.32.96-2.32.96-1.48 0-2.272-.78-2.272-1.695 0-.15.015-.284.037-.405-.3 1.246-1.36 2.086-2.767 2.086-.87 0-1.694-.315-2.2-.93 0 .24-.015.494-.04.734h-1.18c.02-.39.04-.855.04-1.245v-1.05h-4.83c.065 1.095.818 1.74 1.853 1.74.718 0 1.355-.3 1.568-.93h1.24c-.24 1.29-1.61 1.725-2.79 1.725C.95 15.009 0 13.822 0 12.232c0-1.754.982-2.91 3.116-2.91 1.688 0 2.93.886 2.94 2.806v.005zm9.137.183c-1.095.034-1.77.233-1.77.95 0 .465.36.97 1.305.97 1.26 0 1.935-.69 1.935-1.814v-.13c-.45 0-.99.006-1.484.022h.012zm-6.06 1.875c1.11 0 1.876-.806 1.876-2.02s-.768-2.02-1.893-2.02c-1.11 0-1.89.806-1.89 2.02s.765 2.02 1.875 2.02h.03zm-4.35-2.514c-.044-1.125-.854-1.546-1.725-1.546-.944 0-1.694.474-1.815 1.546z\"],\"color\":\"#E53238\"},{\"id\":\"brand-allegro\",\"label\":\"Allegro\",\"set\":\"brand\",\"paths\":[\"M4.59 7.981a.124.124 0 0 0-.122.124v5.917a.124.124 0 0 0 .124.124h.72a.124.124 0 0 0 .124-.124h-.002V8.105a.124.124 0 0 0-.124-.124Zm1.691 0a.124.124 0 0 0-.124.124v5.917a.124.124 0 0 0 .124.124h.72a.124.124 0 0 0 .123-.124V8.105a.124.124 0 0 0-.122-.124Zm12.667 1.776a1.868 1.868 0 0 0-1.317.532 1.674 1.674 0 0 0-.531 1.254v2.48a.124.124 0 0 0 .123.123h.72a.124.124 0 0 0 .124-.124v-2.427c0-.752.5-1.113 1.314-.946a.13.13 0 0 0 .168-.142v-.495c0-.13-.014-.18-.1-.208a2.794 2.794 0 0 0-.501-.047Zm-4.626 0a2.193 2.193 0 0 0-1.732.849 2.355 2.355 0 0 0 0 2.678 2.13 2.131 0 0 0 1.732.849 2.21 2.21 0 0 0 1.234-.372v.53c0 .717-.627.848-1.03.873a4.73 4.73 0 0 1-.826-.045c-.11-.017-.188 0-.188.119v.636a.109.109 0 0 0 .114.103c.933.08 1.56.064 2.032-.206a1.537 1.537 0 0 0 .69-.875 2.928 2.928 0 0 0 .117-.874v-2.077h.002a2.245 2.245 0 0 0-.412-1.34 2.193 2.193 0 0 0-1.733-.848Zm-12.255.002a2.903 2.903 0 0 0-1.465.39.092.092 0 0 0-.045.08l.038.63a.112.112 0 0 0 .185.065c.627-.387 1.38-.459 1.764-.265a.67.67 0 0 1 .335.605v.092H1.832c-.45 0-1.83.167-1.83 1.434v.014a1.229 1.229 0 0 0 .45 1.017 1.768 1.768 0 0 0 1.118.32h2.118a.124.124 0 0 0 .124-.125v-2.51l-.002.004c0-.57-.127-1.004-.402-1.303-.274-.3-.827-.45-1.34-.45zm7.707 0c-1.28 0-1.84.858-2.02 1.585a2.44 2.44 0 0 0-.074.6 2.277 2.277 0 0 0 .412 1.338 2.198 2.198 0 0 0 1.733.85c.691.024 1.153-.093 1.506-.294a.196.196 0 0 0 .084-.212v-.558c0-.114-.069-.167-.167-.098a2.185 2.185 0 0 1-1.393.334 1.14 1.14 0 0 1-1.118-1.016h2.845a.117.117 0 0 0 .117-.116c.05-.778-.175-2.413-1.925-2.413Zm12.08 0a2.193 2.193 0 0 0-1.731.848 2.275 2.275 0 0 0-.412 1.34 2.275 2.275 0 0 0 .412 1.339 2.193 2.193 0 0 0 3.465 0 2.277 2.277 0 0 0 .412-1.34 2.277 2.277 0 0 0-.412-1.339 2.193 2.193 0 0 0-1.733-.848Zm-7.532.833c1.157 0 1.196 1.18 1.196 1.351 0 .171-.039 1.351-1.196 1.351-.517 0-.89-.378-1.047-.849a1.552 1.552 0 0 1 0-1.004c.157-.47.53-.849 1.047-.849zm-4.546.004a.86.86 0 0 1 .91.922H8.754a.968.968 0 0 1 1.024-.922zm12.078 0c.515-.012.89.378 1.048.848a1.553 1.553 0 0 1 0 1.003v.002c-.158.47-.531.837-1.048.848-.518.012-.89-.378-1.047-.848a1.552 1.552 0 0 1 0-1.005c.158-.47.53-.837 1.047-.848zM1.89 12.121h.99v1.246H1.63a.773.773 0 0 1-.444-.156.492.492 0 0 1-.21-.412c0-.226.153-.678.914-.678z\"],\"color\":\"#FF5A00\"},{\"id\":\"brand-vinted\",\"label\":\"Vinted\",\"set\":\"brand\",\"paths\":[\"M19.316 0c-.258 0-.571.217-1.415.953-.3.108-.627.027-1.008.613-2.15 3.09-3.825 14.648-5.255 17.984-.286-1.444-.885-10.837-1.116-13.41-.028-.477.027-1.076.027-1.43 0-2.368-.516-3.567-2.886-3.567-1.198 0-2.382.436-3.008 1.226-.299.408-.409.708-.409 1.443 0 4.915 1.171 12.973 2.478 18.228C7.132 23.688 8.603 24 9.99 24c.654 0 1.307-.081 2.233-.544 3.212-1.567 4.07-5.84 4.9-9.993.15-.749.899-4.37 1.253-6.275.476-2.6 1.02-5.54 1.347-6.617C19.833.245 19.63 0 19.317 0z\"],\"color\":\"#007782\"},{\"id\":\"brand-apple\",\"label\":\"Apple\",\"set\":\"brand\",\"paths\":[\"M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701\"],\"color\":\"#000000\"},{\"id\":\"brand-android\",\"label\":\"Android\",\"set\":\"brand\",\"paths\":[\"M18.4395 5.5586c-.675 1.1664-1.352 2.3318-2.0274 3.498-.0366-.0155-.0742-.0286-.1113-.043-1.8249-.6957-3.484-.8-4.42-.787-1.8551.0185-3.3544.4643-4.2597.8203-.084-.1494-1.7526-3.021-2.0215-3.4864a1.1451 1.1451 0 0 0-.1406-.1914c-.3312-.364-.9054-.4859-1.379-.203-.475.282-.7136.9361-.3886 1.5019 1.9466 3.3696-.0966-.2158 1.9473 3.3593.0172.031-.4946.2642-1.3926 1.0177C2.8987 12.176.452 14.772 0 18.9902h24c-.119-1.1108-.3686-2.099-.7461-3.0683-.7438-1.9118-1.8435-3.2928-2.7402-4.1836a12.1048 12.1048 0 0 0-2.1309-1.6875c.6594-1.122 1.312-2.2559 1.9649-3.3848.2077-.3615.1886-.7956-.0079-1.1191a1.1001 1.1001 0 0 0-.8515-.5332c-.5225-.0536-.9392.3128-1.0488.5449zm-.0391 8.461c.3944.5926.324 1.3306-.1563 1.6503-.4799.3197-1.188.0985-1.582-.4941-.3944-.5927-.324-1.3307.1563-1.6504.4727-.315 1.1812-.1086 1.582.4941zM7.207 13.5273c.4803.3197.5506 1.0577.1563 1.6504-.394.5926-1.1038.8138-1.584.4941-.48-.3197-.5503-1.0577-.1563-1.6504.4008-.6021 1.1087-.8106 1.584-.4941z\"],\"color\":\"#3DDC84\"},{\"id\":\"brand-claude\",\"label\":\"Claude\",\"set\":\"brand\",\"paths\":[\"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z\"],\"color\":\"#D97757\"},{\"id\":\"brand-anthropic\",\"label\":\"Anthropic\",\"set\":\"brand\",\"paths\":[\"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z\"],\"color\":\"#191919\"},{\"id\":\"brand-klarna\",\"label\":\"Klarna\",\"set\":\"brand\",\"paths\":[\"M4.592 2v20H0V2h4.592zm11.46 0c0 4.194-1.583 8.105-4.415 11.068l-.278.283L17.702 22h-5.668l-6.893-9.4 1.779-1.332c2.858-2.14 4.535-5.378 4.637-8.924L11.562 2h4.49zM21.5 17a2.5 2.5 0 110 5 2.5 2.5 0 010-5z\"],\"color\":\"#FFB3C7\"},{\"id\":\"brand-cashapp\",\"label\":\"Cash App\",\"set\":\"brand\",\"paths\":[\"M23.59 3.475a5.1 5.1 0 00-3.05-3.05c-1.31-.42-2.5-.42-4.92-.42H8.36c-2.4 0-3.61 0-4.9.4a5.1 5.1 0 00-3.05 3.06C0 4.765 0 5.965 0 8.365v7.27c0 2.41 0 3.6.4 4.9a5.1 5.1 0 003.05 3.05c1.3.41 2.5.41 4.9.41h7.28c2.41 0 3.61 0 4.9-.4a5.1 5.1 0 003.06-3.06c.41-1.3.41-2.5.41-4.9v-7.25c0-2.41 0-3.61-.41-4.91zm-6.17 4.63l-.93.93a.5.5 0 01-.67.01 5 5 0 00-3.22-1.18c-.97 0-1.94.32-1.94 1.21 0 .9 1.04 1.2 2.24 1.65 2.1.7 3.84 1.58 3.84 3.64 0 2.24-1.74 3.78-4.58 3.95l-.26 1.2a.49.49 0 01-.48.39H9.63l-.09-.01a.5.5 0 01-.38-.59l.28-1.27a6.54 6.54 0 01-2.88-1.57v-.01a.48.48 0 010-.68l1-.97a.49.49 0 01.67 0c.91.86 2.13 1.34 3.39 1.32 1.3 0 2.17-.55 2.17-1.42 0-.87-.88-1.1-2.54-1.72-1.76-.63-3.43-1.52-3.43-3.6 0-2.42 2.01-3.6 4.39-3.71l.25-1.23a.48.48 0 01.48-.38h1.78l.1.01c.26.06.43.31.37.57l-.27 1.37c.9.3 1.75.77 2.48 1.39l.02.02c.19.2.19.5 0 .68z\"],\"color\":\"#00C244\"},{\"id\":\"brand-venmo\",\"label\":\"Venmo\",\"set\":\"brand\",\"paths\":[\"M21.772 13.119c-.267 0-.381-.251-.38-.655 0-.533.121-1.575.712-1.575.267 0 .357.243.357.598 0 .533-.13 1.632-.689 1.632Zm.502-3.377c-1.677 0-2.405 1.285-2.405 2.658 0 1.042.421 1.874 1.693 1.874 1.717 0 2.438-1.406 2.438-2.763 0-1.025-.462-1.769-1.726-1.769Zm-3.833 0c-.558 0-.964.17-1.393.477-.154-.275-.462-.477-.932-.477-.542 0-.947.219-1.247.437l-.04-.364H13.54l-.688 4.354h1.506l.479-3.053c.129-.065.323-.154.518-.154.145 0 .267.049.267.267 0 .056-.016.145-.024.218l-.429 2.722h1.498l.478-3.053c.138-.073.324-.154.51-.154.146 0 .268.049.268.267 0 .056-.017.145-.025.218l-.429 2.722h1.499l.461-2.908c.025-.153.049-.388.049-.549 0-.582-.267-.97-1.037-.97Zm-6.871 0c-.575 0-.98.219-1.287.421l-.017-.348H8.962l-.689 4.354H9.78l.478-3.053c.13-.065.324-.154.518-.154.147 0 .268.049.268.242 0 .081-.024.227-.032.299l-.422 2.666h1.499l.462-2.908c.024-.153.049-.388.049-.549 0-.582-.268-.97-1.03-.97Zm-5.631 1.834c.041-.485.413-.824.697-.824.162 0 .299.097.299.291 0 .404-.713.533-.996.533Zm.843-1.834c-1.604 0-2.382 1.39-2.382 2.698 0 1.01.478 1.817 1.814 1.817.527 0 1.07-.113 1.418-.282l.186-1.26c-.494.25-.874.347-1.271.347-.365 0-.64-.194-.64-.687.826-.008 2.252-.347 2.252-1.453 0-.687-.494-1.18-1.377-1.18Zm-4.239.267c.089.186.146.412.146.743 0 .606-.429 1.494-.777 2.06l-.373-2.989L0 9.969l.705 4.2h1.757c.77-1.01 1.718-2.448 1.718-3.554 0-.347-.073-.622-.235-.889l-1.402.283Z\"],\"color\":\"#008CFF\"},{\"id\":\"brand-alipay\",\"label\":\"Alipay\",\"set\":\"brand\",\"paths\":[\"M19.695 15.07c3.426 1.158 4.203 1.22 4.203 1.22V3.846c0-2.124-1.705-3.845-3.81-3.845H3.914C1.808.001.102 1.722.102 3.846v16.31c0 2.123 1.706 3.845 3.813 3.845h16.173c2.105 0 3.81-1.722 3.81-3.845v-.157s-6.19-2.602-9.315-4.119c-2.096 2.602-4.8 4.181-7.607 4.181-4.75 0-6.361-4.19-4.112-6.949.49-.602 1.324-1.175 2.617-1.497 2.025-.502 5.247.313 8.266 1.317a16.796 16.796 0 0 0 1.341-3.302H5.781v-.952h4.799V6.975H4.77v-.953h5.81V3.591s0-.409.411-.409h2.347v2.84h5.744v.951h-5.744v1.704h4.69a19.453 19.453 0 0 1-1.986 5.06c1.424.52 2.702 1.011 3.654 1.333m-13.81-2.032c-.596.06-1.71.325-2.321.869-1.83 1.608-.735 4.55 2.968 4.55 2.151 0 4.301-1.388 5.99-3.61-2.403-1.182-4.438-2.028-6.637-1.809\"],\"color\":\"#1677FF\"},{\"id\":\"brand-wechat\",\"label\":\"WeChat\",\"set\":\"brand\",\"paths\":[\"M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.12 2.361-.336a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z\"],\"color\":\"#07C160\"},{\"id\":\"brand-americanexpress\",\"label\":\"American Express\",\"set\":\"brand\",\"paths\":[\"M16.015 14.378c0-.32-.135-.496-.344-.622-.21-.12-.464-.135-.81-.135h-1.543v2.82h.675v-1.027h.72c.24 0 .39.024.478.125.12.13.104.38.104.55v.35h.66v-.555c-.002-.25-.017-.376-.108-.516-.06-.08-.18-.18-.33-.234l.02-.008c.18-.072.48-.297.48-.747zm-.87.407l-.028-.002c-.09.053-.195.058-.33.058h-.81v-.63h.824c.12 0 .24 0 .33.05.098.048.156.147.15.255 0 .12-.045.215-.134.27zM20.297 15.837H19v.6h1.304c.676 0 1.05-.278 1.05-.884 0-.28-.066-.448-.187-.582-.153-.133-.392-.193-.73-.207l-.376-.015c-.104 0-.18 0-.255-.03-.09-.03-.15-.105-.15-.21 0-.09.017-.166.09-.21.083-.046.177-.066.272-.06h1.23v-.602h-1.35c-.704 0-.958.437-.958.84 0 .9.776.855 1.407.87.104 0 .18.015.225.06.046.03.082.106.082.18 0 .077-.035.15-.08.18-.06.053-.15.07-.277.07zM0 0v10.096L.81 8.22h1.75l.225.464V8.22h2.043l.45 1.02.437-1.013h6.502c.295 0 .56.057.756.236v-.23h1.787v.23c.307-.17.686-.23 1.12-.23h2.606l.24.466v-.466h1.918l.254.465v-.466h1.858v3.948H20.87l-.36-.6v.585h-2.353l-.256-.63h-.583l-.27.614h-1.213c-.48 0-.84-.104-1.08-.24v.24h-2.89v-.884c0-.12-.03-.12-.105-.135h-.105v1.036H6.067v-.48l-.21.48H4.69l-.202-.48v.465H2.235l-.256-.624H1.4l-.256.624H0V24h23.786v-7.108c-.27.135-.613.18-.973.18H21.09v-.255c-.21.165-.57.255-.914.255H14.71v-.9c0-.12-.018-.12-.12-.12h-.075v1.022h-1.8v-1.066c-.298.136-.643.15-.928.136h-.214v.915h-2.18l-.54-.617-.57.6H4.742v-3.93h3.61l.518.602.554-.6h2.412c.28 0 .74.03.942.225v-.24h2.177c.202 0 .644.045.903.225v-.24h3.265v.24c.163-.164.508-.24.803-.24h1.89v.24c.194-.15.464-.24.84-.24h1.176V0H0zM21.156 14.955c.004.005.006.012.01.016.01.01.024.01.032.02l-.042-.035zM23.828 13.082h.065v.555h-.065zM23.865 15.03v-.005c-.03-.025-.046-.048-.075-.07-.15-.153-.39-.215-.764-.225l-.36-.012c-.12 0-.194-.007-.27-.03-.09-.03-.15-.105-.15-.21 0-.09.03-.16.09-.204.076-.045.15-.05.27-.05h1.223v-.588h-1.283c-.69 0-.96.437-.96.84 0 .9.78.855 1.41.87.104 0 .18.015.224.06.046.03.076.106.076.18 0 .07-.034.138-.09.18-.045.056-.136.07-.27.07h-1.288v.605h1.287c.42 0 .734-.118.9-.36h.03c.09-.134.135-.3.135-.523 0-.24-.045-.39-.135-.526zM18.597 14.208v-.583h-2.235V16.458h2.235v-.585h-1.57v-.57h1.533v-.584h-1.532v-.51M13.51 8.787h.685V11.6h-.684zM13.126 9.543l-.007.006c0-.314-.13-.5-.34-.624-.217-.125-.47-.135-.81-.135H10.43v2.82h.674v-1.034h.72c.24 0 .39.03.487.12.122.136.107.378.107.548v.354h.677v-.553c0-.25-.016-.375-.11-.516-.09-.107-.202-.19-.33-.237.172-.07.472-.3.472-.75zm-.855.396h-.015c-.09.054-.195.056-.33.056H11.1v-.623h.825c.12 0 .24.004.33.05.09.04.15.128.15.25s-.047.22-.134.266zM15.92 9.373h.632v-.6h-.644c-.464 0-.804.105-1.02.33-.286.3-.362.69-.362 1.11 0 .512.123.833.36 1.074.232.238.645.31.97.31h.78l.255-.627h1.39l.262.627h1.36v-2.11l1.272 2.11h.95l.002.002V8.786h-.684v1.963l-1.18-1.96h-1.02V11.4L18.11 8.744h-1.004l-.943 2.22h-.3c-.177 0-.362-.03-.468-.134-.125-.15-.186-.36-.186-.662 0-.285.08-.51.194-.63.133-.135.272-.165.516-.165zm1.668-.108l.464 1.118v.002h-.93l.466-1.12zM2.38 10.97l.254.628H4V9.393l.972 2.205h.584l.973-2.202.015 2.202h.69v-2.81H6.118l-.807 1.904-.876-1.905H3.343v2.663L2.205 8.787h-.997L.01 11.597h.72l.26-.626h1.39zm-.688-1.705l.46 1.118-.003.002h-.915l.457-1.12zM11.856 13.62H9.714l-.85.923-.825-.922H5.346v2.82H8l.855-.932.824.93h1.302v-.94h.838c.6 0 1.17-.164 1.17-.945l-.006-.003c0-.78-.598-.93-1.128-.93zM7.67 15.853l-.014-.002H6.02v-.557h1.47v-.574H6.02v-.51H7.7l.733.82-.764.824zm2.642.33l-1.03-1.147 1.03-1.108v2.253zm1.553-1.258h-.885v-.717h.885c.24 0 .42.098.42.344 0 .243-.15.372-.42.372zM9.967 9.373v-.586H7.73V11.6h2.237v-.58H8.4v-.564h1.527V9.88H8.4v-.507\"],\"color\":\"#2E77BC\"},{\"id\":\"brand-discover\",\"label\":\"Discover\",\"set\":\"brand\",\"paths\":[\"M14.58 12a2.023 2.023 0 1 1-2.025-2.023h.002c1.118 0 2.023.906 2.023 2.023zm-5.2-2.001c-1.124 0-2.025.884-2.025 1.99 0 1.118.878 1.984 2.007 1.984.319 0 .593-.063.93-.221v-.873c-.296.297-.559.416-.895.416-.747 0-1.277-.542-1.277-1.312 0-.73.547-1.306 1.243-1.306.354 0 .622.126.93.428v-.873a1.898 1.898 0 0 0-.913-.233zm-3.352 1.545c-.445-.165-.576-.273-.576-.479 0-.239.233-.422.553-.422.222 0 .405.091.598.308l.388-.508a1.665 1.665 0 0 0-1.117-.422c-.673 0-1.186.467-1.186 1.089 0 .524.239.792.936 1.043.291.103.438.171.513.217a.456.456 0 0 1 .222.394c0 .308-.245.536-.576.536-.354 0-.639-.177-.809-.507l-.479.461c.342.502.752.724 1.317.724.771 0 1.311-.513 1.311-1.249-.002-.603-.252-.876-1.095-1.185zM24 10.3a.29.29 0 0 1-.288.291.29.29 0 0 1-.291-.291v-.003A.29.29 0 1 1 24 10.3zm-.059.001a.235.235 0 0 0-.231-.239.234.234 0 0 0-.232.239c0 .132.104.239.232.239a.235.235 0 0 0 .231-.239zM3.472 13.887h.742v-3.803h-.742v3.803zm12.702-1.248l-1.014-2.554h-.81l1.614 3.9h.399l1.643-3.9h-.804l-1.028 2.554zm2.166 1.248h2.104v-.644h-1.362v-1.027h1.312v-.644h-1.312v-.844h1.362v-.644H18.34v3.803zm5.409-3.557l.11.138h-.097l-.094-.13v.13h-.08v-.334h.107c.081 0 .126.036.126.103.001.046-.025.08-.072.093zm-.006-.092c0-.029-.021-.043-.06-.043h-.014v.087h.014c.039 0 .06-.014.06-.044zm-1.228 2.047l1.197 1.602H22.8l-1.027-1.528h-.097v1.528h-.741v-3.803h1.1c.855 0 1.346.411 1.346 1.123 0 .583-.308.965-.866 1.078zm.103-1.038c0-.37-.251-.563-.713-.563h-.228v1.152h.217c.473-.001.724-.207.724-.589zm-19.487.742a1.91 1.91 0 0 1-.69 1.46c-.365.303-.781.439-1.357.439H.001v-3.803H1.09c1.202 0 2.041.781 2.041 1.904zm-.764-.006c0-.364-.154-.718-.411-.947-.245-.222-.536-.308-1.015-.308H.742v2.515h.199c.479 0 .782-.092 1.015-.302.256-.228.411-.593.411-.958z\"],\"color\":\"#FF6000\"},{\"id\":\"brand-sepa\",\"label\":\"SEPA\",\"set\":\"brand\",\"paths\":[\"M12.553 8.72v6.56h1.766v-1.694h1.052l.293-.01c.579-.009.907-.02.984-.033.656-.086 1.09-.418 1.3-.994.106-.29.16-.769.16-1.434 0-.553-.049-.968-.145-1.243-.185-.524-.548-.871-1.09-1.04-.236-.074-.58-.111-1.031-.111zm6.79 0l-1.971 6.56h1.826l.317-1.134h2.36l.337 1.133H24l-1.995-6.558zm-9.339.031a3.36 3.36 0 0 0-1.888.574 3.272 3.272 0 0 0-1.199 1.455h-.742l-.464.996h.969a3.17 3.17 0 0 0 .004.526h-.467l-.465.995H6.94a3.333 3.333 0 0 0 3.064 1.973 3.37 3.37 0 0 0 1.876-.564l.013-.009v-1.241l-.05.056a2.293 2.293 0 0 1-3.618-.215h2.396l.465-.995H7.838a2.356 2.356 0 0 1-.012-.526h3.505l.008-.017.438-.939.019-.04H8.154a2.308 2.308 0 0 1 1.963-1.108c.694 0 1.344.31 1.783.85l.028.035.409-.875-.015-.014a3.359 3.359 0 0 0-2.318-.917zm-7.2.004c-.439 0-.837.016-1.196.048-.43.034-.785.15-1.062.348a1.082 1.082 0 0 0-.41.565c-.086.248-.128.578-.128.99 0 .54.079.943.236 1.21.179.314.537.52 1.074.621.205.035.57.071 1.094.109.654.044 1.02.078 1.098.103.211.063.316.239.316.528a1.1 1.1 0 0 1-.037.315.48.48 0 0 1-.298.287c-.084.032-.281.048-.589.048h-.604a.963.963 0 0 1-.41-.09c-.164-.081-.246-.264-.246-.549v-.136H0c0 .533.04.915.118 1.143.142.412.435.685.879.82.362.11 1.003.164 1.922.164.551 0 .96-.025 1.228-.075.64-.12 1.05-.404 1.233-.853.101-.245.151-.632.151-1.16 0-.23-.01-.435-.033-.617a1.186 1.186 0 0 0-.355-.74c-.252-.242-.66-.392-1.22-.448-.177-.019-.62-.052-1.33-.1l-.331-.023a.768.768 0 0 1-.35-.094c-.124-.075-.185-.233-.185-.471 0-.264.07-.435.208-.514.139-.079.423-.118.852-.118.441 0 .71.068.808.205.063.092.095.272.095.542h1.642c.01-.145.016-.253.016-.326 0-.884-.357-1.421-1.072-1.613-.293-.079-.784-.119-1.473-.119zm17.894 1.27l.827 2.843h-1.63zm-6.38.13h1.116c.18 0 .294.004.342.01.24.042.393.157.456.345.045.134.067.34.067.617a2.9 2.9 0 0 1-.033.512c-.035.172-.105.287-.21.344-.076.042-.288.069-.637.082h-1.1Z\"],\"color\":\"#2350A9\"},{\"id\":\"brand-westernunion\",\"label\":\"Western Union\",\"set\":\"brand\",\"paths\":[\"M15.799 5.188h5.916L24 9.155l-4.643 8.043c-1.246 2.153-3.28 2.153-4.526 0L7.893 5.188h5.919l4.273 7.39a1.127 1.127 0 0 0 1.981.002l-4.267-7.392ZM0 5.188h5.921l6.237 10.802-.697 1.204c-1.246 2.153-3.285 2.153-4.531 0L0 5.188Z\"],\"color\":\"#FFDD00\"},{\"id\":\"brand-mercadopago\",\"label\":\"Mercado Pago\",\"set\":\"brand\",\"paths\":[\"M11.115 16.479a.93.927 0 0 1-.939-.886c-.002-.042-.006-.155-.103-.155-.04 0-.074.023-.113.059-.112.103-.254.206-.46.206a.816.814 0 0 1-.305-.066c-.535-.214-.542-.578-.521-.725.006-.038.007-.08-.02-.11l-.032-.03h-.034c-.027 0-.055.012-.093.039a.788.786 0 0 1-.454.16.7.699 0 0 1-.253-.05c-.708-.27-.65-.928-.617-1.126.005-.041-.005-.072-.03-.092l-.05-.04-.047.043a.728.726 0 0 1-.505.203.73.728 0 0 1-.732-.725c0-.4.328-.722.732-.722.364 0 .675.27.721.63l.026.195.11-.165c.01-.018.307-.46.852-.46.102 0 .21.016.316.05.434.13.508.52.519.68.008.094.075.1.09.1.037 0 .064-.024.083-.045a.746.744 0 0 1 .54-.225c.128 0 .263.03.402.09.69.293.379 1.158.374 1.167-.058.144-.061.207-.005.244l.027.013h.02c.03 0 .07-.014.134-.035.093-.032.235-.08.367-.08a.944.942 0 0 1 .94.93.936.934 0 0 1-.94.928zm7.302-4.171c-1.138-.98-3.768-3.24-4.481-3.77-.406-.302-.685-.462-.928-.533a1.559 1.554 0 0 0-.456-.07c-.182 0-.376.032-.58.095-.46.145-.918.505-1.362.854l-.023.018c-.414.324-.84.66-1.164.73a1.986 1.98 0 0 1-.43.049c-.362 0-.687-.104-.81-.258-.02-.025-.007-.066.04-.125l.008-.008 1-1.067c.783-.774 1.525-1.506 3.23-1.545h.085c1.062 0 2.12.469 2.24.524a7.03 7.03 0 0 0 3.056.724c1.076 0 2.188-.263 3.354-.795a9.135 9.11 0 0 0-.405-.317c-1.025.44-2.003.66-2.946.66-.962 0-1.925-.229-2.858-.68-.05-.022-1.22-.567-2.44-.57-.032 0-.065 0-.096.002-1.434.033-2.24.536-2.782.976-.528.013-.982.138-1.388.25-.361.1-.673.186-.979.185-.125 0-.35-.01-.37-.012-.35-.01-2.115-.437-3.518-.962-.143.1-.28.203-.415.31 1.466.593 3.25 1.053 3.812 1.089.157.01.323.027.491.027.372 0 .744-.103 1.104-.203.213-.059.446-.123.692-.17l-.196.194-1.017 1.087c-.08.08-.254.294-.14.557a.705.703 0 0 0 .268.292c.243.162.677.27 1.08.271.152 0 .297-.015.43-.044.427-.095.874-.448 1.349-.82.377-.296.913-.672 1.323-.782a1.494 1.49 0 0 1 .37-.05.611.61 0 0 1 .095.005c.27.034.533.125 1.003.472.835.62 4.531 3.815 4.566 3.846.002.002.238.203.22.537-.007.186-.11.352-.294.466a.902.9 0 0 1-.484.15.804.802 0 0 1-.428-.124c-.014-.01-1.28-1.157-1.746-1.543-.074-.06-.146-.115-.22-.115a.122.122 0 0 0-.096.045c-.073.09.01.212.105.294l1.48 1.47c.002 0 .184.17.204.395.012.244-.106.447-.35.606a.957.955 0 0 1-.526.171.766.764 0 0 1-.42-.127l-.214-.206a21.035 20.978 0 0 0-1.08-1.009c-.072-.058-.148-.112-.221-.112a.127.127 0 0 0-.094.038c-.033.037-.056.103.028.212a.698.696 0 0 0 .075.083l1.078 1.198c.01.01.222.26.024.511l-.038.048a1.18 1.178 0 0 1-.1.096c-.184.15-.43.164-.527.164a.8.798 0 0 1-.147-.012c-.106-.018-.178-.048-.212-.089l-.013-.013c-.06-.06-.602-.609-1.054-.98-.059-.05-.133-.11-.21-.11a.128.128 0 0 0-.096.042c-.09.096.044.24.1.293l.92 1.003a.204.204 0 0 1-.033.062c-.033.044-.144.155-.479.196a.91.907 0 0 1-.122.007c-.345 0-.712-.164-.902-.264a1.343 1.34 0 0 0 .13-.576 1.368 1.365 0 0 0-1.42-1.357c.024-.342-.025-.99-.697-1.274a1.455 1.452 0 0 0-.575-.125c-.146 0-.287.025-.42.075a1.153 1.15 0 0 0-.671-.564 1.52 1.515 0 0 0-.494-.085c-.28 0-.537.08-.767.242a1.168 1.165 0 0 0-.903-.43 1.173 1.17 0 0 0-.82.335c-.287-.217-1.425-.93-4.467-1.613a17.39 17.344 0 0 1-.692-.189 4.822 4.82 0 0 0-.077.494l.67.157c3.108.682 4.136 1.391 4.309 1.525a1.145 1.142 0 0 0-.09.442 1.16 1.158 0 0 0 1.378 1.132c.096.467.406.821.879 1.003a1.165 1.162 0 0 0 .415.08c.09 0 .179-.012.266-.034.086.22.282.493.722.668a1.233 1.23 0 0 0 .457.094c.122 0 .241-.022.355-.063a1.373 1.37 0 0 0 1.269.841c.37.002.726-.147.985-.41.221.121.688.341 1.163.341.06 0 .118-.002.175-.01.47-.059.689-.24.789-.382a.571.57 0 0 0 .048-.078c.11.032.234.058.373.058.255 0 .501-.086.75-.265.244-.174.418-.424.444-.637v-.01c.083.017.167.026.251.026.265 0 .527-.082.773-.242.48-.31.562-.715.554-.98a1.28 1.279 0 0 0 .978-.194 1.04 1.04 0 0 0 .502-.808 1.088 1.085 0 0 0-.16-.653c.804-.342 2.636-1.003 4.795-1.483a4.734 4.721 0 0 0-.067-.492 27.742 27.667 0 0 0-5.049 1.62zm5.123-.763c0 4.027-5.166 7.293-11.537 7.293-6.372 0-11.538-3.266-11.538-7.293 0-4.028 5.165-7.293 11.539-7.293 6.371 0 11.537 3.265 11.537 7.293zm.46.004c0-4.272-5.374-7.755-12-7.755S.002 7.277.002 11.55L0 12.004c0 4.533 4.695 8.203 11.999 8.203 7.347 0 12-3.67 12-8.204z\"],\"color\":\"#00B1EA\"},{\"id\":\"brand-coinbase\",\"label\":\"Coinbase\",\"set\":\"crypto\",\"paths\":[\"M4.844 11.053c-.872 0-1.553.662-1.553 1.548s.664 1.542 1.553 1.542c.889 0 1.564-.667 1.564-1.547 0-.875-.664-1.543-1.564-1.543zm.006 2.452c-.497 0-.86-.386-.86-.904 0-.523.357-.909.854-.909.502 0 .866.392.866.91 0 .517-.364.903-.86.903zm1.749-1.778h.433v2.36h.693V11.11H6.599zm-5.052-.035c.364 0 .653.224.762.558h.734c-.133-.713-.722-1.197-1.49-1.197-.872 0-1.553.662-1.553 1.548 0 .887.664 1.543 1.553 1.543.75 0 1.351-.484 1.484-1.203h-.728a.78.78 0 01-.756.564c-.502 0-.855-.386-.855-.904 0-.523.347-.909.85-.909zm18.215.622l-.508-.075c-.242-.035-.415-.115-.415-.305 0-.207.225-.31.53-.31.336 0 .55.143.595.379h.67c-.075-.599-.537-.95-1.247-.95-.733 0-1.218.375-1.218.904 0 .506.317.8.958.892l.508.075c.249.034.387.132.387.316 0 .236-.242.334-.577.334-.41 0-.641-.167-.676-.42h-.681c.064.581.52.99 1.35.99.757 0 1.26-.346 1.26-.938 0-.53-.364-.806-.936-.892zM7.378 9.885a.429.429 0 00-.444.437c0 .254.19.438.444.438a.429.429 0 00.445-.438.429.429 0 00-.445-.437zm10.167 2.245c0-.645-.392-1.076-1.224-1.076-.785 0-1.224.397-1.31 1.007h.687c.035-.236.22-.432.612-.432.352 0 .525.155.525.345 0 .248-.317.311-.71.351-.531.058-1.19.242-1.19.933 0 .535.4.88 1.034.88.497 0 .809-.207.965-.535.023.293.242.483.548.483h.404v-.616h-.34v-1.34zm-.68.748c0 .397-.347.69-.769.69-.26 0-.48-.11-.48-.34 0-.293.353-.373.676-.408.312-.028.485-.097.572-.23zm-3.679-1.825c-.386 0-.71.162-.94.432V9.856h-.693v4.23h.68v-.391c.232.282.56.449.953.449.832 0 1.461-.656 1.461-1.543 0-.886-.64-1.548-1.46-1.548zm-.103 2.452c-.497 0-.86-.386-.86-.904 0-.517.369-.909.865-.909.503 0 .855.386.855.91 0 .517-.364.903-.86.903zm-3.187-2.452c-.45 0-.745.184-.919.443v-.385H8.29v2.975h.693v-1.617c0-.455.289-.777.716-.777.398 0 .647.282.647.69v1.704h.692v-1.755c0-.748-.386-1.278-1.142-1.278zM24 12.503c0-.851-.624-1.45-1.46-1.45-.89 0-1.542.668-1.542 1.548 0 .927.698 1.543 1.553 1.543.722 0 1.287-.426 1.432-1.03h-.722c-.104.264-.358.414-.699.414-.445 0-.78-.276-.854-.76H24v-.264zm-2.252-.23c.11-.414.422-.615.78-.615.392 0 .693.224.762.615Z\"],\"color\":\"#0052FF\"},{\"id\":\"brand-okx\",\"label\":\"OKX\",\"set\":\"crypto\",\"paths\":[\"M 7.15 8.685 C 7.18 8.705 7.2 8.745 7.2 8.785 L 7.2 15.225 C 7.2 15.265 7.18 15.305 7.15 15.325 C 7.121 15.355 7.082 15.372 7.04 15.375 L 0.16 15.375 C 0.118 15.372 0.079 15.355 0.05 15.325 C 0.02 15.3 0.002 15.264 0 15.225 L 0 8.785 C 0 8.745 0.02 8.705 0.05 8.685 C 0.079 8.655 0.118 8.638 0.16 8.635 L 7.04 8.635 C 7.08 8.635 7.12 8.655 7.15 8.685 Z M 4.8 11.035 C 4.798 10.996 4.78 10.96 4.75 10.935 C 4.721 10.905 4.682 10.887 4.64 10.885 L 2.56 10.885 C 2.52 10.885 2.481 10.899 2.45 10.925 C 2.42 10.95 2.402 10.986 2.4 11.025 L 2.4 12.975 C 2.4 13.015 2.42 13.055 2.45 13.075 C 2.48 13.115 2.52 13.125 2.56 13.125 L 4.64 13.125 C 4.68 13.125 4.72 13.115 4.75 13.085 C 4.78 13.06 4.798 13.024 4.8 12.985 L 4.8 11.035 Z M 21.6 11.035 L 21.6 12.975 C 21.6 13.065 21.53 13.125 21.44 13.125 L 19.36 13.125 C 19.27 13.125 19.2 13.065 19.2 12.975 L 19.2 11.035 C 19.2 10.955 19.27 10.885 19.36 10.885 L 21.44 10.885 C 21.53 10.885 21.6 10.945 21.6 11.035 Z M 19.2 8.785 L 19.2 10.735 C 19.2 10.815 19.13 10.885 19.04 10.885 L 16.96 10.885 C 16.87 10.885 16.8 10.815 16.8 10.735 L 16.8 8.785 C 16.8 8.705 16.87 8.635 16.96 8.635 L 19.04 8.635 C 19.13 8.635 19.2 8.705 19.2 8.785 Z M 24 8.785 L 24 10.735 C 24 10.815 23.93 10.885 23.84 10.885 L 21.76 10.885 C 21.67 10.885 21.6 10.815 21.6 10.735 L 21.6 8.785 C 21.6 8.705 21.67 8.635 21.76 8.635 L 23.84 8.635 C 23.93 8.635 24 8.705 24 8.785 Z M 19.2 13.285 L 19.2 15.225 C 19.2 15.305 19.13 15.375 19.04 15.375 L 16.96 15.375 C 16.87 15.375 16.8 15.305 16.8 15.225 L 16.8 13.275 C 16.8 13.195 16.87 13.125 16.96 13.125 L 19.04 13.125 C 19.13 13.125 19.2 13.195 19.2 13.275 L 19.2 13.285 Z M 24 13.285 L 24 15.225 C 24 15.305 23.93 15.375 23.84 15.375 L 21.76 15.375 C 21.67 15.375 21.6 15.305 21.6 15.225 L 21.6 13.275 C 21.6 13.195 21.67 13.125 21.76 13.125 L 23.84 13.125 C 23.93 13.125 24 13.195 24 13.275 L 24 13.285 Z M 15.6 8.785 L 15.6 10.735 C 15.6 10.815 15.53 10.885 15.44 10.885 L 13.36 10.885 C 13.27 10.885 13.2 10.815 13.2 10.735 L 13.2 8.785 C 13.2 8.705 13.27 8.635 13.36 8.635 L 15.44 8.635 C 15.53 8.635 15.6 8.705 15.6 8.785 Z M 15.6 13.285 L 15.6 15.225 C 15.6 15.305 15.53 15.375 15.44 15.375 L 13.36 15.375 C 13.27 15.375 13.2 15.305 13.2 15.225 L 13.2 13.275 C 13.2 13.195 13.27 13.125 13.36 13.125 L 15.44 13.125 C 15.53 13.125 15.6 13.195 15.6 13.275 L 15.6 13.285 Z M 13.2 12.985 C 13.195 13.069 13.125 13.135 13.04 13.135 L 10.8 13.135 L 10.8 15.215 C 10.8 15.255 10.78 15.295 10.75 15.325 C 10.719 15.351 10.68 15.365 10.64 15.365 L 8.56 15.365 C 8.516 15.368 8.473 15.353 8.44 15.325 C 8.414 15.298 8.399 15.262 8.4 15.225 L 8.4 8.775 C 8.4 8.735 8.41 8.695 8.44 8.675 C 8.472 8.643 8.515 8.625 8.56 8.625 L 10.64 8.625 C 10.68 8.625 10.72 8.645 10.75 8.675 C 10.78 8.695 10.8 8.735 10.8 8.775 L 10.8 10.875 L 13.04 10.875 C 13.08 10.875 13.12 10.885 13.15 10.915 C 13.18 10.945 13.2 10.985 13.2 11.015 L 13.2 12.965 L 13.2 12.985 Z\"],\"color\":\"#000000\"},{\"id\":\"brand-kucoin\",\"label\":\"KuCoin\",\"set\":\"crypto\",\"paths\":[\"m7.928 11.996 7.122 7.122 4.49-4.49a2.004 2.004 0 0 1 2.865 0 2.004 2.004 0 0 1 0 2.865l-5.918 5.918a2.058 2.058 0 0 1-2.883 0l-8.541-8.542v5.07a2.034 2.034 0 1 1-4.07 0V4.043a2.034 2.034 0 1 1 4.07 0v5.088L13.604.589a2.058 2.058 0 0 1 2.883 0l5.918 5.918c.785.803.785 2.088 0 2.865-.804.785-2.089.785-2.865 0l-4.49-4.49zM15.05 9.96a2.038 2.038 0 0 0-2.053 2.035c0 1.133.902 2.052 2.035 2.052a2.038 2.038 0 0 0 2.053-2.035v-.018a2.07 2.07 0 0 0-2.035-2.034z\"],\"color\":\"#01BC8D\"},{\"id\":\"brand-ton\",\"label\":\"TON\",\"set\":\"crypto\",\"paths\":[\"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zM7.902 6.697h8.196c1.505 0 2.462 1.628 1.705 2.94l-5.059 8.765a.86.86 0 0 1-1.488 0L6.199 9.637c-.758-1.314.197-2.94 1.703-2.94zm4.844 1.496v7.58l1.102-2.128 2.656-4.756a.465.465 0 0 0-.408-.696h-3.35zM7.9 8.195a.464.464 0 0 0-.408.694l2.658 4.754 1.102 2.13V8.195H7.9z\"],\"color\":\"#0098EA\"},{\"id\":\"brand-n26\",\"label\":\"N26\",\"set\":\"brand\",\"paths\":[\"M0 3.803v1.195h7.436V3.803H0zM12.69 7.29c-2.034 0-3.038 1.252-3.038 2.684 0 .234.027.468.092.728l1.393.135a3.697 3.697 0 0 1-.09-.793c0-1.072.71-1.586 1.598-1.586.866 0 1.507.485 1.507 1.652 0 1.186-.58 1.995-1.464 2.88-.925.923-2.4 2.027-3.112 2.534v1.092h6.135v-1.195h-4.168c.695-.48 1.69-1.279 2.133-1.72.502-.503 1.931-1.794 1.931-3.636 0-1.903-1.24-2.775-2.918-2.775zm8.34 0c-1.976 0-3.454 1.517-3.454 4.916 0 3.017 1.233 4.508 3.356 4.508 1.754 0 3.068-1.198 3.068-3.172 0-1.542-.823-3.066-2.793-3.066-1.1 0-1.884.51-2.281 1.263 0-1.78.62-3.33 2.094-3.33.937 0 1.309.538 1.507 1.422l1.366-.271c-.321-1.527-1.292-2.27-2.864-2.27zM.075 7.389v9.228h1.33v-6.312c0-.56-.013-.898-.039-1.223h.026c.136.372.298.699.539 1.123l3.732 6.412h1.69V7.39H6.04v6.31c0 .56.013.898.04 1.223h-.028a7.252 7.252 0 0 0-.537-1.123L1.783 7.389H.076zm20.817 4.185c1.114 0 1.744.822 1.744 1.992 0 1.256-.717 2.034-1.701 2.034-1.09 0-1.843-1.001-1.973-2.329.33-1.133 1.063-1.697 1.93-1.697zM0 19.008v1.19h7.436v-1.19H0z\"],\"color\":\"#48AC98\"},{\"id\":\"brand-monzo\",\"label\":\"Monzo\",\"set\":\"brand\",\"paths\":[\"M4.244 1.174a.443.443 0 00-.271.13l-3.97 3.97-.001.001c3.884 3.882 8.093 8.092 11.748 11.748v-8.57L4.602 1.305a.443.443 0 00-.358-.131zm15.483 0a.443.443 0 00-.329.13L12.25 8.456v8.568L24 5.275c-1.316-1.322-2.647-2.648-3.97-3.97a.443.443 0 00-.301-.131zM0 5.979l.002 10.955c0 .294.118.577.326.785l4.973 4.976c.28.282.76.083.758-.314V12.037zm23.998.003l-6.06 6.061v10.338c-.004.399.48.6.76.314l4.974-4.976c.208-.208.326-.49.326-.785z\"],\"color\":\"#14233C\"},{\"id\":\"brand-g2a\",\"label\":\"G2A\",\"set\":\"brand\",\"paths\":[\"M24 15.419s-1.8844-3.5895-3.1571-6.0153a1.6802 1.6802 0 0 0-.4674-.5659 1.3021 1.3021 0 0 0-.7927-.2572 1.239 1.239 0 0 0-.7715.2572 1.6802 1.6802 0 0 0-.4674.5659c-1.2726 2.4258-3.1783 6.0153-3.1783 6.0153l1.7391.0004 2.6781-5.1339 1.2586 2.4128h-1.9378l.6832 1.3053h1.9356l.7386 1.4154H24zM3.4872 13.9588c-1.071 0-1.9392-.8682-1.9392-1.9392s.8682-1.9392 1.9392-1.9392l3.9342-.0031V8.6212H3.3946C1.5174 8.6236-.0024 10.1473 0 12.0244c.0024 1.8738 1.5208 3.3922 3.3946 3.3946h4.0268v-4.1277H3.053v1.4571l2.8447-.0001v1.2141l-2.4105-.0036zm7.2305-1.2109 3.0641-.0002c1.1395 0 2.0633-.9238 2.0633-2.0633s-.9238-2.0633-2.0633-2.0633h-3.6463c-.804-.0002-1.4559.6515-1.4561 1.4555v.0006l4.9963-.0001a.6157.6157 0 0 1 .6201.591.6064.6064 0 0 1-.5894.6229l-.0159.0002h-3.185c-1.0725.0004-1.9417.8701-1.9413 1.9426v2.185h5.4523l.7727-1.4566h-4.7014v-.5841a.63.63 0 0 1 .6299-.6302z\"],\"color\":\"#F05F00\"},{\"id\":\"brand-aliexpress\",\"label\":\"AliExpress\",\"set\":\"brand\",\"paths\":[\"M5.166 9.096a.022.022 0 0 0-.022.021c0 .396-.32.717-.713.717a.021.021 0 0 0-.021.022c0 .012.01.021.021.021.394 0 .713.322.713.718 0 .012.01.021.022.021.011 0 .021-.01.021-.021A.717.717 0 0 1 5.9 9.88a.021.021 0 0 0 0-.043.716.716 0 0 1-.713-.718v-.002a.021.021 0 0 0-.006-.015.022.022 0 0 0-.015-.006zm-3.693.526L0 13.462h.48l.355-.922h1.782l.354.922h.481L1.98 9.622zm2.264.002v3.838h.491V9.624zm2.375 0v3.838h2.413v-.502H6.613v-1.19H8.19v-.477H6.613v-1.166h1.773v-.502zm-4.386.592l.698 1.82H1.028zm14.689.402a1.466 1.466 0 0 0-.966.366V10.7h-.491v2.763h.49c.002-.477 0-.955.002-1.433a.969.969 0 0 1 .965-.918zm4.18.007c-.053 0-.105.003-.158.01-.315.031-.606.175-.753.377a.689.689 0 0 0-.14.465c.007.2.066.357.233.496.184.147.42.2.657.259.311.067.426.095.546.186.08.07.133.127.136.27 0 .25-.221.372-.42.41a.89.89 0 0 1-.894-.344l-.371.288c.33.382.777.505 1.09.5.54-.01.891-.217 1.029-.534.066-.153.063-.309.063-.38a.677.677 0 0 0-.267-.545c-.228-.177-.583-.228-.636-.242-.437-.078-.658-.196-.697-.341-.043-.192.102-.35.297-.411a.76.76 0 0 1 .857.277l.367-.247a1.166 1.166 0 0 0-.939-.494zm2.387 0c-.052 0-.105.003-.157.01-.316.031-.607.175-.753.377a.689.689 0 0 0-.14.465c.006.2.065.357.233.496.183.147.42.2.657.259.31.067.426.095.545.186.081.07.134.127.136.27.001.25-.221.372-.42.41a.89.89 0 0 1-.894-.344l-.371.288c.33.382.777.505 1.09.5.541-.01.891-.217 1.03-.534.065-.153.062-.309.062-.38a.677.677 0 0 0-.267-.545c-.227-.177-.583-.228-.636-.242-.437-.078-.658-.196-.696-.341-.043-.192.101-.35.297-.411a.76.76 0 0 1 .857.277l.367-.247a1.167 1.167 0 0 0-.94-.494zm-9.84.002a1.461 1.461 0 0 0-1.42 1.117 1.305 1.305 0 0 0-.041.327v2.833h.491v-1.813c.17.18.487.42.96.454a1.447 1.447 0 0 0 1.208-.627 1.457 1.457 0 0 0-1.199-2.292zm4.804 0a1.448 1.448 0 0 0-1.288 2.08c.255.53.811.87 1.412.833a1.452 1.452 0 0 0 1.012-.51l-.363-.291a.968.968 0 0 1-1.106.273 1.01 1.01 0 0 1-.602-.69h2.239l.002-.427a1.295 1.295 0 0 0-1.306-1.268zm-9.2.08l1.062 1.377-1.062 1.378h.581l.779-1.01.778 1.01h.581l-1.062-1.378 1.062-1.378h-.581l-.778 1.01-.779-1.01zm-3.825.015v2.74h.49v-2.74zm8.233.37a.96.96 0 0 1 .95.993.963.963 0 0 1-.863.998.962.962 0 0 1-1.034-.739c-.074-.382 0-.746.307-1.019a.959.959 0 0 1 .64-.233zm4.79.015a.823.823 0 0 1 .819.755h-1.76a.964.964 0 0 1 .94-.755z\"],\"color\":\"#FF4747\"},{\"id\":\"brand-etsy\",\"label\":\"Etsy\",\"set\":\"brand\",\"paths\":[\"M8.559 2.445c0-.325.033-.52.59-.52h7.465c1.3 0 2.02 1.11 2.54 3.193l.42 1.666h1.27c.23-4.728.43-6.784.43-6.784s-3.196.36-5.09.36H6.635L1.521.196v1.37l1.725.326c1.21.24 1.5.496 1.6 1.606 0 0 .11 3.27.11 8.64 0 5.385-.09 8.61-.09 8.61 0 .973-.39 1.333-1.59 1.573l-1.722.33V24l5.13-.165h8.55c1.935 0 6.39.165 6.39.165.105-1.17.75-6.48.855-7.064h-1.2l-1.284 2.91c-1.005 2.28-2.476 2.445-4.11 2.445h-4.906c-1.63 0-2.415-.64-2.415-2.05V12.8s3.62 0 4.79.096c.912.064 1.463.325 1.76 1.598l.39 1.695h1.41l-.09-4.278.192-4.305h-1.391l-.45 1.89c-.283 1.244-.48 1.47-1.754 1.6-1.666.17-4.815.14-4.815.14V2.45h-.05z\"],\"color\":\"#F16521\"},{\"id\":\"brand-trustpilot\",\"label\":\"Trustpilot\",\"set\":\"brand\",\"paths\":[\"M17.227 16.67l2.19 6.742-7.413-5.388 5.223-1.354zM24 9.31h-9.165L12.005.589l-2.84 8.723L0 9.3l7.422 5.397-2.84 8.714 7.422-5.388 4.583-3.326L24 9.311z\"],\"color\":\"#00B67A\"},{\"id\":\"brand-patreon\",\"label\":\"Patreon\",\"set\":\"brand\",\"paths\":[\"M22.957 7.21c-.004-3.064-2.391-5.576-5.191-6.482-3.478-1.125-8.064-.962-11.384.604C2.357 3.231 1.093 7.391 1.046 11.54c-.039 3.411.302 12.396 5.369 12.46 3.765.047 4.326-4.804 6.068-7.141 1.24-1.662 2.836-2.132 4.801-2.618 3.376-.836 5.678-3.501 5.673-7.031Z\"],\"color\":\"#000000\"},{\"id\":\"brand-kofi\",\"label\":\"Ko-fi\",\"set\":\"brand\",\"paths\":[\"M11.351 2.715c-2.7 0-4.986.025-6.83.26C2.078 3.285 0 5.154 0 8.61c0 3.506.182 6.13 1.585 8.493 1.584 2.701 4.233 4.182 7.662 4.182h.83c4.209 0 6.494-2.234 7.637-4a9.5 9.5 0 0 0 1.091-2.338C21.792 14.688 24 12.22 24 9.208v-.415c0-3.247-2.13-5.507-5.792-5.87-1.558-.156-2.65-.208-6.857-.208m0 1.947c4.208 0 5.09.052 6.571.182 2.624.311 4.13 1.584 4.13 4v.39c0 2.156-1.792 3.844-3.87 3.844h-.935l-.156.649c-.208 1.013-.597 1.818-1.039 2.546-.909 1.428-2.545 3.064-5.922 3.064h-.805c-2.571 0-4.831-.883-6.078-3.195-1.09-2-1.298-4.155-1.298-7.506 0-2.181.857-3.402 3.012-3.714 1.533-.233 3.559-.26 6.39-.26m6.547 2.287c-.416 0-.65.234-.65.546v2.935c0 .311.234.545.65.545 1.324 0 2.051-.754 2.051-2s-.727-2.026-2.052-2.026m-10.39.182c-1.818 0-3.013 1.48-3.013 3.142 0 1.533.858 2.857 1.949 3.897.727.701 1.87 1.429 2.649 1.896a1.47 1.47 0 0 0 1.507 0c.78-.467 1.922-1.195 2.623-1.896 1.117-1.039 1.974-2.364 1.974-3.897 0-1.662-1.247-3.142-3.039-3.142-1.065 0-1.792.545-2.338 1.298-.493-.753-1.246-1.298-2.312-1.298\"],\"color\":\"#FF6433\"},{\"id\":\"brand-buymeacoffee\",\"label\":\"Buy Me A Coffee\",\"set\":\"brand\",\"paths\":[\"M20.216 6.415l-.132-.666c-.119-.598-.388-1.163-1.001-1.379-.197-.069-.42-.098-.57-.241-.152-.143-.196-.366-.231-.572-.065-.378-.125-.756-.192-1.133-.057-.325-.102-.69-.25-.987-.195-.4-.597-.634-.996-.788a5.723 5.723 0 00-.626-.194c-1-.263-2.05-.36-3.077-.416a25.834 25.834 0 00-3.7.062c-.915.083-1.88.184-2.75.5-.318.116-.646.256-.888.501-.297.302-.393.77-.177 1.146.154.267.415.456.692.58.36.162.737.284 1.123.366 1.075.238 2.189.331 3.287.37 1.218.05 2.437.01 3.65-.118.299-.033.598-.073.896-.119.352-.054.578-.513.474-.834-.124-.383-.457-.531-.834-.473-.466.074-.96.108-1.382.146-1.177.08-2.358.082-3.536.006a22.228 22.228 0 01-1.157-.107c-.086-.01-.18-.025-.258-.036-.243-.036-.484-.08-.724-.13-.111-.027-.111-.185 0-.212h.005c.277-.06.557-.108.838-.147h.002c.131-.009.263-.032.394-.048a25.076 25.076 0 013.426-.12c.674.019 1.347.067 2.017.144l.228.031c.267.04.533.088.798.145.392.085.895.113 1.07.542.055.137.08.288.111.431l.319 1.484a.237.237 0 01-.199.284h-.003c-.037.006-.075.01-.112.015a36.704 36.704 0 01-4.743.295 37.059 37.059 0 01-4.699-.304c-.14-.017-.293-.042-.417-.06-.326-.048-.649-.108-.973-.161-.393-.065-.768-.032-1.123.161-.29.16-.527.404-.675.701-.154.316-.199.66-.267 1-.069.34-.176.707-.135 1.056.087.753.613 1.365 1.37 1.502a39.69 39.69 0 0011.343.376.483.483 0 01.535.53l-.071.697-1.018 9.907c-.041.41-.047.832-.125 1.237-.122.637-.553 1.028-1.182 1.171-.577.131-1.165.2-1.756.205-.656.004-1.31-.025-1.966-.022-.699.004-1.556-.06-2.095-.58-.475-.458-.54-1.174-.605-1.793l-.731-7.013-.322-3.094c-.037-.351-.286-.695-.678-.678-.336.015-.718.3-.678.679l.228 2.185.949 9.112c.147 1.344 1.174 2.068 2.446 2.272.742.12 1.503.144 2.257.156.966.016 1.942.053 2.892-.122 1.408-.258 2.465-1.198 2.616-2.657.34-3.332.683-6.663 1.024-9.995l.215-2.087a.484.484 0 01.39-.426c.402-.078.787-.212 1.074-.518.455-.488.546-1.124.385-1.766zm-1.478.772c-.145.137-.363.201-.578.233-2.416.359-4.866.54-7.308.46-1.748-.06-3.477-.254-5.207-.498-.17-.024-.353-.055-.47-.18-.22-.236-.111-.71-.054-.995.052-.26.152-.609.463-.646.484-.057 1.046.148 1.526.22.577.088 1.156.159 1.737.212 2.48.226 5.002.19 7.472-.14.45-.06.899-.13 1.345-.21.399-.072.84-.206 1.08.206.166.281.188.657.162.974a.544.544 0 01-.169.364zm-6.159 3.9c-.862.37-1.84.788-3.109.788a5.884 5.884 0 01-1.569-.217l.877 9.004c.065.78.717 1.38 1.5 1.38 0 0 1.243.065 1.658.065.447 0 1.786-.065 1.786-.065.783 0 1.434-.6 1.499-1.38l.94-9.95a3.996 3.996 0 00-1.322-.238c-.826 0-1.491.284-2.26.613z\"],\"color\":\"#FFDD00\"},{\"id\":\"brand-bluesky\",\"label\":\"Bluesky\",\"set\":\"brand\",\"paths\":[\"M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037-.856 3.061-3.978 3.842-6.755 3.37 4.854.826 6.089 3.562 3.422 6.299-5.065 5.196-7.28-1.304-7.847-2.97-.104-.305-.152-.448-.153-.327 0-.121-.05.022-.153.327-.568 1.666-2.782 8.166-7.847 2.97-2.667-2.737-1.432-5.473 3.422-6.3-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026\"],\"color\":\"#1185FE\"},{\"id\":\"brand-threads\",\"label\":\"Threads\",\"set\":\"brand\",\"paths\":[\"M18.263 11.097c-.03-3.486-1.92-5.586-5.111-5.586-2.13 0-3.922.963-4.863 2.499l2.062 1.438c.535-.843 1.272-1.543 2.628-1.543 1.528 0 2.318.85 2.544 2.431a15 15 0 0 0-2.236-.173c-4.125 0-6.068 1.867-6.068 4.336s1.943 3.99 4.804 3.99c3.139 0 5.013-2.115 5.781-4.735.798.361 1.348 1.204 1.348 2.47 0 3.387-3.907 5.232-7.22 5.232-4.885 0-8.077-3.207-8.077-8.424 0-6.392 4.223-10.487 9.9-10.487 3.808 0 5.69 1.671 6.97 3.914l2.108-1.475C21.44 2.078 18.331 0 13.663 0 6.227 0 1.168 5.277 1.168 12.934c0 7 4.953 11.066 10.856 11.066 4.878 0 9.809-2.846 9.809-7.716 0-2.545-1.46-4.231-3.569-5.187m-6.33 4.855c-1.077 0-2.026-.512-2.026-1.453 0-1.483 1.822-1.934 3.606-1.934.678 0 1.34.045 1.927.173-.422 1.927-1.671 3.215-3.508 3.214Z\"],\"color\":\"#000000\"},{\"id\":\"brand-pinterest\",\"label\":\"Pinterest\",\"set\":\"brand\",\"paths\":[\"M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026L12.017 0z\"],\"color\":\"#BD081C\"},{\"id\":\"brand-signal\",\"label\":\"Signal\",\"set\":\"brand\",\"paths\":[\"M12 0q-.934 0-1.83.139l.17 1.111a11 11 0 0 1 3.32 0l.172-1.111A12 12 0 0 0 12 0M9.152.34A12 12 0 0 0 5.77 1.742l.584.961a10.8 10.8 0 0 1 3.066-1.27zm5.696 0-.268 1.094a10.8 10.8 0 0 1 3.066 1.27l.584-.962A12 12 0 0 0 14.848.34M12 2.25a9.75 9.75 0 0 0-8.539 14.459c.074.134.1.292.064.441l-1.013 4.338 4.338-1.013a.62.62 0 0 1 .441.064A9.7 9.7 0 0 0 12 21.75c5.385 0 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25m-7.092.068a12 12 0 0 0-2.59 2.59l.909.664a11 11 0 0 1 2.345-2.345zm14.184 0-.664.909a11 11 0 0 1 2.345 2.345l.909-.664a12 12 0 0 0-2.59-2.59M1.742 5.77A12 12 0 0 0 .34 9.152l1.094.268a10.8 10.8 0 0 1 1.269-3.066zm20.516 0-.961.584a10.8 10.8 0 0 1 1.27 3.066l1.093-.268a12 12 0 0 0-1.402-3.383M.138 10.168A12 12 0 0 0 0 12q0 .934.139 1.83l1.111-.17A11 11 0 0 1 1.125 12q0-.848.125-1.66zm23.723.002-1.111.17q.125.812.125 1.66c0 .848-.042 1.12-.125 1.66l1.111.172a12.1 12.1 0 0 0 0-3.662M1.434 14.58l-1.094.268a12 12 0 0 0 .96 2.591l-.265 1.14 1.096.255.36-1.539-.188-.365a10.8 10.8 0 0 1-.87-2.35m21.133 0a10.8 10.8 0 0 1-1.27 3.067l.962.584a12 12 0 0 0 1.402-3.383zm-1.793 3.848a11 11 0 0 1-2.345 2.345l.664.909a12 12 0 0 0 2.59-2.59zm-19.959 1.1L.357 21.48a1.8 1.8 0 0 0 2.162 2.161l1.954-.455-.256-1.095-1.953.455a.675.675 0 0 1-.81-.81l.454-1.954zm16.832 1.769a10.8 10.8 0 0 1-3.066 1.27l.268 1.093a12 12 0 0 0 3.382-1.402zm-10.94.213-1.54.36.256 1.095 1.139-.266c.814.415 1.683.74 2.591.961l.268-1.094a10.8 10.8 0 0 1-2.35-.869zm3.634 1.24-.172 1.111a12.1 12.1 0 0 0 3.662 0l-.17-1.111q-.812.125-1.66.125a11 11 0 0 1-1.66-.125\"],\"color\":\"#3B45FD\"},{\"id\":\"brand-battledotnet\",\"label\":\"Battle.net\",\"set\":\"brand\",\"paths\":[\"M18.94 8.296C15.9 6.892 11.534 6 7.426 6.332c.206-1.36.714-2.308 1.548-2.508 1.148-.275 2.4.48 3.594 1.854.782.102 1.71.28 2.355.429C12.747 2.013 9.828-.282 7.607.565c-1.688.644-2.553 2.97-2.448 6.094-2.2.468-3.915 1.3-5.013 2.495-.056.065-.181.227-.137.305.034.058.146-.008.194-.04 1.274-.89 2.904-1.373 5.027-1.676.303 3.333 1.713 7.56 4.055 10.952-1.28.502-2.356.536-2.946-.087-.812-.856-.784-2.318-.19-4.04a26.764 26.764 0 0 1-.807-2.254c-2.459 3.934-2.986 7.61-1.143 9.11 1.402 1.14 3.847.725 6.502-.926 1.505 1.672 3.083 2.74 4.667 3.094.084.015.287.043.332-.034.034-.06-.08-.124-.131-.149-1.408-.657-2.64-1.828-3.964-3.515 2.735-1.929 5.691-5.263 7.457-8.988 1.076.86 1.64 1.773 1.398 2.595-.336 1.131-1.615 1.84-3.403 2.185a27.697 27.697 0 0 1-1.548 1.826c4.634.16 8.08-1.22 8.458-3.565.286-1.786-1.295-3.696-4.053-5.17.696-2.139.832-4.04.346-5.588-.029-.08-.106-.27-.196-.27-.068 0-.067.13-.063.187.135 1.547-.263 3.2-1.062 5.19zm-8.533 9.869c-1.96-3.145-3.09-6.849-3.082-10.594 3.702-.124 7.474.748 10.714 2.627-1.743 3.269-4.385 6.1-7.633 7.966h.001z\"],\"color\":\"#4381C3\"},{\"id\":\"brand-ubisoft\",\"label\":\"Ubisoft\",\"set\":\"brand\",\"paths\":[\"M23.561 11.988C23.301-.304 6.954-4.89.656 6.634c.282.206.661.477.943.672a11.747 11.747 0 00-.976 3.067 11.885 11.885 0 00-.184 2.071C.439 18.818 5.621 24 12.005 24c6.385 0 11.556-5.17 11.556-11.556v-.455zm-20.27 2.06c-.152 1.246-.054 1.636-.054 1.788l-.282.098c-.108-.206-.37-.932-.488-1.908C2.163 10.308 4.7 6.96 8.57 6.33c3.544-.52 6.937 1.68 7.728 4.758l-.282.098c-.087-.087-.228-.336-.77-.878-4.281-4.281-11.002-2.32-11.956 3.74zm11.002 2.081a3.145 3.145 0 01-2.59 1.355 3.15 3.15 0 01-3.155-3.155 3.159 3.159 0 012.927-3.144c1.018-.043 1.972.51 2.416 1.398a2.58 2.58 0 01-.455 2.95c.293.205.575.4.856.595zm6.58.12c-1.669 3.782-5.106 5.766-8.77 5.712-7.034-.347-9.083-8.466-4.38-11.393l.207.206c-.076.108-.358.325-.791 1.182-.51 1.041-.672 2.081-.607 2.732.369 5.67 8.314 6.83 11.045 1.214C21.057 8.217 11.822.401 3.626 6.374l-.184-.184C5.599 2.808 9.816 1.3 13.837 2.309c6.147 1.55 9.453 7.956 7.035 13.94z\"],\"color\":\"#000000\"},{\"id\":\"brand-amazonpay\",\"label\":\"Amazon Pay\",\"set\":\"brand\",\"paths\":[\"M14.378 4.995q-.56-.485-1.74-.485q-.585 0-1.168.106q-.585.105-.983.28a.5.5 0 0 0-.199.13q-.05.068-.05.242v.335q0 .224.162.224a.3.3 0 0 0 .106-.019l.093-.03a6.4 6.4 0 0 1 1.827-.287q.745 0 1.045.274q.298.274.298.945v.82a6.7 6.7 0 0 0-1.567-.211q-1.093 0-1.74.54q-.646.541-.646 1.448q0 .846.522 1.35q.522.502 1.417.502q.534 0 1.075-.21q.541-.211.988-.597l.063.41q.037.236.274.236h.534q.248 0 .249-.249V6.5q0-1.02-.56-1.504m-.609 4.6q-.41.31-.858.472a2.5 2.5 0 0 1-.857.162q-.485 0-.746-.255t-.261-.727q0-1.082 1.404-1.082q.323 0 .665.044q.342.045.653.118zM8.773 6.402a3 3 0 0 0-.516-1.025a2.2 2.2 0 0 0-.82-.647a2.55 2.55 0 0 0-1.082-.224q-.56 0-1.094.211a3.5 3.5 0 0 0-1.007.622l-.062-.398q-.037-.249-.286-.249h-.547q-.249 0-.249.249v8.366q0 .248.249.248h.733q.249 0 .249-.248v-2.909a2.77 2.77 0 0 0 1.926.734q.61 0 1.106-.242q.497-.243.845-.678q.35-.435.54-1.057a4.7 4.7 0 0 0 .194-1.392a4.7 4.7 0 0 0-.18-1.361m-2.791 3.735q-.846 0-1.64-.597V6.072q.78-.57 1.665-.571q1.69 0 1.69 2.324q0 2.313-1.715 2.312m13 1.963l2.736-6.961a1 1 0 0 0 .086-.299q0-.149-.174-.149h-.696q-.198 0-.274.063q-.075.062-.149.274L18.833 9.85l-1.74-4.822q-.075-.212-.15-.274q-.074-.063-.274-.063h-.746q-.174 0-.174.15q0 .086.087.298l2.4 5.917l-.237.634q-.21.597-.472.82q-.261.225-.733.224q-.212 0-.336-.025a1 1 0 0 0-.186-.025q-.186 0-.187.236v.323q0 .174.063.255a.36.36 0 0 0 .199.118q.31.086.708.087q.71 0 1.15-.373q.442-.372.778-1.23m2.71 4.423c-2.627 1.94-6.436 2.97-9.717 2.97c-4.597 0-8.737-1.699-11.87-4.528c-.246-.222-.027-.525.27-.353c3.38 1.967 7.559 3.151 11.876 3.151a23.6 23.6 0 0 0 9.06-1.853c.444-.19.816.292.382.613m1.093-1.248c.336.43-.374 2.204-.691 2.996c-.096.24.11.336.327.155c1.41-1.18 1.774-3.65 1.485-4.007c-.286-.354-2.75-.659-4.254.397c-.232.163-.192.387.064.356c.847-.101 2.733-.328 3.069.103\"],\"color\":\"#FF9900\"},{\"id\":\"brand-amazon\",\"label\":\"Amazon\",\"set\":\"brand\",\"paths\":[\"M.045 18.02q.107-.174.348-.022q5.455 3.165 11.87 3.166q4.278-.001 8.447-1.595l.315-.14c.138-.06.234-.1.293-.13c.226-.088.39-.046.525.13c.12.174.09.336-.12.48c-.256.19-.6.41-1.006.654q-1.867 1.113-4.185 1.726a17.6 17.6 0 0 1-10.951-.577a17.9 17.9 0 0 1-5.43-3.35q-.15-.113-.151-.22c0-.047.021-.09.051-.13zm6.565-6.218q0-1.507.743-2.577c.495-.71 1.17-1.25 2.04-1.615c.796-.335 1.756-.575 2.912-.72c.39-.046 1.033-.103 1.92-.174v-.37c0-.93-.105-1.558-.3-1.875c-.302-.43-.78-.65-1.44-.65h-.182c-.48.046-.896.196-1.246.46c-.35.27-.575.63-.675 1.096c-.06.3-.206.465-.435.51l-2.52-.315c-.248-.06-.372-.18-.372-.39c0-.046.007-.09.022-.15q.372-1.935 1.82-2.88c.976-.616 2.1-.975 3.39-1.05h.54c1.65 0 2.957.434 3.888 1.29c.135.15.27.3.405.48c.12.165.224.314.283.45c.075.134.15.33.195.57c.06.254.105.42.135.51c.03.104.062.3.076.615c.01.313.02.493.02.553v5.28c0 .376.06.72.165 1.036q.157.471.315.674l.51.674q.136.204.136.36q0 .181-.18.314c-1.2 1.05-1.86 1.62-1.963 1.71q-.247.203-.63.045a6 6 0 0 1-.526-.496l-.31-.347a9 9 0 0 1-.317-.42l-.3-.435c-.81.886-1.603 1.44-2.4 1.665c-.494.15-1.093.227-1.83.227c-1.11 0-2.04-.343-2.76-1.034c-.72-.69-1.08-1.665-1.08-2.94l-.05-.076zm3.753-.438q-.001.848.425 1.364c.285.34.675.512 1.155.512c.045 0 .106-.007.195-.02c.09-.016.134-.023.166-.023c.614-.16 1.08-.553 1.424-1.178c.165-.28.285-.58.36-.91c.09-.32.12-.59.135-.8c.015-.195.015-.54.015-1.005v-.54c-.84 0-1.484.06-1.92.18c-1.275.36-1.92 1.17-1.92 2.43l-.035-.02zm9.162 7.027c.03-.06.075-.11.132-.17q.544-.365 1.05-.5a8 8 0 0 1 1.612-.24c.14-.012.28 0 .41.03c.65.06 1.05.168 1.172.33c.063.09.099.228.099.39v.15c0 .51-.149 1.11-.424 1.8q-.418 1.034-1.156 1.68q-.11.09-.197.09c-.03 0-.06 0-.09-.012c-.09-.044-.107-.12-.064-.24c.54-1.26.806-2.143.806-2.64c0-.15-.03-.27-.087-.344c-.145-.166-.55-.257-1.224-.257q-.364 0-.87.046c-.363.045-.7.09-1 .135q-.134 0-.18-.044c-.03-.03-.036-.047-.02-.077c0-.017.006-.03.02-.063v-.06z\"],\"color\":\"#FF9900\"},{\"id\":\"brand-xbox\",\"label\":\"Xbox\",\"set\":\"brand\",\"paths\":[\"M4.102 21.033A11.95 11.95 0 0 0 12 24a11.96 11.96 0 0 0 7.902-2.967c1.877-1.912-4.316-8.709-7.902-11.417c-3.582 2.708-9.779 9.505-7.898 11.417m11.16-14.406c2.5 2.961 7.484 10.313 6.076 12.912A11.94 11.94 0 0 0 24 12.004a11.95 11.95 0 0 0-3.57-8.536s-.027-.022-.082-.042a.8.8 0 0 0-.281-.045c-.592 0-1.985.434-4.805 3.246M3.654 3.426c-.057.02-.082.041-.086.042A11.96 11.96 0 0 0 0 12.004c0 2.854.998 5.473 2.661 7.533c-1.401-2.605 3.579-9.951 6.08-12.91c-2.82-2.813-4.216-3.245-4.806-3.245a.7.7 0 0 0-.281.046zM12 3.551S9.055 1.828 6.755 1.746c-.903-.033-1.454.295-1.521.339C7.379.646 9.659 0 11.984 0H12c2.334 0 4.605.646 6.766 2.085c-.068-.046-.615-.372-1.52-.339C14.946 1.828 12 3.545 12 3.545z\"],\"color\":\"#107C10\"},{\"id\":\"brand-nintendoswitch\",\"label\":\"Nintendo Switch\",\"set\":\"brand\",\"paths\":[\"M14.176 24h3.674c3.376 0 6.15-2.774 6.15-6.15V6.15C24 2.775 21.226 0 17.85 0H14.1c-.074 0-.15.074-.15.15v23.7c-.001.076.075.15.226.15m4.574-13.199c1.351 0 2.399 1.125 2.399 2.398c0 1.352-1.125 2.4-2.399 2.4c-1.35 0-2.4-1.049-2.4-2.4c-.075-1.349 1.05-2.398 2.4-2.398M11.4 0H6.15C2.775 0 0 2.775 0 6.15v11.7C0 21.226 2.775 24 6.15 24h5.25c.074 0 .15-.074.15-.149V.15c.001-.076-.075-.15-.15-.15M9.676 22.051H6.15a4.194 4.194 0 0 1-4.201-4.201V6.15A4.194 4.194 0 0 1 6.15 1.949H9.6zM3.75 7.199c0 1.275.975 2.25 2.25 2.25s2.25-.975 2.25-2.25c0-1.273-.975-2.25-2.25-2.25s-2.25.977-2.25 2.25\"],\"color\":\"#E60012\"},{\"id\":\"brand-minecraft\",\"label\":\"Minecraft\",\"set\":\"brand\",\"paths\":[\"m23.74 10.006l-2.443.002l-.076.12l-.03-.118h-2.458l-.06.136l-.023-.136l-2.48.003l-.043.161l-.016-.161l-2.503.002l-.023.265l-.007-.265l-2.518.005l-.01.242l-.025-.242l-2.495.002l-.016.157l-.044-.157H7.267l-.097.67l-.055-.138l-.025-.002l-.21-.53l-1.189.002l-.023.13l-.062-.13H4.431l-.03.12l-.07-.12l-1.165.003l-.136.523h-.316l-.06.228l-.55-.751l-1.134.002L0 13.04l1.03.954h1.124l.178-.67l.087.097h.3l.5.573h1.154l.023-.108l.081.108h1.164l.02-.117l.074.117H6.91l.09-.629l.302.63H8.49l.014-.146l.05.145h2.475l.01-.228l.027.228h2.495l.023-.25l.01.25h1.223l.04-.175l.01.175h1.21l.051-.152l.014.152h1.196l.062-.133l.018.133h1.185l.071-.122l.021.122h1.175l.68-.967l-.032-.155h.375l.535-.74l.456 1.86h1.152l.963-.959l-.018-.073l-.074-.254l-.07-.233l-.246-.806l-.103-.346l-.005-.018l.484-.583zm-2.325.168h2.2l.157.493h-.638l.004.016q.04.164.085.33c.03.113.065.226.097.343l.106.353q.056.178.109.357l.066.219q.034.112.07.223l.069.228l.066.228h-.997l-.627-2.297h-.64zm-.355.002l.122.493h-1.295l.118.56h1.313l.136.553H20.12l.246 1.182l-.995.003l-.51-2.788zm-2.553.003l.481 2.788h-.995l-.129-.899h-.373l.122.899h-.996l-.306-2.786zm-2.549.002l.104 1.032h-.327l.03.311h.327l.145 1.443h-.993l-.09-1.176l-.368-.009l.076 1.185h-.993l-.104-2.784zm-2.546.002l.014.493h-1.272l-.03 1.72h1.35l.017.573h-2.364l.094-2.783zm-2.543.003l-.021.493H9.56l-.041.569l1.304.002l-.023.537l-1.33.002l-.044.602l1.346.004l-.025.574h-2.36l.293-2.781zm-2.54.002l-.322 2.78h-.99l.124-.884l-.328-.01l.083-.573l-.36-.007l-.234 1.477H5.31l.518-2.78h.917l-.08.513l.315.01l-.076.536l.355.005l.15-1.065zm-5.034.004h.917l-.648 2.78h-.988l.297-1.18h-.357l-.154.573h-.64l.158-.573h-.36l-.35 1.18H.2l.892-2.777h.899l-.148.504l.314.012l-.157.546h.696l.145-.54h.318zm2.182.005l-.546 2.781h-.989L4.56 10.2zm12.168.422l.04.325l-.342-.003l-.043-.32h-.422l.044.353h.387l.018.128h-.193l.071.547h.233l-.019-.185l.346-.002l.03.187h.237l-.083-.542h-.193l-.016-.131l.396-.003l-.055-.354zm-2.928.055l.036.574h.364l-.043-.574zm-1.196 1.005l.018.548l-1.216-.002l.011-.41h1.177Z\"],\"color\":\"#62B47A\"},{\"id\":\"brand-linkedin\",\"label\":\"LinkedIn\",\"set\":\"brand\",\"paths\":[\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z\"],\"color\":\"#0A66C2\"},{\"id\":\"brand-slack\",\"label\":\"Slack\",\"set\":\"brand\",\"paths\":[\"M5.042 15.165a2.53 2.53 0 0 1-2.52 2.523A2.53 2.53 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52a2.527 2.527 0 0 1 2.521 2.52v6.313A2.53 2.53 0 0 1 8.834 24a2.53 2.53 0 0 1-2.521-2.522zM8.834 5.042a2.53 2.53 0 0 1-2.521-2.52A2.53 2.53 0 0 1 8.834 0a2.53 2.53 0 0 1 2.521 2.522v2.52zm0 1.271a2.53 2.53 0 0 1 2.521 2.521a2.53 2.53 0 0 1-2.521 2.521H2.522A2.53 2.53 0 0 1 0 8.834a2.53 2.53 0 0 1 2.522-2.521zm10.122 2.521a2.53 2.53 0 0 1 2.522-2.521A2.53 2.53 0 0 1 24 8.834a2.53 2.53 0 0 1-2.522 2.521h-2.522zm-1.268 0a2.53 2.53 0 0 1-2.523 2.521a2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.53 2.53 0 0 1 2.523 2.522zm-2.523 10.122a2.53 2.53 0 0 1 2.523 2.522A2.53 2.53 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522zm0-1.268a2.527 2.527 0 0 1-2.52-2.523a2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.53 2.53 0 0 1-2.522 2.523z\"],\"color\":\"#4A154B\"},{\"id\":\"brand-openai\",\"label\":\"OpenAI\",\"set\":\"brand\",\"paths\":[\"M22.282 9.821a6 6 0 0 0-.516-4.91a6.05 6.05 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a6 6 0 0 0-3.998 2.9a6.05 6.05 0 0 0 .743 7.097a5.98 5.98 0 0 0 .51 4.911a6.05 6.05 0 0 0 6.515 2.9A6 6 0 0 0 13.26 24a6.06 6.06 0 0 0 5.772-4.206a6 6 0 0 0 3.997-2.9a6.06 6.06 0 0 0-.747-7.073M13.26 22.43a4.48 4.48 0 0 1-2.876-1.04l.141-.081l4.779-2.758a.8.8 0 0 0 .392-.681v-6.737l2.02 1.168a.07.07 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494M3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085l4.783 2.759a.77.77 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646M2.34 7.896a4.5 4.5 0 0 1 2.366-1.973V11.6a.77.77 0 0 0 .388.677l5.815 3.354l-2.02 1.168a.08.08 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.08.08 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667m2.01-3.023l-.141-.085l-4.774-2.782a.78.78 0 0 0-.785 0L9.409 9.23V6.897a.07.07 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.8.8 0 0 0-.393.681zm1.097-2.365l2.602-1.5l2.607 1.5v2.999l-2.597 1.5l-2.607-1.5Z\"],\"color\":\"#412991\"},{\"id\":\"brand-canva\",\"label\":\"Canva\",\"set\":\"brand\",\"paths\":[\"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12s12-5.373 12-12S18.627 0 12 0M6.962 7.68c.754 0 1.337.549 1.405 1.2c.069.583-.171 1.097-.822 1.406c-.343.171-.48.172-.549.069c-.034-.069 0-.137.069-.206c.617-.514.617-.926.548-1.508c-.034-.378-.308-.618-.583-.618c-1.2 0-2.914 2.674-2.674 4.629c.103.754.549 1.646 1.509 1.646c.308 0 .65-.103.96-.24c.5-.264.799-.47 1.097-.8c-.073-.885.704-2.046 1.851-2.046c.515 0 .926.205.96.583c.068.514-.377.582-.514.582s-.378-.034-.378-.17c-.034-.138.309-.07.275-.378c-.035-.206-.24-.274-.446-.274c-.72 0-1.131.994-1.029 1.611c.035.275.172.549.447.549c.205 0 .514-.31.617-.755c.068-.308.343-.514.583-.514c.102 0 .17.034.205.171v.138c-.034.137-.137.548-.102.651c0 .069.034.171.17.171c.092 0 .436-.18.777-.459c.117-.59.253-1.298.253-1.357c.034-.24.137-.48.617-.48c.103 0 .171.034.205.171v.138l-.136.617c.445-.583 1.097-.994 1.508-.994c.172 0 .309.102.309.274c0 .103 0 .274-.069.446c-.137.377-.309.96-.412 1.474c0 .137.035.274.207.274s.685-.206 1.096-.754l.007-.004c-.002-.068-.007-.134-.007-.202c0-.411.035-.754.104-.994c.068-.274.411-.514.617-.514c.103 0 .205.069.205.171c0 .035 0 .103-.034.137c-.137.446-.24.857-.24 1.269c0 .24.034.582.102.788c0 .034.035.069.07.069c.068 0 .548-.445.89-1.028c-.308-.206-.48-.549-.48-.96c0-.72.446-1.097.858-1.097c.343 0 .617.24.617.72c0 .308-.103.65-.274.96h.102a.77.77 0 0 0 .584-.24a.3.3 0 0 1 .134-.117c.335-.425.83-.74 1.41-.74c.48 0 .924.205.959.582c.068.515-.378.618-.515.618l-.002-.002c-.138 0-.377-.035-.377-.172s.309-.068.274-.376c-.034-.206-.24-.275-.446-.275c-.686 0-1.13.891-1.028 1.611c.034.275.171.583.445.583c.206 0 .515-.308.652-.754c.068-.274.343-.514.583-.514c.103 0 .17.034.205.171c0 .069 0 .206-.137.652c-.17.308-.171.48-.137.617c.034.274.171.48.309.583c.034.034.068.102.068.102c0 .069-.034.138-.137.138c-.034 0-.068 0-.103-.035c-.514-.205-.72-.548-.789-.891c-.205.24-.445.377-.72.377c-.445 0-.89-.411-.96-.926a1.6 1.6 0 0 1 .075-.649c-.203.13-.422.203-.623.203h-.17c-.447.652-.927 1.098-1.27 1.303a.9.9 0 0 1-.377.104c-.068 0-.171-.035-.205-.104c-.095-.152-.156-.392-.193-.667c-.481.527-1.145.805-1.453.805c-.343 0-.548-.206-.582-.55v-.376c.102-.754.377-1.2.377-1.337a.074.074 0 0 0-.069-.07c-.24 0-1.028.824-1.166 1.373l-.103.445c-.068.309-.377.515-.582.515c-.103 0-.172-.035-.206-.172v-.137l.046-.233c-.435.31-.87.508-1.075.508c-.308 0-.48-.172-.514-.412c-.206.274-.445.412-.754.412c-.352 0-.696-.24-.862-.593c-.244.275-.523.553-.852.764c-.48.309-1.028.549-1.68.549c-.582 0-1.097-.309-1.371-.583c-.412-.377-.651-.96-.686-1.509c-.205-1.68.823-3.84 2.4-4.8c.378-.205.755-.343 1.132-.343m9.77 3.291c-.104 0-.172.172-.172.343c0 .274.137.583.309.755a1.7 1.7 0 0 0 .102-.583c0-.343-.137-.515-.24-.515z\"],\"color\":\"#00C4CC\"},{\"id\":\"brand-tron\",\"label\":\"Tron\",\"set\":\"crypto\",\"paths\":[\"M12 0c6.63 0 12 5.37 12 12s-5.37 12-12 12S0 18.63 0 12 5.37 0 12 0zM5.63 5.44l5.7 14.33 7.94-9.67-2.81-2.67L5.63 5.44zm12.19 5.23l-5.75 7.01 .74-6.1 5.02-.91zM7.1 7.12l4.97 4.13-.78 6.44L7.1 7.12zM16.27 8.31l1.66 1.57-4.53 .82 2.87-2.39zM7.65 6.58l7.8 1.44-3.03 2.52-4.77-3.96z\"],\"color\":\"#EF0027\"},{\"id\":\"brand-avalanche\",\"label\":\"Avalanche\",\"set\":\"crypto\",\"paths\":[\"M12 0c6.63 0 12 5.37 12 12s-5.37 12-12 12S0 18.63 0 12 5.37 0 12 0zm.23 5.12a.58 .58 0 0 0-.52 0c-.15 .08-.27 .29-.51 .71L5.6 15.73c-.24 .41-.35 .62-.34 .79a.58 .58 0 0 0 .26 .45c.14 .09 .38 .09 .86 .09h2.27c.53 0 .8 0 1.04-.07 .26-.08 .5-.22 .7-.41 .18-.17 .31-.4 .57-.86l.01-.01 2.94-5.21c.26-.46 .39-.69 .45-.93a1.69 1.69 0 0 0 0-.8c-.06-.24-.19-.47-.44-.92l-.01-.01-1.15-2.01c-.24-.42-.36-.63-.51-.71zm3.5 7.11c-.15 .08-.27 .28-.51 .69l-1.62 2.79-.01 .01c-.24 .41-.36 .62-.35 .78a.58 .58 0 0 0 .26 .45c.11 .07 .29 .09 .6 .09l3.51 0c.48 0 .72 0 .87-.09a.58 .58 0 0 0 .26-.46c.01-.16-.11-.36-.33-.75l-.02-.04-1.63-2.79-.02-.03c-.23-.39-.34-.58-.49-.66a.57 .57 0 0 0-.52 0z\"],\"color\":\"#E84142\"},{\"id\":\"brand-usdcoin\",\"label\":\"USD Coin\",\"set\":\"crypto\",\"paths\":[\"M12 0c6.63 0 12 5.37 12 12s-5.37 12-12 12S0 18.63 0 12 5.37 0 12 0zm2.51 4.17c-.18-.09-.37 0-.41 .18-.05 .05-.05 .09-.05 .18v.64l.01 .08a.65 .65 0 0 0 .27 .38c3.57 1.27 5.39 5.24 4.07 8.74-.69 1.91-2.19 3.37-4.07 4.05-.18 .09-.27 .23-.27 .46v.64l0 .07a.34 .34 0 0 0 .27 .3c.05 0 .14 0 .18-.04a8.17 8.17 0 0 0 5.35-10.29c-.82-2.59-2.83-4.55-5.35-5.37zm-4.84-.04c-.05 0-.14 0-.18 .05a8.17 8.17 0 0 0-5.35 10.29c.82 2.55 2.79 4.51 5.35 5.33 .18 .09 .37 0 .41-.18 .05-.04 .05-.09 .05-.18v-.64l-.01-.06c-.03-.13-.15-.27-.27-.35-3.57-1.27-5.39-5.23-4.07-8.74 .69-1.91 2.19-3.37 4.07-4.05 .18-.09 .27-.23 .27-.46v-.64l0-.07a.34 .34 0 0 0-.27-.3zm2.65 2.37h-.69l-.07 .01c-.15 .03-.26 .16-.3 .36v1.05l-.16 .02c-1.28 .23-2.08 1.11-2.08 2.21 0 1.5 .91 2.09 2.83 2.32 1.28 .23 1.69 .5 1.69 1.23 0 .73-.64 1.23-1.51 1.23-1.19 0-1.6-.5-1.74-1.18-.04-.18-.18-.27-.32-.27h-.78l-.06 .01a.31 .31 0 0 0-.26 .31v.05l.02 .14c.22 1.07 .95 1.83 2.4 2.05v1.09l.01 .07c.03 .15 .16 .26 .36 .3h.69l.07-.01c.15-.03 .26-.16 .3-.36V16.01l.16-.03c1.28-.27 2.13-1.2 2.13-2.38 0-1.59-.96-2.14-2.88-2.37-1.37-.18-1.65-.55-1.65-1.18 0-.64 .46-1.05 1.37-1.05 .82 0 1.28 .27 1.51 .96a.34 .34 0 0 0 .32 .23h.73l.06 0a.31 .31 0 0 0 .26-.31v-.04l-.03-.13a2.28 2.28 0 0 0-2.03-1.74V6.86l-.01-.07c-.03-.15-.16-.26-.36-.3z\"],\"color\":\"#2775CA\"},{\"id\":\"brand-dai\",\"label\":\"Dai\",\"set\":\"crypto\",\"paths\":[\"M12 0c6.63 0 12 5.37 12 12s-5.37 12-12 12S0 18.63 0 12 5.37 0 12 0zm-.13 6H6.96v3.9H5.25v1.4h1.71v1.46H5.25v1.4h1.71V18h4.91c2.96 0 5.2-1.57 6.07-3.85H19.5v-1.39h-1.22c.03-.25 .05-.5 .05-.76v-.03c0-.23-.01-.45-.04-.67H19.5v-1.39h-1.53C17.13 7.59 14.86 6 11.87 6zm4.56 8.15c-.76 1.56-2.38 2.6-4.56 2.6h-3.54v-2.6zm.42-2.86c.03 .23 .05 .47 .05 .71v.03c0 .25-.02 .49-.05 .72H8.33v-1.46h8.53zM11.87 7.25c2.19 0 3.82 1.07 4.57 2.65h-8.11V7.25h3.54z\"],\"color\":\"#F4B731\"},{\"id\":\"brand-stellar\",\"label\":\"Stellar\",\"set\":\"crypto\",\"paths\":[\"M12 24C5.37 24 0 18.63 0 12S5.37 0 12 0s12 5.37 12 12-5.37 12-12 12zm5.35-17.03l-1.8 .92-8.7 4.43A5.18 5.18 0 0 1 14.51 7.12l1.03-.52 .15-.08a6.33 6.33 0 0 0-10.03 5.6 1.15 1.15 0 0 1-.63 1.11l-.54 .28v1.29l1.6-.82 .52-.26 .51-.26 9.17-4.67 1.03-.52 2.13-1.09V5.89L17.35 6.97zm2.11 1.51L7.65 14.49l-1.03 .52L4.5 16.1v1.29l2.11-1.07 1.8-.92 8.71-4.44a5.18 5.18 0 0 1-7.67 5.2l-.06 .03-1.12 .57a6.33 6.33 0 0 0 10.03-5.61 1.15 1.15 0 0 1 .62-1.11l.54-.28v-1.29z\"],\"color\":\"#14B6E7\"},{\"id\":\"brand-polkadot\",\"label\":\"Polkadot\",\"set\":\"crypto\",\"paths\":[\"M12 0c6.63 0 12 5.37 12 12s-5.37 12-12 12S0 18.63 0 12 5.37 0 12 0zm-.44 17.25c-.09 .45 .19 .91 .65 1a.84 .84 0 0 0 1-.66c.09-.47-.19-.91-.66-1a.84 .84 0 0 0-1 .65zm.64-12.28c-2.78 0-5.05 2.26-5.05 5.05 0 .56 .09 1.11 .27 1.64a.71 .71 0 0 0 .9 .44 .71 .71 0 0 0 .44-.9 3.56 3.56 0 0 1-.2-1.3c.05-1.88 1.58-3.43 3.46-3.53a3.65 3.65 0 0 1 3.84 3.64 3.65 3.65 0 0 1-3.43 3.64s-.71 .04-1.06 .09c-.17 .03-.31 .05-.4 .07-.04 .01-.08-.03-.07-.07l.12-.59 .65-3.02a.7 .7 0 0 0-.53-.83 .7 .7 0 0 0-.83 .53s-1.58 7.35-1.59 7.43a.7 .7 0 0 0 .53 .83 .7 .7 0 0 0 .83-.53c.01-.08 .23-1.06 .23-1.06a1.78 1.78 0 0 1 1.5-1.39 16.07 16.07 0 0 1 .79-.07 5.06 5.06 0 0 0 4.67-5.04c0-2.79-2.27-5.05-5.05-5.05z\"],\"color\":\"#E6007A\"},{\"id\":\"brand-cosmos\",\"label\":\"Cosmos\",\"set\":\"crypto\",\"paths\":[\"M12 24C5.37 24 0 18.63 0 12S5.37 0 12 0s12 5.37 12 12-5.37 12-12 12zm-1.2-6.31c.32 1.36 .75 2.2 1.22 2.2 .75 0 1.38-2.08 1.64-5.02 2.67 1.25 4.79 1.74 5.17 1.1 .37-.65-1.11-2.24-3.52-3.94 2.42-1.68 3.91-3.27 3.54-3.92-.24-.42-1.21-.36-2.59 .06a.53 .53 0 0 0-.46-.27 .55 .55 0 0 0-.53 .62c-.5 .19-1.04 .42-1.6 .68-.25-2.94-.89-5.03-1.64-5.03-.75 0-1.38 2.08-1.64 5.02-2.67-1.25-4.79-1.74-5.17-1.09-.23 .41 .26 1.18 1.25 2.12a.57 .57 0 0 0-.02 .14c0 .31 .24 .55 .54 .55a.52 .52 0 0 0 .21-.04 23.72 23.72 0 0 0 1.54 1.17c-2.42 1.68-3.91 3.27-3.54 3.92 .37 .65 2.5 .16 5.18-1.08 .06 .66 .13 1.28 .22 1.84a.56 .56 0 0 0-.23 .46c0 .27 .18 .49 .43 .54zm.35-.05a.56 .56 0 0 0 .3-.5 .55 .55 0 0 0-.51-.55c-.09-.6-.16-1.25-.2-1.91a32.57 32.57 0 0 0 1.28-.65c.44 .24 .88 .46 1.3 .67a32.22 32.22 0 0 1-.28 2.18c-.37 2.11-.89 2.55-.89 2.55-.11 .15-.22 .04-.22 .04-.45-.52-.67-1.48-.67-1.48a6.89 6.89 0 0 1-.1-.35zm-3.69-7.05a.57 .57 0 0 0 .06-.25c0-.31-.24-.55-.54-.55a.52 .52 0 0 0-.32 .11c-1.04-1-1.13-1.49-1.13-1.49v0c-.07-.17 .08-.21 .08-.21 .67-.13 1.62 .16 1.62 .16 .89 .2 2.02 .68 3.12 1.21a32.52 32.52 0 0 0-.07 1.44c-.43 .26-.84 .53-1.23 .79a34.02 34.02 0 0 1-1.59-1.21zM15.42 8.84a.53 .53 0 0 0 .37 .16c.27 0 .49-.2 .53-.47 1.37-.43 1.93-.38 2.12-.33a.14 .14 0 0 1 .1 .15c-.04 .4-.75 1.13-.75 1.13a22.14 22.14 0 0 1-2.79 2.33 32.48 32.48 0 0 0-1.25-.81 32.51 32.51 0 0 0-.07-1.45 30.41 30.41 0 0 1 1.73-.71zm-.43 3.39c2.99 2.17 3.47 3.14 3.54 3.43a.14 .14 0 0 1-.08 .16c-.37 .17-1.35-.08-1.35-.08a22.21 22.21 0 0 1-3.42-1.25c.04-.47 .06-.97 .08-1.48 .43-.26 .84-.53 1.23-.79zm-4.73 .39a28.87 28.87 0 0 1-.89-.6c.3-.2 .6-.39 .89-.57a35.64 35.64 0 0 0 0 1.17zm.01 .4c.02 .5 .04 .99 .07 1.45a31.95 31.95 0 0 1-2.05 .85c-2.02 .73-2.66 .5-2.66 .5-.18-.02-.14-.18-.14-.18 .23-.64 .95-1.32 .95-1.32 .62-.67 1.6-1.41 2.61-2.09 .39 .26 .79 .53 1.22 .79zm3.5-1.59c.38 .23 .61 .37 .61 .37 .11 .08 .22 .15 .32 .23-.36 .25-.67 .45-.93 .61a35.58 35.58 0 0 0 0-1.21zm-.42 2.91c-.39-.19-.73-.36-.99-.5a35.63 35.63 0 0 0 1.07-.61c-.02 .38-.04 .76-.08 1.11zm-2.69-1.09a35.69 35.69 0 0 0 1.01 .58c-.33 .17-.65 .32-.96 .47a40.41 40.41 0 0 1-.05-1.05zm-.01-.39a53.86 53.86 0 0 1-.02-1.64 53.97 53.97 0 0 1 1.37-.81c.55 .3 1.04 .58 1.44 .81 0 .25 0 .39 0 .39a19.94 19.94 0 0 1 0 1.22c-.24 .14-.37 .22-.37 .22a20.02 20.02 0 0 1-1.05 .6c-.24-.13-.37-.22-.37-.22a19.5 19.5 0 0 1-.99-.57zm1.75-2.66c.39-.22 .63-.34 .63-.34 .12-.05 .23-.11 .35-.16 .04 .43 .05 .8 .07 1.11a35.6 35.6 0 0 0-1.04-.6zm-1.71-.48c.32 .16 .64 .33 .95 .49a35.69 35.69 0 0 0-.99 .57c.01-.45 .02-.71 .02-.71l.03-.34zm.04-.4c.38-3.67 .98-4.58 1.19-4.79a.14 .14 0 0 1 .18-.01c.33 .23 .61 1.21 .61 1.21 .35 1.3 .54 2.57 .64 3.59a33.42 33.42 0 0 0-1.31 .67 32.37 32.37 0 0 0-1.3-.67zm1.28 3.59a.93 .93 0 1 0 0-1.85 .93 .93 0 0 0 0 1.85z\"],\"color\":\"#2E3148\"},{\"id\":\"brand-przelewy24\",\"label\":\"Przelewy24\",\"set\":\"brand\",\"paths\":[\"M2.89 16.38L0.00 16.38L0.00 7.82L4.12 7.82Q5.32 7.82 6.20 8.21Q7.07 8.60 7.55 9.33Q8.02 10.06 8.02 11.05L8.02 11.05Q8.02 12.04 7.55 12.76Q7.07 13.48 6.20 13.88Q5.32 14.28 4.12 14.28L4.12 14.28L1.60 14.28L2.89 13.04L2.89 16.38M2.89 8.73L2.89 13.36L1.60 12.05L3.94 12.05Q4.54 12.05 4.83 11.78Q5.11 11.51 5.11 11.05L5.11 11.05Q5.11 10.58 4.83 10.31Q4.54 10.04 3.94 10.04L3.94 10.04L1.60 10.04L2.89 8.73M15.35 16.38L8.49 16.38L8.49 14.61L11.58 11.74Q11.88 11.46 12.02 11.25Q12.16 11.05 12.21 10.88Q12.26 10.72 12.26 10.57L12.26 10.57Q12.26 10.25 12.05 10.07Q11.84 9.90 11.43 9.90L11.43 9.90Q11.05 9.90 10.70 10.10Q10.36 10.30 10.17 10.69L10.17 10.69L7.99 9.60Q8.45 8.72 9.38 8.17Q10.31 7.62 11.69 7.62L11.69 7.62Q12.71 7.62 13.49 7.95Q14.28 8.28 14.72 8.88Q15.16 9.48 15.16 10.30L15.16 10.30Q15.16 10.72 15.05 11.13Q14.95 11.55 14.63 12.01Q14.31 12.46 13.69 13.03L13.69 13.03L11.36 15.14L10.91 14.14L15.35 14.14L15.35 16.38M24.00 14.91L15.62 14.91L15.62 13.08L19.25 7.82L22.21 7.82L18.72 13.08L17.37 12.67L24.00 12.67L24.00 14.91M22.86 16.38L20.06 16.38L20.06 14.91L20.15 12.67L20.15 11.36L22.86 11.36L22.86 16.38\"],\"color\":\"#D13239\"},{\"id\":\"brand-payu\",\"label\":\"PayU\",\"set\":\"brand\",\"paths\":[\"M2.14 14.25L0.00 14.25L0.00 7.89L3.06 7.89Q3.95 7.89 4.60 8.18Q5.25 8.48 5.60 9.02Q5.96 9.56 5.96 10.29L5.96 10.29Q5.96 11.03 5.60 11.56Q5.25 12.10 4.60 12.40Q3.95 12.69 3.06 12.69L3.06 12.69L1.19 12.69L2.14 11.77L2.14 14.25M2.14 8.58L2.14 12.01L1.19 11.04L2.93 11.04Q3.37 11.04 3.58 10.84Q3.80 10.64 3.80 10.29L3.80 10.29Q3.80 9.95 3.58 9.75Q3.37 9.55 2.93 9.55L2.93 9.55L1.19 9.55L2.14 8.58M11.42 14.25L9.51 14.25L9.51 13.37L9.37 13.14L9.37 11.46Q9.37 11.10 9.14 10.91Q8.92 10.72 8.42 10.72L8.42 10.72Q8.08 10.72 7.74 10.82Q7.39 10.93 7.15 11.11L7.15 11.11L6.50 9.76Q6.93 9.48 7.54 9.34Q8.15 9.19 8.73 9.19L8.73 9.19Q10.01 9.19 10.71 9.77Q11.42 10.34 11.42 11.58L11.42 11.58L11.42 14.25M8.10 14.34L8.10 14.34Q7.49 14.34 7.09 14.13Q6.68 13.93 6.47 13.58Q6.26 13.23 6.26 12.80L6.26 12.80Q6.26 12.32 6.50 11.98Q6.75 11.65 7.25 11.47Q7.76 11.30 8.53 11.30L8.53 11.30L9.57 11.30L9.57 12.29L8.86 12.29Q8.53 12.29 8.38 12.40Q8.23 12.50 8.23 12.71L8.23 12.71Q8.23 12.88 8.36 12.99Q8.49 13.11 8.72 13.11L8.72 13.11Q8.93 13.11 9.11 12.99Q9.28 12.88 9.37 12.64L9.37 12.64L9.63 13.24Q9.51 13.80 9.13 14.07Q8.75 14.34 8.10 14.34M13.22 16.11L13.22 16.11Q12.81 16.11 12.39 15.98Q11.96 15.86 11.71 15.66L11.71 15.66L12.39 14.25Q12.55 14.37 12.74 14.44Q12.94 14.52 13.12 14.52L13.12 14.52Q13.39 14.52 13.54 14.40Q13.68 14.29 13.77 14.06L13.77 14.06L13.98 13.54L14.13 13.34L15.72 9.28L17.66 9.28L15.62 14.35Q15.34 15.03 14.98 15.42Q14.63 15.80 14.18 15.95Q13.74 16.11 13.22 16.11M15.13 13.15L13.70 14.48L11.54 9.28L13.64 9.28L15.13 13.15M20.90 14.40L20.90 14.40Q19.44 14.40 18.62 13.61Q17.80 12.82 17.80 11.39L17.80 11.39L17.80 7.89L19.95 7.89L19.95 11.33Q19.95 12.05 20.21 12.36Q20.48 12.66 20.92 12.66L20.92 12.66Q21.37 12.66 21.63 12.36Q21.89 12.05 21.89 11.33L21.89 11.33L21.89 7.89L24.00 7.89L24.00 11.39Q24.00 12.82 23.18 13.61Q22.36 14.40 20.90 14.40\"],\"color\":\"#A6C307\"},{\"id\":\"brand-mypaysafecard\",\"label\":\"myPaysafecard\",\"set\":\"brand\",\"paths\":[\"M6.14 14.86C4.62 13.33 3.38 12.02 3.38 11.92C3.38 11.83 4.64 10.49 6.2 8.94L9.02 6.11L11.78 8.87C13.29 10.38 14.6 11.63 14.69 11.62C14.77 11.62 14.83 10.46 14.81 9.05C14.8 7.63 14.79 6.39 14.8 6.28C14.82 6.05 20.44 11.65 20.44 11.91C20.44 12.16 14.81 17.77 14.81 17.53C14.8 17.43 14.8 16.18 14.8 14.77C14.79 13.35 14.73 12.19 14.66 12.19C14.59 12.19 13.31 13.41 11.81 14.91C10.32 16.4 9.05 17.62 9 17.62C8.95 17.62 7.66 16.38 6.14 14.86Z\"],\"color\":\"#008AC9\"},{\"id\":\"brand-zen\",\"label\":\"ZEN\",\"set\":\"brand\",\"paths\":[\"M9.94 19.77C8.29 19.31 7.34 18.77 6.16 17.61C5.42 16.89 4.85 16.1 4.45 15.25C3.88 14.05 3.85 13.84 3.84 11.91C3.84 9.97 3.88 9.77 4.45 8.55C5.31 6.75 7 5.12 8.73 4.41C10.39 3.74 12.7 3.54 13.18 4.02C13.91 4.74 13.44 5.32 12.1 5.36C10.98 5.4 10.43 5.69 10.56 6.19C10.68 6.67 10.37 7.09 9.59 7.49C8.74 7.92 7.56 9.18 7.2 10.05C7.06 10.39 6.94 11.21 6.94 11.85C6.95 14.72 9.02 16.77 11.91 16.77C14.02 16.77 15.64 15.72 16.52 13.78C17.01 12.71 16.98 12.03 16.44 11.82C15.72 11.55 15 10.55 15 9.82C15 7.59 17.55 6.61 19.08 8.25C19.71 8.92 20.13 10.84 20.01 12.42C19.75 15.73 17.78 18.33 14.64 19.51C13.26 20.03 11.26 20.14 9.94 19.77ZM14.26 5.64C13.88 4.93 14.65 4.11 15.35 4.49C16.19 4.93 15.94 6 15 6C14.65 6 14.38 5.87 14.26 5.64Z\"],\"color\":\"#00C38A\"},{\"id\":\"brand-skrill\",\"label\":\"Skrill\",\"set\":\"brand\",\"paths\":[\"M3.56 14.83C3.21 14.74 3.08 14.56 3.04 14.13L2.98 13.56L4.26 13.58C5.39 13.59 5.53 13.55 5.53 13.24C5.53 12.97 5.31 12.83 4.65 12.66C3.6 12.39 3.28 12.15 3.03 11.44C2.8 10.77 3.25 9.77 3.94 9.43C4.43 9.18 5.98 9.11 6.7 9.31C7.04 9.39 7.12 9.55 7.12 10.06C7.12 10.74 7.11 10.74 5.77 10.38C5.25 10.24 4.69 10.49 4.69 10.87C4.69 11.13 4.89 11.24 5.55 11.34C6.7 11.51 7.31 12.11 7.31 13.07C7.31 13.47 7.18 13.98 7.03 14.2C6.56 14.87 4.83 15.18 3.56 14.83ZM7.88 12.12L7.88 9.42L8.46 9.3C8.78 9.24 9.12 9.19 9.2 9.19C9.29 9.19 9.38 9.84 9.41 10.64L9.47 12.09L9.83 11.39C10.17 10.74 10.26 10.69 11 10.69C11.95 10.69 11.99 10.83 11.34 11.97C10.91 12.73 10.9 12.81 11.16 13.33C11.32 13.63 11.53 14.08 11.62 14.34C11.8 14.8 11.79 14.81 10.91 14.81C10.06 14.81 10 14.78 9.78 14.16C9.65 13.8 9.48 13.5 9.4 13.5C9.32 13.5 9.3 13.8 9.34 14.16C9.42 14.81 9.42 14.81 8.65 14.81L7.88 14.81L7.88 12.12ZM12.19 13.3C12.19 11.87 12.22 11.75 12.74 11.24C13.14 10.83 13.46 10.69 13.95 10.69C14.58 10.69 14.62 10.73 14.62 11.25C14.62 11.69 14.51 11.86 14.16 12C13.72 12.17 13.69 12.26 13.69 13.5L13.69 14.81L12.94 14.81L12.19 14.81L12.19 13.3ZM15.04 12.8L15.09 10.78L15.84 10.78L16.59 10.78L16.65 12.8L16.7 14.81L15.84 14.81L14.99 14.81L15.04 12.8ZM17.25 12.12L17.25 9.42L17.84 9.3C18.16 9.24 18.5 9.19 18.59 9.19C18.68 9.19 18.75 10.45 18.75 12L18.75 14.81L18 14.81L17.25 14.81L17.25 12.12ZM19.31 12.2C19.31 10.76 19.38 9.55 19.45 9.5C19.53 9.46 19.87 9.36 20.2 9.29L20.81 9.16L20.81 11.99L20.81 14.81L20.06 14.81L19.31 14.81L19.31 12.2ZM15.29 10.02C14.91 9.63 14.92 9.5 15.39 9.08C15.68 8.82 15.85 8.78 16.09 8.93C16.5 9.19 16.59 9.69 16.31 10.04C16.01 10.39 15.66 10.39 15.29 10.02Z\"],\"color\":\"#862165\"},{\"id\":\"brand-neteller\",\"label\":\"Neteller\",\"set\":\"brand\",\"paths\":[\"M1.99 13.34C1.93 13.25 2.03 12.55 2.22 11.79C2.52 10.55 2.61 10.4 3.04 10.35C3.46 10.3 3.57 10.4 3.85 11.15C4.03 11.62 4.24 12 4.32 12C4.39 12 4.51 11.62 4.58 11.16L4.71 10.31L7.89 10.31C10.9 10.31 11.06 10.33 11.06 10.68C11.06 10.93 10.91 11.06 10.55 11.1C9.91 11.17 9.85 11.69 10.46 11.78C11.04 11.86 10.89 12.27 10.25 12.34C9.96 12.38 9.75 12.52 9.75 12.68C9.75 12.89 9.94 12.95 10.54 12.9C11.32 12.84 11.34 12.83 11.48 12C11.74 10.41 11.79 10.31 12.31 10.31C12.79 10.31 12.8 10.33 12.67 11.25C12.61 11.77 12.5 12.33 12.44 12.49C12.35 12.71 12.43 12.77 12.77 12.72C13.15 12.66 13.24 12.5 13.4 11.53C13.58 10.48 13.63 10.4 14.14 10.34C14.64 10.29 14.67 10.32 14.57 10.81C14.19 12.76 14.19 12.75 14.57 12.75C14.86 12.75 14.99 12.52 15.2 11.58L15.47 10.41L16.47 10.35C17.34 10.3 17.46 10.33 17.41 10.62C17.37 10.8 17.14 11 16.89 11.06C16.3 11.2 16.16 11.62 16.67 11.75C17.22 11.9 17.16 12.34 16.59 12.41C15.81 12.51 15.97 12.84 16.82 12.9C17.69 12.96 17.63 13.06 17.95 11.25C18.1 10.44 18.13 10.4 18.83 10.35C19.88 10.26 20.42 10.45 20.66 10.97C20.83 11.34 20.8 11.52 20.51 11.95C20.32 12.23 20.16 12.68 20.16 12.94C20.16 13.59 19.29 13.62 19.13 12.97C19.08 12.74 18.95 12.54 18.84 12.54C18.74 12.54 18.61 12.74 18.55 12.97L18.45 13.41L13.52 13.46L8.59 13.51L8.72 12.38C8.83 11.44 8.8 11.25 8.57 11.25C8.38 11.25 8.24 11.52 8.16 12.05C7.92 13.59 8.06 13.5 5.9 13.5L3.95 13.5L3.73 12.75C3.6 12.34 3.45 12 3.38 12C3.31 12 3.18 12.32 3.08 12.7C2.95 13.21 2.79 13.42 2.5 13.46C2.28 13.5 2.05 13.44 1.99 13.34ZM6.86 12.73C6.93 12.61 7.05 12.23 7.13 11.88C7.26 11.32 7.23 11.24 6.84 11.14C6.6 11.08 6.25 11.06 6.06 11.1C5.65 11.17 5.6 11.72 6 11.72C6.15 11.72 6.3 11.87 6.34 12.05C6.39 12.29 6.28 12.38 5.93 12.38C5.45 12.38 5.17 12.6 5.38 12.82C5.58 13.02 6.72 12.95 6.86 12.73ZM19.69 11.52C19.69 11.17 19.32 10.98 19.08 11.22C18.8 11.5 19.05 12.02 19.4 11.88C19.56 11.82 19.69 11.66 19.69 11.52Z\"],\"color\":\"#8DC640\"},{\"id\":\"brand-blik\",\"label\":\"BLIK\",\"set\":\"brand\",\"paths\":[\"M9.64 19.99C8.23 19.33 7.19 18.16 6.74 16.72C6.41 15.64 6.38 14.96 6.38 9.82L6.38 4.11L7.83 4.16L9.28 4.22L9.33 7.19C9.38 9.86 9.42 10.15 9.69 10.04C11.86 9.21 14.12 9.66 15.68 11.23C16.58 12.12 17 12.93 17.24 14.19C17.68 16.5 16.27 19.04 13.98 20.08C12.84 20.6 10.86 20.56 9.64 19.99ZM13.12 17.35C14.7 16.53 14.98 14.45 13.69 13.16C11.94 11.41 8.82 13.05 9.27 15.48C9.4 16.19 10.18 17.2 10.77 17.44C11.39 17.7 12.54 17.65 13.12 17.35ZM13.99 8.24C11.67 7.55 11.7 4.01 14.04 3.38C17.01 2.58 18.67 6.81 15.88 8.07C15.02 8.46 14.79 8.48 13.99 8.24Z\"],\"color\":\"#000000\"},{\"id\":\"brand-paysafecard\",\"label\":\"paysafecard\",\"set\":\"brand\",\"paths\":[\"M6.92 20.38C5.87 19.68 5.82 19.42 5.82 15.12C5.81 10.63 5.92 10.18 7.16 9.54C7.85 9.19 8.2 9.17 12.19 9.22C18.26 9.3 18.09 9.14 18.09 15.09C18.09 21.01 18.3 20.81 11.94 20.81C7.69 20.81 7.54 20.8 6.92 20.38ZM6.08 8.21C6.53 4.8 9.66 2.43 12.93 3.03C14.9 3.4 16.36 4.52 17.19 6.31C17.63 7.26 17.99 9.19 17.74 9.19C17.67 9.19 17.29 9.02 16.89 8.82C16.4 8.57 16.1 8.25 15.95 7.84C15.62 6.89 14.32 5.68 13.25 5.32C11.19 4.64 8.82 5.72 7.98 7.73C7.78 8.21 7.45 8.55 6.94 8.81C6.54 9.02 6.15 9.19 6.08 9.19C6.01 9.19 6.01 8.75 6.08 8.21Z\"],\"color\":\"#008AC9\"},{\"id\":\"crypto-coins\",\"label\":\"Crypto coins\",\"set\":\"crypto\",\"paths\":[\"M11.01 19.86C9.56 19.52 8.33 18.51 7.79 17.21C7.19 15.77 7.6 13.57 8.68 12.4C9.27 11.77 10.39 11.25 11.4 11.13C14.68 10.74 17.14 13.91 16.02 17.09C15.33 19.04 13.01 20.33 11.01 19.86ZM13.88 18.91C16.57 17.4 16.43 13.4 13.64 11.98C13.03 11.67 12.62 11.6 11.62 11.66C10.17 11.74 9.34 12.24 8.48 13.55C7.47 15.07 7.99 17.63 9.52 18.72C10.73 19.58 12.55 19.66 13.88 18.91ZM10.35 18.64C8.55 17.74 7.86 15.71 8.76 13.97C9.23 13.05 9.65 12.66 10.55 12.29C11.76 11.78 13.36 12.04 14.31 12.9C15.24 13.74 15.65 15.57 15.18 16.82C14.73 17.98 13.13 19.11 11.9 19.12C11.58 19.12 10.88 18.91 10.35 18.64ZM11.46 18.05C11.48 17.73 11.49 17.73 11.57 18.05C11.67 18.45 12.19 18.49 12.19 18.1C12.19 17.94 12.4 17.77 12.66 17.7C13.56 17.48 13.97 16.38 13.4 15.74C13.16 15.48 13.15 15.34 13.34 14.93C13.63 14.28 13.31 13.55 12.66 13.39C12.4 13.33 12.19 13.16 12.19 13.02C12.19 12.57 11.79 12.51 11.68 12.95L11.56 13.38L11.39 12.92L11.21 12.47L11.05 12.89C10.96 13.14 10.73 13.31 10.51 13.31C10.3 13.31 10.12 13.4 10.12 13.5C10.12 13.6 10.21 13.69 10.31 13.69C10.59 13.69 10.56 17.2 10.28 17.29C9.95 17.4 10.28 17.81 10.7 17.81C10.9 17.81 11.06 17.94 11.06 18.09C11.06 18.49 11.43 18.45 11.46 18.05ZM11.06 16.41L11.06 15.56L11.88 15.56C12.68 15.56 13.31 15.96 13.31 16.45C13.31 16.91 12.7 17.25 11.89 17.25L11.06 17.25L11.06 16.41ZM11.06 14.44C11.06 13.69 11.06 13.69 11.8 13.69C12.48 13.69 13.12 14.05 13.12 14.44C13.12 14.83 12.48 15.19 11.8 15.19C11.06 15.19 11.06 15.19 11.06 14.44ZM6.84 12.55C5.99 12.3 4.78 11.18 4.3 10.19C2.9 7.3 5.05 3.93 8.29 3.94C9.32 3.94 10.94 4.55 11.4 5.11C11.83 5.63 11.28 5.69 10.69 5.18C10 4.6 8.41 4.26 7.46 4.48C4.71 5.13 3.49 8.26 5.08 10.59C5.59 11.33 6.56 12.01 7.32 12.16C7.64 12.23 7.89 12.37 7.89 12.47C7.9 12.72 7.52 12.75 6.84 12.55ZM15.89 12.64C15.67 12.42 15.94 12.19 16.38 12.19C16.96 12.19 18.21 11.34 18.72 10.6C19.68 9.2 19.69 7.57 18.75 6.16C16.66 3 11.59 4.45 11.55 8.23C11.55 8.85 11.67 9.53 11.85 9.89C12.02 10.22 12.08 10.54 11.99 10.6C11.7 10.78 11.2 9.75 11.1 8.8C10.69 4.5 15.92 2.22 18.82 5.44C20.66 7.47 20.14 10.71 17.76 12.16C17.08 12.57 16.08 12.83 15.89 12.64ZM6.84 11.55C5.8 11.1 4.69 9.44 4.69 8.34C4.69 7.35 5.71 5.71 6.63 5.21C7.84 4.57 9.32 4.7 10.47 5.57C10.96 5.94 11.07 6.13 10.97 6.44C10.52 7.89 10.52 8.76 10.96 10.22C11.05 10.54 10.87 10.69 9.77 11.2C8.36 11.86 7.72 11.94 6.84 11.55ZM13.88 11.14C12.9 10.65 12.59 10.38 12.33 9.81C11.56 8.09 12.29 5.98 13.96 5.11C14.69 4.74 16.26 4.74 16.99 5.12C18.08 5.68 19.12 7.26 19.12 8.34C19.12 8.95 18.65 10.04 18.13 10.63C16.96 11.96 15.78 12.1 13.88 11.14ZM16.56 10.24C17.87 8.45 17.75 8.34 15.84 9.55C15.5 9.76 15.34 9.72 14.59 9.21C13.67 8.58 13.5 8.52 13.5 8.81C13.5 9.1 15.26 11.44 15.48 11.44C15.59 11.44 16.07 10.9 16.56 10.24ZM15.12 10.53C14.72 10.08 14.73 9.88 15.15 10.1C15.36 10.22 15.6 10.21 15.8 10.1C16.23 9.86 16.22 10.17 15.78 10.57C15.46 10.86 15.42 10.86 15.12 10.53ZM7.31 9.66C7.66 9.3 8.12 9 8.33 9C8.53 9 9.02 9.31 9.41 9.69C9.8 10.07 10.18 10.32 10.26 10.24C10.45 10.05 8.73 8.44 8.34 8.44C8.17 8.44 7.6 8.86 7.06 9.37C6.48 9.93 6.21 10.31 6.39 10.31C6.55 10.31 6.96 10.02 7.31 9.66ZM16.27 8.82C17.56 8.14 17.54 8.24 16.58 6.68C16.09 5.9 15.6 5.25 15.49 5.25C15.3 5.26 13.42 8.06 13.54 8.15C13.85 8.38 15.32 9.18 15.43 9.19C15.51 9.19 15.89 9.02 16.27 8.82ZM14.76 8.38L14.08 7.97L14.72 6.96C15.07 6.41 15.39 5.93 15.43 5.88C15.5 5.81 16.88 7.78 16.88 7.96C16.88 8.01 16.55 8.22 16.16 8.42L15.44 8.79L14.76 8.38ZM9.65 7.32C10.58 6.37 10.36 6.07 9.41 7C9.02 7.38 8.53 7.69 8.33 7.69C8.12 7.69 7.66 7.39 7.31 7.03C6.96 6.67 6.55 6.38 6.39 6.38C6.22 6.38 6.43 6.71 6.94 7.22C8.03 8.33 8.64 8.36 9.65 7.32Z\"]}];\n\nconst BY_ID = new Map(STUDIO_ICONS.map((i) => [i.id, i]));\n\nexport function studioIcon(id: string): StudioIcon | undefined {\n  return BY_ID.get(id);\n}\n"}}