@ibgib/web-gib 0.0.56 → 0.0.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AUTO-GENERATED-version.d.mts +1 -1
- package/dist/AUTO-GENERATED-version.mjs +1 -1
- package/dist/api/api-index.mjs +1 -1
- package/dist/api/api-index.mjs.map +1 -1
- package/dist/api/ibgib-api-bridge.d.mts +97 -0
- package/dist/api/ibgib-api-bridge.d.mts.map +1 -1
- package/dist/api/ibgib-api-bridge.mjs +205 -3
- package/dist/api/ibgib-api-bridge.mjs.map +1 -1
- package/dist/identity/custodian-delegate-helper.d.mts +22 -0
- package/dist/identity/custodian-delegate-helper.d.mts.map +1 -0
- package/dist/identity/custodian-delegate-helper.mjs +50 -0
- package/dist/identity/custodian-delegate-helper.mjs.map +1 -0
- package/dist/identity/sso-popup-helper.d.mts +33 -0
- package/dist/identity/sso-popup-helper.d.mts.map +1 -0
- package/dist/identity/sso-popup-helper.mjs +124 -0
- package/dist/identity/sso-popup-helper.mjs.map +1 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -1
- package/dist/ui/component/identity/add-device/add-device.d.mts.map +1 -1
- package/dist/ui/component/identity/add-device/add-device.html +6 -7
- package/dist/ui/component/identity/add-device/add-device.mjs +13 -10
- package/dist/ui/component/identity/add-device/add-device.mjs.map +1 -1
- package/dist/ui/component/identity/identity-header/identity-header.d.mts.map +1 -1
- package/dist/ui/component/identity/identity-header/identity-header.mjs +2 -1
- package/dist/ui/component/identity/identity-header/identity-header.mjs.map +1 -1
- package/dist/ui/component/identity/keystone-creator/keystone-creator.css +114 -9
- package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts +23 -0
- package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts.map +1 -1
- package/dist/ui/component/identity/keystone-creator/keystone-creator.html +122 -50
- package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs +529 -83
- package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs.map +1 -1
- package/dist/ui/component/identity/keystone-details/keystone-details.d.mts.map +1 -1
- package/dist/ui/component/identity/keystone-details/keystone-details.mjs +19 -61
- package/dist/ui/component/identity/keystone-details/keystone-details.mjs.map +1 -1
- package/package.json +4 -4
- package/src/AUTO-GENERATED-version.mts +1 -1
- package/src/api/api-index.mts +1 -1
- package/src/api/ibgib-api-bridge.mts +288 -4
- package/src/identity/custodian-delegate-helper.mts +61 -0
- package/src/identity/sso/{sso-custodian-service.mts → sso-custodian-service.mts.bak} +65 -38
- package/src/identity/sso/{sso-custodian-service.respec.mts → sso-custodian-service.respec.mts.bak} +15 -14
- package/src/identity/sso-popup-helper.mts +155 -0
- package/src/index.mts +3 -0
- package/src/ui/component/identity/add-device/add-device.html +6 -7
- package/src/ui/component/identity/add-device/add-device.mts +17 -16
- package/src/ui/component/identity/identity-header/identity-header.mts +2 -1
- package/src/ui/component/identity/keystone-creator/keystone-creator.css +114 -9
- package/src/ui/component/identity/keystone-creator/keystone-creator.html +122 -50
- package/src/ui/component/identity/keystone-creator/keystone-creator.mts +599 -100
- package/src/ui/component/identity/keystone-details/keystone-details.mts +26 -77
- package/dist/identity/sso/sso-config-helper.d.mts +0 -7
- package/dist/identity/sso/sso-config-helper.d.mts.map +0 -1
- package/dist/identity/sso/sso-config-helper.mjs +0 -42
- package/dist/identity/sso/sso-config-helper.mjs.map +0 -1
- package/dist/identity/sso/sso-custodian-service.d.mts +0 -139
- package/dist/identity/sso/sso-custodian-service.d.mts.map +0 -1
- package/dist/identity/sso/sso-custodian-service.mjs +0 -443
- package/dist/identity/sso/sso-custodian-service.mjs.map +0 -1
- package/dist/identity/sso/sso-custodian-service.respec.d.mts +0 -2
- package/dist/identity/sso/sso-custodian-service.respec.d.mts.map +0 -1
- package/dist/identity/sso/sso-custodian-service.respec.mjs +0 -254
- package/dist/identity/sso/sso-custodian-service.respec.mjs.map +0 -1
- /package/src/identity/sso/{sso-config-helper.mts → sso-config-helper.mts.bak} +0 -0
|
@@ -46,11 +46,34 @@ export declare class KeystoneCreatorComponentInstance extends IbGibFormInstanceB
|
|
|
46
46
|
disconnected(): Promise<void>;
|
|
47
47
|
private initHandlers;
|
|
48
48
|
private setButtonLoading;
|
|
49
|
+
/**
|
|
50
|
+
* Triggered by Google / GitHub SSO buttons.
|
|
51
|
+
* Opens OAuth popup, exchanges authorization code, builds local delegate keystone,
|
|
52
|
+
* registers delegate on server, and finalizes onboarding.
|
|
53
|
+
*/
|
|
54
|
+
protected handleSsoClick(providerId: 'google' | 'github'): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Triggered by the "Send 6-Digit Verification Code" button.
|
|
57
|
+
* Validates quick email input and dispatches a 6-digit OTP code to the user's inbox.
|
|
58
|
+
*/
|
|
59
|
+
protected handleQuickSendCode(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Triggered by the "Verify Code" button.
|
|
62
|
+
* Submits 6-digit OTP code to custodian server, builds local sync delegate keystone,
|
|
63
|
+
* registers delegate on server, and finalizes onboarding.
|
|
64
|
+
*/
|
|
65
|
+
protected handleQuickVerifyCode(): Promise<void>;
|
|
49
66
|
/**
|
|
50
67
|
* Triggered by the "Generate" button.
|
|
51
68
|
* Orchestrates: Secret -> Local Genesis -> Graph Collection -> Server Sync.
|
|
52
69
|
*/
|
|
53
70
|
protected handleGenerate(): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* DRY helper to register keystones in the local keystones special index,
|
|
73
|
+
* set the active identity, and navigate to the Identity Manager component.
|
|
74
|
+
*/
|
|
75
|
+
private finalizeIdentityOnboarding;
|
|
76
|
+
private setFormDisabled;
|
|
54
77
|
protected renderUI(): Promise<void>;
|
|
55
78
|
handleContextUpdated(): Promise<void>;
|
|
56
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keystone-creator.d.mts","sourceRoot":"","sources":["../../../../../src/ui/component/identity/keystone-creator/keystone-creator.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keystone-creator.d.mts","sourceRoot":"","sources":["../../../../../src/ui/component/identity/keystone-creator/keystone-creator.mts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAa3D,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAG,MAAM,yCAAyC,CAAC;AAChH,OAAO,EACH,YAAY,EAAE,6BAA6B,EAC3C,qCAAqC,EACxC,MAAM,2BAA2B,CAAC;AAQnC,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AAExE;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,6BAA6B;IAC3E,SAAS,CAAC,EAAE,EAAE,MAAM,CAAoC;IAExD,WAAW,CAAC,EAAE,MAAM,CAAsD;IAC1E,aAAa,SAAmC;IAEhD,cAKC;IAEK,cAAc,CAAC,EACjB,IAAI,EACJ,SAAS,EACZ,EAAE;QACC,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,SAAS,CAAC;KACxB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAUzC;CACJ;AAED;;GAEG;AACH,UAAU,uBAAwB,SAAQ,YAAY;IAClD,WAAW,EAAE,cAAc,CAAC;IAC5B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,aAAa,EAAE,iBAAiB,CAAC;IACjC,YAAY,EAAE,cAAc,CAAC;IAC7B,cAAc,EAAE,WAAW,CAAC;IAC5B,aAAa,EAAE,gBAAgB,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,kBAAkB,EAAE,gBAAgB,CAAC;IACrC,UAAU,EAAE,cAAc,CAAC;IAC3B,UAAU,EAAE,oBAAoB,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,gCACT,SAAQ,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,CAC/D,YAAW,6BAA6B,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IAE3E,SAAS,CAAC,EAAE,EAAE,MAAM,CAAwC;IAC5D,OAAO,CAAC,qBAAqB,CAAS;IAEtC,cAEC;IAEc,UAAU,CAAC,IAAI,EAAE,qCAAqC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpF;IAEc,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BtC;YAEa,uBAAuB;IAgCtB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C;IAED,OAAO,CAAC,YAAY;IAgFpB,OAAO,CAAC,gBAAgB;IAQxB;;;;OAIG;IACH,UAAgB,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAyE7E;IAED;;;OAGG;IACH,UAAgB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCnD;IAED;;;;OAIG;IACH,UAAgB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8GrD;IAED;;;OAGG;IACH,UAAgB,cAAc,kBAyU7B;IAED;;;OAGG;YACW,0BAA0B;IAgIxC,OAAO,CAAC,eAAe;IA0BvB,UAAyB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjD;IAEc,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;CACJ"}
|
|
@@ -1,51 +1,123 @@
|
|
|
1
|
-
<div id="container" class="component-container">
|
|
2
|
-
<h2 id="title">Create Account</h2>
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
<
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
<
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
1
|
+
<div id="container" class="component-container">
|
|
2
|
+
<h2 id="title">Create Account</h2>
|
|
3
|
+
|
|
4
|
+
<!-- Mode Selector Tabs -->
|
|
5
|
+
<div class="mode-tabs">
|
|
6
|
+
<button id="tab-quick" class="mode-tab active">⚡ Quick (Passwordless)</button>
|
|
7
|
+
<button id="tab-password" class="mode-tab">🔑 Password-based</button>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<!-- Mode Subtitles -->
|
|
11
|
+
<p id="subtitle-quick" class="subtitle">⚡ Skip passwords — sign in with Google, GitHub, or an Email code. You can always set up a password later.</p>
|
|
12
|
+
<p id="subtitle-password" class="subtitle hidden">🔑 Full local ownership — your password never leaves your device. You can link Google or GitHub later.</p>
|
|
13
|
+
|
|
14
|
+
<div class="content">
|
|
15
|
+
<!-- ----------------------------------------------------------------- -->
|
|
16
|
+
<!-- Tab 1: Quick (Passwordless) Content -->
|
|
17
|
+
<!-- ----------------------------------------------------------------- -->
|
|
18
|
+
<div id="panel-quick" class="tab-panel">
|
|
19
|
+
<div class="sso-buttons">
|
|
20
|
+
<button id="btn-google-sso" class="sso-btn google-btn">
|
|
21
|
+
<svg width="18" height="18" viewBox="0 0 24 24"><path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/><path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/><path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.06H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.94l2.85-2.22.81-.63z"/><path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.66 2.84c.87-2.6 3.3-4.52 6.16-4.52z"/></svg>
|
|
22
|
+
Continue with Google
|
|
23
|
+
</button>
|
|
24
|
+
<button id="btn-github-sso" class="sso-btn github-btn">
|
|
25
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/></svg>
|
|
26
|
+
Continue with GitHub
|
|
27
|
+
</button>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div class="divider">
|
|
31
|
+
<span>OR USE EMAIL CODE</span>
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<div class="input-group">
|
|
35
|
+
<div style="display: flex; align-items: center; gap: 0.4rem;">
|
|
36
|
+
<label for="input-quick-email">Use custom email sign-in</label>
|
|
37
|
+
<button id="btn-email-info" class="info-icon-btn" title="Learn about custom email sign-in" style="background: none; border: none; cursor: pointer; padding: 0; font-size: 0.9rem; line-height: 1;">ℹ️</button>
|
|
38
|
+
</div>
|
|
39
|
+
<input type="email" id="input-quick-email" placeholder="Enter your email address..." class="text-input">
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<div class="action-row" style="margin-top: 0.75rem;">
|
|
43
|
+
<button id="btn-quick-send-code" class="action-btn">Send 6-Digit Verification Code</button>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<div id="section-quick-otp" class="input-group hidden" style="margin-top: 1.25rem; padding: 1rem; border: 1px dashed #89b4fa; border-radius: 8px; background: rgba(137, 180, 250, 0.05);">
|
|
47
|
+
<label for="input-quick-otp" style="font-weight: bold; color: #89b4fa;">✉️ Enter 6-Digit Email Verification Code</label>
|
|
48
|
+
<p style="font-size: 0.82rem; color: #a6adc8; margin-top: 0.25rem; margin-bottom: 0.75rem;">Check your email for your 6-digit verification code:</p>
|
|
49
|
+
<div style="display: flex; gap: 0.5rem; flex-wrap: wrap; align-items: center;">
|
|
50
|
+
<input type="text" id="input-quick-otp" maxlength="6" placeholder="123456" class="text-input" style="font-family: monospace; font-size: 1.2rem; letter-spacing: 4px; text-align: center; max-width: 160px;">
|
|
51
|
+
<button id="btn-quick-verify-code" class="action-btn" style="white-space: nowrap; width: auto;">Verify Code</button>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<!-- ----------------------------------------------------------------- -->
|
|
57
|
+
<!-- Tab 2: Password-based Content -->
|
|
58
|
+
<!-- ----------------------------------------------------------------- -->
|
|
59
|
+
<div id="panel-password" class="tab-panel hidden">
|
|
60
|
+
<div class="input-group">
|
|
61
|
+
<label for="input-username">Username</label>
|
|
62
|
+
<input type="text" id="input-username" placeholder="Enter your username..." class="text-input">
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<div class="input-group">
|
|
66
|
+
<label for="input-description">Description (Optional)</label>
|
|
67
|
+
<input type="text" id="input-description" placeholder="Enter an optional description..." class="text-input">
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<div class="input-group">
|
|
71
|
+
<label for="input-email">Primary Email (Optional)</label>
|
|
72
|
+
<input type="email" id="input-email" placeholder="Enter your primary email address..." class="text-input">
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<div class="input-group">
|
|
76
|
+
<label for="input-secret">Password (Keep this private!)</label>
|
|
77
|
+
<input type="password" id="input-secret" placeholder="Enter your password..." class="secret-input text-input">
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<div class="checkbox-group" style="margin-top: 0.5rem; margin-bottom: 1rem; display: flex; align-items: center; gap: 0.5rem;">
|
|
81
|
+
<input type="checkbox" id="checkbox-make-active" checked style="cursor: pointer; width: 1rem; height: 1rem;">
|
|
82
|
+
<label for="checkbox-make-active" style="cursor: pointer; font-size: 0.9rem; user-select: none;">Make this the active identity</label>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<div class="action-row">
|
|
86
|
+
<button id="btn-generate" class="action-btn">Generate Identity Keystone</button>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<!-- ----------------------------------------------------------------- -->
|
|
91
|
+
<!-- Status & Verification Areas -->
|
|
92
|
+
<!-- ----------------------------------------------------------------- -->
|
|
93
|
+
<div id="status-area" class="status-area hidden">
|
|
94
|
+
<p id="status-text" class="status-msg"></p>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
<div id="section-code-verification" class="input-group hidden" style="margin-top: 1.5rem; padding: 1rem; border: 1px dashed #89b4fa; border-radius: 8px; background: rgba(137, 180, 250, 0.05);">
|
|
98
|
+
<label for="input-verify-code" style="font-weight: bold; color: #89b4fa;">✉️ Enter 6-Digit Email Verification Code</label>
|
|
99
|
+
<p style="font-size: 0.82rem; color: #a6adc8; margin-top: 0.25rem; margin-bottom: 0.75rem;">A 6-digit verification code was sent to your email. Enter it below to activate your identity:</p>
|
|
100
|
+
<div style="display: flex; gap: 0.5rem; flex-wrap: wrap; align-items: center;">
|
|
101
|
+
<input type="text" id="input-verify-code" maxlength="6" placeholder="123456" class="text-input" style="font-family: monospace; font-size: 1.2rem; letter-spacing: 4px; text-align: center; max-width: 160px;">
|
|
102
|
+
<button id="btn-submit-code" class="action-btn" style="white-space: nowrap;">Verify Code</button>
|
|
103
|
+
<button id="btn-resend-code" class="action-btn" style="white-space: nowrap; background: #45475a; color: #cdd6f4;">Resend Code</button>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
<div id="result-area" class="result-area collapsed">
|
|
108
|
+
<h3>New Keystone Generated!</h3>
|
|
109
|
+
<p class="address-label">Address:</p>
|
|
110
|
+
<code id="keystone-addr" class="keystone-addr"></code>
|
|
111
|
+
<p class="warning">⚠️ Store this address safely. It is your root identity for this space.</p>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<div class="switch-workflow" style="margin-top: 1.2rem; text-align: center; font-size: 0.9rem; color: #a6adc8;">
|
|
115
|
+
Already have a device paired? <button id="btn-switch-sign-in" class="link-btn" style="background: none; border: none; color: #89b4fa; font-weight: 600; cursor: pointer; text-decoration: underline; padding: 0; font-size: 0.9rem;">Pair New Device</button>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<!-- Privacy Footer Note -->
|
|
119
|
+
<div class="privacy-footer" style="margin-top: 1rem; text-align: center; font-size: 0.78rem; color: #a6adc8; line-height: 1.4;">
|
|
120
|
+
ℹ️ Primary email addresses and identity keystones form part of the public graph for account discovery. Business data requires authorized sync delegates. Learn more in our <a id="link-privacy-policy" href="#privacy" style="color: #89b4fa; text-decoration: underline;">Privacy Policy</a>.
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
51
123
|
</div>
|