Compare commits

...

25 Commits

Author SHA1 Message Date
e54519db7a update 2025-07-02 16:42:34 +03:00
152eb15f90 Merge branch 'main' of http://10.10.1.136:3000/ismail/haikal into frontend 2025-07-02 16:33:51 +03:00
679b7fbb89 update 2025-07-02 16:33:40 +03:00
bea6894f0a fix the lead assigned and lead tracking qs 2025-07-02 16:32:37 +03:00
35bc6fb767 update 2025-07-02 16:22:53 +03:00
afa8edb994 fix the group user count qs 2025-07-02 15:19:05 +03:00
4f0b199dae update 2025-07-02 15:00:31 +03:00
a7d09e60e3 fix some stuff 2025-07-02 14:53:42 +03:00
533300b0ed update 2025-07-02 14:53:41 +03:00
d085940fca update 2025-07-01 19:55:14 +03:00
Marwan Alwali
b22ef36524 update 2025-07-01 18:29:31 +03:00
34558952e8 u 2025-07-01 18:24:30 +03:00
68f7e3fb2c update the perms 2025-07-01 18:22:10 +03:00
6030267f61 Merge branch 'main' of http://10.10.1.136:3000/ismail/haikal into frontend 2025-07-01 17:09:12 +03:00
90425409fd fix the report view permission issue 2025-07-01 17:08:11 +03:00
d506f11545 Merge branch 'main' of http://10.10.1.136:3000/ismail/haikal into frontend 2025-07-01 16:40:25 +03:00
2adccfc7d0 u 2025-07-01 16:40:09 +03:00
841ccb29a9 disable adding to the entity managers list 2025-07-01 16:39:39 +03:00
bf4a3ea3bd Merge branch 'main' of http://10.10.1.136:3000/ismail/haikal into frontend 2025-07-01 14:14:48 +03:00
08340a4a2e u 2025-07-01 14:14:36 +03:00
fb1a58da6d update 2025-07-01 14:14:05 +03:00
e441983674 update 2025-07-01 12:31:16 +03:00
8cea22dff7 update 2025-07-01 12:29:17 +03:00
e692519032 update the perms and others 2025-07-01 12:20:40 +03:00
d772557135 Merge pull request 'Search functionality inside po list' (#91) from frontend into main
Reviewed-on: #91
2025-06-30 17:04:05 +03:00
98 changed files with 9122 additions and 1078 deletions

BIN
.DS_Store vendored

Binary file not shown.

5
.gitignore vendored
View File

@ -16,7 +16,7 @@ car_inventory/settings.py
car_inventory/__pycache__ car_inventory/__pycache__
haikalbot/temp_files_not_included haikalbot/temp_files_not_included
scripts/dsrpipe.py scripts/dsrpipe.py
def_venv dev_venv
# Backup files # # Backup files #
*.bak *.bak
play.sh play.sh
@ -43,7 +43,7 @@ Makefile
.idea/**/dynamic.xml .idea/**/dynamic.xml
.idea/**/uiDesigner.xml .idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml .idea/**/dbnavigator.xml
**/migrations/ **/migrations/**
# Gradle # Gradle
.idea/**/gradle.xml .idea/**/gradle.xml
@ -116,6 +116,7 @@ celerybeat-schedule.*
.venv .venv
env/ env/
venv/ venv/
dev_venv/
ENV/ ENV/
env.bak/ env.bak/
venv.bak/ venv.bak/

View File

@ -14,9 +14,10 @@
</component> </component>
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
<excludeFolder url="file://$MODULE_DIR$/venv" /> <excludeFolder url="file://$MODULE_DIR$/venv" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.11 (car_inventory)" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="uv (car_inventory)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="jquery-3.5.1" level="application" /> <orderEntry type="library" name="jquery-3.5.1" level="application" />
<orderEntry type="library" name="sweetalert2" level="application" /> <orderEntry type="library" name="sweetalert2" level="application" />

5
.idea/misc.xml generated
View File

@ -3,8 +3,5 @@
<component name="Black"> <component name="Black">
<option name="sdkName" value="Python 3.11 (car_inventory)" /> <option name="sdkName" value="Python 3.11 (car_inventory)" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (car_inventory)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="uv (car_inventory)" project-jdk-type="Python SDK" />
<component name="PyPackaging">
<option name="earlyReleasesAsUpgrades" value="true" />
</component>
</project> </project>

View File

@ -1,31 +0,0 @@
# Generated by Django 5.2.1 on 2025-05-25 23:01
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="CarVIN",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("vin", models.CharField(max_length=17, verbose_name="VIN")),
(
"created",
models.DateTimeField(auto_now_add=True, verbose_name="created"),
),
],
),
]

View File

@ -21,8 +21,8 @@ urlpatterns += i18n_patterns(
path("switch_language/", views.switch_language, name="switch_language"), path("switch_language/", views.switch_language, name="switch_language"),
path("accounts/", include("allauth.urls")), path("accounts/", include("allauth.urls")),
# path('prometheus/', include('django_prometheus.urls')), # path('prometheus/', include('django_prometheus.urls')),
path("", include("inventory.urls")),
path("ledger/", include("django_ledger.urls", namespace="django_ledger")), path("ledger/", include("django_ledger.urls", namespace="django_ledger")),
path("", include("inventory.urls")),
path("haikalbot/", include("haikalbot.urls")), path("haikalbot/", include("haikalbot.urls")),
path("appointment/", include("appointment.urls")), path("appointment/", include("appointment.urls")),
path("plans/", include("plans.urls")), path("plans/", include("plans.urls")),

View File

@ -1,4 +1,4 @@
# Generated by Django 5.1.7 on 2025-06-22 17:22 # Generated by Django 5.1.7 on 2025-07-01 10:33
import django.db.models.deletion import django.db.models.deletion
import django.utils.timezone import django.utils.timezone

View File

@ -1,4 +1,4 @@
# Generated by Django 5.1.7 on 2025-06-22 17:22 # Generated by Django 5.1.7 on 2025-07-01 10:33
import django.db.models.deletion import django.db.models.deletion
from django.db import migrations, models from django.db import migrations, models

View File

@ -1,8 +1,5 @@
from django.conf import settings from django.conf import settings
from inventory.utils import get_user_type
def currency_context(request): def currency_context(request):
""" """
Provides a context dictionary containing the currency setting. This is typically Provides a context dictionary containing the currency setting. This is typically

View File

@ -1596,8 +1596,8 @@ class PermissionForm(forms.ModelForm):
# "inventory.salequotation", # "inventory.salequotation",
# "inventory.salequotationcar" # "inventory.salequotationcar"
"django_ledger.purchaseordermodel"
"django_ledger.bankaccountmodel", "django_ledger.bankaccountmodel",
"django_ledger.chartofaccountmodel",
"django_ledger.estimatemodel", "django_ledger.estimatemodel",
"django_ledger.accountmodel", "django_ledger.accountmodel",
"django_ledger.chartofaccountmodel", "django_ledger.chartofaccountmodel",
@ -1606,6 +1606,7 @@ class PermissionForm(forms.ModelForm):
"django_ledger.invoicemodel", "django_ledger.invoicemodel",
"django_ledger.vendormodel", "django_ledger.vendormodel",
"django_ledger.journalentrymodel" "django_ledger.journalentrymodel"
"django_ledger.purchaseordermodel",#TODO add purchase order
] ]
permissions = cache.get( permissions = cache.get(

View File

@ -43,8 +43,8 @@ class Command(BaseCommand):
) )
# Assign quotas to plans # Assign quotas to plans
PlanQuota.objects.create(plan=basic_plan, quota=users_quota, value=3) PlanQuota.objects.create(plan=basic_plan, quota=users_quota, value=4)
PlanQuota.objects.create(plan=basic_plan, quota=cars_quota, value=3) PlanQuota.objects.create(plan=basic_plan, quota=cars_quota, value=4)
PlanQuota.objects.create(plan=pro_plan, quota=users_quota, value=5) PlanQuota.objects.create(plan=pro_plan, quota=users_quota, value=5)
PlanQuota.objects.create(plan=pro_plan, quota=cars_quota, value=5) PlanQuota.objects.create(plan=pro_plan, quota=cars_quota, value=5)

View File

@ -114,6 +114,7 @@ class InjectDealerMiddleware:
# if request.user.is_authenticated and not request.session.get('otp_verified', False): # if request.user.is_authenticated and not request.session.get('otp_verified', False):
# return redirect(reverse('verify_otp')) # return redirect(reverse('verify_otp'))
# return self.get_response(request) # return self.get_response(request)
class DealerSlugMiddleware: class DealerSlugMiddleware:
def __init__(self, get_response): def __init__(self, get_response):
self.get_response = get_response self.get_response = get_response
@ -126,7 +127,7 @@ class DealerSlugMiddleware:
request.path_info.startswith('/en/login/') or \ request.path_info.startswith('/en/login/') or \
request.path_info.startswith('/en/logout/') or \ request.path_info.startswith('/en/logout/') or \
request.path_info.startswith('/en/ledger/') or \ request.path_info.startswith('/en/ledger/') or \
request.path_info.startswith('/en/ledger/') or \ request.path_info.startswith('/ar/ledger/') or \
request.path_info.startswith('/en/notifications/') or \ request.path_info.startswith('/en/notifications/') or \
request.path_info.startswith('/ar/notifications/'): request.path_info.startswith('/ar/notifications/'):
return None return None
@ -143,7 +144,6 @@ class DealerSlugMiddleware:
return None return None
if dealer_slug.lower() != request.dealer.slug.lower(): if dealer_slug.lower() != request.dealer.slug.lower():
print(dealer_slug)
logger.warning(f"Dealer slug mismatch: {dealer_slug} != {request.dealer.slug}") logger.warning(f"Dealer slug mismatch: {dealer_slug} != {request.dealer.slug}")
raise Http404("Dealer slug mismatch") raise Http404("Dealer slug mismatch")

View File

@ -1,4 +1,4 @@
# Generated by Django 5.1.7 on 2025-06-22 17:22 # Generated by Django 5.1.7 on 2025-07-01 10:33
import datetime import datetime
import django.core.validators import django.core.validators
@ -600,6 +600,18 @@ class Migration(migrations.Migration):
name='organization', name='organization',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='organization_leads', to='inventory.organization'), field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='organization_leads', to='inventory.organization'),
), ),
migrations.CreateModel(
name='PoItemsUploaded',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('status', models.CharField(blank=True, max_length=100, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('dealer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='inventory.dealer')),
('item', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='po_items', to='django_ledger.itemtransactionmodel')),
('po', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='items', to='django_ledger.purchaseordermodel')),
],
),
migrations.CreateModel( migrations.CreateModel(
name='Refund', name='Refund',
fields=[ fields=[

View File

@ -1,7 +1,8 @@
from django.http import Http404 from django.http import Http404
from django.shortcuts import redirect from django.shortcuts import get_object_or_404, redirect
from django.utils.translation import get_language from django.utils.translation import get_language
from django_ledger.models import EntityModel
from inventory import models
from inventory.utils import get_user_type from inventory.utils import get_user_type
@ -74,3 +75,17 @@ class DealerSlugMixin:
elif kwargs["dealer_slug"] != request.dealer.slug: elif kwargs["dealer_slug"] != request.dealer.slug:
raise Http404("Dealer slug mismatch") raise Http404("Dealer slug mismatch")
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
class AuthorizedEntityMixin:
def get_authorized_entity_queryset(self):
dealer = get_object_or_404(models.Dealer,slug=self.kwargs["dealer_slug"])
return EntityModel.objects.for_user(
user_model=dealer.entity.admin,
authorized_superuser=self.get_superuser_authorization(),
)
def get_queryset(self):
dealer = get_object_or_404(models.Dealer,slug=self.kwargs["dealer_slug"])
self.queryset = EntityModel.objects.for_user(
user_model=dealer.entity.admin).select_related('default_coa')
return super().get_queryset()

View File

@ -34,9 +34,11 @@ from django_ledger.models import (
EntityManagementModel, EntityManagementModel,
PurchaseOrderModel, PurchaseOrderModel,
ItemTransactionModel, ItemTransactionModel,
BillModel
) )
from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.serializers.json import DjangoJSONEncoder
from appointment.models import StaffMember from appointment.models import StaffMember
from plans.quota import get_user_quota from plans.quota import get_user_quota
from plans.models import UserPlan from plans.models import UserPlan
@ -1184,6 +1186,9 @@ class Staff(models.Model, LocalizedNameMixin):
return self.staff_member.user return self.staff_member.user
@property @property
def groups(self):
return [x.customgroup for x in self.user.groups.all()]
@property
def groups(self): def groups(self):
return [x.customgroup for x in self.user.groups.all()] return [x.customgroup for x in self.user.groups.all()]
@ -1197,24 +1202,16 @@ class Staff(models.Model, LocalizedNameMixin):
try: try:
self.user.groups.add(group) self.user.groups.add(group)
if "accountant" in group.name.lower() or "manager" in group.name.lower(): if "accountant" in group.name.lower() or "manager" in group.name.lower():
self.add_as_superuser() self.add_superuser_permission()
except Exception as e: except Exception as e:
print(e) print(e)
def add_as_superuser(self): def add_superuser_permission(self):
EntityManagementModel.objects.get_or_create( pass
user=self.user, entity=self.dealer.entity # self.dealer.entity.managers.add(self.user)
)
def remove_superuser_permission(self): def remove_superuser_permission(self):
EntityManagementModel.objects.filter( pass
user=self.user, entity=self.dealer.entity # self.dealer.entity.managers.remove(self.user)
).delete()
# self.user.groups.clear()
# group = Group.objects.filter(
# customgroup__name__iexact=self.staff_type
# ).first()
# if group:
# self.add_group(group)
class Meta: class Meta:
verbose_name = _("Staff") verbose_name = _("Staff")
@ -2525,7 +2522,7 @@ class CustomGroup(models.Model):
@property @property
def users(self): def users(self):
return self.group.user_set.all() return self.group.user_set.exclude(email=self.dealer.user.email).all()
@property @property
def permissions(self): def permissions(self):
@ -2552,6 +2549,10 @@ class CustomGroup(models.Model):
pass pass
def set_default_permissions(self): def set_default_permissions(self):
est = ContentType.objects.get_for_model(EstimateModel)
bill = ContentType.objects.get_for_model(BillModel)
Permission.objects.get_or_create(name="Can approve estimate",codename="can_approve_estimate",content_type=est)
Permission.objects.get_or_create(name="Can approve bill",codename="can_approve_bill",content_type=bill)
self.clear_permissions() self.clear_permissions()
if self.name == "Manager": if self.name == "Manager":
self.set_permissions( self.set_permissions(
@ -2591,6 +2592,8 @@ class CustomGroup(models.Model):
"chartofaccountmodel", "chartofaccountmodel",
"customermodel", "customermodel",
"billmodel", "billmodel",
"can_approve_estimate"
"can_approve_bill",
], ],
) )
elif self.name == "Inventory": elif self.name == "Inventory":
@ -2662,8 +2665,9 @@ class CustomGroup(models.Model):
"invoicemodel", "invoicemodel",
"vendormodel", "vendormodel",
"journalentrymodel", "journalentrymodel",
"purchaseordermodel",
], ],
other_perms=["view_customermodel", "view_estimatemodel"], other_perms=["view_customermodel", "view_estimatemodel","can_approve_estimatemodel","can_approve_billmodel"],
) )
elif self.name == "Agent": elif self.name == "Agent":
# Todo : set permissions for agent # Todo : set permissions for agent
@ -2859,4 +2863,58 @@ class PoItemsUploaded(models.Model):
) )
status = models.CharField(max_length=100, null=True, blank=True) status = models.CharField(max_length=100, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True) updated_at = models.DateTimeField(auto_now=True)
class ExtraInfo(models.Model):
"""
Stores additional information for any model with:
- Multiple generic relationships
- JSON data storage
- Tracking fields
"""
# Primary GenericForeignKey (main linked object)
content_type = models.ForeignKey(
ContentType,
on_delete=models.CASCADE,
related_name="extra_info_primary"
)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
# Secondary GenericForeignKey (optional additional link)
related_content_type = models.ForeignKey(
ContentType,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="extra_info_secondary"
)
related_object_id = models.PositiveIntegerField(null=True, blank=True)
related_object = GenericForeignKey('related_content_type', 'related_object_id')
# JSON Data Storage
data = models.JSONField(
encoder=DjangoJSONEncoder,
default=dict,
blank=True
)
# Metadata
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
created_by = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
related_name="created_extra_info"
)
class Meta:
indexes = [
models.Index(fields=['content_type', 'object_id']),
models.Index(fields=['related_content_type', 'related_object_id']),
]
verbose_name_plural = "Extra Info"
def __str__(self):
return f"ExtraInfo for {self.content_object} ({self.content_type})"

View File

@ -15,7 +15,8 @@ from django_ledger.models import (
TransactionModel, TransactionModel,
LedgerModel, LedgerModel,
AccountModel, AccountModel,
PurchaseOrderModel PurchaseOrderModel,
EstimateModel
) )
from . import models from . import models
from django.utils.timezone import now from django.utils.timezone import now
@ -904,15 +905,28 @@ def create_po_item_upload(sender,instance,created,**kwargs):
models.PoItemsUploaded.objects.create(dealer=dealer,po=instance, item=item, status="fulfilled") models.PoItemsUploaded.objects.create(dealer=dealer,po=instance, item=item, status="fulfilled")
########################################################## ##########################################################
######################Notification######################## ######################Notification########################
########################################################## ##########################################################
@receiver(post_save, sender=PurchaseOrderModel)
def create_po_fulfilled_notification(sender,instance,created,**kwargs):
if instance.po_status == "fulfilled":
dealer = models.Dealer.objects.get(entity=instance.entity)
accountants = models.CustomGroup.objects.filter(dealer=dealer,name="Inventory").first().group.user_set.exclude(email=dealer.user.email)
for accountant in accountants:
models.Notification.objects.create(
user=accountant,
message=f"""
New Purchase Order {instance.po_number} has been added to dealer {instance.dealer.name}.
<a href="{instance.get_absolute_url()}" target="_blank">View</a>
""",
)
@receiver(post_save, sender=models.Car) @receiver(post_save, sender=models.Car)
def car_created_notification(sender, instance, created, **kwargs): def car_created_notification(sender, instance, created, **kwargs):
if created: if created:
accountants = models.CustomGroup.objects.filter(dealer=instance.dealer,name="Accountant").first().group.user_set.exclude(email=instance.dealer.user.email) accountants = models.CustomGroup.objects.filter(dealer=instance.dealer,name__in=["Manager","Accountant"]).first().group.user_set.all()
for accountant in accountants: for accountant in accountants:
models.Notification.objects.create( models.Notification.objects.create(
user=accountant, user=accountant,
@ -958,26 +972,60 @@ def sale_order_created_notification(sender, instance, created, **kwargs):
user=recipient, user=recipient,
message=f""" message=f"""
New Sale Order has been added for estimate:{instance.estimate}. New Sale Order has been added for estimate:{instance.estimate}.
<a href="{reverse('estimate_detail',kwargs={'dealer_slug':instance.dealer.slug,'pk':instance.pk})}" target="_blank">View</a> <a href="{reverse('estimate_detail',kwargs={'dealer_slug':instance.dealer.slug,'pk':instance.estimate.pk})}" target="_blank">View</a>
""", """,
) )
@receiver(post_save, sender=models.Lead) @receiver(post_save, sender=models.Lead)
def lead_created_notification(sender, instance, created, **kwargs): def lead_created_notification(sender, instance, created, **kwargs):
if created: if created:
models.Notification.objects.create( if instance.staff:
user=instance.staff.user, models.Notification.objects.create(
message=f""" user=instance.staff.user,
New Lead has been added. message=f"""
<a href="{reverse('lead_detail',kwargs={'dealer_slug':instance.dealer.slug,'slug':instance.slug})}" target="_blank">View</a> New Lead has been added.
""", <a href="{reverse('lead_detail',kwargs={'dealer_slug':instance.dealer.slug,'slug':instance.slug})}" target="_blank">View</a>
) """,
@receiver(post_save, sender=models.Lead) )
def lead_created_notification(sender, instance, created, **kwargs): @receiver(post_save, sender=EstimateModel)
if created: def estimate_in_review_notification(sender, instance, created, **kwargs):
models.Notification.objects.create( if instance.is_review():
user=instance.staff.user, recipients = models.CustomGroup.objects.filter(dealer=instance.dealer,name="Manager").first().group.user_set.exclude(email=instance.dealer.user.email)
message=f""" dealer = models.Dealer.objects.get(entity=instance.entity)
New Lead has been added. for recipient in recipients:
<a href="{reverse('lead_detail',kwargs={'dealer_slug':instance.dealer.slug,'slug':instance.slug})}" target="_blank">View</a> models.Notification.objects.create(
""", user=recipient,
) message=f"""
Estimate {instance.estimate_number} is in review.
Please review and approve it at your earliest convenience.
<a href="{reverse('estimate_detail', kwargs={'dealer_slug': dealer.slug, 'pk': instance.pk})}" target="_blank">View</a>
""")
@receiver(post_save, sender=EstimateModel)
def estimate_in_approve_notification(sender, instance, created, **kwargs):
if instance.is_approved():
recipients = models.CustomGroup.objects.filter(dealer=instance.dealer,name="Manager").first().group.user_set.exclude(email=instance.dealer.user.email)
dealer = models.Dealer.objects.get(entity=instance.entity)
for recipient in recipients:
models.Notification.objects.create(
user=recipient,
message=f"""
Estimate {instance.estimate_number} is in review.
Please review and approve it at your earliest convenience.
<a href="{reverse('estimate_detail', kwargs={'dealer_slug': dealer.slug, 'pk': instance.pk})}" target="_blank">View</a>
""")
# @receiver(post_save, sender=models.Lead)
# def lead_created_notification(sender, instance, created, **kwargs):
# if created:
# models.Notification.objects.create(
# user=instance.staff.user,
# message=f"""
# New Lead has been added.
# <a href="{reverse('lead_detail',kwargs={'dealer_slug':instance.dealer.slug,'slug':instance.slug})}" target="_blank">View</a>
# """,
# )
# send notification after car is sold {manager,dealer}
# after po review send notification to {manager} to approve po
# after estimate review send notification to {manager} to approve estimate

View File

@ -48,11 +48,13 @@ def attr(field, args):
"ledger/reports/components/period_navigator.html", takes_context=True "ledger/reports/components/period_navigator.html", takes_context=True
) )
def period_navigation(context, base_url: str): def period_navigation(context, base_url: str):
print(context, base_url)
kwargs = dict() kwargs = dict()
dealer_slug = context["view"].kwargs["dealer_slug"]
entity_slug = context["view"].kwargs["entity_slug"] entity_slug = context["view"].kwargs["entity_slug"]
kwargs["dealer_slug"] = dealer_slug
kwargs["entity_slug"] = entity_slug kwargs["entity_slug"] = entity_slug
if context["view"].kwargs.get("ledger_pk"): if context["view"].kwargs.get("ledger_pk"):
kwargs["ledger_pk"] = context["view"].kwargs.get("ledger_pk") kwargs["ledger_pk"] = context["view"].kwargs.get("ledger_pk")
@ -86,6 +88,7 @@ def period_navigation(context, base_url: str):
dt = get_localdate() dt = get_localdate()
KWARGS_CURRENT_MONTH = { KWARGS_CURRENT_MONTH = {
"dealer_slug": context["view"].kwargs["dealer_slug"],
"entity_slug": context["view"].kwargs["entity_slug"], "entity_slug": context["view"].kwargs["entity_slug"],
"year": dt.year, "year": dt.year,
"month": dt.month, "month": dt.month,
@ -100,7 +103,7 @@ def period_navigation(context, base_url: str):
if "coa_slug" in kwargs: if "coa_slug" in kwargs:
KWARGS_CURRENT_MONTH["coa_slug"] = kwargs["coa_slug"] KWARGS_CURRENT_MONTH["coa_slug"] = kwargs["coa_slug"]
ctx["current_month_url"] = reverse(f"{base_url}-month", kwargs=KWARGS_CURRENT_MONTH) ctx["current_month_url"] = reverse(f"{base_url}-month" ,kwargs=KWARGS_CURRENT_MONTH)
quarter_urls = list() quarter_urls = list()
ctx["quarter"] = context.get("quarter") ctx["quarter"] = context.get("quarter")
@ -647,8 +650,18 @@ def inventory_table(context, queryset):
return ctx return ctx
@register.filter @register.filter
def count_checked(permissions): def count_checked(permissions, group_permission_ids):
"""Count how many permissions are marked as checked""" """Count how many permissions are checked from the allowed list"""
print(permissions) if not group_permission_ids:
return sum(1 for perm in permissions if getattr(perm, 'is_checked', False)) return 0
return sum(1 for perm in permissions if perm.id in group_permission_ids)
# @register.filter
# def count_checked(permissions, group_permission_ids):
# """Count how many permissions are checked from the allowed list"""
# return sum(1 for perm in permissions if perm.id in group_permission_ids)

View File

@ -41,7 +41,7 @@ urlpatterns = [
path("dashboards/sales/", views.SalesDashboard.as_view(), name="sales_dashboard"), path("dashboards/sales/", views.SalesDashboard.as_view(), name="sales_dashboard"),
path("test/", views.TestView.as_view(), name="test"), path("test/", views.TestView.as_view(), name="test"),
path("cars/inventory/table/", views.CarListViewTable.as_view(), name="car_table"), path("cars/inventory/table/", views.CarListViewTable.as_view(), name="car_table"),
path("export/format/", TableExport, name="export"), path("export/format/", TableExport.export, name="export"),
# Dealer URLs # Dealer URLs
path( path(
"<slug:slug>/dealers/", views.DealerDetailView.as_view(), name="dealer_detail" "<slug:slug>/dealers/", views.DealerDetailView.as_view(), name="dealer_detail"
@ -207,11 +207,7 @@ urlpatterns = [
path("notifications/stream/", views.sse_stream, name="sse_stream"), path("notifications/stream/", views.sse_stream, name="sse_stream"),
path("notifications/fetch/", views.fetch_notifications, name="fetch_notifications"), path("notifications/fetch/", views.fetch_notifications, name="fetch_notifications"),
path( path("notifications/list/", views.NotificationListView.as_view(), name="notifications_history"),
"notifications/",
views.NotificationListView.as_view(),
name="notifications_history",
),
path( path(
"notifications/<int:notification_id>/mark_as_read/", "notifications/<int:notification_id>/mark_as_read/",
@ -444,63 +440,23 @@ urlpatterns = [
path("<slug:dealer_slug>/user/create/", views.UserCreateView.as_view(), name="user_create"), path("<slug:dealer_slug>/user/create/", views.UserCreateView.as_view(), name="user_create"),
path("<slug:dealer_slug>/user/<slug:slug>/", views.UserDetailView.as_view(), name="user_detail"), path("<slug:dealer_slug>/user/<slug:slug>/", views.UserDetailView.as_view(), name="user_detail"),
path("<slug:dealer_slug>/user/<slug:slug>/groups/", views.UserGroupView, name="user_groups"), path("<slug:dealer_slug>/user/<slug:slug>/groups/", views.UserGroupView, name="user_groups"),
path( path("<slug:dealer_slug>/user/<slug:slug>/update/", views.UserUpdateView.as_view(), name="user_update"),
"<slug:dealer_slug>/user/<slug:slug>/update/", views.UserUpdateView.as_view(), name="user_update"
),
path("<slug:dealer_slug>/user/<slug:slug>/confirm/", views.UserDeleteview, name="user_delete"), path("<slug:dealer_slug>/user/<slug:slug>/confirm/", views.UserDeleteview, name="user_delete"),
# Group URLs
path("<slug:dealer_slug>/group/create/", views.GroupCreateView.as_view(), name="group_create"), path("<slug:dealer_slug>/group/create/", views.GroupCreateView.as_view(), name="group_create"),
path( path("<slug:dealer_slug>/group/<int:pk>/update/", views.GroupUpdateView.as_view(), name="group_update"),
"<slug:dealer_slug>/group/<int:pk>/update/", views.GroupUpdateView.as_view(), name="group_update"
),
path("<slug:dealer_slug>/group/<int:pk>/", views.GroupDetailView.as_view(), name="group_detail"), path("<slug:dealer_slug>/group/<int:pk>/", views.GroupDetailView.as_view(), name="group_detail"),
path("<slug:dealer_slug>/group/", views.GroupListView.as_view(), name="group_list"), path("<slug:dealer_slug>/group/", views.GroupListView.as_view(), name="group_list"),
path("<slug:dealer_slug>/group/<int:pk>/confirm/", views.GroupDeleteview, name="group_delete"), path("<slug:dealer_slug>/group/<int:pk>/confirm/", views.GroupDeleteview, name="group_delete"),
path( path("<slug:dealer_slug>/group/<int:pk>/permission/", views.GroupPermissionView, name="group_permission"),
"<slug:dealer_slug>/group/<int:pk>/permission/", views.GroupPermissionView, name="group_permission" path("<slug:dealer_slug>/organizations/create/", views.OrganizationCreateView.as_view(), name="organization_create"),
), path("<slug:dealer_slug>/organizations/", views.OrganizationListView.as_view(), name="organization_list"),
# Organization URLs path("<slug:dealer_slug>/organizations/<slug:slug>/", views.OrganizationDetailView.as_view(), name="organization_detail"),
path( path("<slug:dealer_slug>/organizations/<slug:slug>/update/", views.OrganizationUpdateView.as_view(), name="organization_update"),
"<slug:dealer_slug>/organizations/create/", path("<slug:dealer_slug>/organizations/<slug:slug>/delete/", views.OrganizationDeleteView, name="organization_delete"),
views.OrganizationCreateView.as_view(), path("representatives/", views.RepresentativeListView.as_view(), name="representative_list"),
name="organization_create", path("representatives/<int:pk>/", views.RepresentativeDetailView.as_view(), name="representative_detail"),
), path("representatives/create/", views.RepresentativeCreateView.as_view(),name="representative_create"),
path( path("representatives/<int:pk>/update/",
"<slug:dealer_slug>/organizations/", views.OrganizationListView.as_view(), name="organization_list"
),
path(
"<slug:dealer_slug>/organizations/<slug:slug>/",
views.OrganizationDetailView.as_view(),
name="organization_detail",
),
path(
"<slug:dealer_slug>/organizations/<slug:slug>/update/",
views.OrganizationUpdateView.as_view(),
name="organization_update",
),
path(
"<slug:dealer_slug>/organizations/<slug:slug>/delete/",
views.OrganizationDeleteView,
name="organization_delete",
),
# Representative URLs
path(
"representatives/",
views.RepresentativeListView.as_view(),
name="representative_list",
),
path(
"representatives/<int:pk>/",
views.RepresentativeDetailView.as_view(),
name="representative_detail",
),
path(
"representatives/create/",
views.RepresentativeCreateView.as_view(),
name="representative_create",
),
path(
"representatives/<int:pk>/update/",
views.RepresentativeUpdateView.as_view(), views.RepresentativeUpdateView.as_view(),
name="representative_update", name="representative_update",
), ),
@ -509,9 +465,6 @@ urlpatterns = [
views.RepresentativeDeleteView.as_view(), views.RepresentativeDeleteView.as_view(),
name="representative_delete", name="representative_delete",
), ),
#####################################################################
# Ledger
#####################################################################
path("<slug:dealer_slug>/ledgers/", views.LedgerModelListView.as_view(), name="ledger_list"), path("<slug:dealer_slug>/ledgers/", views.LedgerModelListView.as_view(), name="ledger_list"),
path( path(
"<slug:dealer_slug>/ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create" "<slug:dealer_slug>/ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create"
@ -617,9 +570,6 @@ urlpatterns = [
views.LedgerModelDeleteView.as_view(), views.LedgerModelDeleteView.as_view(),
name="ledger-delete", name="ledger-delete",
), ),
##############################################################
# Bank Account
##############################################################
path( path(
"<slug:dealer_slug>/bank_accounts/", "<slug:dealer_slug>/bank_accounts/",
views.BankAccountListView.as_view(), views.BankAccountListView.as_view(),
@ -645,7 +595,6 @@ urlpatterns = [
views.bank_account_delete, views.bank_account_delete,
name="bank_account_delete", name="bank_account_delete",
), ),
# Account
path( path(
"<slug:dealer_slug>/coa_accounts/", "<slug:dealer_slug>/coa_accounts/",
views.AccountListView.as_view(), views.AccountListView.as_view(),
@ -944,81 +893,81 @@ urlpatterns = [
# BALANCE SHEET Reports... # BALANCE SHEET Reports...
# Entities... # Entities...
path( path(
"entity/<slug:entity_slug>/balance-sheet/", "<slug:dealer_slug>/entity/<slug:entity_slug>/balance-sheet/",
views.BaseBalanceSheetRedirectView.as_view(), views.BaseBalanceSheetRedirectView.as_view(),
name="entity-bs", name="entity-bs",
), ),
path( path(
"entity/<slug:entity_slug>/balance-sheet/year/<int:year>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/balance-sheet/year/<int:year>/",
views.FiscalYearBalanceSheetViewBase.as_view(), views.FiscalYearBalanceSheetViewBase.as_view(),
name="entity-bs-year", name="entity-bs-year",
), ),
path( path(
"entity/<slug:entity_slug>/balance-sheet/quarter/<int:year>/<int:quarter>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/balance-sheet/quarter/<int:year>/<int:quarter>/",
views.QuarterlyBalanceSheetView.as_view(), views.QuarterlyBalanceSheetView.as_view(),
name="entity-bs-quarter", name="entity-bs-quarter",
), ),
path( path(
"entity/<slug:entity_slug>/balance-sheet/month/<int:year>/<int:month>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/balance-sheet/month/<int:year>/<int:month>/",
views.MonthlyBalanceSheetView.as_view(), views.MonthlyBalanceSheetView.as_view(),
name="entity-bs-month", name="entity-bs-month",
), ),
path( path(
"entity/<slug:entity_slug>/balance-sheet/date/<int:year>/<int:month>/<int:day>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/balance-sheet/date/<int:year>/<int:month>/<int:day>/",
views.DateBalanceSheetView.as_view(), views.DateBalanceSheetView.as_view(),
name="entity-bs-date", name="entity-bs-date",
), ),
# INCOME STATEMENT Reports ---- # INCOME STATEMENT Reports ----
# Entity ..... # Entity .....
path( path(
"entity/<slug:entity_slug>/income-statement/", "<slug:dealer_slug>/entity/<slug:entity_slug>/income-statement/",
views.BaseIncomeStatementRedirectViewBase.as_view(), views.BaseIncomeStatementRedirectViewBase.as_view(),
name="entity-ic", name="entity-ic",
), ),
path( path(
"entity/<slug:entity_slug>/income-statement/year/<int:year>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/income-statement/year/<int:year>/",
views.FiscalYearIncomeStatementViewBase.as_view(), views.FiscalYearIncomeStatementViewBase.as_view(),
name="entity-ic-year", name="entity-ic-year",
), ),
path( path(
"entity/<slug:entity_slug>/income-statement/quarter/<int:year>/<int:quarter>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/income-statement/quarter/<int:year>/<int:quarter>/",
views.QuarterlyIncomeStatementView.as_view(), views.QuarterlyIncomeStatementView.as_view(),
name="entity-ic-quarter", name="entity-ic-quarter",
), ),
path( path(
"entity/<slug:entity_slug>/income-statement/month/<int:year>/<int:month>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/income-statement/month/<int:year>/<int:month>/",
views.MonthlyIncomeStatementView.as_view(), views.MonthlyIncomeStatementView.as_view(),
name="entity-ic-month", name="entity-ic-month",
), ),
path( path(
"entity/<slug:entity_slug>/income-statement/date/<int:year>/<int:month>/<int:day>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/income-statement/date/<int:year>/<int:month>/<int:day>/",
views.MonthlyIncomeStatementView.as_view(), views.MonthlyIncomeStatementView.as_view(),
name="entity-ic-date", name="entity-ic-date",
), ),
# CASH FLOW STATEMENTS... # CASH FLOW STATEMENTS...
# Entities... # Entities...
path( path(
"entity/<slug:entity_slug>/cash-flow-statement/", "<slug:dealer_slug>/entity/<slug:entity_slug>/cash-flow-statement/",
views.BaseCashFlowStatementRedirectViewBase.as_view(), views.BaseCashFlowStatementRedirectViewBase.as_view(),
name="entity-cf", name="entity-cf",
), ),
path( path(
"entity/<slug:entity_slug>/cash-flow-statement/year/<int:year>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/cash-flow-statement/year/<int:year>/",
views.FiscalYearCashFlowStatementViewBase.as_view(), views.FiscalYearCashFlowStatementViewBase.as_view(),
name="entity-cf-year", name="entity-cf-year",
), ),
path( path(
"entity/<slug:entity_slug>/cash-flow-statement/quarter/<int:year>/<int:quarter>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/cash-flow-statement/quarter/<int:year>/<int:quarter>/",
views.QuarterlyCashFlowStatementView.as_view(), views.QuarterlyCashFlowStatementView.as_view(),
name="entity-cf-quarter", name="entity-cf-quarter",
), ),
path( path(
"entity/<slug:entity_slug>/cash-flow-statement/month/<int:year>/<int:month>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/cash-flow-statement/month/<int:year>/<int:month>/",
views.MonthlyCashFlowStatementView.as_view(), views.MonthlyCashFlowStatementView.as_view(),
name="entity-cf-month", name="entity-cf-month",
), ),
path( path(
"entity/<slug:entity_slug>/cash-flow-statement/date/<int:year>/<int:month>/<int:day>/", "<slug:dealer_slug>/entity/<slug:entity_slug>/cash-flow-statement/date/<int:year>/<int:month>/<int:day>/",
views.DateCashFlowStatementView.as_view(), views.DateCashFlowStatementView.as_view(),
name="entity-cf-date", name="entity-cf-date",
), ),
@ -1086,17 +1035,17 @@ urlpatterns = [
######### #########
# Purchase Order # Purchase Order
path( path(
"<slug:dealer_slug>/purchase_orders/", "<slug:dealer_slug>/<slug:entity_slug>/purchase_orders/",
views.PurchaseOrderListView.as_view(), views.PurchaseOrderListView.as_view(),
name="purchase_order_list", name="purchase_order_list",
), ),
path( path(
"<slug:dealer_slug>/purchase_orders/new/", "<slug:dealer_slug>/purchase_orders/<slug:entity_slug>/new/",
views.PurchaseOrderCreateView, views.PurchaseOrderCreateView,
name="purchase_order_create", name="purchase_order_create",
), ),
path( path(
"<slug:dealer_slug>/purchase_orders/<uuid:pk>/detail/", "<slug:dealer_slug>/purchase_orders/<slug:entity_slug>/<uuid:pk>/detail/",
views.PurchaseOrderDetailView.as_view(), views.PurchaseOrderDetailView.as_view(),
name="purchase_order_detail", name="purchase_order_detail",
), ),

View File

@ -1005,6 +1005,7 @@ class CarFinanceCalculator:
car_finance = self._get_nested_value(item, self.CAR_FINANCE_KEY) car_finance = self._get_nested_value(item, self.CAR_FINANCE_KEY)
car_info = self._get_nested_value(item, self.CAR_INFO_KEY) car_info = self._get_nested_value(item, self.CAR_INFO_KEY)
unit_price = Decimal(car_finance.get("selling_price", 0)) unit_price = Decimal(car_finance.get("selling_price", 0))
print(item.item_model.car.finances)
return { return {
"item_number": item.item_model.item_number, "item_number": item.item_model.item_number,
"vin": car_info.get("vin"), "vin": car_info.get("vin"),

File diff suppressed because it is too large Load Diff

357
pyproject.toml Normal file
View File

@ -0,0 +1,357 @@
[project]
name = "car-inventory"
version = "0.1.0"
description = "Add your description here"
requires-python = ">=3.12"
dependencies = [
"aiohappyeyeballs>=2.6.1",
"aiohttp>=3.12.13",
"aiohttp-retry>=2.9.1",
"aiosignal>=1.3.2",
"alabaster>=1.0.0",
"albucore>=0.0.24",
"albumentations>=2.0.8",
"annotated-types>=0.7.0",
"anthropic>=0.55.0",
"anyio>=4.9.0",
"arabic-reshaper>=3.0.0",
"argcomplete>=3.6.2",
"arrow>=1.3.0",
"asgiref>=3.8.1",
"astor>=0.8.1",
"astroid>=3.3.10",
"attrs>=25.3.0",
"autopep8>=2.3.2",
"babel>=2.17.0",
"beautifulsoup4>=4.13.4",
"bleach>=6.2.0",
"blessed>=1.21.0",
"blinker>=1.9.0",
"boto3>=1.38.44",
"botocore>=1.38.44",
"brotli>=1.1.0",
"cachetools>=5.5.2",
"cattrs>=25.1.1",
"certifi>=2025.6.15",
"cffi>=1.17.1",
"chardet>=5.2.0",
"charset-normalizer>=3.4.2",
"click>=7.1.2",
"cohere>=5.15.0",
"colorama>=0.4.6",
"commonmark>=0.9.1",
"contourpy>=1.3.2",
"crispy-bootstrap5>=2025.6",
"cryptography>=45.0.4",
"cssselect2>=0.8.0",
"ctranslate2>=4.6.0",
"cycler>=0.12.1",
"cython>=3.1.2",
"dataclasses-json>=0.6.7",
"decorator>=5.2.1",
"defusedxml>=0.7.1",
"desert>=2020.11.18",
"diff-match-patch>=20241021",
"dill>=0.4.0",
"distro>=1.9.0",
"dj-rest-auth>=7.0.1",
"django>=5.2.3",
"django-allauth>=65.9.0",
"django-appointment>=3.6.0",
"django-autoslug>=1.9.9",
"django-background-tasks>=1.2.8",
"django-bootstrap5>=25.1",
"django-ckeditor>=6.7.3",
"django-classy-tags>=4.1.0",
"django-cors-headers>=4.7.0",
"django-countries>=7.6.1",
"django-crispy-forms>=2.4",
"django-debug-toolbar>=5.2.0",
"django-easy-audit>=1.3.7",
"django-extensions>=4.1",
"django-filter>=25.1",
"django-formtools>=2.5.1",
"django-import-export>=4.3.8",
"django-js-asset>=3.1.2",
"django-ledger==0.7.8",
"django-model-utils>=5.0.0",
"django-money>=3.5.4",
"django-next-url-mixin>=0.4.0",
"django-nine>=0.2.7",
"django-nonefield>=0.4",
"django-ordered-model>=3.7.4",
"django-pdf-actions>=0.1.52",
"django-phonenumber-field>=8.1.0",
"django-picklefield>=3.3",
"django-plans>=2.0.0",
"django-prometheus>=2.4.1",
"django-q2>=1.8.0",
"django-schema-graph>=3.1.0",
"django-sekizai>=4.1.0",
"django-sequences>=3.0",
"django-silk>=5.4.0",
"django-simple-history>=3.10.1",
"django-sms>=0.7.0",
"django-sslserver-v2>=1.0",
"django-tables2>=2.7.5",
"django-treebeard>=4.7.1",
"django-view-breadcrumbs>=2.5.1",
"django-widget-tweaks>=1.5.0",
"djangocms-admin-style>=3.3.1",
"djangorestframework>=3.16.0",
"djangorestframework-simplejwt>=5.5.0",
"djangoviz>=0.1.1",
"djhtml>=3.0.8",
"docopt>=0.6.2",
"docutils>=0.21.2",
"easy-thumbnails>=2.10",
"emoji>=2.14.1",
"et-xmlfile>=2.0.0",
"eval-type-backport>=0.2.2",
"executing>=2.2.0",
"faker>=37.4.0",
"fasta2a>=0.3.4",
"fastavro>=1.11.1",
"filelock>=3.18.0",
"fire>=0.7.0",
"fonttools>=4.58.4",
"fpdf>=1.7.2",
"fpdf2>=2.8.3",
"frozenlist>=1.7.0",
"fsspec>=2025.5.1",
"google-auth>=2.40.3",
"google-genai>=1.22.0",
"googleapis-common-protos>=1.70.0",
"gprof2dot>=2025.4.14",
"graphqlclient>=0.2.4",
"greenlet>=3.2.3",
"griffe>=1.7.3",
"groq>=0.29.0",
"h11>=0.16.0",
"h2>=4.2.0",
"hf-xet>=1.1.5",
"hpack>=4.1.0",
"hstspreload>=2025.1.1",
"httpcore>=1.0.9",
"httpx>=0.28.1",
"httpx-sse>=0.4.0",
"huggingface-hub>=0.33.1",
"hyperframe>=6.1.0",
"icalendar>=6.3.1",
"idna>=3.10",
"imageio>=2.37.0",
"imagesize>=1.4.1",
"imgaug>=0.4.0",
"importlib-metadata>=8.7.0",
"iso4217>=1.14.20250512",
"isodate>=0.7.2",
"isort>=6.0.1",
"itsdangerous>=2.2.0",
"jinja2>=3.1.6",
"jiter>=0.10.0",
"jmespath>=1.0.1",
"joblib>=1.5.1",
"jsonpatch>=1.33",
"jsonpointer>=3.0.0",
"jwt>=1.4.0",
"kiwisolver>=1.4.8",
"langchain>=0.3.26",
"langchain-community>=0.3.26",
"langchain-core>=0.3.66",
"langchain-ollama>=0.3.3",
"langchain-text-splitters>=0.3.8",
"langsmith>=0.4.2",
"lazy-loader>=0.4",
"ledger>=1.0.1",
"libretranslatepy>=2.1.4",
"lmdb>=1.6.2",
"logfire>=3.21.1",
"logfire-api>=3.21.1",
"luhnchecker>=0.0.12",
"lxml>=5.4.0",
"markdown>=3.8.2",
"markdown-it-py>=3.0.0",
"markupsafe>=3.0.2",
"marshmallow>=3.26.1",
"matplotlib>=3.10.3",
"mccabe>=0.7.0",
"mcp>=1.9.4",
"mdurl>=0.1.2",
"mistralai>=1.8.2",
"mouseinfo>=0.1.3",
"mpmath>=1.3.0",
"multidict>=6.5.1",
"mypy-extensions>=1.1.0",
"networkx>=3.5",
"newrelic>=10.14.0",
"nltk>=3.9.1",
"num2words>=0.5.14",
"numpy>=2.3.1",
"oauthlib>=3.3.1",
"ofxtools>=0.9.5",
"ollama>=0.5.1",
"openai>=1.91.0",
"opencv-contrib-python>=4.11.0.86",
"opencv-python>=4.11.0.86",
"opencv-python-headless>=4.11.0.86",
"openpyxl>=3.1.5",
"opentelemetry-api>=1.34.1",
"opentelemetry-exporter-otlp-proto-common>=1.34.1",
"opentelemetry-exporter-otlp-proto-http>=1.34.1",
"opentelemetry-instrumentation>=0.55b1",
"opentelemetry-proto>=1.34.1",
"opentelemetry-sdk>=1.34.1",
"opentelemetry-semantic-conventions>=0.55b1",
"opt-einsum>=3.4.0",
"orjson>=3.10.18",
"outcome>=1.3.0.post0",
"packaging>=24.2",
"pandas>=2.3.0",
"pango>=0.0.1",
"pdfkit>=1.0.0",
"phonenumbers>=9.0.8",
"pillow>=11.2.1",
"platformdirs>=4.3.8",
"prometheus-client>=0.22.1",
"prompt-toolkit>=3.0.51",
"propcache>=0.3.2",
"protobuf>=5.29.5",
"psycopg>=3.2.9",
"psycopg-binary>=3.2.9",
"psycopg-c>=3.2.9",
"psycopg2-binary>=2.9.10",
"py-moneyed>=3.0",
"pyasn1>=0.6.1",
"pyasn1-modules>=0.4.2",
"pyautogui>=0.9.54",
"pyclipper>=1.3.0.post6",
"pycodestyle>=2.14.0",
"pycparser>=2.22",
"pydantic>=2.11.7",
"pydantic-ai>=0.3.4",
"pydantic-ai-slim>=0.3.4",
"pydantic-core>=2.33.2",
"pydantic-evals>=0.3.4",
"pydantic-graph>=0.3.4",
"pydantic-settings>=2.10.1",
"pydotplus>=2.0.2",
"pydyf>=0.11.0",
"pygetwindow>=0.0.9",
"pygments>=2.19.2",
"pyjwt>=2.9.0",
"pylint>=3.3.7",
"pymsgbox>=1.0.9",
"pymysql>=1.1.1",
"pyobjc-core>=11.1",
"pyobjc-framework-cocoa>=11.1",
"pyobjc-framework-quartz>=11.1",
"pyparsing>=3.2.3",
"pypdf>=5.6.1",
"pyperclip>=1.9.0",
"pyphen>=0.17.2",
"pypng>=0.20220715.0",
"pyrect>=0.2.0",
"pyscreeze>=1.0.1",
"pyserial>=3.5",
"pysocks>=1.7.1",
"python-bidi>=0.6.6",
"python-dateutil>=2.9.0.post0",
"python-docx>=1.2.0",
"python-dotenv>=1.1.1",
"python-multipart>=0.0.20",
"python-openid>=2.2.5",
"python-slugify>=8.0.4",
"python-stdnum>=2.1",
"python3-saml>=1.16.0",
"pytweening>=1.2.0",
"pytz>=2025.2",
"pyvin>=0.0.2",
"pywa>=2.11.0",
"pywhat>=1.0.0",
"pywhatkit>=5.4",
"pyyaml>=6.0.2",
"pyzbar>=0.1.9",
"qrcode>=8.2",
"rapidfuzz>=3.13.0",
"redis>=6.2.0",
"regex>=2024.11.6",
"reportlab>=4.4.2",
"requests>=2.32.4",
"requests-oauthlib>=2.0.0",
"requests-toolbelt>=1.0.0",
"rfc3986>=2.0.0",
"rich>=14.0.0",
"rsa>=4.9.1",
"rubicon-objc>=0.5.1",
"s3transfer>=0.13.0",
"sacremoses>=0.1.1",
"safetensors>=0.5.3",
"scikit-image>=0.25.2",
"scikit-learn>=1.7.0",
"scipy>=1.16.0",
"selenium>=4.32.0",
"sentence-transformers>=4.1.0",
"sentencepiece>=0.2.0",
"shapely>=2.1.1",
"simsimd>=6.4.9",
"six>=1.17.0",
"slugify>=0.0.1",
"sniffio>=1.3.1",
"snowballstemmer>=3.0.1",
"sortedcontainers>=2.4.0",
"soupsieve>=2.7",
"sqlalchemy>=2.0.41",
"sqlparse>=0.5.3",
"sse-starlette>=2.3.6",
"stanza>=1.10.1",
"starlette>=0.47.1",
"stringzilla>=3.12.5",
"suds>=1.2.0",
"swapper>=1.3.0",
"sympy>=1.14.0",
"tablib>=3.8.0",
"tenacity>=8.5.0",
"termcolor>=3.1.0",
"text-unidecode>=1.3",
"threadpoolctl>=3.6.0",
"tifffile>=2025.6.11",
"tinycss2>=1.4.0",
"tinyhtml5>=2.0.0",
"tokenizers>=0.21.2",
"tomli>=2.2.1",
"tomlkit>=0.13.3",
"torch>=2.7.1",
"tqdm>=4.67.1",
"transformers>=4.52.4",
"trio>=0.30.0",
"trio-websocket>=0.12.2",
"twilio>=9.6.3",
"types-python-dateutil>=2.9.0.20250516",
"types-requests>=2.32.4.20250611",
"typing-extensions>=4.14.0",
"typing-inspect>=0.9.0",
"typing-inspection>=0.4.1",
"tzdata>=2025.2",
"unidecode>=1.4.0",
"upgrade-requirements>=1.7.0",
"urllib3>=2.5.0",
"uvicorn>=0.34.3",
"vin>=0.6.2",
"vininfo>=1.9.1",
"vishap>=0.1.5",
"vpic-api>=0.7.4",
"wcwidth>=0.2.13",
"weasyprint>=65.1",
"webencodings>=0.5.1",
"websocket-client>=1.8.0",
"websockets>=15.0.1",
"werkzeug>=3.1.3",
"wikipedia>=1.4.0",
"wrapt>=1.17.2",
"wsproto>=1.2.0",
"xmlsec>=1.3.15",
"yarl>=1.20.1",
"zipp>=3.23.0",
"zopfli>=0.2.3.post1",
"zstandard>=0.23.0",
]

View File

@ -1,350 +1,350 @@
aiohappyeyeballs==2.6.1 aiohappyeyeballs
aiohttp==3.12.0 aiohttp
aiohttp-retry==2.9.1 aiohttp-retry
aiosignal==1.3.2 aiosignal
alabaster==1.0.0 alabaster
albucore==0.0.24 albucore
albumentations==2.0.7 albumentations
annotated-types==0.7.0 annotated-types
anthropic==0.52.2 anthropic
anyio==4.9.0 anyio
arabic-reshaper==3.0.0 arabic-reshaper
argcomplete==3.6.2 argcomplete
arrow==1.3.0 arrow
asgiref==3.8.1 asgiref
astor==0.8.1 astor
astroid==3.3.10 astroid
attrs==25.3.0 attrs
autopep8==2.3.2 autopep8
Babel==2.15.0 Babel
beautifulsoup4==4.13.4 beautifulsoup4
bleach==6.2.0 bleach
blessed==1.21.0 blessed
blinker==1.9.0 blinker
boto3==1.38.29 boto3
botocore==1.38.29 botocore
Brotli==1.1.0 Brotli
cachetools==5.5.2 cachetools
cattrs==24.1.3 cattrs
certifi==2025.4.26 certifi
cffi==1.17.1 cffi
chardet==5.2.0 chardet
charset-normalizer==3.4.2 charset-normalizer
click==8.2.1 click
cohere==5.15.0 cohere
colorama==0.4.6 colorama
commonmark==0.9.1 commonmark
contourpy==1.3.2 contourpy
crispy-bootstrap5==2025.4 crispy-bootstrap5
cryptography==45.0.3 cryptography
cssselect2==0.8.0 cssselect2
ctranslate2==4.6.0 ctranslate2
cycler==0.12.1 cycler
Cython==3.1.1 Cython
dataclasses-json==0.6.7 dataclasses-json
decorator==5.2.1 decorator
defusedxml==0.7.1 defusedxml
desert==2020.11.18 desert
diff-match-patch==20241021 diff-match-patch
dill==0.4.0 dill
distro==1.9.0 distro
dj-rest-auth==7.0.1 dj-rest-auth
Django==5.2.1 Django
django-allauth==65.8.1 django-allauth
django-appointment==3.8.0 django-appointment
django-autoslug==1.9.9 django-autoslug
django-background-tasks==1.2.8 django-background-tasks
django-bootstrap5==25.1 django-bootstrap5
django-ckeditor==6.7.2 django-ckeditor
django-classy-tags==4.1.0 django-classy-tags
django-cors-headers==4.7.0 django-cors-headers
django-countries==7.6.1 django-countries
django-crispy-forms==2.4 django-crispy-forms
django-debug-toolbar==5.2.0 django-debug-toolbar
django-easy-audit==1.3.7 django-easy-audit
django-extensions==4.1 django-extensions
django-filter==25.1 django-filter
django-formtools==2.5.1 django-formtools
django-import-export==4.3.7 django-import-export
django-js-asset==3.1.2 django-js-asset
django-ledger==0.7.7 django-ledger
django-model-utils==5.0.0 django-model-utils
django-money==3.5.4 django-money
django-next-url-mixin==0.4.0 django-next-url-mixin
django-nine==0.2.7 django-nine
django-nonefield==0.4 django-nonefield
django-ordered-model==3.7.4 django-ordered-model
django-pdf-actions==0.1.49 django-pdf-actions
django-phonenumber-field==8.0.0 django-phonenumber-field
django-picklefield==3.3 django-picklefield
django-plans==2.0.0 django-plans
django-prometheus==2.3.1 django-prometheus
django-q2==1.8.0 django-q2
django-schema-graph==3.1.0 django-schema-graph
django-sekizai==4.1.0 django-sekizai
django-sequences==3.0 django-sequences
django-silk==5.3.2 django-silk
django-simple-history==3.8.0 django-simple-history
django-sms==0.7.0 django-sms
django-sslserver==0.22 django-sslserver
django-tables2==2.7.5 django-tables2
django-treebeard==4.7.1 django-treebeard
django-view-breadcrumbs==2.5.1 django-view-breadcrumbs
django-widget-tweaks==1.5.0 django-widget-tweaks
djangocms-admin-style==3.3.1 djangocms-admin-style
djangorestframework==3.16.0 djangorestframework
djangorestframework_simplejwt==5.5.0 djangorestframework_simplejwt
djangoviz==0.1.1 djangoviz
djhtml==3.0.8 djhtml
docopt==0.6.2 docopt
docutils==0.21.2 docutils
easy-thumbnails==2.10 easy-thumbnails
emoji==2.14.1 emoji
et_xmlfile==2.0.0 et_xmlfile
eval_type_backport==0.2.2 eval_type_backport
executing==2.2.0 executing
Faker==37.3.0 Faker
fasta2a==0.2.14 fasta2a
fastavro==1.11.1 fastavro
filelock==3.18.0 filelock
fire==0.7.0 fire
fonttools==4.58.0 fonttools
fpdf==1.7.2 fpdf
fpdf2==2.8.3 fpdf2
frozenlist==1.6.0 frozenlist
fsspec==2025.5.1 fsspec
google-auth==2.40.2 google-auth
google-genai==1.18.0 google-genai
googleapis-common-protos==1.70.0 googleapis-common-protos
gprof2dot==2025.4.14 gprof2dot
graphqlclient==0.2.4 graphqlclient
greenlet==3.2.2 greenlet
griffe==1.7.3 griffe
groq==0.26.0 groq
h11==0.16.0 h11
h2==4.2.0 h2
hf-xet==1.1.3 hf-xet
hpack==4.1.0 hpack
hstspreload==2025.1.1 hstspreload
httpcore==1.0.9 httpcore
httpx==0.28.1 httpx
httpx-sse==0.4.0 httpx-sse
huggingface-hub==0.32.4 huggingface-hub
hyperframe==6.1.0 hyperframe
icalendar==6.3.1 icalendar
idna==3.10 idna
imageio==2.37.0 imageio
imagesize==1.4.1 imagesize
imgaug==0.4.0 imgaug
importlib_metadata==8.7.0 importlib_metadata
iso4217==1.12.20240625 iso4217
isodate==0.7.2 isodate
isort==6.0.1 isort
itsdangerous==2.2.0 itsdangerous
Jinja2==3.1.6 Jinja2
jiter==0.10.0 jiter
jmespath==1.0.1 jmespath
joblib==1.5.1 joblib
jsonpatch==1.33 jsonpatch
jsonpointer==3.0.0 jsonpointer
jwt==1.3.1 jwt
kiwisolver==1.4.8 kiwisolver
langchain==0.3.25 langchain
langchain-community==0.3.24 langchain-community
langchain-core==0.3.61 langchain-core
langchain-ollama==0.3.3 langchain-ollama
langchain-text-splitters==0.3.8 langchain-text-splitters
langsmith==0.3.42 langsmith
lazy_loader==0.4 lazy_loader
ledger==1.0.1 ledger
libretranslatepy==2.1.4 libretranslatepy
lmdb==1.6.2 lmdb
logfire==3.18.0 logfire
logfire-api==3.17.0 logfire-api
luhnchecker==0.0.12 luhnchecker
lxml==5.4.0 lxml
Markdown==3.8 Markdown
markdown-it-py==3.0.0 markdown-it-py
MarkupSafe==3.0.2 MarkupSafe
marshmallow==3.26.1 marshmallow
matplotlib==3.10.3 matplotlib
mccabe==0.7.0 mccabe
mcp==1.9.2 mcp
mdurl==0.1.2 mdurl
mistralai==1.8.1 mistralai
MouseInfo==0.1.3 MouseInfo
mpmath==1.3.0 mpmath
multidict==6.4.4 multidict
mypy_extensions==1.1.0 mypy_extensions
networkx==3.4.2 networkx
newrelic==10.12.0 newrelic
nltk==3.9.1 nltk
num2words==0.5.14 num2words
numpy==2.2.6 numpy
oauthlib==3.2.2 oauthlib
ofxtools==0.9.5 ofxtools
ollama==0.4.8 ollama
openai==1.82.0 openai
opencv-contrib-python==4.11.0.86 opencv-contrib-python
opencv-python==4.11.0.86 opencv-python
opencv-python-headless==4.11.0.86 opencv-python-headless
openpyxl==3.1.5 openpyxl
opentelemetry-api==1.34.0 opentelemetry-api
opentelemetry-exporter-otlp-proto-common==1.34.0 opentelemetry-exporter-otlp-proto-common
opentelemetry-exporter-otlp-proto-http==1.34.0 opentelemetry-exporter-otlp-proto-http
opentelemetry-instrumentation==0.55b0 opentelemetry-instrumentation
opentelemetry-proto==1.34.0 opentelemetry-proto
opentelemetry-sdk==1.34.0 opentelemetry-sdk
opentelemetry-semantic-conventions==0.55b0 opentelemetry-semantic-conventions
opt_einsum==3.4.0 opt_einsum
orjson==3.10.18 orjson
outcome==1.3.0.post0 outcome
packaging==24.2 packaging
pandas==2.2.3 pandas
pango==0.0.1 pango
pdfkit==1.0.0 pdfkit
phonenumbers==8.13.42 phonenumbers
pillow==10.4.0 pillow
platformdirs==4.3.8 platformdirs
prometheus_client==0.22.0 prometheus_client
prompt_toolkit==3.0.51 prompt_toolkit
propcache==0.3.1 propcache
protobuf==5.29.5 protobuf
psycopg==3.2.9 psycopg
psycopg-binary==3.2.9 psycopg-binary
psycopg-c==3.2.9 psycopg-c
psycopg2-binary==2.9.10 psycopg2-binary
py-moneyed==3.0 py-moneyed
pyasn1==0.6.1 pyasn1
pyasn1_modules==0.4.2 pyasn1_modules
PyAutoGUI==0.9.54 PyAutoGUI
pyclipper==1.3.0.post6 pyclipper
pycodestyle==2.13.0 pycodestyle
pycparser==2.22 pycparser
pydantic==2.11.5 pydantic
pydantic-ai==0.2.14 pydantic-ai
pydantic-ai-slim==0.2.14 pydantic-ai-slim
pydantic-evals==0.2.14 pydantic-evals
pydantic-graph==0.2.14 pydantic-graph
pydantic-settings==2.9.1 pydantic-settings
pydantic_core==2.33.2 pydantic_core
pydotplus==2.0.2 pydotplus
pydyf==0.11.0 pydyf
PyGetWindow==0.0.9 PyGetWindow
Pygments==2.19.1 Pygments
PyJWT==2.10.1 PyJWT
pylint==3.3.7 pylint
PyMsgBox==1.0.9 PyMsgBox
PyMySQL==1.1.1 PyMySQL
pyobjc-core==11.0 pyobjc-core
pyobjc-framework-Cocoa==11.0 pyobjc-framework-Cocoa
pyobjc-framework-Quartz==11.0 pyobjc-framework-Quartz
pyparsing==3.2.3 pyparsing
pypdf==5.5.0 pypdf
pyperclip==1.9.0 pyperclip
pyphen==0.17.2 pyphen
pypng==0.20220715.0 pypng
PyRect==0.2.0 PyRect
PyScreeze==1.0.1 PyScreeze
pyserial==3.5 pyserial
PySocks==1.7.1 PySocks
python-bidi==0.6.6 python-bidi
python-dateutil==2.9.0.post0 python-dateutil
python-docx==1.1.2 python-docx
python-dotenv==1.1.0 python-dotenv
python-multipart==0.0.20 python-multipart
python-openid==2.2.5 python-openid
python-slugify==8.0.4 python-slugify
python-stdnum==2.1 python-stdnum
python3-saml==1.16.0 python3-saml
pytweening==1.2.0 pytweening
pytz==2025.2 pytz
pyvin==0.0.2 pyvin
pywa==2.10.0 pywa
pywhat==5.1.0 pywhat
pywhatkit==5.4 pywhatkit
PyYAML==6.0.2 PyYAML
pyzbar==0.1.9 pyzbar
qrcode==8.2 qrcode
RapidFuzz==3.13.0 RapidFuzz
redis==6.1.0 redis
regex==2024.11.6 regex
reportlab==4.4.1 reportlab
requests==2.32.3 requests
requests-oauthlib==2.0.0 requests-oauthlib
requests-toolbelt==1.0.0 requests-toolbelt
rfc3986==2.0.0 rfc3986
rich==14.0.0 rich
rsa==4.9.1 rsa
rubicon-objc==0.5.0 rubicon-objc
s3transfer==0.13.0 s3transfer
sacremoses==0.1.1 sacremoses
safetensors==0.5.3 safetensors
scikit-image==0.25.2 scikit-image
scikit-learn==1.6.1 scikit-learn
scipy==1.15.3 scipy
selenium==4.33.0 selenium
sentence-transformers==4.1.0 sentence-transformers
sentencepiece==0.2.0 sentencepiece
shapely==2.1.1 shapely
simsimd==6.2.1 simsimd
six==1.17.0 six
slugify==0.0.1 slugify
sniffio==1.3.1 sniffio
snowballstemmer==3.0.1 snowballstemmer
sortedcontainers==2.4.0 sortedcontainers
soupsieve==2.7 soupsieve
SQLAlchemy==2.0.41 SQLAlchemy
sqlparse==0.5.3 sqlparse
sse-starlette==2.3.6 sse-starlette
stanza==1.10.1 stanza
starlette==0.47.0 starlette
stringzilla==3.12.5 stringzilla
suds==1.2.0 suds
swapper==1.3.0 swapper
sympy==1.14.0 sympy
tablib==3.8.0 tablib
tenacity==9.1.2 tenacity
termcolor==3.1.0 termcolor
text-unidecode==1.3 text-unidecode
threadpoolctl==3.6.0 threadpoolctl
tifffile==2025.5.24 tifffile
tinycss2==1.4.0 tinycss2
tinyhtml5==2.0.0 tinyhtml5
tokenizers==0.21.1 tokenizers
tomli==2.2.1 tomli
tomlkit==0.13.2 tomlkit
torch==2.7.0 torch
tqdm==4.67.1 tqdm
transformers==4.52.4 transformers
trio==0.30.0 trio
trio-websocket==0.12.2 trio-websocket
twilio==9.6.1 twilio
types-python-dateutil==2.9.0.20250516 types-python-dateutil
types-requests==2.32.0.20250602 types-requests
typing-inspect==0.9.0 typing-inspect
typing-inspection==0.4.1 typing-inspection
typing_extensions==4.13.2 typing_extensions
tzdata==2025.2 tzdata
Unidecode==1.4.0 Unidecode
upgrade-requirements==1.7.0 upgrade-requirements
urllib3==2.4.0 urllib3
uvicorn==0.34.3 uvicorn
vin==0.6.2 vin
vininfo==1.8.0 vininfo
vishap==0.1.5 vishap
vpic-api==0.7.4 vpic-api
wcwidth==0.2.13 wcwidth
weasyprint==65.1 weasyprint
webencodings==0.5.1 webencodings
websocket-client==1.8.0 websocket-client
websockets==15.0.1 websockets
Werkzeug==3.1.3 Werkzeug
wikipedia==1.4.0 wikipedia
wrapt==1.17.2 wrapt
wsproto==1.2.0 wsproto
xmlsec==1.3.15 xmlsec
yarl==1.20.0 yarl
zipp==3.22.0 zipp
zopfli==0.2.3.post1 zopfli
zstandard==0.23.0 zstandard

BIN
static/.DS_Store vendored

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -108,3 +108,4 @@ html[dir="rtl"] .form-icon-container .form-control {
padding-right: 35px; padding-right: 35px;
padding-left: 10px; padding-left: 10px;
} }

View File

@ -0,0 +1,125 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M2655 2513 c-225 -28 -366 -68 -545 -158 -69 -34 -131 -60 -138 -58
-7 3 -30 -11 -51 -30 -86 -77 -166 -107 -346 -127 -290 -31 -427 -92 -557
-247 -98 -118 -99 -118 -92 -194 5 -50 3 -73 -10 -97 -34 -65 -10 -95 92 -113
84 -16 91 -24 30 -38 -67 -15 -83 -24 -74 -46 6 -17 8 -17 26 0 11 10 41 23
67 30 48 12 84 8 208 -27 l40 -11 -70 -13 c-38 -7 -94 -16 -123 -20 -29 -4
-55 -10 -57 -14 -3 -5 26 -17 63 -29 303 -92 725 -112 1187 -56 148 18 204 34
269 78 44 30 88 44 321 100 380 92 698 156 838 167 173 14 257 41 257 80 0 11
-6 20 -13 20 -11 0 -10 10 3 51 14 40 25 55 48 64 69 29 88 184 37 310 -70
178 -83 191 -212 206 -61 7 -111 21 -163 44 -140 62 -316 106 -500 125 -89 9
-469 11 -535 3z m585 -27 c185 -25 335 -68 456 -129 l47 -24 -38 -7 c-22 -4
-51 -14 -65 -21 -14 -7 -117 -38 -230 -70 -502 -140 -543 -152 -537 -168 2 -7
30 -23 63 -36 l59 -23 105 22 c58 12 138 30 178 41 40 11 81 19 90 17 9 -2
-28 -14 -83 -27 -55 -12 -181 -43 -280 -68 -99 -25 -191 -46 -205 -47 -14 -1
-27 -3 -30 -6 -3 -3 -33 -17 -68 -32 l-63 -27 -47 49 c-87 90 -157 88 -288 -6
l-77 -55 35 47 c71 96 193 143 286 111 50 -18 53 -14 10 13 -22 13 -51 20 -84
20 -100 0 -180 -45 -306 -171 -72 -73 -82 -79 -160 -104 -86 -27 -286 -65
-343 -65 -19 0 -36 -4 -39 -9 -10 -16 243 13 383 45 35 8 66 13 68 10 9 -8
-65 -45 -132 -66 -93 -29 -114 -40 -121 -62 -4 -14 -9 -16 -24 -8 -11 6 -114
10 -247 10 -245 0 -394 15 -503 49 -110 34 -131 61 -89 111 19 22 22 23 30 7
13 -22 29 -22 29 1 0 9 20 38 43 63 23 26 59 67 80 93 47 57 112 91 231 121
89 22 226 42 226 32 0 -2 -47 -21 -105 -42 -98 -35 -287 -124 -310 -147 -5 -5
46 18 115 51 120 57 322 138 412 164 33 10 105 11 318 4 151 -4 325 -5 387 -2
l112 7 53 64 c29 35 86 91 127 126 70 59 72 62 50 71 -13 5 -121 10 -241 11
l-216 1 61 17 c97 28 247 40 394 32 73 -4 130 -10 127 -15 -2 -5 12 -1 32 7
85 35 168 40 324 20z m706 -184 c35 -20 -8 -22 -96 -5 -51 9 -84 20 -75 23 22
8 149 -6 171 -18z m-64 -24 c35 -10 143 -93 159 -122 4 -6 1 -32 -6 -58 -6
-26 -8 -53 -4 -60 5 -8 10 -3 14 15 9 36 21 34 29 -4 14 -71 -7 -154 -46 -187
-14 -11 -16 -5 -16 62 -1 82 -15 121 -65 173 -89 94 -184 16 -237 -194 -6 -24
-15 -43 -20 -43 -5 0 -7 -8 -3 -17 6 -17 5 -17 -14 0 -12 10 -48 29 -80 43
-32 13 -49 24 -37 24 11 0 43 -11 70 -25 27 -14 50 -25 51 -25 1 0 6 22 12 49
25 117 99 229 167 251 41 14 69 6 108 -29 l30 -26 -15 25 c-9 14 -31 33 -50
42 -50 25 -94 10 -171 -60 l-64 -58 -104 -18 c-136 -23 -598 -120 -717 -150
-63 -16 -93 -20 -94 -12 0 7 -2 7 -6 -1 -2 -7 -23 -18 -45 -23 -38 -11 -40
-13 -34 -43 4 -18 9 -71 13 -119 3 -49 7 -88 9 -88 2 0 21 6 41 14 21 8 92 29
158 46 112 29 259 75 433 135 83 28 104 30 147 11 l30 -13 -70 -20 c-38 -12
-164 -49 -280 -83 -281 -82 -476 -150 -468 -163 4 -6 0 -8 -10 -4 -9 3 -18 1
-20 -6 -12 -33 -15 7 -6 78 11 82 7 146 -14 222 -6 23 -8 45 -5 48 23 23 359
112 698 185 289 62 363 88 434 151 67 58 20 74 -128 43 -84 -17 -115 -15 -76
6 70 37 224 52 302 28z m-2027 -98 c-3 -5 -14 -10 -23 -10 -15 0 -15 2 -2 10
20 13 33 13 25 0z m393 -17 c-15 -2 -42 -2 -60 0 -18 2 -6 4 27 4 33 0 48 -2
33 -4z m1440 -148 c-6 -14 -19 -25 -30 -25 -25 0 -23 14 5 33 32 23 38 21 25
-8z m228 -7 l19 -21 -28 18 c-15 10 -38 15 -52 13 -13 -3 -22 -1 -19 3 10 17
61 9 80 -13z m-59 -50 c-2 -13 -4 -5 -4 17 -1 22 1 32 4 23 2 -10 2 -28 0 -40z
m-2707 39 c0 -2 -15 -16 -32 -33 l-33 -29 29 33 c28 30 36 37 36 29z m2801
-56 c6 -21 10 -71 8 -112 -4 -62 -9 -81 -34 -119 -44 -65 -96 -68 -134 -6 -24
39 -27 52 -7 34 8 -7 13 -17 13 -21 -1 -5 11 -18 26 -30 26 -20 30 -20 54 -7
15 9 36 30 46 48 l19 32 -43 41 -44 41 41 -31 c23 -17 45 -31 48 -31 8 0 1
164 -8 179 -5 8 -19 -3 -42 -34 -19 -25 -37 -45 -41 -45 -4 0 16 31 60 88 16
20 26 14 38 -27z m-136 -2 c9 -17 14 -33 11 -36 -3 -3 -10 7 -16 22 -6 15 -13
32 -16 36 -3 5 -3 9 0 9 3 0 13 -14 21 -31z m-11 -51 c6 -4 18 -5 26 -2 11 4
12 2 4 -6 -20 -20 -54 6 -53 38 2 27 2 27 6 2 3 -14 10 -28 17 -32z m-1549
-69 c-44 -83 -62 -157 -70 -289 -3 -57 -7 -106 -9 -108 -13 -13 -165 -22 -371
-22 -216 0 -243 2 -270 19 -35 21 -151 149 -143 157 14 13 65 -14 131 -68 l72
-60 115 5 c103 5 171 17 193 36 4 4 -8 27 -25 52 l-33 44 37 -31 c20 -18 50
-40 67 -50 39 -23 39 -29 1 -43 -16 -5 -30 -12 -30 -15 0 -8 94 5 104 15 5 4
-18 45 -54 94 -34 48 -58 90 -54 95 5 4 44 22 87 40 44 18 86 43 97 58 19 23
72 62 85 62 3 0 -2 -14 -10 -31 -21 -39 -55 -173 -55 -213 0 -52 17 -16 44 92
25 101 58 174 98 214 32 32 30 16 -7 -53z m263 47 c15 -8 36 -29 46 -48 l20
-33 -35 37 c-36 38 -70 52 -110 46 -26 -3 -26 -3 -14 -123 9 -98 -6 -74 -20
31 -10 75 -9 86 4 94 24 14 79 12 109 -4z m-288 -9 c0 -2 -10 -12 -22 -23
l-23 -19 19 23 c18 21 26 27 26 19z m1590 -64 c-11 -17 -11 -17 -6 0 3 10 6
24 7 30 0 9 2 9 5 0 3 -7 0 -20 -6 -30z m-1334 -49 c-29 -63 -46 -70 -20 -8 9
21 21 50 26 64 6 14 12 20 15 13 3 -7 -7 -38 -21 -69z m1251 44 c-3 -7 -5 -2
-5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m30 -20 c-3 -8 -6 -5 -6 6 -1 11 2 17
5 13 3 -3 4 -12 1 -19z m90 -45 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2
-26 0 -35z m-1260 15 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m-228 -42 c42 -44 21 -48 -28 -6 -26 22 -37 26 -43 17 -10 -15 -11 4 -2 27 8
20 27 10 73 -38z m239 -33 c-2 -57 -2 -57 -5 -10 -2 26 -7 47 -11 47 -4 0 -25
-12 -47 -25 -22 -14 -49 -25 -60 -25 -22 1 90 70 113 70 8 0 11 -17 10 -57z
m-321 -20 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m1333 27
c-8 -5 -24 -10 -35 -10 -17 0 -17 2 -5 10 8 5 24 10 35 10 17 0 17 -2 5 -10z
m-2646 -79 c5 -7 15 -10 24 -6 10 3 4 -7 -13 -25 l-29 -30 -20 20 c-20 19 -20
21 -3 49 9 16 17 37 18 48 1 10 4 4 8 -13 4 -17 11 -36 15 -43z m1484 35 c-2
-13 -10 -21 -23 -21 -23 0 -33 34 -14 45 20 13 40 -1 37 -24z m-1337 -36 c42
-19 95 -33 154 -41 109 -14 115 -15 115 -30 0 -8 -23 -10 -82 -5 -108 10 -160
21 -231 53 -46 21 -55 28 -46 39 15 19 17 18 90 -16z m1255 22 c-3 -5 -23 -17
-46 -27 -46 -21 -48 -32 -19 -95 l21 -45 33 65 c40 76 44 70 13 -19 l-22 -63
23 -19 c13 -10 18 -19 12 -19 -22 0 -87 76 -99 116 -20 68 -17 78 31 96 51 19
60 21 53 10z m165 -39 c27 -16 49 -31 49 -35 0 -14 -14 -8 -70 27 -65 41 -49
47 21 8z m56 -5 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-127
-24 c0 -3 -4 -3 -9 1 -5 3 -11 -29 -13 -74 l-3 -79 26 13 c35 18 52 41 43 57
-5 10 -4 10 6 1 11 -10 10 -16 -6 -34 -24 -26 -67 -49 -91 -48 -10 0 -13 3 -5
6 8 3 12 32 12 94 0 87 1 89 20 79 11 -6 20 -13 20 -16z m-1440 -13 c0 -10
-25 -21 -48 -21 -12 1 -10 5 8 15 29 17 40 18 40 6z m1295 -158 c76 -43 162
-24 228 50 20 22 25 25 17 10 -15 -33 -97 -92 -137 -99 -72 -14 -162 47 -198
133 -26 62 -16 57 18 -8 24 -47 43 -69 72 -86z m266 94 c-10 -9 -11 -8 -5 6 3
10 9 15 12 12 3 -3 0 -11 -7 -18z"/>
<path d="M3015 2457 c-114 -30 -189 -89 -276 -218 l-60 -89 61 0 c65 0 80 -13
28 -24 -18 -3 -136 -15 -263 -26 -388 -34 -717 -111 -929 -217 l-68 -34 -127
16 c-69 9 -157 23 -194 31 -72 17 -101 13 -45 -5 29 -9 266 -49 308 -52 28 -1
-124 -69 -156 -69 -42 0 -193 29 -216 41 -14 7 -18 6 -18 -5 0 -20 79 -43 195
-56 50 -5 97 -10 105 -10 9 0 45 21 80 47 117 85 385 180 674 239 190 38 229
43 439 46 178 3 198 5 194 20 -7 24 58 30 80 6 20 -22 36 -13 29 17 -7 27 0
30 79 41 28 3 68 14 90 24 22 10 87 28 145 40 155 32 324 79 359 101 45 27 39
46 -22 75 -134 61 -376 91 -492 61z m-37 -244 c-10 -2 -28 -2 -40 0 -13 2 -5
4 17 4 22 1 32 -1 23 -4z"/>
<path d="M2726 2328 c-45 -46 -100 -104 -122 -130 l-41 -48 46 0 c44 0 47 2
70 45 13 24 54 83 92 130 90 112 63 114 -45 3z"/>
<path d="M2697 2037 c-41 -13 -57 -23 -55 -34 4 -23 32 -37 54 -28 17 7 15 9
-11 15 -30 8 -30 8 7 9 20 0 43 4 51 7 10 3 17 -2 20 -13 3 -10 5 -1 6 19 0
20 -2 38 -6 41 -5 2 -34 -5 -66 -16z"/>
<path d="M2600 1982 c0 -5 11 -19 25 -32 28 -26 33 -16 9 18 -15 22 -34 30
-34 14z"/>
<path d="M1936 1934 c-100 -20 -197 -54 -190 -66 4 -7 2 -8 -5 -4 -11 7 -136
-62 -128 -71 3 -2 22 1 44 7 21 6 85 13 143 17 112 6 133 13 195 68 46 40 40
42 -70 19 -42 -9 -78 -14 -81 -11 -7 7 161 39 189 35 27 -3 25 -5 -40 -60
l-67 -58 -76 0 c-41 -1 -110 -7 -153 -15 -44 -7 -84 -12 -91 -9 -7 3 -23 -7
-36 -22 l-25 -27 110 7 c156 9 232 23 291 51 55 27 159 128 149 145 -8 13 -75
11 -159 -6z m-109 -50 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m55 -29 c3 -14 1 -25 -3 -25 -5 0 -9 11 -9 25 0 14 2 25 4 25 2 0 6 -11 8 -25z"/>
<path d="M1215 1829 c-12 -19 5 -23 22 -6 16 16 16 17 1 17 -9 0 -20 -5 -23
-11z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@ -0,0 +1,994 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M53 5046 l-53 -75 0 -296 0 -296 70 103 c102 151 96 145 118 125 25
-22 25 -22 46 18 23 42 29 43 44 10 15 -32 15 -35 0 -35 -23 -1 -53 -34 -97
-110 -25 -41 -71 -115 -103 -165 -49 -75 -58 -95 -54 -122 3 -22 1 -32 -7 -30
-7 1 -13 -10 -15 -24 -2 -19 4 -31 22 -43 33 -21 33 -50 0 -93 -20 -26 -24
-42 -22 -76 l3 -44 130 19 c161 23 230 42 254 71 49 58 298 397 266 362 -19
-22 -59 -70 -88 -107 -33 -44 -59 -68 -72 -68 -14 0 -16 -3 -8 -8 9 -6 -4 -30
-47 -88 -52 -67 -65 -79 -88 -77 -23 2 -24 1 -7 -6 19 -8 18 -10 -9 -20 -34
-14 -306 -55 -313 -47 -10 9 119 196 131 189 6 -3 8 -2 3 2 -13 15 66 117 253
330 130 148 520 555 597 624 l57 51 -100 0 -100 0 -105 -127 c-211 -256 -564
-715 -596 -776 l-15 -30 -21 22 -22 22 69 132 c138 265 217 382 408 601 57 65
109 127 117 137 13 19 6 19 -290 19 l-304 0 -52 -74z m51 -852 c19 -7 21 -30
4 -37 -7 -2 -21 0 -31 5 -15 7 -16 12 -6 24 13 16 12 16 33 8z"/>
<path d="M1680 5088 c-380 -266 -722 -564 -983 -857 l-74 -84 19 -34 c13 -21
19 -45 16 -67 -2 -19 0 -32 4 -30 21 13 3 -19 -42 -78 l-50 -65 -183 -6 c-100
-4 -225 -13 -277 -22 -52 -8 -98 -15 -102 -15 -11 0 -10 -50 1 -50 4 0 66 9
137 21 146 23 440 35 524 22 l55 -9 -33 -21 c-42 -26 -222 -85 -484 -158 -115
-32 -208 -63 -208 -68 0 -5 7 -6 16 -3 9 4 96 29 193 57 97 28 254 76 349 106
181 59 201 61 188 10 -3 -13 -24 -46 -48 -73 l-42 -49 43 40 c67 63 94 130 65
160 -16 15 -12 21 48 83 35 37 89 97 118 134 43 55 60 69 89 74 54 9 60 12 21
13 l-34 1 64 66 c215 219 568 454 1199 796 l244 133 -148 3 -147 3 -117 -62
c-64 -34 -126 -69 -138 -77 -13 -8 -23 -10 -23 -5 0 6 57 40 128 76 l127 66
-235 0 -235 0 -45 -31z m145 -177 c3 -5 2 -12 -3 -15 -5 -3 -9 1 -9 9 0 17 3
19 12 6z m-1114 -925 c-18 -25 -43 -69 -56 -98 -14 -29 -25 -47 -25 -40 0 6
-9 12 -20 12 -11 0 -20 3 -20 7 0 13 34 43 49 43 14 0 14 2 1 10 -13 9 -7 14
13 11 4 0 6 3 5 8 -4 11 72 104 79 97 3 -2 -9 -25 -26 -50z"/>
<path d="M3289 5107 c16 -21 63 -47 83 -47 7 1 -3 8 -22 16 -19 8 -43 23 -55
32 -19 16 -19 16 -6 -1z"/>
<path d="M4134 5103 c-29 -47 -345 -438 -453 -563 -123 -140 -228 -244 -266
-262 -16 -7 -39 3 -120 58 -169 113 -357 192 -552 231 -126 25 -407 25 -523
-1 -197 -42 -384 -118 -530 -213 -148 -97 -366 -286 -353 -306 3 -5 1 -7 -5
-3 -6 3 -13 2 -16 -3 -6 -9 -46 -3 -46 7 0 3 17 24 37 47 23 23 15 18 -17 -12
-61 -58 -103 -74 -54 -20 17 17 36 41 44 52 l15 20 -24 -20 c-13 -11 -44 -47
-69 -80 -25 -33 -35 -50 -21 -38 13 12 41 25 62 28 34 7 45 3 91 -29 65 -44
100 -88 83 -105 -6 -6 -36 -62 -67 -124 l-55 -112 -104 -55 c-135 -71 -200
-131 -247 -223 -19 -40 -32 -61 -28 -47 15 58 70 144 119 185 28 24 96 68 150
97 l100 53 57 115 c37 74 56 123 53 137 -3 12 -26 37 -52 54 l-47 32 -38 -44
c-98 -111 -202 -263 -278 -407 -30 -56 -103 -132 -116 -120 -8 9 25 98 71 190
46 93 134 234 193 308 l36 45 -35 -33 c-20 -18 -39 -29 -43 -25 -4 5 -6 3 -4
-2 3 -11 -210 -214 -355 -338 -111 -95 -235 -179 -249 -170 -7 3 -8 1 -4 -5 4
-7 2 -12 -3 -12 -20 0 -26 -3 -38 -19 -7 -9 -13 -12 -13 -7 0 6 -7 1 -16 -10
-8 -10 -13 -12 -9 -4 4 8 -1 6 -9 -4 -9 -11 -16 -16 -16 -11 0 5 -7 0 -15 -11
-8 -10 -15 -16 -15 -12 0 4 -12 -4 -26 -17 -31 -29 -210 -119 -272 -136 -42
-12 -43 -13 -40 -52 3 -40 3 -41 58 -52 84 -17 123 -41 198 -119 93 -98 193
-251 259 -397 30 -66 53 -123 51 -125 -2 -1 -15 -8 -28 -13 -23 -9 -22 -10 10
-8 l35 2 51 -152 c51 -154 84 -281 105 -408 19 -115 -3 -443 -35 -520 -13 -29
-26 -35 -282 -120 -148 -49 -274 -91 -280 -93 -6 -2 -14 17 -17 43 -6 44 -84
290 -111 350 -12 26 -14 -9 -15 -264 l-2 -294 67 -241 c37 -132 67 -261 67
-286 0 -31 3 -38 8 -25 4 11 8 18 8 15 1 -3 32 -82 70 -175 l69 -170 166 -3
c91 -1 166 -1 166 1 0 2 -21 39 -46 83 -43 74 -45 82 -40 134 4 44 -2 84 -35
206 -23 83 -44 157 -48 163 -5 7 -17 8 -39 2 -17 -5 -34 -6 -36 -2 -9 13 -54
206 -60 251 -4 33 0 26 12 -25 10 -38 20 -64 23 -58 2 7 57 28 121 47 65 19
122 37 127 40 9 6 0 63 -12 83 -4 6 -19 9 -34 7 -28 -4 -28 -4 2 6 24 8 32 7
41 -5 13 -17 69 -223 63 -228 -13 -11 -253 -87 -258 -82 -3 3 -15 32 -28 63
-12 31 -22 52 -22 45 -1 -15 37 -115 48 -126 4 -4 65 13 135 39 70 25 129 44
131 42 8 -9 76 -328 73 -344 -2 -12 -31 -30 -87 -54 -69 -29 -87 -41 -97 -65
-16 -39 -10 -65 39 -153 l41 -72 335 0 335 0 -30 32 c-17 18 -68 76 -113 128
-75 86 -72 83 40 -33 l124 -127 301 -3 302 -2 -171 178 c-93 98 -174 180 -178
183 -12 7 -11 2 6 -39 8 -20 15 -49 15 -64 l0 -27 -41 39 c-93 90 -252 270
-368 420 -79 102 -191 227 -309 346 -101 103 -180 189 -175 192 4 3 71 26 148
52 77 26 141 48 142 49 1 1 -11 22 -27 46 -17 25 -30 48 -30 53 0 11 48 9 55
-3 3 -5 11 -10 18 -10 6 0 -20 33 -59 72 -128 131 -171 212 -209 393 -49 236
-166 549 -375 1004 -64 138 -72 185 -38 221 74 78 417 336 513 385 43 23 46
23 25 5 -14 -12 -75 -57 -137 -100 -185 -129 -380 -296 -388 -330 -8 -38 -9
-34 102 -299 118 -281 109 -265 141 -257 15 3 55 12 89 20 l61 13 12 -78 c33
-228 118 -478 256 -749 77 -152 117 -210 168 -241 19 -12 25 -19 15 -19 -9 0
-19 -8 -22 -19 -2 -10 -22 -26 -43 -35 l-39 -17 80 -87 c152 -166 301 -304
469 -435 175 -136 382 -314 451 -388 l40 -42 -65 45 c-36 25 -130 89 -210 143
-161 108 -223 155 -385 290 -142 118 -235 188 -235 178 0 -4 17 -19 36 -33 61
-43 72 -58 69 -97 -4 -33 -15 -60 -15 -34 0 7 -5 9 -10 6 -5 -3 -10 1 -10 10
0 8 -6 18 -14 21 -8 3 -16 14 -19 24 -4 16 -12 18 -58 14 -63 -6 -122 3 -114
17 4 5 4 9 1 9 -3 0 -14 -18 -25 -40 l-19 -40 36 -44 37 -45 25 24 c14 13 41
28 60 33 19 6 28 11 20 11 -13 1 -13 2 0 11 8 5 17 6 20 1 3 -4 19 -16 35 -28
23 -16 35 -19 50 -11 19 9 19 8 3 -5 -17 -13 -17 -15 0 -31 10 -9 21 -14 24
-11 3 3 13 -5 24 -17 10 -12 13 -18 7 -14 -31 18 -7 -8 65 -71 43 -37 190
-169 327 -293 136 -124 269 -244 296 -268 l48 -43 208 104 c592 293 1081 445
1318 408 70 -10 194 -63 199 -84 2 -7 8 -34 15 -62 6 -27 38 -105 71 -172 53
-109 57 -124 42 -132 -9 -4 -75 -28 -147 -51 -139 -46 -365 -132 -455 -174
l-55 -25 79 0 c74 -1 87 2 205 53 181 77 401 158 415 153 7 -3 41 -51 76 -106
35 -56 67 -101 73 -101 14 0 6 16 -75 140 -139 216 -245 437 -220 462 9 9 17
7 32 -7 11 -10 17 -22 14 -27 -17 -27 19 -96 163 -311 85 -127 160 -238 167
-245 9 -9 65 -12 236 -10 l223 3 -204 191 c-268 252 -297 276 -469 399 -245
176 -273 202 -320 298 -22 46 -40 88 -40 93 1 5 18 -27 40 -71 43 -90 73 -123
180 -204 89 -68 128 -92 217 -135 59 -29 103 -68 342 -305 151 -149 279 -271
284 -271 6 0 -77 89 -184 198 -281 285 -341 361 -440 553 -92 180 -126 232
-74 115 19 -44 34 -81 32 -82 -2 -2 -38 66 -81 151 -42 85 -79 155 -82 155 -3
0 -2 -5 2 -12 4 -7 3 -8 -5 -4 -6 4 -9 11 -6 16 3 5 -6 33 -21 62 -24 49 -25
56 -12 87 l14 34 37 -52 c28 -39 43 -51 55 -46 44 17 164 46 175 42 7 -2 -4
-7 -23 -11 -19 -4 -65 -16 -102 -27 -74 -21 -80 -31 -56 -86 20 -45 69 -114
77 -108 5 2 49 -42 97 -100 49 -58 97 -107 106 -110 9 -3 33 1 53 10 43 18 55
19 55 5 0 -5 -17 -18 -39 -29 -62 -32 -101 -70 -101 -98 0 -54 230 -244 331
-274 35 -11 44 -9 91 15 93 49 198 118 198 131 0 21 -236 232 -247 221 -3 -3
10 -18 28 -33 91 -76 199 -176 199 -184 0 -10 -107 -82 -183 -122 -42 -22 -53
-24 -80 -14 -123 42 -340 230 -322 278 7 18 113 84 122 76 11 -12 -7 -37 -47
-62 -22 -14 -40 -32 -40 -40 0 -37 186 -195 230 -195 35 0 180 71 180 87 0 22
-19 55 -55 93 -25 27 -35 52 -48 114 -9 43 -18 81 -20 83 -2 2 -25 -6 -50 -17
l-47 -21 -45 31 c-36 25 -45 36 -44 58 2 27 2 27 6 2 3 -15 19 -34 39 -47 l34
-22 0 112 c0 171 -19 214 -127 283 -60 38 -72 42 -52 17 7 -10 1 -7 -13 6 -15
13 -25 27 -23 31 3 4 -13 20 -35 35 -45 31 -63 30 -219 -6 -46 -11 -86 -17
-89 -14 -3 3 -23 -30 -44 -72 -68 -139 -166 -219 -438 -358 -84 -43 -154 -84
-157 -91 -13 -34 -160 -94 -230 -94 -17 0 -69 14 -115 31 -46 17 -135 39 -198
50 -476 81 -952 324 -1254 639 -99 105 -111 114 -141 111 -18 -1 -36 3 -41 10
-4 8 -3 10 4 5 6 -4 21 -2 32 4 20 11 19 13 -20 57 -101 115 -204 295 -309
540 -117 274 -147 421 -138 673 7 188 21 250 91 395 63 131 123 212 206 280
34 28 81 71 105 96 30 32 47 44 57 38 10 -7 11 -9 0 -9 -7 0 -25 -14 -40 -31
-14 -17 -53 -54 -86 -81 -89 -73 -147 -147 -209 -267 -89 -173 -92 -186 -92
-416 1 -282 31 -431 140 -682 90 -208 207 -402 317 -528 21 -23 34 -46 30 -50
-4 -4 0 -6 8 -3 8 2 29 23 46 45 l30 40 29 -56 c44 -84 196 -231 340 -327 147
-98 271 -165 435 -237 154 -67 324 -123 247 -81 -16 9 -27 17 -25 19 2 2 32
-3 68 -10 36 -8 79 -15 95 -15 l30 -2 -27 -10 c-16 -5 -28 -13 -28 -17 0 -5
34 -13 76 -19 46 -6 84 -17 97 -29 l21 -18 -21 30 c-28 40 -77 85 -136 125
-86 57 -119 91 -106 107 9 10 9 20 0 39 -16 35 -118 170 -216 284 -238 279
-265 333 -215 429 10 21 16 41 13 45 -4 3 -4 6 0 6 3 0 78 -96 166 -212 88
-117 184 -243 214 -279 35 -43 82 -124 134 -230 67 -136 90 -172 131 -212 49
-45 70 -53 124 -49 11 1 20 -7 23 -21 3 -12 10 -44 16 -72 19 -92 60 -111 179
-83 l52 12 -4 48 -3 48 85 36 c113 49 446 270 499 332 39 44 164 274 181 331
16 53 11 -15 -10 -121 -22 -115 -23 -118 -12 -101 4 6 60 20 125 31 143 24
168 19 226 -43 l42 -45 39 20 c22 11 59 23 82 26 36 5 50 1 88 -24 25 -15 59
-48 75 -72 26 -38 30 -52 29 -107 0 -35 3 -63 8 -63 5 0 55 -40 111 -89 56
-49 167 -141 247 -204 l145 -116 3 257 c2 236 1 258 -15 270 -10 7 -69 40
-132 73 -62 33 -153 85 -202 115 -184 114 -192 129 -195 344 l-2 155 7 -135
c10 -167 22 -213 69 -260 45 -44 186 -132 350 -218 l122 -64 0 114 -1 113
-112 68 c-62 38 -124 78 -137 89 l-25 20 35 -20 c19 -11 81 -47 138 -81 95
-56 102 -59 102 -37 0 17 -19 37 -72 77 -74 56 -122 123 -131 184 -2 17 -2 25
0 19 6 -16 43 -5 43 12 0 20 5 18 70 -26 81 -55 90 -58 90 -27 0 21 -11 32
-61 59 -36 18 -70 45 -80 63 -29 46 -23 50 20 13 22 -18 58 -43 80 -56 l41
-23 0 95 0 94 -47 23 c-123 59 -197 177 -172 271 12 45 66 95 115 104 59 11
23 26 -52 22 l-69 -3 17 51 c41 121 47 269 13 320 -8 13 -14 24 -12 24 3 0 47
-16 98 -35 52 -19 97 -35 102 -35 4 0 7 40 7 89 0 69 -3 90 -15 95 -8 3 -64
13 -125 23 l-110 18 0 43 c0 23 -13 77 -29 120 -16 42 -31 102 -34 132 -8 75
-67 248 -108 311 -23 37 -53 64 -103 96 -39 25 -96 69 -127 98 -67 64 -127 95
-255 133 -99 30 -340 80 -401 84 -18 1 -33 8 -33 14 0 7 -44 58 -97 114 l-97
102 45 -6 c24 -4 179 -22 344 -41 363 -43 290 -31 751 -121 210 -41 384 -74
388 -74 3 0 6 6 6 14 0 10 -42 21 -147 41 -273 50 -283 61 -20 20 87 -14 161
-25 163 -25 2 0 4 9 4 20 0 11 -6 20 -13 20 -7 0 -147 18 -311 40 -163 22
-299 40 -301 40 -1 0 -24 18 -51 40 -47 39 -104 112 -104 134 0 6 10 -7 23
-29 12 -22 33 -45 45 -51 12 -6 98 -16 190 -23 92 -7 237 -19 322 -27 193 -17
200 -17 200 0 0 18 -15 20 -360 46 -151 12 -290 23 -308 26 -38 6 -60 27 -96
95 l-28 50 16 102 c21 129 48 184 133 272 37 39 68 73 68 77 0 3 4 10 9 15 5
5 6 3 2 -4 -8 -15 10 -18 19 -3 10 16 228 143 390 227 119 62 151 83 153 101
l3 22 -413 0 c-452 -1 -438 2 -328 -55 69 -35 147 -55 216 -55 62 0 215 35
288 65 45 19 51 17 30 -13 -36 -51 -139 -81 -295 -85 l-96 -2 -39 -54 c-22
-30 -75 -87 -119 -127 -44 -41 -183 -185 -310 -321 -126 -136 -251 -268 -276
-295 l-46 -48 -76 0 c-71 0 -81 3 -129 35 -66 43 -127 94 -112 95 18 0 135
107 228 208 128 140 516 625 516 645 0 13 -15 7 -26 -10z m366 -371 c-99 -78
-407 -334 -485 -405 -49 -44 -70 -59 -45 -33 44 47 91 87 324 282 127 105 228
184 236 183 3 0 -11 -12 -30 -27z m-1670 -205 c52 -14 111 -33 130 -42 35 -16
35 -16 5 -11 -16 3 -84 17 -150 31 -190 42 -390 45 -600 10 -29 -5 -29 -5 -5
5 58 26 197 39 360 36 137 -3 181 -8 260 -29z m-763 -57 c-65 -22 -156 -57
-202 -79 -47 -22 -85 -37 -85 -35 0 19 347 154 390 153 8 0 -38 -18 -103 -39z
m346 33 c-13 -2 -35 -2 -50 0 -16 2 -5 4 22 4 28 0 40 -2 28 -4z m185 0 c-10
-2 -28 -2 -40 0 -13 2 -5 4 17 4 22 1 32 -1 23 -4z m-301 -9 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m380 0 c-3 -3 -12 -4 -19 -1 -8 3 -5
6 6 6 11 1 17 -2 13 -5z m1660 -26 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2
-19 0 -25z m-1600 16 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m120 -30 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m1470 -61 c-3
-10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-1739 16 c53 -6 147 -23
207 -39 105 -27 280 -93 290 -110 3 -4 -36 10 -87 32 -121 52 -291 95 -434
109 -189 20 -421 -14 -603 -85 -36 -14 -66 -24 -68 -22 -7 7 150 63 237 85
161 39 295 48 458 30z m493 -43 c60 -30 147 -81 194 -112 78 -52 277 -222 315
-269 14 -17 14 -18 -7 -7 -12 7 -28 20 -35 31 -28 39 -180 170 -268 230 -50
35 -144 90 -208 122 -65 32 -113 59 -108 59 5 0 58 -24 117 -54z m-356 -37
c122 -25 255 -68 332 -109 l58 -30 -98 3 c-63 2 -91 0 -81 -6 9 -5 56 -9 105
-8 70 1 96 -2 126 -18 44 -22 126 -85 204 -155 l54 -49 -65 7 c-122 13 -204
38 -322 97 -123 62 -189 79 -305 79 -59 0 -78 -10 -51 -26 7 -5 8 -3 3 5 -22
36 112 -58 211 -147 l59 -54 247 -1 c170 -2 251 -6 258 -13 9 -9 -56 -11 -256
-9 -248 2 -266 1 -248 -14 10 -9 29 -37 42 -62 33 -65 107 -156 144 -176 29
-16 58 -17 264 -14 l231 3 47 -77 c27 -42 47 -77 45 -78 -2 -1 -108 0 -236 3
-230 5 -232 5 -258 30 -15 14 -34 37 -43 53 -16 26 -32 36 -32 18 0 -4 19 -30
43 -57 40 -46 40 -47 9 -26 -17 13 -58 51 -90 84 -31 34 -75 79 -98 102 -23
23 -76 83 -118 134 -43 50 -80 92 -84 92 -4 0 -29 20 -55 44 -160 147 -519
245 -847 232 l-135 -5 68 35 c120 62 343 123 497 138 85 7 275 -5 375 -25z
m1589 -70 c-4 -52 -9 -88 -12 -81 -5 17 8 185 14 179 3 -3 2 -47 -2 -98z
m-2544 86 c0 -2 -10 -9 -22 -15 -22 -11 -22 -10 -4 4 21 17 26 19 26 11z m-50
-28 c0 -2 -19 -18 -42 -36 l-43 -32 39 35 c37 34 46 40 46 33z m140 -41 c0 -2
-7 -7 -16 -10 -8 -3 -12 -2 -9 4 6 10 25 14 25 6z m-53 -29 c-11 -7 -48 -31
-84 -54 -36 -23 -59 -36 -52 -27 12 15 139 94 149 93 3 0 -3 -6 -13 -12z
m1353 -33 c0 -2 -9 0 -20 6 -11 6 -20 13 -20 16 0 2 9 0 20 -6 11 -6 20 -13
20 -16z m754 -6 c-9 -17 -22 -50 -29 -72 -7 -23 -13 -32 -14 -21 -1 21 44 125
54 125 3 0 -2 -14 -11 -32z m-671 -47 c7 -8 -7 -2 -30 14 -24 15 -43 30 -43
32 0 7 61 -31 73 -46z m407 -122 c13 -23 13 -59 1 -59 -6 0 -37 25 -70 56 -52
48 -61 61 -61 91 l0 35 60 -52 c34 -29 65 -61 70 -71z m-2000 108 c0 -2 -12
-14 -27 -28 l-28 -24 24 28 c23 25 31 32 31 24z m268 -4 c-16 -2 -40 -2 -55 0
-16 2 -3 4 27 4 30 0 43 -2 28 -4z m225 0 c-18 -2 -48 -2 -65 0 -18 2 -4 4 32
4 36 0 50 -2 33 -4z m-674 -6 c-2 -2 -24 -18 -49 -36 l-45 -33 40 36 c22 20
44 36 49 36 5 0 7 -1 5 -3z m324 -4 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0
19 -2 13 -5z m430 0 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z
m-496 -9 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m556 -1 c-7
-2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m54 -9 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m988 -14 c10 -11 16 -20 13 -20 -3 0 -13
9 -23 20 -10 11 -16 20 -13 20 3 0 13 -9 23 -20z m-920 0 c25 -11 -1 -11 -35
0 -20 6 -21 8 -5 8 11 0 29 -3 40 -8z m65 -20 c18 -12 2 -12 -25 0 -13 6 -15
9 -5 9 8 0 22 -4 30 -9z m50 -20 c8 -5 11 -10 5 -10 -5 0 -17 5 -25 10 -8 5
-10 10 -5 10 6 0 17 -5 25 -10z m-970 -14 c0 -2 -8 -10 -17 -17 -16 -13 -17
-12 -4 4 13 16 21 21 21 13z m1068 -30 c37 -19 81 -47 97 -61 l30 -27 -35 24
c-19 13 -66 40 -105 60 -38 21 -67 38 -62 38 4 0 38 -15 75 -34z m1949 -2 c-3
-3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-750 -191 c26 -46 41 -58
23 -20 -11 21 -11 21 5 2 8 -11 13 -25 10 -33 -2 -7 0 -10 5 -7 10 6 55 -74
46 -83 -3 -3 -6 -1 -6 4 0 6 -7 19 -15 30 -14 16 -14 14 0 -14 13 -26 19 -31
30 -22 8 7 46 10 102 7 l88 -3 -91 -2 c-73 -2 -93 -5 -98 -18 -4 -10 -2 -13 6
-8 8 5 9 2 5 -10 -6 -16 9 -17 226 -13 255 5 302 0 390 -45 77 -38 128 -86
160 -151 35 -69 98 -273 90 -292 -12 -32 -68 -45 -347 -80 -158 -19 -295 -35
-306 -35 -10 0 -21 8 -24 18 -2 9 -3 -10 -1 -43 l4 -60 -10 65 c-6 36 -22 112
-37 170 -14 58 -27 108 -27 112 0 3 -3 9 -7 13 -4 4 -4 13 -1 21 3 8 0 14 -6
14 -6 0 -11 6 -11 12 0 27 -54 152 -86 200 -19 27 -34 52 -34 55 0 6 -48 64
-79 98 -11 11 -34 45 -53 75 -19 30 -49 78 -67 107 l-33 51 -46 -29 c-25 -16
-51 -29 -58 -29 -6 0 22 -35 63 -77 41 -43 79 -77 84 -75 6 1 8 -2 4 -8 -4 -6
11 -32 33 -58 133 -159 259 -455 303 -710 30 -180 25 -544 -12 -755 -20 -110
-21 -70 -4 89 10 85 14 184 11 229 -3 53 -2 70 4 50 9 -31 5 126 -7 305 -5 72
-8 88 -14 65 -5 -21 -7 -13 -3 25 2 33 1 47 -4 36 -6 -13 -8 -4 -9 30 0 54
-47 206 -100 329 -72 164 -148 275 -301 439 -40 43 -71 80 -68 83 3 3 -13 19
-34 34 -51 37 -51 45 0 19 21 -11 47 -20 57 -20 28 0 82 37 101 69 l16 29 54
-72 c29 -39 65 -90 79 -113z m810 181 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11
1 17 -2 13 -5z m50 -10 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m66 -11 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z m-2526 -48
c221 -32 355 -80 437 -155 42 -39 183 -232 158 -216 -7 4 -31 35 -54 69 -54
80 -143 169 -195 196 -64 32 -201 69 -330 87 -128 19 -443 25 -638 12 -146
-10 -100 8 55 21 150 13 431 6 567 -14z m558 -25 c10 -11 16 -20 13 -20 -3 0
-13 9 -23 20 -10 11 -16 20 -13 20 3 0 13 -9 23 -20z m-997 -37 c-16 -2 -40
-2 -55 0 -16 2 -3 4 27 4 30 0 43 -2 28 -4z m110 0 c-16 -2 -40 -2 -55 0 -16
2 -3 4 27 4 30 0 43 -2 28 -4z m299 0 c-20 -2 -52 -2 -70 0 -17 2 0 4 38 4 39
0 53 -2 32 -4z m1010 1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m831 -39 c146 -31 291 -77 347 -110 42 -25 116 -95 99 -95 -33 0 -94 27 -137
62 -93 73 -169 103 -366 143 -145 29 -155 30 -147 10 8 -22 0 -18 -17 8 l-15
23 57 -7 c31 -5 112 -20 179 -34z m-2475 28 c-18 -2 -48 -2 -65 0 -18 2 -4 4
32 4 36 0 50 -2 33 -4z m745 0 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27
-2 18 -5z m1140 0 c-21 -2 -57 -2 -80 0 -24 2 -7 4 37 4 44 0 63 -2 43 -4z
m-1075 -10 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m54 -9 c-3
-3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m40 -10 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m643 -69 c43 -41 88 -77 101 -80 13 -3
108 -5 211 -3 169 3 187 1 197 -14 10 -17 -1 -18 -176 -20 -287 -2 -293 -1
-355 71 -43 50 -83 121 -68 121 6 0 46 -34 90 -75z m-1407 48 c-40 -2 -107 -2
-150 0 -43 1 -10 3 72 3 83 0 118 -2 78 -3z m-255 -10 c-10 -2 -26 -2 -35 0
-10 3 -2 5 17 5 19 0 27 -2 18 -5z m2530 -20 c-10 -2 -26 -2 -35 0 -10 3 -2 5
17 5 19 0 27 -2 18 -5z m-1820 -85 c3 -37 2 -38 -30 -38 -18 0 -50 3 -70 6
-35 6 -38 9 -38 41 l0 34 68 -3 67 -3 3 -37z m-191 -3 c2 -14 -1 -25 -6 -25
-15 0 -21 14 -14 39 7 26 16 20 20 -14z m458 -2 c63 -22 116 -58 170 -114 l50
-53 -51 45 c-78 68 -165 111 -238 116 -56 5 -65 3 -94 -22 -17 -14 -40 -40
-49 -56 l-17 -29 -131 0 c-225 0 -549 -27 -672 -56 -22 -5 -25 -4 -17 6 26 27
373 61 642 63 l163 1 35 49 c55 76 102 88 209 50z m-675 7 c0 -5 -4 -10 -10
-10 -5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4 10 -10z m47 4 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-329 -29 c1 -14 -3 -25 -9 -25 -5 0
-8 4 -5 9 4 5 -2 7 -12 4 -12 -3 -19 1 -19 10 0 9 6 13 14 10 7 -3 13 0 13 6
0 22 16 10 18 -14z m119 5 c-1 -11 -5 -20 -9 -20 -4 0 -8 9 -8 20 0 11 4 20 9
20 6 0 9 -9 8 -20z m133 16 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1 -10 4 0 6 5 11
10 11 6 0 10 -2 10 -4z m210 -17 c0 -5 -4 -9 -10 -9 -5 0 -10 7 -10 16 0 8 5
12 10 9 6 -3 10 -10 10 -16z m2247 5 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1
17 -2 13 -5z m-2407 -14 c0 -5 -4 -10 -10 -10 -5 0 -10 5 -10 10 0 6 5 10 10
10 6 0 10 -4 10 -10z m569 -33 c6 -8 8 -17 5 -20 -9 -8 -44 11 -44 23 0 15 26
12 39 -3z m-267 -4 c-40 -2 -103 -2 -140 0 -37 2 -4 3 73 3 77 0 107 -2 67 -3z
m-253 -7 c-2 -2 -76 -6 -164 -8 -88 -3 -131 -2 -95 2 72 7 266 12 259 6z
m-371 -23 c-16 -2 -40 -2 -55 0 -16 2 -3 4 27 4 30 0 43 -2 28 -4z m1006 -24
c125 -79 246 -246 246 -339 0 -47 -18 -58 -85 -53 l-60 5 -2 53 c-1 66 -41
153 -90 196 -58 50 -115 71 -225 79 -55 4 -101 10 -104 12 -2 3 31 12 74 22
42 9 95 25 117 35 56 27 74 25 129 -10z m215 -8 c88 -45 161 -59 336 -66 88
-4 175 -11 192 -17 47 -14 97 -78 128 -164 49 -134 43 -204 -20 -220 -14 -3
-23 -10 -20 -14 6 -10 -227 -20 -238 -10 -4 4 32 10 80 14 116 9 177 37 181
84 4 36 -18 120 -50 195 -31 71 -49 77 -262 87 -188 9 -231 18 -311 64 -39 23
-96 76 -81 76 3 0 33 -13 65 -29z m-582 -68 c-35 -47 -36 -48 -107 -57 -71 -8
-72 -8 -103 22 -42 39 -69 52 -107 52 -49 0 -103 -34 -148 -93 -49 -62 -55
-81 -13 -40 59 59 151 68 236 23 42 -22 61 -27 70 -20 10 9 18 -2 35 -47 26
-67 35 -136 26 -188 -8 -42 -60 -105 -87 -105 -16 0 -15 6 13 45 43 60 51 151
20 212 -42 82 -126 131 -206 119 -92 -14 -140 -71 -140 -166 1 -57 36 -146 54
-135 5 3 12 0 16 -6 5 -8 3 -9 -6 -4 -8 5 -11 3 -9 -4 3 -7 8 -11 11 -9 4 2
23 -12 42 -31 31 -30 44 -35 97 -39 38 -3 56 -8 48 -13 -18 -11 -85 -1 -124
18 -40 20 -103 80 -122 118 -9 17 -19 57 -23 90 l-7 60 -2 -75 c-1 -82 -14
-139 -33 -153 -9 -6 -5 -7 11 -3 18 4 21 2 12 -7 -6 -6 -46 -13 -89 -17 -84
-6 -80 -1 -69 -78 4 -29 2 -25 -10 16 -9 28 -22 52 -29 52 -8 0 -11 6 -8 15 7
18 6 18 -37 3 l-34 -12 30 -6 c26 -6 23 -7 -25 -14 -173 -22 -190 -27 -190
-49 0 -21 3 -22 107 -19 59 2 106 1 103 -1 -7 -7 -300 -19 -300 -13 0 3 25 24
55 46 42 31 57 49 65 81 15 54 -1 100 -47 138 l-35 29 28 52 c16 29 44 70 64
92 32 36 45 42 143 67 l107 28 64 -58 c35 -33 68 -59 73 -59 4 1 -23 29 -61
64 l-69 63 64 12 c61 11 282 37 379 44 25 2 103 4 173 5 l129 2 -35 -47z
m-739 1 c-3 -3 -28 -11 -54 -18 -27 -7 -60 -16 -74 -20 -23 -6 -24 -6 -5 5 27
17 146 47 133 33z m881 -37 c-44 -29 -97 -129 -108 -204 -7 -50 -9 -53 -9 -18
-1 22 7 65 18 95 21 61 20 72 -2 38 -50 -77 -59 -168 -25 -237 8 -17 12 -31 7
-31 -16 0 -40 70 -40 119 0 89 53 184 129 233 53 33 79 38 30 5z m1171 -15
c-32 -10 -50 -36 -50 -71 l-1 -36 -24 47 c-14 26 -30 50 -37 54 -9 6 -6 10 10
14 28 6 123 -1 102 -8z m-2555 -13 c-2 -12 -18 -80 -34 -153 -17 -72 -36 -176
-42 -231 -7 -55 -15 -104 -19 -108 -13 -14 -230 45 -230 63 0 12 -2 12 -9 2
-19 -31 -91 16 -91 61 0 20 73 102 132 149 l38 29 -16 -36 c-8 -21 -13 -39
-11 -42 3 -2 9 10 15 26 19 54 69 116 139 173 54 44 114 84 130 88 1 0 0 -10
-2 -21z m2898 14 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z
m-894 -47 c146 -30 190 -64 199 -157 4 -46 2 -53 -29 -85 -38 -40 -41 -40
-145 -15 -44 10 -95 22 -115 25 l-35 6 10 50 c8 42 7 61 -11 118 -11 37 -24
75 -28 84 -7 17 -4 17 31 4 22 -7 77 -21 123 -30z m-1909 19 c0 -2 -20 -53
-44 -113 -96 -239 -139 -504 -118 -728 15 -150 34 -225 73 -279 19 -26 51
-103 80 -191 27 -81 83 -217 125 -302 67 -138 83 -163 145 -225 38 -38 68 -71
67 -72 -2 -1 -31 10 -65 26 -79 35 -110 78 -199 269 -126 272 -209 524 -233
703 -22 163 -10 336 45 622 47 249 71 313 109 299 8 -4 15 -7 15 -9z m2275
-15 c24 -23 85 -186 85 -229 0 -39 -72 -71 -159 -71 l-44 0 47 38 c25 20 46
45 46 55 0 9 -2 17 -4 17 -2 0 -11 3 -20 6 -10 4 -22 -8 -40 -43 -13 -26 -34
-54 -46 -61 l-21 -13 21 29 c32 43 36 100 12 154 -25 56 -75 96 -161 125 l-66
22 162 -2 c156 -3 164 -4 188 -27z m549 14 c9 -8 16 -18 16 -21 0 -3 -78 -2
-173 2 -140 6 -175 4 -184 -7 -8 -10 1 -43 38 -137 28 -68 48 -125 46 -128 -2
-2 -22 -1 -44 3 -39 6 -41 7 -53 62 -7 30 -21 80 -31 110 -23 68 -24 90 -2
114 14 16 34 18 194 18 148 0 180 -3 193 -16z m-1384 -16 c59 -31 101 -106 99
-182 l-2 -51 -7 60 c-10 91 -49 150 -113 174 -41 16 -68 14 -112 -9 -49 -25
-54 -25 -24 -1 49 38 96 40 159 9z m-402 -25 c-4 -22 -22 -20 -26 1 -2 10 3
16 13 16 10 0 15 -7 13 -17z m-318 -6 c0 -2 -10 -12 -22 -23 l-23 -19 19 23
c18 21 26 27 26 19z m525 -22 c-1 -14 -5 -28 -8 -31 -3 -4 -4 7 -2 22 4 35 4
34 9 34 2 0 3 -11 1 -25z m-451 -15 c-39 -17 -53 -37 -68 -95 -3 -11 -3 -3 -1
19 4 41 27 73 60 87 40 16 49 7 9 -11z m1804 13 c-15 -2 -42 -2 -60 0 -18 2
-6 4 27 4 33 0 48 -2 33 -4z m-1726 -15 c22 -19 48 -60 48 -78 -1 -8 -7 -1
-14 16 -8 17 -26 40 -41 52 -15 12 -23 22 -18 22 5 0 16 -6 25 -12z m1920 5
l-73 -4 20 -33 c12 -18 18 -36 15 -39 -3 -3 4 -10 15 -16 25 -14 85 -100 76
-109 -4 -4 -19 8 -34 27 -14 18 -45 56 -68 84 -41 48 -51 75 -36 90 3 4 40 6
82 5 l76 -2 -73 -3z m-1420 -40 c-12 -2 -20 -9 -16 -14 3 -5 10 -7 15 -4 5 4
9 2 9 -2 0 -16 -24 -33 -44 -33 -21 1 -21 1 -2 15 29 22 13 29 -23 10 -19 -9
-31 -23 -31 -36 0 -11 -4 -18 -10 -14 -27 17 54 84 100 83 23 -1 24 -1 2 -5z
m1519 -28 c10 -16 20 -43 24 -60 5 -29 5 -29 -5 -5 -6 14 -28 42 -48 63 -35
37 -36 39 -13 35 15 -2 32 -15 42 -33z m-2914 3 c-3 -8 -6 -5 -6 6 -1 11 2 17
5 13 3 -3 4 -12 1 -19z m2671 15 c-21 -2 -55 -2 -75 0 -21 2 -4 4 37 4 41 0
58 -2 38 -4z m-1811 -9 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m-45 -17 c-6 -6 -12 -28 -15 -47 l-4 -35 -1 36 c-1 19 3 40 10 47 16 16 23 15
10 -1z m98 -47 c0 -19 -36 -70 -50 -70 -5 0 2 11 15 25 29 28 31 51 9 85 l-16
25 21 -24 c12 -13 21 -31 21 -41z m-923 18 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13
3 -3 4 -12 1 -19z m700 -10 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0
-25z m833 2 c0 -5 -4 -10 -10 -10 -5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4
10 -10z m1167 3 c-20 -2 -52 -2 -70 0 -17 2 0 4 38 4 39 0 53 -2 32 -4z m191
0 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27 -2 18 -5z m-2901 -55 c-3 -7
-5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m993 16 c0 -2 -7 -4 -15 -4 -8
0 -15 4 -15 10 0 5 7 7 15 4 8 -4 15 -8 15 -10z m269 -32 c1 -7 -3 -10 -9 -7
-5 3 -10 18 -9 33 0 24 1 25 9 7 5 -11 9 -26 9 -33z m-420 -4 c8 2 11 0 7 -6
-3 -6 9 -15 29 -22 26 -9 35 -17 34 -33 l0 -22 -9 23 c-12 28 -40 30 -33 2 3
-11 0 -20 -6 -20 -6 0 -11 11 -11 23 0 15 -9 28 -24 35 -14 6 -30 21 -37 34
l-12 23 24 -21 c13 -12 30 -19 38 -16z m388 10 c-3 -8 -6 -5 -6 6 -1 11 2 17
5 13 3 -3 4 -12 1 -19z m1531 15 c-10 -2 -28 -2 -40 0 -13 2 -5 4 17 4 22 1
32 -1 23 -4z m-908 -28 c125 -19 201 -46 266 -95 210 -159 256 -546 100 -845
-41 -80 -42 -82 -21 -65 34 26 -21 -45 -58 -76 -41 -35 -137 -78 -205 -93 -86
-18 -211 -14 -288 10 -60 19 -77 30 -135 88 -77 79 -193 248 -248 364 -41 84
-81 222 -81 276 0 36 -29 56 -66 47 -25 -7 -25 -7 -23 67 2 40 -1 78 -5 85
-16 27 73 131 144 167 40 20 221 66 305 78 71 10 227 6 315 -8z m1163 -57
c-42 -72 -127 -97 -201 -59 -23 12 -42 23 -42 25 0 2 20 -1 44 -6 34 -7 51 -6
73 6 33 17 67 48 89 81 15 24 15 24 35 4 20 -20 20 -21 2 -51z m-3026 15 c-3
-10 -5 -4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m2867 0 c34 -37 26 -40 -21
-9 -30 21 -49 26 -93 25 -51 -1 -53 -1 -25 -11 32 -11 58 -28 52 -34 -2 -2
-21 5 -42 16 -22 11 -46 20 -55 21 -10 0 -9 3 5 9 11 5 50 9 87 9 61 1 70 -2
92 -26z m-2197 -5 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m1835
-3 c5 -24 3 -25 -46 -24 -47 1 -49 1 -20 10 17 5 37 16 44 24 16 20 17 19 22
-10z m83 -2 c11 -7 36 -13 57 -13 20 0 40 -5 44 -12 5 -8 2 -9 -10 -5 -10 4
-48 8 -84 8 -37 1 -59 3 -49 6 18 5 18 6 1 24 -17 19 -17 20 2 13 10 -4 28
-13 39 -21z m1354 -50 c15 -30 26 -74 29 -115 l5 -67 -44 -11 c-147 -37 -321
-113 -408 -178 -48 -36 -68 -90 -86 -237 -26 -216 -59 -336 -103 -378 -15 -14
-47 -33 -71 -42 -65 -23 -73 -17 -14 10 64 29 93 85 117 225 25 152 19 170
-60 170 -47 0 -55 3 -50 16 3 9 6 19 6 24 0 5 29 12 65 15 l65 7 0 36 0 35
-60 -6 -60 -7 0 30 c0 28 3 30 38 30 56 0 87 20 87 55 0 30 -1 30 -62 33 -58
3 -63 5 -63 26 0 21 6 24 59 30 74 8 91 21 102 77 18 97 3 144 -44 135 -12 -3
-48 -8 -79 -11 -54 -6 -58 -5 -58 14 0 12 4 21 9 21 47 0 576 82 602 94 50 21
53 20 78 -31z m-1151 -29 c101 -50 170 -104 224 -176 40 -53 66 -105 56 -113
-2 -1 -19 -5 -38 -8 -36 -5 -36 -5 -54 46 -24 69 -70 140 -109 170 -76 58 -89
60 -287 62 -178 2 -180 2 -55 -5 116 -6 107 -7 -80 -6 -115 1 -187 -1 -160 -4
l50 -6 -45 -5 c-41 -4 -47 -1 -77 31 l-32 35 37 6 c20 3 141 7 268 8 l231 1
71 -36z m-1657 12 c-6 -7 -30 -16 -54 -20 -23 -3 -150 -28 -282 -55 -132 -27
-280 -57 -330 -66 -49 -9 -109 -25 -132 -36 -31 -15 -58 -19 -109 -17 -60 3
-69 6 -87 30 -11 15 -18 30 -15 33 13 14 136 25 273 25 162 0 199 5 191 26 -3
7 -7 30 -10 51 -4 32 -3 30 12 -15 l17 -54 40 7 c22 3 112 22 200 42 88 20
189 42 225 48 36 7 67 13 69 14 2 0 -2 -5 -8 -13z m1876 -1 c0 -8 -2 -13 -5
-10 -2 2 -11 -2 -19 -10 -8 -8 -22 -15 -31 -15 -13 1 -9 7 13 25 35 29 42 30
42 10z m-2640 -31 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-74
-11 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m746 -43 c-25 -29
-51 -50 -63 -51 -21 0 -21 -1 -1 -9 11 -5 17 -9 12 -9 -4 -1 -77 -15 -162 -31
-84 -17 -157 -29 -162 -28 -18 5 -90 -26 -124 -53 l-37 -28 -6 25 c-8 30 4 54
43 87 37 31 89 48 246 82 106 23 285 62 293 64 2 1 -16 -21 -39 -49z m-812 34
c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m2569 -13 c46 -21 100
-82 138 -158 33 -67 33 -91 0 -103 -32 -12 -57 -12 -26 0 12 5 22 15 22 21 0
23 -63 139 -96 178 -46 54 -83 64 -207 57 -87 -4 -93 -4 -42 4 33 6 64 12 70
14 26 11 104 4 141 -13z m-450 -24 c38 3 67 3 64 1 -3 -3 -37 -8 -76 -12 -62
-6 -72 -5 -78 10 -5 13 -4 14 7 6 9 -8 38 -9 83 -5z m157 6 c-13 -2 -35 -2
-50 0 -16 2 -5 4 22 4 28 0 40 -2 28 -4z m251 -29 c8 -21 8 -24 -3 -24 -5 0
-11 9 -14 20 -6 24 8 27 17 4z m495 -73 c1 -74 -5 -61 -11 24 -3 40 -2 61 3
50 4 -11 8 -44 8 -74z m-607 64 c4 -5 8 -14 8 -20 0 -5 -5 -3 -10 5 -8 12 -10
12 -10 -5 0 -17 -2 -17 -10 -5 -20 32 0 55 22 25z m768 -21 c0 -35 -17 -64
-38 -64 -16 1 -16 1 1 11 10 6 17 22 17 40 0 28 -2 30 -27 25 -79 -14 -103
-16 -103 -8 0 10 128 31 143 24 4 -2 7 -14 7 -28z m-3550 15 c11 -8 8 -9 -15
-5 -37 7 -76 -11 -92 -44 -10 -19 -13 -21 -13 -7 0 46 80 84 120 56z m2553 4
c3 -5 8 -22 11 -39 6 -24 4 -31 -9 -31 -13 0 -16 7 -11 27 2 15 0 32 -7 39 -8
8 -8 11 0 11 7 0 14 -3 16 -7z m191 -9 c8 -22 8 -24 -8 -24 -9 0 -14 9 -13 20
2 24 13 26 21 4z m-2540 -11 c4 -5 13 -8 19 -8 5 0 12 -6 15 -14 3 -9 0 -11
-9 -6 -8 5 -11 4 -6 -1 5 -5 12 -9 16 -9 5 0 28 -21 52 -47 24 -26 55 -50 69
-54 23 -6 22 -5 -8 21 -40 33 -36 43 9 20 52 -27 135 -16 206 29 38 24 51 36
38 37 -12 0 -4 6 19 15 22 8 41 12 44 10 2 -3 -14 -24 -37 -48 -22 -24 -45
-57 -51 -72 l-10 -28 -91 4 c-65 3 -84 1 -68 -5 13 -6 32 -9 42 -8 9 1 17 -3
17 -8 0 -14 -26 -14 -49 1 -13 8 -29 8 -60 1 -29 -8 -39 -8 -34 0 4 7 0 8 -12
4 -9 -4 -23 -3 -30 3 -8 7 -12 5 -12 -5 0 -8 4 -15 9 -15 4 0 8 -5 8 -11 0 -5
-4 -7 -10 -4 -5 3 -10 2 -10 -2 0 -5 12 -15 26 -24 22 -14 24 -17 10 -22 -12
-5 -15 -3 -10 5 5 8 1 9 -12 4 -10 -4 -15 -4 -11 0 4 4 2 13 -5 21 -6 7 -8 16
-5 20 4 3 -1 12 -11 20 -16 12 -15 13 3 6 18 -5 17 -3 -5 23 -15 17 -17 23 -6
14 11 -8 17 -10 15 -5 -18 40 -33 65 -41 65 -12 0 -10 -14 4 -28 9 -9 9 -12 0
-12 -7 0 -9 -7 -5 -17 6 -15 5 -16 -9 -3 -9 8 -12 16 -8 18 5 2 6 10 3 18 -3
8 0 21 7 29 9 11 8 19 -4 37 -9 12 -16 17 -16 11 0 -7 5 -15 10 -18 14 -9 12
-22 -3 -22 -7 0 -13 14 -13 34 0 33 5 40 20 26z m496 3 c0 -3 -4 -8 -10 -11
-5 -3 -10 -1 -10 4 0 6 5 11 10 11 6 0 10 -2 10 -4z m540 -16 c0 -5 -2 -10 -4
-10 -3 0 -8 5 -11 10 -3 6 -1 10 4 10 6 0 11 -4 11 -10z m1587 -22 c6 -7 13
-25 17 -40 10 -41 -15 -58 -84 -58 -65 0 -80 12 -80 64 0 22 4 26 28 25 23 -2
24 -2 5 -6 -23 -4 -29 -25 -17 -57 4 -12 20 -16 54 -16 27 0 55 3 64 6 21 8
21 58 0 78 -8 9 -11 16 -6 16 5 0 14 -6 19 -12z m-2827 -17 c0 -40 -13 -80
-27 -86 -23 -8 -43 14 -44 49 -1 18 -3 23 -6 13 -8 -33 7 -66 37 -82 32 -16
40 -35 16 -35 -25 0 -66 43 -72 76 -4 23 0 37 18 57 28 32 78 38 78 8z m500 9
c0 -5 -5 -10 -11 -10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z m2283 3
c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z m-130 -20 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m312 -13 c-3 -5 -13 -6 -21 -3 -12
4 -13 8 -3 14 15 9 32 2 24 -11z m332 -17 c-3 -10 -5 -4 -5 12 0 17 2 24 5 18
2 -7 2 -21 0 -30z m-714 20 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13
-5z m172 -10 c-2 -10 -4 -22 -5 -28 -1 -5 -5 -1 -9 10 -9 21 -5 35 9 35 4 0 7
-8 5 -17z m710 7 c-16 -4 -39 -8 -50 -8 -16 0 -15 2 5 8 14 4 36 8 50 8 22 0
22 -1 -5 -8z m-2368 -8 c15 -10 43 -75 43 -99 -1 -10 -9 5 -18 32 l-17 50 -62
3 c-55 3 -61 1 -58 -15 24 -116 45 -256 40 -261 -3 -3 -14 -1 -23 4 -30 20
-68 264 -40 264 6 0 9 2 6 5 -7 7 -228 -24 -249 -36 -29 -15 -39 -72 -29 -160
11 -99 22 -119 60 -119 17 0 112 9 211 20 100 12 183 19 185 17 4 -4 -345 -53
-452 -63 -41 -4 -64 -3 -68 5 -5 7 -1 9 10 4 14 -5 15 -3 4 17 -9 16 -11 51
-8 109 6 93 29 156 67 178 24 15 121 31 256 42 55 5 107 9 115 9 8 1 20 -2 27
-6z m1420 2 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m463 -24
c0 -5 -9 -10 -20 -10 -11 0 -20 5 -20 10 0 6 9 10 20 10 11 0 20 -4 20 -10z
m-412 -33 c4 -29 -12 -37 -22 -11 -10 26 -7 46 7 42 6 -3 13 -17 15 -31z m895
16 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m-2441 -35 c-9 -9
-12 -7 -12 12 0 19 3 21 12 12 9 -9 9 -15 0 -24z m1445 10 c-3 -8 -6 -5 -6 6
-1 11 2 17 5 13 3 -3 4 -12 1 -19z m530 6 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6
11 1 17 -2 13 -5z m-54 -11 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2
18 -5z m-118 -19 c-38 -7 -81 -13 -95 -12 -37 0 89 25 130 26 22 0 9 -5 -35
-14z m1303 -9 c17 -36 15 -70 -8 -151 -29 -106 -82 -215 -149 -307 -56 -78
-151 -180 -151 -163 0 4 -7 1 -15 -7 -21 -22 -168 -69 -191 -61 -13 4 -15 3
-6 -4 9 -6 -16 -17 -85 -37 -54 -16 -107 -29 -118 -31 -11 -1 -20 -3 -20 -4 0
-1 -15 -4 -32 -6 -24 -4 -33 -1 -33 9 0 25 25 43 80 60 31 9 65 25 76 34 11
10 26 19 34 21 44 9 349 172 383 205 22 20 38 39 36 42 -3 2 -84 -22 -179 -55
-96 -33 -181 -60 -189 -60 -10 0 -12 8 -6 33 4 17 17 99 29 181 19 124 26 152
44 166 50 41 385 159 453 160 29 0 38 -5 47 -25z m-875 -66 c-15 -10 -50 -23
-78 -28 -313 -60 -428 -83 -440 -87 -11 -5 -15 1 -15 25 0 26 -4 31 -25 31
-51 0 -133 -40 -171 -83 -20 -23 -33 -34 -30 -24 3 10 6 30 6 43 0 42 30 60
131 78 262 48 566 109 579 117 10 5 23 -1 43 -23 l28 -31 -28 -18z m-2433 60
c0 -5 -4 -7 -10 -4 -5 3 -10 -2 -10 -12 0 -15 -2 -16 -10 -3 -15 23 -12 30 10
30 11 0 20 -5 20 -11z m17 -14 c-4 -8 -11 -15 -17 -15 -6 0 -6 7 2 20 14 22
24 19 15 -5z m1640 -7 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z
m-2170 0 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m133 12 c13 -8
13 -10 -2 -10 -9 0 -20 5 -23 10 -8 13 5 13 25 0z m150 -57 c-10 -16 -11 -15
-6 7 3 14 6 34 7 45 1 13 3 11 6 -7 2 -15 -1 -35 -7 -45z m2093 60 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m177 -14 c0 -6 -4 -7 -10 -4 -5 3
-10 11 -10 16 0 6 5 7 10 4 6 -3 10 -11 10 -16z m-232 4 c-10 -2 -26 -2 -35 0
-10 3 -2 5 17 5 19 0 27 -2 18 -5z m389 1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6
11 1 17 -2 13 -5z m-2653 -16 c-2 -3 2 -8 8 -10 7 -3 1 -7 -14 -10 -15 -3 -25
-1 -22 3 3 5 0 9 -5 9 -6 0 -11 3 -11 8 0 4 11 7 24 7 13 0 22 -3 20 -7z m696
-4 c0 -2 -9 -4 -21 -4 -11 0 -18 4 -14 10 5 8 35 3 35 -6z m43 9 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m44 -15 c-3 -8 -6 -5 -6 6 -1 11 2
17 5 13 3 -3 4 -12 1 -19z m1411 15 c-10 -2 -28 -2 -40 0 -13 2 -5 4 17 4 22
1 32 -1 23 -4z m409 1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m506 -8 c6 -15 -12 -26 -44 -26 -12 0 -19 7 -19 20 0 15 7 20 29 20 16 0 31
-6 34 -14z m45 2 c-6 -18 -25 -20 -31 -3 -5 10 0 15 14 15 12 0 19 -5 17 -12z
m-3095 -15 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m2064 -115
c-2 -24 -4 -7 -4 37 0 44 2 63 4 43 2 -21 2 -57 0 -80z m-1674 95 c-7 -2 -21
-2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z m344 -15 c-3 -8 -6 -5 -6 6 -1 11
2 17 5 13 3 -3 4 -12 1 -19z m1610 16 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11
1 17 -2 13 -5z m-2943 -20 c3 -8 2 -12 -4 -9 -6 3 -10 10 -10 16 0 14 7 11 14
-7z m1263 -6 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-284 5
c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m1844 1 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-2697 -29 c-65 -17 -107 -19 -115 -6
-3 6 8 8 27 5 18 -3 47 0 63 5 17 5 41 9 55 9 14 0 0 -6 -30 -13z m640 -15 c0
-16 -4 -30 -10 -30 -5 0 -10 14 -10 30 0 17 5 30 10 30 6 0 10 -13 10 -30z
m577 8 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m1370 16 c-3 -3
-12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-1670 -38 c-1 -29 -4 -33 -24
-32 -18 1 -23 7 -23 28 0 24 8 31 42 37 3 0 6 -14 5 -33z m1839 -52 c-3 -8
-11 -14 -18 -13 -10 0 -10 2 0 6 6 2 13 21 13 41 2 32 3 33 6 9 3 -16 2 -35
-1 -43z m-1529 24 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m2070
-20 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-2682 3 c3 -5 1
-12 -5 -16 -5 -3 -10 1 -10 9 0 18 6 21 15 7z m2288 2 c-7 -2 -19 -2 -25 0 -7
3 -2 5 12 5 14 0 19 -2 13 -5z m-1643 -72 c-1 -13 -29 45 -29 59 0 8 6 0 14
-19 8 -18 15 -36 15 -40z m-593 37 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4
-12 1 -19z m2467 0 c9 -12 16 -30 16 -40 0 -15 -6 -14 -50 9 -28 14 -53 23
-56 20 -3 -3 11 -13 31 -22 20 -10 42 -30 51 -46 l14 -28 -35 1 c-21 1 -35 6
-35 14 0 34 -30 44 -128 44 -146 0 -234 -10 -222 -25 8 -9 4 -11 -16 -7 -19 3
-22 7 -12 13 7 5 9 9 3 9 -5 0 14 14 44 31 60 34 125 45 288 48 84 1 93 -1
107 -21z m160 -248 c-36 -164 -112 -359 -134 -345 -6 4 1 21 16 40 29 38 84
200 108 317 9 42 17 117 18 165 l2 88 4 -95 c2 -63 -3 -120 -14 -170z m-631
240 c-25 -10 -29 -20 -13 -36 6 -6 -11 -24 -53 -51 -69 -46 -82 -40 -50 25 14
28 29 41 63 54 46 17 94 24 53 8z m-1490 -15 l32 5 -29 -10 c-32 -10 -46 -6
-45 13 0 9 2 9 5 0 3 -8 18 -10 37 -8z m-565 -92 c14 -12 14 -13 -5 -13 -28 0
-32 8 -25 50 l7 35 3 -30 c2 -16 11 -36 20 -42z m212 47 c0 -5 -4 -10 -10 -10
-5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4 10 -10z m110 -2 c0 -5 -9 -8 -19
-8 -11 0 -22 3 -24 8 -3 4 6 7 19 7 13 0 24 -3 24 -7z m2608 -10 c19 -19 14
-73 -9 -102 -16 -20 -28 -26 -57 -25 l-37 2 40 6 c31 5 43 12 54 35 19 41 5
79 -34 87 l-30 7 31 1 c16 0 35 -4 42 -11z m-2262 -20 c19 -23 19 -23 -1 -6
-13 10 -43 18 -80 21 l-60 3 61 2 c52 2 64 -1 80 -20z m1748 4 c2 -4 0 -14 -5
-22 -8 -13 -10 -13 -18 0 -10 15 -6 30 9 30 5 0 11 -4 14 -8z m453 2 c-3 -3
-12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-2322 -16 c14 -6 25 -14 25
-17 0 -4 13 -21 28 -38 l29 -31 -96 -6 c-165 -11 -623 -26 -632 -20 -16 10 -9
53 10 64 11 5 43 10 71 10 28 0 133 9 233 20 173 18 234 25 284 28 12 1 34 -3
48 -10z m1545 -33 c18 0 24 5 22 17 -1 9 2 20 9 23 7 5 10 -1 7 -15 -7 -52
-71 -51 -75 1 -2 24 -2 24 5 -1 6 -18 15 -25 32 -25z m-1952 28 c-10 -2 -26
-2 -35 0 -10 3 -2 5 17 5 19 0 27 -2 18 -5z m2374 -20 c26 -30 30 -60 14 -120
-21 -85 -76 -223 -96 -243 -11 -11 -63 -24 -156 -39 -76 -12 -149 -25 -161
-28 -20 -4 -21 -3 -12 34 5 21 8 98 7 171 -1 74 2 136 8 142 5 5 80 18 165 28
86 11 162 22 168 26 6 4 11 16 11 27 0 24 31 25 52 2z m298 -19 c0 -14 -4 -23
-9 -20 -5 3 -7 15 -4 26 7 28 13 25 13 -6z m80 11 c0 -8 -5 -17 -12 -21 -7 -4
-8 -3 -4 4 4 7 1 12 -8 12 -23 0 -19 15 4 17 11 1 20 -4 20 -12z m-477 -2 c-7
-2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m-1713 -28 c0 -8 -4 -15
-10 -15 -5 0 -7 7 -4 15 4 8 8 15 10 15 2 0 4 -7 4 -15z m1275 5 c3 -5 -1 -10
-9 -10 -9 0 -16 5 -16 10 0 6 4 10 9 10 6 0 13 -4 16 -10z m801 -173 c-25
-122 -65 -259 -85 -295 -17 -28 -13 -7 23 111 31 102 52 191 72 302 4 22 9 33
11 24 2 -9 -7 -73 -21 -142z m-2170 97 c46 -22 98 -83 158 -185 57 -96 124
-193 159 -229 37 -38 60 -78 51 -91 -4 -8 -3 -9 4 -5 7 4 18 -7 28 -26 9 -18
44 -73 77 -121 87 -128 157 -180 265 -197 l57 -9 -66 2 c-112 4 -135 25 -338
294 -139 185 -178 230 -190 223 -12 -7 -30 13 -83 95 -76 116 -111 149 -171
166 -74 20 -433 -9 -532 -44 -21 -7 -47 -25 -57 -38 -16 -21 -17 -29 -7 -59
12 -36 116 -188 187 -274 23 -27 38 -54 35 -60 -3 -6 -2 -8 2 -3 5 4 60 -44
124 -106 253 -246 556 -429 823 -496 62 -15 87 -28 156 -82 44 -35 77 -66 71
-67 -5 -2 -55 6 -111 18 -326 70 -745 297 -979 530 -72 72 -125 166 -107 188
8 9 7 11 -3 7 -26 -10 -180 190 -242 313 -45 92 -59 178 -37 232 l12 29 122 4
c390 10 558 7 592 -9z m1224 -33 c-28 -56 -35 -52 -8 4 12 24 23 43 26 41 2
-2 -6 -22 -18 -45z m1051 29 c24 0 29 -4 29 -23 0 -23 -2 -23 -45 -13 -34 8
-45 15 -45 29 0 13 5 17 16 13 9 -3 29 -6 45 -6z m-851 -31 c-14 -5 -33 -20
-42 -32 -10 -12 -18 -17 -18 -10 0 16 49 53 69 52 9 0 6 -4 -9 -10z m-2223
-61 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m25 -18 c0 -16 3
-32 8 -35 5 -3 7 -12 3 -20 -3 -8 0 -15 7 -15 6 0 8 -5 4 -11 -3 -6 -1 -15 6
-19 8 -5 9 -10 1 -14 -6 -4 -16 12 -25 41 -8 26 -15 39 -16 28 l-1 -20 -9 20
c-12 27 -12 43 0 25 7 -11 10 -5 10 24 0 22 3 36 7 33 3 -4 6 -20 5 -37z
m2224 -14 c17 5 18 5 2 -6 -20 -12 -58 2 -58 22 0 6 8 4 19 -6 10 -9 26 -14
37 -10z m-1647 11 c-2 -1 -15 -11 -29 -22 l-25 -20 19 23 c11 12 24 22 29 22
6 0 8 -1 6 -3z m63 -14 c8 -10 47 -73 86 -140 40 -67 84 -136 99 -155 15 -18
21 -28 12 -21 -11 9 -31 10 -68 4 -58 -9 -112 -1 -138 21 -25 19 -87 88 -97
107 -5 9 10 -5 32 -30 23 -26 57 -54 76 -63 37 -18 141 -22 151 -6 3 5 -5 25
-18 42 -14 18 -50 78 -82 133 -31 55 -64 106 -73 113 -9 6 -11 12 -5 12 5 0
16 -8 25 -17z m1391 -338 c8 -44 18 -109 22 -145 6 -62 5 -67 -20 -93 -41 -40
-117 -73 -250 -107 -65 -17 -121 -33 -123 -35 -3 -2 9 -26 26 -52 17 -26 47
-84 67 -128 25 -56 53 -97 92 -136 l55 -56 -29 -6 c-15 -3 -28 -5 -28 -4 0 1
-11 22 -24 47 -13 25 -50 97 -82 160 -32 63 -66 127 -76 142 -11 18 -14 31 -7
38 5 5 54 21 109 35 208 52 221 71 194 287 -9 75 -8 91 5 110 19 26 24 214 6
203 -6 -4 0 15 12 40 l23 47 6 -133 c4 -74 14 -170 22 -214z m-1686 273 c-3
-8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-359 -18 c-7 -10 -14 -17
-17 -15 -4 4 18 35 25 35 2 0 -1 -9 -8 -20z m460 -149 c19 -17 49 -33 65 -37
15 -3 26 -8 23 -11 -2 -3 -20 0 -40 7 -41 13 -109 84 -131 136 -26 63 -17 60
16 -4 17 -34 47 -75 67 -91z m-457 112 c-12 -20 -14 -14 -5 12 4 9 9 14 11 11
3 -2 0 -13 -6 -23z m579 7 c0 -4 7 -11 16 -14 12 -4 15 -2 10 9 -8 21 1 19 13
-3 15 -28 -22 -25 -50 4 -18 19 -19 23 -6 18 9 -3 17 -10 17 -14z m585 0 c10
-11 16 -20 13 -20 -3 0 -13 9 -23 20 -10 11 -16 20 -13 20 3 0 13 -9 23 -20z
m-1112 -7 c-4 -10 -2 -14 4 -10 12 7 39 -50 35 -72 -2 -7 1 -10 7 -6 7 4 8 0
5 -10 -4 -10 -2 -15 6 -13 7 2 15 -3 17 -10 8 -20 -21 -9 -34 13 -10 18 -11
18 -10 -7 1 -14 6 -24 11 -20 5 3 6 -3 3 -14 -6 -16 -5 -17 6 -4 20 25 35 21
59 -13 13 -17 24 -35 24 -39 1 -5 2 -13 3 -19 0 -5 5 -8 10 -5 10 6 111 -109
111 -126 0 -5 -9 -12 -21 -15 -11 -3 -18 -11 -15 -19 3 -7 0 -16 -7 -20 -7 -4
-9 -3 -4 1 4 5 -1 18 -12 29 -33 37 -55 77 -39 71 8 -3 22 -19 31 -35 12 -19
23 -27 33 -23 11 4 12 9 4 17 -6 6 -15 11 -21 11 -5 0 -23 20 -39 45 -16 25
-30 40 -30 35 0 -6 5 -16 11 -22 7 -7 6 -12 -5 -16 -10 -4 -13 -1 -9 9 3 10 0
12 -10 8 -8 -3 -18 -1 -22 5 -3 6 0 9 8 5 8 -3 17 2 21 11 7 19 -10 55 -25 55
-6 0 -7 5 -4 10 3 6 1 10 -5 10 -6 0 -9 4 -5 9 9 16 -13 23 -34 11 -17 -9 -22
-6 -34 17 -8 16 -12 34 -9 42 3 9 0 11 -8 6 -9 -5 -11 -4 -6 4 4 6 12 8 18 5
8 -5 9 -1 3 12 -4 10 -7 28 -7 39 1 18 -1 18 -19 -5 -17 -21 -19 -22 -10 -3
16 31 13 41 -4 19 -20 -27 -19 -11 1 19 19 29 26 32 17 8z m1897 -53 c-7 -52
-7 -53 -9 -13 -1 36 7 80 14 71 1 -2 -1 -28 -5 -58z m-80 45 c0 -2 -10 -10
-22 -16 -21 -11 -22 -11 -9 4 13 16 31 23 31 12z m-50 -30 c0 -6 -56 -35 -67
-35 -4 1 8 9 27 20 39 22 40 22 40 15z m-514 -43 c-5 -4 -66 26 -66 33 0 3 16
-3 35 -12 19 -9 33 -18 31 -21z m1107 -153 l-177 -191 -12 65 c-15 81 -25 100
-80 158 l-44 45 160 33 c88 18 195 43 237 56 43 12 82 23 86 24 4 1 -72 -85
-170 -190z m-1205 103 c48 -81 157 -186 221 -215 39 -17 59 -19 145 -14 126 7
194 27 242 72 20 19 38 35 39 35 1 0 20 -39 41 -86 42 -96 41 -107 -17 -136
-60 -30 -191 -59 -290 -65 l-95 -6 -37 44 c-142 168 -322 439 -293 439 2 0 22
-31 44 -68z m502 43 c-19 -7 -46 -13 -60 -13 -16 0 -10 4 20 12 60 18 84 18
40 1z m-345 -5 c13 -5 14 -9 5 -9 -8 0 -24 4 -35 9 -13 5 -14 9 -5 9 8 0 24
-4 35 -9z m492 -12 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m1610 -25 c-3 -10 -5 -4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m-2009 20
c-10 -2 -28 -2 -40 0 -13 2 -5 4 17 4 22 1 32 -1 23 -4z m145 0 c-13 -2 -35
-2 -50 0 -16 2 -5 4 22 4 28 0 40 -2 28 -4z m174 -86 c24 -61 25 -69 11 -83
-13 -14 -18 -6 -47 72 -24 67 -29 89 -19 95 15 10 21 1 55 -84z m1066 52 c26
-32 18 -62 -47 -194 -58 -117 -174 -298 -260 -405 -51 -63 -52 -66 -40 -96
l13 -31 -77 -49 c-42 -28 -93 -60 -113 -72 l-37 -22 10 42 c5 24 8 84 6 135
-3 82 -2 89 11 70 27 -42 65 -77 82 -77 27 0 188 176 265 290 87 129 135 216
164 297 21 59 22 64 6 88 -20 31 -37 31 -138 3 -82 -22 -97 -34 -152 -121 -17
-27 -17 -28 1 -18 10 6 28 18 41 27 12 9 22 12 22 6 0 -6 -35 -39 -77 -75
-142 -118 -226 -195 -246 -227 -19 -31 -19 -33 -2 -153 18 -124 13 -218 -15
-291 -10 -27 -61 -57 -149 -87 -73 -26 -79 -25 -90 19 -16 55 -15 58 30 71 71
21 79 37 79 150 0 89 -44 488 -71 649 -6 35 -9 66 -6 69 9 8 117 -97 133 -130
8 -15 24 -83 35 -150 11 -67 23 -125 27 -128 4 -4 58 39 121 94 89 80 125 120
163 182 58 95 74 110 126 119 22 3 50 15 63 26 32 27 96 21 122 -11z m516 -85
c-11 -117 -6 -187 18 -274 29 -107 82 -165 231 -254 34 -21 62 -40 62 -43 0
-6 -80 40 -150 88 -76 51 -114 94 -147 164 -24 52 -28 75 -31 177 -4 100 12
267 24 255 2 -2 -1 -53 -7 -113z m-1482 54 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13
3 -3 4 -12 1 -19z m-1741 4 c-3 -5 4 -23 15 -41 11 -18 18 -36 15 -39 -4 -3
-6 0 -6 7 0 7 -5 9 -12 5 -7 -5 -8 -3 -3 6 6 10 4 12 -8 7 -19 -7 -29 16 -14
33 10 10 8 12 -7 6 -16 -5 -17 -4 -6 9 13 15 35 21 26 7z m451 2 c-3 -3 -12
-4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m3228 -54 c3 -6 -1 -7 -9 -4 -18 7
-21 14 -7 14 6 0 13 -4 16 -10z m-2565 -40 c6 -11 8 -20 6 -20 -3 0 -10 9 -16
20 -6 11 -8 20 -6 20 3 0 10 -9 16 -20z m678 -90 c0 -8 -6 1 -13 20 -7 19 -13
42 -13 50 0 8 6 -1 13 -20 7 -19 13 -42 13 -50z m-1121 -6 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-82 -19 c-27 -7 -59 -13 -70 -13 -11 0 3
6 30 13 28 7 59 13 70 13 11 0 -2 -6 -30 -13z m-98 -21 c-3 -3 -12 -4 -19 -1
-8 3 -5 6 6 6 11 1 17 -2 13 -5z m754 -61 c13 -16 12 -17 -3 -4 -10 7 -18 15
-18 17 0 8 8 3 21 -13z m681 -30 c-17 -30 -60 -66 -72 -58 -7 4 1 16 22 31 18
13 36 31 41 40 5 9 11 13 14 11 2 -3 0 -14 -5 -24z m-30 -76 c-6 -6 -12 -28
-15 -47 l-4 -35 -1 36 c-1 19 3 40 10 47 16 16 23 15 10 -1z m-218 -24 c2 -10
10 -44 16 -77 7 -32 21 -83 31 -114 32 -91 21 -117 -26 -66 -24 26 -29 49 -39
202 -4 66 6 97 18 55z m-2870 -113 c23 -69 36 -127 35 -157 l-1 -48 -8 45 c-7
44 -54 223 -66 255 -4 8 -4 15 -1 15 3 0 22 -49 41 -110z m2681 -50 c25 -49
43 -90 40 -90 -3 0 -25 41 -50 90 -25 50 -43 90 -40 90 3 0 25 -40 50 -90z
m402 58 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -50 c-3 -7
-5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -60 c-3 -7 -5 -2 -5 12 0
14 2 19 5 13 2 -7 2 -19 0 -25z m1798 -91 c6 -6 -26 9 -70 32 -44 23 -84 47
-90 53 -12 13 146 -71 160 -85z m-1788 31 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13
2 -7 2 -19 0 -25z m694 15 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3
21 -13z m408 -9 c15 -15 14 -16 -6 -9 -26 7 -181 -20 -231 -41 l-34 -14 22
-35 c12 -20 20 -38 17 -41 -3 -3 -17 15 -32 41 -27 44 -27 46 -9 60 11 8 21
15 24 15 3 0 41 12 85 25 86 27 138 26 164 -1z m-1455 -43 c14 -26 39 -60 56
-75 17 -14 26 -26 20 -26 -19 0 -57 45 -84 99 -15 28 -24 51 -21 51 2 0 16
-22 29 -49z m-292 -13 c-17 -17 -25 -3 -17 29 l7 28 11 -23 c7 -16 7 -26 -1
-34z m614 -3 c28 -13 54 -27 57 -32 5 -8 -36 9 -133 55 l-25 12 25 -6 c14 -4
48 -17 76 -29z m41 3 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m1038 -2 c-49 -12 -101 -26 -115 -30 -14 -5 -22 -5 -18 -1 11 11 167 53 198
54 14 0 -15 -10 -65 -23z m861 -44 c-5 -4 -66 26 -66 33 0 3 16 -3 35 -12 19
-9 33 -18 31 -21z m-1999 -52 c7 -8 13 -19 13 -24 0 -4 -9 2 -19 15 -15 18
-28 23 -57 22 l-39 -2 30 13 c31 15 44 10 72 -24z m-2582 -10 c-11 -5 -27 -9
-35 -9 -9 0 -8 4 5 9 11 5 27 9 35 9 9 0 8 -4 -5 -9z m2619 -100 c5 -24 4 -30
-3 -20 -5 8 -12 33 -15 55 -8 48 8 19 18 -35z m-31 7 c5 -16 7 -31 4 -33 -7
-8 -136 -29 -140 -23 -2 2 -7 18 -10 36 -6 31 -5 32 36 42 70 16 99 10 110
-22z m-2116 -19 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -70
c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -60 c-3 -7 -5 -2 -5
12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -60 c-3 -7 -5 -2 -5 12 0 14 2 19 5
13 2 -7 2 -19 0 -25z m3438 -74 c17 -16 21 -20 8 -10 -27 23 -30 15 -7 -19 10
-15 21 -22 31 -18 11 4 14 2 9 -5 -13 -22 -36 -12 -57 23 -23 38 -45 49 -83
39 -31 -7 -34 6 -6 31 11 10 20 25 20 34 0 11 9 6 28 -15 15 -18 41 -45 57
-60z m92 39 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-3520
-15 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -55 c-3 -10 -5
-4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m3613 17 c0 -5 -2 -10 -4 -10 -3 0
-8 5 -11 10 -3 6 -1 10 4 10 6 0 11 -4 11 -10z m-104 -42 l29 -33 -32 29 c-31
28 -38 36 -30 36 2 0 16 -15 33 -32z m101 16 c-3 -3 -12 -4 -19 -1 -8 3 -5 6
6 6 11 1 17 -2 13 -5z m-3600 -46 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2
-19 0 -25z m3118 -91 c110 -82 107 -93 -7 -32 -59 31 -119 58 -133 59 -26 3
-75 57 -75 83 0 18 139 -53 215 -110z m-3108 41 c-3 -7 -5 -2 -5 12 0 14 2 19
5 13 2 -7 2 -19 0 -25z m3123 -14 c0 -7 -58 25 -65 36 -3 5 10 1 29 -11 20
-12 36 -23 36 -25z m-2019 19 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8
3 21 -13z m-1094 -45 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m-32 -238 c10 -11 16 -20 13 -20 -3 0 -13 9 -23 20 -10 11 -16 20 -13 20 3 0
13 -9 23 -20z"/>
<path d="M2205 4269 c395 -19 544 -32 650 -53 29 -6 29 -6 5 4 -60 27 -492 62
-715 59 -88 -2 -81 -3 60 -10z"/>
<path d="M3019 4147 c5 -5 24 -7 42 -5 33 3 33 4 -8 8 -23 3 -39 2 -34 -3z"/>
<path d="M2700 4106 c0 -3 21 -19 48 -37 26 -17 77 -61 114 -97 37 -36 70 -63
73 -60 8 8 -107 112 -176 158 -32 23 -59 39 -59 36z"/>
<path d="M3960 3599 c0 -12 224 -18 308 -8 132 15 239 -21 289 -97 9 -14 40
-89 70 -167 30 -78 61 -152 69 -164 17 -26 42 -29 70 -9 18 14 18 15 1 22 -13
5 -15 9 -7 14 15 9 -41 187 -70 222 -16 20 -22 22 -48 12 -29 -11 -30 -11 -52
42 -23 57 -62 97 -120 123 -29 13 -76 16 -272 16 -131 0 -238 -3 -238 -6z"/>
<path d="M4041 3370 c15 -47 36 -126 46 -177 10 -50 21 -89 24 -87 4 2 5 -4 2
-15 -4 -15 0 -18 19 -15 12 2 90 13 173 24 93 12 155 25 164 34 12 13 11 24
-9 88 -31 99 -67 181 -86 194 -10 8 -67 11 -177 9 -130 -2 -142 -1 -62 4 84 6
91 8 40 10 -33 1 -83 6 -111 10 l-51 7 28 -86z m375 -102 c19 -59 33 -112 29
-118 -3 -5 -21 -9 -38 -9 -32 2 -32 2 -4 6 27 4 28 7 23 38 -4 19 -20 74 -36
122 -16 48 -30 90 -30 93 0 18 25 -41 56 -132z m-178 95 c-15 -2 -42 -2 -60 0
-18 2 -6 4 27 4 33 0 48 -2 33 -4z m70 -50 c-16 -2 -40 -2 -55 0 -16 2 -3 4
27 4 30 0 43 -2 28 -4z m-120 -10 c-15 -2 -42 -2 -60 0 -18 2 -6 4 27 4 33 0
48 -2 33 -4z m155 -40 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z
m-153 -13 c11 -7 2 -10 -32 -10 -27 0 -48 5 -48 10 0 13 60 13 80 0z m83 3
c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m15 -60 c-10 -2 -28 -2
-40 0 -13 2 -5 4 17 4 22 1 32 -1 23 -4z m-90 -10 c-10 -2 -28 -2 -40 0 -13 2
-5 4 17 4 22 1 32 -1 23 -4z m155 -50 c-13 -2 -33 -2 -45 0 -13 2 -3 4 22 4
25 0 35 -2 23 -4z m-85 -10 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27 -2
18 -5z m-75 -10 c-13 -2 -33 -2 -45 0 -13 2 -3 4 22 4 25 0 35 -2 23 -4z"/>
<path d="M4542 3340 c10 -30 28 -50 28 -31 0 20 -20 61 -29 61 -6 0 -6 -11 1
-30z"/>
<path d="M4582 3210 c0 -14 2 -19 5 -12 2 6 2 18 0 25 -3 6 -5 1 -5 -13z"/>
<path d="M1950 3510 c0 -5 18 -10 40 -10 22 0 40 5 40 10 0 6 -18 10 -40 10
-22 0 -40 -4 -40 -10z"/>
<path d="M1530 3470 c0 -5 16 -10 35 -10 19 0 35 5 35 10 0 6 -16 10 -35 10
-19 0 -35 -4 -35 -10z"/>
<path d="M1451 3451 c-10 -6 -9 -10 3 -14 8 -3 18 -2 21 3 8 13 -9 20 -24 11z"/>
<path d="M1216 3405 c-22 -22 -20 -42 5 -55 27 -15 51 5 47 39 -4 31 -29 38
-52 16z"/>
<path d="M1556 3335 c-9 -26 -7 -32 5 -12 6 10 9 21 6 23 -2 3 -7 -2 -11 -11z"/>
<path d="M1423 3263 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M1353 3253 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M1278 3243 c12 -2 30 -2 40 0 9 3 -1 5 -23 4 -22 0 -30 -2 -17 -4z"/>
<path d="M1210 3231 c0 -5 9 -7 20 -4 11 3 20 7 20 9 0 2 -9 4 -20 4 -11 0
-20 -4 -20 -9z"/>
<path d="M1233 3203 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M1300 3200 c0 -13 30 -13 50 0 11 7 7 10 -17 10 -18 0 -33 -4 -33
-10z"/>
<path d="M1180 3134 c-6 -14 -10 -30 -10 -35 0 -15 47 -59 62 -59 21 1 50 48
43 70 -17 53 -78 69 -95 24z"/>
<path d="M1297 3114 c-8 -8 1 -24 14 -24 5 0 9 7 9 15 0 15 -12 20 -23 9z"/>
<path d="M531 3114 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M511 3044 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M2780 3370 c0 -6 7 -10 15 -10 8 0 15 2 15 4 0 2 -7 6 -15 10 -8 3
-15 1 -15 -4z"/>
<path d="M2835 3290 l-30 -8 35 0 c19 0 49 4 65 8 l30 8 -35 0 c-19 0 -48 -4
-65 -8z"/>
<path d="M2778 3283 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M2776 3253 c-12 -12 -5 -23 14 -23 11 0 20 4 20 9 0 11 -26 22 -34
14z"/>
<path d="M2972 3229 c2 -7 10 -15 17 -17 8 -3 12 1 9 9 -2 7 -10 15 -17 17 -8
3 -12 -1 -9 -9z"/>
<path d="M2915 3220 c-3 -6 1 -7 9 -4 18 7 21 14 7 14 -6 0 -13 -4 -16 -10z"/>
<path d="M2600 3069 c-110 -22 -231 -114 -280 -214 -22 -43 -25 -64 -24 -145
0 -90 9 -129 49 -225 8 -18 7 -18 -8 -7 -24 20 -57 117 -64 189 -3 36 -9 59
-13 53 -5 -8 -18 -1 -41 19 -18 17 -39 31 -46 31 -6 0 -16 6 -20 13 -4 8 -18
16 -30 19 -21 6 -23 2 -25 -35 -1 -37 -2 -35 -9 18 -5 48 -6 43 -3 -30 4 -111
31 -210 88 -324 106 -210 256 -392 351 -425 106 -37 268 -31 391 15 55 21 154
91 154 110 0 6 -19 -6 -43 -25 -46 -37 -131 -80 -182 -91 -22 -5 -26 -4 -16 3
12 9 9 16 -17 40 -18 17 -32 34 -32 39 0 4 5 1 10 -7 8 -12 10 -11 10 8 0 14
-6 22 -17 22 -13 0 -15 2 -5 8 21 14 -16 82 -44 82 -6 0 -37 24 -69 54 l-58
54 54 -19 c30 -10 71 -18 91 -19 87 0 206 71 258 155 35 57 80 195 80 247 0
56 -30 153 -65 208 -90 143 -255 212 -425 179z m164 -14 c37 -8 88 -26 112
-40 54 -32 117 -93 108 -106 -3 -5 0 -8 7 -7 18 4 68 -98 80 -166 11 -59 5
-131 -12 -142 -5 -3 -9 -14 -9 -25 0 -35 -56 -143 -95 -183 -21 -21 -63 -50
-93 -64 -73 -33 -177 -29 -245 11 -63 37 -142 127 -166 190 -11 28 -20 43 -20
32 -1 -29 34 -101 70 -146 27 -34 29 -53 4 -31 -11 10 -105 46 -120 47 -5 0
-10 7 -11 15 0 8 -10 36 -22 61 -34 73 -55 176 -48 242 15 149 137 278 296
313 73 16 83 16 164 -1z m-203 -702 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17
0 8 8 3 21 -13z"/>
<path d="M2693 2919 c157 -23 267 -152 267 -312 0 -67 -31 -149 -66 -177 -18
-14 -18 -14 -4 5 14 19 14 19 -2 6 -10 -7 -16 -17 -13 -21 10 -16 -79 -52
-125 -52 -49 1 -130 28 -130 43 0 5 -7 9 -16 9 -8 0 -13 4 -10 8 5 9 -23 37
-39 38 -5 0 -23 22 -40 49 -23 38 -30 62 -33 115 -5 86 10 132 60 186 58 63
120 77 215 49 68 -20 133 -84 161 -156 12 -30 21 -46 21 -36 2 35 -42 108 -89
150 -54 49 -103 67 -179 67 -121 0 -211 -101 -211 -238 0 -81 24 -143 77 -202
104 -116 249 -139 358 -56 87 66 117 234 63 349 -15 32 -32 56 -38 52 -5 -3
-7 0 -4 9 8 21 -87 93 -148 111 -29 8 -70 14 -92 14 -37 -1 -35 -2 17 -10z"/>
<path d="M2549 2889 l-24 -20 30 17 c39 24 40 24 28 24 -6 0 -21 -9 -34 -21z"/>
<path d="M2990 2881 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"/>
<path d="M3011 2847 c-1 -5 4 -17 9 -27 6 -10 17 -43 25 -72 12 -41 14 -44 11
-16 -4 33 -43 133 -45 115z"/>
<path d="M2668 2803 c-44 -7 -78 -56 -78 -113 0 -41 5 -55 31 -85 56 -63 111
-80 169 -50 39 20 60 53 60 93 0 98 -84 169 -182 155z m99 -33 c37 -22 49 -41
61 -98 8 -33 6 -46 -9 -71 -20 -33 -69 -48 -111 -36 -30 9 -108 85 -108 105 0
29 21 89 36 105 22 21 92 19 131 -5z"/>
<path d="M2642 2758 c-7 -7 -12 -27 -12 -45 0 -28 3 -33 23 -32 16 1 18 2 5 6
-10 2 -18 13 -18 23 0 35 12 50 41 50 l28 0 -14 -40 c-8 -22 -10 -40 -6 -40 5
0 12 16 15 35 4 19 9 35 12 35 29 0 82 -68 66 -85 -4 -4 0 -6 8 -3 17 6 16 44
-3 66 -29 36 -121 54 -145 30z"/>
<path d="M2643 2658 c2 -7 9 -12 15 -11 6 2 9 -3 6 -11 -6 -15 32 -46 56 -46
9 0 26 7 39 16 18 13 20 18 10 25 -9 6 -1 7 21 3 26 -4 31 -3 19 5 -14 9 -124
31 -157 31 -8 0 -12 -6 -9 -12z"/>
<path d="M2777 2595 c-15 -14 -24 -25 -19 -25 5 0 19 11 32 25 30 32 23 32
-13 0z"/>
<path d="M2423 2640 c0 -30 2 -43 4 -27 2 15 2 39 0 55 -2 15 -4 2 -4 -28z"/>
<path d="M2943 2610 c0 -25 2 -35 4 -22 2 12 2 32 0 45 -2 12 -4 2 -4 -23z"/>
<path d="M2928 2540 c-3 -14 -9 -34 -12 -45 -4 -11 0 -7 9 8 9 16 15 36 13 45
-3 12 -6 10 -10 -8z"/>
<path d="M2092 2885 c0 -16 2 -22 5 -12 2 9 2 23 0 30 -3 6 -5 -1 -5 -18z"/>
<path d="M2810 2112 c0 -26 6 -30 35 -24 18 3 25 11 25 26 -1 19 -2 19 -11 4
-12 -22 -29 -23 -29 -3 0 8 -4 15 -10 15 -5 0 -10 -8 -10 -18z"/>
<path d="M1788 2883 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M1738 2873 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M1688 2863 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M1638 2853 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M1598 2843 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M1005 2793 c14 -29 30 -55 35 -58 12 -7 -36 85 -51 100 -6 6 1 -13
16 -42z"/>
<path d="M1059 2751 c13 -12 28 -21 34 -21 12 0 11 0 -28 24 l-30 17 24 -20z"/>
<path d="M4615 2575 c-202 -63 -195 -60 -195 -94 0 -15 -7 -61 -16 -100 -9
-40 -14 -74 -11 -77 3 -3 83 23 177 58 196 72 196 71 206 187 6 57 4 71 -7 71
-8 -1 -77 -21 -154 -45z m142 -7 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4
-12 1 -19z m3 -27 c0 -5 -8 -17 -17 -27 -17 -17 -18 -17 -21 1 -2 9 2 21 10
26 17 11 28 11 28 0z m-80 -40 c0 -20 -103 -76 -121 -66 -19 13 -7 27 44 50
56 26 77 31 77 16z m45 -31 c3 -5 1 -10 -4 -10 -6 0 -11 5 -11 10 0 6 2 10 4
10 3 0 8 -4 11 -10z m-221 -37 c4 -9 2 -21 -4 -27 -7 -7 -10 -3 -10 11 0 12
-6 24 -12 26 -8 4 -7 6 3 6 9 1 20 -7 23 -16z"/>
<path d="M3768 2283 c-27 -4 -28 -7 -28 -64 l0 -59 -32 1 c-24 1 -27 3 -10 6
20 4 22 10 22 59 0 36 -4 54 -12 54 -7 0 -74 -9 -148 -20 -74 -11 -136 -20
-137 -20 -8 0 -1 -230 6 -235 9 -5 266 38 299 50 7 2 12 22 12 47 1 24 7 70
13 103 12 55 15 60 39 60 17 -1 24 4 21 12 -3 7 -8 12 -12 12 -3 -1 -18 -4
-33 -6z m-78 -58 c0 -21 -5 -25 -29 -25 -17 0 -33 5 -36 10 -13 21 4 40 35 40
25 0 30 -4 30 -25z m-32 -72 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27 -2
18 -5z m42 -52 c0 -19 -35 -39 -47 -27 -4 3 1 6 10 6 22 0 30 17 11 24 -8 3
-12 2 -9 -4 3 -6 -1 -10 -9 -10 -9 0 -16 7 -16 15 0 10 10 15 30 15 23 0 30
-5 30 -19z"/>
<path d="M1335 1733 c34 -53 45 -67 45 -60 0 10 -51 87 -57 87 -3 0 3 -12 12
-27z"/>
<path d="M3303 1580 c0 -25 2 -35 4 -22 2 12 2 32 0 45 -2 12 -4 2 -4 -23z"/>
<path d="M3313 1465 c-1 -27 2 -88 6 -135 8 -83 8 -83 8 -20 0 36 -3 97 -7
135 -6 61 -7 64 -7 20z"/>
<path d="M3332 1215 c0 -16 2 -22 5 -12 2 9 2 23 0 30 -3 6 -5 -1 -5 -18z"/>
<path d="M4226 5085 c-9 -26 -7 -32 5 -12 6 10 9 21 6 23 -2 3 -7 -2 -11 -11z"/>
<path d="M3395 5055 c6 -2 78 -15 161 -29 83 -14 166 -29 185 -32 19 -4 32 -4
29 -1 -3 3 -68 17 -145 31 -139 25 -249 40 -230 31z"/>
<path d="M4185 5000 c-9 -16 -13 -30 -11 -30 3 0 12 14 21 30 9 17 13 30 11
30 -3 0 -12 -13 -21 -30z"/>
<path d="M3788 4983 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M3838 4973 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M3898 4963 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M4140 4920 c-6 -11 -8 -20 -6 -20 3 0 10 9 16 20 6 11 8 20 6 20 -3
0 -10 -9 -16 -20z"/>
<path d="M4069 4813 c-13 -16 -12 -17 4 -4 9 7 17 15 17 17 0 8 -8 3 -21 -13z"/>
<path d="M3979 4693 c-13 -16 -12 -17 4 -4 16 13 21 21 13 21 -2 0 -10 -8 -17
-17z"/>
<path d="M4523 4623 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4603 4613 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4673 4603 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4753 4593 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4833 4583 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M4898 4573 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M5055 4500 c-3 -5 -11 -7 -18 -4 -12 4 -527 -103 -536 -112 -6 -6
-12 -6 200 20 107 14 245 28 307 32 l112 7 0 27 c0 20 -6 29 -22 34 -31 8 -36
8 -43 -4z"/>
<path d="M4468 4373 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M4418 4363 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M4813 4323 c32 -2 81 -2 110 0 29 2 3 3 -58 3 -60 0 -84 -1 -52 -3z"/>
<path d="M4523 4313 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M120 4230 c0 -5 5 -10 10 -10 6 0 10 5 10 10 0 6 -4 10 -10 10 -5 0
-10 -4 -10 -10z"/>
<path d="M4655 4224 c-88 -8 -177 -12 -197 -9 -42 6 -48 1 -18 -15 13 -7 87
-4 257 10 131 11 270 21 308 23 39 2 12 3 -60 4 -71 0 -202 -6 -290 -13z"/>
<path d="M4947 4203 c18 -2 50 -2 70 0 21 2 7 4 -32 4 -38 0 -55 -2 -38 -4z"/>
<path d="M4720 4190 c-25 -4 1 -5 60 -2 58 2 107 6 109 8 7 7 -121 1 -169 -6z"/>
<path d="M4613 4173 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M398 4153 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M363 4093 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M268 4083 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M248 3983 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M158 3973 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M934 3808 l-19 -23 23 19 c21 18 27 26 19 26 -2 0 -12 -10 -23 -22z"/>
<path d="M849 3733 l-24 -28 28 24 c25 23 32 31 24 31 -2 0 -14 -12 -28 -27z"/>
<path d="M318 3603 l-318 -105 0 -75 0 -75 43 6 42 5 -42 -11 c-35 -9 -43 -15
-43 -34 0 -13 2 -24 4 -24 17 0 194 69 247 96 37 19 91 43 120 54 l54 19 -70
2 -70 2 75 9 c41 5 84 11 96 13 40 8 214 184 214 217 0 16 -36 5 -352 -99z
m161 -67 c-5 -5 -176 -46 -191 -46 -49 0 114 47 171 49 13 1 22 -1 20 -3z
m-292 -68 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-13 -71 c-6
-16 -71 -43 -80 -34 -3 3 9 8 26 12 17 4 36 15 43 25 13 22 20 20 11 -3z"/>
<path d="M799 3693 c-13 -16 -12 -17 4 -4 9 7 17 15 17 17 0 8 -8 3 -21 -13z"/>
<path d="M735 3649 c-59 -45 -67 -57 -12 -18 42 29 65 50 55 49 -2 0 -21 -14
-43 -31z"/>
<path d="M635 3574 l-30 -26 33 22 c17 12 32 23 32 26 0 7 -4 5 -35 -22z"/>
<path d="M4722 3544 c-24 -16 -28 -40 -11 -64 8 -12 9 -10 4 7 -7 24 26 53 60
53 15 -1 11 -4 -12 -15 -22 -9 -33 -21 -33 -34 0 -12 22 -81 50 -153 62 -166
71 -176 205 -207 55 -12 108 -25 118 -28 15 -4 17 3 17 50 0 35 -5 57 -12 60
-10 4 -10 6 0 6 6 1 12 12 12 26 0 19 -7 26 -32 33 -18 4 -34 15 -36 24 -3 14
3 15 32 8 35 -8 36 -7 36 20 0 16 -7 30 -16 34 -24 9 -62 7 -69 -4 -13 -21
-43 -10 -48 18 -3 15 -4 29 -2 30 4 4 91 -13 118 -23 13 -5 17 -2 17 13 0 11
-6 23 -12 25 -10 4 -10 6 0 6 10 1 19 51 9 51 -2 0 -74 18 -162 40 -177 44
-201 47 -233 24z m175 -70 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13
-5z m49 -110 c5 -26 9 -32 16 -22 6 9 7 5 3 -11 -5 -17 -4 -21 5 -16 7 4 10 2
9 -6 -1 -8 3 -27 9 -42 14 -34 15 -47 3 -47 -9 0 -71 159 -71 181 0 24 20 -5
26 -37z m104 -174 c0 -13 -30 -13 -50 0 -11 7 -7 10 18 10 17 0 32 -4 32 -10z
m-33 -36 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m46 -11 c-7
-2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m44 -9 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z"/>
<path d="M545 3519 c-27 -17 -54 -36 -60 -42 -11 -11 58 28 96 55 40 28 17 20
-36 -13z"/>
<path d="M436 3458 c3 -4 -10 -15 -28 -24 -42 -21 -190 -114 -203 -127 -11
-11 16 4 155 88 111 67 116 71 91 71 -11 0 -17 -4 -15 -8z"/>
<path d="M140 3275 c-25 -13 -41 -24 -37 -25 11 0 87 39 87 45 0 7 0 7 -50
-20z"/>
<path d="M40 3230 c-8 -5 -10 -10 -5 -10 6 0 17 5 25 10 8 5 11 10 5 10 -5 0
-17 -5 -25 -10z"/>
<path d="M4859 3072 c13 -10 77 -33 142 -49 96 -25 119 -28 119 -17 0 17 7 14
-140 49 -63 15 -122 29 -130 32 -8 2 -4 -4 9 -15z"/>
<path d="M0 2940 c0 -17 8 -20 68 -23 l67 -3 -67 -2 -68 -2 1 -85 c0 -47 2
-85 4 -85 1 0 40 7 85 16 45 8 86 14 92 12 6 -2 -33 -12 -86 -22 -94 -18 -96
-19 -96 -46 0 -19 6 -30 18 -33 16 -4 16 -5 0 -6 -12 -1 -18 -9 -18 -26 0 -30
15 -31 88 -10 41 12 52 20 52 36 0 24 23 21 28 -4 6 -28 -33 -54 -102 -67
l-66 -14 0 -59 c0 -51 2 -58 18 -53 59 17 295 66 299 63 4 -5 -59 -21 -245
-62 l-72 -17 0 -38 0 -39 32 10 c18 5 40 9 48 8 8 -1 -5 -6 -29 -13 -25 -6
-46 -17 -49 -24 -5 -17 -3 -17 220 38 214 52 234 62 223 110 -21 87 -162 324
-237 398 -48 46 -88 62 -160 62 -41 0 -48 -3 -48 -20z m188 -55 c43 -36 208
-285 189 -285 -2 0 -25 35 -49 78 -61 104 -134 199 -167 217 -14 8 -21 14 -14
15 6 0 25 -11 41 -25z m-63 -54 c-11 -5 -40 -11 -65 -14 l-45 -6 50 14 c56 15
91 18 60 6z m108 -148 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z
m-166 -9 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m223 -63 c-8
-5 -37 -12 -65 -15 l-50 -6 50 14 c28 8 57 14 65 15 13 0 13 -1 0 -8z m120
-76 c0 -5 -5 -3 -10 5 -5 8 -10 20 -10 25 0 6 5 3 10 -5 5 -8 10 -19 10 -25z
m2 -67 c-6 -6 -7 0 -4 19 5 21 7 23 10 9 2 -10 0 -22 -6 -28z m-152 -44 c-74
-18 -142 -33 -150 -33 -20 2 240 67 265 67 11 0 -41 -15 -115 -34z"/>
<path d="M4987 2593 c3 -10 12 -27 20 -38 7 -11 13 -27 13 -36 0 -10 18 -26
43 -38 54 -26 57 -26 57 2 0 17 -12 28 -52 47 -89 43 -95 88 -7 56 28 -9 53
-15 55 -13 8 8 -75 37 -106 37 -24 0 -28 -3 -23 -17z m98 -88 c39 -17 21 -18
-25 0 -19 7 -28 14 -20 14 8 0 29 -6 45 -14z"/>
<path d="M478 2383 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M388 2363 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M208 2323 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M158 2313 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M425 2313 c-44 -10 -333 -74 -377 -84 -46 -10 -48 -12 -48 -45 0 -19
3 -34 8 -34 4 0 88 18 187 39 190 41 273 56 265 48 -3 -2 -107 -26 -232 -53
-151 -32 -228 -53 -228 -61 0 -7 4 -13 8 -13 5 0 9 -7 9 -15 0 -8 -4 -12 -9
-9 -4 3 -8 -34 -8 -81 0 -78 2 -86 18 -81 9 3 156 37 327 76 171 40 313 75
318 79 8 8 -30 126 -57 178 -24 47 -53 63 -111 62 -27 -1 -59 -3 -70 -6z m117
-120 c10 -9 18 -25 18 -35 0 -26 -18 -58 -33 -58 -8 0 -9 3 -1 8 6 4 14 21 17
39 7 33 -3 47 -38 56 -19 4 -19 5 -1 6 11 0 28 -6 38 -16z m-74 -13 c-7 -10
-14 -17 -17 -15 -4 4 18 35 25 35 2 0 -1 -9 -8 -20z m49 -7 c-13 -3 -17 -11
-14 -24 3 -10 1 -17 -4 -13 -5 3 -9 14 -9 25 0 13 6 19 23 18 18 -1 19 -2 4
-6z m-124 -26 c3 -8 -1 -14 -9 -14 -7 0 -11 4 -8 9 3 4 0 8 -7 8 -6 0 -9 -8
-6 -20 5 -21 -7 -28 -18 -10 -8 13 13 40 30 40 7 0 15 -6 18 -13z m-218 -64
c8 -24 10 -43 6 -43 -9 0 -32 78 -30 102 1 14 1 13 24 -59z m315 23 c0 -6 -7
-1 -15 10 -8 10 -15 23 -15 28 0 6 7 1 15 -10 8 -10 15 -23 15 -28z m-207 -16
c3 -11 1 -18 -4 -14 -5 3 -9 12 -9 20 0 20 7 17 13 -6z m-40 -37 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m-113 -22 c-18 -10 -97 -25 -89
-17 5 5 73 23 94 25 6 0 3 -3 -5 -8z"/>
<path d="M68 2293 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M5025 2293 c-124 -30 -152 -134 -68 -255 14 -21 30 -38 35 -38 5 0 6
5 3 10 -3 6 21 -4 54 -22 33 -18 56 -34 51 -36 -5 -2 -27 9 -50 23 -23 15 -44
24 -47 21 -6 -6 63 -50 93 -60 20 -6 21 -3 23 62 2 58 -1 71 -20 88 -28 25
-49 67 -49 99 0 29 0 29 35 13 28 -13 32 -25 10 -30 -13 -2 -12 -6 5 -16 19
-12 20 -10 20 62 0 68 -2 74 -22 80 -25 6 -43 6 -73 -1z"/>
<path d="M18 2283 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M340 1984 c-173 -41 -321 -76 -327 -79 -8 -2 -13 -22 -13 -46 0 -40
1 -41 28 -34 210 55 441 107 494 112 81 7 154 -10 170 -41 20 -37 22 -212 4
-306 -31 -155 -43 -186 -79 -208 -26 -16 -209 -87 -362 -140 -26 -9 -27 -11
-7 -11 25 -1 344 113 379 135 40 25 53 58 79 205 19 109 24 163 20 224 -6 100
-44 265 -59 264 -7 -1 -154 -34 -327 -75z"/>
<path d="M305 1800 c-250 -65 -240 -61 -243 -97 -4 -42 13 -73 41 -73 37 0
379 97 393 112 11 11 11 18 0 40 -8 15 -12 28 -10 31 2 2 -11 2 -29 1 -17 -2
-23 -1 -12 2 26 8 44 24 25 24 -8 -1 -82 -18 -165 -40z m112 4 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-40 -10 c-3 -3 -12 -4 -19 -1 -8 3
-5 6 6 6 11 1 17 -2 13 -5z m-52 -14 c-11 -5 -27 -9 -35 -9 -9 0 -8 4 5 9 11
5 27 9 35 9 9 0 8 -4 -5 -9z m135 -21 c0 -4 -16 -10 -36 -13 -19 -4 -42 -10
-50 -13 -8 -3 -14 0 -14 7 0 6 5 8 10 5 6 -3 10 -1 10 5 0 6 5 8 10 5 17 -10
50 5 50 23 0 15 2 15 10 2 5 -8 10 -18 10 -21z m-193 5 c-3 -3 -12 -4 -19 -1
-8 3 -5 6 6 6 11 1 17 -2 13 -5z m-37 -14 c0 -5 -2 -10 -4 -10 -3 0 -8 5 -11
10 -3 6 -1 10 4 10 6 0 11 -4 11 -10z m-42 -7 c-1 -5 2 -20 6 -34 6 -21 12
-25 34 -22 23 3 24 2 7 -5 -11 -5 -33 -12 -50 -16 -28 -7 -28 -6 -11 7 18 13
18 16 3 45 -13 27 -13 32 -1 32 8 0 13 -3 12 -7z m120 -27 c36 4 36 4 7 -6
-34 -11 -55 -7 -54 12 0 9 2 10 5 1 3 -7 19 -10 42 -7z m-162 -14 c2 -8 0 -8
-3 -1 -4 8 -7 8 -13 -1 -5 -8 -9 -7 -14 5 -4 12 -1 16 11 13 9 -2 18 -9 19
-16z m-16 -45 c17 -4 14 -5 -9 -4 -26 2 -36 7 -43 27 l-8 25 17 -22 c10 -12
29 -24 43 -26z"/>
<path d="M455 1684 c-44 -14 -142 -42 -218 -63 -76 -22 -141 -42 -145 -45 -6
-7 42 -164 64 -208 8 -15 27 -34 43 -43 26 -13 35 -13 83 1 97 29 304 114 325
133 21 20 19 44 -12 219 -7 40 -27 41 -140 6z m126 -74 c9 -30 19 -73 22 -95
l6 -40 -14 33 c-8 17 -19 32 -23 32 -5 0 -21 23 -36 51 -16 28 -34 53 -41 55
-12 5 -252 -60 -263 -71 -3 -3 2 -32 11 -65 23 -81 20 -99 -3 -25 -23 69 -24
91 -9 101 27 16 277 83 304 81 26 -2 31 -7 46 -57z m-446 -40 c-3 -5 -12 -10
-18 -10 -7 0 -6 4 3 10 19 12 23 12 15 0z m299 -8 c2 -4 -5 -9 -17 -9 -17 -2
-19 0 -7 7 18 12 18 12 24 2z m-279 -32 c3 -5 1 -10 -4 -10 -6 0 -11 5 -11 10
0 6 2 10 4 10 3 0 8 -4 11 -10z m265 -2 c-14 -6 -37 -17 -52 -24 -15 -7 -30
-9 -33 -4 -3 5 16 15 42 23 57 18 78 20 43 5z m165 -47 c-2 -5 -30 -16 -62
-26 -32 -10 -98 -33 -146 -52 -49 -18 -93 -31 -97 -28 -5 3 -11 1 -15 -5 -3
-5 -14 -10 -23 -9 -12 0 -10 3 7 10 14 6 21 15 18 23 -8 20 165 77 211 69 34
-6 92 13 92 29 0 5 5 6 10 3 6 -4 8 -10 5 -14z m-380 -119 c-3 -3 -11 0 -18 7
-9 10 -8 11 6 5 10 -3 15 -9 12 -12z"/>
<path d="M5040 1602 c0 -4 18 -26 40 -47 35 -34 40 -36 40 -18 0 13 -15 30
-40 47 -22 14 -40 23 -40 18z"/>
<path d="M1100 1245 c19 -19 36 -35 39 -35 3 0 -10 16 -29 35 -19 19 -36 35
-39 35 -3 0 10 -16 29 -35z"/>
<path d="M4373 1268 c-13 -6 -23 -14 -23 -17 0 -4 19 -25 43 -46 l42 -40 -39
42 -40 42 35 15 c19 9 27 15 19 15 -8 0 -25 -5 -37 -11z"/>
<path d="M4470 1276 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M4537 1213 c48 -62 48 -60 -14 -91 l-57 -29 3 -89 c1 -49 5 -91 7
-93 2 -2 24 4 48 13 42 16 45 20 55 67 6 28 11 68 11 89 l0 39 -55 -25 c-62
-27 -65 -28 -65 -16 0 5 27 21 60 37 33 16 60 32 60 35 0 9 -69 100 -76 100
-3 0 7 -17 23 -37z"/>
<path d="M880 1186 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M940 1116 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M1000 1046 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M4581 926 c-13 -74 -8 -163 9 -137 11 19 32 5 168 -104 64 -52 120
-91 124 -89 4 3 8 1 8 -5 0 -5 28 -29 63 -53 34 -24 86 -61 115 -82 l53 -39
-2 72 c-1 39 -4 69 -7 67 -2 -3 -15 8 -29 25 -24 28 -51 41 -37 17 5 -9 2 -9
-9 1 -20 16 -23 25 -4 15 6 -4 3 2 -7 14 -23 26 -45 30 -25 5 13 -16 12 -17
-3 -4 -10 7 -16 17 -13 21 3 5 -32 39 -77 76 -71 58 -191 163 -289 251 l-25
23 -13 -74z m149 -73 c0 -8 -9 0 -50 45 l-45 47 48 -45 c26 -24 47 -45 47 -47z
m56 -45 l29 -33 -32 29 c-31 28 -38 36 -30 36 2 0 16 -15 33 -32z m64 -53 c13
-14 21 -25 18 -25 -2 0 -15 11 -28 25 -13 14 -21 25 -18 25 2 0 15 -11 28 -25z
m55 -45 c10 -11 16 -20 13 -20 -3 0 -13 9 -23 20 -10 11 -16 20 -13 20 3 0 13
-9 23 -20z m176 -137 c13 -16 12 -17 -3 -4 -17 13 -22 21 -14 21 2 0 10 -8 17
-17z"/>
<path d="M4050 966 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M4530 903 c-14 -7 -32 -11 -42 -9 -12 3 -17 -5 -20 -31 -4 -32 -3
-34 21 -28 34 9 51 23 62 53 12 31 10 32 -21 15z"/>
<path d="M4107 890 c30 -47 106 -140 114 -140 6 0 -8 21 -30 48 -57 68 -95
109 -84 92z"/>
<path d="M478 844 c-113 -36 -125 -47 -95 -88 12 -17 18 -16 118 14 57 18 107
35 112 39 11 10 -3 71 -17 70 -6 0 -59 -16 -118 -35z"/>
<path d="M555 690 c-65 -22 -79 -31 -77 -46 6 -40 84 -274 93 -280 11 -6 107
23 128 39 9 8 11 24 7 57 -9 62 -54 242 -63 251 -5 3 -44 -6 -88 -21z"/>
<path d="M1 313 l-1 -263 46 0 c33 0 45 4 41 13 -61 137 -61 136 -63 297 -2
85 -8 169 -13 185 -6 21 -10 -51 -10 -232z"/>
<path d="M1531 566 c2 -2 76 -61 164 -131 88 -71 205 -166 260 -213 68 -58 85
-70 55 -38 -71 75 -453 386 -475 386 -4 0 -6 -2 -4 -4z"/>
<path d="M4820 459 c-117 -70 -119 -73 -90 -104 29 -31 32 -31 83 4 23 15 60
37 82 48 38 20 41 20 71 4 l32 -17 -80 -48 c-77 -46 -80 -47 -105 -31 -42 28
-36 10 9 -27 55 -44 74 -54 123 -61 24 -4 32 -3 20 2 -18 7 -17 8 6 14 37 9
149 84 149 100 0 12 -112 101 -185 147 l-31 19 -84 -50z m121 4 c21 -16 39
-32 39 -37 0 -5 -10 0 -22 11 -13 11 -34 27 -48 36 -13 10 -21 17 -16 17 4 0
25 -12 47 -27z"/>
<path d="M4623 383 c-30 -12 -6 -43 95 -122 131 -102 189 -133 256 -139 40 -3
61 2 95 20 25 13 47 30 49 38 4 12 1 11 -19 -1 -77 -50 -131 -44 -220 26 -60
47 -81 57 -58 28 13 -16 12 -17 -3 -4 -10 7 -16 17 -13 21 4 7 -159 142 -168
139 -1 0 -8 -3 -14 -6z"/>
<path d="M141 349 c-2 -32 38 -166 69 -237 37 -82 61 -99 28 -19 -12 28 -38
102 -59 162 -21 61 -38 103 -38 94z"/>
<path d="M5089 294 c-7 -8 -33 -26 -58 -39 -25 -13 -41 -24 -36 -24 13 -1 112
56 120 69 10 16 -11 12 -26 -6z"/>
<path d="M5082 108 c-35 -22 -39 -28 -19 -28 16 1 63 37 57 44 -3 3 -20 -4
-38 -16z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 878 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 864 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 873 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 875 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 921 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 KiB

View File

@ -185,7 +185,7 @@
<td class="align-items-start white-space-nowrap pe-2"> <td class="align-items-start white-space-nowrap pe-2">
{% if bill_item.po_model_id %} {% if bill_item.po_model_id %}
<a class="btn btn-sm btn-phoenix-primary" <a class="btn btn-sm btn-phoenix-primary"
href="{% url 'purchase_order_detail' request.dealer.slug bill_item.po_model_id %}"> href="{% url 'purchase_order_detail' request.dealer.slug request.dealer.entity.slug bill_item.po_model_id %}">
{% trans 'View PO' %} {% trans 'View PO' %}
</a> </a>
{% endif %} {% endif %}

View File

@ -219,7 +219,7 @@
</button> </button>
{% endif %} {% endif %}
<!-- Mark as Approved --> <!-- Mark as Approved -->
{% if bill.can_approve %} {% if bill.can_approve and perms.django_ledger.can_approve_bill %}
<button class="btn btn-phoenix-success" <button class="btn btn-phoenix-success"
onclick="showPOModal('Mark as Approved', '{% url 'bill-action-mark-as-approved' dealer_slug=request.dealer.slug entity_slug=entity_slug bill_pk=bill.pk %}', 'Mark as Approved')"> onclick="showPOModal('Mark as Approved', '{% url 'bill-action-mark-as-approved' dealer_slug=request.dealer.slug entity_slug=entity_slug bill_pk=bill.pk %}', 'Mark as Approved')">
<i class="fas fa-check-circle me-2"></i>{% trans 'Mark as Approved' %} <i class="fas fa-check-circle me-2"></i>{% trans 'Mark as Approved' %}

View File

@ -72,7 +72,7 @@
{% currency_symbol %}{{ f.instance.po_total_amount | currency_format }} {% currency_symbol %}{{ f.instance.po_total_amount | currency_format }}
</span> </span>
<a class="btn btn-sm btn-phoenix-info mt-1" <a class="btn btn-sm btn-phoenix-info mt-1"
href="{% url 'purchase_order_detail' dealer_slug f.instance.po_model_id %}"> href="{% url 'purchase_order_detail' dealer_slug entity_slug f.instance.po_model_id %}">
{% trans 'View PO' %} {% trans 'View PO' %}
</a> </a>
</div> </div>

View File

@ -14,7 +14,7 @@
<div class="d-flex"> <div class="d-flex">
<div class="me-3 flex-1 mt-2"> <div class="me-3 flex-1 mt-2">
<h4 class="fs-9 text-body-emphasis">{{ _("System")}}:</h4> <h4 class="fs-9 text-body-emphasis">{{ _("System")}}:</h4>
{% if not notification.is_read %} {% if notification.is_read %}
<p class="fs-9 text-body-highlight"><span class="far fa-envelope text-success-dark fs-8 me-1"></span><span class="me-1">{{ notification.message|safe }}</span> <span class="ms-2 text-body-tertiary text-opacity-85 fw-bold fs-10 text-end">{{ notification.created|timesince }}</span></p> <p class="fs-9 text-body-highlight"><span class="far fa-envelope text-success-dark fs-8 me-1"></span><span class="me-1">{{ notification.message|safe }}</span> <span class="ms-2 text-body-tertiary text-opacity-85 fw-bold fs-10 text-end">{{ notification.created|timesince }}</span></p>
{% else %} {% else %}
<p class="fs-9 text-body-highlight"><span class="far fa-envelope-open text-danger-dark fs-8 me-1"></span><span>{{ notification.message|safe }}</span> <span class="ms-2 text-body-tertiary text-opacity-85 fw-bold fs-10 text-end">{{ notification.created|timesince }}</span></p> <p class="fs-9 text-body-highlight"><span class="far fa-envelope-open text-danger-dark fs-8 me-1"></span><span>{{ notification.message|safe }}</span> <span class="ms-2 text-body-tertiary text-opacity-85 fw-bold fs-10 text-end">{{ notification.created|timesince }}</span></p>
@ -48,7 +48,5 @@
<p>No notifications found.</p> <p>No notifications found.</p>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -77,12 +77,13 @@
</div> </div>
</div> </div>
</div> </div>
{% if perms.inventory.add_opportunity %}
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<a class="btn btn-phoenix-primary btn-sm" href="{% url 'opportunity_create' request.dealer.slug %}"> <a class="btn btn-phoenix-primary btn-sm" href="{% url 'opportunity_create' request.dealer.slug %}">
<span class="fas fa-plus me-2"></span>{{ _("Add Opportunity") }} <span class="fas fa-plus me-2"></span>{{ _("Add Opportunity") }}
</a> </a>
</div> </div>
{% endif %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -37,7 +37,7 @@
</div> </div>
<div class="col-6 col-md-4 col-xxl-2 text-center border-translucent border-start-xxl border-end-xxl-0 border-bottom-xxl-0 border-end border-bottom pb-4 pb-xxl-0 "> <div class="col-6 col-md-4 col-xxl-2 text-center border-translucent border-start-xxl border-end-xxl-0 border-bottom-xxl-0 border-end border-bottom pb-4 pb-xxl-0 ">
<span class="uil fs-5 lh-1 uil-receipt-alt text-secondary"></span> <span class="uil fs-5 lh-1 uil-receipt-alt text-secondary"></span>
<a href="{% url 'purchase_order_list' request.dealer.slug %}"><h4 class="fs-6 pt-3">{{ purchase_orders }}</h4></a> <a href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}"><h4 class="fs-6 pt-3">{{ purchase_orders }}</h4></a>
<p class="fs-9 mb-0">{{ _("Purchase Orders")}}</p> <p class="fs-9 mb-0">{{ _("Purchase Orders")}}</p>
</div> </div>
</div> </div>

View File

@ -1,5 +1,6 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load custom_filters %}
{% load render_table from django_tables2 %} {% load render_table from django_tables2 %}
{% block title %}{% trans "Groups" %}{% endblock title %} {% block title %}{% trans "Groups" %}{% endblock title %}
@ -32,7 +33,7 @@
{% for group in groups %} {% for group in groups %}
<tr> <tr>
<td class="align-middle white-space-nowrap ps-1">{{ group.name }}</td> <td class="align-middle white-space-nowrap ps-1">{{ group.name }}</td>
<td class="align-middle white-space-nowrap"><i class="fa-solid fa-users me-1"></i> {{ group.users.count }}</td> <td class="align-middle white-space-nowrap"><i class="fa-solid fa-users me-1"></i> {{ group.users.count}}</td>
<td class="align-middle white-space-nowrap"><i class="fa-solid fa-unlock me-1"></i> {{ group.permissions.count }}</td> <td class="align-middle white-space-nowrap"><i class="fa-solid fa-unlock me-1"></i> {{ group.permissions.count }}</td>
<td class="align-middle white-space-nowrap"> <td class="align-middle white-space-nowrap">
<a class="btn btn-phoenix-success" <a class="btn btn-phoenix-success"

View File

@ -16,18 +16,35 @@
{{ _("Add Permissions") }} {{ _("Add Permissions") }}
{% endif %} {% endif %}
</h3> </h3>
<div class="badge bg-primary rounded-pill">
{{ group_permission_ids|length }} {% trans "permissions assigned" %}
</div>
</div> </div>
</div> </div>
</div> </div>
<form method="post" novalidate> <form method="post" novalidate>
{% csrf_token %} {% csrf_token %}
<!-- Permissions Grid --> <div class="row mb-4">
<div class="col-md-6">
<div class="input-group">
<span class="input-group-text"><i class="fas fa-search"></i></span>
<input type="text" class="form-control" id="permissionSearch"
placeholder="{% trans 'Search permissions...' %}">
</div>
</div>
<div class="col-md-6">
<div class="alert alert-info py-2 mb-0">
<i class="fas fa-info-circle me-2"></i>
{% trans "Checked items are currently assigned permissions" %}
</div>
</div>
</div>
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4" id="permissionsGrid"> <div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4" id="permissionsGrid">
{% for app_label, models in form.grouped_permissions.items %} {% for app_label, models in grouped_permissions.items %}
<div class="col"> <div class="col"> {# This div opens for each app_label #}
<div class="card h-100 border-{% if app_label in group_permission_apps %}primary{% else %}light{% endif %}"> <div class="card h-100 border-{% if app_label in group_permission_apps %}primary{% else %}light{% endif %}">
<div class="card-header bg-{% if app_label in group_permission_apps %}primary text-white{% else %}light{% endif %}"> <div class="card-header bg-{% if app_label in group_permission_apps %}primary text-white{% else %}light{% endif %}">
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
@ -36,43 +53,51 @@
{{ app_label|capfirst }} {{ app_label|capfirst }}
</h5> </h5>
<span class="badge bg-{% if app_label in group_permission_apps %}light text-primary{% else %}secondary{% endif %}"> <span class="badge bg-{% if app_label in group_permission_apps %}light text-primary{% else %}secondary{% endif %}">
{{ models|length }} {% trans "models" %} {{ models|length }} {% trans "categories" %}
</span> </span>
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="accordion"> <div class="accordion" id="accordion-{{ app_label|slugify }}">
{% for model, perms in models.items %} {% for model, perms in models.items %}
<div class="accordion-item border-0"> <div class="accordion-item border-0 mb-2">
<h6 class="accordion-header" id="heading-{{ app_label|slugify }}-{{ model|slugify }}"> <h6 class="accordion-header" id="heading-{{ app_label|slugify }}-{{ model|slugify }}">
<button class="accordion-button collapsed bg-white shadow-none py-2" <button class="accordion-button collapsed bg-white shadow-none py-2"
type="button" type="button"
data-bs-toggle="collapse" data-bs-toggle="collapse"
data-bs-target="#collapse-{{ app_label|slugify }}-{{ model|slugify }}" data-bs-target="#collapse-{{ app_label|slugify }}-{{ model|slugify }}"
aria-expanded="false"> aria-expanded="false"
<i class="fas fa-table me-2"></i>{{ model|capfirst }} aria-controls="collapse-{{ app_label|slugify }}-{{ model|slugify }}">
<i class="fas fa-{% if model == 'Custom' %}star{% else %}table{% endif %} me-2"></i>
{{ model|capfirst }}
<span class="badge bg-{% if model in group_permission_models %}primary{% else %}secondary{% endif %} rounded-pill ms-2"> <span class="badge bg-{% if model in group_permission_models %}primary{% else %}secondary{% endif %} rounded-pill ms-2">
{{ perms|length }} / {{ perms|count_checked }} {# This is where you might need the custom filter 'count_checked' #}
{{ perms|length }} / {{ perms|count_checked:group_permission_ids }}
</span> </span>
</button> </button>
</h6> </h6>
<div id="collapse-{{ app_label|slugify }}-{{ model|slugify }}" <div id="collapse-{{ app_label|slugify }}-{{ model|slugify }}"
class="accordion-collapse collapse" class="accordion-collapse collapse"
aria-labelledby="heading-{{ app_label|slugify }}-{{ model|slugify }}"> aria-labelledby="heading-{{ app_label|slugify }}-{{ model|slugify }}"
<div class="accordion-body pt-0"> data-bs-parent="#accordion-{{ app_label|slugify }}">
<div class="accordion-body pt-0 px-0">
<div class="list-group list-group-flush"> <div class="list-group list-group-flush">
{% for perm in perms %} {% for perm in perms %}
<label class="list-group-item d-flex gap-2 {% if perm.is_checked %}bg-light-primary{% endif %}"> <label class="list-group-item d-flex gap-2 {% if perm.id in group_permission_ids %}bg-light-primary{% endif %}">
<input class="form-check-input flex-shrink-0 mt-0" <input class="form-check-input flex-shrink-0 mt-0"
type="checkbox" type="checkbox"
name="permissions" name="permissions"
value="{{ perm.id }}" value="{{ perm.id }}"
id="perm_{{ perm.id }}" id="perm_{{ perm.id }}"
{% if perm.is_checked %}checked{% endif %}> {% if perm.id in group_permission_ids %}checked{% endif %}>
<span> <span>
<span class="d-block fw-bold">{{ perm.name|capfirst }}</span> <span class="d-block fw-bold">{{ perm.name|capfirst }}</span>
<small class="d-block text-muted">{{ perm.codename }}</small> <small class="d-block text-muted">{{ perm.codename }}</small>
{% if perm.is_checked %} {% if model == 'Custom' %}
<span class="badge bg-info mt-1">
<i class="fas fa-star me-1"></i>{% trans "Custom" %}
</span>
{% elif perm.id in group_permission_ids %}
<span class="badge bg-success mt-1"> <span class="badge bg-success mt-1">
<i class="fas fa-check me-1"></i>{% trans "Assigned" %} <i class="fas fa-check me-1"></i>{% trans "Assigned" %}
</span> </span>
@ -84,35 +109,31 @@
</div> </div>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<div class="row mt-4">
<div class="row mt-4 mb-4">
<div class="col"> <div class="col">
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
<div> <div>
<span class="badge bg-primary rounded-pill me-2"> <span class="badge bg-primary rounded-pill me-2">
{{ group.permissions.count }} {% trans "selected" %} {{ group_permission_ids|length }} {% trans "selected" %}
</span> </span>
<span class="text-muted"> <span class="text-muted">
{% trans "Permissions will be updated immediately" %} {% trans "Permissions will be updated immediately" %}
</span> </span>
</div> </div>
<div> <div>
<a href="{% url 'group_detail' request.dealer.slug group.pk %}"
class="btn btn-outline-secondary me-2"> <button type="submit" class="btn btn-primary me-2">
<i class="fas fa-ban me-2"></i>{% trans "Cancel" %} <i class="fas fa-save me-1"></i>{% trans "Save Changes" %}
</a>
<button type="submit" class="btn btn-primary">
<i class="fas fa-save me-2"></i>{% trans "Save Changes" %}
</button> </button>
<a href="{% url 'group_detail' request.dealer.slug group.pk %}" class="btn btn-phoenix-secondary "><i class="fa-solid fa-ban"></i> {% trans "Cancel"|capfirst %}</a>
</div> </div>
</div> </div>
</div> </div>
@ -127,31 +148,59 @@
.list-group-item:hover { .list-group-item:hover {
background-color: rgba(0, 0, 0, 0.03); background-color: rgba(0, 0, 0, 0.03);
} }
.accordion-button:not(.collapsed) {
box-shadow: none;
background-color: transparent;
}
.accordion-button:focus {
box-shadow: none;
border-color: rgba(0,0,0,.125);
}
</style> </style>
<script> <script>
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
// Search functionality // Initialize all accordions
document.getElementById('permissionSearch').addEventListener('input', function(e) { document.querySelectorAll('.accordion-button').forEach(button => {
const searchTerm = e.target.value.toLowerCase(); button.addEventListener('click', function() {
document.querySelectorAll('.accordion-body .list-group-item').forEach(item => { const target = this.getAttribute('data-bs-target');
const text = item.textContent.toLowerCase(); new bootstrap.Collapse(target, {
item.style.display = text.includes(searchTerm) ? '' : 'none'; toggle: true
}); });
// Open relevant accordions
document.querySelectorAll('.accordion-collapse').forEach(collapse => {
const visibleItems = collapse.querySelectorAll('.list-group-item[style=""]');
if (visibleItems.length > 0) {
const button = document.querySelector(
`button[data-bs-target="#${collapse.id}"]`
);
if (button && !button.classList.contains('collapsed')) {
new bootstrap.Collapse(collapse, {toggle: true});
}
}
}); });
}); });
// Search functionality
const permissionSearch = document.getElementById('permissionSearch');
if (permissionSearch) {
permissionSearch.addEventListener('input', function(e) {
const searchTerm = e.target.value.toLowerCase();
let hasVisibleResults = false;
document.querySelectorAll('.accordion-body .list-group-item').forEach(item => {
const text = item.textContent.toLowerCase();
const isVisible = text.includes(searchTerm);
item.style.display = isVisible ? '' : 'none';
if (isVisible) hasVisibleResults = true;
});
// Open accordions with visible results
document.querySelectorAll('.accordion-collapse').forEach(collapse => {
const button = document.querySelector(`button[data-bs-target="#${collapse.id}"]`);
if (button) {
const hasVisible = collapse.querySelector('.list-group-item[style=""]');
const bsCollapse = bootstrap.Collapse.getInstance(collapse) ||
new bootstrap.Collapse(collapse);
if (hasVisible) {
bsCollapse.show();
} else if (!hasVisibleResults) {
bsCollapse.hide();
}
}
});
});
}
}); });
</script> </script>
{% endblock %} {% endblock %}

View File

@ -30,8 +30,9 @@
</li> </li>
</li> </li>
{% endif %} {% endif %}
<li class="nav-item">
{% if perms.inventory.view_car%}
<li class="nav-item">
<a class="nav-link" href="{% url 'inventory_stats' request.dealer.slug %}"> <a class="nav-link" href="{% url 'inventory_stats' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-car-side"></span></span><span class="nav-link-text">{% trans 'Cars'|capfirst %}</span> <span class="nav-link-icon"><span class="fas fa-car-side"></span></span><span class="nav-link-text">{% trans 'Cars'|capfirst %}</span>
@ -45,13 +46,17 @@
</div> </div>
</a> </a>
</li> </li>
<li class="nav-item"> {% endif %}
<a class="nav-link" href="{% url 'upload_cars' request.dealer.slug %}">
<div class="d-flex align-items-center"> {% if perms.inventory.add_car %}
<span class="nav-link-icon"><span class="fas fa-file-import"></span></span><span class="nav-link-text">{% trans "Bulk Upload"|capfirst %}</span> <li class="nav-item">
</div> <a class="nav-link" href="{% url 'upload_cars' request.dealer.slug %}">
</a> <div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-file-import"></span></span><span class="nav-link-text">{% trans "Bulk Upload"|capfirst %}</span>
</div>
</a>
</li> </li>
{% endif %}
</ul> </ul>
</div> </div>
</div> </div>
@ -118,7 +123,7 @@
</div> </div>
{% endif %} {% endif %}
{% if perms.django_ledger.view_customermodel %} {% if perms.inventory.view_lead %}
<div class="nav-item-wrapper"> <div class="nav-item-wrapper">
<a class="nav-link dropdown-indicator label-1" href="#nv-crm" role="button" data-bs-toggle="collapse" aria-expanded="false" aria-controls="nv-crm"> <a class="nav-link dropdown-indicator label-1" href="#nv-crm" role="button" data-bs-toggle="collapse" aria-expanded="false" aria-controls="nv-crm">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -144,6 +149,8 @@
</div> </div>
</a> </a>
</li> </li>
{% endif %}
{%if perms.inventory.view_opportunity %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'opportunity_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'opportunity_list' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -152,7 +159,7 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if perms.django_ledger.view_customermodel %} {% if perms.inventory.view_customer %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'customer_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'customer_list' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -161,6 +168,7 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if perms.inventory.view_organization %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'organization_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'organization_list' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -169,6 +177,7 @@
</a> </a>
</li> </li>
{% endif %}
{% comment %} <li class="nav-item"> {% comment %} <li class="nav-item">
<a class="nav-link" href="{% url 'representative_list' %}"> <a class="nav-link" href="{% url 'representative_list' %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -262,7 +271,7 @@
{% endif %} {% endif %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'purchase_order_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-warehouse"></span></span><span class="nav-link-text">{% trans "purchase Orders"|capfirst %}</span> <span class="nav-link-icon"><span class="fas fa-warehouse"></span></span><span class="nav-link-text">{% trans "purchase Orders"|capfirst %}</span>
</div> </div>
@ -295,10 +304,8 @@
{% comment %} <i class="fa-solid fa-chart-line"></i><span class="nav-link-text">{% trans 'Dashboard'|capfirst %}</span> {% endcomment %} {% comment %} <i class="fa-solid fa-chart-line"></i><span class="nav-link-text">{% trans 'Dashboard'|capfirst %}</span> {% endcomment %}
</div> </div>
</a> </a>
{% if request.user.is_authenticated and request.is_dealer %} {% if request.user.is_authenticated %}
<a class="nav-link" href="{% url 'entity-cf' request.user.dealer.entity.slug %}"> <a class="nav-link" href="{% url 'entity-cf' request.dealer.slug request.dealer.entity.slug %}">
{% elif request.user.is_authenticated and request.is_staff %}
<a class="nav-link" href="{% url 'entity-cf' request.user.staffmember.staff.dealer.entity.slug %}">
{% else %} {% else %}
<a class="nav-link" href="#"> <a class="nav-link" href="#">
{% endif %} {% endif %}
@ -306,10 +313,8 @@
<i class="fa-solid fa-sack-dollar"></i><span class="nav-link-text">{% trans 'Cash Flow'|capfirst %}</span> <i class="fa-solid fa-sack-dollar"></i><span class="nav-link-text">{% trans 'Cash Flow'|capfirst %}</span>
</div> </div>
</a> </a>
{% if request.user.is_authenticated and request.is_dealer %} {% if request.user.is_authenticated %}
<a class="nav-link" href="{% url 'entity-ic' request.user.dealer.entity.slug %}"> <a class="nav-link" href="{% url 'entity-ic' request.dealer.slug request.dealer.entity.slug %}">
{% elif request.user.is_authenticated and request.is_staff %}
<a class="nav-link" href="{% url 'entity-ic' request.user.staffmember.staff.dealer.entity.slug %}">
{% else %} {% else %}
<a class="nav-link" href="#"> <a class="nav-link" href="#">
{% endif %} {% endif %}
@ -317,10 +322,8 @@
<i class="fa-solid fa-sheet-plastic"></i><span class="nav-link-text">{% trans 'Income Statement'|capfirst %}</span> <i class="fa-solid fa-sheet-plastic"></i><span class="nav-link-text">{% trans 'Income Statement'|capfirst %}</span>
</div> </div>
</a> </a>
{% if request.user.is_authenticated and request.is_dealer %} {% if request.user.is_authenticated %}
<a class="nav-link" href="{% url 'entity-bs' request.user.dealer.entity.slug %}"> <a class="nav-link" href="{% url 'entity-bs' request.dealer.slug request.dealer.entity.slug %}">
{% elif request.user.is_authenticated and request.is_staff %}
<a class="nav-link" href="{% url 'entity-bs' request.user.staffmember.staff.dealer.entity.slug %}">
{% else %} {% else %}
<a class="nav-link" href="#"> <a class="nav-link" href="#">
{% endif %} {% endif %}

View File

@ -75,6 +75,7 @@
</div> </div>
{% endif %} {% endif %}
<!-- Main row --> <!-- Main row -->
{% if perms.inventory.view_car %}
<div class="row-fluid {% if car.status == 'sold' %}disabled{% endif %}"> <div class="row-fluid {% if car.status == 'sold' %}disabled{% endif %}">
<div class="row g-3 justify-content-between"> <div class="row g-3 justify-content-between">
<div class="col-lg-12 col-xl-6"> <div class="col-lg-12 col-xl-6">
@ -242,7 +243,12 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-lg-6 col-xl-6"> <div class="col-lg-6 col-xl-6">
{% if perms.inventory.view_carfinance%}
<div class="card rounded shadow d-flex align-content-center {% if car.get_transfer %}transfer{% endif %}"> <div class="card rounded shadow d-flex align-content-center {% if car.get_transfer %}transfer{% endif %}">
<p class="card-header rounded-top fw-bold">{% trans 'Financial Details' %}</p> <p class="card-header rounded-top fw-bold">{% trans 'Financial Details' %}</p>
<div class="card-body"> <div class="card-body">
@ -283,27 +289,31 @@
<th>{% trans "Total"|capfirst %}</th> <th>{% trans "Total"|capfirst %}</th>
<td>{{ car.finances.total_vat|floatformat:2 }}</td> <td>{{ car.finances.total_vat|floatformat:2 }}</td>
</tr> </tr>
{% if perms.inventory.change_carfinance%}
<tr> <tr>
<td colspan="2"> <td colspan="2">
{% if not car.get_transfer %} {% if not car.get_transfer %}
<a href="{% url 'car_finance_update' request.dealer.slug car.finances.pk %}" <a href="{% url 'car_finance_update' request.dealer.slug car.finances.pk %}" class="btn btn-phoenix-warning btn-sm mb-3">{% trans "Edit" %}</a>
class="btn btn-phoenix-warning btn-sm mb-3">{% trans "Edit" %}</a>
{% else %} {% else %}
<span class="badge bg-danger">{% trans "Cannot Edit, Car in Transfer." %}</span> <span class="badge bg-danger">{% trans "Cannot Edit, Car in Transfer." %}</span>
{% endif %} {% endif %}
</td>
</tr>
{% endif %}
{% else %} {% else %}
<p>{% trans "No finance details available." %}</p> <p>{% trans "No finance details available." %}</p>
{% if perms.inventory.add_carfinance %} {% if perms.inventory.add_carfinance %}
<a href="{% url 'car_finance_create' request.dealer.slug car.slug %}" <a href="{% url 'car_finance_create' request.dealer.slug car.slug %}"
class="btn btn-phoenix-success btn-sm mb-3">{% trans "Add" %}</a> class="btn btn-phoenix-success btn-sm mb-3">{% trans "Add" %}</a>
{% endif %} {% endif %}
</td>
</tr>
{% endif %} {% endif %}
</table> </table>
</div> </div>
</div> </div>
</div> </div>
{% endif %}
{% if perms.inventory.view_carcolors %}
<div class="card rounded shadow d-flex align-content-center mt-3 {% if car.get_transfer %}transfer{% endif %}"> <div class="card rounded shadow d-flex align-content-center mt-3 {% if car.get_transfer %}transfer{% endif %}">
<p class="card-header rounded-top fw-bold">{% trans 'Colors Details' %}</p> <p class="card-header rounded-top fw-bold">{% trans 'Colors Details' %}</p>
<div class="card-body"> <div class="card-body">
@ -332,7 +342,8 @@
style="background-color: rgb({{ car.colors.interior.rgb }})"></div> style="background-color: rgb({{ car.colors.interior.rgb }})"></div>
</td> </td>
</tr> </tr>
{% if perms.inventory.change_carcolors%}
<tr> <tr>
<td colspan="2"> <td colspan="2">
{% if not car.get_transfer %} {% if not car.get_transfer %}
@ -343,8 +354,9 @@
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
{% endif %}
{% else %} {% else %}
<tr> <tr>
<td colspan="2"> <td colspan="2">
<p>{% trans "No color details available." %}</p> <p>{% trans "No color details available." %}</p>
@ -352,7 +364,7 @@
<a class="btn btn-phoenix-success btn-sm mb-3" href="{% url 'add_color' request.dealer.slug car.slug %}">{{ _("Add Color") }}</a> <a class="btn btn-phoenix-success btn-sm mb-3" href="{% url 'add_color' request.dealer.slug car.slug %}">{{ _("Add Color") }}</a>
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
{% endif %} {% endif %}
<!--test--> <!--test-->
@ -360,7 +372,9 @@
</div> </div>
</div> </div>
</div> </div>
{% endif %}
{% if car.status != 'transfer' %} {% if car.status != 'transfer' %}
{%if perms.inventory.view_carreservation%}
<div class="card rounded shadow d-flex align-content-center mt-3"> <div class="card rounded shadow d-flex align-content-center mt-3">
<p class="card-header rounded-top fw-bold">{% trans 'Reservations Details' %}</p> <p class="card-header rounded-top fw-bold">{% trans 'Reservations Details' %}</p>
<div class="card-body"> <div class="card-body">
@ -379,6 +393,7 @@
<tr> <tr>
<td>{{ reservation.reserved_by.dealer }}</td> <td>{{ reservation.reserved_by.dealer }}</td>
<td>{{ reservation.reserved_until }}</td> <td>{{ reservation.reserved_until }}</td>
{% if perms.inventory.change_carreservation %}
<td> <td>
{% if reservation.is_active %} {% if reservation.is_active %}
<form method="post" action="{% url 'reservations' request.dealer.slug reservation.id %}"> <form method="post" action="{% url 'reservations' request.dealer.slug reservation.id %}">
@ -402,27 +417,30 @@
<span class="badge badge-phoenix badge-phoenix-danger fs-10">{% trans "Expired" %}</span> <span class="badge badge-phoenix badge-phoenix-danger fs-10">{% trans "Expired" %}</span>
{% endif %} {% endif %}
</td> </td>
{% endif %}
</tr> </tr>
{% endfor %} {% endfor %}
{% else %} {% else %}
{% if perms.inventory.add_carreservation %}
<tr> <tr>
<td> <td>
{% if perms.inventory.change_carreservation %}
<button type="button" <button type="button"
class="btn btn-sm btn-phoenix-success" class="btn btn-sm btn-phoenix-success"
data-bs-toggle="modal" data-bs-toggle="modal"
data-bs-target="#reserveModal"> data-bs-target="#reserveModal">
{% trans 'Reserve' %} {% trans 'Reserve' %}
</button> </button>
{% endif %}
</td> </td>
</tr> </tr>
</tbody> {% endif %}
{% endif %}
</tbody>
{% endif %}
</table> </table>
</div> </div>
</div> </div>
</div> </div>
{% endif %}
{% endif %} {% endif %}
<!-- Transfer Table --> <!-- Transfer Table -->
{% if car.status == 'transfer' and car.get_transfer %} {% if car.status == 'transfer' and car.get_transfer %}
@ -483,6 +501,7 @@
alt=""> alt="">
{% endif %} {% endif %}
</div> </div>
<!-- Custom Card Modal --> <!-- Custom Card Modal -->
<div class="modal fade" <div class="modal fade"
id="customCardModal" id="customCardModal"
@ -583,6 +602,7 @@
</div> </div>
</div> </div>
</div> </div>
{% endif %}
<script> <script>
document.addEventListener("DOMContentLoaded", function () { document.addEventListener("DOMContentLoaded", function () {
const csrftoken = getCookie("csrftoken"); const csrftoken = getCookie("csrftoken");

View File

@ -19,6 +19,3 @@
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -272,9 +272,13 @@
</button> </button>
<div class="dropdown-menu dropdown-menu-end py-2"> <div class="dropdown-menu dropdown-menu-end py-2">
<a class="dropdown-item" href="{% url 'car_detail' request.dealer.slug car.slug %}"> <span class="fas fa-eye me-2"></span>{{ _("View") }} </a> <a class="dropdown-item" href="{% url 'car_detail' request.dealer.slug car.slug %}"> <span class="fas fa-eye me-2"></span>{{ _("View") }} </a>
{% if perms.inventory.change_car%}
<a class="dropdown-item" href="{% url 'car_update' request.dealer.slug car.slug %}"> <span class="fas fa-edit me-2"></span>{{ _("Edit") }} </a> <a class="dropdown-item" href="{% url 'car_update' request.dealer.slug car.slug %}"> <span class="fas fa-edit me-2"></span>{{ _("Edit") }} </a>
{% endif %}
{% if perms.inventory.delete_car%}
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<a class="dropdown-item text-danger" href="{% url 'car_delete' request.dealer.slug car.slug %}"> <span class="fas fa-trash me-2"></span>{{ _("Remove") }} </a> <a class="dropdown-item text-danger" href="{% url 'car_delete' request.dealer.slug car.slug %}"> <span class="fas fa-trash me-2"></span>{{ _("Remove") }} </a>
{% endif %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -44,7 +44,7 @@
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<p><strong>{{ _("Bank Account Name") }}:</strong> {{ bank_account.name }}</p> <p><strong>{{ _("Bank Account Name") }}:</strong> {{ bank_account.name }}</p>
<p><strong>{{ _("Cash Account") }}:</strong> {{ bank_account.cash_account }}</p> <p><strong>{{ _("Cash Account") }}:</strong> {{ bank_account }}</p>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<p><strong>{{ _("Amount") }}:</strong> {{ bank_account.amount }}</p> <p><strong>{{ _("Amount") }}:</strong> {{ bank_account.amount }}</p>

View File

@ -1,90 +1,64 @@
{% load i18n static %} {% load i18n static %}
<div class="d-flex justify-content-between align-items-center mt-4 mb-3"> <div class="d-flex justify-content-between align-items-center mt-4 mb-3">
<div class="text-body-secondary"> <div class="text-body-secondary fw-bold fs-10">
{{ _("Showing") }} {{ page_obj.start_index }} {{ _("to") }} {{ page_obj.end_index }} {{ _("Showing") }} {{ page_obj.start_index }} {{ _("to") }} {{ page_obj.end_index }}
{{ _("of") }} {{ page_obj.paginator.count }} {{ _("results") }} {{ _("of") }} {{ page_obj.paginator.count }} {{ _("results") }}
</div> </div>
<nav aria-label="Page navigation"> <nav aria-label="Page navigation">
<ul class="pagination mb-0"> <ul class="pagination mb-0">
{# First Page Link #} {# First Page Link #}
{% if page_obj.has_previous %} {% if page_obj.has_previous %}
<li class="page-item rounded-md overflow-hidden"> <li class="page-item">
<a class="page-link px-3 py-2 border border-gray-300 bg-white text-blue-600 hover:bg-gray-100 transition-colors duration-200" href="?page=1{% if q %}&q={{q}}{% endif %}" aria-label="{% trans 'First' %}"> <a class="page-link" href="?page=1{% if q %}&q={{q}}{% endif %}">
<span class="fas fa-angle-double-left" aria-hidden="true"></span> <span class="fas fa-angle-double-{% if LANGUAGE_CODE == 'ar' %}right{% else %}left{% endif %}"> </span>
</a>
</a> </li>
</li> {% else %}
{% else %} <li class="page-item">
<li class="page-item disabled rounded-md overflow-hidden"> <span class="page-link">
<span class="page-link px-3 py-2 border border-gray-200 bg-gray-50 text-gray-400 cursor-not-allowed"> <span class="fas fa-chevron-{% if LANGUAGE_CODE == 'ar' %}right{% else %}left{% endif %}"> </span>
<span class="fas fa-angle-double-left" aria-hidden="true"></span> </span>
</li>
</span> {% endif %}
</li>
{% endif %}
{# Previous Page Link #} {# Previous Page Link #}
{% if page_obj.has_previous %} {% if page_obj.has_previous %}
<li class="page-item rounded-md overflow-hidden"> <li class="page-item">
<a class="page-link px-3 py-2 border border-gray-300 bg-white text-blue-600 hover:bg-gray-100 transition-colors duration-200" href="?page={{ page_obj.previous_page_number }}{% if q %}&q={{q}}{% endif %}" aria-label="{% trans 'Previous' %}"> <a class="page-link" href="?page={{ page_obj.previous_page_number }}{% if q %}&q={{q}}{% endif %}">
<span class="fas fa-chevron-left" aria-hidden="true"></span> <span class="fas fa-chevron-{% if LANGUAGE_CODE == 'ar' %}right{% else %}left{% endif %}"></span>
</a>
</a> </li>
</li> {% endif %}
{% else %}
<li class="page-item disabled rounded-md overflow-hidden">
<span class="page-link px-3 py-2 border border-gray-200 bg-gray-50 text-gray-400 cursor-not-allowed">
<span class="fas fa-chevron-left" aria-hidden="true"></span>
</span>
</li>
{% endif %}
{# Page Numbers #} {# Page Numbers #}
{% for num in page_obj.paginator.page_range %} {% for num in page_obj.paginator.page_range %}
{% if num == 1 or num == page_obj.paginator.num_pages or num >= page_obj.number|add:-2 and num <= page_obj.number|add:2 %} {% if num == 1 or num == page_obj.paginator.num_pages or num >= page_obj.number|add:-2 and num <= page_obj.number|add:2 %}
<li class="page-item {% if num == page_obj.number %}active{% endif %}"> <li class="page-item {% if num == page_obj.number %}active{% endif %}">
<a class="page-link" {% if num == page_obj.number %}aria-current="page"{% endif %} <a class="page-link" {% if num == page_obj.number %}aria-current="page"{% endif %}
href="?page={{ num }}{% if q %}&q={{q}}{% endif %}"> href="?page={{ num }}{% if q %}&q={{q}}{% endif %}">
{{ num }} {{ num }}
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{# Next Page Link #} {# Next Page Link #}
{% if page_obj.has_next %} {% if page_obj.has_next %}
<li class="page-item rounded-md overflow-hidden"> <li class="page-item">
<a class="page-link px-3 py-2 border border-gray-300 bg-white text-blue-600 hover:bg-gray-100 transition-colors duration-200" href="?page={{ page_obj.next_page_number }}{% if q %}&q={{q}}{% endif %}" aria-label="{% trans 'Next' %}"> <a class="page-link" href="?page={{ page_obj.next_page_number }}{% if q %}&q={{q}}{% endif %}">
<span class="fas fa-chevron-right" aria-hidden="true"></span> <span class="fas fa-chevron-{% if LANGUAGE_CODE == 'ar' %}left{% else %}right{% endif %}"></span>
</a>
</a> </li>
</li> {% endif %}
{% else %}
<li class="page-item disabled rounded-md overflow-hidden">
<span class="page-link px-3 py-2 border border-gray-200 bg-gray-50 text-gray-400 cursor-not-allowed">
<span class="fas fa-chevron-right" aria-hidden="true"></span>
</span>
</li>
{% endif %}
{# Last Page Link #} {# Last Page Link #}
{% if page_obj.has_next %} {% if page_obj.has_next %}
<li class="page-item rounded-md overflow-hidden"> <li class="page-item">
<a class="page-link px-3 py-2 border border-gray-300 bg-white text-blue-600 hover:bg-gray-100 transition-colors duration-200" href="?page={{ page_obj.paginator.num_pages }}{% if q %}&q={{q}}{% endif %}" aria-label="{% trans 'Last' %}"> <a class="page-link" href="?page={{ page_obj.paginator.num_pages }}{% if q %}&q={{q}}{% endif %}">
<span class="fas fa-angle-double-right" aria-hidden="true"></span> <span class="fas fa-angle-double-{% if LANGUAGE_CODE == 'ar' %}left{% else %}right{% endif %}"></span>
</a>
</a> </li>
</li> {% endif %}
{% else %} </ul>
<li class="page-item disabled rounded-md overflow-hidden"> </nav>
<span class="page-link px-3 py-2 border border-gray-200 bg-gray-50 text-gray-400 cursor-not-allowed">
<span class="fas fa-angle-double-right" aria-hidden="true"></span>
</span>
</li>
{% endif %}
</ul>
</nav>
</div> </div>

View File

@ -228,7 +228,7 @@
{% else %} {% else %}
<div class="card border-0 shadow-sm text-center py-5"> <div class="card border-0 shadow-sm text-center py-5">
<div class="card-body"> <div class="card-body">
<a href="{% url 'purchase_order_create' request.dealer.slug %}" class="text-decoration-none"> <a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}" class="text-decoration-none">
<span class="text-muted mb-3 d-inline-block">{% icon "ic:baseline-add-circle-outline" 48 %}</span> <span class="text-muted mb-3 d-inline-block">{% icon "ic:baseline-add-circle-outline" 48 %}</span>
<h3 class="h4 text-muted">{% trans 'New Purchase Order' %}</h3> <h3 class="h4 text-muted">{% trans 'New Purchase Order' %}</h3>
</a> </a>

View File

@ -17,7 +17,7 @@
</div> </div>
<a class="btn btn-phoenix-primary w-100 py-2" <a class="btn btn-phoenix-primary w-100 py-2"
href="{% url 'purchase_order_list' request.dealer.slug %}"> href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}">
<i class="fas fa-list me-2"></i>{% trans 'PO List' %} <i class="fas fa-list me-2"></i>{% trans 'PO List' %}
</a> </a>
</div> </div>

View File

@ -57,7 +57,7 @@
<button class="btn btn-phoenix-primary" data-bs-toggle="modal" data-bs-target="#POModal"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-receipt"></i> {% trans 'View Purchase Order' %}</span></button> <button class="btn btn-phoenix-primary" data-bs-toggle="modal" data-bs-target="#POModal"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-receipt"></i> {% trans 'View Purchase Order' %}</span></button>
<a href="{% url 'purchase_order_list' request.dealer.slug %}" class="btn btn-phoenix-secondary">Back to List</a> <a href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}" class="btn btn-phoenix-secondary">Back to List</a>
</div> </div>
</div> </div>

View File

@ -19,7 +19,7 @@
{{ _("Purchase Orders") |capfirst }} {{ _("Purchase Orders") |capfirst }}
</h2> </h2>
<div> <div>
<a href="{% url 'purchase_order_create' request.dealer.slug %}" <a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}"
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{{ _("Create New PO") }}</a> class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{{ _("Create New PO") }}</a>
</div> </div>
</div> </div>
@ -65,7 +65,7 @@
<div class="btn-reveal-trigger position-static"> <div class="btn-reveal-trigger position-static">
<button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button> <button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button>
<div class="dropdown-menu dropdown-menu-end py-2"> <div class="dropdown-menu dropdown-menu-end py-2">
<a href="{% url 'purchase_order_detail' request.dealer.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Purchase Order Detail' %}</a> <a href="{% url 'purchase_order_detail' request.dealer.slug request.dealer.entity.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Purchase Order Detail' %}</a>
{% if po.po_status == 'fulfilled' %} {% if po.po_status == 'fulfilled' %}
<a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'Add Inventory Items' %}</a> <a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'Add Inventory Items' %}</a>
{% else %} {% else %}

View File

@ -26,9 +26,9 @@
<button type="submit" <button type="submit"
class="btn btn-phoenix-success w-100 my-2">{% trans 'Save PO' %} class="btn btn-phoenix-success w-100 my-2">{% trans 'Save PO' %}
</button> </button>
<a href="{% url 'purchase_order_detail' request.dealer.slug po_model.uuid %}" <a href="{% url 'purchase_order_detail' request.dealer.slug request.dealer.entity.slug po_model.uuid %}"
class="btn btn-phoenix-secondary w-100 my-2">{% trans 'Back to PO Detail' %}</a> class="btn btn-phoenix-secondary w-100 my-2">{% trans 'Back to PO Detail' %}</a>
<a href="{% url 'purchase_order_list' request.dealer.slug %}" <a href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}"
class="btn btn-phoenix-info class="btn btn-phoenix-info
info w-100 my-2">{% trans 'PO List' %}</a> info w-100 my-2">{% trans 'PO List' %}</a>
</div> </div>

View File

@ -54,6 +54,7 @@
</div> </div>
<!-- ============================================--> <!-- ============================================-->
<!-- <section> begin ============================--> <!-- <section> begin ============================-->
<section class="pt-5 pb-9 bg-body-emphasis dark__bg-gray-1200 border-top"> <section class="pt-5 pb-9 bg-body-emphasis dark__bg-gray-1200 border-top">
<div class="row-small mt-3"> <div class="row-small mt-3">
<div class="d-flex justify-content-between align-items-end mb-4 mx-3"> <div class="d-flex justify-content-between align-items-end mb-4 mx-3">
@ -74,28 +75,35 @@
</div> </div>
</div> </div>
<div class="d-flex align-items-center gap-2"> <div class="d-flex align-items-center gap-2">
{% if estimate.status == 'draft' %}
<a href="{% url 'send_email' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary me-2"><span class="fa-regular fa-paper-plane me-sm-2"></span><span class="d-none d-sm-inline-block">{% trans 'Send Quotation' %}</span></a> {% if estimate.status == 'draft' %}
<button id="mark_as_sent_estimate" class="btn btn-phoenix-secondary" onclick="setFormAction('review')" data-bs-toggle="modal" data-bs-target="#confirmModal"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-check-double"></i> {% trans 'Mark As Sent' %}</span></button> {% if perms.django_ledger.change_estimatemodel %}
{% elif estimate.status == 'in_review' %} <button id="mark_as_sent_estimate" class="btn btn-phoenix-secondary" onclick="setFormAction('review')" data-bs-toggle="modal" data-bs-target="#confirmModal"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-check-double"></i> {% trans 'Mark As Review' %}</span></button>
<button id="accept_estimate" onclick="setFormAction('approved')" class="btn btn-phoenix-secondary" data-bs-toggle="modal" data-bs-target="#confirmModal"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-check-double"></i> {% trans 'Mark As Accept' %}</span></button> {% endif %}
{% elif estimate.status == 'approved' %} {% elif estimate.status == 'in_review' %}
{% if perms.django_ledger.can_approve_estimatemodel %}
<button id="accept_estimate" onclick="setFormAction('approved')" class="btn btn-phoenix-secondary" data-bs-toggle="modal" data-bs-target="#confirmModal"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-check-double"></i> {% trans 'Mark As Accept' %}</span></button>
{% endif %}
{% elif estimate.status == 'approved' %}
<a href="{% url 'send_email' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary me-2"><span class="fa-regular fa-paper-plane me-sm-2"></span><span class="d-none d-sm-inline-block">{% trans 'Send Quotation' %}</span></a>
{% if estimate.sale_orders.first %} {% if estimate.sale_orders.first %}
<!--if sale order exist--> <!--if sale order exist-->
<a href="{% url 'invoice_create' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-receipt"></i> {% trans 'Create Invoice' %}</span></a> {% if perms.djagno_ledger.add_invoice %}
<a href="{% url 'order_detail' request.dealer.slug estimate.sale_orders.first.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block">{{ _("Preview Sale Order") }}</span></a> <a href="{% url 'invoice_create' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-receipt"></i> {% trans 'Create Invoice' %}</span></a>
{% endif %}
{% else %} <a href="{% url 'order_detail' request.dealer.slug estimate.sale_orders.first.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block">{{ _("Preview Sale Order") }}</span></a>
<a href="{% url 'create_sale_order' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-file-import"></i> {% trans 'Create Sale Order' %}</span></a>
{% comment %} {% endcomment %} {% else %}
<a href="{% url 'create_sale_order' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-file-import"></i> {% trans 'Create Sale Order' %}</span></a>
{% comment %} {% endcomment %}
{% endif %} {% endif %}
{% elif estimate.status == 'completed' %} {% elif estimate.status == 'completed' %}
<a href="{% url 'order_detail' request.dealer.slug estimate.sale_orders.first.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block">{{ _("Preview Sale Order") }}</span></a> <a href="{% url 'order_detail' request.dealer.slug estimate.sale_orders.first.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block">{{ _("Preview Sale Order") }}</span></a>
<a href="{% url 'invoice_detail' request.dealer.slug estimate.invoicemodel_set.first.pk %}" class="btn btn-phoenix-primary btn-sm" type="button"><i class="fa-solid fa-receipt"></i> <a href="{% url 'invoice_detail' request.dealer.slug estimate.invoicemodel_set.first.pk %}" class="btn btn-phoenix-primary btn-sm" type="button"><i class="fa-solid fa-receipt"></i>
{{ _("View Invoice")}}</a> {{ _("View Invoice")}}</a>
{% endif %} {% endif %}
{% if estimate.can_cancel %} {% if estimate.can_cancel %}

View File

@ -2,5 +2,5 @@ from django.contrib import admin
from . import models from . import models
# Register your models here. # Register your models here.
admin.site.register(models.Tour) # admin.site.register(models.Tour)
admin.site.register(models.TourCompletion) # admin.site.register(models.TourCompletion)

View File

@ -1,66 +0,0 @@
# Generated by Django 5.2.1 on 2025-06-06 14:05
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="Tour",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=100)),
("description", models.TextField(blank=True)),
("slug", models.SlugField(unique=True)),
("tour_file", models.CharField(max_length=255)),
("is_active", models.BooleanField(default=True)),
],
),
migrations.CreateModel(
name="TourCompletion",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("completed_on", models.DateTimeField(auto_now_add=True)),
(
"tour",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="tours.tour"
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"unique_together": {("tour", "user")},
},
),
]

View File

@ -1,21 +1,21 @@
from django.db import models from django.db import models
class Tour(models.Model): # class Tour(models.Model):
name = models.CharField(max_length=100) # name = models.CharField(max_length=100)
description = models.TextField(blank=True) # description = models.TextField(blank=True)
slug = models.SlugField(unique=True) # slug = models.SlugField(unique=True)
tour_file = models.CharField(max_length=255) # tour_file = models.CharField(max_length=255)
is_active = models.BooleanField(default=True) # is_active = models.BooleanField(default=True)
#
def __str__(self): # def __str__(self):
return self.name # return self.name
#
#
class TourCompletion(models.Model): # class TourCompletion(models.Model):
tour = models.ForeignKey(Tour, on_delete=models.CASCADE) # tour = models.ForeignKey(Tour, on_delete=models.CASCADE)
user = models.ForeignKey("auth.User", on_delete=models.CASCADE) # user = models.ForeignKey("auth.User", on_delete=models.CASCADE)
completed_on = models.DateTimeField(auto_now_add=True) # completed_on = models.DateTimeField(auto_now_add=True)
#
class Meta: # class Meta:
unique_together = ("tour", "user") # unique_together = ("tour", "user")

View File

@ -2,8 +2,8 @@ from django.urls import path
from . import views from . import views
urlpatterns = [ urlpatterns = [
path("", views.tour_list, name="tour_list"), # path("", views.tour_list, name="tour_list"),
path("data/<slug:slug>/", views.get_tour_data, name="get_tour_data"), # path("data/<slug:slug>/", views.get_tour_data, name="get_tour_data"),
path("complete/<slug:slug>/", views.mark_tour_completed, name="mark_tour_complete"), # path("complete/<slug:slug>/", views.mark_tour_completed, name="mark_tour_complete"),
path("start/<slug:slug>/", views.start_tour_view, name="start_tour"), # path("start/<slug:slug>/", views.start_tour_view, name="start_tour"),
] ]

View File

@ -1,54 +1,54 @@
import os # import os
import json # import json
from django.shortcuts import render, get_object_or_404 # from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse # from django.http import JsonResponse
from django.contrib.auth.decorators import login_required # from django.contrib.auth.decorators import login_required
from django.conf import settings # from django.conf import settings
from .models import Tour, TourCompletion # from .models import Tour, TourCompletion
#
#
@login_required # @login_required
def tour_list(request): # def tour_list(request):
tours = Tour.objects.filter(is_active=True) # tours = Tour.objects.filter(is_active=True)
return render(request, "tours/tour_list.html", {"tours": tours}) # return render(request, "tours/tour_list.html", {"tours": tours})
#
#
@login_required # @login_required
def get_tour_data(request, slug): # def get_tour_data(request, slug):
tour = get_object_or_404(Tour, slug=slug, is_active=True) # tour = get_object_or_404(Tour, slug=slug, is_active=True)
#
# Check if user has already completed this tour # # Check if user has already completed this tour
completed = TourCompletion.objects.filter(tour=tour, user=request.user).exists() # completed = TourCompletion.objects.filter(tour=tour, user=request.user).exists()
#
# Load the tour data from JSON file # # Load the tour data from JSON file
tour_file_path = os.path.join( # tour_file_path = os.path.join(
settings.BASE_DIR, "static", "js", "tours", tour.tour_file # settings.BASE_DIR, "static", "js", "tours", tour.tour_file
) # )
#
try: # try:
with open(tour_file_path, "r") as f: # with open(tour_file_path, "r") as f:
tour_data = json.load(f) # tour_data = json.load(f)
except (FileNotFoundError, json.JSONDecodeError): # except (FileNotFoundError, json.JSONDecodeError):
return JsonResponse({"error": "Tour data not found or invalid"}, status=404) # return JsonResponse({"error": "Tour data not found or invalid"}, status=404)
#
return JsonResponse({"tour": tour_data, "completed": completed}) # return JsonResponse({"tour": tour_data, "completed": completed})
#
#
@login_required # @login_required
def mark_tour_completed(request, slug): # def mark_tour_completed(request, slug):
if request.method != "POST": # if request.method != "POST":
return JsonResponse({"error": "Method not allowed"}, status=405) # return JsonResponse({"error": "Method not allowed"}, status=405)
#
tour = get_object_or_404(Tour, slug=slug, is_active=True) # tour = get_object_or_404(Tour, slug=slug, is_active=True)
#
# Mark the tour as completed for this user # # Mark the tour as completed for this user
TourCompletion.objects.get_or_create(tour=tour, user=request.user) # TourCompletion.objects.get_or_create(tour=tour, user=request.user)
#
return JsonResponse({"status": "success"}) # return JsonResponse({"status": "success"})
#
#
@login_required # @login_required
def start_tour_view(request, slug): # def start_tour_view(request, slug):
tour = get_object_or_404(Tour, slug=slug, is_active=True) # tour = get_object_or_404(Tour, slug=slug, is_active=True)
# Redirect to the page where the tour should start # # Redirect to the page where the tour should start
return render(request, "tours/start_tour.html", {"tour": tour}) # return render(request, "tours/start_tour.html", {"tour": tour})

6284
uv.lock generated Normal file

File diff suppressed because it is too large Load Diff