diff --git a/404.html b/404.html index 2c2907b..b31e4c8 100644 --- a/404.html +++ b/404.html @@ -15,8 +15,8 @@ - - + +
diff --git a/assets/index-mj3lo3PB.css b/assets/index-VGcrn3wW.css similarity index 90% rename from assets/index-mj3lo3PB.css rename to assets/index-VGcrn3wW.css index d08014e..127bd9e 100644 --- a/assets/index-mj3lo3PB.css +++ b/assets/index-VGcrn3wW.css @@ -1 +1 @@ -@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:300;src:url(/fonts/Inter-Light.woff2) format("woff2"),url(/fonts/Inter-Light.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:400;src:url(/fonts/Inter-Regular.woff2) format("woff2"),url(/fonts/Inter-Regular.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:500;src:url(/fonts/Inter-Medium.woff2) format("woff2"),url(/fonts/Inter-Medium.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:600;src:url(/fonts/Inter-Bold.woff2) format("woff2"),url(/fonts/Inter-Bold.woff) format("woff")}#header[data-v-1e5ccff0]{height:64px;width:100%}#grid[data-v-1e5ccff0]{--pad: 12px;display:grid;grid-template-columns:180px 1fr 100px 100px}#name[data-v-1e5ccff0]{grid-column:1 / 2;color:var(--dark-300);line-height:64px}#work[data-v-1e5ccff0]{grid-column:3 / 4}#work[data-v-1e5ccff0],#about[data-v-1e5ccff0]{color:var(--dark-300);text-align:center;line-height:62px;transition:all .15s ease}#work[data-v-1e5ccff0]:hover,#about[data-v-1e5ccff0]:hover,#work.active[data-v-1e5ccff0],#about.active[data-v-1e5ccff0]{color:var(--blue-100);font-weight:500}@media screen and (max-width: 768px){#grid[data-v-1e5ccff0]{grid-template-columns:180px 1fr 100px}#work[data-v-1e5ccff0]{display:none}#about[data-v-1e5ccff0]{text-align:right;grid-column:3 / 4}}a[data-v-637f64df]{display:inline-grid;gap:12px;cursor:pointer;transition:all .1s ease;border-radius:var(--radius);padding:12px 24px;background-color:var(--bg-color);align-items:center}[data-v-637f64df] svg,[data-v-637f64df] img{display:inline-block;max-width:var(--size);max-height:var(--size);vertical-align:top;fill:var(--icon-color)}[data-v-637f64df] svg{width:var(--size)}[data-v-637f64df] svg path{transition:all .2s ease}a[data-v-637f64df]:hover,a[data-v-637f64df]:active{background-color:var(--bg-hover-color)}a[data-v-637f64df] svg path{fill:var(--icon-color)}.text[data-v-637f64df]{line-height:var(--size)}@media screen and (max-width: 768px){a[data-v-637f64df]{--size: 24px !important}}.wrapper[data-v-4b352d11]{background-color:var(--dark-100)}p.body2[data-v-4b352d11]{color:var(--light-200);margin-bottom:24px}h4[data-v-4b352d11],h6[data-v-4b352d11]{color:#fff}.buttons[data-v-4b352d11]{display:flex;margin-bottom:24px}.buttons *[data-v-4b352d11]{margin-right:16px}.divider[data-v-4b352d11]{height:1px;background-color:var(--dark-300)}.footer[data-v-4b352d11]{margin-top:24px;margin-bottom:24px;display:grid;grid-template-columns:repeat(3,1fr)}.body1[data-v-4b352d11],.body2[data-v-4b352d11]{color:var(--light-200)}.greylink[data-v-4b352d11]{cursor:pointer;display:block}.greylink[data-v-4b352d11]:hover,.greylink[data-v-4b352d11]:active{color:#fff}.disclaimer[data-v-4b352d11]{margin-top:24px}@media screen and (max-width: 768px){.footer[data-v-4b352d11]{display:block}}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:300;src:url(/fonts/Inter-Light.woff2) format("woff2"),url(/fonts/Inter-Light.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:400;src:url(/fonts/Inter-Regular.woff2) format("woff2"),url(/fonts/Inter-Regular.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:500;src:url(/fonts/Inter-Medium.woff2) format("woff2"),url(/fonts/Inter-Medium.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:600;src:url(/fonts/Inter-Bold.woff2) format("woff2"),url(/fonts/Inter-Bold.woff) format("woff")}:root{--font-sans: "Inter", sans-serif;--content-padding: 30px;--blue-100: #2A4A8A;--blue-200: #355DAE;--blue-300: #4070D1;--blue-400: #4B83F5;--dark-100: #1A1C21;--dark-200: #353942;--dark-300: #525866;--light-100: #E6EAF2;--light-200: #C2C5CC;--shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24);--radius: 8px;--radius-2: 16px ;--size-h1: 96px;--size-h2: 64px;--size-h3: 48px;--size-h4: 32px;--size-h5: 24px;--size-h6: 20px;--size-sub1: 16px;--size-sub2: 14px}body{font-family:var(--font-sans);color:var(--dark-100);margin:0;background:var(--light-100)}#app{display:grid;grid-template-rows:64px 1fr auto;height:100%}h1,h2,h3,h4,h5,h6{font-weight:500;color:var(--dark-100)}.regular{font-weight:400}h1,.h1{font-size:var(--size-h1);margin:112px 0 48px}h2,.h2{font-size:var(--size-h2);margin:72px 0 32px}h3,.h3{font-size:var(--size-h3);margin:60px 0 24px}h4,.h4{font-size:var(--size-h4);margin:40px 0 16px}h5,.h5{font-size:var(--size-h5);margin:32px 0 12px}h6,.h6{font-size:var(--size-h6);margin:24px 0 8px}.h1,.h2,.h3,.h4,.h5,.h6{margin:0}.subtitle1{font-size:var(--size-sub1);color:var(--dark-300)}.subtitle2{font-size:var(--size-sub2);color:var(--dark-300)}.body1{font-size:var(--size-sub1);line-height:24px;color:var(--dark-200)}.body2{font-size:var(--size-sub2);line-height:28px}.body1 p{margin:0 0 24px;line-height:32px}.body2 p{margin:6px 0;line-height:24px}.button{font-size:var(--size-sub1)}.button-lg{font-size:var(--size-h6)}@media screen and (max-width: 768px){.button-lg{font-size:var(--size-sub1)}}a{text-decoration:none;color:var(--dark-100)}p,ul,ol{max-width:700px}p{line-height:28px}ul{margin:0 0 24px}ul li,ol li{line-height:28px}.link{border-bottom:2px solid var(--blue-300)}.link:hover,.link:active{border-bottom:2px solid var(--blue-100)}.responsive{padding-left:var(--content-padding);padding-right:var(--content-padding);max-width:1220px;margin:0 auto}.cv>a[data-v-a5fc3b27]{margin-right:12px;margin-bottom:12px}#text>p[data-v-a5fc3b27]{font-size:20px;line-height:36px}.networks>a[data-v-a5fc3b27]{margin-right:12px;margin-bottom:12px}.tag[data-v-a5fc3b27]{padding:6px 12px;border-radius:var(--radius);display:inline-block;background:#fff;margin-right:8px;margin-bottom:8px}#about[data-v-a5fc3b27]{min-height:calc(100vh - 316px)}.responsive[data-v-a5fc3b27]{padding-top:48px;padding-bottom:48px}img[data-v-a5fc3b27]{width:100%;border-radius:var(--radius)}@media screen and (min-width: 768px){.responsive[data-v-a5fc3b27]{display:grid;grid-template-columns:1fr 2fr;gap:24px}h4[data-v-a5fc3b27]{margin-top:0}}.responsive[data-v-7c0f8bc3]{padding-top:64px;padding-bottom:32px}h2[data-v-7c0f8bc3],h5[data-v-7c0f8bc3]{margin:0}#name-container[data-v-7c0f8bc3]{margin-bottom:32px}#heading-container[data-v-7c0f8bc3]{display:grid;grid-template-rows:1fr 3fr;row-gap:4px;grid-auto-flow:column;max-width:700px;justify-content:space-between}@media screen and (max-width: 768px){#heading-container[data-v-7c0f8bc3]{row-gap:0px}h2[data-v-7c0f8bc3]{font-size:var(--size-h3)}h5[data-v-7c0f8bc3]{font-size:var(--size-h6)}.subtitle1[data-v-7c0f8bc3]{font-size:var(--size-sub2)}}#container[data-v-27d3b8ac]{display:block;padding-top:12px;margin-top:12px;margin-bottom:24px}.body2[data-v-27d3b8ac]{padding-top:12px;padding-bottom:12px;text-align:center;color:var(--dark-300)}.img-sm[data-v-27d3b8ac],.img-md[data-v-27d3b8ac],.img-lg[data-v-27d3b8ac]{margin-left:auto;margin-right:auto;display:block}.img-lg[data-v-27d3b8ac]{max-width:100%}@media screen and (max-width: 768px){.img-sm[data-v-27d3b8ac],.img-md[data-v-27d3b8ac]{max-width:100%}}@media screen and (min-width: 768px){.img-sm[data-v-27d3b8ac]{max-width:50%}.img-md[data-v-27d3b8ac]{max-width:70%}img.shadow[data-v-27d3b8ac],video.shadow[data-v-27d3b8ac]{-webkit-filter:drop-shadow(0 1px 3px #ccc);filter:drop-shadow(0 1px 3px #ccc)}}#projectArrows[data-v-ca97760c]{margin-top:64px;margin-bottom:64px;display:flex}#projectArrows>a[data-v-ca97760c]{font-size:var(--size-h6);color:var(--blue-200);border-radius:var(--radius);border:1px solid var(--blue-200);padding:6px 16px;background-size:200% 100%;transition:all .15s ease}#projectArrows *[data-v-ca97760c]:first-child{margin-right:8px}#projectArrows>a[data-v-ca97760c]:hover{color:#fff}svg[data-v-ca97760c] path{fill:var(--blue-200);transition:all .15s ease}.previous[data-v-ca97760c]{background:linear-gradient(to right,transparent 50%,var(--blue-200) 50%);background-position:left top}.previous[data-v-ca97760c]:hover{background-position:right top}.next[data-v-ca97760c]{background:linear-gradient(to left,transparent 50%,var(--blue-200) 50%);background-position:right top;float:right}.next>svg[data-v-ca97760c]{transform:rotate(180deg)}.next[data-v-ca97760c]:hover{background-position:left top}#projectArrows>a[data-v-ca97760c]:active{background-color:var(--blue-200);color:#fff}a:hover svg[data-v-ca97760c] path{fill:#fff}.flex-grow[data-v-ca97760c]{flex-grow:1}.tag[data-v-b0191d4a]{display:inline-block;padding:6px 12px;color:var(--light-100);border-radius:var(--radius)}.tile[data-v-d679ffa7]{background-color:var(--dark-100);border-radius:var(--radius-2);box-shadow:var(--shadow);--anim-dur: .1s;-webkit-transition:var(--anim-dur) ease;-moz-transition:var(--anim-dur) ease;-o-transition:var(--anim-dur) ease;transition:all .3s cubic-bezier(.25,.8,.25,1);color:#fff}.tile[data-v-d679ffa7]:hover{transform:scale(1.03);box-shadow:0 14px 28px #00000040,0 10px 10px #00000038}.img-container[data-v-d679ffa7]{display:inline-block;position:relative;width:100%}.img-container[data-v-d679ffa7]:after{padding-top:62.5%;display:block;content:""}img[data-v-d679ffa7]{position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:100%;object-fit:cover;border-radius:var(--radius-2) var(--radius-2) 0px 0px}.text[data-v-d679ffa7]{margin:24px 24px 48px}.h5[data-v-d679ffa7]{margin-bottom:16px}.text>.body1[data-v-d679ffa7]{color:var(--blue);padding:4px 8px;border-radius:var(--radius-2);border:1px solid var(--blue);display:inline-block}.tags div[data-v-d679ffa7]{margin-right:16px}@media screen and (max-width: 768px){.h5[data-v-d679ffa7]{font-size:var(--size-h6)}.text>.body1[data-v-d679ffa7]{font-size:var(--size-sub2)}}.responsive[data-v-29f0a935]{display:grid;grid-template-columns:1fr 1fr;margin-top:72px;gap:24px;align-items:end}img[data-v-29f0a935]{max-width:100%}.text[data-v-29f0a935]{margin:auto 0;display:grid;gap:24px}.text .body1[data-v-29f0a935]{color:var(--dark-200)}.buttons[data-v-29f0a935]{display:flex}.buttons a[data-v-29f0a935]:first-child{margin-right:24px}@media screen and (max-width: 768px){img[data-v-29f0a935]{margin-top:24px;margin-bottom:-5px;max-width:80%}.responsive[data-v-29f0a935]{display:block;margin-top:32px}.h2[data-v-29f0a935]{font-size:var(--size-h3)}}.h5[data-v-fa8148d2]{color:#fff;margin:auto 0}.body1[data-v-fa8148d2]{color:var(--light-200)}.grid[data-v-fa8148d2]{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}.wrapper[data-v-fa8148d2]{background-color:var(--dark-100);padding-top:48px;padding-bottom:72px;fill:#fff}.tile[data-v-fa8148d2]{padding:24px;display:grid;grid-template-rows:2fr 1fr 2fr}.tile svg[data-v-fa8148d2]{margin:auto 0}@media screen and (max-width: 768px){.tile[data-v-fa8148d2]{grid-template-rows:auto;gap:16px}.wrapper[data-v-fa8148d2]{padding-top:32px;padding-bottom:64px}.grid[data-v-fa8148d2]{grid-template-columns:1fr;gap:0}}h4[data-v-df1f4932]{margin-bottom:32px}.grid[data-v-df1f4932]{display:grid;grid-template-columns:1fr;gap:32px;margin-bottom:100px}@media screen and (min-width: 768px){.grid[data-v-df1f4932]{grid-template-columns:repeat(2,1fr)}}#content[data-v-bf488d2e]{padding-bottom:24px}img[data-v-bf488d2e]{vertical-align:middle}#PageNotFound[data-v-f2755a3c]{padding-top:50px}h2[data-v-b94896ed]{font-size:14px;font-weight:700;color:var(--dark-100);margin:0 0 4px}p[data-v-b94896ed]{margin:0 0 24px}#download[data-v-b94896ed]{display:inline-block;margin-bottom:32px}#download>img[data-v-b94896ed]{vertical-align:middle} +@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:300;src:url(/fonts/Inter-Light.woff2) format("woff2"),url(/fonts/Inter-Light.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:400;src:url(/fonts/Inter-Regular.woff2) format("woff2"),url(/fonts/Inter-Regular.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:500;src:url(/fonts/Inter-Medium.woff2) format("woff2"),url(/fonts/Inter-Medium.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:600;src:url(/fonts/Inter-Bold.woff2) format("woff2"),url(/fonts/Inter-Bold.woff) format("woff")}#header[data-v-1e5ccff0]{height:64px;width:100%}#grid[data-v-1e5ccff0]{--pad: 12px;display:grid;grid-template-columns:180px 1fr 100px 100px}#name[data-v-1e5ccff0]{grid-column:1 / 2;color:var(--dark-300);line-height:64px}#work[data-v-1e5ccff0]{grid-column:3 / 4}#work[data-v-1e5ccff0],#about[data-v-1e5ccff0]{color:var(--dark-300);text-align:center;line-height:62px;transition:all .15s ease}#work[data-v-1e5ccff0]:hover,#about[data-v-1e5ccff0]:hover,#work.active[data-v-1e5ccff0],#about.active[data-v-1e5ccff0]{color:var(--blue-100);font-weight:500}@media screen and (max-width: 768px){#grid[data-v-1e5ccff0]{grid-template-columns:180px 1fr 100px}#work[data-v-1e5ccff0]{display:none}#about[data-v-1e5ccff0]{text-align:right;grid-column:3 / 4}}a[data-v-637f64df]{display:inline-grid;gap:12px;cursor:pointer;transition:all .1s ease;border-radius:var(--radius);padding:12px 24px;background-color:var(--bg-color);align-items:center}[data-v-637f64df] svg,[data-v-637f64df] img{display:inline-block;max-width:var(--size);max-height:var(--size);vertical-align:top;fill:var(--icon-color)}[data-v-637f64df] svg{width:var(--size)}[data-v-637f64df] svg path{transition:all .2s ease}a[data-v-637f64df]:hover,a[data-v-637f64df]:active{background-color:var(--bg-hover-color)}a[data-v-637f64df] svg path{fill:var(--icon-color)}.text[data-v-637f64df]{line-height:var(--size)}@media screen and (max-width: 768px){a[data-v-637f64df]{--size: 24px !important}}.wrapper[data-v-4b352d11]{background-color:var(--dark-100)}p.body2[data-v-4b352d11]{color:var(--light-200);margin-bottom:24px}h4[data-v-4b352d11],h6[data-v-4b352d11]{color:#fff}.buttons[data-v-4b352d11]{display:flex;margin-bottom:24px}.buttons *[data-v-4b352d11]{margin-right:16px}.divider[data-v-4b352d11]{height:1px;background-color:var(--dark-300)}.footer[data-v-4b352d11]{margin-top:24px;margin-bottom:24px;display:grid;grid-template-columns:repeat(3,1fr)}.body1[data-v-4b352d11],.body2[data-v-4b352d11]{color:var(--light-200)}.greylink[data-v-4b352d11]{cursor:pointer;display:block}.greylink[data-v-4b352d11]:hover,.greylink[data-v-4b352d11]:active{color:#fff}.disclaimer[data-v-4b352d11]{margin-top:24px}@media screen and (max-width: 768px){.footer[data-v-4b352d11]{display:block}}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:300;src:url(/fonts/Inter-Light.woff2) format("woff2"),url(/fonts/Inter-Light.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:400;src:url(/fonts/Inter-Regular.woff2) format("woff2"),url(/fonts/Inter-Regular.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:500;src:url(/fonts/Inter-Medium.woff2) format("woff2"),url(/fonts/Inter-Medium.woff) format("woff")}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:600;src:url(/fonts/Inter-Bold.woff2) format("woff2"),url(/fonts/Inter-Bold.woff) format("woff")}:root{--font-sans: "Inter", sans-serif;--content-padding: 30px;--blue-100: #2A4A8A;--blue-200: #355DAE;--blue-300: #4070D1;--blue-400: #4B83F5;--dark-100: #1A1C21;--dark-200: #353942;--dark-300: #525866;--light-100: #E6EAF2;--light-200: #C2C5CC;--shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24);--radius: 8px;--radius-2: 16px ;--size-h1: 96px;--size-h2: 64px;--size-h3: 48px;--size-h4: 32px;--size-h5: 24px;--size-h6: 20px;--size-sub1: 16px;--size-sub2: 14px}body{font-family:var(--font-sans);color:var(--dark-100);margin:0;background:var(--light-100)}#app{display:grid;grid-template-rows:64px 1fr auto;height:100%}h1,h2,h3,h4,h5,h6{font-weight:500;color:var(--dark-100)}.regular{font-weight:400}h1,.h1{font-size:var(--size-h1);margin:112px 0 48px}h2,.h2{font-size:var(--size-h2);margin:72px 0 32px}h3,.h3{font-size:var(--size-h3);margin:60px 0 24px}h4,.h4{font-size:var(--size-h4);margin:40px 0 16px}h5,.h5{font-size:var(--size-h5);margin:32px 0 12px}h6,.h6{font-size:var(--size-h6);margin:24px 0 8px}.h1,.h2,.h3,.h4,.h5,.h6{margin:0}.subtitle1{font-size:var(--size-sub1);color:var(--dark-300)}.subtitle2{font-size:var(--size-sub2);color:var(--dark-300)}.body1{font-size:var(--size-sub1);line-height:24px;color:var(--dark-200)}.body2{font-size:var(--size-sub2);line-height:28px}.body1 p{margin:0 0 24px;line-height:32px}.body2 p{margin:6px 0;line-height:24px}.button{font-size:var(--size-sub1)}.button-lg{font-size:var(--size-h6)}@media screen and (max-width: 768px){.button-lg{font-size:var(--size-sub1)}}a{text-decoration:none;color:var(--dark-100)}p,ul,ol{max-width:700px}p{line-height:28px}ul{margin:0 0 24px}ul li,ol li{line-height:28px}.link{border-bottom:2px solid var(--blue-300)}.link:hover,.link:active{border-bottom:2px solid var(--blue-100)}.responsive{padding-left:var(--content-padding);padding-right:var(--content-padding);max-width:1220px;margin:0 auto}.cv>a[data-v-a5fc3b27]{margin-right:12px;margin-bottom:12px}#text>p[data-v-a5fc3b27]{font-size:20px;line-height:36px}.networks>a[data-v-a5fc3b27]{margin-right:12px;margin-bottom:12px}.tag[data-v-a5fc3b27]{padding:6px 12px;border-radius:var(--radius);display:inline-block;background:#fff;margin-right:8px;margin-bottom:8px}#about[data-v-a5fc3b27]{min-height:calc(100vh - 316px)}.responsive[data-v-a5fc3b27]{padding-top:48px;padding-bottom:48px}img[data-v-a5fc3b27]{width:100%;border-radius:var(--radius)}@media screen and (min-width: 768px){.responsive[data-v-a5fc3b27]{display:grid;grid-template-columns:1fr 2fr;gap:24px}h4[data-v-a5fc3b27]{margin-top:0}}.responsive[data-v-7c0f8bc3]{padding-top:64px;padding-bottom:32px}h2[data-v-7c0f8bc3],h5[data-v-7c0f8bc3]{margin:0}#name-container[data-v-7c0f8bc3]{margin-bottom:32px}#heading-container[data-v-7c0f8bc3]{display:grid;grid-template-rows:1fr 3fr;row-gap:4px;grid-auto-flow:column;max-width:700px;justify-content:space-between}@media screen and (max-width: 768px){#heading-container[data-v-7c0f8bc3]{row-gap:0px}h2[data-v-7c0f8bc3]{font-size:var(--size-h3)}h5[data-v-7c0f8bc3]{font-size:var(--size-h6)}.subtitle1[data-v-7c0f8bc3]{font-size:var(--size-sub2)}}#container[data-v-27d3b8ac]{display:block;padding-top:12px;margin-top:12px;margin-bottom:24px}.body2[data-v-27d3b8ac]{padding-top:12px;padding-bottom:12px;text-align:center;color:var(--dark-300)}.img-sm[data-v-27d3b8ac],.img-md[data-v-27d3b8ac],.img-lg[data-v-27d3b8ac]{margin-left:auto;margin-right:auto;display:block}.img-lg[data-v-27d3b8ac]{max-width:100%}@media screen and (max-width: 768px){.img-sm[data-v-27d3b8ac],.img-md[data-v-27d3b8ac]{max-width:100%}}@media screen and (min-width: 768px){.img-sm[data-v-27d3b8ac]{max-width:50%}.img-md[data-v-27d3b8ac]{max-width:70%}img.shadow[data-v-27d3b8ac],video.shadow[data-v-27d3b8ac]{-webkit-filter:drop-shadow(0 1px 3px #ccc);filter:drop-shadow(0 1px 3px #ccc)}}#projectArrows[data-v-ca97760c]{margin-top:64px;margin-bottom:64px;display:flex}#projectArrows>a[data-v-ca97760c]{font-size:var(--size-h6);color:var(--blue-200);border-radius:var(--radius);border:1px solid var(--blue-200);padding:6px 16px;background-size:200% 100%;transition:all .15s ease}#projectArrows *[data-v-ca97760c]:first-child{margin-right:8px}#projectArrows>a[data-v-ca97760c]:hover{color:#fff}svg[data-v-ca97760c] path{fill:var(--blue-200);transition:all .15s ease}.previous[data-v-ca97760c]{background:linear-gradient(to right,transparent 50%,var(--blue-200) 50%);background-position:left top}.previous[data-v-ca97760c]:hover{background-position:right top}.next[data-v-ca97760c]{background:linear-gradient(to left,transparent 50%,var(--blue-200) 50%);background-position:right top;float:right}.next>svg[data-v-ca97760c]{transform:rotate(180deg)}.next[data-v-ca97760c]:hover{background-position:left top}#projectArrows>a[data-v-ca97760c]:active{background-color:var(--blue-200);color:#fff}a:hover svg[data-v-ca97760c] path{fill:#fff}.flex-grow[data-v-ca97760c]{flex-grow:1}.tag[data-v-b0191d4a]{display:inline-block;padding:6px 12px;color:var(--light-100);border-radius:var(--radius)}.tile[data-v-d679ffa7]{background-color:var(--dark-100);border-radius:var(--radius-2);box-shadow:var(--shadow);--anim-dur: .1s;-webkit-transition:var(--anim-dur) ease;-moz-transition:var(--anim-dur) ease;-o-transition:var(--anim-dur) ease;transition:all .3s cubic-bezier(.25,.8,.25,1);color:#fff}.tile[data-v-d679ffa7]:hover{transform:scale(1.03);box-shadow:0 14px 28px #00000040,0 10px 10px #00000038}.img-container[data-v-d679ffa7]{display:inline-block;position:relative;width:100%}.img-container[data-v-d679ffa7]:after{padding-top:62.5%;display:block;content:""}img[data-v-d679ffa7]{position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:100%;object-fit:cover;border-radius:var(--radius-2) var(--radius-2) 0px 0px}.text[data-v-d679ffa7]{margin:24px 24px 48px}.h5[data-v-d679ffa7]{margin-bottom:16px}.text>.body1[data-v-d679ffa7]{color:var(--blue);padding:4px 8px;border-radius:var(--radius-2);border:1px solid var(--blue);display:inline-block}.tags div[data-v-d679ffa7]{margin-right:16px}@media screen and (max-width: 768px){.h5[data-v-d679ffa7]{font-size:var(--size-h6)}.text>.body1[data-v-d679ffa7]{font-size:var(--size-sub2)}}.responsive[data-v-29f0a935]{display:grid;grid-template-columns:1fr 1fr;margin-top:72px;gap:24px;align-items:end}img[data-v-29f0a935]{max-width:100%}.text[data-v-29f0a935]{margin:auto 0;display:grid;gap:24px}.text .body1[data-v-29f0a935]{color:var(--dark-200)}.buttons[data-v-29f0a935]{display:flex}.buttons a[data-v-29f0a935]:first-child{margin-right:24px}@media screen and (max-width: 768px){img[data-v-29f0a935]{margin-top:24px;margin-bottom:-5px;max-width:80%}.responsive[data-v-29f0a935]{display:block;margin-top:32px}.h2[data-v-29f0a935]{font-size:var(--size-h3)}}.h5[data-v-fa8148d2]{color:#fff;margin:auto 0}.body1[data-v-fa8148d2]{color:var(--light-200)}.grid[data-v-fa8148d2]{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}.wrapper[data-v-fa8148d2]{background-color:var(--dark-100);padding-top:48px;padding-bottom:72px;fill:#fff}.tile[data-v-fa8148d2]{padding:24px;display:grid;grid-template-rows:2fr 1fr 2fr}.tile svg[data-v-fa8148d2]{margin:auto 0}@media screen and (max-width: 768px){.tile[data-v-fa8148d2]{grid-template-rows:auto;gap:16px}.wrapper[data-v-fa8148d2]{padding-top:32px;padding-bottom:64px}.grid[data-v-fa8148d2]{grid-template-columns:1fr;gap:0}}.tile[data-v-73787f0d]{background-color:var(--dark-100);border-radius:var(--radius-2);color:#fff;padding:24px;display:grid;gap:24px}.text[data-v-73787f0d]{line-height:28px}.person[data-v-73787f0d]{display:grid;grid-template-columns:64px 1fr;column-gap:12px;align-items:center}img[data-v-73787f0d]{width:64px;height:64px;border-radius:32px;object-fit:cover}.name[data-v-73787f0d]{margin-bottom:4px}.position[data-v-73787f0d]{font-size:var(--size-sub2);color:var(--light-200)}h4[data-v-1a8cc63f]{margin-bottom:32px}.grid[data-v-1a8cc63f]{display:grid;grid-template-columns:1fr;gap:32px;margin-bottom:100px}@media screen and (min-width: 768px){.grid[data-v-1a8cc63f]{grid-template-columns:repeat(2,1fr)}}#content[data-v-bf488d2e]{padding-bottom:24px}img[data-v-bf488d2e]{vertical-align:middle}#PageNotFound[data-v-f2755a3c]{padding-top:50px}h2[data-v-b94896ed]{font-size:14px;font-weight:700;color:var(--dark-100);margin:0 0 4px}p[data-v-b94896ed]{margin:0 0 24px}#download[data-v-b94896ed]{display:inline-block;margin-bottom:32px}#download>img[data-v-b94896ed]{vertical-align:middle} diff --git a/assets/index-tV6eXGuM.js b/assets/index-tV6eXGuM.js deleted file mode 100644 index 2f06f42..0000000 --- a/assets/index-tV6eXGuM.js +++ /dev/null @@ -1,25 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const r of i.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();/** -* @vue/shared v3.4.15 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function ys(e,t){const n=new Set(e.split(","));return t?s=>n.has(s.toLowerCase()):s=>n.has(s)}const ie={},St=[],je=()=>{},or=()=>!1,Mn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Cs=e=>e.startsWith("onUpdate:"),pe=Object.assign,As=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ir=Object.prototype.hasOwnProperty,Z=(e,t)=>ir.call(e,t),H=Array.isArray,Mt=e=>En(e)==="[object Map]",Fo=e=>En(e)==="[object Set]",q=e=>typeof e=="function",de=e=>typeof e=="string",Nt=e=>typeof e=="symbol",re=e=>e!==null&&typeof e=="object",Bo=e=>(re(e)||q(e))&&q(e.then)&&q(e.catch),Do=Object.prototype.toString,En=e=>Do.call(e),rr=e=>En(e).slice(8,-1),qo=e=>En(e)==="[object Object]",xs=e=>de(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,bn=ys(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Pn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ar=/-(\w)/g,qe=Pn(e=>e.replace(ar,(t,n)=>n?n.toUpperCase():"")),lr=/\B([A-Z])/g,Ht=Pn(e=>e.replace(lr,"-$1").toLowerCase()),Tn=Pn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Zn=Pn(e=>e?`on${Tn(e)}`:""),dt=(e,t)=>!Object.is(e,t),Gn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},cr=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Ks;const Ko=()=>Ks||(Ks=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function an(e){if(H(e)){const t={};for(let n=0;n{if(n){const s=n.split(dr);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function ht(e){let t="";if(de(e))t=e;else if(H(e))for(let n=0;nde(e)?e:e==null?"":H(e)||re(e)&&(e.toString===Do||!q(e.toString))?JSON.stringify(e,Zo,2):String(e),Zo=(e,t)=>t&&t.__v_isRef?Zo(e,t.value):Mt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o],i)=>(n[Xn(s,i)+" =>"]=o,n),{})}:Fo(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Xn(n))}:Nt(t)?Xn(t):re(t)&&!H(t)&&!qo(t)?String(t):t,Xn=(e,t="")=>{var n;return Nt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.4.15 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Se;class Go{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Se,!t&&Se&&(this.index=(Se.scopes||(Se.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Se;try{return Se=this,t()}finally{Se=n}}}on(){Se=this}off(){Se=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n=2))break}this._dirtyLevel<2&&(this._dirtyLevel=0),Ct()}return this._dirtyLevel>=2}set dirty(t){this._dirtyLevel=t?2:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=ct,n=bt;try{return ct=!0,bt=this,this._runnings++,Ws(this),this.fn()}finally{Zs(this),this._runnings--,bt=n,ct=t}}stop(){var t;this.active&&(Ws(this),Zs(this),(t=this.onStop)==null||t.call(this),this.active=!1)}}function vr(e){return e.value}function Ws(e){e._trackId++,e._depsLength=0}function Zs(e){if(e.deps&&e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},as=new WeakMap,vt=Symbol(""),ls=Symbol("");function xe(e,t,n){if(ct&&bt){let s=as.get(e);s||as.set(e,s=new Map);let o=s.get(n);o||s.set(n,o=ti(()=>s.delete(n))),Yo(bt,o)}}function Ge(e,t,n,s,o,i){const r=as.get(e);if(!r)return;let a=[];if(t==="clear")a=[...r.values()];else if(n==="length"&&H(e)){const c=Number(s);r.forEach((f,h)=>{(h==="length"||!Nt(h)&&h>=c)&&a.push(f)})}else switch(n!==void 0&&a.push(r.get(n)),t){case"add":H(e)?xs(n)&&a.push(r.get("length")):(a.push(r.get(vt)),Mt(e)&&a.push(r.get(ls)));break;case"delete":H(e)||(a.push(r.get(vt)),Mt(e)&&a.push(r.get(ls)));break;case"set":Mt(e)&&a.push(r.get(vt));break}Is();for(const c of a)c&&Jo(c,2);Ls()}const wr=ys("__proto__,__v_isRef,__isVue"),ni=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Nt)),Gs=yr();function yr(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=G(this);for(let i=0,r=this.length;i{e[t]=function(...n){yt(),Is();const s=G(this)[t].apply(this,n);return Ls(),Ct(),s}}),e}function Cr(e){const t=G(this);return xe(t,"has",e),t.hasOwnProperty(e)}class si{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,s){const o=this._isReadonly,i=this._shallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(o?i?Tr:ai:i?ri:ii).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const r=H(t);if(!o){if(r&&Z(Gs,n))return Reflect.get(Gs,n,s);if(n==="hasOwnProperty")return Cr}const a=Reflect.get(t,n,s);return(Nt(n)?ni.has(n):wr(n))||(o||xe(t,"get",n),i)?a:ke(a)?r&&xs(n)?a:a.value:re(a)?o?ci(a):On(a):a}}class oi extends si{constructor(t=!1){super(!1,t)}set(t,n,s,o){let i=t[n];if(!this._shallow){const c=Ut(i);if(!kn(s)&&!Ut(s)&&(i=G(i),s=G(s)),!H(t)&&ke(i)&&!ke(s))return c?!1:(i.value=s,!0)}const r=H(t)&&xs(n)?Number(n)e,Un=e=>Reflect.getPrototypeOf(e);function hn(e,t,n=!1,s=!1){e=e.__v_raw;const o=G(e),i=G(t);n||(dt(t,i)&&xe(o,"get",t),xe(o,"get",i));const{has:r}=Un(o),a=s?js:n?Ms:tn;if(r.call(o,t))return a(e.get(t));if(r.call(o,i))return a(e.get(i));e!==o&&e.get(t)}function fn(e,t=!1){const n=this.__v_raw,s=G(n),o=G(e);return t||(dt(e,o)&&xe(s,"has",e),xe(s,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function pn(e,t=!1){return e=e.__v_raw,!t&&xe(G(e),"iterate",vt),Reflect.get(e,"size",e)}function Xs(e){e=G(e);const t=G(this);return Un(t).has.call(t,e)||(t.add(e),Ge(t,"add",e,e)),this}function Qs(e,t){t=G(t);const n=G(this),{has:s,get:o}=Un(n);let i=s.call(n,e);i||(e=G(e),i=s.call(n,e));const r=o.call(n,e);return n.set(e,t),i?dt(t,r)&&Ge(n,"set",e,t):Ge(n,"add",e,t),this}function Ys(e){const t=G(this),{has:n,get:s}=Un(t);let o=n.call(t,e);o||(e=G(e),o=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return o&&Ge(t,"delete",e,void 0),i}function Js(){const e=G(this),t=e.size!==0,n=e.clear();return t&&Ge(e,"clear",void 0,void 0),n}function gn(e,t){return function(s,o){const i=this,r=i.__v_raw,a=G(r),c=t?js:e?Ms:tn;return!e&&xe(a,"iterate",vt),r.forEach((f,h)=>s.call(o,c(f),c(h),i))}}function mn(e,t,n){return function(...s){const o=this.__v_raw,i=G(o),r=Mt(i),a=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,f=o[e](...s),h=n?js:t?Ms:tn;return!t&&xe(i,"iterate",c?ls:vt),{next(){const{value:p,done:m}=f.next();return m?{value:p,done:m}:{value:a?[h(p[0]),h(p[1])]:h(p),done:m}},[Symbol.iterator](){return this}}}}function nt(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Lr(){const e={get(i){return hn(this,i)},get size(){return pn(this)},has:fn,add:Xs,set:Qs,delete:Ys,clear:Js,forEach:gn(!1,!1)},t={get(i){return hn(this,i,!1,!0)},get size(){return pn(this)},has:fn,add:Xs,set:Qs,delete:Ys,clear:Js,forEach:gn(!1,!0)},n={get(i){return hn(this,i,!0)},get size(){return pn(this,!0)},has(i){return fn.call(this,i,!0)},add:nt("add"),set:nt("set"),delete:nt("delete"),clear:nt("clear"),forEach:gn(!0,!1)},s={get(i){return hn(this,i,!0,!0)},get size(){return pn(this,!0)},has(i){return fn.call(this,i,!0)},add:nt("add"),set:nt("set"),delete:nt("delete"),clear:nt("clear"),forEach:gn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=mn(i,!1,!1),n[i]=mn(i,!0,!1),t[i]=mn(i,!1,!0),s[i]=mn(i,!0,!0)}),[e,n,t,s]}const[jr,Rr,$r,Sr]=Lr();function Rs(e,t){const n=t?e?Sr:$r:e?Rr:jr;return(s,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(Z(n,o)&&o in s?n:s,o,i)}const Mr={get:Rs(!1,!1)},Er={get:Rs(!1,!0)},Pr={get:Rs(!0,!1)},ii=new WeakMap,ri=new WeakMap,ai=new WeakMap,Tr=new WeakMap;function Ur(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Or(e){return e.__v_skip||!Object.isExtensible(e)?0:Ur(rr(e))}function On(e){return Ut(e)?e:$s(e,!1,xr,Mr,ii)}function li(e){return $s(e,!1,Ir,Er,ri)}function ci(e){return $s(e,!0,kr,Pr,ai)}function $s(e,t,n,s,o){if(!re(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const r=Or(e);if(r===0)return e;const a=new Proxy(e,r===2?s:n);return o.set(e,a),a}function Et(e){return Ut(e)?Et(e.__v_raw):!!(e&&e.__v_isReactive)}function Ut(e){return!!(e&&e.__v_isReadonly)}function kn(e){return!!(e&&e.__v_isShallow)}function ui(e){return Et(e)||Ut(e)}function G(e){const t=e&&e.__v_raw;return t?G(t):e}function Ss(e){return xn(e,"__v_skip",!0),e}const tn=e=>re(e)?On(e):e,Ms=e=>re(e)?ci(e):e;class di{constructor(t,n,s,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new ks(()=>t(this._value),()=>vn(this,1),()=>this.dep&&ei(this.dep)),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=G(this);return(!t._cacheable||t.effect.dirty)&&dt(t._value,t._value=t.effect.run())&&vn(t,2),hi(t),t.effect._dirtyLevel>=1&&vn(t,1),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function zr(e,t,n=!1){let s,o;const i=q(e);return i?(s=e,o=je):(s=e.get,o=e.set),new di(s,o,i||!o,n)}function hi(e){ct&&bt&&(e=G(e),Yo(bt,e.dep||(e.dep=ti(()=>e.dep=void 0,e instanceof di?e:void 0))))}function vn(e,t=2,n){e=G(e);const s=e.dep;s&&Jo(s,t)}function ke(e){return!!(e&&e.__v_isRef===!0)}function fi(e){return pi(e,!1)}function Vr(e){return pi(e,!0)}function pi(e,t){return ke(e)?e:new Nr(e,t)}class Nr{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:G(t),this._value=n?t:tn(t)}get value(){return hi(this),this._value}set value(t){const n=this.__v_isShallow||kn(t)||Ut(t);t=n?t:G(t),dt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:tn(t),vn(this,2))}}function Pt(e){return ke(e)?e.value:e}const Hr={get:(e,t,n)=>Pt(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return ke(o)&&!ke(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function gi(e){return Et(e)?e:new Proxy(e,Hr)}/** -* @vue/runtime-core v3.4.15 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function ut(e,t,n,s){let o;try{o=s?e(...s):e()}catch(i){zn(i,t,n)}return o}function Pe(e,t,n,s){if(q(e)){const i=ut(e,t,n,s);return i&&Bo(i)&&i.catch(r=>{zn(r,t,n)}),i}const o=[];for(let i=0;i>>1,o=me[s],i=sn(o);iDe&&me.splice(t,1)}function qr(e){H(e)?Tt.push(...e):(!it||!it.includes(e,e.allowRecurse?_t+1:_t))&&Tt.push(e),bi()}function eo(e,t,n=nn?De+1:0){for(;nsn(n)-sn(s));if(Tt.length=0,it){it.push(...t);return}for(it=t,_t=0;_te.id==null?1/0:e.id,Kr=(e,t)=>{const n=sn(e)-sn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function wi(e){cs=!1,nn=!0,me.sort(Kr);try{for(De=0;Dede(y)?y.trim():y)),p&&(o=n.map(cr))}let a,c=s[a=Zn(t)]||s[a=Zn(qe(t))];!c&&i&&(c=s[a=Zn(Ht(t))]),c&&Pe(c,e,6,o);const f=s[a+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Pe(f,e,6,o)}}function yi(e,t,n=!1){const s=t.emitsCache,o=s.get(e);if(o!==void 0)return o;const i=e.emits;let r={},a=!1;if(!q(e)){const c=f=>{const h=yi(f,t,!0);h&&(a=!0,pe(r,h))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!a?(re(e)&&s.set(e,null),null):(H(i)?i.forEach(c=>r[c]=null):pe(r,i),re(e)&&s.set(e,r),r)}function Vn(e,t){return!e||!Mn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,Ht(t))||Z(e,t))}let we=null,Nn=null;function In(e){const t=we;return we=e,Nn=e&&e.type.__scopeId||null,t}function Qe(e){Nn=e}function Ye(){Nn=null}function ce(e,t=we,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&ho(-1);const i=In(t);let r;try{r=e(...o)}finally{In(i),s._d&&ho(1)}return r};return s._n=!0,s._c=!0,s._d=!0,s}function Qn(e){const{type:t,vnode:n,proxy:s,withProxy:o,props:i,propsOptions:[r],slots:a,attrs:c,emit:f,render:h,renderCache:p,data:m,setupState:y,ctx:$,inheritAttrs:z}=e;let V,P;const F=In(e);try{if(n.shapeFlag&4){const X=o||s,le=X;V=Be(h.call(le,X,p,i,y,m,$)),P=c}else{const X=t;V=Be(X.length>1?X(i,{attrs:c,slots:a,emit:f}):X(i,null)),P=t.props?c:Zr(c)}}catch(X){Yt.length=0,zn(X,e,1),V=_(ft)}let B=V;if(P&&z!==!1){const X=Object.keys(P),{shapeFlag:le}=B;X.length&&le&7&&(r&&X.some(Cs)&&(P=Gr(P,r)),B=Ot(B,P))}return n.dirs&&(B=Ot(B),B.dirs=B.dirs?B.dirs.concat(n.dirs):n.dirs),n.transition&&(B.transition=n.transition),V=B,In(F),V}const Zr=e=>{let t;for(const n in e)(n==="class"||n==="style"||Mn(n))&&((t||(t={}))[n]=e[n]);return t},Gr=(e,t)=>{const n={};for(const s in e)(!Cs(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Xr(e,t,n){const{props:s,children:o,component:i}=e,{props:r,children:a,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?to(s,r,f):!!r;if(c&8){const h=t.dynamicProps;for(let p=0;pe.__isSuspense;function ta(e,t){t&&t.pendingBranch?H(e)?t.effects.push(...e):t.effects.push(e):qr(e)}const na=Symbol.for("v-scx"),sa=()=>Xe(na),_n={};function wn(e,t,n){return Ai(e,t,n)}function Ai(e,t,{immediate:n,deep:s,flush:o,once:i,onTrack:r,onTrigger:a}=ie){if(t&&i){const D=t;t=(...be)=>{D(...be),le()}}const c=_e,f=D=>s===!0?D:$t(D,s===!1?1:void 0);let h,p=!1,m=!1;if(ke(e)?(h=()=>e.value,p=kn(e)):Et(e)?(h=()=>f(e),p=!0):H(e)?(m=!0,p=e.some(D=>Et(D)||kn(D)),h=()=>e.map(D=>{if(ke(D))return D.value;if(Et(D))return f(D);if(q(D))return ut(D,c,2)})):q(e)?t?h=()=>ut(e,c,2):h=()=>(y&&y(),Pe(e,c,3,[$])):h=je,t&&s){const D=h;h=()=>$t(D())}let y,$=D=>{y=B.onStop=()=>{ut(D,c,4),y=B.onStop=void 0}},z;if(qn)if($=je,t?n&&Pe(t,c,3,[h(),m?[]:void 0,$]):h(),o==="sync"){const D=sa();z=D.__watcherHandles||(D.__watcherHandles=[])}else return je;let V=m?new Array(e.length).fill(_n):_n;const P=()=>{if(!(!B.active||!B.dirty))if(t){const D=B.run();(s||p||(m?D.some((be,Le)=>dt(be,V[Le])):dt(D,V)))&&(y&&y(),Pe(t,c,3,[D,V===_n?void 0:m&&V[0]===_n?[]:V,$]),V=D)}else B.run()};P.allowRecurse=!!t;let F;o==="sync"?F=P:o==="post"?F=()=>Ae(P,c&&c.suspense):(P.pre=!0,c&&(P.id=c.uid),F=()=>Ps(P));const B=new ks(h,je,F),X=br(),le=()=>{B.stop(),X&&As(X.effects,B)};return t?n?P():V=B.run():o==="post"?Ae(B.run.bind(B),c&&c.suspense):B.run(),z&&z.push(le),le}function oa(e,t,n){const s=this.proxy,o=de(e)?e.includes(".")?xi(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const r=ln(this),a=Ai(o,i.bind(s),n);return r(),a}function xi(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o0){if(n>=t)return e;n++}if(s=s||new Set,s.has(e))return e;if(s.add(e),ke(e))$t(e.value,t,n,s);else if(H(e))for(let o=0;o{$t(o,t,n,s)});else if(qo(e))for(const o in e)$t(e[o],t,n,s);return e}function gt(e,t,n,s){const o=e.dirs,i=t&&t.dirs;for(let r=0;r!!e.type.__asyncLoader,Ii=e=>e.type.__isKeepAlive;function ia(e,t){Li(e,"a",t)}function ra(e,t){Li(e,"da",t)}function Li(e,t,n=_e){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Hn(t,s,n),n){let o=n.parent;for(;o&&o.parent;)Ii(o.parent.vnode)&&aa(s,t,n,o),o=o.parent}}function aa(e,t,n,s){const o=Hn(t,e,s,!0);ji(()=>{As(s[t],o)},n)}function Hn(e,t,n=_e,s=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;yt();const a=ln(n),c=Pe(t,n,e,r);return a(),Ct(),c});return s?o.unshift(i):o.push(i),i}}const Je=e=>(t,n=_e)=>(!qn||e==="sp")&&Hn(e,(...s)=>t(...s),n),la=Je("bm"),ca=Je("m"),ua=Je("bu"),da=Je("u"),ha=Je("bum"),ji=Je("um"),fa=Je("sp"),pa=Je("rtg"),ga=Je("rtc");function ma(e,t=_e){Hn("ec",e,t)}function wt(e,t,n,s){let o;const i=n&&n[s];if(H(e)||de(e)){o=new Array(e.length);for(let r=0,a=e.length;rt(r,a,void 0,i&&i[a]));else{const r=Object.keys(e);o=new Array(r.length);for(let a=0,c=r.length;aRn(t)?!(t.type===ft||t.type===ue&&!Ri(t.children)):!0)?e:null}const us=e=>e?Hi(e)?zs(e)||e.proxy:us(e.parent):null,Qt=pe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>us(e.parent),$root:e=>us(e.root),$emit:e=>e.emit,$options:e=>Ts(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,Ps(e.update)}),$nextTick:e=>e.n||(e.n=_i.bind(e.proxy)),$watch:e=>oa.bind(e)}),Yn=(e,t)=>e!==ie&&!e.__isScriptSetup&&Z(e,t),ba={get({_:e},t){const{ctx:n,setupState:s,data:o,props:i,accessCache:r,type:a,appContext:c}=e;let f;if(t[0]!=="$"){const y=r[t];if(y!==void 0)switch(y){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(Yn(s,t))return r[t]=1,s[t];if(o!==ie&&Z(o,t))return r[t]=2,o[t];if((f=e.propsOptions[0])&&Z(f,t))return r[t]=3,i[t];if(n!==ie&&Z(n,t))return r[t]=4,n[t];ds&&(r[t]=0)}}const h=Qt[t];let p,m;if(h)return t==="$attrs"&&xe(e,"get",t),h(e);if((p=a.__cssModules)&&(p=p[t]))return p;if(n!==ie&&Z(n,t))return r[t]=4,n[t];if(m=c.config.globalProperties,Z(m,t))return m[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:i}=e;return Yn(o,t)?(o[t]=n,!0):s!==ie&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,propsOptions:i}},r){let a;return!!n[r]||e!==ie&&Z(e,r)||Yn(t,r)||(a=i[0])&&Z(a,r)||Z(s,r)||Z(Qt,r)||Z(o.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function so(e){return H(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let ds=!0;function va(e){const t=Ts(e),n=e.proxy,s=e.ctx;ds=!1,t.beforeCreate&&oo(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:r,watch:a,provide:c,inject:f,created:h,beforeMount:p,mounted:m,beforeUpdate:y,updated:$,activated:z,deactivated:V,beforeDestroy:P,beforeUnmount:F,destroyed:B,unmounted:X,render:le,renderTracked:D,renderTriggered:be,errorCaptured:Le,serverPrefetch:xt,expose:ze,inheritAttrs:et,components:pt,directives:Ve,filters:qt}=t;if(f&&wa(f,s,null),r)for(const ee in r){const Q=r[ee];q(Q)&&(s[ee]=Q.bind(n))}if(o){const ee=o.call(n,n);re(ee)&&(e.data=On(ee))}if(ds=!0,i)for(const ee in i){const Q=i[ee],We=q(Q)?Q.bind(n,n):q(Q.get)?Q.get.bind(n,n):je,tt=!q(Q)&&q(Q.set)?Q.set.bind(n):je,Ne=Me({get:We,set:tt});Object.defineProperty(s,ee,{enumerable:!0,configurable:!0,get:()=>Ne.value,set:Ce=>Ne.value=Ce})}if(a)for(const ee in a)$i(a[ee],s,n,ee);if(c){const ee=q(c)?c.call(n):c;Reflect.ownKeys(ee).forEach(Q=>{yn(Q,ee[Q])})}h&&oo(h,e,"c");function he(ee,Q){H(Q)?Q.forEach(We=>ee(We.bind(n))):Q&&ee(Q.bind(n))}if(he(la,p),he(ca,m),he(ua,y),he(da,$),he(ia,z),he(ra,V),he(ma,Le),he(ga,D),he(pa,be),he(ha,F),he(ji,X),he(fa,xt),H(ze))if(ze.length){const ee=e.exposed||(e.exposed={});ze.forEach(Q=>{Object.defineProperty(ee,Q,{get:()=>n[Q],set:We=>n[Q]=We})})}else e.exposed||(e.exposed={});le&&e.render===je&&(e.render=le),et!=null&&(e.inheritAttrs=et),pt&&(e.components=pt),Ve&&(e.directives=Ve)}function wa(e,t,n=je){H(e)&&(e=hs(e));for(const s in e){const o=e[s];let i;re(o)?"default"in o?i=Xe(o.from||s,o.default,!0):i=Xe(o.from||s):i=Xe(o),ke(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:r=>i.value=r}):t[s]=i}}function oo(e,t,n){Pe(H(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function $i(e,t,n,s){const o=s.includes(".")?xi(n,s):()=>n[s];if(de(e)){const i=t[e];q(i)&&wn(o,i)}else if(q(e))wn(o,e.bind(n));else if(re(e))if(H(e))e.forEach(i=>$i(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&wn(o,i,e)}}function Ts(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:r}}=e.appContext,a=i.get(t);let c;return a?c=a:!o.length&&!n&&!s?c=t:(c={},o.length&&o.forEach(f=>Ln(c,f,r,!0)),Ln(c,t,r)),re(t)&&i.set(t,c),c}function Ln(e,t,n,s=!1){const{mixins:o,extends:i}=t;i&&Ln(e,i,n,!0),o&&o.forEach(r=>Ln(e,r,n,!0));for(const r in t)if(!(s&&r==="expose")){const a=ya[r]||n&&n[r];e[r]=a?a(e[r],t[r]):t[r]}return e}const ya={data:io,props:ro,emits:ro,methods:Gt,computed:Gt,beforeCreate:ve,created:ve,beforeMount:ve,mounted:ve,beforeUpdate:ve,updated:ve,beforeDestroy:ve,beforeUnmount:ve,destroyed:ve,unmounted:ve,activated:ve,deactivated:ve,errorCaptured:ve,serverPrefetch:ve,components:Gt,directives:Gt,watch:Aa,provide:io,inject:Ca};function io(e,t){return t?e?function(){return pe(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Ca(e,t){return Gt(hs(e),hs(t))}function hs(e){if(H(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(s&&s.proxy):t}}function Ia(e,t,n,s=!1){const o={},i={};xn(i,Dn,1),e.propsDefaults=Object.create(null),Mi(e,t,o,i);for(const r in e.propsOptions[0])r in o||(o[r]=void 0);n?e.props=s?o:li(o):e.type.props?e.props=o:e.props=i,e.attrs=i}function La(e,t,n,s){const{props:o,attrs:i,vnode:{patchFlag:r}}=e,a=G(o),[c]=e.propsOptions;let f=!1;if((s||r>0)&&!(r&16)){if(r&8){const h=e.vnode.dynamicProps;for(let p=0;p{c=!0;const[m,y]=Ei(p,t,!0);pe(r,m),y&&a.push(...y)};!n&&t.mixins.length&&t.mixins.forEach(h),e.extends&&h(e.extends),e.mixins&&e.mixins.forEach(h)}if(!i&&!c)return re(e)&&s.set(e,St),St;if(H(i))for(let h=0;h-1,y[1]=z<0||$-1||Z(y,"default"))&&a.push(p)}}}const f=[r,a];return re(e)&&s.set(e,f),f}function ao(e){return e[0]!=="$"}function lo(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function co(e,t){return lo(e)===lo(t)}function uo(e,t){return H(t)?t.findIndex(n=>co(n,e)):q(t)&&co(t,e)?0:-1}const Pi=e=>e[0]==="_"||e==="$stable",Us=e=>H(e)?e.map(Be):[Be(e)],ja=(e,t,n)=>{if(t._n)return t;const s=ce((...o)=>Us(t(...o)),n);return s._c=!1,s},Ti=(e,t,n)=>{const s=e._ctx;for(const o in e){if(Pi(o))continue;const i=e[o];if(q(i))t[o]=ja(o,i,s);else if(i!=null){const r=Us(i);t[o]=()=>r}}},Ui=(e,t)=>{const n=Us(t);e.slots.default=()=>n},Ra=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=G(t),xn(t,"_",n)):Ti(t,e.slots={})}else e.slots={},t&&Ui(e,t);xn(e.slots,Dn,1)},$a=(e,t,n)=>{const{vnode:s,slots:o}=e;let i=!0,r=ie;if(s.shapeFlag&32){const a=t._;a?n&&a===1?i=!1:(pe(o,t),!n&&a===1&&delete o._):(i=!t.$stable,Ti(t,o)),r=t}else t&&(Ui(e,t),r={default:1});if(i)for(const a in o)!Pi(a)&&r[a]==null&&delete o[a]};function ps(e,t,n,s,o=!1){if(H(e)){e.forEach((m,y)=>ps(m,t&&(H(t)?t[y]:t),n,s,o));return}if(Xt(s)&&!o)return;const i=s.shapeFlag&4?zs(s.component)||s.component.proxy:s.el,r=o?null:i,{i:a,r:c}=e,f=t&&t.r,h=a.refs===ie?a.refs={}:a.refs,p=a.setupState;if(f!=null&&f!==c&&(de(f)?(h[f]=null,Z(p,f)&&(p[f]=null)):ke(f)&&(f.value=null)),q(c))ut(c,a,12,[r,h]);else{const m=de(c),y=ke(c),$=e.f;if(m||y){const z=()=>{if($){const V=m?Z(p,c)?p[c]:h[c]:c.value;o?H(V)&&As(V,i):H(V)?V.includes(i)||V.push(i):m?(h[c]=[i],Z(p,c)&&(p[c]=h[c])):(c.value=[i],e.k&&(h[e.k]=c.value))}else m?(h[c]=r,Z(p,c)&&(p[c]=r)):y&&(c.value=r,e.k&&(h[e.k]=r))};o||$?z():(z.id=-1,Ae(z,n))}}}const Ae=ta;function Sa(e){return Ma(e)}function Ma(e,t){const n=Ko();n.__VUE__=!0;const{insert:s,remove:o,patchProp:i,createElement:r,createText:a,createComment:c,setText:f,setElementText:h,parentNode:p,nextSibling:m,setScopeId:y=je,insertStaticContent:$}=e,z=(u,d,g,w=null,b=null,x=null,L=void 0,A=null,k=!!d.dynamicChildren)=>{if(u===d)return;u&&!Wt(u,d)&&(w=v(u),Ce(u,b,x,!0),u=null),d.patchFlag===-2&&(k=!1,d.dynamicChildren=null);const{type:C,ref:R,shapeFlag:U}=d;switch(C){case Fn:V(u,d,g,w);break;case ft:P(u,d,g,w);break;case Cn:u==null&&F(d,g,w,L);break;case ue:pt(u,d,g,w,b,x,L,A,k);break;default:U&1?le(u,d,g,w,b,x,L,A,k):U&6?Ve(u,d,g,w,b,x,L,A,k):(U&64||U&128)&&C.process(u,d,g,w,b,x,L,A,k,M)}R!=null&&b&&ps(R,u&&u.ref,x,d||u,!d)},V=(u,d,g,w)=>{if(u==null)s(d.el=a(d.children),g,w);else{const b=d.el=u.el;d.children!==u.children&&f(b,d.children)}},P=(u,d,g,w)=>{u==null?s(d.el=c(d.children||""),g,w):d.el=u.el},F=(u,d,g,w)=>{[u.el,u.anchor]=$(u.children,d,g,w,u.el,u.anchor)},B=({el:u,anchor:d},g,w)=>{let b;for(;u&&u!==d;)b=m(u),s(u,g,w),u=b;s(d,g,w)},X=({el:u,anchor:d})=>{let g;for(;u&&u!==d;)g=m(u),o(u),u=g;o(d)},le=(u,d,g,w,b,x,L,A,k)=>{d.type==="svg"?L="svg":d.type==="math"&&(L="mathml"),u==null?D(d,g,w,b,x,L,A,k):xt(u,d,b,x,L,A,k)},D=(u,d,g,w,b,x,L,A)=>{let k,C;const{props:R,shapeFlag:U,transition:T,dirs:N}=u;if(k=u.el=r(u.type,x,R&&R.is,R),U&8?h(k,u.children):U&16&&Le(u.children,k,null,w,b,Jn(u,x),L,A),N&>(u,null,w,"created"),be(k,u,u.scopeId,L,w),R){for(const te in R)te!=="value"&&!bn(te)&&i(k,te,null,R[te],x,u.children,w,b,ge);"value"in R&&i(k,"value",null,R.value,x),(C=R.onVnodeBeforeMount)&&Fe(C,w,u)}N&>(u,null,w,"beforeMount");const K=Ea(b,T);K&&T.beforeEnter(k),s(k,d,g),((C=R&&R.onVnodeMounted)||K||N)&&Ae(()=>{C&&Fe(C,w,u),K&&T.enter(k),N&>(u,null,w,"mounted")},b)},be=(u,d,g,w,b)=>{if(g&&y(u,g),w)for(let x=0;x{for(let C=k;C{const A=d.el=u.el;let{patchFlag:k,dynamicChildren:C,dirs:R}=d;k|=u.patchFlag&16;const U=u.props||ie,T=d.props||ie;let N;if(g&&mt(g,!1),(N=T.onVnodeBeforeUpdate)&&Fe(N,g,d,u),R&>(d,u,g,"beforeUpdate"),g&&mt(g,!0),C?ze(u.dynamicChildren,C,A,g,w,Jn(d,b),x):L||Q(u,d,A,null,g,w,Jn(d,b),x,!1),k>0){if(k&16)et(A,d,U,T,g,w,b);else if(k&2&&U.class!==T.class&&i(A,"class",null,T.class,b),k&4&&i(A,"style",U.style,T.style,b),k&8){const K=d.dynamicProps;for(let te=0;te{N&&Fe(N,g,d,u),R&>(d,u,g,"updated")},w)},ze=(u,d,g,w,b,x,L)=>{for(let A=0;A{if(g!==w){if(g!==ie)for(const A in g)!bn(A)&&!(A in w)&&i(u,A,g[A],null,L,d.children,b,x,ge);for(const A in w){if(bn(A))continue;const k=w[A],C=g[A];k!==C&&A!=="value"&&i(u,A,C,k,L,d.children,b,x,ge)}"value"in w&&i(u,"value",g.value,w.value,L)}},pt=(u,d,g,w,b,x,L,A,k)=>{const C=d.el=u?u.el:a(""),R=d.anchor=u?u.anchor:a("");let{patchFlag:U,dynamicChildren:T,slotScopeIds:N}=d;N&&(A=A?A.concat(N):N),u==null?(s(C,g,w),s(R,g,w),Le(d.children||[],g,R,b,x,L,A,k)):U>0&&U&64&&T&&u.dynamicChildren?(ze(u.dynamicChildren,T,g,b,x,L,A),(d.key!=null||b&&d===b.subTree)&&Oi(u,d,!0)):Q(u,d,g,R,b,x,L,A,k)},Ve=(u,d,g,w,b,x,L,A,k)=>{d.slotScopeIds=A,u==null?d.shapeFlag&512?b.ctx.activate(d,g,w,L,k):qt(d,g,w,b,x,L,k):kt(u,d,k)},qt=(u,d,g,w,b,x,L)=>{const A=u.component=Fa(u,w,b);if(Ii(u)&&(A.ctx.renderer=M),Ba(A),A.asyncDep){if(b&&b.registerDep(A,he),!u.el){const k=A.subTree=_(ft);P(null,k,d,g)}}else he(A,u,d,g,b,x,L)},kt=(u,d,g)=>{const w=d.component=u.component;if(Xr(u,d,g))if(w.asyncDep&&!w.asyncResolved){ee(w,d,g);return}else w.next=d,Dr(w.update),w.effect.dirty=!0,w.update();else d.el=u.el,w.vnode=d},he=(u,d,g,w,b,x,L)=>{const A=()=>{if(u.isMounted){let{next:R,bu:U,u:T,parent:N,vnode:K}=u;{const jt=zi(u);if(jt){R&&(R.el=K.el,ee(u,R,L)),jt.asyncDep.then(()=>{u.isUnmounted||A()});return}}let te=R,oe;mt(u,!1),R?(R.el=K.el,ee(u,R,L)):R=K,U&&Gn(U),(oe=R.props&&R.props.onVnodeBeforeUpdate)&&Fe(oe,N,R,K),mt(u,!0);const fe=Qn(u),$e=u.subTree;u.subTree=fe,z($e,fe,p($e.el),v($e),u,b,x),R.el=fe.el,te===null&&Qr(u,fe.el),T&&Ae(T,b),(oe=R.props&&R.props.onVnodeUpdated)&&Ae(()=>Fe(oe,N,R,K),b)}else{let R;const{el:U,props:T}=d,{bm:N,m:K,parent:te}=u,oe=Xt(d);if(mt(u,!1),N&&Gn(N),!oe&&(R=T&&T.onVnodeBeforeMount)&&Fe(R,te,d),mt(u,!0),U&&se){const fe=()=>{u.subTree=Qn(u),se(U,u.subTree,u,b,null)};oe?d.type.__asyncLoader().then(()=>!u.isUnmounted&&fe()):fe()}else{const fe=u.subTree=Qn(u);z(null,fe,g,w,u,b,x),d.el=fe.el}if(K&&Ae(K,b),!oe&&(R=T&&T.onVnodeMounted)){const fe=d;Ae(()=>Fe(R,te,fe),b)}(d.shapeFlag&256||te&&Xt(te.vnode)&&te.vnode.shapeFlag&256)&&u.a&&Ae(u.a,b),u.isMounted=!0,d=g=w=null}},k=u.effect=new ks(A,je,()=>Ps(C),u.scope),C=u.update=()=>{k.dirty&&k.run()};C.id=u.uid,mt(u,!0),C()},ee=(u,d,g)=>{d.component=u;const w=u.vnode.props;u.vnode=d,u.next=null,La(u,d.props,w,g),$a(u,d.children,g),yt(),eo(u),Ct()},Q=(u,d,g,w,b,x,L,A,k=!1)=>{const C=u&&u.children,R=u?u.shapeFlag:0,U=d.children,{patchFlag:T,shapeFlag:N}=d;if(T>0){if(T&128){tt(C,U,g,w,b,x,L,A,k);return}else if(T&256){We(C,U,g,w,b,x,L,A,k);return}}N&8?(R&16&&ge(C,b,x),U!==C&&h(g,U)):R&16?N&16?tt(C,U,g,w,b,x,L,A,k):ge(C,b,x,!0):(R&8&&h(g,""),N&16&&Le(U,g,w,b,x,L,A,k))},We=(u,d,g,w,b,x,L,A,k)=>{u=u||St,d=d||St;const C=u.length,R=d.length,U=Math.min(C,R);let T;for(T=0;TR?ge(u,b,x,!0,!1,U):Le(d,g,w,b,x,L,A,k,U)},tt=(u,d,g,w,b,x,L,A,k)=>{let C=0;const R=d.length;let U=u.length-1,T=R-1;for(;C<=U&&C<=T;){const N=u[C],K=d[C]=k?rt(d[C]):Be(d[C]);if(Wt(N,K))z(N,K,g,null,b,x,L,A,k);else break;C++}for(;C<=U&&C<=T;){const N=u[U],K=d[T]=k?rt(d[T]):Be(d[T]);if(Wt(N,K))z(N,K,g,null,b,x,L,A,k);else break;U--,T--}if(C>U){if(C<=T){const N=T+1,K=NT)for(;C<=U;)Ce(u[C],b,x,!0),C++;else{const N=C,K=C,te=new Map;for(C=K;C<=T;C++){const Ie=d[C]=k?rt(d[C]):Be(d[C]);Ie.key!=null&&te.set(Ie.key,C)}let oe,fe=0;const $e=T-K+1;let jt=!1,Bs=0;const Kt=new Array($e);for(C=0;C<$e;C++)Kt[C]=0;for(C=N;C<=U;C++){const Ie=u[C];if(fe>=$e){Ce(Ie,b,x,!0);continue}let He;if(Ie.key!=null)He=te.get(Ie.key);else for(oe=K;oe<=T;oe++)if(Kt[oe-K]===0&&Wt(Ie,d[oe])){He=oe;break}He===void 0?Ce(Ie,b,x,!0):(Kt[He-K]=C+1,He>=Bs?Bs=He:jt=!0,z(Ie,d[He],g,null,b,x,L,A,k),fe++)}const Ds=jt?Pa(Kt):St;for(oe=Ds.length-1,C=$e-1;C>=0;C--){const Ie=K+C,He=d[Ie],qs=Ie+1{const{el:x,type:L,transition:A,children:k,shapeFlag:C}=u;if(C&6){Ne(u.component.subTree,d,g,w);return}if(C&128){u.suspense.move(d,g,w);return}if(C&64){L.move(u,d,g,M);return}if(L===ue){s(x,d,g);for(let U=0;UA.enter(x),b);else{const{leave:U,delayLeave:T,afterLeave:N}=A,K=()=>s(x,d,g),te=()=>{U(x,()=>{K(),N&&N()})};T?T(x,K,te):te()}else s(x,d,g)},Ce=(u,d,g,w=!1,b=!1)=>{const{type:x,props:L,ref:A,children:k,dynamicChildren:C,shapeFlag:R,patchFlag:U,dirs:T}=u;if(A!=null&&ps(A,null,g,u,!0),R&256){d.ctx.deactivate(u);return}const N=R&1&&T,K=!Xt(u);let te;if(K&&(te=L&&L.onVnodeBeforeUnmount)&&Fe(te,d,u),R&6)dn(u.component,g,w);else{if(R&128){u.suspense.unmount(g,w);return}N&>(u,null,d,"beforeUnmount"),R&64?u.type.remove(u,d,g,b,M,w):C&&(x!==ue||U>0&&U&64)?ge(C,d,g,!1,!0):(x===ue&&U&384||!b&&R&16)&&ge(k,d,g),w&&It(u)}(K&&(te=L&&L.onVnodeUnmounted)||N)&&Ae(()=>{te&&Fe(te,d,u),N&>(u,null,d,"unmounted")},g)},It=u=>{const{type:d,el:g,anchor:w,transition:b}=u;if(d===ue){Lt(g,w);return}if(d===Cn){X(u);return}const x=()=>{o(g),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(u.shapeFlag&1&&b&&!b.persisted){const{leave:L,delayLeave:A}=b,k=()=>L(g,x);A?A(u.el,x,k):k()}else x()},Lt=(u,d)=>{let g;for(;u!==d;)g=m(u),o(u),u=g;o(d)},dn=(u,d,g)=>{const{bum:w,scope:b,update:x,subTree:L,um:A}=u;w&&Gn(w),b.stop(),x&&(x.active=!1,Ce(L,u,d,g)),A&&Ae(A,d),Ae(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},ge=(u,d,g,w=!1,b=!1,x=0)=>{for(let L=x;Lu.shapeFlag&6?v(u.component.subTree):u.shapeFlag&128?u.suspense.next():m(u.anchor||u.el);let j=!1;const I=(u,d,g)=>{u==null?d._vnode&&Ce(d._vnode,null,null,!0):z(d._vnode||null,u,d,null,null,null,g),j||(j=!0,eo(),vi(),j=!1),d._vnode=u},M={p:z,um:Ce,m:Ne,r:It,mt:qt,mc:Le,pc:Q,pbc:ze,n:v,o:e};let Y,se;return t&&([Y,se]=t(M)),{render:I,hydrate:Y,createApp:ka(I,Y)}}function Jn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function mt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Ea(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Oi(e,t,n=!1){const s=e.children,o=t.children;if(H(s)&&H(o))for(let i=0;i>1,e[n[a]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,r=n[i-1];i-- >0;)n[i]=r,r=t[r];return n}function zi(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:zi(t)}const Ta=e=>e.__isTeleport,ue=Symbol.for("v-fgt"),Fn=Symbol.for("v-txt"),ft=Symbol.for("v-cmt"),Cn=Symbol.for("v-stc"),Yt=[];let Ee=null;function E(e=!1){Yt.push(Ee=e?null:[])}function Ua(){Yt.pop(),Ee=Yt[Yt.length-1]||null}let on=1;function ho(e){on+=e}function Vi(e){return e.dynamicChildren=on>0?Ee||St:null,Ua(),on>0&&Ee&&Ee.push(e),e}function O(e,t,n,s,o,i){return Vi(l(e,t,n,s,o,i,!0))}function Bn(e,t,n,s,o){return Vi(_(e,t,n,s,o,!0))}function Rn(e){return e?e.__v_isVNode===!0:!1}function Wt(e,t){return e.type===t.type&&e.key===t.key}const Dn="__vInternal",Ni=({key:e})=>e??null,An=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?de(e)||ke(e)||q(e)?{i:we,r:e,k:t,f:!!n}:e:null);function l(e,t=null,n=null,s=0,o=null,i=e===ue?0:1,r=!1,a=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ni(t),ref:t&&An(t),scopeId:Nn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:we};return a?(Os(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=de(n)?8:16),on>0&&!r&&Ee&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ee.push(c),c}const _=Oa;function Oa(e,t=null,n=null,s=0,o=null,i=!1){if((!e||e===Yr)&&(e=ft),Rn(e)){const a=Ot(e,t,!0);return n&&Os(a,n),on>0&&!i&&Ee&&(a.shapeFlag&6?Ee[Ee.indexOf(e)]=a:Ee.push(a)),a.patchFlag|=-2,a}if(Za(e)&&(e=e.__vccOpts),t){t=za(t);let{class:a,style:c}=t;a&&!de(a)&&(t.class=ht(a)),re(c)&&(ui(c)&&!H(c)&&(c=pe({},c)),t.style=an(c))}const r=de(e)?1:ea(e)?128:Ta(e)?64:re(e)?4:q(e)?2:0;return l(e,t,n,s,o,r,i,!0)}function za(e){return e?ui(e)||Dn in e?pe({},e):e:null}function Ot(e,t,n=!1){const{props:s,ref:o,patchFlag:i,children:r}=e,a=t?Va(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&Ni(a),ref:t&&t.ref?n&&o?H(o)?o.concat(An(t)):[o,An(t)]:An(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:r,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ue?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ot(e.ssContent),ssFallback:e.ssFallback&&Ot(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function W(e=" ",t=0){return _(Fn,null,e,t)}function Ft(e,t){const n=_(Cn,null,e);return n.staticCount=t,n}function gs(e="",t=!1){return t?(E(),Bn(ft,null,e)):_(ft,null,e)}function Be(e){return e==null||typeof e=="boolean"?_(ft):H(e)?_(ue,null,e.slice()):typeof e=="object"?rt(e):_(Fn,null,String(e))}function rt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ot(e)}function Os(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(H(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),Os(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(Dn in t)?t._ctx=we:o===3&&we&&(we.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:we},n=32):(t=String(t),s&64?(n=16,t=[W(t)]):n=8);e.children=t,e.shapeFlag|=n}function Va(...e){const t={};for(let n=0;n{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),i=>{o.length>1?o.forEach(r=>r(i)):o[0](i)}};$n=t("__VUE_INSTANCE_SETTERS__",n=>_e=n),ms=t("__VUE_SSR_SETTERS__",n=>qn=n)}const ln=e=>{const t=_e;return $n(e),e.scope.on(),()=>{e.scope.off(),$n(t)}},fo=()=>{_e&&_e.scope.off(),$n(null)};function Hi(e){return e.vnode.shapeFlag&4}let qn=!1;function Ba(e,t=!1){t&&ms(t);const{props:n,children:s}=e.vnode,o=Hi(e);Ia(e,n,o,t),Ra(e,s);const i=o?Da(e,t):void 0;return t&&ms(!1),i}function Da(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Ss(new Proxy(e.ctx,ba));const{setup:s}=n;if(s){const o=e.setupContext=s.length>1?Ka(e):null,i=ln(e);yt();const r=ut(s,e,0,[e.props,o]);if(Ct(),i(),Bo(r)){if(r.then(fo,fo),t)return r.then(a=>{po(e,a,t)}).catch(a=>{zn(a,e,0)});e.asyncDep=r}else po(e,r,t)}else Fi(e,t)}function po(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:re(t)&&(e.setupState=gi(t)),Fi(e,n)}let go;function Fi(e,t,n){const s=e.type;if(!e.render){if(!t&&go&&!s.render){const o=s.template||Ts(e).template;if(o){const{isCustomElement:i,compilerOptions:r}=e.appContext.config,{delimiters:a,compilerOptions:c}=s,f=pe(pe({isCustomElement:i,delimiters:a},r),c);s.render=go(o,f)}}e.render=s.render||je}{const o=ln(e);yt();try{va(e)}finally{Ct(),o()}}}function qa(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return xe(e,"get","$attrs"),t[n]}}))}function Ka(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return qa(e)},slots:e.slots,emit:e.emit,expose:t}}function zs(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(gi(Ss(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Qt)return Qt[n](e)},has(t,n){return n in t||n in Qt}}))}function Wa(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function Za(e){return q(e)&&"__vccOpts"in e}const Me=(e,t)=>zr(e,t,qn);function Bi(e,t,n){const s=arguments.length;return s===2?re(t)&&!H(t)?Rn(t)?_(e,null,[t]):_(e,t):_(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Rn(n)&&(n=[n]),_(e,t,n))}const Ga="3.4.15";/** -* @vue/runtime-dom v3.4.15 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/const Xa="http://www.w3.org/2000/svg",Qa="http://www.w3.org/1998/Math/MathML",at=typeof document<"u"?document:null,mo=at&&at.createElement("template"),Ya={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?at.createElementNS(Xa,e):t==="mathml"?at.createElementNS(Qa,e):at.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>at.createTextNode(e),createComment:e=>at.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>at.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,i){const r=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{mo.innerHTML=s==="svg"?`${e}`:s==="mathml"?`${e}`:e;const a=mo.content;if(s==="svg"||s==="mathml"){const c=a.firstChild;for(;c.firstChild;)a.appendChild(c.firstChild);a.removeChild(c)}t.insertBefore(a,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ja=Symbol("_vtc");function el(e,t,n){const s=e[Ja];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const tl=Symbol("_vod"),nl=Symbol("");function sl(e,t,n){const s=e.style,o=s.display,i=de(n);if(n&&!i){if(t&&!de(t))for(const r in t)n[r]==null&&_s(s,r,"");for(const r in n)_s(s,r,n[r])}else if(i){if(t!==n){const r=s[nl];r&&(n+=";"+r),s.cssText=n}}else t&&e.removeAttribute("style");tl in e&&(s.display=o)}const _o=/\s*!important$/;function _s(e,t,n){if(H(n))n.forEach(s=>_s(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=ol(e,t);_o.test(n)?e.setProperty(Ht(s),n.replace(_o,""),"important"):e[s]=n}}const bo=["Webkit","Moz","ms"],es={};function ol(e,t){const n=es[t];if(n)return n;let s=qe(t);if(s!=="filter"&&s in e)return es[t]=s;s=Tn(s);for(let o=0;ots||(dl.then(()=>ts=0),ts=Date.now());function fl(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Pe(pl(s,n.value),t,5,[s])};return n.value=e,n.attached=hl(),n}function pl(e,t){if(H(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const Co=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,gl=(e,t,n,s,o,i,r,a,c)=>{const f=o==="svg";t==="class"?el(e,s,f):t==="style"?sl(e,n,s):Mn(t)?Cs(t)||cl(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ml(e,t,s,f))?rl(e,t,s,i,r,a,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),il(e,t,s,f))};function ml(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Co(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Co(t)&&de(n)?!1:t in e}const _l=pe({patchProp:gl},Ya);let Ao;function bl(){return Ao||(Ao=Sa(_l))}const vl=(...e)=>{const t=bl().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=yl(s);if(!o)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=o.innerHTML),o.innerHTML="";const r=n(o,!1,wl(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),r},t};function wl(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function yl(e){return de(e)?document.querySelector(e):e}var Cl=!1;/*! - * pinia v2.1.7 - * (c) 2023 Eduardo San Martin Morote - * @license MIT - */const Al=Symbol();var xo;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(xo||(xo={}));function xl(){const e=mr(!0),t=e.run(()=>fi({}));let n=[],s=[];const o=Ss({install(i){o._a=i,i.provide(Al,o),i.config.globalProperties.$pinia=o,s.forEach(r=>n.push(r)),s=[]},use(i){return!this._a&&!Cl?s.push(i):n.push(i),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const Kn=[{route:"/dubai",image:{src:"dubai/venice-showcase.png",alt:"Website for a real estate project"},name:"Dubai",slogan:"Real estate website for Dubai",clients:["Gravitas Property Ventures"],task:"UI Design",industry:"Real Estate",date:"Jan 2024",active:!0},{route:"/trafficticket",image:{src:"trafficticket/ticket1.jpeg",alt:"A parking ticket on a windshield"},name:"Traffic ticket",slogan:"Processing traffic tickets for a car rental",clients:["MaibornWolff","Car rental company"],task:"Product Management",industry:"Mobility",date:"Feb 2022-Jan 2023",active:!0},{route:"/esgehtlos",image:{src:"esgehtlos/demo.png",alt:"Screen design for mobile web app"},name:"Es geht los",slogan:"More democracy with civic councils",clients:["MaibornWolff","Demokratie Innovation e. V."],task:"UI Design",industry:"NGO",date:"Jan-Feb 2022",active:!0},{route:"/scenariomanager",image:{src:"scenariomanager/brainstorming-sideshot.jpg",alt:"Scenario Manager UI"},name:"Scenario Manager",slogan:"Helping financial decision makers in stormy times",clients:["Valsight"],task:"UX Research",industry:"Finance",date:"Jan-Mar 2020",active:!1},{route:"/knimehub",image:{src:"knimehub/front_page.jpg",alt:"Screenshot of the landing page of KNIME hub"},name:"KNIME Hub",slogan:"Collaborative platform for data scientists",clients:["KNIME"],task:"UI/UX Design",industry:"Data Science",date:"2018-2019",active:!0},{route:"/greenbox",image:{src:"greenbox/greenbox_app2.png",alt:"Usability test of the greenbox app"},name:"Greenbox",slogan:"Turning people into urban gardeners",clients:["Greenbox"],task:"Usability evaluation",industry:"B2C App",date:"2015",active:!1},{route:"/phoenix",image:{src:"phoenix/phoenix_mp.jpg",alt:"Screenshot of phoenix application"},name:"Phoenix",slogan:"The musicplayer that knows what you want to hear",clients:["Myself"],task:"Design & Development",industry:"Entertainment",date:"2015-2017",active:!1},{route:"/querybuilder",image:{src:"querybuilder/querybuilder.png",alt:"Graph representation of an SQL query"},name:"Querybuilder",slogan:"Finding the needle in the data haystack",clients:["KNIME"],task:"UI/UX Design",industry:"Data Science",date:"2018",active:!1},{route:"/codesnippets",image:{src:"codesnippets/formulas04.jpg",alt:"Screenshot of phoenix application"},name:"Code snippets",slogan:"Code snippets for faster data transformation",clients:["KNIME"],task:"UI/UX Design",industry:"Data Science",date:"2017",active:!1},{route:"/mechanics",image:{src:"mechanics/mechanics.png",alt:"Mechanic with helmet camera interacting with tablet"},name:"Mechanics",slogan:"Digitalizing the work of mechanics",clients:["Condat"],task:"Field test",industry:"Manufacturing",date:"2015",active:!1},{route:"/thesis",image:{src:"thesis/adjustable-eyes.jpg",alt:"Adjustable artificial eyes"},name:"Thesis",slogan:"How to make eye tracking more robust",clients:["TU Berlin"],task:"Master thesis",industry:"Academia",date:"2016-2017",active:!1}],ot=Kn.filter(e=>e.active),kl=Kn.map(e=>e.route).concat(["/"]),ne=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Il={data(){return{projectRoutes:kl}}},Ll={id:"header"},jl={id:"grid",class:"responsive h6 regular"};function Rl(e,t,n,s,o,i){const r=S("router-link");return E(),O("div",Ll,[l("div",jl,[_(r,{id:"name",to:"/"},{default:ce(()=>[W(" Johannes Schweig ")]),_:1}),_(r,{id:"work",to:"/",class:ht([{active:o.projectRoutes.indexOf(e.$route.path)!=-1}])},{default:ce(()=>[W(" Home ")]),_:1},8,["class"]),_(r,{id:"about",to:"/about",class:ht([{active:e.$route.path==="/about"}])},{default:ce(()=>[W(" About ")]),_:1},8,["class"])])])}const $l=ne(Il,[["render",Rl],["__scopeId","data-v-1e5ccff0"]]),Sl={props:{href:{type:String,required:!0},size:{type:String,required:!0},text:{type:String,required:!0},type:{type:String,required:!0},bg:{type:String,required:!0}},computed:{bgStyle(){let e,t,n,s,o;return this.type==="primary"&&this.bg==="light"?(e="white",t="var(--blue-200)",n="var(--blue-100)",s="none"):this.type==="primary"&&this.bg==="dark"?(e="var(--dark-100)",t="var(--blue-300)",n="var(--blue-400)",s="none"):this.type==="secondary"&&this.bg==="light"?(e="var(--dark-200)",t="none",n="var(--light-200)",s="1px solid var(--dark-200)"):(e="var(--light-200)",t="none",n="var(--dark-200)",s="1px solid var(--light-200)"),o=e,{"--size":this.size==="lg"?"32px":"24px","--icon-color":e,"--bg-color":t,"--bg-hover-color":n,border:s,color:o,"grid-template-columns":this.$slots.default?"var(--size) 1fr":"1fr"}}}},Ml=["href"];function El(e,t,n,s,o,i){return E(),O("a",{href:n.href,style:an(i.bgStyle)},[_a(e.$slots,"default",{},void 0,!0),n.text?(E(),O("span",{key:0,class:ht(["text",n.size==="lg"?"button-lg":"button"])},ae(n.text),3)):gs("",!0)],12,Ml)}const cn=ne(Sl,[["render",El],["__scopeId","data-v-637f64df"]]),Pl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 91 76"},Tl=l("path",{d:"M87.63.167.925 43.57c-1.3.602-1.199 2.5.102 3l18.699 7.5 55.898-40.398-44.797 44.797v14.2c0 1.6 2 2.198 2.898 1l8.301-10.798 31.301 12.5c.898.399 2-.199 2.2-1.199l14.5-72.203c.198-1.3-1.2-2.398-2.399-1.8"},null,-1),Ul=[Tl];function Ol(e,t){return E(),O("svg",Pl,[...Ul])}const Di={render:Ol},zl={components:{Button:cn,SendIcon:Di},data(){return{platforms:[{name:"LinkedIn",url:"https://linkedin.com/in/jschweig"},{name:"Uplink",url:"https://uplink.tech/"},{name:"Malt",url:"https://www.malt.de/profile/johannesschweig"},{name:"Freelance.de",url:"https://freelance.de/"},{name:"Freelancermap",url:"https://www.freelancermap.de/profil/ux-und-product-consultant"},{name:"GitHub",url:"https://github.com/johannesschweig"},{name:"ux.stackexchange",url:"https://ux.stackexchange.com/users/110814/nash"}]}}},At=e=>(Qe("data-v-4b352d11"),e=e(),Ye(),e),Vl={class:"wrapper"},Nl={class:"responsive"},Hl=At(()=>l("h4",null,"Sounds interesting?",-1)),Fl=At(()=>l("p",{class:"body1"},"Send me a message.",-1)),Bl={class:"buttons"},Dl=At(()=>l("div",{class:"divider"},null,-1)),ql={class:"footer"},Kl=At(()=>l("div",null,[l("h6",null,"Contact"),l("p",{class:"body2"},[W("Johannes Schweig"),l("br"),W(" Flemingstr 6, 10557 Berlin"),l("br"),l("br"),W("hello@johannesschweig.de"),l("br"),W("www.johannesschweig.de ")])],-1)),Wl=At(()=>l("h6",null,"Socials",-1)),Zl=["href"],Gl=At(()=>l("div",null,[l("h6",null,"Legal"),l("a",{class:"body2 greylink",href:"/legal"},"Imprint/Impressum")],-1)),Xl=At(()=>l("a",{class:"body2 greylink disclaimer",href:"https://github.com/johannesschweig/johannesschweig.github.io"},"Made by Johannes Schweig with Vue.js",-1));function Ql(e,t,n,s,o,i){const r=S("SendIcon"),a=S("Button");return E(),O("div",Vl,[l("div",Nl,[Hl,Fl,l("div",Bl,[_(a,{type:"primary",bg:"dark",size:"sm",text:"Send me an email",href:"mailto:hello@johannesschweig.de"},{default:ce(()=>[_(r)]),_:1}),_(a,{type:"secondary",bg:"dark",size:"sm",text:"LinkedIn",href:"https://linkedin.com/in/jschweig"})]),Dl,l("div",ql,[Kl,l("div",null,[Wl,(E(!0),O(ue,null,wt(o.platforms,c=>(E(),O("a",{href:c.url,class:"body2 greylink"},ae(c.name),9,Zl))),256))]),Gl,Xl])])])}const Yl=ne(zl,[["render",Ql],["__scopeId","data-v-4b352d11"]]),Jl={name:"App",components:{Footer:Yl,Header:$l}},ec={id:"content"};function tc(e,t,n,s,o,i){const r=S("Header"),a=S("router-view"),c=S("Footer");return E(),O(ue,null,[_(r),l("div",ec,[_(a)]),_(c)],64)}const nc=ne(Jl,[["render",tc]]);/*! - * vue-router v4.2.5 - * (c) 2023 Eduardo San Martin Morote - * @license MIT - */const Rt=typeof window<"u";function sc(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const J=Object.assign;function ns(e,t){const n={};for(const s in t){const o=t[s];n[s]=Te(o)?o.map(e):e(o)}return n}const Jt=()=>{},Te=Array.isArray,oc=/\/$/,ic=e=>e.replace(oc,"");function ss(e,t,n="/"){let s,o={},i="",r="";const a=t.indexOf("#");let c=t.indexOf("?");return a=0&&(c=-1),c>-1&&(s=t.slice(0,c),i=t.slice(c+1,a>-1?a:t.length),o=e(i)),a>-1&&(s=s||t.slice(0,a),r=t.slice(a,t.length)),s=cc(s??t,n),{fullPath:s+(i&&"?")+i+r,path:s,query:o,hash:r}}function rc(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function ko(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function ac(e,t,n){const s=t.matched.length-1,o=n.matched.length-1;return s>-1&&s===o&&zt(t.matched[s],n.matched[o])&&qi(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function zt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function qi(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!lc(e[n],t[n]))return!1;return!0}function lc(e,t){return Te(e)?Io(e,t):Te(t)?Io(t,e):e===t}function Io(e,t){return Te(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function cc(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),o=s[s.length-1];(o===".."||o===".")&&s.push("");let i=n.length-1,r,a;for(r=0;r1&&i--;else break;return n.slice(0,i).join("/")+"/"+s.slice(r-(r===s.length?1:0)).join("/")}var rn;(function(e){e.pop="pop",e.push="push"})(rn||(rn={}));var en;(function(e){e.back="back",e.forward="forward",e.unknown=""})(en||(en={}));function uc(e){if(!e)if(Rt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),ic(e)}const dc=/^[^#]+#/;function hc(e,t){return e.replace(dc,"#")+t}function fc(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Wn=()=>({left:window.pageXOffset,top:window.pageYOffset});function pc(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=fc(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function Lo(e,t){return(history.state?history.state.position-t:-1)+e}const bs=new Map;function gc(e,t){bs.set(e,t)}function mc(e){const t=bs.get(e);return bs.delete(e),t}let _c=()=>location.protocol+"//"+location.host;function Ki(e,t){const{pathname:n,search:s,hash:o}=t,i=e.indexOf("#");if(i>-1){let a=o.includes(e.slice(i))?e.slice(i).length:1,c=o.slice(a);return c[0]!=="/"&&(c="/"+c),ko(c,"")}return ko(n,e)+s+o}function bc(e,t,n,s){let o=[],i=[],r=null;const a=({state:m})=>{const y=Ki(e,location),$=n.value,z=t.value;let V=0;if(m){if(n.value=y,t.value=m,r&&r===$){r=null;return}V=z?m.position-z.position:0}else s(y);o.forEach(P=>{P(n.value,$,{delta:V,type:rn.pop,direction:V?V>0?en.forward:en.back:en.unknown})})};function c(){r=n.value}function f(m){o.push(m);const y=()=>{const $=o.indexOf(m);$>-1&&o.splice($,1)};return i.push(y),y}function h(){const{history:m}=window;m.state&&m.replaceState(J({},m.state,{scroll:Wn()}),"")}function p(){for(const m of i)m();i=[],window.removeEventListener("popstate",a),window.removeEventListener("beforeunload",h)}return window.addEventListener("popstate",a),window.addEventListener("beforeunload",h,{passive:!0}),{pauseListeners:c,listen:f,destroy:p}}function jo(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Wn():null}}function vc(e){const{history:t,location:n}=window,s={value:Ki(e,n)},o={value:t.state};o.value||i(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(c,f,h){const p=e.indexOf("#"),m=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+c:_c()+e+c;try{t[h?"replaceState":"pushState"](f,"",m),o.value=f}catch(y){console.error(y),n[h?"replace":"assign"](m)}}function r(c,f){const h=J({},t.state,jo(o.value.back,c,o.value.forward,!0),f,{position:o.value.position});i(c,h,!0),s.value=c}function a(c,f){const h=J({},o.value,t.state,{forward:c,scroll:Wn()});i(h.current,h,!0);const p=J({},jo(s.value,c,null),{position:h.position+1},f);i(c,p,!1),s.value=c}return{location:s,state:o,push:a,replace:r}}function wc(e){e=uc(e);const t=vc(e),n=bc(e,t.state,t.location,t.replace);function s(i,r=!0){r||n.pauseListeners(),history.go(i)}const o=J({location:"",base:e,go:s,createHref:hc.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function yc(e){return typeof e=="string"||e&&typeof e=="object"}function Wi(e){return typeof e=="string"||typeof e=="symbol"}const st={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Zi=Symbol("");var Ro;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Ro||(Ro={}));function Vt(e,t){return J(new Error,{type:e,[Zi]:!0},t)}function Ze(e,t){return e instanceof Error&&Zi in e&&(t==null||!!(e.type&t))}const $o="[^/]+?",Cc={sensitive:!1,strict:!1,start:!0,end:!0},Ac=/[.+*?^${}()[\]/\\]/g;function xc(e,t){const n=J({},Cc,t),s=[];let o=n.start?"^":"";const i=[];for(const f of e){const h=f.length?[]:[90];n.strict&&!f.length&&(o+="/");for(let p=0;pt.length?t.length===1&&t[0]===80?1:-1:0}function Ic(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const Lc={type:0,value:""},jc=/[a-zA-Z0-9_]/;function Rc(e){if(!e)return[[]];if(e==="/")return[[Lc]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(y){throw new Error(`ERR (${n})/"${f}": ${y}`)}let n=0,s=n;const o=[];let i;function r(){i&&o.push(i),i=[]}let a=0,c,f="",h="";function p(){f&&(n===0?i.push({type:0,value:f}):n===1||n===2||n===3?(i.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:f,regexp:h,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),f="")}function m(){f+=c}for(;a{r(F)}:Jt}function r(h){if(Wi(h)){const p=s.get(h);p&&(s.delete(h),n.splice(n.indexOf(p),1),p.children.forEach(r),p.alias.forEach(r))}else{const p=n.indexOf(h);p>-1&&(n.splice(p,1),h.record.name&&s.delete(h.record.name),h.children.forEach(r),h.alias.forEach(r))}}function a(){return n}function c(h){let p=0;for(;p=0&&(h.record.path!==n[p].record.path||!Gi(h,n[p]));)p++;n.splice(p,0,h),h.record.name&&!Eo(h)&&s.set(h.record.name,h)}function f(h,p){let m,y={},$,z;if("name"in h&&h.name){if(m=s.get(h.name),!m)throw Vt(1,{location:h});z=m.record.name,y=J(Mo(p.params,m.keys.filter(F=>!F.optional).map(F=>F.name)),h.params&&Mo(h.params,m.keys.map(F=>F.name))),$=m.stringify(y)}else if("path"in h)$=h.path,m=n.find(F=>F.re.test($)),m&&(y=m.parse($),z=m.record.name);else{if(m=p.name?s.get(p.name):n.find(F=>F.re.test(p.path)),!m)throw Vt(1,{location:h,currentLocation:p});z=m.record.name,y=J({},p.params,h.params),$=m.stringify(y)}const V=[];let P=m;for(;P;)V.unshift(P.record),P=P.parent;return{name:z,path:$,params:y,matched:V,meta:Pc(V)}}return e.forEach(h=>i(h)),{addRoute:i,resolve:f,removeRoute:r,getRoutes:a,getRecordMatcher:o}}function Mo(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function Mc(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Ec(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function Ec(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function Eo(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Pc(e){return e.reduce((t,n)=>J(t,n.meta),{})}function Po(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}function Gi(e,t){return t.children.some(n=>n===e||Gi(e,n))}const Xi=/#/g,Tc=/&/g,Uc=/\//g,Oc=/=/g,zc=/\?/g,Qi=/\+/g,Vc=/%5B/g,Nc=/%5D/g,Yi=/%5E/g,Hc=/%60/g,Ji=/%7B/g,Fc=/%7C/g,er=/%7D/g,Bc=/%20/g;function Vs(e){return encodeURI(""+e).replace(Fc,"|").replace(Vc,"[").replace(Nc,"]")}function Dc(e){return Vs(e).replace(Ji,"{").replace(er,"}").replace(Yi,"^")}function vs(e){return Vs(e).replace(Qi,"%2B").replace(Bc,"+").replace(Xi,"%23").replace(Tc,"%26").replace(Hc,"`").replace(Ji,"{").replace(er,"}").replace(Yi,"^")}function qc(e){return vs(e).replace(Oc,"%3D")}function Kc(e){return Vs(e).replace(Xi,"%23").replace(zc,"%3F")}function Wc(e){return e==null?"":Kc(e).replace(Uc,"%2F")}function Sn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function Zc(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;oi&&vs(i)):[s&&vs(s)]).forEach(i=>{i!==void 0&&(t+=(t.length?"&":"")+n,i!=null&&(t+="="+i))})}return t}function Gc(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=Te(s)?s.map(o=>o==null?null:""+o):s==null?s:""+s)}return t}const Xc=Symbol(""),Uo=Symbol(""),Ns=Symbol(""),tr=Symbol(""),ws=Symbol("");function Zt(){let e=[];function t(s){return e.push(s),()=>{const o=e.indexOf(s);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function lt(e,t,n,s,o){const i=s&&(s.enterCallbacks[o]=s.enterCallbacks[o]||[]);return()=>new Promise((r,a)=>{const c=p=>{p===!1?a(Vt(4,{from:n,to:t})):p instanceof Error?a(p):yc(p)?a(Vt(2,{from:t,to:p})):(i&&s.enterCallbacks[o]===i&&typeof p=="function"&&i.push(p),r())},f=e.call(s&&s.instances[o],t,n,c);let h=Promise.resolve(f);e.length<3&&(h=h.then(c)),h.catch(p=>a(p))})}function os(e,t,n,s){const o=[];for(const i of e)for(const r in i.components){let a=i.components[r];if(!(t!=="beforeRouteEnter"&&!i.instances[r]))if(Qc(a)){const f=(a.__vccOpts||a)[t];f&&o.push(lt(f,n,s,i,r))}else{let c=a();o.push(()=>c.then(f=>{if(!f)return Promise.reject(new Error(`Couldn't resolve component "${r}" at "${i.path}"`));const h=sc(f)?f.default:f;i.components[r]=h;const m=(h.__vccOpts||h)[t];return m&<(m,n,s,i,r)()}))}}return o}function Qc(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Oo(e){const t=Xe(Ns),n=Xe(tr),s=Me(()=>t.resolve(Pt(e.to))),o=Me(()=>{const{matched:c}=s.value,{length:f}=c,h=c[f-1],p=n.matched;if(!h||!p.length)return-1;const m=p.findIndex(zt.bind(null,h));if(m>-1)return m;const y=zo(c[f-2]);return f>1&&zo(h)===y&&p[p.length-1].path!==y?p.findIndex(zt.bind(null,c[f-2])):m}),i=Me(()=>o.value>-1&&t2(n.params,s.value.params)),r=Me(()=>o.value>-1&&o.value===n.matched.length-1&&qi(n.params,s.value.params));function a(c={}){return e2(c)?t[Pt(e.replace)?"replace":"push"](Pt(e.to)).catch(Jt):Promise.resolve()}return{route:s,href:Me(()=>s.value.href),isActive:i,isExactActive:r,navigate:a}}const Yc=ki({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Oo,setup(e,{slots:t}){const n=On(Oo(e)),{options:s}=Xe(Ns),o=Me(()=>({[Vo(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[Vo(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const i=t.default&&t.default(n);return e.custom?i:Bi("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},i)}}}),Jc=Yc;function e2(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function t2(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!Te(o)||o.length!==s.length||s.some((i,r)=>i!==o[r]))return!1}return!0}function zo(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Vo=(e,t,n)=>e??t??n,n2=ki({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=Xe(ws),o=Me(()=>e.route||s.value),i=Xe(Uo,0),r=Me(()=>{let f=Pt(i);const{matched:h}=o.value;let p;for(;(p=h[f])&&!p.components;)f++;return f}),a=Me(()=>o.value.matched[r.value]);yn(Uo,Me(()=>r.value+1)),yn(Xc,a),yn(ws,o);const c=fi();return wn(()=>[c.value,a.value,e.name],([f,h,p],[m,y,$])=>{h&&(h.instances[p]=f,y&&y!==h&&f&&f===m&&(h.leaveGuards.size||(h.leaveGuards=y.leaveGuards),h.updateGuards.size||(h.updateGuards=y.updateGuards))),f&&h&&(!y||!zt(h,y)||!m)&&(h.enterCallbacks[p]||[]).forEach(z=>z(f))},{flush:"post"}),()=>{const f=o.value,h=e.name,p=a.value,m=p&&p.components[h];if(!m)return No(n.default,{Component:m,route:f});const y=p.props[h],$=y?y===!0?f.params:typeof y=="function"?y(f):y:null,V=Bi(m,J({},$,t,{onVnodeUnmounted:P=>{P.component.isUnmounted&&(p.instances[h]=null)},ref:c}));return No(n.default,{Component:V,route:f})||V}}});function No(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const s2=n2;function o2(e){const t=Sc(e.routes,e),n=e.parseQuery||Zc,s=e.stringifyQuery||To,o=e.history,i=Zt(),r=Zt(),a=Zt(),c=Vr(st);let f=st;Rt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const h=ns.bind(null,v=>""+v),p=ns.bind(null,Wc),m=ns.bind(null,Sn);function y(v,j){let I,M;return Wi(v)?(I=t.getRecordMatcher(v),M=j):M=v,t.addRoute(M,I)}function $(v){const j=t.getRecordMatcher(v);j&&t.removeRoute(j)}function z(){return t.getRoutes().map(v=>v.record)}function V(v){return!!t.getRecordMatcher(v)}function P(v,j){if(j=J({},j||c.value),typeof v=="string"){const d=ss(n,v,j.path),g=t.resolve({path:d.path},j),w=o.createHref(d.fullPath);return J(d,g,{params:m(g.params),hash:Sn(d.hash),redirectedFrom:void 0,href:w})}let I;if("path"in v)I=J({},v,{path:ss(n,v.path,j.path).path});else{const d=J({},v.params);for(const g in d)d[g]==null&&delete d[g];I=J({},v,{params:p(d)}),j.params=p(j.params)}const M=t.resolve(I,j),Y=v.hash||"";M.params=h(m(M.params));const se=rc(s,J({},v,{hash:Dc(Y),path:M.path})),u=o.createHref(se);return J({fullPath:se,hash:Y,query:s===To?Gc(v.query):v.query||{}},M,{redirectedFrom:void 0,href:u})}function F(v){return typeof v=="string"?ss(n,v,c.value.path):J({},v)}function B(v,j){if(f!==v)return Vt(8,{from:j,to:v})}function X(v){return be(v)}function le(v){return X(J(F(v),{replace:!0}))}function D(v){const j=v.matched[v.matched.length-1];if(j&&j.redirect){const{redirect:I}=j;let M=typeof I=="function"?I(v):I;return typeof M=="string"&&(M=M.includes("?")||M.includes("#")?M=F(M):{path:M},M.params={}),J({query:v.query,hash:v.hash,params:"path"in M?{}:v.params},M)}}function be(v,j){const I=f=P(v),M=c.value,Y=v.state,se=v.force,u=v.replace===!0,d=D(I);if(d)return be(J(F(d),{state:typeof d=="object"?J({},Y,d.state):Y,force:se,replace:u}),j||I);const g=I;g.redirectedFrom=j;let w;return!se&&ac(s,M,I)&&(w=Vt(16,{to:g,from:M}),Ne(M,M,!0,!1)),(w?Promise.resolve(w):ze(g,M)).catch(b=>Ze(b)?Ze(b,2)?b:tt(b):Q(b,g,M)).then(b=>{if(b){if(Ze(b,2))return be(J({replace:u},F(b.to),{state:typeof b.to=="object"?J({},Y,b.to.state):Y,force:se}),j||g)}else b=pt(g,M,!0,u,Y);return et(g,M,b),b})}function Le(v,j){const I=B(v,j);return I?Promise.reject(I):Promise.resolve()}function xt(v){const j=Lt.values().next().value;return j&&typeof j.runWithContext=="function"?j.runWithContext(v):v()}function ze(v,j){let I;const[M,Y,se]=i2(v,j);I=os(M.reverse(),"beforeRouteLeave",v,j);for(const d of M)d.leaveGuards.forEach(g=>{I.push(lt(g,v,j))});const u=Le.bind(null,v,j);return I.push(u),ge(I).then(()=>{I=[];for(const d of i.list())I.push(lt(d,v,j));return I.push(u),ge(I)}).then(()=>{I=os(Y,"beforeRouteUpdate",v,j);for(const d of Y)d.updateGuards.forEach(g=>{I.push(lt(g,v,j))});return I.push(u),ge(I)}).then(()=>{I=[];for(const d of se)if(d.beforeEnter)if(Te(d.beforeEnter))for(const g of d.beforeEnter)I.push(lt(g,v,j));else I.push(lt(d.beforeEnter,v,j));return I.push(u),ge(I)}).then(()=>(v.matched.forEach(d=>d.enterCallbacks={}),I=os(se,"beforeRouteEnter",v,j),I.push(u),ge(I))).then(()=>{I=[];for(const d of r.list())I.push(lt(d,v,j));return I.push(u),ge(I)}).catch(d=>Ze(d,8)?d:Promise.reject(d))}function et(v,j,I){a.list().forEach(M=>xt(()=>M(v,j,I)))}function pt(v,j,I,M,Y){const se=B(v,j);if(se)return se;const u=j===st,d=Rt?history.state:{};I&&(M||u?o.replace(v.fullPath,J({scroll:u&&d&&d.scroll},Y)):o.push(v.fullPath,Y)),c.value=v,Ne(v,j,I,u),tt()}let Ve;function qt(){Ve||(Ve=o.listen((v,j,I)=>{if(!dn.listening)return;const M=P(v),Y=D(M);if(Y){be(J(Y,{replace:!0}),M).catch(Jt);return}f=M;const se=c.value;Rt&&gc(Lo(se.fullPath,I.delta),Wn()),ze(M,se).catch(u=>Ze(u,12)?u:Ze(u,2)?(be(u.to,M).then(d=>{Ze(d,20)&&!I.delta&&I.type===rn.pop&&o.go(-1,!1)}).catch(Jt),Promise.reject()):(I.delta&&o.go(-I.delta,!1),Q(u,M,se))).then(u=>{u=u||pt(M,se,!1),u&&(I.delta&&!Ze(u,8)?o.go(-I.delta,!1):I.type===rn.pop&&Ze(u,20)&&o.go(-1,!1)),et(M,se,u)}).catch(Jt)}))}let kt=Zt(),he=Zt(),ee;function Q(v,j,I){tt(v);const M=he.list();return M.length?M.forEach(Y=>Y(v,j,I)):console.error(v),Promise.reject(v)}function We(){return ee&&c.value!==st?Promise.resolve():new Promise((v,j)=>{kt.add([v,j])})}function tt(v){return ee||(ee=!v,qt(),kt.list().forEach(([j,I])=>v?I(v):j()),kt.reset()),v}function Ne(v,j,I,M){const{scrollBehavior:Y}=e;if(!Rt||!Y)return Promise.resolve();const se=!I&&mc(Lo(v.fullPath,0))||(M||!I)&&history.state&&history.state.scroll||null;return _i().then(()=>Y(v,j,se)).then(u=>u&&pc(u)).catch(u=>Q(u,v,j))}const Ce=v=>o.go(v);let It;const Lt=new Set,dn={currentRoute:c,listening:!0,addRoute:y,removeRoute:$,hasRoute:V,getRoutes:z,resolve:P,options:e,push:X,replace:le,go:Ce,back:()=>Ce(-1),forward:()=>Ce(1),beforeEach:i.add,beforeResolve:r.add,afterEach:a.add,onError:he.add,isReady:We,install(v){const j=this;v.component("RouterLink",Jc),v.component("RouterView",s2),v.config.globalProperties.$router=j,Object.defineProperty(v.config.globalProperties,"$route",{enumerable:!0,get:()=>Pt(c)}),Rt&&!It&&c.value===st&&(It=!0,X(o.location).catch(Y=>{}));const I={};for(const Y in st)Object.defineProperty(I,Y,{get:()=>c.value[Y],enumerable:!0});v.provide(Ns,j),v.provide(tr,li(I)),v.provide(ws,c);const M=v.unmount;Lt.add(v),v.unmount=function(){Lt.delete(v),Lt.size<1&&(f=st,Ve&&Ve(),Ve=null,c.value=st,It=!1,ee=!1),M()}}};function ge(v){return v.reduce((j,I)=>j.then(()=>xt(I)),Promise.resolve())}return dn}function i2(e,t){const n=[],s=[],o=[],i=Math.max(t.matched.length,e.matched.length);for(let r=0;rzt(f,a))?s.push(a):n.push(a));const c=e.matched[r];c&&(t.matched.find(f=>zt(f,c))||o.push(c))}return[n,s,o]}const r2={xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 32 32"},a2=Ft('',2),l2=[a2];function c2(e,t){return E(),O("svg",r2,[...l2])}const u2={render:c2},d2={xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 32 32"},h2=l("path",{fill:"#000",d:"M26.667 1.333A1.333 1.333 0 0 1 28 2.667v26.666a1.333 1.333 0 0 1-1.334 1.334H5.334A1.333 1.333 0 0 1 4 29.333V2.667a1.333 1.333 0 0 1 1.333-1.334zm0-1.333H5.333a2.667 2.667 0 0 0-2.666 2.667v26.666A2.667 2.667 0 0 0 5.333 32h21.334a2.667 2.667 0 0 0 2.666-2.667V2.667A2.667 2.667 0 0 0 26.667 0"},null,-1),f2=l("path",{fill:"#000",d:"M15.667 6.667a2 2 0 1 0 0-4 2 2 0 0 0 0 4M15.667 7A4.667 4.667 0 0 0 11 11.667h9.333A4.667 4.667 0 0 0 15.667 7M26.333 15.5H5v1.333h21.333zM26.333 20.587H5v1.333h21.333zM26.333 25.667H5V27h21.333z"},null,-1),p2=[h2,f2];function g2(e,t){return E(),O("svg",d2,[...p2])}const m2={render:g2},_2={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 48 48"},b2=l("g",{"data-name":"Layer 2"},[l("path",{d:"M24 .59a24 24 0 0 0-7.59 46.78c1.2.22 1.64-.52 1.64-1.16v-4.47c-6.68 1.46-8.09-2.83-8.09-2.83-1.12-2.77-2.69-3.51-2.69-3.51-2.18-1.49.16-1.46.16-1.46a5 5 0 0 1 3.68 2.47c2.14 3.67 5.62 2.61 7 2a5.07 5.07 0 0 1 1.52-3.21C14.3 34.59 8.7 32.54 8.7 23.34a9.26 9.26 0 0 1 2.47-6.44 8.63 8.63 0 0 1 .23-6.35s2-.65 6.6 2.46a22.7 22.7 0 0 1 12 0c4.58-3.11 6.6-2.46 6.6-2.46a8.63 8.63 0 0 1 .23 6.35 9.26 9.26 0 0 1 2.47 6.44c0 9.22-5.61 11.25-11 11.84a5.76 5.76 0 0 1 1.7 4.45v6.58c0 .79.43 1.39 1.65 1.15A24 24 0 0 0 24 .59",class:"cls-2"}),l("path",{d:"M9.09 35.05c-.05.12-.24.16-.41.07a.3.3 0 0 1-.22-.36c0-.12.24-.15.42-.07s.27.24.21.36M10.06 36.14c-.11.1-.34 0-.49-.12a.36.36 0 0 1-.07-.49.36.36 0 0 1 .49.11c.16.17.19.39.07.5M11 37.52c-.15.1-.39 0-.54-.21s-.14-.47 0-.57.38 0 .53.2.15.47 0 .58ZM12.3 38.85c-.13.15-.41.11-.61-.09s-.27-.47-.14-.61a.45.45 0 0 1 .62.09c.21.19.27.47.13.61M14.09 39.63c-.05.19-.32.27-.6.19s-.45-.3-.39-.49a.46.46 0 0 1 .6-.19c.27.08.45.3.39.49M16.06 39.77c0 .2-.23.36-.51.37S15 40 15 39.79s.22-.36.51-.37.52.16.52.35ZM17.89 39.46c0 .19-.17.39-.45.45s-.54-.07-.57-.26.16-.4.44-.45.54.06.58.26",class:"cls-3"})],-1),v2=[b2];function w2(e,t){return E(),O("svg",_2,[...v2])}const y2={render:w2},C2={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 104 104"},A2=l("path",{d:"M52 0C23.28 0 0 23.28 0 52s23.28 52 52 52l-.05-6.05H52c25.38 0 45.95-20.57 45.95-45.95H104c0-28.72-23.28-52-52-52m0 91.89c-22.03 0-39.89-17.86-39.89-39.89S29.97 12.1 52 12.1s39.89 17.86 39.89 39.89S74.03 91.88 52 91.88z"},null,-1),x2=l("path",{d:"M62.01 19.63c-13.39-4.36-26.22.83-33.55 7.78.19 8.99 1.63 16.01 3.94 21.97C35.57 34.3 47.79 21.9 62.01 19.64M20.39 39.31c-8.22 21.64 5.74 39.62 20.26 44.65-4.66-5.68-8.03-13.71-8.89-21.66-6.2-6.2-10.45-14.08-11.38-22.99M36.47 65.69c1.15 7.09 3.14 14.07 7.38 19.23 14.84 3.83 27.95-3.39 34.42-11.45-13.65 6.34-28.87 2.7-41.79-7.78"},null,-1),k2=l("path",{d:"M79.41 71.97c15.5-21.88.75-44.25-12.41-50.33-15.64 2.49-29.73 17.01-31.34 34.28 12.21 20.87 36.85 18.3 43.76 16.05"},null,-1),I2=[A2,x2,k2];function L2(e,t){return E(),O("svg",C2,[...I2])}const j2={render:L2},R2={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32"},$2=l("path",{d:"M27.126 4.876c-2.393-2.393-4.949-.844-6.548.755L5.468 20.742c-1.6 1.6-3.274 4.03-.756 6.547 2.518 2.52 4.949.845 6.548-.755l15.11-15.11c1.6-1.6 3.149-4.156.756-6.548M12.69 4.257l3.2 3.2 3.256-3.258q.332-.331.672-.62c-.341-1.722-1.323-3.277-3.93-3.277-2.612 0-3.592 1.562-3.932 3.286.244.211.488.422.734.669M19.144 28.023l-3.254-3.255-3.198 3.198a14 14 0 0 1-.725.673C12.333 30.393 13.37 32 15.888 32c2.524 0 3.56-1.615 3.925-3.375-.224-.193-.448-.381-.669-.602M11.333 12.013H5.164c-2.261 0-5.164.713-5.164 4.096 0 2.524 1.616 3.561 3.376 3.925.208-.24 7.957-8.021 7.957-8.021M28.413 12.177c-.195.227-7.96 8.028-7.96 8.028h6.08c2.263 0 5.165-.535 5.165-4.096 0-2.612-1.561-3.593-3.285-3.932M13.354 9.988l1.102-1.102-3.198-3.198c-1.6-1.6-4.03-3.274-6.548-.755-1.846 1.846-1.436 3.644-.457 5.103.299-.022 9.1-.048 9.1-.048M18.424 22.23l-1.105 1.104 3.257 3.257c1.6 1.6 4.156 3.148 6.548.756 1.785-1.786 1.376-3.66.389-5.163-.318.023-9.089.046-9.089.046"},null,-1),S2=[$2];function M2(e,t){return E(),O("svg",R2,[...S2])}const E2={render:M2},P2={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 144 144"},T2=l("path",{"fill-rule":"evenodd",d:"M0 144V0h144v144zm12.8-92.6c-.1-14.3.3-26.4.7-26.8.5-.4 4.1-.5 15-.1l.5 25.6c.5 23.9.6 25.8 2.5 27.9 1.1 1.2 3.2 2.8 4.8 3.6 1.5.8 4.6 1.4 7 1.4s5.5-.8 7.5-2c1.7-1.1 3.8-3 4.5-4.3.8-1.5 1.4-9.9 2.2-52.2h15l.2 25.5c.2 16-.1 27-.8 29.5-.7 2.7-2.8 5.7-6.5 9.2-4 3.9-6.8 5.7-10.6 6.8-2.9.8-8.6 1.5-12.5 1.5-4.6 0-9.1-.7-12-1.8-2.7-1-6.5-3.1-8.6-4.7-2.1-1.7-5-5.3-6.3-8-2.394-4.889-2.4-5.597-2.598-30.923zm68 35.8c-.1-20.8.3-38.2.7-38.6.5-.3 1.5-.4 2.2-.1s3.8.5 6.8.5c4.2 0 5.5.3 5.5 1.5 0 .8.1 1.5.3 1.5.1 0 2-.9 4.2-2 2.6-1.3 6-2 9.8-2 3.6 0 7.1.7 9.5 1.9 2 1 5.4 3.7 7.5 6 2.2 2.5 4.3 6.2 5.2 9.3.8 2.9 1.5 6.2 1.5 7.3s-.7 4.4-1.5 7.2c-.9 3.2-3 6.9-5.2 9.4-2.1 2.3-5.5 5-7.5 6-2.4 1.2-5.9 1.9-9.5 1.9-3.8 0-7.2-.7-9.8-2-2.2-1.1-4.1-2-4.2-2-.2 0-.3 7.2-.3 32H81z","clip-rule":"evenodd"},null,-1),U2=l("path",{d:"M101.3 63c-1.8 1.1-3.8 2.9-4.3 4s-1 3.8-1 6c0 3 .7 4.7 2.8 6.9 1.5 1.6 3.8 3.2 5.2 3.6s3.8.4 5.5 0 4.2-2 5.8-3.6c2.1-2.2 2.7-3.9 2.7-7.2 0-2.3-.7-5.2-1.5-6.5-.8-1.2-2.8-2.9-4.5-3.7s-4-1.5-5.2-1.5c-1.3 0-3.8.9-5.5 2"},null,-1),O2=[T2,U2];function z2(e,t){return E(),O("svg",P2,[...O2])}const V2={render:z2},N2={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 305 306"},H2=l("path",{"fill-rule":"evenodd",d:"M41 3.4c2.5-.8 6.7-1.9 9.5-2.3 2.7-.5 50-.8 205-.6l8 2.7c4.4 1.5 10.7 4.5 14 6.6 3.3 2.2 7.7 5.7 9.9 7.8 2.1 2.1 5.1 5.7 6.6 7.9s3.6 5.8 4.8 8c1.1 2.2 2.8 6 3.8 8.5 1.7 4.2 1.9 10.7 2.2 108 .2 74.8 0 105-.8 109-.6 3-3 9.3-5.3 14-3 5.9-6.1 10.4-10.7 15-3.6 3.7-9 8.1-12 9.8s-8.4 4.1-18.5 7.7h-209L41 303c-4.1-1.3-10.7-4.5-14.5-7.1-3.8-2.5-9.4-7.5-12.3-11-3-3.5-6.7-9.1-8.3-12.4S2.3 264 1.5 261C.2 256.3 0 240 0 153.2c0-91 .2-102.8 1.6-108 .9-3.1 3.2-8.9 5.2-12.7C9.1 28 12.9 23 17.5 18.4c3.8-3.9 9.7-8.5 13-10.3 3.3-1.7 8-3.9 10.5-4.7m79.7 41c4.9-1.4 11.3-2.9 14.3-3.3 3-.5 10.7-.9 17-1 6.6 0 15.3.6 20.5 1.5 4.9.9 12.8 2.9 17.5 4.6 4.7 1.6 11.9 4.8 16 7 4.1 2.3 8.9 5.1 10.5 6.2s5.7 4.3 9 7.1c3.3 2.7 8 7.2 10.5 9.9s5.6 6.3 6.8 8c1.3 1.7 3.8 5.4 5.6 8.1 1.8 2.8 4.4 7.3 5.8 10 1.5 2.8 4 9.1 5.7 14s3.8 12.8 4.6 17.5 1.5 13.4 1.5 19.5-.6 14.6-1.4 19-2.4 11.2-3.6 15c-1.2 3.9-4.2 11.1-6.7 16s-7 12.5-10.1 16.8c-3.2 4.3-8.6 10.7-12.2 14.1-3.6 3.5-10.1 8.8-14.5 11.8-4.4 3.1-10.7 6.9-14 8.5-3.3 1.7-8.9 4-12.5 5.3-3.6 1.2-8.1 2.6-10 3.1s-7.1 1.6-11.5 2.4-11.3 1.5-15.2 1.5c-4 0-10.8-.5-15-1.1-4.3-.5-12.1-2.2-17.3-3.6s-11-3.3-16-5.8V187l-28.7-.1c-15.9-.1-29.9-.4-31.3-.8-2.2-.6-2.7-1.7-4.2-8.6-1-4.4-2.1-12.9-2.4-19-.5-8-.2-13.9 1-21.5.9-5.8 2.9-14.3 4.5-19 1.5-4.7 4.4-11.6 6.3-15.5 2-3.8 5.7-10.1 8.3-14 2.6-3.8 8.4-10.6 12.9-15 4.4-4.4 9.9-9.4 12.1-11.1 2.2-1.6 6.3-4.4 9-6.1 2.8-1.8 8-4.6 11.8-6.2 3.7-1.7 10.6-4.2 15.4-5.7","clip-rule":"evenodd"},null,-1),F2=l("path",{d:"M142 70.6c-1.4.2-5 .9-8 1.6-3 .6-7.5 2-10 3-2.5 1.1-6.5 2.9-9 4s-7.7 4.4-11.5 7.3-8.8 7.2-11.1 9.6c-2.2 2.4-5.7 6.7-7.7 9.4-1.9 2.8-5.2 8.6-7.3 13-2 4.4-4.5 11.4-5.5 15.5-1.1 4.1-1.9 10.8-1.9 14.8v7.2h36c0-8.1.4-13 1-16s2.6-8.8 4.5-12.7c2-4.1 5.8-9.7 8.8-12.9 2.8-3 7.2-6.9 9.7-8.4 2.5-1.6 7.2-3.9 10.5-5.1 5.3-1.9 8.4-2.2 27.8-2.5L190 98v31c-39.5.5-41.1.6-43.7 2.6-1.5 1.2-4.1 3.8-5.8 5.9-2.6 3.3-3 4.6-3.2 11.1l-.3 7.4h53v31l-53-.5V235c3.5.8 9.4 1 15.5 1 8.3 0 13.3-.6 20.5-2.3 5.6-1.4 12.9-4.2 17.9-6.8 4.5-2.4 11.1-6.6 14.4-9.4 3.4-2.7 8.5-7.9 11.5-11.5 2.9-3.6 7.5-11 10.2-16.5s5.6-12.7 6.5-16 1.8-10.1 2.2-15c.3-5 0-12.2-.6-16.2s-2.2-10.8-3.6-15c-1.3-4.3-4.5-11.4-7.1-15.8-3.1-5.4-7.7-11-13.8-17-6.5-6.4-11.5-10.3-17.6-13.7-4.7-2.6-12.6-5.9-17.5-7.3-6.5-1.9-12-2.7-20-3-6.1-.2-12.1-.2-13.5.1"},null,-1),B2=[H2,F2];function D2(e,t){return E(),O("svg",N2,[...B2])}const q2={render:D2},K2="data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M1%208L0.646447%207.64645C0.451184%207.84171%200.451184%208.15829%200.646447%208.35355L1%208ZM15%208.5C15.2761%208.5%2015.5%208.27614%2015.5%208C15.5%207.72386%2015.2761%207.5%2015%207.5V8.5ZM5.85355%203.85355C6.04882%203.65829%206.04882%203.34171%205.85355%203.14645C5.65829%202.95118%205.34171%202.95118%205.14645%203.14645L5.85355%203.85355ZM5.14645%2012.8536C5.34171%2013.0488%205.65829%2013.0488%205.85355%2012.8536C6.04882%2012.6583%206.04882%2012.3417%205.85355%2012.1464L5.14645%2012.8536ZM1%208.5H15V7.5H1V8.5ZM1.35355%208.35355L5.85355%203.85355L5.14645%203.14645L0.646447%207.64645L1.35355%208.35355ZM0.646447%208.35355L5.14645%2012.8536L5.85355%2012.1464L1.35355%207.64645L0.646447%208.35355Z'%20fill='black'/%3e%3c/svg%3e",W2="data:image/svg+xml,%3csvg%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M26.6665%201.33333C27.0201%201.33333%2027.3593%201.47381%2027.6093%201.72386C27.8594%201.97391%2027.9998%202.31304%2027.9998%202.66667V29.3333C27.9998%2029.687%2027.8594%2030.0261%2027.6093%2030.2761C27.3593%2030.5262%2027.0201%2030.6667%2026.6665%2030.6667H5.33317C4.97955%2030.6667%204.64041%2030.5262%204.39036%2030.2761C4.14031%2030.0261%203.99984%2029.687%203.99984%2029.3333V2.66667C3.99984%202.31304%204.14031%201.97391%204.39036%201.72386C4.64041%201.47381%204.97955%201.33333%205.33317%201.33333H26.6665ZM26.6665%200H5.33317C4.62593%200%203.94765%200.280952%203.44755%200.781049C2.94746%201.28115%202.6665%201.95942%202.6665%202.66667V29.3333C2.6665%2030.0406%202.94746%2030.7189%203.44755%2031.219C3.94765%2031.719%204.62593%2032%205.33317%2032H26.6665C27.3737%2032%2028.052%2031.719%2028.5521%2031.219C29.0522%2030.7189%2029.3332%2030.0406%2029.3332%2029.3333V2.66667C29.3332%201.95942%2029.0522%201.28115%2028.5521%200.781049C28.052%200.280952%2027.3737%200%2026.6665%200V0Z'%20fill='black'/%3e%3cpath%20d='M15.6665%206.66675C16.7711%206.66675%2017.6665%205.77132%2017.6665%204.66675C17.6665%203.56218%2016.7711%202.66675%2015.6665%202.66675C14.5619%202.66675%2013.6665%203.56218%2013.6665%204.66675C13.6665%205.77132%2014.5619%206.66675%2015.6665%206.66675Z'%20fill='black'/%3e%3cpath%20d='M15.6667%207C14.429%207%2013.242%207.49167%2012.3668%208.36684C11.4917%209.24201%2011%2010.429%2011%2011.6667H20.3333C20.3333%2010.429%2019.8417%209.24201%2018.9665%208.36684C18.0913%207.49167%2016.9043%207%2015.6667%207Z'%20fill='black'/%3e%3cpath%20d='M26.3333%2015.5H5V16.8333H26.3333V15.5Z'%20fill='black'/%3e%3cpath%20d='M26.3333%2020.5867H5V21.92H26.3333V20.5867Z'%20fill='black'/%3e%3cpath%20d='M26.3333%2025.6667H5V27.0001H26.3333V25.6667Z'%20fill='black'/%3e%3c/svg%3e",Z2="data:image/svg+xml,%3csvg%20viewBox='0%200%20305%20306'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M41%203.4C43.5%202.6%2047.7%201.49999%2050.5%201.09999C53.2%200.599992%20100.5%200.299994%20255.5%200.499994L263.5%203.19999C267.9%204.69999%20274.2%207.69999%20277.5%209.79999C280.8%2012%20285.2%2015.5%20287.4%2017.6C289.5%2019.7%20292.5%2023.3%20294%2025.5C295.5%2027.7%20297.6%2031.3%20298.8%2033.5C299.9%2035.7%20301.6%2039.5%20302.6%2042C304.3%2046.2%20304.5%2052.7%20304.8%20150C305%20224.8%20304.8%20255%20304%20259C303.4%20262%20301%20268.3%20298.7%20273C295.7%20278.9%20292.6%20283.4%20288%20288C284.4%20291.7%20279%20296.1%20276%20297.8C273%20299.5%20267.6%20301.9%20257.5%20305.5H48.5L41%20303C36.9%20301.7%2030.3%20298.5%2026.5%20295.9C22.7%20293.4%2017.1%20288.4%2014.2%20284.9C11.2%20281.4%207.5%20275.8%205.9%20272.5C4.3%20269.2%202.3%20264%201.5%20261C0.2%20256.3%200%20240%200%20153.2C0%2062.2%200.199998%2050.4%201.6%2045.2C2.5%2042.1%204.8%2036.3%206.8%2032.5C9.1%2028%2012.9%2023%2017.5%2018.4C21.3%2014.5%2027.2%209.89999%2030.5%208.09999C33.8%206.39999%2038.5%204.2%2041%203.4ZM120.7%2044.4C125.6%2043%20132%2041.5%20135%2041.1C138%2040.6%20145.7%2040.2%20152%2040.1C158.6%2040.1%20167.3%2040.7%20172.5%2041.6C177.4%2042.5%20185.3%2044.5%20190%2046.2C194.7%2047.8%20201.9%2051%20206%2053.2C210.1%2055.5%20214.9%2058.3%20216.5%2059.4C218.1%2060.5%20222.2%2063.7%20225.5%2066.5C228.8%2069.2%20233.5%2073.7%20236%2076.4C238.5%2079.1%20241.6%2082.7%20242.8%2084.4C244.1%2086.1%20246.6%2089.8%20248.4%2092.5C250.2%2095.3%20252.8%2099.8%20254.2%20102.5C255.7%20105.3%20258.2%20111.6%20259.9%20116.5C261.6%20121.4%20263.7%20129.3%20264.5%20134C265.3%20138.7%20266%20147.4%20266%20153.5C266%20159.6%20265.4%20168.1%20264.6%20172.5C263.8%20176.9%20262.2%20183.7%20261%20187.5C259.8%20191.4%20256.8%20198.6%20254.3%20203.5C251.8%20208.4%20247.3%20216%20244.2%20220.3C241%20224.6%20235.6%20231%20232%20234.4C228.4%20237.9%20221.9%20243.2%20217.5%20246.2C213.1%20249.3%20206.8%20253.1%20203.5%20254.7C200.2%20256.4%20194.6%20258.7%20191%20260C187.4%20261.2%20182.9%20262.6%20181%20263.1C179.1%20263.6%20173.9%20264.7%20169.5%20265.5C165.1%20266.3%20158.2%20267%20154.3%20267C150.3%20267%20143.5%20266.5%20139.3%20265.9C135%20265.4%20127.2%20263.7%20122%20262.3C116.8%20260.9%20111%20259%20106%20256.5V187L77.3001%20186.9C61.4001%20186.8%2047.4001%20186.5%2046.0001%20186.1C43.8001%20185.5%2043.3001%20184.4%2041.8001%20177.5C40.8001%20173.1%2039.7001%20164.6%2039.4001%20158.5C38.9001%20150.5%2039.2001%20144.6%2040.4001%20137C41.3001%20131.2%2043.3001%20122.7%2044.9001%20118C46.4001%20113.3%2049.3001%20106.4%2051.2001%20102.5C53.2001%2098.7%2056.9001%2092.4%2059.5001%2088.5C62.1001%2084.7%2067.9001%2077.9%2072.4001%2073.5C76.8001%2069.1%2082.3001%2064.1%2084.5001%2062.4C86.7001%2060.8%2090.8001%2058%2093.5001%2056.3C96.3001%2054.5%20101.5%2051.7%20105.3%2050.1C109%2048.4%20115.9%2045.9%20120.7%2044.4Z'%20/%3e%3cpath%20d='M142%2070.6C140.6%2070.8%20137%2071.5%20134%2072.2C131%2072.8%20126.5%2074.2%20124%2075.2C121.5%2076.3%20117.5%2078.1%20115%2079.2C112.5%2080.3%20107.3%2083.6%20103.5%2086.5C99.7%2089.4%2094.7%2093.7%2092.4%2096.1C90.2%2098.5%2086.7%20102.8%2084.7%20105.5C82.8%20108.3%2079.5%20114.1%2077.4%20118.5C75.4%20122.9%2072.9%20129.9%2071.9%20134C70.8%20138.1%2070%20144.8%2070%20148.8V156H106C106%20147.9%20106.4%20143%20107%20140C107.6%20137%20109.6%20131.2%20111.5%20127.3C113.5%20123.2%20117.3%20117.6%20120.3%20114.4C123.1%20111.4%20127.5%20107.5%20130%20106C132.5%20104.4%20137.2%20102.1%20140.5%20100.9C145.8%2099%20148.9%2098.7%20168.3%2098.4L190%2098V129C150.5%20129.5%20148.9%20129.6%20146.3%20131.6C144.8%20132.8%20142.2%20135.4%20140.5%20137.5C137.9%20140.8%20137.5%20142.1%20137.3%20148.6L137%20156H190V187L137%20186.5V235C140.5%20235.8%20146.4%20236%20152.5%20236C160.8%20236%20165.8%20235.4%20173%20233.7C178.6%20232.3%20185.9%20229.5%20190.9%20226.9C195.4%20224.5%20202%20220.3%20205.3%20217.5C208.7%20214.8%20213.8%20209.6%20216.8%20206C219.7%20202.4%20224.3%20195%20227%20189.5C229.7%20184%20232.6%20176.8%20233.5%20173.5C234.4%20170.2%20235.3%20163.4%20235.7%20158.5C236%20153.5%20235.7%20146.3%20235.1%20142.3C234.5%20138.3%20232.9%20131.5%20231.5%20127.3C230.2%20123%20227%20115.9%20224.4%20111.5C221.3%20106.1%20216.7%20100.5%20210.6%2094.5C204.1%2088.1%20199.1%2084.2%20193%2080.8C188.3%2078.2%20180.4%2074.9%20175.5%2073.5C169%2071.6%20163.5%2070.8%20155.5%2070.5C149.4%2070.3%20143.4%2070.3%20142%2070.6Z'/%3e%3c/svg%3e",G2="data:image/svg+xml,%3csvg%20viewBox='0%200%20104%20104'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M52%200C23.28%200%200%2023.28%200%2052C0%2080.72%2023.28%20104%2052%20104L51.95%2097.95H52C77.38%2097.95%2097.95%2077.38%2097.95%2052H104C104%2023.28%2080.72%200%2052%200ZM52%2091.89C29.97%2091.89%2012.11%2074.03%2012.11%2052C12.11%2029.97%2029.97%2012.1%2052%2012.1C74.03%2012.1%2091.89%2029.96%2091.89%2051.99C91.89%2074.02%2074.03%2091.88%2052%2091.88V91.89Z'%20/%3e%3cpath%20d='M62.0102%2019.63C48.6202%2015.27%2035.7902%2020.46%2028.4602%2027.41C28.6502%2036.4%2030.0902%2043.42%2032.4002%2049.38C35.5702%2034.3%2047.7902%2021.9%2062.0102%2019.64'/%3e%3cpath%20d='M20.3901%2039.31C12.1701%2060.95%2026.1301%2078.93%2040.6501%2083.96C35.9901%2078.28%2032.6201%2070.25%2031.7601%2062.3C25.5601%2056.1%2021.3101%2048.22%2020.3801%2039.31'/%3e%3cpath%20d='M36.4702%2065.69C37.6202%2072.78%2039.6102%2079.76%2043.8502%2084.92C58.6902%2088.75%2071.8002%2081.53%2078.2702%2073.47C64.6202%2079.81%2049.4002%2076.17%2036.4802%2065.69'/%3e%3cpath%20d='M79.4102%2071.97C94.9102%2050.09%2080.1602%2027.72%2067.0002%2021.64C51.3602%2024.13%2037.2702%2038.65%2035.6602%2055.92C47.8702%2076.79%2072.5102%2074.22%2079.4202%2071.97'/%3e%3c/svg%3e",X2="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2048%2048'%3e%3cg%20id='Layer_2'%20data-name='Layer%202'%3e%3cg%20id='github_hover'%3e%3cpath%20class='cls-2'%20d='M24,.59a24,24,0,0,0-7.59,46.78c1.2.22,1.64-.52,1.64-1.16s0-2.46,0-4.47c-6.68,1.46-8.09-2.83-8.09-2.83C8.84,36.14,7.27,35.4,7.27,35.4c-2.18-1.49.16-1.46.16-1.46a5,5,0,0,1,3.68,2.47c2.14,3.67,5.62,2.61,7,2a5.07,5.07,0,0,1,1.52-3.21c-5.33-.61-10.93-2.66-10.93-11.86a9.26,9.26,0,0,1,2.47-6.44,8.63,8.63,0,0,1,.23-6.35s2-.65,6.6,2.46a22.7,22.7,0,0,1,12,0c4.58-3.11,6.6-2.46,6.6-2.46a8.63,8.63,0,0,1,.23,6.35,9.26,9.26,0,0,1,2.47,6.44c0,9.22-5.61,11.25-11,11.84A5.76,5.76,0,0,1,30,39.63c0,3.21,0,5.79,0,6.58s.43,1.39,1.65,1.15A24,24,0,0,0,24,.59Z'%20/%3e%3cpath%20class='cls-3'%20d='M9.09,35.05c-.05.12-.24.16-.41.07a.3.3,0,0,1-.22-.36c0-.12.24-.15.42-.07s.27.24.21.36Z'%20/%3e%3cpath%20class='cls-3'%20d='M10.06,36.14c-.11.1-.34,0-.49-.12a.36.36,0,0,1-.07-.49.36.36,0,0,1,.49.11c.16.17.19.39.07.5Z'%20/%3e%3cpath%20class='cls-3'%20d='M11,37.52c-.15.1-.39,0-.54-.21s-.14-.47,0-.57.38,0,.53.2.15.47,0,.58Z'%20/%3e%3cpath%20class='cls-3'%20d='M12.3,38.85c-.13.15-.41.11-.61-.09s-.27-.47-.14-.61a.45.45,0,0,1,.62.09c.21.19.27.47.13.61Z'%20/%3e%3cpath%20class='cls-3'%20d='M14.09,39.63c-.05.19-.32.27-.6.19s-.45-.3-.39-.49a.46.46,0,0,1,.6-.19c.27.08.45.3.39.49Z'%20/%3e%3cpath%20class='cls-3'%20d='M16.06,39.77c0,.2-.23.36-.51.37S15,40,15,39.79s.22-.36.51-.37.52.16.52.35Z'%20/%3e%3cpath%20class='cls-3'%20d='M17.89,39.46c0,.19-.17.39-.45.45s-.54-.07-.57-.26.16-.4.44-.45.54.06.58.26Z'%20/%3e%3c/g%3e%3c/g%3e%3c/svg%3e",Q2="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2048%2048'%20fill='none'%3e%3cg%20id='Layer_2'%20data-name='Layer%202'%3e%3cg%20id='linkedin_hover'%3e%3cpath%20class='cls-2'%20d='M40.9,40.9H33.79V29.76c0-2.65,0-6.07-3.7-6.07s-4.28,2.89-4.28,5.88V40.9H18.7V18h6.83v3.13h.1a7.46,7.46,0,0,1,6.73-3.7c7.21,0,8.54,4.74,8.54,10.91V40.9Zm-30.22-26a4.13,4.13,0,1,1,4.12-4.12,4.13,4.13,0,0,1-4.12,4.12Zm3.56,26H7.12V18h7.12V40.9ZM44.45,0H3.54A3.5,3.5,0,0,0,0,3.46V44.54A3.5,3.5,0,0,0,3.54,48H44.45A3.51,3.51,0,0,0,48,44.54V3.46A3.51,3.51,0,0,0,44.45,0Z'%20/%3e%3c/g%3e%3c/g%3e%3c/svg%3e",Y2="data:image/svg+xml,%3csvg%20viewBox='0%200%2048%2048'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M2%208C0.895431%208%200%208.89543%200%2010V38C0%2039.1046%200.895431%2040%202%2040H46C47.1046%2040%2048%2039.1046%2048%2038V10C48%208.89543%2047.1046%208%2046%208H2ZM4.45397%2015.8949C4.78821%2015.4552%205.41558%2015.3697%205.85524%2015.704L17.6644%2024.6814C17.6748%2024.6887%2017.6851%2024.6962%2017.6953%2024.704L23.2445%2028.9234C23.2774%2028.9483%2023.3113%2028.9715%2023.3463%2028.9929C23.4557%2029.06%2023.5746%2029.1097%2023.6985%2029.1406C23.7965%2029.165%2023.8978%2029.1775%2024.0001%2029.1775C24.2728%2029.1775%2024.5381%2029.0883%2024.7554%2028.9235L30.3048%2024.704C30.3096%2024.7003%2030.3144%2024.6967%2030.3193%2024.6932C30.3247%2024.6892%2030.3302%2024.6853%2030.3357%2024.6814L42.1449%2015.704C42.5845%2015.3697%2043.2119%2015.4552%2043.5461%2015.8949C43.8804%2016.3345%2043.7949%2016.9619%2043.3552%2017.2961L32.5631%2025.5004L43.3552%2033.7039C43.7949%2034.0381%2043.8804%2034.6655%2043.5462%2035.1052C43.2119%2035.5448%2042.5846%2035.6303%2042.1449%2035.2961L30.9107%2026.7566L25.9652%2030.5161C25.9232%2030.5481%2025.8804%2030.5789%2025.837%2030.6086C25.4213%2030.8935%2024.946%2031.077%2024.4495%2031.1463C24.3012%2031.1671%2024.1511%2031.1776%2024.0001%2031.1776C23.2907%2031.1776%2022.6007%2030.9455%2022.0356%2030.5167L17.0894%2026.7566L5.85521%2035.2961C5.41553%2035.6303%204.78816%2035.5448%204.45394%2035.1052C4.11973%2034.6655%204.20522%2034.0381%204.6449%2033.7039L15.437%2025.5004L4.64487%2017.2961C4.2052%2016.9619%204.11974%2016.3345%204.45397%2015.8949Z'%20fill='none'/%3e%3c/svg%3e",J2="data:image/svg+xml,%3csvg%20viewBox='0%200%2032%2032'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M27.1261%204.87569C24.7334%202.483%2022.1775%204.03163%2020.5779%205.63117L5.46766%2020.742C3.86812%2022.3413%202.19391%2024.7715%204.71218%2027.2894C7.23044%2029.8082%209.66063%2028.1337%2011.2598%2026.5341L26.3704%2011.4237C27.97%209.82399%2029.5186%207.26809%2027.1261%204.87569Z'%20/%3e%3cpath%20d='M12.6899%204.25681L15.8894%207.45619L19.1462%204.19946C19.3673%203.97784%2019.5918%203.77217%2019.8177%203.57821C19.4766%201.8575%2018.4948%200.30191%2015.8879%200.30191C13.2761%200.30191%2012.2955%201.86361%2011.9563%203.58805C12.2001%203.79898%2012.4435%204.01042%2012.6899%204.25681Z'%20/%3e%3cpath%20d='M19.1443%2028.023L15.8896%2024.7681L12.6917%2027.9657C12.4489%2028.2087%2012.2072%2028.4306%2011.9666%2028.6392C12.3333%2030.3933%2013.3712%2032%2015.8883%2032C18.4119%2032%2019.4484%2030.3847%2019.8128%2028.6249C19.5889%2028.4323%2019.365%2028.2435%2019.1443%2028.023Z'%20/%3e%3cpath%20d='M11.3327%2012.013H5.16431C2.90262%2012.013%200%2012.7256%200%2016.109C0%2018.6335%201.61583%2019.6702%203.3759%2020.0343C3.58429%2019.7937%2011.3327%2012.013%2011.3327%2012.013Z'%20/%3e%3cpath%20d='M28.4128%2012.1773C28.2176%2012.4044%2020.4529%2020.2047%2020.4529%2020.2047H26.5338C28.7956%2020.2047%2031.6981%2019.6703%2031.6981%2016.109C31.6981%2013.4975%2030.1369%2012.5164%2028.4128%2012.1773Z'%20/%3e%3cpath%20d='M13.3539%209.9883L14.4559%208.8863L11.2583%205.6882C9.65859%204.08883%207.22873%202.41445%204.71047%204.93272C2.86385%206.7793%203.27401%208.5766%204.25348%2010.0356C4.5518%2010.0135%2013.3539%209.9883%2013.3539%209.9883Z'%20/%3e%3cpath%20d='M18.424%2022.2295L17.3191%2023.3344L20.5762%2026.5912C22.1758%2028.1909%2024.7317%2029.7392%2027.1241%2027.3468C28.9092%2025.5615%2028.4996%2023.6863%2027.5127%2022.1842C27.195%2022.2071%2018.424%2022.2295%2018.424%2022.2295Z'%20/%3e%3c/svg%3e",e0="/assets/portrait-ZFGqSNXQ.jpg",t0="data:image/svg+xml,%3csvg%20viewBox='0%200%20144%20144'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M0%20144V72V0H144V144H0ZM12.8%2051.4C12.7%2037.1%2013.0999%2025%2013.5%2024.6C14%2024.2%2017.5999%2024.1%2028.5%2024.5L29%2050.1C29.5%2074%2029.5999%2075.9%2031.5%2078C32.5999%2079.2%2034.7%2080.8%2036.3%2081.6C37.8%2082.4%2040.8999%2083%2043.3%2083C45.7%2083%2048.8%2082.2%2050.8%2081C52.5%2079.9%2054.5999%2078%2055.3%2076.7C56.0999%2075.2%2056.7%2066.8%2057.5%2024.5H72.5L72.7%2050C72.8999%2066%2072.5999%2077%2071.8999%2079.5C71.2%2082.2%2069.0999%2085.2%2065.3999%2088.7C61.3999%2092.6%2058.5999%2094.4%2054.8%2095.5C51.8999%2096.3%2046.2%2097%2042.3%2097C37.7%2097%2033.2%2096.3%2030.3%2095.2C27.5999%2094.2%2023.8%2092.1%2021.7%2090.5C19.5999%2088.8%2016.7%2085.2%2015.3999%2082.5C13.0056%2077.6113%2013%2076.9033%2012.8015%2051.577L12.8%2051.4ZM80.8%2087.2C80.7%2066.4%2081.0999%2049%2081.5%2048.6C82%2048.3%2083%2048.2%2083.7%2048.5C84.3999%2048.8%2087.5%2049%2090.5%2049C94.7%2049%2096%2049.3%2096%2050.5C96%2051.3%2096.0999%2052%2096.3%2052C96.3999%2052%2098.3%2051.1%20100.5%2050C103.1%2048.7%20106.5%2048%20110.3%2048C113.9%2048%20117.4%2048.7%20119.8%2049.9C121.8%2050.9%20125.2%2053.6%20127.3%2055.9C129.5%2058.4%20131.6%2062.1%20132.5%2065.2C133.3%2068.1%20134%2071.4%20134%2072.5C134%2073.6%20133.3%2076.9%20132.5%2079.7C131.6%2082.9%20129.5%2086.6%20127.3%2089.1C125.2%2091.4%20121.8%2094.1%20119.8%2095.1C117.4%2096.3%20113.9%2097%20110.3%2097C106.5%2097%20103.1%2096.3%20100.5%2095C98.3%2093.9%2096.3999%2093%2096.3%2093C96.0999%2093%2096%20100.2%2096%20125H81L80.8%2087.2Z'%20/%3e%3cpath%20d='M101.3%2063C99.5%2064.1%2097.5%2065.9%2097%2067C96.5%2068.1%2096%2070.8%2096%2073C96%2076%2096.7%2077.7%2098.8%2079.9C100.3%2081.5%20102.6%2083.1%20104%2083.5C105.4%2083.9%20107.8%2083.9%20109.5%2083.5C111.2%2083.1%20113.7%2081.5%20115.3%2079.9C117.4%2077.7%20118%2076%20118%2072.7C118%2070.4%20117.3%2067.5%20116.5%2066.2C115.7%2065%20113.7%2063.3%20112%2062.5C110.3%2061.7%20108%2061%20106.8%2061C105.5%2061%20103%2061.9%20101.3%2063Z'%20/%3e%3c/svg%3e",n0="data:image/svg+xml,%3csvg%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0)'%3e%3cpath%20d='M32%209L26.6667%2016.3407L32%2023.6814H25.4076L23.3705%2020.8775L21.3333%2023.6814H14.741L18.0372%2019.1446L23.3705%2020.8775L20.0743%2016.3407L23.3705%2011.8039L18.0372%2013.5368L14.741%209H21.3333L23.3705%2011.8039L25.4076%209H32Z'%20fill='black'/%3e%3cpath%20d='M14.7408%209V14.6078L9.40747%2016.3407V9H14.7408Z'%20fill='black'/%3e%3cpath%20d='M5.3333%209V19.1446C5.3333%2020.8775%207.37048%2020.8775%207.37048%2020.8775C7.37048%2020.8775%209.40767%2020.8775%209.40767%2019.1446V16.3407L14.741%2018.0736C14.741%2023.6814%207.37048%2023.6814%207.37048%2023.6814C7.37048%2023.6814%200%2023.6814%200%2018.0736V9H5.3333Z'%20fill='black'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0'%3e%3crect%20width='32'%20height='32'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e",s0="data:image/png;base64,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",o0="/assets/code-versus-zoVKuQzM.png",i0="/assets/column_expressions-c4wO7Jz4.png",r0="/assets/concept-sLa4PJtO.png",a0="/assets/formulas04-S7oEWqTa.jpg",l0="/assets/variations-codesnippets-utOgpwcS.png",c0="/assets/1-venice-rsm1PQ6D.jpeg",u0="/assets/Gravitas-Logo-Light-ixumKLIf.png",d0="/assets/aeternitas-approach-2ZppLB2B.png",h0="/assets/aeternitas-hero-F7e3DF8A.png",f0="/assets/eywa-2-ZjcNbTEj.webm",p0="/assets/venice-showcase-vm_mU2-0.png",g0="/assets/colors-GQv1fmdj.png",m0="/assets/components-jxSoywmN.png",_0="/assets/demo-MBon4Zge.png",b0="/assets/typo-iztTLyFw.png",v0="/assets/greenbox_app2-ldLMY81A.png",w0="/assets/greenbox_app3-h5S4Tdvw.png",y0="/assets/greenbox_presentation-uDr5-knG.png",C0="/assets/greenbox_v1-hPZOFL8o.jpg",A0="/assets/greenbox_v2-wSLG_QzL.jpg",x0="/assets/communities-ymdGnhV9.png",k0="/assets/front_page-Ik_9RNhb.jpg",I0="/assets/node-issues-IO-iegA-.png",L0="/assets/quotes-VdAudErz.png",j0="/assets/screens-11-19-O09vzXOn.png",R0="/assets/wireframes-refined-itjz_j0P.png",$0="/assets/wireframes-rough-p3IJ4V5w.png",S0="data:image/svg+xml,%3csvg%20width='128'%20height='97'%20viewBox='0%200%20128%2097'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M127.347%2084.2326L118.523%2075.409C118.2%2075.095%20117.792%2074.8827%20117.35%2074.7981C116.908%2074.7135%20116.45%2074.7605%20116.034%2074.9332C115.618%2075.1059%20115.262%2075.3968%20115.01%2075.7698C114.757%2076.1428%20114.62%2076.5817%20114.614%2077.032V79.135H102.819C98.207%2084.5696%2092.5069%2088.9772%2086.0864%2092.0732C85.7436%2092.2332%2085.4007%2092.3932%2085.0579%2092.5303H114.614V94.656C114.624%2095.1046%20114.763%2095.5409%20115.016%2095.9115C115.269%2096.2821%20115.625%2096.5711%20116.039%2096.7432C116.454%2096.9152%20116.909%2096.963%20117.35%2096.8806C117.791%2096.7982%20118.199%2096.5892%20118.523%2096.279L127.347%2087.4556C127.766%2087.0237%20128%2086.4457%20128%2085.8441C128%2085.2424%20127.766%2084.6644%20127.347%2084.2326Z'%20/%3e%3cpath%20d='M47.2494%2074.5632C42.3077%2071.6522%2038.2112%2067.5021%2035.3648%2062.523C32.5184%2057.5438%2031.0207%2051.9081%2031.0196%2046.1728C31.9629%207.54328%2085.1467%200.844861%2095.8473%2037.6233L98.7731%2034.6975C99.4765%2034.0236%20100.313%2033.5036%20101.228%2033.1706C102.144%2032.8377%20103.118%2032.699%20104.09%2032.7635C105.062%2032.828%20106.01%2033.0943%20106.874%2033.5453C107.737%2033.9963%20108.497%2034.6223%20109.105%2035.3832C95.3356%20-17.4382%2019.0264%20-8.8834%2017.6245%2046.1725C17.5794%2056.4628%2021.0107%2066.4668%2027.3622%2074.5632H47.2494Z'%20/%3e%3cpath%20d='M110.157%2050.6528C111.621%2050.6281%20113.914%2051.0189%20114.546%2049.2357C114.716%2048.8169%20114.759%2048.3572%20114.67%2047.914C114.58%2047.4708%20114.362%2047.0638%20114.043%2046.744C111.934%2044.6131%20107.349%2040.1085%20105.219%2037.9432C104.787%2037.5257%20104.209%2037.2923%20103.608%2037.2924C103.006%2037.2924%20102.429%2037.5258%20101.996%2037.9434L100.876%2039.0634C98.9552%2040.9689%2095.0755%2044.8356%2093.1728%2046.7439C92.8618%2047.0679%2092.652%2047.4755%2092.569%2047.9169C92.4861%2048.3583%2092.5336%2048.8143%2092.7058%2049.2291C92.878%2049.6438%2093.1674%2049.9994%2093.5385%2050.2523C93.9097%2050.5052%2094.3465%2050.6444%2094.7955%2050.6528H96.6928C95.5937%2058.5436%2091.6804%2065.7714%2085.6738%2071.0052C79.6671%2076.2389%2071.9717%2079.1261%2064.0048%2079.1348H2.28589C1.68016%2079.1366%201.09975%2079.378%200.671436%2079.8063C0.243126%2080.2347%200.00173674%2080.8151%200%2081.4208V90.2445C0.00176687%2090.8502%200.24317%2091.4306%200.671476%2091.8589C1.09978%2092.2872%201.68018%2092.5286%202.28589%2092.5303L64.0044%2092.5301C75.5113%2092.4833%2086.5936%2088.1789%2095.1154%2080.4465C103.637%2072.7141%20108.995%2062.101%20110.157%2050.6528Z'%20/%3e%3c/svg%3e",M0="/assets/portrait-_tmB4JFU.png",E0="data:image/svg+xml,%3csvg%20viewBox='0%200%2091%2076'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M87.6293%200.167304L0.926291%2043.5693C-0.374509%2044.1709%20-0.272909%2046.0693%201.02785%2046.5693L19.7269%2054.0693L75.6248%2013.6713L30.8279%2058.4683V72.6673C30.8279%2074.2689%2032.8278%2074.8665%2033.7262%2073.6673L42.0271%2062.8703L73.328%2075.3703C74.2265%2075.7687%2075.3281%2075.1711%2075.5273%2074.1711L90.0273%201.9681C90.2265%200.667304%2088.8285%20-0.430296%2087.6293%200.167304Z'/%3e%3c/svg%3e",P0="/assets/teams-ZZg9vTjf.svg",T0="data:image/svg+xml,%3csvg%20width='128'%20height='123'%20viewBox='0%200%20128%20123'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M49.2042%2010.9955L26.6138%202.9989C27.2136%204.59822%2027.6134%206.59737%2027.8133%208.99635C28.4131%2020.7913%2021.4161%2038.5837%2012.22%2043.9814L35.0103%2051.978C42.4071%2045.5808%2051.0034%2021.7909%2049.2042%2010.9955Z'%20/%3e%3cpath%20d='M39.0088%2053.7772L42.0075%2054.7768C43.207%2048.3795%2048.8046%2043.5816%2055.4018%2043.5816C62.9986%2043.5816%2069.1959%2049.7789%2069.1959%2057.1758C69.1959%2059.3749%2068.5962%2061.5739%2067.5966%2063.5731H67.9964C76.5928%2065.3723%2086.5885%2044.5812%2086.1887%2031.3868C85.9888%2026.5888%2084.3895%2023.1903%2081.5906%2022.3906L53.4027%2012.5948C54.2023%2024.1898%2046.6056%2045.5807%2039.0088%2053.7772Z'%20/%3e%3cpath%20d='M125.572%2049.579H125.372L109.778%2044.1813V43.7815C109.578%2038.9835%20107.579%2037.3842%20106.38%2036.7845C106.38%2036.7845%20106.18%2036.7845%20106.18%2036.5846L90.1868%2030.9869C90.1868%2031.1869%2090.1868%2031.1869%2090.1868%2031.3868C90.5866%2041.5824%2085.5887%2054.7768%2079.3914%2062.1736L95.3845%2067.7713C97.9834%2068.5709%20100.982%2066.1719%20102.781%2064.1728L118.375%2069.5705C124.372%2071.9695%20131.969%2052.7777%20125.572%2049.579Z'%20/%3e%3cpath%20d='M21.0163%2024.3898C24.6147%2014.1941%2025.0146%202.59909%2019.0171%200.599939C18.4174%200.400024%2017.8176%200.400024%2017.2179%200.400024C11.4204%200.400024%205.42293%209.59611%202.62412%2017.9925C0.824885%2023.1903%20-0.174689%2028.3881%200.0252257%2032.5863C0.225141%2037.3843%201.82446%2040.7828%204.62327%2041.7824C5.22301%2041.9823%205.82276%2041.9823%206.4225%2041.9823C12.22%2041.9823%2018.0176%2032.7862%2021.0163%2024.3898ZM6.02267%2037.984C5.22301%2037.7841%204.22344%2036.1848%204.02352%2032.5863C3.82361%2028.7879%204.62327%2024.1899%206.4225%2019.3919C9.82105%209.59611%2015.0188%204.39832%2017.4178%204.39832C17.6177%204.39832%2017.6177%204.39832%2017.8176%204.39832C20.0167%205.19798%2020.8164%2012.9947%2017.4178%2023.1903C13.6194%2033.386%208.02182%2038.7837%206.02267%2037.984Z'%20/%3e%3cpath%20d='M27.2135%20120.149C26.8137%20121.149%2027.2135%20122.348%2028.2131%20122.748C29.2127%20123.148%2030.4122%20122.748%2030.812%20121.748L52.003%2070.5701C50.6036%2070.1703%2049.4041%2069.7704%2048.4045%2068.9708L27.2135%20120.149Z'%20/%3e%3cpath%20d='M53.4026%2070.9699V112.752C53.4026%20113.752%2054.4022%20114.751%2055.4017%20114.751C56.6012%20114.751%2057.4009%20113.752%2057.4009%20112.752V70.9699C56.4013%2071.1698%2054.802%2071.1698%2053.4026%2070.9699Z'%20/%3e%3cpath%20d='M62.5987%2068.9708C61.3992%2069.7704%2060.1997%2070.1703%2059.0002%2070.5701L79.9913%20121.548C80.3911%20122.548%2081.5906%20123.148%2082.5902%20122.548C83.5898%20122.148%2084.1895%20120.949%2083.5898%20119.949L62.5987%2068.9708Z'%20/%3e%3cpath%20d='M55.4013%2047.5799C50.0036%2047.5799%2045.6055%2051.978%2045.6055%2057.1758C45.6055%2062.5735%2050.0036%2066.9716%2055.4013%2066.9716C60.799%2066.9716%2065.1971%2062.5735%2065.1971%2057.1758C65.1971%2051.978%2060.799%2047.5799%2055.4013%2047.5799Z'%20/%3e%3c/svg%3e",U0="/assets/mechanics-PrUHgJCx.png",O0="/assets/mechanics_app-srXZoruJ.png",z0="/assets/mechanics_interview-ckRWPg-f.png",V0="/assets/tools-84UqHYJQ.png",N0="/assets/workflow-IY7fEvXY.png",H0="/assets/coverflow-JQYAcnf6.mp4",F0="/assets/mockup_ps-HSV-inA5.jpg",B0="/assets/paper_prototype-v_85moat.jpg",D0="/assets/phoenix_mp-K0fD-SK7.jpg",q0="/assets/shuffle_tooltip-sea-1YRc.png",K0="/assets/wireframe_ps_js-jVI4ZlYA.png",W0="/assets/concept-EdZ0-C_Y.png",Z0="/assets/querybuilder-LioqXdww.png",G0="/assets/querybuilders-GkPk1dRC.png",X0="/assets/row-filter-mfOS5Y57.png",Q0="data:image/png;base64,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",Y0="/assets/variations-GyqHeiWj.png",J0="/assets/brainstorming-sideshot-wBi72-VW.jpg",eu="/assets/mass-ass-slide-320S9N4k.jpg",tu="/assets/project-plan-GVjBZQ4g.png",nu="/assets/snip-gif-KHpQ1KSV.mp4",su="/assets/variants-SBaetX98.jpg",ou="/assets/adjustable-eyes-2CcmiUxi.jpg",iu="/assets/data-coll-8pOA24j0.png",ru="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAcCAYAAAAAwr0iAAAACXBIWXMAAAsSAAALEgHS3X78AAAAzUlEQVRIx+2WwQ2DMBAE11EKoBNTgjsgHUAHtEAHtEAJ7sQpIR04HWw+EBARto88+NxIlpDl2xs/kM+QhARjTLKApJHk3XAxKqACKqACKqACKnDPvP0PALVwXhh2W57kMzVAJBeACQBPriGbnzswS3TCxm8AXVF2yaFZws3BueYvAHVx7m4jSQiB1trD5tZaxhhZwPZia0AJMUY2TfPTvG1blrKrlQks9H3/rRvHUVS77WkWi+WPkOC9R1VVcM5JR/v1+x+BsxwK6FtwBR9eNgQha8B33AAAAABJRU5ErkJggg==",au="/assets/eye-REu15ElJ.png",lu="/assets/foveated-rendering-qIcSnxgd.png",cu="/assets/gnb-Xh3o4j2A.png",uu="/assets/regX-5My3uOqN.png",du="/assets/thesis-8ljNIOLh.pdf",hu="/assets/ticket1-wtXLxNsj.jpeg",fu="/assets/trafficticket-cToXHv7E.pdf";function Ho(e,t){return(e%t+t)%t}function pu(e){let t=ot.length;for(let o=0;o(Qe("data-v-a5fc3b27"),e=e(),Ye(),e),mu={id:"about"},_u={class:"responsive"},bu=["src"],vu={id:"text",class:"body1"},wu=Bt(()=>l("h4",null,"About",-1)),yu=Bt(()=>l("p",null,"With 7 years of diverse industry experience, I bring a dynamic blend of strategic product management and impactful design to your projects. From automotive to finance and beyond, I specialize in crafting user-centric experiences that are easy to use and great for business. Let's collaborate to turn your ideas into exceptional solutions!",-1)),Cu=Bt(()=>l("h5",null,"CV",-1)),Au={class:"cv"},xu=Bt(()=>l("h5",null,"Industries",-1)),ku={class:"industries"},Iu={class:"tag"},Lu=Bt(()=>l("h5",null,"Skills",-1)),ju={class:"skills"},Ru={class:"tag"},$u=Bt(()=>l("h5",null,"Networks",-1)),Su={class:"networks"};function Mu(e,t,n,s,o,i){const r=S("CvIcon"),a=S("Button"),c=S("UplinkIcon"),f=S("MaltIcon"),h=S("FreelancedeIcon"),p=S("FreelancermapIcon"),m=S("GhIcon"),y=S("UxIcon");return E(),O("div",mu,[l("div",_u,[l("img",{src:i.buildURL("bio/portrait.jpg")},null,8,bu),l("div",vu,[wu,yu,Cu,l("div",Au,[_(a,{type:"primary",bg:"light",size:"sm",text:"English CV",href:"https://drive.google.com/file/d/19Fq8oCB_v1aAk957t-IXDm7rekfPUyf0/view?usp=drive_link"},{default:ce(()=>[_(r)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"German CV",href:"https://drive.google.com/file/d/1Z7ydaFpTvXqlFKXE1KLeM45NHirvEmar/view?usp=drive_link"},{default:ce(()=>[_(r)]),_:1})]),xu,l("div",ku,[(E(),O(ue,null,wt(["B2B SaaS","Automotive","Manufacturing","Finance","Consulting","Startup","NGO"],$=>l("div",Iu,ae($),1)),64))]),Lu,l("div",ju,[(E(),O(ue,null,wt(["UX Design","UI Design","Web design","Conception","Prototyping","Mobile Design","Responsive Design","Figma","User Research","Scrum","Adobe Creative Suite","User-Centered Design","Usability Testing","Requirements Engineering"],$=>l("div",Ru,ae($),1)),64))]),$u,l("div",Su,[_(a,{type:"secondary",bg:"light",size:"sm",text:"Uplink",href:"https://uplink.tech/"},{default:ce(()=>[_(c)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"Malt",href:"https://www.malt.de/profile/johannesschweig"},{default:ce(()=>[_(f)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"Freelance.de",href:"https://freelance.de/"},{default:ce(()=>[_(h)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"Freelancermap",href:"https://www.freelancermap.de/profil/ux-und-product-consultant"},{default:ce(()=>[_(p)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"GitHub",href:"https://github.com/johannesschweig"},{default:ce(()=>[_(m)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"ux.stackexchange",href:"https://ux.stackexchange.com/users/110814/nash"},{default:ce(()=>[_(y)]),_:1})])])])])}const Eu=ne(gu,[["render",Mu],["__scopeId","data-v-a5fc3b27"]]),Pu={data(){return{project:null}},props:{route:{type:String,required:!0}},created(){this.project=Kn.filter(e=>e.route==this.$props.route)[0]}},Hs=e=>(Qe("data-v-7c0f8bc3"),e=e(),Ye(),e),Tu={id:"project-header",class:"responsive"},Uu={id:"name-container"},Ou={class:"subtitle1"},zu={id:"heading-container"},Vu=Hs(()=>l("div",{class:"subtitle1"}," Client ",-1)),Nu=Hs(()=>l("div",{class:"subtitle1"}," Task ",-1)),Hu=Hs(()=>l("div",{class:"subtitle1"}," Timeline ",-1));function Fu(e,t,n,s,o,i){return E(),O("div",Tu,[l("div",Uu,[l("div",Ou,ae(o.project.name),1),l("h2",null,ae(o.project.slogan),1)]),l("div",zu,[Vu,l("h5",null,[(E(!0),O(ue,null,wt(o.project.clients,r=>(E(),O("div",{key:r},ae(r),1))),128))]),Nu,l("h5",null,ae(o.project.task),1),Hu,l("h5",null,ae(o.project.date),1)])])}const Ue=ne(Pu,[["render",Fu],["__scopeId","data-v-7c0f8bc3"]]),Bu={props:{src:{type:String,required:!0},alt:{type:String},shadow:{type:Boolean,default:!0}},methods:{isVideo(){return!!(this.$props.src.endsWith(".mp4")|this.$props.src.endsWith(".webm"))}}},Du={id:"container"},qu=["src","alt"],Ku=["src"],Wu={class:"body2"};function Zu(e,t,n,s,o,i){return E(),O("div",Du,[i.isVideo()?gs("",!0):(E(),O("img",{key:0,class:ht(["img-md",{shadow:n.shadow}]),src:n.src,alt:n.alt},null,10,qu)),i.isVideo()?(E(),O("video",{key:1,class:ht(["img-md",{shadow:n.shadow}]),autoplay:"",muted:"",loop:""},[l("source",{src:n.src,type:"video/mp4"},null,8,Ku),W(" Your browser does not support the video tag. ")],2)):gs("",!0),l("div",Wu,ae(n.alt),1)])}const Ke=ne(Bu,[["render",Zu],["__scopeId","data-v-27d3b8ac"]]),Gu={xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",fill:"none"},Xu=l("path",{fill:"#000",d:"m1 8-.354-.354a.5.5 0 0 0 0 .708zm14 .5a.5.5 0 0 0 0-1zM5.854 3.854a.5.5 0 1 0-.708-.708zm-.708 9a.5.5 0 0 0 .708-.708zM1 8.5h14v-1H1zm.354-.146 4.5-4.5-.708-.708-4.5 4.5zm-.708 0 4.5 4.5.708-.708-4.5-4.5z"},null,-1),Qu=[Xu];function Yu(e,t){return E(),O("svg",Gu,[...Qu])}const Ju={render:Yu},e1={components:{Arrow:Ju},data(){return{previousProject:{route:null,name:null},nextProject:{route:null,name:null}}},props:{route:{type:String,required:!0}},created(){let e=pu(this.route);this.previousProject=e.previous,this.nextProject=e.next}},t1=e=>(Qe("data-v-ca97760c"),e=e(),Ye(),e),n1={id:"projectArrows",class:"responsive"},s1=t1(()=>l("div",{class:"flex-grow"},null,-1));function o1(e,t,n,s,o,i){const r=S("Arrow"),a=S("router-link");return E(),O("div",n1,[_(a,{class:"previous",to:o.previousProject.route},{default:ce(()=>[_(r),l("span",null,"Previous project: "+ae(o.previousProject.name),1)]),_:1},8,["to"]),s1,_(a,{class:"next",to:o.nextProject.route},{default:ce(()=>[l("span",null,"Next project: "+ae(o.nextProject.name),1),_(r)]),_:1},8,["to"])])}const Oe=ne(e1,[["render",o1],["__scopeId","data-v-ca97760c"]]),i1={components:{"project-header":Ue,"styled-image":Ke,"project-arrows":Oe},methods:{buildURL(e){return ye(e)}}},r1={class:"responsive"},a1=l("h4",null,"TL;DR",-1),l1=l("p",null,'I designed an interface where users can input multiple "code snippets" to transform their data.',-1),c1=l("h4",null,"Problem",-1),u1=l("p",null,'A project I worked on for KNIME was to create an interface for a node (KNIME term for encapsulated functionality) where users can create small code snippets to manipulate data. For example, users might want to create a column with the mean of three other columns or cut the surname of a "name surname" formatted column. Previously, this was possible with a String Manipulation node for Strings, a Math Formula node for numerical data and a Rule Engine node for conditions. But what if you needed to alter Strings based on conditions? Then it gets complicated. The new node should make it easier for users to create more complex logic.',-1),d1=l("h4",null,"Research",-1),h1=l("p",null,"I analyzed the current UI and interaction of the already existing nodes and found out that they had several disadvantages:",-1),f1=l("ul",null,[l("li",null,"They were making poor use of space. UI components were getting a lot of space even though they were not as important as others (see image above)."),l("li",null,'Checking if your piece of code was correct could only be done by running the node on all your available data. Depending on the amount of data this could take a while. When you realize then that the "+1" in your code should really have been a "-1" you have to change it and run it again. Seemed too tedious.')],-1),p1=l("h4",null,"Concept",-1),g1=l("p",null,'I improved on these with a design that put the code textfield with a large amount of space in the center of attention. Adding columns, variables and functions was now one click away but this saved precious screen real estate. I also added a small "evaluate" functionality that would check your code on the first row of your data so you could iteratively improve your code snippet without having to run it on your entire data each time. On the top an overview of all the code snippets was presented and you could add more code snippets or alter existing ones. The UI for the code editor was designed to make it reusable in other nodes (e.g. filtering rows according to a code snippet with a boolean statement).',-1),m1=l("h4",null,"Evaluation",-1),_1=l("p",null,[W("The overall reception was positive. Forum users as well as colleagues gave very enthusiastic feedback on the new functionality. One user even wrote a blogpost about the node calling it "),l("a",{href:"https://blog.statinfer.com/knime-multitasking-with-column-expressions-node/"},'"The Swiss Army Knife"'),W(".")],-1),b1=l("p",null,'In the design, however, there is - as always - still room for improvement. The emancipated display of the upper "overview" and the lower "code editor" component does not make it entirely clear that a selection of a code snippet in the "overview" component would change the display in the "code editor" component. This drawback was however favored over a dialog-in-a-dialog design.',-1),v1=l("p",null,"Also, the design could guide new users better on how to start. They are presented with a blank textfield and a variety of UI components (much like opening a terminal for the first time). The functions which are the core of writing your snippet are hidden behind a dropdown. The aim of the design, however, was to create a good experience for experienced users who want to optimize their data manipulation workflows.",-1),w1=l("p",null,'On the whole, I am very content with the process and outcome of this project. I was involved from the research phase over the conceptual phase to the implementation and even helped with programming parts of the "code editor" component. Also, the feedback from the community shows that the hours you invest in research and ideation really pay off in the end.',-1);function y1(e,t,n,s,o,i){const r=S("project-header"),a=S("styled-image"),c=S("project-arrows");return E(),O("div",null,[_(r,{route:"/codesnippets"}),l("div",r1,[a1,l1,c1,_(a,{src:i.buildURL("codesnippets/3vs1.png"),alt:"Combine three nodes into one"},null,8,["src"]),u1,d1,_(a,{src:i.buildURL("codesnippets/code-versus.png"),alt:"Use of space in the String Manipulation interface"},null,8,["src"]),h1,f1,p1,_(a,{src:i.buildURL("codesnippets/variations-codesnippets.png"),alt:"Two concepts for the code editor: Columns, variables and functions in dropdowns (left) or in a tabbed interface (right)"},null,8,["src"]),g1,m1,_(a,{src:i.buildURL("codesnippets/concept.png"),alt:"Final UI concept"},null,8,["src"]),_1,b1,v1,w1,_(a,{src:i.buildURL("codesnippets/column_expressions.png"),alt:"User interface as of KNIME Analytics Platform v3.7.1"},null,8,["src"])]),_(c,{route:"/codesnippets"})])}const C1=ne(i1,[["render",y1]]),A1={components:{"project-header":Ue,"styled-image":Ke,"project-arrows":Oe,Button:cn},methods:{buildURL(e){return ye(e)}}},x1={id:"dubai",class:"responsive body1"},k1=l("h4",null,"TL;DR",-1),I1=l("p",null,"I designed the UI for several pages for a real estate company in Dubai showcasing their latest real estate projects.",-1),L1=l("h4",null,"Problem",-1),j1=l("p",null,"The initial design draft failed to portray the real estate projects in an appealing and professional manner. Although the imagery was generally captivating, the content lacked structure, and there were layout issues that compromised its professional presentation.",-1),R1=l("h4",null,"Structure",-1),$1=l("p",null,"My goal with the design was to make the pages more easily understandable and guaranteeing that the impressive projects stand out. I structured the content into three new sections:",-1),S1=l("h6",null,"Project",-1),M1=l("p",null,"This section showcases the iconic and spectacular nature of the project with a big hero image of the project. The goal of this section is to draw the visitor in to learn more about the project.",-1),E1=l("h6",null,"Property",-1),P1=l("p",null,"This section shows the luxurious property with a carousel filled with pictures from interior and exterior. Also, the payment plan shows the attractiveness of the investment. The goal of this section was to show the visitor what they would by buying into this project and how affordable the conditions are.",-1),T1=l("h6",null,"Neighborhood",-1),U1=l("p",null,"This section shows the surroundings and gives a feel for the atmosphere.",-1),O1=l("h4",null,"Design",-1),z1=l("h4",null,"Development",-1),V1=l("p",null,[W("Nicolas Kopp from "),l("a",{class:"link",href:"https://www.digitalessence.de/"},"digitalessence"),W(" developed the site with Wordpress DIVI.")],-1),N1=["src"];function H1(e,t,n,s,o,i){const r=S("project-header"),a=S("styled-image"),c=S("Button"),f=S("project-arrows");return E(),O("div",null,[_(r,{route:"/dubai"}),l("div",x1,[k1,I1,L1,j1,_(a,{src:i.buildURL("dubai/aeternitas-hero.png"),alt:"Issues with the hero section",shadow:!1},null,8,["src"]),_(a,{src:i.buildURL("dubai/aeternitas-approach.png"),alt:"Issues with the approach section",shadow:!1},null,8,["src"]),R1,$1,S1,M1,E1,P1,T1,U1,O1,_(a,{src:i.buildURL("dubai/1-venice.jpeg"),alt:"Design for Venice with the three sections and the footer"},null,8,["src"]),z1,V1,_(c,{type:"primary",bg:"light",size:"sm",text:"Visit the page",href:"https://www.gravitas-dubai.com/"},{default:ce(()=>[l("img",{src:i.buildURL("dubai/Gravitas-Logo-Light.png")},null,8,N1)]),_:1}),_(a,{src:i.buildURL("dubai/eywa-2.webm"),alt:"Project Heimat"},null,8,["src"])]),_(f,{route:"/dubai"})])}const F1=ne(A1,[["render",H1]]),B1={components:{"project-header":Ue,"styled-image":Ke,"project-arrows":Oe},methods:{buildURL(e){return ye(e)}}},D1={class:"responsive body1"},q1=l("h4",null,"TL;DR",-1),K1=l("p",null,"I helped to build a product that helps a NGO to organize their citizen councils. One of the big features was a feedback flow for citizens to respond to an invitation for a council and mention their needs.",-1),W1=l("h4",null,"Problem statement",-1),Z1=l("p",null,"Es geht los organizes citizen councils and has to manage all the candidates that they reached out to and their special needs (e.g. child care, mobility impairments). As there are many people involved it is hard to keep track of all the candidates without a proper tool. Our goal was to build such a tool to help them with keeping track of the candidates, perform statistically sound drawings, organize their agents and collect feedback from their candidates online.",-1),G1=l("h4",null,"Visual identity",-1),X1=l("p",null,[W('I expanded the existing visual identity (called "Giulia") to address all the needs of a web application. I expanded the color palette, set up a system for typography based on their existing typefaces and created the first components (buttons, checkboxes, textfields). I tailored the system to the CSS framework '),l("a",{class:"link",href:"https://tailwindcss.com/"},"Tailwind"),W(" which we used in development.")],-1),Q1=l("h4",null,'Prototype "Feedback flow"',-1),Y1=l("p",null,"In this click prototype (German only) you can see the screens that a candidate goes through after being chosen for a citizen council. The candidate can tick special needs, accept or decline the invitation and give feedback to Es geht los.",-1),J1=l("iframe",{style:{border:"1px solid rgba(0, 0, 0, 0.1)"},width:"500",height:"800",src:"https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Fproto%2FzGG70JdPaHszpgRP3uaXGb%2Fegl-portfolio%3Fnode-id%3D7%253A698%26viewport%3D241%252C48%252C0.11%26scaling%3Dscale-down%26page-id%3D0%253A1%26starting-point-node-id%3D7%253A698",allowfullscreen:""},null,-1),ed=l("p",null,"Click on the grey background and then restart (R) to restart the prototype.",-1),td=l("h4",null,"Clients",-1),nd=l("p",null,[l("a",{class:"link",href:"https://www.esgehtlos.org/"},"Es geht los"),W(' is a German NGO and non-partisan think & do tank by Demokratie Innovation e.V. for lot-based ("losbasiert") citizen participation. They organize citizen councils on a local, national level and for public institutions. '),l("a",{class:"link",href:"https://www.maibornwolff.de/"},"MaibornWolff"),W(" offers consulting and software engineering for ambitious IT projects. I was staffed as the UI Designer in a Digital Garage project by MaibornWolff for Demokartie Innovation e.V..")],-1);function sd(e,t,n,s,o,i){const r=S("project-header"),a=S("styled-image"),c=S("project-arrows");return E(),O("div",null,[_(r,{route:"/esgehtlos"}),l("div",D1,[q1,K1,W1,Z1,G1,_(a,{src:i.buildURL("esgehtlos/colors.png"),alt:"Color palette. New colors are highlighted."},null,8,["src"]),X1,_(a,{shadow:!1,src:i.buildURL("esgehtlos/typo.png"),alt:"Typography scale"},null,8,["src"]),_(a,{shadow:!1,src:i.buildURL("esgehtlos/components.png"),alt:"Components in different states"},null,8,["src"]),Q1,Y1,J1,ed,td,nd]),_(c,{route:"/esgehtlos"})])}const od=ne(B1,[["render",sd]]),id={components:{"project-header":Ue,"styled-image":Ke,"project-arrows":Oe},methods:{buildURL(e){return ye(e)}}},rd={id:"greenbox",class:"responsive"},ad=l("h4",null,"TL;DR",-1),ld=l("p",null,"As part of a university course a design team and a UX research team helped a startup to improve their gardening app. I contributed with planning, conducting and evaluating usability tests as part of the UX research team (3 persons in total).",-1),cd=l("h4",null,"Problem",-1),ud=l("p",null,[l("i",null,"Grüner Daumen"),W(' ("Green thumb") is an upcoming gardening app that is designed to inspire and support users with their plant care. The client had questions regarding the usability and design of their application:')],-1),dd=l("ul",null,[l("li",null,"Is the workflow in agreement with the users' expectations?"),l("li",null,"Does the app feel inutitive and easy to use?"),l("li",null,"Do users perceive the app as playful and yet legitimate?")],-1),hd=l("h4",null,"First usability test (my team)",-1),fd=l("p",null,"In a first usability test participants were introduced to the app with a scenario and asked to perform several tasks while thinking aloud. We recorded the participant's interactions with the application with a camera and evaluated them later. The participants answered two questionnaires (QUESI, meCUE) rating the intuitiveness and the overall impression of the product. Additionally, the team conducted a heuristic analysis (following Jakob Nielsen) to identify usability problems. The insights generated from these methods were condensed and forwarded to the design team.",-1),pd=l("h4",null,"Redesign (design team)",-1),gd=l("p",null,"The design team used the collected insights from the testing and the heuristic analysis to produce a redesigned version of the app.",-1),md=l("h4",null,"Second usability test (my team)",-1),_d=l("p",null,"In a second usability test the redesigned version was evaluated and the results compared to the results of the first version. The same methods were used as in the first usability test to allow for better comparison. Users experienced less problems with the redesigned version and rated it also higher on all scales of the questionnaires.",-1),bd=l("h4",null,"Reflection",-1),vd=l("p",null,"During this project I learnt a lot about the design, conduction and evaluation of usability tests. Experiencing that the insights generated through our group's work were of great use for the startup was a big motivational factor. The cooperation and communication between the design team, the UX research team and the startup was challenging, but rewarded us with different perspectives and insights in the process.",-1),wd=l("h4",null,"Testimonial (german)",-1),yd=l("p",null,'"Wir entwickeln momentan eine Smartphone-App und haben uns bei UseTree beworben, weil wir die Abfolge von Bedienschritten für eine innovative Anwendung evaluieren lassen wollten. Daneben war es uns wichtig, herauszufinden, inwieweit wir die Balance zwischen einer spielerischen Bedienung und einem seriösen Design hinbekommen. Das Zusammenspiel von Arbeitspsychologen und Designern im sogenannten Staffellauf, bei dem beide Seiten abwechselnd dieselbe Fragestellung bearbeiten, haben wir als sehr bereichernd und konstruktiv empfunden. Durch die Teilnahme wurde unser Blick für Usability-Fragestellungen maßgeblich geschärft. Zudem haben wir Tools an die Hand bekommen, um diese Fragen zukünftig inhouse weiter bearbeiten zu können. Das Designteam begeisterte uns mit kreativen und hochwertigen Vorschlägen, die wir direkt in die Weiterentwicklung aufnehmen. Nicht zuletzt war ich von der engagierten und offenen Art von UseTree angetan und empfand die Zusammenarbeit als sehr inspierierend." - Gesche Heitmann (Gründerin)',-1);function Cd(e,t,n,s,o,i){const r=S("project-header"),a=S("styled-image"),c=S("project-arrows");return E(),O("div",null,[_(r,{route:"/greenbox"}),l("div",rd,[ad,ld,cd,_(a,{src:i.buildURL("greenbox/greenbox_v1.jpg"),alt:"First version of the gardening app"},null,8,["src"]),ud,dd,hd,_(a,{src:i.buildURL("greenbox/greenbox_app3.png"),alt:"Usability test with the gardening app"},null,8,["src"]),fd,pd,_(a,{src:i.buildURL("greenbox/greenbox_v2.jpg"),alt:"Redesigned version of the gardening app"},null,8,["src"]),gd,md,_d,bd,_(a,{src:i.buildURL("greenbox/greenbox_presentation.png"),alt:"Final presentation Greenbox"},null,8,["src"]),vd,wd,yd]),_(c,{route:"/greenbox"})])}const Ad=ne(id,[["render",Cd]]),xd={components:{"project-header":Ue,"styled-image":Ke,"project-arrows":Oe},methods:{buildURL(e){return ye(e)}}},kd={id:"knimehub",class:"responsive body1"},Id=l("h4",null,"TL;DR",-1),Ld=l("p",null,"I helped to build a website where data scientists can read up on existing functionality of the desktop application. This website also enables them to share and collaborate on data analysis projects.",-1),jd=l("h4",null,"Introduction",-1),Rd=l("p",null,'KNIME develops a data science software which lets users create data analysis workflows with small blocks called "nodes" in a graphical programming paradigm. The community is big and vibrant and we wanted to give users a platform where they can help each other out and work together on general purpose solutions for common data science problems (e.g. churn prediction, anomaly detection). As the UX Designer on the team I was given the task to create a first prototype for the information architecture and the interaction design.',-1),$d=l("h4",null,"User and task analysis",-1),Sd=l("p",null,"At first I wanted to find out users shared and collaborated with already existing tools. I interviewed 9 internal data scientists on their usage of similar products. I was especially interested in how they make their own work understandable to others and what helps them to understand other people's work (e.g. text descriptions, screenshots, oral explanations, visual cues).",-1),Md=l("p",null,"From this research I identified challenges that were only poorly addressed by existing solutions. For example, a big challenge for users was the first time they try to use a new node. Sometimes the user did not know what the node could do, sometimes they were not sure how to set it up and sometimes they tried it out and it did not work the way they expected it to.",-1),Ed=l("p",null,"With these challenges in mind we decided on what user stories to focus and defined the most important features for the KNIME Hub:",-1),Pd=l("ul",null,[l("li",null,"Search for nodes: Users can search for nodes and determine if they are a good fit for their data science problem."),l("li",null,"Search for workflow: Users can search for example workflows that explain a specific data science problem."),l("li",null,"Install nodes: When users have found the right node, they can install it easily by drag-n-dropping it into the desktop application."),l("li",null,"Link nodes/workflows: Users can share links of node and workflow pages to provide other users with a nice way of referencing functionality in the desktop application.")],-1),Td=l("h4",null,"Screen design",-1),Ud=l("p",null,"In this phase I ranked the content in importance and separated it onto different screens. I drew inspiration from online-communities where users share their content with others (node-red, chefkoch, youtube, soundcloud).",-1),Od=l("p",null,"I created four pages: A landing page with search, a search results page, a page for nodes and one for workflows. I created links between the pages which should help the users to find what they need.",-1),zd=l("p",null,"The first version of the wireframes were discussed in the team and additional content was added. In a second iteration I aimed for higher fidelity in the wireframes and focused more on the layout of the pages. This second version was used for communication to internal stakeholders.",-1),Vd=l("h4",null,"Final visual design and building",-1),Nd=l("p",null,"The final visual design was done by an external designer. I supported the development team during the building process and contributed by taking over small frontend tasks.",-1),Hd=l("h4",null,"Launch",-1),Fd=l("p",null,"The KNIME Hub was released and opened to the public during the KNIME Summit in March 2019. Since then it has received great interest and a growing community of active users. From March until October I assisted in the further development of features such as a deeper integration to the desktop application.",-1),Bd=l("p",null,[W("Check it out at "),l("a",{class:"link",href:"https://hub.knime.com"},"hub.knime.com"),W(".")],-1);function Dd(e,t,n,s,o,i){const r=S("project-header"),a=S("styled-image"),c=S("project-arrows");return E(),O("div",null,[_(r,{route:"/knimehub"}),l("div",kd,[Id,Ld,jd,Rd,$d,Sd,_(a,{src:i.buildURL("knimehub/quotes.png"),alt:"Quotes from the interviews",shadow:!1},null,8,["src"]),Md,_(a,{src:i.buildURL("knimehub/node-issues.png"),alt:"User challenges with nodes",shadow:!1},null,8,["src"]),Ed,Pd,Td,Ud,_(a,{src:i.buildURL("knimehub/communities.png"),alt:"Node-RED: a similar online community"},null,8,["src"]),Od,_(a,{src:i.buildURL("knimehub/wireframes-rough.png"),alt:"First wireframes"},null,8,["src"]),zd,_(a,{src:i.buildURL("knimehub/wireframes-refined.png"),alt:"Second, more refined wireframes"},null,8,["src"]),Vd,Nd,Hd,Fd,Bd,_(a,{src:i.buildURL("knimehub/screens-11-19.png"),alt:"Screens of the application as of Nov. 19"},null,8,["src"])]),_(c,{route:"/knimehub"})])}const qd=ne(xd,[["render",Dd]]),Kd={props:{text:{type:String,required:!0},type:{type:String,required:!0}}};function Wd(e,t,n,s,o,i){return E(),O("div",{class:"tag button",style:an({backgroundColor:n.type==="primary"?"var(--blue-300)":"var(--dark-200)"})},ae(n.text),5)}const Zd=ne(Kd,[["render",Wd],["__scopeId","data-v-b0191d4a"]]),Gd={components:{Tag:Zd},props:{projProps:{type:Object,required:!0}},methods:{buildURL(e){return ye(e)}}},Xd={class:"img-container"},Qd=["src","alt"],Yd={class:"text"},Jd={class:"h5 regular"},eh={class:"tags"};function th(e,t,n,s,o,i){const r=S("Tag"),a=S("router-link");return E(),Bn(a,{class:"tile",to:n.projProps.route},{default:ce(()=>[l("div",Xd,[l("img",{src:i.buildURL(n.projProps.image.src),alt:n.projProps.image.alt},null,8,Qd)]),l("div",Yd,[l("div",Jd,ae(n.projProps.slogan),1),l("div",eh,[_(r,{text:n.projProps.task,type:"primary"},null,8,["text"]),_(r,{text:n.projProps.industry,type:"secondary"},null,8,["text"])])])]),_:1},8,["to"])}const nh=ne(Gd,[["render",th],["__scopeId","data-v-d679ffa7"]]),sh={components:{Button:cn,SendIcon:Di},methods:{buildURL(e){return ye(e)}}},nr=e=>(Qe("data-v-29f0a935"),e=e(),Ye(),e),oh={class:"responsive"},ih={class:"text"},rh=nr(()=>l("div",{class:"h2"},"Clear requirements, smooth delivery.",-1)),ah=nr(()=>l("div",{class:"body1"},"I am a freelance UX & Product Consultant helping teams with requirements engineering and UX design. Contact me for freelance roles or coaching.",-1)),lh={class:"buttons"},ch=["src"];function uh(e,t,n,s,o,i){const r=S("SendIcon"),a=S("Button");return E(),O("div",oh,[l("div",ih,[rh,ah,l("div",lh,[_(a,{type:"primary",bg:"light",size:"lg",text:"Send me an email",href:"mailto:hello@johannesschweig.de"},{default:ce(()=>[_(r)]),_:1}),_(a,{type:"secondary",bg:"light",size:"lg",text:"LinkedIn",href:"https://linkedin.com/in/jschweig"})])]),l("img",{src:i.buildURL("landingpage/portrait.png")},null,8,ch)])}const dh=ne(sh,[["render",uh],["__scopeId","data-v-29f0a935"]]),hh={xmlns:"http://www.w3.org/2000/svg",width:"128",height:"97"},fh=l("path",{d:"m127.347 84.233-8.824-8.824a2.305 2.305 0 0 0-3.909 1.623v2.103h-11.795a51 51 0 0 1-16.733 12.938c-.342.16-.685.32-1.028.457h29.556v2.126a2.32 2.32 0 0 0 1.425 2.087 2.31 2.31 0 0 0 2.484-.464l8.824-8.823a2.314 2.314 0 0 0 0-3.223M47.25 74.563a32.96 32.96 0 0 1-16.23-28.39c.943-38.63 54.127-45.328 64.827-8.55l2.926-2.925a7.02 7.02 0 0 1 8.101-1.153 7 7 0 0 1 2.231 1.838c-13.77-52.821-90.079-44.266-91.48 10.79a45.67 45.67 0 0 0 9.737 28.39z"},null,-1),ph=l("path",{d:"M110.157 50.653c1.464-.025 3.757.366 4.389-1.417a2.31 2.31 0 0 0-.503-2.492c-2.109-2.13-6.694-6.635-8.824-8.8a2.32 2.32 0 0 0-3.223 0l-1.12 1.12c-1.92 1.905-5.8 5.772-7.703 7.68a2.31 2.31 0 0 0 1.623 3.909h1.897a33.04 33.04 0 0 1-32.688 28.482H2.285A2.293 2.293 0 0 0 0 81.42v8.823a2.293 2.293 0 0 0 2.286 2.286h61.718a46.58 46.58 0 0 0 46.153-41.877"},null,-1),gh=[fh,ph];function mh(e,t){return E(),O("svg",hh,[...gh])}const _h={render:mh},bh={xmlns:"http://www.w3.org/2000/svg",width:"125",height:"128"},vh=l("path",{d:"M39.482 12.56c0 6.614-9.92 6.614-9.92 0 0-6.61 9.92-6.61 9.92 0"},null,-1),wh=l("path",{d:"M110.4 60.045c-6.594 0-12.163 4.545-13.683 10.694l-4.24-.695c.39-1.965.61-3.99.61-6.04 0-10.278-5.04-19.392-12.798-25.017l7.284-9.2a11.3 11.3 0 0 0 5.1 1.245c6.149 0 11.139-4.984 11.139-11.138 0-6.15-4.985-11.14-11.14-11.14-6.149 0-11.138 4.985-11.138 11.14 0 3.104 1.274 5.929 3.35 7.949l-7.395 9.334a30.75 30.75 0 0 0-15.209-4.015 30.5 30.5 0 0 0-15.154 3.99l-3.794-6.484c.61-.39 1.22-.805 1.774-1.275a16.59 16.59 0 0 0 6.04-12.8C51.146 7.45 43.69 0 34.552 0 25.408.01 17.93 7.464 17.93 16.604c0 4.96 2.19 9.64 6.04 12.799a16.64 16.64 0 0 0 10.554 3.795c1.994 0 3.934-.36 5.789-1.055l3.99 6.814c-6.815 4.905-11.554 12.494-12.634 21.194L16.6 57.686c0-4.1-3.35-7.425-7.455-7.425-4.1 0-7.454 3.35-7.454 7.455 0 4.1 3.35 7.454 7.454 7.454 2.965 0 5.515-1.72 6.73-4.24l15.568 2.55v.525c0 7.84 2.965 15.294 8.23 20.974l-5.985 7.564c-3.575-3.16-8.284-5.1-13.41-5.1C9.086 87.444 0 96.529 0 107.723c0 6.07 2.685 11.774 7.37 15.653 3.629 2.99 8.199 4.625 12.908 4.625 4.71 0 9.28-1.635 12.91-4.625a20.28 20.28 0 0 0 7.369-15.653c0-4.849-1.72-9.279-4.545-12.769l6.07-7.644c.194.165.39.33.58.5a30.88 30.88 0 0 0 19.613 7.034c4.544 0 9.004-1.025 13.074-2.91l4.044 6.9c-2.964 2.325-4.874 5.929-4.874 9.999 0 7.01 5.704 12.689 12.689 12.689 6.98 0 12.689-5.704 12.689-12.689 0-6.979-5.705-12.689-12.69-12.689-1.774 0-3.434.36-4.959 1.025l-3.96-6.79a33 33 0 0 0 3.63-2.574c4.655-3.85 8.034-8.894 9.78-14.52l4.654.75v.14c0 4.24 1.885 8.2 5.124 10.89a14.12 14.12 0 0 0 8.975 3.215c3.269 0 6.454-1.135 8.974-3.215 3.269-2.685 5.124-6.675 5.124-10.89 0-7.784-6.344-14.128-14.128-14.128zm-78.453 59.95c-1.36-5.209-6.094-9.059-11.719-9.059s-10.36 3.85-11.719 9.059c-3.35-3.184-5.234-7.589-5.234-12.274 0-9.364 7.619-16.953 16.953-16.953 4.35 0 8.34 1.66 11.36 4.375.414.36.804.775 1.189 1.19a16.823 16.823 0 0 1 4.43 11.383 16.96 16.96 0 0 1-5.235 12.274zm86.128-38.202a8.06 8.06 0 0 0-7.645-5.46 8.06 8.06 0 0 0-7.644 5.46 10.83 10.83 0 0 1-3.13-7.62c0-5.954 4.85-10.803 10.804-10.803s10.804 4.85 10.804 10.804c0 2.88-1.135 5.594-3.129 7.59zm-38.312 3.465c-.995.83-2.08 1.58-3.185 2.27-.47.274-.94.554-1.44.83-.5.25-.995.5-1.495.72a27.7 27.7 0 0 1-11.384 2.464 27.63 27.63 0 0 1-17.509-6.29q-.294-.246-.58-.5c0-.054.03-.14.055-.194a18.93 18.93 0 0 1 8.2-10.334 18.9 18.9 0 0 1 9.834-2.745c.36 0 .72 0 1.08.03.694.03 1.384.11 2.08.22.75.11 1.494.305 2.214.5 6.04 1.775 10.834 6.51 12.714 12.524q-.294.246-.58.5zm7.424 14.213c5.18 0 9.364 4.21 9.364 9.364s-4.21 9.364-9.364 9.364-9.364-4.209-9.364-9.364a9.34 9.34 0 0 1 3.24-7.094c.414-.36.884-.695 1.36-.97.47-.275.97-.525 1.494-.72a9.2 9.2 0 0 1 3.27-.58M9.119 61.845a4.14 4.14 0 0 1-4.13-4.13 4.14 4.14 0 0 1 4.13-4.13 4.14 4.14 0 0 1 4.13 4.13 4.14 4.14 0 0 1-4.13 4.13m25.403-58.51c7.314 0 13.269 5.954 13.269 13.268 0 3.575-1.44 6.98-3.96 9.474a9.691 9.691 0 0 0-18.559 0 13.2 13.2 0 0 1-3.99-9.474c0-7.314 5.955-13.269 13.27-13.269zM52.25 57.66c0-1.36.275-2.63.75-3.825.25-.61.555-1.19.915-1.72.33-.5.695-.97 1.11-1.385 1.83-1.885 4.374-3.075 7.204-3.075 2.05 0 3.99.635 5.57 1.69.47.305.885.665 1.3 1.055s.775.805 1.134 1.275a9.96 9.96 0 0 1 1.995 5.985c0 3.49-1.8 6.564-4.514 8.364-.83.525-1.72.97-2.685 1.245l-.33-.055.085.11c-.555.14-1.165.25-1.745.305-.25 0-.5.03-.775.03-.39 0-.805 0-1.19-.085a9.8 9.8 0 0 1-2.825-.775 9.5 9.5 0 0 1-1.494-.805l-.195-.14c-.39-.275-.775-.58-1.11-.885a10 10 0 0 1-1.055-1.135 10 10 0 0 1-2.135-6.18zm31.332 16.397c.305-.635.58-1.3.805-1.965.195-.524.36-1.054.525-1.604.14-.525.275-1.08.39-1.605.33-1.605.5-3.215.5-4.875 0-2.77-.47-5.514-1.44-8.09-.25-.634.11-1.359.75-1.604.635-.25 1.36.085 1.604.75a25.9 25.9 0 0 1 1.58 8.95c0 1.8-.165 3.544-.525 5.289-.11.555-.25 1.08-.39 1.605-.14.555-.305 1.08-.5 1.605a30 30 0 0 1-1.055 2.604c-.22.445-.664.72-1.134.72-.165 0-.36-.03-.525-.11a1.24 1.24 0 0 1-.58-1.66zm9.059-61.999c4.32 0 7.814 3.52 7.814 7.815 0 4.294-3.52 7.814-7.814 7.814-1.055 0-2.05-.22-2.99-.58a8.3 8.3 0 0 1-1.47-.805 7.8 7.8 0 0 1-1.245-1.08 7.78 7.78 0 0 1-2.104-5.32c0-4.319 3.52-7.814 7.814-7.814z"},null,-1),yh=l("path",{d:"M110.401 66.69a4.14 4.14 0 0 0-4.13 4.13 4.14 4.14 0 0 0 4.13 4.13 4.14 4.14 0 0 0 4.129-4.13 4.14 4.14 0 0 0-4.129-4.13M20.228 96.503c-3.41 0-6.18 2.77-6.18 6.179s2.77 6.18 6.18 6.18 6.18-2.77 6.18-6.18-2.77-6.18-6.18-6.18"},null,-1),Ch=[vh,wh,yh];function Ah(e,t){return E(),O("svg",bh,[...Ch])}const xh={render:Ah},kh={xmlns:"http://www.w3.org/2000/svg",width:"128",height:"123"},Ih=l("path",{d:"m49.204 10.996-22.59-7.997q.9 2.4 1.2 5.997c.6 11.795-6.398 29.588-15.594 34.985l22.79 7.997c7.397-6.397 15.993-30.187 14.194-40.982"},null,-1),Lh=l("path",{d:"m39.009 53.777 2.999 1c1.199-6.398 6.797-11.195 13.394-11.195 7.597 0 13.794 6.197 13.794 13.594 0 2.199-.6 4.398-1.6 6.397h.4c8.597 1.8 18.593-18.992 18.193-32.186-.2-4.798-1.8-8.197-4.598-8.996l-28.188-9.796c.8 11.595-6.797 32.986-14.394 41.182M125.572 49.579h-.2l-15.594-5.398v-.4c-.2-4.797-2.199-6.397-3.398-6.996 0 0-.2 0-.2-.2l-15.993-5.598v.4c.4 10.195-4.598 23.39-10.796 30.787l15.993 5.597c2.6.8 5.598-1.6 7.397-3.598l15.594 5.397c5.997 2.4 13.594-16.792 7.197-19.991M21.016 24.39C24.615 14.194 25.015 2.6 19.017.6c-.6-.2-1.2-.2-1.8-.2C11.42.4 5.424 9.596 2.625 17.993.824 23.19-.175 28.388.025 32.585c.2 4.798 1.8 8.197 4.598 9.196.6.2 1.2.2 1.8.2 5.797 0 11.595-9.196 14.593-17.592M6.023 37.984c-.8-.2-1.8-1.8-2-5.398-.2-3.798.6-8.396 2.4-13.194C9.82 9.596 15.019 4.398 17.418 4.398h.4c2.199.8 2.998 8.597-.4 18.792-3.799 10.196-9.396 15.594-11.395 14.794M27.214 120.149c-.4 1 0 2.199 1 2.599.999.4 2.198 0 2.598-1L52.003 70.57c-1.4-.4-2.599-.8-3.599-1.6zM53.403 70.97v41.782c0 1 1 1.999 1.999 1.999 1.2 0 1.999-.999 1.999-1.999V70.97c-1 .2-2.599.2-3.998 0M62.599 68.97c-1.2.8-2.4 1.2-3.599 1.6l20.991 50.978c.4 1 1.6 1.6 2.6 1 .999-.4 1.599-1.599.999-2.599z"},null,-1),jh=l("path",{d:"M55.401 47.58c-5.397 0-9.796 4.398-9.796 9.596 0 5.398 4.399 9.796 9.796 9.796 5.398 0 9.796-4.398 9.796-9.796 0-5.198-4.398-9.596-9.796-9.596"},null,-1),Rh=[Ih,Lh,jh];function $h(e,t){return E(),O("svg",kh,[...Rh])}const Sh={render:$h},Mh={components:{AgileIcon:_h,TeamsIcon:xh,TelescopeIcon:Sh},methods:{buildURL(e){return ye(e)}}},Dt=e=>(Qe("data-v-fa8148d2"),e=e(),Ye(),e),Eh={class:"wrapper"},Ph={class:"responsive"},Th={class:"grid"},Uh={class:"tile"},Oh=Dt(()=>l("div",{class:"h5"},"Agile Excellence",-1)),zh=Dt(()=>l("div",{class:"body1"},"In software projects, uncertainty is inevitable, and priorities often shift. It's the ability to adapt to these changes that makes good products great.",-1)),Vh={class:"tile"},Nh=Dt(()=>l("div",{class:"h5"},"Empowered Teams",-1)),Hh=Dt(()=>l("div",{class:"body1"},"Collaboration between business and development is essential to crafting software that not only adds value but is also technologically feasible.",-1)),Fh={class:"tile"},Bh=Dt(()=>l("div",{class:"h5"},"Strong product vision",-1)),Dh=Dt(()=>l("div",{class:"body1"},"Software excels when it focuses on doing one thing exceptionally well. A strong product vision prioritizes excellence over unnecessary complexities.",-1));function qh(e,t,n,s,o,i){const r=S("AgileIcon"),a=S("TeamsIcon"),c=S("TelescopeIcon");return E(),O("div",Eh,[l("div",Ph,[l("div",Th,[l("div",Uh,[_(r),Oh,zh]),l("div",Vh,[_(a),Nh,Hh]),l("div",Fh,[_(c),Bh,Dh])])])])}const Kh=ne(Mh,[["render",qh],["__scopeId","data-v-fa8148d2"]]),Wh={components:{Believes:Kh,ProjectPreview:nh,WelcomeBanner:dh},data(){return{projectsClicked:0}},computed:{routes(){return this.projectsClicked>2?Kn:ot}},methods:{clickProjects(){this.projectsClicked++}}},Zh={id:"projects",class:"responsive"},Gh={class:"grid"};function Xh(e,t,n,s,o,i){const r=S("WelcomeBanner"),a=S("Believes"),c=S("ProjectPreview");return E(),O("div",null,[_(r),_(a),l("div",Zh,[l("h4",{onClick:t[0]||(t[0]=f=>i.clickProjects())},ae(o.projectsClicked>2?"All ":"")+" Projects ",1),l("div",Gh,[(E(!0),O(ue,null,wt(i.routes,f=>(E(),Bn(c,{key:f.id,projProps:f},null,8,["projProps"]))),128))])])])}const Qh=ne(Wh,[["render",Xh],["__scopeId","data-v-df1f4932"]]),Yh={data(){return{sources:[{title:"artist",author:"Gregor Cresnar",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/term/artist/368426"},{title:"phoenix",author:"Design Rails",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/term/phoenix/85573"},{title:"QueryBuilder",author:"jQuery",platform:"",licenseName:"MIT License",licenseLink:"https://opensource.org/licenses/MIT",sourceLink:"https://querybuilder.js.org/"},{title:"think",author:"Gregor Cresnar",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/grega.cresnar/collection/users-vol-1/?i=541709"},{title:"Happy news",author:"Katerina Limpitsouni",platform:"unDraw",licenseName:"open-source license",licenseLink:"https://undraw.co/license",sourceLink:"https://undraw.co/search"},{title:"Feeling blue",author:"Katerina Limpitsouni",platform:"unDraw",licenseName:"open-source license",licenseLink:"https://undraw.co/license",sourceLink:"https://undraw.co/search"},{title:"Ideas",author:"Katerina Limpitsouni",platform:"unDraw",licenseName:"open-source license",licenseLink:"https://undraw.co/license",sourceLink:"https://undraw.co/search"},{title:"Lottie Completed Animation",author:"Bhola Record",platform:"lottiefiles",licenseName:"Lottie Simple License",licenseLink:"https://lottiefiles.com/page/license",sourceLink:"https://lottiefiles.com/70295-lottie-completed-animation"},{title:"Agile",author:"muhamad afiffudin",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/browse/icons/term/agile/"},{title:"Network",author:"Saeful Gokil",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/browse/icons/term/network/"},{title:"Telescope",author:"ProSymbols",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/browse/icons/term/telescope/"},{title:"Send",author:"Christine Chapman",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/icon/send-6776899/"}]}}},un=e=>(Qe("data-v-bf488d2e"),e=e(),Ye(),e),Jh={id:"content",class:"responsive body2"},ef=Ft('
Legal Disclosure

Johannes Schweig

Flemingstr 6, 10557 Berlin

VAT No.: DE363289149

Telephone: 030/60269851

E-Mail: hello@johannesschweig.de

Internetadresse: www.johannesschweig.de

Person responsible for content

Johannes Schweig

Flemingstr 6, 10557 Berlin

Indication of source for images and graphics
',11),tf=["href"],nf=["href"],sf=Ft('
Disclaimer

Accountability for content: The contents of our pages have been created with the utmost care. However, we cannot guarantee the contents' accuracy, completeness or topicality. According to statutory provisions, we are furthermore responsible for our own content on these web pages. In this context, please note that we are accordingly not obliged to monitor merely the transmitted or saved information of third parties, or investigate circumstances pointing to illegal activity. Our obligations to remove or block the use of information under generally applicable laws remain unaffected by this as per §§ 8 to 10 of the Telemedia Act (TMG).

Accountability for links: Responsibility for the content of external links (to web pages of third parties) lies solely with the operators of the linked pages. No violations were evident to us at the time of linking. Should any legal infringement become known to us, we will remove the respective link immediately.

Copyright: Our web pages and their contents are subject to German copyright law. Unless expressly permitted by law (§ 44a et seq. of the copyright law), every form of utilizing, reproducing or processing works subject to copyright protection on our web pages requires the prior consent of the respective owner of the rights. Individual reproductions of a work are allowed only for private use, so must not serve either directly or indirectly for earnings. Unauthorized utilization of copyrighted works is punishable (§ 106 of the copyright law).

Quelle: http://www.muster-vorlagen.net

Impressum

Johannes Schweig

Flemingstr 6, 10557 Berlin

USt - IdNr: DE363289149

Telefon: 030/60269851

E-Mail: hello@johannesschweig.de

Internetadresse: www.johannesschweig.de

Verantwortlich für den Inhalt

Johannes Schweig

Flemingstr 6, 10557 Berlin

Quellenangaben für die verwendeten Bilder und Grafiken
',16),of=["href"],rf=["href"],af=un(()=>l("h6",null,"Haftungsausschluss",-1)),lf=un(()=>l("p",null,[l("i",null,"Haftung für Inhalte: "),W("Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.")],-1)),cf=un(()=>l("p",null,[l("i",null,"Haftung für Links: "),W("Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.")],-1)),uf=un(()=>l("p",null,[l("i",null,"Urheberrecht: "),W("Die durch die Seitenbetreiber erstellten bzw. verwendeten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.")],-1)),df=un(()=>l("p",null,[l("i",null,"Quelle: "),l("a",{class:"link",href:"http://www.muster-vorlagen.net"},"http://www.muster-vorlagen.net")],-1));function hf(e,t,n,s,o,i){return E(),O("div",Jh,[ef,l("ul",null,[(E(!0),O(ue,null,wt(o.sources,r=>(E(),O("li",{key:r.title},[W(ae(r.title)+" by "+ae(r.author)+" from "+ae(r.platform)+", license: ",1),l("a",{class:"link",href:r.licenseLink},ae(r.licenseName),9,tf),W(", source: "),l("a",{class:"link",href:r.sourceLink},"link",8,nf)]))),128))]),sf,l("ul",null,[(E(!0),O(ue,null,wt(o.sources,r=>(E(),O("li",{key:r.title},[W(ae(r.title)+" von "+ae(r.author)+" von "+ae(r.platform)+", Lizenz: ",1),l("a",{class:"link",href:r.licenseLink},ae(r.licenseName),9,of),W(", Quelle: "),l("a",{class:"link",href:r.sourceLink},"Link",8,rf)]))),128))]),af,lf,cf,uf,df])}const ff=ne(Yh,[["render",hf],["__scopeId","data-v-bf488d2e"]]),pf={components:{"project-header":Ue,"styled-image":Ke,"project-arrows":Oe},methods:{buildURL(e){return ye(e)}}},gf={class:"responsive"},mf=l("h4",null,"TL;DR",-1),_f=l("p",null,"During my work for UseTree we tested the usability of an application with maintenance workers. The aim of the application is to allow for easy and sustainable transfer of knowledge.",-1),bf=l("h4",null,"Origin",-1),vf=l("p",null,"Our client developed an app that should help mechanics with the repair of subway engines. Mechanics can view different material (photo, video,...) on the repair procedure of an engine and even record video themselves. The leading question was if the application provided substantial help for the work of the mechanics.",-1),wf=l("h4",null,"Field usability test",-1),yf=l("p",null,"During a field test at a repair shop I conducted testings with two mechanics each lasting one hour. The test included a exploration phase of the application and an interview afterwards. The test focused on the future use case of the application and was aimed to generate insights into the work processes and the integration of the application in these processes. It was set in a challenging environment: Limited time of the worker, loud noises in the repair shop, sparse familiarity with usability testing of the worker.",-1),Cf=l("h4",null,"Lab usability test",-1),Af=l("p",null,"An additional test in a usability lab focused on the usability aspects of the application. Four students participated in this study.",-1),xf=l("h4",null,"Evaluation",-1),kf=l("p",null,"The client was involved in all stages of test conduction and evaluation. This imparted basic usability competencies to the client and was aimed to integrate user-centered design in the client's workflow. The evaluation of the two tests generated valuable insights for the future development of the application. Several problems were identified regarding the integration of the app at the workplace and new ideas could be collected on how to achieve such an integration in a sustainable manner. The usability test unveiled room for improvement of the ease of use.",-1),If=l("h4",null,"Reflection",-1),Lf=l("p",null,"I carried out a majority of the field test planning and was the on-site examiner. Thus, I learnt a lot about the internal work processes of the mechanics in the repair shop. This project enhanced my knowledge of usability test design as the field test was set in a challenging environment. Finally, I learnt how to condense knowledge about the work situation, context of use and the functionality of the application to create a vision of a use case of maximum benefit.",-1),jf=l("h4",null,"Testimonial (german)",-1),Rf=l("p",null,'"Mit Hilfe von UseTree konnten wir das Usability-Konzept unserer Anwendung erfolgreich überprüfen und optimieren. UseTree lieferte wertvolle Hinweise und Verbesserungsansätze und überzeugte uns durch eine professionelle Arbeitsweise und ein hohes Maß an Kreativität. Wir können UseTree als Dienstleister uneingeschränkt weiterempfehlen und freuen uns auf künftige gemeinsame Projekte." - André Fiedler (Projektleiter)',-1);function $f(e,t,n,s,o,i){const r=S("project-header"),a=S("styled-image"),c=S("project-arrows");return E(),O("div",null,[_(r,{route:"/mechanics"}),l("div",gf,[mf,_f,_(a,{src:i.buildURL("mechanics/mechanics_app.png"),alt:"Tablet with app and engine"},null,8,["src"]),bf,vf,_(a,{src:i.buildURL("mechanics/mechanics_interview.png"),alt:"On-the-job interview with mechanic"},null,8,["src"]),wf,yf,Cf,Af,_(a,{src:i.buildURL("mechanics/workflow.png"),alt:"Diagram of the application's workflow"},null,8,["src"]),xf,kf,If,Lf,jf,Rf]),_(c,{route:"/mechanics"})])}const Sf=ne(pf,[["render",$f]]),Mf={},sr=e=>(Qe("data-v-f2755a3c"),e=e(),Ye(),e),Ef={id:"PageNotFound",class:"responsive"},Pf=sr(()=>l("h1",null,"404",-1)),Tf=sr(()=>l("p",null,"This page could not be found.",-1));function Uf(e,t){const n=S("router-link");return E(),O("div",Ef,[Pf,Tf,_(n,{to:"/"},{default:ce(()=>[W("Back to Homepage")]),_:1})])}const Of=ne(Mf,[["render",Uf],["__scopeId","data-v-f2755a3c"]]),zf={data(){return{project:{route:"/phoenix"}}},components:{"project-header":Ue,"styled-image":Ke,"project-arrows":Oe},methods:{buildURL(e){return ye(e)}}},Vf={class:"responsive"},Nf=Ft("

TL;DR

In my free time I programmed a music player and expanded on it over the years. I learnt a lot about User-Centered Design, software engineering and making use of stackoverflow.

Problem

I was faced with the challenge of still having a lot of mp3s lying around but no suitable software to play and manage them. As streaming services such as Spotify take over traditional music players have shifted their focus (iTunes) or were abandoned all together (Winamp). So I decided to built a desktop music player suited for my own needs.

Research

I tried to specify the context of use and the requirements for the music playing application. I identified the following:

  • Continuous background playback via a suggestion system (similar to YouTube's AutoPlay)
  • A fast search for titles, artists, albums
  • Good performance at low resource consumption

After that, I studied competing products: iTunes, Winamp, MediaMonkey and Windows Media Player. In what way did they fulfill their goals? What are their shortcomings? All of these applications provide a lot of functionality (playlists, file management, tag writing, equalizer and additional settings) and the user is generally expected to actively cue in his/her songs (except Genius-playlists by iTunes). A lot of space in the user interfaces of these applications is taken up by toolbars, menus, cover previews and large context menus. Also, old UI concepts are still in use such as the tree view navigation. Colors and style are mainly aimed to transport the corporate identity of the manufacturing company (WMP by windows, iTunes by apple).

Prototyping

",9),Hf=l("p",null,"I transitioned from a low fidelity prototype on paper to a photoshop mockup to a fully-functioning Java prototype.",-1),Ff=l("h4",null,"Evaluation",-1),Bf=l("p",null,"During the use of the application I documented design flaws, bugs and possible improvements. These were then incorporated in the next version of the application. This iterative process of use and improvement led to a constant development cycle. At first, I made changes and added functionality in rapid succession, but often realized in hindsight that the change did not integrate very well with the rest of the application or provided too little value compard to its development costs. Later in the project I spend more time elaborating on possible features which made my work more sustainable and time-efficient.",-1),Df=l("p",null,"Five key questions followed me during that process:",-1),qf=l("ul",null,[l("li",null,"How do I provide a visual design that is consistent in colors, icons, animations, hover/interaction effects, element sizes, state of ui elements and affordances?"),l("li",null,"What is the 'product identity' (aka corporate indentity) of Phoenix?"),l("li",null,"How do I provide meaningfull and appropriate (error) feedback?"),l("li",null,"What are the needs of the user and what implications do they have on the functionality of the software?"),l("li",null,"How do I identify core use cases and choose the suitable interaction paradigm (e.g. search, buttons)?")],-1),Kf=l("h4",null,"Design features",-1),Wf=Ft('

Apart from the common media control I implemented three core design features:

  1. Auto-Dj: This functionality uses mp3 tag information to generate music suggestions (similar to populat AutoPlay functionalities in YouTube or Souncloud). It provides three modes of operation which start up once the user reaches the end of the tracklist.
    • Random track: Adds an unknown track that is similar to the last one.
    • Random favourite track: Adds a favourite track of the user that is similar to the last one.
    • Random track from album or artist: Adds a track from the same artist or album like the previous track.
  2. Overlay with information about current track: Shows a short overlay containing information about the currently played track in the top right corner. As the overlay appears on top of all other windows this functionality is well suited to check back on your music while having it play in the background.
  3. Search: A SQL backend allowed for very fast and compley queries even with large music databases and made the search lightning fast.

Reflection

During the iterations of implementation-testing I learnt how to get more efficient in my own workflow and how to counterbalance design and functionality. The experience from my university courses and the job at UseTree about usability, UX and user-centered design guided me through this process. Furthermore, I learnt how to prioritze features and implement only the ones that were important, sustainable and time-efficient. Apart from that my software development skills improved dramatically as I got more proficient in the Java language, the JavaFX frontend framework, SQL and different libraries.

View project on GitHub

Successor: PhoenixJS

',6),Zf=l("p",null,"In the course of the project I often felt restrained by the limited capabilites of the JavaFX frontend framework. Also, even though I tried, I could never really separate functionality in Model-View-Controller resulting in a messy code base. And in the end I needed a good reason to learn JavaScript, so I decided to rewrite the application with React and Redux. I used nedb for the database part and deployed the whole application as a cross-platfrom compatible electron app.",-1),Gf=l("p",null,[l("a",{class:"link",href:"https://github.com/johannesschweig/PhoenixJS"},"View PhoenixJS on GitHub")],-1);function Xf(e,t,n,s,o,i){const r=S("project-header"),a=S("styled-image"),c=S("project-arrows");return E(),O("div",null,[_(r,{route:"/phoenix"}),l("div",Vf,[Nf,_(a,{src:i.buildURL("phoenix/paper_prototype.jpg"),alt:"UI concept on paper"},null,8,["src"]),Hf,_(a,{src:i.buildURL("phoenix/mockup_ps.jpg"),alt:"Photoshop mockup of the application"},null,8,["src"]),Ff,Bf,_(a,{src:i.buildURL("phoenix/shuffle_tooltip.png"),alt:"Left: Mouseover effects of the shuffle button: none, hover, active; Right: Photoshop mockup of the application"},null,8,["src"]),Df,qf,Kf,_(a,{src:i.buildURL("phoenix/coverflow.mp4"),alt:"Coverflow animation when changing tracks"},null,8,["src"]),Wf,_(a,{src:i.buildURL("phoenix/wireframe_ps_js.png"),alt:"Wireframe of the Javascript application"},null,8,["src"]),Zf,Gf]),_(c,{route:"/phoenix"})])}const Qf=ne(zf,[["render",Xf]]),Yf={components:{"project-header":Ue,"styled-image":Ke,"project-arrows":Oe},methods:{buildURL(e){return ye(e)}}},Jf={class:"responsive"},ep=l("h4",null,"TL;DR",-1),tp=l("p",null,"I helped to build a functionality which lets users filter their data based on multiple, nested criteria.",-1),np=l("h4",null,"Problem",-1),sp=l("p",null,"During my time at KNIME I was asked to create an interface for a node (KNIME term for encapsulated functionality) where users can filter their data based on multiple rules (e.g. filter out all rows in the data where the year column is smaller than 2016).",-1),op=l("p",null,"The existing solution only supported one rule and the aim was to extend the functionality, so it could also work with multiple rules and it should be possible to nest rules (e.g. [condition A AND condition B] OR condition C). Users would not have to worry anymore about writing their queries in SQL because they could comfortably build them in a UI. This has several advantages:",-1),ip=l("ul",null,[l("li",null,"Avoiding typos by using dropdowns and other UI components"),l("li",null,"Faster rule generation with suggestions (e.g. possible values of columns)"),l("li",null,"Better understanding through hierarchical display of rules (if you have once tried to make sense of another person's excel formulas, you know what I mean)")],-1),rp=l("h4",null,"Research",-1),ap=l("p",null,"I researched about how others have tried to solve this problem and found a number of different user interfaces. Some of them represented their rules as a graph, some of them as a nested list. And they also differed in how they made the actions such as creating or deleting rules available to the user.",-1),lp=l("h4",null,"Ideation",-1),cp=l("p",null,"Then I proceeded to explore the problem space with sketches. This brought up questions such as:",-1),up=l("ul",null,[l("li",null,"How many different combinations of nested rules could there be? (A lot)"),l("li",null,"How do you present the rules to the user? Inline forms / Graph preview / treeview preview? (see image below)"),l("li",null,"Do you connect items in a group with an AND/OR or do you set it to the top of the group?")],-1),dp=l("p",null,"Trying to answer those questions helped to find possible solutions, narrowed the problem space, but also improved my understanding of the domain (Querying a database).",-1),hp=l("h4",null,"Variations",-1),fp=l("p",null,"I came up with a variation where the rules were laid out top to bottom, groups were indicated by different colored rectangles and you could edit the rules right in place (see inline form in image above). It quickly came apparent that this solution would fit for easy queries with few rules and few nesting levels, but not for very complex queries. Then I designed a version where you would have a preview section on one side and an edit section on the other. This would allow for easier layouting as you would only have to display the currently selected rule. All other rules were displayed with a small label. The display of the preview varied: vertical graph, horizontal graph or treeview.",-1),pp=l("h4",null,"Testing",-1),gp=l("p",null,'I created a small paper protoype and showed it to different colleagues. During the test the colleague had to press the buttons on the paper and I would (as responsively as I could) "slide in" the new UI elements ("Wizard of Oz prototyping"). After testing we decided that the AND/OR of groups should be positioned on top of them and not between the rules as our participants prefered by this. .',-1),mp=l("p",null,"In the end we decided for the treeview as it was easier to implement as the other concepts, was recognized as a familiar component by the users and also showed good results in user interaction.",-1);function _p(e,t,n,s,o,i){const r=S("project-header"),a=S("styled-image"),c=S("project-arrows");return E(),O("div",null,[_(r,{route:"/querybuilder"}),l("div",Jf,[ep,tp,np,_(a,{src:i.buildURL("querybuilder/sql.png"),alt:"The beauty of SQL"},null,8,["src"]),sp,op,ip,rp,_(a,{src:i.buildURL("querybuilder/querybuilders.png"),alt:"Querybuilders by jQuery (left) and Microsoft Outlook (right)"},null,8,["src"]),ap,lp,cp,up,dp,hp,_(a,{src:i.buildURL("querybuilder/variations.png"),alt:"Variations of rule representations: vertical graph, treeview, inline form, horizontal graph"},null,8,["src"]),fp,pp,_(a,{src:i.buildURL("querybuilder/concept.png"),alt:"Final UI concept"},null,8,["src"]),gp,mp,_(a,{src:i.buildURL("querybuilder/row-filter.png"),alt:"User interface as of KNIME Analytics Platform v3.7.1"},null,8,["src"])]),_(c,{route:"/querybuilder"})])}const bp=ne(Yf,[["render",_p]]),vp={components:{"project-header":Ue,"styled-image":Ke,"project-arrows":Oe},methods:{buildURL(e){return ye(e)}}},wp={class:"responsive body1"},yp=l("h4",null,"TL;DR",-1),Cp=l("p",null,"I led a discovery project aiming to improve a core functionality in a web application. I interviewed customers and internal stakeholders. As a result a couple of smaller fixes and a big feature were developed.",-1),Ap=l("h4",null,"Problem statement",-1),xp=l("p",null,[l("a",{class:"link",href:"https://www.valsight.com/"},"Valsight"),W(" offers a financial planning solution for big companies. One of the core features is the “scenario manager” where you can create and modify assumptions (+10% more sales next year) and add them to scenarios (best case). Historically grown, it was very complex to understand and use. My task was to talk to users and figure out a way to make it easier to understand and better to use.")],-1),kp=l("p",null,"The initial timeline for the project was set to 3 weeks. I proposed a project plan with three phases starting with a research phase, then an ideation/creation phase and finally a validation phase. In the end we wanted to have wireframes that we could create stories for and make part of a sprint. In the following, I will focus on the way I conducted the customer interviews and condensed the findings.",-1),Ip=Ft('

Research

Customer interviews

I prepared a semi-structured interview with around 10 questions asking about

  • The current usage of the scenario manager
  • What worked well and what did not
  • What information was important to them and what not
  • How they worked with the scenario manager
  • Who worked with it the most and how they collaborated as a team

I skipped questions that were not applicable for the participant or asked again if there was a chance to gain more insights by diving deeper into a topic.

We managed to recruit customers from four companies and I talked to three internal consultants. The interviews were audio recorded and transcribed later.

Condense findings

I printed out the interview protocols on paper and cut them into small snips of a few sentences each. Then I started a data wall where I grouped snips to broader topics. After that I removed smaller topics to focus on the big topics that started to emerge.

',8),Lp=l("h4",null,"Ideation/Creation",-1),jp=l("h5",null,"Present findings",-1),Rp=l("p",null,"I presented these topics to my product manager and we decided which topics we would prioritize for now.",-1),$p=l("h4",null,"Development",-1),Sp=l("p",null,"A couple of smaller features were developed right after concluding the validation with customers. A search functionality was added to the scenario manager to find items in the list faster. Also, a couple of visual tweaks were made to the scenario manager and a convenient keyboard shortcut for faster navigation was introduced.",-1),Mp=l("p",null,"We had a bigger feature idea about grouping similar assumptions together and making it easier to switch between them. This idea was further iterated and refined until it was ready to be developed and shipped.",-1),Ep=l("h4",null,"Learnings",-1),Pp=l("p",null,"In hindsight, I was proud and amazed at how often I would come back to my findings for related topics or just look at the written protocols if I vaguely remembered somebody having said something similar in one of the interviews. A powerful quote from a user really sticks in your head!",-1),Tp=l("p",null,"I also enjoyed passing back the positive feedback from the interviews to the developers. They certainly deserved it.",-1),Up=l("p",null,"The project also inspired lots of people involved in building the product and served as a source of feature ideas for the future.",-1),Op=l("p",null,"On the other hand, the problem statement could have been clearer. The broad scope of it allowed for a lot of valuable exploration to happen, but it also felt like it was not worth the effort at times. Changing something is very hard if it has been at the core of an application for many years. Usually, there are good reasons why it is the way it is and users are not happy to have their workflow changed.",-1);function zp(e,t,n,s,o,i){const r=S("project-header"),a=S("styled-image"),c=S("project-arrows");return E(),O("div",null,[_(r,{route:"/scenariomanager"}),l("div",wp,[yp,Cp,Ap,xp,kp,_(a,{src:i.buildURL("scenariomanager/project-plan.png"),alt:"Plan for the project"},null,8,["src"]),Ip,_(a,{src:i.buildURL("scenariomanager/snip-gif.mp4"),alt:"Data wall with snips moving into bigger topics"},null,8,["src"]),Lp,jp,Rp,_(a,{src:i.buildURL("scenariomanager/mass-ass-slide.jpg"),alt:"Mass of assumptions was one bigger topic"},null,8,["src"]),$p,Sp,Mp,_(a,{src:i.buildURL("scenariomanager/variants.jpg"),alt:'Assumptions are grouped using "variants"'},null,8,["src"]),Ep,Pp,Tp,Up,Op]),_(c,{route:"/scenariomanager"})])}const Vp=ne(vp,[["render",zp]]),Np={components:{"project-header":Ue,"styled-image":Ke,"project-arrows":Oe},methods:{buildURL(e){return ye(e)}}},Re=e=>(Qe("data-v-b94896ed"),e=e(),Ye(),e),Hp={class:"responsive"},Fp=Re(()=>l("h2",null,"TL;DR",-1)),Bp=Re(()=>l("p",null,"In my master thesis I examined the effects of wearing eyeglasses on eye tracking. I used methods from statistics and machine learning to correct for eyeglass-induced errors.",-1)),Dp=Re(()=>l("h2",null,"Background",-1)),qp=Re(()=>l("p",null,[W("Eye tracking is a useful method which is not only used in research and interactive systems but also in future technologies such as the "),l("a",{target:"_blank",href:"https://techcrunch.com/2016/12/28/the-eye-tribe-oculus/"},"foveated rendering for VR"),W(". Modern eye trackers use a combination of the pupil position and an infrared reflection to infer the point of gaze. Corrective eyeglasses, however, pose a challenge for the eyetracking system. They alter the image of the eye, thus causing errors in the eyetracking signal. These errors are related to the refractive strength of the eyeglasses. In my thesis, I tried to build a classification model that takes eye tracking data as input in order to output the refractive strength of the current user. On the basis of this classification, an error correction is applied that corrects the eye tracking data dependening on the refractive strength.")],-1)),Kp=Re(()=>l("h2",null,"Data collection",-1)),Wp=Re(()=>l("p",null,"I collected data using a head model with artificial eyes and different pairs of eyeglasses on various positions of the screen. Two datasets were obtained; one for training and testing the models and one dataset for validation. The validation dataset contained a portion of new data. Its aim was to assess how well the models could generalize on new data.",-1)),Zp=Re(()=>l("h2",null,"Classification",-1)),Gp=Re(()=>l("p",null,"I employed several popular machine learning algorithms (KNN, SVM, MLP,...) to build classification models. These models were adjusted on the data (hyperparameters) in a grid search paradigm with a 10-fold cross-validation. The final models were evaluated on training, test and validation set. The Multi-layer perceptron model (MLP) showed the highest performance with a fscore of .99 on the test set and a fscore of .73 on the validation set.",-1)),Xp=Re(()=>l("h2",null,"Error correction",-1)),Qp=Re(()=>l("p",null,"I built several models following a weighted-average and a regression approach. The weighted-average model was able to reduce the error by about 50% on the training and test set. The regression model reduced the error by about 25%. Both models performed equally on the validation set with a reduction of 45% in X direction and 10% in Y direction.",-1)),Yp=Re(()=>l("h2",null,"Reflection",-1)),Jp=Re(()=>l("p",null,"My thesis was the first major research project that I conducted from start to finish. I recognized the vitality of an early distinct and definite definition of the task. I learned a lot about the practical application of machine learning on real data and how to deal with problems of data quality like missing and noisy data. I learnt how to make reasonable deductions from preliminary work and how to support my own claims. Lastly, I learnt how to interpret results in the presence of ambiguity and uncertainty and how huge the effort is in order to make small progress in research.",-1)),e3=["href"],t3=["src"];function n3(e,t,n,s,o,i){const r=S("project-header"),a=S("styled-image"),c=S("project-arrows");return E(),O("div",null,[_(r,{route:"/thesis"}),l("div",Hp,[Fp,Bp,_(a,{src:i.buildURL("thesis/foveated-rendering.png"),alt:"Foveated rendering in a VR game"},null,8,["src"]),Dp,qp,Kp,Wp,_(a,{src:i.buildURL("thesis/data-coll.png"),alt:"Collected eye tracking data"},null,8,["src"]),Zp,Gp,_(a,{src:i.buildURL("thesis/gnb.png"),alt:"Confusion matrix of a trained model"},null,8,["src"]),Xp,Qp,_(a,{src:i.buildURL("thesis/regX.png"),alt:"3D Scatterplot with a regression plane for the X offset"},null,8,["src"]),Yp,Jp,l("a",{id:"download",target:"_blank",href:i.buildURL("thesis/thesis.pdf")},[l("img",{src:i.buildURL("thesis/download.png"),width:"32"},null,8,t3),W(" Download the pdf here ")],8,e3)]),_(c,{route:"/thesis"})])}const s3=ne(Np,[["render",n3],["__scopeId","data-v-b94896ed"]]),o3={data(){return{project:{route:"/phoenix"}}},components:{"project-header":Ue,"project-arrows":Oe,Button:cn},methods:{buildURL(e){return ye(e)}}},i3={class:"responsive"},r3=l("h4",null,"TL;DR",-1),a3=l("p",null,"I was the project lead for a big car rental company building a system that automatically processed traffic tickets.",-1),l3=l("p",null,[W("The nature of this work is confidential. "),l("a",{class:"link",href:"mailto:hello@johannesschweig.de"},"Contact me "),W("for the password.")],-1);function c3(e,t,n,s,o,i){const r=S("project-header"),a=S("Button"),c=S("project-arrows");return E(),O("div",null,[_(r,{route:"/trafficticket"}),l("div",i3,[r3,a3,l3,_(a,{type:"primary",bg:"light",size:"sm",text:"Download the PDF",href:i.buildURL("trafficticket/trafficticket.pdf")},null,8,["href"])]),_(c,{route:"/trafficticket"})])}const u3=ne(o3,[["render",c3]]),d3=o2({history:wc("/"),routes:[{path:"/",component:Qh},{path:"/about",component:Eu},{path:"/codesnippets",component:C1},{path:"/dubai",component:F1},{path:"/esgehtlos",component:od},{path:"/greenbox",component:Ad},{path:"/knimehub",component:qd},{path:"/legal",component:ff},{path:"/mechanics",component:Sf},{path:"/phoenix",component:Qf},{path:"/querybuilder",component:bp},{path:"/scenariomanager",component:Vp},{path:"/thesis",component:s3},{path:"/trafficticket",component:u3},{path:"/:pathMatch(.*)",name:"bad-not-found",component:Of}],scrollBehavior(e,t,n){return{top:0}}}),Fs=vl(nc);Fs.use(xl());Fs.use(d3);Fs.mount("#app"); diff --git a/assets/index-zrolZyV4.js b/assets/index-zrolZyV4.js new file mode 100644 index 0000000..addc142 --- /dev/null +++ b/assets/index-zrolZyV4.js @@ -0,0 +1,25 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const r of i.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();/** +* @vue/shared v3.4.15 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function ys(e,t){const n=new Set(e.split(","));return t?s=>n.has(s.toLowerCase()):s=>n.has(s)}const re={},St=[],je=()=>{},or=()=>!1,Pn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Cs=e=>e.startsWith("onUpdate:"),pe=Object.assign,As=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ir=Object.prototype.hasOwnProperty,Z=(e,t)=>ir.call(e,t),H=Array.isArray,Mt=e=>En(e)==="[object Map]",Fo=e=>En(e)==="[object Set]",q=e=>typeof e=="function",de=e=>typeof e=="string",Nt=e=>typeof e=="symbol",ae=e=>e!==null&&typeof e=="object",Bo=e=>(ae(e)||q(e))&&q(e.then)&&q(e.catch),Do=Object.prototype.toString,En=e=>Do.call(e),rr=e=>En(e).slice(8,-1),qo=e=>En(e)==="[object Object]",xs=e=>de(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,bn=ys(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Tn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ar=/-(\w)/g,qe=Tn(e=>e.replace(ar,(t,n)=>n?n.toUpperCase():"")),lr=/\B([A-Z])/g,Ht=Tn(e=>e.replace(lr,"-$1").toLowerCase()),Un=Tn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Zn=Tn(e=>e?`on${Un(e)}`:""),dt=(e,t)=>!Object.is(e,t),Gn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},cr=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Ks;const Ko=()=>Ks||(Ks=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ln(e){if(H(e)){const t={};for(let n=0;n{if(n){const s=n.split(dr);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function ht(e){let t="";if(de(e))t=e;else if(H(e))for(let n=0;nde(e)?e:e==null?"":H(e)||ae(e)&&(e.toString===Do||!q(e.toString))?JSON.stringify(e,Zo,2):String(e),Zo=(e,t)=>t&&t.__v_isRef?Zo(e,t.value):Mt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o],i)=>(n[Xn(s,i)+" =>"]=o,n),{})}:Fo(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Xn(n))}:Nt(t)?Xn(t):ae(t)&&!H(t)&&!qo(t)?String(t):t,Xn=(e,t="")=>{var n;return Nt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.15 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Se;class Go{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Se,!t&&Se&&(this.index=(Se.scopes||(Se.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Se;try{return Se=this,t()}finally{Se=n}}}on(){Se=this}off(){Se=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n=2))break}this._dirtyLevel<2&&(this._dirtyLevel=0),Ct()}return this._dirtyLevel>=2}set dirty(t){this._dirtyLevel=t?2:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=ct,n=bt;try{return ct=!0,bt=this,this._runnings++,Ws(this),this.fn()}finally{Zs(this),this._runnings--,bt=n,ct=t}}stop(){var t;this.active&&(Ws(this),Zs(this),(t=this.onStop)==null||t.call(this),this.active=!1)}}function br(e){return e.value}function Ws(e){e._trackId++,e._depsLength=0}function Zs(e){if(e.deps&&e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},as=new WeakMap,wt=Symbol(""),ls=Symbol("");function xe(e,t,n){if(ct&&bt){let s=as.get(e);s||as.set(e,s=new Map);let o=s.get(n);o||s.set(n,o=ti(()=>s.delete(n))),Yo(bt,o)}}function Qe(e,t,n,s,o,i){const r=as.get(e);if(!r)return;let a=[];if(t==="clear")a=[...r.values()];else if(n==="length"&&H(e)){const c=Number(s);r.forEach((f,h)=>{(h==="length"||!Nt(h)&&h>=c)&&a.push(f)})}else switch(n!==void 0&&a.push(r.get(n)),t){case"add":H(e)?xs(n)&&a.push(r.get("length")):(a.push(r.get(wt)),Mt(e)&&a.push(r.get(ls)));break;case"delete":H(e)||(a.push(r.get(wt)),Mt(e)&&a.push(r.get(ls)));break;case"set":Mt(e)&&a.push(r.get(wt));break}Is();for(const c of a)c&&Jo(c,2);Ls()}const wr=ys("__proto__,__v_isRef,__isVue"),ni=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Nt)),Gs=yr();function yr(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=G(this);for(let i=0,r=this.length;i{e[t]=function(...n){yt(),Is();const s=G(this)[t].apply(this,n);return Ls(),Ct(),s}}),e}function Cr(e){const t=G(this);return xe(t,"has",e),t.hasOwnProperty(e)}class si{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,s){const o=this._isReadonly,i=this._shallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(o?i?Tr:ai:i?ri:ii).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const r=H(t);if(!o){if(r&&Z(Gs,n))return Reflect.get(Gs,n,s);if(n==="hasOwnProperty")return Cr}const a=Reflect.get(t,n,s);return(Nt(n)?ni.has(n):wr(n))||(o||xe(t,"get",n),i)?a:ke(a)?r&&xs(n)?a:a.value:ae(a)?o?ci(a):zn(a):a}}class oi extends si{constructor(t=!1){super(!1,t)}set(t,n,s,o){let i=t[n];if(!this._shallow){const c=Ut(i);if(!In(s)&&!Ut(s)&&(i=G(i),s=G(s)),!H(t)&&ke(i)&&!ke(s))return c?!1:(i.value=s,!0)}const r=H(t)&&xs(n)?Number(n)e,On=e=>Reflect.getPrototypeOf(e);function fn(e,t,n=!1,s=!1){e=e.__v_raw;const o=G(e),i=G(t);n||(dt(t,i)&&xe(o,"get",t),xe(o,"get",i));const{has:r}=On(o),a=s?js:n?Ms:tn;if(r.call(o,t))return a(e.get(t));if(r.call(o,i))return a(e.get(i));e!==o&&e.get(t)}function pn(e,t=!1){const n=this.__v_raw,s=G(n),o=G(e);return t||(dt(e,o)&&xe(s,"has",e),xe(s,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function gn(e,t=!1){return e=e.__v_raw,!t&&xe(G(e),"iterate",wt),Reflect.get(e,"size",e)}function Xs(e){e=G(e);const t=G(this);return On(t).has.call(t,e)||(t.add(e),Qe(t,"add",e,e)),this}function Qs(e,t){t=G(t);const n=G(this),{has:s,get:o}=On(n);let i=s.call(n,e);i||(e=G(e),i=s.call(n,e));const r=o.call(n,e);return n.set(e,t),i?dt(t,r)&&Qe(n,"set",e,t):Qe(n,"add",e,t),this}function Ys(e){const t=G(this),{has:n,get:s}=On(t);let o=n.call(t,e);o||(e=G(e),o=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return o&&Qe(t,"delete",e,void 0),i}function Js(){const e=G(this),t=e.size!==0,n=e.clear();return t&&Qe(e,"clear",void 0,void 0),n}function mn(e,t){return function(s,o){const i=this,r=i.__v_raw,a=G(r),c=t?js:e?Ms:tn;return!e&&xe(a,"iterate",wt),r.forEach((f,h)=>s.call(o,c(f),c(h),i))}}function _n(e,t,n){return function(...s){const o=this.__v_raw,i=G(o),r=Mt(i),a=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,f=o[e](...s),h=n?js:t?Ms:tn;return!t&&xe(i,"iterate",c?ls:wt),{next(){const{value:p,done:m}=f.next();return m?{value:p,done:m}:{value:a?[h(p[0]),h(p[1])]:h(p),done:m}},[Symbol.iterator](){return this}}}}function nt(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Lr(){const e={get(i){return fn(this,i)},get size(){return gn(this)},has:pn,add:Xs,set:Qs,delete:Ys,clear:Js,forEach:mn(!1,!1)},t={get(i){return fn(this,i,!1,!0)},get size(){return gn(this)},has:pn,add:Xs,set:Qs,delete:Ys,clear:Js,forEach:mn(!1,!0)},n={get(i){return fn(this,i,!0)},get size(){return gn(this,!0)},has(i){return pn.call(this,i,!0)},add:nt("add"),set:nt("set"),delete:nt("delete"),clear:nt("clear"),forEach:mn(!0,!1)},s={get(i){return fn(this,i,!0,!0)},get size(){return gn(this,!0)},has(i){return pn.call(this,i,!0)},add:nt("add"),set:nt("set"),delete:nt("delete"),clear:nt("clear"),forEach:mn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=_n(i,!1,!1),n[i]=_n(i,!0,!1),t[i]=_n(i,!1,!0),s[i]=_n(i,!0,!0)}),[e,n,t,s]}const[jr,Rr,$r,Sr]=Lr();function Rs(e,t){const n=t?e?Sr:$r:e?Rr:jr;return(s,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(Z(n,o)&&o in s?n:s,o,i)}const Mr={get:Rs(!1,!1)},Pr={get:Rs(!1,!0)},Er={get:Rs(!0,!1)},ii=new WeakMap,ri=new WeakMap,ai=new WeakMap,Tr=new WeakMap;function Ur(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Or(e){return e.__v_skip||!Object.isExtensible(e)?0:Ur(rr(e))}function zn(e){return Ut(e)?e:$s(e,!1,xr,Mr,ii)}function li(e){return $s(e,!1,Ir,Pr,ri)}function ci(e){return $s(e,!0,kr,Er,ai)}function $s(e,t,n,s,o){if(!ae(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const r=Or(e);if(r===0)return e;const a=new Proxy(e,r===2?s:n);return o.set(e,a),a}function Pt(e){return Ut(e)?Pt(e.__v_raw):!!(e&&e.__v_isReactive)}function Ut(e){return!!(e&&e.__v_isReadonly)}function In(e){return!!(e&&e.__v_isShallow)}function ui(e){return Pt(e)||Ut(e)}function G(e){const t=e&&e.__v_raw;return t?G(t):e}function Ss(e){return kn(e,"__v_skip",!0),e}const tn=e=>ae(e)?zn(e):e,Ms=e=>ae(e)?ci(e):e;class di{constructor(t,n,s,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new ks(()=>t(this._value),()=>wn(this,1),()=>this.dep&&ei(this.dep)),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=G(this);return(!t._cacheable||t.effect.dirty)&&dt(t._value,t._value=t.effect.run())&&wn(t,2),hi(t),t.effect._dirtyLevel>=1&&wn(t,1),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function zr(e,t,n=!1){let s,o;const i=q(e);return i?(s=e,o=je):(s=e.get,o=e.set),new di(s,o,i||!o,n)}function hi(e){ct&&bt&&(e=G(e),Yo(bt,e.dep||(e.dep=ti(()=>e.dep=void 0,e instanceof di?e:void 0))))}function wn(e,t=2,n){e=G(e);const s=e.dep;s&&Jo(s,t)}function ke(e){return!!(e&&e.__v_isRef===!0)}function fi(e){return pi(e,!1)}function Vr(e){return pi(e,!0)}function pi(e,t){return ke(e)?e:new Nr(e,t)}class Nr{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:G(t),this._value=n?t:tn(t)}get value(){return hi(this),this._value}set value(t){const n=this.__v_isShallow||In(t)||Ut(t);t=n?t:G(t),dt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:tn(t),wn(this,2))}}function Et(e){return ke(e)?e.value:e}const Hr={get:(e,t,n)=>Et(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return ke(o)&&!ke(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function gi(e){return Pt(e)?e:new Proxy(e,Hr)}/** +* @vue/runtime-core v3.4.15 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function ut(e,t,n,s){let o;try{o=s?e(...s):e()}catch(i){Vn(i,t,n)}return o}function Ee(e,t,n,s){if(q(e)){const i=ut(e,t,n,s);return i&&Bo(i)&&i.catch(r=>{Vn(r,t,n)}),i}const o=[];for(let i=0;i>>1,o=me[s],i=sn(o);iDe&&me.splice(t,1)}function qr(e){H(e)?Tt.push(...e):(!it||!it.includes(e,e.allowRecurse?vt+1:vt))&&Tt.push(e),vi()}function eo(e,t,n=nn?De+1:0){for(;nsn(n)-sn(s));if(Tt.length=0,it){it.push(...t);return}for(it=t,vt=0;vte.id==null?1/0:e.id,Kr=(e,t)=>{const n=sn(e)-sn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function wi(e){cs=!1,nn=!0,me.sort(Kr);try{for(De=0;Dede(y)?y.trim():y)),p&&(o=n.map(cr))}let a,c=s[a=Zn(t)]||s[a=Zn(qe(t))];!c&&i&&(c=s[a=Zn(Ht(t))]),c&&Ee(c,e,6,o);const f=s[a+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Ee(f,e,6,o)}}function yi(e,t,n=!1){const s=t.emitsCache,o=s.get(e);if(o!==void 0)return o;const i=e.emits;let r={},a=!1;if(!q(e)){const c=f=>{const h=yi(f,t,!0);h&&(a=!0,pe(r,h))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!a?(ae(e)&&s.set(e,null),null):(H(i)?i.forEach(c=>r[c]=null):pe(r,i),ae(e)&&s.set(e,r),r)}function Nn(e,t){return!e||!Pn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,Ht(t))||Z(e,t))}let ye=null,Hn=null;function Ln(e){const t=ye;return ye=e,Hn=e&&e.type.__scopeId||null,t}function Ke(e){Hn=e}function We(){Hn=null}function ue(e,t=ye,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&ho(-1);const i=Ln(t);let r;try{r=e(...o)}finally{Ln(i),s._d&&ho(1)}return r};return s._n=!0,s._c=!0,s._d=!0,s}function Qn(e){const{type:t,vnode:n,proxy:s,withProxy:o,props:i,propsOptions:[r],slots:a,attrs:c,emit:f,render:h,renderCache:p,data:m,setupState:y,ctx:S,inheritAttrs:z}=e;let V,E;const F=Ln(e);try{if(n.shapeFlag&4){const X=o||s,le=X;V=Be(h.call(le,X,p,i,y,m,S)),E=c}else{const X=t;V=Be(X.length>1?X(i,{attrs:c,slots:a,emit:f}):X(i,null)),E=t.props?c:Zr(c)}}catch(X){Yt.length=0,Vn(X,e,1),V=_(pt)}let B=V;if(E&&z!==!1){const X=Object.keys(E),{shapeFlag:le}=B;X.length&&le&7&&(r&&X.some(Cs)&&(E=Gr(E,r)),B=Ot(B,E))}return n.dirs&&(B=Ot(B),B.dirs=B.dirs?B.dirs.concat(n.dirs):n.dirs),n.transition&&(B.transition=n.transition),V=B,Ln(F),V}const Zr=e=>{let t;for(const n in e)(n==="class"||n==="style"||Pn(n))&&((t||(t={}))[n]=e[n]);return t},Gr=(e,t)=>{const n={};for(const s in e)(!Cs(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Xr(e,t,n){const{props:s,children:o,component:i}=e,{props:r,children:a,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?to(s,r,f):!!r;if(c&8){const h=t.dynamicProps;for(let p=0;pe.__isSuspense;function ta(e,t){t&&t.pendingBranch?H(e)?t.effects.push(...e):t.effects.push(e):qr(e)}const na=Symbol.for("v-scx"),sa=()=>Ye(na),vn={};function yn(e,t,n){return Ai(e,t,n)}function Ai(e,t,{immediate:n,deep:s,flush:o,once:i,onTrack:r,onTrigger:a}=re){if(t&&i){const D=t;t=(...be)=>{D(...be),le()}}const c=_e,f=D=>s===!0?D:$t(D,s===!1?1:void 0);let h,p=!1,m=!1;if(ke(e)?(h=()=>e.value,p=In(e)):Pt(e)?(h=()=>f(e),p=!0):H(e)?(m=!0,p=e.some(D=>Pt(D)||In(D)),h=()=>e.map(D=>{if(ke(D))return D.value;if(Pt(D))return f(D);if(q(D))return ut(D,c,2)})):q(e)?t?h=()=>ut(e,c,2):h=()=>(y&&y(),Ee(e,c,3,[S])):h=je,t&&s){const D=h;h=()=>$t(D())}let y,S=D=>{y=B.onStop=()=>{ut(D,c,4),y=B.onStop=void 0}},z;if(qn)if(S=je,t?n&&Ee(t,c,3,[h(),m?[]:void 0,S]):h(),o==="sync"){const D=sa();z=D.__watcherHandles||(D.__watcherHandles=[])}else return je;let V=m?new Array(e.length).fill(vn):vn;const E=()=>{if(!(!B.active||!B.dirty))if(t){const D=B.run();(s||p||(m?D.some((be,Le)=>dt(be,V[Le])):dt(D,V)))&&(y&&y(),Ee(t,c,3,[D,V===vn?void 0:m&&V[0]===vn?[]:V,S]),V=D)}else B.run()};E.allowRecurse=!!t;let F;o==="sync"?F=E:o==="post"?F=()=>Ae(E,c&&c.suspense):(E.pre=!0,c&&(E.id=c.uid),F=()=>Es(E));const B=new ks(h,je,F),X=vr(),le=()=>{B.stop(),X&&As(X.effects,B)};return t?n?E():V=B.run():o==="post"?Ae(B.run.bind(B),c&&c.suspense):B.run(),z&&z.push(le),le}function oa(e,t,n){const s=this.proxy,o=de(e)?e.includes(".")?xi(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const r=cn(this),a=Ai(o,i.bind(s),n);return r(),a}function xi(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o0){if(n>=t)return e;n++}if(s=s||new Set,s.has(e))return e;if(s.add(e),ke(e))$t(e.value,t,n,s);else if(H(e))for(let o=0;o{$t(o,t,n,s)});else if(qo(e))for(const o in e)$t(e[o],t,n,s);return e}function mt(e,t,n,s){const o=e.dirs,i=t&&t.dirs;for(let r=0;r!!e.type.__asyncLoader,Ii=e=>e.type.__isKeepAlive;function ia(e,t){Li(e,"a",t)}function ra(e,t){Li(e,"da",t)}function Li(e,t,n=_e){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Fn(t,s,n),n){let o=n.parent;for(;o&&o.parent;)Ii(o.parent.vnode)&&aa(s,t,n,o),o=o.parent}}function aa(e,t,n,s){const o=Fn(t,e,s,!0);ji(()=>{As(s[t],o)},n)}function Fn(e,t,n=_e,s=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;yt();const a=cn(n),c=Ee(t,n,e,r);return a(),Ct(),c});return s?o.unshift(i):o.push(i),i}}const Je=e=>(t,n=_e)=>(!qn||e==="sp")&&Fn(e,(...s)=>t(...s),n),la=Je("bm"),ca=Je("m"),ua=Je("bu"),da=Je("u"),ha=Je("bum"),ji=Je("um"),fa=Je("sp"),pa=Je("rtg"),ga=Je("rtc");function ma(e,t=_e){Fn("ec",e,t)}function ft(e,t,n,s){let o;const i=n&&n[s];if(H(e)||de(e)){o=new Array(e.length);for(let r=0,a=e.length;rt(r,a,void 0,i&&i[a]));else{const r=Object.keys(e);o=new Array(r.length);for(let a=0,c=r.length;a$n(t)?!(t.type===pt||t.type===ce&&!Ri(t.children)):!0)?e:null}const us=e=>e?Hi(e)?zs(e)||e.proxy:us(e.parent):null,Qt=pe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>us(e.parent),$root:e=>us(e.root),$emit:e=>e.emit,$options:e=>Ts(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,Es(e.update)}),$nextTick:e=>e.n||(e.n=_i.bind(e.proxy)),$watch:e=>oa.bind(e)}),Yn=(e,t)=>e!==re&&!e.__isScriptSetup&&Z(e,t),va={get({_:e},t){const{ctx:n,setupState:s,data:o,props:i,accessCache:r,type:a,appContext:c}=e;let f;if(t[0]!=="$"){const y=r[t];if(y!==void 0)switch(y){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(Yn(s,t))return r[t]=1,s[t];if(o!==re&&Z(o,t))return r[t]=2,o[t];if((f=e.propsOptions[0])&&Z(f,t))return r[t]=3,i[t];if(n!==re&&Z(n,t))return r[t]=4,n[t];ds&&(r[t]=0)}}const h=Qt[t];let p,m;if(h)return t==="$attrs"&&xe(e,"get",t),h(e);if((p=a.__cssModules)&&(p=p[t]))return p;if(n!==re&&Z(n,t))return r[t]=4,n[t];if(m=c.config.globalProperties,Z(m,t))return m[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:i}=e;return Yn(o,t)?(o[t]=n,!0):s!==re&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,propsOptions:i}},r){let a;return!!n[r]||e!==re&&Z(e,r)||Yn(t,r)||(a=i[0])&&Z(a,r)||Z(s,r)||Z(Qt,r)||Z(o.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function so(e){return H(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let ds=!0;function ba(e){const t=Ts(e),n=e.proxy,s=e.ctx;ds=!1,t.beforeCreate&&oo(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:r,watch:a,provide:c,inject:f,created:h,beforeMount:p,mounted:m,beforeUpdate:y,updated:S,activated:z,deactivated:V,beforeDestroy:E,beforeUnmount:F,destroyed:B,unmounted:X,render:le,renderTracked:D,renderTriggered:be,errorCaptured:Le,serverPrefetch:xt,expose:ze,inheritAttrs:et,components:gt,directives:Ve,filters:qt}=t;if(f&&wa(f,s,null),r)for(const ee in r){const Q=r[ee];q(Q)&&(s[ee]=Q.bind(n))}if(o){const ee=o.call(n,n);ae(ee)&&(e.data=zn(ee))}if(ds=!0,i)for(const ee in i){const Q=i[ee],Ge=q(Q)?Q.bind(n,n):q(Q.get)?Q.get.bind(n,n):je,tt=!q(Q)&&q(Q.set)?Q.set.bind(n):je,Ne=Me({get:Ge,set:tt});Object.defineProperty(s,ee,{enumerable:!0,configurable:!0,get:()=>Ne.value,set:Ce=>Ne.value=Ce})}if(a)for(const ee in a)$i(a[ee],s,n,ee);if(c){const ee=q(c)?c.call(n):c;Reflect.ownKeys(ee).forEach(Q=>{Cn(Q,ee[Q])})}h&&oo(h,e,"c");function he(ee,Q){H(Q)?Q.forEach(Ge=>ee(Ge.bind(n))):Q&&ee(Q.bind(n))}if(he(la,p),he(ca,m),he(ua,y),he(da,S),he(ia,z),he(ra,V),he(ma,Le),he(ga,D),he(pa,be),he(ha,F),he(ji,X),he(fa,xt),H(ze))if(ze.length){const ee=e.exposed||(e.exposed={});ze.forEach(Q=>{Object.defineProperty(ee,Q,{get:()=>n[Q],set:Ge=>n[Q]=Ge})})}else e.exposed||(e.exposed={});le&&e.render===je&&(e.render=le),et!=null&&(e.inheritAttrs=et),gt&&(e.components=gt),Ve&&(e.directives=Ve)}function wa(e,t,n=je){H(e)&&(e=hs(e));for(const s in e){const o=e[s];let i;ae(o)?"default"in o?i=Ye(o.from||s,o.default,!0):i=Ye(o.from||s):i=Ye(o),ke(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:r=>i.value=r}):t[s]=i}}function oo(e,t,n){Ee(H(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function $i(e,t,n,s){const o=s.includes(".")?xi(n,s):()=>n[s];if(de(e)){const i=t[e];q(i)&&yn(o,i)}else if(q(e))yn(o,e.bind(n));else if(ae(e))if(H(e))e.forEach(i=>$i(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&yn(o,i,e)}}function Ts(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:r}}=e.appContext,a=i.get(t);let c;return a?c=a:!o.length&&!n&&!s?c=t:(c={},o.length&&o.forEach(f=>jn(c,f,r,!0)),jn(c,t,r)),ae(t)&&i.set(t,c),c}function jn(e,t,n,s=!1){const{mixins:o,extends:i}=t;i&&jn(e,i,n,!0),o&&o.forEach(r=>jn(e,r,n,!0));for(const r in t)if(!(s&&r==="expose")){const a=ya[r]||n&&n[r];e[r]=a?a(e[r],t[r]):t[r]}return e}const ya={data:io,props:ro,emits:ro,methods:Gt,computed:Gt,beforeCreate:we,created:we,beforeMount:we,mounted:we,beforeUpdate:we,updated:we,beforeDestroy:we,beforeUnmount:we,destroyed:we,unmounted:we,activated:we,deactivated:we,errorCaptured:we,serverPrefetch:we,components:Gt,directives:Gt,watch:Aa,provide:io,inject:Ca};function io(e,t){return t?e?function(){return pe(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Ca(e,t){return Gt(hs(e),hs(t))}function hs(e){if(H(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(s&&s.proxy):t}}function Ia(e,t,n,s=!1){const o={},i={};kn(i,Dn,1),e.propsDefaults=Object.create(null),Mi(e,t,o,i);for(const r in e.propsOptions[0])r in o||(o[r]=void 0);n?e.props=s?o:li(o):e.type.props?e.props=o:e.props=i,e.attrs=i}function La(e,t,n,s){const{props:o,attrs:i,vnode:{patchFlag:r}}=e,a=G(o),[c]=e.propsOptions;let f=!1;if((s||r>0)&&!(r&16)){if(r&8){const h=e.vnode.dynamicProps;for(let p=0;p{c=!0;const[m,y]=Pi(p,t,!0);pe(r,m),y&&a.push(...y)};!n&&t.mixins.length&&t.mixins.forEach(h),e.extends&&h(e.extends),e.mixins&&e.mixins.forEach(h)}if(!i&&!c)return ae(e)&&s.set(e,St),St;if(H(i))for(let h=0;h-1,y[1]=z<0||S-1||Z(y,"default"))&&a.push(p)}}}const f=[r,a];return ae(e)&&s.set(e,f),f}function ao(e){return e[0]!=="$"}function lo(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function co(e,t){return lo(e)===lo(t)}function uo(e,t){return H(t)?t.findIndex(n=>co(n,e)):q(t)&&co(t,e)?0:-1}const Ei=e=>e[0]==="_"||e==="$stable",Us=e=>H(e)?e.map(Be):[Be(e)],ja=(e,t,n)=>{if(t._n)return t;const s=ue((...o)=>Us(t(...o)),n);return s._c=!1,s},Ti=(e,t,n)=>{const s=e._ctx;for(const o in e){if(Ei(o))continue;const i=e[o];if(q(i))t[o]=ja(o,i,s);else if(i!=null){const r=Us(i);t[o]=()=>r}}},Ui=(e,t)=>{const n=Us(t);e.slots.default=()=>n},Ra=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=G(t),kn(t,"_",n)):Ti(t,e.slots={})}else e.slots={},t&&Ui(e,t);kn(e.slots,Dn,1)},$a=(e,t,n)=>{const{vnode:s,slots:o}=e;let i=!0,r=re;if(s.shapeFlag&32){const a=t._;a?n&&a===1?i=!1:(pe(o,t),!n&&a===1&&delete o._):(i=!t.$stable,Ti(t,o)),r=t}else t&&(Ui(e,t),r={default:1});if(i)for(const a in o)!Ei(a)&&r[a]==null&&delete o[a]};function ps(e,t,n,s,o=!1){if(H(e)){e.forEach((m,y)=>ps(m,t&&(H(t)?t[y]:t),n,s,o));return}if(Xt(s)&&!o)return;const i=s.shapeFlag&4?zs(s.component)||s.component.proxy:s.el,r=o?null:i,{i:a,r:c}=e,f=t&&t.r,h=a.refs===re?a.refs={}:a.refs,p=a.setupState;if(f!=null&&f!==c&&(de(f)?(h[f]=null,Z(p,f)&&(p[f]=null)):ke(f)&&(f.value=null)),q(c))ut(c,a,12,[r,h]);else{const m=de(c),y=ke(c),S=e.f;if(m||y){const z=()=>{if(S){const V=m?Z(p,c)?p[c]:h[c]:c.value;o?H(V)&&As(V,i):H(V)?V.includes(i)||V.push(i):m?(h[c]=[i],Z(p,c)&&(p[c]=h[c])):(c.value=[i],e.k&&(h[e.k]=c.value))}else m?(h[c]=r,Z(p,c)&&(p[c]=r)):y&&(c.value=r,e.k&&(h[e.k]=r))};o||S?z():(z.id=-1,Ae(z,n))}}}const Ae=ta;function Sa(e){return Ma(e)}function Ma(e,t){const n=Ko();n.__VUE__=!0;const{insert:s,remove:o,patchProp:i,createElement:r,createText:a,createComment:c,setText:f,setElementText:h,parentNode:p,nextSibling:m,setScopeId:y=je,insertStaticContent:S}=e,z=(u,d,g,w=null,v=null,x=null,L=void 0,A=null,k=!!d.dynamicChildren)=>{if(u===d)return;u&&!Wt(u,d)&&(w=b(u),Ce(u,v,x,!0),u=null),d.patchFlag===-2&&(k=!1,d.dynamicChildren=null);const{type:C,ref:R,shapeFlag:O}=d;switch(C){case Bn:V(u,d,g,w);break;case pt:E(u,d,g,w);break;case An:u==null&&F(d,g,w,L);break;case ce:gt(u,d,g,w,v,x,L,A,k);break;default:O&1?le(u,d,g,w,v,x,L,A,k):O&6?Ve(u,d,g,w,v,x,L,A,k):(O&64||O&128)&&C.process(u,d,g,w,v,x,L,A,k,M)}R!=null&&v&&ps(R,u&&u.ref,x,d||u,!d)},V=(u,d,g,w)=>{if(u==null)s(d.el=a(d.children),g,w);else{const v=d.el=u.el;d.children!==u.children&&f(v,d.children)}},E=(u,d,g,w)=>{u==null?s(d.el=c(d.children||""),g,w):d.el=u.el},F=(u,d,g,w)=>{[u.el,u.anchor]=S(u.children,d,g,w,u.el,u.anchor)},B=({el:u,anchor:d},g,w)=>{let v;for(;u&&u!==d;)v=m(u),s(u,g,w),u=v;s(d,g,w)},X=({el:u,anchor:d})=>{let g;for(;u&&u!==d;)g=m(u),o(u),u=g;o(d)},le=(u,d,g,w,v,x,L,A,k)=>{d.type==="svg"?L="svg":d.type==="math"&&(L="mathml"),u==null?D(d,g,w,v,x,L,A,k):xt(u,d,v,x,L,A,k)},D=(u,d,g,w,v,x,L,A)=>{let k,C;const{props:R,shapeFlag:O,transition:T,dirs:N}=u;if(k=u.el=r(u.type,x,R&&R.is,R),O&8?h(k,u.children):O&16&&Le(u.children,k,null,w,v,Jn(u,x),L,A),N&&mt(u,null,w,"created"),be(k,u,u.scopeId,L,w),R){for(const te in R)te!=="value"&&!bn(te)&&i(k,te,null,R[te],x,u.children,w,v,ge);"value"in R&&i(k,"value",null,R.value,x),(C=R.onVnodeBeforeMount)&&Fe(C,w,u)}N&&mt(u,null,w,"beforeMount");const K=Pa(v,T);K&&T.beforeEnter(k),s(k,d,g),((C=R&&R.onVnodeMounted)||K||N)&&Ae(()=>{C&&Fe(C,w,u),K&&T.enter(k),N&&mt(u,null,w,"mounted")},v)},be=(u,d,g,w,v)=>{if(g&&y(u,g),w)for(let x=0;x{for(let C=k;C{const A=d.el=u.el;let{patchFlag:k,dynamicChildren:C,dirs:R}=d;k|=u.patchFlag&16;const O=u.props||re,T=d.props||re;let N;if(g&&_t(g,!1),(N=T.onVnodeBeforeUpdate)&&Fe(N,g,d,u),R&&mt(d,u,g,"beforeUpdate"),g&&_t(g,!0),C?ze(u.dynamicChildren,C,A,g,w,Jn(d,v),x):L||Q(u,d,A,null,g,w,Jn(d,v),x,!1),k>0){if(k&16)et(A,d,O,T,g,w,v);else if(k&2&&O.class!==T.class&&i(A,"class",null,T.class,v),k&4&&i(A,"style",O.style,T.style,v),k&8){const K=d.dynamicProps;for(let te=0;te{N&&Fe(N,g,d,u),R&&mt(d,u,g,"updated")},w)},ze=(u,d,g,w,v,x,L)=>{for(let A=0;A{if(g!==w){if(g!==re)for(const A in g)!bn(A)&&!(A in w)&&i(u,A,g[A],null,L,d.children,v,x,ge);for(const A in w){if(bn(A))continue;const k=w[A],C=g[A];k!==C&&A!=="value"&&i(u,A,C,k,L,d.children,v,x,ge)}"value"in w&&i(u,"value",g.value,w.value,L)}},gt=(u,d,g,w,v,x,L,A,k)=>{const C=d.el=u?u.el:a(""),R=d.anchor=u?u.anchor:a("");let{patchFlag:O,dynamicChildren:T,slotScopeIds:N}=d;N&&(A=A?A.concat(N):N),u==null?(s(C,g,w),s(R,g,w),Le(d.children||[],g,R,v,x,L,A,k)):O>0&&O&64&&T&&u.dynamicChildren?(ze(u.dynamicChildren,T,g,v,x,L,A),(d.key!=null||v&&d===v.subTree)&&Oi(u,d,!0)):Q(u,d,g,R,v,x,L,A,k)},Ve=(u,d,g,w,v,x,L,A,k)=>{d.slotScopeIds=A,u==null?d.shapeFlag&512?v.ctx.activate(d,g,w,L,k):qt(d,g,w,v,x,L,k):kt(u,d,k)},qt=(u,d,g,w,v,x,L)=>{const A=u.component=Fa(u,w,v);if(Ii(u)&&(A.ctx.renderer=M),Ba(A),A.asyncDep){if(v&&v.registerDep(A,he),!u.el){const k=A.subTree=_(pt);E(null,k,d,g)}}else he(A,u,d,g,v,x,L)},kt=(u,d,g)=>{const w=d.component=u.component;if(Xr(u,d,g))if(w.asyncDep&&!w.asyncResolved){ee(w,d,g);return}else w.next=d,Dr(w.update),w.effect.dirty=!0,w.update();else d.el=u.el,w.vnode=d},he=(u,d,g,w,v,x,L)=>{const A=()=>{if(u.isMounted){let{next:R,bu:O,u:T,parent:N,vnode:K}=u;{const jt=zi(u);if(jt){R&&(R.el=K.el,ee(u,R,L)),jt.asyncDep.then(()=>{u.isUnmounted||A()});return}}let te=R,ie;_t(u,!1),R?(R.el=K.el,ee(u,R,L)):R=K,O&&Gn(O),(ie=R.props&&R.props.onVnodeBeforeUpdate)&&Fe(ie,N,R,K),_t(u,!0);const fe=Qn(u),$e=u.subTree;u.subTree=fe,z($e,fe,p($e.el),b($e),u,v,x),R.el=fe.el,te===null&&Qr(u,fe.el),T&&Ae(T,v),(ie=R.props&&R.props.onVnodeUpdated)&&Ae(()=>Fe(ie,N,R,K),v)}else{let R;const{el:O,props:T}=d,{bm:N,m:K,parent:te}=u,ie=Xt(d);if(_t(u,!1),N&&Gn(N),!ie&&(R=T&&T.onVnodeBeforeMount)&&Fe(R,te,d),_t(u,!0),O&&oe){const fe=()=>{u.subTree=Qn(u),oe(O,u.subTree,u,v,null)};ie?d.type.__asyncLoader().then(()=>!u.isUnmounted&&fe()):fe()}else{const fe=u.subTree=Qn(u);z(null,fe,g,w,u,v,x),d.el=fe.el}if(K&&Ae(K,v),!ie&&(R=T&&T.onVnodeMounted)){const fe=d;Ae(()=>Fe(R,te,fe),v)}(d.shapeFlag&256||te&&Xt(te.vnode)&&te.vnode.shapeFlag&256)&&u.a&&Ae(u.a,v),u.isMounted=!0,d=g=w=null}},k=u.effect=new ks(A,je,()=>Es(C),u.scope),C=u.update=()=>{k.dirty&&k.run()};C.id=u.uid,_t(u,!0),C()},ee=(u,d,g)=>{d.component=u;const w=u.vnode.props;u.vnode=d,u.next=null,La(u,d.props,w,g),$a(u,d.children,g),yt(),eo(u),Ct()},Q=(u,d,g,w,v,x,L,A,k=!1)=>{const C=u&&u.children,R=u?u.shapeFlag:0,O=d.children,{patchFlag:T,shapeFlag:N}=d;if(T>0){if(T&128){tt(C,O,g,w,v,x,L,A,k);return}else if(T&256){Ge(C,O,g,w,v,x,L,A,k);return}}N&8?(R&16&&ge(C,v,x),O!==C&&h(g,O)):R&16?N&16?tt(C,O,g,w,v,x,L,A,k):ge(C,v,x,!0):(R&8&&h(g,""),N&16&&Le(O,g,w,v,x,L,A,k))},Ge=(u,d,g,w,v,x,L,A,k)=>{u=u||St,d=d||St;const C=u.length,R=d.length,O=Math.min(C,R);let T;for(T=0;TR?ge(u,v,x,!0,!1,O):Le(d,g,w,v,x,L,A,k,O)},tt=(u,d,g,w,v,x,L,A,k)=>{let C=0;const R=d.length;let O=u.length-1,T=R-1;for(;C<=O&&C<=T;){const N=u[C],K=d[C]=k?rt(d[C]):Be(d[C]);if(Wt(N,K))z(N,K,g,null,v,x,L,A,k);else break;C++}for(;C<=O&&C<=T;){const N=u[O],K=d[T]=k?rt(d[T]):Be(d[T]);if(Wt(N,K))z(N,K,g,null,v,x,L,A,k);else break;O--,T--}if(C>O){if(C<=T){const N=T+1,K=NT)for(;C<=O;)Ce(u[C],v,x,!0),C++;else{const N=C,K=C,te=new Map;for(C=K;C<=T;C++){const Ie=d[C]=k?rt(d[C]):Be(d[C]);Ie.key!=null&&te.set(Ie.key,C)}let ie,fe=0;const $e=T-K+1;let jt=!1,Bs=0;const Kt=new Array($e);for(C=0;C<$e;C++)Kt[C]=0;for(C=N;C<=O;C++){const Ie=u[C];if(fe>=$e){Ce(Ie,v,x,!0);continue}let He;if(Ie.key!=null)He=te.get(Ie.key);else for(ie=K;ie<=T;ie++)if(Kt[ie-K]===0&&Wt(Ie,d[ie])){He=ie;break}He===void 0?Ce(Ie,v,x,!0):(Kt[He-K]=C+1,He>=Bs?Bs=He:jt=!0,z(Ie,d[He],g,null,v,x,L,A,k),fe++)}const Ds=jt?Ea(Kt):St;for(ie=Ds.length-1,C=$e-1;C>=0;C--){const Ie=K+C,He=d[Ie],qs=Ie+1{const{el:x,type:L,transition:A,children:k,shapeFlag:C}=u;if(C&6){Ne(u.component.subTree,d,g,w);return}if(C&128){u.suspense.move(d,g,w);return}if(C&64){L.move(u,d,g,M);return}if(L===ce){s(x,d,g);for(let O=0;OA.enter(x),v);else{const{leave:O,delayLeave:T,afterLeave:N}=A,K=()=>s(x,d,g),te=()=>{O(x,()=>{K(),N&&N()})};T?T(x,K,te):te()}else s(x,d,g)},Ce=(u,d,g,w=!1,v=!1)=>{const{type:x,props:L,ref:A,children:k,dynamicChildren:C,shapeFlag:R,patchFlag:O,dirs:T}=u;if(A!=null&&ps(A,null,g,u,!0),R&256){d.ctx.deactivate(u);return}const N=R&1&&T,K=!Xt(u);let te;if(K&&(te=L&&L.onVnodeBeforeUnmount)&&Fe(te,d,u),R&6)hn(u.component,g,w);else{if(R&128){u.suspense.unmount(g,w);return}N&&mt(u,null,d,"beforeUnmount"),R&64?u.type.remove(u,d,g,v,M,w):C&&(x!==ce||O>0&&O&64)?ge(C,d,g,!1,!0):(x===ce&&O&384||!v&&R&16)&&ge(k,d,g),w&&It(u)}(K&&(te=L&&L.onVnodeUnmounted)||N)&&Ae(()=>{te&&Fe(te,d,u),N&&mt(u,null,d,"unmounted")},g)},It=u=>{const{type:d,el:g,anchor:w,transition:v}=u;if(d===ce){Lt(g,w);return}if(d===An){X(u);return}const x=()=>{o(g),v&&!v.persisted&&v.afterLeave&&v.afterLeave()};if(u.shapeFlag&1&&v&&!v.persisted){const{leave:L,delayLeave:A}=v,k=()=>L(g,x);A?A(u.el,x,k):k()}else x()},Lt=(u,d)=>{let g;for(;u!==d;)g=m(u),o(u),u=g;o(d)},hn=(u,d,g)=>{const{bum:w,scope:v,update:x,subTree:L,um:A}=u;w&&Gn(w),v.stop(),x&&(x.active=!1,Ce(L,u,d,g)),A&&Ae(A,d),Ae(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},ge=(u,d,g,w=!1,v=!1,x=0)=>{for(let L=x;Lu.shapeFlag&6?b(u.component.subTree):u.shapeFlag&128?u.suspense.next():m(u.anchor||u.el);let j=!1;const I=(u,d,g)=>{u==null?d._vnode&&Ce(d._vnode,null,null,!0):z(d._vnode||null,u,d,null,null,null,g),j||(j=!0,eo(),bi(),j=!1),d._vnode=u},M={p:z,um:Ce,m:Ne,r:It,mt:qt,mc:Le,pc:Q,pbc:ze,n:b,o:e};let Y,oe;return t&&([Y,oe]=t(M)),{render:I,hydrate:Y,createApp:ka(I,Y)}}function Jn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function _t({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Pa(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Oi(e,t,n=!1){const s=e.children,o=t.children;if(H(s)&&H(o))for(let i=0;i>1,e[n[a]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,r=n[i-1];i-- >0;)n[i]=r,r=t[r];return n}function zi(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:zi(t)}const Ta=e=>e.__isTeleport,ce=Symbol.for("v-fgt"),Bn=Symbol.for("v-txt"),pt=Symbol.for("v-cmt"),An=Symbol.for("v-stc"),Yt=[];let Pe=null;function P(e=!1){Yt.push(Pe=e?null:[])}function Ua(){Yt.pop(),Pe=Yt[Yt.length-1]||null}let on=1;function ho(e){on+=e}function Vi(e){return e.dynamicChildren=on>0?Pe||St:null,Ua(),on>0&&Pe&&Pe.push(e),e}function U(e,t,n,s,o,i){return Vi(l(e,t,n,s,o,i,!0))}function rn(e,t,n,s,o){return Vi(_(e,t,n,s,o,!0))}function $n(e){return e?e.__v_isVNode===!0:!1}function Wt(e,t){return e.type===t.type&&e.key===t.key}const Dn="__vInternal",Ni=({key:e})=>e??null,xn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?de(e)||ke(e)||q(e)?{i:ye,r:e,k:t,f:!!n}:e:null);function l(e,t=null,n=null,s=0,o=null,i=e===ce?0:1,r=!1,a=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ni(t),ref:t&&xn(t),scopeId:Hn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:ye};return a?(Os(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=de(n)?8:16),on>0&&!r&&Pe&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Pe.push(c),c}const _=Oa;function Oa(e,t=null,n=null,s=0,o=null,i=!1){if((!e||e===Yr)&&(e=pt),$n(e)){const a=Ot(e,t,!0);return n&&Os(a,n),on>0&&!i&&Pe&&(a.shapeFlag&6?Pe[Pe.indexOf(e)]=a:Pe.push(a)),a.patchFlag|=-2,a}if(Za(e)&&(e=e.__vccOpts),t){t=za(t);let{class:a,style:c}=t;a&&!de(a)&&(t.class=ht(a)),ae(c)&&(ui(c)&&!H(c)&&(c=pe({},c)),t.style=ln(c))}const r=de(e)?1:ea(e)?128:Ta(e)?64:ae(e)?4:q(e)?2:0;return l(e,t,n,s,o,r,i,!0)}function za(e){return e?ui(e)||Dn in e?pe({},e):e:null}function Ot(e,t,n=!1){const{props:s,ref:o,patchFlag:i,children:r}=e,a=t?Va(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&Ni(a),ref:t&&t.ref?n&&o?H(o)?o.concat(xn(t)):[o,xn(t)]:xn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:r,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ce?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ot(e.ssContent),ssFallback:e.ssFallback&&Ot(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function W(e=" ",t=0){return _(Bn,null,e,t)}function Ft(e,t){const n=_(An,null,e);return n.staticCount=t,n}function gs(e="",t=!1){return t?(P(),rn(pt,null,e)):_(pt,null,e)}function Be(e){return e==null||typeof e=="boolean"?_(pt):H(e)?_(ce,null,e.slice()):typeof e=="object"?rt(e):_(Bn,null,String(e))}function rt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ot(e)}function Os(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(H(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),Os(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(Dn in t)?t._ctx=ye:o===3&&ye&&(ye.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:ye},n=32):(t=String(t),s&64?(n=16,t=[W(t)]):n=8);e.children=t,e.shapeFlag|=n}function Va(...e){const t={};for(let n=0;n{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),i=>{o.length>1?o.forEach(r=>r(i)):o[0](i)}};Sn=t("__VUE_INSTANCE_SETTERS__",n=>_e=n),ms=t("__VUE_SSR_SETTERS__",n=>qn=n)}const cn=e=>{const t=_e;return Sn(e),e.scope.on(),()=>{e.scope.off(),Sn(t)}},fo=()=>{_e&&_e.scope.off(),Sn(null)};function Hi(e){return e.vnode.shapeFlag&4}let qn=!1;function Ba(e,t=!1){t&&ms(t);const{props:n,children:s}=e.vnode,o=Hi(e);Ia(e,n,o,t),Ra(e,s);const i=o?Da(e,t):void 0;return t&&ms(!1),i}function Da(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Ss(new Proxy(e.ctx,va));const{setup:s}=n;if(s){const o=e.setupContext=s.length>1?Ka(e):null,i=cn(e);yt();const r=ut(s,e,0,[e.props,o]);if(Ct(),i(),Bo(r)){if(r.then(fo,fo),t)return r.then(a=>{po(e,a,t)}).catch(a=>{Vn(a,e,0)});e.asyncDep=r}else po(e,r,t)}else Fi(e,t)}function po(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ae(t)&&(e.setupState=gi(t)),Fi(e,n)}let go;function Fi(e,t,n){const s=e.type;if(!e.render){if(!t&&go&&!s.render){const o=s.template||Ts(e).template;if(o){const{isCustomElement:i,compilerOptions:r}=e.appContext.config,{delimiters:a,compilerOptions:c}=s,f=pe(pe({isCustomElement:i,delimiters:a},r),c);s.render=go(o,f)}}e.render=s.render||je}{const o=cn(e);yt();try{ba(e)}finally{Ct(),o()}}}function qa(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return xe(e,"get","$attrs"),t[n]}}))}function Ka(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return qa(e)},slots:e.slots,emit:e.emit,expose:t}}function zs(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(gi(Ss(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Qt)return Qt[n](e)},has(t,n){return n in t||n in Qt}}))}function Wa(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function Za(e){return q(e)&&"__vccOpts"in e}const Me=(e,t)=>zr(e,t,qn);function Bi(e,t,n){const s=arguments.length;return s===2?ae(t)&&!H(t)?$n(t)?_(e,null,[t]):_(e,t):_(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&$n(n)&&(n=[n]),_(e,t,n))}const Ga="3.4.15";/** +* @vue/runtime-dom v3.4.15 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Xa="http://www.w3.org/2000/svg",Qa="http://www.w3.org/1998/Math/MathML",at=typeof document<"u"?document:null,mo=at&&at.createElement("template"),Ya={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?at.createElementNS(Xa,e):t==="mathml"?at.createElementNS(Qa,e):at.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>at.createTextNode(e),createComment:e=>at.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>at.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,i){const r=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{mo.innerHTML=s==="svg"?`${e}`:s==="mathml"?`${e}`:e;const a=mo.content;if(s==="svg"||s==="mathml"){const c=a.firstChild;for(;c.firstChild;)a.appendChild(c.firstChild);a.removeChild(c)}t.insertBefore(a,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ja=Symbol("_vtc");function el(e,t,n){const s=e[Ja];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const tl=Symbol("_vod"),nl=Symbol("");function sl(e,t,n){const s=e.style,o=s.display,i=de(n);if(n&&!i){if(t&&!de(t))for(const r in t)n[r]==null&&_s(s,r,"");for(const r in n)_s(s,r,n[r])}else if(i){if(t!==n){const r=s[nl];r&&(n+=";"+r),s.cssText=n}}else t&&e.removeAttribute("style");tl in e&&(s.display=o)}const _o=/\s*!important$/;function _s(e,t,n){if(H(n))n.forEach(s=>_s(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=ol(e,t);_o.test(n)?e.setProperty(Ht(s),n.replace(_o,""),"important"):e[s]=n}}const vo=["Webkit","Moz","ms"],es={};function ol(e,t){const n=es[t];if(n)return n;let s=qe(t);if(s!=="filter"&&s in e)return es[t]=s;s=Un(s);for(let o=0;ots||(dl.then(()=>ts=0),ts=Date.now());function fl(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Ee(pl(s,n.value),t,5,[s])};return n.value=e,n.attached=hl(),n}function pl(e,t){if(H(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const Co=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,gl=(e,t,n,s,o,i,r,a,c)=>{const f=o==="svg";t==="class"?el(e,s,f):t==="style"?sl(e,n,s):Pn(t)?Cs(t)||cl(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ml(e,t,s,f))?rl(e,t,s,i,r,a,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),il(e,t,s,f))};function ml(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Co(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Co(t)&&de(n)?!1:t in e}const _l=pe({patchProp:gl},Ya);let Ao;function vl(){return Ao||(Ao=Sa(_l))}const bl=(...e)=>{const t=vl().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=yl(s);if(!o)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=o.innerHTML),o.innerHTML="";const r=n(o,!1,wl(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),r},t};function wl(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function yl(e){return de(e)?document.querySelector(e):e}var Cl=!1;/*! + * pinia v2.1.7 + * (c) 2023 Eduardo San Martin Morote + * @license MIT + */const Al=Symbol();var xo;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(xo||(xo={}));function xl(){const e=mr(!0),t=e.run(()=>fi({}));let n=[],s=[];const o=Ss({install(i){o._a=i,i.provide(Al,o),i.config.globalProperties.$pinia=o,s.forEach(r=>n.push(r)),s=[]},use(i){return!this._a&&!Cl?s.push(i):n.push(i),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const Kn=[{route:"/dubai",image:{src:"dubai/venice-showcase.png",alt:"Website for a real estate project"},name:"Dubai",slogan:"Real estate website for Dubai",clients:["Gravitas Property Ventures"],task:"UI Design",industry:"Real Estate",date:"Jan 2024",active:!0},{route:"/trafficticket",image:{src:"trafficticket/ticket1.jpeg",alt:"A parking ticket on a windshield"},name:"Traffic ticket",slogan:"Processing traffic tickets for a car rental",clients:["MaibornWolff","Car rental company"],task:"Product Management",industry:"Mobility",date:"Feb 2022-Jan 2023",active:!0},{route:"/esgehtlos",image:{src:"esgehtlos/demo.png",alt:"Screen design for mobile web app"},name:"Es geht los",slogan:"More democracy with civic councils",clients:["MaibornWolff","Demokratie Innovation e. V."],task:"UI Design",industry:"NGO",date:"Jan-Feb 2022",active:!0},{route:"/scenariomanager",image:{src:"scenariomanager/brainstorming-sideshot.jpg",alt:"Scenario Manager UI"},name:"Scenario Manager",slogan:"Helping financial decision makers in stormy times",clients:["Valsight"],task:"UX Research",industry:"Finance",date:"Jan-Mar 2020",active:!1},{route:"/knimehub",image:{src:"knimehub/front_page.jpg",alt:"Screenshot of the landing page of KNIME hub"},name:"KNIME Hub",slogan:"Collaborative platform for data scientists",clients:["KNIME"],task:"UI/UX Design",industry:"Data Science",date:"2018-2019",active:!0},{route:"/greenbox",image:{src:"greenbox/greenbox_app2.png",alt:"Usability test of the greenbox app"},name:"Greenbox",slogan:"Turning people into urban gardeners",clients:["Greenbox"],task:"Usability evaluation",industry:"B2C App",date:"2015",active:!1},{route:"/phoenix",image:{src:"phoenix/phoenix_mp.jpg",alt:"Screenshot of phoenix application"},name:"Phoenix",slogan:"The musicplayer that knows what you want to hear",clients:["Myself"],task:"Design & Development",industry:"Entertainment",date:"2015-2017",active:!1},{route:"/querybuilder",image:{src:"querybuilder/querybuilder.png",alt:"Graph representation of an SQL query"},name:"Querybuilder",slogan:"Finding the needle in the data haystack",clients:["KNIME"],task:"UI/UX Design",industry:"Data Science",date:"2018",active:!1},{route:"/codesnippets",image:{src:"codesnippets/formulas04.jpg",alt:"Screenshot of phoenix application"},name:"Code snippets",slogan:"Code snippets for faster data transformation",clients:["KNIME"],task:"UI/UX Design",industry:"Data Science",date:"2017",active:!1},{route:"/mechanics",image:{src:"mechanics/mechanics.png",alt:"Mechanic with helmet camera interacting with tablet"},name:"Mechanics",slogan:"Digitalizing the work of mechanics",clients:["Condat"],task:"Field test",industry:"Manufacturing",date:"2015",active:!1},{route:"/thesis",image:{src:"thesis/adjustable-eyes.jpg",alt:"Adjustable artificial eyes"},name:"Thesis",slogan:"How to make eye tracking more robust",clients:["TU Berlin"],task:"Master thesis",industry:"Academia",date:"2016-2017",active:!1}],ot=Kn.filter(e=>e.active),kl=Kn.map(e=>e.route).concat(["/"]),se=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Il={data(){return{projectRoutes:kl}}},Ll={id:"header"},jl={id:"grid",class:"responsive h6 regular"};function Rl(e,t,n,s,o,i){const r=$("router-link");return P(),U("div",Ll,[l("div",jl,[_(r,{id:"name",to:"/"},{default:ue(()=>[W(" Johannes Schweig ")]),_:1}),_(r,{id:"work",to:"/",class:ht([{active:o.projectRoutes.indexOf(e.$route.path)!=-1}])},{default:ue(()=>[W(" Home ")]),_:1},8,["class"]),_(r,{id:"about",to:"/about",class:ht([{active:e.$route.path==="/about"}])},{default:ue(()=>[W(" About ")]),_:1},8,["class"])])])}const $l=se(Il,[["render",Rl],["__scopeId","data-v-1e5ccff0"]]),Sl={props:{href:{type:String,required:!0},size:{type:String,required:!0},text:{type:String,required:!0},type:{type:String,required:!0},bg:{type:String,required:!0}},computed:{bgStyle(){let e,t,n,s,o;return this.type==="primary"&&this.bg==="light"?(e="white",t="var(--blue-200)",n="var(--blue-100)",s="none"):this.type==="primary"&&this.bg==="dark"?(e="var(--dark-100)",t="var(--blue-300)",n="var(--blue-400)",s="none"):this.type==="secondary"&&this.bg==="light"?(e="var(--dark-200)",t="none",n="var(--light-200)",s="1px solid var(--dark-200)"):(e="var(--light-200)",t="none",n="var(--dark-200)",s="1px solid var(--light-200)"),o=e,{"--size":this.size==="lg"?"32px":"24px","--icon-color":e,"--bg-color":t,"--bg-hover-color":n,border:s,color:o,"grid-template-columns":this.$slots.default?"var(--size) 1fr":"1fr"}}}},Ml=["href"];function Pl(e,t,n,s,o,i){return P(),U("a",{href:n.href,style:ln(i.bgStyle)},[_a(e.$slots,"default",{},void 0,!0),n.text?(P(),U("span",{key:0,class:ht(["text",n.size==="lg"?"button-lg":"button"])},ne(n.text),3)):gs("",!0)],12,Ml)}const un=se(Sl,[["render",Pl],["__scopeId","data-v-637f64df"]]),El={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 91 76"},Tl=l("path",{d:"M87.63.167.925 43.57c-1.3.602-1.199 2.5.102 3l18.699 7.5 55.898-40.398-44.797 44.797v14.2c0 1.6 2 2.198 2.898 1l8.301-10.798 31.301 12.5c.898.399 2-.199 2.2-1.199l14.5-72.203c.198-1.3-1.2-2.398-2.399-1.8"},null,-1),Ul=[Tl];function Ol(e,t){return P(),U("svg",El,[...Ul])}const Di={render:Ol},zl={components:{Button:un,SendIcon:Di},data(){return{platforms:[{name:"LinkedIn",url:"https://linkedin.com/in/jschweig"},{name:"Uplink",url:"https://uplink.tech/"},{name:"Malt",url:"https://www.malt.de/profile/johannesschweig"},{name:"Freelance.de",url:"https://freelance.de/"},{name:"Freelancermap",url:"https://www.freelancermap.de/profil/ux-und-product-consultant"},{name:"GitHub",url:"https://github.com/johannesschweig"},{name:"ux.stackexchange",url:"https://ux.stackexchange.com/users/110814/nash"}]}}},At=e=>(Ke("data-v-4b352d11"),e=e(),We(),e),Vl={class:"wrapper"},Nl={class:"responsive"},Hl=At(()=>l("h4",null,"Sounds interesting?",-1)),Fl=At(()=>l("p",{class:"body1"},"Send me a message.",-1)),Bl={class:"buttons"},Dl=At(()=>l("div",{class:"divider"},null,-1)),ql={class:"footer"},Kl=At(()=>l("div",null,[l("h6",null,"Contact"),l("p",{class:"body2"},[W("Johannes Schweig"),l("br"),W(" Flemingstr 6, 10557 Berlin"),l("br"),l("br"),W("hello@johannesschweig.de"),l("br"),W("www.johannesschweig.de ")])],-1)),Wl=At(()=>l("h6",null,"Socials",-1)),Zl=["href"],Gl=At(()=>l("div",null,[l("h6",null,"Legal"),l("a",{class:"body2 greylink",href:"/legal"},"Imprint/Impressum")],-1)),Xl=At(()=>l("a",{class:"body2 greylink disclaimer",href:"https://github.com/johannesschweig/johannesschweig.github.io"},"Made by Johannes Schweig with Vue.js",-1));function Ql(e,t,n,s,o,i){const r=$("SendIcon"),a=$("Button");return P(),U("div",Vl,[l("div",Nl,[Hl,Fl,l("div",Bl,[_(a,{type:"primary",bg:"dark",size:"sm",text:"Send me an email",href:"mailto:hello@johannesschweig.de"},{default:ue(()=>[_(r)]),_:1}),_(a,{type:"secondary",bg:"dark",size:"sm",text:"LinkedIn",href:"https://linkedin.com/in/jschweig"})]),Dl,l("div",ql,[Kl,l("div",null,[Wl,(P(!0),U(ce,null,ft(o.platforms,c=>(P(),U("a",{href:c.url,class:"body2 greylink"},ne(c.name),9,Zl))),256))]),Gl,Xl])])])}const Yl=se(zl,[["render",Ql],["__scopeId","data-v-4b352d11"]]),Jl={name:"App",components:{Footer:Yl,Header:$l}},ec={id:"content"};function tc(e,t,n,s,o,i){const r=$("Header"),a=$("router-view"),c=$("Footer");return P(),U(ce,null,[_(r),l("div",ec,[_(a)]),_(c)],64)}const nc=se(Jl,[["render",tc]]);/*! + * vue-router v4.2.5 + * (c) 2023 Eduardo San Martin Morote + * @license MIT + */const Rt=typeof window<"u";function sc(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const J=Object.assign;function ns(e,t){const n={};for(const s in t){const o=t[s];n[s]=Te(o)?o.map(e):e(o)}return n}const Jt=()=>{},Te=Array.isArray,oc=/\/$/,ic=e=>e.replace(oc,"");function ss(e,t,n="/"){let s,o={},i="",r="";const a=t.indexOf("#");let c=t.indexOf("?");return a=0&&(c=-1),c>-1&&(s=t.slice(0,c),i=t.slice(c+1,a>-1?a:t.length),o=e(i)),a>-1&&(s=s||t.slice(0,a),r=t.slice(a,t.length)),s=cc(s??t,n),{fullPath:s+(i&&"?")+i+r,path:s,query:o,hash:r}}function rc(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function ko(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function ac(e,t,n){const s=t.matched.length-1,o=n.matched.length-1;return s>-1&&s===o&&zt(t.matched[s],n.matched[o])&&qi(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function zt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function qi(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!lc(e[n],t[n]))return!1;return!0}function lc(e,t){return Te(e)?Io(e,t):Te(t)?Io(t,e):e===t}function Io(e,t){return Te(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function cc(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),o=s[s.length-1];(o===".."||o===".")&&s.push("");let i=n.length-1,r,a;for(r=0;r1&&i--;else break;return n.slice(0,i).join("/")+"/"+s.slice(r-(r===s.length?1:0)).join("/")}var an;(function(e){e.pop="pop",e.push="push"})(an||(an={}));var en;(function(e){e.back="back",e.forward="forward",e.unknown=""})(en||(en={}));function uc(e){if(!e)if(Rt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),ic(e)}const dc=/^[^#]+#/;function hc(e,t){return e.replace(dc,"#")+t}function fc(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Wn=()=>({left:window.pageXOffset,top:window.pageYOffset});function pc(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=fc(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function Lo(e,t){return(history.state?history.state.position-t:-1)+e}const vs=new Map;function gc(e,t){vs.set(e,t)}function mc(e){const t=vs.get(e);return vs.delete(e),t}let _c=()=>location.protocol+"//"+location.host;function Ki(e,t){const{pathname:n,search:s,hash:o}=t,i=e.indexOf("#");if(i>-1){let a=o.includes(e.slice(i))?e.slice(i).length:1,c=o.slice(a);return c[0]!=="/"&&(c="/"+c),ko(c,"")}return ko(n,e)+s+o}function vc(e,t,n,s){let o=[],i=[],r=null;const a=({state:m})=>{const y=Ki(e,location),S=n.value,z=t.value;let V=0;if(m){if(n.value=y,t.value=m,r&&r===S){r=null;return}V=z?m.position-z.position:0}else s(y);o.forEach(E=>{E(n.value,S,{delta:V,type:an.pop,direction:V?V>0?en.forward:en.back:en.unknown})})};function c(){r=n.value}function f(m){o.push(m);const y=()=>{const S=o.indexOf(m);S>-1&&o.splice(S,1)};return i.push(y),y}function h(){const{history:m}=window;m.state&&m.replaceState(J({},m.state,{scroll:Wn()}),"")}function p(){for(const m of i)m();i=[],window.removeEventListener("popstate",a),window.removeEventListener("beforeunload",h)}return window.addEventListener("popstate",a),window.addEventListener("beforeunload",h,{passive:!0}),{pauseListeners:c,listen:f,destroy:p}}function jo(e,t,n,s=!1,o=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:o?Wn():null}}function bc(e){const{history:t,location:n}=window,s={value:Ki(e,n)},o={value:t.state};o.value||i(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(c,f,h){const p=e.indexOf("#"),m=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+c:_c()+e+c;try{t[h?"replaceState":"pushState"](f,"",m),o.value=f}catch(y){console.error(y),n[h?"replace":"assign"](m)}}function r(c,f){const h=J({},t.state,jo(o.value.back,c,o.value.forward,!0),f,{position:o.value.position});i(c,h,!0),s.value=c}function a(c,f){const h=J({},o.value,t.state,{forward:c,scroll:Wn()});i(h.current,h,!0);const p=J({},jo(s.value,c,null),{position:h.position+1},f);i(c,p,!1),s.value=c}return{location:s,state:o,push:a,replace:r}}function wc(e){e=uc(e);const t=bc(e),n=vc(e,t.state,t.location,t.replace);function s(i,r=!0){r||n.pauseListeners(),history.go(i)}const o=J({location:"",base:e,go:s,createHref:hc.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function yc(e){return typeof e=="string"||e&&typeof e=="object"}function Wi(e){return typeof e=="string"||typeof e=="symbol"}const st={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Zi=Symbol("");var Ro;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Ro||(Ro={}));function Vt(e,t){return J(new Error,{type:e,[Zi]:!0},t)}function Xe(e,t){return e instanceof Error&&Zi in e&&(t==null||!!(e.type&t))}const $o="[^/]+?",Cc={sensitive:!1,strict:!1,start:!0,end:!0},Ac=/[.+*?^${}()[\]/\\]/g;function xc(e,t){const n=J({},Cc,t),s=[];let o=n.start?"^":"";const i=[];for(const f of e){const h=f.length?[]:[90];n.strict&&!f.length&&(o+="/");for(let p=0;pt.length?t.length===1&&t[0]===80?1:-1:0}function Ic(e,t){let n=0;const s=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const Lc={type:0,value:""},jc=/[a-zA-Z0-9_]/;function Rc(e){if(!e)return[[]];if(e==="/")return[[Lc]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(y){throw new Error(`ERR (${n})/"${f}": ${y}`)}let n=0,s=n;const o=[];let i;function r(){i&&o.push(i),i=[]}let a=0,c,f="",h="";function p(){f&&(n===0?i.push({type:0,value:f}):n===1||n===2||n===3?(i.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:f,regexp:h,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),f="")}function m(){f+=c}for(;a{r(F)}:Jt}function r(h){if(Wi(h)){const p=s.get(h);p&&(s.delete(h),n.splice(n.indexOf(p),1),p.children.forEach(r),p.alias.forEach(r))}else{const p=n.indexOf(h);p>-1&&(n.splice(p,1),h.record.name&&s.delete(h.record.name),h.children.forEach(r),h.alias.forEach(r))}}function a(){return n}function c(h){let p=0;for(;p=0&&(h.record.path!==n[p].record.path||!Gi(h,n[p]));)p++;n.splice(p,0,h),h.record.name&&!Po(h)&&s.set(h.record.name,h)}function f(h,p){let m,y={},S,z;if("name"in h&&h.name){if(m=s.get(h.name),!m)throw Vt(1,{location:h});z=m.record.name,y=J(Mo(p.params,m.keys.filter(F=>!F.optional).map(F=>F.name)),h.params&&Mo(h.params,m.keys.map(F=>F.name))),S=m.stringify(y)}else if("path"in h)S=h.path,m=n.find(F=>F.re.test(S)),m&&(y=m.parse(S),z=m.record.name);else{if(m=p.name?s.get(p.name):n.find(F=>F.re.test(p.path)),!m)throw Vt(1,{location:h,currentLocation:p});z=m.record.name,y=J({},p.params,h.params),S=m.stringify(y)}const V=[];let E=m;for(;E;)V.unshift(E.record),E=E.parent;return{name:z,path:S,params:y,matched:V,meta:Ec(V)}}return e.forEach(h=>i(h)),{addRoute:i,resolve:f,removeRoute:r,getRoutes:a,getRecordMatcher:o}}function Mo(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function Mc(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Pc(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function Pc(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function Po(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Ec(e){return e.reduce((t,n)=>J(t,n.meta),{})}function Eo(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}function Gi(e,t){return t.children.some(n=>n===e||Gi(e,n))}const Xi=/#/g,Tc=/&/g,Uc=/\//g,Oc=/=/g,zc=/\?/g,Qi=/\+/g,Vc=/%5B/g,Nc=/%5D/g,Yi=/%5E/g,Hc=/%60/g,Ji=/%7B/g,Fc=/%7C/g,er=/%7D/g,Bc=/%20/g;function Vs(e){return encodeURI(""+e).replace(Fc,"|").replace(Vc,"[").replace(Nc,"]")}function Dc(e){return Vs(e).replace(Ji,"{").replace(er,"}").replace(Yi,"^")}function bs(e){return Vs(e).replace(Qi,"%2B").replace(Bc,"+").replace(Xi,"%23").replace(Tc,"%26").replace(Hc,"`").replace(Ji,"{").replace(er,"}").replace(Yi,"^")}function qc(e){return bs(e).replace(Oc,"%3D")}function Kc(e){return Vs(e).replace(Xi,"%23").replace(zc,"%3F")}function Wc(e){return e==null?"":Kc(e).replace(Uc,"%2F")}function Mn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function Zc(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;oi&&bs(i)):[s&&bs(s)]).forEach(i=>{i!==void 0&&(t+=(t.length?"&":"")+n,i!=null&&(t+="="+i))})}return t}function Gc(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=Te(s)?s.map(o=>o==null?null:""+o):s==null?s:""+s)}return t}const Xc=Symbol(""),Uo=Symbol(""),Ns=Symbol(""),tr=Symbol(""),ws=Symbol("");function Zt(){let e=[];function t(s){return e.push(s),()=>{const o=e.indexOf(s);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function lt(e,t,n,s,o){const i=s&&(s.enterCallbacks[o]=s.enterCallbacks[o]||[]);return()=>new Promise((r,a)=>{const c=p=>{p===!1?a(Vt(4,{from:n,to:t})):p instanceof Error?a(p):yc(p)?a(Vt(2,{from:t,to:p})):(i&&s.enterCallbacks[o]===i&&typeof p=="function"&&i.push(p),r())},f=e.call(s&&s.instances[o],t,n,c);let h=Promise.resolve(f);e.length<3&&(h=h.then(c)),h.catch(p=>a(p))})}function os(e,t,n,s){const o=[];for(const i of e)for(const r in i.components){let a=i.components[r];if(!(t!=="beforeRouteEnter"&&!i.instances[r]))if(Qc(a)){const f=(a.__vccOpts||a)[t];f&&o.push(lt(f,n,s,i,r))}else{let c=a();o.push(()=>c.then(f=>{if(!f)return Promise.reject(new Error(`Couldn't resolve component "${r}" at "${i.path}"`));const h=sc(f)?f.default:f;i.components[r]=h;const m=(h.__vccOpts||h)[t];return m&<(m,n,s,i,r)()}))}}return o}function Qc(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Oo(e){const t=Ye(Ns),n=Ye(tr),s=Me(()=>t.resolve(Et(e.to))),o=Me(()=>{const{matched:c}=s.value,{length:f}=c,h=c[f-1],p=n.matched;if(!h||!p.length)return-1;const m=p.findIndex(zt.bind(null,h));if(m>-1)return m;const y=zo(c[f-2]);return f>1&&zo(h)===y&&p[p.length-1].path!==y?p.findIndex(zt.bind(null,c[f-2])):m}),i=Me(()=>o.value>-1&&t2(n.params,s.value.params)),r=Me(()=>o.value>-1&&o.value===n.matched.length-1&&qi(n.params,s.value.params));function a(c={}){return e2(c)?t[Et(e.replace)?"replace":"push"](Et(e.to)).catch(Jt):Promise.resolve()}return{route:s,href:Me(()=>s.value.href),isActive:i,isExactActive:r,navigate:a}}const Yc=ki({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Oo,setup(e,{slots:t}){const n=zn(Oo(e)),{options:s}=Ye(Ns),o=Me(()=>({[Vo(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[Vo(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const i=t.default&&t.default(n);return e.custom?i:Bi("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},i)}}}),Jc=Yc;function e2(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function t2(e,t){for(const n in t){const s=t[n],o=e[n];if(typeof s=="string"){if(s!==o)return!1}else if(!Te(o)||o.length!==s.length||s.some((i,r)=>i!==o[r]))return!1}return!0}function zo(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Vo=(e,t,n)=>e??t??n,n2=ki({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=Ye(ws),o=Me(()=>e.route||s.value),i=Ye(Uo,0),r=Me(()=>{let f=Et(i);const{matched:h}=o.value;let p;for(;(p=h[f])&&!p.components;)f++;return f}),a=Me(()=>o.value.matched[r.value]);Cn(Uo,Me(()=>r.value+1)),Cn(Xc,a),Cn(ws,o);const c=fi();return yn(()=>[c.value,a.value,e.name],([f,h,p],[m,y,S])=>{h&&(h.instances[p]=f,y&&y!==h&&f&&f===m&&(h.leaveGuards.size||(h.leaveGuards=y.leaveGuards),h.updateGuards.size||(h.updateGuards=y.updateGuards))),f&&h&&(!y||!zt(h,y)||!m)&&(h.enterCallbacks[p]||[]).forEach(z=>z(f))},{flush:"post"}),()=>{const f=o.value,h=e.name,p=a.value,m=p&&p.components[h];if(!m)return No(n.default,{Component:m,route:f});const y=p.props[h],S=y?y===!0?f.params:typeof y=="function"?y(f):y:null,V=Bi(m,J({},S,t,{onVnodeUnmounted:E=>{E.component.isUnmounted&&(p.instances[h]=null)},ref:c}));return No(n.default,{Component:V,route:f})||V}}});function No(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const s2=n2;function o2(e){const t=Sc(e.routes,e),n=e.parseQuery||Zc,s=e.stringifyQuery||To,o=e.history,i=Zt(),r=Zt(),a=Zt(),c=Vr(st);let f=st;Rt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const h=ns.bind(null,b=>""+b),p=ns.bind(null,Wc),m=ns.bind(null,Mn);function y(b,j){let I,M;return Wi(b)?(I=t.getRecordMatcher(b),M=j):M=b,t.addRoute(M,I)}function S(b){const j=t.getRecordMatcher(b);j&&t.removeRoute(j)}function z(){return t.getRoutes().map(b=>b.record)}function V(b){return!!t.getRecordMatcher(b)}function E(b,j){if(j=J({},j||c.value),typeof b=="string"){const d=ss(n,b,j.path),g=t.resolve({path:d.path},j),w=o.createHref(d.fullPath);return J(d,g,{params:m(g.params),hash:Mn(d.hash),redirectedFrom:void 0,href:w})}let I;if("path"in b)I=J({},b,{path:ss(n,b.path,j.path).path});else{const d=J({},b.params);for(const g in d)d[g]==null&&delete d[g];I=J({},b,{params:p(d)}),j.params=p(j.params)}const M=t.resolve(I,j),Y=b.hash||"";M.params=h(m(M.params));const oe=rc(s,J({},b,{hash:Dc(Y),path:M.path})),u=o.createHref(oe);return J({fullPath:oe,hash:Y,query:s===To?Gc(b.query):b.query||{}},M,{redirectedFrom:void 0,href:u})}function F(b){return typeof b=="string"?ss(n,b,c.value.path):J({},b)}function B(b,j){if(f!==b)return Vt(8,{from:j,to:b})}function X(b){return be(b)}function le(b){return X(J(F(b),{replace:!0}))}function D(b){const j=b.matched[b.matched.length-1];if(j&&j.redirect){const{redirect:I}=j;let M=typeof I=="function"?I(b):I;return typeof M=="string"&&(M=M.includes("?")||M.includes("#")?M=F(M):{path:M},M.params={}),J({query:b.query,hash:b.hash,params:"path"in M?{}:b.params},M)}}function be(b,j){const I=f=E(b),M=c.value,Y=b.state,oe=b.force,u=b.replace===!0,d=D(I);if(d)return be(J(F(d),{state:typeof d=="object"?J({},Y,d.state):Y,force:oe,replace:u}),j||I);const g=I;g.redirectedFrom=j;let w;return!oe&&ac(s,M,I)&&(w=Vt(16,{to:g,from:M}),Ne(M,M,!0,!1)),(w?Promise.resolve(w):ze(g,M)).catch(v=>Xe(v)?Xe(v,2)?v:tt(v):Q(v,g,M)).then(v=>{if(v){if(Xe(v,2))return be(J({replace:u},F(v.to),{state:typeof v.to=="object"?J({},Y,v.to.state):Y,force:oe}),j||g)}else v=gt(g,M,!0,u,Y);return et(g,M,v),v})}function Le(b,j){const I=B(b,j);return I?Promise.reject(I):Promise.resolve()}function xt(b){const j=Lt.values().next().value;return j&&typeof j.runWithContext=="function"?j.runWithContext(b):b()}function ze(b,j){let I;const[M,Y,oe]=i2(b,j);I=os(M.reverse(),"beforeRouteLeave",b,j);for(const d of M)d.leaveGuards.forEach(g=>{I.push(lt(g,b,j))});const u=Le.bind(null,b,j);return I.push(u),ge(I).then(()=>{I=[];for(const d of i.list())I.push(lt(d,b,j));return I.push(u),ge(I)}).then(()=>{I=os(Y,"beforeRouteUpdate",b,j);for(const d of Y)d.updateGuards.forEach(g=>{I.push(lt(g,b,j))});return I.push(u),ge(I)}).then(()=>{I=[];for(const d of oe)if(d.beforeEnter)if(Te(d.beforeEnter))for(const g of d.beforeEnter)I.push(lt(g,b,j));else I.push(lt(d.beforeEnter,b,j));return I.push(u),ge(I)}).then(()=>(b.matched.forEach(d=>d.enterCallbacks={}),I=os(oe,"beforeRouteEnter",b,j),I.push(u),ge(I))).then(()=>{I=[];for(const d of r.list())I.push(lt(d,b,j));return I.push(u),ge(I)}).catch(d=>Xe(d,8)?d:Promise.reject(d))}function et(b,j,I){a.list().forEach(M=>xt(()=>M(b,j,I)))}function gt(b,j,I,M,Y){const oe=B(b,j);if(oe)return oe;const u=j===st,d=Rt?history.state:{};I&&(M||u?o.replace(b.fullPath,J({scroll:u&&d&&d.scroll},Y)):o.push(b.fullPath,Y)),c.value=b,Ne(b,j,I,u),tt()}let Ve;function qt(){Ve||(Ve=o.listen((b,j,I)=>{if(!hn.listening)return;const M=E(b),Y=D(M);if(Y){be(J(Y,{replace:!0}),M).catch(Jt);return}f=M;const oe=c.value;Rt&&gc(Lo(oe.fullPath,I.delta),Wn()),ze(M,oe).catch(u=>Xe(u,12)?u:Xe(u,2)?(be(u.to,M).then(d=>{Xe(d,20)&&!I.delta&&I.type===an.pop&&o.go(-1,!1)}).catch(Jt),Promise.reject()):(I.delta&&o.go(-I.delta,!1),Q(u,M,oe))).then(u=>{u=u||gt(M,oe,!1),u&&(I.delta&&!Xe(u,8)?o.go(-I.delta,!1):I.type===an.pop&&Xe(u,20)&&o.go(-1,!1)),et(M,oe,u)}).catch(Jt)}))}let kt=Zt(),he=Zt(),ee;function Q(b,j,I){tt(b);const M=he.list();return M.length?M.forEach(Y=>Y(b,j,I)):console.error(b),Promise.reject(b)}function Ge(){return ee&&c.value!==st?Promise.resolve():new Promise((b,j)=>{kt.add([b,j])})}function tt(b){return ee||(ee=!b,qt(),kt.list().forEach(([j,I])=>b?I(b):j()),kt.reset()),b}function Ne(b,j,I,M){const{scrollBehavior:Y}=e;if(!Rt||!Y)return Promise.resolve();const oe=!I&&mc(Lo(b.fullPath,0))||(M||!I)&&history.state&&history.state.scroll||null;return _i().then(()=>Y(b,j,oe)).then(u=>u&&pc(u)).catch(u=>Q(u,b,j))}const Ce=b=>o.go(b);let It;const Lt=new Set,hn={currentRoute:c,listening:!0,addRoute:y,removeRoute:S,hasRoute:V,getRoutes:z,resolve:E,options:e,push:X,replace:le,go:Ce,back:()=>Ce(-1),forward:()=>Ce(1),beforeEach:i.add,beforeResolve:r.add,afterEach:a.add,onError:he.add,isReady:Ge,install(b){const j=this;b.component("RouterLink",Jc),b.component("RouterView",s2),b.config.globalProperties.$router=j,Object.defineProperty(b.config.globalProperties,"$route",{enumerable:!0,get:()=>Et(c)}),Rt&&!It&&c.value===st&&(It=!0,X(o.location).catch(Y=>{}));const I={};for(const Y in st)Object.defineProperty(I,Y,{get:()=>c.value[Y],enumerable:!0});b.provide(Ns,j),b.provide(tr,li(I)),b.provide(ws,c);const M=b.unmount;Lt.add(b),b.unmount=function(){Lt.delete(b),Lt.size<1&&(f=st,Ve&&Ve(),Ve=null,c.value=st,It=!1,ee=!1),M()}}};function ge(b){return b.reduce((j,I)=>j.then(()=>xt(I)),Promise.resolve())}return hn}function i2(e,t){const n=[],s=[],o=[],i=Math.max(t.matched.length,e.matched.length);for(let r=0;rzt(f,a))?s.push(a):n.push(a));const c=e.matched[r];c&&(t.matched.find(f=>zt(f,c))||o.push(c))}return[n,s,o]}const r2={xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 32 32"},a2=Ft('',2),l2=[a2];function c2(e,t){return P(),U("svg",r2,[...l2])}const u2={render:c2},d2={xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 32 32"},h2=l("path",{fill:"#000",d:"M26.667 1.333A1.333 1.333 0 0 1 28 2.667v26.666a1.333 1.333 0 0 1-1.334 1.334H5.334A1.333 1.333 0 0 1 4 29.333V2.667a1.333 1.333 0 0 1 1.333-1.334zm0-1.333H5.333a2.667 2.667 0 0 0-2.666 2.667v26.666A2.667 2.667 0 0 0 5.333 32h21.334a2.667 2.667 0 0 0 2.666-2.667V2.667A2.667 2.667 0 0 0 26.667 0"},null,-1),f2=l("path",{fill:"#000",d:"M15.667 6.667a2 2 0 1 0 0-4 2 2 0 0 0 0 4M15.667 7A4.667 4.667 0 0 0 11 11.667h9.333A4.667 4.667 0 0 0 15.667 7M26.333 15.5H5v1.333h21.333zM26.333 20.587H5v1.333h21.333zM26.333 25.667H5V27h21.333z"},null,-1),p2=[h2,f2];function g2(e,t){return P(),U("svg",d2,[...p2])}const m2={render:g2},_2={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 48 48"},v2=l("g",{"data-name":"Layer 2"},[l("path",{d:"M24 .59a24 24 0 0 0-7.59 46.78c1.2.22 1.64-.52 1.64-1.16v-4.47c-6.68 1.46-8.09-2.83-8.09-2.83-1.12-2.77-2.69-3.51-2.69-3.51-2.18-1.49.16-1.46.16-1.46a5 5 0 0 1 3.68 2.47c2.14 3.67 5.62 2.61 7 2a5.07 5.07 0 0 1 1.52-3.21C14.3 34.59 8.7 32.54 8.7 23.34a9.26 9.26 0 0 1 2.47-6.44 8.63 8.63 0 0 1 .23-6.35s2-.65 6.6 2.46a22.7 22.7 0 0 1 12 0c4.58-3.11 6.6-2.46 6.6-2.46a8.63 8.63 0 0 1 .23 6.35 9.26 9.26 0 0 1 2.47 6.44c0 9.22-5.61 11.25-11 11.84a5.76 5.76 0 0 1 1.7 4.45v6.58c0 .79.43 1.39 1.65 1.15A24 24 0 0 0 24 .59",class:"cls-2"}),l("path",{d:"M9.09 35.05c-.05.12-.24.16-.41.07a.3.3 0 0 1-.22-.36c0-.12.24-.15.42-.07s.27.24.21.36M10.06 36.14c-.11.1-.34 0-.49-.12a.36.36 0 0 1-.07-.49.36.36 0 0 1 .49.11c.16.17.19.39.07.5M11 37.52c-.15.1-.39 0-.54-.21s-.14-.47 0-.57.38 0 .53.2.15.47 0 .58ZM12.3 38.85c-.13.15-.41.11-.61-.09s-.27-.47-.14-.61a.45.45 0 0 1 .62.09c.21.19.27.47.13.61M14.09 39.63c-.05.19-.32.27-.6.19s-.45-.3-.39-.49a.46.46 0 0 1 .6-.19c.27.08.45.3.39.49M16.06 39.77c0 .2-.23.36-.51.37S15 40 15 39.79s.22-.36.51-.37.52.16.52.35ZM17.89 39.46c0 .19-.17.39-.45.45s-.54-.07-.57-.26.16-.4.44-.45.54.06.58.26",class:"cls-3"})],-1),b2=[v2];function w2(e,t){return P(),U("svg",_2,[...b2])}const y2={render:w2},C2={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 104 104"},A2=l("path",{d:"M52 0C23.28 0 0 23.28 0 52s23.28 52 52 52l-.05-6.05H52c25.38 0 45.95-20.57 45.95-45.95H104c0-28.72-23.28-52-52-52m0 91.89c-22.03 0-39.89-17.86-39.89-39.89S29.97 12.1 52 12.1s39.89 17.86 39.89 39.89S74.03 91.88 52 91.88z"},null,-1),x2=l("path",{d:"M62.01 19.63c-13.39-4.36-26.22.83-33.55 7.78.19 8.99 1.63 16.01 3.94 21.97C35.57 34.3 47.79 21.9 62.01 19.64M20.39 39.31c-8.22 21.64 5.74 39.62 20.26 44.65-4.66-5.68-8.03-13.71-8.89-21.66-6.2-6.2-10.45-14.08-11.38-22.99M36.47 65.69c1.15 7.09 3.14 14.07 7.38 19.23 14.84 3.83 27.95-3.39 34.42-11.45-13.65 6.34-28.87 2.7-41.79-7.78"},null,-1),k2=l("path",{d:"M79.41 71.97c15.5-21.88.75-44.25-12.41-50.33-15.64 2.49-29.73 17.01-31.34 34.28 12.21 20.87 36.85 18.3 43.76 16.05"},null,-1),I2=[A2,x2,k2];function L2(e,t){return P(),U("svg",C2,[...I2])}const j2={render:L2},R2={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32"},$2=l("path",{d:"M27.126 4.876c-2.393-2.393-4.949-.844-6.548.755L5.468 20.742c-1.6 1.6-3.274 4.03-.756 6.547 2.518 2.52 4.949.845 6.548-.755l15.11-15.11c1.6-1.6 3.149-4.156.756-6.548M12.69 4.257l3.2 3.2 3.256-3.258q.332-.331.672-.62c-.341-1.722-1.323-3.277-3.93-3.277-2.612 0-3.592 1.562-3.932 3.286.244.211.488.422.734.669M19.144 28.023l-3.254-3.255-3.198 3.198a14 14 0 0 1-.725.673C12.333 30.393 13.37 32 15.888 32c2.524 0 3.56-1.615 3.925-3.375-.224-.193-.448-.381-.669-.602M11.333 12.013H5.164c-2.261 0-5.164.713-5.164 4.096 0 2.524 1.616 3.561 3.376 3.925.208-.24 7.957-8.021 7.957-8.021M28.413 12.177c-.195.227-7.96 8.028-7.96 8.028h6.08c2.263 0 5.165-.535 5.165-4.096 0-2.612-1.561-3.593-3.285-3.932M13.354 9.988l1.102-1.102-3.198-3.198c-1.6-1.6-4.03-3.274-6.548-.755-1.846 1.846-1.436 3.644-.457 5.103.299-.022 9.1-.048 9.1-.048M18.424 22.23l-1.105 1.104 3.257 3.257c1.6 1.6 4.156 3.148 6.548.756 1.785-1.786 1.376-3.66.389-5.163-.318.023-9.089.046-9.089.046"},null,-1),S2=[$2];function M2(e,t){return P(),U("svg",R2,[...S2])}const P2={render:M2},E2={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 144 144"},T2=l("path",{"fill-rule":"evenodd",d:"M0 144V0h144v144zm12.8-92.6c-.1-14.3.3-26.4.7-26.8.5-.4 4.1-.5 15-.1l.5 25.6c.5 23.9.6 25.8 2.5 27.9 1.1 1.2 3.2 2.8 4.8 3.6 1.5.8 4.6 1.4 7 1.4s5.5-.8 7.5-2c1.7-1.1 3.8-3 4.5-4.3.8-1.5 1.4-9.9 2.2-52.2h15l.2 25.5c.2 16-.1 27-.8 29.5-.7 2.7-2.8 5.7-6.5 9.2-4 3.9-6.8 5.7-10.6 6.8-2.9.8-8.6 1.5-12.5 1.5-4.6 0-9.1-.7-12-1.8-2.7-1-6.5-3.1-8.6-4.7-2.1-1.7-5-5.3-6.3-8-2.394-4.889-2.4-5.597-2.598-30.923zm68 35.8c-.1-20.8.3-38.2.7-38.6.5-.3 1.5-.4 2.2-.1s3.8.5 6.8.5c4.2 0 5.5.3 5.5 1.5 0 .8.1 1.5.3 1.5.1 0 2-.9 4.2-2 2.6-1.3 6-2 9.8-2 3.6 0 7.1.7 9.5 1.9 2 1 5.4 3.7 7.5 6 2.2 2.5 4.3 6.2 5.2 9.3.8 2.9 1.5 6.2 1.5 7.3s-.7 4.4-1.5 7.2c-.9 3.2-3 6.9-5.2 9.4-2.1 2.3-5.5 5-7.5 6-2.4 1.2-5.9 1.9-9.5 1.9-3.8 0-7.2-.7-9.8-2-2.2-1.1-4.1-2-4.2-2-.2 0-.3 7.2-.3 32H81z","clip-rule":"evenodd"},null,-1),U2=l("path",{d:"M101.3 63c-1.8 1.1-3.8 2.9-4.3 4s-1 3.8-1 6c0 3 .7 4.7 2.8 6.9 1.5 1.6 3.8 3.2 5.2 3.6s3.8.4 5.5 0 4.2-2 5.8-3.6c2.1-2.2 2.7-3.9 2.7-7.2 0-2.3-.7-5.2-1.5-6.5-.8-1.2-2.8-2.9-4.5-3.7s-4-1.5-5.2-1.5c-1.3 0-3.8.9-5.5 2"},null,-1),O2=[T2,U2];function z2(e,t){return P(),U("svg",E2,[...O2])}const V2={render:z2},N2={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 305 306"},H2=l("path",{"fill-rule":"evenodd",d:"M41 3.4c2.5-.8 6.7-1.9 9.5-2.3 2.7-.5 50-.8 205-.6l8 2.7c4.4 1.5 10.7 4.5 14 6.6 3.3 2.2 7.7 5.7 9.9 7.8 2.1 2.1 5.1 5.7 6.6 7.9s3.6 5.8 4.8 8c1.1 2.2 2.8 6 3.8 8.5 1.7 4.2 1.9 10.7 2.2 108 .2 74.8 0 105-.8 109-.6 3-3 9.3-5.3 14-3 5.9-6.1 10.4-10.7 15-3.6 3.7-9 8.1-12 9.8s-8.4 4.1-18.5 7.7h-209L41 303c-4.1-1.3-10.7-4.5-14.5-7.1-3.8-2.5-9.4-7.5-12.3-11-3-3.5-6.7-9.1-8.3-12.4S2.3 264 1.5 261C.2 256.3 0 240 0 153.2c0-91 .2-102.8 1.6-108 .9-3.1 3.2-8.9 5.2-12.7C9.1 28 12.9 23 17.5 18.4c3.8-3.9 9.7-8.5 13-10.3 3.3-1.7 8-3.9 10.5-4.7m79.7 41c4.9-1.4 11.3-2.9 14.3-3.3 3-.5 10.7-.9 17-1 6.6 0 15.3.6 20.5 1.5 4.9.9 12.8 2.9 17.5 4.6 4.7 1.6 11.9 4.8 16 7 4.1 2.3 8.9 5.1 10.5 6.2s5.7 4.3 9 7.1c3.3 2.7 8 7.2 10.5 9.9s5.6 6.3 6.8 8c1.3 1.7 3.8 5.4 5.6 8.1 1.8 2.8 4.4 7.3 5.8 10 1.5 2.8 4 9.1 5.7 14s3.8 12.8 4.6 17.5 1.5 13.4 1.5 19.5-.6 14.6-1.4 19-2.4 11.2-3.6 15c-1.2 3.9-4.2 11.1-6.7 16s-7 12.5-10.1 16.8c-3.2 4.3-8.6 10.7-12.2 14.1-3.6 3.5-10.1 8.8-14.5 11.8-4.4 3.1-10.7 6.9-14 8.5-3.3 1.7-8.9 4-12.5 5.3-3.6 1.2-8.1 2.6-10 3.1s-7.1 1.6-11.5 2.4-11.3 1.5-15.2 1.5c-4 0-10.8-.5-15-1.1-4.3-.5-12.1-2.2-17.3-3.6s-11-3.3-16-5.8V187l-28.7-.1c-15.9-.1-29.9-.4-31.3-.8-2.2-.6-2.7-1.7-4.2-8.6-1-4.4-2.1-12.9-2.4-19-.5-8-.2-13.9 1-21.5.9-5.8 2.9-14.3 4.5-19 1.5-4.7 4.4-11.6 6.3-15.5 2-3.8 5.7-10.1 8.3-14 2.6-3.8 8.4-10.6 12.9-15 4.4-4.4 9.9-9.4 12.1-11.1 2.2-1.6 6.3-4.4 9-6.1 2.8-1.8 8-4.6 11.8-6.2 3.7-1.7 10.6-4.2 15.4-5.7","clip-rule":"evenodd"},null,-1),F2=l("path",{d:"M142 70.6c-1.4.2-5 .9-8 1.6-3 .6-7.5 2-10 3-2.5 1.1-6.5 2.9-9 4s-7.7 4.4-11.5 7.3-8.8 7.2-11.1 9.6c-2.2 2.4-5.7 6.7-7.7 9.4-1.9 2.8-5.2 8.6-7.3 13-2 4.4-4.5 11.4-5.5 15.5-1.1 4.1-1.9 10.8-1.9 14.8v7.2h36c0-8.1.4-13 1-16s2.6-8.8 4.5-12.7c2-4.1 5.8-9.7 8.8-12.9 2.8-3 7.2-6.9 9.7-8.4 2.5-1.6 7.2-3.9 10.5-5.1 5.3-1.9 8.4-2.2 27.8-2.5L190 98v31c-39.5.5-41.1.6-43.7 2.6-1.5 1.2-4.1 3.8-5.8 5.9-2.6 3.3-3 4.6-3.2 11.1l-.3 7.4h53v31l-53-.5V235c3.5.8 9.4 1 15.5 1 8.3 0 13.3-.6 20.5-2.3 5.6-1.4 12.9-4.2 17.9-6.8 4.5-2.4 11.1-6.6 14.4-9.4 3.4-2.7 8.5-7.9 11.5-11.5 2.9-3.6 7.5-11 10.2-16.5s5.6-12.7 6.5-16 1.8-10.1 2.2-15c.3-5 0-12.2-.6-16.2s-2.2-10.8-3.6-15c-1.3-4.3-4.5-11.4-7.1-15.8-3.1-5.4-7.7-11-13.8-17-6.5-6.4-11.5-10.3-17.6-13.7-4.7-2.6-12.6-5.9-17.5-7.3-6.5-1.9-12-2.7-20-3-6.1-.2-12.1-.2-13.5.1"},null,-1),B2=[H2,F2];function D2(e,t){return P(),U("svg",N2,[...B2])}const q2={render:D2},K2="data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M1%208L0.646447%207.64645C0.451184%207.84171%200.451184%208.15829%200.646447%208.35355L1%208ZM15%208.5C15.2761%208.5%2015.5%208.27614%2015.5%208C15.5%207.72386%2015.2761%207.5%2015%207.5V8.5ZM5.85355%203.85355C6.04882%203.65829%206.04882%203.34171%205.85355%203.14645C5.65829%202.95118%205.34171%202.95118%205.14645%203.14645L5.85355%203.85355ZM5.14645%2012.8536C5.34171%2013.0488%205.65829%2013.0488%205.85355%2012.8536C6.04882%2012.6583%206.04882%2012.3417%205.85355%2012.1464L5.14645%2012.8536ZM1%208.5H15V7.5H1V8.5ZM1.35355%208.35355L5.85355%203.85355L5.14645%203.14645L0.646447%207.64645L1.35355%208.35355ZM0.646447%208.35355L5.14645%2012.8536L5.85355%2012.1464L1.35355%207.64645L0.646447%208.35355Z'%20fill='black'/%3e%3c/svg%3e",W2="data:image/svg+xml,%3csvg%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M26.6665%201.33333C27.0201%201.33333%2027.3593%201.47381%2027.6093%201.72386C27.8594%201.97391%2027.9998%202.31304%2027.9998%202.66667V29.3333C27.9998%2029.687%2027.8594%2030.0261%2027.6093%2030.2761C27.3593%2030.5262%2027.0201%2030.6667%2026.6665%2030.6667H5.33317C4.97955%2030.6667%204.64041%2030.5262%204.39036%2030.2761C4.14031%2030.0261%203.99984%2029.687%203.99984%2029.3333V2.66667C3.99984%202.31304%204.14031%201.97391%204.39036%201.72386C4.64041%201.47381%204.97955%201.33333%205.33317%201.33333H26.6665ZM26.6665%200H5.33317C4.62593%200%203.94765%200.280952%203.44755%200.781049C2.94746%201.28115%202.6665%201.95942%202.6665%202.66667V29.3333C2.6665%2030.0406%202.94746%2030.7189%203.44755%2031.219C3.94765%2031.719%204.62593%2032%205.33317%2032H26.6665C27.3737%2032%2028.052%2031.719%2028.5521%2031.219C29.0522%2030.7189%2029.3332%2030.0406%2029.3332%2029.3333V2.66667C29.3332%201.95942%2029.0522%201.28115%2028.5521%200.781049C28.052%200.280952%2027.3737%200%2026.6665%200V0Z'%20fill='black'/%3e%3cpath%20d='M15.6665%206.66675C16.7711%206.66675%2017.6665%205.77132%2017.6665%204.66675C17.6665%203.56218%2016.7711%202.66675%2015.6665%202.66675C14.5619%202.66675%2013.6665%203.56218%2013.6665%204.66675C13.6665%205.77132%2014.5619%206.66675%2015.6665%206.66675Z'%20fill='black'/%3e%3cpath%20d='M15.6667%207C14.429%207%2013.242%207.49167%2012.3668%208.36684C11.4917%209.24201%2011%2010.429%2011%2011.6667H20.3333C20.3333%2010.429%2019.8417%209.24201%2018.9665%208.36684C18.0913%207.49167%2016.9043%207%2015.6667%207Z'%20fill='black'/%3e%3cpath%20d='M26.3333%2015.5H5V16.8333H26.3333V15.5Z'%20fill='black'/%3e%3cpath%20d='M26.3333%2020.5867H5V21.92H26.3333V20.5867Z'%20fill='black'/%3e%3cpath%20d='M26.3333%2025.6667H5V27.0001H26.3333V25.6667Z'%20fill='black'/%3e%3c/svg%3e",Z2="data:image/svg+xml,%3csvg%20viewBox='0%200%20305%20306'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M41%203.4C43.5%202.6%2047.7%201.49999%2050.5%201.09999C53.2%200.599992%20100.5%200.299994%20255.5%200.499994L263.5%203.19999C267.9%204.69999%20274.2%207.69999%20277.5%209.79999C280.8%2012%20285.2%2015.5%20287.4%2017.6C289.5%2019.7%20292.5%2023.3%20294%2025.5C295.5%2027.7%20297.6%2031.3%20298.8%2033.5C299.9%2035.7%20301.6%2039.5%20302.6%2042C304.3%2046.2%20304.5%2052.7%20304.8%20150C305%20224.8%20304.8%20255%20304%20259C303.4%20262%20301%20268.3%20298.7%20273C295.7%20278.9%20292.6%20283.4%20288%20288C284.4%20291.7%20279%20296.1%20276%20297.8C273%20299.5%20267.6%20301.9%20257.5%20305.5H48.5L41%20303C36.9%20301.7%2030.3%20298.5%2026.5%20295.9C22.7%20293.4%2017.1%20288.4%2014.2%20284.9C11.2%20281.4%207.5%20275.8%205.9%20272.5C4.3%20269.2%202.3%20264%201.5%20261C0.2%20256.3%200%20240%200%20153.2C0%2062.2%200.199998%2050.4%201.6%2045.2C2.5%2042.1%204.8%2036.3%206.8%2032.5C9.1%2028%2012.9%2023%2017.5%2018.4C21.3%2014.5%2027.2%209.89999%2030.5%208.09999C33.8%206.39999%2038.5%204.2%2041%203.4ZM120.7%2044.4C125.6%2043%20132%2041.5%20135%2041.1C138%2040.6%20145.7%2040.2%20152%2040.1C158.6%2040.1%20167.3%2040.7%20172.5%2041.6C177.4%2042.5%20185.3%2044.5%20190%2046.2C194.7%2047.8%20201.9%2051%20206%2053.2C210.1%2055.5%20214.9%2058.3%20216.5%2059.4C218.1%2060.5%20222.2%2063.7%20225.5%2066.5C228.8%2069.2%20233.5%2073.7%20236%2076.4C238.5%2079.1%20241.6%2082.7%20242.8%2084.4C244.1%2086.1%20246.6%2089.8%20248.4%2092.5C250.2%2095.3%20252.8%2099.8%20254.2%20102.5C255.7%20105.3%20258.2%20111.6%20259.9%20116.5C261.6%20121.4%20263.7%20129.3%20264.5%20134C265.3%20138.7%20266%20147.4%20266%20153.5C266%20159.6%20265.4%20168.1%20264.6%20172.5C263.8%20176.9%20262.2%20183.7%20261%20187.5C259.8%20191.4%20256.8%20198.6%20254.3%20203.5C251.8%20208.4%20247.3%20216%20244.2%20220.3C241%20224.6%20235.6%20231%20232%20234.4C228.4%20237.9%20221.9%20243.2%20217.5%20246.2C213.1%20249.3%20206.8%20253.1%20203.5%20254.7C200.2%20256.4%20194.6%20258.7%20191%20260C187.4%20261.2%20182.9%20262.6%20181%20263.1C179.1%20263.6%20173.9%20264.7%20169.5%20265.5C165.1%20266.3%20158.2%20267%20154.3%20267C150.3%20267%20143.5%20266.5%20139.3%20265.9C135%20265.4%20127.2%20263.7%20122%20262.3C116.8%20260.9%20111%20259%20106%20256.5V187L77.3001%20186.9C61.4001%20186.8%2047.4001%20186.5%2046.0001%20186.1C43.8001%20185.5%2043.3001%20184.4%2041.8001%20177.5C40.8001%20173.1%2039.7001%20164.6%2039.4001%20158.5C38.9001%20150.5%2039.2001%20144.6%2040.4001%20137C41.3001%20131.2%2043.3001%20122.7%2044.9001%20118C46.4001%20113.3%2049.3001%20106.4%2051.2001%20102.5C53.2001%2098.7%2056.9001%2092.4%2059.5001%2088.5C62.1001%2084.7%2067.9001%2077.9%2072.4001%2073.5C76.8001%2069.1%2082.3001%2064.1%2084.5001%2062.4C86.7001%2060.8%2090.8001%2058%2093.5001%2056.3C96.3001%2054.5%20101.5%2051.7%20105.3%2050.1C109%2048.4%20115.9%2045.9%20120.7%2044.4Z'%20/%3e%3cpath%20d='M142%2070.6C140.6%2070.8%20137%2071.5%20134%2072.2C131%2072.8%20126.5%2074.2%20124%2075.2C121.5%2076.3%20117.5%2078.1%20115%2079.2C112.5%2080.3%20107.3%2083.6%20103.5%2086.5C99.7%2089.4%2094.7%2093.7%2092.4%2096.1C90.2%2098.5%2086.7%20102.8%2084.7%20105.5C82.8%20108.3%2079.5%20114.1%2077.4%20118.5C75.4%20122.9%2072.9%20129.9%2071.9%20134C70.8%20138.1%2070%20144.8%2070%20148.8V156H106C106%20147.9%20106.4%20143%20107%20140C107.6%20137%20109.6%20131.2%20111.5%20127.3C113.5%20123.2%20117.3%20117.6%20120.3%20114.4C123.1%20111.4%20127.5%20107.5%20130%20106C132.5%20104.4%20137.2%20102.1%20140.5%20100.9C145.8%2099%20148.9%2098.7%20168.3%2098.4L190%2098V129C150.5%20129.5%20148.9%20129.6%20146.3%20131.6C144.8%20132.8%20142.2%20135.4%20140.5%20137.5C137.9%20140.8%20137.5%20142.1%20137.3%20148.6L137%20156H190V187L137%20186.5V235C140.5%20235.8%20146.4%20236%20152.5%20236C160.8%20236%20165.8%20235.4%20173%20233.7C178.6%20232.3%20185.9%20229.5%20190.9%20226.9C195.4%20224.5%20202%20220.3%20205.3%20217.5C208.7%20214.8%20213.8%20209.6%20216.8%20206C219.7%20202.4%20224.3%20195%20227%20189.5C229.7%20184%20232.6%20176.8%20233.5%20173.5C234.4%20170.2%20235.3%20163.4%20235.7%20158.5C236%20153.5%20235.7%20146.3%20235.1%20142.3C234.5%20138.3%20232.9%20131.5%20231.5%20127.3C230.2%20123%20227%20115.9%20224.4%20111.5C221.3%20106.1%20216.7%20100.5%20210.6%2094.5C204.1%2088.1%20199.1%2084.2%20193%2080.8C188.3%2078.2%20180.4%2074.9%20175.5%2073.5C169%2071.6%20163.5%2070.8%20155.5%2070.5C149.4%2070.3%20143.4%2070.3%20142%2070.6Z'/%3e%3c/svg%3e",G2="data:image/svg+xml,%3csvg%20viewBox='0%200%20104%20104'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M52%200C23.28%200%200%2023.28%200%2052C0%2080.72%2023.28%20104%2052%20104L51.95%2097.95H52C77.38%2097.95%2097.95%2077.38%2097.95%2052H104C104%2023.28%2080.72%200%2052%200ZM52%2091.89C29.97%2091.89%2012.11%2074.03%2012.11%2052C12.11%2029.97%2029.97%2012.1%2052%2012.1C74.03%2012.1%2091.89%2029.96%2091.89%2051.99C91.89%2074.02%2074.03%2091.88%2052%2091.88V91.89Z'%20/%3e%3cpath%20d='M62.0102%2019.63C48.6202%2015.27%2035.7902%2020.46%2028.4602%2027.41C28.6502%2036.4%2030.0902%2043.42%2032.4002%2049.38C35.5702%2034.3%2047.7902%2021.9%2062.0102%2019.64'/%3e%3cpath%20d='M20.3901%2039.31C12.1701%2060.95%2026.1301%2078.93%2040.6501%2083.96C35.9901%2078.28%2032.6201%2070.25%2031.7601%2062.3C25.5601%2056.1%2021.3101%2048.22%2020.3801%2039.31'/%3e%3cpath%20d='M36.4702%2065.69C37.6202%2072.78%2039.6102%2079.76%2043.8502%2084.92C58.6902%2088.75%2071.8002%2081.53%2078.2702%2073.47C64.6202%2079.81%2049.4002%2076.17%2036.4802%2065.69'/%3e%3cpath%20d='M79.4102%2071.97C94.9102%2050.09%2080.1602%2027.72%2067.0002%2021.64C51.3602%2024.13%2037.2702%2038.65%2035.6602%2055.92C47.8702%2076.79%2072.5102%2074.22%2079.4202%2071.97'/%3e%3c/svg%3e",X2="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2048%2048'%3e%3cg%20id='Layer_2'%20data-name='Layer%202'%3e%3cg%20id='github_hover'%3e%3cpath%20class='cls-2'%20d='M24,.59a24,24,0,0,0-7.59,46.78c1.2.22,1.64-.52,1.64-1.16s0-2.46,0-4.47c-6.68,1.46-8.09-2.83-8.09-2.83C8.84,36.14,7.27,35.4,7.27,35.4c-2.18-1.49.16-1.46.16-1.46a5,5,0,0,1,3.68,2.47c2.14,3.67,5.62,2.61,7,2a5.07,5.07,0,0,1,1.52-3.21c-5.33-.61-10.93-2.66-10.93-11.86a9.26,9.26,0,0,1,2.47-6.44,8.63,8.63,0,0,1,.23-6.35s2-.65,6.6,2.46a22.7,22.7,0,0,1,12,0c4.58-3.11,6.6-2.46,6.6-2.46a8.63,8.63,0,0,1,.23,6.35,9.26,9.26,0,0,1,2.47,6.44c0,9.22-5.61,11.25-11,11.84A5.76,5.76,0,0,1,30,39.63c0,3.21,0,5.79,0,6.58s.43,1.39,1.65,1.15A24,24,0,0,0,24,.59Z'%20/%3e%3cpath%20class='cls-3'%20d='M9.09,35.05c-.05.12-.24.16-.41.07a.3.3,0,0,1-.22-.36c0-.12.24-.15.42-.07s.27.24.21.36Z'%20/%3e%3cpath%20class='cls-3'%20d='M10.06,36.14c-.11.1-.34,0-.49-.12a.36.36,0,0,1-.07-.49.36.36,0,0,1,.49.11c.16.17.19.39.07.5Z'%20/%3e%3cpath%20class='cls-3'%20d='M11,37.52c-.15.1-.39,0-.54-.21s-.14-.47,0-.57.38,0,.53.2.15.47,0,.58Z'%20/%3e%3cpath%20class='cls-3'%20d='M12.3,38.85c-.13.15-.41.11-.61-.09s-.27-.47-.14-.61a.45.45,0,0,1,.62.09c.21.19.27.47.13.61Z'%20/%3e%3cpath%20class='cls-3'%20d='M14.09,39.63c-.05.19-.32.27-.6.19s-.45-.3-.39-.49a.46.46,0,0,1,.6-.19c.27.08.45.3.39.49Z'%20/%3e%3cpath%20class='cls-3'%20d='M16.06,39.77c0,.2-.23.36-.51.37S15,40,15,39.79s.22-.36.51-.37.52.16.52.35Z'%20/%3e%3cpath%20class='cls-3'%20d='M17.89,39.46c0,.19-.17.39-.45.45s-.54-.07-.57-.26.16-.4.44-.45.54.06.58.26Z'%20/%3e%3c/g%3e%3c/g%3e%3c/svg%3e",Q2="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2048%2048'%20fill='none'%3e%3cg%20id='Layer_2'%20data-name='Layer%202'%3e%3cg%20id='linkedin_hover'%3e%3cpath%20class='cls-2'%20d='M40.9,40.9H33.79V29.76c0-2.65,0-6.07-3.7-6.07s-4.28,2.89-4.28,5.88V40.9H18.7V18h6.83v3.13h.1a7.46,7.46,0,0,1,6.73-3.7c7.21,0,8.54,4.74,8.54,10.91V40.9Zm-30.22-26a4.13,4.13,0,1,1,4.12-4.12,4.13,4.13,0,0,1-4.12,4.12Zm3.56,26H7.12V18h7.12V40.9ZM44.45,0H3.54A3.5,3.5,0,0,0,0,3.46V44.54A3.5,3.5,0,0,0,3.54,48H44.45A3.51,3.51,0,0,0,48,44.54V3.46A3.51,3.51,0,0,0,44.45,0Z'%20/%3e%3c/g%3e%3c/g%3e%3c/svg%3e",Y2="data:image/svg+xml,%3csvg%20viewBox='0%200%2048%2048'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M2%208C0.895431%208%200%208.89543%200%2010V38C0%2039.1046%200.895431%2040%202%2040H46C47.1046%2040%2048%2039.1046%2048%2038V10C48%208.89543%2047.1046%208%2046%208H2ZM4.45397%2015.8949C4.78821%2015.4552%205.41558%2015.3697%205.85524%2015.704L17.6644%2024.6814C17.6748%2024.6887%2017.6851%2024.6962%2017.6953%2024.704L23.2445%2028.9234C23.2774%2028.9483%2023.3113%2028.9715%2023.3463%2028.9929C23.4557%2029.06%2023.5746%2029.1097%2023.6985%2029.1406C23.7965%2029.165%2023.8978%2029.1775%2024.0001%2029.1775C24.2728%2029.1775%2024.5381%2029.0883%2024.7554%2028.9235L30.3048%2024.704C30.3096%2024.7003%2030.3144%2024.6967%2030.3193%2024.6932C30.3247%2024.6892%2030.3302%2024.6853%2030.3357%2024.6814L42.1449%2015.704C42.5845%2015.3697%2043.2119%2015.4552%2043.5461%2015.8949C43.8804%2016.3345%2043.7949%2016.9619%2043.3552%2017.2961L32.5631%2025.5004L43.3552%2033.7039C43.7949%2034.0381%2043.8804%2034.6655%2043.5462%2035.1052C43.2119%2035.5448%2042.5846%2035.6303%2042.1449%2035.2961L30.9107%2026.7566L25.9652%2030.5161C25.9232%2030.5481%2025.8804%2030.5789%2025.837%2030.6086C25.4213%2030.8935%2024.946%2031.077%2024.4495%2031.1463C24.3012%2031.1671%2024.1511%2031.1776%2024.0001%2031.1776C23.2907%2031.1776%2022.6007%2030.9455%2022.0356%2030.5167L17.0894%2026.7566L5.85521%2035.2961C5.41553%2035.6303%204.78816%2035.5448%204.45394%2035.1052C4.11973%2034.6655%204.20522%2034.0381%204.6449%2033.7039L15.437%2025.5004L4.64487%2017.2961C4.2052%2016.9619%204.11974%2016.3345%204.45397%2015.8949Z'%20fill='none'/%3e%3c/svg%3e",J2="data:image/svg+xml,%3csvg%20viewBox='0%200%2032%2032'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M27.1261%204.87569C24.7334%202.483%2022.1775%204.03163%2020.5779%205.63117L5.46766%2020.742C3.86812%2022.3413%202.19391%2024.7715%204.71218%2027.2894C7.23044%2029.8082%209.66063%2028.1337%2011.2598%2026.5341L26.3704%2011.4237C27.97%209.82399%2029.5186%207.26809%2027.1261%204.87569Z'%20/%3e%3cpath%20d='M12.6899%204.25681L15.8894%207.45619L19.1462%204.19946C19.3673%203.97784%2019.5918%203.77217%2019.8177%203.57821C19.4766%201.8575%2018.4948%200.30191%2015.8879%200.30191C13.2761%200.30191%2012.2955%201.86361%2011.9563%203.58805C12.2001%203.79898%2012.4435%204.01042%2012.6899%204.25681Z'%20/%3e%3cpath%20d='M19.1443%2028.023L15.8896%2024.7681L12.6917%2027.9657C12.4489%2028.2087%2012.2072%2028.4306%2011.9666%2028.6392C12.3333%2030.3933%2013.3712%2032%2015.8883%2032C18.4119%2032%2019.4484%2030.3847%2019.8128%2028.6249C19.5889%2028.4323%2019.365%2028.2435%2019.1443%2028.023Z'%20/%3e%3cpath%20d='M11.3327%2012.013H5.16431C2.90262%2012.013%200%2012.7256%200%2016.109C0%2018.6335%201.61583%2019.6702%203.3759%2020.0343C3.58429%2019.7937%2011.3327%2012.013%2011.3327%2012.013Z'%20/%3e%3cpath%20d='M28.4128%2012.1773C28.2176%2012.4044%2020.4529%2020.2047%2020.4529%2020.2047H26.5338C28.7956%2020.2047%2031.6981%2019.6703%2031.6981%2016.109C31.6981%2013.4975%2030.1369%2012.5164%2028.4128%2012.1773Z'%20/%3e%3cpath%20d='M13.3539%209.9883L14.4559%208.8863L11.2583%205.6882C9.65859%204.08883%207.22873%202.41445%204.71047%204.93272C2.86385%206.7793%203.27401%208.5766%204.25348%2010.0356C4.5518%2010.0135%2013.3539%209.9883%2013.3539%209.9883Z'%20/%3e%3cpath%20d='M18.424%2022.2295L17.3191%2023.3344L20.5762%2026.5912C22.1758%2028.1909%2024.7317%2029.7392%2027.1241%2027.3468C28.9092%2025.5615%2028.4996%2023.6863%2027.5127%2022.1842C27.195%2022.2071%2018.424%2022.2295%2018.424%2022.2295Z'%20/%3e%3c/svg%3e",e0="/assets/portrait-ZFGqSNXQ.jpg",t0="data:image/svg+xml,%3csvg%20viewBox='0%200%20144%20144'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M0%20144V72V0H144V144H0ZM12.8%2051.4C12.7%2037.1%2013.0999%2025%2013.5%2024.6C14%2024.2%2017.5999%2024.1%2028.5%2024.5L29%2050.1C29.5%2074%2029.5999%2075.9%2031.5%2078C32.5999%2079.2%2034.7%2080.8%2036.3%2081.6C37.8%2082.4%2040.8999%2083%2043.3%2083C45.7%2083%2048.8%2082.2%2050.8%2081C52.5%2079.9%2054.5999%2078%2055.3%2076.7C56.0999%2075.2%2056.7%2066.8%2057.5%2024.5H72.5L72.7%2050C72.8999%2066%2072.5999%2077%2071.8999%2079.5C71.2%2082.2%2069.0999%2085.2%2065.3999%2088.7C61.3999%2092.6%2058.5999%2094.4%2054.8%2095.5C51.8999%2096.3%2046.2%2097%2042.3%2097C37.7%2097%2033.2%2096.3%2030.3%2095.2C27.5999%2094.2%2023.8%2092.1%2021.7%2090.5C19.5999%2088.8%2016.7%2085.2%2015.3999%2082.5C13.0056%2077.6113%2013%2076.9033%2012.8015%2051.577L12.8%2051.4ZM80.8%2087.2C80.7%2066.4%2081.0999%2049%2081.5%2048.6C82%2048.3%2083%2048.2%2083.7%2048.5C84.3999%2048.8%2087.5%2049%2090.5%2049C94.7%2049%2096%2049.3%2096%2050.5C96%2051.3%2096.0999%2052%2096.3%2052C96.3999%2052%2098.3%2051.1%20100.5%2050C103.1%2048.7%20106.5%2048%20110.3%2048C113.9%2048%20117.4%2048.7%20119.8%2049.9C121.8%2050.9%20125.2%2053.6%20127.3%2055.9C129.5%2058.4%20131.6%2062.1%20132.5%2065.2C133.3%2068.1%20134%2071.4%20134%2072.5C134%2073.6%20133.3%2076.9%20132.5%2079.7C131.6%2082.9%20129.5%2086.6%20127.3%2089.1C125.2%2091.4%20121.8%2094.1%20119.8%2095.1C117.4%2096.3%20113.9%2097%20110.3%2097C106.5%2097%20103.1%2096.3%20100.5%2095C98.3%2093.9%2096.3999%2093%2096.3%2093C96.0999%2093%2096%20100.2%2096%20125H81L80.8%2087.2Z'%20/%3e%3cpath%20d='M101.3%2063C99.5%2064.1%2097.5%2065.9%2097%2067C96.5%2068.1%2096%2070.8%2096%2073C96%2076%2096.7%2077.7%2098.8%2079.9C100.3%2081.5%20102.6%2083.1%20104%2083.5C105.4%2083.9%20107.8%2083.9%20109.5%2083.5C111.2%2083.1%20113.7%2081.5%20115.3%2079.9C117.4%2077.7%20118%2076%20118%2072.7C118%2070.4%20117.3%2067.5%20116.5%2066.2C115.7%2065%20113.7%2063.3%20112%2062.5C110.3%2061.7%20108%2061%20106.8%2061C105.5%2061%20103%2061.9%20101.3%2063Z'%20/%3e%3c/svg%3e",n0="data:image/svg+xml,%3csvg%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0)'%3e%3cpath%20d='M32%209L26.6667%2016.3407L32%2023.6814H25.4076L23.3705%2020.8775L21.3333%2023.6814H14.741L18.0372%2019.1446L23.3705%2020.8775L20.0743%2016.3407L23.3705%2011.8039L18.0372%2013.5368L14.741%209H21.3333L23.3705%2011.8039L25.4076%209H32Z'%20fill='black'/%3e%3cpath%20d='M14.7408%209V14.6078L9.40747%2016.3407V9H14.7408Z'%20fill='black'/%3e%3cpath%20d='M5.3333%209V19.1446C5.3333%2020.8775%207.37048%2020.8775%207.37048%2020.8775C7.37048%2020.8775%209.40767%2020.8775%209.40767%2019.1446V16.3407L14.741%2018.0736C14.741%2023.6814%207.37048%2023.6814%207.37048%2023.6814C7.37048%2023.6814%200%2023.6814%200%2018.0736V9H5.3333Z'%20fill='black'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0'%3e%3crect%20width='32'%20height='32'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e",s0="data:image/png;base64,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",o0="/assets/code-versus-zoVKuQzM.png",i0="/assets/column_expressions-c4wO7Jz4.png",r0="/assets/concept-sLa4PJtO.png",a0="/assets/formulas04-S7oEWqTa.jpg",l0="/assets/variations-codesnippets-utOgpwcS.png",c0="/assets/1-venice-rsm1PQ6D.jpeg",u0="/assets/Gravitas-Logo-Light-ixumKLIf.png",d0="/assets/aeternitas-approach-2ZppLB2B.png",h0="/assets/aeternitas-hero-F7e3DF8A.png",f0="/assets/eywa-2-ZjcNbTEj.webm",p0="/assets/venice-showcase-vm_mU2-0.png",g0="/assets/colors-GQv1fmdj.png",m0="/assets/components-jxSoywmN.png",_0="/assets/demo-MBon4Zge.png",v0="/assets/typo-iztTLyFw.png",b0="/assets/greenbox_app2-ldLMY81A.png",w0="/assets/greenbox_app3-h5S4Tdvw.png",y0="/assets/greenbox_presentation-uDr5-knG.png",C0="/assets/greenbox_v1-hPZOFL8o.jpg",A0="/assets/greenbox_v2-wSLG_QzL.jpg",x0="/assets/communities-ymdGnhV9.png",k0="/assets/front_page-Ik_9RNhb.jpg",I0="/assets/node-issues-IO-iegA-.png",L0="/assets/quotes-VdAudErz.png",j0="/assets/screens-11-19-O09vzXOn.png",R0="/assets/wireframes-refined-itjz_j0P.png",$0="/assets/wireframes-rough-p3IJ4V5w.png",S0="data:image/svg+xml,%3csvg%20width='128'%20height='97'%20viewBox='0%200%20128%2097'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M127.347%2084.2326L118.523%2075.409C118.2%2075.095%20117.792%2074.8827%20117.35%2074.7981C116.908%2074.7135%20116.45%2074.7605%20116.034%2074.9332C115.618%2075.1059%20115.262%2075.3968%20115.01%2075.7698C114.757%2076.1428%20114.62%2076.5817%20114.614%2077.032V79.135H102.819C98.207%2084.5696%2092.5069%2088.9772%2086.0864%2092.0732C85.7436%2092.2332%2085.4007%2092.3932%2085.0579%2092.5303H114.614V94.656C114.624%2095.1046%20114.763%2095.5409%20115.016%2095.9115C115.269%2096.2821%20115.625%2096.5711%20116.039%2096.7432C116.454%2096.9152%20116.909%2096.963%20117.35%2096.8806C117.791%2096.7982%20118.199%2096.5892%20118.523%2096.279L127.347%2087.4556C127.766%2087.0237%20128%2086.4457%20128%2085.8441C128%2085.2424%20127.766%2084.6644%20127.347%2084.2326Z'%20/%3e%3cpath%20d='M47.2494%2074.5632C42.3077%2071.6522%2038.2112%2067.5021%2035.3648%2062.523C32.5184%2057.5438%2031.0207%2051.9081%2031.0196%2046.1728C31.9629%207.54328%2085.1467%200.844861%2095.8473%2037.6233L98.7731%2034.6975C99.4765%2034.0236%20100.313%2033.5036%20101.228%2033.1706C102.144%2032.8377%20103.118%2032.699%20104.09%2032.7635C105.062%2032.828%20106.01%2033.0943%20106.874%2033.5453C107.737%2033.9963%20108.497%2034.6223%20109.105%2035.3832C95.3356%20-17.4382%2019.0264%20-8.8834%2017.6245%2046.1725C17.5794%2056.4628%2021.0107%2066.4668%2027.3622%2074.5632H47.2494Z'%20/%3e%3cpath%20d='M110.157%2050.6528C111.621%2050.6281%20113.914%2051.0189%20114.546%2049.2357C114.716%2048.8169%20114.759%2048.3572%20114.67%2047.914C114.58%2047.4708%20114.362%2047.0638%20114.043%2046.744C111.934%2044.6131%20107.349%2040.1085%20105.219%2037.9432C104.787%2037.5257%20104.209%2037.2923%20103.608%2037.2924C103.006%2037.2924%20102.429%2037.5258%20101.996%2037.9434L100.876%2039.0634C98.9552%2040.9689%2095.0755%2044.8356%2093.1728%2046.7439C92.8618%2047.0679%2092.652%2047.4755%2092.569%2047.9169C92.4861%2048.3583%2092.5336%2048.8143%2092.7058%2049.2291C92.878%2049.6438%2093.1674%2049.9994%2093.5385%2050.2523C93.9097%2050.5052%2094.3465%2050.6444%2094.7955%2050.6528H96.6928C95.5937%2058.5436%2091.6804%2065.7714%2085.6738%2071.0052C79.6671%2076.2389%2071.9717%2079.1261%2064.0048%2079.1348H2.28589C1.68016%2079.1366%201.09975%2079.378%200.671436%2079.8063C0.243126%2080.2347%200.00173674%2080.8151%200%2081.4208V90.2445C0.00176687%2090.8502%200.24317%2091.4306%200.671476%2091.8589C1.09978%2092.2872%201.68018%2092.5286%202.28589%2092.5303L64.0044%2092.5301C75.5113%2092.4833%2086.5936%2088.1789%2095.1154%2080.4465C103.637%2072.7141%20108.995%2062.101%20110.157%2050.6528Z'%20/%3e%3c/svg%3e",M0="/assets/portrait-_tmB4JFU.png",P0="data:image/svg+xml,%3csvg%20viewBox='0%200%2091%2076'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M87.6293%200.167304L0.926291%2043.5693C-0.374509%2044.1709%20-0.272909%2046.0693%201.02785%2046.5693L19.7269%2054.0693L75.6248%2013.6713L30.8279%2058.4683V72.6673C30.8279%2074.2689%2032.8278%2074.8665%2033.7262%2073.6673L42.0271%2062.8703L73.328%2075.3703C74.2265%2075.7687%2075.3281%2075.1711%2075.5273%2074.1711L90.0273%201.9681C90.2265%200.667304%2088.8285%20-0.430296%2087.6293%200.167304Z'/%3e%3c/svg%3e",E0="/assets/teams-ZZg9vTjf.svg",T0="data:image/svg+xml,%3csvg%20width='128'%20height='123'%20viewBox='0%200%20128%20123'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M49.2042%2010.9955L26.6138%202.9989C27.2136%204.59822%2027.6134%206.59737%2027.8133%208.99635C28.4131%2020.7913%2021.4161%2038.5837%2012.22%2043.9814L35.0103%2051.978C42.4071%2045.5808%2051.0034%2021.7909%2049.2042%2010.9955Z'%20/%3e%3cpath%20d='M39.0088%2053.7772L42.0075%2054.7768C43.207%2048.3795%2048.8046%2043.5816%2055.4018%2043.5816C62.9986%2043.5816%2069.1959%2049.7789%2069.1959%2057.1758C69.1959%2059.3749%2068.5962%2061.5739%2067.5966%2063.5731H67.9964C76.5928%2065.3723%2086.5885%2044.5812%2086.1887%2031.3868C85.9888%2026.5888%2084.3895%2023.1903%2081.5906%2022.3906L53.4027%2012.5948C54.2023%2024.1898%2046.6056%2045.5807%2039.0088%2053.7772Z'%20/%3e%3cpath%20d='M125.572%2049.579H125.372L109.778%2044.1813V43.7815C109.578%2038.9835%20107.579%2037.3842%20106.38%2036.7845C106.38%2036.7845%20106.18%2036.7845%20106.18%2036.5846L90.1868%2030.9869C90.1868%2031.1869%2090.1868%2031.1869%2090.1868%2031.3868C90.5866%2041.5824%2085.5887%2054.7768%2079.3914%2062.1736L95.3845%2067.7713C97.9834%2068.5709%20100.982%2066.1719%20102.781%2064.1728L118.375%2069.5705C124.372%2071.9695%20131.969%2052.7777%20125.572%2049.579Z'%20/%3e%3cpath%20d='M21.0163%2024.3898C24.6147%2014.1941%2025.0146%202.59909%2019.0171%200.599939C18.4174%200.400024%2017.8176%200.400024%2017.2179%200.400024C11.4204%200.400024%205.42293%209.59611%202.62412%2017.9925C0.824885%2023.1903%20-0.174689%2028.3881%200.0252257%2032.5863C0.225141%2037.3843%201.82446%2040.7828%204.62327%2041.7824C5.22301%2041.9823%205.82276%2041.9823%206.4225%2041.9823C12.22%2041.9823%2018.0176%2032.7862%2021.0163%2024.3898ZM6.02267%2037.984C5.22301%2037.7841%204.22344%2036.1848%204.02352%2032.5863C3.82361%2028.7879%204.62327%2024.1899%206.4225%2019.3919C9.82105%209.59611%2015.0188%204.39832%2017.4178%204.39832C17.6177%204.39832%2017.6177%204.39832%2017.8176%204.39832C20.0167%205.19798%2020.8164%2012.9947%2017.4178%2023.1903C13.6194%2033.386%208.02182%2038.7837%206.02267%2037.984Z'%20/%3e%3cpath%20d='M27.2135%20120.149C26.8137%20121.149%2027.2135%20122.348%2028.2131%20122.748C29.2127%20123.148%2030.4122%20122.748%2030.812%20121.748L52.003%2070.5701C50.6036%2070.1703%2049.4041%2069.7704%2048.4045%2068.9708L27.2135%20120.149Z'%20/%3e%3cpath%20d='M53.4026%2070.9699V112.752C53.4026%20113.752%2054.4022%20114.751%2055.4017%20114.751C56.6012%20114.751%2057.4009%20113.752%2057.4009%20112.752V70.9699C56.4013%2071.1698%2054.802%2071.1698%2053.4026%2070.9699Z'%20/%3e%3cpath%20d='M62.5987%2068.9708C61.3992%2069.7704%2060.1997%2070.1703%2059.0002%2070.5701L79.9913%20121.548C80.3911%20122.548%2081.5906%20123.148%2082.5902%20122.548C83.5898%20122.148%2084.1895%20120.949%2083.5898%20119.949L62.5987%2068.9708Z'%20/%3e%3cpath%20d='M55.4013%2047.5799C50.0036%2047.5799%2045.6055%2051.978%2045.6055%2057.1758C45.6055%2062.5735%2050.0036%2066.9716%2055.4013%2066.9716C60.799%2066.9716%2065.1971%2062.5735%2065.1971%2057.1758C65.1971%2051.978%2060.799%2047.5799%2055.4013%2047.5799Z'%20/%3e%3c/svg%3e",U0="/assets/viraj-zDO__Xrj.jpeg",O0="/assets/mechanics-PrUHgJCx.png",z0="/assets/mechanics_app-srXZoruJ.png",V0="/assets/mechanics_interview-ckRWPg-f.png",N0="/assets/tools-84UqHYJQ.png",H0="/assets/workflow-IY7fEvXY.png",F0="/assets/coverflow-JQYAcnf6.mp4",B0="/assets/mockup_ps-HSV-inA5.jpg",D0="/assets/paper_prototype-v_85moat.jpg",q0="/assets/phoenix_mp-K0fD-SK7.jpg",K0="/assets/shuffle_tooltip-sea-1YRc.png",W0="/assets/wireframe_ps_js-jVI4ZlYA.png",Z0="/assets/concept-EdZ0-C_Y.png",G0="/assets/querybuilder-LioqXdww.png",X0="/assets/querybuilders-GkPk1dRC.png",Q0="/assets/row-filter-mfOS5Y57.png",Y0="data:image/png;base64,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",J0="/assets/variations-GyqHeiWj.png",eu="/assets/brainstorming-sideshot-wBi72-VW.jpg",tu="/assets/mass-ass-slide-320S9N4k.jpg",nu="/assets/project-plan-GVjBZQ4g.png",su="/assets/snip-gif-KHpQ1KSV.mp4",ou="/assets/variants-SBaetX98.jpg",iu="/assets/adjustable-eyes-2CcmiUxi.jpg",ru="/assets/data-coll-8pOA24j0.png",au="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAcCAYAAAAAwr0iAAAACXBIWXMAAAsSAAALEgHS3X78AAAAzUlEQVRIx+2WwQ2DMBAE11EKoBNTgjsgHUAHtEAHtEAJ7sQpIR04HWw+EBARto88+NxIlpDl2xs/kM+QhARjTLKApJHk3XAxKqACKqACKqACKnDPvP0PALVwXhh2W57kMzVAJBeACQBPriGbnzswS3TCxm8AXVF2yaFZws3BueYvAHVx7m4jSQiB1trD5tZaxhhZwPZia0AJMUY2TfPTvG1blrKrlQks9H3/rRvHUVS77WkWi+WPkOC9R1VVcM5JR/v1+x+BsxwK6FtwBR9eNgQha8B33AAAAABJRU5ErkJggg==",lu="/assets/eye-REu15ElJ.png",cu="/assets/foveated-rendering-qIcSnxgd.png",uu="/assets/gnb-Xh3o4j2A.png",du="/assets/regX-5My3uOqN.png",hu="/assets/thesis-8ljNIOLh.pdf",fu="/assets/ticket1-wtXLxNsj.jpeg",pu="/assets/trafficticket-cToXHv7E.pdf";function Ho(e,t){return(e%t+t)%t}function gu(e){let t=ot.length;for(let o=0;o(Ke("data-v-a5fc3b27"),e=e(),We(),e),_u={id:"about"},vu={class:"responsive"},bu=["src"],wu={id:"text",class:"body1"},yu=Bt(()=>l("h4",null,"About",-1)),Cu=Bt(()=>l("p",null,"With 7 years of diverse industry experience, I bring a dynamic blend of strategic product management and impactful design to your projects. From automotive to finance and beyond, I specialize in crafting user-centric experiences that are easy to use and great for business. Let's collaborate to turn your ideas into exceptional solutions!",-1)),Au=Bt(()=>l("h5",null,"CV",-1)),xu={class:"cv"},ku=Bt(()=>l("h5",null,"Industries",-1)),Iu={class:"industries"},Lu={class:"tag"},ju=Bt(()=>l("h5",null,"Skills",-1)),Ru={class:"skills"},$u={class:"tag"},Su=Bt(()=>l("h5",null,"Networks",-1)),Mu={class:"networks"};function Pu(e,t,n,s,o,i){const r=$("CvIcon"),a=$("Button"),c=$("UplinkIcon"),f=$("MaltIcon"),h=$("FreelancedeIcon"),p=$("FreelancermapIcon"),m=$("GhIcon"),y=$("UxIcon");return P(),U("div",_u,[l("div",vu,[l("img",{src:i.buildURL("bio/portrait.jpg")},null,8,bu),l("div",wu,[yu,Cu,Au,l("div",xu,[_(a,{type:"primary",bg:"light",size:"sm",text:"English CV",href:"https://drive.google.com/file/d/19Fq8oCB_v1aAk957t-IXDm7rekfPUyf0/view?usp=drive_link"},{default:ue(()=>[_(r)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"German CV",href:"https://drive.google.com/file/d/1Z7ydaFpTvXqlFKXE1KLeM45NHirvEmar/view?usp=drive_link"},{default:ue(()=>[_(r)]),_:1})]),ku,l("div",Iu,[(P(),U(ce,null,ft(["B2B SaaS","Automotive","Manufacturing","Finance","Consulting","Startup","NGO"],S=>l("div",Lu,ne(S),1)),64))]),ju,l("div",Ru,[(P(),U(ce,null,ft(["UX Design","UI Design","Web design","Conception","Prototyping","Mobile Design","Responsive Design","Figma","User Research","Scrum","Adobe Creative Suite","User-Centered Design","Usability Testing","Requirements Engineering"],S=>l("div",$u,ne(S),1)),64))]),Su,l("div",Mu,[_(a,{type:"secondary",bg:"light",size:"sm",text:"Uplink",href:"https://uplink.tech/"},{default:ue(()=>[_(c)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"Malt",href:"https://www.malt.de/profile/johannesschweig"},{default:ue(()=>[_(f)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"Freelance.de",href:"https://freelance.de/"},{default:ue(()=>[_(h)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"Freelancermap",href:"https://www.freelancermap.de/profil/ux-und-product-consultant"},{default:ue(()=>[_(p)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"GitHub",href:"https://github.com/johannesschweig"},{default:ue(()=>[_(m)]),_:1}),_(a,{type:"secondary",bg:"light",size:"sm",text:"ux.stackexchange",href:"https://ux.stackexchange.com/users/110814/nash"},{default:ue(()=>[_(y)]),_:1})])])])])}const Eu=se(mu,[["render",Pu],["__scopeId","data-v-a5fc3b27"]]),Tu={data(){return{project:null}},props:{route:{type:String,required:!0}},created(){this.project=Kn.filter(e=>e.route==this.$props.route)[0]}},Hs=e=>(Ke("data-v-7c0f8bc3"),e=e(),We(),e),Uu={id:"project-header",class:"responsive"},Ou={id:"name-container"},zu={class:"subtitle1"},Vu={id:"heading-container"},Nu=Hs(()=>l("div",{class:"subtitle1"}," Client ",-1)),Hu=Hs(()=>l("div",{class:"subtitle1"}," Task ",-1)),Fu=Hs(()=>l("div",{class:"subtitle1"}," Timeline ",-1));function Bu(e,t,n,s,o,i){return P(),U("div",Uu,[l("div",Ou,[l("div",zu,ne(o.project.name),1),l("h2",null,ne(o.project.slogan),1)]),l("div",Vu,[Nu,l("h5",null,[(P(!0),U(ce,null,ft(o.project.clients,r=>(P(),U("div",{key:r},ne(r),1))),128))]),Hu,l("h5",null,ne(o.project.task),1),Fu,l("h5",null,ne(o.project.date),1)])])}const Ue=se(Tu,[["render",Bu],["__scopeId","data-v-7c0f8bc3"]]),Du={props:{src:{type:String,required:!0},alt:{type:String},shadow:{type:Boolean,default:!0}},methods:{isVideo(){return!!(this.$props.src.endsWith(".mp4")|this.$props.src.endsWith(".webm"))}}},qu={id:"container"},Ku=["src","alt"],Wu=["src"],Zu={class:"body2"};function Gu(e,t,n,s,o,i){return P(),U("div",qu,[i.isVideo()?gs("",!0):(P(),U("img",{key:0,class:ht(["img-md",{shadow:n.shadow}]),src:n.src,alt:n.alt},null,10,Ku)),i.isVideo()?(P(),U("video",{key:1,class:ht(["img-md",{shadow:n.shadow}]),autoplay:"",muted:"",loop:""},[l("source",{src:n.src,type:"video/mp4"},null,8,Wu),W(" Your browser does not support the video tag. ")],2)):gs("",!0),l("div",Zu,ne(n.alt),1)])}const Ze=se(Du,[["render",Gu],["__scopeId","data-v-27d3b8ac"]]),Xu={xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",fill:"none"},Qu=l("path",{fill:"#000",d:"m1 8-.354-.354a.5.5 0 0 0 0 .708zm14 .5a.5.5 0 0 0 0-1zM5.854 3.854a.5.5 0 1 0-.708-.708zm-.708 9a.5.5 0 0 0 .708-.708zM1 8.5h14v-1H1zm.354-.146 4.5-4.5-.708-.708-4.5 4.5zm-.708 0 4.5 4.5.708-.708-4.5-4.5z"},null,-1),Yu=[Qu];function Ju(e,t){return P(),U("svg",Xu,[...Yu])}const e1={render:Ju},t1={components:{Arrow:e1},data(){return{previousProject:{route:null,name:null},nextProject:{route:null,name:null}}},props:{route:{type:String,required:!0}},created(){let e=gu(this.route);this.previousProject=e.previous,this.nextProject=e.next}},n1=e=>(Ke("data-v-ca97760c"),e=e(),We(),e),s1={id:"projectArrows",class:"responsive"},o1=n1(()=>l("div",{class:"flex-grow"},null,-1));function i1(e,t,n,s,o,i){const r=$("Arrow"),a=$("router-link");return P(),U("div",s1,[_(a,{class:"previous",to:o.previousProject.route},{default:ue(()=>[_(r),l("span",null,"Previous project: "+ne(o.previousProject.name),1)]),_:1},8,["to"]),o1,_(a,{class:"next",to:o.nextProject.route},{default:ue(()=>[l("span",null,"Next project: "+ne(o.nextProject.name),1),_(r)]),_:1},8,["to"])])}const Oe=se(t1,[["render",i1],["__scopeId","data-v-ca97760c"]]),r1={components:{"project-header":Ue,"styled-image":Ze,"project-arrows":Oe},methods:{buildURL(e){return ve(e)}}},a1={class:"responsive"},l1=l("h4",null,"TL;DR",-1),c1=l("p",null,'I designed an interface where users can input multiple "code snippets" to transform their data.',-1),u1=l("h4",null,"Problem",-1),d1=l("p",null,'A project I worked on for KNIME was to create an interface for a node (KNIME term for encapsulated functionality) where users can create small code snippets to manipulate data. For example, users might want to create a column with the mean of three other columns or cut the surname of a "name surname" formatted column. Previously, this was possible with a String Manipulation node for Strings, a Math Formula node for numerical data and a Rule Engine node for conditions. But what if you needed to alter Strings based on conditions? Then it gets complicated. The new node should make it easier for users to create more complex logic.',-1),h1=l("h4",null,"Research",-1),f1=l("p",null,"I analyzed the current UI and interaction of the already existing nodes and found out that they had several disadvantages:",-1),p1=l("ul",null,[l("li",null,"They were making poor use of space. UI components were getting a lot of space even though they were not as important as others (see image above)."),l("li",null,'Checking if your piece of code was correct could only be done by running the node on all your available data. Depending on the amount of data this could take a while. When you realize then that the "+1" in your code should really have been a "-1" you have to change it and run it again. Seemed too tedious.')],-1),g1=l("h4",null,"Concept",-1),m1=l("p",null,'I improved on these with a design that put the code textfield with a large amount of space in the center of attention. Adding columns, variables and functions was now one click away but this saved precious screen real estate. I also added a small "evaluate" functionality that would check your code on the first row of your data so you could iteratively improve your code snippet without having to run it on your entire data each time. On the top an overview of all the code snippets was presented and you could add more code snippets or alter existing ones. The UI for the code editor was designed to make it reusable in other nodes (e.g. filtering rows according to a code snippet with a boolean statement).',-1),_1=l("h4",null,"Evaluation",-1),v1=l("p",null,[W("The overall reception was positive. Forum users as well as colleagues gave very enthusiastic feedback on the new functionality. One user even wrote a blogpost about the node calling it "),l("a",{href:"https://blog.statinfer.com/knime-multitasking-with-column-expressions-node/"},'"The Swiss Army Knife"'),W(".")],-1),b1=l("p",null,'In the design, however, there is - as always - still room for improvement. The emancipated display of the upper "overview" and the lower "code editor" component does not make it entirely clear that a selection of a code snippet in the "overview" component would change the display in the "code editor" component. This drawback was however favored over a dialog-in-a-dialog design.',-1),w1=l("p",null,"Also, the design could guide new users better on how to start. They are presented with a blank textfield and a variety of UI components (much like opening a terminal for the first time). The functions which are the core of writing your snippet are hidden behind a dropdown. The aim of the design, however, was to create a good experience for experienced users who want to optimize their data manipulation workflows.",-1),y1=l("p",null,'On the whole, I am very content with the process and outcome of this project. I was involved from the research phase over the conceptual phase to the implementation and even helped with programming parts of the "code editor" component. Also, the feedback from the community shows that the hours you invest in research and ideation really pay off in the end.',-1);function C1(e,t,n,s,o,i){const r=$("project-header"),a=$("styled-image"),c=$("project-arrows");return P(),U("div",null,[_(r,{route:"/codesnippets"}),l("div",a1,[l1,c1,u1,_(a,{src:i.buildURL("codesnippets/3vs1.png"),alt:"Combine three nodes into one"},null,8,["src"]),d1,h1,_(a,{src:i.buildURL("codesnippets/code-versus.png"),alt:"Use of space in the String Manipulation interface"},null,8,["src"]),f1,p1,g1,_(a,{src:i.buildURL("codesnippets/variations-codesnippets.png"),alt:"Two concepts for the code editor: Columns, variables and functions in dropdowns (left) or in a tabbed interface (right)"},null,8,["src"]),m1,_1,_(a,{src:i.buildURL("codesnippets/concept.png"),alt:"Final UI concept"},null,8,["src"]),v1,b1,w1,y1,_(a,{src:i.buildURL("codesnippets/column_expressions.png"),alt:"User interface as of KNIME Analytics Platform v3.7.1"},null,8,["src"])]),_(c,{route:"/codesnippets"})])}const A1=se(r1,[["render",C1]]),x1={components:{"project-header":Ue,"styled-image":Ze,"project-arrows":Oe,Button:un},methods:{buildURL(e){return ve(e)}}},k1={id:"dubai",class:"responsive body1"},I1=l("h4",null,"TL;DR",-1),L1=l("p",null,"I designed the UI for several pages for a real estate company in Dubai showcasing their latest real estate projects.",-1),j1=l("h4",null,"Problem",-1),R1=l("p",null,"The initial design draft failed to portray the real estate projects in an appealing and professional manner. Although the imagery was generally captivating, the content lacked structure, and there were layout issues that compromised its professional presentation.",-1),$1=l("h4",null,"Structure",-1),S1=l("p",null,"My goal with the design was to make the pages more easily understandable and guaranteeing that the impressive projects stand out. I structured the content into three new sections:",-1),M1=l("h6",null,"Project",-1),P1=l("p",null,"This section showcases the iconic and spectacular nature of the project with a big hero image of the project. The goal of this section is to draw the visitor in to learn more about the project.",-1),E1=l("h6",null,"Property",-1),T1=l("p",null,"This section shows the luxurious property with a carousel filled with pictures from interior and exterior. Also, the payment plan shows the attractiveness of the investment. The goal of this section was to show the visitor what they would by buying into this project and how affordable the conditions are.",-1),U1=l("h6",null,"Neighborhood",-1),O1=l("p",null,"This section shows the surroundings and gives a feel for the atmosphere.",-1),z1=l("h4",null,"Design",-1),V1=l("h4",null,"Development",-1),N1=l("p",null,[W("Nicolas Kopp from "),l("a",{class:"link",href:"https://www.digitalessence.de/"},"digitalessence"),W(" developed the site with Wordpress DIVI.")],-1),H1=["src"];function F1(e,t,n,s,o,i){const r=$("project-header"),a=$("styled-image"),c=$("Button"),f=$("project-arrows");return P(),U("div",null,[_(r,{route:"/dubai"}),l("div",k1,[I1,L1,j1,R1,_(a,{src:i.buildURL("dubai/aeternitas-hero.png"),alt:"Issues with the hero section",shadow:!1},null,8,["src"]),_(a,{src:i.buildURL("dubai/aeternitas-approach.png"),alt:"Issues with the approach section",shadow:!1},null,8,["src"]),$1,S1,M1,P1,E1,T1,U1,O1,z1,_(a,{src:i.buildURL("dubai/1-venice.jpeg"),alt:"Design for Venice with the three sections and the footer"},null,8,["src"]),V1,N1,_(c,{type:"primary",bg:"light",size:"sm",text:"Visit the page",href:"https://www.gravitas-dubai.com/"},{default:ue(()=>[l("img",{src:i.buildURL("dubai/Gravitas-Logo-Light.png")},null,8,H1)]),_:1}),_(a,{src:i.buildURL("dubai/eywa-2.webm"),alt:"Project Heimat"},null,8,["src"])]),_(f,{route:"/dubai"})])}const B1=se(x1,[["render",F1]]),D1={components:{"project-header":Ue,"styled-image":Ze,"project-arrows":Oe},methods:{buildURL(e){return ve(e)}}},q1={class:"responsive body1"},K1=l("h4",null,"TL;DR",-1),W1=l("p",null,"I helped to build a product that helps a NGO to organize their citizen councils. One of the big features was a feedback flow for citizens to respond to an invitation for a council and mention their needs.",-1),Z1=l("h4",null,"Problem statement",-1),G1=l("p",null,"Es geht los organizes citizen councils and has to manage all the candidates that they reached out to and their special needs (e.g. child care, mobility impairments). As there are many people involved it is hard to keep track of all the candidates without a proper tool. Our goal was to build such a tool to help them with keeping track of the candidates, perform statistically sound drawings, organize their agents and collect feedback from their candidates online.",-1),X1=l("h4",null,"Visual identity",-1),Q1=l("p",null,[W('I expanded the existing visual identity (called "Giulia") to address all the needs of a web application. I expanded the color palette, set up a system for typography based on their existing typefaces and created the first components (buttons, checkboxes, textfields). I tailored the system to the CSS framework '),l("a",{class:"link",href:"https://tailwindcss.com/"},"Tailwind"),W(" which we used in development.")],-1),Y1=l("h4",null,'Prototype "Feedback flow"',-1),J1=l("p",null,"In this click prototype (German only) you can see the screens that a candidate goes through after being chosen for a citizen council. The candidate can tick special needs, accept or decline the invitation and give feedback to Es geht los.",-1),ed=l("iframe",{style:{border:"1px solid rgba(0, 0, 0, 0.1)"},width:"500",height:"800",src:"https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Fproto%2FzGG70JdPaHszpgRP3uaXGb%2Fegl-portfolio%3Fnode-id%3D7%253A698%26viewport%3D241%252C48%252C0.11%26scaling%3Dscale-down%26page-id%3D0%253A1%26starting-point-node-id%3D7%253A698",allowfullscreen:""},null,-1),td=l("p",null,"Click on the grey background and then restart (R) to restart the prototype.",-1),nd=l("h4",null,"Clients",-1),sd=l("p",null,[l("a",{class:"link",href:"https://www.esgehtlos.org/"},"Es geht los"),W(' is a German NGO and non-partisan think & do tank by Demokratie Innovation e.V. for lot-based ("losbasiert") citizen participation. They organize citizen councils on a local, national level and for public institutions. '),l("a",{class:"link",href:"https://www.maibornwolff.de/"},"MaibornWolff"),W(" offers consulting and software engineering for ambitious IT projects. I was staffed as the UI Designer in a Digital Garage project by MaibornWolff for Demokartie Innovation e.V..")],-1);function od(e,t,n,s,o,i){const r=$("project-header"),a=$("styled-image"),c=$("project-arrows");return P(),U("div",null,[_(r,{route:"/esgehtlos"}),l("div",q1,[K1,W1,Z1,G1,X1,_(a,{src:i.buildURL("esgehtlos/colors.png"),alt:"Color palette. New colors are highlighted."},null,8,["src"]),Q1,_(a,{shadow:!1,src:i.buildURL("esgehtlos/typo.png"),alt:"Typography scale"},null,8,["src"]),_(a,{shadow:!1,src:i.buildURL("esgehtlos/components.png"),alt:"Components in different states"},null,8,["src"]),Y1,J1,ed,td,nd,sd]),_(c,{route:"/esgehtlos"})])}const id=se(D1,[["render",od]]),rd={components:{"project-header":Ue,"styled-image":Ze,"project-arrows":Oe},methods:{buildURL(e){return ve(e)}}},ad={id:"greenbox",class:"responsive"},ld=l("h4",null,"TL;DR",-1),cd=l("p",null,"As part of a university course a design team and a UX research team helped a startup to improve their gardening app. I contributed with planning, conducting and evaluating usability tests as part of the UX research team (3 persons in total).",-1),ud=l("h4",null,"Problem",-1),dd=l("p",null,[l("i",null,"Grüner Daumen"),W(' ("Green thumb") is an upcoming gardening app that is designed to inspire and support users with their plant care. The client had questions regarding the usability and design of their application:')],-1),hd=l("ul",null,[l("li",null,"Is the workflow in agreement with the users' expectations?"),l("li",null,"Does the app feel inutitive and easy to use?"),l("li",null,"Do users perceive the app as playful and yet legitimate?")],-1),fd=l("h4",null,"First usability test (my team)",-1),pd=l("p",null,"In a first usability test participants were introduced to the app with a scenario and asked to perform several tasks while thinking aloud. We recorded the participant's interactions with the application with a camera and evaluated them later. The participants answered two questionnaires (QUESI, meCUE) rating the intuitiveness and the overall impression of the product. Additionally, the team conducted a heuristic analysis (following Jakob Nielsen) to identify usability problems. The insights generated from these methods were condensed and forwarded to the design team.",-1),gd=l("h4",null,"Redesign (design team)",-1),md=l("p",null,"The design team used the collected insights from the testing and the heuristic analysis to produce a redesigned version of the app.",-1),_d=l("h4",null,"Second usability test (my team)",-1),vd=l("p",null,"In a second usability test the redesigned version was evaluated and the results compared to the results of the first version. The same methods were used as in the first usability test to allow for better comparison. Users experienced less problems with the redesigned version and rated it also higher on all scales of the questionnaires.",-1),bd=l("h4",null,"Reflection",-1),wd=l("p",null,"During this project I learnt a lot about the design, conduction and evaluation of usability tests. Experiencing that the insights generated through our group's work were of great use for the startup was a big motivational factor. The cooperation and communication between the design team, the UX research team and the startup was challenging, but rewarded us with different perspectives and insights in the process.",-1),yd=l("h4",null,"Testimonial (german)",-1),Cd=l("p",null,'"Wir entwickeln momentan eine Smartphone-App und haben uns bei UseTree beworben, weil wir die Abfolge von Bedienschritten für eine innovative Anwendung evaluieren lassen wollten. Daneben war es uns wichtig, herauszufinden, inwieweit wir die Balance zwischen einer spielerischen Bedienung und einem seriösen Design hinbekommen. Das Zusammenspiel von Arbeitspsychologen und Designern im sogenannten Staffellauf, bei dem beide Seiten abwechselnd dieselbe Fragestellung bearbeiten, haben wir als sehr bereichernd und konstruktiv empfunden. Durch die Teilnahme wurde unser Blick für Usability-Fragestellungen maßgeblich geschärft. Zudem haben wir Tools an die Hand bekommen, um diese Fragen zukünftig inhouse weiter bearbeiten zu können. Das Designteam begeisterte uns mit kreativen und hochwertigen Vorschlägen, die wir direkt in die Weiterentwicklung aufnehmen. Nicht zuletzt war ich von der engagierten und offenen Art von UseTree angetan und empfand die Zusammenarbeit als sehr inspierierend." - Gesche Heitmann (Gründerin)',-1);function Ad(e,t,n,s,o,i){const r=$("project-header"),a=$("styled-image"),c=$("project-arrows");return P(),U("div",null,[_(r,{route:"/greenbox"}),l("div",ad,[ld,cd,ud,_(a,{src:i.buildURL("greenbox/greenbox_v1.jpg"),alt:"First version of the gardening app"},null,8,["src"]),dd,hd,fd,_(a,{src:i.buildURL("greenbox/greenbox_app3.png"),alt:"Usability test with the gardening app"},null,8,["src"]),pd,gd,_(a,{src:i.buildURL("greenbox/greenbox_v2.jpg"),alt:"Redesigned version of the gardening app"},null,8,["src"]),md,_d,vd,bd,_(a,{src:i.buildURL("greenbox/greenbox_presentation.png"),alt:"Final presentation Greenbox"},null,8,["src"]),wd,yd,Cd]),_(c,{route:"/greenbox"})])}const xd=se(rd,[["render",Ad]]),kd={components:{"project-header":Ue,"styled-image":Ze,"project-arrows":Oe},methods:{buildURL(e){return ve(e)}}},Id={id:"knimehub",class:"responsive body1"},Ld=l("h4",null,"TL;DR",-1),jd=l("p",null,"I helped to build a website where data scientists can read up on existing functionality of the desktop application. This website also enables them to share and collaborate on data analysis projects.",-1),Rd=l("h4",null,"Introduction",-1),$d=l("p",null,'KNIME develops a data science software which lets users create data analysis workflows with small blocks called "nodes" in a graphical programming paradigm. The community is big and vibrant and we wanted to give users a platform where they can help each other out and work together on general purpose solutions for common data science problems (e.g. churn prediction, anomaly detection). As the UX Designer on the team I was given the task to create a first prototype for the information architecture and the interaction design.',-1),Sd=l("h4",null,"User and task analysis",-1),Md=l("p",null,"At first I wanted to find out users shared and collaborated with already existing tools. I interviewed 9 internal data scientists on their usage of similar products. I was especially interested in how they make their own work understandable to others and what helps them to understand other people's work (e.g. text descriptions, screenshots, oral explanations, visual cues).",-1),Pd=l("p",null,"From this research I identified challenges that were only poorly addressed by existing solutions. For example, a big challenge for users was the first time they try to use a new node. Sometimes the user did not know what the node could do, sometimes they were not sure how to set it up and sometimes they tried it out and it did not work the way they expected it to.",-1),Ed=l("p",null,"With these challenges in mind we decided on what user stories to focus and defined the most important features for the KNIME Hub:",-1),Td=l("ul",null,[l("li",null,"Search for nodes: Users can search for nodes and determine if they are a good fit for their data science problem."),l("li",null,"Search for workflow: Users can search for example workflows that explain a specific data science problem."),l("li",null,"Install nodes: When users have found the right node, they can install it easily by drag-n-dropping it into the desktop application."),l("li",null,"Link nodes/workflows: Users can share links of node and workflow pages to provide other users with a nice way of referencing functionality in the desktop application.")],-1),Ud=l("h4",null,"Screen design",-1),Od=l("p",null,"In this phase I ranked the content in importance and separated it onto different screens. I drew inspiration from online-communities where users share their content with others (node-red, chefkoch, youtube, soundcloud).",-1),zd=l("p",null,"I created four pages: A landing page with search, a search results page, a page for nodes and one for workflows. I created links between the pages which should help the users to find what they need.",-1),Vd=l("p",null,"The first version of the wireframes were discussed in the team and additional content was added. In a second iteration I aimed for higher fidelity in the wireframes and focused more on the layout of the pages. This second version was used for communication to internal stakeholders.",-1),Nd=l("h4",null,"Final visual design and building",-1),Hd=l("p",null,"The final visual design was done by an external designer. I supported the development team during the building process and contributed by taking over small frontend tasks.",-1),Fd=l("h4",null,"Launch",-1),Bd=l("p",null,"The KNIME Hub was released and opened to the public during the KNIME Summit in March 2019. Since then it has received great interest and a growing community of active users. From March until October I assisted in the further development of features such as a deeper integration to the desktop application.",-1),Dd=l("p",null,[W("Check it out at "),l("a",{class:"link",href:"https://hub.knime.com"},"hub.knime.com"),W(".")],-1);function qd(e,t,n,s,o,i){const r=$("project-header"),a=$("styled-image"),c=$("project-arrows");return P(),U("div",null,[_(r,{route:"/knimehub"}),l("div",Id,[Ld,jd,Rd,$d,Sd,Md,_(a,{src:i.buildURL("knimehub/quotes.png"),alt:"Quotes from the interviews",shadow:!1},null,8,["src"]),Pd,_(a,{src:i.buildURL("knimehub/node-issues.png"),alt:"User challenges with nodes",shadow:!1},null,8,["src"]),Ed,Td,Ud,Od,_(a,{src:i.buildURL("knimehub/communities.png"),alt:"Node-RED: a similar online community"},null,8,["src"]),zd,_(a,{src:i.buildURL("knimehub/wireframes-rough.png"),alt:"First wireframes"},null,8,["src"]),Vd,_(a,{src:i.buildURL("knimehub/wireframes-refined.png"),alt:"Second, more refined wireframes"},null,8,["src"]),Nd,Hd,Fd,Bd,Dd,_(a,{src:i.buildURL("knimehub/screens-11-19.png"),alt:"Screens of the application as of Nov. 19"},null,8,["src"])]),_(c,{route:"/knimehub"})])}const Kd=se(kd,[["render",qd]]),Wd={props:{text:{type:String,required:!0},type:{type:String,required:!0}}};function Zd(e,t,n,s,o,i){return P(),U("div",{class:"tag button",style:ln({backgroundColor:n.type==="primary"?"var(--blue-300)":"var(--dark-200)"})},ne(n.text),5)}const Gd=se(Wd,[["render",Zd],["__scopeId","data-v-b0191d4a"]]),Xd={components:{Tag:Gd},props:{projProps:{type:Object,required:!0}},methods:{buildURL(e){return ve(e)}}},Qd={class:"img-container"},Yd=["src","alt"],Jd={class:"text"},eh={class:"h5 regular"},th={class:"tags"};function nh(e,t,n,s,o,i){const r=$("Tag"),a=$("router-link");return P(),rn(a,{class:"tile",to:n.projProps.route},{default:ue(()=>[l("div",Qd,[l("img",{src:i.buildURL(n.projProps.image.src),alt:n.projProps.image.alt},null,8,Yd)]),l("div",Jd,[l("div",eh,ne(n.projProps.slogan),1),l("div",th,[_(r,{text:n.projProps.task,type:"primary"},null,8,["text"]),_(r,{text:n.projProps.industry,type:"secondary"},null,8,["text"])])])]),_:1},8,["to"])}const sh=se(Xd,[["render",nh],["__scopeId","data-v-d679ffa7"]]),oh=[{image:"viraj.jpeg",name:"Viraj T.",position:"Founder & CTO",company:"LineTweet",text:"Johannes was a key contributor to the success of our product at LineTweet. His expertise in UX/UI design significantly improved the user experience, particularly with features like the NDL settings. He was dependable and communicated clearly, making collaboration easy. When challenges arose, Johannes handled them with flexibility and a solutions-oriented approach. His work had a measurable impact, streamlining processes and enhancing our rollout. I highly recommend Johannes and would gladly work with him again."}],ih={components:{Button:un,SendIcon:Di},methods:{buildURL(e){return ve(e)}}},nr=e=>(Ke("data-v-29f0a935"),e=e(),We(),e),rh={class:"responsive"},ah={class:"text"},lh=nr(()=>l("div",{class:"h2"},"Clear requirements, smooth delivery.",-1)),ch=nr(()=>l("div",{class:"body1"},"I am a freelance UX & Product Consultant helping teams with requirements engineering and UX design. Contact me for freelance roles or coaching.",-1)),uh={class:"buttons"},dh=["src"];function hh(e,t,n,s,o,i){const r=$("SendIcon"),a=$("Button");return P(),U("div",rh,[l("div",ah,[lh,ch,l("div",uh,[_(a,{type:"primary",bg:"light",size:"lg",text:"Send me an email",href:"mailto:hello@johannesschweig.de"},{default:ue(()=>[_(r)]),_:1}),_(a,{type:"secondary",bg:"light",size:"lg",text:"LinkedIn",href:"https://linkedin.com/in/jschweig"})])]),l("img",{src:i.buildURL("landingpage/portrait.png")},null,8,dh)])}const fh=se(ih,[["render",hh],["__scopeId","data-v-29f0a935"]]),ph={xmlns:"http://www.w3.org/2000/svg",width:"128",height:"97"},gh=l("path",{d:"m127.347 84.233-8.824-8.824a2.305 2.305 0 0 0-3.909 1.623v2.103h-11.795a51 51 0 0 1-16.733 12.938c-.342.16-.685.32-1.028.457h29.556v2.126a2.32 2.32 0 0 0 1.425 2.087 2.31 2.31 0 0 0 2.484-.464l8.824-8.823a2.314 2.314 0 0 0 0-3.223M47.25 74.563a32.96 32.96 0 0 1-16.23-28.39c.943-38.63 54.127-45.328 64.827-8.55l2.926-2.925a7.02 7.02 0 0 1 8.101-1.153 7 7 0 0 1 2.231 1.838c-13.77-52.821-90.079-44.266-91.48 10.79a45.67 45.67 0 0 0 9.737 28.39z"},null,-1),mh=l("path",{d:"M110.157 50.653c1.464-.025 3.757.366 4.389-1.417a2.31 2.31 0 0 0-.503-2.492c-2.109-2.13-6.694-6.635-8.824-8.8a2.32 2.32 0 0 0-3.223 0l-1.12 1.12c-1.92 1.905-5.8 5.772-7.703 7.68a2.31 2.31 0 0 0 1.623 3.909h1.897a33.04 33.04 0 0 1-32.688 28.482H2.285A2.293 2.293 0 0 0 0 81.42v8.823a2.293 2.293 0 0 0 2.286 2.286h61.718a46.58 46.58 0 0 0 46.153-41.877"},null,-1),_h=[gh,mh];function vh(e,t){return P(),U("svg",ph,[..._h])}const bh={render:vh},wh={xmlns:"http://www.w3.org/2000/svg",width:"125",height:"128"},yh=l("path",{d:"M39.482 12.56c0 6.614-9.92 6.614-9.92 0 0-6.61 9.92-6.61 9.92 0"},null,-1),Ch=l("path",{d:"M110.4 60.045c-6.594 0-12.163 4.545-13.683 10.694l-4.24-.695c.39-1.965.61-3.99.61-6.04 0-10.278-5.04-19.392-12.798-25.017l7.284-9.2a11.3 11.3 0 0 0 5.1 1.245c6.149 0 11.139-4.984 11.139-11.138 0-6.15-4.985-11.14-11.14-11.14-6.149 0-11.138 4.985-11.138 11.14 0 3.104 1.274 5.929 3.35 7.949l-7.395 9.334a30.75 30.75 0 0 0-15.209-4.015 30.5 30.5 0 0 0-15.154 3.99l-3.794-6.484c.61-.39 1.22-.805 1.774-1.275a16.59 16.59 0 0 0 6.04-12.8C51.146 7.45 43.69 0 34.552 0 25.408.01 17.93 7.464 17.93 16.604c0 4.96 2.19 9.64 6.04 12.799a16.64 16.64 0 0 0 10.554 3.795c1.994 0 3.934-.36 5.789-1.055l3.99 6.814c-6.815 4.905-11.554 12.494-12.634 21.194L16.6 57.686c0-4.1-3.35-7.425-7.455-7.425-4.1 0-7.454 3.35-7.454 7.455 0 4.1 3.35 7.454 7.454 7.454 2.965 0 5.515-1.72 6.73-4.24l15.568 2.55v.525c0 7.84 2.965 15.294 8.23 20.974l-5.985 7.564c-3.575-3.16-8.284-5.1-13.41-5.1C9.086 87.444 0 96.529 0 107.723c0 6.07 2.685 11.774 7.37 15.653 3.629 2.99 8.199 4.625 12.908 4.625 4.71 0 9.28-1.635 12.91-4.625a20.28 20.28 0 0 0 7.369-15.653c0-4.849-1.72-9.279-4.545-12.769l6.07-7.644c.194.165.39.33.58.5a30.88 30.88 0 0 0 19.613 7.034c4.544 0 9.004-1.025 13.074-2.91l4.044 6.9c-2.964 2.325-4.874 5.929-4.874 9.999 0 7.01 5.704 12.689 12.689 12.689 6.98 0 12.689-5.704 12.689-12.689 0-6.979-5.705-12.689-12.69-12.689-1.774 0-3.434.36-4.959 1.025l-3.96-6.79a33 33 0 0 0 3.63-2.574c4.655-3.85 8.034-8.894 9.78-14.52l4.654.75v.14c0 4.24 1.885 8.2 5.124 10.89a14.12 14.12 0 0 0 8.975 3.215c3.269 0 6.454-1.135 8.974-3.215 3.269-2.685 5.124-6.675 5.124-10.89 0-7.784-6.344-14.128-14.128-14.128zm-78.453 59.95c-1.36-5.209-6.094-9.059-11.719-9.059s-10.36 3.85-11.719 9.059c-3.35-3.184-5.234-7.589-5.234-12.274 0-9.364 7.619-16.953 16.953-16.953 4.35 0 8.34 1.66 11.36 4.375.414.36.804.775 1.189 1.19a16.823 16.823 0 0 1 4.43 11.383 16.96 16.96 0 0 1-5.235 12.274zm86.128-38.202a8.06 8.06 0 0 0-7.645-5.46 8.06 8.06 0 0 0-7.644 5.46 10.83 10.83 0 0 1-3.13-7.62c0-5.954 4.85-10.803 10.804-10.803s10.804 4.85 10.804 10.804c0 2.88-1.135 5.594-3.129 7.59zm-38.312 3.465c-.995.83-2.08 1.58-3.185 2.27-.47.274-.94.554-1.44.83-.5.25-.995.5-1.495.72a27.7 27.7 0 0 1-11.384 2.464 27.63 27.63 0 0 1-17.509-6.29q-.294-.246-.58-.5c0-.054.03-.14.055-.194a18.93 18.93 0 0 1 8.2-10.334 18.9 18.9 0 0 1 9.834-2.745c.36 0 .72 0 1.08.03.694.03 1.384.11 2.08.22.75.11 1.494.305 2.214.5 6.04 1.775 10.834 6.51 12.714 12.524q-.294.246-.58.5zm7.424 14.213c5.18 0 9.364 4.21 9.364 9.364s-4.21 9.364-9.364 9.364-9.364-4.209-9.364-9.364a9.34 9.34 0 0 1 3.24-7.094c.414-.36.884-.695 1.36-.97.47-.275.97-.525 1.494-.72a9.2 9.2 0 0 1 3.27-.58M9.119 61.845a4.14 4.14 0 0 1-4.13-4.13 4.14 4.14 0 0 1 4.13-4.13 4.14 4.14 0 0 1 4.13 4.13 4.14 4.14 0 0 1-4.13 4.13m25.403-58.51c7.314 0 13.269 5.954 13.269 13.268 0 3.575-1.44 6.98-3.96 9.474a9.691 9.691 0 0 0-18.559 0 13.2 13.2 0 0 1-3.99-9.474c0-7.314 5.955-13.269 13.27-13.269zM52.25 57.66c0-1.36.275-2.63.75-3.825.25-.61.555-1.19.915-1.72.33-.5.695-.97 1.11-1.385 1.83-1.885 4.374-3.075 7.204-3.075 2.05 0 3.99.635 5.57 1.69.47.305.885.665 1.3 1.055s.775.805 1.134 1.275a9.96 9.96 0 0 1 1.995 5.985c0 3.49-1.8 6.564-4.514 8.364-.83.525-1.72.97-2.685 1.245l-.33-.055.085.11c-.555.14-1.165.25-1.745.305-.25 0-.5.03-.775.03-.39 0-.805 0-1.19-.085a9.8 9.8 0 0 1-2.825-.775 9.5 9.5 0 0 1-1.494-.805l-.195-.14c-.39-.275-.775-.58-1.11-.885a10 10 0 0 1-1.055-1.135 10 10 0 0 1-2.135-6.18zm31.332 16.397c.305-.635.58-1.3.805-1.965.195-.524.36-1.054.525-1.604.14-.525.275-1.08.39-1.605.33-1.605.5-3.215.5-4.875 0-2.77-.47-5.514-1.44-8.09-.25-.634.11-1.359.75-1.604.635-.25 1.36.085 1.604.75a25.9 25.9 0 0 1 1.58 8.95c0 1.8-.165 3.544-.525 5.289-.11.555-.25 1.08-.39 1.605-.14.555-.305 1.08-.5 1.605a30 30 0 0 1-1.055 2.604c-.22.445-.664.72-1.134.72-.165 0-.36-.03-.525-.11a1.24 1.24 0 0 1-.58-1.66zm9.059-61.999c4.32 0 7.814 3.52 7.814 7.815 0 4.294-3.52 7.814-7.814 7.814-1.055 0-2.05-.22-2.99-.58a8.3 8.3 0 0 1-1.47-.805 7.8 7.8 0 0 1-1.245-1.08 7.78 7.78 0 0 1-2.104-5.32c0-4.319 3.52-7.814 7.814-7.814z"},null,-1),Ah=l("path",{d:"M110.401 66.69a4.14 4.14 0 0 0-4.13 4.13 4.14 4.14 0 0 0 4.13 4.13 4.14 4.14 0 0 0 4.129-4.13 4.14 4.14 0 0 0-4.129-4.13M20.228 96.503c-3.41 0-6.18 2.77-6.18 6.179s2.77 6.18 6.18 6.18 6.18-2.77 6.18-6.18-2.77-6.18-6.18-6.18"},null,-1),xh=[yh,Ch,Ah];function kh(e,t){return P(),U("svg",wh,[...xh])}const Ih={render:kh},Lh={xmlns:"http://www.w3.org/2000/svg",width:"128",height:"123"},jh=l("path",{d:"m49.204 10.996-22.59-7.997q.9 2.4 1.2 5.997c.6 11.795-6.398 29.588-15.594 34.985l22.79 7.997c7.397-6.397 15.993-30.187 14.194-40.982"},null,-1),Rh=l("path",{d:"m39.009 53.777 2.999 1c1.199-6.398 6.797-11.195 13.394-11.195 7.597 0 13.794 6.197 13.794 13.594 0 2.199-.6 4.398-1.6 6.397h.4c8.597 1.8 18.593-18.992 18.193-32.186-.2-4.798-1.8-8.197-4.598-8.996l-28.188-9.796c.8 11.595-6.797 32.986-14.394 41.182M125.572 49.579h-.2l-15.594-5.398v-.4c-.2-4.797-2.199-6.397-3.398-6.996 0 0-.2 0-.2-.2l-15.993-5.598v.4c.4 10.195-4.598 23.39-10.796 30.787l15.993 5.597c2.6.8 5.598-1.6 7.397-3.598l15.594 5.397c5.997 2.4 13.594-16.792 7.197-19.991M21.016 24.39C24.615 14.194 25.015 2.6 19.017.6c-.6-.2-1.2-.2-1.8-.2C11.42.4 5.424 9.596 2.625 17.993.824 23.19-.175 28.388.025 32.585c.2 4.798 1.8 8.197 4.598 9.196.6.2 1.2.2 1.8.2 5.797 0 11.595-9.196 14.593-17.592M6.023 37.984c-.8-.2-1.8-1.8-2-5.398-.2-3.798.6-8.396 2.4-13.194C9.82 9.596 15.019 4.398 17.418 4.398h.4c2.199.8 2.998 8.597-.4 18.792-3.799 10.196-9.396 15.594-11.395 14.794M27.214 120.149c-.4 1 0 2.199 1 2.599.999.4 2.198 0 2.598-1L52.003 70.57c-1.4-.4-2.599-.8-3.599-1.6zM53.403 70.97v41.782c0 1 1 1.999 1.999 1.999 1.2 0 1.999-.999 1.999-1.999V70.97c-1 .2-2.599.2-3.998 0M62.599 68.97c-1.2.8-2.4 1.2-3.599 1.6l20.991 50.978c.4 1 1.6 1.6 2.6 1 .999-.4 1.599-1.599.999-2.599z"},null,-1),$h=l("path",{d:"M55.401 47.58c-5.397 0-9.796 4.398-9.796 9.596 0 5.398 4.399 9.796 9.796 9.796 5.398 0 9.796-4.398 9.796-9.796 0-5.198-4.398-9.596-9.796-9.596"},null,-1),Sh=[jh,Rh,$h];function Mh(e,t){return P(),U("svg",Lh,[...Sh])}const Ph={render:Mh},Eh={components:{AgileIcon:bh,TeamsIcon:Ih,TelescopeIcon:Ph},methods:{buildURL(e){return ve(e)}}},Dt=e=>(Ke("data-v-fa8148d2"),e=e(),We(),e),Th={class:"wrapper"},Uh={class:"responsive"},Oh={class:"grid"},zh={class:"tile"},Vh=Dt(()=>l("div",{class:"h5"},"Agile Excellence",-1)),Nh=Dt(()=>l("div",{class:"body1"},"In software projects, uncertainty is inevitable, and priorities often shift. It's the ability to adapt to these changes that makes good products great.",-1)),Hh={class:"tile"},Fh=Dt(()=>l("div",{class:"h5"},"Empowered Teams",-1)),Bh=Dt(()=>l("div",{class:"body1"},"Collaboration between business and development is essential to crafting software that not only adds value but is also technologically feasible.",-1)),Dh={class:"tile"},qh=Dt(()=>l("div",{class:"h5"},"Strong product vision",-1)),Kh=Dt(()=>l("div",{class:"body1"},"Software excels when it focuses on doing one thing exceptionally well. A strong product vision prioritizes excellence over unnecessary complexities.",-1));function Wh(e,t,n,s,o,i){const r=$("AgileIcon"),a=$("TeamsIcon"),c=$("TelescopeIcon");return P(),U("div",Th,[l("div",Uh,[l("div",Oh,[l("div",zh,[_(r),Vh,Nh]),l("div",Hh,[_(a),Fh,Bh]),l("div",Dh,[_(c),qh,Kh])])])])}const Zh=se(Eh,[["render",Wh],["__scopeId","data-v-fa8148d2"]]),Gh={props:{testimonialProps:{type:Object,required:!0}},methods:{buildURL(e){return ve(e)}}},Xh={class:"tile",href:"https://www.linetweet.com/"},Qh={class:"text"},Yh={class:"person"},Jh=["src","alt"],ef={class:"identity"},tf={class:"name"},nf={class:"position"};function sf(e,t,n,s,o,i){return P(),U("a",Xh,[l("div",Qh,ne(n.testimonialProps.text),1),l("div",Yh,[l("img",{src:i.buildURL(`landingpage/${n.testimonialProps.image}`),alt:n.testimonialProps.name},null,8,Jh),l("div",ef,[l("div",tf,ne(n.testimonialProps.name),1),l("div",nf,ne(n.testimonialProps.position)+" @ "+ne(n.testimonialProps.company),1)])])])}const of=se(Gh,[["render",sf],["__scopeId","data-v-73787f0d"]]),rf={components:{Believes:Zh,ProjectPreview:sh,Testimonial:of,WelcomeBanner:fh},data(){return{projectsClicked:0}},computed:{routes(){return this.projectsClicked>2?Kn:ot},testimonials(){return oh}},methods:{clickProjects(){this.projectsClicked++}}},af=e=>(Ke("data-v-1a8cc63f"),e=e(),We(),e),lf={id:"projects",class:"responsive"},cf={class:"grid"},uf=af(()=>l("h4",null,"What my clients say",-1)),df={class:"grid"};function hf(e,t,n,s,o,i){const r=$("WelcomeBanner"),a=$("Believes"),c=$("ProjectPreview"),f=$("Testimonial");return P(),U("div",null,[_(r),_(a),l("div",lf,[l("h4",{onClick:t[0]||(t[0]=h=>i.clickProjects())},ne(o.projectsClicked>2?"All ":"")+" Projects ",1),l("div",cf,[(P(!0),U(ce,null,ft(i.routes,h=>(P(),rn(c,{key:h.id,projProps:h},null,8,["projProps"]))),128))]),uf,l("div",df,[(P(!0),U(ce,null,ft(i.testimonials,h=>(P(),rn(f,{testimonialProps:h},null,8,["testimonialProps"]))),256))])])])}const ff=se(rf,[["render",hf],["__scopeId","data-v-1a8cc63f"]]),pf={data(){return{sources:[{title:"artist",author:"Gregor Cresnar",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/term/artist/368426"},{title:"phoenix",author:"Design Rails",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/term/phoenix/85573"},{title:"QueryBuilder",author:"jQuery",platform:"",licenseName:"MIT License",licenseLink:"https://opensource.org/licenses/MIT",sourceLink:"https://querybuilder.js.org/"},{title:"think",author:"Gregor Cresnar",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/grega.cresnar/collection/users-vol-1/?i=541709"},{title:"Happy news",author:"Katerina Limpitsouni",platform:"unDraw",licenseName:"open-source license",licenseLink:"https://undraw.co/license",sourceLink:"https://undraw.co/search"},{title:"Feeling blue",author:"Katerina Limpitsouni",platform:"unDraw",licenseName:"open-source license",licenseLink:"https://undraw.co/license",sourceLink:"https://undraw.co/search"},{title:"Ideas",author:"Katerina Limpitsouni",platform:"unDraw",licenseName:"open-source license",licenseLink:"https://undraw.co/license",sourceLink:"https://undraw.co/search"},{title:"Lottie Completed Animation",author:"Bhola Record",platform:"lottiefiles",licenseName:"Lottie Simple License",licenseLink:"https://lottiefiles.com/page/license",sourceLink:"https://lottiefiles.com/70295-lottie-completed-animation"},{title:"Agile",author:"muhamad afiffudin",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/browse/icons/term/agile/"},{title:"Network",author:"Saeful Gokil",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/browse/icons/term/network/"},{title:"Telescope",author:"ProSymbols",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/browse/icons/term/telescope/"},{title:"Send",author:"Christine Chapman",platform:"The Noun Project",licenseName:"Creative Commons-BY 3.0",licenseLink:"https://creativecommons.org/licenses/by/3.0/",sourceLink:"https://thenounproject.com/icon/send-6776899/"}]}}},dn=e=>(Ke("data-v-bf488d2e"),e=e(),We(),e),gf={id:"content",class:"responsive body2"},mf=Ft('
Legal Disclosure

Johannes Schweig

Flemingstr 6, 10557 Berlin

VAT No.: DE363289149

Telephone: 030/60269851

E-Mail: hello@johannesschweig.de

Internetadresse: www.johannesschweig.de

Person responsible for content

Johannes Schweig

Flemingstr 6, 10557 Berlin

Indication of source for images and graphics
',11),_f=["href"],vf=["href"],bf=Ft('
Disclaimer

Accountability for content: The contents of our pages have been created with the utmost care. However, we cannot guarantee the contents' accuracy, completeness or topicality. According to statutory provisions, we are furthermore responsible for our own content on these web pages. In this context, please note that we are accordingly not obliged to monitor merely the transmitted or saved information of third parties, or investigate circumstances pointing to illegal activity. Our obligations to remove or block the use of information under generally applicable laws remain unaffected by this as per §§ 8 to 10 of the Telemedia Act (TMG).

Accountability for links: Responsibility for the content of external links (to web pages of third parties) lies solely with the operators of the linked pages. No violations were evident to us at the time of linking. Should any legal infringement become known to us, we will remove the respective link immediately.

Copyright: Our web pages and their contents are subject to German copyright law. Unless expressly permitted by law (§ 44a et seq. of the copyright law), every form of utilizing, reproducing or processing works subject to copyright protection on our web pages requires the prior consent of the respective owner of the rights. Individual reproductions of a work are allowed only for private use, so must not serve either directly or indirectly for earnings. Unauthorized utilization of copyrighted works is punishable (§ 106 of the copyright law).

Quelle: http://www.muster-vorlagen.net

Impressum

Johannes Schweig

Flemingstr 6, 10557 Berlin

USt - IdNr: DE363289149

Telefon: 030/60269851

E-Mail: hello@johannesschweig.de

Internetadresse: www.johannesschweig.de

Verantwortlich für den Inhalt

Johannes Schweig

Flemingstr 6, 10557 Berlin

Quellenangaben für die verwendeten Bilder und Grafiken
',16),wf=["href"],yf=["href"],Cf=dn(()=>l("h6",null,"Haftungsausschluss",-1)),Af=dn(()=>l("p",null,[l("i",null,"Haftung für Inhalte: "),W("Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.")],-1)),xf=dn(()=>l("p",null,[l("i",null,"Haftung für Links: "),W("Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.")],-1)),kf=dn(()=>l("p",null,[l("i",null,"Urheberrecht: "),W("Die durch die Seitenbetreiber erstellten bzw. verwendeten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.")],-1)),If=dn(()=>l("p",null,[l("i",null,"Quelle: "),l("a",{class:"link",href:"http://www.muster-vorlagen.net"},"http://www.muster-vorlagen.net")],-1));function Lf(e,t,n,s,o,i){return P(),U("div",gf,[mf,l("ul",null,[(P(!0),U(ce,null,ft(o.sources,r=>(P(),U("li",{key:r.title},[W(ne(r.title)+" by "+ne(r.author)+" from "+ne(r.platform)+", license: ",1),l("a",{class:"link",href:r.licenseLink},ne(r.licenseName),9,_f),W(", source: "),l("a",{class:"link",href:r.sourceLink},"link",8,vf)]))),128))]),bf,l("ul",null,[(P(!0),U(ce,null,ft(o.sources,r=>(P(),U("li",{key:r.title},[W(ne(r.title)+" von "+ne(r.author)+" von "+ne(r.platform)+", Lizenz: ",1),l("a",{class:"link",href:r.licenseLink},ne(r.licenseName),9,wf),W(", Quelle: "),l("a",{class:"link",href:r.sourceLink},"Link",8,yf)]))),128))]),Cf,Af,xf,kf,If])}const jf=se(pf,[["render",Lf],["__scopeId","data-v-bf488d2e"]]),Rf={components:{"project-header":Ue,"styled-image":Ze,"project-arrows":Oe},methods:{buildURL(e){return ve(e)}}},$f={class:"responsive"},Sf=l("h4",null,"TL;DR",-1),Mf=l("p",null,"During my work for UseTree we tested the usability of an application with maintenance workers. The aim of the application is to allow for easy and sustainable transfer of knowledge.",-1),Pf=l("h4",null,"Origin",-1),Ef=l("p",null,"Our client developed an app that should help mechanics with the repair of subway engines. Mechanics can view different material (photo, video,...) on the repair procedure of an engine and even record video themselves. The leading question was if the application provided substantial help for the work of the mechanics.",-1),Tf=l("h4",null,"Field usability test",-1),Uf=l("p",null,"During a field test at a repair shop I conducted testings with two mechanics each lasting one hour. The test included a exploration phase of the application and an interview afterwards. The test focused on the future use case of the application and was aimed to generate insights into the work processes and the integration of the application in these processes. It was set in a challenging environment: Limited time of the worker, loud noises in the repair shop, sparse familiarity with usability testing of the worker.",-1),Of=l("h4",null,"Lab usability test",-1),zf=l("p",null,"An additional test in a usability lab focused on the usability aspects of the application. Four students participated in this study.",-1),Vf=l("h4",null,"Evaluation",-1),Nf=l("p",null,"The client was involved in all stages of test conduction and evaluation. This imparted basic usability competencies to the client and was aimed to integrate user-centered design in the client's workflow. The evaluation of the two tests generated valuable insights for the future development of the application. Several problems were identified regarding the integration of the app at the workplace and new ideas could be collected on how to achieve such an integration in a sustainable manner. The usability test unveiled room for improvement of the ease of use.",-1),Hf=l("h4",null,"Reflection",-1),Ff=l("p",null,"I carried out a majority of the field test planning and was the on-site examiner. Thus, I learnt a lot about the internal work processes of the mechanics in the repair shop. This project enhanced my knowledge of usability test design as the field test was set in a challenging environment. Finally, I learnt how to condense knowledge about the work situation, context of use and the functionality of the application to create a vision of a use case of maximum benefit.",-1),Bf=l("h4",null,"Testimonial (german)",-1),Df=l("p",null,'"Mit Hilfe von UseTree konnten wir das Usability-Konzept unserer Anwendung erfolgreich überprüfen und optimieren. UseTree lieferte wertvolle Hinweise und Verbesserungsansätze und überzeugte uns durch eine professionelle Arbeitsweise und ein hohes Maß an Kreativität. Wir können UseTree als Dienstleister uneingeschränkt weiterempfehlen und freuen uns auf künftige gemeinsame Projekte." - André Fiedler (Projektleiter)',-1);function qf(e,t,n,s,o,i){const r=$("project-header"),a=$("styled-image"),c=$("project-arrows");return P(),U("div",null,[_(r,{route:"/mechanics"}),l("div",$f,[Sf,Mf,_(a,{src:i.buildURL("mechanics/mechanics_app.png"),alt:"Tablet with app and engine"},null,8,["src"]),Pf,Ef,_(a,{src:i.buildURL("mechanics/mechanics_interview.png"),alt:"On-the-job interview with mechanic"},null,8,["src"]),Tf,Uf,Of,zf,_(a,{src:i.buildURL("mechanics/workflow.png"),alt:"Diagram of the application's workflow"},null,8,["src"]),Vf,Nf,Hf,Ff,Bf,Df]),_(c,{route:"/mechanics"})])}const Kf=se(Rf,[["render",qf]]),Wf={},sr=e=>(Ke("data-v-f2755a3c"),e=e(),We(),e),Zf={id:"PageNotFound",class:"responsive"},Gf=sr(()=>l("h1",null,"404",-1)),Xf=sr(()=>l("p",null,"This page could not be found.",-1));function Qf(e,t){const n=$("router-link");return P(),U("div",Zf,[Gf,Xf,_(n,{to:"/"},{default:ue(()=>[W("Back to Homepage")]),_:1})])}const Yf=se(Wf,[["render",Qf],["__scopeId","data-v-f2755a3c"]]),Jf={data(){return{project:{route:"/phoenix"}}},components:{"project-header":Ue,"styled-image":Ze,"project-arrows":Oe},methods:{buildURL(e){return ve(e)}}},ep={class:"responsive"},tp=Ft("

TL;DR

In my free time I programmed a music player and expanded on it over the years. I learnt a lot about User-Centered Design, software engineering and making use of stackoverflow.

Problem

I was faced with the challenge of still having a lot of mp3s lying around but no suitable software to play and manage them. As streaming services such as Spotify take over traditional music players have shifted their focus (iTunes) or were abandoned all together (Winamp). So I decided to built a desktop music player suited for my own needs.

Research

I tried to specify the context of use and the requirements for the music playing application. I identified the following:

  • Continuous background playback via a suggestion system (similar to YouTube's AutoPlay)
  • A fast search for titles, artists, albums
  • Good performance at low resource consumption

After that, I studied competing products: iTunes, Winamp, MediaMonkey and Windows Media Player. In what way did they fulfill their goals? What are their shortcomings? All of these applications provide a lot of functionality (playlists, file management, tag writing, equalizer and additional settings) and the user is generally expected to actively cue in his/her songs (except Genius-playlists by iTunes). A lot of space in the user interfaces of these applications is taken up by toolbars, menus, cover previews and large context menus. Also, old UI concepts are still in use such as the tree view navigation. Colors and style are mainly aimed to transport the corporate identity of the manufacturing company (WMP by windows, iTunes by apple).

Prototyping

",9),np=l("p",null,"I transitioned from a low fidelity prototype on paper to a photoshop mockup to a fully-functioning Java prototype.",-1),sp=l("h4",null,"Evaluation",-1),op=l("p",null,"During the use of the application I documented design flaws, bugs and possible improvements. These were then incorporated in the next version of the application. This iterative process of use and improvement led to a constant development cycle. At first, I made changes and added functionality in rapid succession, but often realized in hindsight that the change did not integrate very well with the rest of the application or provided too little value compard to its development costs. Later in the project I spend more time elaborating on possible features which made my work more sustainable and time-efficient.",-1),ip=l("p",null,"Five key questions followed me during that process:",-1),rp=l("ul",null,[l("li",null,"How do I provide a visual design that is consistent in colors, icons, animations, hover/interaction effects, element sizes, state of ui elements and affordances?"),l("li",null,"What is the 'product identity' (aka corporate indentity) of Phoenix?"),l("li",null,"How do I provide meaningfull and appropriate (error) feedback?"),l("li",null,"What are the needs of the user and what implications do they have on the functionality of the software?"),l("li",null,"How do I identify core use cases and choose the suitable interaction paradigm (e.g. search, buttons)?")],-1),ap=l("h4",null,"Design features",-1),lp=Ft('

Apart from the common media control I implemented three core design features:

  1. Auto-Dj: This functionality uses mp3 tag information to generate music suggestions (similar to populat AutoPlay functionalities in YouTube or Souncloud). It provides three modes of operation which start up once the user reaches the end of the tracklist.
    • Random track: Adds an unknown track that is similar to the last one.
    • Random favourite track: Adds a favourite track of the user that is similar to the last one.
    • Random track from album or artist: Adds a track from the same artist or album like the previous track.
  2. Overlay with information about current track: Shows a short overlay containing information about the currently played track in the top right corner. As the overlay appears on top of all other windows this functionality is well suited to check back on your music while having it play in the background.
  3. Search: A SQL backend allowed for very fast and compley queries even with large music databases and made the search lightning fast.

Reflection

During the iterations of implementation-testing I learnt how to get more efficient in my own workflow and how to counterbalance design and functionality. The experience from my university courses and the job at UseTree about usability, UX and user-centered design guided me through this process. Furthermore, I learnt how to prioritze features and implement only the ones that were important, sustainable and time-efficient. Apart from that my software development skills improved dramatically as I got more proficient in the Java language, the JavaFX frontend framework, SQL and different libraries.

View project on GitHub

Successor: PhoenixJS

',6),cp=l("p",null,"In the course of the project I often felt restrained by the limited capabilites of the JavaFX frontend framework. Also, even though I tried, I could never really separate functionality in Model-View-Controller resulting in a messy code base. And in the end I needed a good reason to learn JavaScript, so I decided to rewrite the application with React and Redux. I used nedb for the database part and deployed the whole application as a cross-platfrom compatible electron app.",-1),up=l("p",null,[l("a",{class:"link",href:"https://github.com/johannesschweig/PhoenixJS"},"View PhoenixJS on GitHub")],-1);function dp(e,t,n,s,o,i){const r=$("project-header"),a=$("styled-image"),c=$("project-arrows");return P(),U("div",null,[_(r,{route:"/phoenix"}),l("div",ep,[tp,_(a,{src:i.buildURL("phoenix/paper_prototype.jpg"),alt:"UI concept on paper"},null,8,["src"]),np,_(a,{src:i.buildURL("phoenix/mockup_ps.jpg"),alt:"Photoshop mockup of the application"},null,8,["src"]),sp,op,_(a,{src:i.buildURL("phoenix/shuffle_tooltip.png"),alt:"Left: Mouseover effects of the shuffle button: none, hover, active; Right: Photoshop mockup of the application"},null,8,["src"]),ip,rp,ap,_(a,{src:i.buildURL("phoenix/coverflow.mp4"),alt:"Coverflow animation when changing tracks"},null,8,["src"]),lp,_(a,{src:i.buildURL("phoenix/wireframe_ps_js.png"),alt:"Wireframe of the Javascript application"},null,8,["src"]),cp,up]),_(c,{route:"/phoenix"})])}const hp=se(Jf,[["render",dp]]),fp={components:{"project-header":Ue,"styled-image":Ze,"project-arrows":Oe},methods:{buildURL(e){return ve(e)}}},pp={class:"responsive"},gp=l("h4",null,"TL;DR",-1),mp=l("p",null,"I helped to build a functionality which lets users filter their data based on multiple, nested criteria.",-1),_p=l("h4",null,"Problem",-1),vp=l("p",null,"During my time at KNIME I was asked to create an interface for a node (KNIME term for encapsulated functionality) where users can filter their data based on multiple rules (e.g. filter out all rows in the data where the year column is smaller than 2016).",-1),bp=l("p",null,"The existing solution only supported one rule and the aim was to extend the functionality, so it could also work with multiple rules and it should be possible to nest rules (e.g. [condition A AND condition B] OR condition C). Users would not have to worry anymore about writing their queries in SQL because they could comfortably build them in a UI. This has several advantages:",-1),wp=l("ul",null,[l("li",null,"Avoiding typos by using dropdowns and other UI components"),l("li",null,"Faster rule generation with suggestions (e.g. possible values of columns)"),l("li",null,"Better understanding through hierarchical display of rules (if you have once tried to make sense of another person's excel formulas, you know what I mean)")],-1),yp=l("h4",null,"Research",-1),Cp=l("p",null,"I researched about how others have tried to solve this problem and found a number of different user interfaces. Some of them represented their rules as a graph, some of them as a nested list. And they also differed in how they made the actions such as creating or deleting rules available to the user.",-1),Ap=l("h4",null,"Ideation",-1),xp=l("p",null,"Then I proceeded to explore the problem space with sketches. This brought up questions such as:",-1),kp=l("ul",null,[l("li",null,"How many different combinations of nested rules could there be? (A lot)"),l("li",null,"How do you present the rules to the user? Inline forms / Graph preview / treeview preview? (see image below)"),l("li",null,"Do you connect items in a group with an AND/OR or do you set it to the top of the group?")],-1),Ip=l("p",null,"Trying to answer those questions helped to find possible solutions, narrowed the problem space, but also improved my understanding of the domain (Querying a database).",-1),Lp=l("h4",null,"Variations",-1),jp=l("p",null,"I came up with a variation where the rules were laid out top to bottom, groups were indicated by different colored rectangles and you could edit the rules right in place (see inline form in image above). It quickly came apparent that this solution would fit for easy queries with few rules and few nesting levels, but not for very complex queries. Then I designed a version where you would have a preview section on one side and an edit section on the other. This would allow for easier layouting as you would only have to display the currently selected rule. All other rules were displayed with a small label. The display of the preview varied: vertical graph, horizontal graph or treeview.",-1),Rp=l("h4",null,"Testing",-1),$p=l("p",null,'I created a small paper protoype and showed it to different colleagues. During the test the colleague had to press the buttons on the paper and I would (as responsively as I could) "slide in" the new UI elements ("Wizard of Oz prototyping"). After testing we decided that the AND/OR of groups should be positioned on top of them and not between the rules as our participants prefered by this. .',-1),Sp=l("p",null,"In the end we decided for the treeview as it was easier to implement as the other concepts, was recognized as a familiar component by the users and also showed good results in user interaction.",-1);function Mp(e,t,n,s,o,i){const r=$("project-header"),a=$("styled-image"),c=$("project-arrows");return P(),U("div",null,[_(r,{route:"/querybuilder"}),l("div",pp,[gp,mp,_p,_(a,{src:i.buildURL("querybuilder/sql.png"),alt:"The beauty of SQL"},null,8,["src"]),vp,bp,wp,yp,_(a,{src:i.buildURL("querybuilder/querybuilders.png"),alt:"Querybuilders by jQuery (left) and Microsoft Outlook (right)"},null,8,["src"]),Cp,Ap,xp,kp,Ip,Lp,_(a,{src:i.buildURL("querybuilder/variations.png"),alt:"Variations of rule representations: vertical graph, treeview, inline form, horizontal graph"},null,8,["src"]),jp,Rp,_(a,{src:i.buildURL("querybuilder/concept.png"),alt:"Final UI concept"},null,8,["src"]),$p,Sp,_(a,{src:i.buildURL("querybuilder/row-filter.png"),alt:"User interface as of KNIME Analytics Platform v3.7.1"},null,8,["src"])]),_(c,{route:"/querybuilder"})])}const Pp=se(fp,[["render",Mp]]),Ep={components:{"project-header":Ue,"styled-image":Ze,"project-arrows":Oe},methods:{buildURL(e){return ve(e)}}},Tp={class:"responsive body1"},Up=l("h4",null,"TL;DR",-1),Op=l("p",null,"I led a discovery project aiming to improve a core functionality in a web application. I interviewed customers and internal stakeholders. As a result a couple of smaller fixes and a big feature were developed.",-1),zp=l("h4",null,"Problem statement",-1),Vp=l("p",null,[l("a",{class:"link",href:"https://www.valsight.com/"},"Valsight"),W(" offers a financial planning solution for big companies. One of the core features is the “scenario manager” where you can create and modify assumptions (+10% more sales next year) and add them to scenarios (best case). Historically grown, it was very complex to understand and use. My task was to talk to users and figure out a way to make it easier to understand and better to use.")],-1),Np=l("p",null,"The initial timeline for the project was set to 3 weeks. I proposed a project plan with three phases starting with a research phase, then an ideation/creation phase and finally a validation phase. In the end we wanted to have wireframes that we could create stories for and make part of a sprint. In the following, I will focus on the way I conducted the customer interviews and condensed the findings.",-1),Hp=Ft('

Research

Customer interviews

I prepared a semi-structured interview with around 10 questions asking about

  • The current usage of the scenario manager
  • What worked well and what did not
  • What information was important to them and what not
  • How they worked with the scenario manager
  • Who worked with it the most and how they collaborated as a team

I skipped questions that were not applicable for the participant or asked again if there was a chance to gain more insights by diving deeper into a topic.

We managed to recruit customers from four companies and I talked to three internal consultants. The interviews were audio recorded and transcribed later.

Condense findings

I printed out the interview protocols on paper and cut them into small snips of a few sentences each. Then I started a data wall where I grouped snips to broader topics. After that I removed smaller topics to focus on the big topics that started to emerge.

',8),Fp=l("h4",null,"Ideation/Creation",-1),Bp=l("h5",null,"Present findings",-1),Dp=l("p",null,"I presented these topics to my product manager and we decided which topics we would prioritize for now.",-1),qp=l("h4",null,"Development",-1),Kp=l("p",null,"A couple of smaller features were developed right after concluding the validation with customers. A search functionality was added to the scenario manager to find items in the list faster. Also, a couple of visual tweaks were made to the scenario manager and a convenient keyboard shortcut for faster navigation was introduced.",-1),Wp=l("p",null,"We had a bigger feature idea about grouping similar assumptions together and making it easier to switch between them. This idea was further iterated and refined until it was ready to be developed and shipped.",-1),Zp=l("h4",null,"Learnings",-1),Gp=l("p",null,"In hindsight, I was proud and amazed at how often I would come back to my findings for related topics or just look at the written protocols if I vaguely remembered somebody having said something similar in one of the interviews. A powerful quote from a user really sticks in your head!",-1),Xp=l("p",null,"I also enjoyed passing back the positive feedback from the interviews to the developers. They certainly deserved it.",-1),Qp=l("p",null,"The project also inspired lots of people involved in building the product and served as a source of feature ideas for the future.",-1),Yp=l("p",null,"On the other hand, the problem statement could have been clearer. The broad scope of it allowed for a lot of valuable exploration to happen, but it also felt like it was not worth the effort at times. Changing something is very hard if it has been at the core of an application for many years. Usually, there are good reasons why it is the way it is and users are not happy to have their workflow changed.",-1);function Jp(e,t,n,s,o,i){const r=$("project-header"),a=$("styled-image"),c=$("project-arrows");return P(),U("div",null,[_(r,{route:"/scenariomanager"}),l("div",Tp,[Up,Op,zp,Vp,Np,_(a,{src:i.buildURL("scenariomanager/project-plan.png"),alt:"Plan for the project"},null,8,["src"]),Hp,_(a,{src:i.buildURL("scenariomanager/snip-gif.mp4"),alt:"Data wall with snips moving into bigger topics"},null,8,["src"]),Fp,Bp,Dp,_(a,{src:i.buildURL("scenariomanager/mass-ass-slide.jpg"),alt:"Mass of assumptions was one bigger topic"},null,8,["src"]),qp,Kp,Wp,_(a,{src:i.buildURL("scenariomanager/variants.jpg"),alt:'Assumptions are grouped using "variants"'},null,8,["src"]),Zp,Gp,Xp,Qp,Yp]),_(c,{route:"/scenariomanager"})])}const e3=se(Ep,[["render",Jp]]),t3={components:{"project-header":Ue,"styled-image":Ze,"project-arrows":Oe},methods:{buildURL(e){return ve(e)}}},Re=e=>(Ke("data-v-b94896ed"),e=e(),We(),e),n3={class:"responsive"},s3=Re(()=>l("h2",null,"TL;DR",-1)),o3=Re(()=>l("p",null,"In my master thesis I examined the effects of wearing eyeglasses on eye tracking. I used methods from statistics and machine learning to correct for eyeglass-induced errors.",-1)),i3=Re(()=>l("h2",null,"Background",-1)),r3=Re(()=>l("p",null,[W("Eye tracking is a useful method which is not only used in research and interactive systems but also in future technologies such as the "),l("a",{target:"_blank",href:"https://techcrunch.com/2016/12/28/the-eye-tribe-oculus/"},"foveated rendering for VR"),W(". Modern eye trackers use a combination of the pupil position and an infrared reflection to infer the point of gaze. Corrective eyeglasses, however, pose a challenge for the eyetracking system. They alter the image of the eye, thus causing errors in the eyetracking signal. These errors are related to the refractive strength of the eyeglasses. In my thesis, I tried to build a classification model that takes eye tracking data as input in order to output the refractive strength of the current user. On the basis of this classification, an error correction is applied that corrects the eye tracking data dependening on the refractive strength.")],-1)),a3=Re(()=>l("h2",null,"Data collection",-1)),l3=Re(()=>l("p",null,"I collected data using a head model with artificial eyes and different pairs of eyeglasses on various positions of the screen. Two datasets were obtained; one for training and testing the models and one dataset for validation. The validation dataset contained a portion of new data. Its aim was to assess how well the models could generalize on new data.",-1)),c3=Re(()=>l("h2",null,"Classification",-1)),u3=Re(()=>l("p",null,"I employed several popular machine learning algorithms (KNN, SVM, MLP,...) to build classification models. These models were adjusted on the data (hyperparameters) in a grid search paradigm with a 10-fold cross-validation. The final models were evaluated on training, test and validation set. The Multi-layer perceptron model (MLP) showed the highest performance with a fscore of .99 on the test set and a fscore of .73 on the validation set.",-1)),d3=Re(()=>l("h2",null,"Error correction",-1)),h3=Re(()=>l("p",null,"I built several models following a weighted-average and a regression approach. The weighted-average model was able to reduce the error by about 50% on the training and test set. The regression model reduced the error by about 25%. Both models performed equally on the validation set with a reduction of 45% in X direction and 10% in Y direction.",-1)),f3=Re(()=>l("h2",null,"Reflection",-1)),p3=Re(()=>l("p",null,"My thesis was the first major research project that I conducted from start to finish. I recognized the vitality of an early distinct and definite definition of the task. I learned a lot about the practical application of machine learning on real data and how to deal with problems of data quality like missing and noisy data. I learnt how to make reasonable deductions from preliminary work and how to support my own claims. Lastly, I learnt how to interpret results in the presence of ambiguity and uncertainty and how huge the effort is in order to make small progress in research.",-1)),g3=["href"],m3=["src"];function _3(e,t,n,s,o,i){const r=$("project-header"),a=$("styled-image"),c=$("project-arrows");return P(),U("div",null,[_(r,{route:"/thesis"}),l("div",n3,[s3,o3,_(a,{src:i.buildURL("thesis/foveated-rendering.png"),alt:"Foveated rendering in a VR game"},null,8,["src"]),i3,r3,a3,l3,_(a,{src:i.buildURL("thesis/data-coll.png"),alt:"Collected eye tracking data"},null,8,["src"]),c3,u3,_(a,{src:i.buildURL("thesis/gnb.png"),alt:"Confusion matrix of a trained model"},null,8,["src"]),d3,h3,_(a,{src:i.buildURL("thesis/regX.png"),alt:"3D Scatterplot with a regression plane for the X offset"},null,8,["src"]),f3,p3,l("a",{id:"download",target:"_blank",href:i.buildURL("thesis/thesis.pdf")},[l("img",{src:i.buildURL("thesis/download.png"),width:"32"},null,8,m3),W(" Download the pdf here ")],8,g3)]),_(c,{route:"/thesis"})])}const v3=se(t3,[["render",_3],["__scopeId","data-v-b94896ed"]]),b3={data(){return{project:{route:"/phoenix"}}},components:{"project-header":Ue,"project-arrows":Oe,Button:un},methods:{buildURL(e){return ve(e)}}},w3={class:"responsive"},y3=l("h4",null,"TL;DR",-1),C3=l("p",null,"I was the project lead for a big car rental company building a system that automatically processed traffic tickets.",-1),A3=l("p",null,[W("The nature of this work is confidential. "),l("a",{class:"link",href:"mailto:hello@johannesschweig.de"},"Contact me "),W("for the password.")],-1);function x3(e,t,n,s,o,i){const r=$("project-header"),a=$("Button"),c=$("project-arrows");return P(),U("div",null,[_(r,{route:"/trafficticket"}),l("div",w3,[y3,C3,A3,_(a,{type:"primary",bg:"light",size:"sm",text:"Download the PDF",href:i.buildURL("trafficticket/trafficticket.pdf")},null,8,["href"])]),_(c,{route:"/trafficticket"})])}const k3=se(b3,[["render",x3]]),I3=o2({history:wc("/"),routes:[{path:"/",component:ff},{path:"/about",component:Eu},{path:"/codesnippets",component:A1},{path:"/dubai",component:B1},{path:"/esgehtlos",component:id},{path:"/greenbox",component:xd},{path:"/knimehub",component:Kd},{path:"/legal",component:jf},{path:"/mechanics",component:Kf},{path:"/phoenix",component:hp},{path:"/querybuilder",component:Pp},{path:"/scenariomanager",component:e3},{path:"/thesis",component:v3},{path:"/trafficticket",component:k3},{path:"/:pathMatch(.*)",name:"bad-not-found",component:Yf}],scrollBehavior(e,t,n){return{top:0}}}),Fs=bl(nc);Fs.use(xl());Fs.use(I3);Fs.mount("#app"); diff --git a/assets/viraj-zDO__Xrj.jpeg b/assets/viraj-zDO__Xrj.jpeg new file mode 100644 index 0000000..e4a550a Binary files /dev/null and b/assets/viraj-zDO__Xrj.jpeg differ diff --git a/index.html b/index.html index 2c2907b..b31e4c8 100644 --- a/index.html +++ b/index.html @@ -15,8 +15,8 @@ - - + +