@ofidj/node 1.0.1 → 3.6.24
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/CHANGELOG.md +15 -0
- package/README.md +70 -0
- package/bpInfo.js +2 -2
- package/connection/Ajax.js +2 -2
- package/identity/FidjOidcClient.d.ts +27 -0
- package/identity/FidjOidcClient.js +168 -0
- package/index.d.ts +2 -0
- package/index.js +3 -1
- package/package.json +8 -5
- package/sdk/FidjNodeService.d.ts +7 -1
- package/sdk/FidjNodeService.js +77 -23
- package/sdk/IService.d.ts +5 -0
- package/server/verifyAppSession.d.ts +27 -0
- package/server/verifyAppSession.js +106 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
- Add validated OIDC/PKCE client, same-tab facade handoff and live tenant verification; remove the obsolete URL-join dependency and update Axios.
|
|
4
|
+
|
|
5
|
+
- Read effective roles live, including app groups; fail closed when the session is invalid.
|
|
6
|
+
|
|
7
|
+
- Add shared-account password recovery and email verification integration.
|
|
8
|
+
|
|
9
|
+
## 3.6.24 — Unreleased
|
|
10
|
+
|
|
11
|
+
- Add verifyAppSession for server-side audience/session verification and live membership roles; used by the generated TypeScript starter.
|
|
12
|
+
- Align the Mocha test runner with the API for current Node runtimes.
|
|
13
|
+
|
|
14
|
+
- Preserve DELETE request bodies through the SDK and Axios adapter, including explicit app-departure confirmation.
|
|
15
|
+
|
|
3
16
|
All notable changes to this project will be documented in this file.
|
|
4
17
|
|
|
5
18
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
@@ -7,6 +20,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
20
|
|
|
8
21
|
## [Unreleased]
|
|
9
22
|
|
|
23
|
+
## [15.1.14] - 2025-12-03
|
|
24
|
+
|
|
10
25
|
## [1.0.1] - 2026-05-27
|
|
11
26
|
|
|
12
27
|
### Changed
|
package/README.md
CHANGED
|
@@ -70,3 +70,73 @@ See [Changelog](./CHANGELOG.md).
|
|
|
70
70
|
## 📄 License
|
|
71
71
|
|
|
72
72
|
MIT
|
|
73
|
+
|
|
74
|
+
## Server-side app sessions
|
|
75
|
+
|
|
76
|
+
The 3.6.24 development version exports `verifyAppSession` for a Node backend:
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
import {verifyAppSession} from '@ofidj/node';
|
|
80
|
+
|
|
81
|
+
const session = await verifyAppSession(bearerToken, {
|
|
82
|
+
appId: process.env.FIDJ_APP_ID!,
|
|
83
|
+
apiEndpoint: process.env.FIDJ_API_ENDPOINT!,
|
|
84
|
+
});
|
|
85
|
+
if (!session.roles.includes('Editor') && !session.roles.includes('Owner')) {
|
|
86
|
+
// Respond with 403 before executing the protected operation.
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Call it on every protected operation. It rejects tokens for another app, delegates signature and stored-session validation to the configured Fidj API, and returns current membership roles rather than cached JWT role claims. It fails closed on timeouts or invalid upstream responses. Keep the endpoint configuration server-controlled and use HTTPS outside loopback development. No app signing key is required in the consumer backend.
|
|
91
|
+
|
|
92
|
+
The generated TypeScript starter and the mleweb example exercise this flow. This helper requires a runtime with `fetch` and `AbortSignal.timeout`; the examples and CI target Node 22/24.
|
|
93
|
+
|
|
94
|
+
## Account recovery and verification
|
|
95
|
+
|
|
96
|
+
After `init`, call `fidjForgotPasswordRequest(email)` for a neutral reset request, `resetPassword({token, password})` to consume a link, or `verifyEmail({token})` for explicit confirmation. These three methods work without an authenticated session. `resendVerification()` requires a signed-in session; `getMe()` returns `data.user.verified`. A reset changes the shared identity password and revokes existing sessions across apps.
|
|
97
|
+
|
|
98
|
+
Requires the coordinated 3.6.24 API and contracts changes. Passwords must contain at least 12 characters and no more than 72 UTF-8 bytes. Email links point to the API’s configured account UI.
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
`fidjRoles()` also reads effective roles from the API for signed-in sessions, including app-group grants and removals. It can now reject when the session or API is unavailable; handle that error instead of relying on cached access. Demo mode keeps its local behavior. `verifyAppSession` remains the check to use on protected backend operations; client UI checks alone do not authorize a request.
|
|
102
|
+
|
|
103
|
+
Authenticated `PUT /me` password changes require `{currentPassword, password}`. They apply the same password limits as reset, revoke existing sessions, and invalidate outstanding reset links. Sign in again after success. Name-only updates do not change credentials.
|
|
104
|
+
|
|
105
|
+
## Integrated OIDC beta
|
|
106
|
+
|
|
107
|
+
Use Node 22 LTS or later. `FidjOidcClient` uses `oauth4webapi` for protocol validation; the configured issuer and REST API must share an origin. Register the exact callback with the app owner console first.
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
import {FidjOidcClient} from '@ofidj/node';
|
|
111
|
+
const identity = new FidjOidcClient({
|
|
112
|
+
issuer: 'https://api.sandbox.fidj.ovh/oidc',
|
|
113
|
+
clientId: 'YOUR_APP_ID',
|
|
114
|
+
redirectUri: window.location.origin + window.location.pathname,
|
|
115
|
+
apiEndpoint: 'https://api.sandbox.fidj.ovh/v3',
|
|
116
|
+
storage: sessionStorage,
|
|
117
|
+
});
|
|
118
|
+
// On the sign-in action:
|
|
119
|
+
window.location.assign(await identity.beginLogin());
|
|
120
|
+
// On the registered callback, before opening application content:
|
|
121
|
+
await identity.completeLogin(new URL(window.location.href));
|
|
122
|
+
const accessToken = await identity.accessToken();
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
These are two lifecycle steps, not consecutive actions on one page load. Remove callback query parameters from browser history after capturing the callback. Transactions expire after ten minutes and are consumed once. The client validates issuer, state, nonce and ID-token signatures. Refresh calls are serialized within one client instance; expired/replayed sessions require login again. `logout()` revokes the app grant and clears local session storage.
|
|
126
|
+
|
|
127
|
+
The generated same-origin module and `FidjNodeService` facade recognize this same-tab session. The facade retains its historical API token-getter name for existing consumers; use `accessToken()` for new OIDC API integrations. The standalone ID token is identity evidence, not a REST bearer credential. A production backend-for-frontend with HttpOnly cookies remains a separate integration choice for confidential applications.
|
|
128
|
+
|
|
129
|
+
Backend tenant authorization:
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
import {verifyOrganizationSession} from '@ofidj/node';
|
|
133
|
+
const access = await verifyOrganizationSession(bearerToken, {
|
|
134
|
+
appId: process.env.FIDJ_APP_ID!,
|
|
135
|
+
apiEndpoint: process.env.FIDJ_API_ENDPOINT!,
|
|
136
|
+
organizationId,
|
|
137
|
+
permission: 'projects:write',
|
|
138
|
+
});
|
|
139
|
+
// Scope the application database query to access.organizationId as well.
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`verifyAppSession` now supports live opaque OIDC access tokens and validates the authoritative app/subject response. An app-wide role does not grant organization access. The integrated API tests exercise the shipped OIDC client, backend verifier and facade. Hosted issuer activation, independent conformance and stable package publication remain release gates.
|
package/bpInfo.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.bpInfo = void 0;
|
|
4
|
-
exports.bpInfo = { version: '
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
exports.bpInfo = { version: 'v3.6.24' };
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnBJbmZvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JwSW5mby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLE1BQU0sR0FBRyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUMsQ0FBQyJ9
|
package/connection/Ajax.js
CHANGED
|
@@ -181,7 +181,7 @@ class Ajax {
|
|
|
181
181
|
if (args.headers) {
|
|
182
182
|
opt.headers = args.headers;
|
|
183
183
|
}
|
|
184
|
-
const options = { headers: opt.headers };
|
|
184
|
+
const options = { headers: opt.headers, data: opt.data };
|
|
185
185
|
if (args.timeout) {
|
|
186
186
|
options['timeout'] = args.timeout;
|
|
187
187
|
}
|
|
@@ -227,4 +227,4 @@ class Ajax {
|
|
|
227
227
|
}
|
|
228
228
|
}
|
|
229
229
|
exports.Ajax = Ajax;
|
|
230
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWpheC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25uZWN0aW9uL0FqYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQTBCO0FBYzFCLElBQVksY0FTWDtBQVRELFdBQVksY0FBYztJQUN0QixxQ0FBbUIsQ0FBQTtJQUNuQixxQ0FBbUIsQ0FBQTtJQUNuQixtQ0FBaUIsQ0FBQTtJQUNqQiwrQ0FBNkIsQ0FBQTtJQUM3Qix5Q0FBdUIsQ0FBQTtJQUN2Qix5Q0FBdUIsQ0FBQTtJQUN2QiwyQ0FBeUIsQ0FBQTtJQUN6QiwrQ0FBNkIsQ0FBQTtBQUNqQyxDQUFDLEVBVFcsY0FBYyw4QkFBZCxjQUFjLFFBU3pCO0FBVUQsTUFBYSxJQUFJO0lBQ2IsZ0JBQWUsQ0FBQztJQUVSLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFhO1FBQzNDLElBQ0ksQ0FBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsTUFBTTtZQUNoQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsRUFDL0UsQ0FBQztZQUNDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDeEQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM5QyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztR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
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as oauth from 'oauth4webapi';
|
|
2
|
+
export interface OidcOptions {
|
|
3
|
+
issuer: string;
|
|
4
|
+
clientId: string;
|
|
5
|
+
redirectUri: string;
|
|
6
|
+
apiEndpoint: string;
|
|
7
|
+
storage: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
|
|
8
|
+
}
|
|
9
|
+
export declare class FidjOidcClient {
|
|
10
|
+
private options;
|
|
11
|
+
private metadata;
|
|
12
|
+
private refreshPending;
|
|
13
|
+
private readonly prefix;
|
|
14
|
+
constructor(options: OidcOptions);
|
|
15
|
+
private network;
|
|
16
|
+
private discovery;
|
|
17
|
+
hasSession(): boolean;
|
|
18
|
+
private session;
|
|
19
|
+
beginLogin(): Promise<string>;
|
|
20
|
+
completeLogin(callback: URL): Promise<oauth.IDToken>;
|
|
21
|
+
private save;
|
|
22
|
+
accessToken(): Promise<string>;
|
|
23
|
+
private refresh;
|
|
24
|
+
request(path: string, method?: string, data?: unknown): Promise<any>;
|
|
25
|
+
logout(): Promise<void>;
|
|
26
|
+
clear(): void;
|
|
27
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
45
|
+
var t = {};
|
|
46
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
47
|
+
t[p] = s[p];
|
|
48
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
49
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
50
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
51
|
+
t[p[i]] = s[p[i]];
|
|
52
|
+
}
|
|
53
|
+
return t;
|
|
54
|
+
};
|
|
55
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
56
|
+
exports.FidjOidcClient = void 0;
|
|
57
|
+
const oauth = __importStar(require("oauth4webapi"));
|
|
58
|
+
class FidjOidcClient {
|
|
59
|
+
constructor(options) {
|
|
60
|
+
this.options = options;
|
|
61
|
+
const issuer = new URL(options.issuer), api = new URL(options.apiEndpoint), redirect = new URL(options.redirectUri);
|
|
62
|
+
if (issuer.origin !== api.origin || issuer.pathname !== '/oidc' || issuer.search || issuer.hash || issuer.username || issuer.password || (issuer.protocol !== 'https:' && !['localhost', '127.0.0.1'].includes(issuer.hostname)) || redirect.hash || redirect.username || redirect.password || (redirect.protocol !== 'https:' && !['localhost', '127.0.0.1'].includes(redirect.hostname)))
|
|
63
|
+
throw new Error('Use a trusted issuer/API origin and an exact HTTPS callback (loopback allowed for development).');
|
|
64
|
+
this.prefix = 'fidj.oidc.' + options.clientId;
|
|
65
|
+
}
|
|
66
|
+
network() { return Object.assign(Object.assign({}, (this.options.issuer.startsWith('http:') ? { [oauth.allowInsecureRequests]: true } : {})), { signal: AbortSignal.timeout(10000) }); }
|
|
67
|
+
discovery() {
|
|
68
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
+
if (!this.metadata) {
|
|
70
|
+
const issuer = new URL(this.options.issuer);
|
|
71
|
+
this.metadata = yield oauth.processDiscoveryResponse(issuer, yield oauth.discoveryRequest(issuer, Object.assign(Object.assign({}, this.network()), { algorithm: 'oidc' })));
|
|
72
|
+
for (const endpoint of ['authorization_endpoint', 'token_endpoint', 'jwks_uri'])
|
|
73
|
+
if (new URL(String(this.metadata[endpoint])).origin !== issuer.origin)
|
|
74
|
+
throw new Error('Unexpected identity endpoint origin');
|
|
75
|
+
}
|
|
76
|
+
return this.metadata;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
hasSession() { return !!this.options.storage.getItem(this.prefix + '.session'); }
|
|
80
|
+
session() { return JSON.parse(this.options.storage.getItem(this.prefix + '.session') || 'null'); }
|
|
81
|
+
beginLogin() {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
const as = yield this.discovery(), verifier = oauth.generateRandomCodeVerifier(), state = oauth.generateRandomState(), nonce = oauth.generateRandomNonce();
|
|
84
|
+
this.options.storage.setItem(this.prefix + '.transaction', JSON.stringify({ verifier, state, nonce, createdAt: Date.now() }));
|
|
85
|
+
const url = new URL(as.authorization_endpoint);
|
|
86
|
+
url.search = new URLSearchParams({ client_id: this.options.clientId, redirect_uri: this.options.redirectUri, response_type: 'code', scope: 'openid profile email offline_access fidj:api', prompt: 'login consent', state, nonce, code_challenge: yield oauth.calculatePKCECodeChallenge(verifier), code_challenge_method: 'S256' }).toString();
|
|
87
|
+
return url.href;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
completeLogin(callback) {
|
|
91
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
+
const transaction = JSON.parse(this.options.storage.getItem(this.prefix + '.transaction') || 'null');
|
|
93
|
+
this.options.storage.removeItem(this.prefix + '.transaction');
|
|
94
|
+
const expected = new URL(this.options.redirectUri);
|
|
95
|
+
if (!transaction || Date.now() - transaction.createdAt > 600000 || callback.origin !== expected.origin || callback.pathname !== expected.pathname)
|
|
96
|
+
throw new Error('Login transaction expired or callback mismatch');
|
|
97
|
+
const as = yield this.discovery(), client = { client_id: this.options.clientId };
|
|
98
|
+
const params = oauth.validateAuthResponse(as, client, callback, transaction.state);
|
|
99
|
+
const response = yield oauth.authorizationCodeGrantRequest(as, client, oauth.None(), params, this.options.redirectUri, transaction.verifier, this.network());
|
|
100
|
+
const tokens = yield oauth.processAuthorizationCodeResponse(as, client, response, { expectedNonce: transaction.nonce, requireIdToken: true });
|
|
101
|
+
yield oauth.validateApplicationLevelSignature(as, response, this.network());
|
|
102
|
+
const identity = oauth.getValidatedIdTokenClaims(tokens);
|
|
103
|
+
this.save(tokens, identity);
|
|
104
|
+
const _a = this.options, { storage } = _a, publicOptions = __rest(_a, ["storage"]);
|
|
105
|
+
storage.setItem(this.prefix + '.config', JSON.stringify(publicOptions));
|
|
106
|
+
return identity;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
save(tokens, identity) { this.options.storage.setItem(this.prefix + '.session', JSON.stringify({ tokens, identity, expiresAt: Date.now() + Number(tokens.expires_in || 300) * 1000 })); }
|
|
110
|
+
accessToken() {
|
|
111
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
+
const session = this.session();
|
|
113
|
+
if (!session)
|
|
114
|
+
throw Object.assign(new Error('Sign in first'), { code: 401 });
|
|
115
|
+
if (session.expiresAt < Date.now() + 30000) {
|
|
116
|
+
if (!this.refreshPending)
|
|
117
|
+
this.refreshPending = this.refresh().finally(() => { this.refreshPending = undefined; });
|
|
118
|
+
yield this.refreshPending;
|
|
119
|
+
}
|
|
120
|
+
return this.session().tokens.access_token;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
refresh() {
|
|
124
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
125
|
+
const session = this.session();
|
|
126
|
+
try {
|
|
127
|
+
const as = yield this.discovery(), client = { client_id: this.options.clientId };
|
|
128
|
+
if (!(session === null || session === void 0 ? void 0 : session.tokens.refresh_token))
|
|
129
|
+
throw new Error('No refresh token');
|
|
130
|
+
const response = yield oauth.refreshTokenGrantRequest(as, client, oauth.None(), session.tokens.refresh_token, this.network());
|
|
131
|
+
const tokens = yield oauth.processRefreshTokenResponse(as, client, response);
|
|
132
|
+
if (tokens.id_token)
|
|
133
|
+
yield oauth.validateApplicationLevelSignature(as, response, this.network());
|
|
134
|
+
this.save(tokens, session.identity);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
this.clear();
|
|
138
|
+
throw Object.assign(new Error('Session expired; sign in again'), { code: 401, cause: error });
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
request(path_1) {
|
|
143
|
+
return __awaiter(this, arguments, void 0, function* (path, method = 'GET', data) {
|
|
144
|
+
if (!path.startsWith('/') || path.startsWith('//') || path.includes('..'))
|
|
145
|
+
throw new Error('Use an API-relative path');
|
|
146
|
+
const response = yield fetch(this.options.apiEndpoint.replace(/\/$/, '') + path, { method, headers: { Authorization: 'Bearer ' + (yield this.accessToken()), 'Content-Type': 'application/json' }, body: data === undefined ? undefined : JSON.stringify(data), redirect: 'error', signal: AbortSignal.timeout(10000) });
|
|
147
|
+
const result = response.status === 204 ? undefined : yield response.json();
|
|
148
|
+
if (!response.ok) {
|
|
149
|
+
if (response.status === 401)
|
|
150
|
+
this.clear();
|
|
151
|
+
throw Object.assign(new Error((result === null || result === void 0 ? void 0 : result.message) || 'Request failed'), { code: response.status });
|
|
152
|
+
}
|
|
153
|
+
return { status: response.status, data: result };
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
logout() {
|
|
157
|
+
return __awaiter(this, void 0, void 0, function* () { try {
|
|
158
|
+
if (this.hasSession())
|
|
159
|
+
yield this.request('/me/oidc/logout', 'POST', {});
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
this.clear();
|
|
163
|
+
} });
|
|
164
|
+
}
|
|
165
|
+
clear() { this.options.storage.removeItem(this.prefix + '.session'); this.options.storage.removeItem(this.prefix + '.transaction'); }
|
|
166
|
+
}
|
|
167
|
+
exports.FidjOidcClient = FidjOidcClient;
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlkak9pZGNDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkvRmlkak9pZGNDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBc0M7QUFFdEMsTUFBYSxjQUFjO0lBSXZCLFlBQW9CLE9BQW9CO1FBQXBCLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwSCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlHQUFpRyxDQUFDLENBQUM7UUFD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
|
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -20,4 +20,6 @@ __exportStar(require("./session"), exports);
|
|
|
20
20
|
__exportStar(require("./tools"), exports);
|
|
21
21
|
// API contracts (TypeScript interfaces for REST endpoints) — re-exported from @ofidj/contracts
|
|
22
22
|
__exportStar(require("@ofidj/contracts"), exports);
|
|
23
|
-
|
|
23
|
+
__exportStar(require("./server/verifyAppSession"), exports);
|
|
24
|
+
__exportStar(require("./identity/FidjOidcClient"), exports);
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUE2QjtBQUM3Qix3Q0FBc0I7QUFDdEIsNENBQTBCO0FBQzFCLDBDQUF3QjtBQUV4QiwrRkFBK0Y7QUFDL0YsbURBQWlDO0FBQ2pDLDREQUEwQztBQUUxQyw0REFBMEMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ofidj/node",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.6.24",
|
|
4
4
|
"author": "fidj",
|
|
5
5
|
"description": "fidj node tools ",
|
|
6
6
|
"keywords": [],
|
|
@@ -38,10 +38,10 @@
|
|
|
38
38
|
"test-coverage": "nyc npm run test"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@ofidj/contracts": "^
|
|
42
|
-
"axios": "
|
|
41
|
+
"@ofidj/contracts": "^3.6.24",
|
|
42
|
+
"axios": "1.20.0",
|
|
43
43
|
"base-64": "^1.0.0",
|
|
44
|
-
"
|
|
44
|
+
"oauth4webapi": "3.8.2"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@eslint/eslintrc": "^3.3.1",
|
|
@@ -62,11 +62,14 @@
|
|
|
62
62
|
"eslint-plugin-prettier": "^5.4.1",
|
|
63
63
|
"jasmine": "^5.8.0",
|
|
64
64
|
"jasmine-ajax": "^4.0.0",
|
|
65
|
-
"mocha": "^
|
|
65
|
+
"mocha": "^11.8.0",
|
|
66
66
|
"nyc": "^15.1.0",
|
|
67
67
|
"prettier": "^3.5.3",
|
|
68
68
|
"ts-node": "^10.9.2",
|
|
69
69
|
"tslint": "^6.1.3",
|
|
70
70
|
"typescript": "^5.6.3"
|
|
71
|
+
},
|
|
72
|
+
"engines": {
|
|
73
|
+
"node": ">=22"
|
|
71
74
|
}
|
|
72
75
|
}
|
package/sdk/FidjNodeService.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as connection from '../connection';
|
|
2
2
|
import { EndpointCallInterface, EndpointFilterInterface, EndpointInterface, ErrorInterface, LoggerInterface, ModuleServiceInitOptionsInterface, ModuleServiceLoginCallOptionsInterface, ModuleServiceLoginOptionsInterface } from './Interfaces';
|
|
3
3
|
import { IService } from './IService';
|
|
4
|
-
import { FidjApiConsentsResponse, FidjApiConsentsUpdateRequest, FidjApiConsentsHistoryResponse, FidjApiUsersMeResponse, FidjApiUsersMeDetailsResponse, FidjApiUsersMeUpdateRequest } from '@ofidj/contracts';
|
|
4
|
+
import { FidjApiConsentsResponse, FidjApiConsentsUpdateRequest, FidjApiConsentsHistoryResponse, FidjApiUsersMeResponse, FidjApiUsersMeDetailsResponse, FidjApiUsersMeUpdateRequest, FidjApiResetPasswordRequest, FidjApiVerifyEmailRequest } from '@ofidj/contracts';
|
|
5
5
|
export declare class FidjNodeService implements IService {
|
|
6
6
|
static DEFAULT_TIMEOUT_MS: number;
|
|
7
7
|
static SANDBOX_FIDJ_ID: string;
|
|
@@ -22,6 +22,8 @@ export declare class FidjNodeService implements IService {
|
|
|
22
22
|
loginInDemoMode(options?: ModuleServiceLoginOptionsInterface): Promise<any | ErrorInterface>;
|
|
23
23
|
initAndLogin(login: string, password: string, fidjId?: string, options?: ModuleServiceInitOptionsInterface, loginOptions?: ModuleServiceLoginCallOptionsInterface): Promise<connection.ClientUser>;
|
|
24
24
|
initDemo(fidjId?: string, options?: ModuleServiceInitOptionsInterface): Promise<any>;
|
|
25
|
+
private oidcClient;
|
|
26
|
+
private oidc;
|
|
25
27
|
isLoggedIn(): boolean;
|
|
26
28
|
needsRefresh(): boolean;
|
|
27
29
|
isConnected(): Promise<boolean>;
|
|
@@ -68,6 +70,10 @@ export declare class FidjNodeService implements IService {
|
|
|
68
70
|
data?: FidjApiConsentsHistoryResponse;
|
|
69
71
|
}>;
|
|
70
72
|
fidjForgotPasswordRequest(email: string): Promise<void>;
|
|
73
|
+
resetPassword(data: FidjApiResetPasswordRequest): Promise<void>;
|
|
74
|
+
verifyEmail(data: FidjApiVerifyEmailRequest): Promise<void>;
|
|
75
|
+
resendVerification(): Promise<void>;
|
|
76
|
+
private accountPost;
|
|
71
77
|
fidjGetIdToken(): Promise<string>;
|
|
72
78
|
protected _removeAll(): Promise<void | ErrorInterface>;
|
|
73
79
|
private _loginInternal;
|
package/sdk/FidjNodeService.js
CHANGED
|
@@ -41,20 +41,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
41
41
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
42
|
});
|
|
43
43
|
};
|
|
44
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
-
};
|
|
47
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
45
|
exports.FidjNodeService = void 0;
|
|
46
|
+
const FidjOidcClient_1 = require("../identity/FidjOidcClient");
|
|
49
47
|
const tools = __importStar(require("../tools"));
|
|
50
48
|
const connection = __importStar(require("../connection"));
|
|
51
49
|
const connection_1 = require("../connection");
|
|
52
50
|
const session = __importStar(require("../session"));
|
|
53
51
|
const Interfaces_1 = require("./Interfaces");
|
|
54
52
|
const LoggerService_1 = require("./LoggerService");
|
|
55
|
-
const proper_url_join_1 = __importDefault(require("proper-url-join"));
|
|
56
53
|
const FidjError_1 = require("./FidjError");
|
|
57
54
|
const bpInfo_1 = require("../bpInfo");
|
|
55
|
+
const verifyAppSession_1 = require("../server/verifyAppSession");
|
|
58
56
|
// TODO const PouchDB = window['PouchDB'] || require('pouchdb').default;
|
|
59
57
|
class FidjNodeService {
|
|
60
58
|
constructor(logger, promise, options) {
|
|
@@ -172,8 +170,9 @@ class FidjNodeService {
|
|
|
172
170
|
yield this.connection.setConnection(clientTokens);
|
|
173
171
|
}
|
|
174
172
|
catch (err) {
|
|
175
|
-
if (err instanceof FidjError_1.FidjError)
|
|
173
|
+
if (err instanceof FidjError_1.FidjError) {
|
|
176
174
|
throw err;
|
|
175
|
+
}
|
|
177
176
|
const code = typeof (err === null || err === void 0 ? void 0 : err.code) === 'number' ? err.code : 500;
|
|
178
177
|
throw new FidjError_1.FidjError(code, (err === null || err === void 0 ? void 0 : err.toString) ? err.toString() : String(err));
|
|
179
178
|
}
|
|
@@ -245,7 +244,24 @@ class FidjNodeService {
|
|
|
245
244
|
return this.loginInDemoMode();
|
|
246
245
|
});
|
|
247
246
|
}
|
|
247
|
+
oidc() {
|
|
248
|
+
if (this.oidcClient)
|
|
249
|
+
return this.oidcClient;
|
|
250
|
+
if (typeof sessionStorage === 'undefined' || !this.connection.fidjId)
|
|
251
|
+
return undefined;
|
|
252
|
+
const saved = sessionStorage.getItem('fidj.oidc.' + this.connection.fidjId + '.config');
|
|
253
|
+
if (!saved)
|
|
254
|
+
return undefined;
|
|
255
|
+
const options = JSON.parse(saved);
|
|
256
|
+
const expectedApi = this.connection.apiEndpoint || (this.sdk.prod ? 'https://api.fidj.ovh/v3' : 'https://api.sandbox.fidj.ovh/v3');
|
|
257
|
+
if (options.apiEndpoint.replace(/\/$/, '') !== expectedApi.replace(/\/$/, '') || options.clientId !== this.connection.fidjId)
|
|
258
|
+
return undefined;
|
|
259
|
+
this.oidcClient = new FidjOidcClient_1.FidjOidcClient(Object.assign(Object.assign({}, options), { storage: sessionStorage }));
|
|
260
|
+
return this.oidcClient;
|
|
261
|
+
}
|
|
248
262
|
isLoggedIn() {
|
|
263
|
+
if (this.oidc())
|
|
264
|
+
return this.oidc().hasSession();
|
|
249
265
|
return this.connection.isLogin();
|
|
250
266
|
}
|
|
251
267
|
needsRefresh() {
|
|
@@ -287,7 +303,18 @@ class FidjNodeService {
|
|
|
287
303
|
}
|
|
288
304
|
fidjRoles() {
|
|
289
305
|
return __awaiter(this, void 0, void 0, function* () {
|
|
290
|
-
|
|
306
|
+
var _a;
|
|
307
|
+
if (!this.isLoggedIn() || ((_a = this.connection.getUser()) === null || _a === void 0 ? void 0 : _a.id) === 'demo') {
|
|
308
|
+
return JSON.parse(yield this.connection.getIdPayload({ roles: [] })).roles || [];
|
|
309
|
+
}
|
|
310
|
+
const endpoints = yield this.connection.getApiEndpoints({ filter: 'theBestOne' });
|
|
311
|
+
if (endpoints.length !== 1)
|
|
312
|
+
throw new FidjError_1.FidjError(503, 'No identity endpoint is available.');
|
|
313
|
+
const session = yield (0, verifyAppSession_1.verifyAppSession)(yield this.fidjGetIdToken(), {
|
|
314
|
+
appId: this.connection.fidjId,
|
|
315
|
+
apiEndpoint: endpoints[0].url,
|
|
316
|
+
});
|
|
317
|
+
return session.roles;
|
|
291
318
|
});
|
|
292
319
|
}
|
|
293
320
|
fidjMessage() {
|
|
@@ -297,6 +324,8 @@ class FidjNodeService {
|
|
|
297
324
|
}
|
|
298
325
|
logout(force) {
|
|
299
326
|
return __awaiter(this, void 0, void 0, function* () {
|
|
327
|
+
if (this.oidc())
|
|
328
|
+
return this.oidc().logout();
|
|
300
329
|
if (!this.connection.getClient() && !force) {
|
|
301
330
|
return this._removeAll().then(() => {
|
|
302
331
|
return this.session.create(this.connection.fidjId, true);
|
|
@@ -317,6 +346,10 @@ class FidjNodeService {
|
|
|
317
346
|
}
|
|
318
347
|
sync() {
|
|
319
348
|
return __awaiter(this, arguments, void 0, function* (options = { forceRefresh: false }) {
|
|
349
|
+
if (this.oidc()) {
|
|
350
|
+
yield this.oidc().request('/me');
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
320
353
|
this.logger.log('fidj.sdk.service.sync');
|
|
321
354
|
this.logger.log('fidj.sdk.service.sync: you ar not using DB - no sync available.');
|
|
322
355
|
try {
|
|
@@ -463,6 +496,10 @@ class FidjNodeService {
|
|
|
463
496
|
}
|
|
464
497
|
sendOnEndpoint(input) {
|
|
465
498
|
return __awaiter(this, void 0, void 0, function* () {
|
|
499
|
+
if (this.oidc()) {
|
|
500
|
+
const base = input.defaultKeyUrl ? new URL(input.defaultKeyUrl).pathname.replace(/^\/v3/, '') : '/' + (input.key || 'me');
|
|
501
|
+
return this.oidc().request(base + (input.relativePath ? '/' + input.relativePath : ''), input.verb, input.data);
|
|
502
|
+
}
|
|
466
503
|
yield this.sync();
|
|
467
504
|
const filter = input.key ? { key: input.key } : null;
|
|
468
505
|
const endpoints = yield this.fidjGetEndpoints(filter);
|
|
@@ -471,7 +508,7 @@ class FidjNodeService {
|
|
|
471
508
|
}
|
|
472
509
|
let firstEndpointUrl = !endpoints || endpoints.length !== 1 ? input.defaultKeyUrl : endpoints[0].url;
|
|
473
510
|
if (input.relativePath) {
|
|
474
|
-
firstEndpointUrl = (
|
|
511
|
+
firstEndpointUrl = new URL(input.relativePath.replace(/^\/+/, ''), firstEndpointUrl.replace(/\/?$/, '/')).href;
|
|
475
512
|
}
|
|
476
513
|
const jwt = yield this.connection.getIdToken();
|
|
477
514
|
let answer;
|
|
@@ -513,7 +550,7 @@ class FidjNodeService {
|
|
|
513
550
|
Authorization: 'Bearer ' + jwt,
|
|
514
551
|
},
|
|
515
552
|
timeout: input.timeout,
|
|
516
|
-
|
|
553
|
+
data: input.data,
|
|
517
554
|
});
|
|
518
555
|
break;
|
|
519
556
|
default:
|
|
@@ -526,7 +563,7 @@ class FidjNodeService {
|
|
|
526
563
|
Authorization: 'Bearer ' + jwt,
|
|
527
564
|
},
|
|
528
565
|
timeout: input.timeout,
|
|
529
|
-
|
|
566
|
+
data: input.data,
|
|
530
567
|
});
|
|
531
568
|
}
|
|
532
569
|
return answer;
|
|
@@ -589,25 +626,42 @@ class FidjNodeService {
|
|
|
589
626
|
}
|
|
590
627
|
fidjForgotPasswordRequest(email) {
|
|
591
628
|
return __awaiter(this, void 0, void 0, function* () {
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
yield
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
629
|
+
yield this.accountPost('/me/forgot', { email });
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
resetPassword(data) {
|
|
633
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
634
|
+
yield this.accountPost('/me/reset-password', data);
|
|
635
|
+
yield this.logout(true);
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
verifyEmail(data) {
|
|
639
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
640
|
+
yield this.accountPost('/users/verify-email', data);
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
resendVerification() {
|
|
644
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
645
|
+
yield this.sendOnEndpoint({ verb: 'POST', key: 'me', relativePath: 'resend-verification' });
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
accountPost(path, data) {
|
|
649
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
650
|
+
const endpoints = yield this.connection.getApiEndpoints({ filter: 'theBestOne' });
|
|
651
|
+
if (!endpoints || endpoints.length !== 1)
|
|
652
|
+
throw new FidjError_1.FidjError(400, 'No configured account API endpoint.');
|
|
653
|
+
yield new connection_1.Ajax().post({
|
|
654
|
+
url: endpoints[0].url.replace(/\/$/, '') + path,
|
|
655
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
656
|
+
data,
|
|
605
657
|
timeout: FidjNodeService.DEFAULT_TIMEOUT_MS,
|
|
606
658
|
});
|
|
607
659
|
});
|
|
608
660
|
}
|
|
609
661
|
fidjGetIdToken() {
|
|
610
662
|
return __awaiter(this, void 0, void 0, function* () {
|
|
663
|
+
if (this.oidc())
|
|
664
|
+
return this.oidc().accessToken();
|
|
611
665
|
return this.connection.getIdToken();
|
|
612
666
|
});
|
|
613
667
|
}
|
|
@@ -679,4 +733,4 @@ exports.FidjNodeService = FidjNodeService;
|
|
|
679
733
|
FidjNodeService.DEFAULT_TIMEOUT_MS = 60000;
|
|
680
734
|
FidjNodeService.SANDBOX_FIDJ_ID = 'fidj-sandbox-0123fe7ed0000001';
|
|
681
735
|
FidjNodeService._srvDataUniqId = 0;
|
|
682
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlkak5vZGVTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nkay9GaWRqTm9kZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWtDO0FBQ2xDLDBEQUE0QztBQUM1Qyw4Q0FBNEQ7QUFDNUQsb0RBQXNDO0FBRXRDLDZDQVdzQjtBQUN0QixtREFBOEM7QUFDOUMsc0VBQXNDO0FBQ3RDLDJDQUFzQztBQUV0QyxzQ0FBaUM7QUFVakMsd0VBQXdFO0FBRXhFLE1BQWEsZUFBZTtJQVl4QixZQUNJLE1BQXdCLEVBQ3hCLE9BQTRCLEVBQzVCLE9BQTJDO1FBRTNDLElBQUksQ0FBQyxHQUFHLEdBQUc7WUFDUCxHQUFHLEVBQUUsTUFBTTtZQUNYLE9BQU8sRUFBRSxlQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxFQUFFLEtBQUs7WUFDWCxLQUFLLEVBQUUsSUFBSTtTQUNkLENBQUM7UUFDRixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDZCQUFhLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBWTtRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBWTtRQUMvQixPQUFPLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFZO1FBQ2hDLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQztZQUNELEtBQUssR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsT0FBTyxPQUFPLEVBQUUsQ0FBQztZQUNmLGtGQUFrRjtRQUN0RixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFZO1FBQ2hDLE9BQU8sT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBRVksSUFBSSxDQUFDLE1BQWUsRUFBRSxPQUEyQzs7O1lBQzFFLElBQUksT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLDRCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRXJELDhEQUE4RDtZQUM5RCxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN6QyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNmLE1BQU0sR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDO2dCQUN6QyxPQUFPLEdBQUcsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7WUFDL0UsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDOUMsQ0FBQztZQUVELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBQSxPQUFPLENBQUMsSUFBSSxtQ0FBSSxJQUFJLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQUEsT0FBTyxDQUFDLEtBQUssbUNBQUksS0FBSyxDQUFDLENBQUM7WUFDN0QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQ2hCLE1BQU0sRUFDTixDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO2dCQUNoRSxDQUFDLENBQUMsS0FBSztnQkFDUCxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFDcEIsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFdBQVcsQ0FDdkIsQ0FBQztZQUVGLElBQUksUUFBUSxHQUFHLEVBQUUsRUFDYixXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQztnQkFDRCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDL0MsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQztnQkFDekUsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFDLENBQUMsQ0FBQztZQUNuRixDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxLQUFLLEdBQUcsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsRSxNQUFNLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsa0NBQWtDLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDekUsQ0FBQztZQUVELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJO29CQUN6QixDQUFDLENBQUMseUJBQXlCO29CQUMzQixDQUFDLENBQUMsaUNBQWlDLENBQUM7Z0JBQ3hDLE1BQU0sSUFBSSxxQkFBUyxDQUNmLEdBQUcsRUFDSCxvQ0FBb0M7b0JBQ2hDLE9BQU87b0JBQ1AseURBQXlELENBQ2hFLENBQUM7WUFDTixDQUFDO1lBRUQsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNYLG1EQUFtRCxFQUNuRCxlQUFlLEVBQ2YsT0FBTyxDQUNWLENBQUM7WUFFRixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FDckIsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdEIsZUFBZSxDQUFDLEdBQUcsRUFDbkIsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsR0FBRyxFQUNSLElBQUksQ0FBQyxNQUFNLENBQ2QsQ0FDSixDQUFDO1FBQ04sQ0FBQztLQUFBO0lBRVksS0FBSyxDQUNkLEtBQWEsRUFDYixRQUFnQixFQUNoQixPQUFnRDs7WUFFaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO2dCQUNoQixJQUFJLEdBQUcsWUFBWSxxQkFBUztvQkFBRSxNQUFNLEdBQUcsQ0FBQztnQkFDeEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxJQUFJLENBQUEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDNUQsTUFBTSxJQUFJLHFCQUFTLENBQUMsSUFBSSxFQUFFLENBQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1RSxDQUFDO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsQ0FBQztLQUFBO0lBRVksZUFBZSxDQUN4QixPQUE0Qzs7WUFFNUMscUNBQXFDO1lBQ3JDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNYLEtBQUssRUFBRSxFQUFFO29CQUNULE9BQU8sRUFBRSxNQUFNO29CQUNmLElBQUksRUFBRSxFQUFFO29CQUNSLFNBQVMsRUFBRSxFQUFFO29CQUNiLEdBQUcsRUFBRSxFQUFFO29CQUNQLEdBQUcsRUFBRSxRQUFRO2lCQUNoQixDQUFDLENBQ0wsQ0FBQztnQkFDRixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sS0FBSyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUM7Z0JBQ3RELE9BQU8sR0FBRztvQkFDTixXQUFXLEVBQUUsS0FBSztvQkFDbEIsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsWUFBWSxFQUFFLEtBQUs7aUJBQ3RCLENBQUM7WUFDTixDQUFDO1lBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxVQUFVLEVBQUU7cUJBQ1osSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDUCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkQsQ0FBQyxDQUFDO3FCQUNELElBQUksQ0FBQyxHQUFTLEVBQUU7b0JBQ2IsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDLENBQUEsQ0FBQztxQkFDRCxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDbkUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixDQUFDLENBQUMsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUFBO0lBRUQsd0NBQXdDO0lBQ3hDLCtFQUErRTtJQUMvRSwwRUFBMEU7SUFDN0QsWUFBWSxDQUNyQixLQUFhLEVBQ2IsUUFBZ0IsRUFDaEIsTUFBZSxFQUNmLE9BQTJDLEVBQzNDLFlBQXFEOztZQUVyRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3JELENBQUM7S0FBQTtJQUVELGtEQUFrRDtJQUNsRCxzRUFBc0U7SUFDekQsUUFBUSxDQUFDLE1BQWUsRUFBRSxPQUEyQzs7WUFDOUUsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqQyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNsQyxDQUFDO0tBQUE7SUFFTSxVQUFVO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxZQUFZO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVNLFdBQVc7O1FBQ2QsT0FBTyxNQUFBLElBQUksQ0FBQyxVQUFVLDBDQUFFLFdBQVcsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTSxZQUFZO1FBQ2YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUEsVUFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxPQUFPLElBQUksc0JBQVMsQ0FDaEIsSUFBSSxFQUNKLElBQUksQ0FBQyxVQUFVLEVBQ2YsVUFBVSxDQUFDLEVBQUUsRUFDYixVQUFVLENBQUMsUUFBUSxFQUNuQixVQUFVLENBQUMsS0FBSyxDQUNuQixDQUFDO1FBQ04sQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFWSxnQkFBZ0IsQ0FDekIsTUFBZ0M7O1lBRWhDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDVixNQUFNLEdBQUcsRUFBQyxXQUFXLEVBQUUsS0FBSyxFQUFDLENBQUM7WUFDbEMsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUMsQ0FBQyxDQUFDO1lBQ25FLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLE9BQU8sRUFBRSxDQUFDO1lBQ2QsQ0FBQztZQUVELFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBMkIsRUFBRSxFQUFFO2dCQUN6RCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7Z0JBQ2QsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNuQixFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUNyQyxDQUFDO2dCQUNELElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUM1QixFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO2dCQUMzQixDQUFDO2dCQUNELE9BQU8sRUFBRSxDQUFDO1lBQ2QsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDO0tBQUE7SUFFWSxTQUFTOztZQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzdFLENBQUM7S0FBQTtJQUVZLFdBQVc7O1lBQ3BCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUMsT0FBTyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDakYsQ0FBQztLQUFBO0lBRVksTUFBTSxDQUFDLEtBQWU7O1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQy9CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdELENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLFVBQVU7aUJBQ2pCLE1BQU0sRUFBRTtpQkFDUixJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNQLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsR0FBRyxFQUFFO2dCQUNSLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQztpQkFDRCxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0QsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDO0tBQUE7SUFFWSxJQUFJOzZEQUNiLFVBSUksRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFDO1lBRXpCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUVBQWlFLENBQUMsQ0FBQztZQUVuRixJQUFJLENBQUM7Z0JBQ0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDZixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7WUFDdEUsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsSUFBSSxNQUFLLEdBQUcsSUFBSSxDQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxJQUFJLE1BQUssR0FBRyxFQUFFLENBQUM7b0JBQ3pDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUIsQ0FBQztnQkFDRCxNQUFNLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDOUMsQ0FBQztZQUVELGlDQUFpQztZQUNqQyxnR0FBZ0c7WUFDaEcsSUFBSTtZQUVKLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNsQixPQUFPO1lBQ1gsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQztZQUVuRCxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRXhFLElBQUksT0FBTyxJQUFJLFNBQVMsSUFBSSxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQztvQkFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM3RSxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMseUNBQXlDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RixDQUFDO0tBQUE7SUFFWSxXQUFXLENBQUMsSUFBUzs7WUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNYLHdFQUF3RSxDQUMzRSxDQUFDO2dCQUNGLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDdEIsSUFBSSxxQkFBUyxDQUFDLEdBQUcsRUFBRSwyQ0FBMkMsQ0FBQyxDQUNsRSxDQUFDO1lBQ04sQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxxQkFBUyxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDLENBQUM7WUFDL0UsQ0FBQztZQUVELElBQUksR0FBVyxDQUFDO1lBQ2hCLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2RSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNuQixDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNQLEdBQUcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvRCxDQUFDO1lBQ0QsSUFBSSxNQUE4QixDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxHQUFHO29CQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVTtvQkFDcEIsTUFBTSxFQUFFLFNBQVM7aUJBQ3BCLENBQUM7WUFDTixDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxFQUNKLEdBQUcsRUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFDWixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFDM0IsTUFBTSxDQUNULENBQUM7UUFDTixDQUFDO0tBQUE7SUFFWSxjQUFjLENBQUMsT0FBZTs7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNYLDhFQUE4RSxDQUNqRixDQUFDO2dCQUNGLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1lBQy9FLENBQUM7WUFFRCxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMxQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN0QixJQUFJLHFCQUFTLENBQUMsR0FBRyxFQUFFLHdCQUF3QixHQUFHLG9CQUFvQixDQUFDLENBQ3RFLENBQUM7WUFDTixDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDO0tBQUE7SUFFWSxZQUFZLENBQUMsT0FBZTs7WUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNYLDBFQUEwRSxDQUM3RSxDQUFDO2dCQUNGLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsa0NBQWtDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsMkJBQTJCLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLENBQUM7WUFFRCxJQUFJLE1BQThCLENBQUM7WUFDbkMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM3QixNQUFNLEdBQUc7b0JBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVO29CQUNwQixNQUFNLEVBQUUsU0FBUztpQkFDcEIsQ0FBQztZQUNOLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3QyxDQUFDO0tBQUE7SUFFWSxlQUFlOztZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ1gsNkVBQTZFLENBQ2hGLENBQUM7Z0JBQ0YsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1lBQy9FLENBQUM7WUFFRCxJQUFJLE1BQThCLENBQUM7WUFDbkMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM3QixNQUFNLEdBQUc7b0JBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVO29CQUNwQixNQUFNLEVBQUUsU0FBUztpQkFDcEIsQ0FBQztZQUNOLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQzFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBcUIsQ0FBQyxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUFBO0lBRVksY0FBYyxDQUN2QixLQUFtQzs7WUFFbkMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbEIsTUFBTSxNQUFNLEdBQTRCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzVFLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxNQUFNLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsNERBQTRELENBQUMsQ0FBQztZQUMzRixDQUFDO1lBRUQsSUFBSSxnQkFBZ0IsR0FDaEIsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDbEYsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3JCLGdCQUFnQixHQUFHLElBQUEseUJBQU8sRUFBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvQyxJQUFJLE1BQTBDLENBQUM7WUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxpQkFBSSxFQUFFLENBQUM7WUFDekIsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssTUFBTTtvQkFDUCxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUN0QixHQUFHLEVBQUUsZ0JBQWdCO3dCQUNyQixvQ0FBb0M7d0JBQ3BDLE9BQU8sRUFBRTs0QkFDTCxjQUFjLEVBQUUsa0JBQWtCOzRCQUNsQyxNQUFNLEVBQUUsa0JBQWtCOzRCQUMxQixhQUFhLEVBQUUsU0FBUyxHQUFHLEdBQUc7eUJBQ2pDO3dCQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNsQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87cUJBQ3pCLENBQUMsQ0FBQztvQkFDSCxNQUFNO2dCQUNWLEtBQUssS0FBSztvQkFDTixNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDO3dCQUNyQixHQUFHLEVBQUUsZ0JBQWdCO3dCQUNyQixvQ0FBb0M7d0JBQ3BDLE9BQU8sRUFBRTs0QkFDTCxjQUFjLEVBQUUsa0JBQWtCOzRCQUNsQyxNQUFNLEVBQUUsa0JBQWtCOzRCQUMxQixhQUFhLEVBQUUsU0FBUyxHQUFHLEdBQUc7eUJBQ2pDO3dCQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNsQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87cUJBQ3pCLENBQUMsQ0FBQztvQkFDSCxNQUFNO2dCQUNWLEtBQUssUUFBUTtvQkFDVCxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDO3dCQUN4QixHQUFHLEVBQUUsZ0JBQWdCO3dCQUNyQixvQ0FBb0M7d0JBQ3BDLE9BQU8sRUFBRTs0QkFDTCxjQUFjLEVBQUUsa0JBQWtCOzRCQUNsQyxNQUFNLEVBQUUsa0JBQWtCOzRCQUMxQixhQUFhLEVBQUUsU0FBUyxHQUFHLEdBQUc7eUJBQ2pDO3dCQUNELE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTzt3QkFDdEIsdUJBQXVCO3FCQUMxQixDQUFDLENBQUM7b0JBQ0gsTUFBTTtnQkFDVjtvQkFDSSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDO3dCQUNyQixHQUFHLEVBQUUsZ0JBQWdCO3dCQUNyQixvQ0FBb0M7d0JBQ3BDLE9BQU8sRUFBRTs0QkFDTCxjQUFjLEVBQUUsa0JBQWtCOzRCQUNsQyxNQUFNLEVBQUUsa0JBQWtCOzRCQUMxQixhQUFhLEVBQUUsU0FBUyxHQUFHLEdBQUc7eUJBQ2pDO3dCQUNELE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTzt3QkFDdEIsdUJBQXVCO3FCQUMxQixDQUFDLENBQUM7WUFDWCxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztLQUFBO0lBRUQseURBQXlEO0lBRTVDLEtBQUs7O1lBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUErQjtnQkFDckQsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsR0FBRyxFQUFFLElBQUk7YUFDWixDQUFDLENBQUM7UUFDUCxDQUFDO0tBQUE7SUFFWSxZQUFZOztZQUNyQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQXNDO2dCQUM1RCxJQUFJLEVBQUUsS0FBSztnQkFDWCxHQUFHLEVBQUUsSUFBSTtnQkFDVCxZQUFZLEVBQUUsU0FBUzthQUMxQixDQUFDLENBQUM7UUFDUCxDQUFDO0tBQUE7SUFFWSxRQUFRLENBQ2pCLElBQWlDOztZQUVqQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQXNEO2dCQUM1RSxJQUFJLEVBQUUsS0FBSztnQkFDWCxHQUFHLEVBQUUsSUFBSTtnQkFDVCxJQUFJO2FBQ1AsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUFBO0lBRVksV0FBVzs7WUFDcEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFnQztnQkFDdEQsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsWUFBWSxFQUFFLFVBQVU7YUFDM0IsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUFBO0lBRVksV0FBVyxDQUNwQixJQUFrQzs7WUFFbEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUF3RDtnQkFDOUUsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsWUFBWSxFQUFFLFVBQVU7Z0JBQ3hCLElBQUk7YUFDUCxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQUE7SUFFWSxrQkFBa0I7O1lBSTNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBdUM7Z0JBQzdELElBQUksRUFBRSxLQUFLO2dCQUNYLEdBQUcsRUFBRSxJQUFJO2dCQUNULFlBQVksRUFBRSxrQkFBa0I7YUFDbkMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUFBO0lBRVkseUJBQXlCLENBQUMsS0FBYTs7WUFDaEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxJQUFJLHFCQUFTLENBQ2YsR0FBRyxFQUNILDJFQUEyRSxDQUM5RSxDQUFDO1lBQ04sQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFHLElBQUksaUJBQUksRUFBRSxDQUFDO1lBQ3pCLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDYixHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxZQUFZO2dCQUNuQyxvQ0FBb0M7Z0JBQ3BDLE9BQU8sRUFBRTtvQkFDTCxjQUFjLEVBQUUsa0JBQWtCO29CQUNsQyxNQUFNLEVBQUUsa0JBQWtCO2lCQUM3QjtnQkFDRCxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUM7Z0JBQ2IsT0FBTyxFQUFFLGVBQWUsQ0FBQyxrQkFBa0I7YUFDOUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUFBO0lBRVksY0FBYzs7WUFDdkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3hDLENBQUM7S0FBQTtJQUVlLFVBQVU7O1lBQ3RCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakMsQ0FBQztLQUFBO0lBRWEsY0FBYyxDQUN4QixLQUFhLEVBQ2IsUUFBZ0IsRUFDaEIsZ0JBQXNCLEVBQ3RCLE9BQWdEOztZQUVoRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sSUFBSSxxQkFBUyxDQUFDLEdBQUcsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFL0IsT0FBTyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0YsQ0FBQztLQUFBO0lBRWEsY0FBYyxDQUFDLEdBQVc7O1lBQ3BDLE1BQU0sR0FBRyxHQUF3QixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUMsTUFBTSxFQUFFLGFBQWEsRUFBQyxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7S0FBQTtJQUVhLFlBQVksQ0FBQyxDQUFFOztZQUN6QixJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNKLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztZQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUN4QyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7S0FBQTtJQUVPLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxJQUFLLEVBQUUsSUFBSztRQUNqRCxlQUFlO1FBQ2YsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLFVBQVUsR0FDWixFQUFFO1lBQ0YsR0FBRyxDQUFDLFdBQVcsRUFBRTtZQUNqQixFQUFFO1lBQ0YsR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNkLEVBQUU7WUFDRixHQUFHLENBQUMsT0FBTyxFQUFFO1lBQ2IsRUFBRTtZQUNGLEdBQUcsQ0FBQyxRQUFRLEVBQUU7WUFDZCxFQUFFO1lBQ0YsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsNEJBQTRCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLEVBQUUsZUFBZSxDQUFDLGNBQWMsQ0FBQztRQUNoRCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELEdBQUcsSUFBSSxVQUFVLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUNoQyxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7O0FBN3RCTCwwQ0E4dEJDO0FBN3RCaUIsa0NBQWtCLEdBQUcsS0FBSyxDQUFDO0FBQzNCLCtCQUFlLEdBQUcsK0JBQStCLENBQUM7QUFFakQsOEJBQWMsR0FBRyxDQUFDLENBQUMifQ==
|
|
736
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlkak5vZGVTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nkay9GaWRqTm9kZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0RBQTBEO0FBQzFELGdEQUFrQztBQUNsQywwREFBNEM7QUFDNUMsOENBQTREO0FBQzVELG9EQUFzQztBQUV0Qyw2Q0FXc0I7QUFDdEIsbURBQThDO0FBQzlDLDJDQUFzQztBQUV0QyxzQ0FBaUM7QUFDakMsaUVBQTREO0FBWTVELHdFQUF3RTtBQUV4RSxNQUFhLGVBQWU7SUFZeEIsWUFDSSxNQUF3QixFQUN4QixPQUE0QixFQUM1QixPQUEyQztRQUUzQyxJQUFJLENBQUMsR0FBRyxHQUFHO1lBQ1AsR0FBRyxFQUFFLE1BQU07WUFDWCxPQUFPLEVBQUUsZUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLElBQUk7U0FDZCxDQUFDO1FBQ0YsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSw2QkFBYSxFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0Ms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
|
package/sdk/IService.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FidjApiResetPasswordRequest, FidjApiVerifyEmailRequest } from '@ofidj/contracts';
|
|
1
2
|
import { EndpointCallInterface, ModuleServiceInitOptionsInterface, ModuleServiceLoginCallOptionsInterface, ModuleServiceLoginOptionsInterface } from './Interfaces';
|
|
2
3
|
import { ClientUser } from '../connection';
|
|
3
4
|
import { FidjApiConsentsResponse, FidjApiConsentsUpdateRequest, FidjApiConsentsHistoryResponse, FidjApiUsersMeResponse, FidjApiUsersMeDetailsResponse, FidjApiUsersMeUpdateRequest } from '@ofidj/contracts';
|
|
@@ -11,6 +12,10 @@ export interface IService {
|
|
|
11
12
|
status: number;
|
|
12
13
|
data?: TResponse;
|
|
13
14
|
}>;
|
|
15
|
+
fidjForgotPasswordRequest(email: string): Promise<void>;
|
|
16
|
+
resetPassword(data: FidjApiResetPasswordRequest): Promise<void>;
|
|
17
|
+
verifyEmail(data: FidjApiVerifyEmailRequest): Promise<void>;
|
|
18
|
+
resendVerification(): Promise<void>;
|
|
14
19
|
getMe(): Promise<{
|
|
15
20
|
status: number;
|
|
16
21
|
data?: FidjApiUsersMeResponse;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare class SessionVerificationError extends Error {
|
|
2
|
+
status: 401 | 503;
|
|
3
|
+
constructor(status: 401 | 503, message: string);
|
|
4
|
+
}
|
|
5
|
+
export interface VerifiedAppSession {
|
|
6
|
+
subject: string;
|
|
7
|
+
username: string;
|
|
8
|
+
appId: string;
|
|
9
|
+
roles: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function verifyAppSession(token: string, options: {
|
|
12
|
+
appId: string;
|
|
13
|
+
apiEndpoint: string;
|
|
14
|
+
}): Promise<VerifiedAppSession>;
|
|
15
|
+
export declare function verifyOrganizationSession(token: string, options: {
|
|
16
|
+
appId: string;
|
|
17
|
+
apiEndpoint: string;
|
|
18
|
+
organizationId: string;
|
|
19
|
+
permission?: string;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
organizationId: string;
|
|
22
|
+
permissions: string[];
|
|
23
|
+
subject: string;
|
|
24
|
+
username: string;
|
|
25
|
+
appId: string;
|
|
26
|
+
roles: string[];
|
|
27
|
+
}>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SessionVerificationError = void 0;
|
|
13
|
+
exports.verifyAppSession = verifyAppSession;
|
|
14
|
+
exports.verifyOrganizationSession = verifyOrganizationSession;
|
|
15
|
+
const Base64_1 = require("../tools/Base64");
|
|
16
|
+
class SessionVerificationError extends Error {
|
|
17
|
+
constructor(status, message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.status = status;
|
|
20
|
+
this.name = 'SessionVerificationError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.SessionVerificationError = SessionVerificationError;
|
|
24
|
+
// Call on the server for each protected operation. Fidj verifies the token and
|
|
25
|
+
// stored session; role assignments are read live rather than trusted from the JWT.
|
|
26
|
+
function verifyAppSession(token, options) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
let payload;
|
|
29
|
+
try {
|
|
30
|
+
if (!token || token.length > 16384) {
|
|
31
|
+
throw new Error();
|
|
32
|
+
}
|
|
33
|
+
if (token.split('.').length !== 3) {
|
|
34
|
+
payload = null;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const encoded = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');
|
|
38
|
+
payload = JSON.parse(Base64_1.Base64.decode(encoded.padEnd(Math.ceil(encoded.length / 4) * 4, '=')));
|
|
39
|
+
if (payload.aud !== options.appId ||
|
|
40
|
+
typeof payload.sub !== 'string' ||
|
|
41
|
+
typeof payload.name !== 'string') {
|
|
42
|
+
throw new Error();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (_a) {
|
|
47
|
+
throw new SessionVerificationError(401, 'Sign in to this app.');
|
|
48
|
+
}
|
|
49
|
+
let response;
|
|
50
|
+
try {
|
|
51
|
+
response = yield fetch(`${options.apiEndpoint.replace(/\/$/, '')}/apps/${encodeURIComponent(options.appId)}/me`, {
|
|
52
|
+
headers: { Authorization: `Bearer ${token}`, Accept: 'application/json' },
|
|
53
|
+
signal: AbortSignal.timeout(5000),
|
|
54
|
+
redirect: 'error',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (_b) {
|
|
58
|
+
throw new SessionVerificationError(503, 'Identity service unavailable. Please retry.');
|
|
59
|
+
}
|
|
60
|
+
if ([401, 403, 404].includes(response.status)) {
|
|
61
|
+
throw new SessionVerificationError(401, 'Session expired or revoked. Sign in again.');
|
|
62
|
+
}
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
throw new SessionVerificationError(503, 'Identity service unavailable. Please retry.');
|
|
65
|
+
}
|
|
66
|
+
let result;
|
|
67
|
+
try {
|
|
68
|
+
result = yield response.json();
|
|
69
|
+
if (!Array.isArray(result.roles) ||
|
|
70
|
+
result.roles.some((role) => typeof role.type !== 'string')) {
|
|
71
|
+
throw new Error();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (_c) {
|
|
75
|
+
throw new SessionVerificationError(503, 'Invalid identity-service response.');
|
|
76
|
+
}
|
|
77
|
+
if (!payload && (typeof result.subject !== 'string' || result.appId !== options.appId))
|
|
78
|
+
throw new SessionVerificationError(401, 'App session scope mismatch.');
|
|
79
|
+
return {
|
|
80
|
+
subject: (payload === null || payload === void 0 ? void 0 : payload.sub) || result.subject,
|
|
81
|
+
username: (payload === null || payload === void 0 ? void 0 : payload.name) || result.username,
|
|
82
|
+
appId: options.appId,
|
|
83
|
+
roles: result.roles.map((role) => role.type),
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function verifyOrganizationSession(token, options) {
|
|
88
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
+
var _a, _b;
|
|
90
|
+
const session = yield verifyAppSession(token, options);
|
|
91
|
+
let response;
|
|
92
|
+
try {
|
|
93
|
+
response = yield fetch(`${options.apiEndpoint.replace(/\/$/, '')}/apps/${encodeURIComponent(options.appId)}/organizations/${encodeURIComponent(options.organizationId)}`, { headers: { Authorization: `Bearer ${token}` }, redirect: 'error', signal: AbortSignal.timeout(5000) });
|
|
94
|
+
}
|
|
95
|
+
catch (_c) {
|
|
96
|
+
throw new SessionVerificationError(503, 'Identity service unavailable.');
|
|
97
|
+
}
|
|
98
|
+
if (!response.ok)
|
|
99
|
+
throw new SessionVerificationError(response.status >= 500 ? 503 : 401, 'Organization access denied.');
|
|
100
|
+
const result = yield response.json();
|
|
101
|
+
if (((_a = result.organization) === null || _a === void 0 ? void 0 : _a.id) !== options.organizationId || !Array.isArray((_b = result.access) === null || _b === void 0 ? void 0 : _b.permissions) || (options.permission && !result.access.permissions.includes(options.permission)))
|
|
102
|
+
throw new SessionVerificationError(401, 'Organization permission denied.');
|
|
103
|
+
return Object.assign(Object.assign({}, session), { organizationId: options.organizationId, permissions: result.access.permissions });
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5QXBwU2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvdmVyaWZ5QXBwU2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFzQkEsNENBNkRDO0FBRUQsOERBUUM7QUE3RkQsNENBQXVDO0FBR3ZDLE1BQWEsd0JBQXlCLFNBQVEsS0FBSztJQUMvQyxZQUNXLE1BQWlCLEVBQ3hCLE9BQWU7UUFFZixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBSXhCLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7SUFDM0MsQ0FBQztDQUNKO0FBUkQsNERBUUM7QUFTRCwrRUFBK0U7QUFDL0UsbUZBQW1GO0FBQ25GLFNBQXNCLGdCQUFnQixDQUNsQyxLQUFhLEVBQ2IsT0FBNkM7O1FBRTdDLElBQUksT0FBWSxDQUFDO1FBQ2pCLElBQUksQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3RCLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUFBLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFBQSxDQUFDO2lCQUFNLENBQUM7Z0JBQzNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMxRSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMs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
|