') alpha no-repeat center / auto var(--framer-icon-mask-mode, add),var(--framer-icon-mask, none);aspect-ratio:1;background-color:var(--szd5nr);mask:url('data:image/svg+xml, ') alpha no-repeat center / auto var(--framer-icon-mask-mode, add),var(--framer-icon-mask, none);width:24px}.framer-PVRom.framer-12cgc6y,.framer-PVRom .framer-12cgc6y{display:block}.framer-PVRom.framer-1080l77{align-content:center;align-items:center;cursor:pointer;display:flex;flex-direction:column;flex-wrap:nowrap;gap:10px;height:250px;justify-content:center;overflow:hidden;padding:25px 10px;position:relative;text-decoration:none;width:300px;will-change:var(--framer-will-change-override, transform)}.framer-PVRom .framer-9c3sax{align-content:center;align-items:center;display:flex;flex:none;flex-direction:column;flex-wrap:nowrap;gap:10px;height:min-content;justify-content:center;overflow:visible;padding:0;position:relative;width:100%}.framer-PVRom .framer-qf5hoh-container{flex:none;height:32px;position:relative;width:32px}.framer-PVRom .framer-j2cvj4{flex:none;height:85px;overflow:hidden;position:relative;white-space:pre-wrap;width:100%;word-break:break-word;word-wrap:break-word}.framer-PVRom .framer-i10jpk{flex:none;height:auto;overflow:hidden;position:relative;white-space:pre-wrap;width:100%;word-break:break-word;word-wrap:break-word}.framer-PVRom .framer-1lycqpw{flex:none;height:24px;position:relative;white-space:pre;width:auto}@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)){.framer-PVRom.framer-1080l77,.framer-PVRom .framer-9c3sax{gap:0px}.framer-PVRom.framer-1080l77>*,.framer-PVRom .framer-9c3sax>*{margin:5px 0}.framer-PVRom.framer-1080l77>:first-child,.framer-PVRom .framer-9c3sax>:first-child{margin-top:0}.framer-PVRom.framer-1080l77>:last-child,.framer-PVRom .framer-9c3sax>:last-child{margin-bottom:0}}.framer-PVRom.framer-v-1fi0k7t.framer-1080l77{cursor:unset}.framer-PVRom[data-border=true]:after,.framer-PVRom [data-border=true]:after{content:"";border-width:var(--border-top-width, 0) var(--border-right-width, 0) var(--border-bottom-width, 0) var(--border-left-width, 0);border-color:var(--border-color, none);border-style:var(--border-style, none);width:100%;height:100%;position:absolute;box-sizing:border-box;left:0;top:0;border-radius:inherit;pointer-events:none}.framer-yhD2L.framer-wum9ne,.framer-yhD2L .framer-wum9ne{display:block}.framer-yhD2L.framer-16sdbie{align-content:center;align-items:center;cursor:pointer;display:flex;flex-direction:row;flex-wrap:nowrap;gap:8px;height:min-content;justify-content:flex-start;overflow:hidden;padding:12px;position:relative;width:min-content}.framer-yhD2L .framer-1wtumkp-container{aspect-ratio:1 / 1;flex:none;height:var(--framer-aspect-ratio-supported, 43px);position:relative;width:40px}.framer-yhD2L .framer-oyam37{align-content:flex-start;align-items:flex-start;display:flex;flex:none;flex-direction:column;flex-wrap:nowrap;gap:0px;height:min-content;justify-content:center;overflow:visible;padding:0;position:relative;width:min-content}.framer-yhD2L .framer-1v9wkaw,.framer-yhD2L .framer-qg4p77{flex:none;height:auto;position:relative;white-space:pre;width:auto}@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)){.framer-yhD2L.framer-16sdbie,.framer-yhD2L .framer-oyam37{gap:0px}.framer-yhD2L.framer-16sdbie>*{margin:0 4px}.framer-yhD2L.framer-16sdbie>:first-child{margin-left:0}.framer-yhD2L.framer-16sdbie>:last-child{margin-right:0}.framer-yhD2L .framer-oyam37>*{margin:0}.framer-yhD2L .framer-oyam37>:first-child{margin-top:0}.framer-yhD2L .framer-oyam37>:last-child{margin-bottom:0}}.framer-yhD2L[data-border=true]:after,.framer-yhD2L [data-border=true]:after{content:"";border-width:var(--border-top-width, 0) var(--border-right-width, 0) var(--border-bottom-width, 0) var(--border-left-width, 0);border-color:var(--border-color, none);border-style:var(--border-style, none);width:100%;height:100%;position:absolute;box-sizing:border-box;left:0;top:0;border-radius:inherit;pointer-events:none}.framer-cb .sp-pre-placeholder{padding:var(--cb-padding)!important;margin:0!important;width:max-content}.framer-cb .cm-scroller{display:unset!important;padding:0!important}.framer-cb .cm-content{padding:var(--cb-padding)!important;width:max-content}.framer-cb .sp-wrapper{color-scheme:var(--cb-color-scheme, inherit)}@media screen and (max-width: 768px){@supports (-webkit-overflow-scrolling: touch){.cb-code-editor .cm-content.cm-readonly,.cb-code-editor .sp-pre-placeholder{font-size:var(--sp-font-size, inherit);-webkit-text-size-adjust:100%}}}@media screen and (max-width: 768px){.framer-cb .sp-editor-viewer.sp-stack{height:100%}}.framer-cb{--cb-colors-surface1: var(--cb-colors-surface1-light);--cb-colors-surface2: var(--cb-colors-surface2-light);--cb-colors-surface3: var(--cb-colors-surface3-light);--cb-colors-disabled: var(--cb-colors-disabled-light);--cb-colors-base: var(--cb-colors-base-light);--cb-colors-clickable: var(--cb-colors-clickable-light);--cb-colors-hover: var(--cb-colors-hover-light);--cb-colors-accent: var(--cb-colors-accent-light);--cb-colors-error: var(--cb-colors-error-light);--cb-colors-errorSurface: var(--cb-colors-errorSurface-light);--cb-colors-warning: var(--cb-colors-warning-light);--cb-colors-warningSurface: var(--cb-colors-warningSurface-light);--cb-syntax-color-plain: var(--cb-syntax-color-plain-light);--cb-syntax-color-comment: var(--cb-syntax-color-comment-light);--cb-syntax-color-keyword: var(--cb-syntax-color-keyword-light);--cb-syntax-color-definition: var(--cb-syntax-color-definition-light);--cb-syntax-color-punctuation: var(--cb-syntax-color-punctuation-light);--cb-syntax-color-property: var(--cb-syntax-color-property-light);--cb-syntax-color-tag: var(--cb-syntax-color-tag-light);--cb-syntax-color-static: var(--cb-syntax-color-static-light);--cb-syntax-color-string: var(--cb-syntax-color-string-light);--cb-syntax-fontStyle-plain: var(--cb-syntax-fontStyle-plain-light);--cb-syntax-fontStyle-comment: var(--cb-syntax-fontStyle-comment-light);--cb-syntax-fontStyle-keyword: var(--cb-syntax-fontStyle-keyword-light);--cb-syntax-fontStyle-definition: var(--cb-syntax-fontStyle-definition-light);--cb-syntax-fontStyle-punctuation: var(--cb-syntax-fontStyle-punctuation-light);--cb-syntax-fontStyle-property: var(--cb-syntax-fontStyle-property-light);--cb-syntax-fontStyle-tag: var(--cb-syntax-fontStyle-tag-light);--cb-syntax-fontStyle-static: var(--cb-syntax-fontStyle-static-light);--cb-syntax-fontStyle-string: var(--cb-syntax-fontStyle-string-light);--cb-color-scheme: var(--cb-color-scheme-light)}body[data-framer-theme=dark] .framer-cb{--cb-colors-surface1: var(--cb-colors-surface1-dark);--cb-colors-surface2: var(--cb-colors-surface2-dark);--cb-colors-surface3: var(--cb-colors-surface3-dark);--cb-colors-disabled: var(--cb-colors-disabled-dark);--cb-colors-base: var(--cb-colors-base-dark);--cb-colors-clickable: var(--cb-colors-clickable-dark);--cb-colors-hover: var(--cb-colors-hover-dark);--cb-colors-accent: var(--cb-colors-accent-dark);--cb-colors-error: var(--cb-colors-error-dark);--cb-colors-errorSurface: var(--cb-colors-errorSurface-dark);--cb-colors-warning: var(--cb-colors-warning-dark);--cb-colors-warningSurface: var(--cb-colors-warningSurface-dark);--cb-syntax-color-plain: var(--cb-syntax-color-plain-dark);--cb-syntax-color-comment: var(--cb-syntax-color-comment-dark);--cb-syntax-color-keyword: var(--cb-syntax-color-keyword-dark);--cb-syntax-color-definition: var(--cb-syntax-color-definition-dark);--cb-syntax-color-punctuation: var(--cb-syntax-color-punctuation-dark);--cb-syntax-color-property: var(--cb-syntax-color-property-dark);--cb-syntax-color-tag: var(--cb-syntax-color-tag-dark);--cb-syntax-color-static: var(--cb-syntax-color-static-dark);--cb-syntax-color-string: var(--cb-syntax-color-string-dark);--cb-syntax-fontStyle-plain: var(--cb-syntax-fontStyle-plain-dark);--cb-syntax-fontStyle-comment: var(--cb-syntax-fontStyle-comment-dark);--cb-syntax-fontStyle-keyword: var(--cb-syntax-fontStyle-keyword-dark);--cb-syntax-fontStyle-definition: var(--cb-syntax-fontStyle-definition-dark);--cb-syntax-fontStyle-punctuation: var(--cb-syntax-fontStyle-punctuation-dark);--cb-syntax-fontStyle-property: var(--cb-syntax-fontStyle-property-dark);--cb-syntax-fontStyle-tag: var(--cb-syntax-fontStyle-tag-dark);--cb-syntax-fontStyle-static: var(--cb-syntax-fontStyle-static-dark);--cb-syntax-fontStyle-string: var(--cb-syntax-fontStyle-string-dark);--cb-color-scheme: var(--cb-color-scheme-dark)}@media (prefers-color-scheme: dark){body:not([data-framer-theme]) .framer-cb{--cb-colors-surface1: var(--cb-colors-surface1-dark);--cb-colors-surface2: var(--cb-colors-surface2-dark);--cb-colors-surface3: var(--cb-colors-surface3-dark);--cb-colors-disabled: var(--cb-colors-disabled-dark);--cb-colors-base: var(--cb-colors-base-dark);--cb-colors-clickable: var(--cb-colors-clickable-dark);--cb-colors-hover: var(--cb-colors-hover-dark);--cb-colors-accent: var(--cb-colors-accent-dark);--cb-colors-error: var(--cb-colors-error-dark);--cb-colors-errorSurface: var(--cb-colors-errorSurface-dark);--cb-colors-warning: var(--cb-colors-warning-dark);--cb-colors-warningSurface: var(--cb-colors-warningSurface-dark);--cb-syntax-color-plain: var(--cb-syntax-color-plain-dark);--cb-syntax-color-comment: var(--cb-syntax-color-comment-dark);--cb-syntax-color-keyword: var(--cb-syntax-color-keyword-dark);--cb-syntax-color-definition: var(--cb-syntax-color-definition-dark);--cb-syntax-color-punctuation: var(--cb-syntax-color-punctuation-dark);--cb-syntax-color-property: var(--cb-syntax-color-property-dark);--cb-syntax-color-tag: var(--cb-syntax-color-tag-dark);--cb-syntax-color-static: var(--cb-syntax-color-static-dark);--cb-syntax-color-string: var(--cb-syntax-color-string-dark);--cb-syntax-fontStyle-plain: var(--cb-syntax-fontStyle-plain-dark);--cb-syntax-fontStyle-comment: var(--cb-syntax-fontStyle-comment-dark);--cb-syntax-fontStyle-keyword: var(--cb-syntax-fontStyle-keyword-dark);--cb-syntax-fontStyle-definition: var(--cb-syntax-fontStyle-definition-dark);--cb-syntax-fontStyle-punctuation: var(--cb-syntax-fontStyle-punctuation-dark);--cb-syntax-fontStyle-property: var(--cb-syntax-fontStyle-property-dark);--cb-syntax-fontStyle-tag: var(--cb-syntax-fontStyle-tag-dark);--cb-syntax-fontStyle-static: var(--cb-syntax-fontStyle-static-dark);--cb-syntax-fontStyle-string: var(--cb-syntax-fontStyle-string-dark);--cb-color-scheme: var(--cb-color-scheme-dark)}}--sxs{--sxs:0 sp-907984276 sp-573219155}@media{.sp-907984276{--sp-space-1:4px;--sp-space-2:8px;--sp-space-3:12px;--sp-space-4:16px;--sp-space-5:20px;--sp-space-6:24px;--sp-space-7:28px;--sp-space-8:32px;--sp-space-9:36px;--sp-space-10:40px;--sp-space-11:44px;--sp-border-radius:4px;--sp-layout-height:300px;--sp-layout-headerHeight:40px;--sp-transitions-default:.15s ease;--sp-zIndices-base:1;--sp-zIndices-overlay:2;--sp-zIndices-top:3;--sp-colors-surface1:var(--cb-colors-surface1);--sp-colors-surface2:var(--cb-colors-surface2);--sp-colors-surface3:var(--cb-colors-surface3);--sp-colors-disabled:var(--cb-colors-disabled);--sp-colors-base:var(--cb-colors-base);--sp-colors-clickable:var(--cb-colors-clickable);--sp-colors-hover:var(--cb-colors-hover);--sp-colors-accent:var(--cb-colors-accent);--sp-colors-error:var(--cb-colors-error);--sp-colors-errorSurface:var(--cb-colors-errorSurface);--sp-colors-warning:var(--cb-colors-warning);--sp-colors-warningSurface:var(--cb-colors-warningSurface);--sp-font-body:sans-serif;--sp-font-mono:"DM Mono", monospace;--sp-font-size:14px;--sp-font-lineHeight:1.5em;--sp-syntax-color-plain:var(--cb-syntax-color-plain);--sp-syntax-fontStyle-plain:var(--cb-syntax-fontStyle-plain);--sp-syntax-fontWeight-plain:400;--sp-syntax-color-comment:var(--cb-syntax-color-comment);--sp-syntax-fontStyle-comment:var(--cb-syntax-fontStyle-comment);--sp-syntax-fontWeight-comment:400;--sp-syntax-color-keyword:var(--cb-syntax-color-keyword);--sp-syntax-fontStyle-keyword:var(--cb-syntax-fontStyle-keyword);--sp-syntax-fontWeight-keyword:400;--sp-syntax-color-tag:var(--cb-syntax-color-tag);--sp-syntax-fontStyle-tag:var(--cb-syntax-fontStyle-tag);--sp-syntax-fontWeight-tag:400;--sp-syntax-color-punctuation:var(--cb-syntax-color-punctuation);--sp-syntax-fontStyle-punctuation:var(--cb-syntax-fontStyle-punctuation);--sp-syntax-fontWeight-punctuation:400;--sp-syntax-color-definition:var(--cb-syntax-color-definition);--sp-syntax-fontStyle-definition:var(--cb-syntax-fontStyle-definition);--sp-syntax-fontWeight-definition:400;--sp-syntax-color-property:var(--cb-syntax-color-property);--sp-syntax-fontStyle-property:var(--cb-syntax-fontStyle-property);--sp-syntax-fontWeight-property:400;--sp-syntax-color-static:var(--cb-syntax-color-static);--sp-syntax-fontStyle-static:var(--cb-syntax-fontStyle-static);--sp-syntax-fontWeight-static:400;--sp-syntax-color-string:var(--cb-syntax-color-string);--sp-syntax-fontStyle-string:var(--cb-syntax-fontStyle-string);--sp-syntax-fontWeight-string:400}.sp-573219155{--sp-space-1:4px;--sp-space-2:8px;--sp-space-3:12px;--sp-space-4:16px;--sp-space-5:20px;--sp-space-6:24px;--sp-space-7:28px;--sp-space-8:32px;--sp-space-9:36px;--sp-space-10:40px;--sp-space-11:44px;--sp-border-radius:4px;--sp-layout-height:300px;--sp-layout-headerHeight:40px;--sp-transitions-default:.15s ease;--sp-zIndices-base:1;--sp-zIndices-overlay:2;--sp-zIndices-top:3;--sp-colors-surface1:var(--cb-colors-surface1);--sp-colors-surface2:var(--cb-colors-surface2);--sp-colors-surface3:var(--cb-colors-surface3);--sp-colors-disabled:var(--cb-colors-disabled);--sp-colors-base:var(--cb-colors-base);--sp-colors-clickable:var(--cb-colors-clickable);--sp-colors-hover:var(--cb-colors-hover);--sp-colors-accent:var(--cb-colors-accent);--sp-colors-error:var(--cb-colors-error);--sp-colors-errorSurface:var(--cb-colors-errorSurface);--sp-colors-warning:var(--cb-colors-warning);--sp-colors-warningSurface:var(--cb-colors-warningSurface);--sp-font-body:sans-serif;--sp-font-mono:"Fragment Mono", monospace;--sp-font-size:14px;--sp-font-lineHeight:1.5em;--sp-syntax-color-plain:var(--cb-syntax-color-plain);--sp-syntax-fontStyle-plain:var(--cb-syntax-fontStyle-plain);--sp-syntax-fontWeight-plain:400;--sp-syntax-color-comment:var(--cb-syntax-color-comment);--sp-syntax-fontStyle-comment:var(--cb-syntax-fontStyle-comment);--sp-syntax-fontWeight-comment:400;--sp-syntax-color-keyword:var(--cb-syntax-color-keyword);--sp-syntax-fontStyle-keyword:var(--cb-syntax-fontStyle-keyword);--sp-syntax-fontWeight-keyword:400;--sp-syntax-color-tag:var(--cb-syntax-color-tag);--sp-syntax-fontStyle-tag:var(--cb-syntax-fontStyle-tag);--sp-syntax-fontWeight-tag:400;--sp-syntax-color-punctuation:var(--cb-syntax-color-punctuation);--sp-syntax-fontStyle-punctuation:var(--cb-syntax-fontStyle-punctuation);--sp-syntax-fontWeight-punctuation:400;--sp-syntax-color-definition:var(--cb-syntax-color-definition);--sp-syntax-fontStyle-definition:var(--cb-syntax-fontStyle-definition);--sp-syntax-fontWeight-definition:400;--sp-syntax-color-property:var(--cb-syntax-color-property);--sp-syntax-fontStyle-property:var(--cb-syntax-fontStyle-property);--sp-syntax-fontWeight-property:400;--sp-syntax-color-static:var(--cb-syntax-color-static);--sp-syntax-fontStyle-static:var(--cb-syntax-fontStyle-static);--sp-syntax-fontWeight-static:400;--sp-syntax-color-string:var(--cb-syntax-color-string);--sp-syntax-fontStyle-string:var(--cb-syntax-fontStyle-string);--sp-syntax-fontWeight-string:400}}--sxs{--sxs:1 sp-k-eyOShd sp-k-iOHdLQ}@media{@keyframes sp-k-eyOShd{0%{opacity:0}to{opacity:1}}@keyframes sp-k-iOHdLQ{0%{transform:rotateX(-25.5deg) rotateY(45deg)}to{transform:rotateX(-25.5deg) rotateY(405deg)}}}--sxs{--sxs:2 sp-c-gMfcns sp-c-bxeRRt sp-c-hfoyCM sp-c-fWymNx sp-c-euXojQ sp-c-bpmgvy sp-c-PJLV sp-c-fVPbOs sp-c-ikJbEZ sp-c-gtcpyq sp-c-jOWzsE sp-c-jkvvao}@media{.sp-c-gMfcns svg{margin:auto}.sp-c-bxeRRt{-webkit-appearance:none;appearance:none;outline:none;display:flex;align-items:center;font-size:inherit;font-family:inherit;background-color:transparent;transition:color var(--sp-transitions-default),background var(--sp-transitions-default);cursor:pointer;color:var(--sp-colors-clickable);border:0;text-decoration:none}.sp-c-bxeRRt:disabled{color:var(--sp-colors-disabled)}.sp-c-bxeRRt:hover:not(:disabled,[data-active=true]){color:var(--sp-colors-hover)}.sp-c-bxeRRt[data-active=true]{color:var(--sp-colors-accent)}.sp-c-bxeRRt svg{min-width:var(--sp-space-4);width:var(--sp-space-4);height:var(--sp-space-4)}.sp-c-bxeRRt.sp-c-gMfcns{padding:var(--sp-space-1);height:var(--sp-space-7);display:flex}.sp-c-bxeRRt.sp-c-gMfcns.sp-c-bxeRRt:not(:has(span)){width:var(--sp-space-7)}.sp-c-bxeRRt.sp-c-gMfcns.sp-c-bxeRRt:has(svg+span){padding-right:var(--sp-space-3);padding-left:var(--sp-space-2);gap:var(--sp-space-1)}.sp-c-hfoyCM{padding:0 var(--sp-space-1) 0 var(--sp-space-1);border-radius:var(--sp-border-radius);margin-left:var(--sp-space-1);width:var(--sp-space-5);visibility:hidden}.sp-c-hfoyCM svg{width:var(--sp-space-3);height:var(--sp-space-3);display:block;position:relative;top:1px}.sp-c-fWymNx{margin:0;display:block;font-family:var(--sp-font-mono);font-size:var(--sp-font-size);color:var(--sp-syntax-color-plain);line-height:var(--sp-font-lineHeight)}.sp-c-euXojQ{display:flex;flex-direction:column;width:100%;position:relative;background-color:var(--sp-colors-surface1);gap:1px}.sp-c-euXojQ:has(.sp-stack){background-color:var(--sp-colors-surface2)}.sp-c-bpmgvy{transform:translate(-4px,9px) scale(.13)}.sp-c-bpmgvy *{position:absolute;width:96px;height:96px}.sp-c-fVPbOs{all:initial;font-size:var(--sp-font-size);font-family:var(--sp-font-body);display:block;box-sizing:border-box;text-rendering:optimizeLegibility;-webkit-tap-highlight-color:transparent;-webkit-font-smoothing:subpixel-antialiased}@media screen and (min-resolution: 2dppx){.sp-c-fVPbOs{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}.sp-c-fVPbOs *{box-sizing:border-box}.sp-c-fVPbOs .sp-wrapper:focus{outline:0}.sp-c-ikJbEZ{border:1px solid var(--sp-colors-surface2);display:flex;flex-wrap:wrap;align-items:stretch;border-radius:var(--sp-border-radius);overflow:hidden;position:relative;background-color:var(--sp-colors-surface2);gap:1px}.sp-c-ikJbEZ>.sp-c-euXojQ{flex-grow:1;flex-shrink:1;flex-basis:0;height:var(--sp-layout-height);overflow:hidden}@media print{.sp-c-ikJbEZ>.sp-c-euXojQ{height:auto;display:block}}@media screen and (max-width: 768px){.sp-c-ikJbEZ>.sp-c-euXojQ:not(.sp-preview,.sp-editor,.sp-preset-column){height:calc(var(--sp-layout-height) / 2)}}@media screen and (max-width: 768px){.sp-c-ikJbEZ>.sp-c-euXojQ{min-width:100%}}.sp-c-ikJbEZ>.sp-file-explorer{flex:.2;min-width:200px}@media screen and (max-width: 768px){.sp-c-ikJbEZ>.sp-file-explorer{flex:1}}.sp-c-gtcpyq{flex:1;position:relative;overflow:auto;background:var(--sp-colors-surface1)}.sp-c-gtcpyq .cm-scroller,.sp-c-gtcpyq .sp-c-fWymNx{padding:var(--sp-space-4) 0}@media screen and (max-width: 768px){@supports (-webkit-overflow-scrolling: touch){.sp-c-gtcpyq .cm-content{font-size:16px}}}.sp-c-jOWzsE{margin:0;outline:none;height:100%}.sp-c-jkvvao .sp-syntax-string{color:var(--sp-syntax-color-string);font-style:var(--sp-syntax-fontStyle-string)}.sp-c-jkvvao .sp-syntax-plain{color:var(--sp-syntax-color-plain);font-style:var(--sp-syntax-fontStyle-plain)}.sp-c-jkvvao .sp-syntax-comment{color:var(--sp-syntax-color-comment);font-style:var(--sp-syntax-fontStyle-comment)}.sp-c-jkvvao .sp-syntax-keyword{color:var(--sp-syntax-color-keyword);font-style:var(--sp-syntax-fontStyle-keyword)}.sp-c-jkvvao .sp-syntax-definition{color:var(--sp-syntax-color-definition);font-style:var(--sp-syntax-fontStyle-definition)}.sp-c-jkvvao .sp-syntax-punctuation{color:var(--sp-syntax-color-punctuation);font-style:var(--sp-syntax-fontStyle-punctuation)}.sp-c-jkvvao .sp-syntax-property{color:var(--sp-syntax-color-property);font-style:var(--sp-syntax-fontStyle-property)}.sp-c-jkvvao .sp-syntax-tag{color:var(--sp-syntax-color-tag);font-style:var(--sp-syntax-fontStyle-tag)}.sp-c-jkvvao .sp-syntax-static{color:var(--sp-syntax-color-static);font-style:var(--sp-syntax-fontStyle-static)}}--sxs{--sxs:3 sp-c-PJLV-kCOVwI-status-pass sp-c-PJLV-kEzYsr-status-fail sp-c-PJLV-gHAhSA-status-skip sp-c-PJLV-jgnHyR-status-title sp-c-PJLV-iCgxLS-status-run sp-c-PJLV-bnDZSy-status-pass sp-c-PJLV-eYuGwt-status-fail sp-c-fVPbOs-LrWkf-variant-dark}@media{.sp-c-PJLV-kCOVwI-status-pass{color:var(--test-pass)}.sp-c-PJLV-kEzYsr-status-fail{color:var(--test-fail)}.sp-c-PJLV-gHAhSA-status-skip{color:var(--test-skip)}.sp-c-PJLV-jgnHyR-status-title{color:var(--test-title)}.sp-c-PJLV-iCgxLS-status-run{background:var(--test-run);color:var(--sp-colors-surface1)}.sp-c-PJLV-bnDZSy-status-pass{background:var(--test-pass);color:var(--sp-colors-surface1)}.sp-c-PJLV-eYuGwt-status-fail{background:var(--test-fail);color:var(--sp-colors-surface1)}.sp-c-fVPbOs-LrWkf-variant-dark{color-scheme:dark}}.framer-d1sf1.framer-1qm43v5,.framer-d1sf1 .framer-1qm43v5{display:block}.framer-d1sf1.framer-98l80f{align-content:flex-start;align-items:flex-start;display:flex;flex-direction:column;flex-wrap:nowrap;height:min-content;justify-content:space-between;overflow:hidden;padding:20px;position:relative;width:min-content}.framer-d1sf1 .framer-1y7e46t{align-content:center;align-items:center;align-self:stretch;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:10px;height:min-content;justify-content:center;overflow:visible;padding:0 0 30px;position:relative;width:auto}.framer-d1sf1 .framer-fwfm17{flex:1 0 0px;height:auto;position:relative;white-space:pre-wrap;width:1px;word-break:break-word;word-wrap:break-word}.framer-d1sf1 .framer-1u7t5nk{align-content:center;align-items:center;align-self:stretch;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;height:32px;justify-content:space-between;overflow:visible;padding:0;position:relative;width:auto}.framer-d1sf1 .framer-1qa1qgx{align-content:center;align-items:center;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:10px;height:min-content;justify-content:flex-start;overflow:visible;padding:0;position:relative;width:min-content}.framer-d1sf1 .framer-s0xw33{align-content:center;align-items:center;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:10px;height:min-content;justify-content:flex-start;overflow:visible;padding:1px;position:relative;width:min-content}.framer-d1sf1 .framer-wl66au{aspect-ratio:1 / 1;flex:none;height:var(--framer-aspect-ratio-supported, 30px);position:relative;width:30px}.framer-d1sf1 .framer-q268ia{align-content:flex-start;align-items:flex-start;display:flex;flex:none;flex-direction:column;flex-wrap:nowrap;gap:0px;height:min-content;justify-content:center;overflow:visible;padding:0;position:relative;width:min-content}.framer-d1sf1 .framer-yx4g59,.framer-d1sf1 .framer-1nir3j7{flex:none;height:auto;position:relative;white-space:pre;width:auto}.framer-d1sf1 .framer-qpaiog{flex:1 0 0px;height:32px;max-width:70px;overflow:visible;position:relative;width:1px}.framer-NYEpW .framer-styles-preset-3nqyhf:not(.rich-text-wrapper),.framer-NYEpW .framer-styles-preset-3nqyhf.rich-text-wrapper h1,.framer-NYEpW .framer-styles-preset-3nqyhf.rich-text-wrapper [data-preset-tag=h1]{--framer-font-family: "Inter", sans-serif;--framer-font-size: 60px;--framer-font-style: normal;--framer-font-weight: 800;--framer-letter-spacing: -1.5px;--framer-line-height: 1.2em;--framer-paragraph-spacing: 0px;--framer-text-alignment: start;--framer-text-color: var(--token-80890b0e-1944-4779-b0b9-2e79353f1e02, #101828);--framer-text-decoration: none;--framer-text-transform: none}@media (max-width: 1199px) and (min-width: 810px){.framer-NYEpW .framer-styles-preset-3nqyhf:not(.rich-text-wrapper),.framer-NYEpW .framer-styles-preset-3nqyhf.rich-text-wrapper h1,.framer-NYEpW .framer-styles-preset-3nqyhf.rich-text-wrapper [data-preset-tag=h1]{--framer-font-family: "Inter", sans-serif;--framer-font-size: 60px;--framer-font-style: normal;--framer-font-weight: 800;--framer-letter-spacing: -1px;--framer-line-height: 1.2em;--framer-paragraph-spacing: 0px;--framer-text-alignment: start;--framer-text-color: var(--token-80890b0e-1944-4779-b0b9-2e79353f1e02, #101828);--framer-text-decoration: none;--framer-text-transform: none}}@media (max-width: 809px) and (min-width: 0px){.framer-NYEpW .framer-styles-preset-3nqyhf:not(.rich-text-wrapper),.framer-NYEpW .framer-styles-preset-3nqyhf.rich-text-wrapper h1,.framer-NYEpW .framer-styles-preset-3nqyhf.rich-text-wrapper [data-preset-tag=h1]{--framer-font-family: "Inter", sans-serif;--framer-font-size: 34px;--framer-font-style: normal;--framer-font-weight: 800;--framer-letter-spacing: -.5px;--framer-line-height: 1.2em;--framer-paragraph-spacing: 0px;--framer-text-alignment: start;--framer-text-color: var(--token-80890b0e-1944-4779-b0b9-2e79353f1e02, #101828);--framer-text-decoration: none;--framer-text-transform: none}}.framer-cyUNH .framer-styles-preset-1wml6uu:not(.rich-text-wrapper),.framer-cyUNH .framer-styles-preset-1wml6uu.rich-text-wrapper h2,.framer-cyUNH .framer-styles-preset-1wml6uu.rich-text-wrapper [data-preset-tag=h2]{--framer-font-family: "Inter", sans-serif;--framer-font-size: 36px;--framer-font-style: normal;--framer-font-weight: 700;--framer-letter-spacing: -.5px;--framer-line-height: 1.2em;--framer-paragraph-spacing: 55px;--framer-text-alignment: start;--framer-text-color: var(--token-80890b0e-1944-4779-b0b9-2e79353f1e02, #101828);--framer-text-decoration: none;--framer-text-transform: none}@media (max-width: 1199px) and (min-width: 810px){.framer-cyUNH .framer-styles-preset-1wml6uu:not(.rich-text-wrapper),.framer-cyUNH .framer-styles-preset-1wml6uu.rich-text-wrapper h2,.framer-cyUNH .framer-styles-preset-1wml6uu.rich-text-wrapper [data-preset-tag=h2]{--framer-font-family: "Inter", sans-serif;--framer-font-size: 36px;--framer-font-style: normal;--framer-font-weight: 700;--framer-letter-spacing: -.5px;--framer-line-height: 1.2em;--framer-paragraph-spacing: 55px;--framer-text-alignment: start;--framer-text-color: var(--token-80890b0e-1944-4779-b0b9-2e79353f1e02, #101828);--framer-text-decoration: none;--framer-text-transform: none}}@media (max-width: 809px) and (min-width: 0px){.framer-cyUNH .framer-styles-preset-1wml6uu:not(.rich-text-wrapper),.framer-cyUNH .framer-styles-preset-1wml6uu.rich-text-wrapper h2,.framer-cyUNH .framer-styles-preset-1wml6uu.rich-text-wrapper [data-preset-tag=h2]{--framer-font-family: "Inter", sans-serif;--framer-font-size: 35px;--framer-font-style: normal;--framer-font-weight: 700;--framer-letter-spacing: -.5px;--framer-line-height: 1.2em;--framer-paragraph-spacing: 55px;--framer-text-alignment: start;--framer-text-color: var(--token-80890b0e-1944-4779-b0b9-2e79353f1e02, #101828);--framer-text-decoration: none;--framer-text-transform: none}}.framer-Q67Vq .framer-styles-preset-12lj5ox:not(.rich-text-wrapper),.framer-Q67Vq .framer-styles-preset-12lj5ox.rich-text-wrapper h3,.framer-Q67Vq .framer-styles-preset-12lj5ox.rich-text-wrapper [data-preset-tag=h3]{--framer-font-family: "Inter", sans-serif;--framer-font-size: 18px;--framer-font-style: normal;--framer-font-weight: 700;--framer-letter-spacing: 0px;--framer-line-height: 1.4em;--framer-paragraph-spacing: 40px;--framer-text-alignment: start;--framer-text-color: var(--token-80890b0e-1944-4779-b0b9-2e79353f1e02, #101828);--framer-text-decoration: none;--framer-text-transform: none}.framer-oNOME .framer-styles-preset-16s1yj6:not(.rich-text-wrapper),.framer-oNOME .framer-styles-preset-16s1yj6.rich-text-wrapper h4{--framer-font-family: "Inter-Bold", "Inter", "Inter Placeholder", sans-serif;--framer-font-size: 20px;--framer-font-style: normal;--framer-font-weight: 700;--framer-letter-spacing: 0em;--framer-line-height: 1.4em;--framer-paragraph-spacing: 40px;--framer-text-alignment: start;--framer-text-color: #333333;--framer-text-decoration: none;--framer-text-transform: none}.framer-gwM9n .framer-styles-preset-1ajxo25:not(.rich-text-wrapper),.framer-gwM9n .framer-styles-preset-1ajxo25.rich-text-wrapper p{--framer-font-family: "Inter", sans-serif;--framer-font-family-bold: "Inter", "Inter Placeholder", sans-serif;--framer-font-family-bold-italic: "Inter", "Inter Placeholder", sans-serif;--framer-font-family-italic: "Inter", "Inter Placeholder", sans-serif;--framer-font-open-type-features: "blwf" on, "cv09" on, "cv03" on, "cv04" on, "cv11" on;--framer-font-size: 12px;--framer-font-style: normal;--framer-font-style-bold: normal;--framer-font-style-bold-italic: italic;--framer-font-style-italic: italic;--framer-font-variation-axes: normal;--framer-font-weight: 400;--framer-font-weight-bold: 700;--framer-font-weight-bold-italic: 700;--framer-font-weight-italic: 400;--framer-letter-spacing: -.02em;--framer-line-height: 1.6em;--framer-paragraph-spacing: 20px;--framer-text-alignment: start;--framer-text-color: var(--token-4a958951-cbb0-4756-835d-2e6e4359ab8a, #98a2b3);--framer-text-decoration: none;--framer-text-stroke-color: initial;--framer-text-stroke-width: initial;--framer-text-transform: none}.framer-koqlh .framer-styles-preset-fsrzda:not(.rich-text-wrapper),.framer-koqlh .framer-styles-preset-fsrzda.rich-text-wrapper a{--framer-link-current-text-decoration: none;--framer-link-hover-text-color: var(--token-80890b0e-1944-4779-b0b9-2e79353f1e02, #101828);--framer-link-hover-text-decoration: none;--framer-link-text-color: var(--token-80890b0e-1944-4779-b0b9-2e79353f1e02, #101828);--framer-link-text-decoration: none}.framer-0NtxM .framer-styles-preset-1poh43f:not(.rich-text-wrapper),.framer-0NtxM .framer-styles-preset-1poh43f.rich-text-wrapper blockquote{--framer-blockquote-font-family: "Inter", "Inter Placeholder", sans-serif;--framer-blockquote-font-family-bold: "Inter", "Inter Placeholder", sans-serif;--framer-blockquote-font-family-bold-italic: "Inter", "Inter Placeholder", sans-serif;--framer-blockquote-font-family-italic: "Inter", "Inter Placeholder", sans-serif;--framer-blockquote-font-size: 16px;--framer-blockquote-font-style: italic;--framer-blockquote-font-style-bold: normal;--framer-blockquote-font-style-bold-italic: italic;--framer-blockquote-font-style-italic: italic;--framer-blockquote-font-variation-axes: normal;--framer-blockquote-font-weight: 400;--framer-blockquote-font-weight-bold: 700;--framer-blockquote-font-weight-bold-italic: 700;--framer-blockquote-font-weight-italic: 400;--framer-blockquote-letter-spacing: 0em;--framer-blockquote-line-height: 1.8em;--framer-blockquote-paragraph-spacing: 20px;--framer-blockquote-text-color: #999999;--framer-blockquote-text-stroke-color: initial;--framer-blockquote-text-stroke-width: initial;--framer-font-open-type-features: normal;padding:0 0 0 22px;position:relative}.framer-0NtxM .framer-styles-preset-1poh43f:not(.rich-text-wrapper):before,.framer-0NtxM .framer-styles-preset-1poh43f.rich-text-wrapper blockquote:before{background-color:#ddd;border-radius:1px;content:" ";display:block;height:100%;left:0;position:absolute;top:0;width:2px}.framer-nCkNI .framer-styles-preset-10o44o6{--framer-code-font-family: "Fragment Mono", monospace;--framer-code-font-style: normal;--framer-code-font-weight: 400;--framer-code-text-color: #333;--framer-font-size-scale: 1;background-color:#ffffffb3;border-radius:5px;padding:.1em}.framer-d1sf1[data-border=true]:after,.framer-d1sf1 [data-border=true]:after{content:"";border-width:var(--border-top-width, 0) var(--border-right-width, 0) var(--border-bottom-width, 0) var(--border-left-width, 0);border-color:var(--border-color, none);border-style:var(--border-style, none);width:100%;height:100%;position:absolute;box-sizing:border-box;left:0;top:0;border-radius:inherit;pointer-events:none}.framer-OpGPI.framer-stndzt,.framer-OpGPI .framer-stndzt{display:block}.framer-OpGPI.framer-1580wxs{align-content:center;align-items:center;cursor:pointer;display:flex;flex-direction:row;flex-wrap:nowrap;gap:10px;height:40px;justify-content:center;padding:0 10px;position:relative;width:min-content}.framer-OpGPI .framer-9zvonm{flex:none;height:auto;position:relative;white-space:pre;width:auto}.framer-OpGPI .framer-ct308r{aspect-ratio:1 / 1;flex:none;height:var(--framer-aspect-ratio-supported, 20px);overflow:visible;position:relative;width:20px}.framer-OpGPI .framer-liy507{flex:none;inset:0;overflow:visible;position:absolute}.framer-OpGPI .framer-h5z9zl{flex:none;height:2px;left:calc(50.00000000000002% - 2px / 2);overflow:visible;position:absolute;top:0;width:2px}@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)){.framer-OpGPI.framer-1580wxs{gap:0px}.framer-OpGPI.framer-1580wxs>*{margin:0 5px}.framer-OpGPI.framer-1580wxs>:first-child{margin-left:0}.framer-OpGPI.framer-1580wxs>:last-child{margin-right:0}}.framer-OpGPI.framer-v-wusku3.framer-1580wxs{width:40px}.framer-keIrj.framer-1ujpt3q,.framer-keIrj .framer-1ujpt3q{display:block}.framer-keIrj.framer-14gbqsb{align-content:center;align-items:center;cursor:pointer;display:flex;flex-direction:column;flex-wrap:nowrap;gap:10px;height:min-content;justify-content:center;overflow:visible;padding:1px;position:relative;text-decoration:none;width:130px}.framer-keIrj .framer-14g82xy{align-content:center;align-items:center;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:12px;height:min-content;justify-content:center;overflow:visible;padding:16px 34px;position:relative;width:100%}.framer-keIrj .framer-dgx1e0{align-content:center;align-items:center;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:16px;height:min-content;justify-content:flex-start;overflow:visible;padding:0;position:relative;width:110px}.framer-keIrj .framer-13c8kw0{flex:none;height:24px;position:relative;white-space:pre-wrap;width:77px;word-break:break-word;word-wrap:break-word}.framer-keIrj .framer-ztcmup{flex:none;height:14px;position:relative;width:8px}.framer-keIrj .framer-1llkcha{flex:none;height:auto;position:relative;white-space:pre;width:auto}@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)){.framer-keIrj.framer-14gbqsb,.framer-keIrj .framer-14g82xy,.framer-keIrj .framer-dgx1e0{gap:0px}.framer-keIrj.framer-14gbqsb>*{margin:5px 0}.framer-keIrj.framer-14gbqsb>:first-child{margin-top:0}.framer-keIrj.framer-14gbqsb>:last-child{margin-bottom:0}.framer-keIrj .framer-14g82xy>*{margin:0 6px}.framer-keIrj .framer-14g82xy>:first-child,.framer-keIrj .framer-dgx1e0>:first-child{margin-left:0}.framer-keIrj .framer-14g82xy>:last-child,.framer-keIrj .framer-dgx1e0>:last-child{margin-right:0}.framer-keIrj .framer-dgx1e0>*{margin:0 8px}}.framer-keIrj.framer-v-1mzwy6 .framer-14g82xy,.framer-keIrj.framer-v-hrz8fq .framer-14g82xy{padding:13px 34px}.framer-keIrj.framer-v-1cxcx5h.framer-14gbqsb{width:min-content}.framer-keIrj.framer-v-1cxcx5h .framer-14g82xy,.framer-keIrj.framer-v-1pnlk93 .framer-14g82xy{padding:13px 14px;width:min-content}.framer-keIrj.framer-v-1pnlk93.framer-14gbqsb{padding:0;width:min-content}.framer-keIrj.framer-v-10p8x9w.framer-14gbqsb{align-content:flex-start;align-items:flex-start;width:min-content}.framer-keIrj.framer-v-10p8x9w .framer-14g82xy{justify-content:flex-start;padding:0;width:min-content}.framer-keIrj.framer-v-10p8x9w .framer-dgx1e0{order:1}.framer-keIrj.framer-v-10p8x9w.hover .framer-dgx1e0{gap:20px}@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)){.framer-keIrj.framer-v-10p8x9w.hover .framer-dgx1e0{gap:0px}.framer-keIrj.framer-v-10p8x9w.hover .framer-dgx1e0>*{margin:0 10px}.framer-keIrj.framer-v-10p8x9w.hover .framer-dgx1e0>:first-child{margin-left:0}.framer-keIrj.framer-v-10p8x9w.hover .framer-dgx1e0>:last-child{margin-right:0}}.framer-wZ8Ar[data-border=true]:after,.framer-wZ8Ar [data-border=true]:after{content:"";border-width:var(--border-top-width, 0) var(--border-right-width, 0) var(--border-bottom-width, 0) var(--border-left-width, 0);border-color:var(--border-color, none);border-style:var(--border-style, none);width:100%;height:100%;position:absolute;box-sizing:border-box;left:0;top:0;border-radius:inherit;pointer-events:none}.framer-wZ8Ar.framer-mj726s,.framer-wZ8Ar .framer-mj726s{display:block}.framer-wZ8Ar.framer-fxysih{align-content:center;align-items:center;cursor:pointer;display:flex;flex-direction:row;flex-wrap:nowrap;gap:10px;height:min-content;justify-content:center;overflow:visible;padding:6px 12px;position:relative;text-decoration:none;width:min-content}.framer-wZ8Ar .framer-yy9jwc{flex:none;height:auto;overflow:visible;position:relative;white-space:pre;width:auto}@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)){.framer-wZ8Ar.framer-fxysih{gap:0px}.framer-wZ8Ar.framer-fxysih>*{margin:0 5px}.framer-wZ8Ar.framer-fxysih>:first-child{margin-left:0}.framer-wZ8Ar.framer-fxysih>:last-child{margin-right:0}}.framer-wZ8Ar.framer-v-3uqi16.framer-fxysih,.framer-wZ8Ar.framer-v-115axpe.framer-fxysih{padding:10px 16px}.framer-wZ8Ar.framer-v-aeyvvq.framer-fxysih{cursor:unset}.framer-form-text-input textarea::-webkit-resizer{background:no-repeat url('data:image/svg+xml, ')}.framer-form-text-input .framer-form-input[type=date]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input .framer-form-input[type=time]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input textarea::-webkit-resizer{background:no-repeat url('data:image/svg+xml, ')}.framer-form-text-input .framer-form-input[type=date]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input .framer-form-input[type=time]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input textarea::-webkit-resizer{background:no-repeat url('data:image/svg+xml, ')}.framer-form-text-input .framer-form-input[type=date]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input .framer-form-input[type=time]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-bhrHB{-webkit-mask:url('data:image/svg+xml, ') alpha no-repeat center / auto var(--framer-icon-mask-mode, add),var(--framer-icon-mask, none);aspect-ratio:1;background-color:var(--szd5nr);mask:url('data:image/svg+xml, ') alpha no-repeat center / auto var(--framer-icon-mask-mode, add),var(--framer-icon-mask, none);width:24px}.framer-form-text-input textarea::-webkit-resizer{background:no-repeat url('data:image/svg+xml, ')}.framer-form-text-input .framer-form-input[type=date]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input .framer-form-input[type=time]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input textarea::-webkit-resizer{background:no-repeat url('data:image/svg+xml, ')}.framer-form-text-input .framer-form-input[type=date]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input .framer-form-input[type=time]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input textarea::-webkit-resizer{background:no-repeat url('data:image/svg+xml, ')}.framer-form-text-input .framer-form-input[type=date]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input .framer-form-input[type=time]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-bhrHB{-webkit-mask:url('data:image/svg+xml, ') alpha no-repeat center / auto var(--framer-icon-mask-mode, add),var(--framer-icon-mask, none);aspect-ratio:1;background-color:var(--szd5nr);mask:url('data:image/svg+xml, ') alpha no-repeat center / auto var(--framer-icon-mask-mode, add),var(--framer-icon-mask, none);width:24px}.ssr-variant{display:contents}.framer-387tT.framer-5tgoaq,.framer-387tT .framer-5tgoaq{display:block}.framer-387tT.framer-ilh3dz{align-content:center;align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap;gap:10px;height:min-content;justify-content:center;overflow:hidden;padding:0 0 60px;position:relative;width:1200px}.framer-387tT .framer-127kwyd{align-content:center;align-items:center;display:flex;flex:1 0 0px;flex-direction:column;flex-wrap:nowrap;gap:56px;height:min-content;justify-content:flex-start;max-width:1100px;overflow:visible;padding:32px 20px;position:relative;width:1px}.framer-387tT .framer-1map5jc{align-content:flex-start;align-items:flex-start;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;height:min-content;justify-content:space-between;overflow:visible;padding:0;position:relative;width:100%}.framer-387tT .framer-z8h421{align-content:flex-start;align-items:flex-start;display:flex;flex:none;flex-direction:column;flex-wrap:nowrap;gap:19px;height:min-content;justify-content:center;overflow:visible;padding:0 25px 0 0;position:relative;width:min-content}.framer-387tT .framer-ynlydq{flex:none;height:28px;position:relative;width:86px}.framer-387tT .framer-126tkor-container{flex:none;height:auto;position:relative;width:auto}.framer-387tT .framer-18bfhns{align-content:flex-start;align-items:flex-start;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:60px;height:min-content;justify-content:flex-start;overflow:visible;padding:0;position:relative;width:min-content}.framer-387tT .framer-q8n5yg,.framer-387tT .framer-6l3ara,.framer-387tT .framer-1r3ohva{align-content:flex-start;align-items:flex-start;display:flex;flex:none;flex-direction:column;flex-wrap:nowrap;gap:12px;height:min-content;justify-content:center;min-width:100px;overflow:visible;padding:0;position:relative;width:min-content}.framer-387tT .framer-1d0ifup,.framer-387tT .framer-ubjbi3,.framer-387tT .framer-1biinoy,.framer-387tT .framer-1vxmdz4,.framer-387tT .framer-1l4yy0w,.framer-387tT .framer-1gpo1xj,.framer-387tT .framer-1hxddo,.framer-387tT .framer-l79key,.framer-387tT .framer-cwjzpc,.framer-387tT .framer-17bcj4k,.framer-387tT .framer-mdcq8g,.framer-387tT .framer-c8i7lx,.framer-387tT .framer-16n6vid,.framer-387tT .framer-pis8ol,.framer-387tT .framer-1oe92a0,.framer-387tT .framer-1hmswhy,.framer-387tT .framer-1kq54cw,.framer-387tT .framer-1ig2o7b,.framer-387tT .framer-101ohy,.framer-387tT .framer-1gl1i0s{flex:none;height:auto;position:relative;white-space:pre;width:auto}.framer-387tT .framer-14cf0ls{cursor:pointer;flex:none;height:auto;position:relative;white-space:pre;width:auto}.framer-387tT .framer-91mlir{align-content:flex-start;align-items:flex-start;display:flex;flex:none;flex-direction:column;flex-wrap:nowrap;gap:12px;height:min-content;justify-content:center;min-width:100px;overflow:visible;padding:0;position:relative;width:220px}.framer-387tT .framer-1qheswa{flex:none;height:auto;position:relative;white-space:pre-wrap;width:100%;word-break:break-word;word-wrap:break-word}.framer-387tT .framer-lny8lo{display:grid;flex:none;gap:12px;grid-auto-rows:minmax(0,1fr);grid-template-columns:repeat(2,minmax(50px,1fr));grid-template-rows:repeat(2,minmax(0,1fr));height:min-content;justify-content:center;overflow:visible;padding:0;position:relative;width:100%}.framer-387tT .framer-q87gn9,.framer-387tT .framer-1tlr56u{align-self:start;flex:none;height:100%;justify-self:start;position:relative;white-space:pre;width:100%}.framer-387tT .framer-116c8ad,.framer-387tT .framer-422l8c,.framer-387tT .framer-1ecc4tr,.framer-387tT .framer-12i9flv,.framer-387tT .framer-1hygiur,.framer-387tT .framer-ilidkt,.framer-387tT .framer-18kotb6,.framer-387tT .framer-1eytcmr{align-self:start;flex:none;height:auto;justify-self:start;position:relative;white-space:pre;width:100%}.framer-387tT .framer-emhyhy{align-content:center;align-items:center;display:flex;flex:none;flex-direction:row;flex-wrap:wrap;height:min-content;justify-content:space-between;overflow:visible;padding:0;position:relative;width:100%}.framer-387tT .framer-1mjmtif,.framer-387tT .framer-1dho1pi{align-content:center;align-items:center;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:32px;height:min-content;justify-content:flex-start;overflow:visible;padding:0;position:relative;width:min-content}.framer-387tT .framer-1moifzn{align-content:flex-end;align-items:flex-end;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:12px;height:min-content;justify-content:flex-start;overflow:visible;padding:0;position:relative;width:min-content}.framer-387tT .framer-19qg2f1{align-content:center;align-items:center;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:20px;height:min-content;justify-content:flex-start;overflow:hidden;padding:0;position:relative;width:min-content}.framer-387tT .framer-a4vhq,.framer-387tT .framer-1x1pr2p,.framer-387tT .framer-1j08igg{flex:none;height:21px;overflow:visible;position:relative;text-decoration:none;width:25px}.framer-387tT .framer-1sg3lmg-container,.framer-387tT .framer-1dkdlj1-container,.framer-387tT .framer-18qfcfb-container{flex:none;inset:0;position:absolute}.framer-387tT.framer-v-7mynj1 .framer-127kwyd{max-width:800px}.framer-387tT.framer-v-7mynj1 .framer-1map5jc{flex-direction:column;gap:40px;justify-content:flex-start}.framer-387tT.framer-v-7mynj1 .framer-z8h421{flex-direction:row;gap:unset;justify-content:space-between;width:100%}.framer-387tT.framer-v-7mynj1 .framer-91mlir,.framer-387tT.framer-v-18ewcsp .framer-91mlir{width:min-content}.framer-387tT.framer-v-7mynj1 .framer-1qheswa,.framer-387tT.framer-v-18ewcsp .framer-1qheswa{white-space:pre;width:auto}.framer-387tT.framer-v-7mynj1 .framer-lny8lo,.framer-387tT.framer-v-18ewcsp .framer-lny8lo{align-content:flex-start;align-items:flex-start;display:flex;flex-direction:column;flex-wrap:nowrap;width:min-content}.framer-387tT.framer-v-7mynj1 .framer-q87gn9{align-self:unset;height:auto;order:0;width:auto}.framer-387tT.framer-v-7mynj1 .framer-116c8ad{align-self:unset;order:1;width:auto}.framer-387tT.framer-v-7mynj1 .framer-422l8c{align-self:unset;order:2;width:auto}.framer-387tT.framer-v-7mynj1 .framer-1ecc4tr{align-self:unset;order:3;width:auto}.framer-387tT.framer-v-7mynj1 .framer-12i9flv{align-self:unset;order:4;width:auto}.framer-387tT.framer-v-7mynj1 .framer-emhyhy{align-content:unset;align-items:unset;display:grid;gap:21px;grid-auto-rows:minmax(0,1fr);grid-template-columns:repeat(1,minmax(50px,1fr));grid-template-rows:repeat(2,minmax(0,1fr));justify-content:center}.framer-387tT.framer-v-7mynj1 .framer-1mjmtif,.framer-387tT.framer-v-18ewcsp .framer-1mjmtif{align-self:start;height:100%;justify-self:start;order:1;width:100%}.framer-387tT.framer-v-7mynj1 .framer-19qg2f1,.framer-387tT.framer-v-18ewcsp .framer-19qg2f1{align-self:start;height:100%;justify-self:start;order:0;width:100%}.framer-387tT.framer-v-18ewcsp .framer-127kwyd{max-width:390px}.framer-387tT.framer-v-18ewcsp .framer-1map5jc{flex-direction:column;gap:35px;justify-content:flex-start}.framer-387tT.framer-v-18ewcsp .framer-18bfhns{flex-wrap:wrap;gap:40px;width:100%}.framer-387tT.framer-v-18ewcsp .framer-q87gn9{align-self:unset;height:auto;width:auto}.framer-387tT.framer-v-18ewcsp .framer-116c8ad,.framer-387tT.framer-v-18ewcsp .framer-422l8c,.framer-387tT.framer-v-18ewcsp .framer-1ecc4tr,.framer-387tT.framer-v-18ewcsp .framer-12i9flv{align-self:unset;width:auto}.framer-387tT.framer-v-18ewcsp .framer-emhyhy{align-content:unset;align-items:unset;display:grid;gap:0px;grid-auto-rows:minmax(0,1fr);grid-template-columns:repeat(1,minmax(50px,1fr));grid-template-rows:repeat(2,minmax(0,1fr));justify-content:center}.framer-387tT.framer-v-18ewcsp .framer-1dho1pi{align-content:flex-start;align-items:flex-start;flex:1 0 0px;flex-direction:column;gap:12px;width:1px}.framer-387tT.framer-v-18ewcsp .framer-1moifzn{align-content:unset;align-items:unset;display:grid;grid-auto-rows:minmax(0,1fr);grid-template-columns:repeat(2,minmax(50px,1fr));grid-template-rows:repeat(2,minmax(0,1fr));justify-content:center;width:100%}.framer-387tT.framer-v-18ewcsp .framer-1kq54cw,.framer-387tT.framer-v-18ewcsp .framer-1ig2o7b,.framer-387tT.framer-v-18ewcsp .framer-101ohy,.framer-387tT.framer-v-18ewcsp .framer-1gl1i0s{align-self:start;height:100%;justify-self:start;width:100%}.framer-No3Ww .framer-styles-preset-10fkicd:not(.rich-text-wrapper),.framer-No3Ww .framer-styles-preset-10fkicd.rich-text-wrapper a{--framer-link-current-text-color: var(--token-3809d894-258f-4e06-b783-744860715d0c, #7855ff) ;--framer-link-current-text-decoration: none;--framer-link-hover-text-color: var(--token-3809d894-258f-4e06-b783-744860715d0c, #7855ff) ;--framer-link-hover-text-decoration: underline;--framer-link-text-color: #ffffff;--framer-link-text-decoration: none}.framer-YA3B0 .framer-styles-preset-16zx7fv:not(.rich-text-wrapper),.framer-YA3B0 .framer-styles-preset-16zx7fv.rich-text-wrapper a{--framer-link-hover-text-decoration: underline;--framer-link-text-color: #a1a1a1}.framer-bVDMT.framer-3pxwbm,.framer-bVDMT .framer-3pxwbm{display:block}.framer-bVDMT.framer-1i7tbyk{align-content:flex-start;align-items:flex-start;display:flex;flex-direction:column;flex-wrap:nowrap;gap:10px;height:min-content;justify-content:center;padding:12px;position:relative;width:min-content}.framer-bVDMT .framer-iu7z0j{flex:none;height:auto;position:relative;white-space:pre;width:auto}.framer-bVDMT .framer-1jwvcac{align-content:flex-start;align-items:flex-start;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:20px;height:min-content;justify-content:flex-start;overflow:hidden;padding:0;position:relative;width:min-content}.framer-bVDMT .framer-1g851ch{align-content:flex-start;align-items:flex-start;display:flex;flex:none;flex-direction:row;flex-wrap:nowrap;gap:10px;height:min-content;justify-content:flex-start;padding:2px;position:relative;width:280px}.framer-bVDMT .framer-1q7aelq,.framer-bVDMT .framer-121jtsw,.framer-bVDMT .framer-mtsrzo{--framer-input-focused-border-color: #0099ff;--framer-input-focused-border-style: solid;--framer-input-focused-border-width: 1px;--framer-input-font-family: "Plus Jakarta Sans";--framer-input-font-letter-spacing: 0em;--framer-input-font-line-height: 1.2em;--framer-input-font-size: 14px;--framer-input-font-text-alignment: left;--framer-input-font-weight: 500;--framer-input-padding: 0px 0px 0px 12px;flex:1 0 0px;height:36px;position:relative;width:1px}.framer-bVDMT .framer-1q6june-container{flex:none;height:36px;position:relative;width:56px}.framer-bVDMT.framer-v-ljkpmg .framer-1q7aelq{--framer-input-font-weight: 600}.framer-form-text-input textarea::-webkit-resizer{background:no-repeat url('data:image/svg+xml, ')}.framer-form-text-input .framer-form-input[type=date]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input .framer-form-input[type=time]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input textarea::-webkit-resizer{background:no-repeat url('data:image/svg+xml, ')}.framer-form-text-input .framer-form-input[type=date]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input .framer-form-input[type=time]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-input{padding:var(--framer-input-padding);background:transparent;font-family:var(--framer-input-font-family);font-weight:var(--framer-input-font-weight);font-size:var(--framer-input-font-size);font-style:var(--framer-input-font-style);color:var(--framer-input-font-color);font-feature-settings:var(--framer-input-font-open-type-features);border:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:100%;height:var(--framer-input-wrapper-height, 100%);letter-spacing:var(--framer-input-font-letter-spacing);text-align:var(--framer-input-font-text-alignment);line-height:var(--framer-input-font-line-height)}.framer-form-input:focus-visible{outline:none}.framer-form-input-wrapper:after{content:"";pointer-events:none;box-sizing:border-box;position:absolute;top:0;left:0;width:100%;height:100%;border-top-left-radius:var(--framer-input-border-radius-top-left);border-top-right-radius:var(--framer-input-border-radius-top-right);border-bottom-right-radius:var(--framer-input-border-radius-bottom-right);border-bottom-left-radius:var(--framer-input-border-radius-bottom-left);border-color:var(--framer-input-border-color);border-top-width:var(--framer-input-border-top-width);border-right-width:var(--framer-input-border-right-width);border-bottom-width:var(--framer-input-border-bottom-width);border-left-width:var(--framer-input-border-left-width);border-style:var(--framer-input-border-style);transition:var(--framer-input-focused-transition);transition-property:border-color,border-width,border-style,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius}.framer-form-input-wrapper{overflow:hidden}.framer-form-input-wrapper{box-shadow:var(--framer-input-box-shadow);border-top-left-radius:var(--framer-input-border-radius-top-left);border-top-right-radius:var(--framer-input-border-radius-top-right);border-bottom-right-radius:var(--framer-input-border-radius-bottom-right);border-bottom-left-radius:var(--framer-input-border-radius-bottom-left);background:var(--framer-input-background);transition:var(--framer-input-focused-transition);transition-property:background,box-shadow}.framer-form-text-input .framer-form-input::placeholder{color:var(--framer-input-placeholder-color)}.framer-form-text-input .framer-form-input[type=date],.framer-form-text-input .framer-form-input[type=time]{-webkit-appearance:none;appearance:none}.framer-form-text-input .framer-form-input::-webkit-date-and-time-value{text-align:start}.framer-form-text-input textarea{display:flex;resize:var(--framer-textarea-resize);overflow-y:auto;min-height:inherit;max-height:inherit;white-space:break-spaces}.framer-form-text-input textarea::-webkit-resizer{background:no-repeat url('data:image/svg+xml, ')}.framer-form-text-input textarea::-webkit-scrollbar{cursor:pointer;background:transparent}.framer-form-text-input textarea::-webkit-scrollbar-thumb:window-inactive{opacity:0}.framer-form-text-input textarea::-webkit-scrollbar-corner{background:none;background-color:transparent;outline:none}.framer-form-text-input .framer-form-input::-webkit-datetime-edit{height:var(--framer-input-font-line-height)}.framer-form-text-input .framer-form-input.framer-form-input-empty::-webkit-datetime-edit{color:var(--framer-input-placeholder-color);-webkit-text-fill-color:var(--framer-input-placeholder-color);overflow:visible}.framer-form-text-input .framer-form-input[type=date]:before,.framer-form-text-input .framer-form-input[type=time]:before{content:"";display:block;position:absolute;right:0;top:0;bottom:0;width:16px;box-sizing:content-box;padding:var(--framer-input-padding);border:none;pointer-events:none;background-repeat:no-repeat;background-size:16px;mask-repeat:no-repeat;mask-size:16px;background-color:var(--framer-input-icon-color);padding-left:10px;mask-position:10px center;background-position:10px center}.framer-form-text-input .framer-form-input[type=date]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input .framer-form-input[type=time]:before{mask-image:var(--framer-input-icon-mask-image, url('data:image/svg+xml, '));background-image:var(--framer-input-icon-image)}.framer-form-text-input .framer-form-input::-webkit-calendar-picker-indicator{opacity:0;position:absolute;right:0;top:0;bottom:0;padding:var(--framer-input-padding);padding-top:0;padding-bottom:0;width:16px;height:100%}.framer-form-text-input:focus-within,.framer-form-text-input.framer-form-input-forced-focus{box-shadow:var(--framer-input-focused-box-shadow, var(--framer-input-box-shadow));background:var(--framer-input-focused-background, var(--framer-input-background))}.framer-form-text-input:focus-within:after,.framer-form-text-input.framer-form-input-forced-focus:after{border-color:var(--framer-input-focused-border-color, var(--framer-input-border-color));border-style:var(--framer-input-focused-border-style, var(--framer-input-border-style));border-width:var(--framer-input-focused-border-width, var(--framer-input-border-top-width) var(--framer-input-border-right-width) var(--framer-input-border-bottom-width) var(--framer-input-border-left-width))}.framer-8gVNR.framer-snlslu,.framer-8gVNR .framer-snlslu{display:block}.framer-8gVNR.framer-eykftx{align-content:center;align-items:center;cursor:pointer;display:flex;flex-direction:row;flex-wrap:nowrap;gap:0px;height:min-content;justify-content:center;overflow:visible;padding:8px 0;position:relative;width:60px}.framer-8gVNR .framer-l3fswg,.framer-8gVNR .framer-tbgg7m,.framer-8gVNR .framer-n5jszw{flex:none;height:var(--framer-aspect-ratio-supported, 15px);position:relative;width:20px}.framer-8gVNR .framer-90lrdz{aspect-ratio:1 / 1;flex:none;gap:10px;height:var(--framer-aspect-ratio-supported, 20px);overflow:hidden;position:relative;width:20px}.framer-8gVNR .framer-e5lo9j{flex:none;inset:0;overflow:visible;position:absolute}.framer-8gVNR .framer-mfdjn3{aspect-ratio:1 / 1;flex:none;height:var(--framer-aspect-ratio-supported, 2px);left:50%;overflow:visible;position:absolute;top:0;width:2px}.framer-8gVNR.framer-v-r1ppur.framer-eykftx,.framer-8gVNR.framer-v-tnr9w7.framer-eykftx,.framer-8gVNR.framer-v-1t9cffy.framer-eykftx,.framer-8gVNR.framer-v-1qb2kgl.framer-eykftx{cursor:unset}.framer-8gVNR.framer-v-r1ppur .framer-e5lo9j{overflow:hidden}.framer-bhrHB{-webkit-mask:url('data:image/svg+xml, ') alpha no-repeat center / auto var(--framer-icon-mask-mode, add),var(--framer-icon-mask, none);aspect-ratio:1;background-color:var(--szd5nr);mask:url('data:image/svg+xml, ') alpha no-repeat center / auto var(--framer-icon-mask-mode, add),var(--framer-icon-mask, none);width:24px}@supports (aspect-ratio: 1){body{--framer-aspect-ratio-supported: auto}}.framer-XWjCY.framer-1ernncw,.framer-XWjCY .framer-1ernncw{display:block}.framer-XWjCY.framer-1bgtqfe{cursor:pointer;height:21px;overflow:hidden;position:relative;width:25px}.framer-XWjCY .framer-azpha3{flex:none;height:21px;left:calc(48.00000000000002% - 25px / 2);position:absolute;top:calc(47.61904761904764% - 21px / 2);width:25px}.framer-XWjCY .framer-hxz64n{flex:none;height:23px;left:calc(48.00000000000002% - 23px / 2);position:absolute;top:calc(47.61904761904764% - 23px / 2);width:23px}.framer-XWjCY .framer-1hqe8wr{flex:none;height:19px;position:absolute;right:0;top:calc(47.61904761904764% - 19px / 2);width:25px}.framer-XWjCY .framer-1jxjh2h-container{flex:none;inset:-2px 1px -3px;position:absolute}
The fastest Postgres change data capture
The fastest Postgres change data capture
The fastest Postgres change data capture Stream data from Postgres directly to Kafka, Redis, and more. Replace complex tools like Debezium and consolidate workflows.
Stream data from Postgres directly to Kafka, Redis, and more. Replace complex tools like Debezium and consolidate workflows.
Capture every insert, update, and delete
Capture every insert, update, and delete
Works with any Postgres database:
Works with any Postgres database:
Real-time sink to streams, queues, and more:
Real-time sink to streams, queues, and more:
Built-in backfills, filters, routing, and transforms
Built-in backfills, filters, routing, and transforms
databases:
- name: "sequin-playground"
username: "postgres"
password: "postgres"
hostname: "sequin_postgres"
database: "sequin_playground"
port: 5432
slot_name: "sequin_slot"
publication_name: "sequin_pub"
tables:
- table_name: "accounts"
table_schema: "public"
sort_column_name: "updated_at"
sinks:
- name: "kafka-sink"
database: "sequin-playground"
table: "public.accounts"
destination:
type: "kafka"
hosts: "kafka1.example.com:9092"
topic: "accounts-topic"
username: "kafka-user"
password: "kafka-password"
sasl_mechanism: "plain"
# 1. Install the CLI using Homebrew
$ brew install sequin
# 2. Apply the YAML config file
$ sequin config apply
Applying changes...
✓ Created database connection: sequin-playground
✓ Added table tracking for public.accounts
✓ Created Kafka sink: kafka-sink
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
# 3. Check the health of the kafka sink
$ sequin sink health kafka-sink
Sink: kafka-sink
Status: Healthy
Messages processed (24h): 5,127,394,342
Average latency: 41ms
curl -X POST
https://api.sequinstream.com/v1/sinks
-H "Content-Type: application/json"
-H "Authorization: Bearer YOUR_API_TOKEN"
-d '{
"name": "kafka-sink",
"database": "sequin-playground",
"table": "public.accounts",
"destination": {
"type": "kafka",
"hosts": "kafka1.example.com:9092",
"topic": "accounts-topic",
"username": "kafka-user",
"password": "kafka-password",
"sasl_mechanism": "plain"
}
}'
Industry-leading performance
Industry-leading performance Sequin is tuned to Postgres to provide industry-leading performance. If your database can handle the transaction, Sequin will deliver it with minimal overhead. Read more on our benchmarking page →
Sequin is tuned to Postgres to provide industry-leading performance. If your database can handle the transaction, Sequin will deliver it with minimal overhead. Read more on our benchmarking page →
Real-time CDC Postgres to Kafka
Latency at 10,000 operations / second
AWS MSK Debezium · 253 ms
Capture & deliverevery change
Capture & deliverevery change Simplify your architecture by building on strong guarantees. Sequin never misses an insert, update, or delete and delivers every (100%) change to your stream or queue.
Simplify your architecture by building on strong guarantees. Sequin never misses an insert, update, or delete and delivers every (100%) change to your stream or queue.
Sequin is designed to power every change data capture use case. No need to master a new piece of infrastructure.
async function handleOrderWorkflow ( change ) { await logDatabaseChange ( change ) ; if ( change .metadata .table_name === 'orders' && change .action === 'insert' ) { const order = change .record ; for ( const item of order .items ) { await updateInventory ( item .product_id , -item .quantity ) ; } } } async function updateInventory ( productId , quantityChange ) { const { rows } = await db .query ( 'UPDATE inventory SET quantity = quantity + $1 WHERE product_id = $2 RETURNING quantity' , [ quantityChange , productId ] ) ; if ( rows [ 0 ] .quantity <= 10 ) { await db .query ( 'INSERT INTO inventory_alerts (product_id, current_quantity) VALUES ($1, $2)' , [ productId , rows [ 0 ] .quantity ] ) ; } }
Trigger code when Postgres rows change
Build automated workflows from database changes. Sequin captures and delivers every change in your database so you can break monolithic processes into automated, event-driven workflows.
async function logDatabaseChange ( change ) { await db .query ( ` INSERT INTO audit_logs ( event_id, table_name, record_id, action, old_values, new_values ) VALUES ($1, $2, $3, $4, $5, $6) ` , [ change .id , change .metadata .table_name , change .record .id , change .action , JSON .stringify ( change .changes ) , JSON .stringify ( change .record ) ] ) ; } await logDatabaseChange ( { id : "evt_123" , action : "update" , metadata : { table_name : "orders" } , record : { id : "order_123" , status : "shipped" } , changes : { status : "pending" } } ) ;
Sequin captures the full history of modifications to your data, letting you meet compliance requirements, debug issues, and build powerful user features like activity feeds - all without modifying your application code.
async function replicateChange ( change ) { if ( change .action !== 'delete' ) { await db .query ( ` INSERT INTO products_replica ( id, name, price, updated_at ) VALUES ($1, $2, $3, $4) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, price = EXCLUDED.price, updated_at = EXCLUDED.updated_at ` , [ change .record .id , change .record .name , change .record .price , new Date ( ) ] ) ; } else { await db .query ( 'DELETE FROM products_replica WHERE id = $1' , [ change .record .id ] ) ; } } await replicateChange ( { action : "update" , record : { id : "prod_123" , name : "Coffee Maker" , price : 99.99 } } ) ;
Seamlessly replicate data between databases in real-time. Sequin handles the complex parts of database replication - like race conditions, schema transformations, and failure recovery - so you can sync your data with just a few lines of code.
async function updateCache ( change ) { const cacheKey = `products: ${ change .record .id } ` ; if ( change .action !== 'delete' ) { await redis .set ( cacheKey , JSON .stringify ( { ... change .record , cached_at : new Date ( ) } ) ) ; } else { await redis .del ( cacheKey ) ; } } await updateCache ( { action : "update" , record : { id : "prod_123" , name : "Coffee Maker" , price : 99.99 } } ) ;
Keep your caches in sync with your database. Sequin streams changes directly to Redis, Memcached, or your caching layer of choice - eliminating cache inconsistencies and the complexity of manual cache invalidation.
async function createWebhookSubscription ( userId , webhookUrl ) { const endpointResp = await axios .post ( ` ${ SEQUIN_API_BASE } /destinations/http_endpoints` , { name : endpointName , url : webhookUrl , } , ) ; const sinkResp = await axios .post ( ` ${ SEQUIN_API_BASE } /sinks` , { database : "postgres" , table : "public.notifications" , filters : [ { column_name : "user_id" , operator : "=" , comparison_value : userId .toString ( ) } , ] , destination : { type : "webhook" , http_endpoint : endpointName } , actions : [ "insert" , "update" , "delete" ] , } , ) ; }
Use the Sequin Management API and Webhook Sink to power user-facing webhooks. Sequin will deliver every change, handle errors, retries, and comes with built in monitoring.
databases : - name : "prod-db" username : "postgres" password : "postgres" hostname : "my-database-instance.abcd1234wxyz.us-east-1.rds.amazonaws.com" database : "prod" port : 5432 slot_name : "sequin_slot" publication_name : "sequin_pub" sinks : - name : "typesense-sink" database : "prod-db" table : "public.products" destination : type : "typesense" endpoint_url : "https://your-typesense-server:8108" collection_name : "products" api_key : "your-api-key" batch_size : 1000 timeout_seconds : 5
Replicate your database changes to full-text search platforms like ElasticSearch, TypeSense, Algolia, and more. Sequin will ensure every change is delivered - including deletes.
Setting a higher standard
Setting a higher standard Change data capture typically requires adding complicated dependencies, endless configuration, and blackbox runtimes. Sequin is tailored to Postgres to cut out the complexity and deliver helpful features.
Change data capture typically requires adding complicated dependencies, endless configuration, and blackbox runtimes. Sequin is tailored to Postgres to cut out the complexity and deliver helpful features.
Use WHERE clauses to route changes to your sinks.
Use WHERE clauses to route changes to your sinks.
Use WHERE clauses to route changes to your sinks.
def transform (action , record , changes , metadata ) do first_name = record ["first_name" ] last_name = record ["last_name" ] full_name = first_name <> " " <> last_name %{ full_name: full_name } end
def transform (action , record , changes , metadata ) do first_name = record ["first_name" ] last_name = record ["last_name" ] full_name = first_name <> " " <> last_name %{ full_name: full_name } end
A rich web console to easily manage and observe sinks as you build.
A rich web console to easily manage and observe sinks as you build.
Trace every row from capture through to delivery.
Trace every row from capture through to delivery.
Trace every row from capture through to delivery.
Trace every row from capture through to delivery.
Prometheus Metrics + Grafana Dashboard
Plug Sequin into your monitoring and metrics.
Plug Sequin into your monitoring and metrics.
Plug Sequin's prometheus endpoint into your monitoring.
Works with your framework Sequin works with any Postgres database (version 14+) and supports a growing list of sinks to queues and streams. Sequin even supports native sinks (Webhooks and HTTP) so you can get started without any other infrastructure.
Sequin works with any Postgres database (version 14+) and supports a growing list of sinks to queues and streams. Sequin even supports native sinks (Webhooks and HTTP) so you can get started without any other infrastructure.
"Sequin eliminated the headache of manually syncing Postgres to Typesense. Their transformation functions effortlessly handle complex workflows like triggering translation requests on content updates. Now we have reliable, real-time search sync without any maintenance overhead."
"We found Debezium to be a complex solution that demands significant technical expertise to get right. In contrast, Sequin is much more straightforward and intuitive—it just works, and with fewer resources required."
"Sequin completely changed how YouTrip tracks changes in our system. It just works! Zero delivery issues, no snapshotting problems, and no random memory spikes. The whole team was impressed by how easy it was to set up, and we haven't had to think about it since."
"Sequin was incredibly easy to setup and allowed us to quickly establish our real-time knowledge base pipeline. It just works - letting our engineers focus on building features instead of maintaining complicated data infrastructure."
"Sequin solved our activity feed scaling challenges. Its use of logical replication means our application commits changes faster, as it no longer waits for synchronous audit log writes. With features like transaction annotations, we're able to capture rich context like exactly who made each change. I love what these guys are doing!"
"Sequin eliminated the headache of manually syncing Postgres to Typesense. Their transformation functions effortlessly handle complex workflows like triggering translation requests on content updates. Now we have reliable, real-time search sync without any maintenance overhead."
"We found Debezium to be a complex solution that demands significant technical expertise to get right. In contrast, Sequin is much more straightforward and intuitive—it just works, and with fewer resources required."
"Sequin completely changed how YouTrip tracks changes in our system. It just works! Zero delivery issues, no snapshotting problems, and no random memory spikes. The whole team was impressed by how easy it was to set up, and we haven't had to think about it since."
"Sequin eliminated the headache of manually syncing Postgres to Typesense. Their transformation functions effortlessly handle complex workflows like triggering translation requests on content updates. Now we have reliable, real-time search sync without any maintenance overhead."
"We found Debezium to be a complex solution that demands significant technical expertise to get right. In contrast, Sequin is much more straightforward and intuitive—it just works, and with fewer resources required."
"Sequin completely changed how YouTrip tracks changes in our system. It just works! Zero delivery issues, no snapshotting problems, and no random memory spikes. The whole team was impressed by how easy it was to set up, and we haven't had to think about it since."
Sequin itself is built on Postgres to provide the most efficient, cost effective change data capture on the market.
Sequin itself is built on Postgres to provide the most efficient, cost effective change data capture on the market.
For individuals and hobby projects
Self-host Sequin on your infra with community support
The fastest CDC from Postgres to streams and queues
The fastest CDC from Postgres to streams and queues
Docker container to run Sequin
Full-featured with transforms, backfills, CLI, and web console
Full-featured with transforms, backfills, CLI, and web console
Community Discord support
Community Discord support
High-availability with autoscaling
High-availability with autoscaling
Organization with multi-region accounts
Organization with multi-region accounts
Dedicated support channels
For enterprise and mission critical
A custom plan tailored to your requirements
White-glove implementation support
SAML, SSO, and compliance
24 x 7 production support with SLAs
24 x 7 production support with SLAs
Open source, in production
Open source. In production .
Open source, in production Sequin makes change data capture easier than ever. See what developers are saying and join the community to get started.
Sequin makes change data capture easier than ever. See what developers are saying and join the community to get started.
Blog Read about how we're building Sequin, shipping features, and pushing Postgres
Community Join our Discord server or Slack community to get support, and discuss your use case.
Stay up to date with our project, see what's in our latest release , and track what's coming next.
Subscribe to our changelog! No spam, guaranteed.
©️ 2025 Sequin Labs, Inc. All rights reserved.
Subscribe to our changelog! No spam, guaranteed.
©️ 2025 Sequin Labs, Inc. All rights reserved.
Subscribe to our changelog! No spam, guaranteed.
©️ 2025 Sequin Labs, Inc. All rights reserved.