openvibers/openvibe.shared Commits

Shared 4.214.0: release train for #481, #479, #482 and #484 (#485)

OP OpenVibers committed 1 days ago · e4306f4f71 · 43 files, +1878 −121

* 4.213.0: one inline comment thread for every site

Move the inline Community thread into openvibe-shared/thread beside the
composer: thread.renderThread carries MediaHub's Video and Pics renderer
and Community's paste and /c options (attachmentsAllowed, draft), and
thread-inline.css carries the look both sites had copied. The stylesheet
is listed in files.js STYLES, so serve.url gives it the same content-hashed
/shared URL as the package's other CSS. Carries both sites' renderer tests.

Follows 4.212.0.

* Merge remote-tracking branch 'origin/main' into feat/shared-inline-thread

# Conflicts:
#	CHANGELOG.md
#	README.md
#	STATUS.json
#	package-lock.json
#	package.json

* Shared 4.214.0: the Arrange editor, on the real parts

* Arrange: docked sizes, role-hidden parts and the person's own overlay look

* Arrange: keep the tab on the parts, undo a reset, and one core load

* Arrange: a long press is the sheet, and the suggestion names its model

* Shared 4.214.0: status, exports and the SDK 0.151.0 locker core

* Pin the SDK commit the editor's core is generated from

* Test: the locker core loads in Node too

* Docs: name the SDK review commit until v0.151.0 is released

* Docs: the Arrange editor

* 4.215.0: take the next free version

#480 claims 4.213.0 and #481 4.214.0 on main; this branch follows 4.212.0
and takes 4.215.0 so the three release in order without a version clash.
No code change.

* 4.216.0: the bar's first paint follows the sign-in hint

When ov_sso_hint says account, navbar.js draws the signed-in shape at once: a
neutral placeholder avatar, and the account's own name only when the hint
carries account:<username>. The session check replaces it or corrects the bar
to guest; an explicit guest hint keeps the guest bar and starts no silent
round trip. The hint is never authorization and is not remembered as an
account. sso-client stores the name after a FedCM sign-in when the response
has one.

* sso-client: test the named hint and refresh the sibling revision

* Merge origin/main: SDK 0.150.0 on main, the editor's reviewed 0.151.0

* README: the status line names 4.216.0

* Arrange: Reset to default clears the stored layout

* 4.215.0: the changelog entry sits above 4.212.0

* Merge remote-tracking branch 'origin/main' into feat/shared-inline-thread

* Generate the core from the SDK commit's latest ui-layout

* Merge remote-tracking branch 'origin/main' into signin-flash-1111

* Glyphs: care, fish, handshake and eye-off redrawn for 16 px

The last four the 11-11 glyph review named weak at 16 px (bridge and focus came
in 4.212.0): care keeps its heart 2.5 units clear of an open hand; fish has an
open V tail and a dot eye that no longer merge with the body; handshake drops the
three tiny finger strokes and gets its first solid twin; eye-off breaks the
outline where the slash crosses, so the slash no longer crowds the lid. The
drop-in, sprite, fonts, sibling hashes and the ink fixture are rebuilt; every
icon is within the set size (long side 0.79). For the next Shared train.

* Merge branch 'pr481' into release/shared-4214

# Conflicts:
#	CHANGELOG.md
#	README.md
#	STATUS.json
#	navbar.js
#	package-lock.json
#	package.json

* Merge branch 'pr479' into release/shared-4214

# Conflicts:
#	CHANGELOG.md
#	README.md
#	STATUS.json
#	package-lock.json
#	package.json

* Merge branch 'pr482' into release/shared-4214

# Conflicts:
#	CHANGELOG.md
#	README.md
#	STATUS.json
#	navbar.js
#	package-lock.json
#	package.json

* Merge branch 'pr484' into release/shared-4214

# Conflicts:
#	navbar.js

* Shared 4.214.0: release train for #481, #479, #482 and #484

The Arrange editor (#481), one inline comment thread for every site (#479),
the bar first paint following the sign-in hint (#482) and four redrawn glyphs
(#484). The SDK dev pin is v0.152.0 (ui-layout), not a PR commit; the arrange
and locker cores are regenerated from it; the arrange exports are kept.
ov test --all: 223 passed before the status files, then the affected set.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 2fd558d..7582b08 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,39 @@
# Changelog
++## 4.214.0 — 2026-11-11
++
++A train of four pull requests: the Arrange editor (#481), one inline comment thread for every site (#479), the bar's first paint following the sign-in hint (#482) and four redrawn glyphs (#484).
++
++- **The Arrange editor: a person's own controls, on the real parts.** `ov-arrange.js` is loaded only when someone
++ presses Arrange, and loads `ov-arrange-core.js` (openvibe-sdk/ui-layout for the browser, generated by
++ `scripts/build-arrange-core.js`) from beside itself by content hash. A surface's `[data-ov-part]` elements are
++ placed from a ui.layout@1: drag to move on the grid, the corner to resize, arrows to move and Shift with the
++ arrows to resize (a docked overlay chooses an edge the same way). The part's sheet has visible, size, tint, shape,
++ opacity, label and bindings; long press opens it on a phone. The SDK rules refuse a bad move with the reason in
++ plain words (Stop has to stay visible; it is too small), every move and resize is announced, and Undo, Reset to
++ default, Save and Share are in the bar. Ask OpenVibe's ui.layout.suggestion is previewed on the real parts and
++ applied only with Keep; Motion Off shows no animation and Calm plays the short one. (#481)
++
++- **One inline comment thread for every site: `thread.renderThread` and `thread-inline.css` (new), beside the
++ composer.** MediaHub's Video and Pics item pages and Community's paste and `/c` pages rendered two copies of the
++ same thread; the renderer now lives in `openvibe-shared/thread`, with both sites' options:
++ `attachmentsAllowed` (Pics and a paste page offer files; elsewhere the composer does not) and `draft` (the message
++ kept after a failed post). It draws the quiet head, Top and Newest only when there is something to order, the
++ composer or one sign-in line (the whole empty state when nobody has commented), the comments with their replies,
++ targets, deletions and attachments, More, and the discussion link. The markup is byte-for-byte what the two sites
++ render; each keeps its own post, delete and sign-in routes. The stylesheet is served like the package's other CSS
++ (`/shared/thread-inline.css?v=<content hash>`, `files.js` STYLES), so a site pins one look. Both sites' renderer
++ tests are here; MediaHub and Community delete their copies and pin this release. (#479)
++
++- **The bar's first paint follows the sign-in hint (asks 327, 345).** When `ov_sso_hint` says `account`, navbar.js
++ draws the signed-in shape at once: a neutral placeholder avatar, and the account's own name/initial only when the
++ hint carries it (`account:<username>`); the session check then replaces it or corrects the bar to guest. A failed
++ check no longer leaves the optimistic bar behind, and an explicit `guest` hint keeps the guest bar and starts no
++ silent round trip. The hint is never authorization: it holds no token and is not remembered as an account.
++ sso-client.js stores the name after a FedCM sign-in when the response has one. (#482)
++
++- **Glyphs: care, fish, handshake and eye-off redrawn for 16 px** (the last four the 11-11 glyph review named weak): care keeps its heart clear of an open hand; fish has an open V tail and a dot eye; handshake drops the tiny finger strokes and gets its first solid twin; eye-off breaks the outline where the slash crosses (#484).
++
## 4.213.0 — 2026-11-11
- **The menu button's flight, polished** (the owner, 11-11: "the icon becomes whiter than it was when idle … needs
ddiff --git a/README.md b/README.md
iindex b19ac8a..21a496b 100644
---- a/README.md
++++ b/README.md
@@@ -5,7 +5,7 @@
**Docs:** https://openvibe.services · **For AI:** https://openvibe.network/llms.txt
**Install and test:** `npm ci && npm test`
--**Status:** alpha, v4.213.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
++**Status:** alpha, v4.214.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
consumer installs a tagged release and none keeps a vendored copy
([docs/migration-plan.md](docs/migration-plan.md) is done); each repository's `package.json` names
the tag it pins.
@@@ -1239,5 +1239,5 @@ The Locker browser core currently uses the immutable SDK review commit `80f21232
<!-- versions:start -->
- openvibe-contracts: v0.408.0
--- openvibe-sdk: v0.150.0
++- openvibe-sdk: v0.152.0
<!-- versions:end -->
ddiff --git a/STATUS.json b/STATUS.json
iindex 0694001..3c3b7c1 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -4,12 +4,12 @@
"code": true,
"wave": "W2",
"package": "openvibe-shared",
-- "version": "4.213.0",
++ "version": "4.214.0",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"deployed": false,
"deployment": "none of its own: a package released as git tags; OpenVibe.Network serves /shared/* from its pinned tag, and a site can serve its own pinned copy (openvibe-shared/serve)",
"contracts": "openvibe-contracts v0.408.0 (devDependency: the release manifest contract)",
-- "sdk": "openvibe-sdk v0.150.0",
++ "sdk": "openvibe-sdk v0.152.0",
"features": [
"the Quest guide on any page and the current Live step in the Dock's agent view (4.209.0)",
"one move engine for a floating thing: OVFloat.attach gives the PiP's drag, flick, tuck and kept place to any box, and a panel window adopts it (4.208.0)",
@@@ -62,5 +62,5 @@
"openvibe-shared/config accepts x-unit seconds for an integer owner setting, so an owner form can label the input in seconds",
"a navbar link can be the site's one featured piece (featured: true): a quiet accent pill with its glyph, first in the phone's menu (4.117.0)"
],
-- "updated": "2026-11-11"
++ "updated": "2026-11-12"
}
ddiff --git a/files.js b/files.js
iindex c4eaae1..48f284d 100644
---- a/files.js
++++ b/files.js
@@@ -48,6 +48,8 @@ const BROWSER = Object.freeze([
'ov-labels.js', // content labels (L1): each viewer's show / blur / hide; navbar.js loads it when a page has [data-ov-labels]
'ov-forms.js', // OpenVibe's own select (a menu on a computer, a sheet on a phone); navbar.js loads it when a page has a form control
'ov-qr.js', // a QR code from a link, on the device: the Share sheet's QR code (ov-share.js loads it on first use)
++ 'ov-arrange.js', // the Arrange editor (make your own controls, 2026-11-11): a person moves and resizes a surface's parts; a product loads it when Arrange is pressed
++ 'ov-arrange-core.js', // openvibe-sdk/ui-layout for the browser, generated (scripts/build-arrange-core.js): the one validator
'ov-locker-core.js', // openvibe-sdk/locker for the browser, generated (scripts/build-locker-core.js): WebCrypto only, the SDK's own vectors
'ov-locker.js', // Locker in the browser (plan Q2): a locked item's card, making and unlocking your locker; crypto in ov-locker-core.js
'ov-wallet.js',
@@@ -114,6 +116,7 @@ const STYLES = Object.freeze([
'messages.css', // the room and bubble views' look
'room.css', // kit.card, kit.rail and a room's accent (4.29.1; load after kit.css where cards, rails or sc.room() are)
'thread.css', // the conversation UI's look (openvibe-shared/thread, ov-thread.js; plan L55 C4)
++ 'thread-inline.css', // the inline Community thread's look (openvibe-shared/thread renderThread; 4.215.0)
'kit-layout.css', // the fluid scale, the layout primitives (.ov-stack, .ov-switcher…) and the opt-in .ov-base (4.78.0; after kit.css)
'kit-data.css', // Kit 2's look: steps, tables, charts, rankings, meters, drop zones, receipts (4.37.0; after kit.css)
'agent-session.css', // agent-session.js's look (4.32.0; the script links it from beside itself unless the page does)
ddiff --git a/glyph-fonts/manifest.json b/glyph-fonts/manifest.json
iindex 21a17e1..940c7be 100644
---- a/glyph-fonts/manifest.json
++++ b/glyph-fonts/manifest.json
@@@ -1,22 +1,22 @@
{
"family": "OV Glyphs",
"glyphs": 278,
-- "source_sha256": "d9fec0f9aa6f987778848492219f6139bff1dc2da9739fce9866d3b3764d1214",
++ "source_sha256": "a4d2fb79a53342b1d3733d11d5d2420165c6d495a640dde5889a9f7d425c81f9",
"files": {
-- "ov-glyphs.woff2": 25728,
-- "glyph-fonts/ov-glyphs.ttf": 55028,
-- "glyph-fonts/ov-glyphs.otf": 68960,
-- "ov-glyphs-thin.woff2": 25984,
-- "glyph-fonts/ov-glyphs-thin.ttf": 59512,
-- "glyph-fonts/ov-glyphs-thin.otf": 69776,
-- "ov-glyphs-light.woff2": 26204,
-- "glyph-fonts/ov-glyphs-light.ttf": 59920,
-- "glyph-fonts/ov-glyphs-light.otf": 69668,
-- "ov-glyphs-bold.woff2": 26156,
-- "glyph-fonts/ov-glyphs-bold.ttf": 55012,
-- "glyph-fonts/ov-glyphs-bold.otf": 68152,
-- "ov-glyphs-solid.woff2": 15220,
-- "glyph-fonts/ov-glyphs-solid.ttf": 30996,
-- "glyph-fonts/ov-glyphs-solid.otf": 27916
++ "ov-glyphs.woff2": 25636,
++ "glyph-fonts/ov-glyphs.ttf": 54876,
++ "glyph-fonts/ov-glyphs.otf": 68816,
++ "ov-glyphs-thin.woff2": 25964,
++ "glyph-fonts/ov-glyphs-thin.ttf": 59348,
++ "glyph-fonts/ov-glyphs-thin.otf": 69652,
++ "ov-glyphs-light.woff2": 26112,
++ "glyph-fonts/ov-glyphs-light.ttf": 59772,
++ "glyph-fonts/ov-glyphs-light.otf": 69544,
++ "ov-glyphs-bold.woff2": 26052,
++ "glyph-fonts/ov-glyphs-bold.ttf": 54920,
++ "glyph-fonts/ov-glyphs-bold.otf": 68052,
++ "ov-glyphs-solid.woff2": 15308,
++ "glyph-fonts/ov-glyphs-solid.ttf": 31240,
++ "glyph-fonts/ov-glyphs-solid.otf": 28184
}
}
ddiff --git a/glyph-fonts/ov-glyphs-bold.otf b/glyph-fonts/ov-glyphs-bold.otf
iindex b2d0266..f9bddbc 100644
BBinary files a/glyph-fonts/ov-glyphs-bold.otf and b/glyph-fonts/ov-glyphs-bold.otf differ
ddiff --git a/glyph-fonts/ov-glyphs-bold.ttf b/glyph-fonts/ov-glyphs-bold.ttf
iindex 43cd39d..bb6e2ac 100644
BBinary files a/glyph-fonts/ov-glyphs-bold.ttf and b/glyph-fonts/ov-glyphs-bold.ttf differ
ddiff --git a/glyph-fonts/ov-glyphs-light.otf b/glyph-fonts/ov-glyphs-light.otf
iindex 8cbe7d1..d090009 100644
BBinary files a/glyph-fonts/ov-glyphs-light.otf and b/glyph-fonts/ov-glyphs-light.otf differ
ddiff --git a/glyph-fonts/ov-glyphs-light.ttf b/glyph-fonts/ov-glyphs-light.ttf
iindex bcd3814..a73ee96 100644
BBinary files a/glyph-fonts/ov-glyphs-light.ttf and b/glyph-fonts/ov-glyphs-light.ttf differ
ddiff --git a/glyph-fonts/ov-glyphs-solid.otf b/glyph-fonts/ov-glyphs-solid.otf
iindex 070e786..73cd25a 100644
BBinary files a/glyph-fonts/ov-glyphs-solid.otf and b/glyph-fonts/ov-glyphs-solid.otf differ
ddiff --git a/glyph-fonts/ov-glyphs-solid.ttf b/glyph-fonts/ov-glyphs-solid.ttf
iindex 99d2fe3..ef5411b 100644
BBinary files a/glyph-fonts/ov-glyphs-solid.ttf and b/glyph-fonts/ov-glyphs-solid.ttf differ
ddiff --git a/glyph-fonts/ov-glyphs-thin.otf b/glyph-fonts/ov-glyphs-thin.otf
iindex d42533b..fb7b704 100644
BBinary files a/glyph-fonts/ov-glyphs-thin.otf and b/glyph-fonts/ov-glyphs-thin.otf differ
ddiff --git a/glyph-fonts/ov-glyphs-thin.ttf b/glyph-fonts/ov-glyphs-thin.ttf
iindex fc4a326..eb7f401 100644
BBinary files a/glyph-fonts/ov-glyphs-thin.ttf and b/glyph-fonts/ov-glyphs-thin.ttf differ
ddiff --git a/glyph-fonts/ov-glyphs.otf b/glyph-fonts/ov-glyphs.otf
iindex bae3a9c..e05a694 100644
BBinary files a/glyph-fonts/ov-glyphs.otf and b/glyph-fonts/ov-glyphs.otf differ
ddiff --git a/glyph-fonts/ov-glyphs.ttf b/glyph-fonts/ov-glyphs.ttf
iindex 96e649b..a695457 100644
BBinary files a/glyph-fonts/ov-glyphs.ttf and b/glyph-fonts/ov-glyphs.ttf differ
ddiff --git a/glyphs.js b/glyphs.js
iindex 5a37bf9..fdc8a5a 100644
---- a/glyphs.js
++++ b/glyphs.js
@@@ -49,11 +49,11 @@
puzzle: '<path d="M3.8 7h4.2a2.6 2.6 0 1 1 4.8 0h4.2v4.2a2.6 2.6 0 1 1 0 4.8v4.2h-4.2a2.6 2.6 0 1 0-4.8 0H3.8v-4.2a2.6 2.6 0 1 0 0-4.8Z"/>',
compress: '<path d="M8.8 3.5v5.3H3.5M15.2 3.5v5.3h5.3M8.8 20.5v-5.3H3.5M15.2 20.5v-5.3h5.3"/>',
expand: '<path d="M3.5 8.8V3.5h5.3M20.5 8.8V3.5h-5.3M3.5 15.2v5.3h5.3M20.5 15.2v5.3h-5.3"/>',
-- care: '<path d="M3.3 16.5h3.2l4.2 3.2h5.8a2.2 2.2 0 0 0 0-4.2H12.8M7.5 16.5l2.4-2.2h3.5"/><path d="M16.6 10.6s-3.4-2.2-3.4-4.7a2.1 2.1 0 0 1 3.4-1.4a2.1 2.1 0 0 1 3.4 1.4c0 2.6-3.4 4.7-3.4 4.7Z"/>',
++ care: '<path d="M12 10.6s-3.8-2.3-3.8-5a2.1 2.1 0 0 1 3.8-1.3a2.1 2.1 0 0 1 3.8 1.3c0 2.7-3.8 5-3.8 5Z"/><path d="M3.5 13.5v6.5M3.5 15h3.3l3.4 2.8h7.7a1.8 1.8 0 0 0 0-3.6h-4.1"/>',
city: '<path d="M3.5 19.7h17M5.4 19.7V8.3h4.7v11.3M10.1 19.7V3.6h5.7v16.1M15.8 19.7v-7.6h3.3v7.6M7.8 11.2h0M7.8 14.5h0M12.9 6.9h0M12.9 10.2h0M12.9 13.5h0"/>',
wrench: '<path d="M14.6 3.6a5.2 5.2 0 0 0-4.6 7.3L3.7 17.3V20.3h3.1l6.4-6.4a5.2 5.2 0 0 0 7.3-4.6l-3.2 1.2l-2.5-2.5l1.2-3.2Z"/>',
music: '<path d="M8.6 17.7V5.6l11.1-2.1v12.2"/><circle cx="6" cy="17.7" r="2.6"/><circle cx="17.2" cy="15.7" r="2.6"/>',
-- 'eye-off': '<path d="M3.7 12s3.2-6.1 8.3-6.1c1.5 0 2.7 0.5 4 1.1M20.5 12s-3.2 6.1-8.3 6.1c-1.5 0-2.7-0.5-4-1.1"/><path d="M10.1 9.9a2.7 2.7 0 0 0 3.9 3.9M4.6 4.5l14.9 14.9"/>',
++ 'eye-off': '<path d="M10.6 6.1c0.5-0.1 0.9-0.1 1.4-0.1c5.2 0 8.5 6 8.5 6s-0.6 1.1-1.7 2.4M6.9 7.6C4.7 9.2 3.5 12 3.5 12s3.3 6 8.5 6c1.6 0 3-0.5 4.2-1.2"/><path d="M10 10a2.8 2.8 0 0 0 4 4M4.5 4.5l15 15"/>',
plane: '<path d="M20 4L3.5 10.8l6.6 3.1l3.1 6.6Z"/><path d="M10.1 13.9l9.9-9.9"/>',
fire: '<path d="M12 20.5a6.8 6.8 0 0 0 6.8-6.8c0-4.3-2.9-6.8-4.2-10.1c-2 2.3-2.6 4.5-2.6 4.5S10.7 5.8 9.5 3.8C7 6.6 5.2 10 5.2 13.7a6.8 6.8 0 0 0 6.8 6.8Z"/>',
nodes: '<circle cx="12" cy="5.4" r="2.1"/><circle cx="5.8" cy="17.9" r="2.1"/><circle cx="18.2" cy="17.9" r="2.1"/><path d="M11 7.4L6.8 15.9M13 7.4l4.3 8.6M7.9 17.9h8.3"/>',
@@@ -174,7 +174,7 @@
ear: '<path d="M6.2 9.5a5.7 5.7 0 1 1 10.8 2.4c-0.9 1.9-3.1 3-3.1 5.2a3.4 3.4 0 0 1-6.5 1.6"/><path d="M9.7 9.9a2.4 2.4 0 1 1 3.8 1.5"/>',
eraser: '<path d="M14.3 4.4l5.5 5.5l-9 9H6.6l-2.6-2.6a1.5 1.5 0 0 1 0-2.1Z"/><path d="M9.3 9.4l5.5 5.5M10.8 18.9H20.3"/>',
laugh: '<circle cx="12" cy="12" r="8.5"/><path d="M8 13.5h8a4 4 0 0 1-8 0ZM7.5 8.6l2.2 1.2-2.2 1.2M16.5 8.6l-2.2 1.2 2.2 1.2"/>',
-- fish: '<path d="M8.1 12c1.9-3.1 4.3-4.6 7.2-4.6c2.5 0 4.3 1.9 5.2 4.6c-1 2.7-2.8 4.6-5.2 4.6c-2.9 0-5.2-1.6-7.2-4.6Z"/><path d="M8.1 12L3.7 8.8v6.7Z"/><path d="M16.5 10.7h0"/>',
++ fish: '<path d="M9 12c1.8-3.2 4.3-4.8 7.1-4.8c2.6 0 4.2 2 4.9 4.8c-0.7 2.8-2.3 4.8-4.9 4.8c-2.8 0-5.3-1.6-7.1-4.8Z"/><path d="M9 12L4.2 8.6M9 12l-4.8 3.4M17.3 10.6h0.01"/>',
finish: '<path d="M5.2 20.7V4"/><rect x="5.2" y="4.6" width="13.9" height="8.6" rx="1"/><path d="M5.2 8.8h13.9M9.6 4.6v8.6M14.3 4.6v8.6"/>',
flask: '<path d="M9.5 3.2h4.9M10 3.2V9.2L4.9 17.7a1.5 1.5 0 0 0 1.3 2.3h11.6a1.5 1.5 0 0 0 1.3-2.3L14 9.2V3.2"/><path d="M7.3 14.6h9.5"/>',
'folder-tree': '<path d="M4.1 3.3v13.2a1 1 0 0 0 1 1H9.7M4.1 8.3H9.7"/><path d="M10.2 5.3h3.1l1 1.5h5.6V10.9h-9.7ZM10.2 14.5h3.1l1 1.5h5.6V20.1h-9.7Z"/>',
@@@ -183,7 +183,7 @@
ghost: '<path d="M4.7 20V10.6a7.3 7.3 0 0 1 14.7 0v9.4l-2.4-1.9l-2.5 1.9l-2.4-1.9L9.6 20l-2.5-1.9Z"/><path d="M9.4 10.1h0M14.6 10.1h0"/>',
grip: '<path d="M8.3 4.5h0M15.8 4.5h0M8.3 12h0M15.8 12h0M8.3 19.5h0M15.8 19.5h0" stroke-width="3.8"/>',
hammer: '<path d="M13.1 3.7L19.3 9.9l-2.7 2.7l-6.2-6.2Z"/><path d="M13.6 9.4L5 18.1a1.3 1.3 0 0 0 1.9 1.9l8.6-8.6"/>',
-- handshake: '<path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l6 6a1.2 1.2 0 0 0 1.7-1.6M13.4 15.3l0.5 0.5a1.2 1.2 0 0 0 1.7-1.6M15.6 14.2l0.3 0.3a1.2 1.2 0 0 0 1.7-1.6L18 10.8M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/>',
++ handshake: '<path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l5.6 5.6a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/>',
wizard: '<path d="M3.6 20h16.7M6.3 20L9.9 9.1L15.7 3.3L14.1 10.1L17.8 20"/><path d="M8.4 15.4h7.3"/>',
'heart-broken': '<path d="M11.9 20.3s-8.1-5.1-8.1-11.6a4.6 4.6 0 0 1 8.1-3A4.6 4.6 0 0 1 20 9.2c0 6.5-8.1 11.6-8.1 11.6Z"/><path d="M11.9 5.8L10 9.8l3.5 2.3l-1.6 3.9"/>',
hourglass: '<path d="M6 3.5h12M6 20.5h12M7.5 3.5c0 4.5 4.5 5.5 4.5 8.5s-4.5 4-4.5 8.5M16.5 3.5c0 4.5-4.5 5.5-4.5 8.5s4.5 4 4.5 8.5"/>',
@@@ -232,6 +232,7 @@
// shows the solid one when the icon is 18 px or smaller (pure CSS, see scripts/build-glyphs.js); a glyph without
// one draws its lines heavier there instead.
const SOLID = Object.freeze({
++ handshake: '<path d="M2.3 9.2h2.7v6.8H2.3ZM19 9.2h2.7v6.8H19Z"/><path class="ln" d="M5.6 10.8h0.3l3.4-2.6l2.9 1.3L14.6 8.1l3.4 2.6h0.4M5.9 10.8l5.4 5.4a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.4 12.8l-3.9-3.9l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/>',
focus: '<circle cx="12" cy="12" r="3.6"/><path class="ln" d="M3.8 9V6.1A2.3 2.3 0 0 1 6.1 3.8H9M15 3.8h2.9A2.3 2.3 0 0 1 20.2 6.1V9M20.2 15v2.9a2.3 2.3 0 0 1-2.3 2.3H15M9 20.2H6.1A2.3 2.3 0 0 1 3.8 17.9V15"/>',
// 4.182.0, the last five shapes: a car, a door, a podium, a rocket and a camera that flips. After these, every
// glyph without a solid drawing is one made of lines, which thickens when small instead.
@@@ -244,7 +245,7 @@
// piggy bank), a couch, a coin over a box, two folders on a tree, a chequered flag, and two people.
airplane: '<path d="M11.8 2.6c1.3 0 2 1.2 2 3V9.5l7.2 4.2v2.5L13.8 13.7v3.5l2 1.5v2.5L11.8 19.7l-3.7 1.2v-2.5l2-1.5v-3.5l-7.2 2.5v-2.5L9.8 9.5V5.3c0-1.8 0.7-3 2-3Z"/>',
burst: '<path d="M12.1 2.6l2 4.6l4.7-1.9l-1.9 4.7l4.6 2l-4.6 2l1.9 4.7l-4.7-1.9l-2 4.6l-2-4.6l-4.7 1.9l1.9-4.7L2.7 12l4.6-2l-1.9-4.7l4.7 1.9Z"/>',
-- fish: '<path fill-rule="evenodd" d="M7.6 12c2.1-3.6 4.8-5.4 7.9-5.4 2.9 0 5 2.2 6.1 5.4-1.1 3.2-3.2 5.4-6.1 5.4-3.1 0-5.8-1.8-7.9-5.4ZM15.7 10.6a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/><path d="M8.4 12 2.9 7.4v9.2Z"/>',
++ fish: '<path fill-rule="evenodd" d="M8.7 12c1.9-3.5 4.6-5.3 7.6-5.3c2.8 0 4.6 2.2 5.4 5.3c-0.8 3.1-2.6 5.3-5.4 5.3c-3 0-5.7-1.8-7.6-5.3ZM16.2 10.6a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0Z"/><path class="ln" d="M8.7 12L4.4 8.9M8.7 12l-4.3 3.1"/>',
shoe: '<path d="M3.7 14.5V9.1l3.6-0.5l2.6-3.5l3.5 1.6l-0.8 2.3l3.1 1.7l3.6 0.8a1.9 1.9 0 0 1 1.3 1.8v1.4Z"/><path class="ln" d="M4.2 17h16"/>',
sword: '<path d="M21.2 2.8v4.7l-10.8 10.8l-4.7-4.7L16.5 2.8Z"/><path class="ln" d="M5.2 11.9L12.1 18.8M8.4 15.6L3.7 20.3"/>',
donate: '<path fill-rule="evenodd" d="M12 2.2a5.9 5.9 0 1 0 0 11.8a5.9 5.9 0 0 0 0-11.8Zm-0.8 3.4h1.7v5.1h-1.7ZM2.9 15h18.2v6H2.9ZM7.8 17.1v1.6h8.5V17.1Z"/>',
@@@ -400,7 +401,7 @@
layers: '<path d="M12 4.3l8.6 5l-8.6 5l-8.6-5Z"/><path class="ln" d="M3.9 13.9l8.1 4.5l8.1-4.5"/>',
phone: '<path d="M5.1 2.4h4.9l2.4 6l-2.7 1.6a10.7 10.7 0 0 0 4.2 4.2l1.6-2.7l6 2.4v4.9a2.3 2.3 0 0 1-2.3 2.3A17.3 17.3 0 0 1 2.8 4.6a2.3 2.3 0 0 1 2.3-2.3Z"/>',
money: '<path fill-rule="evenodd" d="M4.8 5.7h14.4a2.1 2.1 0 0 1 2.1 2.1v8.4a2.1 2.1 0 0 1-2.1 2.1H4.8a2.1 2.1 0 0 1-2.1-2.1V7.8a2.1 2.1 0 0 1 2.1-2.1ZM12 8.9a3.1 3.1 0 1 0 0 6.3a3.1 3.1 0 0 0 0-6.3ZM6.3 8.7a1 1 0 1 0 0 2.1a1 1 0 0 0 0-2.1Zm11.4 4.6a1 1 0 1 0 0 2.1a1 1 0 0 0 0-2.1Z"/><circle cx="12" cy="12" r="1.4"/>',
-- care: '<path d="M17 11s-4.1-2.4-4.1-5.4a2.3 2.3 0 0 1 4.1-1.6a2.3 2.3 0 0 1 4.1 1.6c0 2.9-4.1 5.4-4.1 5.4Z"/><path class="ln" d="M3.5 16.2h3.2l4.3 3.2h5.9a2.1 2.1 0 0 0 0-4.3H13.3M7.9 16.2l2.3-2.1h3.6"/>',
++ care: '<path d="M12 11s-4.3-2.6-4.3-5.6a2.3 2.3 0 0 1 4.3-1.5a2.3 2.3 0 0 1 4.3 1.5c0 3-4.3 5.6-4.3 5.6Z"/><path class="ln" d="M3.8 13.8v6M3.8 15.2h3.1l3.3 2.7h7.5a1.7 1.7 0 0 0 0-3.4h-3.9"/>',
news: '<path fill-rule="evenodd" d="M2.8 2.6h14.2v15.2a2.2 2.2 0 0 0 2.2 2.2H5.1A2.2 2.2 0 0 1 2.8 18.9ZM6.6 6.6h6.8v1.7H6.6Zm0 3.7h6.8v1.7H6.6Zm0 3.7h4v1.7H6.6Z"/><path class="ln" d="M17.1 7.7H19.8V17.9a2.1 2.1 0 0 1-2.1 2.1"/>',
hand: '<path d="M9 14.3V4.9a1.4 1.4 0 0 1 2.8 0v5.2a0.5 0.5 0 0 0 1.1 0V3.8a1.4 1.4 0 0 1 2.8 0v6.4a0.5 0.5 0 0 0 1.1 0V5.7a1.4 1.4 0 0 1 2.8 0v7.7c0 4.5-2.8 7.7-7.3 7.7c-2.9 0-4.7-1.5-6.3-4l-1.8-2.9a1.7 1.7 0 0 1 2.8-2Z"/>',
tack: '<path d="M8.5 3h7.2a0.8 0.8 0 0 1 0.8 1l-0.8 4l2.8 2.8a0.7 0.7 0 0 1-0.6 1.4H6.1a0.7 0.7 0 0 1-0.6-1.4l2.8-2.8l-0.8-4a0.8 0.8 0 0 1 0.8-1Z"/><path class="ln" d="M12 12.2V20.5"/>',
ddiff --git a/navbar.js b/navbar.js
iindex af43968..8983290 100644
---- a/navbar.js
++++ b/navbar.js
@@@ -602,7 +602,7 @@
* serves its own pinned copy at /shared/ gets its own), else the network's copy.
*/
// The files loaded from beside this one, by content (scripts/sibling-revs.js): a release changes their URLs.
-- const SIBLING_REV = { 'ov-mark.js': 'f34f731c3a94', 'ov-glyphs.js': 'aee8e54637c2', 'ov-brand.woff2': '3b4e6a8a5878', 'ov-look.js': 'dd84a30bb646', 'ov-fx.js': '947820d69097', 'ov-labels.js': 'd40f7ca14bc4', 'ov-forms.js': '2eb9e2604c3e', 'ov-forms.css': '06208fe89eac', 'ov-share.js': 'd419508a797e', 'ov-share.css': 'd609a71f611a', 'search.js': 'f9f34e3030b0', 'dock.js': 'aa5ad5d80283', 'presence.js': '5f195d41f8c5', 'panels.js': 'd90bfe987d81', 'surfaces.js': 'a94e76bd1200', 'notification-ui.js': '3b6d2e2933de', 'history.js': 'f9fb9e096c65', 'bottom.js': '4bcb219a2624', 'appbar.js': 'c21485176ae9', 'release-watch.js': '25f02a3f0684', 'ov-icons.js': 'aaa688bf6fc7', 'sso-client.js': '52439265b980', 'overlay.js': '2bc56b3cf726', 'ov-home.js': '0724f4913525', 'nav-slots.js': '7b11e6916732', 'ov-wallet.js': '22286b70f8f6', 'ov-wallet.css': 'be8daa24c3a8', 'purse.js': '9d3fea0dae02', 'ov-drop.js': '445689a5eb80', 'ov-tip.js': '1d918e7de69d', 'soft.js': '98ab9b8080b1' };
++ const SIBLING_REV = { 'ov-mark.js': 'f34f731c3a94', 'ov-glyphs.js': '642a391c85d5', 'ov-brand.woff2': '3b4e6a8a5878', 'ov-look.js': 'dd84a30bb646', 'ov-fx.js': '947820d69097', 'ov-labels.js': 'd40f7ca14bc4', 'ov-forms.js': '2eb9e2604c3e', 'ov-forms.css': '06208fe89eac', 'ov-share.js': 'd419508a797e', 'ov-share.css': 'd609a71f611a', 'search.js': 'f9f34e3030b0', 'dock.js': 'aa5ad5d80283', 'presence.js': '5f195d41f8c5', 'panels.js': 'd90bfe987d81', 'surfaces.js': 'a94e76bd1200', 'notification-ui.js': '3b6d2e2933de', 'history.js': 'f9fb9e096c65', 'bottom.js': '4bcb219a2624', 'appbar.js': 'c21485176ae9', 'release-watch.js': '25f02a3f0684', 'ov-icons.js': 'aaa688bf6fc7', 'sso-client.js': 'f574ac3331a5', 'overlay.js': '2bc56b3cf726', 'ov-home.js': '0724f4913525', 'nav-slots.js': '7b11e6916732', 'ov-wallet.js': '22286b70f8f6', 'ov-wallet.css': 'be8daa24c3a8', 'purse.js': '9d3fea0dae02', 'ov-drop.js': '445689a5eb80', 'ov-tip.js': '1d918e7de69d', 'ov-arrange.js': '898af091b3e1', 'soft.js': '98ab9b8080b1' };
const siblingV = (name) => `${sibling(name)}${SIBLING_REV[name] ? `?v=${SIBLING_REV[name]}` : ''}`;
// ov-tip.js loads at the first hover over a tooltip's owner.
@@@ -1822,6 +1822,7 @@
}
let _authInFlight = null;
++ let _hintPainted = false, _hintSettled = false;
function ssoHint() {
const m = (typeof document !== 'undefined' ? document.cookie : '').match(/(?:^|;\s*)ov_sso_hint=([^;]*)/);
@@@ -1829,6 +1830,19 @@
try { return localStorage.getItem('ov_sso_hint'); } catch { return null; }
}
++ /**
++ * The first paint, before the session check: a hint that this browser signed in here. It is not
++ * authorization and carries no token; only the account's own name may ride along (account:<name>).
++ */
++ function hintUser() {
++ let raw = ssoHint() || '';
++ try { raw = decodeURIComponent(raw); } catch { /* as written */ }
++ const m = /^account(?::(.{1,64}))?$/.exec(raw);
++ if (!m) return null;
++ let name = (m[1] || '').replace(/^@/, '');
++ return { is_anon: false, username: /^[A-Za-z0-9_.-]{1,64}$/.test(name) ? name : '', __ssoHint: true };
++ }
++
/** One silent sign-in per tab, only after an earlier sign-in here (never after 'guest', never for bots): silent=1. */
let _ssoClientLoading = null;
function loadSsoClient() {
@@@ -1965,7 +1979,9 @@
enableHandoff();
startQuestGuide();
} else {
-- maybeSilentLogin();
++ const navigating = maybeSilentLogin();
++ // The hint was only a first paint: no session behind it, so draw the guest bar.
++ if (_hintPainted && !navigating) { _hintPainted = false; _hintSettled = true; render(); }
}
try {
document.dispatchEvent(new CustomEvent('openvibe-navbar-auth', {
@@@ -2124,7 +2140,11 @@
if (typeof nav.setAttribute === 'function') { nav.setAttribute('data-compact', _config.compact || 'auto'); nav.setAttribute('data-service', svc); }
const links = currentLinks();
-- const u = _config.user;
++ // With the hint saying account, the bar starts in the signed-in shape (a neutral avatar, the
++ // account's name only when the hint carries it). refreshAuthState replaces or clears it.
++ const hinted = !_config.user && !_hintSettled && _config.auth !== 'external' ? hintUser() : null;
++ if (hinted) _hintPainted = true;
++ const u = _config.user || hinted;
rememberAccount(u);
const accounts = getAccounts();
const isAnon = u && u.is_anon;
ddiff --git a/ov-arrange-core.js b/ov-arrange-core.js
nnew file mode 100644
iindex 0000000..a1cf5ec
---- /dev/null
++++ b/ov-arrange-core.js
@@@ -0,0 +1,315 @@
++/* Generated by scripts/build-arrange-core.js from openvibe-sdk 0.152.0 (src/ui-layout.js). Do not edit:
++ * change the SDK, release it, bump the pin, and run the script. The SDK's file, unchanged but for the name of
++ * module.exports:
++ * ui-layout.js 4a079a94b487fd25
++ */
++(function (root) {
++ 'use strict';
++ if (!root || root.OVArrangeCore) return;
++ const __ovArrangeCoreModule = { exports: {} };
++'use strict';
++/**
++ * ui.layout validation and editing (make your own controls design, 2026-11-11, pieces 2-3).
++ *
++ * One function is the authority for a person's arrangement of a surface: the server uses it before
++ * a layout is stored, the editor uses it before Save, and OpenVibe.AI uses it on every answer. It is
++ * plain code with no browser or Node dependency, so the same check runs everywhere.
++ *
++ * validate(catalog, layout) -> { ok, reasons[] } the catalog is ui.surface@1, the layout ui.layout@1
++ * applyDefaults(catalog) -> a valid layout for the default (or named) device
++ * merge(layout, patch) -> a new layout, patched by part id
++ *
++ * The rules, in the words a person sees (the design note's "Can't do that: <reason>"):
++ * - required parts present, visible and at their minimum size;
++ * - anything pressed is at least 44 px, and a part above that gets its own minimum (Stop 64 px);
++ * - nothing covers a required part, and a catalog's never_covers rules hold;
++ * - every tint is a theme token the catalog lists, and every style and binding is one the part allows;
++ * - only parts the catalog has;
++ * - no URL, markup or code anywhere: a layout is data.
++ *
++ * The validator never changes a layout and never fills a missing value in: a caller that wants the
++ * default asks applyDefaults. Reasons are unique and in a stable order, so two runs and two callers
++ * agree on the refusal.
++ */
++
++const DEVICE_PX = { phone: 44, tablet: 44, computer: 44 };
++const DEVICE_COLUMNS = { phone: 4, tablet: 8, computer: 12 };
++const PRESSED_PX = 44;
++const MIN_OPACITY = 0.4;
++const MAX_OPACITY = 1;
++const URL_RE = /(?:https?:\/\/|www\.)/i;
++const SCHEME_RE = /(?:^|[\s"'(])(?:javascript|data|vbscript|file):/i;
++const CODE_RE = /(?:<\s*\/?\s*(?:script|iframe|img|svg|style|a|object|embed)\b|\bon[a-z]{3,}\s*=|\bfunction\s*\(|=>|\beval\s*\(|\brequire\s*\(|\bimport\s*\()/i;
++
++const isObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
++const clone = (v) => (v === undefined ? undefined : JSON.parse(JSON.stringify(v)));
++const nameOf = (part) => String((part && part.name) || (part && part.id) || 'that part');
++const unique = (list) => [...new Set(list)];
++
++/** Every string (and object key) in a value, for the no-URL/no-code rule. */
++function stringsIn(value, out = []) {
++ if (typeof value === 'string') { out.push(value); return out; }
++ if (Array.isArray(value)) { for (const v of value) stringsIn(v, out); return out; }
++ if (!isObject(value)) return out;
++ for (const [k, v] of Object.entries(value)) { out.push(k); stringsIn(v, out); }
++ return out;
++}
++
++/** A part's size in cells: grid place (w/h) or dock place (w/h); null when the place is unusable. */
++function sizeOf(place) {
++ if (!isObject(place)) return null;
++ if (place.dock !== undefined) {
++ return Number.isInteger(place.w) && Number.isInteger(place.h) && place.w >= 1 && place.h >= 1 ? { w: place.w, h: place.h } : null;
++ }
++ return Number.isInteger(place.w) && Number.isInteger(place.h) && place.w >= 1 && place.h >= 1 ? { w: place.w, h: place.h } : null;
++}
++
++/** The rectangular cells a visible part occupies, or null for a dock (which covers along its edge). */
++function boxOf(part) {
++ const p = part && part.place;
++ if (!isObject(p) || p.dock !== undefined) return null;
++ if (![p.x, p.y, p.w, p.h].every(Number.isInteger)) return null;
++ if (p.x < 0 || p.y < 0 || p.w < 1 || p.h < 1) return null;
++ return { x: p.x, y: p.y, w: p.w, h: p.h };
++}
++
++function overlaps(a, b) {
++ return a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h;
++}
++
++/** Two docked parts cover each other only when they claim the same edge and order. */
++function dockOverlaps(a, b) {
++ const pa = a && a.place;
++ const pb = b && b.place;
++ return isObject(pa) && isObject(pb) && pa.dock !== undefined && pb.dock !== undefined
++ && pa.dock === pb.dock && pa.order === pb.order;
++}
++
++/**
++ * Check one layout against its surface catalog.
++ * @returns {{ ok: boolean, reasons: string[] }}
++ */
++function validate(catalog, layout) {
++ const reasons = [];
++ const fail = (reason) => { if (!reasons.includes(reason)) reasons.push(reason); };
++ if (!isObject(catalog) || !Array.isArray(catalog.parts)) {
++ return { ok: false, reasons: ['The surface catalog is missing.'] };
++ }
++ if (!isObject(layout)) return { ok: false, reasons: ['A layout has to be an object.'] };
++
++ // A layout is data: never a URL, markup or code, anywhere in a name, a value or a key.
++ if (stringsIn(layout).some((s) => URL_RE.test(s) || SCHEME_RE.test(s) || CODE_RE.test(s))) {
++ fail("A layout is data only: it can't carry a URL or code.");
++ }
++
++ if (layout.surface !== catalog.id) fail(`This layout is not for ${catalog.id || 'this surface'}.`);
++ if (layout.surface_version !== catalog.version) {
++ fail(`${catalog.name || 'This surface'} has changed since this layout was made; reset it to the default.`);
++ }
++ const device = layout.device;
++ const devices = Array.isArray(catalog.devices) ? catalog.devices : ['phone', 'tablet', 'computer'];
++ if (!devices.includes(device)) fail(`This surface doesn't come in ${device || 'that device'}.`);
++
++ const columns = (catalog.grid && catalog.grid.columns && catalog.grid.columns[device]) || DEVICE_COLUMNS[device] || 4;
++ const cellPx = (catalog.grid && catalog.grid.cell_px && catalog.grid.cell_px[device]) || DEVICE_PX[device] || 44;
++ const tokens = Array.isArray(catalog.theme_tokens) ? catalog.theme_tokens : [];
++ const byId = new Map(catalog.parts.filter((p) => p && p.id).map((p) => [p.id, p]));
++ const parts = Array.isArray(layout.parts) ? layout.parts : [];
++ const placed = new Map();
++
++ if (!Array.isArray(layout.parts) || layout.parts.length === 0) fail('A layout needs at least one part.');
++
++ for (const placedPart of parts) {
++ if (!isObject(placedPart) || typeof placedPart.id !== 'string') { fail('Every part in a layout needs an id.'); continue; }
++ const source = byId.get(placedPart.id);
++ if (!source) { fail(`${placedPart.id} is not a part of ${catalog.name || 'this surface'}.`); continue; }
++ if (placed.has(placedPart.id)) { fail(`${nameOf(source)} appears more than once.`); continue; }
++ placed.set(placedPart.id, placedPart);
++
++ const name = nameOf(source);
++ if (source.required && placedPart.visible !== true) fail(`${name} has to stay visible.`);
++
++ const place = placedPart.place;
++ if (!isObject(place)) { fail(`${name} needs a place on the surface.`); continue; }
++ const size = sizeOf(place);
++ if (!size) { fail(`${name} needs a size, in cells.`); continue; }
++ if (place.dock !== undefined) {
++ if (!['left', 'right', 'top', 'bottom'].includes(place.dock)) fail(`${name} can only dock to an edge.`);
++ if (!Number.isInteger(place.order) || place.order < 0) fail(`${name} needs a place in the dock order.`);
++ } else {
++ if (!Number.isInteger(place.x) || place.x < 0 || !Number.isInteger(place.y) || place.y < 0) fail(`${name} needs a place on the grid.`);
++ else if (place.x + place.w > columns) fail(`${name} runs past the edge of the ${device} grid.`);
++ }
++ const min = source.min || {};
++ if (size.w < (min.w || 1) || size.h < (min.h || 1)) {
++ fail(`${name} has to be at least ${Math.max(min.w || 1, 1)} × ${Math.max(min.h || 1, 1)} cells.`);
++ }
++ const needPx = Math.max(source.pressed ? PRESSED_PX : 0, Number(min.px) || 0);
++ if (needPx && (size.w * cellPx < needPx || size.h * cellPx < needPx)) fail(`${name} has to be at least ${needPx} px.`);
++
++ const style = isObject(placedPart.style) ? placedPart.style : {};
++ const allowedStyles = isObject(source.styles) ? source.styles : {};
++ if (typeof style.tint !== 'string' || !tokens.includes(style.tint)) {
++ fail(`${name}'s tint has to be one of the theme's tokens${tokens.length ? ` (${tokens.join(', ')})` : ''}.`);
++ } else if (Array.isArray(allowedStyles.tints) && !allowedStyles.tints.includes(style.tint)) {
++ fail(`${name} can only be tinted ${allowedStyles.tints.join(', ')}.`);
++ }
++ if (!['round', 'pill', 'square'].includes(style.shape)) fail(`${name} needs a shape: round, pill or square.`);
++ else if (Array.isArray(allowedStyles.shapes) && !allowedStyles.shapes.includes(style.shape)) {
++ fail(`${name} can only be ${allowedStyles.shapes.join(', ')}.`);
++ }
++ const low = Math.max(MIN_OPACITY, Number(allowedStyles.opacity && allowedStyles.opacity.min) || MIN_OPACITY);
++ const high = Math.min(MAX_OPACITY, Number(allowedStyles.opacity && allowedStyles.opacity.max) || MAX_OPACITY);
++ if (typeof style.opacity !== 'number' || style.opacity < low || style.opacity > high) {
++ fail(`${name}'s opacity has to be between ${low} and ${high}.`);
++ }
++ if (style.label !== true && style.label !== false) fail(`${name} says whether its label is on.`);
++ else if (style.label && allowedStyles.label === false) fail(`${name} can't show a label.`);
++
++ const bindings = isObject(placedPart.bindings) ? placedPart.bindings : {};
++ const allowed = isObject(source.bindings) ? source.bindings : {};
++ for (const kind of ['keys', 'gamepad']) {
++ const list = Array.isArray(bindings[kind]) ? bindings[kind] : [];
++ const ok = Array.isArray(allowed[kind]) ? allowed[kind] : [];
++ const bad = list.filter((b) => !ok.includes(b));
++ if (bad.length) fail(`${name} can't be bound to ${bad.join(', ')}.`);
++ if (new Set(list).size !== list.length) fail(`${name} binds ${kind} more than once.`);
++ }
++ }
++
++ for (const source of catalog.parts) {
++ if (source && source.required && !placed.has(source.id)) fail(`${nameOf(source)} has to stay on the surface.`);
++ }
++
++ // Nothing covers a required part. Only a visible part can cover anything, and a required part
++ // that is itself hidden is already refused above; its neighbours still do not cover it.
++ const visible = parts.filter((p) => p && p.visible === true && placed.has(p.id));
++ for (const required of visible) {
++ const source = byId.get(required.id);
++ if (!source || !source.required) continue;
++ for (const other of visible) {
++ if (other === required || other.id === required.id) continue;
++ const covers = overlaps(boxOf(required) || { x: 0, y: 0, w: 0, h: 0 }, boxOf(other) || { x: 0, y: 0, w: 0, h: 0 })
++ || dockOverlaps(required, other);
++ if (covers) fail(`${nameOf(byId.get(other.id))} covers ${nameOf(source)}.`);
++ }
++ }
++ // A catalog's own never_covers rules, in either direction of the relation it states.
++ for (const [id, source] of byId) {
++ const own = placed.get(id);
++ if (!own || own.visible !== true) continue;
++ for (const targetId of Array.isArray(source.never_covers) ? source.never_covers : []) {
++ const target = placed.get(targetId);
++ if (!target || target.visible !== true) continue;
++ const targetSource = byId.get(targetId);
++ if (overlaps(boxOf(own) || { x: 0, y: 0, w: 0, h: 0 }, boxOf(target) || { x: 0, y: 0, w: 0, h: 0 }) || dockOverlaps(own, target)) {
++ fail(`${nameOf(source)} covers ${nameOf(targetSource || { id: targetId })}.`);
++ }
++ }
++ }
++
++ return { ok: reasons.length === 0, reasons };
++}
++
++/** The cells a part needs at the default size: its own minimum, and at least 44 px when pressed. */
++function cellsFor(part, cellPx) {
++ const min = part.min || {};
++ const px = Math.max(part.pressed ? PRESSED_PX : 0, Number(min.px) || 0);
++ return {
++ w: Math.max(1, Number(min.w) || 1, px ? Math.ceil(px / cellPx) : 0),
++ h: Math.max(1, Number(min.h) || 1, px ? Math.ceil(px / cellPx) : 0),
++ };
++}
++
++/**
++ * The default arrangement of a surface: every catalog part, visible, at its minimum (or a size that
++ * meets the 44 px rule), required parts first, laid out left to right and then down the grid.
++ * @param {object} catalog ui.surface@1
++ * @param {'phone'|'tablet'|'computer'} [device] defaults to the catalog's first device
++ */
++function applyDefaults(catalog, device) {
++ if (!isObject(catalog) || !Array.isArray(catalog.parts)) throw new TypeError('applyDefaults: a ui.surface@1 catalog is required');
++ const chosen = (Array.isArray(catalog.devices) && catalog.devices.includes(device)) ? device : (catalog.devices || ['phone'])[0];
++ const columns = (catalog.grid && catalog.grid.columns && catalog.grid.columns[chosen]) || DEVICE_COLUMNS[chosen] || 4;
++ const cellPx = (catalog.grid && catalog.grid.cell_px && catalog.grid.cell_px[chosen]) || DEVICE_PX[chosen] || 44;
++ const ordered = [...catalog.parts].sort((a, b) => (b.required ? 1 : 0) - (a.required ? 1 : 0));
++ let x = 0; let y = 0; let rowHeight = 0;
++ const parts = ordered.map((part) => {
++ const size = cellsFor(part, cellPx);
++ const w = Math.min(columns, size.w);
++ const h = size.h;
++ if (x + w > columns) { x = 0; y += rowHeight; rowHeight = 0; }
++ const place = { x, y, w, h };
++ x += w;
++ rowHeight = Math.max(rowHeight, h);
++ const styles = isObject(part.styles) ? part.styles : {};
++ const bindings = isObject(part.bindings) ? part.bindings : {};
++ const tokens = Array.isArray(catalog.theme_tokens) ? catalog.theme_tokens : [];
++ const tints = Array.isArray(styles.tints) ? styles.tints : [];
++ return {
++ id: part.id,
++ visible: true,
++ place,
++ style: {
++ tint: tints.find((t) => tokens.includes(t)) || tints[0] || tokens[0] || 'surface',
++ shape: (Array.isArray(styles.shapes) && styles.shapes[0]) || 'square',
++ opacity: 1,
++ label: styles.label !== false,
++ },
++ bindings: {
++ keys: Array.isArray(bindings.keys) ? [...bindings.keys] : [],
++ gamepad: Array.isArray(bindings.gamepad) ? [...bindings.gamepad] : [],
++ },
++ };
++ });
++ return {
++ surface: catalog.id,
++ surface_version: catalog.version,
++ device: chosen,
++ name: 'Default',
++ author: { name: 'OpenVibe' },
++ sharing: 'private',
++ parts,
++ };
++}
++
++function mergeInto(base, patch) {
++ if (!isObject(base)) return clone(patch);
++ if (!isObject(patch)) return clone(patch);
++ const out = clone(base);
++ for (const [key, value] of Object.entries(patch)) {
++ if (isObject(value) && isObject(out[key])) out[key] = mergeInto(out[key], value);
++ else out[key] = clone(value);
++ }
++ return out;
++}
++
++/**
++ * A new layout with `patch` applied. `parts` are merged by id: a patch part changes only the fields it
++ * names, and a part the layout does not have is appended. Nothing is mutated, and the result is not
++ * validated (the caller validates before storing or showing it).
++ */
++function merge(layout, patch) {
++ if (!isObject(layout)) throw new TypeError('merge: a layout is required');
++ if (!isObject(patch)) return clone(layout);
++ const out = clone(layout);
++ for (const [key, value] of Object.entries(patch)) {
++ if (key === 'parts' && Array.isArray(value)) {
++ const parts = Array.isArray(out.parts) ? out.parts.map(clone) : [];
++ const index = new Map(parts.map((p, i) => [p && p.id, i]));
++ for (const incoming of value) {
++ if (!isObject(incoming) || typeof incoming.id !== 'string') { parts.push(clone(incoming)); continue; }
++ if (index.has(incoming.id)) parts[index.get(incoming.id)] = mergeInto(parts[index.get(incoming.id)], incoming);
++ else { index.set(incoming.id, parts.length); parts.push(clone(incoming)); }
++ }
++ out.parts = parts;
++ } else if (isObject(value) && isObject(out[key])) out[key] = mergeInto(out[key], value);
++ else out[key] = clone(value);
++ }
++ return out;
++}
++
++__ovArrangeCoreModule.exports = { validate, applyDefaults, merge, PRESSED_PX };
++
++ root.OVArrangeCore = __ovArrangeCoreModule.exports;
++})(typeof globalThis !== 'undefined' ? globalThis : this);
ddiff --git a/ov-arrange.js b/ov-arrange.js
nnew file mode 100644
iindex 0000000..3eda528
---- /dev/null
++++ b/ov-arrange.js
@@@ -0,0 +1,844 @@
++/**
++ * openvibe-shared/ov-arrange.js — the Arrange editor (make your own controls, stage 2, 2026-11-11).
++ *
++ * A product publishes a ui.surface@1 catalog and renders one element per part with data-ov-part="<id>".
++ * A person's ui.layout@1 is applied to those real parts: a place on the surface's grid, or a dock edge for
++ * an overlay; visible; a style (a theme token, a shape, an opacity and the label); and bindings. This file
++ * is loaded only when someone presses Arrange (a product loads it then, by the shared serve URL, and this
++ * file loads its own sibling ov-arrange-core.js — openvibe-sdk/ui-layout for the browser — by content hash).
++ *
++ * OVArrange.open({
++ * surface, catalog, layout, device: 'phone'|'tablet'|'computer',
++ * validate(catalog, layout) -> { ok, reasons[] }, // optional: defaults to the sdk core
++ * defaults(catalog) -> layout, // optional: defaults to the sdk core
++ * onSave(layout) -> Promise<{ ok?, reasons? }>, // PUT the person's layout (Network)
++ * onShare(layout) -> Promise<{ url?, reasons? }>, // save, then a share link
++ * onReset() -> Promise<{ ok?, reasons? }>, // clear the stored layout (Network's reset)
++ * onAsk(words, request) -> Promise<ui.layout-suggestion@1>,
++ * onClose(), confirm() -> boolean, core
++ * }) -> { close, apply, layout, destroy }
++ *
++ * Edit mode: drag a part to move it, drag its corner to resize, arrow keys to move and Shift with the
++ * arrows to resize (for a docked part: the arrows choose the edge, up/down its order). A part's sheet
++ * (long press on a phone, the Style button, or Enter on a part) has visible, size, style and bindings.
++ * Every move and resize is announced, and a refused move says why in plain words (Stop has to stay
++ * visible; it is too small). Undo, Reset to default, Save and Share are in the bar, with Ask OpenVibe:
++ * a suggestion is previewed on the real parts and kept only with Keep. Motion Off changes nothing;
++ * Calm plays the short transition. Plain kit markup (ovk-*): the look is the page's.
++ */
++(function (root) {
++ 'use strict';
++ if (!root || root.OVArrange || typeof document === 'undefined') return;
++
++ const VERSION = '1.0.0';
++ const MOTION = () => {
++ const m = document.documentElement.getAttribute('data-ov-motion');
++ if (m === 'off') return 'off';
++ return m === 'reduced' || (!m && root.matchMedia && root.matchMedia('(prefers-reduced-motion: reduce)').matches) ? 'calm' : 'full';
++ };
++
++ const CSS = `
++.ov-arrange-surface { position: relative; display: grid; grid-template-columns: repeat(var(--ov-cols, 12), minmax(0, 1fr)); grid-auto-rows: minmax(var(--ov-cell, 64px), auto); gap: var(--ov-gap, .75rem); }
++.ov-arrange-surface > [data-ov-part] { min-width: 0; min-height: 0; opacity: var(--ov-part-opacity, 1); }
++.ov-arrange-surface > [data-ov-part][data-ov-label="false"] .ov-arrange-label { display: none; }
++.ov-arrange-editing [data-ov-part] { cursor: grab; outline: 1px dashed color-mix(in srgb, var(--accent, #3b82f6) 55%, transparent); outline-offset: 2px; touch-action: none; transition: box-shadow var(--ov-arrange-dur, .2s) ease, outline-color var(--ov-arrange-dur, .2s) ease; }
++.ov-arrange-editing [data-ov-part]:focus-visible { outline: 2px solid var(--accent, #3b82f6); outline-offset: 3px; }
++.ov-arrange-editing [data-ov-part][data-ov-selected] { outline: 2px solid var(--accent, #3b82f6); outline-offset: 3px; }
++.ov-arrange-editing [data-ov-part] :is(button, input, select, textarea, a, [role="button"]) { pointer-events: none; }
++.ov-arrange-editing [data-ov-part][data-ov-dragging] { cursor: grabbing; opacity: .8; }
++.ov-arrange-editing [data-ov-part][data-ov-refused] { outline-color: var(--danger, #e5484d); }
++.ov-arrange-sel { position: fixed; z-index: 2147482990; pointer-events: none; border: 2px solid var(--accent, #3b82f6); border-radius: 10px; box-shadow: 0 0 0 9999px color-mix(in srgb, #000 14%, transparent); }
++.ov-arrange-handle, .ov-arrange-style { position: fixed; z-index: 2147482991; pointer-events: auto; width: 34px; height: 34px; min-width: 34px; min-height: 34px; padding: 0; display: grid; place-items: center; border-radius: 9px; border: 1px solid var(--line, rgba(255,255,255,.2)); background: var(--raised, #1b2230); color: var(--text, #eef); cursor: nwse-resize; }
++.ov-arrange-handle { touch-action: none; }
++.ov-arrange-style { cursor: pointer; font-size: 15px; }
++.ov-arrange-handle::before { content: ""; width: 12px; height: 12px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor; transform: translate(-2px, -2px); }
++.ov-arrange-bar { position: fixed; z-index: 2147483000; left: 50%; bottom: max(12px, env(safe-area-inset-bottom)); transform: translateX(-50%); width: min(56rem, calc(100vw - 24px)); display: grid; gap: 8px; padding: 10px 12px; border: 1px solid var(--line, rgba(255,255,255,.16)); border-radius: 16px; background: var(--surface, #151b26); color: var(--text, #eef); box-shadow: 0 18px 50px -16px rgba(0,0,0,.7); font: 14px/1.4 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
++.ov-arrange-bar form { display: flex; gap: 8px; min-width: 0; }
++.ov-arrange-bar input { flex: 1; min-width: 0; min-height: 40px; padding: 0 12px; border-radius: 10px; border: 1px solid var(--line, rgba(255,255,255,.18)); background: var(--bg, #0d1117); color: var(--text, #eef); font: inherit; }
++.ov-arrange-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
++.ov-arrange-actions .ovk-btn, .ov-arrange-bar form .ovk-btn { min-height: 38px; }
++.ov-arrange-status { margin: 0; min-height: 1.2em; color: var(--muted, #9aa6b6); font-size: 12.5px; }
++.ov-arrange-status[data-tone="bad"] { color: var(--danger, #e5484d); }
++.ov-arrange-status[data-tone="ok"] { color: var(--ok, #3fb950); }
++.ov-arrange-preview { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 8px 10px; border-radius: 10px; background: color-mix(in srgb, var(--accent, #3b82f6) 14%, transparent); }
++.ov-arrange-preview p { margin: 0; flex: 1 1 14rem; }
++.ov-arrange-sheet { position: fixed; z-index: 2147483001; inset: auto 0 0 0; max-height: min(82vh, 42rem); overflow: auto; padding: 14px; background: var(--surface, #151b26); color: var(--text, #eef); border-top: 1px solid var(--line, rgba(255,255,255,.18)); border-radius: 16px 16px 0 0; box-shadow: 0 -20px 50px -20px rgba(0,0,0,.7); font: 14px/1.4 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; display: grid; gap: 12px; }
++@media (min-width: 44rem) { .ov-arrange-sheet { left: 50%; right: auto; bottom: 50%; transform: translate(-50%, 50%); width: min(30rem, calc(100vw - 32px)); border-radius: 16px; border: 1px solid var(--line, rgba(255,255,255,.18)); } }
++.ov-arrange-sheet h2 { margin: 0; font-size: 15px; }
++.ov-arrange-sheet .ov-arrange-row { display: grid; gap: 5px; }
++.ov-arrange-sheet .ov-arrange-row > span { font-size: 12px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--muted, #9aa6b6); }
++.ov-arrange-sheet .ov-arrange-opts { display: flex; flex-wrap: wrap; gap: 6px; }
++.ov-arrange-sheet .ov-arrange-opts label { display: inline-flex; align-items: center; gap: 5px; min-height: 36px; padding: 0 10px; border: 1px solid var(--line, rgba(255,255,255,.18)); border-radius: 9px; cursor: pointer; }
++.ov-arrange-sheet .ov-arrange-opts input { margin: 0; }
++.ov-arrange-sheet .ov-arrange-close { justify-self: end; }
++.ov-arrange-sheet input[type="text"] { min-height: 38px; padding: 0 10px; border-radius: 9px; border: 1px solid var(--line, rgba(255,255,255,.18)); background: var(--bg, #0d1117); color: var(--text, #eef); font: inherit; }
++.ov-arrange-share { display: grid; gap: 8px; padding: 10px; border-radius: 10px; background: var(--bg, #0d1117); }
++.ov-arrange-share input { width: 100%; min-height: 38px; padding: 0 10px; border-radius: 9px; border: 1px solid var(--line, rgba(255,255,255,.18)); background: var(--surface, #151b26); color: var(--text, #eef); font: inherit; }
++html[data-ov-motion="off"] .ov-arrange-surface [data-ov-part], html[data-ov-motion="off"] .ov-arrange-sel, html[data-ov-motion="off"] .ov-arrange-bar { transition: none !important; }
++html[data-ov-motion="reduced"] { --ov-arrange-dur: .12s; }
++`;
++
++ const clone = (v) => (v == null ? v : JSON.parse(JSON.stringify(v)));
++ const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
++ const esc = (s) => String(s == null ? '' : s);
++ const partName = (catalog, id) => {
++ const p = (catalog.parts || []).find((x) => x.id === id);
++ return p ? p.name : id;
++ };
++ const catalogPart = (catalog, id) => (catalog.parts || []).find((x) => x.id === id) || null;
++ const entryOf = (layout, id) => ((layout && layout.parts) || []).find((p) => p.id === id) || null;
++ const docked = (place) => !!(place && place.dock);
++
++ function styleOnce(doc) {
++ if (doc.getElementById('ov-arrange-styles')) return;
++ const st = doc.createElement('style');
++ st.id = 'ov-arrange-styles';
++ st.textContent = CSS;
++ (doc.head || doc.documentElement).appendChild(st);
++ }
++
++ // ── The SDK's rules, as a browser sibling (scripts/build-arrange-core.js) ─────────────────────────
++ const ARRANGE_CORE_REV = { 'ov-arrange-core.js': 'bc9a2caac869' };
++ let coreLoading = null;
++ function loadCore(opts) {
++ if (opts && opts.core) return Promise.resolve(opts.core);
++ if (root.OVArrangeCore) return Promise.resolve(root.OVArrangeCore);
++ if (coreLoading) return coreLoading;
++ if (!root.document || !document.currentScript) return Promise.resolve(null);
++ const src = document.currentScript.src || '';
++ if (!src) return Promise.resolve(null);
++ const url = src.replace(/[^/]*$/, `ov-arrange-core.js${ARRANGE_CORE_REV['ov-arrange-core.js'] ? `?v=${ARRANGE_CORE_REV['ov-arrange-core.js']}` : ''}`);
++ coreLoading = new Promise((resolve) => {
++ const sc = document.createElement('script');
++ sc.src = url; sc.async = true;
++ sc.onload = () => resolve(root.OVArrangeCore || null);
++ sc.onerror = () => resolve(null);
++ document.head.appendChild(sc);
++ });
++ return coreLoading;
++ }
++
++ // The rules when the SDK core is not there (a product without the sibling): the same checks the contract
++ // lists, in the same plain words. The SDK remains the one authority when it is loaded.
++ function fallbackValidate(catalog, layout) {
++ const reasons = [];
++ const parts = catalog && catalog.parts || [];
++ const byId = new Map(parts.map((p) => [p.id, p]));
++ if (!isObj(layout)) return { ok: false, reasons: ['That is not a layout.'] };
++ if (layout.surface !== catalog.id) reasons.push(`This layout is for ${esc(layout.surface)}, not ${esc(catalog.id)}.`);
++ if (layout.surface_version !== catalog.version) reasons.push('This layout was made for another version of these controls.');
++ if (!(catalog.devices || []).includes(layout.device)) reasons.push(`These controls do not work on a ${esc(layout.device)}.`);
++ if (!Array.isArray(layout.parts) || !layout.parts.length) reasons.push('A layout needs at least one part.');
++ const seen = new Set();
++ const entries = Array.isArray(layout.parts) ? layout.parts : [];
++ for (const e of entries) {
++ if (!isObj(e) || typeof e.id !== 'string') { reasons.push('A layout has a part without an id.'); continue; }
++ if (seen.has(e.id)) reasons.push(`${partName(catalog, e.id)} is in the layout twice.`);
++ seen.add(e.id);
++ if (!byId.has(e.id)) { reasons.push(`These controls have no part called ${esc(e.id)}.`); continue; }
++ // No links or code anywhere in the data.
++ for (const [k, v] of Object.entries(e)) {
++ if (typeof v === 'string' && /(https?:\/\/|\/\/|javascript:|data:|<[a-z])/i.test(v)) reasons.push('A layout only carries data: no links or code.');
++ if (k === 'style' && isObj(v)) for (const sv of Object.values(v)) if (typeof sv === 'string' && /(https?:\/\/|\/\/|javascript:|data:|<[a-z])/i.test(sv)) reasons.push('A layout only carries data: no links or code.');
++ }
++ }
++ for (const p of parts) {
++ const e = entries.find((x) => isObj(x) && x.id === p.id);
++ if (p.required && !e) { reasons.push(`${p.name} has to be there.`); continue; }
++ if (!e) continue;
++ if (p.required && e.visible === false) { reasons.push(`${p.name} has to stay visible.`); continue; }
++ if (!isObj(e.place)) { reasons.push(`${p.name} has no place.`); continue; }
++ if (!docked(e.place)) {
++ const { x, y, w, h } = e.place;
++ const cols = (catalog.grid && catalog.grid.columns && catalog.grid.columns[layout.device]) || 12;
++ if (![x, y, w, h].every((n) => Number.isInteger(n))) { reasons.push(`${p.name} needs a place on the grid.`); continue; }
++ if (x < 0 || y < 0 || w < 1 || h < 1 || x + w > cols) reasons.push(`${p.name} does not fit on this grid.`);
++ if (w < p.min.w || h < p.min.h) reasons.push(`${p.name} is too small: it needs ${p.min.w} by ${p.min.h} cells.`);
++ const cell = (catalog.grid && catalog.grid.cell_px && catalog.grid.cell_px[layout.device]) || 44;
++ if (p.min.px && (w * cell < p.min.px || h * cell < p.min.px)) reasons.push(`${p.name} has to be at least ${p.min.px} px.`);
++ if (p.pressed && (w * cell < 44 || h * cell < 44)) reasons.push(`${p.name} is pressed, so it has to be at least 44 px.`);
++ } else {
++ if (!['left', 'right', 'top', 'bottom'].includes(e.place.dock)) reasons.push(`${p.name} needs an edge to dock to.`);
++ if (!Number.isInteger(e.place.order) || e.place.order < 0) reasons.push(`${p.name} needs an order on its edge.`);
++ if (!Number.isInteger(e.place.w) || !Number.isInteger(e.place.h)) reasons.push(`${p.name} needs a size, in cells.`);
++ else {
++ if (e.place.w < p.min.w || e.place.h < p.min.h) reasons.push(`${p.name} is too small: it needs ${p.min.w} by ${p.min.h} cells.`);
++ const cell = (catalog.grid && catalog.grid.cell_px && catalog.grid.cell_px[layout.device]) || 44;
++ if (p.min.px && (e.place.w * cell < p.min.px || e.place.h * cell < p.min.px)) reasons.push(`${p.name} has to be at least ${p.min.px} px.`);
++ if (p.pressed && (e.place.w * cell < 44 || e.place.h * cell < 44)) reasons.push(`${p.name} is pressed, so it has to be at least 44 px.`);
++ }
++ }
++ const st = e.style || {};
++ if (!(catalog.theme_tokens || []).includes(st.tint)) reasons.push(`${p.name} uses a colour this theme does not have.`);
++ if (!((p.styles && p.styles.tints) || []).includes(st.tint)) reasons.push(`${partName(catalog, p.id)} cannot use that colour.`);
++ if (!((p.styles && p.styles.shapes) || []).includes(st.shape)) reasons.push(`${p.name} cannot be that shape.`);
++ if (typeof st.opacity === 'number' && (st.opacity < 0.4 || st.opacity > 1)) reasons.push(`${p.name} has to stay at least 40% visible.`);
++ const b = e.bindings || {};
++ for (const k of (b.keys || [])) if (!((p.bindings && p.bindings.keys) || []).includes(k)) reasons.push(`${p.name} cannot use the key ${esc(k)}.`);
++ for (const g of (b.gamepad || [])) if (!((p.bindings && p.bindings.gamepad) || []).includes(g)) reasons.push(`${p.name} cannot use the gamepad control ${esc(g)}.`);
++ }
++ // Nothing covers a required part, and never_covers.
++ const placed = entries.filter((e) => isObj(e.place) && !docked(e.place));
++ const dockedEntries = entries.filter((e) => isObj(e.place) && docked(e.place));
++ for (const a of dockedEntries) {
++ if (!catalogPart(catalog, a.id)) continue;
++ for (const b of dockedEntries) {
++ if (a === b || !catalogPart(catalog, b.id)) continue;
++ if (a.place.dock === b.place.dock && a.place.order === b.place.order) {
++ const ap = catalogPart(catalog, a.id), bp = catalogPart(catalog, b.id);
++ if (bp.required) reasons.push(`${partName(catalog, a.id)} covers ${bp.name}.`);
++ if (((ap.never_covers) || []).includes(b.id)) reasons.push(`${partName(catalog, a.id)} must never cover ${bp.name}.`);
++ }
++ }
++ }
++ for (const a of placed) {
++ if (!catalogPart(catalog, a.id)) continue;
++ for (const b of placed) {
++ if (a === b || !catalogPart(catalog, b.id)) continue;
++ const covers = a.place.x < b.place.x + b.place.w && a.place.x + a.place.w > b.place.x && a.place.y < b.place.y + b.place.h && a.place.y + a.place.h > b.place.y;
++ if (!covers) continue;
++ const bp = catalogPart(catalog, b.id);
++ if (bp.required) reasons.push(`${partName(catalog, a.id)} covers ${bp.name}.`);
++ if (((catalogPart(catalog, a.id).never_covers) || []).includes(b.id)) reasons.push(`${partName(catalog, a.id)} must never cover ${bp.name}.`);
++ }
++ }
++ return { ok: reasons.length === 0, reasons: [...new Set(reasons)] };
++ }
++
++ // ── Defaults: one visible part after another on the grid; docked parts by their catalog order ─────
++ function spanFor(p, device) {
++ const cols = (p && p._cols) || 4;
++ if (device === 'computer') return { w: Math.min(4, cols), h: 2 };
++ if (device === 'tablet') return { w: Math.min(4, cols), h: 2 };
++ return { w: cols, h: 2 };
++ }
++ function fallbackDefaults(catalog, device) {
++ const cols = (catalog.grid && catalog.grid.columns && catalog.grid.columns[device]) || 12;
++ const overlay = (catalog.id || '').split('.').pop() === 'overlay';
++ const parts = (catalog.parts || []).map((p) => {
++ const st = { tint: (p.styles && p.styles.tints && p.styles.tints[0]) || (catalog.theme_tokens || ['surface'])[0], shape: (p.styles && p.styles.shapes && p.styles.shapes[0]) || 'square', opacity: 1, label: true };
++ const b = { keys: (p.bindings && p.bindings.keys || []).slice(0, 0), gamepad: [] };
++ if (overlay) {
++ const dock = p.id === 'pill' || p.id === 'stick' ? 'left' : p.id === 'slider' || p.id === 'estop' ? 'bottom' : 'right';
++ return { id: p.id, visible: true, place: { dock, order: 0, w: Math.max(p.min.w, p.id === 'stick' ? 2 : p.id === 'estop' ? 2 : 1), h: Math.max(p.min.h, p.id === 'stick' ? 2 : p.id === 'estop' ? 2 : 1) }, style: st, bindings: b };
++ }
++ return { id: p.id, visible: true, place: { x: 0, y: 0, w: Math.min(spanFor({ ...p, _cols: cols }, device).w, cols), h: Math.max(p.min.h, 2) }, style: st, bindings: b };
++ });
++ if (!overlay) {
++ // Flow them: full-width rows on a phone, two or three columns on larger surfaces.
++ let y = 0;
++ for (const p of parts) {
++ const c = catalogPart(catalog, p.id);
++ const w = Math.min(cols, Math.max(c.min.w, device === 'phone' ? cols : Math.min(cols, device === 'tablet' ? 4 : 4)));
++ const h = Math.max(c.min.h, c.kind === 'video' ? 3 : c.kind === 'readout' ? 1 : 2);
++ if (p.place.x + w > cols) { p.place.x = 0; y += 1; }
++ p.place = { x: p.place.x, y, w, h };
++ p.place.x += w;
++ if (p.place.x >= cols) { p.place.x = 0; y += h; }
++ }
++ }
++ return { surface: catalog.id, surface_version: catalog.version, device, name: 'My layout', author: { name: 'Me' }, sharing: 'private', parts };
++ }
++
++ function fitPlace(place, catalog, device, part) {
++ if (!place) return null;
++ const cols = (catalog.grid && catalog.grid.columns && catalog.grid.columns[device]) || 12;
++ if (docked(place)) return { dock: place.dock, order: Math.max(0, Math.min(63, Number(place.order) || 0)), w: Math.max(1, Math.min(24, Math.round(place.w) || part.min.w)), h: Math.max(1, Math.min(24, Math.round(place.h) || part.min.h)) };
++ const w = Math.max(1, Math.min(24, Math.round(place.w) || part.min.w));
++ const h = Math.max(1, Math.min(24, Math.round(place.h) || part.min.h));
++ return { x: Math.max(0, Math.min(Math.max(0, cols - w), Math.round(place.x) || 0)), y: Math.max(0, Math.min(100, Math.round(place.y) || 0)), w, h };
++ }
++
++ // ── The editor ──────────────────────────────────────────────────────────────────────────────────
++ function open(opts) {
++ const surface = opts && opts.surface;
++ if (!surface || !isObj(opts.catalog)) throw new Error('OVArrange.open: a surface element and its ui.surface@1 catalog are needed');
++ const catalog = opts.catalog;
++ const doc = surface.ownerDocument || document;
++ const device = ['phone', 'tablet', 'computer'].includes(opts.device) ? opts.device : 'computer';
++ styleOnce(doc);
++ const cols = (catalog.grid && catalog.grid.columns && catalog.grid.columns[device]) || 12;
++ const cell = (catalog.grid && catalog.grid.cell_px && catalog.grid.cell_px[device]) || 64;
++ const confirmFn = typeof opts.confirm === 'function' ? opts.confirm : (msg) => !root.confirm || root.confirm(msg);
++ const announce = (text) => { if (live) live.textContent = text; if (opts.announce) try { opts.announce(text); } catch (_) { /* */ } };
++
++ let core = opts.core || root.OVArrangeCore || null;
++ loadCore(opts).then((c) => { if (c) core = c; }).catch(() => { /* the fallback rules stay */ });
++ const validate = (lay) => {
++ const fn = (opts.validate || (core && core.validate) || fallbackValidate);
++ try {
++ const v = fn(catalog, lay, device);
++ return v && typeof v.ok === 'boolean' ? { ok: v.ok, reasons: Array.isArray(v.reasons) ? v.reasons : [] } : { ok: false, reasons: ['That layout could not be checked.'] };
++ } catch (e) { return { ok: false, reasons: [String(e && e.message || e)] }; }
++ };
++ const defaults = () => {
++ const fn = opts.defaults || (core && core.applyDefaults);
++ try { const d = fn ? fn(catalog, device) : null; if (isObj(d)) return d; } catch (_) { /* fall through */ }
++ return fallbackDefaults(catalog, device);
++ };
++ const normal = (lay) => {
++ const d = defaults();
++ const out = clone(d);
++ const base = isObj(lay) ? lay : opts.layout;
++ out.surface = catalog.id; out.surface_version = catalog.version; out.device = device;
++ if (isObj(base)) {
++ out.name = base.name || out.name; out.sharing = base.sharing || out.sharing; out.author = base.author || out.author;
++ out.parts = (out.parts || []).map((p) => {
++ const got = entryOf(base, p.id);
++ return got ? { ...p, ...clone(got) } : p;
++ });
++ }
++ out.parts = (out.parts || []).map((p) => {
++ const cp = catalogPart(catalog, p.id) || { min: { w: 1, h: 1 }, styles: {} };
++ return { ...p, visible: cp.required ? true : p.visible !== false, place: fitPlace(p.place, catalog, device, cp) || { x: 0, y: 0, w: cp.min.w, h: cp.min.h }, style: { tint: (p.style && p.style.tint) || (cp.styles.tints || catalog.theme_tokens || ['surface'])[0], shape: (p.style && p.style.shape) || (cp.styles.shapes || ['square'])[0], opacity: p.style && typeof p.style.opacity === 'number' ? p.style.opacity : 1, label: p.style && typeof p.style.label === 'boolean' ? p.style.label : (cp.styles && cp.styles.label) !== false }, bindings: { keys: (p.bindings && p.bindings.keys) || [], gamepad: (p.bindings && p.bindings.gamepad) || [] } };
++ });
++ return out;
++ };
++
++ const initial = normal(opts.layout);
++ let working = clone(initial);
++ let undoStack = [];
++ let preview = null; // { layout, summary, reasons, words }
++ let selected = null;
++ let dirty = false;
++ let saving = false;
++ let closed = false;
++ let drag = null;
++
++ const host = doc.createElement('div');
++ host.className = 'ov-arrange-bar';
++ host.setAttribute('role', 'toolbar');
++ host.setAttribute('aria-label', 'Arrange the controls');
++ host.innerHTML = `<form data-ask><label class="sr-only" for="ov-arrange-words">Ask OpenVibe</label><input id="ov-arrange-words" type="text" maxlength="500" autocomplete="off" placeholder="Describe how you want it…" aria-label="Ask OpenVibe"><button type="submit" class="ovk-btn ovk-btn--primary">Ask OpenVibe</button></form>
++<div class="ov-arrange-actions"><button type="button" class="ovk-btn ovk-btn--quiet" data-undo>Undo</button><button type="button" class="ovk-btn ovk-btn--quiet" data-reset>Reset to default</button><button type="button" class="ovk-btn ovk-btn--quiet" data-share>Share</button><button type="button" class="ovk-btn ovk-btn--primary" data-save>Save</button><button type="button" class="ovk-btn ovk-btn--ghost" data-done>Done</button></div>
++<p class="ov-arrange-status" data-status role="status" aria-live="polite"></p>`;
++ doc.body.appendChild(host);
++ const statusEl = host.querySelector('[data-status]');
++ const setStatus = (text, tone) => { statusEl.textContent = text || ''; if (tone) statusEl.dataset.tone = tone; else delete statusEl.dataset.tone; if (text) announce(text); };
++ const live = doc.createElement('div');
++ live.setAttribute('aria-live', 'polite'); live.setAttribute('aria-atomic', 'true');
++ live.className = 'sr-only';
++ doc.body.appendChild(live);
++
++ const sel = doc.createElement('div'); sel.className = 'ov-arrange-sel'; sel.hidden = true; doc.body.appendChild(sel);
++ const handle = doc.createElement('button'); handle.type = 'button'; handle.className = 'ov-arrange-handle'; handle.setAttribute('aria-label', 'Resize'); handle.title = 'Resize'; handle.hidden = true; doc.body.appendChild(handle);
++ const styleBtn = doc.createElement('button'); styleBtn.type = 'button'; styleBtn.className = 'ov-arrange-style'; styleBtn.textContent = 'Aa'; styleBtn.setAttribute('aria-label', 'Style this part'); styleBtn.title = 'Style this part'; styleBtn.hidden = true; doc.body.appendChild(styleBtn);
++
++ const partEls = () => [...surface.querySelectorAll('[data-ov-part]')].filter((el) => catalogPart(catalog, el.dataset.ovPart));
++ const originals = new Map();
++ const innerTab = [];
++ for (const el of partEls()) originals.set(el, { style: el.getAttribute('style'), hidden: el.hidden, tabindex: el.getAttribute('tabindex'), role: el.getAttribute('role'), label: el.getAttribute('aria-label'), cls: el.className });
++ const surfaceStyle = surface.getAttribute('style');
++ const surfaceClass = surface.className;
++ const surfaceCustom = surface.getAttribute('data-ov-custom');
++ const elOf = (id) => partEls().find((el) => el.dataset.ovPart === id) || null;
++ const entry = (id) => entryOf(working, id);
++
++ function snapshot() { return clone(working); }
++ function pushUndo() { undoStack.push(snapshot()); if (undoStack.length > 40) undoStack.shift(); }
++ function markDirty() { dirty = true; paintActions(); }
++
++ function flatten(el) {
++ for (let a = el.parentElement; a && a !== surface; a = a.parentElement) a.setAttribute('data-ov-flatten', 'true');
++ }
++
++ function paintPlace(el, e) {
++ const p = e.place || {};
++ el.style.gridColumn = ''; el.style.gridRow = ''; el.style.order = '';
++ delete el.dataset.ovDock; delete el.dataset.ovOrder;
++ if (docked(p)) {
++ el.dataset.ovDock = p.dock;
++ el.dataset.ovOrder = String(p.order || 0);
++ el.style.order = String(p.order || 0);
++ } else {
++ el.style.gridColumn = `${p.x + 1} / span ${p.w}`;
++ el.style.gridRow = `${p.y + 1} / span ${p.h}`;
++ }
++ if (el.dataset.ovRoleHidden !== 'true') el.hidden = e.visible === false;
++ el.style.setProperty('--ov-part-opacity', String(e.style && typeof e.style.opacity === 'number' ? e.style.opacity : 1));
++ el.dataset.ovTint = (e.style && e.style.tint) || '';
++ el.dataset.ovShape = (e.style && e.style.shape) || '';
++ el.dataset.ovLabel = e.style && e.style.label === false ? 'false' : 'true';
++ el.dataset.ovKeys = ((e.bindings && e.bindings.keys) || []).join(' ');
++ el.dataset.ovGamepad = ((e.bindings && e.bindings.gamepad) || []).join(' ');
++ el.classList.toggle('ov-arrange-part', true);
++ }
++
++ function apply(lay, { focus = true } = {}) {
++ surface.classList.add('ov-arrange-surface');
++ surface.setAttribute('data-ov-custom', 'true');
++ surface.style.setProperty('--ov-cols', String(cols));
++ surface.style.setProperty('--ov-cell', `${cell}px`);
++ surface.style.gridTemplateColumns = `repeat(${cols}, minmax(0, 1fr))`;
++ surface.style.gridAutoRows = `minmax(${cell}px, auto)`;
++ const dockMode = (catalog.id || '').split('.').pop() === 'overlay';
++ if (dockMode) { surface.style.display = surface.style.display || 'block'; surface.style.position = 'relative'; }
++ for (const el of partEls()) {
++ flatten(el);
++ for (const inner of el.querySelectorAll('button, input, select, textarea, a[href], [tabindex]')) {
++ if (!innerTab.some((x) => x.el === inner)) innerTab.push({ el: inner, tabindex: inner.getAttribute('tabindex') });
++ if (inner !== el) inner.setAttribute('tabindex', '-1');
++ }
++ }
++ for (const p of (catalog.parts || [])) {
++ const el = elOf(p.id), e = entryOf(lay, p.id);
++ if (!el || !e) continue;
++ paintPlace(el, e);
++ if (focus && !dockMode) {
++ el.tabIndex = 0;
++ el.setAttribute('role', 'group');
++ el.setAttribute('aria-label', `${p.name}${p.required ? ', required' : ''}. Arrow keys move it, Shift with the arrows resizes it, Enter opens its style.`);
++ }
++ }
++ positionSelection();
++ }
++
++ function selectedEl() { return selected ? elOf(selected) : null; }
++ function positionSelection() {
++ const el = selectedEl();
++ if (!el || el.hidden || closed) { sel.hidden = true; handle.hidden = true; styleBtn.hidden = true; return; }
++ const r = el.getBoundingClientRect();
++ sel.hidden = false; sel.style.left = `${r.left - 3}px`; sel.style.top = `${r.top - 3}px`; sel.style.width = `${r.width + 6}px`; sel.style.height = `${r.height + 6}px`;
++ handle.hidden = false; handle.style.left = `${r.right - 20}px`; handle.style.top = `${r.bottom - 20}px`;
++ styleBtn.hidden = false; styleBtn.style.left = `${r.left + 6}px`; styleBtn.style.top = `${r.top + 6}px`;
++ }
++ function select(id) {
++ if (selected && elOf(selected)) elOf(selected).removeAttribute('data-ov-selected');
++ selected = id;
++ if (id && elOf(id)) elOf(id).setAttribute('data-ov-selected', 'true');
++ positionSelection();
++ }
++
++ function labelOf(id) { return partName(catalog, id); }
++ function where(d, place) {
++ if (docked(place)) return `on the ${place.dock} edge, number ${Number(place.order) + 1}`;
++ return `column ${place.x + 1}, row ${place.y + 1}, ${place.w} by ${place.h} cells`;
++ }
++
++ function paintActions() {
++ const u = host.querySelector('[data-undo]'); if (u) u.disabled = !undoStack.length;
++ const s = host.querySelector('[data-save]'); if (s) s.disabled = saving || !dirty;
++ const sh = host.querySelector('[data-share]'); if (sh) sh.disabled = saving;
++ }
++
++ function refuse(reasons) {
++ setStatus((reasons && reasons[0]) ? `Can't do that: ${reasons[0]}` : "Can't do that.", 'bad');
++ const el = selectedEl(); if (el) el.setAttribute('data-ov-refused', 'true');
++ }
++
++ function commit(candidate, { announceText, push = true } = {}) {
++ const v = validate(candidate);
++ if (!v.ok) { refuse(v.reasons); return false; }
++ if (push) pushUndo();
++ working = candidate;
++ const el = selectedEl(); if (el) el.removeAttribute('data-ov-refused');
++ apply(working);
++ markDirty();
++ if (announceText) { const id = selected; setStatus(announceText, 'ok'); if (id) announce(`${labelOf(id)} is now ${where(device, entry(id).place)}.`); }
++ return true;
++ }
++
++ function moveBy(id, dx, dy) {
++ const e = clone(entry(id)); if (!e) return;
++ const p = catalogPart(catalog, id) || { min: { w: 1, h: 1 } };
++ if (docked(e.place)) {
++ if (dx) e.place.dock = dx < 0 ? 'left' : 'right';
++ else if (dy) e.place.dock = dy < 0 ? 'top' : 'bottom';
++ } else {
++ e.place.x = Math.max(0, Math.min(cols - e.place.w, e.place.x + dx));
++ e.place.y = Math.max(0, e.place.y + dy);
++ if (e.place.x === entry(id).place.x && e.place.y === entry(id).place.y) return;
++ }
++ const cand = snapshot();
++ const at = cand.parts.findIndex((x) => x.id === id);
++ cand.parts[at] = e;
++ commit(cand, { announceText: `${labelOf(id)} moved to ${where(device, e.place)}.` });
++ }
++
++ function resizeBy(id, dw, dh) {
++ const e = clone(entry(id)); if (!e) return;
++ const p = catalogPart(catalog, id) || { min: { w: 1, h: 1 } };
++ if (docked(e.place)) {
++ e.place.w = Math.max(1, Math.min(24, e.place.w + dw));
++ e.place.h = Math.max(1, Math.min(24, e.place.h + dh));
++ } else {
++ e.place.w = Math.max(1, Math.min(cols - e.place.x, e.place.w + dw));
++ e.place.h = Math.max(1, e.place.h + dh);
++ }
++ if (e.place.w === entry(id).place.w && e.place.h === entry(id).place.h) return;
++ const cand = snapshot();
++ const at = cand.parts.findIndex((x) => x.id === id);
++ cand.parts[at] = e;
++ commit(cand, { announceText: `${labelOf(id)} is now ${where(device, e.place)}.` });
++ }
++
++ // Pointer drag: move, then the corner handle for resize. A refused cell keeps the last one that passed.
++ function cellAt(clientX, clientY) {
++ const r = surface.getBoundingClientRect();
++ const col = Math.max(0, Math.min(cols - 1, Math.floor((clientX - r.left) / (r.width / cols))));
++ const rows = (getComputedStyle(surface).gridTemplateRows || '').split(/\s+/).map(parseFloat).filter((n) => n > 0);
++ let y = 0, top = r.top;
++ for (let i = 0; i < rows.length; i++) { if (clientY < top + rows[i]) { y = i; break; } top += rows[i]; y = i + 1; }
++ return { x: col, y };
++ }
++ function startDrag(e, id, mode) {
++ if (e.button != null && e.button !== 0) return;
++ const el = elOf(id); if (!el) return;
++ if (preview) { setStatus('Keep or discard the suggestion first.'); return; }
++ e.preventDefault();
++ select(id);
++ const p = clone(entry(id).place);
++ drag = { id, mode, startX: e.clientX, startY: e.clientY, place: p, before: snapshot(), pushed: false, moved: false };
++ el.setAttribute('data-ov-dragging', 'true');
++ try { (mode === 'resize' ? handle : el).setPointerCapture(e.pointerId); } catch (_) { /* */ }
++ onPointerMove = (ev) => {
++ if (!drag) return;
++ if (Math.abs(ev.clientX - drag.startX) + Math.abs(ev.clientY - drag.startY) < 3 && !drag.moved) return;
++ drag.moved = true;
++ const cand = snapshot();
++ const at = cand.parts.findIndex((x) => x.id === drag.id);
++ if (docked(drag.place)) {
++ if (drag.mode === 'resize') {
++ const colW = surface.getBoundingClientRect().width / cols;
++ const w = Math.max(1, Math.round((ev.clientX - drag.startX) / colW) + drag.place.w);
++ const h = Math.max(1, Math.round((ev.clientY - drag.startY) / cell) + drag.place.h);
++ if (w === cand.parts[at].place.w && h === cand.parts[at].place.h) return;
++ cand.parts[at].place.w = w; cand.parts[at].place.h = h;
++ } else {
++ const r = surface.getBoundingClientRect();
++ const dx = (ev.clientX - r.left) / Math.max(1, r.width);
++ const dy = (ev.clientY - r.top) / Math.max(1, r.height);
++ const dock = Math.abs(dx - 0.5) > Math.abs(dy - 0.5) ? (dx < 0.5 ? 'left' : 'right') : (dy < 0.5 ? 'top' : 'bottom');
++ const along = dock === 'left' || dock === 'right' ? dy : dx;
++ const order = Math.max(0, Math.min(63, Math.floor(along * 8)));
++ if (dock === cand.parts[at].place.dock && order === cand.parts[at].place.order) return;
++ cand.parts[at].place.dock = dock; cand.parts[at].place.order = order;
++ }
++ const v = validate(cand);
++ if (!v.ok) { refuse(v.reasons); return; }
++ if (!drag.pushed) { undoStack.push(drag.before); drag.pushed = true; }
++ working = cand; apply(working); markDirty();
++ return;
++ }
++ const c = cellAt(ev.clientX, ev.clientY);
++ if (drag.mode === 'resize') {
++ const w = Math.max(1, c.x - drag.place.x + 1);
++ const h = Math.max(1, c.y - drag.place.y + 1);
++ if (w === cand.parts[at].place.w && h === cand.parts[at].place.h) return;
++ cand.parts[at].place.w = w; cand.parts[at].place.h = h;
++ } else {
++ const colW = surface.getBoundingClientRect().width / cols;
++ const dx = Math.round((ev.clientX - drag.startX) / colW);
++ const x = Math.max(0, Math.min(cols - drag.place.w, drag.place.x + dx));
++ const y = Math.max(0, drag.place.y + (c.y - cellAt(drag.startX, drag.startY).y));
++ if (x === cand.parts[at].place.x && y === cand.parts[at].place.y) return;
++ cand.parts[at].place.x = x; cand.parts[at].place.y = y;
++ }
++ const v = validate(cand);
++ if (!v.ok) { refuse(v.reasons); return; }
++ if (!drag.pushed) { undoStack.push(drag.before); drag.pushed = true; }
++ working = cand; apply(working); markDirty();
++ };
++ onPointerUp = () => {
++ if (!drag) return;
++ const done = drag; drag = null;
++ const el2 = elOf(done.id);
++ if (el2) { el2.removeAttribute('data-ov-dragging'); el2.removeAttribute('data-ov-refused'); }
++ if (done.moved) {
++ const place = entry(done.id).place;
++ setStatus(`${labelOf(done.id)} is now ${where(device, place)}.`, 'ok');
++ announce(`${labelOf(done.id)} is now ${where(device, place)}.`);
++ }
++ positionSelection();
++ };
++ onPointerCancel = onPointerUp;
++ }
++ let onPointerMove = null, onPointerUp = null, onPointerCancel = null;
++ const pointerMove = (e) => { if (onPointerMove) onPointerMove(e); };
++ const pointerUp = (e) => { if (onPointerUp) { const f = onPointerUp; onPointerMove = null; onPointerUp = null; onPointerCancel = null; f(e); } };
++ doc.addEventListener('pointermove', pointerMove, { passive: true });
++ doc.addEventListener('pointerup', pointerUp);
++ doc.addEventListener('pointercancel', pointerUp);
++
++ // Long press (a phone) opens the sheet; a short press selects and focuses.
++ let pressTimer = null;
++ function onPartDown(e) {
++ const el = e.target.closest && e.target.closest('[data-ov-part]');
++ if (!el || !surface.contains(el)) return;
++ if (e.target.closest('.ov-arrange-handle, .ov-arrange-style')) return;
++ const id = el.dataset.ovPart;
++ select(id);
++ clearTimeout(pressTimer);
++ pressTimer = setTimeout(() => {
++ if (drag && drag.moved) return;
++ if (drag) {
++ // A long press is the part's sheet, not a drag: let go of the gesture before opening it.
++ const held = elOf(drag.id); drag = null;
++ onPointerMove = null; onPointerUp = null; onPointerCancel = null;
++ if (held) held.removeAttribute('data-ov-dragging');
++ }
++ openSheet(id);
++ }, 520);
++ startDrag(e, id, 'move');
++ if (e.pointerType === 'touch') try { el.setPointerCapture(e.pointerId); } catch (_) { /* */ }
++ }
++ surface.addEventListener('pointerdown', onPartDown);
++ const cancelPress = () => clearTimeout(pressTimer);
++ surface.addEventListener('pointerup', cancelPress);
++ surface.addEventListener('pointercancel', cancelPress);
++
++ // Keyboard: arrows move, Shift+arrows resize, Enter opens the sheet.
++ function onKey(e) {
++ const el = e.target.closest && e.target.closest('[data-ov-part]');
++ if (!el) return;
++ const id = el.dataset.ovPart;
++ if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); openSheet(id); return; }
++ if (!/^Arrow(Up|Down|Left|Right)$/.test(e.key)) return;
++ e.preventDefault();
++ const dx = e.key === 'ArrowLeft' ? -1 : e.key === 'ArrowRight' ? 1 : 0;
++ const dy = e.key === 'ArrowUp' ? -1 : e.key === 'ArrowDown' ? 1 : 0;
++ if (e.shiftKey) resizeBy(id, dx, dy); else moveBy(id, dx, dy);
++ }
++ surface.addEventListener('keydown', onKey);
++
++ handle.addEventListener('pointerdown', (e) => { if (selected) startDrag(e, selected, 'resize'); });
++ styleBtn.addEventListener('click', () => { if (selected) openSheet(selected); });
++
++ // ── The part's sheet ─────────────────────────────────────────────────────────────────────
++ let sheet = null;
++ function closeSheet() { if (sheet) { sheet.remove(); sheet = null; select(selected); } }
++ function openSheet(id) {
++ closeSheet();
++ const p = catalogPart(catalog, id), e = entry(id);
++ if (!p || !e) return;
++ select(id);
++ sheet = doc.createElement('section');
++ sheet.className = 'ov-arrange-sheet';
++ sheet.setAttribute('role', 'dialog');
++ sheet.setAttribute('aria-modal', 'false');
++ sheet.setAttribute('aria-label', `${p.name}`);
++ const tints = (p.styles && p.styles.tints) || catalog.theme_tokens || ['surface'];
++ const shapes = (p.styles && p.styles.shapes) || ['square'];
++ const wp = clone(e.place);
++ sheet.innerHTML = `<button type="button" class="ovk-btn ovk-btn--quiet ov-arrange-close" data-close>Close</button>
++<h2>${esc(p.name)}</h2>
++${p.required ? '<p>The Stop has to stay visible and at its size.</p>' : ''}
++<label class="ov-arrange-row"><input type="checkbox" data-visible${e.visible === false ? '' : ' checked'}${p.required ? ' disabled' : ''}> <span>Visible</span></label>
++<div class="ov-arrange-row"><span>Size</span><div class="ov-arrange-opts">
++${(p.sizes || []).filter((s) => s.w >= p.min.w && s.h >= p.min.h).map((s) => `<label><input type="radio" name="ov-arrange-size" value="${s.w}x${s.h}"${docked(e.place) ? ' disabled' : (e.place.w === s.w && e.place.h === s.h ? ' checked' : '')}>${s.w} × ${s.h}</label>`).join('')}
++<label>Width <input type="number" min="${p.min.w}" max="24" value="${e.place.w}" data-w style="width:4.5rem"></label>
++<label>Height <input type="number" min="${p.min.h}" max="24" value="${e.place.h}" data-h style="width:4.5rem"></label>
++</div></div>
++<div class="ov-arrange-row"><span>Colour</span><div class="ov-arrange-opts">${(catalog.theme_tokens || tints).filter((t) => tints.includes(t)).map((t) => `<label><input type="radio" name="ov-arrange-tint" value="${esc(t)}"${e.style.tint === t ? ' checked' : ''}>${esc(t)}</label>`).join('')}</div></div>
++<div class="ov-arrange-row"><span>Shape</span><div class="ov-arrange-opts">${shapes.map((s) => `<label><input type="radio" name="ov-arrange-shape" value="${esc(s)}"${e.style.shape === s ? ' checked' : ''}>${esc(s)}</label>`).join('')}</div></div>
++<div class="ov-arrange-row"><span>Opacity</span><input type="range" min="0.4" max="1" step="0.05" value="${e.style.opacity}" data-opacity></div>
++<label class="ov-arrange-row"><input type="checkbox" data-label${e.style.label === false ? '' : ' checked'}> <span>Show its label</span></label>
++<div class="ov-arrange-row"><span>Keys</span><input type="text" data-keys value="${esc(((e.bindings && e.bindings.keys) || []).join(' '))}" placeholder="${esc(((p.bindings && p.bindings.keys) || []).join(' '))}" aria-label="Keys"></div>
++<div class="ov-arrange-row"><span>Gamepad</span><input type="text" data-gamepad value="${esc(((e.bindings && e.bindings.gamepad) || []).join(' '))}" placeholder="${esc(((p.bindings && p.bindings.gamepad) || []).join(' '))}" aria-label="Gamepad controls"></div>
++<p class="ov-arrange-status" data-sheet-status role="status" aria-live="polite"></p>`;
++ doc.body.appendChild(sheet);
++ const sheetStatus = sheet.querySelector('[data-sheet-status]');
++ const setSheetStatus = (t, tone) => { sheetStatus.textContent = t; sheetStatus.dataset.tone = tone || ''; announce(t); };
++ function change(fn) {
++ const cand = snapshot();
++ const at = cand.parts.findIndex((x) => x.id === id);
++ fn(cand.parts[at], p);
++ const v = validate(cand);
++ if (!v.ok) { setSheetStatus(`Can't do that: ${v.reasons[0]}`, 'bad'); return false; }
++ pushUndo(); working = cand; apply(working); markDirty(); setSheetStatus('', ''); return true;
++ }
++ sheet.querySelector('[data-close]').addEventListener('click', closeSheet);
++ sheet.querySelector('[data-visible]').addEventListener('change', (ev) => {
++ const on = ev.target.checked;
++ const ok = change((x) => { x.visible = on; });
++ if (!ok) ev.target.checked = !on;
++ else announce(`${p.name} is ${on ? 'shown' : 'hidden'}.`);
++ });
++ sheet.querySelectorAll('input[name="ov-arrange-size"]').forEach((r) => r.addEventListener('change', () => {
++ const [w, h] = r.value.split('x').map(Number);
++ if (change((x) => { x.place.w = w; x.place.h = h; })) announce(`${p.name} is now ${w} by ${h} cells.`);
++ }));
++ const wIn = sheet.querySelector('[data-w]'), hIn = sheet.querySelector('[data-h]');
++ for (const [inp, key] of [[wIn, 'w'], [hIn, 'h']]) inp.addEventListener('change', () => {
++ const n = Number(inp.value);
++ if (!Number.isInteger(n) || n < 1) { setSheetStatus(`Can't do that: ${p.name} needs at least ${key === 'w' ? p.min.w : p.min.h} cells.`, 'bad'); return; }
++ change((x) => { x.place[key] = n; });
++ });
++ sheet.querySelectorAll('input[name="ov-arrange-tint"]').forEach((r) => r.addEventListener('change', () => { if (change((x) => { x.style.tint = r.value; })) announce(`${p.name} is ${r.value}.`); }));
++ sheet.querySelectorAll('input[name="ov-arrange-shape"]').forEach((r) => r.addEventListener('change', () => { if (change((x) => { x.style.shape = r.value; })) announce(`${p.name} is ${r.value}.`); }));
++ const op = sheet.querySelector('[data-opacity]');
++ op.addEventListener('change', () => { if (change((x) => { x.style.opacity = Number(op.value); })) announce(`${p.name} is ${Math.round(op.value * 100)}% visible.`); });
++ sheet.querySelector('[data-label]').addEventListener('change', (ev) => { const on = ev.target.checked; if (change((x) => { x.style.label = on; })) announce(`${p.name}'s label is ${on ? 'shown' : 'hidden'}.`); });
++ const keys = sheet.querySelector('[data-keys]'), pad = sheet.querySelector('[data-gamepad]');
++ const parse = (v) => String(v || '').trim().split(/\s+/).filter(Boolean);
++ keys.addEventListener('change', () => { const v = parse(keys.value); if (change((x) => { x.bindings.keys = v; })) announce(`${p.name}'s keys: ${v.join(' ') || 'none'}.`); });
++ pad.addEventListener('change', () => { const v = parse(pad.value); if (change((x) => { x.bindings.gamepad = v; })) announce(`${p.name}'s gamepad: ${v.join(' ') || 'none'}.`); });
++ const first = sheet.querySelector('[data-close]'); if (first) first.focus();
++ }
++ function onDocKey(e) {
++ if (e.key === 'Escape') { if (sheet) closeSheet(); else if (preview) discardPreview(); }
++ }
++ doc.addEventListener('keydown', onDocKey);
++
++ // ── Ask OpenVibe, previewed ───────────────────────────────────────────────────────────────
++ const ask = host.querySelector('form[data-ask]');
++ const words = host.querySelector('#ov-arrange-words');
++ let previewBar = null;
++ function showPreview(sug, wordText) {
++ preview = { layout: normal(sug.layout), summary: sug.summary || '', reasons: sug.reasons || [], words: wordText, model: sug.receipt && sug.receipt.model ? String(sug.receipt.model) : '' };
++ apply(preview.layout);
++ if (previewBar) previewBar.remove();
++ previewBar = doc.createElement('div');
++ previewBar.className = 'ov-arrange-preview';
++ previewBar.setAttribute('role', 'group');
++ previewBar.setAttribute('aria-label', 'OpenVibe\'s suggestion');
++ previewBar.innerHTML = `<p><b>OpenVibe suggests:</b> ${esc(preview.summary)}${preview.model ? ` <span class="ov-arrange-by">(${esc(preview.model)})</span>` : ''}</p><button type="button" class="ovk-btn ovk-btn--primary" data-keep>Keep</button><button type="button" class="ovk-btn ovk-btn--quiet" data-discard>Discard</button>`;
++ host.querySelector('.ov-arrange-actions').before(previewBar);
++ previewBar.querySelector('[data-keep]').addEventListener('click', keepPreview);
++ previewBar.querySelector('[data-discard]').addEventListener('click', discardPreview);
++ setStatus(preview.summary || 'Previewing OpenVibe\'s suggestion.', 'ok');
++ announce(`OpenVibe suggests: ${preview.summary}. Keep or discard.`);
++ }
++ function keepPreview() {
++ if (!preview) return;
++ pushUndo(); working = preview.layout; preview = null;
++ if (previewBar) { previewBar.remove(); previewBar = null; }
++ apply(working); markDirty(); setStatus('Kept. Save it to keep it for next time.', 'ok');
++ announce('Kept the suggestion. Save it to keep it.');
++ }
++ function discardPreview() {
++ if (!preview) return;
++ preview = null;
++ if (previewBar) { previewBar.remove(); previewBar = null; }
++ apply(working); setStatus('Discarded the suggestion.');
++ announce('Discarded the suggestion.');
++ }
++ ask.addEventListener('submit', async (e) => {
++ e.preventDefault();
++ const text = words.value.trim();
++ if (!text) return;
++ if (typeof opts.onAsk !== 'function') { setStatus('Ask OpenVibe needs a signed-in person.', 'bad'); return; }
++ if (preview) discardPreview();
++ setStatus('Asking OpenVibe…');
++ ask.querySelector('button').disabled = true;
++ try {
++ const request = { catalog, layout: clone(working), words: text, device };
++ const sug = await opts.onAsk(text, request);
++ if (!sug) { setStatus("OpenVibe couldn't answer. Try again.", 'bad'); return; }
++ if (sug.ok === false || !isObj(sug.layout)) {
++ const why = (sug.reasons && sug.reasons[0]) || sug.summary || "OpenVibe couldn't do that.";
++ setStatus(`Can't do that: ${why}`, 'bad'); return;
++ }
++ const v = validate(sug.layout);
++ if (!v.ok) { setStatus(`Can't do that: ${v.reasons[0]}`, 'bad'); return; }
++ showPreview(sug, text);
++ } catch (err) {
++ setStatus(`OpenVibe could not answer: ${String(err && err.message || err)}`, 'bad');
++ } finally { ask.querySelector('button').disabled = false; }
++ });
++
++ // ── Save, Share, Reset, Undo, Done ───────────────────────────────────────────────────────
++ host.querySelector('[data-undo]').addEventListener('click', () => {
++ if (!undoStack.length) return;
++ working = undoStack.pop(); preview = null;
++ if (previewBar) { previewBar.remove(); previewBar = null; }
++ apply(working); markDirty(); setStatus('Undone.'); announce('Undone.');
++ });
++ host.querySelector('[data-reset]').addEventListener('click', async () => {
++ preview = null;
++ if (previewBar) { previewBar.remove(); previewBar = null; }
++ pushUndo(); working = defaults(); apply(working); markDirty();
++ if (typeof opts.onReset !== 'function') { setStatus('Reset to the default. Save it to keep it.', 'ok'); announce('Reset to the default.'); return; }
++ setStatus('Resetting to the default…');
++ try {
++ const r = await opts.onReset({ surface: catalog.id, device });
++ if (r && r.ok === false) { setStatus(`Couldn't reset: ${(r.reasons && r.reasons[0]) || 'try again.'}`, 'bad'); return; }
++ dirty = false; paintActions();
++ setStatus('Reset to the default.', 'ok'); announce('Reset to the default. It comes back next time.');
++ } catch (err) { setStatus(`Couldn't reset: ${String(err && err.message || err)}`, 'bad'); }
++ });
++ host.querySelector('[data-save]').addEventListener('click', async () => {
++ if (saving) return;
++ const v = validate(working);
++ if (!v.ok) { refuse(v.reasons); return; }
++ if (typeof opts.onSave !== 'function') { setStatus('Sign in to save your layout.', 'bad'); return; }
++ saving = true; paintActions(); setStatus('Saving…');
++ try {
++ const r = await opts.onSave(clone(working), { surface: catalog.id, device });
++ if (r && r.ok === false) { setStatus(`Couldn't save: ${(r.reasons && r.reasons[0]) || r.message || 'try again.'}`, 'bad'); return; }
++ dirty = false; setStatus('Saved. It follows you to your other devices.', 'ok');
++ announce('Saved.');
++ } catch (err) { setStatus(`Couldn't save: ${String(err && err.message || err)}`, 'bad'); }
++ finally { saving = false; paintActions(); }
++ });
++ host.querySelector('[data-share]').addEventListener('click', async () => {
++ if (typeof opts.onShare !== 'function') { setStatus('Sign in to share a layout.', 'bad'); return; }
++ const v = validate(working);
++ if (!v.ok) { refuse(v.reasons); return; }
++ setStatus('Making a share link…');
++ try {
++ const r = await opts.onShare(clone(working), { surface: catalog.id, device });
++ if (!r || !r.url) { setStatus(`Couldn't share: ${(r && r.reasons && r.reasons[0]) || 'try again.'}`, 'bad'); return; }
++ shareBox(r.url);
++ setStatus('Shared. Anyone with the link can use this arrangement.', 'ok');
++ } catch (err) { setStatus(`Couldn't share: ${String(err && err.message || err)}`, 'bad'); }
++ });
++ function shareBox(url) {
++ const box = doc.createElement('div');
++ box.className = 'ov-arrange-share';
++ box.innerHTML = `<label>Share this arrangement<input type="text" readonly value="${esc(url)}" aria-label="Share link"></label><button type="button" class="ovk-btn ovk-btn--quiet" data-copy>Copy link</button>`;
++ host.querySelector('.ov-arrange-status').before(box);
++ const input = box.querySelector('input');
++ box.querySelector('[data-copy]').addEventListener('click', async () => {
++ input.select();
++ try { await navigator.clipboard.writeText(url); setStatus('Link copied.', 'ok'); }
++ catch (_) { setStatus('Select the link and copy it.', 'ok'); }
++ });
++ }
++ function close({ force = false } = {}) {
++ if (closed) return;
++ if (dirty && !force && !confirmFn('Leave without saving your arrangement?')) return;
++ closed = true;
++ if (previewBar) previewBar.remove();
++ if (sheet) sheet.remove();
++ host.remove(); live.remove(); sel.remove(); handle.remove(); styleBtn.remove();
++ doc.removeEventListener('pointermove', pointerMove);
++ doc.removeEventListener('pointerup', pointerUp);
++ doc.removeEventListener('pointercancel', pointerUp);
++ doc.removeEventListener('keydown', onDocKey);
++ root.removeEventListener('resize', positionSelection);
++ doc.removeEventListener('scroll', positionSelection, true);
++ surface.removeEventListener('pointerdown', onPartDown);
++ surface.removeEventListener('keydown', onKey);
++ if (surfaceStyle == null) surface.removeAttribute('style'); else surface.setAttribute('style', surfaceStyle);
++ surface.className = surfaceClass;
++ if (surfaceCustom == null) surface.removeAttribute('data-ov-custom'); else surface.setAttribute('data-ov-custom', surfaceCustom);
++ for (const [el, o] of originals) {
++ for (const a of ['data-ov-selected', 'data-ov-dragging', 'data-ov-refused', 'data-ov-flatten', 'data-ov-tint', 'data-ov-shape', 'data-ov-label', 'data-ov-keys', 'data-ov-gamepad', 'data-ov-dock', 'data-ov-order']) el.removeAttribute(a);
++ if (o.style == null) el.removeAttribute('style'); else el.setAttribute('style', o.style);
++ el.hidden = o.hidden;
++ if (o.tabindex == null) el.removeAttribute('tabindex'); else el.setAttribute('tabindex', o.tabindex);
++ if (o.role == null) el.removeAttribute('role'); else el.setAttribute('role', o.role);
++ if (o.label == null) el.removeAttribute('aria-label'); else el.setAttribute('aria-label', o.label);
++ el.className = o.cls;
++ }
++ for (const x of innerTab) { if (x.tabindex == null) x.el.removeAttribute('tabindex'); else x.el.setAttribute('tabindex', x.tabindex); }
++ for (const a of surface.querySelectorAll('[data-ov-flatten]')) a.removeAttribute('data-ov-flatten');
++ if (typeof opts.onApply === 'function') try { opts.onApply(clone(working)); } catch (_) { /* */ }
++ if (typeof opts.onClose === 'function') try { opts.onClose(clone(working), { dirty }); } catch (_) { /* */ }
++ }
++ host.querySelector('[data-done]').addEventListener('click', () => close());
++
++ surface.classList.add('ov-arrange-editing');
++ apply(working);
++ paintActions();
++ positionSelection();
++ root.addEventListener('resize', positionSelection, { passive: true });
++ doc.addEventListener('scroll', positionSelection, { passive: true, capture: true });
++ setStatus('Arrange: drag a part, or use the arrow keys. Shift with the arrows resizes.');
++ return { close, apply: (lay) => { working = normal(lay); apply(working); }, layout: () => clone(working), destroy: () => close({ force: true }), get core() { return core; } };
++ }
++
++ root.OVArrange = { open, validate: fallbackValidate, defaults: fallbackDefaults, _fallback: { validate: fallbackValidate, defaults: fallbackDefaults }, VERSION };
++ loadCore().then((c) => { if (c) { fallbackValidate.sdk = c; root.OVArrange.core = c; } }).catch(() => { /* the fallback rules stay */ });
++})(typeof window !== 'undefined' ? window : globalThis);
ddiff --git a/ov-glyphs-bold.woff2 b/ov-glyphs-bold.woff2
iindex 56a861f..c117175 100644
BBinary files a/ov-glyphs-bold.woff2 and b/ov-glyphs-bold.woff2 differ
ddiff --git a/ov-glyphs-fa.css b/ov-glyphs-fa.css
iindex ff6b07d..7d66b7f 100644
---- a/ov-glyphs-fa.css
++++ b/ov-glyphs-fa.css
@@@ -600,6 +600,8 @@
.fa-duotone.fa-hand::after{content:"\e03f";position:absolute;font-family:"OV Glyphs Solid";opacity:.2}
.fa-duotone.fa-hand-pointer::after{content:"\e03f";position:absolute;font-family:"OV Glyphs Solid";opacity:.2}
.fa-duotone.fa-hand-point-right::after{content:"\e03f";position:absolute;font-family:"OV Glyphs Solid";opacity:.2}
++.fa-duotone.fa-handshake::after{content:"\e0e5";position:absolute;font-family:"OV Glyphs Solid";opacity:.2}
++.fa-duotone.fa-handshake-angle::after{content:"\e0e5";position:absolute;font-family:"OV Glyphs Solid";opacity:.2}
.fa-duotone.fa-headphones::after{content:"\e0a8";position:absolute;font-family:"OV Glyphs Solid";opacity:.2}
.fa-duotone.fa-headphones-simple::after{content:"\e0a8";position:absolute;font-family:"OV Glyphs Solid";opacity:.2}
.fa-duotone.fa-headset::after{content:"\e0a8";position:absolute;font-family:"OV Glyphs Solid";opacity:.2}
ddiff --git a/ov-glyphs-font.css b/ov-glyphs-font.css
iindex 92cdb22..16722c5 100644
---- a/ov-glyphs-font.css
++++ b/ov-glyphs-font.css
@@@ -371,6 +371,7 @@
.ovi-duotone.ovi-group::before{font-family:"OV Glyphs"}.ovi-duotone.ovi-group::after{content:"\e0a6";position:absolute;font-family:"OV Glyphs Solid";opacity:.2;pointer-events:none}
.ovi-duotone.ovi-hammer::before{font-family:"OV Glyphs"}.ovi-duotone.ovi-hammer::after{content:"\e0e4";position:absolute;font-family:"OV Glyphs Solid";opacity:.2;pointer-events:none}
.ovi-duotone.ovi-hand::before{font-family:"OV Glyphs"}.ovi-duotone.ovi-hand::after{content:"\e03f";position:absolute;font-family:"OV Glyphs Solid";opacity:.2;pointer-events:none}
++.ovi-duotone.ovi-handshake::before{font-family:"OV Glyphs"}.ovi-duotone.ovi-handshake::after{content:"\e0e5";position:absolute;font-family:"OV Glyphs Solid";opacity:.2;pointer-events:none}
.ovi-duotone.ovi-headphones::before{font-family:"OV Glyphs"}.ovi-duotone.ovi-headphones::after{content:"\e0a8";position:absolute;font-family:"OV Glyphs Solid";opacity:.2;pointer-events:none}
.ovi-duotone.ovi-heart::before{font-family:"OV Glyphs"}.ovi-duotone.ovi-heart::after{content:"\e041";position:absolute;font-family:"OV Glyphs Solid";opacity:.2;pointer-events:none}
.ovi-duotone.ovi-heart-broken::before{font-family:"OV Glyphs"}.ovi-duotone.ovi-heart-broken::after{content:"\e0e6";position:absolute;font-family:"OV Glyphs Solid";opacity:.2;pointer-events:none}
ddiff --git a/ov-glyphs-light.woff2 b/ov-glyphs-light.woff2
iindex dd99397..561c5e3 100644
BBinary files a/ov-glyphs-light.woff2 and b/ov-glyphs-light.woff2 differ
ddiff --git a/ov-glyphs-solid.woff2 b/ov-glyphs-solid.woff2
iindex e87c79a..8e37c2a 100644
BBinary files a/ov-glyphs-solid.woff2 and b/ov-glyphs-solid.woff2 differ
ddiff --git a/ov-glyphs-thin.woff2 b/ov-glyphs-thin.woff2
iindex 8fa204e..e740282 100644
BBinary files a/ov-glyphs-thin.woff2 and b/ov-glyphs-thin.woff2 differ
ddiff --git a/ov-glyphs.js b/ov-glyphs.js
iindex 5bf4b03..f4bdb50 100644
---- a/ov-glyphs.js
++++ b/ov-glyphs.js
@@@ -23,8 +23,8 @@
(function () {
'use strict';
if (typeof window === 'undefined' || window.OVGlyphs) return;
-- const G = {"airplane":"<path d=\"M12 3.2c0.9 0 1.4 0.9 1.4 2.4V9.8l7 4.2V15.4l-7-2.4V17.2l1.9 1.4V20L12 19.1l-3.3 0.9v-1.4l1.9-1.4v-4.2L3.6 15.4v-1.4L10.6 9.8V5.6C10.6 4.2 11.1 3.2 12 3.2Z\"/>","alert":"<path d=\"M12 4.5L3.6 18.8h16.9Z\"/><path d=\"M12 10v3.7M12 16.5h0\"/>","alert-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.5v5.5M12 16.5h.01\"/>","align-left":"<path d=\"M4 5.9h16.6M4 10h10.4M4 14.3h16.6M4 18.5h10.4\"/>","archive":"<rect x=\"3.5\" y=\"4.8\" width=\"17\" height=\"4.7\" rx=\"0.9\"/><path d=\"M5.4 9.5v9.4a0.9 0.9 0 0 0 0.9 0.9h11.3a0.9 0.9 0 0 0 0.9-0.9V9.5M10.1 13.3h3.8\"/>","arrow-down":"<path d=\"M12 3.2v16.7M5.7 13.7l6.3 6.3l6.3-6.3\"/>","arrow-left":"<path d=\"M20.8 12H4M10.3 5.7l-6.3 6.3l6.3 6.3\"/>","arrow-right":"<path d=\"M3.2 12h16.7M13.7 5.7l6.3 6.3l-6.3 6.3\"/>","arrow-up":"<path d=\"M12 20.8V4M5.7 10.3l6.3-6.3l6.3 6.3\"/>","arrows-h":"<path d=\"M3.8 12h16.5M7.6 8.1l-3.9 3.9l3.9 3.9M16.4 8.1l3.9 3.9l-3.9 3.9\"/>","at":"<circle cx=\"12\" cy=\"12\" r=\"3.4\"/><path d=\"M15.4 12v1.3a2.5 2.5 0 0 0 4.9 0V12a8.3 8.3 0 1 0-3.2 6.5\"/>","back":"<path d=\"M16.1 3.6l-8.4 8.4l8.4 8.4\"/>","ban":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m6 6 12 12\"/>","bell":"<path d=\"M6 14.6V9.5a6.1 6.1 0 0 1 12.2 0v5.1l1.5 2.1h-15.3ZM10 18.7a2.1 2.1 0 0 0 4 0\"/>","book":"<path d=\"M5 5.7a1.9 1.9 0 0 1 1.9-1.9h12.1v14.9H6.8a1.9 1.9 0 0 0-1.9 1.9Z\"/><path d=\"M5 18.7V5.7\"/>","book-open":"<path d=\"M12 6.3C10 4.8 7 4.3 3.5 4.9v13.2c3.5-0.6 6.5-0.1 8.5 1.4c2-1.5 5-2 8.5-1.4V4.9C17 4.3 14 4.8 12 6.3Z\"/><path d=\"M12 6.3v13.2\"/>","box":"<path d=\"M3.6 7.9L11.9 3.9l8.4 3.9v8.4L11.9 20.1l-8.4-3.9Z\"/><path d=\"M3.6 7.9L11.9 11.8l8.4-3.9M11.9 11.8v8.4M7.8 5.9l8.4 3.9\"/>","brain":"<path d=\"M9.2 4.2a2.8 2.8 0 0 0-2.8 2.8a2.8 2.8 0 0 0-1.9 4.8a2.8 2.8 0 0 0 1.9 4.8a2.8 2.8 0 0 0 5.8 1.1V5.8A1.9 1.9 0 0 0 9.2 4.2ZM14.9 4.2a2.8 2.8 0 0 1 2.8 2.8a2.8 2.8 0 0 1 1.9 4.8a2.8 2.8 0 0 1-1.9 4.8a2.8 2.8 0 0 1-5.8 1.1\"/>","branch":"<circle cx=\"6.7\" cy=\"5.6\" r=\"1.9\"/><circle cx=\"6.7\" cy=\"18.6\" r=\"1.9\"/><circle cx=\"17.9\" cy=\"7.5\" r=\"1.9\"/><path d=\"M6.7 7.5v9.3M17.9 9.3c0 5.1-6 3.7-10.2 7.9\"/>","bridge":"<path d=\"M3.5 16h17M7 19.5V5M17 19.5V5\"/><path d=\"M3.5 10c1.8 0 2.8-2.3 3.5-5c2.4 5.2 7.6 5.2 10 0c.7 2.7 1.7 5 3.5 5\"/><path d=\"M12 10.9V16\"/>","briefcase":"<rect x=\"3.5\" y=\"7.2\" width=\"17\" height=\"12.3\" rx=\"1.9\"/><path d=\"M9.2 7.2V5.7A1.4 1.4 0 0 1 10.6 4.3h2.8A1.4 1.4 0 0 1 14.8 5.7V7.2M3.5 12.3h7.1M13.4 12.3H20.5M10.6 11.4h2.8v2.4h-2.8Z\"/>","bug":"<rect x=\"7.2\" y=\"6.2\" width=\"9.6\" height=\"13.3\" rx=\"4.8\"/><path d=\"M9.3 6.5a2.7 2.7 0 0 1 5.3 0M12 10.9v8.5M7.2 12H3.5M20.5 12h-3.7M7.6 8.3L4.6 5.6M16.4 8.3L19.4 5.6M7.6 16.3L4.6 18.9M16.4 16.3L19.4 18.9\"/>","burst":"<path d=\"M11.9 3.7L13.6 7.8L17.8 6.2L16.2 10.4L20.3 12.1L16.2 13.8L17.8 18L13.6 16.4L11.9 20.4L10.2 16.4L6 18L7.6 13.8L3.6 12.1L7.6 10.4L6 6.2L10.2 7.8Z\"/>","busy":"<path d=\"M4.7 12h0M12.1 12h0M19.4 12h0\" stroke-width=\"4.2\"/>","calendar":"<rect x=\"4\" y=\"5.5\" width=\"16\" height=\"15\" rx=\"2\"/><path d=\"M4 10.5h16M9 3.5v4M15 3.5v4\"/>","camera":"<path d=\"M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z\"/><circle cx=\"12\" cy=\"13.3\" r=\"3.4\"/>","camera-flip":"<path d=\"M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z\"/><path d=\"M15 12.6a3.1 3.1 0 0 0-5.6-1.2M9 14.4a3.1 3.1 0 0 0 5.6 1.2M9.3 9.5v2h2M14.7 17.5v-2h-2\"/>","camera-off":"<path d=\"M3.7 7.9h3.3l1.7-2.7h6.4L16.9 7.9h3.3v11.2h-16.5Z\"/><circle cx=\"11.9\" cy=\"13\" r=\"3.3\"/><path d=\"M3.7 3.5l16.5 16.5\"/>","car":"<path d=\"M3.5 15.8v-4.5L6.2 5.8h11.6l2.7 5.5V15.8Z\"/><path d=\"M3.5 11.3h17M6.5 15.8v2.5M17.5 15.8v2.5M7.2 13.8h0M16.8 13.8h0\"/>","card":"<rect x=\"3.7\" y=\"5.8\" width=\"16.7\" height=\"12.3\" rx=\"1.8\"/><path d=\"M3.7 10.3h16.7M6.7 14.6h3.5\"/>","care":"<path d=\"M3.3 16.5h3.2l4.2 3.2h5.8a2.2 2.2 0 0 0 0-4.2H12.8M7.5 16.5l2.4-2.2h3.5\"/><path d=\"M16.6 10.6s-3.4-2.2-3.4-4.7a2.1 2.1 0 0 1 3.4-1.4a2.1 2.1 0 0 1 3.4 1.4c0 2.6-3.4 4.7-3.4 4.7Z\"/>","cart":"<path d=\"M3.5 4.1h1.9l2.2 10.2h10.2L20.3 6.9H6.5\"/><circle cx=\"9.1\" cy=\"18.6\" r=\"1.2\"/><circle cx=\"16.5\" cy=\"18.6\" r=\"1.2\"/>","cc":"<rect x=\"3.5\" y=\"5.4\" width=\"17\" height=\"13.2\" rx=\"2.4\"/><path d=\"M10.7 10.2a2.3 2.3 0 1 0 0 3.6M16.8 10.2a2.3 2.3 0 1 0 0 3.6\"/>","chart":"<path d=\"M3.9 3.4v16.7h16.7\"/><path d=\"M7.7 14.5l3.6-4.1l3.2 2.7l5.2-6.3\"/>","chat":"<path d=\"M3.8 4.3h16.8v11.7H8l-4.2 4.2Z\"/>","chat-off":"<path d=\"M4.2 5.1h15.7v10.9H8l-4 4Z\"/><path d=\"M3.7 3.7l16.7 16.7\"/>","check":"<path d=\"M3.7 12.1l5.4 5.4L20.4 6.1\"/>","check-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m8 12.4 2.8 2.8L16 9.6\"/>","check-double":"<path d=\"M3.6 11.7l3.6 3.6L14.6 7.7M11.1 15.2l0.9 0.9L20.4 7.7\"/>","chevron":"<path d=\"M7.9 3.6l8.4 8.4l-8.4 8.4\"/>","chevrons-left":"<path d=\"M10.9 19.3l-7.3-7.3l7.3-7.3M20.4 19.3l-7.3-7.3l7.3-7.3\"/>","chevrons-right":"<path d=\"M3.6 19.3l7.3-7.3l-7.3-7.3M13.1 19.3l7.3-7.3l-7.3-7.3\"/>","child":"<circle cx=\"12\" cy=\"5.8\" r=\"2.1\"/><path d=\"M7.9 10.5L12 9.2l4.1 1.4M12 9.2v5.6M9.2 20.4l2.8-5.6l2.8 5.6\"/>","chip":"<rect x=\"7.3\" y=\"7.3\" width=\"9.4\" height=\"9.4\" rx=\"1.4\"/><path d=\"M10.1 3.5v3.8M13.9 3.5v3.8M10.1 16.7v3.8M13.9 16.7v3.8M3.5 10.1h3.8M3.5 13.9h3.8M16.7 10.1h3.8M16.7 13.9h3.8\"/>","circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/>","city":"<path d=\"M3.5 19.7h17M5.4 19.7V8.3h4.7v11.3M10.1 19.7V3.6h5.7v16.1M15.8 19.7v-7.6h3.3v7.6M7.8 11.2h0M7.8 14.5h0M12.9 6.9h0M12.9 10.2h0M12.9 13.5h0\"/>","clapper":"<path d=\"M4 10.4h16.3v8.6a1 1 0 0 1-1 1h-14.4a1 1 0 0 1-1-1Z\"/><path d=\"M4 10.4L3.4 7.2l15.7-2.9l0.7 3.3ZM8.5 6.3l2.2 3.2M13.3 5.4l2.2 3.2\"/>","clipboard":"<rect x=\"5.7\" y=\"5\" width=\"12.6\" height=\"15.5\" rx=\"1.9\"/><path d=\"M9.1 5V3.5h5.8V5M9.1 10.8h5.8M9.1 14.7h3.9\"/>","clipboard-check":"<rect x=\"5.7\" y=\"4.9\" width=\"12.6\" height=\"15.5\" rx=\"1.9\"/><path d=\"M9.1 4.9V3.5h5.8V4.9M9.1 13.2l1.9 1.9l3.9-3.9\"/>","clock":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.5V12l3 2\"/>","close":"<path d=\"M3.7 3.7l16.7 16.7M20.4 3.7L3.7 20.4\"/>","cloud":"<path d=\"M7.8 17.6h8.9a3.4 3.4 0 0 0 0.5-7A5.2 5.2 0 0 0 6.9 10.1A3.7 3.7 0 0 0 7.8 17.6Z\"/>","cloud-off":"<path d=\"M7.5 17.6h9.5a3.8 3.8 0 0 0 0.5-7.5A5.7 5.7 0 0 0 6.4 9.6A4.1 4.1 0 0 0 7.5 17.6Z\"/><path d=\"M4 3.9l16.1 16.1\"/>","code":"<path d=\"M7.8 7.8l-4.2 4.2l4.2 4.2M16.2 7.8l4.2 4.2l-4.2 4.2M14.2 4.6l-4.2 14.8\"/>","coin":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M14.5 9.2c-.5-.8-1.4-1.2-2.5-1.2-1.5 0-2.5.8-2.5 2s1 1.6 2.5 2 2.5.8 2.5 2-1 2-2.5 2c-1.1 0-2-.4-2.5-1.2M12 6.5v11\"/>","columns":"<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M12 4.5v15M3.5 9h17\"/>","commit":"<circle cx=\"12\" cy=\"12\" r=\"3.4\"/><path d=\"M3.5 12h5.1M15.4 12H20.5\"/>","compass":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m15.6 8.4-2.1 5.1-5.1 2.1 2.1-5.1Z\"/>","compress":"<path d=\"M8.8 3.5v5.3H3.5M15.2 3.5v5.3h5.3M8.8 20.5v-5.3H3.5M15.2 20.5v-5.3h5.3\"/>","computer":"<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"11.3\" rx=\"1.9\"/><path d=\"M8.2 19.7h7.6M12 15.9v3.8\"/>","contrast":"<circle cx=\"11.7\" cy=\"12\" r=\"8.4\"/><path d=\"M11.7 3.6v16.7M11.7 7.9h6.5M11.7 12h8.4M11.7 16.2h6.5\"/>","cookie":"<path d=\"M20.6 12.3a8.4 8.4 0 1 1-8.9-8.9a3 3 0 0 0 3.9 3.5a3 3 0 0 0 4.9 5.3Z\"/><path d=\"M8.8 9.4h0M12.2 13.8h0M8.3 15.3h0M15.7 15.3h0\"/>","copy":"<rect x=\"8\" y=\"8\" width=\"12.5\" height=\"12.5\" rx=\"2.1\"/><path d=\"M16.3 8V5.8a2.1 2.1 0 0 0-2.1-2.1H5.8a2.1 2.1 0 0 0-2.1 2.1v8.4a2.1 2.1 0 0 0 2.1 2.1h2.1\"/>","couch":"<path d=\"M5.4 10.1V7.2a1.9 1.9 0 0 1 1.9-1.9h9.4a1.9 1.9 0 0 1 1.9 1.9v2.8\"/><path d=\"M3.5 11.9a1.9 1.9 0 0 1 3.8 0v1.4h9.4V11.9a1.9 1.9 0 0 1 3.8 0v4.7H3.5ZM5.4 16.7v1.9M18.6 16.7v1.9\"/>","crown":"<path d=\"M3.5 8.3L7.8 12L11.9 5.5l4.2 6.5l4.2-3.7L18.4 18.1H5.4Z\"/>","cubes":"<path d=\"M12 3.2L8.1 5.2v4.4l3.9 2l3.9-2V5.2ZM7.6 11.6L3.6 13.6v4.4l3.9 2l3.9-2V13.6ZM16.4 11.6l-3.9 2v4.4l3.9 2l3.9-2V13.6Z\"/>","database":"<ellipse cx=\"12\" cy=\"6.4\" rx=\"6.6\" ry=\"2.8\"/><path d=\"M5.4 6.4v11.3c0 1.6 2.9 2.8 6.6 2.8s6.6-1.2 6.6-2.8V6.4M5.4 12c0 1.6 2.9 2.8 6.6 2.8s6.6-1.2 6.6-2.8\"/>","dice":"<rect x=\"3.7\" y=\"3.6\" width=\"16.7\" height=\"16.7\" rx=\"3\"/><path d=\"M8.6 8.6h0M15.5 8.6h0M12.1 12h0M8.6 15.4h0M15.5 15.4h0\" stroke-width=\"2.6\"/>","dish":"<path d=\"M3.8 9.2A10.9 10.9 0 0 0 14.8 20.2Z\"/><path d=\"M9 15l5.2-5.2M14.8 3.4a5.8 5.8 0 0 1 5.8 5.8M14.8 7.5a1.8 1.8 0 0 1 1.8 1.8\"/>","dollar":"<path d=\"M15.7 8C15 6.6 13.7 5.6 12 5.6C9.6 5.6 8.3 6.9 8.3 8.5s1.6 2.5 3.7 2.8s3.7 1.3 3.7 3.1s-1.5 3-3.7 3c-1.8 0-3.2-0.9-3.7-2.4M12 3.7v16.7\"/>","donate":"<circle cx=\"11.9\" cy=\"8.4\" r=\"5.2\"/><path d=\"M11.9 6v4.3M3.7 15.6h16.5V20H3.7ZM8.3 17.7h7.2\"/>","door":"<path d=\"M13.7 4.7L6.3 3.2v16.7l7.5-1.4ZM13.7 5.1h3.3a0.9 0.9 0 0 1 0.9 0.9v14M3.5 20h16.7M11 11.6h0\"/>","down":"<path d=\"M3.6 7.9l8.4 8.4l8.4-8.4\"/>","download":"<path d=\"M12 3.2v11.5M6.8 9.5l5.2 5.2l5.2-5.2M4.7 20h14.7\"/>","drive":"<rect x=\"3.5\" y=\"12.3\" width=\"17\" height=\"6.6\" rx=\"1.9\"/><path d=\"M3.9 12.3L6.8 4.7h10.4l2.8 7.6M16.7 15.6h0M13.8 15.6h0\"/>","drop":"<path d=\"M12 3.5s5.9 6.4 5.9 10.8a5.9 5.9 0 0 1-11.8 0c0-4.4 5.9-10.8 5.9-10.8Z\"/>","ear":"<path d=\"M6.2 9.5a5.7 5.7 0 1 1 10.8 2.4c-0.9 1.9-3.1 3-3.1 5.2a3.4 3.4 0 0 1-6.5 1.6\"/><path d=\"M9.7 9.9a2.4 2.4 0 1 1 3.8 1.5\"/>","enter":"<path d=\"M13.8 3.6h4.1a2.1 2.1 0 0 1 2.1 2.1v12.5a2.1 2.1 0 0 1-2.1 2.1h-4.1M9.5 7.9l4.1 4.1l-4.1 4.1M13.8 12H3.2\"/>","eraser":"<path d=\"M14.3 4.4l5.5 5.5l-9 9H6.6l-2.6-2.6a1.5 1.5 0 0 1 0-2.1Z\"/><path d=\"M9.3 9.4l5.5 5.5M10.8 18.9H20.3\"/>","expand":"<path d=\"M3.5 8.8V3.5h5.3M20.5 8.8V3.5h-5.3M3.5 15.2v5.3h5.3M20.5 15.2v5.3h-5.3\"/>","eye":"<path d=\"M3.5 12S6.6 6.2 12 6.2S20.5 12 20.5 12S17.4 17.8 12 17.8S3.5 12 3.5 12Z\"/><circle cx=\"12\" cy=\"12\" r=\"2.7\"/>","eye-off":"<path d=\"M3.7 12s3.2-6.1 8.3-6.1c1.5 0 2.7 0.5 4 1.1M20.5 12s-3.2 6.1-8.3 6.1c-1.5 0-2.7-0.5-4-1.1\"/><path d=\"M10.1 9.9a2.7 2.7 0 0 0 3.9 3.9M4.6 4.5l14.9 14.9\"/>","fast-forward":"<path d=\"M4 6.4v11.2L11.6 12ZM13.1 6.4v11.2L20.7 12Z\"/>","file":"<path d=\"M6.4 3.5h7.6l3.8 3.8v13.2H6.4Z\"/><path d=\"M13.9 3.5v3.8h3.8\"/>","file-code":"<path d=\"M13.9 3.5H7.4a1.9 1.9 0 0 0-1.9 1.9v13a1.9 1.9 0 0 0 1.9 1.9h9.3a1.9 1.9 0 0 0 1.9-1.9V8.2Z\"/><path d=\"M13.9 3.5v4.6h4.6M10.1 12.4L8.3 14.3l1.9 1.9M13.9 12.4l1.9 1.9l-1.9 1.9\"/>","film":"<rect x=\"3.5\" y=\"4.4\" width=\"17\" height=\"15.1\" rx=\"1.9\"/><path d=\"M7.7 4.4v15.1M16.3 4.4v15.1M3.5 9.2h4.3M3.5 14.8h4.3M16.3 9.2H20.5M16.3 14.8H20.5\"/>","filter":"<path d=\"M3.5 6h17M6.7 12.4h10.6M9.9 18.7h4.2\"/>","finish":"<path d=\"M5.2 20.7V4\"/><rect x=\"5.2\" y=\"4.6\" width=\"13.9\" height=\"8.6\" rx=\"1\"/><path d=\"M5.2 8.8h13.9M9.6 4.6v8.6M14.3 4.6v8.6\"/>","fire":"<path d=\"M12 20.5a6.8 6.8 0 0 0 6.8-6.8c0-4.3-2.9-6.8-4.2-10.1c-2 2.3-2.6 4.5-2.6 4.5S10.7 5.8 9.5 3.8C7 6.6 5.2 10 5.2 13.7a6.8 6.8 0 0 0 6.8 6.8Z\"/>","fish":"<path d=\"M8.1 12c1.9-3.1 4.3-4.6 7.2-4.6c2.5 0 4.3 1.9 5.2 4.6c-1 2.7-2.8 4.6-5.2 4.6c-2.9 0-5.2-1.6-7.2-4.6Z\"/><path d=\"M8.1 12L3.7 8.8v6.7Z\"/><path d=\"M16.5 10.7h0\"/>","fist":"<path d=\"M6.4 10.1V6.4a1.6 1.6 0 0 1 3.2 0V9.1M9.5 8.5v-3.2a1.6 1.6 0 0 1 3.2 0v3.2M12.6 8.5v-2.1a1.6 1.6 0 0 1 3.2 0V9.1M15.7 9.1V8a1.6 1.6 0 0 1 3.2 0v5.2a7.3 7.3 0 0 1-7.3 7.3H11.1a5.7 5.7 0 0 1-5.7-5.7V12.3A2.1 2.1 0 0 1 7.4 11.2h2.1a1.6 1.6 0 0 1 0 3.2H8\"/>","flag":"<path d=\"M6.7 20.7V4M6.7 4h10.8l-2 3.9l2 3.9H6.7\"/>","flask":"<path d=\"M9.5 3.2h4.9M10 3.2V9.2L4.9 17.7a1.5 1.5 0 0 0 1.3 2.3h11.6a1.5 1.5 0 0 0 1.3-2.3L14 9.2V3.2\"/><path d=\"M7.3 14.6h9.5\"/>","focus":"<circle cx=\"12\" cy=\"12\" r=\"2.8\"/><path d=\"M3.5 9V5.9A2.4 2.4 0 0 1 5.9 3.5H9M15 3.5h3.1A2.4 2.4 0 0 1 20.5 5.9V9M20.5 15v3.1a2.4 2.4 0 0 1-2.4 2.4H15M9 20.5H5.9A2.4 2.4 0 0 1 3.5 18.1V15\"/>","folder":"<path d=\"M3.8 7.3a1.9 1.9 0 0 1 1.9-1.9h3.6l1.9 1.9h7.4a1.9 1.9 0 0 1 1.9 1.9v7.4a1.9 1.9 0 0 1-1.9 1.9H5.8a1.9 1.9 0 0 1-1.9-1.9Z\"/>","folder-tree":"<path d=\"M4.1 3.3v13.2a1 1 0 0 0 1 1H9.7M4.1 8.3H9.7\"/><path d=\"M10.2 5.3h3.1l1 1.5h5.6V10.9h-9.7ZM10.2 14.5h3.1l1 1.5h5.6V20.1h-9.7Z\"/>","food":"<path d=\"M8.2 4v6.5M6.3 4v4.2a1.9 1.9 0 0 0 3.7 0V4M8.2 10.5v10.2M17.5 20.8V4c-1.9 1.1-3 3.3-3 6.5v2.8H17.5\"/>","game":"<rect x=\"3.7\" y=\"7.2\" width=\"16.7\" height=\"9.7\" rx=\"4.4\"/><path d=\"M7.6 10.7v2.7M6.4 12h2.7M15.1 11.6h0M17.4 12.9h0\"/>","gauge":"<path d=\"M3.6 16.9a8.4 8.4 0 1 1 16.7 0\"/><path d=\"M11.9 13.2l4.1-5.7\"/><circle cx=\"11.9\" cy=\"13.2\" r=\"1.4\"/>","gavel":"<path d=\"M13.7 4.1l5.1 5.1M10.5 7.4l5.1 5.1M12.1 5.8l-5.6 5.6l5 5l5.6-5.6M3.5 19.5l5.9-5.9M13.7 19.5h6.5\"/>","gear":"<circle cx=\"12\" cy=\"12.1\" r=\"2.3\"/><path d=\"M17.6 14.3a1.3 1.3 0 0 0 0.2 1.5l0.1 0.1a1.5 1.5 0 1 1-2.4 2.4l-0.1-0.1a1.3 1.3 0 0 0-1.5-0.2a1.3 1.3 0 0 0-0.8 1.3V18.8a1.5 1.5 0 1 1-3.4 0v-0.1a1.3 1.3 0 0 0-0.9-1.3a1.3 1.3 0 0 0-1.5 0.2l-0.1 0.1a1.5 1.5 0 1 1-2.4-2.4l0.1-0.1a1.3 1.3 0 0 0 0.2-1.5a1.3 1.3 0 0 0-1.3-0.8H5.4a1.5 1.5 0 1 1 0-3.4h0.1a1.3 1.3 0 0 0 1.3-0.9a1.3 1.3 0 0 0-0.2-1.5l-0.1-0.1a1.5 1.5 0 1 1 2.4-2.4l0.1 0.1a1.3 1.3 0 0 0 1.5 0.2H9.8a1.3 1.3 0 0 0 0.8-1.3V5.4a1.5 1.5 0 1 1 3.4 0v0.1a1.3 1.3 0 0 0 0.8 1.3a1.3 1.3 0 0 0 1.5-0.2l0.1-0.1a1.5 1.5 0 1 1 2.4 2.4l-0.1 0.1a1.3 1.3 0 0 0-0.2 1.5V9.8a1.3 1.3 0 0 0 1.3 0.8H18.7a1.5 1.5 0 1 1 0 3.4h-0.1a1.3 1.3 0 0 0-1.3 0.8Z\"/>","gem":"<path d=\"M6.8 4.9h10.3L20.2 9.5l-8.3 10.3L3.6 9.5Z\"/><path d=\"M3.6 9.5h16.7M9.6 4.9L8.1 9.5l3.8 10.3M14.2 4.9L15.7 9.5l-3.8 10.3\"/>","ghost":"<path d=\"M4.7 20V10.6a7.3 7.3 0 0 1 14.7 0v9.4l-2.4-1.9l-2.5 1.9l-2.4-1.9L9.6 20l-2.5-1.9Z\"/><path d=\"M9.4 10.1h0M14.6 10.1h0\"/>","gift":"<rect x=\"4.4\" y=\"8.8\" width=\"15.1\" height=\"10.4\" rx=\"0.9\"/><path d=\"M3.5 8.8h17M12 8.8v10.4M12 8.8c-1.4-2.8-4.7-3.8-4.7-1.4S12 8.8 12 8.8s4.7-0.9 4.7-3.3S13.4 6 12 8.8\"/>","globe":"<circle cx=\"11.9\" cy=\"11.9\" r=\"8.3\"/><path d=\"M3.6 11.9h16.7M11.9 3.6c2.7 2.7 2.7 13.9 0 16.7M11.9 3.6c-2.7 2.7-2.7 13.9 0 16.7\"/>","grid":"<rect x=\"3.5\" y=\"3.5\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/><rect x=\"13.1\" y=\"3.5\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/><rect x=\"3.5\" y=\"13.1\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/><rect x=\"13.1\" y=\"13.1\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/>","grip":"<path d=\"M8.3 4.5h0M15.8 4.5h0M8.3 12h0M15.8 12h0M8.3 19.5h0M15.8 19.5h0\" stroke-width=\"3.8\"/>","group":"<path d=\"M3.5 7.3V3.5h3.8M16.7 3.5h3.8v3.8M20.5 16.7v3.8h-3.8M7.3 20.5H3.5v-3.8\"/><rect x=\"7.3\" y=\"7.3\" width=\"5.7\" height=\"4.7\" rx=\"0.9\"/><rect x=\"11.1\" y=\"12\" width=\"5.7\" height=\"4.7\" rx=\"0.9\"/>","hammer":"<path d=\"M13.1 3.7L19.3 9.9l-2.7 2.7l-6.2-6.2Z\"/><path d=\"M13.6 9.4L5 18.1a1.3 1.3 0 0 0 1.9 1.9l8.6-8.6\"/>","hand":"<path d=\"M9.9 13.6V6.2a1.5 1.5 0 0 1 3 0V11.7M12.8 10.7V5.3a1.5 1.5 0 0 1 3 0V11.7M15.8 11.2V6.7a1.5 1.5 0 0 1 3 0v6.9c0 3.9-2.5 6.9-6.4 6.9c-2.6 0-4.1-1.3-5.6-3.5L4.9 14.2a1.5 1.5 0 0 1 2.4-1.8L9.9 15.6\"/>","handshake":"<path d=\"M3.6 9.9v5.3M20.3 9.9v5.3\"/><path d=\"M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2\"/><path d=\"M5.7 10.8l6 6a1.2 1.2 0 0 0 1.7-1.6M13.4 15.3l0.5 0.5a1.2 1.2 0 0 0 1.7-1.6M15.6 14.2l0.3 0.3a1.2 1.2 0 0 0 1.7-1.6L18 10.8M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2\"/>","hash":"<path d=\"M5 9h15M4 15h15M10 3.5 8 20.5M16 3.5l-2 17\"/>","heading":"<path d=\"M5.6 3.5v17M18.4 3.5v17M5.6 12h12.7M3.5 3.5h4.2M16.2 3.5h4.2M3.5 20.5h4.2M16.2 20.5h4.2\"/>","headphones":"<path d=\"M4.4 13.9v-2.8a7.5 7.5 0 0 1 14.9 0v2.8\"/><rect x=\"3.5\" y=\"13\" width=\"4.2\" height=\"6\" rx=\"1.4\"/><rect x=\"16.1\" y=\"13\" width=\"4.2\" height=\"6\" rx=\"1.4\"/>","heart":"<path d=\"M11.9 20.3s-8.1-5.1-8.1-11.6a4.6 4.6 0 0 1 8.1-3A4.6 4.6 0 0 1 20 9.2c0 6.5-8.1 11.6-8.1 11.6Z\"/>","heart-broken":"<path d=\"M11.9 20.3s-8.1-5.1-8.1-11.6a4.6 4.6 0 0 1 8.1-3A4.6 4.6 0 0 1 20 9.2c0 6.5-8.1 11.6-8.1 11.6Z\"/><path d=\"M11.9 5.8L10 9.8l3.5 2.3l-1.6 3.9\"/>","heart-pulse":"<path d=\"M19 12.3c-1.7 3.6-7 6.7-7 6.7s-5.3-3.1-7-6.7M4.3 9.7A4.3 4.3 0 0 1 12 7.4a4.3 4.3 0 0 1 7.7 2.2\"/><path d=\"M3.5 11.9h4l1.3-2.2l2.2 4.5l1.8-3.1h7.6\"/>","help":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M9.6 9.3a2.5 2.5 0 0 1 4.8.9c0 1.7-2.4 2.2-2.4 3.8M12 17h.01\"/>","history":"<path d=\"M3.8 12.1a8.3 8.3 0 1 0 2.5-5.9L3.8 8.5M3.8 4.2v4.2h4.2\"/><path d=\"M12 7.9v4.3l3.1 1.9\"/>","home":"<path d=\"M3.6 10.6L12 3.3l8.4 7.3v8.4a1 1 0 0 1-1 1h-4.2v-6.3h-6.3v6.3H4.7a1 1 0 0 1-1-1Z\"/>","hot-tub":"<circle cx=\"8.6\" cy=\"5.8\" r=\"1.7\"/><path d=\"M3.8 11.9h16.6v3.3a4.2 4.2 0 0 1-4.2 4.2h-8.4A4.2 4.2 0 0 1 3.8 15.2ZM6.8 11.9v-1.4A2.4 2.4 0 0 1 8.9 8.2H9.4M13.7 9.5c0.8-0.9-0.8-1.9 0-2.8M17.3 9.5c0.8-0.9-0.8-1.9 0-2.8\"/>","hourglass":"<path d=\"M6 3.5h12M6 20.5h12M7.5 3.5c0 4.5 4.5 5.5 4.5 8.5s-4.5 4-4.5 8.5M16.5 3.5c0 4.5-4.5 5.5-4.5 8.5s4.5 4 4.5 8.5\"/>","id":"<rect x=\"3.7\" y=\"5.5\" width=\"16.7\" height=\"13\" rx=\"1.9\"/><circle cx=\"9.2\" cy=\"11\" r=\"1.9\"/><path d=\"M6.4 15.6c0.5-1.4 1.6-2.2 2.8-2.2s2.4 0.8 2.8 2.2M14.8 10.1h2.8M14.8 13.4h2.8\"/>","idea":"<path d=\"M9.1 17.6h5.8M10.1 20.5h3.9M8.7 14.3A5.8 5.8 0 1 1 15.2 14.3c-0.7 0.6-1.4 1.5-1.4 2.3h-3.9c0-0.9-0.7-1.7-1.4-2.3Z\"/>","image":"<rect x=\"3.5\" y=\"5.4\" width=\"16.7\" height=\"13\" rx=\"2.8\"/><circle cx=\"9.1\" cy=\"10\" r=\"1.5\"/><path d=\"M20.3 15.6l-4.7-4.7l-7.4 7.4\"/>","inbox":"<path d=\"M3.5 12.7L5.9 4.8h12.1l2.4 7.9V17.8a0.9 0.9 0 0 1-0.9 0.9H4.4a0.9 0.9 0 0 1-0.9-0.9ZM3.5 12.7h4.6l1.4 2.4h4.6l1.4-2.4h4.6\"/>","infinity":"<path d=\"M12 12c-1.8-2.4-3.3-3.6-4.9-3.6a3.6 3.6 0 0 0 0 7.2c1.6 0 3.1-1.2 4.9-3.6Zm0 0c1.8 2.4 3.3 3.6 4.9 3.6a3.6 3.6 0 0 0 0-7.2c-1.6 0-3.1 1.2-4.9 3.6Z\"/>","info":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 11v5M12 8h.01\"/>","invite":"<circle cx=\"9.2\" cy=\"8.2\" r=\"2.9\"/><path d=\"M3.8 18.8c0-3 2.4-4.8 5.3-4.8s5.3 2 5.3 4.8M17.9 8.2v5.3M15.3 10.9h5.3\"/>","key":"<circle cx=\"8.1\" cy=\"15.9\" r=\"4.3\"/><path d=\"M11.1 12.9l9.4-9.4M16.8 7.3l3.2 3.2M14.6 9.4l2.2 2.2\"/>","keyboard":"<rect x=\"3.5\" y=\"6.6\" width=\"17\" height=\"10.7\" rx=\"1.8\"/><path d=\"M6.6 10.2h0M9.3 10.2h0M12 10.2h0M14.7 10.2h0M17.4 10.2h0M8.4 13.8h7.2\"/>","language":"<path d=\"M4.6 5.4h8.4M8.8 3.6v1.9M6.4 5.4c0.5 2.8 2.3 5.6 5.6 7M11.1 5.4c-0.6 3.2-2.6 6.3-6 7.9M12 20.3l3.7-8.4l3.7 8.4M13.3 17.5h4.8\"/>","laugh":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M8 13.5h8a4 4 0 0 1-8 0ZM7.5 8.6l2.2 1.2-2.2 1.2M16.5 8.6l-2.2 1.2 2.2 1.2\"/>","layers":"<path d=\"M12 5.4l8.3 4.6l-8.3 4.6l-8.3-4.6Z\"/><path d=\"M3.8 14l8.3 4.6l8.3-4.6\"/>","leaf":"<path d=\"M3.8 20.1c0-9.5 5.6-15.2 16.7-16.7c-1 11.1-6.7 16.7-16.7 16.7ZM3.8 20.1l8.9-8.9\"/>","leave":"<path d=\"M12.7 3.5h4.2a2.1 2.1 0 0 1 2.1 2.1v12.7a2.1 2.1 0 0 1-2.1 2.1h-4.2M8.5 16.2l-4.2-4.2l4.2-4.2M4.2 12h10.6\"/>","lifebuoy":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"12\" r=\"3.8\"/><path d=\"M6 6l3.4 3.4M14.6 14.7l3.4 3.4M18 6l-3.4 3.4M9.4 14.7l-3.4 3.4\"/>","link":"<path d=\"M9.9 14.1a4.3 4.3 0 0 0 6.1 0l3.2-3.2a4.3 4.3 0 0 0-6.1-6.1l-1.1 1.1M14.1 9.9a4.3 4.3 0 0 0-6.1 0l-3.2 3.2a4.3 4.3 0 0 0 6.1 6.1l1.1-1.1\"/>","link-off":"<path d=\"M10 13.8a4 4 0 0 0 5.6 0l2.9-2.9a4 4 0 0 0-5.6-5.6l-1 1M13.8 10a4 4 0 0 0-5.6 0l-2.9 2.9a4 4 0 0 0 5.6 5.6l1-1\"/><path d=\"M3.6 3.6l16.7 16.7\"/>","list":"<path d=\"M8.2 5.5h11.9M8.2 12h11.9M8.2 18.5h11.9M3.3 5.5h0M3.3 12h0M3.3 18.5h0\"/>","list-ordered":"<path d=\"M9.7 6.8h10.8M9.7 12.8h10.8M9.7 18.8h10.8M3.8 5.4L4.7 5v4.4M3.8 9.3h2M3.8 13.7a1 1 0 0 1 2 0.3c0 1.1-2 1.7-2 2.7h2.2\"/>","live":"<circle cx=\"12\" cy=\"11.8\" r=\"2\"/><path d=\"M8.6 8.4a4.9 4.9 0 0 0 0 7.1M15.4 8.4a4.9 4.9 0 0 1 0 7.1M6.3 6.1a8.1 8.1 0 0 0 0 11.9M17.7 6.1a8.1 8.1 0 0 1 0 11.9\"/>","lock":"<rect x=\"4.7\" y=\"10.7\" width=\"14.5\" height=\"9.4\" rx=\"2.1\"/><path d=\"M7.8 10.7V7.5a4 4 0 0 1 8.3 0v3.2\"/>","lungs":"<path d=\"M12 3.5v8M12 9.4l-3 2.1M12 9.4l3 2.1M8.4 6.5C5.6 6.5 3.5 10.4 3.5 15.2c0 2.8 1.1 4.8 3.2 4.8s2.7-2.1 2.7-4.8V8.3M15.6 6.5C18.4 6.5 20.5 10.4 20.5 15.2c0 2.8-1.1 4.8-3.2 4.8s-2.7-2.1-2.7-4.8V8.3\"/>","mail":"<rect x=\"3.5\" y=\"5.5\" width=\"17\" height=\"13.2\" rx=\"1.9\"/><path d=\"M4.4 7.4l7.6 5.7l7.6-5.7\"/>","map":"<path d=\"M9.1 4.6L3.5 6.5v13l5.6-1.9l5.6 1.9l5.6-1.9V4.6l-5.6 1.9Z\"/><path d=\"M9.1 4.6v13M14.7 6.5v13\"/>","mask":"<path d=\"M3.5 7c3 1.3 5.8 1.8 8.5 1.8S17.5 8.3 20.5 7c0 6-2.5 10-5 10-1.4 0-2-1.5-3.5-1.5S9.9 17 8.5 17c-2.5 0-5-4-5-10Z\"/><path d=\"M7.5 11.5h2M14.5 11.5h2\"/>","medical":"<rect x=\"3.5\" y=\"7.1\" width=\"17\" height=\"12.3\" rx=\"1.9\"/><path d=\"M9.2 7.1V5.2a0.9 0.9 0 0 1 0.9-0.9h3.8a0.9 0.9 0 0 1 0.9 0.9v1.9M12 10.4v5.7M9.2 13.3h5.7\"/>","megaphone":"<path d=\"M3.6 9.5v4a1 1 0 0 0 1 1H7.1l9 4.5v-15L7.1 8.5H4.5a1 1 0 0 0-1 1Z\"/><path d=\"M7.1 14.5l1.3 5h2.4L10.1 15.1M19.1 9a3.2 3.2 0 0 1 0 5\"/>","members":"<circle cx=\"9.2\" cy=\"7.9\" r=\"3\"/><path d=\"M3.6 19.1c0-3.1 2.6-5.1 5.6-5.1s5.6 2.1 5.6 5.1M15.7 5a3 3 0 0 1 0 5.9M17.6 14.3c1.8 0.6 2.8 2.3 2.8 4.8\"/>","menu":"<path d=\"M3.5 6.7h17M3.5 12h17M3.5 17.3h17\"/>","mic":"<rect x=\"9.2\" y=\"3.5\" width=\"5.7\" height=\"10.4\" rx=\"2.8\"/><path d=\"M5.4 11.1a6.6 6.6 0 0 0 13.2 0M12 17.7v2.8\"/>","mic-off":"<rect x=\"9.2\" y=\"3.6\" width=\"5.7\" height=\"10.4\" rx=\"2.8\"/><path d=\"M5.5 11.1a6.6 6.6 0 0 0 11 5M18.7 11.1c0 0.8-0.1 1.5-0.4 2.2M12.1 17.7v2.8M4.5 4.5l15.1 15.1\"/>","minus":"<path d=\"M3.5 12h17\"/>","minus-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M8 12h8\"/>","money":"<rect x=\"3.5\" y=\"6.6\" width=\"17\" height=\"10.7\" rx=\"1.8\"/><circle cx=\"12\" cy=\"12\" r=\"2.2\"/><path d=\"M6.6 9.8v0M17.4 14.2v0\"/>","moon":"<path d=\"M20.5 14.6A8.6 8.6 0 1 1 9.4 3.5a6.9 6.9 0 0 0 11.2 11.2Z\"/>","more":"<circle cx=\"5.2\" cy=\"12\" r=\"1.6\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\"/><circle cx=\"18.8\" cy=\"12\" r=\"1.6\"/>","mountain":"<path d=\"M3.6 17.5L9.3 6l3.7 6.3L15.5 9.1L20.3 17.5Z\"/>","move":"<path d=\"M11.9 3.6v16.7M3.6 11.9h16.7M9 6.5l2.9-2.9l2.9 2.9M9 17.3l2.9 2.9l2.9-2.9M6.5 9l-2.9 2.9l2.9 2.9M17.3 9l2.9 2.9l-2.9 2.9\"/>","mug":"<path d=\"M4.8 9.1h11v7a4 4 0 0 1-4 4h-3a4 4 0 0 1-4-4Z\"/><path d=\"M15.8 10.5H17.3a2.5 2.5 0 0 1 0 5h-1.5M8.3 3.5c-0.8 1 0.8 2 0 3M11.8 3.5c-0.8 1 0.8 2 0 3\"/>","music":"<path d=\"M8.6 17.7V5.6l11.1-2.1v12.2\"/><circle cx=\"6\" cy=\"17.7\" r=\"2.6\"/><circle cx=\"17.2\" cy=\"15.7\" r=\"2.6\"/>","mute":"<path d=\"M3.9 9.4h3.6L12.2 5.8v12.4l-4.6-3.6H3.9Z\"/><path d=\"M16.3 9.9l4.1 4.1M20.5 9.9l-4.1 4.1\"/>","news":"<path d=\"M3.5 3.5h13.8v14.9a2.1 2.1 0 0 0 2.1 2.1H5.6a2.1 2.1 0 0 1-2.1-2.1Z\"/><path d=\"M17.3 7.7h3.2v10.6a2.1 2.1 0 0 1-2.1 2.1M7.2 7.7h6.4M7.2 11.5h6.4M7.2 15.2h3.7\"/>","nodes":"<circle cx=\"12\" cy=\"5.4\" r=\"2.1\"/><circle cx=\"5.8\" cy=\"17.9\" r=\"2.1\"/><circle cx=\"18.2\" cy=\"17.9\" r=\"2.1\"/><path d=\"M11 7.4L6.8 15.9M13 7.4l4.3 8.6M7.9 17.9h8.3\"/>","open":"<path d=\"M14 3.8h6.3v6.3M20.2 3.8l-9.4 9.4M18.2 14.2v4.2a2.1 2.1 0 0 1-2.1 2.1H5.6a2.1 2.1 0 0 1-2.1-2.1V7.9a2.1 2.1 0 0 1 2.1-2.1h4.2\"/>","palette":"<path d=\"M12.2 3.8a8.4 8.4 0 1 0 0 16.8c1.1 0 1.7-0.9 1.7-1.6c0-1.1-0.9-1.5-0.9-2.6s0.9-1.6 1.9-1.6H16.9a3.7 3.7 0 0 0 3.7-3.7C20.6 7.2 16.9 3.8 12.2 3.8Z\"/><circle cx=\"8\" cy=\"11.4\" r=\"1.1\"/><circle cx=\"10.3\" cy=\"7.9\" r=\"1.1\"/><circle cx=\"14.5\" cy=\"7.9\" r=\"1.1\"/>","parking":"<rect x=\"3.7\" y=\"3.7\" width=\"16.7\" height=\"16.7\" rx=\"3\"/><path d=\"M9.6 17V7.2h3.4a3 3 0 0 1 0 5.9H9.6\"/>","pause":"<path d=\"M7.1 3.5v17M16.9 3.5v17\"/>","paw":"<path d=\"M7.8 18.5c0-3 1.9-5.3 4.2-5.3s4.2 2.3 4.2 5.3c0 1.4-1.1 2.1-2.1 2.1c-0.8 0-1.4-0.5-2.1-0.5s-1.3 0.5-2.1 0.5c-1.1 0-2.1-0.7-2.1-2.1Z\"/><circle cx=\"5.4\" cy=\"10.6\" r=\"1.9\"/><circle cx=\"9.2\" cy=\"5.7\" r=\"1.9\"/><circle cx=\"14.8\" cy=\"5.7\" r=\"1.9\"/><circle cx=\"18.6\" cy=\"10.6\" r=\"1.9\"/>","pencil":"<path d=\"M11.9 19.6h8.4M16.1 4.2a2 2 0 0 1 2.8 2.8L7.2 18.7l-3.7 0.9l0.9-3.7Z\"/>","phone":"<path d=\"M5.7 3.4h3.9l2 4.9l-2.5 1.5a10.8 10.8 0 0 0 4.9 4.9L15.6 12.3l4.9 2v3.9a2 2 0 0 1-2 2A15.8 15.8 0 0 1 3.8 5.4a2 2 0 0 1 2-2\"/>","phone-off":"<path d=\"M5.6 4.1h3.7l1.9 4.7l-2.4 1.4a10.3 10.3 0 0 0 4.7 4.7L15.1 12.5l4.7 1.9v3.7a1.9 1.9 0 0 1-1.9 1.9A15.1 15.1 0 0 1 3.8 5.9a1.9 1.9 0 0 1 1.9-1.9\"/><path d=\"M4.3 3.6l16.1 16.1\"/>","piggy":"<path d=\"M3.5 11.4c0-3.2 3.3-5.7 7.7-5.7c1.3 0 2.4 0.2 3.4 0.6L17.4 4.7v3.3c0.8 0.7 1.4 1.6 1.6 2.5h1.4v3.4H18.8c-0.5 1-1.3 1.7-2.3 2.3V19.1h-2.9v-1.9c-0.8 0.2-1.7 0.3-2.5 0.3c-0.8 0-1.6-0.1-2.3-0.3v1.9h-2.9v-2.9C4.4 15.1 3.5 13.4 3.5 11.4Z\"/><path d=\"M14.9 10.1h0M8.7 8.1h2.9\"/>","pin":"<path d=\"M12 20.7s-6.2-5.4-6.2-10.5a6.2 6.2 0 0 1 12.4 0C18.2 15.2 12 20.7 12 20.7Z\"/><circle cx=\"12\" cy=\"10\" r=\"2.3\"/>","plane":"<path d=\"M20 4L3.5 10.8l6.6 3.1l3.1 6.6Z\"/><path d=\"M10.1 13.9l9.9-9.9\"/>","play":"<path d=\"M5.6 3.6v16.9l13.4-8.5Z\"/>","plug":"<path d=\"M9.2 4v4.6M14.8 4v4.6M6.9 8.7h10.2v2.8a5.1 5.1 0 0 1-10.2 0ZM12 16.6V20.7\"/>","plus":"<path d=\"M12 3.5v17M3.5 12h17\"/>","plus-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 8v8M8 12h8\"/>","print":"<path d=\"M7.1 8.9V3.5h9.9V8.9\"/><rect x=\"3.6\" y=\"8.9\" width=\"16.7\" height=\"7.9\" rx=\"2\"/><path d=\"M7.1 13.8h9.9v6.4H7.1ZM16.4 11.9h0\"/>","puzzle":"<path d=\"M3.8 7h4.2a2.6 2.6 0 1 1 4.8 0h4.2v4.2a2.6 2.6 0 1 1 0 4.8v4.2h-4.2a2.6 2.6 0 1 0-4.8 0H3.8v-4.2a2.6 2.6 0 1 0 0-4.8Z\"/>","quote":"<path d=\"M9.8 6.2C5.8 7.2 3.6 10 3.6 13.9v3.3h5.6v-5.6h-5.6M20.3 6.2c-3.9 1.1-6.1 3.9-6.1 7.8v3.3h5.6v-5.6h-5.6\"/>","radio":"<rect x=\"3.5\" y=\"8.3\" width=\"16.8\" height=\"11.3\" rx=\"1.9\"/><path d=\"M7.3 8.3L16.7 3.9\"/><circle cx=\"15.3\" cy=\"14\" r=\"2.4\"/><path d=\"M6.8 12.4h3.8M6.8 15.4h3.8\"/>","ranking":"<path d=\"M3.5 19.9h17M4.5 19.9V13.8h4.7M9.2 19.9V10h5.7v9.9M14.9 19.9V15.7h4.7v4.3\"/><path d=\"M12 3.4l0.9 1.7l1.9 0.3l-1.4 1.3l0.3 1.9L12 7.7l-1.7 0.9l0.3-1.9L9.3 5.4l1.9-0.3Z\"/>","record":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>","recycle":"<path d=\"M7.8 18.2H5.7a1.2 1.2 0 0 1-1-1.8l2.3-3.9M10 5.5l0.9-1.5a1.2 1.2 0 0 1 2.1 0l2.3 3.9M17.7 12.4l1.6 2.7a1.2 1.2 0 0 1-1 1.8h-4.5\"/><path d=\"M11.1 16.5l1.8 1.8l-1.8 1.8M4.5 10.4l2.4-0.7l0.7 2.5M17.2 6.1l-0.7 2.5l-2.5-0.7\"/>","reply":"<path d=\"M9.2 5.8L4 11l5.1 5.1M4 11h10.3a6.2 6.2 0 0 1 6.2 6.2v1\"/>","restroom":"<circle cx=\"7.1\" cy=\"5.3\" r=\"1.7\"/><circle cx=\"16.4\" cy=\"5.3\" r=\"1.7\"/><path d=\"M11.7 3.6v16.7M5.6 20.3v-5.1H4.7V10.6A1.4 1.4 0 0 1 6.1 9.2h1.9a1.4 1.4 0 0 1 1.4 1.4v4.6H8.5V20.3M15.5 20.3v-3.7h-2.4l1.9-6.1a0.9 0.9 0 0 1 0.9-0.9h0.9a0.9 0.9 0 0 1 0.9 0.9l1.9 6.1H17.3v3.7\"/>","retry":"<path d=\"M3.7 12a8.2 8.2 0 0 1 14.1-5.9L20.2 8.4M20.2 3.8v4.6h-4.6M20.2 12a8.2 8.2 0 0 1-14.1 5.9L3.7 15.6M3.7 20.3v-4.6h4.6\"/>","rewind":"<path d=\"M20 6.4v11.2L12.4 12ZM10.9 6.4v11.2L3.3 12Z\"/>","road":"<path d=\"M8.2 3.5L4.4 20.5M15.8 3.5l3.8 17M12 4.4v2.4M12 10.6v2.8M12 17.2V19.6\"/>","robot":"<rect x=\"5.4\" y=\"8.3\" width=\"13.2\" height=\"10.4\" rx=\"2.8\"/><path d=\"M12 4.6v3.8M9.2 13.1h0M14.8 13.1h0M9.6 16.4h4.7M3.5 13.1v1.9M20.5 13.1v1.9\"/>","rocket":"<path d=\"M11.8 15.7L8.4 12.3C9.9 6.9 13.8 3.9 20.2 3.9C20.2 10.3 17.3 14.2 11.8 15.7ZM8.4 12.3L4.9 11.8L7.4 8.3h3.9M11.8 15.7l0.5 3.4l3.4-2.5v-3.9M6.4 17.7c-1.5 0-3 1.5-3 3c1.5 0 3-1.5 3-3Z\"/><circle cx=\"15.3\" cy=\"8.8\" r=\"1.5\"/>","route":"<circle cx=\"6\" cy=\"18\" r=\"2.4\"/><circle cx=\"18\" cy=\"6\" r=\"2.4\"/><path d=\"M8.4 18H16a3 3 0 0 0 0-6H8a3 3 0 0 1 0-6h7.6\"/>","rss":"<path d=\"M4 3.5a16.5 16.5 0 0 1 16.5 16.5M4 10.4A9.6 9.6 0 0 1 13.6 20.1\"/><path d=\"M4.6 19.4h0\" stroke-width=\"3.9\"/>","save":"<path d=\"M4.7 3.5h11.5l3.2 3.2v13.6H4.7Z\"/><path d=\"M7.8 3.5v5.2h7.3V3.5M7.8 20.2v-6.3h8.4v6.3\"/>","scale":"<path d=\"M12 4.3V19.5M8.5 19.5h6.9M5.5 7.4h13M12 4.3h0M3.7 13.4L5.9 7.8L8.1 13.4M15.9 13.4L18.1 7.8l2.2 5.6M3.7 13.4a2.2 2.2 0 0 0 4.3 0M15.9 13.4a2.2 2.2 0 0 0 4.3 0\"/>","scissors":"<circle cx=\"6\" cy=\"7\" r=\"2.6\"/><circle cx=\"6\" cy=\"17\" r=\"2.6\"/><path d=\"M8.2 8.6 20 18M8.2 15.4 20 6\"/>","scroll":"<path d=\"M8.3 3.8h10.1a1.9 1.9 0 0 1 1.9 1.9v1.5H17M8.3 3.8a1.9 1.9 0 0 0-1.9 1.9v11.7a2.9 2.9 0 0 1-2.9 2.9h10.7a2.9 2.9 0 0 0 2.9-2.9v-11.7a1.9 1.9 0 0 0-1.9-1.9M10.2 9.2h3.9M10.2 13h3.9\"/>","search":"<circle cx=\"10.6\" cy=\"10.6\" r=\"7\"/><path d=\"M20.4 20.4l-4.5-4.5\"/>","seedling":"<path d=\"M12 20.8v-9.8M12 11C12 6.7 9.3 4 4.4 4c0 4.3 2.7 7 7.6 7ZM12 13.7c0-4.3 2.7-7 7.6-7c0 4.3-2.7 7-7.6 7Z\"/>","server":"<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"7.4\" rx=\"2.1\"/><rect x=\"3.5\" y=\"13.1\" width=\"17\" height=\"7.4\" rx=\"2.1\"/><path d=\"M7.8 7.2h0M7.8 16.8h0\"/>","shapes":"<circle cx=\"7.5\" cy=\"7.7\" r=\"3.4\"/><path d=\"M16.4 3.7l3.9 6.9h-7.9ZM13.9 14.1h5.9v5.9h-5.9ZM3.6 20l3.4-5.9l3.4 5.9Z\"/>","share":"<path d=\"M12 15.2V3.3M7.4 8.1L12 3.3L16.6 8.1M4.9 12.9v6.1a1 1 0 0 0 1 1h12.2a1 1 0 0 0 1-1v-6.1\"/>","shelter":"<path d=\"M3.7 10.5L12 4l8.3 6.5M5.9 9.2v10.4M18.1 9.2v10.4\"/><circle cx=\"12\" cy=\"11\" r=\"1.6\"/><path d=\"M9.8 19.6v-3.9a2.2 2.2 0 0 1 4.3 0V19.6\"/>","shield":"<path d=\"M12 3.7L5.5 6.6v5.6c0 4.1 2.8 7.1 6.5 8.4c3.7-1.3 6.5-4.2 6.5-8.4V6.6Z\"/>","shirt":"<path d=\"M8.2 3.8L3.7 6.6l1.8 3.8l1.8-0.9v11.2h9.3V9.4l1.8 0.9l1.8-3.8l-4.7-2.7c-0.5 1.4-1.8 2.3-3.8 2.3S8.8 5.1 8.2 3.8Z\"/>","signature":"<path d=\"M3.9 14c2.4 0 3.3-8.4 5.6-8.4c1.4 0 0.9 5.6 2.4 5.6c0.9 0 1.4-2.4 2.4-2.4s0.8 1.9 1.9 1.9c0.8 0 1.4-0.6 1.9-1.1M3.9 17.8h16.7\"/>","skip":"<path d=\"M4.8 3.5l10.8 8.4l-10.8 8.4Z\"/><path d=\"M19.7 3.5v16.7\"/>","skull":"<path d=\"M12 3.7a6.5 6.5 0 0 0-6.5 6.5c0 2.2 1 3.6 2.4 4.6v2.8h8.4v-2.8c1.3-1 2.4-2.6 2.4-4.6a6.5 6.5 0 0 0-6.5-6.5Z\"/><circle cx=\"9.6\" cy=\"10.7\" r=\"1.3\"/><circle cx=\"14.4\" cy=\"10.7\" r=\"1.3\"/><path d=\"M10.6 17.7v2.8M13.4 17.7v2.8\"/>","slash":"<path d=\"M3.6 3.6l16.7 16.7\"/>","sliders":"<path d=\"M3.5 6.8h10M18.7 6.8H20.3M3.5 17.2h3.6M12.4 17.2H20.3\"/><circle cx=\"16.2\" cy=\"6.8\" r=\"2.4\"/><circle cx=\"9.8\" cy=\"17.2\" r=\"2.4\"/>","smile":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M8.5 14a4 4 0 0 0 7 0M9 9.5h.01M15 9.5h.01\"/>","snow":"<path d=\"M12 3.5v17M4.6 7.8l14.7 8.5M4.6 16.3l14.7-8.5M9.6 4.9L12 7.3l2.4-2.4M9.6 19.1L12 16.7l2.4 2.4\"/>","sort":"<path d=\"M3.5 5.8h9.2M3.5 12h6.2M3.5 18.2h3M17.5 4.8v14.4M14.3 16.2l3 3l3-3\"/>","sort-asc":"<path d=\"M3.4 5.4h3M3.4 11.6h6.3M3.4 17.9h9.3M17.5 4.3v14.6M14.3 16l3 3l3-3\"/>","spark":"<path d=\"M10.4 3.6l1.7 4.8L17 10.1l-4.8 1.7L10.4 16.7l-1.7-4.8L3.9 10.1l4.8-1.7ZM17 14.8l0.8 2.1L19.8 17.6l-2.1 0.8L17 20.3l-0.8-2.1L14.3 17.6l2.1-0.8Z\"/>","square":"<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"2.7\"/>","star":"<path d=\"M12 4l2.6 5.3l5.7 0.6l-4.3 3.9l1.2 5.7L12 16.8l-5.2 2.9l1.2-5.7l-4.3-3.9l5.7-0.6Z\"/>","steps":"<path d=\"M9.7 5.7h11M9.7 11.8h11M9.7 17.8h11\"/><path d=\"M3.7 5.7l1.5 1.5L7.7 4.8M3.7 11.8l1.5 1.5L7.7 10.8M3.7 17.8l1.5 1.5L7.7 16.8\"/>","stop":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m8.5 8.5 7 7\"/>","store":"<path d=\"M3.7 8.8L5.3 3.7h13.4L20.3 8.8M3.7 8.8h16.5v1.6a2.8 2.8 0 0 1-5.4 0a2.8 2.8 0 0 1-5.6 0A2.8 2.8 0 0 1 3.7 10.4ZM4.8 12.9v7.2h14.5v-7.2M9.9 20.1v-4.1h4.1v4.1\"/>","storm":"<path d=\"M7.8 16a3.8 3.8 0 1 1 0.8-7.4A4.5 4.5 0 0 1 17.4 10.5a3.1 3.1 0 0 1-0.4 6.2\"/><path d=\"M12.9 12.2l-2.1 3.3h2.5L11.3 18.9\"/>","sun":"<circle cx=\"11.9\" cy=\"11.9\" r=\"3.4\"/><path d=\"M11.9 3.5v1.8M11.9 18.6v1.8M6 6l1.2 1.2M16.7 16.7l1.2 1.2M3.5 11.9h1.8M18.6 11.9h1.8M6 17.9l1.2-1.2M16.7 7.2l1.2-1.2\"/>","swap":"<path d=\"M3.5 7.8h14.9l-3.7-3.7M20.5 16.3H5.6l3.7 3.7\"/>","sword":"<path d=\"M20.3 3.7v3.7L10.4 17.3L6.7 13.6L16.7 3.7Z\"/><path d=\"M5.2 12L12 18.8M8.3 15.7L3.6 20.4\"/>","table":"<rect x=\"3.5\" y=\"4.3\" width=\"17\" height=\"15.1\" rx=\"1.9\"/><path d=\"M3.5 9.5h17M3.5 14.7h17M9.2 9.5V19.4M14.8 9.5V19.4\"/>","tack":"<path d=\"M9.3 4h5.6l-0.9 4.6l2.8 2.8H7.4l2.8-2.8ZM12 11.4v9.3\"/>","tag":"<path d=\"M3.8 11.2V3.8h7.4l9.3 9.3l-7.4 7.4Z\"/><circle cx=\"8\" cy=\"8\" r=\"1.2\"/>","target":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"12\" r=\"5\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\"/>","tent":"<path d=\"M3.5 18.4h17M12 4.9L4.8 18.4M12 4.9l7.2 13.4M12 12.5L9.3 18.4M12 12.5l2.7 5.8\"/>","terminal":"<rect x=\"3.7\" y=\"4.6\" width=\"16.7\" height=\"14.9\" rx=\"1.9\"/><path d=\"M7.4 9.2l2.8 2.8l-2.8 2.8M12.9 14.8h3.7\"/>","text":"<path d=\"M5.2 20.3L10.9 3.6h2.1l5.7 16.7M7.4 14h9.2\"/>","thumbs-up":"<path d=\"M7.3 10.4v9.6H4.8a1 1 0 0 1-1-1v-7.6a1 1 0 0 1 1-1Z\"/><path d=\"M7.3 10.4L10.9 3.3a2.2 2.2 0 0 1 2.5 2.6L12.7 9.4H18.5a2 2 0 0 1 2 2.4l-1.3 6.6a2 2 0 0 1-2 1.6H7.3\"/>","ticket":"<path d=\"M3.6 7.4h16.7v2.8a1.9 1.9 0 0 0 0 3.7v2.8H3.6v-2.8a1.9 1.9 0 0 0 0-3.7Z\"/><path d=\"M13.8 7.4v9.3\"/>","timeline":"<path d=\"M3.5 12h0.9M8.2 12h1.9M13.9 12h1.9M19.6 12h0.9\"/><circle cx=\"6.3\" cy=\"12\" r=\"1.9\"/><circle cx=\"12\" cy=\"12\" r=\"1.9\"/><circle cx=\"17.7\" cy=\"12\" r=\"1.9\"/><path d=\"M6.3 10.1V5.9M12 13.9v4.3M17.7 10.1V5.9\"/>","toolbox":"<rect x=\"3.5\" y=\"8.1\" width=\"17\" height=\"11.3\" rx=\"1.9\"/><path d=\"M9.2 8.1V5.8A1.4 1.4 0 0 1 10.6 4.3h2.8A1.4 1.4 0 0 1 14.8 5.8V8.1M3.5 12.8h17M8.2 11.4v2.8M15.8 11.4v2.8\"/>","train":"<rect x=\"6.4\" y=\"3.8\" width=\"11.2\" height=\"12.1\" rx=\"2.8\"/><path d=\"M6.4 10.3h11.2M9.2 13.1h0M14.8 13.1h0M8.7 20.5l1.9-3.3M15.3 20.5l-1.9-3.3\"/>","trash":"<path d=\"M4.1 6.7h15.8M10 10.6v5.9M14 10.6v5.9M6.1 6.7l1 11.8a2 2 0 0 0 2 2h5.9a2 2 0 0 0 2-2l1-11.8M9 6.7V3.7h5.9v3\"/>","tree":"<path d=\"M12.1 3.6L7 10.6h2.8L5.6 16.6h13l-4.2-6h2.8ZM12.1 16.6v3.7\"/>","trend-down":"<path d=\"M3.2 7.2l5.6 5.6l3.8-3.8l7.4 7.4\"/><path d=\"M14.4 16.6h5.6v-5.6\"/>","trend-up":"<path d=\"M3.2 16.8L8.8 11.3l3.8 3.8l7.4-7.4\"/><path d=\"M14.4 7.4h5.6v5.6\"/>","trophy":"<path d=\"M7.9 4h8.4v5.2a4.1 4.1 0 0 1-8.4 0ZM7.9 6.1H4.7a3.2 3.2 0 0 0 3.2 4.1M16.2 6.1h3.2a3.2 3.2 0 0 1-3.2 4.1M12 13.4v4.1M7.9 20.8h8.4\"/>","tv":"<rect x=\"3.5\" y=\"7.8\" width=\"17\" height=\"11.6\" rx=\"1.8\"/><path d=\"M8.4 4.3l3.6 3.6l3.6-3.6\"/>","umbrella":"<path d=\"M3.8 12.5a8.4 8.4 0 0 1 16.6 0ZM12.1 12.5v6a1.9 1.9 0 0 1-3.7 0M12.1 4.1v0\"/>","undo":"<path d=\"M9.2 14.2L4 8.9l5.2-5.2\"/><path d=\"M4 8.9h11a5.8 5.8 0 0 1 0 11.5H11.3\"/>","up":"<path d=\"M3.7 16.1l8.3-8.3l8.3 8.3\"/>","upload":"<path d=\"M12 20.8V9.2M6.8 14.5l5.2-5.2l5.2 5.2M4.7 4h14.7\"/>","user":"<circle cx=\"12\" cy=\"7.4\" r=\"3.8\"/><path d=\"M4.3 20.5c0-3.9 3.4-6.6 7.7-6.6s7.7 2.6 7.7 6.6\"/>","user-check":"<circle cx=\"9.2\" cy=\"8.1\" r=\"2.8\"/><path d=\"M4 19c0-2.9 2.4-4.9 5.4-4.9s5.4 1.9 5.4 4.9M15.4 10.8l1.8 1.8l3.6-3.6\"/>","user-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/><path d=\"M6.6 18.3a6.5 6.5 0 0 1 10.8 0\"/>","user-lock":"<circle cx=\"9.8\" cy=\"7.3\" r=\"3.3\"/><path d=\"M3.5 18.8c0-3.4 2.8-5.7 6.2-5.7c1.2 0 2.2 0.3 3.1 0.7\"/><rect x=\"14.6\" y=\"14.5\" width=\"5.7\" height=\"4.8\" rx=\"1\"/><path d=\"M16 14.5v-1.2a1.5 1.5 0 0 1 2.9 0v1.2\"/>","user-minus":"<circle cx=\"10.1\" cy=\"8\" r=\"3.3\"/><path d=\"M4 19.3c0-3.3 2.7-5.7 6.1-5.7c1.1 0 2.2 0.3 3 0.7\"/><path d=\"M15.1 17h5.7\"/>","user-off":"<circle cx=\"12\" cy=\"8.2\" r=\"3.5\"/><path d=\"M5.1 20c0-3.6 3-5.9 6.9-5.9s6.9 2.3 6.9 5.9\"/><path d=\"M3.7 3.7l16.7 16.7\"/>","user-pen":"<circle cx=\"9.8\" cy=\"8\" r=\"3.3\"/><path d=\"M3.8 19.1c0-3.3 2.7-5.6 6-5.6c1.1 0 2.1 0.3 3 0.7\"/><path d=\"M19.1 12.1l1.4 1.4l-4.7 4.7l-1.9 0.5l0.5-1.9Z\"/>","user-tag":"<circle cx=\"10\" cy=\"7.6\" r=\"3.3\"/><path d=\"M3.8 18.9c0-3.3 2.8-5.6 6.1-5.6c1.1 0 2.2 0.3 3.1 0.7\"/><path d=\"M14.2 14.2h3.7l2.4 2.4l-2.4 2.4h-3.7Z\"/><path d=\"M16.1 16.5h0\"/>","video":"<rect x=\"3.4\" y=\"6.4\" width=\"12.3\" height=\"11.3\" rx=\"1.9\"/><path d=\"M15.6 10.2l4.7-2.8v9.4l-4.7-2.8\"/>","volume":"<path d=\"M3.5 9.5h3.7L11.8 5.8v12.6l-4.7-3.7H3.5Z\"/><path d=\"M15.5 9.5a3.7 3.7 0 0 1 0 5.2M18.1 6.9a7.3 7.3 0 0 1 0 10.5\"/>","walk":"<circle cx=\"12.3\" cy=\"5.1\" r=\"1.7\"/><path d=\"M8.8 20.3l2.4-5.5l1.9 2.2V20.3M11 14.8l0.9-5.2l-2.7 1.4l-1.4 2.7M11.9 9.6l1.8 2.7l2.7 0.9\"/>","wallet":"<path d=\"M3.5 6.8A2.7 2.7 0 0 1 6.2 4.2H18.4v4.2M3.5 6.8V18a2.1 2.1 0 0 0 2.1 2.1h14.9V8.4H6.2A2.7 2.7 0 0 1 3.5 6.8Z\"/><path d=\"M16.2 14.2h0\"/>","water":"<path d=\"M3.5 10.2c2.1 0 2.1-1.8 4.3-1.8s2.1 1.8 4.2 1.8s2.1-1.8 4.3-1.8s2.1 1.8 4.2 1.8M3.5 15.6c2.1 0 2.1-1.8 4.3-1.8s2.1 1.8 4.2 1.8s2.1-1.8 4.3-1.8s2.1 1.8 4.2 1.8\"/>","wave":"<path d=\"M3.7 16.2c2.1 0 2.1-1.7 4.2-1.7s2.1 1.7 4.2 1.7s2.1-1.7 4.2-1.7s2.1 1.7 4.2 1.7\"/><path d=\"M6.5 12.7A5.6 5.6 0 0 1 16.4 9.4c-1.9-0.4-3.5 0.3-4 2\"/>","weight":"<circle cx=\"12\" cy=\"5.2\" r=\"2\"/><path d=\"M7.1 8.7h9.9l3 11.3H4.1Z\"/>","wifi":"<path d=\"M3.7 9.4a12.4 12.4 0 0 1 16.7 0M6.4 12.5a8.4 8.4 0 0 1 11.5 0M9.1 15.6a4.4 4.4 0 0 1 6.2 0M12.1 18.6h0\"/>","wind":"<path d=\"M3.5 9.9h10.4a2.8 2.8 0 1 0-2.8-2.8M3.5 13.7h14.2a2.8 2.8 0 1 1-2.8 2.8M3.5 17.5h6.6\"/>","window":"<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M3.5 9h17\"/>","window-restore":"<rect x=\"3.5\" y=\"8.5\" width=\"12\" height=\"11\" rx=\"2\"/><path d=\"M8.5 8.5v-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3\"/>","wizard":"<path d=\"M3.6 20h16.7M6.3 20L9.9 9.1L15.7 3.3L14.1 10.1L17.8 20\"/><path d=\"M8.4 15.4h7.3\"/>","wrench":"<path d=\"M14.6 3.6a5.2 5.2 0 0 0-4.6 7.3L3.7 17.3V20.3h3.1l6.4-6.4a5.2 5.2 0 0 0 7.3-4.6l-3.2 1.2l-2.5-2.5l1.2-3.2Z\"/>","x-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m9 9 6 6M15 9l-6 6\"/>","zap":"<path d=\"M13.4 3.5L5.9 12.9h5.7l-0.9 7.6l7.6-9.4h-5.7Z\"/>"};
-- const S = {"airplane":"<path d=\"M11.8 2.6c1.3 0 2 1.2 2 3V9.5l7.2 4.2v2.5L13.8 13.7v3.5l2 1.5v2.5L11.8 19.7l-3.7 1.2v-2.5l2-1.5v-3.5l-7.2 2.5v-2.5L9.8 9.5V5.3c0-1.8 0.7-3 2-3Z\"/>","alert":"<path fill-rule=\"evenodd\" d=\"M10.5 4.1a1.7 1.7 0 0 1 3 0l7.7 13.3a1.7 1.7 0 0 1-1.5 2.6H4.3a1.7 1.7 0 0 1-1.5-2.6ZM11 8.8h2v5.2h-2ZM12 15.2a1.2 1.2 0 1 1 0 2.4a1.2 1.2 0 0 1 0-2.4Z\"/>","alert-circle":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM11.7 6.9h2.5v7.1h-2.5ZM12.9 15.3a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3Z\"/>","archive":"<rect x=\"2.6\" y=\"3.4\" width=\"18.8\" height=\"5.4\" rx=\"1.2\"/><path fill-rule=\"evenodd\" d=\"M4.4 10h15.2v9.2a1.6 1.6 0 0 1-1.6 1.6H6a1.6 1.6 0 0 1-1.6-1.6ZM9.6 12.4v1.8h4.8v-1.8Z\"/>","bell":"<path d=\"M5.2 15.4V9.6a6.8 6.8 0 0 1 13.7 0v5.7l1.9 2.6H3.3ZM9.7 19.3h4.6a2.3 2.3 0 0 1-4.6 0Z\"/>","book":"<path d=\"M4.3 5.2A2.4 2.4 0 0 1 6.8 2.7h12.2v14.6H6.8a2.4 2.4 0 0 0-2.4 2.4Z\"/><path class=\"ln\" d=\"M7.2 20.2h11.2\"/>","book-open":"<path d=\"M10.9 5.8C8.8 4.4 6 3.8 2.5 4.5v14c3.5-0.6 6.3 0 8.4 1.5ZM13.1 5.8c2.1-1.5 5-2 8.4-1.4v14c-3.5-0.6-6.3 0-8.4 1.5Z\"/>","box":"<path d=\"M12 2.7l9.4 4.5l-9.4 4.5l-9.4-4.5ZM2.6 8.9l8.6 4.1v8.2l-8.6-4.3ZM21.4 8.9l-8.6 4.1v8.2l8.6-4.3Z\"/>","brain":"<path d=\"M8.9 3.8a3.2 3.2 0 0 0-3.2 3.1a3.1 3.1 0 0 0-2.2 5.3a3.1 3.1 0 0 0 2.2 5.2a3.2 3.2 0 0 0 5.7 1.3V5.6A2.3 2.3 0 0 0 8.9 3.8Z\"/><path d=\"M15.1 3.8a3.2 3.2 0 0 1 3.2 3.1a3.1 3.1 0 0 1 2.2 5.3a3.1 3.1 0 0 1-2.2 5.2a3.2 3.2 0 0 1-5.7 1.3V5.6A2.3 2.3 0 0 1 15.1 3.8Z\"/>","bridge":"<path d=\"M5.7 4.6h2.6v15.4H5.7ZM15.7 4.6h2.6v15.4h-2.6ZM3.4 14.6h17.2v2.8H3.4Z\"/><path class=\"ln\" d=\"M4 10c1.6 0 2.5-2.3 3-5c2.4 5.2 7.6 5.2 10 0c.5 2.7 1.4 5 3 5M12 10.9V15\"/>","briefcase":"<path d=\"M2.7 9.1a2.5 2.5 0 0 1 2.5-2.5h13.6a2.5 2.5 0 0 1 2.5 2.5v2.8H2.7ZM2.7 13.1h7.2v1.5h4.3v-1.5h7.2V17.9a2.5 2.5 0 0 1-2.5 2.5H5.2a2.5 2.5 0 0 1-2.5-2.5Z\"/><path class=\"ln\" d=\"M9.1 6.6V5.7A1.5 1.5 0 0 1 10.5 4.2h2.9A1.5 1.5 0 0 1 14.9 5.7v0.9\"/>","bug":"<path fill-rule=\"evenodd\" d=\"M12 7a4.8 4.8 0 0 1 4.8 4.8v3.4a4.8 4.8 0 0 1-9.6 0v-3.4A4.8 4.8 0 0 1 12 8Zm-0.7 4.4v7.4h1.4v-7.4Z\"/><path d=\"M9.4 5.8a2.6 2.6 0 0 1 5.2 0Z\"/><path class=\"ln\" d=\"M7.2 12.5H3.8M20.2 12.5h-3.4M7.6 9.4L5 7M16.4 9.4L19 7M7.6 16.6L5 19M16.4 16.6L19 19\"/>","burst":"<path d=\"M12.1 2.6l2 4.6l4.7-1.9l-1.9 4.7l4.6 2l-4.6 2l1.9 4.7l-4.7-1.9l-2 4.6l-2-4.6l-4.7 1.9l1.9-4.7L2.7 12l4.6-2l-1.9-4.7l4.7 1.9Z\"/>","calendar":"<path fill-rule=\"evenodd\" d=\"M4.1 8.1a2 2 0 0 1 2-2h11.8a2 2 0 0 1 2 2V19.5a2 2 0 0 1-2 2H6.1a2 2 0 0 1-2-2Zm2.2 3.9V19.3h11.4v-7.3Z\"/><path class=\"ln\" d=\"M9 3.9v3.5M15 3.9v3.5\"/>","camera":"<path fill-rule=\"evenodd\" d=\"M2.5 7.8a1.9 1.9 0 0 1 1.9-1.9h2.6L8.8 3.3h6.3l1.8 2.6h2.6A1.9 1.9 0 0 1 21.5 7.8v10.7a1.9 1.9 0 0 1-1.9 1.9H4.4A1.9 1.9 0 0 1 2.5 18.5Zm9.5 2a3.6 3.6 0 1 0 0 7.2a3.6 3.6 0 0 0 0-7.2Z\"/>","camera-flip":"<path fill-rule=\"evenodd\" d=\"M2.5 7.8a1.9 1.9 0 0 1 1.9-1.9h2.6L8.8 3.3h6.3l1.8 2.6h2.6A1.9 1.9 0 0 1 21.5 7.8v10.7a1.9 1.9 0 0 1-1.9 1.9H4.4A1.9 1.9 0 0 1 2.5 18.5ZM7.7 11.7A4.5 4.5 0 0 1 16.3 11.7L13.9 12.6A2 2 0 0 0 10.1 12.6ZM16.3 14.8A4.5 4.5 0 0 1 7.7 14.8L10.1 14A2 2 0 0 0 13.9 14Z\"/>","camera-off":"<path d=\"M8.5 4.6L9 3.8h6.1l1.7 2.5h2.5A1.8 1.8 0 0 1 21.2 8.1v9.1ZM3.8 7.3L16.7 20.2H4.8A1.8 1.8 0 0 1 3 18.4V8.1Z\"/><path class=\"ln\" d=\"M4 3.8l16.2 16.2\"/>","car":"<path fill-rule=\"evenodd\" d=\"M5.6 5.2h12.7l2.7 5.5H3ZM2.6 12.2h18.7v4.5H2.6ZM5.9 14.4a1.1 1.1 0 1 0 2.3 0a1.1 1.1 0 1 0-2.3 0ZM15.8 14.4a1.1 1.1 0 1 0 2.3 0a1.1 1.1 0 1 0-2.3 0ZM5 17.5h2.7v1.8H5ZM16.3 17.5h2.7v1.8h-2.7Z\"/>","card":"<path fill-rule=\"evenodd\" d=\"M2.6 7.4a2.4 2.4 0 0 1 2.4-2.4h13.9a2.4 2.4 0 0 1 2.4 2.4v9.3a2.4 2.4 0 0 1-2.4 2.4h-13.9a2.4 2.4 0 0 1-2.4-2.4ZM2.6 9.5v1.7h18.7V9.5ZM5.9 14.2v1.5h4.8v-1.5Z\"/>","care":"<path d=\"M17 11s-4.1-2.4-4.1-5.4a2.3 2.3 0 0 1 4.1-1.6a2.3 2.3 0 0 1 4.1 1.6c0 2.9-4.1 5.4-4.1 5.4Z\"/><path class=\"ln\" d=\"M3.5 16.2h3.2l4.3 3.2h5.9a2.1 2.1 0 0 0 0-4.3H13.3M7.9 16.2l2.3-2.1h3.6\"/>","cart":"<path d=\"M6.3 7h15l-2.5 8.3H8.1Z\"/><circle cx=\"9.5\" cy=\"19.4\" r=\"1.6\"/><circle cx=\"17\" cy=\"19.4\" r=\"1.6\"/><path class=\"ln\" d=\"M3.8 4.8H5.8l2.3 10.5\"/>","cc":"<path fill-rule=\"evenodd\" d=\"M5.6 4.6h12.7a3 3 0 0 1 3 3v8.8a3 3 0 0 1-3 3h-12.7a3 3 0 0 1-3-3v-8.8a3 3 0 0 1 3-3ZM10.8 9.5A3.2 3.2 0 1 0 10.8 14.5L9.6 13A1.3 1.3 0 1 1 9.6 11ZM17.4 9.5A3.2 3.2 0 1 0 17.4 14.5L16.2 13A1.3 1.3 0 1 1 16.2 11Z\"/>","chart":"<path class=\"ln\" d=\"M4 3.5v16.2h16.2\"/><path d=\"M7 14.9L11 10.3l3 2.5l5.2-6.2V17.7H7Z\"/>","chat":"<path d=\"M2.7 4.7A1.8 1.8 0 0 1 4.5 3h15.2a1.8 1.8 0 0 1 1.8 1.8v10.9a1.8 1.8 0 0 1-1.8 1.8H8.3L2.7 21.8Z\"/>","chat-off":"<path d=\"M8.1 4.6H19a1.6 1.6 0 0 1 1.6 1.6v9.5a1.6 1.6 0 0 1-0.4 1ZM3.4 7.3L12.9 16.8H8.3l-4.9 4.6Z\"/><path class=\"ln\" d=\"M4 4.2l16 16\"/>","check-circle":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM17.3 8.9l1.6 1.6l-7 7l-4.1-4.1l1.6-1.6l2.6 2.6Z\"/>","child":"<circle cx=\"12\" cy=\"5.2\" r=\"2.6\"/><path class=\"ln\" d=\"M7.7 10L12 8.6l4.3 1.4M12 8.6v5.8M9.1 20.1l2.9-5.8l2.9 5.8\"/>","chip":"<path fill-rule=\"evenodd\" d=\"M8.6 7.2h6.8a1.4 1.4 0 0 1 1.4 1.4v6.8a1.4 1.4 0 0 1-1.4 1.4H8.6a1.4 1.4 0 0 1-1.4-1.4V8.6a1.4 1.4 0 0 1 1.4-1.4Zm1.7 3.1v3.4h3.4v-3.4Z\"/><path class=\"ln\" d=\"M10.2 4v3.2M13.8 4v3.2M10.2 16.8V20M13.8 16.8V20M4 10.2h3.2M4 13.8h3.2M16.8 10.2H20M16.8 13.8H20\"/>","circle":"<circle cx=\"12\" cy=\"12\" r=\"9.5\"/>","city":"<path fill-rule=\"evenodd\" d=\"M5.4 7.7h4.6v10.9H5.4Zm1.9 2.2v1.4h1.2v-1.4Zm0 2.9v1.4h1.2v-1.4Z\"/><path fill-rule=\"evenodd\" d=\"M10.7 3.4h5.1v15.2h-5.1Zm1.7 2.4v1.4h1.4V5.8Zm0 2.9v1.4h1.4V8.7Zm0 2.9v1.4h1.4v-1.4Z\"/><path d=\"M16.5 11.3h2.2v7.4h-2.2Z\"/><path class=\"ln\" d=\"M3.9 18.6h16.1\"/>","clapper":"<path fill-rule=\"evenodd\" d=\"M2.6 5.9L19.9 2.7l0.9 4.3L3.2 8.7ZM7 5.1L9.2 8.1l2.6-0.2L9.6 4.6ZM12.6 4l2.2 3.6l2.6-0.3L15.2 3.6Z\"/><path d=\"M3.1 9.9h18.2v9a1.6 1.6 0 0 1-1.6 1.6h-15a1.6 1.6 0 0 1-1.6-1.6Z\"/>","clipboard":"<path fill-rule=\"evenodd\" d=\"M7.5 4.2h9a2 2 0 0 1 2 2v13.1a2 2 0 0 1-2 2H7.5a2 2 0 0 1-2-2V6.3a2 2 0 0 1 2-2ZM9.1 9.9v1.6h5.8v-1.6Zm0 3.9v1.6h3.9v-1.6Z\"/><rect x=\"8.7\" y=\"2.5\" width=\"6.6\" height=\"3.7\" rx=\"1.2\"/>","clipboard-check":"<path fill-rule=\"evenodd\" d=\"M7.5 4.2h9a2 2 0 0 1 2 2v13.1a2 2 0 0 1-2 2H7.5a2 2 0 0 1-2-2V6.3a2 2 0 0 1 2-2ZM8 13.1L11 16.1l5-5l-1.6-1.6l-3.4 3.4l-1.5-1.5Z\"/><rect x=\"8.7\" y=\"2.5\" width=\"6.6\" height=\"3.7\" rx=\"1.2\"/>","clock":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM11.9 6.6h2.3v5l3.3 2l-1.1 2l-4.3-2.7Z\"/>","cloud":"<path d=\"M7.9 18.2h9.6a4.2 4.2 0 0 0 0.6-8.3A6.1 6.1 0 0 0 6.5 9.2A4.5 4.5 0 0 0 7.9 18.2Z\"/>","cloud-off":"<path d=\"M10.1 5.7A6 6 0 0 1 17.9 9.8a4.1 4.1 0 0 1 2.8 6.5ZM6.6 9.1L15.5 18H7.9A4.4 4.4 0 0 1 6.4 9.2Z\"/><path class=\"ln\" d=\"M5.1 4.2l15 15\"/>","coin":"<path fill-rule=\"evenodd\" d=\"M13 2.6a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM12 5.8h2.1v1.2c1.1 0.2 2.1 0.8 2.6 1.7l-1.7 1c-0.3-0.6-1-1-1.8-1c-0.9 0-1.5 0.4-1.5 1s0.5 0.8 1.8 1.1c1.8 0.4 3.5 1 3.5 3.1c0 1.4-1 2.5-2.8 2.8V18h-2.1v-1.3c-1.2-0.2-2.3-0.9-2.8-2l1.7-1c0.4 0.7 1.1 1.1 2.1 1.1c1 0 1.6-0.4 1.6-1s-0.6-0.8-2-1.1c-1.7-0.4-3.4-1-3.4-3c0-1.3 1-2.4 2.7-2.7Z\"/>","columns":"<path d=\"M2.6 6.3a2.7 2.7 0 0 1 2.7-2.7h13.4a2.7 2.7 0 0 1 2.7 2.7v1.5H2.6ZM2.6 9.9h8.3v10.4H5.3a2.7 2.7 0 0 1-2.7-2.7ZM13 9.9h8.3v7.7a2.7 2.7 0 0 1-2.7 2.7H13Z\"/>","compass":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM17.4 7.7L14.9 14.1L8.5 16.5L11 10.1Z\"/>","compress":"<path d=\"M9.7 9.7H2.7L9.7 2.7ZM14.3 9.7h7l-7-7ZM9.7 14.3H2.7l7 7ZM14.3 14.3h7l-7 7Z\"/>","computer":"<rect x=\"2.6\" y=\"3.4\" width=\"18.8\" height=\"12.8\" rx=\"2.2\"/><path class=\"ln\" d=\"M8 20h8M12 16.2v3.8\"/>","contrast":"<path fill-rule=\"evenodd\" d=\"M12.4 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7Zm0 2.1a7.2 7.2 0 0 1 0 14.4Z\"/>","cookie":"<path fill-rule=\"evenodd\" d=\"M21.6 12.4a9.4 9.4 0 1 1-10-10a3.4 3.4 0 0 0 4.4 3.9a3.4 3.4 0 0 0 5.5 5.9ZM7 9.1a1.3 1.3 0 1 0 2.7 0a1.3 1.3 0 1 0-2.7 0ZM10.9 14a1.3 1.3 0 1 0 2.7 0a1.3 1.3 0 1 0-2.7 0ZM6.5 15.7a1.3 1.3 0 1 0 2.7 0a1.3 1.3 0 1 0-2.7 0ZM14.8 15.7a1.3 1.3 0 1 0 2.7 0a1.3 1.3 0 1 0-2.7 0Z\"/>","copy":"<rect x=\"7.5\" y=\"7.5\" width=\"13.8\" height=\"13.8\" rx=\"2.5\"/><path class=\"ln\" d=\"M16.4 7.5V5.9a2.1 2.1 0 0 0-2.1-2.1H5.9a2.1 2.1 0 0 0-2.1 2.1v8.5a2.1 2.1 0 0 0 2.1 2.1h1.7\"/>","couch":"<path d=\"M7.1 4.2h9.7A2.5 2.5 0 0 1 19.4 6.7v1.9a3.1 3.1 0 0 0-3.1 3.1v0.1H7.7v-0.1A3.1 3.1 0 0 0 4.6 8.7V6.7A2.5 2.5 0 0 1 7.1 4.2ZM2.7 11.6a2.5 2.5 0 0 1 5.1 0v1.9h8.6V11.6a2.5 2.5 0 0 1 5.1 0v5.5H2.7Z\"/><path class=\"ln\" d=\"M5.2 17.1v1.9M18.8 17.1v1.9\"/>","crown":"<path d=\"M2.6 7.3L7.4 11.5L12 4.1L16.6 11.5l4.8-4.2l-2 11.7H4.6Z\"/>","cubes":"<path d=\"M12 2.3L7.8 4.4v4.8l4.2 2.1l4.2-2.1V4.4ZM6.8 12.1L2.7 14.2v4.8l4.2 2.1l4.2-2.1v-4.8ZM17.2 12.1l-4.2 2.1v4.8l4.2 2.1l4.2-2.1v-4.8Z\"/>","database":"<ellipse cx=\"12\" cy=\"5.7\" rx=\"7.9\" ry=\"3.2\"/><path d=\"M4.1 7.5a7.9 3.2 0 0 0 15.9 0v4.3a7.9 3.2 0 0 1-15.9 0ZM4.1 13.4a7.9 3.2 0 0 0 15.9 0v4.7a7.9 3.2 0 0 1-15.9 0Z\"/>","dice":"<path fill-rule=\"evenodd\" d=\"M6.2 2.7h11.5a3.6 3.6 0 0 1 3.6 3.6v11.5a3.6 3.6 0 0 1-3.6 3.6H6.2a3.6 3.6 0 0 1-3.6-3.6V6.2a3.6 3.6 0 0 1 3.6-3.6ZM6.2 8.2a2 2 0 1 0 3.9 0a2 2 0 1 0-3.9 0ZM13.8 8.2a2 2 0 1 0 3.9 0a2 2 0 1 0-3.9 0ZM10 12a2 2 0 1 0 3.9 0a2 2 0 1 0-3.9 0ZM6.2 15.8a2 2 0 1 0 3.9 0a2 2 0 1 0-3.9 0ZM13.8 15.8a2 2 0 1 0 3.9 0a2 2 0 1 0-3.9 0Z\"/>","dish":"<path d=\"M2.7 9.7A11.7 11.7 0 0 0 14.4 21.4Z\"/><path class=\"ln\" d=\"M8.8 15.3l4.9-4.9M14.2 4a5.8 5.8 0 0 1 5.8 5.8M14.2 8.1a1.8 1.8 0 0 1 1.8 1.8\"/>","donate":"<path fill-rule=\"evenodd\" d=\"M12 2.2a5.9 5.9 0 1 0 0 11.8a5.9 5.9 0 0 0 0-11.8Zm-0.8 3.4h1.7v5.1h-1.7ZM2.9 15h18.2v6H2.9ZM7.8 17.1v1.6h8.5V17.1Z\"/>","door":"<path fill-rule=\"evenodd\" d=\"M14.3 4.5L6.2 3v17.1l8.2-1.5ZM10.2 11.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0Z\"/><path class=\"ln\" d=\"M15.5 5.3h1.4a0.9 0.9 0 0 1 0.9 0.9v13.3M15.5 19.5H20M4 19.5h2.1\"/>","download":"<path d=\"M10.6 2.3h2.5v7h4.7L11.9 15.4l-5.9-5.9h4.7Z\"/><path class=\"ln\" d=\"M4.5 19.7h14.9\"/>","drive":"<path fill-rule=\"evenodd\" d=\"M5.3 11.4h13.5a2.7 2.7 0 0 1 2.7 2.7v3a2.7 2.7 0 0 1-2.7 2.7H5.3a2.7 2.7 0 0 1-2.7-2.7v-3a2.7 2.7 0 0 1 2.7-2.7ZM16.8 14.4a1.1 1.1 0 1 1 0 2.3a1.1 1.1 0 0 1 0-2.3ZM13.7 14.4a1.1 1.1 0 1 1 0 2.3a1.1 1.1 0 0 1 0-2.3Z\"/><path class=\"ln\" d=\"M4.1 11.9L6.8 4.7h10.4l2.8 7.2\"/>","drop":"<path d=\"M12 2.2s7 7.4 7 12.6a7 7 0 0 1-13.9 0C5 9.6 12 2.2 12 2.2Z\"/>","eraser":"<path d=\"M14 3.9l6.1 6.1-5.2 5.2-6.1-6.1ZM7.4 10l6.2 6.2-3.2 3.2H6.1l-2.9-2.9a1.6 1.6 0 0 1 0-2.3Z\"/><path class=\"ln\" d=\"M13 19.4h7\"/>","expand":"<path d=\"M2.7 2.7h7L2.7 9.7ZM21.3 2.7h-7l7 7ZM2.7 21.3h7l-7-7ZM21.3 21.3h-7l7-7Z\"/>","eye":"<path fill-rule=\"evenodd\" d=\"M12 5.3C6.4 5.3 2.6 12 2.6 12s3.9 6.7 9.4 6.7S21.5 12 21.5 12S17.6 5.3 12 5.3Zm0 3.3a3.3 3.3 0 1 1 0 6.7a3.3 3.3 0 0 1 0-6.7Z\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\"/>","eye-off":"<path d=\"M9 5.8A10 10 0 0 1 21.4 12a10 10 0 0 1-2.5 3.8L15.3 12.2a3.3 3.3 0 0 0-3.5-3.5ZM15 18.2A10 10 0 0 1 2.6 12a10 10 0 0 1 2.5-3.8L8.7 11.8a3.3 3.3 0 0 0 3.5 3.5Z\"/><path class=\"ln\" d=\"M4.6 4.6l14.8 14.8\"/>","fast-forward":"<path d=\"M3 5.5v13.1L12 12ZM12.7 5.5v13.1L21.8 12Z\"/>","file":"<path d=\"M5.8 2.4h7.6v5.2h5V21.2H5.8ZM15 2.7l3.1 3.3h-3.1Z\"/>","file-code":"<path fill-rule=\"evenodd\" d=\"M5.8 2.4h7.6v5.2h5V21.2H5.8ZM9.8 11l1.5 1.4l-1.6 1.7l1.6 1.7l-1.5 1.4l-2.9-3.1ZM14.4 11l-1.5 1.4l1.6 1.7l-1.6 1.7l1.5 1.4l2.9-3.1Z\"/><path d=\"M15 2.7l3.1 3.3h-3.1Z\"/>","film":"<path fill-rule=\"evenodd\" d=\"M4.8 3.6h14.4a2.3 2.3 0 0 1 2.3 2.3v12.3a2.3 2.3 0 0 1-2.3 2.3H4.8A2.3 2.3 0 0 1 2.5 18.2V5.8A2.3 2.3 0 0 1 4.8 3.6Zm3.8 2v12.9h6.8V5.5ZM4.4 6v2h2.1V6Zm0 5v1.8h2.1v-1.8Zm0 4.9v2h2.1v-2Zm13.1-10v2h2.1V6Zm0 5v1.8h2.1v-1.8Zm0 4.9v2h2.1v-2Z\"/>","finish":"<path d=\"M6.5 4.2h3.9v4.6H6.5ZM14.8 4.2h4a0.9 0.9 0 0 1 0.9 0.9v3.7h-4.9ZM10.5 8.6h4.5v4.6H10.5Z\"/><path class=\"ln\" d=\"M6 20.3V4.1\"/>","fire":"<path fill-rule=\"evenodd\" d=\"M12.1 19.8a6.8 6.8 0 0 0 6.8-6.8c0-4.3-2.9-6.8-4.2-10.3c-2.1 2.3-2.6 4.6-2.6 4.6S10.8 5.1 9.6 3C7.1 5.9 5.2 9.2 5.2 12.9A6.8 6.8 0 0 0 12.1 21.4Zm0-2.8a2.8 2.8 0 0 0 2.8-2.8c0-1.6-1.2-2.7-1.7-4c-0.9 1-1.1 1.8-1.1 1.8s-0.5-0.9-1-1.6c-1 1.2-1.7 2.5-1.7 3.9a2.8 2.8 0 0 0 2.7 2.7Z\"/>","fish":"<path fill-rule=\"evenodd\" d=\"M7.6 12c2.1-3.6 4.8-5.4 7.9-5.4 2.9 0 5 2.2 6.1 5.4-1.1 3.2-3.2 5.4-6.1 5.4-3.1 0-5.8-1.8-7.9-5.4ZM15.7 10.6a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z\"/><path d=\"M8.4 12 2.9 7.4v9.2Z\"/>","flag":"<path class=\"ln\" d=\"M7.2 20.5V4.3\"/><path d=\"M7.8 4.1h10.9l-2 4.1l2 4.1H7.8Z\"/>","focus":"<circle cx=\"12\" cy=\"12\" r=\"3.6\"/><path class=\"ln\" d=\"M3.8 9V6.1A2.3 2.3 0 0 1 6.1 3.8H9M15 3.8h2.9A2.3 2.3 0 0 1 20.2 6.1V9M20.2 15v2.9a2.3 2.3 0 0 1-2.3 2.3H15M9 20.2H6.1A2.3 2.3 0 0 1 3.8 17.9V15\"/>","folder":"<path d=\"M2.7 6.4a2.1 2.1 0 0 1 2.1-2.1h4.4l2.1 2.1h8.1a2.1 2.1 0 0 1 2.1 2.1v8.7a2.1 2.1 0 0 1-2.1 2.1H4.8a2.1 2.1 0 0 1-2.1-2.1Z\"/>","folder-tree":"<path d=\"M9.6 5h4l1 1.5h6.4v5.3H9.6ZM9.6 14.3h4l1 1.5h6.4v5.3H9.6Z\"/><path class=\"ln\" d=\"M4.1 3.6v13.2a1 1 0 0 0 1 1H9.6M4.1 8.8H9.6\"/>","food":"<path d=\"M4.7 3.3h1.5v4.7h0.6V3.3h1.4v4.7h0.6V3.3h1.5v4.9A2.9 2.9 0 0 1 8.6 10.8V21.7H6.5V10.8a2.9 2.9 0 0 1-1.8-2.7ZM18.9 21.7h-2.3v-7.4h-3V10.6c0-3.9 1.7-6.6 5.2-7.7Z\"/>","game":"<path fill-rule=\"evenodd\" d=\"M7.6 6.3h8.8a5.8 5.8 0 0 1 0 11.5H7.6a5.8 5.8 0 0 1 0-11.5Zm-1.4 3.7v1.6H4.7v1.8h1.6v1.6H7.9v-1.6h1.6v-1.8H7.9v-1.6Zm9.2 1a1.2 1.2 0 1 0 0 2.3a1.2 1.2 0 0 0 0-2.3Zm2.5 1.6a1.2 1.2 0 1 0 0 2.3a1.2 1.2 0 0 0 0-2.3Z\"/>","gauge":"<path fill-rule=\"evenodd\" d=\"M3.7 18A9.4 9.4 0 1 1 19.4 19.6ZM15 8.6l-2.2 5.6l-2.1 0.3l-0.4-2.1Z\"/>","gavel":"<path d=\"M11.3 5.5L5.5 11.3l6.1 6.1l5.8-5.8Z\"/><path class=\"ln\" d=\"M13.7 4.2l5 5M3.8 19.1l5.7-5.7M13.7 19.1h6.3\"/>","gear":"<path fill-rule=\"evenodd\" d=\"M18.2 14.6a1.4 1.4 0 0 0 0.3 1.7l0.1 0.1a1.7 1.7 0 1 1-2.7 2.7l-0.1-0.1a1.4 1.4 0 0 0-1.7-0.3a1.4 1.4 0 0 0-0.9 1.4V19.6a1.7 1.7 0 1 1-3.8 0v-0.1a1.4 1.4 0 0 0-1-1.4a1.4 1.4 0 0 0-1.7 0.3l-0.1 0.1a1.7 1.7 0 1 1-2.7-2.7l0.1-0.1a1.4 1.4 0 0 0 0.3-1.7a1.4 1.4 0 0 0-1.4-0.9H4.6a1.7 1.7 0 1 1 0-3.8h0.1a1.4 1.4 0 0 0 1.4-1a1.4 1.4 0 0 0-0.3-1.7l-0.1-0.1a1.7 1.7 0 1 1 2.7-2.7l0.1 0.1a1.4 1.4 0 0 0 1.7 0.3H9.6a1.4 1.4 0 0 0 0.9-1.4V4.6a1.7 1.7 0 1 1 3.8 0v0.1a1.4 1.4 0 0 0 0.9 1.4a1.4 1.4 0 0 0 1.7-0.3l0.1-0.1a1.7 1.7 0 1 1 2.7 2.7l-0.1 0.1a1.4 1.4 0 0 0-0.3 1.7V9.6a1.4 1.4 0 0 0 1.4 0.9H19.6a1.7 1.7 0 1 1 0 3.8h-0.1a1.4 1.4 0 0 0-1.4 0.9ZM12.1 9.3a2.8 2.8 0 1 0 0 6.5a2.8 2.8 0 0 0 0-6.5Z\"/>","gem":"<path d=\"M6.4 3.9h11.2l3.8 5.3l-9.4 11.6L2.6 9.2Z\"/>","ghost":"<path fill-rule=\"evenodd\" d=\"M3.4 21.3V9.9a8.7 8.7 0 0 1 17.2 0v11.5l-2.9-2.1l-2.9 2.1l-2.9-2.1l-2.9 2.1l-2.9-2.1ZM8.8 7.8a1.6 1.6 0 1 0 0 3.1a1.6 1.6 0 0 0 0-3.1Zm6.2 0a1.6 1.6 0 1 0 0 3.1a1.6 1.6 0 0 0 0-3.1Z\"/>","gift":"<path d=\"M3.1 8.6h17.7v3.3H3.1ZM4.4 12.9h6.6v8.2H5.4a1 1 0 0 1-1-1ZM13 12.9h6.6v7.2a1 1 0 0 1-1 1H13Z\"/><path class=\"ln\" d=\"M12 8.6c-1.5-3.1-5.1-4.1-5.1-1.5S12 8.6 12 8.6s5.1-1 5.1-3.6s-3.6-1.5-5.1 3.6\"/>","globe":"<path d=\"M2.6 11.1A9.5 9.5 0 0 1 12 2.6a4.5 9.5 0 0 0-4.5 8.5ZM21.4 11.1A9.5 9.5 0 0 0 12 2.6a4.5 9.5 0 0 1 4.5 8.5ZM2.6 12.9A9.5 9.5 0 0 0 12 21.5a4.5 9.5 0 0 1-4.5-8.5ZM21.4 12.9A9.5 9.5 0 0 1 12 21.5a4.5 9.5 0 0 0 4.5-8.5ZM12 2.6a2.7 9.5 0 0 0-2.7 8.5h5.3A2.7 9.5 0 0 0 12 2.6ZM12 21.5a2.7 9.5 0 0 1-2.7-8.5h5.3A2.7 9.5 0 0 1 12 21.5Z\"/>","grid":"<rect x=\"2.7\" y=\"2.7\" width=\"8\" height=\"8\" rx=\"2.2\"/><rect x=\"13.3\" y=\"2.7\" width=\"8\" height=\"8\" rx=\"2.2\"/><rect x=\"2.7\" y=\"13.3\" width=\"8\" height=\"8\" rx=\"2.2\"/><rect x=\"13.3\" y=\"13.3\" width=\"8\" height=\"8\" rx=\"2.2\"/>","group":"<rect x=\"6.9\" y=\"6.8\" width=\"6.4\" height=\"4.8\" rx=\"1.1\"/><rect x=\"10.8\" y=\"12.5\" width=\"6.4\" height=\"4.6\" rx=\"1.1\"/><path class=\"ln\" d=\"M4 7.6V4h3.6M16.5 4h3.6v3.6M20 16.4v3.6h-3.6M7.6 20H4v-3.6\"/>","hammer":"<path d=\"M13.1 2.5l7.5 7.5l-3.7 3.7l-7.5-7.5ZM12.9 8.9L3.7 18.1a2.1 2.1 0 0 0 2.9 2.9l9.2-9.2Z\"/>","hand":"<path d=\"M9 14.3V4.9a1.4 1.4 0 0 1 2.8 0v5.2a0.5 0.5 0 0 0 1.1 0V3.8a1.4 1.4 0 0 1 2.8 0v6.4a0.5 0.5 0 0 0 1.1 0V5.7a1.4 1.4 0 0 1 2.8 0v7.7c0 4.5-2.8 7.7-7.3 7.7c-2.9 0-4.7-1.5-6.3-4l-1.8-2.9a1.7 1.7 0 0 1 2.8-2Z\"/>","headphones":"<path class=\"ln\" d=\"M4 14.5V12a8 8 0 0 1 16 0v2.5\"/><rect x=\"2.6\" y=\"13.4\" width=\"5.4\" height=\"7.6\" rx=\"1.8\"/><rect x=\"16\" y=\"13.4\" width=\"5.4\" height=\"7.6\" rx=\"1.8\"/>","heart":"<path d=\"M12 21.6s-9.3-5.7-9.3-13a5.3 5.3 0 0 1 9.3-3.6a5.3 5.3 0 0 1 9.3 3.6c0 7.4-9.3 13-9.3 13Z\"/>","heart-broken":"<path fill-rule=\"evenodd\" d=\"M12 21.6s-9.3-5.7-9.3-13a5.3 5.3 0 0 1 9.3-3.6a5.3 5.3 0 0 1 9.3 3.6c0 7.4-9.3 13-9.3 13ZM10.9 5.9l2.7 0.6l-1.4 2.7l3.6 2.5l-2.6 5.9l-2.5-1.1l1.5-3.7l-3.7-2.5Z\"/>","help":"<path fill-rule=\"evenodd\" d=\"M13 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM9.3 9.4A3.7 3.7 0 1 1 13.9 12.8v1.6h-2.1V10.9h1a1.6 1.6 0 1 0-1.6-1.6ZM13 15.8a1.3 1.3 0 1 1 0 2.6a1.3 1.3 0 0 1 0-2.6Z\"/>","history":"<path d=\"M5.8 5.8A9.1 9.1 0 1 1 3.2 12.2h3a6.1 6.1 0 1 0 1.8-4.3ZM2.5 2.7v7.2h7.2ZM11.2 8.1h2.2v3.7l2.7 1.6l-1.1 1.8l-3.8-2.3Z\"/>","home":"<path d=\"M2.7 10.4L12 2.3l9.3 8.1v9.5a1.1 1.1 0 0 1-1.1 1.1h-5.6v-6.9h-5.4v6.9H3.8a1.1 1.1 0 0 1-1.1-1.1Z\"/>","hot-tub":"<circle cx=\"8.2\" cy=\"5.4\" r=\"2.4\"/><path d=\"M2.6 10.9h18.8v4.2a5.1 5.1 0 0 1-5.1 5.1h-8.5a5.1 5.1 0 0 1-5.1-5.1Z\"/><path class=\"ln\" d=\"M6.3 10.9v-0.6A2.4 2.4 0 0 1 8.7 8H9.2M13.5 9.4c0.8-0.9-0.8-1.9 0-2.8M17.3 9.4c0.8-0.9-0.8-1.9 0-2.8\"/>","id":"<path fill-rule=\"evenodd\" d=\"M4.8 4.6h14.4a2.3 2.3 0 0 1 2.3 2.3v10.3a2.3 2.3 0 0 1-2.3 2.3H4.8A2.3 2.3 0 0 1 2.5 17.2V6.9A2.3 2.3 0 0 1 4.8 4.6Zm4.1 4.2a2.2 2.2 0 1 0 0 4.3a2.2 2.2 0 0 0 0-4.3Zm-3.2 7.7h6.4c-0.6-1.7-1.8-2.7-3.2-2.7s-2.6 0.9-3.2 2.7Zm8.8-7.2v1.5h4V9.4Zm0 3.6v1.5h4v-1.5Z\"/>","idea":"<path d=\"M8.3 14.9A6.5 6.5 0 1 1 15.7 14.9c-0.7 0.6-1.3 1.3-1.4 2.2H9.7c-0.1-0.9-0.7-1.6-1.4-2.2Z\"/><path class=\"ln\" d=\"M9.6 20.5h4.8\"/>","image":"<path fill-rule=\"evenodd\" d=\"M2.8 6.1a2.7 2.7 0 0 1 2.7-2.7h13.3A2.7 2.7 0 0 1 21.5 6.1v12.3a2.7 2.7 0 0 1-2.7 2.7H5.4A2.7 2.7 0 0 1 2.8 18.4Zm6.2 2.2a2 2 0 1 0 0 3.9a2 2 0 0 0 0-3.9Zm7.5 3.5l-8.3 7.8h10.7a1.5 1.5 0 0 0 1.5-1.5v-3.1Z\"/>","inbox":"<path fill-rule=\"evenodd\" d=\"M2.7 12.4L5.2 3.7h13.6l2.5 8.8V17.9a1.6 1.6 0 0 1-1.6 1.6H4.2A1.6 1.6 0 0 1 2.7 17.9ZM6.4 5.6L4.6 11.5h3.8l1.5 2.4h4.3l1.5-2.4h3.8L17.6 5.6Z\"/>","info":"<path fill-rule=\"evenodd\" d=\"M12.9 2.6a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM11.7 10.5h2.5V16.9h-2.5ZM12.9 6.4a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3Z\"/>","invite":"<circle cx=\"8.8\" cy=\"7.7\" r=\"3.2\"/><path d=\"M2.9 19.2c0-3.4 2.7-5.8 5.8-5.8s5.8 2.4 5.8 5.8Z\"/><path class=\"ln\" d=\"M17.6 7.8v5.3M15 10.5h5.3\"/>","key":"<path fill-rule=\"evenodd\" d=\"M8.3 10.1a5.4 5.4 0 1 1 0 10.9a5.4 5.4 0 0 1 0-10.9Zm0 3.6a1.9 1.9 0 1 0 0 3.8a1.9 1.9 0 0 0 0-3.8Z\"/><path class=\"ln\" d=\"M11.7 12.2l8.7-8.7M16.7 7.2l3.1 3.1M14.4 9.5l2.1 2.1\"/>","keyboard":"<path fill-rule=\"evenodd\" d=\"M4.8 5.7h14.4A2.3 2.3 0 0 1 21.5 8v8a2.3 2.3 0 0 1-2.3 2.3H4.8A2.3 2.3 0 0 1 2.5 16V8a2.3 2.3 0 0 1 2.3-2.3ZM5.3 9.1h1.9v1.9H5.3ZM8.2 9.1h1.9v1.9H8.2ZM11 9.1h1.9v1.9h-1.9ZM13.9 9.1h1.9v1.9h-1.9ZM16.8 9.1h1.9v1.9h-1.9ZM7.8 13.3h8.4v1.7H7.8Z\"/>","laugh":"<path fill-rule=\"evenodd\" d=\"M13 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM7.9 8.1l3.5 1.7l-3.5 1.7l-0.7-1.4l0.7-0.4l-0.7-0.4ZM18 8.1l-3.5 1.7l3.5 1.7l0.7-1.4l-0.7-0.4l0.7-0.4ZM8.5 13.5h8.9a4.4 4.4 0 0 1-8.9 0Z\"/>","layers":"<path d=\"M12 4.3l8.6 5l-8.6 5l-8.6-5Z\"/><path class=\"ln\" d=\"M3.9 13.9l8.1 4.5l8.1-4.5\"/>","leaf":"<path fill-rule=\"evenodd\" d=\"M5.4 18.6c0-8.9 5.2-14.2 15.7-15.7c-1 10.4-6.3 15.7-15.7 15.7Zm3.1-2L16.8 7.1l-9.5 8.5Z\"/><path class=\"ln\" d=\"M3.7 20.3L6 18\"/>","lifebuoy":"<path fill-rule=\"evenodd\" d=\"M13.1 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7Zm0 5.3a4.1 4.1 0 1 1 0 8.2a4.1 4.1 0 0 1 0-8.2ZM15.5 16.2L18.4 19.1L20.2 17.3L17.2 14.3ZM10.8 16.2L7.9 19.1L6 17.3L9 14.3ZM15.5 7.8L18.4 4.9L20.2 6.7L17.2 9.7ZM10.8 7.8L7.9 4.9L6 6.7L9 9.7Z\"/>","live":"<circle cx=\"12\" cy=\"12\" r=\"2.5\"/><path class=\"ln\" d=\"M8.5 8.5a4.9 4.9 0 0 0 0 6.9M15.5 8.5a4.9 4.9 0 0 1 0 6.9M6.2 6.2a8.2 8.2 0 0 0 0 11.5M17.8 6.2a8.2 8.2 0 0 1 0 11.5\"/>","lock":"<path d=\"M4.6 11.1a1.6 1.6 0 0 1 1.6-1.6h11.5a1.6 1.6 0 0 1 1.6 1.6v8.4a1.6 1.6 0 0 1-1.6 1.6H6.2A1.6 1.6 0 0 1 4.6 19.6Z\"/><path class=\"ln\" d=\"M7.9 9.4V6.8a4.1 4.1 0 0 1 8 0V9.4\"/>","mail":"<path d=\"M2.5 7.3v-0.4A2.3 2.3 0 0 1 4.8 4.6h14.4A2.3 2.3 0 0 1 21.5 6.9v0.4l-8.7 5.6a1.6 1.6 0 0 1-1.7 0ZM2.5 9.4v7.6A2.3 2.3 0 0 0 4.8 19.4h14.4a2.3 2.3 0 0 0 2.3-2.3V9.4l-8 5.2a2.7 2.7 0 0 1-3 0Z\"/>","map":"<path d=\"M2.6 6.1 8.3 4.2v14l-5.7 1.9ZM9.7 4.2l4.6 1.6v14l-4.6-1.6ZM15.7 5.8l5.7-1.9v14l-5.7 1.9Z\"/>","mask":"<path fill-rule=\"evenodd\" d=\"M2.7 6.1c3.3 1.4 6.4 2.1 9.4 2.1s6.1-0.6 9.4-2.1c0 7.1-2.9 11.7-5.8 11.7c-1.5 0-2.2-1.5-3.6-1.5s-2.1 1.5-3.6 1.5c-2.9 0-5.8-4.6-5.8-11.7ZM6.8 11.6a1.6 1.1 0 1 0 3.3 0a1.6 1.1 0 1 0-3.3 0ZM14 11.6a1.6 1.1 0 1 0 3.3 0a1.6 1.1 0 1 0-3.3 0Z\"/>","medical":"<path fill-rule=\"evenodd\" d=\"M5.3 6.3h13.5a2.7 2.7 0 0 1 2.7 2.7v8.7a2.7 2.7 0 0 1-2.7 2.7H5.3a2.7 2.7 0 0 1-2.7-2.7V9a2.7 2.7 0 0 1 2.7-2.7ZM10.9 10h2.3v2.2h2.2v2.3h-2.2V16.7h-2.3v-2.2H8.7v-2.3h2.2Z\"/><path class=\"ln\" d=\"M9.2 6.3V5.3a0.9 0.9 0 0 1 0.9-0.9h3.8a0.9 0.9 0 0 1 0.9 0.9v1\"/>","megaphone":"<path d=\"M2.7 9.1a1.1 1.1 0 0 1 1.1-1.1h2.7l9.7-4.8v16.1l-9.7-4.8H3.8A1.1 1.1 0 0 1 2.7 13.2Z\"/><path class=\"ln\" d=\"M6.6 14.5l1.2 5M18.8 8.5a3.4 3.4 0 0 1 0 5.4\"/>","members":"<circle cx=\"9.1\" cy=\"7.1\" r=\"3.5\"/><path d=\"M2.6 19.6c0-3.7 2.9-6.3 6.4-6.3s6.4 2.6 6.4 6.3Z\"/><circle cx=\"16.5\" cy=\"6.6\" r=\"2.8\"/><path d=\"M16.7 12.4c2.8 0.4 4.7 2.7 4.7 6.2V19.6h-4.3c0-2.8-1-5.1-2.7-6.5Z\"/>","mic":"<path d=\"M8.9 5.8a3.1 3.1 0 0 1 6.2 0V10.8a3.1 3.1 0 0 1-6.2 0Z\"/><path class=\"ln\" d=\"M5.9 10.8a6.1 6.1 0 0 0 12.3 0M12 16.9V20.2\"/>","mic-off":"<path d=\"M9 5.4A3.1 3.1 0 0 1 15.2 5.8V10.7a3.1 3.1 0 0 1-0.1 0.8Z\"/><path class=\"ln\" d=\"M5.4 10.7a6.6 6.6 0 0 0 11 5M18.7 10.7c0 0.8-0.1 1.5-0.4 2.2M12.1 17.3v2.8M4.5 4.1l15.1 15.1\"/>","minus-circle":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM7.9 10.9v2.5h10.2v-2.5Z\"/>","money":"<path fill-rule=\"evenodd\" d=\"M4.8 5.7h14.4a2.1 2.1 0 0 1 2.1 2.1v8.4a2.1 2.1 0 0 1-2.1 2.1H4.8a2.1 2.1 0 0 1-2.1-2.1V7.8a2.1 2.1 0 0 1 2.1-2.1ZM12 8.9a3.1 3.1 0 1 0 0 6.3a3.1 3.1 0 0 0 0-6.3ZM6.3 8.7a1 1 0 1 0 0 2.1a1 1 0 0 0 0-2.1Zm11.4 4.6a1 1 0 1 0 0 2.1a1 1 0 0 0 0-2.1Z\"/><circle cx=\"12\" cy=\"12\" r=\"1.4\"/>","moon":"<path d=\"M21.7 14.6A9.7 9.7 0 1 1 9.4 2.3a8 8 0 0 0 12.3 12.3Z\"/>","more":"<circle cx=\"4.8\" cy=\"12\" r=\"2.2\"/><circle cx=\"12\" cy=\"12\" r=\"2.2\"/><circle cx=\"19.2\" cy=\"12\" r=\"2.2\"/>","mountain":"<path d=\"M2.8 18.1L9.2 5.3l4.1 7.1L16.1 8.9L21.5 18.1Z\"/>","mug":"<path d=\"M3.8 8.9h12.2v7.6a4.6 4.6 0 0 1-4.6 4.6h-3a4.6 4.6 0 0 1-4.6-4.6Z\"/><path class=\"ln\" d=\"M16 11H16.9a2.5 2.5 0 0 1 0 5h-0.9M7.9 3.7c-0.8 1 0.8 2 0 3M11.4 3.7c-0.8 1 0.8 2 0 3\"/>","music":"<path d=\"M7.6 5.4l13.3-2.5v3.5l-13.3 2.5Z\"/><path class=\"ln\" d=\"M8.8 17.9V6.5M19.7 15.6V4.2\"/><circle cx=\"5.5\" cy=\"17.9\" r=\"3.2\"/><circle cx=\"16.7\" cy=\"15.6\" r=\"3.2\"/>","mute":"<path d=\"M2.9 8.8h4l5.5-4.2v14.8l-5.5-4.2H2.9Z\"/><path class=\"ln\" d=\"M15.5 9.6l4.7 4.7M20.3 9.6l-4.7 4.7\"/>","news":"<path fill-rule=\"evenodd\" d=\"M2.8 2.6h14.2v15.2a2.2 2.2 0 0 0 2.2 2.2H5.1A2.2 2.2 0 0 1 2.8 18.9ZM6.6 6.6h6.8v1.7H6.6Zm0 3.7h6.8v1.7H6.6Zm0 3.7h4v1.7H6.6Z\"/><path class=\"ln\" d=\"M17.1 7.7H19.8V17.9a2.1 2.1 0 0 1-2.1 2.1\"/>","nodes":"<circle cx=\"12\" cy=\"5.2\" r=\"3\"/><circle cx=\"5.6\" cy=\"18\" r=\"3\"/><circle cx=\"18.4\" cy=\"18\" r=\"3\"/><path class=\"ln\" d=\"M10.9 7.6L6.8 15.5M13.1 7.6l4.1 7.9M8.4 18h7.1\"/>","palette":"<path fill-rule=\"evenodd\" d=\"M12.1 2.7a9.4 9.4 0 1 0 0 18.8c1.3 0 2-0.9 2-1.9c0-1.2-1-1.5-1-2.5s0.8-1.6 2-1.6H17.3a4.4 4.4 0 0 0 4.4-4.4C21.7 6.7 17.4 2.7 12.1 2.7ZM7.8 9.7a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3Zm2.5-3.7a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3Zm4.6 0a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3Z\"/>","parking":"<path fill-rule=\"evenodd\" d=\"M6.2 2.6h11.6a3.6 3.6 0 0 1 3.6 3.6v11.6a3.6 3.6 0 0 1-3.6 3.6H6.2a3.6 3.6 0 0 1-3.6-3.6V6.2a3.6 3.6 0 0 1 3.6-3.6ZM8.4 18V6H13a4 4 0 0 1 0 8h-2.4v4ZM10.6 8.2v3.6H13a1.8 1.8 0 0 0 0-3.6Z\"/>","pause":"<rect x=\"4.8\" y=\"2.6\" width=\"5.1\" height=\"18.8\" rx=\"1.5\"/><rect x=\"14.2\" y=\"2.6\" width=\"5.1\" height=\"18.8\" rx=\"1.5\"/>","paw":"<path d=\"M6.9 18.5c0-3.5 2.2-6.3 5.1-6.3s5.1 2.8 5.1 6.3c0 1.8-1.3 2.9-2.9 2.9c-0.9 0-1.5-0.6-2.2-0.6s-1.3 0.6-2.2 0.6c-1.6 0-2.9-1.1-2.9-2.9Z\"/><circle cx=\"5.1\" cy=\"10.2\" r=\"2.6\"/><circle cx=\"9.1\" cy=\"5.1\" r=\"2.6\"/><circle cx=\"14.9\" cy=\"5.1\" r=\"2.6\"/><circle cx=\"18.9\" cy=\"10.2\" r=\"2.6\"/>","pencil":"<path d=\"M15.6 3.1a2.2 2.2 0 0 1 3.2 3.2L6.9 18.1l-4.5 1.2l1.2-4.5Z\"/><path class=\"ln\" d=\"M11.8 19.7H20.1\"/>","phone":"<path d=\"M5.1 2.4h4.9l2.4 6l-2.7 1.6a10.7 10.7 0 0 0 4.2 4.2l1.6-2.7l6 2.4v4.9a2.3 2.3 0 0 1-2.3 2.3A17.3 17.3 0 0 1 2.8 4.6a2.3 2.3 0 0 1 2.3-2.3Z\"/>","piggy":"<path fill-rule=\"evenodd\" d=\"M2.6 11.4c0-3.6 3.7-6.5 8.7-6.5c1.4 0 2.7 0.2 3.9 0.7L18.3 3.8v3.7c0.9 0.8 1.5 1.7 1.7 2.8h1.5v3.8H20c-0.5 1.1-1.4 2-2.6 2.6V20.1h-3.3v-2.2c-0.9 0.2-1.8 0.3-2.8 0.3c-0.9 0-1.7-0.1-2.6-0.3v2.2h-3.3v-3.3C3.7 15.5 2.6 13.6 2.6 11.4ZM14.5 9.8a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0ZM8.3 6.8v1.5h3.7V6.8Z\"/>","pin":"<path fill-rule=\"evenodd\" d=\"M12 2.8a7.1 7.1 0 0 0-7.1 7.1c0 5.5 7.1 11.8 7.1 11.8s7.1-6.3 7.1-11.8A7.1 7.1 0 0 0 12 2.8Zm0 4.5a2.5 2.5 0 1 1 0 5.1a2.5 2.5 0 0 1 0-5.1Z\"/>","plane":"<path d=\"M21.2 2.9L2.4 10.7l6.9 3.2ZM21.2 2.9l-11 12l3.2 6.9Z\"/>","play":"<path d=\"M5.1 3.5v17a0.9 0.9 0 0 0 1.3 0.8l12.8-8.5a0.9 0.9 0 0 0 0-1.6L6.5 2.7a0.9 0.9 0 0 0-1.3 0.8Z\"/>","plug":"<path d=\"M6.5 8h10.9v3.3a5.4 5.4 0 0 1-10.9 0Z\"/><path class=\"ln\" d=\"M9.2 4.2v3.8M14.6 4.2v3.8M11.9 16.8v3.5\"/>","plus-circle":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7Zm-1.2 4.2h2.5v3.8H18v2.5h-3.8V17.1h-2.5v-3.8H7.9v-2.5h3.8Z\"/>","print":"<path d=\"M6.2 2.6h11.5v4.4H6.2ZM2.6 11a2.7 2.7 0 0 1 2.7-2.7h13.4a2.7 2.7 0 0 1 2.7 2.7v4.1a2.7 2.7 0 0 1-2.7 2.7h-0.3v-4.5H5.6v4.5h-0.3A2.7 2.7 0 0 1 2.6 15.1ZM7.1 14.7h9.9v6.7H7.1Z\"/>","puzzle":"<path d=\"M2.8 5.4h5a2.9 2.9 0 1 1 5.8 0h5v5a2.9 2.9 0 1 1 0 5.8v5h-5a2.9 2.9 0 1 0-5.8 0H2.8v-5a2.9 2.9 0 1 0 0-5.8Z\"/>","radio":"<path fill-rule=\"evenodd\" d=\"M5.2 7.8h13.6a2.5 2.5 0 0 1 2.5 2.5v7.8a2.5 2.5 0 0 1-2.5 2.5H5.2A2.5 2.5 0 0 1 2.6 18.1v-7.8A2.5 2.5 0 0 1 5.2 7.8ZM12.9 14.2a2.5 2.5 0 1 0 5.1 0a2.5 2.5 0 1 0-5.1 0ZM6.1 11.6v2h4.7v-2ZM6.1 15v2h4.7v-2Z\"/><path class=\"ln\" d=\"M7.1 7.8L16.9 4\"/>","ranking":"<path d=\"M3.5 13.7h4.9V9.9h7.1v5.7h4.9v5.4H3.5ZM12 2.2l1 2l2.2 0.3l-1.6 1.6l0.4 2.2L12 7.5l-2 1l0.4-2.2l-1.6-1.6l2.2-0.3Z\"/>","record":"<path fill-rule=\"evenodd\" d=\"M13.2 2.7a9.3 9.3 0 1 0 0 18.5a9.3 9.3 0 0 0 0-18.5Zm0 3.3a6 6 0 1 1 0 11.9a6 6 0 0 1 0-11.9Z\"/><circle cx=\"13.2\" cy=\"12\" r=\"3.7\"/>","restroom":"<circle cx=\"7.2\" cy=\"5.1\" r=\"1.8\"/><circle cx=\"16.2\" cy=\"5.1\" r=\"1.8\"/><path d=\"M6 9h1.8a1.5 1.5 0 0 1 1.5 1.5v4.7H8.6v5H5.5v-5H4.7v-4.7A1.5 1.5 0 0 1 6 9Z\"/><path d=\"M15.7 9.4h1.1a0.9 0.9 0 0 1 0.9 0.7l1.9 6.3H17.4v3.6h-2.3v-3.6h-2.1l1.9-6.3a0.9 0.9 0 0 1 0.9-0.7Z\"/><path class=\"ln\" d=\"M11.6 3.7v16.3\"/>","retry":"<path class=\"ln\" d=\"M4 12a8 8 0 0 1 13.4-5.9M20 12a8 8 0 0 1-13.4 5.9\"/><path d=\"M21.3 2.8v7h-7ZM2.7 21.2v-7h7Z\"/>","rewind":"<path d=\"M21 5.5v13.1L12 12ZM11.3 5.5v13.1L2.2 12Z\"/>","robot":"<path fill-rule=\"evenodd\" d=\"M8.5 8.7h6.9a3.1 3.1 0 0 1 3.1 3.1v4.3A3.1 3.1 0 0 1 15.5 19.3H8.5A3.1 3.1 0 0 1 5.4 16.2v-4.3A3.1 3.1 0 0 1 8.5 8.7Zm0.9 3.8a1.2 1.2 0 1 0 0 2.4a1.2 1.2 0 0 0 0-2.4Zm5.2 0a1.2 1.2 0 1 0 0 2.4a1.2 1.2 0 0 0 0-2.4ZM9.7 16v1.3h4.5v-1.3Z\"/><path class=\"ln\" d=\"M12 5.3v3.5M3.9 13.1v2.8M20.2 13.1v2.8\"/>","rocket":"<path fill-rule=\"evenodd\" d=\"M11.9 16.6L7.4 12.2C9.1 6.1 13.6 2.9 21.1 2.9c0 7.5-3.2 12-9.2 13.7ZM13.6 8.7a1.7 1.7 0 1 0 3.5 0a1.7 1.7 0 1 0-3.5 0Z\"/><path d=\"M3.7 12.2L6.8 7.5h3.5L6.6 12.6ZM11.4 17.4L11.9 20.3l4.6-3.3v-3.5ZM6.3 17.7c-2 0-3.9 2-3.9 3.9c2 0 3.9-2 3.9-3.9Z\"/>","save":"<path fill-rule=\"evenodd\" d=\"M4.4 2.7h12.4l3.5 3.5V20.8a0.7 0.7 0 0 1-0.7 0.7H4.4a0.7 0.7 0 0 1-0.7-0.7V3.4a0.7 0.7 0 0 1 0.7-0.7Zm3.4 1.4v4.9h7.4V4.1ZM7.2 13.6v6.4h9.6v-6.4Z\"/>","scissors":"<path fill-rule=\"evenodd\" d=\"M6.2 3.8a3.2 3.2 0 1 1 0 6.5a3.2 3.2 0 0 1 0-6.5Zm0 2a1.2 1.2 0 1 0 0 2.4a1.2 1.2 0 0 0 0-2.4ZM6.2 13.7a3.2 3.2 0 1 1 0 6.5a3.2 3.2 0 0 1 0-6.5Zm0 2a1.2 1.2 0 1 0 0 2.4a1.2 1.2 0 0 0 0-2.4Z\"/><path class=\"ln\" d=\"M8.7 8.8L20.4 18.1M8.7 15.2L20.4 5.9\"/>","search":"<path fill-rule=\"evenodd\" d=\"M10.6 3a7.7 7.7 0 1 1 0 15.4a7.7 7.7 0 0 1 0-15.4Zm0 3.2a4.5 4.5 0 1 0 0 9.2a4.5 4.5 0 0 0 0-9.2Z\"/><path class=\"ln\" d=\"M16.3 16.4l3.8 3.8\"/>","seedling":"<path d=\"M12.4 10.8C12.4 6.1 9.5 2.9 4 2.9c0 4.9 3 7.8 8.4 7.8ZM11.6 13.4c0-4.7 3-7.8 8.4-7.8c0 4.9-3 7.8-8.4 7.8Z\"/><path class=\"ln\" d=\"M12 20.4V12.5\"/>","server":"<path fill-rule=\"evenodd\" d=\"M5.2 2.6h13.4a2.7 2.7 0 0 1 2.7 2.7v3.4a2.7 2.7 0 0 1-2.7 2.7H5.2A2.7 2.7 0 0 1 2.5 8.6V5.3A2.7 2.7 0 0 1 5.2 2.6Zm2.2 2.9a1.5 1.5 0 1 0 0 2.9a1.5 1.5 0 0 0 0-2.9ZM5.2 12.7h13.4a2.7 2.7 0 0 1 2.7 2.7v3.4a2.7 2.7 0 0 1-2.7 2.7H5.2A2.7 2.7 0 0 1 2.5 18.7v-3.4A2.7 2.7 0 0 1 5.2 12.7Zm2.2 2.9a1.5 1.5 0 1 0 0 2.9a1.5 1.5 0 0 0 0-2.9Z\"/>","shapes":"<circle cx=\"7.3\" cy=\"7.6\" r=\"4.3\"/><path d=\"M16.5 2.7l5 8.6h-9.8ZM13.4 13.7h7.4v7.4h-7.4ZM2.5 21.1L6.8 13.7l4.3 7.4Z\"/>","shelter":"<path fill-rule=\"evenodd\" d=\"M12 2.7L2.5 10.2l1.1 1.5l1-0.8v10h14.8V10.9l1 0.8l1.1-1.5ZM9.5 20.9v-4.8a2.5 2.5 0 0 1 4.9 0v4.8ZM12 9.1a1.7 1.7 0 1 1 0 3.4a1.7 1.7 0 0 1 0-3.4Z\"/>","shield":"<path d=\"M12 2.6 4.6 5.8V12c0 4.6 3.1 8 7.4 9.5 4.3-1.5 7.4-4.9 7.4-9.5V5.8Z\"/>","shirt":"<path d=\"M8 2.7L2.5 5.9l2.5 4.9l1.5-0.8v11.2h11V10.1l1.5 0.8L21.5 5.9l-5.5-3.2c-0.6 1.5-1.9 2.5-4 2.5S8.6 4.2 8 2.7Z\"/>","skip":"<path d=\"M3.3 2.6v18.9L15.8 12Z\"/><rect x=\"17.8\" y=\"2.7\" width=\"3.2\" height=\"18.7\" rx=\"1.5\"/>","skull":"<path fill-rule=\"evenodd\" d=\"M12 2.6a7.9 7.9 0 0 0-7.9 7.9c0 2.4 1.1 4.2 2.5 5.4V19.5a2 2 0 0 0 2 2h6.8a2 2 0 0 0 2-2v-3.6c1.4-1.2 2.5-3 2.5-5.4A7.9 7.9 0 0 0 12 2.6ZM9.2 9.4a1.7 1.7 0 1 1 0 3.4a1.7 1.7 0 0 1 0-3.4ZM14.8 9.4a1.7 1.7 0 1 1 0 3.4a1.7 1.7 0 0 1 0-3.4ZM12 13.3l1 1.8h-2ZM10.1 18.1h0.9v2.4h-0.9ZM13 18.1h0.9v2.4H13Z\"/>","sliders":"<path class=\"ln\" d=\"M4 7h8.8M19.2 7H20M4 17h2.8M13.2 17H20\"/><circle cx=\"16\" cy=\"7\" r=\"3.2\"/><circle cx=\"10\" cy=\"17\" r=\"3.2\"/>","smile":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM9.9 8.6a1.4 1.4 0 1 1 0 2.8a1.4 1.4 0 0 1 0-2.8ZM16 8.6a1.4 1.4 0 1 1 0 2.8a1.4 1.4 0 0 1 0-2.8ZM8.8 13.5h8.3a4.1 4.1 0 0 1-8.3 0Z\"/>","spark":"<path d=\"M10.7 2.6l2 5.6l5.6 2l-5.6 2L10.7 17.8l-2-5.6l-5.6-2l5.6-2ZM17.6 14.7l0.9 2.5l2.5 0.9l-2.5 0.9l-0.9 2.5l-0.9-2.5l-2.5-0.9l2.5-0.9Z\"/>","square":"<rect x=\"2.7\" y=\"2.7\" width=\"18.7\" height=\"18.7\" rx=\"3.3\"/>","star":"<path d=\"M12 2.8l2.9 6l6.6 0.8l-4.9 4.5l1.3 6.6L12 17.4l-5.9 3.2l1.3-6.6l-4.9-4.5l6.6-0.8Z\"/>","steps":"<path fill-rule=\"evenodd\" d=\"M2.8 4h4.9v4.9H2.8Zm1 2.5l0.8-0.9l0.9 0.9l1.4-1.4l0.9 0.9l-2.3 2.3ZM2.8 9.4h4.9v4.9H2.8Zm1 2.5l0.8-0.9l0.9 0.9l1.4-1.4l0.9 0.9l-2.3 2.3ZM2.8 15h4.9v4.9H2.8Zm1 2.5l0.8-0.9l0.9 0.9l1.4-1.4l0.9 0.9l-2.3 2.3Z\"/><path class=\"ln\" d=\"M10.6 6.4H20.3M10.6 11.9H20.3M10.6 17.4H20.3\"/>","store":"<path d=\"M4.4 3h15l2 6.2v1.4a3.2 3.2 0 0 1-6.3 0a3.2 3.2 0 0 1-6.3 0a3.2 3.2 0 0 1-6.3 0V9.2ZM4 14.9h15.9v5.6a1.1 1.1 0 0 1-1.1 1.1H14.1v-5.1h-4.4v5.1H5.1a1.1 1.1 0 0 1-1.1-1.1Z\"/>","sun":"<circle cx=\"12\" cy=\"12\" r=\"3.8\"/><path class=\"ln\" d=\"M12 3.9v1.3M12 18.7v1.3M6.3 6.2l0.9 0.9M16.8 16.8L17.8 17.8M4 12h1.3M18.7 12h1.3M6.3 17.8l0.9-0.9M16.8 7.2L17.8 6.2\"/>","sword":"<path d=\"M21.2 2.8v4.7l-10.8 10.8l-4.7-4.7L16.5 2.8Z\"/><path class=\"ln\" d=\"M5.2 11.9L12.1 18.8M8.4 15.6L3.7 20.3\"/>","table":"<path d=\"M2.7 6.2a2.5 2.5 0 0 1 2.5-2.5h13.6a2.5 2.5 0 0 1 2.5 2.5v2.3H2.7ZM2.7 10.5h5.3v9.9H5.2a2.5 2.5 0 0 1-2.5-2.5ZM9.8 10.5h4.5v9.9H9.8ZM16.1 10.5h5.3V17.9a2.5 2.5 0 0 1-2.5 2.5h-2.7Z\"/>","tack":"<path d=\"M8.5 3h7.2a0.8 0.8 0 0 1 0.8 1l-0.8 4l2.8 2.8a0.7 0.7 0 0 1-0.6 1.4H6.1a0.7 0.7 0 0 1-0.6-1.4l2.8-2.8l-0.8-4a0.8 0.8 0 0 1 0.8-1Z\"/><path class=\"ln\" d=\"M12 12.2V20.5\"/>","tag":"<path fill-rule=\"evenodd\" d=\"M2.9 3.4A1.5 1.5 0 0 1 4.4 2.9h7.2l10 10l-8.7 8.7L2.9 10.6Zm5 2.5a1.9 1.9 0 1 0 0 3.7a1.9 1.9 0 0 0 0-3.7Z\"/>","target":"<path fill-rule=\"evenodd\" d=\"M12 2.6a9.4 9.4 0 1 1 0 18.8a9.4 9.4 0 0 1 0-18.8Zm0 3a6.4 6.4 0 1 0 0 12.9a6.4 6.4 0 0 0 0-12.9Zm0 2.7a3.7 3.7 0 1 1 0 7.4a3.7 3.7 0 0 1 0-7.4Z\"/>","tent":"<path fill-rule=\"evenodd\" d=\"M12 4.2L19.3 17.4H4.7ZM12 11.6L9.5 17.4h5.1Z\"/><path class=\"ln\" d=\"M3.9 17.7h16.2\"/>","terminal":"<path fill-rule=\"evenodd\" d=\"M5 3.6h14a2.4 2.4 0 0 1 2.4 2.4v12a2.4 2.4 0 0 1-2.4 2.4H5A2.4 2.4 0 0 1 2.6 18V6A2.4 2.4 0 0 1 5 3.6Zm1.4 6 1.3-1.3 3.6 3.7-3.6 3.7-1.3-1.3 2.4-2.4Zm6.4 4.6h4.4v1.7h-4.4Z\"/>","text":"<path fill-rule=\"evenodd\" d=\"M10.2 2.4h3.7l6.8 18.7h-3.4l-1.6-4.7H8.3l-1.6 4.7H3.3ZM9.3 13.6h5.4L12 5.7Z\"/>","thumbs-up":"<path d=\"M6.5 10.1v10.3H3.6a1.1 1.1 0 0 1-1.1-1.1v-8a1.1 1.1 0 0 1 1.1-1.1ZM7.9 10.1l3.6-7.3a2.4 2.4 0 0 1 2.7 2.8l-0.6 3.5h5.6a2.2 2.2 0 0 1 2.2 2.6l-1.4 7a2.2 2.2 0 0 1-2.2 1.7H7.9Z\"/>","ticket":"<path fill-rule=\"evenodd\" d=\"M2.6 6.4h18.8v3.4a2.2 2.2 0 0 0 0 4.4v3.4H2.6v-3.4a2.2 2.2 0 0 0 0-4.4ZM13.3 8.4v1.8h1.4V8.4Zm0 2.7v1.8h1.4v-1.8Zm0 2.7v1.8h1.4v-1.8Z\"/>","toolbox":"<path d=\"M2.7 10.1a2.5 2.5 0 0 1 2.5-2.5h13.6a2.5 2.5 0 0 1 2.5 2.5v2.2H2.7ZM2.7 13.7h4.7v1.5h1.6v-1.5h6.2v1.5h1.6v-1.5h4.7V17.8a2.5 2.5 0 0 1-2.5 2.5H5.2A2.5 2.5 0 0 1 2.7 17.8Z\"/><path class=\"ln\" d=\"M9.1 7.5V5.7A1.5 1.5 0 0 1 10.5 4.2h2.9A1.5 1.5 0 0 1 14.9 5.7v1.9\"/>","train":"<path fill-rule=\"evenodd\" d=\"M9.1 2.7h5.8a2.9 2.9 0 0 1 2.9 2.9v6.8a2.9 2.9 0 0 1-2.9 2.9H9.1a2.9 2.9 0 0 1-2.9-2.9V5.6a2.9 2.9 0 0 1 2.9-2.9Zm-1.2 2.5v4.1h8.2V5.2ZM9.1 11.4a1.1 1.1 0 1 0 0 2.1A1.1 1.1 0 0 0 9.1 11.4Zm5.8 0a1.1 1.1 0 1 0 0 2.1a1.1 1.1 0 0 0 0-2.1Z\"/><path class=\"ln\" d=\"M8.6 20.2l1.9-3.4M15.4 20.2l-1.9-3.4\"/>","trash":"<path d=\"M5.8 7.6h12.4l-1 12a2 2 0 0 1-2 1.8H8.8a2 2 0 0 1-2-1.8Z\"/><path class=\"ln\" d=\"M3.8 6.6h16.4M9 6.6V4h6v2.6\"/>","tree":"<path d=\"M12 2.5L5.9 10.7h3L4.4 16.9h15.1l-4.5-6.2h3Z\"/><path class=\"ln\" d=\"M12 16.2v4\"/>","trophy":"<path d=\"M7.3 3h9.6V8.6a4.7 4.7 0 0 1-9.6 0Z\"/><path class=\"ln\" d=\"M7.3 5.6H5a3.1 3.1 0 0 0 3.1 4.1M16.7 5.6h2.3a3.1 3.1 0 0 1-3.1 4.1M12 13.7V16.9M8 20.4h8.1\"/>","tv":"<rect x=\"2.7\" y=\"7.4\" width=\"18.6\" height=\"13.3\" rx=\"2.3\"/><path class=\"ln\" d=\"M8.2 3.8l3.8 3.4l3.8-3.4\"/>","umbrella":"<path d=\"M2.6 12.7a9.4 9.4 0 0 1 18.8 0Z\"/><path class=\"ln\" d=\"M12 12.7v5.6a1.9 1.9 0 0 1-3.8 0\"/>","upload":"<path d=\"M10.6 21.7h2.5v-7h4.7L11.9 8.6l-5.9 5.9h4.7Z\"/><path class=\"ln\" d=\"M4.5 4.3h14.9\"/>","user":"<circle cx=\"12\" cy=\"6.7\" r=\"4.5\"/><path d=\"M3.5 21c0-4.7 3.8-7.8 8.5-7.8s8.5 3.2 8.5 7.8Z\"/>","user-check":"<circle cx=\"8.9\" cy=\"7.5\" r=\"3.2\"/><path d=\"M2.9 19.3c0-3.4 2.7-5.9 5.9-5.9s5.9 2.4 5.9 5.9Z\"/><path class=\"ln\" d=\"M14.8 10.6l1.9 1.9l3.8-3.8\"/>","user-circle":"<path fill-rule=\"evenodd\" d=\"M13 2.9a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7Zm0 3.8a3.3 3.3 0 1 1 0 6.5a3.3 3.3 0 0 1 0-6.5ZM7.2 17.9a6.7 6.7 0 0 1 11.5 0a8.1 8.1 0 0 1-11.5 0Z\"/>","user-lock":"<circle cx=\"9.9\" cy=\"7.2\" r=\"4.2\"/><path d=\"M2.7 20c0-4.2 3.2-7 7.2-7c1.2 0 2.3 0.3 3.2 0.8v6.2Z\"/><rect x=\"14.5\" y=\"14.5\" width=\"6.9\" height=\"5.7\" rx=\"1.3\"/><path class=\"ln\" d=\"M16.4 14.5v-1a1.5 1.5 0 0 1 3 0v1\"/>","user-minus":"<circle cx=\"9.6\" cy=\"7.6\" r=\"3.9\"/><path d=\"M2.8 19.7c0-3.9 3.1-6.6 6.8-6.6c1.2 0 2.2 0.3 3.1 0.8v5.9Z\"/><path class=\"ln\" d=\"M15.1 16.7h5.2\"/>","user-off":"<path d=\"M9.1 4.7A4.2 4.2 0 1 1 15 10.6ZM4.2 20.8c0-4.3 2.8-6.9 6.3-7.2L17.5 20.8Z\"/><path class=\"ln\" d=\"M4 3.5l16.2 16.2\"/>","user-pen":"<circle cx=\"9.8\" cy=\"7.6\" r=\"4\"/><path d=\"M2.9 19.9c0-4 3.1-6.7 6.9-6.7c1.2 0 2.2 0.3 3.1 0.8v5.9Z\"/><path d=\"M19.5 11.4l2.1 2.1l-5.2 5.2l-2.8 0.7l0.7-2.8Z\"/>","user-tag":"<circle cx=\"10\" cy=\"7.4\" r=\"4\"/><path d=\"M2.9 19.9c0-4 3.2-6.8 7-6.8c1.2 0 2.3 0.3 3.2 0.8v6Z\"/><path fill-rule=\"evenodd\" d=\"M14 13.7h4.5l3.1 3.1l-3.1 3.1h-4.5ZM15.2 16.8a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z\"/>","video":"<path d=\"M3 7.7a2 2 0 0 1 2-2H14.4a2 2 0 0 1 2 2v8.7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2ZM17.5 10.1l4.2-2.6v8.9l-4.2-2.6Z\"/>","volume":"<path d=\"M2.5 8.9h4l5.4-4.2v14.6l-5.4-4.2H2.5Z\"/><path class=\"ln\" d=\"M15.2 9.3a3.8 3.8 0 0 1 0 5.5M17.7 6.5a7.5 7.5 0 0 1 0 11\"/>","walk":"<circle cx=\"12.4\" cy=\"4.6\" r=\"2.2\"/><path class=\"ln\" d=\"M8.7 19.8l2.4-5.5l1.9 2.2V19.8M11.1 14.3l0.9-5.2l-2.8 1.5l-1.4 2.8M12 9.1l1.8 2.8l2.8 0.9\"/>","wallet":"<path fill-rule=\"evenodd\" d=\"M5.7 2.8H19v4.6h1.6a0.9 0.9 0 0 1 0.9 0.9v12.4H5.1a2.5 2.5 0 0 1-2.5-2.5V5.9a3.1 3.1 0 0 1 3.1-3.1Zm0 2.1a1 1 0 0 0 0 2.1h11.2V4.9ZM16.7 12.9a1.4 1.4 0 1 0 0 2.8a1.4 1.4 0 0 0 0-2.8Z\"/>","water":"<path d=\"M2.7 7.9c2.4 0 2.4-2 4.7-2s2.4 2 4.6 2s2.4-2 4.7-2s2.4 2 4.6 2v3.2c-2.3 0-2.3-2-4.6-2s-2.4 2-4.7 2s-2.3-2-4.6-2s-2.4 2-4.7 2ZM2.7 14.8c2.4 0 2.4-2 4.7-2s2.4 2 4.6 2s2.4-2 4.7-2s2.4 2 4.6 2v3.2c-2.3 0-2.3-2-4.6-2s-2.4 2-4.7 2s-2.3-2-4.6-2s-2.4 2-4.7 2Z\"/>","weight":"<circle cx=\"12\" cy=\"4.8\" r=\"2.6\"/><path d=\"M6.5 8.7h10.9l3.3 12.3H3.2Z\"/>","window":"<path d=\"M2.6 6.2a2.7 2.7 0 0 1 2.7-2.7h13.4a2.7 2.7 0 0 1 2.7 2.7v1.5H2.6ZM2.6 9.8h18.7v7.7a2.7 2.7 0 0 1-2.7 2.7h-13.4a2.7 2.7 0 0 1-2.7-2.7Z\"/>","window-restore":"<path d=\"M2.7 10.4a2.7 2.7 0 0 1 2.7-2.7h8.2a2.7 2.7 0 0 1 2.7 2.7v7.2a2.7 2.7 0 0 1-2.7 2.7h-8.2a2.7 2.7 0 0 1-2.7-2.7ZM7.9 6.4V6.3a2.7 2.7 0 0 1 2.7-2.7h8.2a2.7 2.7 0 0 1 2.7 2.7v7.2a2.7 2.7 0 0 1-2.7 2.7h-1.1v-5.8a4 4 0 0 0-4-4Z\"/>","wrench":"<path d=\"M14.9 2.5a6 6 0 0 0-5.5 8.3L2.7 17.5V21.3H6.5l6.7-6.7a6 6 0 0 0 8.3-5.5l-3.5 1.3l-2.9-2.9l1.3-3.5Z\"/>","x-circle":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM10.1 7.9L12.9 10.7l2.9-2.9l1.4 1.4l-2.9 2.9l2.9 2.9l-1.4 1.4l-2.9-2.9l-2.9 2.9l-1.4-1.4l2.9-2.9l-2.9-2.9Z\"/>","zap":"<path d=\"M13.9 2.5L5.2 13.3h6.1l-1.2 8.1l8.7-10.8h-6.1Z\"/>"};
++ const G = {"airplane":"<path d=\"M12 3.2c0.9 0 1.4 0.9 1.4 2.4V9.8l7 4.2V15.4l-7-2.4V17.2l1.9 1.4V20L12 19.1l-3.3 0.9v-1.4l1.9-1.4v-4.2L3.6 15.4v-1.4L10.6 9.8V5.6C10.6 4.2 11.1 3.2 12 3.2Z\"/>","alert":"<path d=\"M12 4.5L3.6 18.8h16.9Z\"/><path d=\"M12 10v3.7M12 16.5h0\"/>","alert-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.5v5.5M12 16.5h.01\"/>","align-left":"<path d=\"M4 5.9h16.6M4 10h10.4M4 14.3h16.6M4 18.5h10.4\"/>","archive":"<rect x=\"3.5\" y=\"4.8\" width=\"17\" height=\"4.7\" rx=\"0.9\"/><path d=\"M5.4 9.5v9.4a0.9 0.9 0 0 0 0.9 0.9h11.3a0.9 0.9 0 0 0 0.9-0.9V9.5M10.1 13.3h3.8\"/>","arrow-down":"<path d=\"M12 3.2v16.7M5.7 13.7l6.3 6.3l6.3-6.3\"/>","arrow-left":"<path d=\"M20.8 12H4M10.3 5.7l-6.3 6.3l6.3 6.3\"/>","arrow-right":"<path d=\"M3.2 12h16.7M13.7 5.7l6.3 6.3l-6.3 6.3\"/>","arrow-up":"<path d=\"M12 20.8V4M5.7 10.3l6.3-6.3l6.3 6.3\"/>","arrows-h":"<path d=\"M3.8 12h16.5M7.6 8.1l-3.9 3.9l3.9 3.9M16.4 8.1l3.9 3.9l-3.9 3.9\"/>","at":"<circle cx=\"12\" cy=\"12\" r=\"3.4\"/><path d=\"M15.4 12v1.3a2.5 2.5 0 0 0 4.9 0V12a8.3 8.3 0 1 0-3.2 6.5\"/>","back":"<path d=\"M16.1 3.6l-8.4 8.4l8.4 8.4\"/>","ban":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m6 6 12 12\"/>","bell":"<path d=\"M6 14.6V9.5a6.1 6.1 0 0 1 12.2 0v5.1l1.5 2.1h-15.3ZM10 18.7a2.1 2.1 0 0 0 4 0\"/>","book":"<path d=\"M5 5.7a1.9 1.9 0 0 1 1.9-1.9h12.1v14.9H6.8a1.9 1.9 0 0 0-1.9 1.9Z\"/><path d=\"M5 18.7V5.7\"/>","book-open":"<path d=\"M12 6.3C10 4.8 7 4.3 3.5 4.9v13.2c3.5-0.6 6.5-0.1 8.5 1.4c2-1.5 5-2 8.5-1.4V4.9C17 4.3 14 4.8 12 6.3Z\"/><path d=\"M12 6.3v13.2\"/>","box":"<path d=\"M3.6 7.9L11.9 3.9l8.4 3.9v8.4L11.9 20.1l-8.4-3.9Z\"/><path d=\"M3.6 7.9L11.9 11.8l8.4-3.9M11.9 11.8v8.4M7.8 5.9l8.4 3.9\"/>","brain":"<path d=\"M9.2 4.2a2.8 2.8 0 0 0-2.8 2.8a2.8 2.8 0 0 0-1.9 4.8a2.8 2.8 0 0 0 1.9 4.8a2.8 2.8 0 0 0 5.8 1.1V5.8A1.9 1.9 0 0 0 9.2 4.2ZM14.9 4.2a2.8 2.8 0 0 1 2.8 2.8a2.8 2.8 0 0 1 1.9 4.8a2.8 2.8 0 0 1-1.9 4.8a2.8 2.8 0 0 1-5.8 1.1\"/>","branch":"<circle cx=\"6.7\" cy=\"5.6\" r=\"1.9\"/><circle cx=\"6.7\" cy=\"18.6\" r=\"1.9\"/><circle cx=\"17.9\" cy=\"7.5\" r=\"1.9\"/><path d=\"M6.7 7.5v9.3M17.9 9.3c0 5.1-6 3.7-10.2 7.9\"/>","bridge":"<path d=\"M3.5 16h17M7 19.5V5M17 19.5V5\"/><path d=\"M3.5 10c1.8 0 2.8-2.3 3.5-5c2.4 5.2 7.6 5.2 10 0c.7 2.7 1.7 5 3.5 5\"/><path d=\"M12 10.9V16\"/>","briefcase":"<rect x=\"3.5\" y=\"7.2\" width=\"17\" height=\"12.3\" rx=\"1.9\"/><path d=\"M9.2 7.2V5.7A1.4 1.4 0 0 1 10.6 4.3h2.8A1.4 1.4 0 0 1 14.8 5.7V7.2M3.5 12.3h7.1M13.4 12.3H20.5M10.6 11.4h2.8v2.4h-2.8Z\"/>","bug":"<rect x=\"7.2\" y=\"6.2\" width=\"9.6\" height=\"13.3\" rx=\"4.8\"/><path d=\"M9.3 6.5a2.7 2.7 0 0 1 5.3 0M12 10.9v8.5M7.2 12H3.5M20.5 12h-3.7M7.6 8.3L4.6 5.6M16.4 8.3L19.4 5.6M7.6 16.3L4.6 18.9M16.4 16.3L19.4 18.9\"/>","burst":"<path d=\"M11.9 3.7L13.6 7.8L17.8 6.2L16.2 10.4L20.3 12.1L16.2 13.8L17.8 18L13.6 16.4L11.9 20.4L10.2 16.4L6 18L7.6 13.8L3.6 12.1L7.6 10.4L6 6.2L10.2 7.8Z\"/>","busy":"<path d=\"M4.7 12h0M12.1 12h0M19.4 12h0\" stroke-width=\"4.2\"/>","calendar":"<rect x=\"4\" y=\"5.5\" width=\"16\" height=\"15\" rx=\"2\"/><path d=\"M4 10.5h16M9 3.5v4M15 3.5v4\"/>","camera":"<path d=\"M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z\"/><circle cx=\"12\" cy=\"13.3\" r=\"3.4\"/>","camera-flip":"<path d=\"M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z\"/><path d=\"M15 12.6a3.1 3.1 0 0 0-5.6-1.2M9 14.4a3.1 3.1 0 0 0 5.6 1.2M9.3 9.5v2h2M14.7 17.5v-2h-2\"/>","camera-off":"<path d=\"M3.7 7.9h3.3l1.7-2.7h6.4L16.9 7.9h3.3v11.2h-16.5Z\"/><circle cx=\"11.9\" cy=\"13\" r=\"3.3\"/><path d=\"M3.7 3.5l16.5 16.5\"/>","car":"<path d=\"M3.5 15.8v-4.5L6.2 5.8h11.6l2.7 5.5V15.8Z\"/><path d=\"M3.5 11.3h17M6.5 15.8v2.5M17.5 15.8v2.5M7.2 13.8h0M16.8 13.8h0\"/>","card":"<rect x=\"3.7\" y=\"5.8\" width=\"16.7\" height=\"12.3\" rx=\"1.8\"/><path d=\"M3.7 10.3h16.7M6.7 14.6h3.5\"/>","care":"<path d=\"M12 10.6s-3.8-2.3-3.8-5a2.1 2.1 0 0 1 3.8-1.3a2.1 2.1 0 0 1 3.8 1.3c0 2.7-3.8 5-3.8 5Z\"/><path d=\"M3.5 13.5v6.5M3.5 15h3.3l3.4 2.8h7.7a1.8 1.8 0 0 0 0-3.6h-4.1\"/>","cart":"<path d=\"M3.5 4.1h1.9l2.2 10.2h10.2L20.3 6.9H6.5\"/><circle cx=\"9.1\" cy=\"18.6\" r=\"1.2\"/><circle cx=\"16.5\" cy=\"18.6\" r=\"1.2\"/>","cc":"<rect x=\"3.5\" y=\"5.4\" width=\"17\" height=\"13.2\" rx=\"2.4\"/><path d=\"M10.7 10.2a2.3 2.3 0 1 0 0 3.6M16.8 10.2a2.3 2.3 0 1 0 0 3.6\"/>","chart":"<path d=\"M3.9 3.4v16.7h16.7\"/><path d=\"M7.7 14.5l3.6-4.1l3.2 2.7l5.2-6.3\"/>","chat":"<path d=\"M3.8 4.3h16.8v11.7H8l-4.2 4.2Z\"/>","chat-off":"<path d=\"M4.2 5.1h15.7v10.9H8l-4 4Z\"/><path d=\"M3.7 3.7l16.7 16.7\"/>","check":"<path d=\"M3.7 12.1l5.4 5.4L20.4 6.1\"/>","check-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m8 12.4 2.8 2.8L16 9.6\"/>","check-double":"<path d=\"M3.6 11.7l3.6 3.6L14.6 7.7M11.1 15.2l0.9 0.9L20.4 7.7\"/>","chevron":"<path d=\"M7.9 3.6l8.4 8.4l-8.4 8.4\"/>","chevrons-left":"<path d=\"M10.9 19.3l-7.3-7.3l7.3-7.3M20.4 19.3l-7.3-7.3l7.3-7.3\"/>","chevrons-right":"<path d=\"M3.6 19.3l7.3-7.3l-7.3-7.3M13.1 19.3l7.3-7.3l-7.3-7.3\"/>","child":"<circle cx=\"12\" cy=\"5.8\" r=\"2.1\"/><path d=\"M7.9 10.5L12 9.2l4.1 1.4M12 9.2v5.6M9.2 20.4l2.8-5.6l2.8 5.6\"/>","chip":"<rect x=\"7.3\" y=\"7.3\" width=\"9.4\" height=\"9.4\" rx=\"1.4\"/><path d=\"M10.1 3.5v3.8M13.9 3.5v3.8M10.1 16.7v3.8M13.9 16.7v3.8M3.5 10.1h3.8M3.5 13.9h3.8M16.7 10.1h3.8M16.7 13.9h3.8\"/>","circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/>","city":"<path d=\"M3.5 19.7h17M5.4 19.7V8.3h4.7v11.3M10.1 19.7V3.6h5.7v16.1M15.8 19.7v-7.6h3.3v7.6M7.8 11.2h0M7.8 14.5h0M12.9 6.9h0M12.9 10.2h0M12.9 13.5h0\"/>","clapper":"<path d=\"M4 10.4h16.3v8.6a1 1 0 0 1-1 1h-14.4a1 1 0 0 1-1-1Z\"/><path d=\"M4 10.4L3.4 7.2l15.7-2.9l0.7 3.3ZM8.5 6.3l2.2 3.2M13.3 5.4l2.2 3.2\"/>","clipboard":"<rect x=\"5.7\" y=\"5\" width=\"12.6\" height=\"15.5\" rx=\"1.9\"/><path d=\"M9.1 5V3.5h5.8V5M9.1 10.8h5.8M9.1 14.7h3.9\"/>","clipboard-check":"<rect x=\"5.7\" y=\"4.9\" width=\"12.6\" height=\"15.5\" rx=\"1.9\"/><path d=\"M9.1 4.9V3.5h5.8V4.9M9.1 13.2l1.9 1.9l3.9-3.9\"/>","clock":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.5V12l3 2\"/>","close":"<path d=\"M3.7 3.7l16.7 16.7M20.4 3.7L3.7 20.4\"/>","cloud":"<path d=\"M7.8 17.6h8.9a3.4 3.4 0 0 0 0.5-7A5.2 5.2 0 0 0 6.9 10.1A3.7 3.7 0 0 0 7.8 17.6Z\"/>","cloud-off":"<path d=\"M7.5 17.6h9.5a3.8 3.8 0 0 0 0.5-7.5A5.7 5.7 0 0 0 6.4 9.6A4.1 4.1 0 0 0 7.5 17.6Z\"/><path d=\"M4 3.9l16.1 16.1\"/>","code":"<path d=\"M7.8 7.8l-4.2 4.2l4.2 4.2M16.2 7.8l4.2 4.2l-4.2 4.2M14.2 4.6l-4.2 14.8\"/>","coin":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M14.5 9.2c-.5-.8-1.4-1.2-2.5-1.2-1.5 0-2.5.8-2.5 2s1 1.6 2.5 2 2.5.8 2.5 2-1 2-2.5 2c-1.1 0-2-.4-2.5-1.2M12 6.5v11\"/>","columns":"<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M12 4.5v15M3.5 9h17\"/>","commit":"<circle cx=\"12\" cy=\"12\" r=\"3.4\"/><path d=\"M3.5 12h5.1M15.4 12H20.5\"/>","compass":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m15.6 8.4-2.1 5.1-5.1 2.1 2.1-5.1Z\"/>","compress":"<path d=\"M8.8 3.5v5.3H3.5M15.2 3.5v5.3h5.3M8.8 20.5v-5.3H3.5M15.2 20.5v-5.3h5.3\"/>","computer":"<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"11.3\" rx=\"1.9\"/><path d=\"M8.2 19.7h7.6M12 15.9v3.8\"/>","contrast":"<circle cx=\"11.7\" cy=\"12\" r=\"8.4\"/><path d=\"M11.7 3.6v16.7M11.7 7.9h6.5M11.7 12h8.4M11.7 16.2h6.5\"/>","cookie":"<path d=\"M20.6 12.3a8.4 8.4 0 1 1-8.9-8.9a3 3 0 0 0 3.9 3.5a3 3 0 0 0 4.9 5.3Z\"/><path d=\"M8.8 9.4h0M12.2 13.8h0M8.3 15.3h0M15.7 15.3h0\"/>","copy":"<rect x=\"8\" y=\"8\" width=\"12.5\" height=\"12.5\" rx=\"2.1\"/><path d=\"M16.3 8V5.8a2.1 2.1 0 0 0-2.1-2.1H5.8a2.1 2.1 0 0 0-2.1 2.1v8.4a2.1 2.1 0 0 0 2.1 2.1h2.1\"/>","couch":"<path d=\"M5.4 10.1V7.2a1.9 1.9 0 0 1 1.9-1.9h9.4a1.9 1.9 0 0 1 1.9 1.9v2.8\"/><path d=\"M3.5 11.9a1.9 1.9 0 0 1 3.8 0v1.4h9.4V11.9a1.9 1.9 0 0 1 3.8 0v4.7H3.5ZM5.4 16.7v1.9M18.6 16.7v1.9\"/>","crown":"<path d=\"M3.5 8.3L7.8 12L11.9 5.5l4.2 6.5l4.2-3.7L18.4 18.1H5.4Z\"/>","cubes":"<path d=\"M12 3.2L8.1 5.2v4.4l3.9 2l3.9-2V5.2ZM7.6 11.6L3.6 13.6v4.4l3.9 2l3.9-2V13.6ZM16.4 11.6l-3.9 2v4.4l3.9 2l3.9-2V13.6Z\"/>","database":"<ellipse cx=\"12\" cy=\"6.4\" rx=\"6.6\" ry=\"2.8\"/><path d=\"M5.4 6.4v11.3c0 1.6 2.9 2.8 6.6 2.8s6.6-1.2 6.6-2.8V6.4M5.4 12c0 1.6 2.9 2.8 6.6 2.8s6.6-1.2 6.6-2.8\"/>","dice":"<rect x=\"3.7\" y=\"3.6\" width=\"16.7\" height=\"16.7\" rx=\"3\"/><path d=\"M8.6 8.6h0M15.5 8.6h0M12.1 12h0M8.6 15.4h0M15.5 15.4h0\" stroke-width=\"2.6\"/>","dish":"<path d=\"M3.8 9.2A10.9 10.9 0 0 0 14.8 20.2Z\"/><path d=\"M9 15l5.2-5.2M14.8 3.4a5.8 5.8 0 0 1 5.8 5.8M14.8 7.5a1.8 1.8 0 0 1 1.8 1.8\"/>","dollar":"<path d=\"M15.7 8C15 6.6 13.7 5.6 12 5.6C9.6 5.6 8.3 6.9 8.3 8.5s1.6 2.5 3.7 2.8s3.7 1.3 3.7 3.1s-1.5 3-3.7 3c-1.8 0-3.2-0.9-3.7-2.4M12 3.7v16.7\"/>","donate":"<circle cx=\"11.9\" cy=\"8.4\" r=\"5.2\"/><path d=\"M11.9 6v4.3M3.7 15.6h16.5V20H3.7ZM8.3 17.7h7.2\"/>","door":"<path d=\"M13.7 4.7L6.3 3.2v16.7l7.5-1.4ZM13.7 5.1h3.3a0.9 0.9 0 0 1 0.9 0.9v14M3.5 20h16.7M11 11.6h0\"/>","down":"<path d=\"M3.6 7.9l8.4 8.4l8.4-8.4\"/>","download":"<path d=\"M12 3.2v11.5M6.8 9.5l5.2 5.2l5.2-5.2M4.7 20h14.7\"/>","drive":"<rect x=\"3.5\" y=\"12.3\" width=\"17\" height=\"6.6\" rx=\"1.9\"/><path d=\"M3.9 12.3L6.8 4.7h10.4l2.8 7.6M16.7 15.6h0M13.8 15.6h0\"/>","drop":"<path d=\"M12 3.5s5.9 6.4 5.9 10.8a5.9 5.9 0 0 1-11.8 0c0-4.4 5.9-10.8 5.9-10.8Z\"/>","ear":"<path d=\"M6.2 9.5a5.7 5.7 0 1 1 10.8 2.4c-0.9 1.9-3.1 3-3.1 5.2a3.4 3.4 0 0 1-6.5 1.6\"/><path d=\"M9.7 9.9a2.4 2.4 0 1 1 3.8 1.5\"/>","enter":"<path d=\"M13.8 3.6h4.1a2.1 2.1 0 0 1 2.1 2.1v12.5a2.1 2.1 0 0 1-2.1 2.1h-4.1M9.5 7.9l4.1 4.1l-4.1 4.1M13.8 12H3.2\"/>","eraser":"<path d=\"M14.3 4.4l5.5 5.5l-9 9H6.6l-2.6-2.6a1.5 1.5 0 0 1 0-2.1Z\"/><path d=\"M9.3 9.4l5.5 5.5M10.8 18.9H20.3\"/>","expand":"<path d=\"M3.5 8.8V3.5h5.3M20.5 8.8V3.5h-5.3M3.5 15.2v5.3h5.3M20.5 15.2v5.3h-5.3\"/>","eye":"<path d=\"M3.5 12S6.6 6.2 12 6.2S20.5 12 20.5 12S17.4 17.8 12 17.8S3.5 12 3.5 12Z\"/><circle cx=\"12\" cy=\"12\" r=\"2.7\"/>","eye-off":"<path d=\"M10.6 6.1c0.5-0.1 0.9-0.1 1.4-0.1c5.2 0 8.5 6 8.5 6s-0.6 1.1-1.7 2.4M6.9 7.6C4.7 9.2 3.5 12 3.5 12s3.3 6 8.5 6c1.6 0 3-0.5 4.2-1.2\"/><path d=\"M10 10a2.8 2.8 0 0 0 4 4M4.5 4.5l15 15\"/>","fast-forward":"<path d=\"M4 6.4v11.2L11.6 12ZM13.1 6.4v11.2L20.7 12Z\"/>","file":"<path d=\"M6.4 3.5h7.6l3.8 3.8v13.2H6.4Z\"/><path d=\"M13.9 3.5v3.8h3.8\"/>","file-code":"<path d=\"M13.9 3.5H7.4a1.9 1.9 0 0 0-1.9 1.9v13a1.9 1.9 0 0 0 1.9 1.9h9.3a1.9 1.9 0 0 0 1.9-1.9V8.2Z\"/><path d=\"M13.9 3.5v4.6h4.6M10.1 12.4L8.3 14.3l1.9 1.9M13.9 12.4l1.9 1.9l-1.9 1.9\"/>","film":"<rect x=\"3.5\" y=\"4.4\" width=\"17\" height=\"15.1\" rx=\"1.9\"/><path d=\"M7.7 4.4v15.1M16.3 4.4v15.1M3.5 9.2h4.3M3.5 14.8h4.3M16.3 9.2H20.5M16.3 14.8H20.5\"/>","filter":"<path d=\"M3.5 6h17M6.7 12.4h10.6M9.9 18.7h4.2\"/>","finish":"<path d=\"M5.2 20.7V4\"/><rect x=\"5.2\" y=\"4.6\" width=\"13.9\" height=\"8.6\" rx=\"1\"/><path d=\"M5.2 8.8h13.9M9.6 4.6v8.6M14.3 4.6v8.6\"/>","fire":"<path d=\"M12 20.5a6.8 6.8 0 0 0 6.8-6.8c0-4.3-2.9-6.8-4.2-10.1c-2 2.3-2.6 4.5-2.6 4.5S10.7 5.8 9.5 3.8C7 6.6 5.2 10 5.2 13.7a6.8 6.8 0 0 0 6.8 6.8Z\"/>","fish":"<path d=\"M9 12c1.8-3.2 4.3-4.8 7.1-4.8c2.6 0 4.2 2 4.9 4.8c-0.7 2.8-2.3 4.8-4.9 4.8c-2.8 0-5.3-1.6-7.1-4.8Z\"/><path d=\"M9 12L4.2 8.6M9 12l-4.8 3.4M17.3 10.6h0.01\"/>","fist":"<path d=\"M6.4 10.1V6.4a1.6 1.6 0 0 1 3.2 0V9.1M9.5 8.5v-3.2a1.6 1.6 0 0 1 3.2 0v3.2M12.6 8.5v-2.1a1.6 1.6 0 0 1 3.2 0V9.1M15.7 9.1V8a1.6 1.6 0 0 1 3.2 0v5.2a7.3 7.3 0 0 1-7.3 7.3H11.1a5.7 5.7 0 0 1-5.7-5.7V12.3A2.1 2.1 0 0 1 7.4 11.2h2.1a1.6 1.6 0 0 1 0 3.2H8\"/>","flag":"<path d=\"M6.7 20.7V4M6.7 4h10.8l-2 3.9l2 3.9H6.7\"/>","flask":"<path d=\"M9.5 3.2h4.9M10 3.2V9.2L4.9 17.7a1.5 1.5 0 0 0 1.3 2.3h11.6a1.5 1.5 0 0 0 1.3-2.3L14 9.2V3.2\"/><path d=\"M7.3 14.6h9.5\"/>","focus":"<circle cx=\"12\" cy=\"12\" r=\"2.8\"/><path d=\"M3.5 9V5.9A2.4 2.4 0 0 1 5.9 3.5H9M15 3.5h3.1A2.4 2.4 0 0 1 20.5 5.9V9M20.5 15v3.1a2.4 2.4 0 0 1-2.4 2.4H15M9 20.5H5.9A2.4 2.4 0 0 1 3.5 18.1V15\"/>","folder":"<path d=\"M3.8 7.3a1.9 1.9 0 0 1 1.9-1.9h3.6l1.9 1.9h7.4a1.9 1.9 0 0 1 1.9 1.9v7.4a1.9 1.9 0 0 1-1.9 1.9H5.8a1.9 1.9 0 0 1-1.9-1.9Z\"/>","folder-tree":"<path d=\"M4.1 3.3v13.2a1 1 0 0 0 1 1H9.7M4.1 8.3H9.7\"/><path d=\"M10.2 5.3h3.1l1 1.5h5.6V10.9h-9.7ZM10.2 14.5h3.1l1 1.5h5.6V20.1h-9.7Z\"/>","food":"<path d=\"M8.2 4v6.5M6.3 4v4.2a1.9 1.9 0 0 0 3.7 0V4M8.2 10.5v10.2M17.5 20.8V4c-1.9 1.1-3 3.3-3 6.5v2.8H17.5\"/>","game":"<rect x=\"3.7\" y=\"7.2\" width=\"16.7\" height=\"9.7\" rx=\"4.4\"/><path d=\"M7.6 10.7v2.7M6.4 12h2.7M15.1 11.6h0M17.4 12.9h0\"/>","gauge":"<path d=\"M3.6 16.9a8.4 8.4 0 1 1 16.7 0\"/><path d=\"M11.9 13.2l4.1-5.7\"/><circle cx=\"11.9\" cy=\"13.2\" r=\"1.4\"/>","gavel":"<path d=\"M13.7 4.1l5.1 5.1M10.5 7.4l5.1 5.1M12.1 5.8l-5.6 5.6l5 5l5.6-5.6M3.5 19.5l5.9-5.9M13.7 19.5h6.5\"/>","gear":"<circle cx=\"12\" cy=\"12.1\" r=\"2.3\"/><path d=\"M17.6 14.3a1.3 1.3 0 0 0 0.2 1.5l0.1 0.1a1.5 1.5 0 1 1-2.4 2.4l-0.1-0.1a1.3 1.3 0 0 0-1.5-0.2a1.3 1.3 0 0 0-0.8 1.3V18.8a1.5 1.5 0 1 1-3.4 0v-0.1a1.3 1.3 0 0 0-0.9-1.3a1.3 1.3 0 0 0-1.5 0.2l-0.1 0.1a1.5 1.5 0 1 1-2.4-2.4l0.1-0.1a1.3 1.3 0 0 0 0.2-1.5a1.3 1.3 0 0 0-1.3-0.8H5.4a1.5 1.5 0 1 1 0-3.4h0.1a1.3 1.3 0 0 0 1.3-0.9a1.3 1.3 0 0 0-0.2-1.5l-0.1-0.1a1.5 1.5 0 1 1 2.4-2.4l0.1 0.1a1.3 1.3 0 0 0 1.5 0.2H9.8a1.3 1.3 0 0 0 0.8-1.3V5.4a1.5 1.5 0 1 1 3.4 0v0.1a1.3 1.3 0 0 0 0.8 1.3a1.3 1.3 0 0 0 1.5-0.2l0.1-0.1a1.5 1.5 0 1 1 2.4 2.4l-0.1 0.1a1.3 1.3 0 0 0-0.2 1.5V9.8a1.3 1.3 0 0 0 1.3 0.8H18.7a1.5 1.5 0 1 1 0 3.4h-0.1a1.3 1.3 0 0 0-1.3 0.8Z\"/>","gem":"<path d=\"M6.8 4.9h10.3L20.2 9.5l-8.3 10.3L3.6 9.5Z\"/><path d=\"M3.6 9.5h16.7M9.6 4.9L8.1 9.5l3.8 10.3M14.2 4.9L15.7 9.5l-3.8 10.3\"/>","ghost":"<path d=\"M4.7 20V10.6a7.3 7.3 0 0 1 14.7 0v9.4l-2.4-1.9l-2.5 1.9l-2.4-1.9L9.6 20l-2.5-1.9Z\"/><path d=\"M9.4 10.1h0M14.6 10.1h0\"/>","gift":"<rect x=\"4.4\" y=\"8.8\" width=\"15.1\" height=\"10.4\" rx=\"0.9\"/><path d=\"M3.5 8.8h17M12 8.8v10.4M12 8.8c-1.4-2.8-4.7-3.8-4.7-1.4S12 8.8 12 8.8s4.7-0.9 4.7-3.3S13.4 6 12 8.8\"/>","globe":"<circle cx=\"11.9\" cy=\"11.9\" r=\"8.3\"/><path d=\"M3.6 11.9h16.7M11.9 3.6c2.7 2.7 2.7 13.9 0 16.7M11.9 3.6c-2.7 2.7-2.7 13.9 0 16.7\"/>","grid":"<rect x=\"3.5\" y=\"3.5\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/><rect x=\"13.1\" y=\"3.5\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/><rect x=\"3.5\" y=\"13.1\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/><rect x=\"13.1\" y=\"13.1\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/>","grip":"<path d=\"M8.3 4.5h0M15.8 4.5h0M8.3 12h0M15.8 12h0M8.3 19.5h0M15.8 19.5h0\" stroke-width=\"3.8\"/>","group":"<path d=\"M3.5 7.3V3.5h3.8M16.7 3.5h3.8v3.8M20.5 16.7v3.8h-3.8M7.3 20.5H3.5v-3.8\"/><rect x=\"7.3\" y=\"7.3\" width=\"5.7\" height=\"4.7\" rx=\"0.9\"/><rect x=\"11.1\" y=\"12\" width=\"5.7\" height=\"4.7\" rx=\"0.9\"/>","hammer":"<path d=\"M13.1 3.7L19.3 9.9l-2.7 2.7l-6.2-6.2Z\"/><path d=\"M13.6 9.4L5 18.1a1.3 1.3 0 0 0 1.9 1.9l8.6-8.6\"/>","hand":"<path d=\"M9.9 13.6V6.2a1.5 1.5 0 0 1 3 0V11.7M12.8 10.7V5.3a1.5 1.5 0 0 1 3 0V11.7M15.8 11.2V6.7a1.5 1.5 0 0 1 3 0v6.9c0 3.9-2.5 6.9-6.4 6.9c-2.6 0-4.1-1.3-5.6-3.5L4.9 14.2a1.5 1.5 0 0 1 2.4-1.8L9.9 15.6\"/>","handshake":"<path d=\"M3.6 9.9v5.3M20.3 9.9v5.3\"/><path d=\"M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2\"/><path d=\"M5.7 10.8l5.6 5.6a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2\"/>","hash":"<path d=\"M5 9h15M4 15h15M10 3.5 8 20.5M16 3.5l-2 17\"/>","heading":"<path d=\"M5.6 3.5v17M18.4 3.5v17M5.6 12h12.7M3.5 3.5h4.2M16.2 3.5h4.2M3.5 20.5h4.2M16.2 20.5h4.2\"/>","headphones":"<path d=\"M4.4 13.9v-2.8a7.5 7.5 0 0 1 14.9 0v2.8\"/><rect x=\"3.5\" y=\"13\" width=\"4.2\" height=\"6\" rx=\"1.4\"/><rect x=\"16.1\" y=\"13\" width=\"4.2\" height=\"6\" rx=\"1.4\"/>","heart":"<path d=\"M11.9 20.3s-8.1-5.1-8.1-11.6a4.6 4.6 0 0 1 8.1-3A4.6 4.6 0 0 1 20 9.2c0 6.5-8.1 11.6-8.1 11.6Z\"/>","heart-broken":"<path d=\"M11.9 20.3s-8.1-5.1-8.1-11.6a4.6 4.6 0 0 1 8.1-3A4.6 4.6 0 0 1 20 9.2c0 6.5-8.1 11.6-8.1 11.6Z\"/><path d=\"M11.9 5.8L10 9.8l3.5 2.3l-1.6 3.9\"/>","heart-pulse":"<path d=\"M19 12.3c-1.7 3.6-7 6.7-7 6.7s-5.3-3.1-7-6.7M4.3 9.7A4.3 4.3 0 0 1 12 7.4a4.3 4.3 0 0 1 7.7 2.2\"/><path d=\"M3.5 11.9h4l1.3-2.2l2.2 4.5l1.8-3.1h7.6\"/>","help":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M9.6 9.3a2.5 2.5 0 0 1 4.8.9c0 1.7-2.4 2.2-2.4 3.8M12 17h.01\"/>","history":"<path d=\"M3.8 12.1a8.3 8.3 0 1 0 2.5-5.9L3.8 8.5M3.8 4.2v4.2h4.2\"/><path d=\"M12 7.9v4.3l3.1 1.9\"/>","home":"<path d=\"M3.6 10.6L12 3.3l8.4 7.3v8.4a1 1 0 0 1-1 1h-4.2v-6.3h-6.3v6.3H4.7a1 1 0 0 1-1-1Z\"/>","hot-tub":"<circle cx=\"8.6\" cy=\"5.8\" r=\"1.7\"/><path d=\"M3.8 11.9h16.6v3.3a4.2 4.2 0 0 1-4.2 4.2h-8.4A4.2 4.2 0 0 1 3.8 15.2ZM6.8 11.9v-1.4A2.4 2.4 0 0 1 8.9 8.2H9.4M13.7 9.5c0.8-0.9-0.8-1.9 0-2.8M17.3 9.5c0.8-0.9-0.8-1.9 0-2.8\"/>","hourglass":"<path d=\"M6 3.5h12M6 20.5h12M7.5 3.5c0 4.5 4.5 5.5 4.5 8.5s-4.5 4-4.5 8.5M16.5 3.5c0 4.5-4.5 5.5-4.5 8.5s4.5 4 4.5 8.5\"/>","id":"<rect x=\"3.7\" y=\"5.5\" width=\"16.7\" height=\"13\" rx=\"1.9\"/><circle cx=\"9.2\" cy=\"11\" r=\"1.9\"/><path d=\"M6.4 15.6c0.5-1.4 1.6-2.2 2.8-2.2s2.4 0.8 2.8 2.2M14.8 10.1h2.8M14.8 13.4h2.8\"/>","idea":"<path d=\"M9.1 17.6h5.8M10.1 20.5h3.9M8.7 14.3A5.8 5.8 0 1 1 15.2 14.3c-0.7 0.6-1.4 1.5-1.4 2.3h-3.9c0-0.9-0.7-1.7-1.4-2.3Z\"/>","image":"<rect x=\"3.5\" y=\"5.4\" width=\"16.7\" height=\"13\" rx=\"2.8\"/><circle cx=\"9.1\" cy=\"10\" r=\"1.5\"/><path d=\"M20.3 15.6l-4.7-4.7l-7.4 7.4\"/>","inbox":"<path d=\"M3.5 12.7L5.9 4.8h12.1l2.4 7.9V17.8a0.9 0.9 0 0 1-0.9 0.9H4.4a0.9 0.9 0 0 1-0.9-0.9ZM3.5 12.7h4.6l1.4 2.4h4.6l1.4-2.4h4.6\"/>","infinity":"<path d=\"M12 12c-1.8-2.4-3.3-3.6-4.9-3.6a3.6 3.6 0 0 0 0 7.2c1.6 0 3.1-1.2 4.9-3.6Zm0 0c1.8 2.4 3.3 3.6 4.9 3.6a3.6 3.6 0 0 0 0-7.2c-1.6 0-3.1 1.2-4.9 3.6Z\"/>","info":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 11v5M12 8h.01\"/>","invite":"<circle cx=\"9.2\" cy=\"8.2\" r=\"2.9\"/><path d=\"M3.8 18.8c0-3 2.4-4.8 5.3-4.8s5.3 2 5.3 4.8M17.9 8.2v5.3M15.3 10.9h5.3\"/>","key":"<circle cx=\"8.1\" cy=\"15.9\" r=\"4.3\"/><path d=\"M11.1 12.9l9.4-9.4M16.8 7.3l3.2 3.2M14.6 9.4l2.2 2.2\"/>","keyboard":"<rect x=\"3.5\" y=\"6.6\" width=\"17\" height=\"10.7\" rx=\"1.8\"/><path d=\"M6.6 10.2h0M9.3 10.2h0M12 10.2h0M14.7 10.2h0M17.4 10.2h0M8.4 13.8h7.2\"/>","language":"<path d=\"M4.6 5.4h8.4M8.8 3.6v1.9M6.4 5.4c0.5 2.8 2.3 5.6 5.6 7M11.1 5.4c-0.6 3.2-2.6 6.3-6 7.9M12 20.3l3.7-8.4l3.7 8.4M13.3 17.5h4.8\"/>","laugh":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M8 13.5h8a4 4 0 0 1-8 0ZM7.5 8.6l2.2 1.2-2.2 1.2M16.5 8.6l-2.2 1.2 2.2 1.2\"/>","layers":"<path d=\"M12 5.4l8.3 4.6l-8.3 4.6l-8.3-4.6Z\"/><path d=\"M3.8 14l8.3 4.6l8.3-4.6\"/>","leaf":"<path d=\"M3.8 20.1c0-9.5 5.6-15.2 16.7-16.7c-1 11.1-6.7 16.7-16.7 16.7ZM3.8 20.1l8.9-8.9\"/>","leave":"<path d=\"M12.7 3.5h4.2a2.1 2.1 0 0 1 2.1 2.1v12.7a2.1 2.1 0 0 1-2.1 2.1h-4.2M8.5 16.2l-4.2-4.2l4.2-4.2M4.2 12h10.6\"/>","lifebuoy":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"12\" r=\"3.8\"/><path d=\"M6 6l3.4 3.4M14.6 14.7l3.4 3.4M18 6l-3.4 3.4M9.4 14.7l-3.4 3.4\"/>","link":"<path d=\"M9.9 14.1a4.3 4.3 0 0 0 6.1 0l3.2-3.2a4.3 4.3 0 0 0-6.1-6.1l-1.1 1.1M14.1 9.9a4.3 4.3 0 0 0-6.1 0l-3.2 3.2a4.3 4.3 0 0 0 6.1 6.1l1.1-1.1\"/>","link-off":"<path d=\"M10 13.8a4 4 0 0 0 5.6 0l2.9-2.9a4 4 0 0 0-5.6-5.6l-1 1M13.8 10a4 4 0 0 0-5.6 0l-2.9 2.9a4 4 0 0 0 5.6 5.6l1-1\"/><path d=\"M3.6 3.6l16.7 16.7\"/>","list":"<path d=\"M8.2 5.5h11.9M8.2 12h11.9M8.2 18.5h11.9M3.3 5.5h0M3.3 12h0M3.3 18.5h0\"/>","list-ordered":"<path d=\"M9.7 6.8h10.8M9.7 12.8h10.8M9.7 18.8h10.8M3.8 5.4L4.7 5v4.4M3.8 9.3h2M3.8 13.7a1 1 0 0 1 2 0.3c0 1.1-2 1.7-2 2.7h2.2\"/>","live":"<circle cx=\"12\" cy=\"11.8\" r=\"2\"/><path d=\"M8.6 8.4a4.9 4.9 0 0 0 0 7.1M15.4 8.4a4.9 4.9 0 0 1 0 7.1M6.3 6.1a8.1 8.1 0 0 0 0 11.9M17.7 6.1a8.1 8.1 0 0 1 0 11.9\"/>","lock":"<rect x=\"4.7\" y=\"10.7\" width=\"14.5\" height=\"9.4\" rx=\"2.1\"/><path d=\"M7.8 10.7V7.5a4 4 0 0 1 8.3 0v3.2\"/>","lungs":"<path d=\"M12 3.5v8M12 9.4l-3 2.1M12 9.4l3 2.1M8.4 6.5C5.6 6.5 3.5 10.4 3.5 15.2c0 2.8 1.1 4.8 3.2 4.8s2.7-2.1 2.7-4.8V8.3M15.6 6.5C18.4 6.5 20.5 10.4 20.5 15.2c0 2.8-1.1 4.8-3.2 4.8s-2.7-2.1-2.7-4.8V8.3\"/>","mail":"<rect x=\"3.5\" y=\"5.5\" width=\"17\" height=\"13.2\" rx=\"1.9\"/><path d=\"M4.4 7.4l7.6 5.7l7.6-5.7\"/>","map":"<path d=\"M9.1 4.6L3.5 6.5v13l5.6-1.9l5.6 1.9l5.6-1.9V4.6l-5.6 1.9Z\"/><path d=\"M9.1 4.6v13M14.7 6.5v13\"/>","mask":"<path d=\"M3.5 7c3 1.3 5.8 1.8 8.5 1.8S17.5 8.3 20.5 7c0 6-2.5 10-5 10-1.4 0-2-1.5-3.5-1.5S9.9 17 8.5 17c-2.5 0-5-4-5-10Z\"/><path d=\"M7.5 11.5h2M14.5 11.5h2\"/>","medical":"<rect x=\"3.5\" y=\"7.1\" width=\"17\" height=\"12.3\" rx=\"1.9\"/><path d=\"M9.2 7.1V5.2a0.9 0.9 0 0 1 0.9-0.9h3.8a0.9 0.9 0 0 1 0.9 0.9v1.9M12 10.4v5.7M9.2 13.3h5.7\"/>","megaphone":"<path d=\"M3.6 9.5v4a1 1 0 0 0 1 1H7.1l9 4.5v-15L7.1 8.5H4.5a1 1 0 0 0-1 1Z\"/><path d=\"M7.1 14.5l1.3 5h2.4L10.1 15.1M19.1 9a3.2 3.2 0 0 1 0 5\"/>","members":"<circle cx=\"9.2\" cy=\"7.9\" r=\"3\"/><path d=\"M3.6 19.1c0-3.1 2.6-5.1 5.6-5.1s5.6 2.1 5.6 5.1M15.7 5a3 3 0 0 1 0 5.9M17.6 14.3c1.8 0.6 2.8 2.3 2.8 4.8\"/>","menu":"<path d=\"M3.5 6.7h17M3.5 12h17M3.5 17.3h17\"/>","mic":"<rect x=\"9.2\" y=\"3.5\" width=\"5.7\" height=\"10.4\" rx=\"2.8\"/><path d=\"M5.4 11.1a6.6 6.6 0 0 0 13.2 0M12 17.7v2.8\"/>","mic-off":"<rect x=\"9.2\" y=\"3.6\" width=\"5.7\" height=\"10.4\" rx=\"2.8\"/><path d=\"M5.5 11.1a6.6 6.6 0 0 0 11 5M18.7 11.1c0 0.8-0.1 1.5-0.4 2.2M12.1 17.7v2.8M4.5 4.5l15.1 15.1\"/>","minus":"<path d=\"M3.5 12h17\"/>","minus-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M8 12h8\"/>","money":"<rect x=\"3.5\" y=\"6.6\" width=\"17\" height=\"10.7\" rx=\"1.8\"/><circle cx=\"12\" cy=\"12\" r=\"2.2\"/><path d=\"M6.6 9.8v0M17.4 14.2v0\"/>","moon":"<path d=\"M20.5 14.6A8.6 8.6 0 1 1 9.4 3.5a6.9 6.9 0 0 0 11.2 11.2Z\"/>","more":"<circle cx=\"5.2\" cy=\"12\" r=\"1.6\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\"/><circle cx=\"18.8\" cy=\"12\" r=\"1.6\"/>","mountain":"<path d=\"M3.6 17.5L9.3 6l3.7 6.3L15.5 9.1L20.3 17.5Z\"/>","move":"<path d=\"M11.9 3.6v16.7M3.6 11.9h16.7M9 6.5l2.9-2.9l2.9 2.9M9 17.3l2.9 2.9l2.9-2.9M6.5 9l-2.9 2.9l2.9 2.9M17.3 9l2.9 2.9l-2.9 2.9\"/>","mug":"<path d=\"M4.8 9.1h11v7a4 4 0 0 1-4 4h-3a4 4 0 0 1-4-4Z\"/><path d=\"M15.8 10.5H17.3a2.5 2.5 0 0 1 0 5h-1.5M8.3 3.5c-0.8 1 0.8 2 0 3M11.8 3.5c-0.8 1 0.8 2 0 3\"/>","music":"<path d=\"M8.6 17.7V5.6l11.1-2.1v12.2\"/><circle cx=\"6\" cy=\"17.7\" r=\"2.6\"/><circle cx=\"17.2\" cy=\"15.7\" r=\"2.6\"/>","mute":"<path d=\"M3.9 9.4h3.6L12.2 5.8v12.4l-4.6-3.6H3.9Z\"/><path d=\"M16.3 9.9l4.1 4.1M20.5 9.9l-4.1 4.1\"/>","news":"<path d=\"M3.5 3.5h13.8v14.9a2.1 2.1 0 0 0 2.1 2.1H5.6a2.1 2.1 0 0 1-2.1-2.1Z\"/><path d=\"M17.3 7.7h3.2v10.6a2.1 2.1 0 0 1-2.1 2.1M7.2 7.7h6.4M7.2 11.5h6.4M7.2 15.2h3.7\"/>","nodes":"<circle cx=\"12\" cy=\"5.4\" r=\"2.1\"/><circle cx=\"5.8\" cy=\"17.9\" r=\"2.1\"/><circle cx=\"18.2\" cy=\"17.9\" r=\"2.1\"/><path d=\"M11 7.4L6.8 15.9M13 7.4l4.3 8.6M7.9 17.9h8.3\"/>","open":"<path d=\"M14 3.8h6.3v6.3M20.2 3.8l-9.4 9.4M18.2 14.2v4.2a2.1 2.1 0 0 1-2.1 2.1H5.6a2.1 2.1 0 0 1-2.1-2.1V7.9a2.1 2.1 0 0 1 2.1-2.1h4.2\"/>","palette":"<path d=\"M12.2 3.8a8.4 8.4 0 1 0 0 16.8c1.1 0 1.7-0.9 1.7-1.6c0-1.1-0.9-1.5-0.9-2.6s0.9-1.6 1.9-1.6H16.9a3.7 3.7 0 0 0 3.7-3.7C20.6 7.2 16.9 3.8 12.2 3.8Z\"/><circle cx=\"8\" cy=\"11.4\" r=\"1.1\"/><circle cx=\"10.3\" cy=\"7.9\" r=\"1.1\"/><circle cx=\"14.5\" cy=\"7.9\" r=\"1.1\"/>","parking":"<rect x=\"3.7\" y=\"3.7\" width=\"16.7\" height=\"16.7\" rx=\"3\"/><path d=\"M9.6 17V7.2h3.4a3 3 0 0 1 0 5.9H9.6\"/>","pause":"<path d=\"M7.1 3.5v17M16.9 3.5v17\"/>","paw":"<path d=\"M7.8 18.5c0-3 1.9-5.3 4.2-5.3s4.2 2.3 4.2 5.3c0 1.4-1.1 2.1-2.1 2.1c-0.8 0-1.4-0.5-2.1-0.5s-1.3 0.5-2.1 0.5c-1.1 0-2.1-0.7-2.1-2.1Z\"/><circle cx=\"5.4\" cy=\"10.6\" r=\"1.9\"/><circle cx=\"9.2\" cy=\"5.7\" r=\"1.9\"/><circle cx=\"14.8\" cy=\"5.7\" r=\"1.9\"/><circle cx=\"18.6\" cy=\"10.6\" r=\"1.9\"/>","pencil":"<path d=\"M11.9 19.6h8.4M16.1 4.2a2 2 0 0 1 2.8 2.8L7.2 18.7l-3.7 0.9l0.9-3.7Z\"/>","phone":"<path d=\"M5.7 3.4h3.9l2 4.9l-2.5 1.5a10.8 10.8 0 0 0 4.9 4.9L15.6 12.3l4.9 2v3.9a2 2 0 0 1-2 2A15.8 15.8 0 0 1 3.8 5.4a2 2 0 0 1 2-2\"/>","phone-off":"<path d=\"M5.6 4.1h3.7l1.9 4.7l-2.4 1.4a10.3 10.3 0 0 0 4.7 4.7L15.1 12.5l4.7 1.9v3.7a1.9 1.9 0 0 1-1.9 1.9A15.1 15.1 0 0 1 3.8 5.9a1.9 1.9 0 0 1 1.9-1.9\"/><path d=\"M4.3 3.6l16.1 16.1\"/>","piggy":"<path d=\"M3.5 11.4c0-3.2 3.3-5.7 7.7-5.7c1.3 0 2.4 0.2 3.4 0.6L17.4 4.7v3.3c0.8 0.7 1.4 1.6 1.6 2.5h1.4v3.4H18.8c-0.5 1-1.3 1.7-2.3 2.3V19.1h-2.9v-1.9c-0.8 0.2-1.7 0.3-2.5 0.3c-0.8 0-1.6-0.1-2.3-0.3v1.9h-2.9v-2.9C4.4 15.1 3.5 13.4 3.5 11.4Z\"/><path d=\"M14.9 10.1h0M8.7 8.1h2.9\"/>","pin":"<path d=\"M12 20.7s-6.2-5.4-6.2-10.5a6.2 6.2 0 0 1 12.4 0C18.2 15.2 12 20.7 12 20.7Z\"/><circle cx=\"12\" cy=\"10\" r=\"2.3\"/>","plane":"<path d=\"M20 4L3.5 10.8l6.6 3.1l3.1 6.6Z\"/><path d=\"M10.1 13.9l9.9-9.9\"/>","play":"<path d=\"M5.6 3.6v16.9l13.4-8.5Z\"/>","plug":"<path d=\"M9.2 4v4.6M14.8 4v4.6M6.9 8.7h10.2v2.8a5.1 5.1 0 0 1-10.2 0ZM12 16.6V20.7\"/>","plus":"<path d=\"M12 3.5v17M3.5 12h17\"/>","plus-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 8v8M8 12h8\"/>","print":"<path d=\"M7.1 8.9V3.5h9.9V8.9\"/><rect x=\"3.6\" y=\"8.9\" width=\"16.7\" height=\"7.9\" rx=\"2\"/><path d=\"M7.1 13.8h9.9v6.4H7.1ZM16.4 11.9h0\"/>","puzzle":"<path d=\"M3.8 7h4.2a2.6 2.6 0 1 1 4.8 0h4.2v4.2a2.6 2.6 0 1 1 0 4.8v4.2h-4.2a2.6 2.6 0 1 0-4.8 0H3.8v-4.2a2.6 2.6 0 1 0 0-4.8Z\"/>","quote":"<path d=\"M9.8 6.2C5.8 7.2 3.6 10 3.6 13.9v3.3h5.6v-5.6h-5.6M20.3 6.2c-3.9 1.1-6.1 3.9-6.1 7.8v3.3h5.6v-5.6h-5.6\"/>","radio":"<rect x=\"3.5\" y=\"8.3\" width=\"16.8\" height=\"11.3\" rx=\"1.9\"/><path d=\"M7.3 8.3L16.7 3.9\"/><circle cx=\"15.3\" cy=\"14\" r=\"2.4\"/><path d=\"M6.8 12.4h3.8M6.8 15.4h3.8\"/>","ranking":"<path d=\"M3.5 19.9h17M4.5 19.9V13.8h4.7M9.2 19.9V10h5.7v9.9M14.9 19.9V15.7h4.7v4.3\"/><path d=\"M12 3.4l0.9 1.7l1.9 0.3l-1.4 1.3l0.3 1.9L12 7.7l-1.7 0.9l0.3-1.9L9.3 5.4l1.9-0.3Z\"/>","record":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>","recycle":"<path d=\"M7.8 18.2H5.7a1.2 1.2 0 0 1-1-1.8l2.3-3.9M10 5.5l0.9-1.5a1.2 1.2 0 0 1 2.1 0l2.3 3.9M17.7 12.4l1.6 2.7a1.2 1.2 0 0 1-1 1.8h-4.5\"/><path d=\"M11.1 16.5l1.8 1.8l-1.8 1.8M4.5 10.4l2.4-0.7l0.7 2.5M17.2 6.1l-0.7 2.5l-2.5-0.7\"/>","reply":"<path d=\"M9.2 5.8L4 11l5.1 5.1M4 11h10.3a6.2 6.2 0 0 1 6.2 6.2v1\"/>","restroom":"<circle cx=\"7.1\" cy=\"5.3\" r=\"1.7\"/><circle cx=\"16.4\" cy=\"5.3\" r=\"1.7\"/><path d=\"M11.7 3.6v16.7M5.6 20.3v-5.1H4.7V10.6A1.4 1.4 0 0 1 6.1 9.2h1.9a1.4 1.4 0 0 1 1.4 1.4v4.6H8.5V20.3M15.5 20.3v-3.7h-2.4l1.9-6.1a0.9 0.9 0 0 1 0.9-0.9h0.9a0.9 0.9 0 0 1 0.9 0.9l1.9 6.1H17.3v3.7\"/>","retry":"<path d=\"M3.7 12a8.2 8.2 0 0 1 14.1-5.9L20.2 8.4M20.2 3.8v4.6h-4.6M20.2 12a8.2 8.2 0 0 1-14.1 5.9L3.7 15.6M3.7 20.3v-4.6h4.6\"/>","rewind":"<path d=\"M20 6.4v11.2L12.4 12ZM10.9 6.4v11.2L3.3 12Z\"/>","road":"<path d=\"M8.2 3.5L4.4 20.5M15.8 3.5l3.8 17M12 4.4v2.4M12 10.6v2.8M12 17.2V19.6\"/>","robot":"<rect x=\"5.4\" y=\"8.3\" width=\"13.2\" height=\"10.4\" rx=\"2.8\"/><path d=\"M12 4.6v3.8M9.2 13.1h0M14.8 13.1h0M9.6 16.4h4.7M3.5 13.1v1.9M20.5 13.1v1.9\"/>","rocket":"<path d=\"M11.8 15.7L8.4 12.3C9.9 6.9 13.8 3.9 20.2 3.9C20.2 10.3 17.3 14.2 11.8 15.7ZM8.4 12.3L4.9 11.8L7.4 8.3h3.9M11.8 15.7l0.5 3.4l3.4-2.5v-3.9M6.4 17.7c-1.5 0-3 1.5-3 3c1.5 0 3-1.5 3-3Z\"/><circle cx=\"15.3\" cy=\"8.8\" r=\"1.5\"/>","route":"<circle cx=\"6\" cy=\"18\" r=\"2.4\"/><circle cx=\"18\" cy=\"6\" r=\"2.4\"/><path d=\"M8.4 18H16a3 3 0 0 0 0-6H8a3 3 0 0 1 0-6h7.6\"/>","rss":"<path d=\"M4 3.5a16.5 16.5 0 0 1 16.5 16.5M4 10.4A9.6 9.6 0 0 1 13.6 20.1\"/><path d=\"M4.6 19.4h0\" stroke-width=\"3.9\"/>","save":"<path d=\"M4.7 3.5h11.5l3.2 3.2v13.6H4.7Z\"/><path d=\"M7.8 3.5v5.2h7.3V3.5M7.8 20.2v-6.3h8.4v6.3\"/>","scale":"<path d=\"M12 4.3V19.5M8.5 19.5h6.9M5.5 7.4h13M12 4.3h0M3.7 13.4L5.9 7.8L8.1 13.4M15.9 13.4L18.1 7.8l2.2 5.6M3.7 13.4a2.2 2.2 0 0 0 4.3 0M15.9 13.4a2.2 2.2 0 0 0 4.3 0\"/>","scissors":"<circle cx=\"6\" cy=\"7\" r=\"2.6\"/><circle cx=\"6\" cy=\"17\" r=\"2.6\"/><path d=\"M8.2 8.6 20 18M8.2 15.4 20 6\"/>","scroll":"<path d=\"M8.3 3.8h10.1a1.9 1.9 0 0 1 1.9 1.9v1.5H17M8.3 3.8a1.9 1.9 0 0 0-1.9 1.9v11.7a2.9 2.9 0 0 1-2.9 2.9h10.7a2.9 2.9 0 0 0 2.9-2.9v-11.7a1.9 1.9 0 0 0-1.9-1.9M10.2 9.2h3.9M10.2 13h3.9\"/>","search":"<circle cx=\"10.6\" cy=\"10.6\" r=\"7\"/><path d=\"M20.4 20.4l-4.5-4.5\"/>","seedling":"<path d=\"M12 20.8v-9.8M12 11C12 6.7 9.3 4 4.4 4c0 4.3 2.7 7 7.6 7ZM12 13.7c0-4.3 2.7-7 7.6-7c0 4.3-2.7 7-7.6 7Z\"/>","server":"<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"7.4\" rx=\"2.1\"/><rect x=\"3.5\" y=\"13.1\" width=\"17\" height=\"7.4\" rx=\"2.1\"/><path d=\"M7.8 7.2h0M7.8 16.8h0\"/>","shapes":"<circle cx=\"7.5\" cy=\"7.7\" r=\"3.4\"/><path d=\"M16.4 3.7l3.9 6.9h-7.9ZM13.9 14.1h5.9v5.9h-5.9ZM3.6 20l3.4-5.9l3.4 5.9Z\"/>","share":"<path d=\"M12 15.2V3.3M7.4 8.1L12 3.3L16.6 8.1M4.9 12.9v6.1a1 1 0 0 0 1 1h12.2a1 1 0 0 0 1-1v-6.1\"/>","shelter":"<path d=\"M3.7 10.5L12 4l8.3 6.5M5.9 9.2v10.4M18.1 9.2v10.4\"/><circle cx=\"12\" cy=\"11\" r=\"1.6\"/><path d=\"M9.8 19.6v-3.9a2.2 2.2 0 0 1 4.3 0V19.6\"/>","shield":"<path d=\"M12 3.7L5.5 6.6v5.6c0 4.1 2.8 7.1 6.5 8.4c3.7-1.3 6.5-4.2 6.5-8.4V6.6Z\"/>","shirt":"<path d=\"M8.2 3.8L3.7 6.6l1.8 3.8l1.8-0.9v11.2h9.3V9.4l1.8 0.9l1.8-3.8l-4.7-2.7c-0.5 1.4-1.8 2.3-3.8 2.3S8.8 5.1 8.2 3.8Z\"/>","signature":"<path d=\"M3.9 14c2.4 0 3.3-8.4 5.6-8.4c1.4 0 0.9 5.6 2.4 5.6c0.9 0 1.4-2.4 2.4-2.4s0.8 1.9 1.9 1.9c0.8 0 1.4-0.6 1.9-1.1M3.9 17.8h16.7\"/>","skip":"<path d=\"M4.8 3.5l10.8 8.4l-10.8 8.4Z\"/><path d=\"M19.7 3.5v16.7\"/>","skull":"<path d=\"M12 3.7a6.5 6.5 0 0 0-6.5 6.5c0 2.2 1 3.6 2.4 4.6v2.8h8.4v-2.8c1.3-1 2.4-2.6 2.4-4.6a6.5 6.5 0 0 0-6.5-6.5Z\"/><circle cx=\"9.6\" cy=\"10.7\" r=\"1.3\"/><circle cx=\"14.4\" cy=\"10.7\" r=\"1.3\"/><path d=\"M10.6 17.7v2.8M13.4 17.7v2.8\"/>","slash":"<path d=\"M3.6 3.6l16.7 16.7\"/>","sliders":"<path d=\"M3.5 6.8h10M18.7 6.8H20.3M3.5 17.2h3.6M12.4 17.2H20.3\"/><circle cx=\"16.2\" cy=\"6.8\" r=\"2.4\"/><circle cx=\"9.8\" cy=\"17.2\" r=\"2.4\"/>","smile":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M8.5 14a4 4 0 0 0 7 0M9 9.5h.01M15 9.5h.01\"/>","snow":"<path d=\"M12 3.5v17M4.6 7.8l14.7 8.5M4.6 16.3l14.7-8.5M9.6 4.9L12 7.3l2.4-2.4M9.6 19.1L12 16.7l2.4 2.4\"/>","sort":"<path d=\"M3.5 5.8h9.2M3.5 12h6.2M3.5 18.2h3M17.5 4.8v14.4M14.3 16.2l3 3l3-3\"/>","sort-asc":"<path d=\"M3.4 5.4h3M3.4 11.6h6.3M3.4 17.9h9.3M17.5 4.3v14.6M14.3 16l3 3l3-3\"/>","spark":"<path d=\"M10.4 3.6l1.7 4.8L17 10.1l-4.8 1.7L10.4 16.7l-1.7-4.8L3.9 10.1l4.8-1.7ZM17 14.8l0.8 2.1L19.8 17.6l-2.1 0.8L17 20.3l-0.8-2.1L14.3 17.6l2.1-0.8Z\"/>","square":"<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"2.7\"/>","star":"<path d=\"M12 4l2.6 5.3l5.7 0.6l-4.3 3.9l1.2 5.7L12 16.8l-5.2 2.9l1.2-5.7l-4.3-3.9l5.7-0.6Z\"/>","steps":"<path d=\"M9.7 5.7h11M9.7 11.8h11M9.7 17.8h11\"/><path d=\"M3.7 5.7l1.5 1.5L7.7 4.8M3.7 11.8l1.5 1.5L7.7 10.8M3.7 17.8l1.5 1.5L7.7 16.8\"/>","stop":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m8.5 8.5 7 7\"/>","store":"<path d=\"M3.7 8.8L5.3 3.7h13.4L20.3 8.8M3.7 8.8h16.5v1.6a2.8 2.8 0 0 1-5.4 0a2.8 2.8 0 0 1-5.6 0A2.8 2.8 0 0 1 3.7 10.4ZM4.8 12.9v7.2h14.5v-7.2M9.9 20.1v-4.1h4.1v4.1\"/>","storm":"<path d=\"M7.8 16a3.8 3.8 0 1 1 0.8-7.4A4.5 4.5 0 0 1 17.4 10.5a3.1 3.1 0 0 1-0.4 6.2\"/><path d=\"M12.9 12.2l-2.1 3.3h2.5L11.3 18.9\"/>","sun":"<circle cx=\"11.9\" cy=\"11.9\" r=\"3.4\"/><path d=\"M11.9 3.5v1.8M11.9 18.6v1.8M6 6l1.2 1.2M16.7 16.7l1.2 1.2M3.5 11.9h1.8M18.6 11.9h1.8M6 17.9l1.2-1.2M16.7 7.2l1.2-1.2\"/>","swap":"<path d=\"M3.5 7.8h14.9l-3.7-3.7M20.5 16.3H5.6l3.7 3.7\"/>","sword":"<path d=\"M20.3 3.7v3.7L10.4 17.3L6.7 13.6L16.7 3.7Z\"/><path d=\"M5.2 12L12 18.8M8.3 15.7L3.6 20.4\"/>","table":"<rect x=\"3.5\" y=\"4.3\" width=\"17\" height=\"15.1\" rx=\"1.9\"/><path d=\"M3.5 9.5h17M3.5 14.7h17M9.2 9.5V19.4M14.8 9.5V19.4\"/>","tack":"<path d=\"M9.3 4h5.6l-0.9 4.6l2.8 2.8H7.4l2.8-2.8ZM12 11.4v9.3\"/>","tag":"<path d=\"M3.8 11.2V3.8h7.4l9.3 9.3l-7.4 7.4Z\"/><circle cx=\"8\" cy=\"8\" r=\"1.2\"/>","target":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"12\" r=\"5\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\"/>","tent":"<path d=\"M3.5 18.4h17M12 4.9L4.8 18.4M12 4.9l7.2 13.4M12 12.5L9.3 18.4M12 12.5l2.7 5.8\"/>","terminal":"<rect x=\"3.7\" y=\"4.6\" width=\"16.7\" height=\"14.9\" rx=\"1.9\"/><path d=\"M7.4 9.2l2.8 2.8l-2.8 2.8M12.9 14.8h3.7\"/>","text":"<path d=\"M5.2 20.3L10.9 3.6h2.1l5.7 16.7M7.4 14h9.2\"/>","thumbs-up":"<path d=\"M7.3 10.4v9.6H4.8a1 1 0 0 1-1-1v-7.6a1 1 0 0 1 1-1Z\"/><path d=\"M7.3 10.4L10.9 3.3a2.2 2.2 0 0 1 2.5 2.6L12.7 9.4H18.5a2 2 0 0 1 2 2.4l-1.3 6.6a2 2 0 0 1-2 1.6H7.3\"/>","ticket":"<path d=\"M3.6 7.4h16.7v2.8a1.9 1.9 0 0 0 0 3.7v2.8H3.6v-2.8a1.9 1.9 0 0 0 0-3.7Z\"/><path d=\"M13.8 7.4v9.3\"/>","timeline":"<path d=\"M3.5 12h0.9M8.2 12h1.9M13.9 12h1.9M19.6 12h0.9\"/><circle cx=\"6.3\" cy=\"12\" r=\"1.9\"/><circle cx=\"12\" cy=\"12\" r=\"1.9\"/><circle cx=\"17.7\" cy=\"12\" r=\"1.9\"/><path d=\"M6.3 10.1V5.9M12 13.9v4.3M17.7 10.1V5.9\"/>","toolbox":"<rect x=\"3.5\" y=\"8.1\" width=\"17\" height=\"11.3\" rx=\"1.9\"/><path d=\"M9.2 8.1V5.8A1.4 1.4 0 0 1 10.6 4.3h2.8A1.4 1.4 0 0 1 14.8 5.8V8.1M3.5 12.8h17M8.2 11.4v2.8M15.8 11.4v2.8\"/>","train":"<rect x=\"6.4\" y=\"3.8\" width=\"11.2\" height=\"12.1\" rx=\"2.8\"/><path d=\"M6.4 10.3h11.2M9.2 13.1h0M14.8 13.1h0M8.7 20.5l1.9-3.3M15.3 20.5l-1.9-3.3\"/>","trash":"<path d=\"M4.1 6.7h15.8M10 10.6v5.9M14 10.6v5.9M6.1 6.7l1 11.8a2 2 0 0 0 2 2h5.9a2 2 0 0 0 2-2l1-11.8M9 6.7V3.7h5.9v3\"/>","tree":"<path d=\"M12.1 3.6L7 10.6h2.8L5.6 16.6h13l-4.2-6h2.8ZM12.1 16.6v3.7\"/>","trend-down":"<path d=\"M3.2 7.2l5.6 5.6l3.8-3.8l7.4 7.4\"/><path d=\"M14.4 16.6h5.6v-5.6\"/>","trend-up":"<path d=\"M3.2 16.8L8.8 11.3l3.8 3.8l7.4-7.4\"/><path d=\"M14.4 7.4h5.6v5.6\"/>","trophy":"<path d=\"M7.9 4h8.4v5.2a4.1 4.1 0 0 1-8.4 0ZM7.9 6.1H4.7a3.2 3.2 0 0 0 3.2 4.1M16.2 6.1h3.2a3.2 3.2 0 0 1-3.2 4.1M12 13.4v4.1M7.9 20.8h8.4\"/>","tv":"<rect x=\"3.5\" y=\"7.8\" width=\"17\" height=\"11.6\" rx=\"1.8\"/><path d=\"M8.4 4.3l3.6 3.6l3.6-3.6\"/>","umbrella":"<path d=\"M3.8 12.5a8.4 8.4 0 0 1 16.6 0ZM12.1 12.5v6a1.9 1.9 0 0 1-3.7 0M12.1 4.1v0\"/>","undo":"<path d=\"M9.2 14.2L4 8.9l5.2-5.2\"/><path d=\"M4 8.9h11a5.8 5.8 0 0 1 0 11.5H11.3\"/>","up":"<path d=\"M3.7 16.1l8.3-8.3l8.3 8.3\"/>","upload":"<path d=\"M12 20.8V9.2M6.8 14.5l5.2-5.2l5.2 5.2M4.7 4h14.7\"/>","user":"<circle cx=\"12\" cy=\"7.4\" r=\"3.8\"/><path d=\"M4.3 20.5c0-3.9 3.4-6.6 7.7-6.6s7.7 2.6 7.7 6.6\"/>","user-check":"<circle cx=\"9.2\" cy=\"8.1\" r=\"2.8\"/><path d=\"M4 19c0-2.9 2.4-4.9 5.4-4.9s5.4 1.9 5.4 4.9M15.4 10.8l1.8 1.8l3.6-3.6\"/>","user-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/><path d=\"M6.6 18.3a6.5 6.5 0 0 1 10.8 0\"/>","user-lock":"<circle cx=\"9.8\" cy=\"7.3\" r=\"3.3\"/><path d=\"M3.5 18.8c0-3.4 2.8-5.7 6.2-5.7c1.2 0 2.2 0.3 3.1 0.7\"/><rect x=\"14.6\" y=\"14.5\" width=\"5.7\" height=\"4.8\" rx=\"1\"/><path d=\"M16 14.5v-1.2a1.5 1.5 0 0 1 2.9 0v1.2\"/>","user-minus":"<circle cx=\"10.1\" cy=\"8\" r=\"3.3\"/><path d=\"M4 19.3c0-3.3 2.7-5.7 6.1-5.7c1.1 0 2.2 0.3 3 0.7\"/><path d=\"M15.1 17h5.7\"/>","user-off":"<circle cx=\"12\" cy=\"8.2\" r=\"3.5\"/><path d=\"M5.1 20c0-3.6 3-5.9 6.9-5.9s6.9 2.3 6.9 5.9\"/><path d=\"M3.7 3.7l16.7 16.7\"/>","user-pen":"<circle cx=\"9.8\" cy=\"8\" r=\"3.3\"/><path d=\"M3.8 19.1c0-3.3 2.7-5.6 6-5.6c1.1 0 2.1 0.3 3 0.7\"/><path d=\"M19.1 12.1l1.4 1.4l-4.7 4.7l-1.9 0.5l0.5-1.9Z\"/>","user-tag":"<circle cx=\"10\" cy=\"7.6\" r=\"3.3\"/><path d=\"M3.8 18.9c0-3.3 2.8-5.6 6.1-5.6c1.1 0 2.2 0.3 3.1 0.7\"/><path d=\"M14.2 14.2h3.7l2.4 2.4l-2.4 2.4h-3.7Z\"/><path d=\"M16.1 16.5h0\"/>","video":"<rect x=\"3.4\" y=\"6.4\" width=\"12.3\" height=\"11.3\" rx=\"1.9\"/><path d=\"M15.6 10.2l4.7-2.8v9.4l-4.7-2.8\"/>","volume":"<path d=\"M3.5 9.5h3.7L11.8 5.8v12.6l-4.7-3.7H3.5Z\"/><path d=\"M15.5 9.5a3.7 3.7 0 0 1 0 5.2M18.1 6.9a7.3 7.3 0 0 1 0 10.5\"/>","walk":"<circle cx=\"12.3\" cy=\"5.1\" r=\"1.7\"/><path d=\"M8.8 20.3l2.4-5.5l1.9 2.2V20.3M11 14.8l0.9-5.2l-2.7 1.4l-1.4 2.7M11.9 9.6l1.8 2.7l2.7 0.9\"/>","wallet":"<path d=\"M3.5 6.8A2.7 2.7 0 0 1 6.2 4.2H18.4v4.2M3.5 6.8V18a2.1 2.1 0 0 0 2.1 2.1h14.9V8.4H6.2A2.7 2.7 0 0 1 3.5 6.8Z\"/><path d=\"M16.2 14.2h0\"/>","water":"<path d=\"M3.5 10.2c2.1 0 2.1-1.8 4.3-1.8s2.1 1.8 4.2 1.8s2.1-1.8 4.3-1.8s2.1 1.8 4.2 1.8M3.5 15.6c2.1 0 2.1-1.8 4.3-1.8s2.1 1.8 4.2 1.8s2.1-1.8 4.3-1.8s2.1 1.8 4.2 1.8\"/>","wave":"<path d=\"M3.7 16.2c2.1 0 2.1-1.7 4.2-1.7s2.1 1.7 4.2 1.7s2.1-1.7 4.2-1.7s2.1 1.7 4.2 1.7\"/><path d=\"M6.5 12.7A5.6 5.6 0 0 1 16.4 9.4c-1.9-0.4-3.5 0.3-4 2\"/>","weight":"<circle cx=\"12\" cy=\"5.2\" r=\"2\"/><path d=\"M7.1 8.7h9.9l3 11.3H4.1Z\"/>","wifi":"<path d=\"M3.7 9.4a12.4 12.4 0 0 1 16.7 0M6.4 12.5a8.4 8.4 0 0 1 11.5 0M9.1 15.6a4.4 4.4 0 0 1 6.2 0M12.1 18.6h0\"/>","wind":"<path d=\"M3.5 9.9h10.4a2.8 2.8 0 1 0-2.8-2.8M3.5 13.7h14.2a2.8 2.8 0 1 1-2.8 2.8M3.5 17.5h6.6\"/>","window":"<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M3.5 9h17\"/>","window-restore":"<rect x=\"3.5\" y=\"8.5\" width=\"12\" height=\"11\" rx=\"2\"/><path d=\"M8.5 8.5v-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3\"/>","wizard":"<path d=\"M3.6 20h16.7M6.3 20L9.9 9.1L15.7 3.3L14.1 10.1L17.8 20\"/><path d=\"M8.4 15.4h7.3\"/>","wrench":"<path d=\"M14.6 3.6a5.2 5.2 0 0 0-4.6 7.3L3.7 17.3V20.3h3.1l6.4-6.4a5.2 5.2 0 0 0 7.3-4.6l-3.2 1.2l-2.5-2.5l1.2-3.2Z\"/>","x-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m9 9 6 6M15 9l-6 6\"/>","zap":"<path d=\"M13.4 3.5L5.9 12.9h5.7l-0.9 7.6l7.6-9.4h-5.7Z\"/>"};
++ const S = {"airplane":"<path d=\"M11.8 2.6c1.3 0 2 1.2 2 3V9.5l7.2 4.2v2.5L13.8 13.7v3.5l2 1.5v2.5L11.8 19.7l-3.7 1.2v-2.5l2-1.5v-3.5l-7.2 2.5v-2.5L9.8 9.5V5.3c0-1.8 0.7-3 2-3Z\"/>","alert":"<path fill-rule=\"evenodd\" d=\"M10.5 4.1a1.7 1.7 0 0 1 3 0l7.7 13.3a1.7 1.7 0 0 1-1.5 2.6H4.3a1.7 1.7 0 0 1-1.5-2.6ZM11 8.8h2v5.2h-2ZM12 15.2a1.2 1.2 0 1 1 0 2.4a1.2 1.2 0 0 1 0-2.4Z\"/>","alert-circle":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM11.7 6.9h2.5v7.1h-2.5ZM12.9 15.3a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3Z\"/>","archive":"<rect x=\"2.6\" y=\"3.4\" width=\"18.8\" height=\"5.4\" rx=\"1.2\"/><path fill-rule=\"evenodd\" d=\"M4.4 10h15.2v9.2a1.6 1.6 0 0 1-1.6 1.6H6a1.6 1.6 0 0 1-1.6-1.6ZM9.6 12.4v1.8h4.8v-1.8Z\"/>","bell":"<path d=\"M5.2 15.4V9.6a6.8 6.8 0 0 1 13.7 0v5.7l1.9 2.6H3.3ZM9.7 19.3h4.6a2.3 2.3 0 0 1-4.6 0Z\"/>","book":"<path d=\"M4.3 5.2A2.4 2.4 0 0 1 6.8 2.7h12.2v14.6H6.8a2.4 2.4 0 0 0-2.4 2.4Z\"/><path class=\"ln\" d=\"M7.2 20.2h11.2\"/>","book-open":"<path d=\"M10.9 5.8C8.8 4.4 6 3.8 2.5 4.5v14c3.5-0.6 6.3 0 8.4 1.5ZM13.1 5.8c2.1-1.5 5-2 8.4-1.4v14c-3.5-0.6-6.3 0-8.4 1.5Z\"/>","box":"<path d=\"M12 2.7l9.4 4.5l-9.4 4.5l-9.4-4.5ZM2.6 8.9l8.6 4.1v8.2l-8.6-4.3ZM21.4 8.9l-8.6 4.1v8.2l8.6-4.3Z\"/>","brain":"<path d=\"M8.9 3.8a3.2 3.2 0 0 0-3.2 3.1a3.1 3.1 0 0 0-2.2 5.3a3.1 3.1 0 0 0 2.2 5.2a3.2 3.2 0 0 0 5.7 1.3V5.6A2.3 2.3 0 0 0 8.9 3.8Z\"/><path d=\"M15.1 3.8a3.2 3.2 0 0 1 3.2 3.1a3.1 3.1 0 0 1 2.2 5.3a3.1 3.1 0 0 1-2.2 5.2a3.2 3.2 0 0 1-5.7 1.3V5.6A2.3 2.3 0 0 1 15.1 3.8Z\"/>","bridge":"<path d=\"M5.7 4.6h2.6v15.4H5.7ZM15.7 4.6h2.6v15.4h-2.6ZM3.4 14.6h17.2v2.8H3.4Z\"/><path class=\"ln\" d=\"M4 10c1.6 0 2.5-2.3 3-5c2.4 5.2 7.6 5.2 10 0c.5 2.7 1.4 5 3 5M12 10.9V15\"/>","briefcase":"<path d=\"M2.7 9.1a2.5 2.5 0 0 1 2.5-2.5h13.6a2.5 2.5 0 0 1 2.5 2.5v2.8H2.7ZM2.7 13.1h7.2v1.5h4.3v-1.5h7.2V17.9a2.5 2.5 0 0 1-2.5 2.5H5.2a2.5 2.5 0 0 1-2.5-2.5Z\"/><path class=\"ln\" d=\"M9.1 6.6V5.7A1.5 1.5 0 0 1 10.5 4.2h2.9A1.5 1.5 0 0 1 14.9 5.7v0.9\"/>","bug":"<path fill-rule=\"evenodd\" d=\"M12 7a4.8 4.8 0 0 1 4.8 4.8v3.4a4.8 4.8 0 0 1-9.6 0v-3.4A4.8 4.8 0 0 1 12 8Zm-0.7 4.4v7.4h1.4v-7.4Z\"/><path d=\"M9.4 5.8a2.6 2.6 0 0 1 5.2 0Z\"/><path class=\"ln\" d=\"M7.2 12.5H3.8M20.2 12.5h-3.4M7.6 9.4L5 7M16.4 9.4L19 7M7.6 16.6L5 19M16.4 16.6L19 19\"/>","burst":"<path d=\"M12.1 2.6l2 4.6l4.7-1.9l-1.9 4.7l4.6 2l-4.6 2l1.9 4.7l-4.7-1.9l-2 4.6l-2-4.6l-4.7 1.9l1.9-4.7L2.7 12l4.6-2l-1.9-4.7l4.7 1.9Z\"/>","calendar":"<path fill-rule=\"evenodd\" d=\"M4.1 8.1a2 2 0 0 1 2-2h11.8a2 2 0 0 1 2 2V19.5a2 2 0 0 1-2 2H6.1a2 2 0 0 1-2-2Zm2.2 3.9V19.3h11.4v-7.3Z\"/><path class=\"ln\" d=\"M9 3.9v3.5M15 3.9v3.5\"/>","camera":"<path fill-rule=\"evenodd\" d=\"M2.5 7.8a1.9 1.9 0 0 1 1.9-1.9h2.6L8.8 3.3h6.3l1.8 2.6h2.6A1.9 1.9 0 0 1 21.5 7.8v10.7a1.9 1.9 0 0 1-1.9 1.9H4.4A1.9 1.9 0 0 1 2.5 18.5Zm9.5 2a3.6 3.6 0 1 0 0 7.2a3.6 3.6 0 0 0 0-7.2Z\"/>","camera-flip":"<path fill-rule=\"evenodd\" d=\"M2.5 7.8a1.9 1.9 0 0 1 1.9-1.9h2.6L8.8 3.3h6.3l1.8 2.6h2.6A1.9 1.9 0 0 1 21.5 7.8v10.7a1.9 1.9 0 0 1-1.9 1.9H4.4A1.9 1.9 0 0 1 2.5 18.5ZM7.7 11.7A4.5 4.5 0 0 1 16.3 11.7L13.9 12.6A2 2 0 0 0 10.1 12.6ZM16.3 14.8A4.5 4.5 0 0 1 7.7 14.8L10.1 14A2 2 0 0 0 13.9 14Z\"/>","camera-off":"<path d=\"M8.5 4.6L9 3.8h6.1l1.7 2.5h2.5A1.8 1.8 0 0 1 21.2 8.1v9.1ZM3.8 7.3L16.7 20.2H4.8A1.8 1.8 0 0 1 3 18.4V8.1Z\"/><path class=\"ln\" d=\"M4 3.8l16.2 16.2\"/>","car":"<path fill-rule=\"evenodd\" d=\"M5.6 5.2h12.7l2.7 5.5H3ZM2.6 12.2h18.7v4.5H2.6ZM5.9 14.4a1.1 1.1 0 1 0 2.3 0a1.1 1.1 0 1 0-2.3 0ZM15.8 14.4a1.1 1.1 0 1 0 2.3 0a1.1 1.1 0 1 0-2.3 0ZM5 17.5h2.7v1.8H5ZM16.3 17.5h2.7v1.8h-2.7Z\"/>","card":"<path fill-rule=\"evenodd\" d=\"M2.6 7.4a2.4 2.4 0 0 1 2.4-2.4h13.9a2.4 2.4 0 0 1 2.4 2.4v9.3a2.4 2.4 0 0 1-2.4 2.4h-13.9a2.4 2.4 0 0 1-2.4-2.4ZM2.6 9.5v1.7h18.7V9.5ZM5.9 14.2v1.5h4.8v-1.5Z\"/>","care":"<path d=\"M12 11s-4.3-2.6-4.3-5.6a2.3 2.3 0 0 1 4.3-1.5a2.3 2.3 0 0 1 4.3 1.5c0 3-4.3 5.6-4.3 5.6Z\"/><path class=\"ln\" d=\"M3.8 13.8v6M3.8 15.2h3.1l3.3 2.7h7.5a1.7 1.7 0 0 0 0-3.4h-3.9\"/>","cart":"<path d=\"M6.3 7h15l-2.5 8.3H8.1Z\"/><circle cx=\"9.5\" cy=\"19.4\" r=\"1.6\"/><circle cx=\"17\" cy=\"19.4\" r=\"1.6\"/><path class=\"ln\" d=\"M3.8 4.8H5.8l2.3 10.5\"/>","cc":"<path fill-rule=\"evenodd\" d=\"M5.6 4.6h12.7a3 3 0 0 1 3 3v8.8a3 3 0 0 1-3 3h-12.7a3 3 0 0 1-3-3v-8.8a3 3 0 0 1 3-3ZM10.8 9.5A3.2 3.2 0 1 0 10.8 14.5L9.6 13A1.3 1.3 0 1 1 9.6 11ZM17.4 9.5A3.2 3.2 0 1 0 17.4 14.5L16.2 13A1.3 1.3 0 1 1 16.2 11Z\"/>","chart":"<path class=\"ln\" d=\"M4 3.5v16.2h16.2\"/><path d=\"M7 14.9L11 10.3l3 2.5l5.2-6.2V17.7H7Z\"/>","chat":"<path d=\"M2.7 4.7A1.8 1.8 0 0 1 4.5 3h15.2a1.8 1.8 0 0 1 1.8 1.8v10.9a1.8 1.8 0 0 1-1.8 1.8H8.3L2.7 21.8Z\"/>","chat-off":"<path d=\"M8.1 4.6H19a1.6 1.6 0 0 1 1.6 1.6v9.5a1.6 1.6 0 0 1-0.4 1ZM3.4 7.3L12.9 16.8H8.3l-4.9 4.6Z\"/><path class=\"ln\" d=\"M4 4.2l16 16\"/>","check-circle":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM17.3 8.9l1.6 1.6l-7 7l-4.1-4.1l1.6-1.6l2.6 2.6Z\"/>","child":"<circle cx=\"12\" cy=\"5.2\" r=\"2.6\"/><path class=\"ln\" d=\"M7.7 10L12 8.6l4.3 1.4M12 8.6v5.8M9.1 20.1l2.9-5.8l2.9 5.8\"/>","chip":"<path fill-rule=\"evenodd\" d=\"M8.6 7.2h6.8a1.4 1.4 0 0 1 1.4 1.4v6.8a1.4 1.4 0 0 1-1.4 1.4H8.6a1.4 1.4 0 0 1-1.4-1.4V8.6a1.4 1.4 0 0 1 1.4-1.4Zm1.7 3.1v3.4h3.4v-3.4Z\"/><path class=\"ln\" d=\"M10.2 4v3.2M13.8 4v3.2M10.2 16.8V20M13.8 16.8V20M4 10.2h3.2M4 13.8h3.2M16.8 10.2H20M16.8 13.8H20\"/>","circle":"<circle cx=\"12\" cy=\"12\" r=\"9.5\"/>","city":"<path fill-rule=\"evenodd\" d=\"M5.4 7.7h4.6v10.9H5.4Zm1.9 2.2v1.4h1.2v-1.4Zm0 2.9v1.4h1.2v-1.4Z\"/><path fill-rule=\"evenodd\" d=\"M10.7 3.4h5.1v15.2h-5.1Zm1.7 2.4v1.4h1.4V5.8Zm0 2.9v1.4h1.4V8.7Zm0 2.9v1.4h1.4v-1.4Z\"/><path d=\"M16.5 11.3h2.2v7.4h-2.2Z\"/><path class=\"ln\" d=\"M3.9 18.6h16.1\"/>","clapper":"<path fill-rule=\"evenodd\" d=\"M2.6 5.9L19.9 2.7l0.9 4.3L3.2 8.7ZM7 5.1L9.2 8.1l2.6-0.2L9.6 4.6ZM12.6 4l2.2 3.6l2.6-0.3L15.2 3.6Z\"/><path d=\"M3.1 9.9h18.2v9a1.6 1.6 0 0 1-1.6 1.6h-15a1.6 1.6 0 0 1-1.6-1.6Z\"/>","clipboard":"<path fill-rule=\"evenodd\" d=\"M7.5 4.2h9a2 2 0 0 1 2 2v13.1a2 2 0 0 1-2 2H7.5a2 2 0 0 1-2-2V6.3a2 2 0 0 1 2-2ZM9.1 9.9v1.6h5.8v-1.6Zm0 3.9v1.6h3.9v-1.6Z\"/><rect x=\"8.7\" y=\"2.5\" width=\"6.6\" height=\"3.7\" rx=\"1.2\"/>","clipboard-check":"<path fill-rule=\"evenodd\" d=\"M7.5 4.2h9a2 2 0 0 1 2 2v13.1a2 2 0 0 1-2 2H7.5a2 2 0 0 1-2-2V6.3a2 2 0 0 1 2-2ZM8 13.1L11 16.1l5-5l-1.6-1.6l-3.4 3.4l-1.5-1.5Z\"/><rect x=\"8.7\" y=\"2.5\" width=\"6.6\" height=\"3.7\" rx=\"1.2\"/>","clock":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM11.9 6.6h2.3v5l3.3 2l-1.1 2l-4.3-2.7Z\"/>","cloud":"<path d=\"M7.9 18.2h9.6a4.2 4.2 0 0 0 0.6-8.3A6.1 6.1 0 0 0 6.5 9.2A4.5 4.5 0 0 0 7.9 18.2Z\"/>","cloud-off":"<path d=\"M10.1 5.7A6 6 0 0 1 17.9 9.8a4.1 4.1 0 0 1 2.8 6.5ZM6.6 9.1L15.5 18H7.9A4.4 4.4 0 0 1 6.4 9.2Z\"/><path class=\"ln\" d=\"M5.1 4.2l15 15\"/>","coin":"<path fill-rule=\"evenodd\" d=\"M13 2.6a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM12 5.8h2.1v1.2c1.1 0.2 2.1 0.8 2.6 1.7l-1.7 1c-0.3-0.6-1-1-1.8-1c-0.9 0-1.5 0.4-1.5 1s0.5 0.8 1.8 1.1c1.8 0.4 3.5 1 3.5 3.1c0 1.4-1 2.5-2.8 2.8V18h-2.1v-1.3c-1.2-0.2-2.3-0.9-2.8-2l1.7-1c0.4 0.7 1.1 1.1 2.1 1.1c1 0 1.6-0.4 1.6-1s-0.6-0.8-2-1.1c-1.7-0.4-3.4-1-3.4-3c0-1.3 1-2.4 2.7-2.7Z\"/>","columns":"<path d=\"M2.6 6.3a2.7 2.7 0 0 1 2.7-2.7h13.4a2.7 2.7 0 0 1 2.7 2.7v1.5H2.6ZM2.6 9.9h8.3v10.4H5.3a2.7 2.7 0 0 1-2.7-2.7ZM13 9.9h8.3v7.7a2.7 2.7 0 0 1-2.7 2.7H13Z\"/>","compass":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM17.4 7.7L14.9 14.1L8.5 16.5L11 10.1Z\"/>","compress":"<path d=\"M9.7 9.7H2.7L9.7 2.7ZM14.3 9.7h7l-7-7ZM9.7 14.3H2.7l7 7ZM14.3 14.3h7l-7 7Z\"/>","computer":"<rect x=\"2.6\" y=\"3.4\" width=\"18.8\" height=\"12.8\" rx=\"2.2\"/><path class=\"ln\" d=\"M8 20h8M12 16.2v3.8\"/>","contrast":"<path fill-rule=\"evenodd\" d=\"M12.4 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7Zm0 2.1a7.2 7.2 0 0 1 0 14.4Z\"/>","cookie":"<path fill-rule=\"evenodd\" d=\"M21.6 12.4a9.4 9.4 0 1 1-10-10a3.4 3.4 0 0 0 4.4 3.9a3.4 3.4 0 0 0 5.5 5.9ZM7 9.1a1.3 1.3 0 1 0 2.7 0a1.3 1.3 0 1 0-2.7 0ZM10.9 14a1.3 1.3 0 1 0 2.7 0a1.3 1.3 0 1 0-2.7 0ZM6.5 15.7a1.3 1.3 0 1 0 2.7 0a1.3 1.3 0 1 0-2.7 0ZM14.8 15.7a1.3 1.3 0 1 0 2.7 0a1.3 1.3 0 1 0-2.7 0Z\"/>","copy":"<rect x=\"7.5\" y=\"7.5\" width=\"13.8\" height=\"13.8\" rx=\"2.5\"/><path class=\"ln\" d=\"M16.4 7.5V5.9a2.1 2.1 0 0 0-2.1-2.1H5.9a2.1 2.1 0 0 0-2.1 2.1v8.5a2.1 2.1 0 0 0 2.1 2.1h1.7\"/>","couch":"<path d=\"M7.1 4.2h9.7A2.5 2.5 0 0 1 19.4 6.7v1.9a3.1 3.1 0 0 0-3.1 3.1v0.1H7.7v-0.1A3.1 3.1 0 0 0 4.6 8.7V6.7A2.5 2.5 0 0 1 7.1 4.2ZM2.7 11.6a2.5 2.5 0 0 1 5.1 0v1.9h8.6V11.6a2.5 2.5 0 0 1 5.1 0v5.5H2.7Z\"/><path class=\"ln\" d=\"M5.2 17.1v1.9M18.8 17.1v1.9\"/>","crown":"<path d=\"M2.6 7.3L7.4 11.5L12 4.1L16.6 11.5l4.8-4.2l-2 11.7H4.6Z\"/>","cubes":"<path d=\"M12 2.3L7.8 4.4v4.8l4.2 2.1l4.2-2.1V4.4ZM6.8 12.1L2.7 14.2v4.8l4.2 2.1l4.2-2.1v-4.8ZM17.2 12.1l-4.2 2.1v4.8l4.2 2.1l4.2-2.1v-4.8Z\"/>","database":"<ellipse cx=\"12\" cy=\"5.7\" rx=\"7.9\" ry=\"3.2\"/><path d=\"M4.1 7.5a7.9 3.2 0 0 0 15.9 0v4.3a7.9 3.2 0 0 1-15.9 0ZM4.1 13.4a7.9 3.2 0 0 0 15.9 0v4.7a7.9 3.2 0 0 1-15.9 0Z\"/>","dice":"<path fill-rule=\"evenodd\" d=\"M6.2 2.7h11.5a3.6 3.6 0 0 1 3.6 3.6v11.5a3.6 3.6 0 0 1-3.6 3.6H6.2a3.6 3.6 0 0 1-3.6-3.6V6.2a3.6 3.6 0 0 1 3.6-3.6ZM6.2 8.2a2 2 0 1 0 3.9 0a2 2 0 1 0-3.9 0ZM13.8 8.2a2 2 0 1 0 3.9 0a2 2 0 1 0-3.9 0ZM10 12a2 2 0 1 0 3.9 0a2 2 0 1 0-3.9 0ZM6.2 15.8a2 2 0 1 0 3.9 0a2 2 0 1 0-3.9 0ZM13.8 15.8a2 2 0 1 0 3.9 0a2 2 0 1 0-3.9 0Z\"/>","dish":"<path d=\"M2.7 9.7A11.7 11.7 0 0 0 14.4 21.4Z\"/><path class=\"ln\" d=\"M8.8 15.3l4.9-4.9M14.2 4a5.8 5.8 0 0 1 5.8 5.8M14.2 8.1a1.8 1.8 0 0 1 1.8 1.8\"/>","donate":"<path fill-rule=\"evenodd\" d=\"M12 2.2a5.9 5.9 0 1 0 0 11.8a5.9 5.9 0 0 0 0-11.8Zm-0.8 3.4h1.7v5.1h-1.7ZM2.9 15h18.2v6H2.9ZM7.8 17.1v1.6h8.5V17.1Z\"/>","door":"<path fill-rule=\"evenodd\" d=\"M14.3 4.5L6.2 3v17.1l8.2-1.5ZM10.2 11.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0Z\"/><path class=\"ln\" d=\"M15.5 5.3h1.4a0.9 0.9 0 0 1 0.9 0.9v13.3M15.5 19.5H20M4 19.5h2.1\"/>","download":"<path d=\"M10.6 2.3h2.5v7h4.7L11.9 15.4l-5.9-5.9h4.7Z\"/><path class=\"ln\" d=\"M4.5 19.7h14.9\"/>","drive":"<path fill-rule=\"evenodd\" d=\"M5.3 11.4h13.5a2.7 2.7 0 0 1 2.7 2.7v3a2.7 2.7 0 0 1-2.7 2.7H5.3a2.7 2.7 0 0 1-2.7-2.7v-3a2.7 2.7 0 0 1 2.7-2.7ZM16.8 14.4a1.1 1.1 0 1 1 0 2.3a1.1 1.1 0 0 1 0-2.3ZM13.7 14.4a1.1 1.1 0 1 1 0 2.3a1.1 1.1 0 0 1 0-2.3Z\"/><path class=\"ln\" d=\"M4.1 11.9L6.8 4.7h10.4l2.8 7.2\"/>","drop":"<path d=\"M12 2.2s7 7.4 7 12.6a7 7 0 0 1-13.9 0C5 9.6 12 2.2 12 2.2Z\"/>","eraser":"<path d=\"M14 3.9l6.1 6.1-5.2 5.2-6.1-6.1ZM7.4 10l6.2 6.2-3.2 3.2H6.1l-2.9-2.9a1.6 1.6 0 0 1 0-2.3Z\"/><path class=\"ln\" d=\"M13 19.4h7\"/>","expand":"<path d=\"M2.7 2.7h7L2.7 9.7ZM21.3 2.7h-7l7 7ZM2.7 21.3h7l-7-7ZM21.3 21.3h-7l7-7Z\"/>","eye":"<path fill-rule=\"evenodd\" d=\"M12 5.3C6.4 5.3 2.6 12 2.6 12s3.9 6.7 9.4 6.7S21.5 12 21.5 12S17.6 5.3 12 5.3Zm0 3.3a3.3 3.3 0 1 1 0 6.7a3.3 3.3 0 0 1 0-6.7Z\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\"/>","eye-off":"<path d=\"M9 5.8A10 10 0 0 1 21.4 12a10 10 0 0 1-2.5 3.8L15.3 12.2a3.3 3.3 0 0 0-3.5-3.5ZM15 18.2A10 10 0 0 1 2.6 12a10 10 0 0 1 2.5-3.8L8.7 11.8a3.3 3.3 0 0 0 3.5 3.5Z\"/><path class=\"ln\" d=\"M4.6 4.6l14.8 14.8\"/>","fast-forward":"<path d=\"M3 5.5v13.1L12 12ZM12.7 5.5v13.1L21.8 12Z\"/>","file":"<path d=\"M5.8 2.4h7.6v5.2h5V21.2H5.8ZM15 2.7l3.1 3.3h-3.1Z\"/>","file-code":"<path fill-rule=\"evenodd\" d=\"M5.8 2.4h7.6v5.2h5V21.2H5.8ZM9.8 11l1.5 1.4l-1.6 1.7l1.6 1.7l-1.5 1.4l-2.9-3.1ZM14.4 11l-1.5 1.4l1.6 1.7l-1.6 1.7l1.5 1.4l2.9-3.1Z\"/><path d=\"M15 2.7l3.1 3.3h-3.1Z\"/>","film":"<path fill-rule=\"evenodd\" d=\"M4.8 3.6h14.4a2.3 2.3 0 0 1 2.3 2.3v12.3a2.3 2.3 0 0 1-2.3 2.3H4.8A2.3 2.3 0 0 1 2.5 18.2V5.8A2.3 2.3 0 0 1 4.8 3.6Zm3.8 2v12.9h6.8V5.5ZM4.4 6v2h2.1V6Zm0 5v1.8h2.1v-1.8Zm0 4.9v2h2.1v-2Zm13.1-10v2h2.1V6Zm0 5v1.8h2.1v-1.8Zm0 4.9v2h2.1v-2Z\"/>","finish":"<path d=\"M6.5 4.2h3.9v4.6H6.5ZM14.8 4.2h4a0.9 0.9 0 0 1 0.9 0.9v3.7h-4.9ZM10.5 8.6h4.5v4.6H10.5Z\"/><path class=\"ln\" d=\"M6 20.3V4.1\"/>","fire":"<path fill-rule=\"evenodd\" d=\"M12.1 19.8a6.8 6.8 0 0 0 6.8-6.8c0-4.3-2.9-6.8-4.2-10.3c-2.1 2.3-2.6 4.6-2.6 4.6S10.8 5.1 9.6 3C7.1 5.9 5.2 9.2 5.2 12.9A6.8 6.8 0 0 0 12.1 21.4Zm0-2.8a2.8 2.8 0 0 0 2.8-2.8c0-1.6-1.2-2.7-1.7-4c-0.9 1-1.1 1.8-1.1 1.8s-0.5-0.9-1-1.6c-1 1.2-1.7 2.5-1.7 3.9a2.8 2.8 0 0 0 2.7 2.7Z\"/>","fish":"<path fill-rule=\"evenodd\" d=\"M8.7 12c1.9-3.5 4.6-5.3 7.6-5.3c2.8 0 4.6 2.2 5.4 5.3c-0.8 3.1-2.6 5.3-5.4 5.3c-3 0-5.7-1.8-7.6-5.3ZM16.2 10.6a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0Z\"/><path class=\"ln\" d=\"M8.7 12L4.4 8.9M8.7 12l-4.3 3.1\"/>","flag":"<path class=\"ln\" d=\"M7.2 20.5V4.3\"/><path d=\"M7.8 4.1h10.9l-2 4.1l2 4.1H7.8Z\"/>","focus":"<circle cx=\"12\" cy=\"12\" r=\"3.6\"/><path class=\"ln\" d=\"M3.8 9V6.1A2.3 2.3 0 0 1 6.1 3.8H9M15 3.8h2.9A2.3 2.3 0 0 1 20.2 6.1V9M20.2 15v2.9a2.3 2.3 0 0 1-2.3 2.3H15M9 20.2H6.1A2.3 2.3 0 0 1 3.8 17.9V15\"/>","folder":"<path d=\"M2.7 6.4a2.1 2.1 0 0 1 2.1-2.1h4.4l2.1 2.1h8.1a2.1 2.1 0 0 1 2.1 2.1v8.7a2.1 2.1 0 0 1-2.1 2.1H4.8a2.1 2.1 0 0 1-2.1-2.1Z\"/>","folder-tree":"<path d=\"M9.6 5h4l1 1.5h6.4v5.3H9.6ZM9.6 14.3h4l1 1.5h6.4v5.3H9.6Z\"/><path class=\"ln\" d=\"M4.1 3.6v13.2a1 1 0 0 0 1 1H9.6M4.1 8.8H9.6\"/>","food":"<path d=\"M4.7 3.3h1.5v4.7h0.6V3.3h1.4v4.7h0.6V3.3h1.5v4.9A2.9 2.9 0 0 1 8.6 10.8V21.7H6.5V10.8a2.9 2.9 0 0 1-1.8-2.7ZM18.9 21.7h-2.3v-7.4h-3V10.6c0-3.9 1.7-6.6 5.2-7.7Z\"/>","game":"<path fill-rule=\"evenodd\" d=\"M7.6 6.3h8.8a5.8 5.8 0 0 1 0 11.5H7.6a5.8 5.8 0 0 1 0-11.5Zm-1.4 3.7v1.6H4.7v1.8h1.6v1.6H7.9v-1.6h1.6v-1.8H7.9v-1.6Zm9.2 1a1.2 1.2 0 1 0 0 2.3a1.2 1.2 0 0 0 0-2.3Zm2.5 1.6a1.2 1.2 0 1 0 0 2.3a1.2 1.2 0 0 0 0-2.3Z\"/>","gauge":"<path fill-rule=\"evenodd\" d=\"M3.7 18A9.4 9.4 0 1 1 19.4 19.6ZM15 8.6l-2.2 5.6l-2.1 0.3l-0.4-2.1Z\"/>","gavel":"<path d=\"M11.3 5.5L5.5 11.3l6.1 6.1l5.8-5.8Z\"/><path class=\"ln\" d=\"M13.7 4.2l5 5M3.8 19.1l5.7-5.7M13.7 19.1h6.3\"/>","gear":"<path fill-rule=\"evenodd\" d=\"M18.2 14.6a1.4 1.4 0 0 0 0.3 1.7l0.1 0.1a1.7 1.7 0 1 1-2.7 2.7l-0.1-0.1a1.4 1.4 0 0 0-1.7-0.3a1.4 1.4 0 0 0-0.9 1.4V19.6a1.7 1.7 0 1 1-3.8 0v-0.1a1.4 1.4 0 0 0-1-1.4a1.4 1.4 0 0 0-1.7 0.3l-0.1 0.1a1.7 1.7 0 1 1-2.7-2.7l0.1-0.1a1.4 1.4 0 0 0 0.3-1.7a1.4 1.4 0 0 0-1.4-0.9H4.6a1.7 1.7 0 1 1 0-3.8h0.1a1.4 1.4 0 0 0 1.4-1a1.4 1.4 0 0 0-0.3-1.7l-0.1-0.1a1.7 1.7 0 1 1 2.7-2.7l0.1 0.1a1.4 1.4 0 0 0 1.7 0.3H9.6a1.4 1.4 0 0 0 0.9-1.4V4.6a1.7 1.7 0 1 1 3.8 0v0.1a1.4 1.4 0 0 0 0.9 1.4a1.4 1.4 0 0 0 1.7-0.3l0.1-0.1a1.7 1.7 0 1 1 2.7 2.7l-0.1 0.1a1.4 1.4 0 0 0-0.3 1.7V9.6a1.4 1.4 0 0 0 1.4 0.9H19.6a1.7 1.7 0 1 1 0 3.8h-0.1a1.4 1.4 0 0 0-1.4 0.9ZM12.1 9.3a2.8 2.8 0 1 0 0 6.5a2.8 2.8 0 0 0 0-6.5Z\"/>","gem":"<path d=\"M6.4 3.9h11.2l3.8 5.3l-9.4 11.6L2.6 9.2Z\"/>","ghost":"<path fill-rule=\"evenodd\" d=\"M3.4 21.3V9.9a8.7 8.7 0 0 1 17.2 0v11.5l-2.9-2.1l-2.9 2.1l-2.9-2.1l-2.9 2.1l-2.9-2.1ZM8.8 7.8a1.6 1.6 0 1 0 0 3.1a1.6 1.6 0 0 0 0-3.1Zm6.2 0a1.6 1.6 0 1 0 0 3.1a1.6 1.6 0 0 0 0-3.1Z\"/>","gift":"<path d=\"M3.1 8.6h17.7v3.3H3.1ZM4.4 12.9h6.6v8.2H5.4a1 1 0 0 1-1-1ZM13 12.9h6.6v7.2a1 1 0 0 1-1 1H13Z\"/><path class=\"ln\" d=\"M12 8.6c-1.5-3.1-5.1-4.1-5.1-1.5S12 8.6 12 8.6s5.1-1 5.1-3.6s-3.6-1.5-5.1 3.6\"/>","globe":"<path d=\"M2.6 11.1A9.5 9.5 0 0 1 12 2.6a4.5 9.5 0 0 0-4.5 8.5ZM21.4 11.1A9.5 9.5 0 0 0 12 2.6a4.5 9.5 0 0 1 4.5 8.5ZM2.6 12.9A9.5 9.5 0 0 0 12 21.5a4.5 9.5 0 0 1-4.5-8.5ZM21.4 12.9A9.5 9.5 0 0 1 12 21.5a4.5 9.5 0 0 0 4.5-8.5ZM12 2.6a2.7 9.5 0 0 0-2.7 8.5h5.3A2.7 9.5 0 0 0 12 2.6ZM12 21.5a2.7 9.5 0 0 1-2.7-8.5h5.3A2.7 9.5 0 0 1 12 21.5Z\"/>","grid":"<rect x=\"2.7\" y=\"2.7\" width=\"8\" height=\"8\" rx=\"2.2\"/><rect x=\"13.3\" y=\"2.7\" width=\"8\" height=\"8\" rx=\"2.2\"/><rect x=\"2.7\" y=\"13.3\" width=\"8\" height=\"8\" rx=\"2.2\"/><rect x=\"13.3\" y=\"13.3\" width=\"8\" height=\"8\" rx=\"2.2\"/>","group":"<rect x=\"6.9\" y=\"6.8\" width=\"6.4\" height=\"4.8\" rx=\"1.1\"/><rect x=\"10.8\" y=\"12.5\" width=\"6.4\" height=\"4.6\" rx=\"1.1\"/><path class=\"ln\" d=\"M4 7.6V4h3.6M16.5 4h3.6v3.6M20 16.4v3.6h-3.6M7.6 20H4v-3.6\"/>","hammer":"<path d=\"M13.1 2.5l7.5 7.5l-3.7 3.7l-7.5-7.5ZM12.9 8.9L3.7 18.1a2.1 2.1 0 0 0 2.9 2.9l9.2-9.2Z\"/>","hand":"<path d=\"M9 14.3V4.9a1.4 1.4 0 0 1 2.8 0v5.2a0.5 0.5 0 0 0 1.1 0V3.8a1.4 1.4 0 0 1 2.8 0v6.4a0.5 0.5 0 0 0 1.1 0V5.7a1.4 1.4 0 0 1 2.8 0v7.7c0 4.5-2.8 7.7-7.3 7.7c-2.9 0-4.7-1.5-6.3-4l-1.8-2.9a1.7 1.7 0 0 1 2.8-2Z\"/>","handshake":"<path d=\"M2.3 9.2h2.7v6.8H2.3ZM19 9.2h2.7v6.8H19Z\"/><path class=\"ln\" d=\"M5.6 10.8h0.3l3.4-2.6l2.9 1.3L14.6 8.1l3.4 2.6h0.4M5.9 10.8l5.4 5.4a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.4 12.8l-3.9-3.9l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2\"/>","headphones":"<path class=\"ln\" d=\"M4 14.5V12a8 8 0 0 1 16 0v2.5\"/><rect x=\"2.6\" y=\"13.4\" width=\"5.4\" height=\"7.6\" rx=\"1.8\"/><rect x=\"16\" y=\"13.4\" width=\"5.4\" height=\"7.6\" rx=\"1.8\"/>","heart":"<path d=\"M12 21.6s-9.3-5.7-9.3-13a5.3 5.3 0 0 1 9.3-3.6a5.3 5.3 0 0 1 9.3 3.6c0 7.4-9.3 13-9.3 13Z\"/>","heart-broken":"<path fill-rule=\"evenodd\" d=\"M12 21.6s-9.3-5.7-9.3-13a5.3 5.3 0 0 1 9.3-3.6a5.3 5.3 0 0 1 9.3 3.6c0 7.4-9.3 13-9.3 13ZM10.9 5.9l2.7 0.6l-1.4 2.7l3.6 2.5l-2.6 5.9l-2.5-1.1l1.5-3.7l-3.7-2.5Z\"/>","help":"<path fill-rule=\"evenodd\" d=\"M13 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM9.3 9.4A3.7 3.7 0 1 1 13.9 12.8v1.6h-2.1V10.9h1a1.6 1.6 0 1 0-1.6-1.6ZM13 15.8a1.3 1.3 0 1 1 0 2.6a1.3 1.3 0 0 1 0-2.6Z\"/>","history":"<path d=\"M5.8 5.8A9.1 9.1 0 1 1 3.2 12.2h3a6.1 6.1 0 1 0 1.8-4.3ZM2.5 2.7v7.2h7.2ZM11.2 8.1h2.2v3.7l2.7 1.6l-1.1 1.8l-3.8-2.3Z\"/>","home":"<path d=\"M2.7 10.4L12 2.3l9.3 8.1v9.5a1.1 1.1 0 0 1-1.1 1.1h-5.6v-6.9h-5.4v6.9H3.8a1.1 1.1 0 0 1-1.1-1.1Z\"/>","hot-tub":"<circle cx=\"8.2\" cy=\"5.4\" r=\"2.4\"/><path d=\"M2.6 10.9h18.8v4.2a5.1 5.1 0 0 1-5.1 5.1h-8.5a5.1 5.1 0 0 1-5.1-5.1Z\"/><path class=\"ln\" d=\"M6.3 10.9v-0.6A2.4 2.4 0 0 1 8.7 8H9.2M13.5 9.4c0.8-0.9-0.8-1.9 0-2.8M17.3 9.4c0.8-0.9-0.8-1.9 0-2.8\"/>","id":"<path fill-rule=\"evenodd\" d=\"M4.8 4.6h14.4a2.3 2.3 0 0 1 2.3 2.3v10.3a2.3 2.3 0 0 1-2.3 2.3H4.8A2.3 2.3 0 0 1 2.5 17.2V6.9A2.3 2.3 0 0 1 4.8 4.6Zm4.1 4.2a2.2 2.2 0 1 0 0 4.3a2.2 2.2 0 0 0 0-4.3Zm-3.2 7.7h6.4c-0.6-1.7-1.8-2.7-3.2-2.7s-2.6 0.9-3.2 2.7Zm8.8-7.2v1.5h4V9.4Zm0 3.6v1.5h4v-1.5Z\"/>","idea":"<path d=\"M8.3 14.9A6.5 6.5 0 1 1 15.7 14.9c-0.7 0.6-1.3 1.3-1.4 2.2H9.7c-0.1-0.9-0.7-1.6-1.4-2.2Z\"/><path class=\"ln\" d=\"M9.6 20.5h4.8\"/>","image":"<path fill-rule=\"evenodd\" d=\"M2.8 6.1a2.7 2.7 0 0 1 2.7-2.7h13.3A2.7 2.7 0 0 1 21.5 6.1v12.3a2.7 2.7 0 0 1-2.7 2.7H5.4A2.7 2.7 0 0 1 2.8 18.4Zm6.2 2.2a2 2 0 1 0 0 3.9a2 2 0 0 0 0-3.9Zm7.5 3.5l-8.3 7.8h10.7a1.5 1.5 0 0 0 1.5-1.5v-3.1Z\"/>","inbox":"<path fill-rule=\"evenodd\" d=\"M2.7 12.4L5.2 3.7h13.6l2.5 8.8V17.9a1.6 1.6 0 0 1-1.6 1.6H4.2A1.6 1.6 0 0 1 2.7 17.9ZM6.4 5.6L4.6 11.5h3.8l1.5 2.4h4.3l1.5-2.4h3.8L17.6 5.6Z\"/>","info":"<path fill-rule=\"evenodd\" d=\"M12.9 2.6a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM11.7 10.5h2.5V16.9h-2.5ZM12.9 6.4a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3Z\"/>","invite":"<circle cx=\"8.8\" cy=\"7.7\" r=\"3.2\"/><path d=\"M2.9 19.2c0-3.4 2.7-5.8 5.8-5.8s5.8 2.4 5.8 5.8Z\"/><path class=\"ln\" d=\"M17.6 7.8v5.3M15 10.5h5.3\"/>","key":"<path fill-rule=\"evenodd\" d=\"M8.3 10.1a5.4 5.4 0 1 1 0 10.9a5.4 5.4 0 0 1 0-10.9Zm0 3.6a1.9 1.9 0 1 0 0 3.8a1.9 1.9 0 0 0 0-3.8Z\"/><path class=\"ln\" d=\"M11.7 12.2l8.7-8.7M16.7 7.2l3.1 3.1M14.4 9.5l2.1 2.1\"/>","keyboard":"<path fill-rule=\"evenodd\" d=\"M4.8 5.7h14.4A2.3 2.3 0 0 1 21.5 8v8a2.3 2.3 0 0 1-2.3 2.3H4.8A2.3 2.3 0 0 1 2.5 16V8a2.3 2.3 0 0 1 2.3-2.3ZM5.3 9.1h1.9v1.9H5.3ZM8.2 9.1h1.9v1.9H8.2ZM11 9.1h1.9v1.9h-1.9ZM13.9 9.1h1.9v1.9h-1.9ZM16.8 9.1h1.9v1.9h-1.9ZM7.8 13.3h8.4v1.7H7.8Z\"/>","laugh":"<path fill-rule=\"evenodd\" d=\"M13 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM7.9 8.1l3.5 1.7l-3.5 1.7l-0.7-1.4l0.7-0.4l-0.7-0.4ZM18 8.1l-3.5 1.7l3.5 1.7l0.7-1.4l-0.7-0.4l0.7-0.4ZM8.5 13.5h8.9a4.4 4.4 0 0 1-8.9 0Z\"/>","layers":"<path d=\"M12 4.3l8.6 5l-8.6 5l-8.6-5Z\"/><path class=\"ln\" d=\"M3.9 13.9l8.1 4.5l8.1-4.5\"/>","leaf":"<path fill-rule=\"evenodd\" d=\"M5.4 18.6c0-8.9 5.2-14.2 15.7-15.7c-1 10.4-6.3 15.7-15.7 15.7Zm3.1-2L16.8 7.1l-9.5 8.5Z\"/><path class=\"ln\" d=\"M3.7 20.3L6 18\"/>","lifebuoy":"<path fill-rule=\"evenodd\" d=\"M13.1 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7Zm0 5.3a4.1 4.1 0 1 1 0 8.2a4.1 4.1 0 0 1 0-8.2ZM15.5 16.2L18.4 19.1L20.2 17.3L17.2 14.3ZM10.8 16.2L7.9 19.1L6 17.3L9 14.3ZM15.5 7.8L18.4 4.9L20.2 6.7L17.2 9.7ZM10.8 7.8L7.9 4.9L6 6.7L9 9.7Z\"/>","live":"<circle cx=\"12\" cy=\"12\" r=\"2.5\"/><path class=\"ln\" d=\"M8.5 8.5a4.9 4.9 0 0 0 0 6.9M15.5 8.5a4.9 4.9 0 0 1 0 6.9M6.2 6.2a8.2 8.2 0 0 0 0 11.5M17.8 6.2a8.2 8.2 0 0 1 0 11.5\"/>","lock":"<path d=\"M4.6 11.1a1.6 1.6 0 0 1 1.6-1.6h11.5a1.6 1.6 0 0 1 1.6 1.6v8.4a1.6 1.6 0 0 1-1.6 1.6H6.2A1.6 1.6 0 0 1 4.6 19.6Z\"/><path class=\"ln\" d=\"M7.9 9.4V6.8a4.1 4.1 0 0 1 8 0V9.4\"/>","mail":"<path d=\"M2.5 7.3v-0.4A2.3 2.3 0 0 1 4.8 4.6h14.4A2.3 2.3 0 0 1 21.5 6.9v0.4l-8.7 5.6a1.6 1.6 0 0 1-1.7 0ZM2.5 9.4v7.6A2.3 2.3 0 0 0 4.8 19.4h14.4a2.3 2.3 0 0 0 2.3-2.3V9.4l-8 5.2a2.7 2.7 0 0 1-3 0Z\"/>","map":"<path d=\"M2.6 6.1 8.3 4.2v14l-5.7 1.9ZM9.7 4.2l4.6 1.6v14l-4.6-1.6ZM15.7 5.8l5.7-1.9v14l-5.7 1.9Z\"/>","mask":"<path fill-rule=\"evenodd\" d=\"M2.7 6.1c3.3 1.4 6.4 2.1 9.4 2.1s6.1-0.6 9.4-2.1c0 7.1-2.9 11.7-5.8 11.7c-1.5 0-2.2-1.5-3.6-1.5s-2.1 1.5-3.6 1.5c-2.9 0-5.8-4.6-5.8-11.7ZM6.8 11.6a1.6 1.1 0 1 0 3.3 0a1.6 1.1 0 1 0-3.3 0ZM14 11.6a1.6 1.1 0 1 0 3.3 0a1.6 1.1 0 1 0-3.3 0Z\"/>","medical":"<path fill-rule=\"evenodd\" d=\"M5.3 6.3h13.5a2.7 2.7 0 0 1 2.7 2.7v8.7a2.7 2.7 0 0 1-2.7 2.7H5.3a2.7 2.7 0 0 1-2.7-2.7V9a2.7 2.7 0 0 1 2.7-2.7ZM10.9 10h2.3v2.2h2.2v2.3h-2.2V16.7h-2.3v-2.2H8.7v-2.3h2.2Z\"/><path class=\"ln\" d=\"M9.2 6.3V5.3a0.9 0.9 0 0 1 0.9-0.9h3.8a0.9 0.9 0 0 1 0.9 0.9v1\"/>","megaphone":"<path d=\"M2.7 9.1a1.1 1.1 0 0 1 1.1-1.1h2.7l9.7-4.8v16.1l-9.7-4.8H3.8A1.1 1.1 0 0 1 2.7 13.2Z\"/><path class=\"ln\" d=\"M6.6 14.5l1.2 5M18.8 8.5a3.4 3.4 0 0 1 0 5.4\"/>","members":"<circle cx=\"9.1\" cy=\"7.1\" r=\"3.5\"/><path d=\"M2.6 19.6c0-3.7 2.9-6.3 6.4-6.3s6.4 2.6 6.4 6.3Z\"/><circle cx=\"16.5\" cy=\"6.6\" r=\"2.8\"/><path d=\"M16.7 12.4c2.8 0.4 4.7 2.7 4.7 6.2V19.6h-4.3c0-2.8-1-5.1-2.7-6.5Z\"/>","mic":"<path d=\"M8.9 5.8a3.1 3.1 0 0 1 6.2 0V10.8a3.1 3.1 0 0 1-6.2 0Z\"/><path class=\"ln\" d=\"M5.9 10.8a6.1 6.1 0 0 0 12.3 0M12 16.9V20.2\"/>","mic-off":"<path d=\"M9 5.4A3.1 3.1 0 0 1 15.2 5.8V10.7a3.1 3.1 0 0 1-0.1 0.8Z\"/><path class=\"ln\" d=\"M5.4 10.7a6.6 6.6 0 0 0 11 5M18.7 10.7c0 0.8-0.1 1.5-0.4 2.2M12.1 17.3v2.8M4.5 4.1l15.1 15.1\"/>","minus-circle":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM7.9 10.9v2.5h10.2v-2.5Z\"/>","money":"<path fill-rule=\"evenodd\" d=\"M4.8 5.7h14.4a2.1 2.1 0 0 1 2.1 2.1v8.4a2.1 2.1 0 0 1-2.1 2.1H4.8a2.1 2.1 0 0 1-2.1-2.1V7.8a2.1 2.1 0 0 1 2.1-2.1ZM12 8.9a3.1 3.1 0 1 0 0 6.3a3.1 3.1 0 0 0 0-6.3ZM6.3 8.7a1 1 0 1 0 0 2.1a1 1 0 0 0 0-2.1Zm11.4 4.6a1 1 0 1 0 0 2.1a1 1 0 0 0 0-2.1Z\"/><circle cx=\"12\" cy=\"12\" r=\"1.4\"/>","moon":"<path d=\"M21.7 14.6A9.7 9.7 0 1 1 9.4 2.3a8 8 0 0 0 12.3 12.3Z\"/>","more":"<circle cx=\"4.8\" cy=\"12\" r=\"2.2\"/><circle cx=\"12\" cy=\"12\" r=\"2.2\"/><circle cx=\"19.2\" cy=\"12\" r=\"2.2\"/>","mountain":"<path d=\"M2.8 18.1L9.2 5.3l4.1 7.1L16.1 8.9L21.5 18.1Z\"/>","mug":"<path d=\"M3.8 8.9h12.2v7.6a4.6 4.6 0 0 1-4.6 4.6h-3a4.6 4.6 0 0 1-4.6-4.6Z\"/><path class=\"ln\" d=\"M16 11H16.9a2.5 2.5 0 0 1 0 5h-0.9M7.9 3.7c-0.8 1 0.8 2 0 3M11.4 3.7c-0.8 1 0.8 2 0 3\"/>","music":"<path d=\"M7.6 5.4l13.3-2.5v3.5l-13.3 2.5Z\"/><path class=\"ln\" d=\"M8.8 17.9V6.5M19.7 15.6V4.2\"/><circle cx=\"5.5\" cy=\"17.9\" r=\"3.2\"/><circle cx=\"16.7\" cy=\"15.6\" r=\"3.2\"/>","mute":"<path d=\"M2.9 8.8h4l5.5-4.2v14.8l-5.5-4.2H2.9Z\"/><path class=\"ln\" d=\"M15.5 9.6l4.7 4.7M20.3 9.6l-4.7 4.7\"/>","news":"<path fill-rule=\"evenodd\" d=\"M2.8 2.6h14.2v15.2a2.2 2.2 0 0 0 2.2 2.2H5.1A2.2 2.2 0 0 1 2.8 18.9ZM6.6 6.6h6.8v1.7H6.6Zm0 3.7h6.8v1.7H6.6Zm0 3.7h4v1.7H6.6Z\"/><path class=\"ln\" d=\"M17.1 7.7H19.8V17.9a2.1 2.1 0 0 1-2.1 2.1\"/>","nodes":"<circle cx=\"12\" cy=\"5.2\" r=\"3\"/><circle cx=\"5.6\" cy=\"18\" r=\"3\"/><circle cx=\"18.4\" cy=\"18\" r=\"3\"/><path class=\"ln\" d=\"M10.9 7.6L6.8 15.5M13.1 7.6l4.1 7.9M8.4 18h7.1\"/>","palette":"<path fill-rule=\"evenodd\" d=\"M12.1 2.7a9.4 9.4 0 1 0 0 18.8c1.3 0 2-0.9 2-1.9c0-1.2-1-1.5-1-2.5s0.8-1.6 2-1.6H17.3a4.4 4.4 0 0 0 4.4-4.4C21.7 6.7 17.4 2.7 12.1 2.7ZM7.8 9.7a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3Zm2.5-3.7a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3Zm4.6 0a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3Z\"/>","parking":"<path fill-rule=\"evenodd\" d=\"M6.2 2.6h11.6a3.6 3.6 0 0 1 3.6 3.6v11.6a3.6 3.6 0 0 1-3.6 3.6H6.2a3.6 3.6 0 0 1-3.6-3.6V6.2a3.6 3.6 0 0 1 3.6-3.6ZM8.4 18V6H13a4 4 0 0 1 0 8h-2.4v4ZM10.6 8.2v3.6H13a1.8 1.8 0 0 0 0-3.6Z\"/>","pause":"<rect x=\"4.8\" y=\"2.6\" width=\"5.1\" height=\"18.8\" rx=\"1.5\"/><rect x=\"14.2\" y=\"2.6\" width=\"5.1\" height=\"18.8\" rx=\"1.5\"/>","paw":"<path d=\"M6.9 18.5c0-3.5 2.2-6.3 5.1-6.3s5.1 2.8 5.1 6.3c0 1.8-1.3 2.9-2.9 2.9c-0.9 0-1.5-0.6-2.2-0.6s-1.3 0.6-2.2 0.6c-1.6 0-2.9-1.1-2.9-2.9Z\"/><circle cx=\"5.1\" cy=\"10.2\" r=\"2.6\"/><circle cx=\"9.1\" cy=\"5.1\" r=\"2.6\"/><circle cx=\"14.9\" cy=\"5.1\" r=\"2.6\"/><circle cx=\"18.9\" cy=\"10.2\" r=\"2.6\"/>","pencil":"<path d=\"M15.6 3.1a2.2 2.2 0 0 1 3.2 3.2L6.9 18.1l-4.5 1.2l1.2-4.5Z\"/><path class=\"ln\" d=\"M11.8 19.7H20.1\"/>","phone":"<path d=\"M5.1 2.4h4.9l2.4 6l-2.7 1.6a10.7 10.7 0 0 0 4.2 4.2l1.6-2.7l6 2.4v4.9a2.3 2.3 0 0 1-2.3 2.3A17.3 17.3 0 0 1 2.8 4.6a2.3 2.3 0 0 1 2.3-2.3Z\"/>","piggy":"<path fill-rule=\"evenodd\" d=\"M2.6 11.4c0-3.6 3.7-6.5 8.7-6.5c1.4 0 2.7 0.2 3.9 0.7L18.3 3.8v3.7c0.9 0.8 1.5 1.7 1.7 2.8h1.5v3.8H20c-0.5 1.1-1.4 2-2.6 2.6V20.1h-3.3v-2.2c-0.9 0.2-1.8 0.3-2.8 0.3c-0.9 0-1.7-0.1-2.6-0.3v2.2h-3.3v-3.3C3.7 15.5 2.6 13.6 2.6 11.4ZM14.5 9.8a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0ZM8.3 6.8v1.5h3.7V6.8Z\"/>","pin":"<path fill-rule=\"evenodd\" d=\"M12 2.8a7.1 7.1 0 0 0-7.1 7.1c0 5.5 7.1 11.8 7.1 11.8s7.1-6.3 7.1-11.8A7.1 7.1 0 0 0 12 2.8Zm0 4.5a2.5 2.5 0 1 1 0 5.1a2.5 2.5 0 0 1 0-5.1Z\"/>","plane":"<path d=\"M21.2 2.9L2.4 10.7l6.9 3.2ZM21.2 2.9l-11 12l3.2 6.9Z\"/>","play":"<path d=\"M5.1 3.5v17a0.9 0.9 0 0 0 1.3 0.8l12.8-8.5a0.9 0.9 0 0 0 0-1.6L6.5 2.7a0.9 0.9 0 0 0-1.3 0.8Z\"/>","plug":"<path d=\"M6.5 8h10.9v3.3a5.4 5.4 0 0 1-10.9 0Z\"/><path class=\"ln\" d=\"M9.2 4.2v3.8M14.6 4.2v3.8M11.9 16.8v3.5\"/>","plus-circle":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7Zm-1.2 4.2h2.5v3.8H18v2.5h-3.8V17.1h-2.5v-3.8H7.9v-2.5h3.8Z\"/>","print":"<path d=\"M6.2 2.6h11.5v4.4H6.2ZM2.6 11a2.7 2.7 0 0 1 2.7-2.7h13.4a2.7 2.7 0 0 1 2.7 2.7v4.1a2.7 2.7 0 0 1-2.7 2.7h-0.3v-4.5H5.6v4.5h-0.3A2.7 2.7 0 0 1 2.6 15.1ZM7.1 14.7h9.9v6.7H7.1Z\"/>","puzzle":"<path d=\"M2.8 5.4h5a2.9 2.9 0 1 1 5.8 0h5v5a2.9 2.9 0 1 1 0 5.8v5h-5a2.9 2.9 0 1 0-5.8 0H2.8v-5a2.9 2.9 0 1 0 0-5.8Z\"/>","radio":"<path fill-rule=\"evenodd\" d=\"M5.2 7.8h13.6a2.5 2.5 0 0 1 2.5 2.5v7.8a2.5 2.5 0 0 1-2.5 2.5H5.2A2.5 2.5 0 0 1 2.6 18.1v-7.8A2.5 2.5 0 0 1 5.2 7.8ZM12.9 14.2a2.5 2.5 0 1 0 5.1 0a2.5 2.5 0 1 0-5.1 0ZM6.1 11.6v2h4.7v-2ZM6.1 15v2h4.7v-2Z\"/><path class=\"ln\" d=\"M7.1 7.8L16.9 4\"/>","ranking":"<path d=\"M3.5 13.7h4.9V9.9h7.1v5.7h4.9v5.4H3.5ZM12 2.2l1 2l2.2 0.3l-1.6 1.6l0.4 2.2L12 7.5l-2 1l0.4-2.2l-1.6-1.6l2.2-0.3Z\"/>","record":"<path fill-rule=\"evenodd\" d=\"M13.2 2.7a9.3 9.3 0 1 0 0 18.5a9.3 9.3 0 0 0 0-18.5Zm0 3.3a6 6 0 1 1 0 11.9a6 6 0 0 1 0-11.9Z\"/><circle cx=\"13.2\" cy=\"12\" r=\"3.7\"/>","restroom":"<circle cx=\"7.2\" cy=\"5.1\" r=\"1.8\"/><circle cx=\"16.2\" cy=\"5.1\" r=\"1.8\"/><path d=\"M6 9h1.8a1.5 1.5 0 0 1 1.5 1.5v4.7H8.6v5H5.5v-5H4.7v-4.7A1.5 1.5 0 0 1 6 9Z\"/><path d=\"M15.7 9.4h1.1a0.9 0.9 0 0 1 0.9 0.7l1.9 6.3H17.4v3.6h-2.3v-3.6h-2.1l1.9-6.3a0.9 0.9 0 0 1 0.9-0.7Z\"/><path class=\"ln\" d=\"M11.6 3.7v16.3\"/>","retry":"<path class=\"ln\" d=\"M4 12a8 8 0 0 1 13.4-5.9M20 12a8 8 0 0 1-13.4 5.9\"/><path d=\"M21.3 2.8v7h-7ZM2.7 21.2v-7h7Z\"/>","rewind":"<path d=\"M21 5.5v13.1L12 12ZM11.3 5.5v13.1L2.2 12Z\"/>","robot":"<path fill-rule=\"evenodd\" d=\"M8.5 8.7h6.9a3.1 3.1 0 0 1 3.1 3.1v4.3A3.1 3.1 0 0 1 15.5 19.3H8.5A3.1 3.1 0 0 1 5.4 16.2v-4.3A3.1 3.1 0 0 1 8.5 8.7Zm0.9 3.8a1.2 1.2 0 1 0 0 2.4a1.2 1.2 0 0 0 0-2.4Zm5.2 0a1.2 1.2 0 1 0 0 2.4a1.2 1.2 0 0 0 0-2.4ZM9.7 16v1.3h4.5v-1.3Z\"/><path class=\"ln\" d=\"M12 5.3v3.5M3.9 13.1v2.8M20.2 13.1v2.8\"/>","rocket":"<path fill-rule=\"evenodd\" d=\"M11.9 16.6L7.4 12.2C9.1 6.1 13.6 2.9 21.1 2.9c0 7.5-3.2 12-9.2 13.7ZM13.6 8.7a1.7 1.7 0 1 0 3.5 0a1.7 1.7 0 1 0-3.5 0Z\"/><path d=\"M3.7 12.2L6.8 7.5h3.5L6.6 12.6ZM11.4 17.4L11.9 20.3l4.6-3.3v-3.5ZM6.3 17.7c-2 0-3.9 2-3.9 3.9c2 0 3.9-2 3.9-3.9Z\"/>","save":"<path fill-rule=\"evenodd\" d=\"M4.4 2.7h12.4l3.5 3.5V20.8a0.7 0.7 0 0 1-0.7 0.7H4.4a0.7 0.7 0 0 1-0.7-0.7V3.4a0.7 0.7 0 0 1 0.7-0.7Zm3.4 1.4v4.9h7.4V4.1ZM7.2 13.6v6.4h9.6v-6.4Z\"/>","scissors":"<path fill-rule=\"evenodd\" d=\"M6.2 3.8a3.2 3.2 0 1 1 0 6.5a3.2 3.2 0 0 1 0-6.5Zm0 2a1.2 1.2 0 1 0 0 2.4a1.2 1.2 0 0 0 0-2.4ZM6.2 13.7a3.2 3.2 0 1 1 0 6.5a3.2 3.2 0 0 1 0-6.5Zm0 2a1.2 1.2 0 1 0 0 2.4a1.2 1.2 0 0 0 0-2.4Z\"/><path class=\"ln\" d=\"M8.7 8.8L20.4 18.1M8.7 15.2L20.4 5.9\"/>","search":"<path fill-rule=\"evenodd\" d=\"M10.6 3a7.7 7.7 0 1 1 0 15.4a7.7 7.7 0 0 1 0-15.4Zm0 3.2a4.5 4.5 0 1 0 0 9.2a4.5 4.5 0 0 0 0-9.2Z\"/><path class=\"ln\" d=\"M16.3 16.4l3.8 3.8\"/>","seedling":"<path d=\"M12.4 10.8C12.4 6.1 9.5 2.9 4 2.9c0 4.9 3 7.8 8.4 7.8ZM11.6 13.4c0-4.7 3-7.8 8.4-7.8c0 4.9-3 7.8-8.4 7.8Z\"/><path class=\"ln\" d=\"M12 20.4V12.5\"/>","server":"<path fill-rule=\"evenodd\" d=\"M5.2 2.6h13.4a2.7 2.7 0 0 1 2.7 2.7v3.4a2.7 2.7 0 0 1-2.7 2.7H5.2A2.7 2.7 0 0 1 2.5 8.6V5.3A2.7 2.7 0 0 1 5.2 2.6Zm2.2 2.9a1.5 1.5 0 1 0 0 2.9a1.5 1.5 0 0 0 0-2.9ZM5.2 12.7h13.4a2.7 2.7 0 0 1 2.7 2.7v3.4a2.7 2.7 0 0 1-2.7 2.7H5.2A2.7 2.7 0 0 1 2.5 18.7v-3.4A2.7 2.7 0 0 1 5.2 12.7Zm2.2 2.9a1.5 1.5 0 1 0 0 2.9a1.5 1.5 0 0 0 0-2.9Z\"/>","shapes":"<circle cx=\"7.3\" cy=\"7.6\" r=\"4.3\"/><path d=\"M16.5 2.7l5 8.6h-9.8ZM13.4 13.7h7.4v7.4h-7.4ZM2.5 21.1L6.8 13.7l4.3 7.4Z\"/>","shelter":"<path fill-rule=\"evenodd\" d=\"M12 2.7L2.5 10.2l1.1 1.5l1-0.8v10h14.8V10.9l1 0.8l1.1-1.5ZM9.5 20.9v-4.8a2.5 2.5 0 0 1 4.9 0v4.8ZM12 9.1a1.7 1.7 0 1 1 0 3.4a1.7 1.7 0 0 1 0-3.4Z\"/>","shield":"<path d=\"M12 2.6 4.6 5.8V12c0 4.6 3.1 8 7.4 9.5 4.3-1.5 7.4-4.9 7.4-9.5V5.8Z\"/>","shirt":"<path d=\"M8 2.7L2.5 5.9l2.5 4.9l1.5-0.8v11.2h11V10.1l1.5 0.8L21.5 5.9l-5.5-3.2c-0.6 1.5-1.9 2.5-4 2.5S8.6 4.2 8 2.7Z\"/>","skip":"<path d=\"M3.3 2.6v18.9L15.8 12Z\"/><rect x=\"17.8\" y=\"2.7\" width=\"3.2\" height=\"18.7\" rx=\"1.5\"/>","skull":"<path fill-rule=\"evenodd\" d=\"M12 2.6a7.9 7.9 0 0 0-7.9 7.9c0 2.4 1.1 4.2 2.5 5.4V19.5a2 2 0 0 0 2 2h6.8a2 2 0 0 0 2-2v-3.6c1.4-1.2 2.5-3 2.5-5.4A7.9 7.9 0 0 0 12 2.6ZM9.2 9.4a1.7 1.7 0 1 1 0 3.4a1.7 1.7 0 0 1 0-3.4ZM14.8 9.4a1.7 1.7 0 1 1 0 3.4a1.7 1.7 0 0 1 0-3.4ZM12 13.3l1 1.8h-2ZM10.1 18.1h0.9v2.4h-0.9ZM13 18.1h0.9v2.4H13Z\"/>","sliders":"<path class=\"ln\" d=\"M4 7h8.8M19.2 7H20M4 17h2.8M13.2 17H20\"/><circle cx=\"16\" cy=\"7\" r=\"3.2\"/><circle cx=\"10\" cy=\"17\" r=\"3.2\"/>","smile":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM9.9 8.6a1.4 1.4 0 1 1 0 2.8a1.4 1.4 0 0 1 0-2.8ZM16 8.6a1.4 1.4 0 1 1 0 2.8a1.4 1.4 0 0 1 0-2.8ZM8.8 13.5h8.3a4.1 4.1 0 0 1-8.3 0Z\"/>","spark":"<path d=\"M10.7 2.6l2 5.6l5.6 2l-5.6 2L10.7 17.8l-2-5.6l-5.6-2l5.6-2ZM17.6 14.7l0.9 2.5l2.5 0.9l-2.5 0.9l-0.9 2.5l-0.9-2.5l-2.5-0.9l2.5-0.9Z\"/>","square":"<rect x=\"2.7\" y=\"2.7\" width=\"18.7\" height=\"18.7\" rx=\"3.3\"/>","star":"<path d=\"M12 2.8l2.9 6l6.6 0.8l-4.9 4.5l1.3 6.6L12 17.4l-5.9 3.2l1.3-6.6l-4.9-4.5l6.6-0.8Z\"/>","steps":"<path fill-rule=\"evenodd\" d=\"M2.8 4h4.9v4.9H2.8Zm1 2.5l0.8-0.9l0.9 0.9l1.4-1.4l0.9 0.9l-2.3 2.3ZM2.8 9.4h4.9v4.9H2.8Zm1 2.5l0.8-0.9l0.9 0.9l1.4-1.4l0.9 0.9l-2.3 2.3ZM2.8 15h4.9v4.9H2.8Zm1 2.5l0.8-0.9l0.9 0.9l1.4-1.4l0.9 0.9l-2.3 2.3Z\"/><path class=\"ln\" d=\"M10.6 6.4H20.3M10.6 11.9H20.3M10.6 17.4H20.3\"/>","store":"<path d=\"M4.4 3h15l2 6.2v1.4a3.2 3.2 0 0 1-6.3 0a3.2 3.2 0 0 1-6.3 0a3.2 3.2 0 0 1-6.3 0V9.2ZM4 14.9h15.9v5.6a1.1 1.1 0 0 1-1.1 1.1H14.1v-5.1h-4.4v5.1H5.1a1.1 1.1 0 0 1-1.1-1.1Z\"/>","sun":"<circle cx=\"12\" cy=\"12\" r=\"3.8\"/><path class=\"ln\" d=\"M12 3.9v1.3M12 18.7v1.3M6.3 6.2l0.9 0.9M16.8 16.8L17.8 17.8M4 12h1.3M18.7 12h1.3M6.3 17.8l0.9-0.9M16.8 7.2L17.8 6.2\"/>","sword":"<path d=\"M21.2 2.8v4.7l-10.8 10.8l-4.7-4.7L16.5 2.8Z\"/><path class=\"ln\" d=\"M5.2 11.9L12.1 18.8M8.4 15.6L3.7 20.3\"/>","table":"<path d=\"M2.7 6.2a2.5 2.5 0 0 1 2.5-2.5h13.6a2.5 2.5 0 0 1 2.5 2.5v2.3H2.7ZM2.7 10.5h5.3v9.9H5.2a2.5 2.5 0 0 1-2.5-2.5ZM9.8 10.5h4.5v9.9H9.8ZM16.1 10.5h5.3V17.9a2.5 2.5 0 0 1-2.5 2.5h-2.7Z\"/>","tack":"<path d=\"M8.5 3h7.2a0.8 0.8 0 0 1 0.8 1l-0.8 4l2.8 2.8a0.7 0.7 0 0 1-0.6 1.4H6.1a0.7 0.7 0 0 1-0.6-1.4l2.8-2.8l-0.8-4a0.8 0.8 0 0 1 0.8-1Z\"/><path class=\"ln\" d=\"M12 12.2V20.5\"/>","tag":"<path fill-rule=\"evenodd\" d=\"M2.9 3.4A1.5 1.5 0 0 1 4.4 2.9h7.2l10 10l-8.7 8.7L2.9 10.6Zm5 2.5a1.9 1.9 0 1 0 0 3.7a1.9 1.9 0 0 0 0-3.7Z\"/>","target":"<path fill-rule=\"evenodd\" d=\"M12 2.6a9.4 9.4 0 1 1 0 18.8a9.4 9.4 0 0 1 0-18.8Zm0 3a6.4 6.4 0 1 0 0 12.9a6.4 6.4 0 0 0 0-12.9Zm0 2.7a3.7 3.7 0 1 1 0 7.4a3.7 3.7 0 0 1 0-7.4Z\"/>","tent":"<path fill-rule=\"evenodd\" d=\"M12 4.2L19.3 17.4H4.7ZM12 11.6L9.5 17.4h5.1Z\"/><path class=\"ln\" d=\"M3.9 17.7h16.2\"/>","terminal":"<path fill-rule=\"evenodd\" d=\"M5 3.6h14a2.4 2.4 0 0 1 2.4 2.4v12a2.4 2.4 0 0 1-2.4 2.4H5A2.4 2.4 0 0 1 2.6 18V6A2.4 2.4 0 0 1 5 3.6Zm1.4 6 1.3-1.3 3.6 3.7-3.6 3.7-1.3-1.3 2.4-2.4Zm6.4 4.6h4.4v1.7h-4.4Z\"/>","text":"<path fill-rule=\"evenodd\" d=\"M10.2 2.4h3.7l6.8 18.7h-3.4l-1.6-4.7H8.3l-1.6 4.7H3.3ZM9.3 13.6h5.4L12 5.7Z\"/>","thumbs-up":"<path d=\"M6.5 10.1v10.3H3.6a1.1 1.1 0 0 1-1.1-1.1v-8a1.1 1.1 0 0 1 1.1-1.1ZM7.9 10.1l3.6-7.3a2.4 2.4 0 0 1 2.7 2.8l-0.6 3.5h5.6a2.2 2.2 0 0 1 2.2 2.6l-1.4 7a2.2 2.2 0 0 1-2.2 1.7H7.9Z\"/>","ticket":"<path fill-rule=\"evenodd\" d=\"M2.6 6.4h18.8v3.4a2.2 2.2 0 0 0 0 4.4v3.4H2.6v-3.4a2.2 2.2 0 0 0 0-4.4ZM13.3 8.4v1.8h1.4V8.4Zm0 2.7v1.8h1.4v-1.8Zm0 2.7v1.8h1.4v-1.8Z\"/>","toolbox":"<path d=\"M2.7 10.1a2.5 2.5 0 0 1 2.5-2.5h13.6a2.5 2.5 0 0 1 2.5 2.5v2.2H2.7ZM2.7 13.7h4.7v1.5h1.6v-1.5h6.2v1.5h1.6v-1.5h4.7V17.8a2.5 2.5 0 0 1-2.5 2.5H5.2A2.5 2.5 0 0 1 2.7 17.8Z\"/><path class=\"ln\" d=\"M9.1 7.5V5.7A1.5 1.5 0 0 1 10.5 4.2h2.9A1.5 1.5 0 0 1 14.9 5.7v1.9\"/>","train":"<path fill-rule=\"evenodd\" d=\"M9.1 2.7h5.8a2.9 2.9 0 0 1 2.9 2.9v6.8a2.9 2.9 0 0 1-2.9 2.9H9.1a2.9 2.9 0 0 1-2.9-2.9V5.6a2.9 2.9 0 0 1 2.9-2.9Zm-1.2 2.5v4.1h8.2V5.2ZM9.1 11.4a1.1 1.1 0 1 0 0 2.1A1.1 1.1 0 0 0 9.1 11.4Zm5.8 0a1.1 1.1 0 1 0 0 2.1a1.1 1.1 0 0 0 0-2.1Z\"/><path class=\"ln\" d=\"M8.6 20.2l1.9-3.4M15.4 20.2l-1.9-3.4\"/>","trash":"<path d=\"M5.8 7.6h12.4l-1 12a2 2 0 0 1-2 1.8H8.8a2 2 0 0 1-2-1.8Z\"/><path class=\"ln\" d=\"M3.8 6.6h16.4M9 6.6V4h6v2.6\"/>","tree":"<path d=\"M12 2.5L5.9 10.7h3L4.4 16.9h15.1l-4.5-6.2h3Z\"/><path class=\"ln\" d=\"M12 16.2v4\"/>","trophy":"<path d=\"M7.3 3h9.6V8.6a4.7 4.7 0 0 1-9.6 0Z\"/><path class=\"ln\" d=\"M7.3 5.6H5a3.1 3.1 0 0 0 3.1 4.1M16.7 5.6h2.3a3.1 3.1 0 0 1-3.1 4.1M12 13.7V16.9M8 20.4h8.1\"/>","tv":"<rect x=\"2.7\" y=\"7.4\" width=\"18.6\" height=\"13.3\" rx=\"2.3\"/><path class=\"ln\" d=\"M8.2 3.8l3.8 3.4l3.8-3.4\"/>","umbrella":"<path d=\"M2.6 12.7a9.4 9.4 0 0 1 18.8 0Z\"/><path class=\"ln\" d=\"M12 12.7v5.6a1.9 1.9 0 0 1-3.8 0\"/>","upload":"<path d=\"M10.6 21.7h2.5v-7h4.7L11.9 8.6l-5.9 5.9h4.7Z\"/><path class=\"ln\" d=\"M4.5 4.3h14.9\"/>","user":"<circle cx=\"12\" cy=\"6.7\" r=\"4.5\"/><path d=\"M3.5 21c0-4.7 3.8-7.8 8.5-7.8s8.5 3.2 8.5 7.8Z\"/>","user-check":"<circle cx=\"8.9\" cy=\"7.5\" r=\"3.2\"/><path d=\"M2.9 19.3c0-3.4 2.7-5.9 5.9-5.9s5.9 2.4 5.9 5.9Z\"/><path class=\"ln\" d=\"M14.8 10.6l1.9 1.9l3.8-3.8\"/>","user-circle":"<path fill-rule=\"evenodd\" d=\"M13 2.9a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7Zm0 3.8a3.3 3.3 0 1 1 0 6.5a3.3 3.3 0 0 1 0-6.5ZM7.2 17.9a6.7 6.7 0 0 1 11.5 0a8.1 8.1 0 0 1-11.5 0Z\"/>","user-lock":"<circle cx=\"9.9\" cy=\"7.2\" r=\"4.2\"/><path d=\"M2.7 20c0-4.2 3.2-7 7.2-7c1.2 0 2.3 0.3 3.2 0.8v6.2Z\"/><rect x=\"14.5\" y=\"14.5\" width=\"6.9\" height=\"5.7\" rx=\"1.3\"/><path class=\"ln\" d=\"M16.4 14.5v-1a1.5 1.5 0 0 1 3 0v1\"/>","user-minus":"<circle cx=\"9.6\" cy=\"7.6\" r=\"3.9\"/><path d=\"M2.8 19.7c0-3.9 3.1-6.6 6.8-6.6c1.2 0 2.2 0.3 3.1 0.8v5.9Z\"/><path class=\"ln\" d=\"M15.1 16.7h5.2\"/>","user-off":"<path d=\"M9.1 4.7A4.2 4.2 0 1 1 15 10.6ZM4.2 20.8c0-4.3 2.8-6.9 6.3-7.2L17.5 20.8Z\"/><path class=\"ln\" d=\"M4 3.5l16.2 16.2\"/>","user-pen":"<circle cx=\"9.8\" cy=\"7.6\" r=\"4\"/><path d=\"M2.9 19.9c0-4 3.1-6.7 6.9-6.7c1.2 0 2.2 0.3 3.1 0.8v5.9Z\"/><path d=\"M19.5 11.4l2.1 2.1l-5.2 5.2l-2.8 0.7l0.7-2.8Z\"/>","user-tag":"<circle cx=\"10\" cy=\"7.4\" r=\"4\"/><path d=\"M2.9 19.9c0-4 3.2-6.8 7-6.8c1.2 0 2.3 0.3 3.2 0.8v6Z\"/><path fill-rule=\"evenodd\" d=\"M14 13.7h4.5l3.1 3.1l-3.1 3.1h-4.5ZM15.2 16.8a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z\"/>","video":"<path d=\"M3 7.7a2 2 0 0 1 2-2H14.4a2 2 0 0 1 2 2v8.7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2ZM17.5 10.1l4.2-2.6v8.9l-4.2-2.6Z\"/>","volume":"<path d=\"M2.5 8.9h4l5.4-4.2v14.6l-5.4-4.2H2.5Z\"/><path class=\"ln\" d=\"M15.2 9.3a3.8 3.8 0 0 1 0 5.5M17.7 6.5a7.5 7.5 0 0 1 0 11\"/>","walk":"<circle cx=\"12.4\" cy=\"4.6\" r=\"2.2\"/><path class=\"ln\" d=\"M8.7 19.8l2.4-5.5l1.9 2.2V19.8M11.1 14.3l0.9-5.2l-2.8 1.5l-1.4 2.8M12 9.1l1.8 2.8l2.8 0.9\"/>","wallet":"<path fill-rule=\"evenodd\" d=\"M5.7 2.8H19v4.6h1.6a0.9 0.9 0 0 1 0.9 0.9v12.4H5.1a2.5 2.5 0 0 1-2.5-2.5V5.9a3.1 3.1 0 0 1 3.1-3.1Zm0 2.1a1 1 0 0 0 0 2.1h11.2V4.9ZM16.7 12.9a1.4 1.4 0 1 0 0 2.8a1.4 1.4 0 0 0 0-2.8Z\"/>","water":"<path d=\"M2.7 7.9c2.4 0 2.4-2 4.7-2s2.4 2 4.6 2s2.4-2 4.7-2s2.4 2 4.6 2v3.2c-2.3 0-2.3-2-4.6-2s-2.4 2-4.7 2s-2.3-2-4.6-2s-2.4 2-4.7 2ZM2.7 14.8c2.4 0 2.4-2 4.7-2s2.4 2 4.6 2s2.4-2 4.7-2s2.4 2 4.6 2v3.2c-2.3 0-2.3-2-4.6-2s-2.4 2-4.7 2s-2.3-2-4.6-2s-2.4 2-4.7 2Z\"/>","weight":"<circle cx=\"12\" cy=\"4.8\" r=\"2.6\"/><path d=\"M6.5 8.7h10.9l3.3 12.3H3.2Z\"/>","window":"<path d=\"M2.6 6.2a2.7 2.7 0 0 1 2.7-2.7h13.4a2.7 2.7 0 0 1 2.7 2.7v1.5H2.6ZM2.6 9.8h18.7v7.7a2.7 2.7 0 0 1-2.7 2.7h-13.4a2.7 2.7 0 0 1-2.7-2.7Z\"/>","window-restore":"<path d=\"M2.7 10.4a2.7 2.7 0 0 1 2.7-2.7h8.2a2.7 2.7 0 0 1 2.7 2.7v7.2a2.7 2.7 0 0 1-2.7 2.7h-8.2a2.7 2.7 0 0 1-2.7-2.7ZM7.9 6.4V6.3a2.7 2.7 0 0 1 2.7-2.7h8.2a2.7 2.7 0 0 1 2.7 2.7v7.2a2.7 2.7 0 0 1-2.7 2.7h-1.1v-5.8a4 4 0 0 0-4-4Z\"/>","wrench":"<path d=\"M14.9 2.5a6 6 0 0 0-5.5 8.3L2.7 17.5V21.3H6.5l6.7-6.7a6 6 0 0 0 8.3-5.5l-3.5 1.3l-2.9-2.9l1.3-3.5Z\"/>","x-circle":"<path fill-rule=\"evenodd\" d=\"M12.9 2.7a9.4 9.4 0 1 0 0 18.7a9.4 9.4 0 0 0 0-18.7ZM10.1 7.9L12.9 10.7l2.9-2.9l1.4 1.4l-2.9 2.9l2.9 2.9l-1.4 1.4l-2.9-2.9l-2.9 2.9l-1.4-1.4l2.9-2.9l-2.9-2.9Z\"/>","zap":"<path d=\"M13.9 2.5L5.2 13.3h6.1l-1.2 8.1l8.7-10.8h-6.1Z\"/>"};
const FA = {"address-card":"id","adjust":"contrast","align-left":"align-left","angle-down":"down","angle-right":"chevron","angles-left":"chevrons-left","angles-right":"chevrons-right","arrow-down":"arrow-down","arrow-down-short-wide":"sort-asc","arrow-down-wide-short":"sort","arrow-left":"arrow-left","arrow-right":"arrow-right","arrow-right-arrow-left":"swap","arrow-right-from-bracket":"leave","arrow-right-to-bracket":"enter","arrow-rotate-right":"retry","arrow-trend-down":"trend-down","arrow-trend-up":"trend-up","arrow-up":"arrow-up","arrow-up-from-bracket":"share","arrow-up-right-from-square":"open","arrows-left-right":"arrows-h","arrows-rotate":"retry","arrows-to-dot":"focus","arrows-up-down-left-right":"move","at":"at","backward":"rewind","backward-fast":"rewind","balance-scale":"scale","ban":"ban","bars":"menu","basket-shopping":"cart","bell":"bell","bolt":"zap","bolt-lightning":"zap","book":"book","book-open":"book-open","box":"box","box-archive":"archive","box-open":"box","brain":"brain","bridge":"bridge","briefcase":"briefcase","briefcase-medical":"medical","broadcast-tower":"live","bug":"bug","bullhorn":"megaphone","bullseye":"target","burst":"burst","calendar":"calendar","calendar-day":"calendar","calendar-days":"calendar","camera":"camera","camera-cctv":"camera","camera-retro":"camera","camera-rotate":"camera-flip","camera-slash":"camera-off","campground":"tent","car":"car","caret-down":"down","cart":"cart","cart-plus":"cart","cart-shopping":"cart","chart-area":"chart","chart-bar":"chart","chart-column":"chart","chart-line":"chart","chart-simple":"chart","check":"check","check-circle":"check-circle","check-double":"check-double","chevron-down":"down","chevron-left":"back","chevron-right":"chevron","chevron-up":"up","child":"child","circle":"circle","circle-check":"check-circle","circle-dollar-to-slot":"donate","circle-dot":"record","circle-exclamation":"alert-circle","circle-half-stroke":"contrast","circle-info":"info","circle-minus":"minus-circle","circle-nodes":"nodes","circle-notch":"busy","circle-play":"play","circle-plus":"plus-circle","circle-question":"help","circle-user":"user-circle","circle-xmark":"x-circle","city":"city","clapperboard":"clapper","clipboard":"clipboard","clipboard-check":"clipboard-check","clipboard-list":"clipboard","clock":"clock","clock-rotate-left":"history","clone":"copy","closed-captioning":"cc","cloud":"cloud","cloud-arrow-up":"upload","cloud-bolt":"storm","cloud-moon":"cloud","cloud-rain":"cloud","cloud-showers-heavy":"cloud","cloud-slash":"cloud-off","cloud-sun":"cloud","code":"code","code-branch":"branch","code-commit":"commit","code-fork":"branch","coin":"coin","coins":"coin","comment":"chat","comment-dots":"chat","comment-slash":"chat-off","comments":"chat","compass":"compass","compress":"compress","cookie":"cookie","cookie-bite":"cookie","copy":"copy","couch":"couch","credit-card":"card","crown":"crown","cube":"box","cubes":"cubes","cut":"scissors","database":"database","desktop":"computer","diagram-project":"nodes","dice":"dice","dice-five":"dice","dice-six":"dice","display":"computer","dollar-sign":"dollar","door-closed":"door","door-open":"door","down-left-and-up-right-to-center":"compress","download":"download","droplet":"drop","ear-listen":"ear","earth-americas":"globe","earth-europe":"globe","ellipsis":"more","ellipsis-vertical":"more","envelope":"mail","eraser":"eraser","exchange-alt":"swap","expand":"expand","external-link":"open","eye":"eye","eye-slash":"eye-off","face-grin":"laugh","face-grin-squint":"laugh","face-grin-squint-tears":"laugh","face-grin-stars":"smile","face-laugh":"laugh","face-smile":"smile","faucet":"drop","faucet-drip":"drop","file":"file","file-audio":"file","file-code":"file-code","file-image":"image","file-lines":"file","file-pdf":"file","file-pen":"pencil","film":"film","filter":"filter","fire":"fire","fish":"fish","fist-raised":"fist","flag":"flag","flag-checkered":"finish","flask":"flask","flask-vial":"flask","floppy-disk":"save","folder":"folder","folder-open":"folder","folder-tree":"folder-tree","font":"text","forward":"fast-forward","forward-fast":"fast-forward","forward-step":"skip","gamepad":"game","gauge":"gauge","gauge-high":"gauge","gauge-simple":"gauge","gauge-simple-high":"gauge","gauge-simple-low":"gauge","gavel":"gavel","gear":"gear","gears":"gear","gem":"gem","ghost":"ghost","gift":"gift","globe":"globe","grid":"grid","grip":"grip","grip-vertical":"grip","hammer":"hammer","hand":"hand","hand-fist":"fist","hand-holding-dollar":"coin","hand-holding-heart":"care","hand-point-right":"hand","hand-pointer":"hand","handshake":"handshake","handshake-angle":"handshake","hard-drive":"drive","hashtag":"hash","hat-wizard":"wizard","hdd":"drive","heading":"heading","headphones":"headphones","headphones-simple":"headphones","headset":"headphones","heart":"heart","heart-crack":"heart-broken","heart-pulse":"heart-pulse","heartbeat":"heart-pulse","hiking":"mountain","hot-tub":"hot-tub","hot-tub-person":"hot-tub","hourglass":"hourglass","hourglass-end":"hourglass","hourglass-half":"hourglass","hourglass-start":"hourglass","house":"home","house-chimney":"home","house-signal":"home","icicles":"snow","icons":"shapes","id-card":"id","image":"image","images":"image","inbox":"inbox","infinity":"infinity","info-circle":"info","key":"key","keyboard":"keyboard","kit-medical":"medical","language":"language","laptop":"computer","layer-group":"layers","leaf":"leaf","left-right":"arrows-h","life-ring":"lifebuoy","lightbulb":"idea","link":"link","link-slash":"link-off","list":"list","list-check":"steps","list-ol":"list-ordered","list-ul":"list","location-dot":"pin","location-pin":"pin","lock":"lock","lungs":"lungs","magnifying-glass":"search","map":"map","map-location-dot":"map","map-marker-alt":"pin","map-pin":"pin","mask":"mask","message":"chat","microchip":"chip","microphone":"mic","microphone-lines":"mic","microphone-slash":"mic-off","minus":"minus","minus-circle":"minus-circle","mobile-screen":"phone","mobile-screen-button":"phone","money-bill":"money","money-bill-1":"money","money-bill-transfer":"money","money-bill-wave":"money","money-check":"money","moon":"moon","mountain":"mountain","mountain-sun":"mountain","mug-hot":"mug","mug-saucer":"mug","music":"music","network-wired":"nodes","newspaper":"news","object-group":"group","paint-brush":"palette","paintbrush":"palette","palette":"palette","paper-plane":"plane","parking":"parking","paste":"clipboard","pause":"pause","paw":"paw","pen":"pencil","pen-nib":"pencil","pen-to-square":"pencil","pencil":"pencil","people-arrows":"members","people-group":"members","person-hiking":"mountain","person-shelter":"shelter","person-swimming":"water","person-walking":"walk","phone":"phone","phone-slash":"phone-off","photo-film":"film","piggy-bank":"piggy","plane":"airplane","plane-departure":"airplane","play":"play","plug":"plug","plug-circle-bolt":"plug","plug-circle-check":"plug","plug-circle-xmark":"plug","plus":"plus","plus-circle":"plus-circle","print":"print","puzzle":"puzzle","puzzle-piece":"puzzle","puzzle-piece-simple":"puzzle","question":"help","quote-left":"quote","quote-right":"quote","radio":"radio","ranking-star":"ranking","recycle":"recycle","reply":"reply","restroom":"restroom","right-from-bracket":"leave","right-left":"swap","right-to-bracket":"enter","road":"road","robot":"robot","rocket":"rocket","rotate":"retry","rotate-back":"undo","rotate-left":"retry","rotate-right":"retry","route":"route","rss":"rss","satellite-dish":"dish","save":"save","scale-balanced":"scale","scissors":"scissors","screwdriver-wrench":"wrench","scroll":"scroll","search":"search","seedling":"seedling","server":"server","shapes":"shapes","share-nodes":"nodes","shield":"shield","shield-halved":"shield","shirt":"shirt","signal":"wifi","signature":"signature","sitemap":"nodes","skull":"skull","skull-crossbones":"skull","slash":"slash","sliders":"sliders","sliders-h":"sliders","smog":"cloud","snowflake":"snow","sparkles":"spark","spinner":"busy","square":"square","square-parking":"parking","star":"star","star-of-life":"spark","step-forward":"skip","stop":"stop","store":"store","suitcase":"briefcase","suitcase-medical":"medical","sun":"sun","sword":"sword","table":"table","table-cells":"grid","table-columns":"columns","table-list":"table","tag":"tag","tags":"tag","television":"tv","terminal":"terminal","text-height":"text","th":"grid","thumbs-up":"thumbs-up","thumbtack":"tack","ticket":"ticket","timeline":"timeline","times":"close","toolbox":"toolbox","tower-broadcast":"live","tower-cell":"live","train":"train","trash":"trash","trash-can":"trash","tree":"tree","triangle-exclamation":"alert","trophy":"trophy","tv":"tv","umbrella":"umbrella","umbrella-beach":"umbrella","undo":"undo","unlock":"lock","up-right-and-down-left-from-center":"expand","up-right-from-square":"open","upload":"upload","user":"user","user-astronaut":"user","user-check":"user-check","user-circle":"user-circle","user-edit":"user-pen","user-group":"members","user-lock":"user-lock","user-minus":"user-minus","user-pen":"user-pen","user-plus":"invite","user-secret":"user","user-shield":"shield","user-slash":"user-off","user-tag":"user-tag","users":"members","utensils":"food","video":"video","video-slash":"video","volume-high":"volume","volume-low":"volume","volume-off":"mute","volume-xmark":"mute","wallet":"wallet","wand-magic":"spark","wand-magic-sparkles":"spark","water":"water","wave-square":"wave","weight-hanging":"weight","wifi":"wifi","wind":"wind","window-maximize":"window","window-restore":"window-restore","wrench":"wrench","xmark":"close","xmark-circle":"x-circle"};
const FB = {"youtube":"youtube","square-youtube":"youtube","twitch":"twitch","discord":"discord","github":"github","square-github":"github","x-twitter":"x","square-x-twitter":"x","twitter":"x","kick":"kick","kickstarter-k":"kick","kickstarter":"kickstarter","google":"google","tiktok":"tiktok","threads":"threads","spotify":"spotify","soundcloud":"soundcloud","reddit":"reddit","reddit-alien":"reddit","tumblr":"tumblr","hacker-news":"ycombinator","line":"line","paypal":"paypal","patreon":"patreon","mastodon":"mastodon","linux":"linux","instagram":"instagram","facebook":"facebook","facebook-f":"facebook","cloudflare":"cloudflare","brave":"brave","bluesky":"bluesky","bitcoin":"bitcoin","apple":"apple","telegram":"telegram","whatsapp":"whatsapp","steam":"steam","snapchat":"snapchat","pinterest":"pinterest","vimeo":"vimeo","vimeo-v":"vimeo","npm":"npm","node":"nodedotjs","node-js":"nodedotjs","docker":"docker","python":"python","android":"android","chrome":"googlechrome","firefox":"firefoxbrowser","firefox-browser":"firefoxbrowser","gitlab":"gitlab","ubuntu":"ubuntu","raspberry":"raspberrypi","raspberry-pi":"raspberrypi","stripe":"stripe","cc-stripe":"stripe","signal":"signal","matrix":"matrix","medium":"medium","wikipedia":"wikipedia","wikipedia-w":"wikipedia","ethereum":"ethereum"};
// Font Awesome's style, size, layout and animation classes: they say how, not what.
ddiff --git a/ov-glyphs.svg b/ov-glyphs.svg
iindex c176347..4560982 100644
---- a/ov-glyphs.svg
++++ b/ov-glyphs.svg
@@@ -188,13 +188,13 @@
<symbol id="ovg-card-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.7" y="5.8" width="16.7" height="12.3" rx="1.8"/><path d="M3.7 10.3h16.7M6.7 14.6h3.5"/></symbol>
<symbol id="ovg-card-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M2.6 7.4a2.4 2.4 0 0 1 2.4-2.4h13.9a2.4 2.4 0 0 1 2.4 2.4v9.3a2.4 2.4 0 0 1-2.4 2.4h-13.9a2.4 2.4 0 0 1-2.4-2.4ZM2.6 9.5v1.7h18.7V9.5ZM5.9 14.2v1.5h4.8v-1.5Z"/></symbol>
<symbol id="ovg-card-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M2.6 7.4a2.4 2.4 0 0 1 2.4-2.4h13.9a2.4 2.4 0 0 1 2.4 2.4v9.3a2.4 2.4 0 0 1-2.4 2.4h-13.9a2.4 2.4 0 0 1-2.4-2.4ZM2.6 9.5v1.7h18.7V9.5ZM5.9 14.2v1.5h4.8v-1.5Z"/></g><rect x="3.7" y="5.8" width="16.7" height="12.3" rx="1.8"/><path d="M3.7 10.3h16.7M6.7 14.6h3.5"/></symbol>
--<symbol id="ovg-care" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.3 16.5h3.2l4.2 3.2h5.8a2.2 2.2 0 0 0 0-4.2H12.8M7.5 16.5l2.4-2.2h3.5"/><path d="M16.6 10.6s-3.4-2.2-3.4-4.7a2.1 2.1 0 0 1 3.4-1.4a2.1 2.1 0 0 1 3.4 1.4c0 2.6-3.4 4.7-3.4 4.7Z"/></symbol>
--<symbol id="ovg-care-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M3.3 16.5h3.2l4.2 3.2h5.8a2.2 2.2 0 0 0 0-4.2H12.8M7.5 16.5l2.4-2.2h3.5"/><path d="M16.6 10.6s-3.4-2.2-3.4-4.7a2.1 2.1 0 0 1 3.4-1.4a2.1 2.1 0 0 1 3.4 1.4c0 2.6-3.4 4.7-3.4 4.7Z"/></symbol>
--<symbol id="ovg-care-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.3 16.5h3.2l4.2 3.2h5.8a2.2 2.2 0 0 0 0-4.2H12.8M7.5 16.5l2.4-2.2h3.5"/><path d="M16.6 10.6s-3.4-2.2-3.4-4.7a2.1 2.1 0 0 1 3.4-1.4a2.1 2.1 0 0 1 3.4 1.4c0 2.6-3.4 4.7-3.4 4.7Z"/></symbol>
--<symbol id="ovg-care-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.3 16.5h3.2l4.2 3.2h5.8a2.2 2.2 0 0 0 0-4.2H12.8M7.5 16.5l2.4-2.2h3.5"/><path d="M16.6 10.6s-3.4-2.2-3.4-4.7a2.1 2.1 0 0 1 3.4-1.4a2.1 2.1 0 0 1 3.4 1.4c0 2.6-3.4 4.7-3.4 4.7Z"/></symbol>
--<symbol id="ovg-care-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.3 16.5h3.2l4.2 3.2h5.8a2.2 2.2 0 0 0 0-4.2H12.8M7.5 16.5l2.4-2.2h3.5"/><path d="M16.6 10.6s-3.4-2.2-3.4-4.7a2.1 2.1 0 0 1 3.4-1.4a2.1 2.1 0 0 1 3.4 1.4c0 2.6-3.4 4.7-3.4 4.7Z"/></symbol>
--<symbol id="ovg-care-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M17 11s-4.1-2.4-4.1-5.4a2.3 2.3 0 0 1 4.1-1.6a2.3 2.3 0 0 1 4.1 1.6c0 2.9-4.1 5.4-4.1 5.4Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M3.5 16.2h3.2l4.3 3.2h5.9a2.1 2.1 0 0 0 0-4.3H13.3M7.9 16.2l2.3-2.1h3.6"/></symbol>
--<symbol id="ovg-care-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M17 11s-4.1-2.4-4.1-5.4a2.3 2.3 0 0 1 4.1-1.6a2.3 2.3 0 0 1 4.1 1.6c0 2.9-4.1 5.4-4.1 5.4Z"/><path class="ln" d="M3.5 16.2h3.2l4.3 3.2h5.9a2.1 2.1 0 0 0 0-4.3H13.3M7.9 16.2l2.3-2.1h3.6"/></g><path d="M3.3 16.5h3.2l4.2 3.2h5.8a2.2 2.2 0 0 0 0-4.2H12.8M7.5 16.5l2.4-2.2h3.5"/><path d="M16.6 10.6s-3.4-2.2-3.4-4.7a2.1 2.1 0 0 1 3.4-1.4a2.1 2.1 0 0 1 3.4 1.4c0 2.6-3.4 4.7-3.4 4.7Z"/></symbol>
++<symbol id="ovg-care" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 10.6s-3.8-2.3-3.8-5a2.1 2.1 0 0 1 3.8-1.3a2.1 2.1 0 0 1 3.8 1.3c0 2.7-3.8 5-3.8 5Z"/><path d="M3.5 13.5v6.5M3.5 15h3.3l3.4 2.8h7.7a1.8 1.8 0 0 0 0-3.6h-4.1"/></symbol>
++<symbol id="ovg-care-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M12 10.6s-3.8-2.3-3.8-5a2.1 2.1 0 0 1 3.8-1.3a2.1 2.1 0 0 1 3.8 1.3c0 2.7-3.8 5-3.8 5Z"/><path d="M3.5 13.5v6.5M3.5 15h3.3l3.4 2.8h7.7a1.8 1.8 0 0 0 0-3.6h-4.1"/></symbol>
++<symbol id="ovg-care-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 10.6s-3.8-2.3-3.8-5a2.1 2.1 0 0 1 3.8-1.3a2.1 2.1 0 0 1 3.8 1.3c0 2.7-3.8 5-3.8 5Z"/><path d="M3.5 13.5v6.5M3.5 15h3.3l3.4 2.8h7.7a1.8 1.8 0 0 0 0-3.6h-4.1"/></symbol>
++<symbol id="ovg-care-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 10.6s-3.8-2.3-3.8-5a2.1 2.1 0 0 1 3.8-1.3a2.1 2.1 0 0 1 3.8 1.3c0 2.7-3.8 5-3.8 5Z"/><path d="M3.5 13.5v6.5M3.5 15h3.3l3.4 2.8h7.7a1.8 1.8 0 0 0 0-3.6h-4.1"/></symbol>
++<symbol id="ovg-care-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 10.6s-3.8-2.3-3.8-5a2.1 2.1 0 0 1 3.8-1.3a2.1 2.1 0 0 1 3.8 1.3c0 2.7-3.8 5-3.8 5Z"/><path d="M3.5 13.5v6.5M3.5 15h3.3l3.4 2.8h7.7a1.8 1.8 0 0 0 0-3.6h-4.1"/></symbol>
++<symbol id="ovg-care-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M12 11s-4.3-2.6-4.3-5.6a2.3 2.3 0 0 1 4.3-1.5a2.3 2.3 0 0 1 4.3 1.5c0 3-4.3 5.6-4.3 5.6Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M3.8 13.8v6M3.8 15.2h3.1l3.3 2.7h7.5a1.7 1.7 0 0 0 0-3.4h-3.9"/></symbol>
++<symbol id="ovg-care-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M12 11s-4.3-2.6-4.3-5.6a2.3 2.3 0 0 1 4.3-1.5a2.3 2.3 0 0 1 4.3 1.5c0 3-4.3 5.6-4.3 5.6Z"/><path class="ln" d="M3.8 13.8v6M3.8 15.2h3.1l3.3 2.7h7.5a1.7 1.7 0 0 0 0-3.4h-3.9"/></g><path d="M12 10.6s-3.8-2.3-3.8-5a2.1 2.1 0 0 1 3.8-1.3a2.1 2.1 0 0 1 3.8 1.3c0 2.7-3.8 5-3.8 5Z"/><path d="M3.5 13.5v6.5M3.5 15h3.3l3.4 2.8h7.7a1.8 1.8 0 0 0 0-3.6h-4.1"/></symbol>
<symbol id="ovg-cart" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 4.1h1.9l2.2 10.2h10.2L20.3 6.9H6.5"/><circle cx="9.1" cy="18.6" r="1.2"/><circle cx="16.5" cy="18.6" r="1.2"/></symbol>
<symbol id="ovg-cart-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 4.1h1.9l2.2 10.2h10.2L20.3 6.9H6.5"/><circle cx="9.1" cy="18.6" r="1.2"/><circle cx="16.5" cy="18.6" r="1.2"/></symbol>
<symbol id="ovg-cart-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 4.1h1.9l2.2 10.2h10.2L20.3 6.9H6.5"/><circle cx="9.1" cy="18.6" r="1.2"/><circle cx="16.5" cy="18.6" r="1.2"/></symbol>
@@@ -521,13 +521,13 @@
<symbol id="ovg-eye-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 12S6.6 6.2 12 6.2S20.5 12 20.5 12S17.4 17.8 12 17.8S3.5 12 3.5 12Z"/><circle cx="12" cy="12" r="2.7"/></symbol>
<symbol id="ovg-eye-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 5.3C6.4 5.3 2.6 12 2.6 12s3.9 6.7 9.4 6.7S21.5 12 21.5 12S17.6 5.3 12 5.3Zm0 3.3a3.3 3.3 0 1 1 0 6.7a3.3 3.3 0 0 1 0-6.7Z"/><circle cx="12" cy="12" r="1.6"/></symbol>
<symbol id="ovg-eye-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 5.3C6.4 5.3 2.6 12 2.6 12s3.9 6.7 9.4 6.7S21.5 12 21.5 12S17.6 5.3 12 5.3Zm0 3.3a3.3 3.3 0 1 1 0 6.7a3.3 3.3 0 0 1 0-6.7Z"/><circle cx="12" cy="12" r="1.6"/></g><path d="M3.5 12S6.6 6.2 12 6.2S20.5 12 20.5 12S17.4 17.8 12 17.8S3.5 12 3.5 12Z"/><circle cx="12" cy="12" r="2.7"/></symbol>
--<symbol id="ovg-eye-off" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.7 12s3.2-6.1 8.3-6.1c1.5 0 2.7 0.5 4 1.1M20.5 12s-3.2 6.1-8.3 6.1c-1.5 0-2.7-0.5-4-1.1"/><path d="M10.1 9.9a2.7 2.7 0 0 0 3.9 3.9M4.6 4.5l14.9 14.9"/></symbol>
--<symbol id="ovg-eye-off-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M3.7 12s3.2-6.1 8.3-6.1c1.5 0 2.7 0.5 4 1.1M20.5 12s-3.2 6.1-8.3 6.1c-1.5 0-2.7-0.5-4-1.1"/><path d="M10.1 9.9a2.7 2.7 0 0 0 3.9 3.9M4.6 4.5l14.9 14.9"/></symbol>
--<symbol id="ovg-eye-off-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.7 12s3.2-6.1 8.3-6.1c1.5 0 2.7 0.5 4 1.1M20.5 12s-3.2 6.1-8.3 6.1c-1.5 0-2.7-0.5-4-1.1"/><path d="M10.1 9.9a2.7 2.7 0 0 0 3.9 3.9M4.6 4.5l14.9 14.9"/></symbol>
--<symbol id="ovg-eye-off-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.7 12s3.2-6.1 8.3-6.1c1.5 0 2.7 0.5 4 1.1M20.5 12s-3.2 6.1-8.3 6.1c-1.5 0-2.7-0.5-4-1.1"/><path d="M10.1 9.9a2.7 2.7 0 0 0 3.9 3.9M4.6 4.5l14.9 14.9"/></symbol>
--<symbol id="ovg-eye-off-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.7 12s3.2-6.1 8.3-6.1c1.5 0 2.7 0.5 4 1.1M20.5 12s-3.2 6.1-8.3 6.1c-1.5 0-2.7-0.5-4-1.1"/><path d="M10.1 9.9a2.7 2.7 0 0 0 3.9 3.9M4.6 4.5l14.9 14.9"/></symbol>
++<symbol id="ovg-eye-off" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.6 6.1c0.5-0.1 0.9-0.1 1.4-0.1c5.2 0 8.5 6 8.5 6s-0.6 1.1-1.7 2.4M6.9 7.6C4.7 9.2 3.5 12 3.5 12s3.3 6 8.5 6c1.6 0 3-0.5 4.2-1.2"/><path d="M10 10a2.8 2.8 0 0 0 4 4M4.5 4.5l15 15"/></symbol>
++<symbol id="ovg-eye-off-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M10.6 6.1c0.5-0.1 0.9-0.1 1.4-0.1c5.2 0 8.5 6 8.5 6s-0.6 1.1-1.7 2.4M6.9 7.6C4.7 9.2 3.5 12 3.5 12s3.3 6 8.5 6c1.6 0 3-0.5 4.2-1.2"/><path d="M10 10a2.8 2.8 0 0 0 4 4M4.5 4.5l15 15"/></symbol>
++<symbol id="ovg-eye-off-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.6 6.1c0.5-0.1 0.9-0.1 1.4-0.1c5.2 0 8.5 6 8.5 6s-0.6 1.1-1.7 2.4M6.9 7.6C4.7 9.2 3.5 12 3.5 12s3.3 6 8.5 6c1.6 0 3-0.5 4.2-1.2"/><path d="M10 10a2.8 2.8 0 0 0 4 4M4.5 4.5l15 15"/></symbol>
++<symbol id="ovg-eye-off-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.6 6.1c0.5-0.1 0.9-0.1 1.4-0.1c5.2 0 8.5 6 8.5 6s-0.6 1.1-1.7 2.4M6.9 7.6C4.7 9.2 3.5 12 3.5 12s3.3 6 8.5 6c1.6 0 3-0.5 4.2-1.2"/><path d="M10 10a2.8 2.8 0 0 0 4 4M4.5 4.5l15 15"/></symbol>
++<symbol id="ovg-eye-off-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.6 6.1c0.5-0.1 0.9-0.1 1.4-0.1c5.2 0 8.5 6 8.5 6s-0.6 1.1-1.7 2.4M6.9 7.6C4.7 9.2 3.5 12 3.5 12s3.3 6 8.5 6c1.6 0 3-0.5 4.2-1.2"/><path d="M10 10a2.8 2.8 0 0 0 4 4M4.5 4.5l15 15"/></symbol>
<symbol id="ovg-eye-off-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M9 5.8A10 10 0 0 1 21.4 12a10 10 0 0 1-2.5 3.8L15.3 12.2a3.3 3.3 0 0 0-3.5-3.5ZM15 18.2A10 10 0 0 1 2.6 12a10 10 0 0 1 2.5-3.8L8.7 11.8a3.3 3.3 0 0 0 3.5 3.5Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M4.6 4.6l14.8 14.8"/></symbol>
--<symbol id="ovg-eye-off-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M9 5.8A10 10 0 0 1 21.4 12a10 10 0 0 1-2.5 3.8L15.3 12.2a3.3 3.3 0 0 0-3.5-3.5ZM15 18.2A10 10 0 0 1 2.6 12a10 10 0 0 1 2.5-3.8L8.7 11.8a3.3 3.3 0 0 0 3.5 3.5Z"/><path class="ln" d="M4.6 4.6l14.8 14.8"/></g><path d="M3.7 12s3.2-6.1 8.3-6.1c1.5 0 2.7 0.5 4 1.1M20.5 12s-3.2 6.1-8.3 6.1c-1.5 0-2.7-0.5-4-1.1"/><path d="M10.1 9.9a2.7 2.7 0 0 0 3.9 3.9M4.6 4.5l14.9 14.9"/></symbol>
++<symbol id="ovg-eye-off-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M9 5.8A10 10 0 0 1 21.4 12a10 10 0 0 1-2.5 3.8L15.3 12.2a3.3 3.3 0 0 0-3.5-3.5ZM15 18.2A10 10 0 0 1 2.6 12a10 10 0 0 1 2.5-3.8L8.7 11.8a3.3 3.3 0 0 0 3.5 3.5Z"/><path class="ln" d="M4.6 4.6l14.8 14.8"/></g><path d="M10.6 6.1c0.5-0.1 0.9-0.1 1.4-0.1c5.2 0 8.5 6 8.5 6s-0.6 1.1-1.7 2.4M6.9 7.6C4.7 9.2 3.5 12 3.5 12s3.3 6 8.5 6c1.6 0 3-0.5 4.2-1.2"/><path d="M10 10a2.8 2.8 0 0 0 4 4M4.5 4.5l15 15"/></symbol>
<symbol id="ovg-fast-forward" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6.4v11.2L11.6 12ZM13.1 6.4v11.2L20.7 12Z"/></symbol>
<symbol id="ovg-fast-forward-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6.4v11.2L11.6 12ZM13.1 6.4v11.2L20.7 12Z"/></symbol>
<symbol id="ovg-fast-forward-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6.4v11.2L11.6 12ZM13.1 6.4v11.2L20.7 12Z"/></symbol>
@@@ -575,13 +575,13 @@
<symbol id="ovg-fire-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20.5a6.8 6.8 0 0 0 6.8-6.8c0-4.3-2.9-6.8-4.2-10.1c-2 2.3-2.6 4.5-2.6 4.5S10.7 5.8 9.5 3.8C7 6.6 5.2 10 5.2 13.7a6.8 6.8 0 0 0 6.8 6.8Z"/></symbol>
<symbol id="ovg-fire-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12.1 19.8a6.8 6.8 0 0 0 6.8-6.8c0-4.3-2.9-6.8-4.2-10.3c-2.1 2.3-2.6 4.6-2.6 4.6S10.8 5.1 9.6 3C7.1 5.9 5.2 9.2 5.2 12.9A6.8 6.8 0 0 0 12.1 21.4Zm0-2.8a2.8 2.8 0 0 0 2.8-2.8c0-1.6-1.2-2.7-1.7-4c-0.9 1-1.1 1.8-1.1 1.8s-0.5-0.9-1-1.6c-1 1.2-1.7 2.5-1.7 3.9a2.8 2.8 0 0 0 2.7 2.7Z"/></symbol>
<symbol id="ovg-fire-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12.1 19.8a6.8 6.8 0 0 0 6.8-6.8c0-4.3-2.9-6.8-4.2-10.3c-2.1 2.3-2.6 4.6-2.6 4.6S10.8 5.1 9.6 3C7.1 5.9 5.2 9.2 5.2 12.9A6.8 6.8 0 0 0 12.1 21.4Zm0-2.8a2.8 2.8 0 0 0 2.8-2.8c0-1.6-1.2-2.7-1.7-4c-0.9 1-1.1 1.8-1.1 1.8s-0.5-0.9-1-1.6c-1 1.2-1.7 2.5-1.7 3.9a2.8 2.8 0 0 0 2.7 2.7Z"/></g><path d="M12 20.5a6.8 6.8 0 0 0 6.8-6.8c0-4.3-2.9-6.8-4.2-10.1c-2 2.3-2.6 4.5-2.6 4.5S10.7 5.8 9.5 3.8C7 6.6 5.2 10 5.2 13.7a6.8 6.8 0 0 0 6.8 6.8Z"/></symbol>
--<symbol id="ovg-fish" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8.1 12c1.9-3.1 4.3-4.6 7.2-4.6c2.5 0 4.3 1.9 5.2 4.6c-1 2.7-2.8 4.6-5.2 4.6c-2.9 0-5.2-1.6-7.2-4.6Z"/><path d="M8.1 12L3.7 8.8v6.7Z"/><path d="M16.5 10.7h0"/></symbol>
--<symbol id="ovg-fish-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M8.1 12c1.9-3.1 4.3-4.6 7.2-4.6c2.5 0 4.3 1.9 5.2 4.6c-1 2.7-2.8 4.6-5.2 4.6c-2.9 0-5.2-1.6-7.2-4.6Z"/><path d="M8.1 12L3.7 8.8v6.7Z"/><path d="M16.5 10.7h0"/></symbol>
--<symbol id="ovg-fish-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8.1 12c1.9-3.1 4.3-4.6 7.2-4.6c2.5 0 4.3 1.9 5.2 4.6c-1 2.7-2.8 4.6-5.2 4.6c-2.9 0-5.2-1.6-7.2-4.6Z"/><path d="M8.1 12L3.7 8.8v6.7Z"/><path d="M16.5 10.7h0"/></symbol>
--<symbol id="ovg-fish-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8.1 12c1.9-3.1 4.3-4.6 7.2-4.6c2.5 0 4.3 1.9 5.2 4.6c-1 2.7-2.8 4.6-5.2 4.6c-2.9 0-5.2-1.6-7.2-4.6Z"/><path d="M8.1 12L3.7 8.8v6.7Z"/><path d="M16.5 10.7h0"/></symbol>
--<symbol id="ovg-fish-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8.1 12c1.9-3.1 4.3-4.6 7.2-4.6c2.5 0 4.3 1.9 5.2 4.6c-1 2.7-2.8 4.6-5.2 4.6c-2.9 0-5.2-1.6-7.2-4.6Z"/><path d="M8.1 12L3.7 8.8v6.7Z"/><path d="M16.5 10.7h0"/></symbol>
--<symbol id="ovg-fish-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M7.6 12c2.1-3.6 4.8-5.4 7.9-5.4 2.9 0 5 2.2 6.1 5.4-1.1 3.2-3.2 5.4-6.1 5.4-3.1 0-5.8-1.8-7.9-5.4ZM15.7 10.6a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/><path d="M8.4 12 2.9 7.4v9.2Z"/></symbol>
--<symbol id="ovg-fish-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M7.6 12c2.1-3.6 4.8-5.4 7.9-5.4 2.9 0 5 2.2 6.1 5.4-1.1 3.2-3.2 5.4-6.1 5.4-3.1 0-5.8-1.8-7.9-5.4ZM15.7 10.6a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/><path d="M8.4 12 2.9 7.4v9.2Z"/></g><path d="M8.1 12c1.9-3.1 4.3-4.6 7.2-4.6c2.5 0 4.3 1.9 5.2 4.6c-1 2.7-2.8 4.6-5.2 4.6c-2.9 0-5.2-1.6-7.2-4.6Z"/><path d="M8.1 12L3.7 8.8v6.7Z"/><path d="M16.5 10.7h0"/></symbol>
++<symbol id="ovg-fish" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 12c1.8-3.2 4.3-4.8 7.1-4.8c2.6 0 4.2 2 4.9 4.8c-0.7 2.8-2.3 4.8-4.9 4.8c-2.8 0-5.3-1.6-7.1-4.8Z"/><path d="M9 12L4.2 8.6M9 12l-4.8 3.4M17.3 10.6h0.01"/></symbol>
++<symbol id="ovg-fish-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M9 12c1.8-3.2 4.3-4.8 7.1-4.8c2.6 0 4.2 2 4.9 4.8c-0.7 2.8-2.3 4.8-4.9 4.8c-2.8 0-5.3-1.6-7.1-4.8Z"/><path d="M9 12L4.2 8.6M9 12l-4.8 3.4M17.3 10.6h0.01"/></symbol>
++<symbol id="ovg-fish-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 12c1.8-3.2 4.3-4.8 7.1-4.8c2.6 0 4.2 2 4.9 4.8c-0.7 2.8-2.3 4.8-4.9 4.8c-2.8 0-5.3-1.6-7.1-4.8Z"/><path d="M9 12L4.2 8.6M9 12l-4.8 3.4M17.3 10.6h0.01"/></symbol>
++<symbol id="ovg-fish-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 12c1.8-3.2 4.3-4.8 7.1-4.8c2.6 0 4.2 2 4.9 4.8c-0.7 2.8-2.3 4.8-4.9 4.8c-2.8 0-5.3-1.6-7.1-4.8Z"/><path d="M9 12L4.2 8.6M9 12l-4.8 3.4M17.3 10.6h0.01"/></symbol>
++<symbol id="ovg-fish-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 12c1.8-3.2 4.3-4.8 7.1-4.8c2.6 0 4.2 2 4.9 4.8c-0.7 2.8-2.3 4.8-4.9 4.8c-2.8 0-5.3-1.6-7.1-4.8Z"/><path d="M9 12L4.2 8.6M9 12l-4.8 3.4M17.3 10.6h0.01"/></symbol>
++<symbol id="ovg-fish-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M8.7 12c1.9-3.5 4.6-5.3 7.6-5.3c2.8 0 4.6 2.2 5.4 5.3c-0.8 3.1-2.6 5.3-5.4 5.3c-3 0-5.7-1.8-7.6-5.3ZM16.2 10.6a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M8.7 12L4.4 8.9M8.7 12l-4.3 3.1"/></symbol>
++<symbol id="ovg-fish-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M8.7 12c1.9-3.5 4.6-5.3 7.6-5.3c2.8 0 4.6 2.2 5.4 5.3c-0.8 3.1-2.6 5.3-5.4 5.3c-3 0-5.7-1.8-7.6-5.3ZM16.2 10.6a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0Z"/><path class="ln" d="M8.7 12L4.4 8.9M8.7 12l-4.3 3.1"/></g><path d="M9 12c1.8-3.2 4.3-4.8 7.1-4.8c2.6 0 4.2 2 4.9 4.8c-0.7 2.8-2.3 4.8-4.9 4.8c-2.8 0-5.3-1.6-7.1-4.8Z"/><path d="M9 12L4.2 8.6M9 12l-4.8 3.4M17.3 10.6h0.01"/></symbol>
<symbol id="ovg-fist" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6.4 10.1V6.4a1.6 1.6 0 0 1 3.2 0V9.1M9.5 8.5v-3.2a1.6 1.6 0 0 1 3.2 0v3.2M12.6 8.5v-2.1a1.6 1.6 0 0 1 3.2 0V9.1M15.7 9.1V8a1.6 1.6 0 0 1 3.2 0v5.2a7.3 7.3 0 0 1-7.3 7.3H11.1a5.7 5.7 0 0 1-5.7-5.7V12.3A2.1 2.1 0 0 1 7.4 11.2h2.1a1.6 1.6 0 0 1 0 3.2H8"/></symbol>
<symbol id="ovg-fist-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M6.4 10.1V6.4a1.6 1.6 0 0 1 3.2 0V9.1M9.5 8.5v-3.2a1.6 1.6 0 0 1 3.2 0v3.2M12.6 8.5v-2.1a1.6 1.6 0 0 1 3.2 0V9.1M15.7 9.1V8a1.6 1.6 0 0 1 3.2 0v5.2a7.3 7.3 0 0 1-7.3 7.3H11.1a5.7 5.7 0 0 1-5.7-5.7V12.3A2.1 2.1 0 0 1 7.4 11.2h2.1a1.6 1.6 0 0 1 0 3.2H8"/></symbol>
<symbol id="ovg-fist-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6.4 10.1V6.4a1.6 1.6 0 0 1 3.2 0V9.1M9.5 8.5v-3.2a1.6 1.6 0 0 1 3.2 0v3.2M12.6 8.5v-2.1a1.6 1.6 0 0 1 3.2 0V9.1M15.7 9.1V8a1.6 1.6 0 0 1 3.2 0v5.2a7.3 7.3 0 0 1-7.3 7.3H11.1a5.7 5.7 0 0 1-5.7-5.7V12.3A2.1 2.1 0 0 1 7.4 11.2h2.1a1.6 1.6 0 0 1 0 3.2H8"/></symbol>
@@@ -728,11 +728,13 @@
<symbol id="ovg-hand-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9.9 13.6V6.2a1.5 1.5 0 0 1 3 0V11.7M12.8 10.7V5.3a1.5 1.5 0 0 1 3 0V11.7M15.8 11.2V6.7a1.5 1.5 0 0 1 3 0v6.9c0 3.9-2.5 6.9-6.4 6.9c-2.6 0-4.1-1.3-5.6-3.5L4.9 14.2a1.5 1.5 0 0 1 2.4-1.8L9.9 15.6"/></symbol>
<symbol id="ovg-hand-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M9 14.3V4.9a1.4 1.4 0 0 1 2.8 0v5.2a0.5 0.5 0 0 0 1.1 0V3.8a1.4 1.4 0 0 1 2.8 0v6.4a0.5 0.5 0 0 0 1.1 0V5.7a1.4 1.4 0 0 1 2.8 0v7.7c0 4.5-2.8 7.7-7.3 7.7c-2.9 0-4.7-1.5-6.3-4l-1.8-2.9a1.7 1.7 0 0 1 2.8-2Z"/></symbol>
<symbol id="ovg-hand-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M9 14.3V4.9a1.4 1.4 0 0 1 2.8 0v5.2a0.5 0.5 0 0 0 1.1 0V3.8a1.4 1.4 0 0 1 2.8 0v6.4a0.5 0.5 0 0 0 1.1 0V5.7a1.4 1.4 0 0 1 2.8 0v7.7c0 4.5-2.8 7.7-7.3 7.7c-2.9 0-4.7-1.5-6.3-4l-1.8-2.9a1.7 1.7 0 0 1 2.8-2Z"/></g><path d="M9.9 13.6V6.2a1.5 1.5 0 0 1 3 0V11.7M12.8 10.7V5.3a1.5 1.5 0 0 1 3 0V11.7M15.8 11.2V6.7a1.5 1.5 0 0 1 3 0v6.9c0 3.9-2.5 6.9-6.4 6.9c-2.6 0-4.1-1.3-5.6-3.5L4.9 14.2a1.5 1.5 0 0 1 2.4-1.8L9.9 15.6"/></symbol>
--<symbol id="ovg-handshake" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l6 6a1.2 1.2 0 0 0 1.7-1.6M13.4 15.3l0.5 0.5a1.2 1.2 0 0 0 1.7-1.6M15.6 14.2l0.3 0.3a1.2 1.2 0 0 0 1.7-1.6L18 10.8M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
--<symbol id="ovg-handshake-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l6 6a1.2 1.2 0 0 0 1.7-1.6M13.4 15.3l0.5 0.5a1.2 1.2 0 0 0 1.7-1.6M15.6 14.2l0.3 0.3a1.2 1.2 0 0 0 1.7-1.6L18 10.8M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
--<symbol id="ovg-handshake-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l6 6a1.2 1.2 0 0 0 1.7-1.6M13.4 15.3l0.5 0.5a1.2 1.2 0 0 0 1.7-1.6M15.6 14.2l0.3 0.3a1.2 1.2 0 0 0 1.7-1.6L18 10.8M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
--<symbol id="ovg-handshake-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l6 6a1.2 1.2 0 0 0 1.7-1.6M13.4 15.3l0.5 0.5a1.2 1.2 0 0 0 1.7-1.6M15.6 14.2l0.3 0.3a1.2 1.2 0 0 0 1.7-1.6L18 10.8M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
--<symbol id="ovg-handshake-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l6 6a1.2 1.2 0 0 0 1.7-1.6M13.4 15.3l0.5 0.5a1.2 1.2 0 0 0 1.7-1.6M15.6 14.2l0.3 0.3a1.2 1.2 0 0 0 1.7-1.6L18 10.8M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
++<symbol id="ovg-handshake" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l5.6 5.6a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
++<symbol id="ovg-handshake-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l5.6 5.6a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
++<symbol id="ovg-handshake-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l5.6 5.6a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
++<symbol id="ovg-handshake-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l5.6 5.6a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
++<symbol id="ovg-handshake-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l5.6 5.6a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
++<symbol id="ovg-handshake-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M2.3 9.2h2.7v6.8H2.3ZM19 9.2h2.7v6.8H19Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M5.6 10.8h0.3l3.4-2.6l2.9 1.3L14.6 8.1l3.4 2.6h0.4M5.9 10.8l5.4 5.4a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.4 12.8l-3.9-3.9l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
++<symbol id="ovg-handshake-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M2.3 9.2h2.7v6.8H2.3ZM19 9.2h2.7v6.8H19Z"/><path class="ln" d="M5.6 10.8h0.3l3.4-2.6l2.9 1.3L14.6 8.1l3.4 2.6h0.4M5.9 10.8l5.4 5.4a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.4 12.8l-3.9-3.9l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></g><path d="M3.6 9.9v5.3M20.3 9.9v5.3"/><path d="M3.6 10.8h2.2l3.5-2.7l2.9 1.3L14.5 8.2l3.5 2.7h2.2"/><path d="M5.7 10.8l5.6 5.6a1.4 1.4 0 0 0 2-2M18 10.8l-4.7 4.5M17.5 12.8l-4-4l-2.3 2.1a1.3 1.3 0 0 1-1.9-1.9l1.9-2"/></symbol>
<symbol id="ovg-hash" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 9h15M4 15h15M10 3.5 8 20.5M16 3.5l-2 17"/></symbol>
<symbol id="ovg-hash-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M5 9h15M4 15h15M10 3.5 8 20.5M16 3.5l-2 17"/></symbol>
<symbol id="ovg-hash-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 9h15M4 15h15M10 3.5 8 20.5M16 3.5l-2 17"/></symbol>
ddiff --git a/ov-glyphs.woff2 b/ov-glyphs.woff2
iindex c17f995..9f70936 100644
BBinary files a/ov-glyphs.woff2 and b/ov-glyphs.woff2 differ
ddiff --git a/ov-locker-core.js b/ov-locker-core.js
iindex 46bc866..08ba264 100644
---- a/ov-locker-core.js
++++ b/ov-locker-core.js
@@@ -1,4 +1,4 @@
--/* Generated by scripts/build-locker-core.js from openvibe-sdk 0.150.0 (src/locker). Do not edit: change the SDK,
++/* Generated by scripts/build-locker-core.js from openvibe-sdk 0.152.0 (src/locker). Do not edit: change the SDK,
* release it, bump the pin, and run the script. The SDK's files, unchanged but for the names of require and module:
* bytes.js 80a5a560c683f489
* errors.js e73f94b7711452e7
@@@ -1711,5 +1711,5 @@ __ovLockerModule.exports = { WORDS };
if (!cache[key]) { const m = { exports: {} }; cache[key] = m; defs[key](m, m.exports, req); }
return cache[key].exports;
}
-- root.OVLockerCore = Object.assign({}, req('index'), { SDK_VERSION: "0.150.0" });
++ root.OVLockerCore = Object.assign({}, req('index'), { SDK_VERSION: "0.152.0" });
})(typeof globalThis !== 'undefined' ? globalThis : this);
ddiff --git a/package-lock.json b/package-lock.json
iindex 7dc9583..99d1a5e 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-shared",
-- "version": "4.213.0",
++ "version": "4.214.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-shared",
-- "version": "4.213.0",
++ "version": "4.214.0",
"license": "MIT",
"dependencies": {
"clean-css": "^5.3.3",
@@@ -21,7 +21,7 @@
"@electric-sql/pglite": "^0.5.8",
"express": "^4.22.3",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.408.0",
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.150.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.152.0"
}
},
"node_modules/@electric-sql/pglite": {
@@@ -1172,9 +1172,9 @@
}
},
"node_modules/openvibe-sdk": {
-- "version": "0.150.0",
-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.150.0",
-- "integrity": "sha512-5k2PovDQ2zhYXxLHtNNm1Q3rzPMXLpdh0lIYdl9kfa6D2/X2gYozT5W0CHRCIMAK4UhjbsZaXOSMM8GbkJWsNw==",
++ "version": "0.152.0",
++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.152.0",
++ "integrity": "sha512-/nZbjF9KTJPa3582v60tx238BBDa47tJAmxVkbgSWRReXgMHHGAhV8FGKqFmxPHOxLzvMgVp0Ei4mz4A4jsUvQ==",
"dev": true,
"license": "MIT",
"bin": {
ddiff --git a/package.json b/package.json
iindex 64277c0..7ad2c62 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-shared",
-- "version": "4.213.0",
++ "version": "4.214.0",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"bin": {
@@@ -9,6 +9,8 @@
"exports": {
".": "./index.js",
"./offer-card": "./offer-card.js",
++ "./ov-arrange": "./ov-arrange.js",
++ "./ov-arrange-core": "./ov-arrange-core.js",
"./quest": "./quest.js",
"./quest-guide": "./guide.js",
"./account-switcher": "./account-switcher.js",
@@@ -210,6 +212,6 @@
"@electric-sql/pglite": "^0.5.8",
"express": "^4.22.3",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.408.0",
-- "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.150.0"
++ "openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.152.0"
}
}
ddiff --git a/scripts/build-arrange-core.js b/scripts/build-arrange-core.js
nnew file mode 100755
iindex 0000000..43017fe
---- /dev/null
++++ b/scripts/build-arrange-core.js
@@@ -0,0 +1,47 @@
++#!/usr/bin/env node
++'use strict';
++/**
++ * Writes ov-arrange-core.js: openvibe-sdk/ui-layout for the browser, as one classic script that sets
++ * window.OVArrangeCore. One implementation of the rules, not two: this copies the SDK's own src/ui-layout.js
++ * unchanged but for the name of module.exports, and records the SDK version and the file's SHA-256.
++ * test/ov-arrange-core.test.js checks the file is current and runs the SDK's own cases through it.
++ *
++ * node scripts/build-arrange-core.js [<path to openvibe-sdk>] # default: node_modules/openvibe-sdk
++ */
++const fs = require('fs');
++const path = require('path');
++const crypto = require('crypto');
++
++const ROOT = path.join(__dirname, '..');
++
++function build(sdkDir = path.join(ROOT, 'node_modules', 'openvibe-sdk')) {
++ const pkg = JSON.parse(fs.readFileSync(path.join(sdkDir, 'package.json'), 'utf8'));
++ const file = path.join(sdkDir, 'src', 'ui-layout.js');
++ if (!fs.existsSync(file)) throw new Error(`openvibe-sdk ${pkg.version} has no src/ui-layout.js: release the SDK with ui-layout first`);
++ const src = fs.readFileSync(file, 'utf8');
++ const bad = [...src.matchAll(/require\((['"])([^'"]+)\1\)/g)].map((m) => m[2]);
++ if (bad.length) throw new Error(`src/ui-layout.js requires ${bad.join(', ')}: the browser build takes a self-contained module`);
++ const hash = crypto.createHash('sha256').update(src).digest('hex').slice(0, 16);
++ // The one change: module.exports takes the browser's own name, so the browser file says no module.
++ const body = src.replace(/\bmodule\.exports\b/g, '__ovArrangeCoreModule.exports');
++ return `/* Generated by scripts/build-arrange-core.js from openvibe-sdk ${pkg.version} (src/ui-layout.js). Do not edit:
++ * change the SDK, release it, bump the pin, and run the script. The SDK's file, unchanged but for the name of
++ * module.exports:
++ * ui-layout.js ${hash}
++ */
++(function (root) {
++ 'use strict';
++ if (!root || root.OVArrangeCore) return;
++ const __ovArrangeCoreModule = { exports: {} };
++${body}
++ root.OVArrangeCore = __ovArrangeCoreModule.exports;
++})(typeof globalThis !== 'undefined' ? globalThis : this);
++`;
++}
++
++if (require.main === module) {
++ const out = build(process.argv[2]);
++ fs.writeFileSync(path.join(ROOT, 'ov-arrange-core.js'), out);
++ console.log('ov-arrange-core.js written');
++}
++module.exports = { build };
ddiff --git a/scripts/sibling-revs.js b/scripts/sibling-revs.js
iindex 1f77062..c9f1522 100644
---- a/scripts/sibling-revs.js
++++ b/scripts/sibling-revs.js
@@@ -22,11 +22,14 @@ const FILES = ['ov-mark.js', 'ov-glyphs.js', 'ov-brand.woff2', 'ov-look.js', 'ov
'ov-drop.js',
// 4.193.0: the one tooltip (Sign in, the menu button, short labels).
'ov-tip.js',
++ // 2026-11-11: the Arrange editor, loaded only when someone presses Arrange.
++ 'ov-arrange.js',
// 2026-11-10: soft pages (intent prefetch, cross-document view transitions); not loaded by navbar.js yet.
'soft.js'];
// The files dock.js and notification-ui.js load from beside themselves: their own tables, in their own files.
const OWN = { 'dock.js': { name: 'DOCK_REV', files: ['dock-vibe.js', 'dock-code.js', 'dock-mount.js', 'dock-runs.js', 'ai-marks-client.js', 'action-center.js', 'dock-timeline.js', 'dock-actor.js', 'dock-agent.js', 'dock-timer.js', 'dock-share.js', 'dock-card.js', 'dock-chat-edits.js'] },
'notification-ui.js': { name: 'NOTIFY_REV', files: ['notification-live.js'] },
++ 'ov-arrange.js': { name: 'ARRANGE_CORE_REV', files: ['ov-arrange-core.js'] },
'footer.js': { name: 'FOOTER_REV', files: ['shipped.js'] }, 'ov-thread.js': { name: 'THREAD_REV', files: ['ov-composer.js', 'ov-combo.js'] }, 'ov-composer.js': { name: 'COMPOSER_REV', files: ['ov-window.js'] }, 'ov-user.js': { name: 'USER_REV', files: ['ov-window.js'] }, 'ov-wallet.js': { name: 'WALLET_REV', files: ['ov-window.js'] }, 'ov-window.js': { name: 'WINDOW_REV', files: ['ov-float.js'] }, 'dock-vibe.js': { name: 'VIBE_REV', files: ['ov-composer.js'] }, 'boost.js': { name: 'BOOST_REV', files: ['route-transition.js'] }, 'dock-actor.js': { name: 'ACTOR_REV', files: ['ov-window.js', 'agent-sheet.js'] } };
const table = (name, files) => ` const ${name} = { ${files.map((f) => `'${f}': '${hashAsset(fs.readFileSync(path.join(ROOT, f)))}'`).join(', ')} };`;
function writeOwn() {
ddiff --git a/sso-client.js b/sso-client.js
iindex 50fed6f..1466e14 100644
---- a/sso-client.js
++++ b/sso-client.js
@@@ -105,7 +105,8 @@
const res = await fetch(fedcmLogin, { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token: cred.token, nonce }) });
const data = await res.json().catch(() => ({}));
if (!res.ok) return { ok: false, reason: data.error || `http-${res.status}`, auto: !!cred.isAutoSelected };
-- try { sessionStorage.setItem('ov_sso_hint', 'account'); localStorage.setItem('ov_sso_hint', 'account'); } catch { /* */ }
++ const who = data.user && /^[A-Za-z0-9_.-]{1,64}$/.test(data.user.username || '') ? ':' + data.user.username : '';
++ try { sessionStorage.setItem('ov_sso_hint', 'account' + who); localStorage.setItem('ov_sso_hint', 'account' + who); } catch { /* */ }
return { ok: true, user: data.user || null, auto: !!cred.isAutoSelected };
} catch (err) { return { ok: false, reason: 'network' }; }
}
ddiff --git a/test/fixtures/icon-ink.json b/test/fixtures/icon-ink.json
iindex 1ba772c..bf62726 100644
---- a/test/fixtures/icon-ink.json
++++ b/test/fixtures/icon-ink.json
@@@ -1,5 +1,5 @@
{
-- "generated": "2026-11-11T19:14:06.693Z",
++ "generated": "2026-11-12T00:45:28.117Z",
"chrome": "/usr/bin/google-chrome",
"px": 96,
"target": 0.79,
@@@ -4975,26 +4975,26 @@
},
"care": {
"ink": [
-- 0.7813,
-- 0.7396
++ 0.7604,
++ 0.7813
],
"off": [
-0.0156,
-- -0.0052
++ -0.0156
],
"com": [
-- 0.0702,
-- 0.039
++ -0.019,
++ 0.0092
],
"sw": 2,
-- "n": 1855,
++ "n": 2010,
"geo": [
-- 0.6958,
-- 0.6526
++ 0.6749,
++ 0.6904
],
"geoOff": [
-- -0.0146,
-- -0.0054
++ -0.0167,
++ -0.0118
]
},
"city": {
@@@ -5071,26 +5071,26 @@
},
"eye-off": {
"ink": [
-- 0.8021,
-- 0.7188
++ 0.7917,
++ 0.7292
],
"off": [
-- 0.0052,
-- -0.0052
++ 0,
++ 0
],
"com": [
-- -0.0044,
-- 0.0063
++ -0.0096,
++ 0.0092
],
"sw": 2,
-- "n": 2109,
++ "n": 2404,
"geo": [
-- 0.7,
-- 0.6208
++ 0.7083,
++ 0.625
],
"geoOff": [
-- 0.0042,
-- -0.0021
++ 0,
++ 0
]
},
"plane": {
@@@ -7904,24 +7904,24 @@
"fish": {
"ink": [
0.7917,
-- 0.4792
++ 0.5
],
"off": [
-- 0,
++ 0.0208,
0
],
"com": [
-- -0.0163,
-- -0.0004
++ 0.0412,
++ -0.002
],
"sw": 2,
-- "n": 1790,
++ "n": 1669,
"geo": [
0.7,
-- 0.3833
++ 0.4
],
"geoOff": [
-- 0.0042,
++ 0.025,
0
]
},
@@@ -8127,18 +8127,18 @@
-0.0052
],
"com": [
-- 0.0087,
-- -0.002
++ -0.0014,
++ -0.0096
],
"sw": 2,
-- "n": 2077,
++ "n": 2000,
"geo": [
0.6958,
-- 0.4166
++ 0.4089
],
"geoOff": [
-0.0021,
-- -0.0001
++ -0.0039
]
},
"wizard": {
@@@ -9086,6 +9086,30 @@
],
"norm": true,
"icons": {
++ "handshake": {
++ "ink": [
++ 0.8125,
++ 0.5104
++ ],
++ "off": [
++ 0,
++ -0.0052
++ ],
++ "com": [
++ 0.0015,
++ -0.0074
++ ],
++ "sw": 2.6,
++ "n": 2328,
++ "geo": [
++ 0.8083,
++ 0.3964
++ ],
++ "geoOff": [
++ 0,
++ -0.006
++ ]
++ },
"focus": {
"ink": [
0.7917,
@@@ -9280,25 +9304,25 @@
},
"fish": {
"ink": [
-- 0.7917,
++ 0.7813,
0.4583
],
"off": [
-- 0.0104,
++ 0.0156,
0
],
"com": [
-- 0.0343,
-- 0.0022
++ 0.0484,
++ 0.0018
],
-- "sw": 0,
-- "n": 2200,
++ "sw": 2.6,
++ "n": 2132,
"geo": [
-- 0.7792,
-- 0.45
++ 0.7208,
++ 0.4417
],
"geoOff": [
-- 0.0104,
++ 0.0437,
0
]
},
@@@ -12736,26 +12760,26 @@
},
"care": {
"ink": [
-- 0.8021,
-- 0.7396
++ 0.7604,
++ 0.7813
],
"off": [
-0.0156,
-0.0052
],
"com": [
-- 0.0837,
-- 0.0442
++ -0.0192,
++ 0.0224
],
"sw": 2.6,
-- "n": 2258,
++ "n": 2329,
"geo": [
-- 0.7336,
-- 0.6782
++ 0.65,
++ 0.7143
],
"geoOff": [
-- 0.0126,
-- -0.0308
++ -0.0167,
++ -0.0322
]
},
"news": {
ddiff --git a/test/navbar-auth.test.js b/test/navbar-auth.test.js
iindex b0529cf..0a58cdb 100644
---- a/test/navbar-auth.test.js
++++ b/test/navbar-auth.test.js
@@@ -434,6 +434,44 @@ const USER = { id: 7, username: 'vibe', display_name: 'Vibe', avatar_url: null,
'/auth/login?silent=1&next=' + encodeURIComponent(href), 'preserves the page, query and fragment');
}
++ // ── 12. First paint from the sign-in hint (no Sign In flash for a signed-in person) ──
++ {
++ // The hint saying account draws the avatar before the session check; a failed check corrects it.
++ const { navbar, storage } = loadNavbar({
++ hostname: 'openvibe.blog', cookie: 'ov_sso_hint=account',
++ fetch: async () => jsonResponse(401, {}),
++ });
++ navbar.init({ service: 'blog', sessionUrl: '/auth/me', fedcm: false, silentLogin: false });
++ assert.ok(navbar.getElement().innerHTML.includes('openvibe-navbar-avatar'), 'account hint: avatar on the first paint');
++ assert.ok(!navbar.getElement().innerHTML.includes('openvibe-navbar-login'), 'account hint: no Sign In on the first paint');
++ await navbar.refreshAuth();
++ assert.ok(navbar.getElement().innerHTML.includes('openvibe-navbar-login'), 'a failed check corrects the bar to guest');
++ assert.strictEqual(storage.getItem('openvibe_seen_accounts'), null, 'the hint is not remembered as an account');
++ }
++ {
++ // A named hint shows the account's own name; the picture stays the neutral initial.
++ const { navbar } = loadNavbar({
++ hostname: 'openvibe.blog', cookie: 'ov_sso_hint=account%3Avibe',
++ fetch: async () => jsonResponse(401, {}),
++ });
++ navbar.init({ service: 'blog', sessionUrl: '/auth/me', fedcm: false, silentLogin: false });
++ const html = navbar.getElement().innerHTML;
++ assert.ok(html.includes('openvibe-navbar-avatar'), 'named hint: avatar on the first paint');
++ assert.ok(html.includes('alt="vibe"'), 'named hint: the hint name is the avatar alt');
++ assert.ok(!html.includes('openvibe-navbar-login'), 'named hint: no Sign In on the first paint');
++ }
++ {
++ // An explicit guest hint keeps the guest bar and never starts the silent round trip.
++ const { navbar, calls } = loadNavbar({
++ hostname: 'openvibe.blog', cookie: 'ov_sso_hint=guest', referrer: 'https://openvibe.network/',
++ fetch: async () => jsonResponse(401, {}),
++ });
++ navbar.init({ service: 'blog', sessionUrl: '/auth/me', fedcm: false, silentLogin: '/auth/login?silent=1&next={url}' });
++ assert.ok(navbar.getElement().innerHTML.includes('openvibe-navbar-login'), 'guest hint: guest bar on the first paint');
++ await navbar.refreshAuth();
++ assert.strictEqual(calls.filter(c => c.navigation).length, 0, 'guest hint: no silent navigation');
++ }
++
console.log('navbar-auth: all tests passed');
})().catch((err) => {
console.error(err);
ddiff --git a/test/ov-arrange-chrome.test.js b/test/ov-arrange-chrome.test.js
nnew file mode 100644
iindex 0000000..85db16c
---- /dev/null
++++ b/test/ov-arrange-chrome.test.js
@@@ -0,0 +1,138 @@
++'use strict';
++// The Arrange editor in a real headless Chrome (make your own controls, stage 2): a surface's real parts are
++// placed from the person's layout, arrow keys move and Shift+arrows resize, a refused move says why and leaves
++// the layout alone, every move is announced, the part sheet hides a part, Undo/Reset/Save work, and OpenVibe's
++// suggestion is previewed on the parts and applied only with Keep. Skipped (exit 0) without Chrome.
++const assert = require('node:assert/strict');
++const fs = require('node:fs');
++const os = require('node:os');
++const path = require('node:path');
++const http = require('node:http');
++const h = require('../browser-harness');
++assert.doesNotThrow(() => require('../ov-arrange'), 'ov-arrange.js loads (browser-only: Node takes the early return)');
++if (process.env.OV_SKIP_BROWSER === '1' || !h.findChrome()) {
++ console.log('ov-arrange-chrome: skipped (no Chrome; set CHROME_BIN)');
++ process.exit(0);
++}
++const root = path.join(__dirname, '..');
++const catalog = {
++ id: 'bot.controls', version: 1, name: 'Robot controls', devices: ['phone', 'tablet', 'computer'],
++ grid: { columns: { phone: 4, tablet: 8, computer: 12 }, cell_px: { phone: 64, tablet: 64, computer: 64 } },
++ theme_tokens: ['danger', 'surface', 'accent', 'text'],
++ parts: [
++ { id: 'stop', name: 'Stop', kind: 'button', required: true, pressed: true, min: { w: 2, h: 2, px: 64 }, sizes: [{ w: 2, h: 2 }, { w: 2, h: 1 }], styles: { tints: ['danger'], shapes: ['round'], label: true }, bindings: { keys: ['Space'], gamepad: ['south'] } },
++ { id: 'stick', name: 'Drive stick', kind: 'stick', required: false, pressed: true, min: { w: 2, h: 2 }, styles: { tints: ['surface'], shapes: ['round'], label: false }, bindings: { keys: ['W', 'A', 'S', 'D'], gamepad: ['left-stick'] } },
++ { id: 'head', name: 'Head', kind: 'slider', required: false, pressed: true, min: { w: 2, h: 1 }, styles: { tints: ['accent'], shapes: ['pill'], label: true }, bindings: { keys: [], gamepad: [] } },
++ { id: 'battery', name: 'Battery', kind: 'readout', required: false, pressed: false, min: { w: 1, h: 1 }, styles: { tints: ['text', 'surface'], shapes: ['pill', 'square'], label: true }, bindings: { keys: [], gamepad: [] } },
++ ],
++};
++const page = `<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<style>body{margin:0;background:#0d1117;color:#e6edf3;font:14px system-ui}#surface{display:grid;gap:8px;padding:12px;width:390px}
++[data-ov-part]{background:#1b2230;border:1px solid #334;border-radius:10px;padding:8px;min-height:24px}</style>
++<main id="surface">${catalog.parts.map((p) => `<section data-ov-part="${p.id}" id="${p.id}">${p.name}</section>`).join('')}</main>
++<script>window.CATALOG=${JSON.stringify(catalog)};</script>
++<script src="/ov-arrange-core.js"></script><script src="/ov-arrange.js"></script>
++<script>
++window.calls = {};
++window.editor = OVArrange.open({
++ surface: document.getElementById('surface'), catalog: window.CATALOG, layout: null, device: 'phone',
++ core: window.OVArrangeCore,
++ onSave: (layout) => { window.calls.save = layout; return { ok: true }; },
++ onShare: async () => ({ url: 'https://openvibe.bot/l/abc' }),
++ onReset: async () => { window.calls.reset = true; return { ok: true }; },
++ onAsk: async (words, request) => {
++ window.calls.asked = { words, request };
++ const layout = OVArrangeCore.applyDefaults(window.CATALOG, 'phone');
++ layout.parts = layout.parts.map((p) => p.id === 'stop' ? { ...p, place: { x: 1, y: 3, w: 2, h: 2 } } : p);
++ layout.name = 'Big Stop'; layout.summary = 'Stop is first, at 2 by 2.';
++ return { ok: true, layout, summary: 'Stop is first, at 2 by 2.', reasons: [] };
++ },
++ confirm: () => true,
++});
++</script>`;
++const server = http.createServer((req, res) => {
++ const u = new URL(req.url, 'http://x');
++ if (u.pathname === '/ov-arrange.js' || u.pathname === '/ov-arrange-core.js') {
++ res.writeHead(200, { 'content-type': 'application/javascript' });
++ return res.end(fs.readFileSync(path.join(root, u.pathname.slice(1))));
++ }
++ res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
++ res.end(page);
++});
++(async () => {
++ await new Promise((ok) => server.listen(0, '127.0.0.1', ok));
++ const base = `http://127.0.0.1:${server.address().port}`;
++ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ov-arrange-'));
++ const browser = await h.launch({ tmpDir });
++ const wait = (ms) => new Promise((r) => setTimeout(r, ms));
++ try {
++ const context = await browser.newContext();
++ const p = await h.openPage(browser, context, { width: 390, height: 800 });
++ await p.goto(base + '/', { maxMs: 5000 });
++ const until = async (expr) => { const end = Date.now() + 5000; while (Date.now() < end) { const v = await p.evaluate(expr); if (v) return v; await wait(40); } return false; };
++ const evalv = (expr) => p.evaluate(expr);
++ assert.ok(await until(`!!window.editor && document.querySelectorAll('[data-ov-part]').length === 4`), 'the editor opened on the real parts');
++ assert.ok(await evalv(`document.querySelector('[data-ov-part="stop"]').style.gridColumn === '1 / span 2'`), 'Stop is placed by the default layout');
++ assert.ok(await evalv(`document.querySelector('[data-ov-part="stick"]').style.gridColumn !== ''`), 'the stick is placed too');
++
++ // Arrow keys move, and the move is announced. The stick goes down first so Stop has room (nothing may
++ // cover a required part: Stop itself stays where it is until the way is clear).
++ for (let i = 0; i < 2; i++) await evalv(`(() => { const el = document.getElementById('stick'); el.focus(); el.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true })); })()`);
++ await evalv(`(() => { const el = document.getElementById('stop'); el.focus(); el.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true })); })()`);
++ const moved = await evalv(`window.editor.layout().parts.find((p) => p.id === 'stop').place`);
++ assert.equal(moved.x, 1, 'ArrowRight moved Stop one cell');
++ assert.ok(/Stop moved to column 2/.test(await evalv(`document.querySelector('.ov-arrange-status').textContent`)), 'the move is said in the status line');
++ assert.ok(/column 2/.test(await evalv(`document.querySelector('[aria-live="polite"][aria-atomic="true"]').textContent`)), 'and announced');
++
++ // A refused resize says why and leaves the layout alone.
++ const before = JSON.stringify(await evalv(`window.editor.layout()`));
++ await evalv(`(() => { const el = document.getElementById('stop'); el.focus(); el.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', shiftKey: true, bubbles: true })); })()`);
++ assert.ok(/Can't do that: Stop has to be at least 2 × 2 cells\./.test(await evalv(`document.querySelector('.ov-arrange-status').textContent`)), 'a too-small Stop is refused with the reason');
++ assert.equal(JSON.stringify(await evalv(`window.editor.layout()`)), before, 'the refused resize changed nothing');
++
++ // Undo takes the move back.
++ await evalv(`document.querySelector('[data-undo]').click()`);
++ assert.equal(await evalv(`window.editor.layout().parts.find((p) => p.id === 'stop').place.x`), 0, 'Undo restored Stop');
++
++ // The part sheet hides the battery (a layout may hide what is not required), and Save sends it.
++ await evalv(`(() => { const el = document.getElementById('battery'); el.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, button: 0, pointerId: 1, clientX: 30, clientY: 300 })); })()`);
++ await evalv(`document.querySelector('.ov-arrange-style').click()`);
++ assert.ok(await until(`!!document.querySelector('.ov-arrange-sheet')`), 'the part sheet opened');
++ await evalv(`(() => { const c = document.querySelector('.ov-arrange-sheet [data-visible]'); c.checked = false; c.dispatchEvent(new Event('change', { bubbles: true })); })()`);
++ assert.ok(await evalv(`document.getElementById('battery').hidden === true`), 'hiding the battery hides its part');
++ await evalv(`document.querySelector('.ov-arrange-sheet [data-close]').click()`);
++ await evalv(`document.querySelector('[data-save]').click()`);
++ assert.ok(await until(`!!window.calls.save`), 'Save sent the layout');
++ assert.equal(await evalv(`window.calls.save.parts.find((p) => p.id === 'battery').visible`), false, 'the saved layout carries the hidden battery');
++
++ // Ask OpenVibe: previewed on the real parts, kept only with Keep.
++ await evalv(`(() => { const f = document.querySelector('form[data-ask]'); f.querySelector('input').value = 'put Stop first and make it big'; f.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true })); })()`);
++ assert.ok(await until(`!!document.querySelector('.ov-arrange-preview')`), 'the suggestion is previewed');
++ assert.ok(/Stop is first/.test(await evalv(`document.querySelector('.ov-arrange-preview').textContent`)), 'the preview says what changed');
++ assert.equal(await evalv(`document.getElementById('stop').style.gridColumn`), '2 / span 2', 'the suggestion is shown on the real Stop');
++ assert.equal(await evalv(`document.getElementById('stop').style.gridRow`), '4 / span 2', 'and in its row');
++ await evalv(`document.querySelector('.ov-arrange-preview [data-keep]').click()`);
++ assert.equal(await evalv(`window.editor.layout().parts.find((p) => p.id === 'stop').place.x`), 1, 'Keep applied the suggestion');
++ assert.equal(await evalv(`document.querySelector('.ov-arrange-preview') === null`), true, 'the preview bar went away');
++
++ // A long press opens the part's sheet (the phone's way to the style controls).
++ await evalv(`(() => { const el = document.getElementById('stick'); const r = el.getBoundingClientRect(); el.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, button: 0, pointerId: 9, clientX: r.left + 5, clientY: r.top + 5 })); })()`);
++ assert.ok(await until(`!!document.querySelector('.ov-arrange-sheet')`), 'a long press opens the part sheet');
++ await evalv(`document.querySelector('.ov-arrange-sheet [data-close]').click()`);
++ await evalv(`(() => { const el = document.getElementById('stick'); el.dispatchEvent(new PointerEvent('pointerup', { bubbles: true, pointerId: 9 })); })()`);
++
++ // Reset to default, Share, Done.
++ await evalv(`document.querySelector('[data-reset]').click()`);
++ assert.equal(await evalv(`window.editor.layout().name`), 'Default', 'Reset to default');
++ assert.ok(await until(`!!window.calls.reset`), 'Reset clears the stored layout through onReset');
++ await evalv(`document.querySelector('[data-share]').click()`);
++ assert.ok(await until(`!!document.querySelector('.ov-arrange-share input')`), 'Share shows the link');
++ await evalv(`document.querySelector('[data-done]').click()`);
++ assert.equal(await evalv(`document.querySelector('.ov-arrange-bar') === null`), true, 'Done closes the editor');
++ console.log('ov-arrange-chrome: move, refuse with the reason, undo, sheet, save, AI preview and Keep, reset, share and done');
++ } finally {
++ await browser.close();
++ server.close();
++ fs.rmSync(tmpDir, { recursive: true, force: true });
++ }
++})().catch((e) => { console.error(e); process.exit(1); });
ddiff --git a/test/ov-arrange-core.test.js b/test/ov-arrange-core.test.js
nnew file mode 100644
iindex 0000000..5cf2212
---- /dev/null
++++ b/test/ov-arrange-core.test.js
@@@ -0,0 +1,48 @@
++'use strict';
++// ov-arrange-core.js is openvibe-sdk/ui-layout for the browser, generated by scripts/build-arrange-core.js. The
++// editor loads it from beside itself (ARRANGE_CORE_REV) so the one validator the SDK/server/AI use is also the
++// one that refuses a bad move while a person drags. This checks the file is current and that the browser copy
++// keeps the SDK's rules, including a docked overlay's own size.
++const assert = require('node:assert/strict');
++const fs = require('node:fs');
++const path = require('node:path');
++const { build } = require('../scripts/build-arrange-core');
++
++const ROOT = path.join(__dirname, '..');
++const generated = fs.readFileSync(path.join(ROOT, 'ov-arrange-core.js'), 'utf8');
++const sdk = path.join(ROOT, 'node_modules', 'openvibe-sdk');
++assert.ok(fs.existsSync(path.join(sdk, 'src', 'ui-layout.js')), 'the pinned openvibe-sdk has ui-layout (pin 0.151.0 or later)');
++assert.equal(generated, build(sdk), 'ov-arrange-core.js is current: run node scripts/build-arrange-core.js');
++
++const saved = global.window;
++global.window = global;
++delete require.cache[require.resolve('../ov-arrange-core.js')];
++require('../ov-arrange-core.js');
++const core = global.OVArrangeCore;
++assert.ok(core && typeof core.validate === 'function' && typeof core.applyDefaults === 'function' && typeof core.merge === 'function', 'the browser core exposes validate, applyDefaults and merge');
++assert.equal(core.PRESSED_PX, 44);
++
++const catalog = {
++ id: 'bot.overlay', version: 1, name: 'Robot over a stream', devices: ['phone', 'tablet', 'computer'],
++ grid: { columns: { phone: 4, tablet: 8, computer: 12 }, cell_px: { phone: 64, tablet: 64, computer: 64 } },
++ theme_tokens: ['danger', 'surface', 'accent'],
++ parts: [
++ { id: 'estop', name: 'E-stop', kind: 'button', required: true, pressed: true, min: { w: 2, h: 2, px: 56 }, styles: { tints: ['danger'], shapes: ['round'], label: true }, bindings: { keys: [], gamepad: [] } },
++ { id: 'stick', name: 'Stick', kind: 'stick', required: false, pressed: true, min: { w: 2, h: 2 }, styles: { tints: ['surface'], shapes: ['round'], label: false }, bindings: { keys: ['W'], gamepad: [] } },
++ ],
++};
++const part = (id, place) => ({ id, visible: true, place, style: { tint: id === 'estop' ? 'danger' : 'surface', shape: 'round', opacity: 1, label: id === 'estop' }, bindings: { keys: [], gamepad: [] } });
++const layout = (estop = { dock: 'right', order: 0, w: 2, h: 2 }) => ({
++ surface: 'bot.overlay', surface_version: 1, device: 'phone', name: 'Mine', author: { name: 'Ana' }, sharing: 'private',
++ parts: [part('estop', estop), part('stick', { dock: 'left', order: 0, w: 2, h: 2 })],
++});
++assert.deepEqual(core.validate(catalog, layout()), { ok: true, reasons: [] });
++assert.ok(core.validate(catalog, layout({ dock: 'right', order: 0, w: 1, h: 1 })).reasons.includes('E-stop has to be at least 2 × 2 cells.'));
++const covered = layout();
++covered.parts[1].place = { dock: 'right', order: 0, w: 2, h: 2 };
++assert.ok(core.validate(catalog, covered).reasons.some((r) => /Stick covers E-stop/.test(r)));
++const defaults = core.applyDefaults(catalog, 'phone');
++assert.deepEqual(core.validate(catalog, defaults), { ok: true, reasons: [] }, 'the SDK defaults are valid');
++assert.equal(core.merge(layout(), { parts: [{ id: 'stick', style: { opacity: 0.5 } }] }).parts[1].style.opacity, 0.5);
++console.log('ov-arrange-core: current with the SDK and its rules, dock sizes and coverage included');
++if (saved === undefined) delete global.window;
ddiff --git a/test/ov-locker-core.test.js b/test/ov-locker-core.test.js
iindex d2b7fe9..d689de9 100644
---- a/test/ov-locker-core.test.js
++++ b/test/ov-locker-core.test.js
@@@ -7,6 +7,7 @@ const fs = require('fs');
const path = require('path');
const vm = require('vm');
const { build } = require('../scripts/build-locker-core');
++assert.doesNotThrow(() => require('../ov-locker-core'), 'ov-locker-core.js loads in Node too (the browser globals are there)');
const ROOT = path.join(__dirname, '..');
const file = fs.readFileSync(path.join(ROOT, 'ov-locker-core.js'), 'utf8');
ddiff --git a/test/sso-client.test.js b/test/sso-client.test.js
nnew file mode 100644
iindex 0000000..b029fb7
---- /dev/null
++++ b/test/sso-client.test.js
@@@ -0,0 +1,47 @@
++'use strict';
++// sso-client.js — the FedCM hint carries the account's own name into the navbar's first paint, and never a
++// name that is not a safe username.
++const assert = require('assert');
++const fs = require('fs');
++const path = require('path');
++const vm = require('vm');
++
++function load(user) {
++ const store = {}, tab = {};
++ const ctx = {
++ console, setTimeout, clearTimeout, AbortController,
++ crypto: { getRandomValues: (a) => { a.fill(1); return a; } },
++ location: { origin: 'https://openvibe.blog', hostname: 'openvibe.blog', href: 'https://openvibe.blog/' },
++ isSecureContext: true,
++ IdentityCredential: function IdentityCredential() {},
++ localStorage: { getItem: k => (k in store ? store[k] : null), setItem: (k, v) => { store[k] = String(v); } },
++ sessionStorage: { getItem: k => (k in tab ? tab[k] : null), setItem: (k, v) => { tab[k] = String(v); } },
++ navigator: { credentials: { get: async () => ({ token: 'fedcm-token', isAutoSelected: false }) } },
++ fetch: async () => ({ ok: true, json: async () => ({ user }) }),
++ };
++ ctx.globalThis = ctx; ctx.window = ctx; ctx.self = ctx; ctx.top = ctx;
++ vm.createContext(ctx);
++ vm.runInContext(fs.readFileSync(path.join(__dirname, '..', 'sso-client.js'), 'utf8'), ctx);
++ return { ctx, store };
++}
++
++(async () => {
++ {
++ const { ctx, store } = load({ username: 'vibe' });
++ assert.ok(ctx.OpenVibeSSO, 'the module loads');
++ const out = await ctx.OpenVibeSSO.fedcm({ apiBase: 'https://openvibe.network', fedcmLogin: '/auth/fedcm' });
++ assert.equal(out.ok, true);
++ assert.equal(store.ov_sso_hint, 'account:vibe', 'the next first paint knows the account name');
++ }
++ {
++ const { ctx, store } = load({ username: '<b>not-a-name</b>' });
++ const out = await ctx.OpenVibeSSO.fedcm({ apiBase: 'https://openvibe.network', fedcmLogin: '/auth/fedcm' });
++ assert.equal(out.ok, true);
++ assert.equal(store.ov_sso_hint, 'account', 'an unsafe name is dropped, never rendered');
++ }
++ console.log('sso-client: the FedCM hint carries only a safe account name into the first paint');
++})().catch((err) => {
++ console.error('sso-client test failed');
++ console.error(String(err.stack).split('\n').slice(0, 5).join('\n'));
++ process.exitCode = 1;
++});
ddiff --git a/test/thread-inline.test.js b/test/thread-inline.test.js
nnew file mode 100644
iindex 0000000..aa905a5
---- /dev/null
++++ b/test/thread-inline.test.js
@@@ -0,0 +1,76 @@
++'use strict';
++// openvibe-shared/thread's renderThread (4.215.0): the inline Community thread Video, Pics, Community's paste page and
++// /c show, carried from OpenVibe.MediaHub test/comments-inline.test.js and OpenVibe.Community's page tests. The
++// markup is one renderer: attachments only where the site allows them, the draft kept, and signed out the composer's
++// spot is one sign-in line (the whole empty state when nobody has commented).
++const assert = require('assert');
++const fs = require('fs');
++const path = require('path');
++const { renderThread } = require('../thread');
++const files = require('../files');
++const serve = require('../serve');
++
++const answer = {
++ thread: { id: 'cth_1234567890123456789012' }, viewer: { can_comment: true },
++ comments: [{ id: 10, message: 'A <picture>', author: { username: 'alice', display_name: 'Alice', avatar_url: 'https://openvibe.network/avatar/alice' },
++ created_at: '2026-11-10T12:00:00Z', reply_count: 3, can_delete: true,
++ attachments: [{ id: 'med_01JAB2C3D4E5F6G7H8J9K0MNPQ', name: 'image.png', media_type: 'image/png' },
++ { id: 'med_01JAB2C3D4E5F6G7H8J9K0MNPR', name: 'notes.pdf', media_type: 'application/pdf' }],
++ replies: [{ id: 11, parent_id: 10, reply_to_id: 10, reply_to: { display_name: 'Alice' }, message: 'First', author: { username: 'bob', display_name: 'Bob' } },
++ { id: 12, parent_id: 10, reply_to_id: 11, reply_to: { display_name: 'Bob' }, message: 'Second', author: { username: 'alice', display_name: 'Alice' } }],
++ }],
++};
++const options = { answer, base: '/watch?v=12345678901', post: '/u/vup_1/comments', remove: '/u/vup_1/comments/delete', sort: 'top' };
++
++const signedOut = renderThread({ ...options, signedIn: false });
++assert.match(signedOut, /class="ovc-thread"/);
++assert.match(signedOut, /Sign in to comment/);
++assert.doesNotMatch(signedOut, /data-ovt-composer/);
++assert.doesNotMatch(signedOut, /<nav class="ovc-order"/, 'one top-level comment has nothing to put in order');
++assert.doesNotMatch(signedOut, /ovk-empty/, 'the empty box is gone; the sign-in line says it');
++assert.match(signedOut, /1 more reply/);
++assert.match(signedOut, /href="https:\/\/openvibe.network\/@alice"/);
++assert.match(signedOut, /class="ovc-target"/);
++assert.match(signedOut, /&lt;picture&gt;/);
++assert.match(signedOut, /<img src="https:\/\/openvibe.media\/o\/med_/);
++assert.match(signedOut, /notes.pdf/);
++assert.match(signedOut, /%2Fwatch%3Fv%3D12345678901%26sort%3Dtop/);
++assert.match(signedOut, /<p class="ovc-community"><a href="https:\/\/openvibe.community\/c\/cth_1234567890123456789012">Discuss on OpenVibe.Community<\/a><\/p>/);
++
++// Top and Newest appear only when there is something to order.
++const two = renderThread({ ...options, answer: { ...answer, comments: [...answer.comments, { ...answer.comments[0], id: 20, replies: [], reply_count: 0 }] }, signedIn: false });
++assert.match(two, /<nav class="ovc-order"/);
++assert.match(two, /sort=new/);
++assert.match(two, /aria-current="page"/);
++
++const signedIn = renderThread({ ...options, signedIn: true, replyId: 11 });
++assert.match(signedIn, /data-ovt-composer/);
++assert.match(signedIn, /name="parent_id" value="11"/);
++assert.match(signedIn, /data-ovt-files/);
++assert.match(signedIn, /name="comment_id" value="10"/);
++assert.match(signedIn, /Up to four files, 16 MB each/);
++
++// Community's paste page and Pics allow files; a thread that does not (attachmentsAllowed: false) draws no picker.
++const noFiles = renderThread({ ...options, signedIn: true, attachmentsAllowed: false });
++assert.doesNotMatch(noFiles, /data-ovt-files/);
++assert.doesNotMatch(noFiles, /Up to four files/);
++assert.doesNotMatch(noFiles, /enctype="multipart\/form-data"/);
++assert.match(noFiles, /data-ovt-composer/);
++
++// A failed post keeps the person's draft in the box, escaped.
++const draft = renderThread({ ...options, signedIn: true, draft: 'half <b>written</b>' });
++assert.match(draft, /data-ovt-text required>half &lt;b&gt;written&lt;\/b&gt;<\/textarea>/);
++
++// Signed out with no comments yet: one line, not the line plus an empty-state box.
++const emptyOut = renderThread({ ...options, answer: { ...answer, comments: [] }, signedIn: false });
++assert.match(emptyOut, /<p class="ovc-signin">Be the first to comment\. <a /, 'signed out with no comments: one line, sign-in beside it');
++assert.doesNotMatch(emptyOut, /ovk-empty/);
++assert.doesNotMatch(emptyOut, /<nav class="ovc-order"/);
++assert.match(renderThread({ ...options, answer: { ...answer, comments: [] }, signedIn: true }), /<p class="ovc-none">Be the first to comment\.<\/p>/);
++
++// The stylesheet is a sibling this package serves like thread.css: listed, present, content-addressed.
++assert.ok(files.STYLES.includes('thread-inline.css'), 'thread-inline.css is a browser stylesheet');
++assert.ok(fs.existsSync(path.join(__dirname, '..', 'thread-inline.css')));
++assert.match(serve.url('thread-inline.css'), /^\/shared\/thread-inline\.css\?v=[0-9a-f]{12}$/);
++
++process.stdout.write('Inline thread: order only with two, one sign-in line when empty, attachments and drafts per site, the hashed stylesheet\n');
ddiff --git a/thread-inline.css b/thread-inline.css
nnew file mode 100644
iindex 0000000..33fe862
---- /dev/null
++++ b/thread-inline.css
@@@ -0,0 +1,25 @@
++/* The inline Community thread a page shows under a thing (openvibe-shared/thread renderThread): a quiet head (the
++ title, then Top and Newest only when there is something to order), the composer or one sign-in line, the comments,
++ and a small link to the discussion. One look on Video, Pics, a paste page and /c. */
++.ovc-thread { margin: 24px 0; }
++.ovv-panel > .ovc-thread { margin: 0; }
++.ovc-head, .ovc-comment header, .ovc-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
++.ovc-head { justify-content: space-between; min-height: 40px; margin-bottom: 8px; }
++.ovc-head h2 { margin: 0; font-size: 1.125rem; }
++.ovc-signin, .ovc-none { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; margin: 0; }
++.ovc-none { margin-top: 12px; opacity: .75; }
++.ovc-comment { padding: 12px 0; border-bottom: 1px solid var(--border, #5555); }
++.ovc-comment header img { border-radius: 50%; object-fit: cover; }
++.ovc-comment time { font-size: .875em; opacity: .8; }
++.ovc-replies { margin-left: 24px; }
++.ovc-actions form { display: inline; }
++.ovc-attach { display: inline-block; margin: 4px 8px 4px 0; }
++.ovc-attach--file { border: 1px solid currentColor; border-radius: 999px; padding: 4px 12px; }
++.ovc-attach img { max-width: 120px; max-height: 90px; object-fit: cover; }
++.ovc-order { display: inline-flex; gap: 2px; padding: 2px; border-radius: 999px; background: color-mix(in srgb, currentColor 8%, transparent); }
++.ovc-order a { min-height: 36px; padding: 4px 14px; border: 0; border-radius: 999px; font-size: .875rem; }
++.ovc-order .is-active { font-weight: 700; background: color-mix(in srgb, currentColor 16%, transparent); }
++.ovc-community { margin: 12px 0 0; font-size: .875em; }
++.ovc-community a { color: inherit; opacity: .8; text-decoration: none; }
++.ovc-community a::after { content: ' \2192'; }
++.ovc-community a:hover, .ovc-community a:focus-visible { opacity: 1; text-decoration: underline; }
ddiff --git a/thread.js b/thread.js
iindex 0886b54..b211df9 100644
---- a/thread.js
++++ b/thread.js
@@@ -300,6 +300,91 @@ ${foot || ''}<p class="ovt-c-note" data-ovt-note role="status">${esc(note || '')
</form>`;
}
++// The inline Community thread a page shows under a thing (MediaHub's Video and Pics item pages, Community's paste
++// and /c pages): the same markup on every site, from the comment service's answer. Draw with thread-inline.css.
++const MEDIA_ID = /^med_[0-9A-HJKMNP-TV-Z]{26}$/;
++const USERNAME = /^[A-Za-z0-9_]{1,32}$/;
++const ID = /^\d{1,15}$/;
++const safeHttps = (value) => { try { const url = new URL(String(value)); return url.protocol === 'https:' ? url.href : null; } catch { return null; } };
++const author = (c) => c.author || c;
++const username = (c) => author(c).username || c.username || '';
++const name = (c) => author(c).display_name || c.display_name || username(c) || c.anon_name || 'Member';
++const date = (iso) => {
++ const ms = Date.parse(String(iso || ''));
++ if (!Number.isFinite(ms)) return { short: '', full: '' };
++ const full = new Date(ms).toLocaleString('en-US', { dateStyle: 'long', timeStyle: 'short', timeZone: 'UTC' }) + ' UTC';
++ const seconds = Math.max(0, Math.floor((Date.now() - ms) / 1000));
++ const unit = seconds < 60 ? ['second', seconds] : seconds < 3600 ? ['minute', Math.floor(seconds / 60)]
++ : seconds < 86400 ? ['hour', Math.floor(seconds / 3600)] : seconds < 2592000 ? ['day', Math.floor(seconds / 86400)]
++ : seconds < 31536000 ? ['month', Math.floor(seconds / 2592000)] : ['year', Math.floor(seconds / 31536000)];
++ return { short: seconds < 60 ? 'just now' : `${unit[1]} ${unit[0]}${unit[1] === 1 ? '' : 's'} ago`, full };
++};
++
++function query(base, sort, extra = {}, anchor = 'comments') {
++ const q = new URLSearchParams({ sort, ...extra });
++ return `${base}${base.includes('?') ? '&' : '?'}${q.toString()}#${anchor}`;
++}
++
++/**
++ * The inline Community thread a page shows under a thing (Video, Pics, a paste page, /c): the quiet head, the
++ * composer or one sign-in line, the comments with their replies, targets and attachments, the order (Top and
++ * Newest only when there is something to put in order), More, and the link to the discussion. Server-rendered and
++ * complete without script; ov-thread.js and ov-composer.js give the composer its behaviour.
++ * answer: the comment service's answer ({ thread, comments, next_cursor, viewer }), or null for a thread nobody
++ * has commented on; base: the page's own address (sorting, paging and reply links come back here)
++ * post, remove: where the composer and Delete post; signedIn: this person may write
++ * attachmentsAllowed: the composer offers files (Community's paste page and Pics say yes; elsewhere no)
++ * draft: the message kept in the box after a failed post
++ * sort, replyId, expandedId, expandedReplies, error: as the page received them
++ */
++function renderThread({ answer, base, post, remove, signedIn, attachmentsAllowed = true, sort = 'top', replyId = null, expandedId = null, expandedReplies = null, error = null, draft = '' }) {
++ const comments = Array.isArray(answer && answer.comments) ? answer.comments : [];
++ const accessId = answer && answer.thread && String(answer.thread.access_id || answer.thread.id || '');
++ const threadUrl = safeHttps(answer && answer.thread && answer.thread.url) || (/^cth_[A-Za-z0-9_-]{22}$/.test(accessId) ? `https://openvibe.community/c/${accessId}` : null);
++ const validReply = ID.test(String(replyId || '')) ? String(replyId) : null;
++ const validExpanded = ID.test(String(expandedId || '')) ? String(expandedId) : null;
++ // Signed out, the composer's spot is one line; with no comments yet that line is the whole empty state (no second
++ // box saying the same thing).
++ const signIn = `<p class="ovc-signin">${comments.length ? 'Sign in to comment.' : 'Be the first to comment.'} <a class="ovk-btn ovk-btn--primary" href="/auth/login?next=${encodeURIComponent(query(base, sort))}">Sign in</a></p>`;
++ const composer_html = (parent = null) => signedIn ? composer({ action: post, name: 'message', label: 'Comment', placeholder: parent ? 'Write a reply…' : 'Add a comment…', value: draft, maxlength: 2000,
++ sendLabel: parent ? 'Reply' : 'Comment', hidden: parent ? { parent_id: parent } : {},
++ attach: attachmentsAllowed ? { name: 'files', accept: 'image/jpeg,image/png,image/gif,image/webp,application/pdf,text/plain' } : null,
++ note: attachmentsAllowed ? 'Up to four files, 16 MB each. JPEG, PNG, GIF, WebP, PDF or text.' : '',
++ }) : signIn;
++ const attachments = (c) => (Array.isArray(c.attachments) ? c.attachments : []).map((a) => {
++ if (!MEDIA_ID.test(String(a.id || ''))) return '';
++ const url = `https://openvibe.media/o/${a.id}`;
++ const title = esc(a.name || 'Attached file');
++ return `<a class="ovc-attach${String(a.media_type || '').startsWith('image/') ? ' ovc-attach--image' : ' ovc-attach--file'}" href="${url}" target="_blank" rel="noopener noreferrer">${String(a.media_type || '').startsWith('image/')
++ ? `<img src="${url}" alt="${title}" loading="lazy" width="120">` : title}</a>`;
++ }).join('');
++ const comment = (c, root = null) => {
++ const id = String(c.id);
++ if (!ID.test(id)) return '';
++ const gone = !!(c.deleted || c.is_deleted);
++ const user = username(c);
++ const profile = USERNAME.test(user) ? `https://openvibe.network/@${encodeURIComponent(user)}` : null;
++ const avatar = safeHttps(author(c).avatar_url || c.avatar_url) || (profile ? `https://openvibe.network/avatar/${encodeURIComponent(user)}?s=80` : null);
++ const when = date(c.created_at);
++ const targetId = ID.test(String(c.reply_to_id || '')) ? String(c.reply_to_id) : null;
++ const topId = root || id;
++ const target = targetId && c.reply_to ? `<a class="ovc-target" href="${query(base, sort, { replies: topId }, `comment-${targetId}`)}">↪ @${esc(c.reply_to.display_name || 'Member')}</a>` : '';
++ const controls = !gone ? `<div class="ovc-actions">${signedIn ? `<a class="ovk-btn ovk-btn--quiet" href="${query(base, sort, { reply: id }, `comment-${id}`)}" data-ovc-reply="${id}">Reply</a>` : ''}${c.can_delete && signedIn ? `<form method="post" action="${esc(remove)}"><input type="hidden" name="comment_id" value="${id}"><button class="ovk-btn ovk-btn--quiet" type="submit">Delete</button></form>` : ''}</div>` : '';
++ let replies = '';
++ if (!root) {
++ const rows = validExpanded === id && Array.isArray(expandedReplies) ? expandedReplies : (Array.isArray(c.replies) ? c.replies : []);
++ const more = Math.max(0, Number(c.reply_count || 0) - rows.length);
++ replies = `<div class="ovc-replies" data-ovc-replies="${id}">${rows.map((r) => comment(r, id)).join('')}${more ? `<a class="ovc-more ovk-btn ovk-btn--quiet" data-ovc-more="${id}" href="${query(base, sort, { replies: id })}">${more} more ${more === 1 ? 'reply' : 'replies'}</a>` : ''}</div>`;
++ }
++ return `<article class="ovc-comment" id="comment-${id}"><header>${avatar ? `<img src="${esc(avatar)}" alt="" width="32" height="32" loading="lazy">` : ''}${profile ? `<a href="${profile}">${esc(name(c))}</a>` : `<span>${esc(name(c))}</span>`}${when.short ? `<time datetime="${esc(c.created_at)}" title="${esc(when.full)}">${esc(when.short)}</time>` : ''}</header>${target}${gone ? '<p>Comment removed</p>' : `<p>${esc(c.message || '')}</p>${attachments(c)}`}${controls}${validReply === id ? `<div data-ovc-composer-slot>${composer_html(id)}</div>` : ''}${replies}</article>`;
++ };
++ const hasReplySlot = validReply && comments.some((c) => String(c.id) === validReply || (validExpanded === String(c.id) && Array.isArray(expandedReplies) ? expandedReplies : c.replies || []).some((r) => String(r.id) === validReply));
++ // Top and Newest only when there is something to put in order.
++ const order = comments.length < 2 && !(answer && answer.next_cursor) ? '' : `<nav class="ovc-order" aria-label="Comment order">${[['top', 'Top'], ['new', 'Newest']].map(([key, label]) => `<a class="ovk-btn ovk-btn--quiet${sort === key ? ' is-active' : ''}" href="${query(base, key)}"${sort === key ? ' aria-current="page"' : ''} data-ovc-order>${label}</a>`).join('')}</nav>`;
++ const next = answer && answer.next_cursor ? `<a class="ovk-btn ovk-btn--quiet ovc-more" href="${query(base, sort, { after: answer.next_cursor })}" data-ovc-order>More comments</a>` : '';
++ return `<section class="ovc-thread" id="comments" data-ovc-thread><div class="ovc-head"><h2>Comments</h2>${order}</div>${error ? `<p role="alert">${esc(error)}</p>` : ''}${!hasReplySlot ? `<div data-ovc-composer-slot>${composer_html()}</div>` : ''}${comments.length ? `<div class="ovc-list">${comments.map((c) => comment(c)).join('')}</div>` : (signedIn ? '<p class="ovc-none">Be the first to comment.</p>' : '')}${next}${threadUrl ? `<p class="ovc-community"><a href="${esc(threadUrl)}">Discuss on OpenVibe.Community</a></p>` : ''}</section>`;
++}
++
/**
* The whole screen: the sidebar and the conversation (head, the turns or the empty state, the composer). Wrap it in
* the site's page; on a phone the composer stays at the bottom above the app bar.
@@@ -319,4 +404,4 @@ function page({ sidebar: side = '', head: top = '', turns = [], empty = '', comp
${body}</section>${pan ? `${pan}<div class="ovt-panel-scrim" data-ovt-panel-scrim hidden></div>` : ''}</div>`;
}
--module.exports = { page, sidebar, head, turn, divider, work, answer, card, panel, composer, files, face, group, groupOf, icon, esc };
++module.exports = { page, sidebar, head, turn, divider, work, answer, card, panel, composer, renderThread, files, face, group, groupOf, icon, esc };