Skip to content

Commit 16244a0

Browse files
committed
Merge remote-tracking branch 'origin/develop' into feature/smtp-rate-limit
# Conflicts: # src/Papercut.Service/Domain/SmtpServer/SmtpServerOptions.cs # src/Papercut.Service/PapercutServiceModule.cs
2 parents c36a2d8 + d8993a5 commit 16244a0

202 files changed

Lines changed: 34303 additions & 8340 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.dockerignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@
2222
**/secrets.dev.yaml
2323
**/values.dev.yaml
2424
LICENSE
25-
README.md
25+
README.md**/Web/Assets

.github/workflows/build.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ on:
2222

2323
env:
2424
DOTNET_VERSION: '10.0.x'
25+
# The service embeds the Angular UI, so packaging needs node. Kept in step
26+
# with the Dockerfile's node:22-alpine stage -- the container build and the
27+
# Windows build must not compile the UI with different toolchains.
28+
NODE_VERSION: '26.x'
2529
CONFIGURATION: Release
2630

2731
jobs:
@@ -43,6 +47,13 @@ jobs:
4347
with:
4448
dotnet-version: ${{ env.DOTNET_VERSION }}
4549

50+
- name: Setup Node.js
51+
uses: actions/setup-node@v4
52+
with:
53+
node-version: ${{ env.NODE_VERSION }}
54+
cache: npm
55+
cache-dependency-path: src/Papercut.Service/Web/package-lock.json
56+
4657
- name: Install GitVersion
4758
uses: gittools/actions/gitversion/setup@v4.1.0
4859
with:

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,14 @@ src/Papercut.UI/Releases
2424
publish
2525
Releases
2626
.angular
27+
src/Papercut.Service/Web/dist
2728
settings.local.json
2829
TestResults/
2930
.DS_Store
3031

3132
# MkDocs build output
3233
site/
3334
.playwright-mcp
35+
36+
# Angular build output (generated by MSBuild via npm; embedded at build time)
37+
src/Papercut.Service/Web/Assets/

Claude.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@ The solution is organized into several projects with clear separation of concern
2525
- WebView2 for HTML email rendering
2626
- ReactiveUI for reactive programming patterns
2727

28-
- **Papercut.Service** - Windows Service/HTTP server for receiving emails (net8.0)
28+
- **Papercut.Service** - Windows Service/HTTP server for receiving emails (net10.0)
2929
- ASP.NET Core based with embedded web UI
30-
- AngularJS web interface (embedded in Web/Assets/)
31-
- ElectronNET.API integration
30+
- Angular web interface (source in Web/, built into Web/Assets/)
3231
- Can run independently of the desktop UI
3332
- Accessible via HTTP (default port 8080)
3433

Dockerfile

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22
USER $APP_UID
33
WORKDIR /app
44

5+
# Build the Angular web UI (output: Web/Assets, embedded by the service build)
6+
FROM node:26-alpine AS webbuild
7+
WORKDIR /web
8+
COPY src/Papercut.Service/Web/package.json src/Papercut.Service/Web/package-lock.json ./
9+
RUN npm ci
10+
COPY src/Papercut.Service/Web/ ./
11+
RUN npm run build
12+
513
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
614
ARG BUILD_CONFIGURATION=Release
715
ARG BUILD_VERSION=1.0.0.0
@@ -18,13 +26,15 @@ COPY . .
1826

1927
#RUN sed "s/\(Assembly\(Informational\|File\)Version(\d34[0-9]\+\.[0-9]\+\.[0-9]\+\.\)[0-9]\+/\1$BUILD_VERSION/" src/GlobalAssemblyInfo.cs
2028

29+
COPY --from=webbuild /web/Assets /work/src/Papercut.Service/Web/Assets
30+
2131
WORKDIR "/work/src/Papercut.Service"
2232

23-
RUN dotnet build "Papercut.Service.csproj" -c $BUILD_CONFIGURATION -o /app/build
33+
RUN dotnet build "Papercut.Service.csproj" -c $BUILD_CONFIGURATION -o /app/build /p:SkipAngularBuild=true
2434

2535
FROM build AS publish
2636
ARG BUILD_CONFIGURATION=Release
27-
RUN dotnet publish "Papercut.Service.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
37+
RUN dotnet publish "Papercut.Service.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false /p:SkipAngularBuild=true
2838

2939
FROM base AS final
3040

dotnet-install.sh

Whitespace-only changes.

examples/appsettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"SmtpSend": {
33
"Host": "127.0.0.1",
4-
"Port": 25,
4+
"Port": 2525,
55
"Security": "None",
66
"Username": null,
77
"Password": null
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
MIME-Version: 1.0
2+
From: "Freddy Marilou Marquardt Sr." <Fletcher@doggy.com>
3+
To: "you" <you@example.com>
4+
Reply-To: reply@example.com
5+
X-Priority: 5
6+
Priority: non-urgent
7+
Importance: low
8+
Date: 12 Apr 2025 17:58:29 -0400
9+
Subject: Dear Ms. Avery Renetta Stokes Fun at educator.name Campus
10+
7acef12b-b7dc-4497-950f-897b522c497d
11+
Content-Type: multipart/alternative;
12+
boundary=--boundary_0_371cd122-e889-4da4-b248-b68c63364d65
13+
14+
15+
----boundary_0_371cd122-e889-4da4-b248-b68c63364d65
16+
Content-Type: text/plain; charset=utf-8
17+
Content-Transfer-Encoding: base64
18+
19+
PGI+IERvbG9yZW1xdWUgZWEgdm9sdXB0YXRlbS4gVmVybyBlYXJ1bSBzZWQuIENvbW1v
20+
ZGkgb2ZmaWNpaXMgaW1wZWRpdC48YnIgLz5FYSBxdW8gcXVvLiBRdWlzIHNpbnQgc2lt
21+
aWxpcXVlLiBJZCBvZmZpY2lpcyBlb3MuPGJyIC8+UmVydW0gdGVuZXR1ciBjb3JydXB0
22+
aS4gTWF4aW1lIGVzdCBhbGlxdWFtLiBFdCBsYWJvcmUgbnVsbGEuPC9iPjxicj51c2lu
23+
ZyA8Yj5IVE1MPC9iPi4gPGEgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo1MTE5L3dlYXRo
24+
ZXJmb3JlY2FzdCIgdGFyZ2V0PSJfYmxhbmsiPkxvY2FsaG9zdDwvYT48YnIvPjxpbWcg
25+
c3JjPSJjaWQ6aW1hZ2UxIiAvPg==
26+
----boundary_0_371cd122-e889-4da4-b248-b68c63364d65
27+
Content-Type: multipart/related; type="text/html";
28+
boundary=--boundary_1_c4afac16-ae78-4641-b509-e0b6e9e69e99
29+
30+
31+
----boundary_1_c4afac16-ae78-4641-b509-e0b6e9e69e99
32+
Content-Type: text/html; charset=utf-8
33+
Content-Transfer-Encoding: base64
34+
35+
PGI+IEV0IGVzc2UgYWQuIEVzc2UgZXhwZWRpdGEgcXVhc2kuIERvbG9yIGNvbnNlY3Rl
36+
dHVyIHJlcnVtLjxiciAvPkVhcnVtIHF1byBpbGx1bS4gUHJvdmlkZW50IHNpdCBudW1x
37+
dWFtLiBSZXBlbGxhdCBkb2xvcmUgbm9uLjxiciAvPkludmVudG9yZSBpcHNhbSBhc3N1
38+
bWVuZGEuIEFuaW1pIGFzcGVyaW9yZXMgaXRhcXVlLiBQZXJmZXJlbmRpcyB2b2x1cHRh
39+
dGVtIGFwZXJpYW0uPC9iPg0KCQkJCTxiciAvPjxpbWcgc3JjPSJjaWQ6YjkxMzYxMGUt
40+
NGVhYi00ZmNjLTg0YTktNDRlYzkwMzNiNzEyIiBzdHlsZT0id2lkdGg6IDIwMHB4IiAv
41+
Pg==
42+
----boundary_1_c4afac16-ae78-4641-b509-e0b6e9e69e99
43+
Content-Type: image/svg+xml
44+
Content-Transfer-Encoding: base64
45+
Content-ID: <b913610e-4eab-4fcc-84a9-44ec9033b712>
46+
47+
PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5r
48+
PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHg9IjBw
49+
eCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgNTIgNjUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJu
50+
ZXcgMCAwIDUyIDUyIiB4bWw6c3BhY2U9InByZXNlcnZlIj48Zz48Zz48Zz48Zz48cGF0
51+
aCBkPSJNNDAuNzI0NDk4NywyMi43OTAxMjY4Yy0wLjQwNTIwMSwwLTAuODE0Mzk5Ny0w
52+
LjA0OTc5OS0xLjIxNzcwMS0wLjE1MDQwMDIgICAgICBjLTEuMjk2OTAxNy0wLjMyMzIw
53+
MDItMi4zODg2OTg2LTEuMTMwODAwMi0zLjA3NzIwMTgtMi4yNzYzMDA0Yy0wLjY4NzQ5
54+
NjItMS4xNDQ1OTk5LTAuODg4Njk4Ni0yLjQ4ODI5ODQtMC41NjUzOTkyLTMuNzg1MjAw
55+
MSAgICAgIGMwLjMyMzIxOTMtMS4yOTU4OTk0LDEuMTMxODAxNi0yLjM4NzY5OTEsMi4y
56+
NzczMDE4LTMuMDc2MTk5NWw0LjI4NjE5NzctMi41NzUxOTkxICAgICAgYzEuMTQ0NTAw
57+
Ny0wLjY4NzUsMi40ODgyMDExLTAuODg4NjAwMywzLjc4NDA5OTYtMC41NjU0MDAxYzEu
58+
Mjk1OTAyMywwLjMyMzE5OTMsMi4zODc3MDI5LDEuMTMxNzk5NywzLjA3NjIwMjQsMi4y
59+
Nzc0ICAgICAgYzAuNjg3NSwxLjE0NDQ5OTgsMC44ODg2OTg2LDIuNDg4MTk5MiwwLjU2
60+
NTQxNDQsMy43ODQxMDA1Yy0wLjMyMzIxNTUsMS4yOTY4OTk4LTEuMTMwODEzNiwyLjM4
61+
ODY5ODYtMi4yNzYzMTM4LDMuMDc3MTk5OSAgICAgIGwtNC4yODYyMDE1LDIuNTc0MTk5
62+
N0M0Mi41MDI4OTkyLDIyLjU0NzkyNzksNDEuNjIwOTk4NCwyMi43OTAxMjY4LDQwLjcy
63+
NDQ5ODcsMjIuNzkwMTI2OHogTTQ0Ljk5NTk5ODQsMTIuMjEyMDI2NiAgICAgIGMtMC41
64+
MzcxMDE3LDAtMS4wNjY0MDI0LDAuMTQ1NTAwMi0xLjUzOTAwMTUsMC40Mjk3MDA5bC00
65+
LjI4NjE5NzcsMi41NzUxOTkxICAgICAgYy0wLjY4NjUwMDUsMC40MTIxMDA4LTEuMTcx
66+
OTAxNywxLjA2ODMwMDItMS4zNjUyLDEuODQ1NzAxMmMtMC4xOTQzMDE2LDAuNzc3Mjk5
67+
OS0wLjA3NDE4NDQsMS41ODM5OTk2LDAuMzM4ODk3NywyLjI3MTQ5OTYgICAgICBjMC40
68+
MTIxMDE3LDAuNjg2NDk4NiwxLjA2ODMwMjIsMS4xNzA5MDAzLDEuODQ1Njk5MywxLjM2
69+
NTJjMC43NzczMDE4LDAuMTk0Mjk5NywxLjU4MzAwMDIsMC4wNzMyMDAyLDIuMjcxNDAw
70+
NS0wLjMzOTc5OTkgICAgICBsNC4yODYyMDE1LTIuNTc0MzAwOGMwLjY4NjUwMDUtMC40
71+
MTIwOTk4LDEuMTcwODk4NC0xLjA2ODMwMDIsMS4zNjUyLTEuODQ1NzAwMyAgICAgIGMw
72+
LjE5MzQxNjYtMC43NzcyOTk5LDAuMDczMjk5NC0xLjU4Mzk5OTYtMC4zMzk4MDE4LTIu
73+
MjcxNDk5NmMtMC40MTIwOTc5LTAuNjg2NDk5Ni0xLjA2ODM5NzUtMS4xNzE3OTk3LTEu
74+
ODQ1Njk5My0xLjM2NTIgICAgICBDNDUuNDg1Mjk4MiwxMi4yNDIzMjY3LDQ1LjI0MDE5
75+
NjIsMTIuMjEyMDI2Niw0NC45OTU5OTg0LDEyLjIxMjAyNjZ6Ii8+PC9nPjxnPjxyZWN0
76+
IHg9IjcuNDg5NTkwMiIgeT0iMzAuMDAyMDc5IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjg1
77+
NzQwMzggLTAuNTE0NjQ0MyAwLjUxNDY0NDMgMC44NTc0MDM4IC0xMi4xNzc3MTkxIDE4
78+
LjA1MzUyOTcpIiB3aWR0aD0iMzguMDAwMTI1OSIgaGVpZ2h0PSIxLjk5OTk5NTQiLz48
79+
L2c+PC9nPjxnPjxnPjxwYXRoIGQ9Ik00NC45OTMwOTkyLDQxLjc4OTEyNzNjLTAuODk2
80+
NTAzNCwwLTEuNzc4MzAxMi0wLjI0MzA5OTItMi41NjU0MDMtMC43MTU4MDEybC00LjI4
81+
NjE5NzctMi41NzUxOTkxICAgICAgYy0xLjE0NTUwMDItMC42ODg0OTk1LTEuOTU0MDgy
82+
NS0xLjc4MDIwMS0yLjI3NzMwMTgtMy4wNzYwOTk0Yy0wLjMyMzI5OTQtMS4yOTY5MDE3
83+
LTAuMTIyMDk3LTIuNjQwNzAxMywwLjU2NTM5OTItMy43ODUyMDAxICAgICAgYzAuNjg4
84+
NTAzMy0xLjE0NTUwMDIsMS43ODAzMDAxLTEuOTUzMTAwMiwzLjA3NzIwMTgtMi4yNzYz
85+
OTk2YzEuMjk0ODk5LTAuMzI0MjAxNiwyLjYzOTYxNzktMC4xMjIwMDE2LDMuNzg0MDk5
86+
NiwwLjU2NTQ5ODQgICAgICBsNC4yODYyMDE1LDIuNTc1MTk5MWMxLjE0NTUwMDIsMC42
87+
ODg0MDAzLDEuOTUzMDk4MywxLjc4MDIwMSwyLjI3NjMxMzgsMy4wNzYxMDMyICAgICAg
88+
YzAuMzIzMjg0MSwxLjI5NTg5ODQsMC4xMjIwODU2LDIuNjM5Njk4LTAuNTY1NDE0NCwz
89+
Ljc4NDE5ODhjLTAuNjg4NDk5NSwxLjE0NTUwMDItMS43ODAzMDAxLDEuOTU0MTAxNi0z
90+
LjA3NjIwMjQsMi4yNzc0MDEgICAgICBDNDUuODA3NDk4OSw0MS43MzkzMjY1LDQ1LjM5
91+
OTI5NTgsNDEuNzg5MTI3Myw0NC45OTMwOTkyLDQxLjc4OTEyNzN6IE00MC43MjA1OTYz
92+
LDMxLjIxMTAyNzEgICAgICBjLTAuMjQzMDk5MiwwLTAuNDg4MzAwMywwLjAyOTMwMDct
93+
MC43MzA0MDAxLDAuMDg5ODk5MWMtMC43NzczOTcyLDAuMTk0MzAxNi0xLjQzMzU5NzYs
94+
MC42Nzg3MDE0LTEuODQ1Njk5MywxLjM2NTIgICAgICBjLTAuNDEzMDgyMSwwLjY4NzUt
95+
MC41MzMxOTkzLDEuNDk0MTAyNS0wLjMzODg5NzcsMi4yNzE0OTk2YzAuMTkzMjk4Myww
96+
Ljc3NzMwMTgsMC42Nzg2OTk1LDEuNDMzNjAxNCwxLjM2NTIsMS44NDU2OTkzICAgICAg
97+
bDQuMjg2MTk3NywyLjU3NTIwMjljMC42ODc1LDAuNDEzOTk3NywxLjQ5NTEwMTksMC41
98+
MzMxOTkzLDIuMjcwNTAwMiwwLjMzODc5ODUgICAgICBjMC43NzczMDE4LTAuMTkzMjk4
99+
MywxLjQzMzYwMTQtMC42Nzg2OTk1LDEuODQ1Njk5My0xLjM2NTJjMC40MTMxMDEyLTAu
100+
Njg3NSwwLjUzMzIxODQtMS40OTQwOTg3LDAuMzM5ODAxOC0yLjI3MTQ5OTYgICAgICBj
101+
LTAuMTk0MzAxNi0wLjc3NzMwMTgtMC42Nzg2OTk1LTEuNDMyNTk4MS0xLjM2NTItMS44
102+
NDQ2OTk5bC00LjI4NjIwMTUtMi41NzUyMDEgICAgICBDNDEuNzg3OTk4MiwzMS4zNTY1
103+
MjczLDQxLjI1ODY5NzUsMzEuMjExMDI3MSw0MC43MjA1OTYzLDMxLjIxMTAyNzF6Ii8+
104+
PC9nPjxnPjxyZWN0IHg9IjI1LjQ4OTYzMzYiIHk9IjEuOTk4MDc3IiB0cmFuc2Zvcm09
105+
Im1hdHJpeCgwLjUxNTAwNjMgLTAuODU3MTg2NCAwLjg1NzE4NjQgMC41MTUwMDYzIC01
106+
LjE1MjAxNTcgMzIuODkwNTQxMSkiIHdpZHRoPSIyLjAwMDAzODEiIGhlaWdodD0iMzgu
107+
MDAwMTQ4OCIvPjwvZz48L2c+PC9nPjxnPjxyZWN0IHg9IjEuOTk1OTk4NyIgeT0iMjUu
108+
MDAwMTI3OCIgd2lkdGg9IjMiIGhlaWdodD0iMiIvPjwvZz48Zz48cmVjdCB4PSI3Ljk5
109+
NTk5ODQiIHk9IjI1LjAwMDEyNzgiIHdpZHRoPSIzIiBoZWlnaHQ9IjIiLz48L2c+PGc+
110+
PHJlY3QgeD0iMTMuOTk1OTk4NCIgeT0iMjUuMDAwMTI3OCIgd2lkdGg9IjMiIGhlaWdo
111+
dD0iMiIvPjwvZz48Zz48cmVjdCB4PSIxOS45OTU5OTg0IiB5PSIyNS4wMDAxMjc4IiB3
112+
aWR0aD0iMyIgaGVpZ2h0PSIyIi8+PC9nPjxnPjxyZWN0IHg9IjI1Ljk5NTk5ODQiIHk9
113+
IjI1LjAwMDEyNzgiIHdpZHRoPSIzIiBoZWlnaHQ9IjIiLz48L2c+PGc+PHJlY3QgeD0i
114+
MzEuOTk1OTk4NCIgeT0iMjUuMDAwMTI3OCIgd2lkdGg9IjMiIGhlaWdodD0iMiIvPjwv
115+
Zz48L2c+PC9zdmc+
116+
----boundary_1_c4afac16-ae78-4641-b509-e0b6e9e69e99--
117+
118+
----boundary_0_371cd122-e889-4da4-b248-b68c63364d65--
119+
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
MIME-Version: 1.0
2+
From: "Jayda Sanda O'Kon" <Nathaniel@doggy.com>
3+
To: "you" <you@example.com>
4+
Reply-To: reply@example.com
5+
X-Priority: 5
6+
Priority: non-urgent
7+
Importance: low
8+
Date: 12 Apr 2025 17:59:09 -0400
9+
Subject: Dear Miss Rosetta Denis Hauck Fun at educator.name Campus
10+
9a4af432-82af-4650-85c3-d6942426cdd9
11+
Content-Type: multipart/alternative;
12+
boundary=--boundary_2_ad556c43-d9d7-4efb-8936-a058e96fee50
13+
14+
15+
----boundary_2_ad556c43-d9d7-4efb-8936-a058e96fee50
16+
Content-Type: text/plain; charset=utf-8
17+
Content-Transfer-Encoding: base64
18+
19+
PGI+IEVvcyBsYWJvcnVtIGltcGVkaXQuIEV0IGRvbG9yIGV0LiBWZXJpdGF0aXMgcXVp
20+
cyBxdWlzLjxiciAvPkFsaXF1aWQgc2l0IGRlc2VydW50LiBTdW50IGV4ZXJjaXRhdGlv
21+
bmVtIG5vbi4gUmVwZWxsZW5kdXMgdW5kZSBhcmNoaXRlY3RvLjxiciAvPk5paGlsIHF1
22+
byBjb3JydXB0aS4gUmVwcmVoZW5kZXJpdCB0ZW1wb3JpYnVzIGFsaXF1aWQuIFZvbHVw
23+
dGF0ZXMgdm9sdXB0YXMgbmVjZXNzaXRhdGlidXMuPC9iPjxicj51c2luZyA8Yj5IVE1M
24+
PC9iPi4gPGEgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo1MTE5L3dlYXRoZXJmb3JlY2Fz
25+
dCIgdGFyZ2V0PSJfYmxhbmsiPkxvY2FsaG9zdDwvYT48YnIvPjxpbWcgc3JjPSJjaWQ6
26+
aW1hZ2UxIiAvPg==
27+
----boundary_2_ad556c43-d9d7-4efb-8936-a058e96fee50
28+
Content-Type: multipart/related; type="text/html";
29+
boundary=--boundary_3_45082488-7810-4776-9b35-7aa5b471d6ee
30+
31+
32+
----boundary_3_45082488-7810-4776-9b35-7aa5b471d6ee
33+
Content-Type: text/html; charset=utf-8
34+
Content-Transfer-Encoding: base64
35+
36+
PGI+IEl0YXF1ZSBvZGl0IG1haW9yZXMuIEF1dGVtIGlwc3VtIGF1dC4gTmVtbyBmdWdp
37+
YXQgaXBzdW0uPGJyIC8+SXBzYSBkb2xvciBtaW51cy4gRXQgaGFydW0gc2FwaWVudGUu
38+
IEZhY2VyZSBxdWFzaSBzb2x1dGEuPGJyIC8+RG9sb3JlcyBkb2xvcmUgdmVyby4gUXVv
39+
cyBuaWhpbCBlbmltLiBFeCBxdWkgY3VtcXVlLjwvYj4NCgkJCQk8YnIgLz48aW1nIHNy
40+
Yz0iY2lkOmY2NmFlYTcxLTNjM2YtNDIzMS05MWJjLWMyZDYzYzZmZTgyNSIgc3R5bGU9
41+
IndpZHRoOiAyMDBweCIgLz4=
42+
----boundary_3_45082488-7810-4776-9b35-7aa5b471d6ee
43+
Content-Type: image/svg+xml
44+
Content-Transfer-Encoding: base64
45+
Content-ID: <f66aea71-3c3f-4231-91bc-c2d63c6fe825>
46+
47+
PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5r
48+
PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHg9IjBw
49+
eCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgNTIgNjUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJu
50+
ZXcgMCAwIDUyIDUyIiB4bWw6c3BhY2U9InByZXNlcnZlIj48Zz48Zz48Zz48Zz48cGF0
51+
aCBkPSJNNDAuNzI0NDk4NywyMi43OTAxMjY4Yy0wLjQwNTIwMSwwLTAuODE0Mzk5Ny0w
52+
LjA0OTc5OS0xLjIxNzcwMS0wLjE1MDQwMDIgICAgICBjLTEuMjk2OTAxNy0wLjMyMzIw
53+
MDItMi4zODg2OTg2LTEuMTMwODAwMi0zLjA3NzIwMTgtMi4yNzYzMDA0Yy0wLjY4NzQ5
54+
NjItMS4xNDQ1OTk5LTAuODg4Njk4Ni0yLjQ4ODI5ODQtMC41NjUzOTkyLTMuNzg1MjAw
55+
MSAgICAgIGMwLjMyMzIxOTMtMS4yOTU4OTk0LDEuMTMxODAxNi0yLjM4NzY5OTEsMi4y
56+
NzczMDE4LTMuMDc2MTk5NWw0LjI4NjE5NzctMi41NzUxOTkxICAgICAgYzEuMTQ0NTAw
57+
Ny0wLjY4NzUsMi40ODgyMDExLTAuODg4NjAwMywzLjc4NDA5OTYtMC41NjU0MDAxYzEu
58+
Mjk1OTAyMywwLjMyMzE5OTMsMi4zODc3MDI5LDEuMTMxNzk5NywzLjA3NjIwMjQsMi4y
59+
Nzc0ICAgICAgYzAuNjg3NSwxLjE0NDQ5OTgsMC44ODg2OTg2LDIuNDg4MTk5MiwwLjU2
60+
NTQxNDQsMy43ODQxMDA1Yy0wLjMyMzIxNTUsMS4yOTY4OTk4LTEuMTMwODEzNiwyLjM4
61+
ODY5ODYtMi4yNzYzMTM4LDMuMDc3MTk5OSAgICAgIGwtNC4yODYyMDE1LDIuNTc0MTk5
62+
N0M0Mi41MDI4OTkyLDIyLjU0NzkyNzksNDEuNjIwOTk4NCwyMi43OTAxMjY4LDQwLjcy
63+
NDQ5ODcsMjIuNzkwMTI2OHogTTQ0Ljk5NTk5ODQsMTIuMjEyMDI2NiAgICAgIGMtMC41
64+
MzcxMDE3LDAtMS4wNjY0MDI0LDAuMTQ1NTAwMi0xLjUzOTAwMTUsMC40Mjk3MDA5bC00
65+
LjI4NjE5NzcsMi41NzUxOTkxICAgICAgYy0wLjY4NjUwMDUsMC40MTIxMDA4LTEuMTcx
66+
OTAxNywxLjA2ODMwMDItMS4zNjUyLDEuODQ1NzAxMmMtMC4xOTQzMDE2LDAuNzc3Mjk5
67+
OS0wLjA3NDE4NDQsMS41ODM5OTk2LDAuMzM4ODk3NywyLjI3MTQ5OTYgICAgICBjMC40
68+
MTIxMDE3LDAuNjg2NDk4NiwxLjA2ODMwMjIsMS4xNzA5MDAzLDEuODQ1Njk5MywxLjM2
69+
NTJjMC43NzczMDE4LDAuMTk0Mjk5NywxLjU4MzAwMDIsMC4wNzMyMDAyLDIuMjcxNDAw
70+
NS0wLjMzOTc5OTkgICAgICBsNC4yODYyMDE1LTIuNTc0MzAwOGMwLjY4NjUwMDUtMC40
71+
MTIwOTk4LDEuMTcwODk4NC0xLjA2ODMwMDIsMS4zNjUyLTEuODQ1NzAwMyAgICAgIGMw
72+
LjE5MzQxNjYtMC43NzcyOTk5LDAuMDczMjk5NC0xLjU4Mzk5OTYtMC4zMzk4MDE4LTIu
73+
MjcxNDk5NmMtMC40MTIwOTc5LTAuNjg2NDk5Ni0xLjA2ODM5NzUtMS4xNzE3OTk3LTEu
74+
ODQ1Njk5My0xLjM2NTIgICAgICBDNDUuNDg1Mjk4MiwxMi4yNDIzMjY3LDQ1LjI0MDE5
75+
NjIsMTIuMjEyMDI2Niw0NC45OTU5OTg0LDEyLjIxMjAyNjZ6Ii8+PC9nPjxnPjxyZWN0
76+
IHg9IjcuNDg5NTkwMiIgeT0iMzAuMDAyMDc5IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjg1
77+
NzQwMzggLTAuNTE0NjQ0MyAwLjUxNDY0NDMgMC44NTc0MDM4IC0xMi4xNzc3MTkxIDE4
78+
LjA1MzUyOTcpIiB3aWR0aD0iMzguMDAwMTI1OSIgaGVpZ2h0PSIxLjk5OTk5NTQiLz48
79+
L2c+PC9nPjxnPjxnPjxwYXRoIGQ9Ik00NC45OTMwOTkyLDQxLjc4OTEyNzNjLTAuODk2
80+
NTAzNCwwLTEuNzc4MzAxMi0wLjI0MzA5OTItMi41NjU0MDMtMC43MTU4MDEybC00LjI4
81+
NjE5NzctMi41NzUxOTkxICAgICAgYy0xLjE0NTUwMDItMC42ODg0OTk1LTEuOTU0MDgy
82+
NS0xLjc4MDIwMS0yLjI3NzMwMTgtMy4wNzYwOTk0Yy0wLjMyMzI5OTQtMS4yOTY5MDE3
83+
LTAuMTIyMDk3LTIuNjQwNzAxMywwLjU2NTM5OTItMy43ODUyMDAxICAgICAgYzAuNjg4
84+
NTAzMy0xLjE0NTUwMDIsMS43ODAzMDAxLTEuOTUzMTAwMiwzLjA3NzIwMTgtMi4yNzYz
85+
OTk2YzEuMjk0ODk5LTAuMzI0MjAxNiwyLjYzOTYxNzktMC4xMjIwMDE2LDMuNzg0MDk5
86+
NiwwLjU2NTQ5ODQgICAgICBsNC4yODYyMDE1LDIuNTc1MTk5MWMxLjE0NTUwMDIsMC42
87+
ODg0MDAzLDEuOTUzMDk4MywxLjc4MDIwMSwyLjI3NjMxMzgsMy4wNzYxMDMyICAgICAg
88+
YzAuMzIzMjg0MSwxLjI5NTg5ODQsMC4xMjIwODU2LDIuNjM5Njk4LTAuNTY1NDE0NCwz
89+
Ljc4NDE5ODhjLTAuNjg4NDk5NSwxLjE0NTUwMDItMS43ODAzMDAxLDEuOTU0MTAxNi0z
90+
LjA3NjIwMjQsMi4yNzc0MDEgICAgICBDNDUuODA3NDk4OSw0MS43MzkzMjY1LDQ1LjM5
91+
OTI5NTgsNDEuNzg5MTI3Myw0NC45OTMwOTkyLDQxLjc4OTEyNzN6IE00MC43MjA1OTYz
92+
LDMxLjIxMTAyNzEgICAgICBjLTAuMjQzMDk5MiwwLTAuNDg4MzAwMywwLjAyOTMwMDct
93+
MC43MzA0MDAxLDAuMDg5ODk5MWMtMC43NzczOTcyLDAuMTk0MzAxNi0xLjQzMzU5NzYs
94+
MC42Nzg3MDE0LTEuODQ1Njk5MywxLjM2NTIgICAgICBjLTAuNDEzMDgyMSwwLjY4NzUt
95+
MC41MzMxOTkzLDEuNDk0MTAyNS0wLjMzODg5NzcsMi4yNzE0OTk2YzAuMTkzMjk4Myww
96+
Ljc3NzMwMTgsMC42Nzg2OTk1LDEuNDMzNjAxNCwxLjM2NTIsMS44NDU2OTkzICAgICAg
97+
bDQuMjg2MTk3NywyLjU3NTIwMjljMC42ODc1LDAuNDEzOTk3NywxLjQ5NTEwMTksMC41
98+
MzMxOTkzLDIuMjcwNTAwMiwwLjMzODc5ODUgICAgICBjMC43NzczMDE4LTAuMTkzMjk4
99+
MywxLjQzMzYwMTQtMC42Nzg2OTk1LDEuODQ1Njk5My0xLjM2NTJjMC40MTMxMDEyLTAu
100+
Njg3NSwwLjUzMzIxODQtMS40OTQwOTg3LDAuMzM5ODAxOC0yLjI3MTQ5OTYgICAgICBj
101+
LTAuMTk0MzAxNi0wLjc3NzMwMTgtMC42Nzg2OTk1LTEuNDMyNTk4MS0xLjM2NTItMS44
102+
NDQ2OTk5bC00LjI4NjIwMTUtMi41NzUyMDEgICAgICBDNDEuNzg3OTk4MiwzMS4zNTY1
103+
MjczLDQxLjI1ODY5NzUsMzEuMjExMDI3MSw0MC43MjA1OTYzLDMxLjIxMTAyNzF6Ii8+
104+
PC9nPjxnPjxyZWN0IHg9IjI1LjQ4OTYzMzYiIHk9IjEuOTk4MDc3IiB0cmFuc2Zvcm09
105+
Im1hdHJpeCgwLjUxNTAwNjMgLTAuODU3MTg2NCAwLjg1NzE4NjQgMC41MTUwMDYzIC01
106+
LjE1MjAxNTcgMzIuODkwNTQxMSkiIHdpZHRoPSIyLjAwMDAzODEiIGhlaWdodD0iMzgu
107+
MDAwMTQ4OCIvPjwvZz48L2c+PC9nPjxnPjxyZWN0IHg9IjEuOTk1OTk4NyIgeT0iMjUu
108+
MDAwMTI3OCIgd2lkdGg9IjMiIGhlaWdodD0iMiIvPjwvZz48Zz48cmVjdCB4PSI3Ljk5
109+
NTk5ODQiIHk9IjI1LjAwMDEyNzgiIHdpZHRoPSIzIiBoZWlnaHQ9IjIiLz48L2c+PGc+
110+
PHJlY3QgeD0iMTMuOTk1OTk4NCIgeT0iMjUuMDAwMTI3OCIgd2lkdGg9IjMiIGhlaWdo
111+
dD0iMiIvPjwvZz48Zz48cmVjdCB4PSIxOS45OTU5OTg0IiB5PSIyNS4wMDAxMjc4IiB3
112+
aWR0aD0iMyIgaGVpZ2h0PSIyIi8+PC9nPjxnPjxyZWN0IHg9IjI1Ljk5NTk5ODQiIHk9
113+
IjI1LjAwMDEyNzgiIHdpZHRoPSIzIiBoZWlnaHQ9IjIiLz48L2c+PGc+PHJlY3QgeD0i
114+
MzEuOTk1OTk4NCIgeT0iMjUuMDAwMTI3OCIgd2lkdGg9IjMiIGhlaWdodD0iMiIvPjwv
115+
Zz48L2c+PC9zdmc+
116+
----boundary_3_45082488-7810-4776-9b35-7aa5b471d6ee--
117+
118+
----boundary_2_ad556c43-d9d7-4efb-8936-a058e96fee50--
119+

0 commit comments

Comments
 (0)