skill-tagging 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- skill_tagging/__init__.py +9 -0
- skill_tagging/apps.py +27 -0
- skill_tagging/conf/locale/config.yaml +85 -0
- skill_tagging/handlers.py +22 -0
- skill_tagging/pipeline.py +152 -0
- skill_tagging/skill_tagging_mixin.py +109 -0
- skill_tagging/static/brainstorming.svg +1 -0
- skill_tagging/static/tagging.css +237 -0
- skill_tagging/static/tagging.html +12 -0
- skill_tagging/static/tagging.js +111 -0
- skill_tagging/static/tags_error.html +9 -0
- skill_tagging/static/tags_form.html +33 -0
- skill_tagging/static/tags_thankyou.html +10 -0
- skill_tagging/static/video_tagging.js +30 -0
- skill_tagging/utils.py +18 -0
- skill_tagging-1.1.0.dist-info/METADATA +303 -0
- skill_tagging-1.1.0.dist-info/RECORD +21 -0
- skill_tagging-1.1.0.dist-info/WHEEL +5 -0
- skill_tagging-1.1.0.dist-info/entry_points.txt +2 -0
- skill_tagging-1.1.0.dist-info/licenses/LICENSE.txt +674 -0
- skill_tagging-1.1.0.dist-info/top_level.txt +1 -0
skill_tagging/apps.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
skill_tagging Django application initialization.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from django.apps import AppConfig
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SkillTaggingConfig(AppConfig):
|
|
9
|
+
"""
|
|
10
|
+
Configuration for the skill_tagging Django application.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
name = 'skill_tagging'
|
|
14
|
+
|
|
15
|
+
plugin_app = {
|
|
16
|
+
"signals_config": {
|
|
17
|
+
"lms.djangoapp": {
|
|
18
|
+
"relative_path": "handlers",
|
|
19
|
+
"receivers": [
|
|
20
|
+
{
|
|
21
|
+
"receiver_func_name": "listen_for_xblock_skill_verified",
|
|
22
|
+
"signal_path": "openedx_events.learning.signals.XBLOCK_SKILL_VERIFIED",
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Configuration for i18n workflow.
|
|
2
|
+
|
|
3
|
+
locales:
|
|
4
|
+
- en # English - Source Language
|
|
5
|
+
- am # Amharic
|
|
6
|
+
- ar # Arabic
|
|
7
|
+
- az # Azerbaijani
|
|
8
|
+
- bg_BG # Bulgarian (Bulgaria)
|
|
9
|
+
- bn_BD # Bengali (Bangladesh)
|
|
10
|
+
- bn_IN # Bengali (India)
|
|
11
|
+
- bs # Bosnian
|
|
12
|
+
- ca # Catalan
|
|
13
|
+
- ca@valencia # Catalan (Valencia)
|
|
14
|
+
- cs # Czech
|
|
15
|
+
- cy # Welsh
|
|
16
|
+
- da # Danish
|
|
17
|
+
- de_DE # German (Germany)
|
|
18
|
+
- el # Greek
|
|
19
|
+
- en # English
|
|
20
|
+
- en_GB # English (United Kingdom)
|
|
21
|
+
# Don't pull these until we figure out why pages randomly display in these locales,
|
|
22
|
+
# when the user's browser is in English and the user is not logged in.
|
|
23
|
+
# - en@lolcat # LOLCAT English
|
|
24
|
+
# - en@pirate # Pirate English
|
|
25
|
+
- es_419 # Spanish (Latin America)
|
|
26
|
+
- es_AR # Spanish (Argentina)
|
|
27
|
+
- es_EC # Spanish (Ecuador)
|
|
28
|
+
- es_ES # Spanish (Spain)
|
|
29
|
+
- es_MX # Spanish (Mexico)
|
|
30
|
+
- es_PE # Spanish (Peru)
|
|
31
|
+
- et_EE # Estonian (Estonia)
|
|
32
|
+
- eu_ES # Basque (Spain)
|
|
33
|
+
- fa # Persian
|
|
34
|
+
- fa_IR # Persian (Iran)
|
|
35
|
+
- fi_FI # Finnish (Finland)
|
|
36
|
+
- fil # Filipino
|
|
37
|
+
- fr # French
|
|
38
|
+
- gl # Galician
|
|
39
|
+
- gu # Gujarati
|
|
40
|
+
- he # Hebrew
|
|
41
|
+
- hi # Hindi
|
|
42
|
+
- hr # Croatian
|
|
43
|
+
- hu # Hungarian
|
|
44
|
+
- hy_AM # Armenian (Armenia)
|
|
45
|
+
- id # Indonesian
|
|
46
|
+
- it_IT # Italian (Italy)
|
|
47
|
+
- ja_JP # Japanese (Japan)
|
|
48
|
+
- kk_KZ # Kazakh (Kazakhstan)
|
|
49
|
+
- km_KH # Khmer (Cambodia)
|
|
50
|
+
- kn # Kannada
|
|
51
|
+
- ko_KR # Korean (Korea)
|
|
52
|
+
- lt_LT # Lithuanian (Lithuania)
|
|
53
|
+
- ml # Malayalam
|
|
54
|
+
- mn # Mongolian
|
|
55
|
+
- mr # Marathi
|
|
56
|
+
- ms # Malay
|
|
57
|
+
- nb # Norwegian Bokmål
|
|
58
|
+
- ne # Nepali
|
|
59
|
+
- nl_NL # Dutch (Netherlands)
|
|
60
|
+
- or # Oriya
|
|
61
|
+
- pl # Polish
|
|
62
|
+
- pt_BR # Portuguese (Brazil)
|
|
63
|
+
- pt_PT # Portuguese (Portugal)
|
|
64
|
+
- ro # Romanian
|
|
65
|
+
- ru # Russian
|
|
66
|
+
- si # Sinhala
|
|
67
|
+
- sk # Slovak
|
|
68
|
+
- sl # Slovenian
|
|
69
|
+
- sq # Albanian
|
|
70
|
+
- sr # Serbian
|
|
71
|
+
- ta # Tamil
|
|
72
|
+
- te # Telugu
|
|
73
|
+
- th # Thai
|
|
74
|
+
- tr_TR # Turkish (Turkey)
|
|
75
|
+
- uk # Ukranian
|
|
76
|
+
- ur # Urdu
|
|
77
|
+
- uz # Uzbek
|
|
78
|
+
- vi # Vietnamese
|
|
79
|
+
- zh_CN # Chinese (China)
|
|
80
|
+
- zh_HK # Chinese (Hong Kong)
|
|
81
|
+
- zh_TW # Chinese (Taiwan)
|
|
82
|
+
|
|
83
|
+
# The locales used for fake-accented English, for testing.
|
|
84
|
+
dummy_locales:
|
|
85
|
+
- eo
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""
|
|
2
|
+
skill_tagging signal handlers
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from openedx_events.event_bus import get_producer
|
|
6
|
+
from openedx_events.learning.signals import XBLOCK_SKILL_VERIFIED
|
|
7
|
+
|
|
8
|
+
from django.conf import settings
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def listen_for_xblock_skill_verified(**kwargs):
|
|
12
|
+
"""
|
|
13
|
+
Publish openedx-event XBLOCK_SKILL_VERIFIED signal onto the event bus.
|
|
14
|
+
"""
|
|
15
|
+
topic = getattr(settings, "EVENT_BUS_XBLOCK_VERIFICATION_TOPIC", "learning-xblock-skill-verified")
|
|
16
|
+
get_producer().send(
|
|
17
|
+
signal=XBLOCK_SKILL_VERIFIED,
|
|
18
|
+
topic=topic,
|
|
19
|
+
event_key_field='xblock_info.usage_key',
|
|
20
|
+
event_data={'xblock_info': kwargs['xblock_info']},
|
|
21
|
+
event_metadata=kwargs['metadata'],
|
|
22
|
+
)
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Module that contains the openedx_filters pipeline steps.
|
|
3
|
+
"""
|
|
4
|
+
import logging
|
|
5
|
+
import random
|
|
6
|
+
from importlib.resources import files
|
|
7
|
+
|
|
8
|
+
from openedx_filters import PipelineStep
|
|
9
|
+
|
|
10
|
+
from django.conf import settings
|
|
11
|
+
from django.template import Context, Template
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
from edx_proctoring.models import ProctoredExam
|
|
15
|
+
except ImportError:
|
|
16
|
+
ProctoredExam = None
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
DEFAULT_PROBABILITY = 0.03
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def resource_string(path):
|
|
23
|
+
"""Handy helper for getting resources from our kit."""
|
|
24
|
+
return files(__package__).joinpath(path).read_text(encoding="utf-8")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class VerificationPipelineBase:
|
|
28
|
+
"""
|
|
29
|
+
Common functions for verification pipelines.
|
|
30
|
+
"""
|
|
31
|
+
@staticmethod
|
|
32
|
+
def fetch_related_skills(block):
|
|
33
|
+
"""Checks `has_verified_tags` and fetchs related skills."""
|
|
34
|
+
has_verified_tags = getattr(block, "has_verified_tags", None)
|
|
35
|
+
if has_verified_tags is None or has_verified_tags is True:
|
|
36
|
+
return []
|
|
37
|
+
fetch_tags = getattr(block, "fetch_skill_tags", None)
|
|
38
|
+
if fetch_tags is None:
|
|
39
|
+
return []
|
|
40
|
+
tags = fetch_tags()
|
|
41
|
+
return tags
|
|
42
|
+
|
|
43
|
+
@staticmethod
|
|
44
|
+
def is_proctored_exam(content_id):
|
|
45
|
+
"""Determines whether the content is a proctored exam."""
|
|
46
|
+
if ProctoredExam:
|
|
47
|
+
return ProctoredExam.objects.filter(content_id=content_id, is_proctored=True).exists()
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
@staticmethod
|
|
51
|
+
def should_run_filter():
|
|
52
|
+
"""Determines whether we should run filter and display form."""
|
|
53
|
+
# random returns a number between 0 and 1 (inclusive).
|
|
54
|
+
probability = getattr(settings, "SHOW_SKILL_VERIFICATION_PROBABILITY", DEFAULT_PROBABILITY)
|
|
55
|
+
return random.random() < probability
|
|
56
|
+
|
|
57
|
+
@staticmethod
|
|
58
|
+
def get_skill_context(usage_id, block, skills):
|
|
59
|
+
"""
|
|
60
|
+
Build common skill context data used by templates.
|
|
61
|
+
"""
|
|
62
|
+
verify_tags_url = block.runtime.handler_url(block, "verify_tags")
|
|
63
|
+
data = {
|
|
64
|
+
"block_type": usage_id.block_type,
|
|
65
|
+
"block_id": usage_id.block_id,
|
|
66
|
+
"verify_tags_url": verify_tags_url,
|
|
67
|
+
"skills": skills,
|
|
68
|
+
"tag_verification_template": Template(resource_string("static/tagging.html")),
|
|
69
|
+
"form": Template(resource_string("static/tags_form.html")),
|
|
70
|
+
"thank_you_section": Template(resource_string("static/tags_thankyou.html")),
|
|
71
|
+
"error_section": Template(resource_string("static/tags_error.html")),
|
|
72
|
+
"image": resource_string("static/brainstorming.svg"),
|
|
73
|
+
}
|
|
74
|
+
return data
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class AddVerticalBlockSkillVerificationSection(VerificationPipelineBase, PipelineStep):
|
|
78
|
+
"""
|
|
79
|
+
Adds extra HTML to the fragment.
|
|
80
|
+
|
|
81
|
+
Example Usage:
|
|
82
|
+
|
|
83
|
+
.. code-block::
|
|
84
|
+
|
|
85
|
+
"OPENEDX_FILTERS_CONFIG": {
|
|
86
|
+
"org.openedx.learning.vertical_block.render.completed.v1": {
|
|
87
|
+
"fail_sliently": false,
|
|
88
|
+
"pipeline": [
|
|
89
|
+
"skill_tagging.pipeline.AddVerticalBlockSkillVerificationSection"
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
"""
|
|
94
|
+
def run_filter(self, block, fragment, context, view): # pylint: disable=arguments-differ
|
|
95
|
+
"""Pipeline Step implementing the Filter"""
|
|
96
|
+
usage_id = block.scope_ids.usage_id
|
|
97
|
+
# Check whether we need to run this filter and only call the API.
|
|
98
|
+
if not self.should_run_filter() or self.is_proctored_exam(str(usage_id)):
|
|
99
|
+
return {"block": block, "fragment": fragment, "context": context, "view": view}
|
|
100
|
+
skills = self.fetch_related_skills(block)
|
|
101
|
+
if not skills:
|
|
102
|
+
return {"block": block, "fragment": fragment, "context": context, "view": view}
|
|
103
|
+
data = self.get_skill_context(usage_id, block, skills)
|
|
104
|
+
html = resource_string("static/tagging.html")
|
|
105
|
+
css = resource_string("static/tagging.css")
|
|
106
|
+
js = resource_string("static/tagging.js")
|
|
107
|
+
fragment.add_content(Template(html).render(Context(data)))
|
|
108
|
+
fragment.add_javascript(js)
|
|
109
|
+
fragment.add_css(css)
|
|
110
|
+
return {"block": block, "fragment": fragment, "context": context, "view": view}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class AddVideoBlockSkillVerificationComponent(VerificationPipelineBase, PipelineStep):
|
|
114
|
+
"""
|
|
115
|
+
Adds verification component to video blocks.
|
|
116
|
+
|
|
117
|
+
Example Usage:
|
|
118
|
+
|
|
119
|
+
.. code-block::
|
|
120
|
+
|
|
121
|
+
"OPENEDX_FILTERS_CONFIG": {
|
|
122
|
+
"org.openedx.learning.vertical_block_child.render.started.v1": {
|
|
123
|
+
"fail_sliently": false,
|
|
124
|
+
"pipeline": [
|
|
125
|
+
"skill_tagging.pipeline.AddVideoBlockSkillVerificationComponent"
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
"""
|
|
130
|
+
def run_filter(self, block, context): # pylint: disable=arguments-differ
|
|
131
|
+
"""Pipeline Step implementing the Filter"""
|
|
132
|
+
usage_id = block.scope_ids.usage_id
|
|
133
|
+
if usage_id.block_type != "video" or not self.should_run_filter():
|
|
134
|
+
# avoid fetching skills for other xblocks
|
|
135
|
+
return {"block": block, "context": context}
|
|
136
|
+
skills = self.fetch_related_skills(block)
|
|
137
|
+
if not skills:
|
|
138
|
+
return {"block": block, "context": context}
|
|
139
|
+
data = self.get_skill_context(usage_id, block, skills)
|
|
140
|
+
|
|
141
|
+
def wrapper(fn):
|
|
142
|
+
def wrapped(_context):
|
|
143
|
+
fragment = fn(_context)
|
|
144
|
+
js = resource_string("static/tagging.js")
|
|
145
|
+
css = resource_string("static/tagging.css")
|
|
146
|
+
fragment.add_javascript(Template(resource_string("static/video_tagging.js")).render(Context(data)))
|
|
147
|
+
fragment.add_javascript(js)
|
|
148
|
+
fragment.add_css(css)
|
|
149
|
+
return fragment
|
|
150
|
+
return wrapped
|
|
151
|
+
block.student_view = wrapper(block.student_view)
|
|
152
|
+
return {"block": block, "context": context}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A mixin that fetches and verifies skills related to an Xblock,
|
|
3
|
+
that can be added for all XBlocks.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import logging
|
|
7
|
+
from urllib.parse import urljoin
|
|
8
|
+
|
|
9
|
+
from openedx_events.learning.data import XBlockSkillVerificationData
|
|
10
|
+
from openedx_events.learning.signals import XBLOCK_SKILL_VERIFIED
|
|
11
|
+
from xblock.core import XBlock, XBlockMixin
|
|
12
|
+
from xblock.fields import Boolean, Scope
|
|
13
|
+
from xblock.runtime import NoSuchServiceError
|
|
14
|
+
|
|
15
|
+
from django.conf import settings
|
|
16
|
+
from django.utils.timezone import datetime, timezone
|
|
17
|
+
from django.utils.translation import gettext as _
|
|
18
|
+
|
|
19
|
+
from .utils import get_api_client
|
|
20
|
+
|
|
21
|
+
LOGGER = logging.getLogger(__name__)
|
|
22
|
+
PAGE_SIZE = getattr(settings, "TAXONOMY_API_SKILL_PAGE_SIZE", 100)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SkillTaggingMixin(XBlockMixin):
|
|
26
|
+
"""
|
|
27
|
+
XBlock Mixin for fetching and verifying skill tags
|
|
28
|
+
"""
|
|
29
|
+
has_verified_tags = Boolean(
|
|
30
|
+
display_name=_("Has verified tags"),
|
|
31
|
+
default=False,
|
|
32
|
+
help=_("Has user verified tags for this XBlock?"),
|
|
33
|
+
scope=Scope.user_state
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def _get_user_service(self):
|
|
37
|
+
"""
|
|
38
|
+
Tries to get user service, if not found returns None.
|
|
39
|
+
"""
|
|
40
|
+
try:
|
|
41
|
+
user_service = self.runtime.service(self, 'user')
|
|
42
|
+
except NoSuchServiceError:
|
|
43
|
+
user_service = None
|
|
44
|
+
return user_service
|
|
45
|
+
|
|
46
|
+
def fetch_skill_tags(self):
|
|
47
|
+
"""
|
|
48
|
+
Fetch skill tags for the XBlock by calling taxonomy api.
|
|
49
|
+
"""
|
|
50
|
+
if not hasattr(settings, 'TAXONOMY_API_BASE_URL'):
|
|
51
|
+
LOGGER.warning(
|
|
52
|
+
"Require TAXONOMY_API_BASE_URL to be present in the settings."
|
|
53
|
+
)
|
|
54
|
+
return []
|
|
55
|
+
|
|
56
|
+
user_service = self._get_user_service()
|
|
57
|
+
if not user_service:
|
|
58
|
+
LOGGER.info(
|
|
59
|
+
"No user service available for this xblock. Cannot proceed."
|
|
60
|
+
)
|
|
61
|
+
return []
|
|
62
|
+
|
|
63
|
+
user = user_service.get_user_by_anonymous_id()
|
|
64
|
+
api_client = get_api_client(user=user)
|
|
65
|
+
|
|
66
|
+
course_key_str = str(self.scope_ids.usage_id.context_key)
|
|
67
|
+
usage_id_str = str(self.scope_ids.usage_id)
|
|
68
|
+
XBLOCK_SKILL_TAGS_API = urljoin(
|
|
69
|
+
settings.TAXONOMY_API_BASE_URL,
|
|
70
|
+
'/taxonomy/api/v1/xblocks/'
|
|
71
|
+
)
|
|
72
|
+
response = api_client.get(
|
|
73
|
+
XBLOCK_SKILL_TAGS_API,
|
|
74
|
+
params={
|
|
75
|
+
"course_key": course_key_str,
|
|
76
|
+
"usage_key": usage_id_str,
|
|
77
|
+
"page_size": PAGE_SIZE,
|
|
78
|
+
"verified": False,
|
|
79
|
+
},
|
|
80
|
+
)
|
|
81
|
+
response.raise_for_status()
|
|
82
|
+
results = response.json().get("results")
|
|
83
|
+
if not results:
|
|
84
|
+
LOGGER.info(
|
|
85
|
+
f"XBlock<{usage_id_str}> does not contain any skill",
|
|
86
|
+
)
|
|
87
|
+
return []
|
|
88
|
+
else:
|
|
89
|
+
return results[0].get('skills', [])
|
|
90
|
+
|
|
91
|
+
@XBlock.json_handler
|
|
92
|
+
def verify_tags(self, data, suffix=''): # pylint: disable=unused-argument
|
|
93
|
+
"""
|
|
94
|
+
Handler to verify tags
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
verified_skills = data.get("verified_skills", [])
|
|
98
|
+
ignored_skills = data.get("ignored_skills", [])
|
|
99
|
+
usage_key = str(self.scope_ids.usage_id)
|
|
100
|
+
if not self.has_verified_tags and (verified_skills or ignored_skills):
|
|
101
|
+
XBLOCK_SKILL_VERIFIED.send_event(
|
|
102
|
+
time=datetime.now(timezone.utc),
|
|
103
|
+
xblock_info=XBlockSkillVerificationData(
|
|
104
|
+
usage_key=usage_key,
|
|
105
|
+
verified_skills=verified_skills,
|
|
106
|
+
ignored_skills=ignored_skills,
|
|
107
|
+
)
|
|
108
|
+
)
|
|
109
|
+
self.has_verified_tags = True
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="80 32 250 240" width="301" height="266" class="illustration styles_illustrationTablet__1DWOa"><g id="_113_brainstorming_flatline" data-name="#113_brainstorming_flatline"><path d="M263.41,163.71h0a72.79,72.79,0,1,0-119.67,0h0l.08.09a71.6,71.6,0,0,0,6.06,7.6c3,4.21,11.3,9.55,12.76,14.51,3,10.25,9.05,23,9.05,23h63.8s6.05-12.77,9.06-23c1.45-5,9.72-10.3,12.76-14.51a71.6,71.6,0,0,0,6.06-7.6Z" fill="#03C7E8"></path><rect x="169.73" y="208.93" width="67.65" height="10.45" rx="3.91" fill="#fff"></rect><path d="M233.47,219.89H173.63a4.41,4.41,0,0,1-4.4-4.41v-2.64a4.41,4.41,0,0,1,4.4-4.41h59.84a4.42,4.42,0,0,1,4.41,4.41v2.64A4.42,4.42,0,0,1,233.47,219.89Zm-59.84-10.46a3.41,3.41,0,0,0-3.4,3.41v2.64a3.41,3.41,0,0,0,3.4,3.41h59.84a3.41,3.41,0,0,0,3.41-3.41v-2.64a3.41,3.41,0,0,0-3.41-3.41Z" fill="#231f20"></path><rect x="169.73" y="219.39" width="67.65" height="10.45" rx="3.91" fill="#fff"></rect><path d="M233.47,230.34H173.63a4.4,4.4,0,0,1-4.4-4.4V223.3a4.41,4.41,0,0,1,4.4-4.41h59.84a4.42,4.42,0,0,1,4.41,4.41v2.64A4.41,4.41,0,0,1,233.47,230.34Zm-59.84-10.45a3.41,3.41,0,0,0-3.4,3.41v2.64a3.4,3.4,0,0,0,3.4,3.4h59.84a3.41,3.41,0,0,0,3.41-3.4V223.3a3.41,3.41,0,0,0-3.41-3.41Z" fill="#231f20"></path><rect x="169.73" y="229.84" width="67.65" height="10.45" rx="3.91" fill="#fff"></rect><path d="M233.47,240.8H173.63a4.41,4.41,0,0,1-4.4-4.41v-2.64a4.41,4.41,0,0,1,4.4-4.41h59.84a4.42,4.42,0,0,1,4.41,4.41v2.64A4.42,4.42,0,0,1,233.47,240.8Zm-59.84-10.46a3.41,3.41,0,0,0-3.4,3.41v2.64a3.41,3.41,0,0,0,3.4,3.41h59.84a3.41,3.41,0,0,0,3.41-3.41v-2.64a3.41,3.41,0,0,0-3.41-3.41Z" fill="#231f20"></path><rect x="169.73" y="240.3" width="67.65" height="10.45" rx="3.91" fill="#fff"></rect><path d="M233.47,251.25H173.63a4.41,4.41,0,0,1-4.4-4.41V244.2a4.4,4.4,0,0,1,4.4-4.4h59.84a4.41,4.41,0,0,1,4.41,4.4v2.64A4.42,4.42,0,0,1,233.47,251.25ZM173.63,240.8a3.4,3.4,0,0,0-3.4,3.4v2.64a3.41,3.41,0,0,0,3.4,3.41h59.84a3.41,3.41,0,0,0,3.41-3.41V244.2a3.41,3.41,0,0,0-3.41-3.4Z" fill="#231f20"></path><path d="M212.52,264.8H194.59a15.91,15.91,0,0,1-11.91-5.34l-7.75-8.71h57.25l-7.75,8.71A15.93,15.93,0,0,1,212.52,264.8Z" fill="#231f20"></path><path d="M212.52,265.3H194.59a16.48,16.48,0,0,1-12.29-5.51l-7.75-8.71a.49.49,0,0,1-.08-.53.51.51,0,0,1,.46-.3h57.25a.49.49,0,0,1,.45.3.47.47,0,0,1-.08.53l-7.75,8.71A16.45,16.45,0,0,1,212.52,265.3ZM176,251.25l7,7.88a15.45,15.45,0,0,0,11.54,5.17h17.93a15.47,15.47,0,0,0,11.54-5.17l7-7.88Z" fill="#231f20"></path><path d="M187.19,177.56a21.12,21.12,0,0,1-3.87-.38,12.48,12.48,0,0,1-9.91-8.13,24.21,24.21,0,0,1-9-5.06c-4.27-3.68-3.22-9.29-2.58-11.5a14.28,14.28,0,0,1-7.38-9.27,11.84,11.84,0,0,1,2.69-11.57,13,13,0,0,1-2.92-7c-.7-5.43,3.49-9.49,5.31-11-1-1.65-2.48-5.55.49-11.22a12.22,12.22,0,0,1,10.32-6.79,19.91,19.91,0,0,1,.35-9.22c1.73-6.7,18.41-13,23.61-12.72a10.41,10.41,0,0,1,7,3.27.94.94,0,0,1,.29.69v88.16a1.36,1.36,0,0,1,0,.2,7.8,7.8,0,0,1-.39,1.4C198.57,174.06,193.66,177.56,187.19,177.56ZM171,97.61a10.31,10.31,0,0,0-9.24,5.75c-3.26,6.22-.27,9.69-.14,9.84a1,1,0,0,1,.24.79,1,1,0,0,1-.42.71c-.06,0-6,4.13-5.27,9.68.6,4.61,2.88,6.4,3,6.47a1,1,0,0,1,.39.79,1,1,0,0,1-.37.79,9.88,9.88,0,0,0-2.83,10.25,12.06,12.06,0,0,0,7,8.3,1,1,0,0,1,.6.52,1,1,0,0,1,0,.79c0,.07-2.5,6.55,1.71,10.18a20.89,20.89,0,0,0,8.68,4.76,1,1,0,0,1,.79.76c0,.24,1.48,5.87,8.52,7.22,7.45,1.43,12.86-1.52,15.67-8.53a6.84,6.84,0,0,0,.26-1V78.08a8.42,8.42,0,0,0-5.42-2.38c-5-.24-20.24,6-21.59,11.22a16.68,16.68,0,0,0,0,9.36,1,1,0,0,1-.14,1,1,1,0,0,1-.9.38S171.32,97.61,171,97.61Z" fill="#fff"></path><path d="M168.69,137.77c-5.66,0-10.62-5.2-10.84-5.43a1,1,0,1,1,1.46-1.37c0,.05,5,5.18,9.94,4.78a1,1,0,0,1,.16,2Z" fill="#fff"></path><path d="M181.25,122.73a14.46,14.46,0,0,1-3.72-.5c-8.71-2.31-9.61-12.34-9.64-12.77a1,1,0,1,1,2-.16c0,.37.83,9,8.17,11a11.64,11.64,0,0,0,11.9-3.64,1,1,0,0,1,1.58,1.23A13.77,13.77,0,0,1,181.25,122.73Z" fill="#fff"></path><path d="M173.8,131.59l-.81,0a1,1,0,0,1-1-1,1,1,0,0,1,1.05-1c2.78.14,4.89-.51,6.27-1.94,2.18-2.26,1.91-5.78,1.91-5.82a1,1,0,1,1,2-.17c0,.18.36,4.44-2.45,7.36A9.3,9.3,0,0,1,173.8,131.59Z" fill="#fff"></path><path d="M185.83,110.88a1,1,0,0,1-1-.83c-2.15-12.12-12.76-12.41-13.21-12.41a1,1,0,0,1-1-1,1,1,0,0,1,1-1c.13,0,12.72.28,15.16,14.06a1,1,0,0,1-.81,1.16Z" fill="#fff"></path><path d="M187.94,165.67a1,1,0,0,1-1-1c-.2-12.92-12.67-13.3-13.2-13.31a1,1,0,0,1-1-1,1,1,0,0,1,1-1c.15,0,14.94.41,15.17,15.27a1,1,0,0,1-1,1Z" fill="#fff"></path><path d="M178.74,152.38a1,1,0,0,1-1-.88c0-.14-1.67-14.53,12.86-16.41a1,1,0,0,1,.26,2c-12.54,1.62-11.2,13.66-11.13,14.17a1,1,0,0,1-.87,1.12Z" fill="#fff"></path><path d="M200.63,102.29a1,1,0,0,1-1-.94c0-.15-.3-3.08-5.07-4.3a1,1,0,1,1,.5-1.93c6.3,1.6,6.56,5.94,6.57,6.13a1,1,0,0,1-1,1Z" fill="#fff"></path><path d="M186.94,85.89a1,1,0,0,1-.74-.33c-4.45-4.94-9.56-3.14-9.78-3.06a1,1,0,0,1-1.28-.6,1,1,0,0,1,.59-1.28c.26-.1,6.58-2.37,12,3.6a1,1,0,0,1-.08,1.42A1,1,0,0,1,186.94,85.89Z" fill="#fff"></path><path d="M175.75,151.38a1,1,0,0,1-1-.92,5.94,5.94,0,0,0-3.49-4.7,1,1,0,0,1,.76-1.85,7.94,7.94,0,0,1,4.72,6.38,1,1,0,0,1-.91,1.08Z" fill="#fff"></path><path d="M219.92,177.56c-6.47,0-11.38-3.5-14-10.14a8.89,8.89,0,0,1-.38-1.4,1.36,1.36,0,0,1,0-.2V77.66a1,1,0,0,1,.28-.69,10.46,10.46,0,0,1,7.05-3.27c5.16-.23,21.88,6,23.61,12.72a20.19,20.19,0,0,1,.35,9.22,12.24,12.24,0,0,1,10.32,6.79c3,5.67,1.47,9.57.48,11.22,1.83,1.49,6,5.55,5.32,11a12.86,12.86,0,0,1-2.93,7,11.81,11.81,0,0,1,2.7,11.57,14.34,14.34,0,0,1-7.38,9.27c.63,2.21,1.69,7.82-2.58,11.5a24.21,24.21,0,0,1-9,5.06,12.5,12.5,0,0,1-9.91,8.13A21.29,21.29,0,0,1,219.92,177.56Zm-12.44-11.84a5.62,5.62,0,0,0,.26,1c2.8,7,8.23,10,15.67,8.53,7.09-1.36,8.51-7.16,8.52-7.22a1,1,0,0,1,.79-.76,21.15,21.15,0,0,0,8.67-4.76c4.22-3.63,1.75-10.11,1.72-10.18a1,1,0,0,1,0-.79,1,1,0,0,1,.59-.52c.21-.07,5.18-1.79,7-8.3a9.84,9.84,0,0,0-2.83-10.25,1,1,0,0,1-.37-.8,1,1,0,0,1,.4-.78c.09-.07,2.38-1.86,3-6.47.72-5.57-5.2-9.64-5.26-9.68a1,1,0,0,1-.18-1.51c.13-.14,3.11-3.61-.14-9.83a10.33,10.33,0,0,0-9.77-5.73,1,1,0,0,1-.89-.39,1,1,0,0,1-.14-1,16.68,16.68,0,0,0,0-9.36c-.6-2.28-4.15-5.14-9.52-7.66-4.56-2.14-9.77-3.67-12.07-3.56a8.39,8.39,0,0,0-5.42,2.38Z" fill="#fff"></path><path d="M238.42,137.77l-.72,0a1,1,0,0,1-.92-1.08,1,1,0,0,1,1.08-.92c5,.41,9.89-4.73,9.94-4.78a1,1,0,0,1,1.41-.05,1,1,0,0,1,0,1.42C249,132.57,244.08,137.77,238.42,137.77Z" fill="#fff"></path><path d="M225.86,122.73a13.75,13.75,0,0,1-10.28-4.84,1,1,0,0,1,1.58-1.23,11.6,11.6,0,0,0,11.9,3.64c7.34-2,8.14-10.63,8.17-11a1,1,0,1,1,2,.16c0,.43-.93,10.46-9.64,12.77A14.57,14.57,0,0,1,225.86,122.73Z" fill="#fff"></path><path d="M233.3,131.59a9.29,9.29,0,0,1-7-2.59,10.19,10.19,0,0,1-2.45-7.36,1,1,0,1,1,2,.17,8.29,8.29,0,0,0,1.91,5.82c1.38,1.43,3.48,2.08,6.27,1.94a1,1,0,0,1,1,1,1,1,0,0,1-.95,1Z" fill="#fff"></path><path d="M221.27,110.88l-.17,0a1,1,0,0,1-.81-1.16c2.44-13.78,15-14.06,15.15-14.06h0a1,1,0,0,1,0,2h0c-.46,0-11.06.29-13.21,12.41A1,1,0,0,1,221.27,110.88Z" fill="#fff"></path><path d="M219.17,165.67h0a1,1,0,0,1-1-1c.23-14.86,15-15.27,15.16-15.27a1,1,0,0,1,1,1,1,1,0,0,1-1,1c-.53,0-13,.39-13.2,13.31A1,1,0,0,1,219.17,165.67Z" fill="#fff"></path><path d="M228.36,152.38h-.12a1,1,0,0,1-.87-1.12c.06-.51,1.41-12.55-11.13-14.17a1,1,0,0,1,.26-2C231,137,229.37,151.36,229.35,151.5A1,1,0,0,1,228.36,152.38Z" fill="#fff"></path><path d="M206.48,102.29h0a1,1,0,0,1-1-1c0-.19.27-4.53,6.57-6.13a1,1,0,0,1,.49,1.93c-4.87,1.25-5.06,4.26-5.06,4.29A1,1,0,0,1,206.48,102.29Z" fill="#fff"></path><path d="M220.16,85.89a1,1,0,0,1-.74-1.67c5.38-6,11.69-3.7,12-3.6a1,1,0,0,1,.59,1.29,1,1,0,0,1-1.29.59h0c-.21-.08-5.33-1.88-9.77,3.06A1,1,0,0,1,220.16,85.89Z" fill="#fff"></path><path d="M231.36,151.37h-.09a1,1,0,0,1-.91-1.08,7.92,7.92,0,0,1,4.71-6.38,1,1,0,0,1,1.31.55,1,1,0,0,1-.55,1.3,5.91,5.91,0,0,0-3.48,4.7A1,1,0,0,1,231.36,151.37Z" fill="#fff"></path><path d="M324.6,103C322,94.68,307,90.8,282.19,92.09q-5.76.3-12,1l.43,1a201.5,201.5,0,0,1,20.62-1.18c18.19,0,30.16,3.43,32.33,10.49,3.36,11-17.67,27.91-51.7,44A448.53,448.53,0,0,1,212.7,170a464.56,464.56,0,0,1-51.79,12.82,286.42,286.42,0,0,1-36,4.47c-23.91,1.24-39-2.47-41.35-10.18-3.26-10.58,16.28-26.77,48.3-42.39,0-.35-.11-.7-.17-1.06-7.34,3.57-14.11,7.23-20.18,10.91-21.24,12.84-31.51,24.51-29,32.85,2.24,7.28,14,11.17,33.51,11.17,2.81,0,5.78-.09,8.9-.25a284.77,284.77,0,0,0,36.64-4.58A459.93,459.93,0,0,0,213,171a446.76,446.76,0,0,0,58.36-22.25,267.93,267.93,0,0,0,24.27-12.85C316.87,123,327.15,111.35,324.6,103Z" fill="#231f20"></path><path d="M295.64,144.54c-6.08-3.68-12.84-7.34-20.18-10.91-.06.36-.13.71-.18,1.06,32,15.62,51.57,31.81,48.31,42.39-2.38,7.71-17.45,11.42-41.35,10.18a286,286,0,0,1-36-4.47A464.56,464.56,0,0,1,194.41,170a445.36,445.36,0,0,1-59.2-22.66A256,256,0,0,1,112,135C91.54,122.58,81.14,111,83.52,103.32c2.16-7.06,14.12-10.49,32.32-10.49A201.69,201.69,0,0,1,136.47,94c.14-.32.28-.65.43-1q-6.21-.66-12-1C100.13,90.8,85.07,94.68,82.51,103s7.72,20,29,32.86a267.69,267.69,0,0,0,24.26,12.85A446.92,446.92,0,0,0,194.1,171a459.79,459.79,0,0,0,51.44,12.76,284.69,284.69,0,0,0,36.65,4.58c3.12.16,6.08.25,8.9.25,19.48,0,31.27-3.89,33.51-11.17C327.15,169.05,316.87,157.38,295.64,144.54Z" fill="#231f20"></path><path d="M152.71,197.15l-9.42,5.4a7.32,7.32,0,0,0-2.57-.47h-35a7.35,7.35,0,0,0-7.35,7.35v18.29a7.35,7.35,0,0,0,7.35,7.35h35a7.35,7.35,0,0,0,7.35-7.35V209.43a7.4,7.4,0,0,0-.65-3Z" fill="#fff"></path><path d="M140.72,235.57h-35a7.86,7.86,0,0,1-7.85-7.85V209.43a7.86,7.86,0,0,1,7.85-7.85h35a7.79,7.79,0,0,1,2.52.42l9.22-5.28a.49.49,0,0,1,.6.08.5.5,0,0,1,.08.6l-5.17,9a7.71,7.71,0,0,1,.6,3v18.29A7.86,7.86,0,0,1,140.72,235.57Zm-35-33a6.86,6.86,0,0,0-6.85,6.85v18.29a6.85,6.85,0,0,0,6.85,6.85h35a6.85,6.85,0,0,0,6.85-6.85V209.43a6.68,6.68,0,0,0-.61-2.81.5.5,0,0,1,0-.46l4.38-7.66L143.54,203a.54.54,0,0,1-.43,0,6.83,6.83,0,0,0-2.39-.44Z" fill="#d1d3d4"></path><path d="M286,202.08a39.14,39.14,0,0,0-16.18,3.32l-11.64-6.18L262,210.78a13.31,13.31,0,0,0-3.89,9.05c0,9.81,12.46,17.76,27.82,17.76s27.81-8,27.81-17.76S301.31,202.08,286,202.08Z" fill="#fff"></path><path d="M286,238.09c-15.62,0-28.32-8.19-28.32-18.26a13.65,13.65,0,0,1,3.83-9.17l-3.8-11.28a.49.49,0,0,1,.15-.54.5.5,0,0,1,.56-.06l11.42,6.06A39.8,39.8,0,0,1,286,201.58c15.61,0,28.31,8.19,28.31,18.25S301.56,238.09,286,238.09ZM259,200.25l3.49,10.37a.49.49,0,0,1-.11.5,12.8,12.8,0,0,0-3.76,8.71c0,9.52,12.26,17.26,27.32,17.26s27.31-7.74,27.31-17.26S301,202.58,286,202.58a38.66,38.66,0,0,0-16,3.27.51.51,0,0,1-.45,0Z" fill="#d1d3d4"></path><path d="M136.59,38.29H98V72.12h33.08l5.5,5.16-1.73-5.16h1.73Z" fill="#fff"></path><path d="M136.59,77.78a.51.51,0,0,1-.34-.14l-5.35-5H98a.5.5,0,0,1-.5-.5V38.29a.5.5,0,0,1,.5-.5h38.58a.5.5,0,0,1,.5.5V72.12a.5.5,0,0,1-.5.5h-1l1.51,4.5a.51.51,0,0,1-.48.66ZM98.51,71.62h32.58a.52.52,0,0,1,.35.14l4.05,3.8-1.1-3.28a.5.5,0,0,1,.47-.66h1.23V38.79H98.51Z" fill="#d1d3d4"></path><path d="M117.3,164.54c-3.38,0-3.38,5.26,0,5.26S120.69,164.54,117.3,164.54Z" fill="#d1d3d4"></path><path d="M72.16,125.47a1,1,0,0,0-.27-.46l-.59-.6a.81.81,0,0,0-.34-.21.73.73,0,0,0-.41-.09.71.71,0,0,0-.4.09.81.81,0,0,0-.34.21l-.16.22a1,1,0,0,0-.15.53l0,.28a1.08,1.08,0,0,0,.27.46l.59.59a.83.83,0,0,0,.34.22,1,1,0,0,0,.41.09.9.9,0,0,0,.4-.09.83.83,0,0,0,.34-.22l.16-.21a1,1,0,0,0,.15-.53Z" fill="#d1d3d4"></path><path d="M117.08,111.14a.83.83,0,0,0-.22-.34.75.75,0,0,0-.34-.21.7.7,0,0,0-.4-.09l-.28,0a1,1,0,0,0-.46.27l-.17.22a1.08,1.08,0,0,0-.14.53v.59a1.16,1.16,0,0,0,.31.74.74.74,0,0,0,.33.22,1,1,0,0,0,.41.09l.28,0a1,1,0,0,0,.46-.27l.17-.21a1.1,1.1,0,0,0,.14-.53v-.59A1,1,0,0,0,117.08,111.14Z" fill="#d1d3d4"></path><path d="M294.82,171.05c-3.38,0-3.38,5.26,0,5.26S298.21,171.05,294.82,171.05Z" fill="#d1d3d4"></path><path d="M328,135c-3.38,0-3.39,5.25,0,5.25S331.34,135,328,135Z" fill="#d1d3d4"></path><path d="M251.29,218a1.49,1.49,0,0,0-.83-.83,1.27,1.27,0,0,0-.61-.14l-.42.06a1.52,1.52,0,0,0-.69.41l-.25.31a1.63,1.63,0,0,0-.22.8v.59a1.27,1.27,0,0,0,.14.61,1.18,1.18,0,0,0,.33.51,1.78,1.78,0,0,0,1.11.46l.42-.06a1.5,1.5,0,0,0,.69-.4l.25-.32a1.6,1.6,0,0,0,.22-.8v-.59A1.27,1.27,0,0,0,251.29,218Z" fill="#d1d3d4"></path><path d="M306,51a10.82,10.82,0,0,0-7.93,3.77,23.09,23.09,0,0,0-17-4.16,13,13,0,0,0-7.3,3c-.68.64-3.52,6.58-3.2,6.5-3.62.91-5.92,5-5.4,8.66a10.72,10.72,0,0,0,6.93,8.1,24.12,24.12,0,0,0,3.57,1,23.51,23.51,0,0,1-6,5.81,13.84,13.84,0,0,0,10.21-4.73c1.75.65,3.35,1.65,5.07,2.36,4.21,1.76,9,1.74,13.45.87a19.85,19.85,0,0,0,8.9-3.79,10.44,10.44,0,0,0,4.07-8.48c4,1.13,7.93-3,7.88-7.16C319.18,55.56,312.46,50.71,306,51Z" fill="#fff"></path><path d="M269.7,84.14a.5.5,0,0,1-.48-.35.51.51,0,0,1,.2-.56,22.76,22.76,0,0,0,5.38-5.08,21.08,21.08,0,0,1-2.89-.82,11.17,11.17,0,0,1-7.24-8.5c-.56-3.94,1.91-8,5.44-9.12a24.35,24.35,0,0,1,1.29-3,20.49,20.49,0,0,1,2-3.52A13.58,13.58,0,0,1,281,50.08a23.43,23.43,0,0,1,17,4,11.27,11.27,0,0,1,8-3.6h0a14,14,0,0,1,10,3.79,11.8,11.8,0,0,1,3.78,8.46,8.33,8.33,0,0,1-3.24,6.47,6,6,0,0,1-4.62,1.32,11.2,11.2,0,0,1-4.27,8.24,20.08,20.08,0,0,1-9.12,3.89c-5.24,1-9.86.72-13.74-.89-.79-.33-1.55-.71-2.28-1.09s-1.62-.81-2.46-1.15a14.32,14.32,0,0,1-10.35,4.64Zm1-23.56c-3.23.82-5.53,4.53-5,8.11a10.13,10.13,0,0,0,6.61,7.7,23.6,23.6,0,0,0,3.49,1,.48.48,0,0,1,.36.3.51.51,0,0,1-.05.48A24.41,24.41,0,0,1,271.4,83a13.53,13.53,0,0,0,8.14-4.44.49.49,0,0,1,.55-.13A25.72,25.72,0,0,1,283,79.76c.72.36,1.46.74,2.21,1,3.7,1.54,8.12,1.82,13.17.83A19.2,19.2,0,0,0,307,78a10,10,0,0,0,3.88-8.06.53.53,0,0,1,.18-.43.52.52,0,0,1,.45-.09,4.91,4.91,0,0,0,4.4-1,7.29,7.29,0,0,0,2.85-5.67A10.81,10.81,0,0,0,315.31,55a12.91,12.91,0,0,0-9.26-3.52h0a10.3,10.3,0,0,0-7.57,3.6.5.5,0,0,1-.68.07,22.43,22.43,0,0,0-16.67-4.06,12.65,12.65,0,0,0-7,2.9A36.36,36.36,0,0,0,271.05,60a.48.48,0,0,1-.37.56ZM306,51h0Z" fill="#d1d3d4"></path><path d="M292.39,113.69A3.59,3.59,0,1,1,296,110.1,3.59,3.59,0,0,1,292.39,113.69Zm0-6.18A2.59,2.59,0,1,0,295,110.1,2.59,2.59,0,0,0,292.39,107.51Z" fill="#d1d3d4"></path><path d="M209.39,41.88A3.59,3.59,0,1,1,213,38.29,3.59,3.59,0,0,1,209.39,41.88Zm0-6.18A2.59,2.59,0,1,0,212,38.29,2.59,2.59,0,0,0,209.39,35.7Z" fill="#d1d3d4"></path><path d="M96.09,140.71a2.57,2.57,0,1,1,2.56-2.56A2.56,2.56,0,0,1,96.09,140.71Zm0-4.13a1.57,1.57,0,1,0,1.56,1.57A1.56,1.56,0,0,0,96.09,136.58Z" fill="#d1d3d4"></path><path d="M243.34,44.22a1.05,1.05,0,0,0,0,2.1A1.05,1.05,0,0,0,243.34,44.22Z" fill="#d1d3d4"></path><path d="M159.91,45.54c-2.71,0-2.71,4.2,0,4.2S162.62,45.54,159.91,45.54Z" fill="#d1d3d4"></path><path d="M138.38,214.66H111a.5.5,0,0,1-.5-.5.51.51,0,0,1,.5-.5h27.41a.5.5,0,0,1,.5.5A.5.5,0,0,1,138.38,214.66Z" fill="#d1d3d4"></path><path d="M130.77,223.21H111a.5.5,0,0,1-.5-.5.51.51,0,0,1,.5-.5h19.8a.5.5,0,0,1,.5.5A.5.5,0,0,1,130.77,223.21Z" fill="#d1d3d4"></path><path d="M301.78,215.89H270.52a.5.5,0,0,1-.5-.5.51.51,0,0,1,.5-.5h31.26a.51.51,0,0,1,.5.5A.5.5,0,0,1,301.78,215.89Z" fill="#d1d3d4"></path><path d="M296.57,225.12H270.52a.51.51,0,0,1-.5-.5.5.5,0,0,1,.5-.5h26.05a.5.5,0,0,1,.5.5A.51.51,0,0,1,296.57,225.12Z" fill="#d1d3d4"></path><path d="M129.6,46H104.74a.5.5,0,0,1-.5-.5.5.5,0,0,1,.5-.5H129.6a.5.5,0,0,1,.5.5A.5.5,0,0,1,129.6,46Z" fill="#d1d3d4"></path><path d="M129.6,52.16H104.74a.5.5,0,0,1-.5-.5.5.5,0,0,1,.5-.5H129.6a.5.5,0,0,1,.5.5A.5.5,0,0,1,129.6,52.16Z" fill="#d1d3d4"></path><path d="M129.6,58.29H104.74a.5.5,0,0,1,0-1H129.6a.5.5,0,0,1,0,1Z" fill="#d1d3d4"></path><path d="M123.74,64.42h-19a.5.5,0,0,1-.5-.5.5.5,0,0,1,.5-.5h19a.5.5,0,0,1,.5.5A.51.51,0,0,1,123.74,64.42Z" fill="#d1d3d4"></path><path d="M281.41,65.54a1,1,0,0,0,0,2A1,1,0,0,0,281.41,65.54Z" fill="#d1d3d4"></path><path d="M291.42,65.54a1,1,0,0,0,0,2A1,1,0,0,0,291.42,65.54Z" fill="#d1d3d4"></path><path d="M301.43,65.54a1,1,0,0,0,0,2A1,1,0,0,0,301.43,65.54Z" fill="#d1d3d4"></path></g></svg>
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
.tag-verification-vertical {
|
|
2
|
+
margin-top: 20px;
|
|
3
|
+
background: #F2F0EF;
|
|
4
|
+
padding: 70px 65px;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.tag-verification-video {
|
|
8
|
+
display: flex;
|
|
9
|
+
justify-content: center;
|
|
10
|
+
align-items: center;
|
|
11
|
+
position: absolute;
|
|
12
|
+
width: 100%;
|
|
13
|
+
height: 100%;
|
|
14
|
+
top: 0;
|
|
15
|
+
left: 0;
|
|
16
|
+
background: black;
|
|
17
|
+
z-index: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.tag-verification-video * {
|
|
21
|
+
text-align: center;
|
|
22
|
+
justify-content: center;
|
|
23
|
+
color: white;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.tag-verification-container {
|
|
27
|
+
border-radius: 6px;
|
|
28
|
+
display: flex;
|
|
29
|
+
box-sizing: border-box;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@media (max-width: 767px) {
|
|
33
|
+
.tag-verification-image-container {
|
|
34
|
+
display: none;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.tag-verification-container h1 {
|
|
39
|
+
font-style: normal;
|
|
40
|
+
font-weight: 700;
|
|
41
|
+
font-size: 32px;
|
|
42
|
+
line-height: 28px;
|
|
43
|
+
margin-bottom: 20px !important;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.tag-verification-vertical button {
|
|
47
|
+
background: #00262B;
|
|
48
|
+
color: #FFFFFF;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.tag-verification-video button {
|
|
52
|
+
background: white;
|
|
53
|
+
color: #00262B;
|
|
54
|
+
width: fit-content;
|
|
55
|
+
align-self: center;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.tag-verification-container button {
|
|
59
|
+
padding: 10px 16px;
|
|
60
|
+
font-weight: 500;
|
|
61
|
+
font-size: 18px;
|
|
62
|
+
line-height: 24px;
|
|
63
|
+
box-shadow: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.tag-verification-video .tag-verification-form-container {
|
|
67
|
+
display: flex;
|
|
68
|
+
flex-direction: column;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.tag-verification-video p {
|
|
72
|
+
width: 465px;
|
|
73
|
+
align-self: center;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.tag-verification-vertical button:hover, .tag-verification-vertical button:focus {
|
|
77
|
+
background: #00262B;
|
|
78
|
+
color: #FFFFFF;
|
|
79
|
+
border: 1px solid #00262B;
|
|
80
|
+
box-shadow: none;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.tag-verification-video button:hover, .tag-verification-video button:focus {
|
|
84
|
+
background: #065683;
|
|
85
|
+
color: white;
|
|
86
|
+
border: 1px solid #065683;
|
|
87
|
+
box-shadow: none;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.tag-verification-container p {
|
|
91
|
+
font-style: normal;
|
|
92
|
+
font-weight: 400;
|
|
93
|
+
font-size: 18px;
|
|
94
|
+
line-height: 28px;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.tag-verification-vertical p {
|
|
98
|
+
color: #454545;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.tag-verification-tags-container {
|
|
102
|
+
flex-direction: row;
|
|
103
|
+
align-items: center;
|
|
104
|
+
display: flex;
|
|
105
|
+
gap: 11px;
|
|
106
|
+
margin-bottom: 20px;
|
|
107
|
+
flex-wrap: wrap;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.tag-verification-chip {
|
|
111
|
+
display: inline-block;
|
|
112
|
+
font-size: 13px;
|
|
113
|
+
padding: 2px 8px;
|
|
114
|
+
box-sizing: border-box;
|
|
115
|
+
border-radius: 6px;
|
|
116
|
+
font-style: normal;
|
|
117
|
+
font-weight: 400;
|
|
118
|
+
font-size: 12px;
|
|
119
|
+
line-height: 24px;
|
|
120
|
+
margin-bottom: 0px;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.tag-verification-vertical .tag-verification-chip {
|
|
124
|
+
color: #002121;
|
|
125
|
+
background-color: white;
|
|
126
|
+
border: 1px solid #F2F0EF;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.tag-verification-video .tag-verification-chip {
|
|
130
|
+
color: white;
|
|
131
|
+
background-color: #2D494E;
|
|
132
|
+
border: 1px solid #2D494E;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.tag-verification-vertical .tag-verification-chip.tag-verification-chip-hover:hover {
|
|
136
|
+
background: #ccc;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.tag-verification-video .tag-verification-chip.tag-verification-chip-hover:hover {
|
|
140
|
+
background: #576D71;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.tag-verification-chip-clickable {
|
|
144
|
+
cursor: pointer;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.tag-verification-tags-container input[type=checkbox] {
|
|
148
|
+
position: absolute;
|
|
149
|
+
/* set same dimensions as the SVG */
|
|
150
|
+
width: 1em;
|
|
151
|
+
height: 1em;
|
|
152
|
+
/* hide it */
|
|
153
|
+
opacity: 0.00000;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.tag-verification-vertical .tag-verification-tags-container input[type=checkbox]:checked + label {
|
|
157
|
+
border: 1px solid #00262B;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.tag-verification-vertical .tag-verification-tags-container input[type=checkbox]:focus + label {
|
|
161
|
+
background: #ccc;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.tag-verification-video .tag-verification-tags-container input[type=checkbox]:checked + label {
|
|
165
|
+
border: 1px solid #FFFFFF;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.tag-verification-video .tag-verification-tags-container input[type=checkbox]:focus + label {
|
|
169
|
+
background: #576D71;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.tag-verification-none-selected-container {
|
|
173
|
+
margin-bottom: 25px;
|
|
174
|
+
height: 28px;
|
|
175
|
+
display: flex;
|
|
176
|
+
align-items: center;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.tag-verification-none-selected-container label {
|
|
180
|
+
font-weight: 400;
|
|
181
|
+
font-size: 14px;
|
|
182
|
+
line-height: 28px;
|
|
183
|
+
margin: 0px;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.tag-verification-none-selected-container input {
|
|
187
|
+
margin-right: 8px;
|
|
188
|
+
width: 18px;
|
|
189
|
+
height: 18px;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
/* loading spinner */
|
|
194
|
+
.tag-verification-container button.loading {
|
|
195
|
+
padding-left: 40px;
|
|
196
|
+
position: relative;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.tag-verification-container button.loading:before {
|
|
200
|
+
content: "";
|
|
201
|
+
position: absolute;
|
|
202
|
+
border-radius: 100%;
|
|
203
|
+
left: 13px;
|
|
204
|
+
top: 50%;
|
|
205
|
+
width: 0px;
|
|
206
|
+
height: 0px;
|
|
207
|
+
margin-top: -2px;
|
|
208
|
+
animation: spin .6s infinite linear, grow .3s forwards ease-out;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.tag-verification-vertical button.loading:before {
|
|
212
|
+
border: 2px solid rgba(255,255,255,0.5);
|
|
213
|
+
border-top-color: #FFF;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.tag-verification-video button.loading:before {
|
|
217
|
+
border: 2px solid rgba(0,0,0,1);
|
|
218
|
+
border-top-color: #FFF;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
@keyframes spin {
|
|
222
|
+
to {
|
|
223
|
+
transform: rotate(359deg);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
@keyframes grow {
|
|
227
|
+
to {
|
|
228
|
+
width: 14px;
|
|
229
|
+
height: 14px;
|
|
230
|
+
margin-top: -8px;
|
|
231
|
+
right: 13px;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.tag-verification-container button[disabled] {
|
|
236
|
+
opacity: 0.3;
|
|
237
|
+
}
|