- JavaScript properties (case sensitive). Avoid short property
- names to prevent matching minified code.
-
-
{ "jQuery.fn.jquery": "" }
-
-
-
headers
-
Object
-
HTTP response headers.
-
{ "X-Powered-By": "^WordPress$" }
-
-
-
text
-
String | Array
-
- Matches plain text. Should only be used in very specific cases where other methods can't be used.
-
-
\bexample\b
-
-
-
css
-
String | Array
-
- CSS rules. Unavailable when a website enforces a same-origin
- policy. For performance reasons, only a portion of the available
- CSS rules are used to find matches.
-
-
"\\.example-class"
-
-
-
probe
-
Object
-
- Request a URL to test for its existence or match text content.
-
-
{ "/path": "Example text" }
-
-
-
robots
-
String | Array
-
- Robots.txt contents.
-
-
"Disallow: /unique-path/"
-
-
-
url
-
String | Array
-
Full URL of the page.
-
"^https?//.+\\.wordpress\\.com"
-
-
-
xhr
-
String | Array
-
Hostnames of XHR requests.
-
"cdn\\.netlify\\.com"
-
-
-
meta
-
Object
-
HTML meta tags, e.g. generator.
-
{ "generator": "^WordPress$" }
-
-
-
scriptSrc
-
String | Array
-
- URLs of JavaScript files included on the page.
-
-
"jquery\\.js"
-
-
-
scripts
-
String | Array
-
- JavaScript source code. Inspects inline and external scripts. For performance reasons, avoid
- scripts where possible and use
- js instead.
-
-
"function webpackJsonpCallback\\(data\\) {"
-
-
-
html (deprecated)
-
String | Array
-
- HTML source code. Patterns must include an HTML opening tag to
- avoid matching plain text. For performance reasons, avoid
- html where possible and use
- dom instead.
-
-
"<a [^>]*href=\"index.html"
-
-
-
+## Required properties
+
+---
+
+| Field | Type | Description | Example |
+|-------------|----------|----------------------------------|-------------------------|
+| **cats** | `[]int` | Category ids | `[1, 6]` |
+| **website** | `string` | URL of the application's website | `"https://example.com"` |
+
+## Optional properties
+
+---
+
+### Base
+
+| Field | Type | Description | Example |
+|-----------------|---------------------|-----------------------------------------------------------|--------------------------------------------------|
+| **description** | `string` | A short description of the technology | `"short description"` |
+| **icon** | `string` | Application icon filename | `"Example.svg"` |
+| **cpe** | `string` | Application v2.3 [CPE](https://nvd.nist.gov/products/cpe) | `"cpe:2.3:a:apache:http_server:*:*:*:*:*:*:*:*"` |
+| **saas** | `boolean` | Software As A Service | `true` |
+| **oss** | `boolean` | Open Source Software | `true` |
+| **pricing** | [Pricing](#Pricing) | Cost indicator | `["low", "freemium"]` |
+
+### Implies, requires and excludes
+
+| Field | Type | Description | Example |
+|----------------------|------------|-------------------------------------------------------------------------------------------|-----------------|
+| **implies** | `[]string` | The presence of one application can imply the presence of another | `["PHP"]` |
+| **requires** | `[]string` | Similar to implies but detection only runs if the required technology has been identified | `["WordPress"]` |
+| **excludes** | `[]string` | The presence of one application can exclude the presence of another | `["Apache"]` |
+| **requiresCategory** | `[]int` | Similar to requires, but with category ID | `[6]` |
+
+### Patterns
+
+| Field | Type | Description | Regex | Example |
+|--------------------------|---------------------|-----------------------------------------------------------------------------------------------|-------|-------------------------------------------------|
+| **cookies** | `{string:string}` | Cookies | true | `{"cookie_name": "Cookie value"}` |
+| **dom** | [DOM](#DOM) | [Query selectors](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll) | false | `["img[src*='example']"]` |
+| **dns** | `{string:[]string}` | DNS records | true | `{"MX": ["example\\.com"]}` |
+| **js** | `{string:string}` | JavaScript properties | true | `{"jQuery.fn.jquery": ""}` |
+| **headers** | `{string:string}` | HTTP response headers | true | `{"X-Powered-By": "^WordPress$"}` |
+| **text** | `[]string` | Matches plain text | true | `["\bexample\b"]` |
+| **css** | `[]string` | CSS rules | true | `["\\.example-class"]` |
+| **probe** | `{string:string}` | Request a URL to test for its existence or match text content | false | `{"/path": "Example text"}` |
+| **robots** | `[]string` | Robots.txt contents | false | `["Disallow: /unique-path/"]` |
+| **url** | `[]string` | Full URL of the page | true | `["^https?//.+\\.wordpress\\.com"]` |
+| **xhr** | `[]string` | Hostnames of XHR requests | true | `["cdn\\.netlify\\.com"]` |
+| **meta** | `{string:string}` | HTML meta tags | true | `{"generator": "^WordPress$"}` |
+| **scriptSrc** | `[]string` | URLs of JavaScript files | true | `["jquery\\.js"]` |
+| **scripts** | `[]string` | JavaScript source code | true | `["function webpackJsonpCallback\\(data\\) {"]` |
+| ~~**html**~~(deprecated) | `[]string` | HTML source code | true | `["]*href=\"index.html"]` |
+| **certIssuer** | `string` | SSL certificate issuer | false | `"Let's Encrypt"` |
## Patterns
+---
+
Patterns are essentially JavaScript regular expressions written as strings, but with some additions.
### Quirks and pitfalls
@@ -404,80 +182,95 @@ Patterns are essentially JavaScript regular expressions written as strings, but
Tags (a non-standard syntax) can be appended to patterns (and implies and excludes, separated by `\\;`) to store additional information.
-
-
-
-
Tag
-
Description
-
Example
-
-
-
-
-
confidence
-
- Indicates a less reliable pattern that may cause false
- positives. The aim is to achieve a combined confidence of 100%.
- Defaults to 100% if not specified.
-
-
- "js": { "Mage": "\\;confidence:50" }
-
-
-
-
version
-
- Gets the version number from a pattern match using a special
- syntax.
-
+
+| Tag | Description | Example |
+|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|
+| **confidence** | Indicates a less reliable pattern that may cause false positives. The aim is to achieve a combined confidence of 100%. Defaults to 100% if not specified | `"js": {"Mage": "\\;confidence:50"}` |
+| **version** | Gets the version number from a pattern match using a special syntax | `"scriptSrc": "jquery-([0-9.]+)\.js\\;version:\\1"` |
+
### Version syntax
Application version information can be obtained from a pattern using a capture group. A condition can be evaluated using the ternary operator (`?:`).
-
-
-
-
Example
-
Description
-
-
-
-
-
\\1
-
Returns the first match.
-
-
-
\\1?a:
-
- Returns a if the first match contains a value, nothing
- otherwise.
-
-
-
-
\\1?a:b
-
- Returns a if the first match contains a value, b otherwise.
-
-
-
-
\\1?:b
-
- Returns nothing if the first match contains a value, b
- otherwise.
-
-
-
-
foo\\1
-
- Returns foo with the first match appended.
-
-
-
-
+
+| Example | Description |
+|-----------|------------------------------------------------------------------|
+| `\\1` | Returns the first match |
+| `\\1?a:` | Returns a if the first match contains a value, nothing otherwise |
+| `\\1?a:b` | Returns a if the first match contains a value, b otherwise |
+| `\\1?:b` | Returns nothing if the first match contains a value, b otherwise |
+| `foo\\1` | Returns foo with the first match appended |
+
+
+## Types
+
+### DOM
+
+Dom data type can be either:
+
+- `[]string`: list of [query selectors](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll)
+
+- `JSON Object`: **key** is the [query selector](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll) & **value** is an object that requires the following structure:
+ - value requirements:
+ 1. {"attributes": {string: `pattern`}}
+ - `pattern` can be a regex
+ - `pattern` is compatible with [tags](#Tags)
+ - example: {"attributes": {"href": "pattern", "src": "pattern"}}
+ 2. {"properties": {string: `pattern`}}
+ - `pattern` can be a regex
+ - `pattern` is compatible with [tags](#Tags)
+ - example: {"attributes": {"href": "pattern", "src": "pattern"}}
+ 3. {"text": `pattern`}
+ - `pattern` can be a regex
+ - `pattern` is compatible with [tags](#Tags)
+ 4. {"exists": ""}
+ - `value` is an empty string
+ - `empty string` is compatible with [tags](#Tags)
+
+```json5
+// example []string
+{
+ "dom": ["img[src*='example']", "form[action*='example.com/forms/']"]
+}
+```
+```json5
+// example JSON Object
+{
+ "dom": {
+ "link[href*='fonts.g']": {
+ "attributes": {
+ "href": "fonts\\.(?:googleapis|google|gstatic)\\.com"
+ },
+ "properties": {
+ "container": ""
+ },
+ "text": "GLPI\\s+version\\s+([\\d\\.]+)\\;version:\\1"
+ },
+ "style[data-href*='fonts.g']": {
+ "attributes": {
+ "data-href": "fonts\\.(?:googleapis|google|gstatic)\\.com"
+ },
+ "exists": "\\;confidence:50"
+ }
+ }
+}
+```
+
+### Pricing
+
+Cost indicator (based on a typical plan or average monthly price) and available pricing models. For paid products only.
+
+**One of**:
+
+- `low`: Less than US $100/mo
+- `mid`: Between US \$100-\$1,000/mo
+- `high`: More than US \$1,000/mo
+
+**Plus any of**:
+
+- `freemium`: Free plan available
+- `onetime`: One-time payments accepted
+- `recurring`: Subscriptions available
+- `poa`: Price on asking
+- `payg`: Pay as you go (e.g. commissions or usage-based fees)
diff --git a/schema.json b/schema.json
index 302244a7..a2a88a0c 100644
--- a/schema.json
+++ b/schema.json
@@ -1,6 +1,93 @@
{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Wappalyzer schema",
- "definitions": {
+ "description": "This schema defines the information related to web based technologies for the purposes of identification (finger printing)",
+ "examples": [
+ {
+ "Example": {
+ "description": "A short description of the technology.",
+ "cats": [
+ 1
+ ],
+ "cookies": {
+ "cookie_name": "Example"
+ },
+ "dom": {
+ "#example-id": {
+ "exists": "",
+ "attributes": {
+ "class": "example-class"
+ },
+ "properties": {
+ "example-property": ""
+ },
+ "text": "Example text content"
+ }
+ },
+ "dns": {
+ "MX": [
+ "example\\.com"
+ ]
+ },
+ "icon": "Example.svg",
+ "cpe": "cpe:2.3:a:example:example:*:*:*:*:*:*:*:*",
+ "js": {
+ "Example.method": ""
+ },
+ "excludes": [
+ "Example"
+ ],
+ "headers": {
+ "X-Powered-By": "Example"
+ },
+ "text": [
+ "\bexample\b"
+ ],
+ "css": [
+ "\\.example-class"
+ ],
+ "robots": [
+ "Disallow: /unique-path/"
+ ],
+ "implies": [
+ "PHP\\;confidence:50"
+ ],
+ "requires": [
+ "WordPress"
+ ],
+ "requiresCategory": [
+ 6
+ ],
+ "meta": {
+ "generator": "(?:Example|Another Example)"
+ },
+ "probe": {
+ "/path": ""
+ },
+ "scriptSrc": [
+ "example-([0-9.]+)\\.js\\;confidence:50\\;version:\\1"
+ ],
+ "scripts": [
+ "function webpackJsonpCallback\\(data\\) {"
+ ],
+ "url": [
+ "example\\.com"
+ ],
+ "xhr": [
+ "example\\.com"
+ ],
+ "oss": true,
+ "saas": true,
+ "pricing": [
+ "mid",
+ "freemium"
+ ],
+ "website": "https://example.com",
+ "certIssuer": "Example"
+ }
+ }
+ ],
+ "$defs": {
"non-empty-non-blank-string": {
"type": "string",
"pattern": "^(?!\\s*$).+"
@@ -16,7 +103,7 @@
"properties": {
"description": {
"type": "string",
- "pattern": "^.{0,500}$"
+ "pattern": "^.{0,550}$"
},
"oss": {
"type": "boolean"
@@ -40,7 +127,7 @@
},
"cpe": {
"type": "string",
- "pattern": "cpe:2.3:(a|h|o):[^*:]+:[^:]+:\\*:\\*:\\*:\\*:\\*:[^:]+:\\*:\\*"
+ "pattern": "^[Cc][Pp][Ee]:(\/|\\d+\\.\\d+)[^:]*(:?[^:]*){0,11}$"
},
"cookies": {
"type": "object",
@@ -69,11 +156,11 @@
{
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
{
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
},
{
"type": "object",
@@ -107,25 +194,25 @@
"html": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
"text": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
"css": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
"robots": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
"probe": {
@@ -140,24 +227,24 @@
}
},
"certIssuer": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
},
"excludes": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
"implies": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
"requires": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
"requiresCategory": {
@@ -180,31 +267,31 @@
"scriptSrc": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
"scripts": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
"url": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
},
"website": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
},
"icon": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
},
"xhr": {
"type": "array",
"items": {
- "$ref": "#/definitions/non-empty-non-blank-string"
+ "$ref": "#/$defs/non-empty-non-blank-string"
}
}
}
diff --git a/scripts/fix.py b/scripts/fix.py
new file mode 100644
index 00000000..cbd28196
--- /dev/null
+++ b/scripts/fix.py
@@ -0,0 +1,58 @@
+import json
+import pathlib
+from typing import Any, Callable
+
+
+class StructureFix:
+ def __init__(self):
+ self._src_path: pathlib.Path = pathlib.Path("src")
+ self._transform: dict[str, Callable[[str | int], list]] = {
+ "html": self._fix_to_list,
+ "text": self._fix_to_list,
+ "css": self._fix_to_list,
+ "excludes": self._fix_to_list,
+ "implies": self._fix_to_list,
+ "requires": self._fix_to_list,
+ "requiresCategory": self._fix_to_list,
+ "scriptSrc": self._fix_to_list,
+ "scripts": self._fix_to_list,
+ "url": self._fix_to_list,
+ "xhr": self._fix_to_list,
+ "robots": self._fix_to_list,
+ "dom": self._fix_to_list,
+ "dns": self._dns_fix
+ }
+
+ @staticmethod
+ def _dns_fix(current_detector) -> dict[str, list[str]]:
+ for k, v in current_detector.items():
+ if isinstance(v, str):
+ current_detector[k] = [v]
+ return current_detector
+
+ @staticmethod
+ def _fix_to_list(current_detector) -> list:
+ if isinstance(current_detector, str) or isinstance(current_detector, int):
+ return [current_detector]
+ return current_detector
+
+ @staticmethod
+ def _do_nothing(current_detector):
+ return current_detector
+
+ def fix(self):
+ for file in self._src_path.joinpath("technologies").iterdir():
+ if not file.name.endswith(".json"):
+ continue
+ with file.open("r") as f:
+ techs: dict[str, dict[str, Any]] = json.loads(f.read())
+ for tech_name, tech_detectors in techs.copy().items():
+ for detector_name, detector in tech_detectors.copy().items():
+ tech_detectors[detector_name] = self._transform.get(detector_name, self._do_nothing)(detector)
+ techs[tech_name.strip()] = tech_detectors
+ with file.open("w") as f:
+ f.write(json.dumps(techs, indent=2, sort_keys=True, ensure_ascii=False))
+
+
+if __name__ == '__main__':
+ StructureFix().fix()
diff --git a/scripts/fix_order.py b/scripts/fix_order.py
new file mode 100644
index 00000000..a27973ba
--- /dev/null
+++ b/scripts/fix_order.py
@@ -0,0 +1,41 @@
+import json
+import pathlib
+from typing import Final, Any
+
+
+class DuplicateKeyException(Exception):
+ def __init__(self, msg: str):
+ super().__init__(msg)
+
+
+class OrderFixer:
+ def __init__(self):
+ self._SOURCE_DIR: Final[str] = "src"
+ self._TECH_DIR: Final[str] = "technologies"
+ self._FULL_TECH_DIR: Final[pathlib.Path] = pathlib.Path(self._SOURCE_DIR).joinpath(self._TECH_DIR)
+
+ def fix(self) -> None:
+ for tech_file in sorted(self._FULL_TECH_DIR.iterdir()):
+ if not tech_file.name.endswith(".json"):
+ continue
+ with tech_file.open("r", encoding="utf8") as f:
+ data: dict = json.load(f, object_pairs_hook=self._duplicate_key_validator)
+ sorted_data: dict[str, Any] = {
+ key: data[key] for key in sorted(data.keys(), key=lambda x: x.lower())
+ }
+ with tech_file.open("w", encoding="utf8") as f:
+ json.dump(sorted_data, f, indent=2, ensure_ascii=False)
+ f.write("\n")
+
+ @classmethod
+ def _duplicate_key_validator(cls, pairs: list[tuple[str, Any]]) -> dict[str, Any]:
+ result: dict[str, Any] = {}
+ for key, value in pairs:
+ if key in result:
+ raise DuplicateKeyException(f"Duplicate key found: '{key}'")
+ result[key] = value
+ return result
+
+
+if __name__ == '__main__':
+ OrderFixer().fix()
diff --git a/src/groups.json b/src/groups.json
index 3160ecf6..cf430441 100644
--- a/src/groups.json
+++ b/src/groups.json
@@ -50,4 +50,4 @@
"18": {
"name": "User generated content"
}
-}
+}
\ No newline at end of file
diff --git a/src/images/icons/321CMS.svg b/src/images/icons/321CMS.svg
new file mode 100644
index 00000000..dc867e45
--- /dev/null
+++ b/src/images/icons/321CMS.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/src/images/icons/42Chat.svg b/src/images/icons/42Chat.svg
new file mode 100644
index 00000000..3ad8afdd
--- /dev/null
+++ b/src/images/icons/42Chat.svg
@@ -0,0 +1,20 @@
+
\ No newline at end of file
diff --git a/src/images/icons/52Degrees.svg b/src/images/icons/52Degrees.svg
new file mode 100644
index 00000000..0aea0e0b
--- /dev/null
+++ b/src/images/icons/52Degrees.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/src/images/icons/6ValleyEcommerceCMS.svg b/src/images/icons/6ValleyEcommerceCMS.svg
new file mode 100644
index 00000000..2e0ce005
--- /dev/null
+++ b/src/images/icons/6ValleyEcommerceCMS.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/src/images/icons/7moor.svg b/src/images/icons/7moor.svg
new file mode 100644
index 00000000..a721ad3d
--- /dev/null
+++ b/src/images/icons/7moor.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/images/icons/8x8.svg b/src/images/icons/8x8.svg
new file mode 100644
index 00000000..86887161
--- /dev/null
+++ b/src/images/icons/8x8.svg
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/src/images/icons/91App.svg b/src/images/icons/91App.svg
new file mode 100644
index 00000000..16c0f1cd
--- /dev/null
+++ b/src/images/icons/91App.svg
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/src/images/icons/99minds.svg b/src/images/icons/99minds.svg
new file mode 100644
index 00000000..c783324a
--- /dev/null
+++ b/src/images/icons/99minds.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/images/icons/ABlyft.svg b/src/images/icons/ABlyft.svg
new file mode 100644
index 00000000..ba07b111
--- /dev/null
+++ b/src/images/icons/ABlyft.svg
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AINIRO.svg b/src/images/icons/AINIRO.svg
new file mode 100644
index 00000000..88482450
--- /dev/null
+++ b/src/images/icons/AINIRO.svg
@@ -0,0 +1,183 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AOLserver.png b/src/images/icons/AOLserver.png
deleted file mode 100644
index 482bcdd9..00000000
Binary files a/src/images/icons/AOLserver.png and /dev/null differ
diff --git a/src/images/icons/AOLserver.svg b/src/images/icons/AOLserver.svg
new file mode 100644
index 00000000..facaab30
--- /dev/null
+++ b/src/images/icons/AOLserver.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/images/icons/APISpreadsheets.svg b/src/images/icons/APISpreadsheets.svg
new file mode 100644
index 00000000..b1e40cb3
--- /dev/null
+++ b/src/images/icons/APISpreadsheets.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/images/icons/APPLOVIN.png b/src/images/icons/APPLOVIN.png
new file mode 100644
index 00000000..58aada3c
Binary files /dev/null and b/src/images/icons/APPLOVIN.png differ
diff --git a/src/images/icons/ARCaptcha.svg b/src/images/icons/ARCaptcha.svg
new file mode 100644
index 00000000..f6a96368
--- /dev/null
+++ b/src/images/icons/ARCaptcha.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/images/icons/ARMJS.svg b/src/images/icons/ARMJS.svg
new file mode 100644
index 00000000..1ba2cc53
--- /dev/null
+++ b/src/images/icons/ARMJS.svg
@@ -0,0 +1,31 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aacio.svg b/src/images/icons/Aacio.svg
new file mode 100644
index 00000000..e8201b71
--- /dev/null
+++ b/src/images/icons/Aacio.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aarki.svg b/src/images/icons/Aarki.svg
new file mode 100644
index 00000000..efd3a557
--- /dev/null
+++ b/src/images/icons/Aarki.svg
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aasaan.svg b/src/images/icons/Aasaan.svg
new file mode 100644
index 00000000..407c8353
--- /dev/null
+++ b/src/images/icons/Aasaan.svg
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AbanteCart.svg b/src/images/icons/AbanteCart.svg
new file mode 100644
index 00000000..48f1f6fb
--- /dev/null
+++ b/src/images/icons/AbanteCart.svg
@@ -0,0 +1,62 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AbleCDP.svg b/src/images/icons/AbleCDP.svg
new file mode 100644
index 00000000..1e89e4f6
--- /dev/null
+++ b/src/images/icons/AbleCDP.svg
@@ -0,0 +1,28 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AboutMyClinic.svg b/src/images/icons/AboutMyClinic.svg
new file mode 100644
index 00000000..9c878336
--- /dev/null
+++ b/src/images/icons/AboutMyClinic.svg
@@ -0,0 +1,27 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Abralytics.svg b/src/images/icons/Abralytics.svg
new file mode 100644
index 00000000..55f5de4e
--- /dev/null
+++ b/src/images/icons/Abralytics.svg
@@ -0,0 +1,187 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Acceptd.svg b/src/images/icons/Acceptd.svg
new file mode 100644
index 00000000..ca173679
--- /dev/null
+++ b/src/images/icons/Acceptd.svg
@@ -0,0 +1,21 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AccessAlly.svg b/src/images/icons/AccessAlly.svg
new file mode 100644
index 00000000..bf042008
--- /dev/null
+++ b/src/images/icons/AccessAlly.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AccessiWay.svg b/src/images/icons/AccessiWay.svg
new file mode 100644
index 00000000..7d61b13c
--- /dev/null
+++ b/src/images/icons/AccessiWay.svg
@@ -0,0 +1,126 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Accredible.svg b/src/images/icons/Accredible.svg
new file mode 100644
index 00000000..3b8608d5
--- /dev/null
+++ b/src/images/icons/Accredible.svg
@@ -0,0 +1,27 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AceShop.svg b/src/images/icons/AceShop.svg
new file mode 100644
index 00000000..07d1005b
--- /dev/null
+++ b/src/images/icons/AceShop.svg
@@ -0,0 +1,65 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Acecounter.svg b/src/images/icons/Acecounter.svg
new file mode 100644
index 00000000..305bd9a6
--- /dev/null
+++ b/src/images/icons/Acecounter.svg
@@ -0,0 +1,344 @@
+
\ No newline at end of file
diff --git a/src/images/icons/ActivEngage.svg b/src/images/icons/ActivEngage.svg
new file mode 100644
index 00000000..11dabe0b
--- /dev/null
+++ b/src/images/icons/ActivEngage.svg
@@ -0,0 +1,30 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AdCalls.svg b/src/images/icons/AdCalls.svg
new file mode 100644
index 00000000..4e73214d
--- /dev/null
+++ b/src/images/icons/AdCalls.svg
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AdGlare.svg b/src/images/icons/AdGlare.svg
new file mode 100644
index 00000000..3188203b
--- /dev/null
+++ b/src/images/icons/AdGlare.svg
@@ -0,0 +1,34 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AdNabu.svg b/src/images/icons/AdNabu.svg
new file mode 100644
index 00000000..764c803e
--- /dev/null
+++ b/src/images/icons/AdNabu.svg
@@ -0,0 +1,53 @@
+
+
diff --git a/src/images/icons/Adalte.svg b/src/images/icons/Adalte.svg
new file mode 100644
index 00000000..87de1103
--- /dev/null
+++ b/src/images/icons/Adalte.svg
@@ -0,0 +1,20 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Adaptix.svg b/src/images/icons/Adaptix.svg
new file mode 100644
index 00000000..acbe2d5c
--- /dev/null
+++ b/src/images/icons/Adaptix.svg
@@ -0,0 +1,73 @@
+
+
\ No newline at end of file
diff --git a/src/images/icons/Adenzo.svg b/src/images/icons/Adenzo.svg
new file mode 100644
index 00000000..ad7ba615
--- /dev/null
+++ b/src/images/icons/Adenzo.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Adevole.svg b/src/images/icons/Adevole.svg
new file mode 100644
index 00000000..81df5e29
--- /dev/null
+++ b/src/images/icons/Adevole.svg
@@ -0,0 +1,20 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AdminBuy.svg b/src/images/icons/AdminBuy.svg
new file mode 100644
index 00000000..49691c5f
--- /dev/null
+++ b/src/images/icons/AdminBuy.svg
@@ -0,0 +1,29 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Adnymics.svg b/src/images/icons/Adnymics.svg
new file mode 100644
index 00000000..2afbb110
--- /dev/null
+++ b/src/images/icons/Adnymics.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/images/icons/Adtriba.svg b/src/images/icons/Adtriba.svg
new file mode 100644
index 00000000..f905b884
--- /dev/null
+++ b/src/images/icons/Adtriba.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/images/icons/AforestLMS.svg b/src/images/icons/AforestLMS.svg
new file mode 100644
index 00000000..57db1fca
--- /dev/null
+++ b/src/images/icons/AforestLMS.svg
@@ -0,0 +1,96 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Agendize.svg b/src/images/icons/Agendize.svg
new file mode 100644
index 00000000..c024bf93
--- /dev/null
+++ b/src/images/icons/Agendize.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AgentFire.svg b/src/images/icons/AgentFire.svg
new file mode 100644
index 00000000..e6e4f218
--- /dev/null
+++ b/src/images/icons/AgentFire.svg
@@ -0,0 +1,28 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AgileCRM.svg b/src/images/icons/AgileCRM.svg
new file mode 100644
index 00000000..95101fa9
--- /dev/null
+++ b/src/images/icons/AgileCRM.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Agility.svg b/src/images/icons/Agility.svg
new file mode 100644
index 00000000..b4370326
--- /dev/null
+++ b/src/images/icons/Agility.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Agillic.svg b/src/images/icons/Agillic.svg
new file mode 100644
index 00000000..1fd9e42c
--- /dev/null
+++ b/src/images/icons/Agillic.svg
@@ -0,0 +1,21 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Agora.svg b/src/images/icons/Agora.svg
new file mode 100644
index 00000000..feb8d02c
--- /dev/null
+++ b/src/images/icons/Agora.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Agorize.svg b/src/images/icons/Agorize.svg
new file mode 100644
index 00000000..9e9052ad
--- /dev/null
+++ b/src/images/icons/Agorize.svg
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aimbase.svg b/src/images/icons/Aimbase.svg
new file mode 100644
index 00000000..4a2faec9
--- /dev/null
+++ b/src/images/icons/Aimbase.svg
@@ -0,0 +1,147 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aimy.svg b/src/images/icons/Aimy.svg
new file mode 100644
index 00000000..d8e45956
--- /dev/null
+++ b/src/images/icons/Aimy.svg
@@ -0,0 +1,468 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aircall.svg b/src/images/icons/Aircall.svg
new file mode 100644
index 00000000..970865fb
--- /dev/null
+++ b/src/images/icons/Aircall.svg
@@ -0,0 +1,198 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Airdata.svg b/src/images/icons/Airdata.svg
new file mode 100644
index 00000000..9a08e225
--- /dev/null
+++ b/src/images/icons/Airdata.svg
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AirshipCRM.svg b/src/images/icons/AirshipCRM.svg
new file mode 100644
index 00000000..306b3b3a
--- /dev/null
+++ b/src/images/icons/AirshipCRM.svg
@@ -0,0 +1,853 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aiva.svg b/src/images/icons/Aiva.svg
new file mode 100644
index 00000000..6c86d3a5
--- /dev/null
+++ b/src/images/icons/Aiva.svg
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Akavita.svg b/src/images/icons/Akavita.svg
new file mode 100644
index 00000000..67b24a97
--- /dev/null
+++ b/src/images/icons/Akavita.svg
@@ -0,0 +1,50 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Akero.svg b/src/images/icons/Akero.svg
new file mode 100644
index 00000000..60bcc30a
--- /dev/null
+++ b/src/images/icons/Akero.svg
@@ -0,0 +1,170 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Akia.svg b/src/images/icons/Akia.svg
new file mode 100644
index 00000000..07fca3f6
--- /dev/null
+++ b/src/images/icons/Akia.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Akinon.svg b/src/images/icons/Akinon.svg
new file mode 100644
index 00000000..66d71731
--- /dev/null
+++ b/src/images/icons/Akinon.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AkoCommerce.svg b/src/images/icons/AkoCommerce.svg
new file mode 100644
index 00000000..c49e935d
--- /dev/null
+++ b/src/images/icons/AkoCommerce.svg
@@ -0,0 +1,49 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Alboom.svg b/src/images/icons/Alboom.svg
new file mode 100644
index 00000000..1c3389ad
--- /dev/null
+++ b/src/images/icons/Alboom.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Alia.png b/src/images/icons/Alia.png
new file mode 100644
index 00000000..bacc6e36
Binary files /dev/null and b/src/images/icons/Alia.png differ
diff --git a/src/images/icons/Alimama.svg b/src/images/icons/Alimama.svg
new file mode 100644
index 00000000..0c2163d3
--- /dev/null
+++ b/src/images/icons/Alimama.svg
@@ -0,0 +1,45 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Alinea.svg b/src/images/icons/Alinea.svg
new file mode 100644
index 00000000..9364f695
--- /dev/null
+++ b/src/images/icons/Alinea.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AllClients.svg b/src/images/icons/AllClients.svg
new file mode 100644
index 00000000..c59c3494
--- /dev/null
+++ b/src/images/icons/AllClients.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AllMyLinks.svg b/src/images/icons/AllMyLinks.svg
new file mode 100644
index 00000000..596f32d6
--- /dev/null
+++ b/src/images/icons/AllMyLinks.svg
@@ -0,0 +1,25 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Allbookable.svg b/src/images/icons/Allbookable.svg
new file mode 100644
index 00000000..d37ec053
--- /dev/null
+++ b/src/images/icons/Allbookable.svg
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Alloka.svg b/src/images/icons/Alloka.svg
new file mode 100644
index 00000000..24781201
--- /dev/null
+++ b/src/images/icons/Alloka.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Allstate.svg b/src/images/icons/Allstate.svg
new file mode 100644
index 00000000..28918c44
--- /dev/null
+++ b/src/images/icons/Allstate.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Alohome.svg b/src/images/icons/Alohome.svg
new file mode 100644
index 00000000..9c45c6b1
--- /dev/null
+++ b/src/images/icons/Alohome.svg
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AlphaReview.svg b/src/images/icons/AlphaReview.svg
new file mode 100644
index 00000000..b2fcd0c1
--- /dev/null
+++ b/src/images/icons/AlphaReview.svg
@@ -0,0 +1,186 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Alpharank.svg b/src/images/icons/Alpharank.svg
new file mode 100644
index 00000000..b820ba40
--- /dev/null
+++ b/src/images/icons/Alpharank.svg
@@ -0,0 +1,203 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Altcha.svg b/src/images/icons/Altcha.svg
new file mode 100644
index 00000000..4edfeb7c
--- /dev/null
+++ b/src/images/icons/Altcha.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Amap.svg b/src/images/icons/Amap.svg
new file mode 100644
index 00000000..642562a0
--- /dev/null
+++ b/src/images/icons/Amap.svg
@@ -0,0 +1,25 @@
+
diff --git a/src/images/icons/Amasty.svg b/src/images/icons/Amasty.svg
new file mode 100644
index 00000000..37a89efc
--- /dev/null
+++ b/src/images/icons/Amasty.svg
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Amilia.svg b/src/images/icons/Amilia.svg
new file mode 100644
index 00000000..68fe1bc5
--- /dev/null
+++ b/src/images/icons/Amilia.svg
@@ -0,0 +1,51 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Amped.svg b/src/images/icons/Amped.svg
new file mode 100644
index 00000000..a54f2fe1
--- /dev/null
+++ b/src/images/icons/Amped.svg
@@ -0,0 +1,90 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Ampry.svg b/src/images/icons/Ampry.svg
new file mode 100644
index 00000000..eabc2567
--- /dev/null
+++ b/src/images/icons/Ampry.svg
@@ -0,0 +1,21 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AnalyticOwl.svg b/src/images/icons/AnalyticOwl.svg
new file mode 100644
index 00000000..794ce943
--- /dev/null
+++ b/src/images/icons/AnalyticOwl.svg
@@ -0,0 +1,33 @@
+
+
\ No newline at end of file
diff --git a/src/images/icons/Analytick.svg b/src/images/icons/Analytick.svg
new file mode 100644
index 00000000..f3742631
--- /dev/null
+++ b/src/images/icons/Analytick.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/images/icons/AnalyticsConnect.svg b/src/images/icons/AnalyticsConnect.svg
new file mode 100644
index 00000000..2cb7f003
--- /dev/null
+++ b/src/images/icons/AnalyticsConnect.svg
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Analyzati.svg b/src/images/icons/Analyzati.svg
new file mode 100644
index 00000000..bad6aa02
--- /dev/null
+++ b/src/images/icons/Analyzati.svg
@@ -0,0 +1,28 @@
+
diff --git a/src/images/icons/Analyzz.svg b/src/images/icons/Analyzz.svg
new file mode 100644
index 00000000..118d528f
--- /dev/null
+++ b/src/images/icons/Analyzz.svg
@@ -0,0 +1,397 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Anexis.svg b/src/images/icons/Anexis.svg
new file mode 100644
index 00000000..cb921ee1
--- /dev/null
+++ b/src/images/icons/Anexis.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Angler.svg b/src/images/icons/Angler.svg
new file mode 100644
index 00000000..be08c525
--- /dev/null
+++ b/src/images/icons/Angler.svg
@@ -0,0 +1,62 @@
+
diff --git a/src/images/icons/AnimalChat.svg b/src/images/icons/AnimalChat.svg
new file mode 100644
index 00000000..69e43b8c
--- /dev/null
+++ b/src/images/icons/AnimalChat.svg
@@ -0,0 +1,22 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Animation Addons.svg b/src/images/icons/Animation Addons.svg
new file mode 100644
index 00000000..43a711d0
--- /dev/null
+++ b/src/images/icons/Animation Addons.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/images/icons/Annoto.svg b/src/images/icons/Annoto.svg
new file mode 100644
index 00000000..1673c121
--- /dev/null
+++ b/src/images/icons/Annoto.svg
@@ -0,0 +1,141 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Answerbase.svg b/src/images/icons/Answerbase.svg
new file mode 100644
index 00000000..0c4814dc
--- /dev/null
+++ b/src/images/icons/Answerbase.svg
@@ -0,0 +1,197 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Antavo.svg b/src/images/icons/Antavo.svg
new file mode 100644
index 00000000..869d3ca0
--- /dev/null
+++ b/src/images/icons/Antavo.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Anubis.svg b/src/images/icons/Anubis.svg
new file mode 100644
index 00000000..21c4bedc
--- /dev/null
+++ b/src/images/icons/Anubis.svg
@@ -0,0 +1,354 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AnyChat.svg b/src/images/icons/AnyChat.svg
new file mode 100644
index 00000000..d581c51a
--- /dev/null
+++ b/src/images/icons/AnyChat.svg
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Apanio.svg b/src/images/icons/Apanio.svg
new file mode 100644
index 00000000..c76b0af4
--- /dev/null
+++ b/src/images/icons/Apanio.svg
@@ -0,0 +1,27 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Apiary.svg b/src/images/icons/Apiary.svg
new file mode 100644
index 00000000..839dec8e
--- /dev/null
+++ b/src/images/icons/Apiary.svg
@@ -0,0 +1,176 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Apodle.svg b/src/images/icons/Apodle.svg
new file mode 100644
index 00000000..3697959f
--- /dev/null
+++ b/src/images/icons/Apodle.svg
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AppSell.svg b/src/images/icons/AppSell.svg
new file mode 100644
index 00000000..ff45457a
--- /dev/null
+++ b/src/images/icons/AppSell.svg
@@ -0,0 +1,147 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Appjustable.svg b/src/images/icons/Appjustable.svg
new file mode 100644
index 00000000..0f8b6235
--- /dev/null
+++ b/src/images/icons/Appjustable.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AppliedCSR24.svg b/src/images/icons/AppliedCSR24.svg
new file mode 100644
index 00000000..210d33c7
--- /dev/null
+++ b/src/images/icons/AppliedCSR24.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Appstle.svg b/src/images/icons/Appstle.svg
new file mode 100644
index 00000000..e756db56
--- /dev/null
+++ b/src/images/icons/Appstle.svg
@@ -0,0 +1,36 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AppuOnline.svg b/src/images/icons/AppuOnline.svg
new file mode 100644
index 00000000..3ffb051a
--- /dev/null
+++ b/src/images/icons/AppuOnline.svg
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Appypie.svg b/src/images/icons/Appypie.svg
new file mode 100644
index 00000000..7241fec3
--- /dev/null
+++ b/src/images/icons/Appypie.svg
@@ -0,0 +1,48 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Appzi.svg b/src/images/icons/Appzi.svg
new file mode 100644
index 00000000..d3ba70a9
--- /dev/null
+++ b/src/images/icons/Appzi.svg
@@ -0,0 +1,22 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Apruvd.svg b/src/images/icons/Apruvd.svg
new file mode 100644
index 00000000..aee75e8a
--- /dev/null
+++ b/src/images/icons/Apruvd.svg
@@ -0,0 +1,167 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aptania.svg b/src/images/icons/Aptania.svg
new file mode 100644
index 00000000..91205506
--- /dev/null
+++ b/src/images/icons/Aptania.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/images/icons/Arabot.svg b/src/images/icons/Arabot.svg
new file mode 100644
index 00000000..8868fb7f
--- /dev/null
+++ b/src/images/icons/Arabot.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Arketa.svg b/src/images/icons/Arketa.svg
new file mode 100644
index 00000000..011f0662
--- /dev/null
+++ b/src/images/icons/Arketa.svg
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/src/images/icons/ArkoseLabs.svg b/src/images/icons/ArkoseLabs.svg
new file mode 100644
index 00000000..0165e7fd
--- /dev/null
+++ b/src/images/icons/ArkoseLabs.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Arlo.svg b/src/images/icons/Arlo.svg
new file mode 100644
index 00000000..fea8092d
--- /dev/null
+++ b/src/images/icons/Arlo.svg
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Armin.svg b/src/images/icons/Armin.svg
new file mode 100644
index 00000000..1187259c
--- /dev/null
+++ b/src/images/icons/Armin.svg
@@ -0,0 +1,57 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Arnica.svg b/src/images/icons/Arnica.svg
new file mode 100644
index 00000000..175f4b4e
--- /dev/null
+++ b/src/images/icons/Arnica.svg
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Arreva.png b/src/images/icons/Arreva.png
deleted file mode 100644
index 57b1c0b8..00000000
Binary files a/src/images/icons/Arreva.png and /dev/null differ
diff --git a/src/images/icons/Arreva.svg b/src/images/icons/Arreva.svg
new file mode 100644
index 00000000..9d046113
--- /dev/null
+++ b/src/images/icons/Arreva.svg
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/src/images/icons/ArrowChat.svg b/src/images/icons/ArrowChat.svg
new file mode 100644
index 00000000..5bce033c
--- /dev/null
+++ b/src/images/icons/ArrowChat.svg
@@ -0,0 +1,81 @@
+
\ No newline at end of file
diff --git a/src/images/icons/ArtSchema.svg b/src/images/icons/ArtSchema.svg
new file mode 100644
index 00000000..e5175bfd
--- /dev/null
+++ b/src/images/icons/ArtSchema.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/src/images/icons/ArtiBot.svg b/src/images/icons/ArtiBot.svg
new file mode 100644
index 00000000..6c272fae
--- /dev/null
+++ b/src/images/icons/ArtiBot.svg
@@ -0,0 +1,38 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Artifi.svg b/src/images/icons/Artifi.svg
new file mode 100644
index 00000000..a305c771
--- /dev/null
+++ b/src/images/icons/Artifi.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Artplacer.svg b/src/images/icons/Artplacer.svg
new file mode 100644
index 00000000..d98c98ea
--- /dev/null
+++ b/src/images/icons/Artplacer.svg
@@ -0,0 +1,30 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aryeo.svg b/src/images/icons/Aryeo.svg
new file mode 100644
index 00000000..13a01065
--- /dev/null
+++ b/src/images/icons/Aryeo.svg
@@ -0,0 +1,42 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Asapp.svg b/src/images/icons/Asapp.svg
new file mode 100644
index 00000000..3b12b4af
--- /dev/null
+++ b/src/images/icons/Asapp.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aseqbase.svg b/src/images/icons/Aseqbase.svg
new file mode 100644
index 00000000..ad0b5002
--- /dev/null
+++ b/src/images/icons/Aseqbase.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Ashop.svg b/src/images/icons/Ashop.svg
new file mode 100644
index 00000000..896c7120
--- /dev/null
+++ b/src/images/icons/Ashop.svg
@@ -0,0 +1,22 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AsisteClick.svg b/src/images/icons/AsisteClick.svg
new file mode 100644
index 00000000..173eb006
--- /dev/null
+++ b/src/images/icons/AsisteClick.svg
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AskHandle.svg b/src/images/icons/AskHandle.svg
new file mode 100644
index 00000000..d722422e
--- /dev/null
+++ b/src/images/icons/AskHandle.svg
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AskNicely.svg b/src/images/icons/AskNicely.svg
new file mode 100644
index 00000000..b0e4c11f
--- /dev/null
+++ b/src/images/icons/AskNicely.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AskSpot.svg b/src/images/icons/AskSpot.svg
new file mode 100644
index 00000000..84751360
--- /dev/null
+++ b/src/images/icons/AskSpot.svg
@@ -0,0 +1,35 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Askas.svg b/src/images/icons/Askas.svg
new file mode 100644
index 00000000..fcc4228b
--- /dev/null
+++ b/src/images/icons/Askas.svg
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Asksuite.svg b/src/images/icons/Asksuite.svg
new file mode 100644
index 00000000..294584b0
--- /dev/null
+++ b/src/images/icons/Asksuite.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aspin.svg b/src/images/icons/Aspin.svg
new file mode 100644
index 00000000..416fd6b9
--- /dev/null
+++ b/src/images/icons/Aspin.svg
@@ -0,0 +1,38 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Aspio.svg b/src/images/icons/Aspio.svg
new file mode 100644
index 00000000..3a573913
--- /dev/null
+++ b/src/images/icons/Aspio.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Assemble.svg b/src/images/icons/Assemble.svg
new file mode 100644
index 00000000..81a3c54c
--- /dev/null
+++ b/src/images/icons/Assemble.svg
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/src/images/icons/AstraFit.svg b/src/images/icons/AstraFit.svg
new file mode 100644
index 00000000..e51ffc72
--- /dev/null
+++ b/src/images/icons/AstraFit.svg
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/src/images/icons/Astro.svg b/src/images/icons/Astro.svg
index 9c1ced0b..cfb72904 100644
--- a/src/images/icons/Astro.svg
+++ b/src/images/icons/Astro.svg
@@ -1,4 +1,4 @@
-