@uengage.io/platform-sdk 0.8.0 → 0.12.0
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/README.md +94 -44
- package/dist/auth/index.d.ts +13 -3
- package/dist/auth/index.js +18 -5
- package/dist/auth/login.d.ts +30 -0
- package/dist/auth/login.js +36 -0
- package/dist/auth/otp.d.ts +43 -0
- package/dist/auth/otp.js +71 -0
- package/dist/business/client.js +3 -36
- package/dist/business/index.d.ts +1 -1
- package/dist/business/index.js +1 -1
- package/dist/business/schema.d.ts +161 -4
- package/dist/business/schema.js +17 -2
- package/dist/client.d.ts +77 -51
- package/dist/client.js +177 -142
- package/dist/http.d.ts +22 -0
- package/dist/http.js +39 -1
- package/dist/index.d.ts +2 -18
- package/dist/index.js +3 -23
- package/dist/token-source.d.ts +24 -0
- package/dist/token-source.js +65 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/zones/client.d.ts +51 -0
- package/dist/zones/client.js +156 -0
- package/dist/zones/index.d.ts +2 -0
- package/dist/zones/index.js +7 -0
- package/dist/zones/schema.d.ts +104 -0
- package/dist/zones/schema.js +16 -0
- package/package.json +2 -2
package/dist/client.js
CHANGED
|
@@ -1,54 +1,23 @@
|
|
|
1
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
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.platform = void 0;
|
|
37
3
|
exports.createClient = createClient;
|
|
38
|
-
exports._resetPlatformSingleton = _resetPlatformSingleton;
|
|
39
|
-
exports.withToken = withToken;
|
|
40
4
|
const client_1 = require("./audit/client");
|
|
41
5
|
const client_2 = require("./business/client");
|
|
6
|
+
const client_3 = require("./zones/client");
|
|
7
|
+
const auth_1 = require("./auth");
|
|
42
8
|
const token_source_1 = require("./token-source");
|
|
9
|
+
const errors_1 = require("./errors");
|
|
43
10
|
const DEFAULT_BASE_URL = 'https://api.platform.uengage.io';
|
|
44
11
|
/**
|
|
45
|
-
* Build a fresh, isolated client
|
|
46
|
-
*
|
|
47
|
-
*
|
|
12
|
+
* Build a fresh, isolated client. With no args, reads `UENGAGE_*`
|
|
13
|
+
* env vars; explicit fields override per call. Each call gets its own
|
|
14
|
+
* TokenSource state — concurrent `createClient(...)` use does not
|
|
15
|
+
* stampede the cache.
|
|
48
16
|
*/
|
|
49
17
|
function createClient(input = {}) {
|
|
50
|
-
|
|
51
|
-
|
|
18
|
+
const merged = mergeWithEnv(input);
|
|
19
|
+
warnIfBrowserSecret(merged);
|
|
20
|
+
return buildClient(merged);
|
|
52
21
|
}
|
|
53
22
|
function buildClient(input) {
|
|
54
23
|
const baseUrl = input.baseUrl ?? DEFAULT_BASE_URL;
|
|
@@ -63,72 +32,181 @@ function buildClient(input) {
|
|
|
63
32
|
auth,
|
|
64
33
|
actorVia: input.actorVia ?? input.serviceId,
|
|
65
34
|
});
|
|
66
|
-
const
|
|
35
|
+
const zonesClient = (0, client_3.createZonesClient)({ baseUrl, fetchFn: input.fetchFn, auth });
|
|
36
|
+
return {
|
|
67
37
|
business: businessClient,
|
|
68
38
|
audit: auditClient,
|
|
39
|
+
zones: zonesClient,
|
|
69
40
|
auth: auth_1.auth,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
// client_credentials on top of the supplied user token.
|
|
76
|
-
serviceId: undefined,
|
|
77
|
-
serviceSecret: undefined,
|
|
78
|
-
scope: undefined,
|
|
79
|
-
});
|
|
80
|
-
},
|
|
81
|
-
withSessionToken(sessionToken) {
|
|
82
|
-
const customerAuthBaseUrl = input.customerAuthBaseUrl ?? `${baseUrl}/auth/customer`;
|
|
83
|
-
const fetchFn = input.fetchFn ?? globalThis.fetch;
|
|
84
|
-
// Wrap the customer-side session-exchange in a callback-style
|
|
85
|
-
// TokenSource. The existing dedup + cache + 401-retry machinery
|
|
86
|
-
// does the rest.
|
|
87
|
-
return buildClient({
|
|
88
|
-
...input,
|
|
89
|
-
accessToken: () => exchangeSessionToken(sessionToken, customerAuthBaseUrl, fetchFn),
|
|
90
|
-
serviceId: undefined,
|
|
91
|
-
serviceSecret: undefined,
|
|
92
|
-
scope: undefined,
|
|
93
|
-
});
|
|
41
|
+
getAccessToken: async () => {
|
|
42
|
+
if (!tokenSourceState) {
|
|
43
|
+
throw new errors_1.ConfigError('getAccessToken: no auth mode configured. Pass {serviceId, serviceSecret} | {authToken} | {session}.');
|
|
44
|
+
}
|
|
45
|
+
return (0, token_source_1.getAccessToken)(tokenSourceState);
|
|
94
46
|
},
|
|
95
47
|
};
|
|
96
|
-
|
|
48
|
+
}
|
|
49
|
+
const AUTH_MODE_FIELDS = [
|
|
50
|
+
'serviceId',
|
|
51
|
+
'serviceSecret',
|
|
52
|
+
'scope',
|
|
53
|
+
'authToken',
|
|
54
|
+
'session',
|
|
55
|
+
'tokens',
|
|
56
|
+
];
|
|
57
|
+
/**
|
|
58
|
+
* Merge env-derived defaults with the caller's explicit input. Any
|
|
59
|
+
* explicit auth-mode field suppresses *all* env-derived auth defaults,
|
|
60
|
+
* so an explicit `{authToken}` override doesn't accidentally inherit
|
|
61
|
+
* `serviceId`/`serviceSecret` from env. Non-auth fields fall through
|
|
62
|
+
* normally (caller `baseUrl` overrides env baseUrl; absent input keeps
|
|
63
|
+
* env baseUrl).
|
|
64
|
+
*/
|
|
65
|
+
function mergeWithEnv(input) {
|
|
66
|
+
const env = readEnvDefaults();
|
|
67
|
+
const inputHasAuth = inputHasAuthMode(input);
|
|
68
|
+
const envForMerge = inputHasAuth ? withoutAuthFields(env) : env;
|
|
69
|
+
const merged = {
|
|
70
|
+
baseUrl: input.baseUrl ?? envForMerge.baseUrl,
|
|
71
|
+
authBaseUrl: input.authBaseUrl ?? envForMerge.authBaseUrl,
|
|
72
|
+
customerAuthBaseUrl: input.customerAuthBaseUrl ?? envForMerge.customerAuthBaseUrl,
|
|
73
|
+
serviceId: input.serviceId ?? envForMerge.serviceId,
|
|
74
|
+
serviceSecret: input.serviceSecret ?? envForMerge.serviceSecret,
|
|
75
|
+
scope: input.scope ?? envForMerge.scope,
|
|
76
|
+
authToken: input.authToken ?? envForMerge.authToken,
|
|
77
|
+
session: input.session ?? envForMerge.session,
|
|
78
|
+
tokens: input.tokens,
|
|
79
|
+
actorVia: input.actorVia ?? envForMerge.actorVia,
|
|
80
|
+
expiryBufferMs: input.expiryBufferMs ?? envForMerge.expiryBufferMs,
|
|
81
|
+
fetchFn: input.fetchFn,
|
|
82
|
+
};
|
|
83
|
+
assertExactlyOneAuthMode(merged);
|
|
84
|
+
return merged;
|
|
85
|
+
}
|
|
86
|
+
function readEnvDefaults() {
|
|
87
|
+
if (typeof process === 'undefined')
|
|
88
|
+
return {};
|
|
89
|
+
const e = process.env ?? {};
|
|
90
|
+
const expiry = e.UENGAGE_EXPIRY_BUFFER_MS ? Number(e.UENGAGE_EXPIRY_BUFFER_MS) : undefined;
|
|
91
|
+
// UENGAGE_SESSION_ID + UENGAGE_SESSION_TOKEN must be paired; either alone is ignored
|
|
92
|
+
// so an env-only setup never produces a half-configured session.
|
|
93
|
+
const session = e.UENGAGE_SESSION_ID && e.UENGAGE_SESSION_TOKEN
|
|
94
|
+
? { id: e.UENGAGE_SESSION_ID, token: e.UENGAGE_SESSION_TOKEN }
|
|
95
|
+
: undefined;
|
|
96
|
+
return {
|
|
97
|
+
baseUrl: e.UENGAGE_BASE_URL,
|
|
98
|
+
authBaseUrl: e.UENGAGE_AUTH_BASE_URL,
|
|
99
|
+
customerAuthBaseUrl: e.UENGAGE_CUSTOMER_AUTH_BASE_URL,
|
|
100
|
+
serviceId: e.UENGAGE_SERVICE_ID,
|
|
101
|
+
serviceSecret: e.UENGAGE_SERVICE_SECRET,
|
|
102
|
+
scope: e.UENGAGE_SCOPE,
|
|
103
|
+
authToken: e.UENGAGE_AUTH_TOKEN,
|
|
104
|
+
session,
|
|
105
|
+
actorVia: e.UENGAGE_ACTOR_VIA,
|
|
106
|
+
expiryBufferMs: Number.isFinite(expiry) ? expiry : undefined,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function inputHasAuthMode(input) {
|
|
110
|
+
return AUTH_MODE_FIELDS.some((f) => input[f] !== undefined);
|
|
111
|
+
}
|
|
112
|
+
function withoutAuthFields(c) {
|
|
113
|
+
return {
|
|
114
|
+
...c,
|
|
115
|
+
serviceId: undefined,
|
|
116
|
+
serviceSecret: undefined,
|
|
117
|
+
scope: undefined,
|
|
118
|
+
authToken: undefined,
|
|
119
|
+
session: undefined,
|
|
120
|
+
tokens: undefined,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function assertExactlyOneAuthMode(input) {
|
|
124
|
+
const modes = [];
|
|
125
|
+
if (input.authToken !== undefined)
|
|
126
|
+
modes.push('authToken');
|
|
127
|
+
if (input.session !== undefined)
|
|
128
|
+
modes.push('session');
|
|
129
|
+
if (input.tokens !== undefined)
|
|
130
|
+
modes.push('tokens');
|
|
131
|
+
if (input.serviceId !== undefined || input.serviceSecret !== undefined) {
|
|
132
|
+
modes.push('serviceId+serviceSecret');
|
|
133
|
+
}
|
|
134
|
+
if (modes.length > 1) {
|
|
135
|
+
throw new errors_1.ConfigError(`createClient: pick exactly one auth mode. Got ${modes.join(', ')}. ` +
|
|
136
|
+
'Use one of {serviceId, serviceSecret} | {authToken} | {session} | {tokens}.');
|
|
137
|
+
}
|
|
138
|
+
// Zero modes is allowed — caller may want a fully-anonymous client for
|
|
139
|
+
// public endpoints. The first request that needs auth will surface a
|
|
140
|
+
// ConfigError downstream.
|
|
97
141
|
}
|
|
98
142
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
143
|
+
* Probe the business `legacy_session` grant first, fall back to customer
|
|
144
|
+
* on `invalid_grant`. Either surface mints a JWT — the SDK doesn't care
|
|
145
|
+
* which side answered.
|
|
146
|
+
*
|
|
147
|
+
* Why probe both: `id` (numeric) overlaps users.userId vs
|
|
148
|
+
* addo_contacts_mapping.id/contactId. Callers usually don't know which
|
|
149
|
+
* table their (id, token) pair belongs to.
|
|
102
150
|
*/
|
|
103
|
-
async function
|
|
104
|
-
const
|
|
151
|
+
async function exchangeLegacySession(session, authBaseUrl, customerAuthBaseUrl, fetchFn) {
|
|
152
|
+
const body = new URLSearchParams({
|
|
153
|
+
grant_type: 'legacy_session',
|
|
154
|
+
id: String(session.id),
|
|
155
|
+
token: session.token,
|
|
156
|
+
}).toString();
|
|
157
|
+
const businessRes = await fetchFn(`${authBaseUrl}/oauth/token`, {
|
|
105
158
|
method: 'POST',
|
|
106
159
|
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
107
|
-
body
|
|
108
|
-
grant_type: 'session_token',
|
|
109
|
-
session_token: sessionToken,
|
|
110
|
-
}).toString(),
|
|
160
|
+
body,
|
|
111
161
|
});
|
|
112
|
-
if (
|
|
113
|
-
|
|
114
|
-
const { AuthenticationError } = await Promise.resolve().then(() => __importStar(require('./errors')));
|
|
115
|
-
throw new AuthenticationError(`session-token exchange failed: HTTP ${res.status} ${text}`);
|
|
162
|
+
if (businessRes.ok) {
|
|
163
|
+
return parseAccessToken(businessRes);
|
|
116
164
|
}
|
|
165
|
+
if (await isInvalidGrant(businessRes)) {
|
|
166
|
+
const customerRes = await fetchFn(`${customerAuthBaseUrl}/oauth/token`, {
|
|
167
|
+
method: 'POST',
|
|
168
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
169
|
+
body,
|
|
170
|
+
});
|
|
171
|
+
if (customerRes.ok) {
|
|
172
|
+
return parseAccessToken(customerRes);
|
|
173
|
+
}
|
|
174
|
+
const text = await customerRes.text().catch(() => '');
|
|
175
|
+
throw new errors_1.AuthenticationError(`legacy_session exchange failed on both surfaces: customer HTTP ${customerRes.status} ${text}`);
|
|
176
|
+
}
|
|
177
|
+
const text = await businessRes.text().catch(() => '');
|
|
178
|
+
throw new errors_1.AuthenticationError(`legacy_session exchange failed: HTTP ${businessRes.status} ${text}`);
|
|
179
|
+
}
|
|
180
|
+
async function isInvalidGrant(res) {
|
|
181
|
+
if (res.status !== 400)
|
|
182
|
+
return false;
|
|
183
|
+
const cloned = res.clone();
|
|
184
|
+
const json = (await cloned.json().catch(() => ({})));
|
|
185
|
+
return json.error === 'invalid_grant';
|
|
186
|
+
}
|
|
187
|
+
async function parseAccessToken(res) {
|
|
117
188
|
const json = (await res.json());
|
|
118
189
|
if (!json.access_token) {
|
|
119
|
-
|
|
120
|
-
throw new ConfigError('session-token exchange response missing access_token');
|
|
190
|
+
throw new errors_1.ConfigError('legacy_session exchange response missing access_token');
|
|
121
191
|
}
|
|
122
192
|
return json.access_token;
|
|
123
193
|
}
|
|
124
|
-
const auth_1 = require("./auth");
|
|
125
194
|
function resolveTokenSource(input, baseUrl) {
|
|
126
195
|
const authBaseUrl = input.authBaseUrl ?? `${baseUrl}/auth/business`;
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
196
|
+
const fetchFn = input.fetchFn ?? globalThis.fetch;
|
|
197
|
+
if (input.authToken !== undefined) {
|
|
198
|
+
if (typeof input.authToken === 'string') {
|
|
199
|
+
return (0, token_source_1.makeTokenSourceState)({ kind: 'static-string', token: input.authToken }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
130
200
|
}
|
|
131
|
-
return (0, token_source_1.makeTokenSourceState)({ kind: 'callback', getToken: input.
|
|
201
|
+
return (0, token_source_1.makeTokenSourceState)({ kind: 'callback', getToken: input.authToken }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
202
|
+
}
|
|
203
|
+
if (input.session !== undefined) {
|
|
204
|
+
const customerAuthBaseUrl = input.customerAuthBaseUrl ?? `${baseUrl}/auth/customer`;
|
|
205
|
+
const session = input.session;
|
|
206
|
+
return (0, token_source_1.makeTokenSourceState)({
|
|
207
|
+
kind: 'callback',
|
|
208
|
+
getToken: () => exchangeLegacySession(session, authBaseUrl, customerAuthBaseUrl, fetchFn),
|
|
209
|
+
}, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
132
210
|
}
|
|
133
211
|
if (input.serviceId && input.serviceSecret) {
|
|
134
212
|
return (0, token_source_1.makeTokenSourceState)({
|
|
@@ -139,6 +217,16 @@ function resolveTokenSource(input, baseUrl) {
|
|
|
139
217
|
scope: input.scope,
|
|
140
218
|
}, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
141
219
|
}
|
|
220
|
+
if (input.tokens) {
|
|
221
|
+
return (0, token_source_1.makeTokenSourceState)({
|
|
222
|
+
kind: 'access-refresh-pair',
|
|
223
|
+
accessToken: input.tokens.accessToken,
|
|
224
|
+
refreshToken: input.tokens.refreshToken,
|
|
225
|
+
expiresAt: Date.now() + input.tokens.expiresIn * 1000,
|
|
226
|
+
clientId: input.tokens.clientId,
|
|
227
|
+
onRotate: input.tokens.onRotate,
|
|
228
|
+
}, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
229
|
+
}
|
|
142
230
|
return undefined;
|
|
143
231
|
}
|
|
144
232
|
function warnIfBrowserSecret(config) {
|
|
@@ -149,60 +237,7 @@ function warnIfBrowserSecret(config) {
|
|
|
149
237
|
if (config.serviceSecret) {
|
|
150
238
|
console.warn('[uengage-platform-sdk] serviceSecret should not be used in browser environments. ' +
|
|
151
239
|
'Service credentials in browser bundles are publicly visible. ' +
|
|
152
|
-
'Use `
|
|
240
|
+
'Use `authToken` (a Bearer obtained via OAuth) or `sessionToken` instead.');
|
|
153
241
|
}
|
|
154
242
|
}
|
|
155
|
-
// ─── Default singleton ─────────────────────────────────────────────────────
|
|
156
|
-
//
|
|
157
|
-
// Resolved lazily on first property access (Proxy) so consumers that
|
|
158
|
-
// mutate `process.env` after import still pick up the right values.
|
|
159
|
-
let cachedSingleton;
|
|
160
|
-
function singleton() {
|
|
161
|
-
if (!cachedSingleton)
|
|
162
|
-
cachedSingleton = buildClient(envClientConfig());
|
|
163
|
-
return cachedSingleton;
|
|
164
|
-
}
|
|
165
|
-
function envClientConfig() {
|
|
166
|
-
if (typeof process === 'undefined')
|
|
167
|
-
return {};
|
|
168
|
-
const e = process.env ?? {};
|
|
169
|
-
return {
|
|
170
|
-
baseUrl: e.UENGAGE_BASE_URL,
|
|
171
|
-
authBaseUrl: e.UENGAGE_AUTH_BASE_URL,
|
|
172
|
-
accessToken: e.UENGAGE_AUTH_TOKEN,
|
|
173
|
-
serviceId: e.UENGAGE_SERVICE_ID,
|
|
174
|
-
serviceSecret: e.UENGAGE_SERVICE_SECRET,
|
|
175
|
-
scope: e.UENGAGE_SERVICE_SCOPE,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Default client. Reads config from environment variables on first
|
|
180
|
-
* property access (so test setups that mutate `process.env` after
|
|
181
|
-
* import work). Use `createClient(...)` when you need an isolated
|
|
182
|
-
* instance with explicit config.
|
|
183
|
-
*
|
|
184
|
-
* UENGAGE_BASE_URL defaults to https://api.platform.uengage.io
|
|
185
|
-
* UENGAGE_AUTH_BASE_URL auth surface override (default ${baseUrl}/auth/business)
|
|
186
|
-
* UENGAGE_AUTH_TOKEN static Bearer token (overrides client_credentials)
|
|
187
|
-
* UENGAGE_SERVICE_ID OAuth2 client_credentials clientId
|
|
188
|
-
* UENGAGE_SERVICE_SECRET OAuth2 client_credentials clientSecret
|
|
189
|
-
* UENGAGE_SERVICE_SCOPE optional space-separated scope list
|
|
190
|
-
*/
|
|
191
|
-
exports.platform = new Proxy({}, {
|
|
192
|
-
get(_, prop) {
|
|
193
|
-
const s = singleton();
|
|
194
|
-
return s[prop];
|
|
195
|
-
},
|
|
196
|
-
});
|
|
197
|
-
/** Test-only: drop the singleton cache between cases. */
|
|
198
|
-
function _resetPlatformSingleton() {
|
|
199
|
-
cachedSingleton = undefined;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Convenience: shorthand for `platform.withToken(token)`.
|
|
203
|
-
* BFF handlers commonly call this once per request.
|
|
204
|
-
*/
|
|
205
|
-
function withToken(token) {
|
|
206
|
-
return singleton().withToken(token);
|
|
207
|
-
}
|
|
208
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5RUEsb0NBR0M7QUEwS0QsMERBRUM7QUFNRCw4QkFFQztBQWhRRCwyQ0FBcUU7QUFDckUsOENBQThFO0FBRTlFLGlEQUE2RTtBQStEN0UsTUFBTSxnQkFBZ0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUUzRDs7OztHQUlHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLFFBQXNCLEVBQUU7SUFDbkQsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQW1CO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksZ0JBQWdCLENBQUM7SUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsTUFBTSxJQUFJLEdBQTZCLGdCQUFnQjtRQUNyRCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtRQUNuRCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWQsTUFBTSxjQUFjLEdBQUcsSUFBQSw2QkFBb0IsRUFBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLE1BQU0sV0FBVyxHQUFHLElBQUEsMEJBQWlCLEVBQUM7UUFDcEMsT0FBTztRQUNQLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixJQUFJO1FBQ0osUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFNBQVM7S0FDNUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxNQUFNLEdBQW1CO1FBQzdCLFFBQVEsRUFBRSxjQUFjO1FBQ3hCLEtBQUssRUFBRSxXQUFXO1FBQ2xCLElBQUksRUFBRSxXQUFhO1FBQ25CLFNBQVMsQ0FBQyxLQUFLO1lBQ2IsT0FBTyxXQUFXLENBQUM7Z0JBQ2pCLEdBQUcsS0FBSztnQkFDUixXQUFXLEVBQUUsS0FBSztnQkFDbEIsaURBQWlEO2dCQUNqRCx3REFBd0Q7Z0JBQ3hELFNBQVMsRUFBRSxTQUFTO2dCQUNwQixhQUFhLEVBQUUsU0FBUztnQkFDeEIsS0FBSyxFQUFFLFNBQVM7YUFDakIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELGdCQUFnQixDQUFDLFlBQVk7WUFDM0IsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsbUJBQW1CLElBQUksR0FBRyxPQUFPLGdCQUFnQixDQUFDO1lBQ3BGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUssVUFBVSxDQUFDLEtBQXNCLENBQUM7WUFDcEUsOERBQThEO1lBQzlELGdFQUFnRTtZQUNoRSxpQkFBaUI7WUFDakIsT0FBTyxXQUFXLENBQUM7Z0JBQ2pCLEdBQUcsS0FBSztnQkFDUixXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sQ0FBQztnQkFDbkYsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLGFBQWEsRUFBRSxTQUFTO2dCQUN4QixLQUFLLEVBQUUsU0FBUzthQUNqQixDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLG9CQUFvQixDQUNqQyxZQUFvQixFQUNwQixtQkFBMkIsRUFDM0IsT0FBcUI7SUFFckIsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxtQkFBbUIsY0FBYyxFQUFFO1FBQzlELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLG1DQUFtQyxFQUFFO1FBQ2hFLElBQUksRUFBRSxJQUFJLGVBQWUsQ0FBQztZQUN4QixVQUFVLEVBQUUsZUFBZTtZQUMzQixhQUFhLEVBQUUsWUFBWTtTQUM1QixDQUFDLENBQUMsUUFBUSxFQUFFO0tBQ2QsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztRQUN6RCxNQUFNLElBQUksbUJBQW1CLENBQUMsdUNBQXVDLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBOEIsQ0FBQztJQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztRQUNqRCxNQUFNLElBQUksV0FBVyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztBQUMzQixDQUFDO0FBRUQsaUNBQStDO0FBRS9DLFNBQVMsa0JBQWtCLENBQUMsS0FBbUIsRUFBRSxPQUFlO0lBQzlELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksR0FBRyxPQUFPLGdCQUFnQixDQUFDO0lBQ3BFLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxJQUFJLE9BQU8sS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMxQyxPQUFPLElBQUEsbUNBQW9CLEVBQ3pCLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUNuRCxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQ2pFLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFBLG1DQUFvQixFQUN6QixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFDakQsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUNqRSxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0MsT0FBTyxJQUFBLG1DQUFvQixFQUN6QjtZQUNFLElBQUksRUFBRSxxQkFBcUI7WUFDM0IsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQ3pCLFlBQVksRUFBRSxLQUFLLENBQUMsYUFBYTtZQUNqQyxXQUFXO1lBQ1gsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQ25CLEVBQ0QsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUNqRSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLE1BQW9CO0lBQy9DLE1BQU0sQ0FBQyxHQUFHLFVBQWlELENBQUM7SUFDNUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsQ0FBQztJQUM5RixJQUFJLENBQUMsU0FBUztRQUFFLE9BQU87SUFDdkIsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FDVixtRkFBbUY7WUFDakYsK0RBQStEO1lBQy9ELDJHQUEyRyxDQUM5RyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsRUFBRTtBQUNGLHFFQUFxRTtBQUNyRSxvRUFBb0U7QUFFcEUsSUFBSSxlQUEyQyxDQUFDO0FBQ2hELFNBQVMsU0FBUztJQUNoQixJQUFJLENBQUMsZUFBZTtRQUFFLGVBQWUsR0FBRyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUN2RSxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsU0FBUyxlQUFlO0lBQ3RCLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzlDLE1BQU0sQ0FBQyxHQUFJLE9BQXdELENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUM5RSxPQUFPO1FBQ0wsT0FBTyxFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7UUFDM0IsV0FBVyxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7UUFDcEMsV0FBVyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7UUFDakMsU0FBUyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7UUFDL0IsYUFBYSxFQUFFLENBQUMsQ0FBQyxzQkFBc0I7UUFDdkMsS0FBSyxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDVSxRQUFBLFFBQVEsR0FBbUIsSUFBSSxLQUFLLENBQUMsRUFBb0IsRUFBRTtJQUN0RSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUk7UUFDVCxNQUFNLENBQUMsR0FBRyxTQUFTLEVBQTZDLENBQUM7UUFDakUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakIsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVILHlEQUF5RDtBQUN6RCxTQUFnQix1QkFBdUI7SUFDckMsZUFBZSxHQUFHLFNBQVMsQ0FBQztBQUM5QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLEtBQWdEO0lBQ3hFLE9BQU8sU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBdWRpdENsaWVudCwgdHlwZSBBdWRpdENsaWVudCB9IGZyb20gJy4vYXVkaXQvY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUJ1c2luZXNzQ2xpZW50LCB0eXBlIEJ1c2luZXNzQ2xpZW50IH0gZnJvbSAnLi9idXNpbmVzcy9jbGllbnQnO1xuaW1wb3J0IHsgYXV0aCB9IGZyb20gJy4vYXV0aCc7XG5pbXBvcnQgeyBtYWtlVG9rZW5Tb3VyY2VTdGF0ZSwgdHlwZSBUb2tlblNvdXJjZVN0YXRlIH0gZnJvbSAnLi90b2tlbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUF1dGggfSBmcm9tICcuL2NvbmZpZyc7XG5cbi8qKlxuICogQ2FsbGVyLWZhY2luZyBjb25maWcgZm9yIHRoZSB1bmlmaWVkIGBjcmVhdGVDbGllbnQoLi4uKWAgZmFjdG9yeSBhbmRcbiAqIHRoZSBgcGxhdGZvcm1gIHNpbmdsZXRvbi5cbiAqXG4gKiBQaWNrIGV4YWN0bHkgb25lIG9mOlxuICogICAtIGBhY2Nlc3NUb2tlbmAgKHN0cmluZyBvciBjYWxsYmFjaykgZm9yIHRoZSBzdGF0aWMgQmVhcmVyIGZsb3dcbiAqICAgLSBgc2VydmljZUlkYCArIGBzZXJ2aWNlU2VjcmV0YCBmb3IgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFsc1xuICpcbiAqIFdpdGhvdXQgZWl0aGVyLCBjYWxscyB0aHJvdyBgQ29uZmlnRXJyb3JgIG9uIHRoZSBmaXJzdCByZXF1ZXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudENvbmZpZyB7XG4gIGJhc2VVcmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBdXRoIHN1cmZhY2UgYmFzZSB1c2VkIHRvIGJvb3RzdHJhcCB0aGUgZmlyc3QgY2xpZW50X2NyZWRlbnRpYWxzXG4gICAqIG1pbnQuIERlZmF1bHRzIHRvIGAke2Jhc2VVcmx9L2F1dGgvYnVzaW5lc3NgLiBPbmNlIGEgdG9rZW4gZXhpc3RzLFxuICAgKiBmdXR1cmUgYXV0aCBjYWxscyBmb2xsb3cgdGhlIHRva2VuJ3MgYGlzc2AgY2xhaW0uXG4gICAqL1xuICBhdXRoQmFzZVVybD86IHN0cmluZztcbiAgLyoqXG4gICAqIEN1c3RvbWVyIGF1dGggc3VyZmFjZSBiYXNlIHVzZWQgYnkgYHdpdGhTZXNzaW9uVG9rZW5gLiBEZWZhdWx0c1xuICAgKiB0byBgJHtiYXNlVXJsfS9hdXRoL2N1c3RvbWVyYC5cbiAgICovXG4gIGN1c3RvbWVyQXV0aEJhc2VVcmw/OiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPik7XG4gIHNlcnZpY2VJZD86IHN0cmluZztcbiAgc2VydmljZVNlY3JldD86IHN0cmluZztcbiAgLyoqIFNwYWNlLXNlcGFyYXRlZCBzY29wZSBsaXN0IHRvIHJlcXVlc3Qgd2hlbiBtaW50aW5nIHZpYSBjbGllbnRfY3JlZGVudGlhbHMuICovXG4gIHNjb3BlPzogc3RyaW5nO1xuICAvKipcbiAgICogU2VydmljZSBpZGVudGlmaWVyIHRoZSBhdWRpdCBjbGllbnQgc2hvdWxkIHN0YW1wIGludG8gYGFjdG9yLnZpYWBcbiAgICogb24gZW1pdHRlZCBldmVudHMuIERlZmF1bHRzIHRvIGBzZXJ2aWNlSWRgIHdoZW4gc2V0OyBvdGhlcndpc2VcbiAgICogYXVkaXQgYHJlY29yZCgpYCBjYWxscyBsb2cgYW4gZXJyb3IgYW5kIGRyb3AgdGhlIGV2ZW50LlxuICAgKi9cbiAgYWN0b3JWaWE/OiBzdHJpbmc7XG4gIGV4cGlyeUJ1ZmZlck1zPzogbnVtYmVyO1xuICBmZXRjaEZuPzogdHlwZW9mIGZldGNoO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXRmb3JtQ2xpZW50IHtcbiAgYnVzaW5lc3M6IEJ1c2luZXNzQ2xpZW50O1xuICBhdWRpdDogQXVkaXRDbGllbnQ7XG4gIGF1dGg6IHR5cGVvZiBhdXRoO1xuICAvKipcbiAgICogUmV0dXJuIGEgZGVyaXZlZCBjbGllbnQgYm91bmQgdG8gdGhlIHN1cHBsaWVkIGFjY2VzcyB0b2tlbi5cbiAgICogSW5oZXJpdHMgYGJhc2VVcmxgIGFuZCBgZmV0Y2hGbmA7IHJlcGxhY2VzIHRoZSB0b2tlbiBzb3VyY2Ugd2l0aFxuICAgKiB0aGUgbmV3IG9uZS4gVXNlIGNhc2U6IEJGRiBoYW5kbGVycyB0aGF0IHdhbnQgdG8gY2FsbCB0aGVcbiAgICogcGxhdGZvcm0gQVBJIGFzIHRoZSBlbmQgdXNlciBpbnN0ZWFkIG9mIGFzIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgd2l0aFRva2VuKHRva2VuOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+KSk6IFBsYXRmb3JtQ2xpZW50O1xuICAvKipcbiAgICogUmV0dXJuIGEgZGVyaXZlZCBjbGllbnQgdGhhdCBleGNoYW5nZXMgYSBsZWdhY3kgY3VzdG9tZXIgc2Vzc2lvblxuICAgKiB0b2tlbiAoZnJvbSBgYWRkb19jb250YWN0c19tYXBwaW5nLnRva2VuYCkgZm9yIGEgQmVhcmVyIEpXVFxuICAgKiB0cmFuc3BhcmVudGx5IG9uIGVhY2ggY2FsbC4gVGhlIHNlc3Npb24gdG9rZW4gaXMgdGhlIHBlcnNpc3RlbnRcbiAgICogY3JlZGVudGlhbCDigJQgZXhjaGFuZ2VzIGhhcHBlbiBsYXppbHkgb24gdG9rZW4tY2FjaGUgbWlzcyBhbmQgb25cbiAgICogNDAxIHJldHJpZXMuIFdoZW4gdGhlIGxlZ2FjeSBzZXNzaW9uIGlzIHJldm9rZWQsIHRoZSBuZXh0XG4gICAqIGV4Y2hhbmdlIHJldHVybnMgNDAxIGFuZCBzdXJmYWNlcyBhcyBgQXV0aGVudGljYXRpb25FcnJvcmAuXG4gICAqL1xuICB3aXRoU2Vzc2lvblRva2VuKHNlc3Npb25Ub2tlbjogc3RyaW5nKTogUGxhdGZvcm1DbGllbnQ7XG59XG5cbmNvbnN0IERFRkFVTFRfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pbyc7XG5cbi8qKlxuICogQnVpbGQgYSBmcmVzaCwgaXNvbGF0ZWQgY2xpZW50IGZyb20gZXhwbGljaXQgY29uZmlnLiBFYWNoIGNhbGxcbiAqIGdldHMgaXRzIG93biBUb2tlblNvdXJjZSBzdGF0ZSDigJQgY29uY3VycmVudCBgY3JlYXRlQ2xpZW50KC4uLilgIHVzZVxuICogZG9lcyBub3Qgc3RhbXBlZGUgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xpZW50KGlucHV0OiBDbGllbnRDb25maWcgPSB7fSk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgd2FybklmQnJvd3NlclNlY3JldChpbnB1dCk7XG4gIHJldHVybiBidWlsZENsaWVudChpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ2xpZW50KGlucHV0OiBDbGllbnRDb25maWcpOiBQbGF0Zm9ybUNsaWVudCB7XG4gIGNvbnN0IGJhc2VVcmwgPSBpbnB1dC5iYXNlVXJsID8/IERFRkFVTFRfQkFTRV9VUkw7XG4gIGNvbnN0IHRva2VuU291cmNlU3RhdGUgPSByZXNvbHZlVG9rZW5Tb3VyY2UoaW5wdXQsIGJhc2VVcmwpO1xuICBjb25zdCBhdXRoOiBQbGF0Zm9ybUF1dGggfCB1bmRlZmluZWQgPSB0b2tlblNvdXJjZVN0YXRlXG4gICAgPyB7IHR5cGU6ICd0b2tlbi1zb3VyY2UnLCBzdGF0ZTogdG9rZW5Tb3VyY2VTdGF0ZSB9XG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYnVzaW5lc3NDbGllbnQgPSBjcmVhdGVCdXNpbmVzc0NsaWVudCh7IGJhc2VVcmwsIGZldGNoRm46IGlucHV0LmZldGNoRm4sIGF1dGggfSk7XG4gIGNvbnN0IGF1ZGl0Q2xpZW50ID0gY3JlYXRlQXVkaXRDbGllbnQoe1xuICAgIGJhc2VVcmwsXG4gICAgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbixcbiAgICBhdXRoLFxuICAgIGFjdG9yVmlhOiBpbnB1dC5hY3RvclZpYSA/PyBpbnB1dC5zZXJ2aWNlSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNsaWVudDogUGxhdGZvcm1DbGllbnQgPSB7XG4gICAgYnVzaW5lc3M6IGJ1c2luZXNzQ2xpZW50LFxuICAgIGF1ZGl0OiBhdWRpdENsaWVudCxcbiAgICBhdXRoOiBhdXRoTmFtZXNwYWNlLFxuICAgIHdpdGhUb2tlbih0b2tlbikge1xuICAgICAgcmV0dXJuIGJ1aWxkQ2xpZW50KHtcbiAgICAgICAgLi4uaW5wdXQsXG4gICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbixcbiAgICAgICAgLy8gVGhlIG5ldyBjbGllbnQgc2hvdWxkIG5vdCBhbHNvIHRyeSB0byBtaW50IHZpYVxuICAgICAgICAvLyBjbGllbnRfY3JlZGVudGlhbHMgb24gdG9wIG9mIHRoZSBzdXBwbGllZCB1c2VyIHRva2VuLlxuICAgICAgICBzZXJ2aWNlSWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VydmljZVNlY3JldDogdW5kZWZpbmVkLFxuICAgICAgICBzY29wZTogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB3aXRoU2Vzc2lvblRva2VuKHNlc3Npb25Ub2tlbikge1xuICAgICAgY29uc3QgY3VzdG9tZXJBdXRoQmFzZVVybCA9IGlucHV0LmN1c3RvbWVyQXV0aEJhc2VVcmwgPz8gYCR7YmFzZVVybH0vYXV0aC9jdXN0b21lcmA7XG4gICAgICBjb25zdCBmZXRjaEZuID0gaW5wdXQuZmV0Y2hGbiA/PyAoZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gpO1xuICAgICAgLy8gV3JhcCB0aGUgY3VzdG9tZXItc2lkZSBzZXNzaW9uLWV4Y2hhbmdlIGluIGEgY2FsbGJhY2stc3R5bGVcbiAgICAgIC8vIFRva2VuU291cmNlLiBUaGUgZXhpc3RpbmcgZGVkdXAgKyBjYWNoZSArIDQwMS1yZXRyeSBtYWNoaW5lcnlcbiAgICAgIC8vIGRvZXMgdGhlIHJlc3QuXG4gICAgICByZXR1cm4gYnVpbGRDbGllbnQoe1xuICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgYWNjZXNzVG9rZW46ICgpID0+IGV4Y2hhbmdlU2Vzc2lvblRva2VuKHNlc3Npb25Ub2tlbiwgY3VzdG9tZXJBdXRoQmFzZVVybCwgZmV0Y2hGbiksXG4gICAgICAgIHNlcnZpY2VJZDogdW5kZWZpbmVkLFxuICAgICAgICBzZXJ2aWNlU2VjcmV0OiB1bmRlZmluZWQsXG4gICAgICAgIHNjb3BlOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIFBPU1QgdG8gdGhlIGN1c3RvbWVyIGF1dGggc3VyZmFjZSB0byBleGNoYW5nZSBhIGxlZ2FjeSBzZXNzaW9uXG4gKiB0b2tlbiBmb3IgYSBmcmVzaCBhY2Nlc3MgdG9rZW4uIEludGVybmFsIHRvIGB3aXRoU2Vzc2lvblRva2VuYDtcbiAqIGNhbGxlcnMgZG9uJ3Qgc2VlIHRoaXMgZGlyZWN0bHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4Y2hhbmdlU2Vzc2lvblRva2VuKFxuICBzZXNzaW9uVG9rZW46IHN0cmluZyxcbiAgY3VzdG9tZXJBdXRoQmFzZVVybDogc3RyaW5nLFxuICBmZXRjaEZuOiB0eXBlb2YgZmV0Y2gsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaEZuKGAke2N1c3RvbWVyQXV0aEJhc2VVcmx9L29hdXRoL3Rva2VuYCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sXG4gICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICBncmFudF90eXBlOiAnc2Vzc2lvbl90b2tlbicsXG4gICAgICBzZXNzaW9uX3Rva2VuOiBzZXNzaW9uVG9rZW4sXG4gICAgfSkudG9TdHJpbmcoKSxcbiAgfSk7XG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIGNvbnN0IHsgQXV0aGVudGljYXRpb25FcnJvciB9ID0gYXdhaXQgaW1wb3J0KCcuL2Vycm9ycycpO1xuICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKGBzZXNzaW9uLXRva2VuIGV4Y2hhbmdlIGZhaWxlZDogSFRUUCAke3Jlcy5zdGF0dXN9ICR7dGV4dH1gKTtcbiAgfVxuICBjb25zdCBqc29uID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHsgYWNjZXNzX3Rva2VuPzogc3RyaW5nIH07XG4gIGlmICghanNvbi5hY2Nlc3NfdG9rZW4pIHtcbiAgICBjb25zdCB7IENvbmZpZ0Vycm9yIH0gPSBhd2FpdCBpbXBvcnQoJy4vZXJyb3JzJyk7XG4gICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdzZXNzaW9uLXRva2VuIGV4Y2hhbmdlIHJlc3BvbnNlIG1pc3NpbmcgYWNjZXNzX3Rva2VuJyk7XG4gIH1cbiAgcmV0dXJuIGpzb24uYWNjZXNzX3Rva2VuO1xufVxuXG5pbXBvcnQgeyBhdXRoIGFzIGF1dGhOYW1lc3BhY2UgfSBmcm9tICcuL2F1dGgnO1xuXG5mdW5jdGlvbiByZXNvbHZlVG9rZW5Tb3VyY2UoaW5wdXQ6IENsaWVudENvbmZpZywgYmFzZVVybDogc3RyaW5nKTogVG9rZW5Tb3VyY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGF1dGhCYXNlVXJsID0gaW5wdXQuYXV0aEJhc2VVcmwgPz8gYCR7YmFzZVVybH0vYXV0aC9idXNpbmVzc2A7XG4gIGlmIChpbnB1dC5hY2Nlc3NUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dC5hY2Nlc3NUb2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgICAgICAgeyBraW5kOiAnc3RhdGljLXN0cmluZycsIHRva2VuOiBpbnB1dC5hY2Nlc3NUb2tlbiB9LFxuICAgICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAgeyBraW5kOiAnY2FsbGJhY2snLCBnZXRUb2tlbjogaW5wdXQuYWNjZXNzVG9rZW4gfSxcbiAgICAgIHsgZXhwaXJ5QnVmZmVyTXM6IGlucHV0LmV4cGlyeUJ1ZmZlck1zLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuIH0sXG4gICAgKTtcbiAgfVxuICBpZiAoaW5wdXQuc2VydmljZUlkICYmIGlucHV0LnNlcnZpY2VTZWNyZXQpIHtcbiAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICB7XG4gICAgICAgIGtpbmQ6ICdzZXJ2aWNlLWNyZWRlbnRpYWxzJyxcbiAgICAgICAgY2xpZW50SWQ6IGlucHV0LnNlcnZpY2VJZCxcbiAgICAgICAgY2xpZW50U2VjcmV0OiBpbnB1dC5zZXJ2aWNlU2VjcmV0LFxuICAgICAgICBhdXRoQmFzZVVybCxcbiAgICAgICAgc2NvcGU6IGlucHV0LnNjb3BlLFxuICAgICAgfSxcbiAgICAgIHsgZXhwaXJ5QnVmZmVyTXM6IGlucHV0LmV4cGlyeUJ1ZmZlck1zLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuIH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZCcm93c2VyU2VjcmV0KGNvbmZpZzogQ2xpZW50Q29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIHsgd2luZG93PzogeyBkb2N1bWVudD86IHVua25vd24gfSB9O1xuICBjb25zdCBpbkJyb3dzZXIgPSB0eXBlb2YgZy53aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnLndpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG4gIGlmICghaW5Ccm93c2VyKSByZXR1cm47XG4gIGlmIChjb25maWcuc2VydmljZVNlY3JldCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdbdWVuZ2FnZS1wbGF0Zm9ybS1zZGtdIHNlcnZpY2VTZWNyZXQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGJyb3dzZXIgZW52aXJvbm1lbnRzLiAnICtcbiAgICAgICAgJ1NlcnZpY2UgY3JlZGVudGlhbHMgaW4gYnJvd3NlciBidW5kbGVzIGFyZSBwdWJsaWNseSB2aXNpYmxlLiAnICtcbiAgICAgICAgJ1VzZSBgYWNjZXNzVG9rZW5gIHdpdGggYSB0b2tlbiBvYnRhaW5lZCB2aWEgT0F1dGggKG9yIGB3aXRoVG9rZW4oLi4uKWAgb24gYSBzZXJ2ZXItYnVpbHQgY2xpZW50KSBpbnN0ZWFkLicsXG4gICAgKTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgRGVmYXVsdCBzaW5nbGV0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gUmVzb2x2ZWQgbGF6aWx5IG9uIGZpcnN0IHByb3BlcnR5IGFjY2VzcyAoUHJveHkpIHNvIGNvbnN1bWVycyB0aGF0XG4vLyBtdXRhdGUgYHByb2Nlc3MuZW52YCBhZnRlciBpbXBvcnQgc3RpbGwgcGljayB1cCB0aGUgcmlnaHQgdmFsdWVzLlxuXG5sZXQgY2FjaGVkU2luZ2xldG9uOiBQbGF0Zm9ybUNsaWVudCB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIHNpbmdsZXRvbigpOiBQbGF0Zm9ybUNsaWVudCB7XG4gIGlmICghY2FjaGVkU2luZ2xldG9uKSBjYWNoZWRTaW5nbGV0b24gPSBidWlsZENsaWVudChlbnZDbGllbnRDb25maWcoKSk7XG4gIHJldHVybiBjYWNoZWRTaW5nbGV0b247XG59XG5cbmZ1bmN0aW9uIGVudkNsaWVudENvbmZpZygpOiBDbGllbnRDb25maWcge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnKSByZXR1cm4ge307XG4gIGNvbnN0IGUgPSAocHJvY2VzcyBhcyB7IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSkuZW52ID8/IHt9O1xuICByZXR1cm4ge1xuICAgIGJhc2VVcmw6IGUuVUVOR0FHRV9CQVNFX1VSTCxcbiAgICBhdXRoQmFzZVVybDogZS5VRU5HQUdFX0FVVEhfQkFTRV9VUkwsXG4gICAgYWNjZXNzVG9rZW46IGUuVUVOR0FHRV9BVVRIX1RPS0VOLFxuICAgIHNlcnZpY2VJZDogZS5VRU5HQUdFX1NFUlZJQ0VfSUQsXG4gICAgc2VydmljZVNlY3JldDogZS5VRU5HQUdFX1NFUlZJQ0VfU0VDUkVULFxuICAgIHNjb3BlOiBlLlVFTkdBR0VfU0VSVklDRV9TQ09QRSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGNsaWVudC4gUmVhZHMgY29uZmlnIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIGZpcnN0XG4gKiBwcm9wZXJ0eSBhY2Nlc3MgKHNvIHRlc3Qgc2V0dXBzIHRoYXQgbXV0YXRlIGBwcm9jZXNzLmVudmAgYWZ0ZXJcbiAqIGltcG9ydCB3b3JrKS4gVXNlIGBjcmVhdGVDbGllbnQoLi4uKWAgd2hlbiB5b3UgbmVlZCBhbiBpc29sYXRlZFxuICogaW5zdGFuY2Ugd2l0aCBleHBsaWNpdCBjb25maWcuXG4gKlxuICogICBVRU5HQUdFX0JBU0VfVVJMICAgICAgICAgZGVmYXVsdHMgdG8gaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pb1xuICogICBVRU5HQUdFX0FVVEhfQkFTRV9VUkwgICAgYXV0aCBzdXJmYWNlIG92ZXJyaWRlIChkZWZhdWx0ICR7YmFzZVVybH0vYXV0aC9idXNpbmVzcylcbiAqICAgVUVOR0FHRV9BVVRIX1RPS0VOICAgICAgIHN0YXRpYyBCZWFyZXIgdG9rZW4gKG92ZXJyaWRlcyBjbGllbnRfY3JlZGVudGlhbHMpXG4gKiAgIFVFTkdBR0VfU0VSVklDRV9JRCAgICAgICBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzIGNsaWVudElkXG4gKiAgIFVFTkdBR0VfU0VSVklDRV9TRUNSRVQgICBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzIGNsaWVudFNlY3JldFxuICogICBVRU5HQUdFX1NFUlZJQ0VfU0NPUEUgICAgb3B0aW9uYWwgc3BhY2Utc2VwYXJhdGVkIHNjb3BlIGxpc3RcbiAqL1xuZXhwb3J0IGNvbnN0IHBsYXRmb3JtOiBQbGF0Zm9ybUNsaWVudCA9IG5ldyBQcm94eSh7fSBhcyBQbGF0Zm9ybUNsaWVudCwge1xuICBnZXQoXywgcHJvcCkge1xuICAgIGNvbnN0IHMgPSBzaW5nbGV0b24oKSBhcyB1bmtub3duIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj47XG4gICAgcmV0dXJuIHNbcHJvcF07XG4gIH0sXG59KTtcblxuLyoqIFRlc3Qtb25seTogZHJvcCB0aGUgc2luZ2xldG9uIGNhY2hlIGJldHdlZW4gY2FzZXMuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0UGxhdGZvcm1TaW5nbGV0b24oKTogdm9pZCB7XG4gIGNhY2hlZFNpbmdsZXRvbiA9IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb252ZW5pZW5jZTogc2hvcnRoYW5kIGZvciBgcGxhdGZvcm0ud2l0aFRva2VuKHRva2VuKWAuXG4gKiBCRkYgaGFuZGxlcnMgY29tbW9ubHkgY2FsbCB0aGlzIG9uY2UgcGVyIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoVG9rZW4odG9rZW46IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4pKTogUGxhdGZvcm1DbGllbnQge1xuICByZXR1cm4gc2luZ2xldG9uKCkud2l0aFRva2VuKHRva2VuKTtcbn1cbiJdfQ==
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZIQSxvQ0FJQztBQWpJRCwyQ0FBcUU7QUFDckUsOENBQThFO0FBQzlFLDJDQUFxRTtBQUNyRSxpQ0FBK0M7QUFDL0MsaURBSXdCO0FBQ3hCLHFDQUE0RDtBQTRHNUQsTUFBTSxnQkFBZ0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUUzRDs7Ozs7R0FLRztBQUNILFNBQWdCLFlBQVksQ0FBQyxRQUFzQixFQUFFO0lBQ25ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBbUI7SUFDdEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQztJQUNsRCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RCxNQUFNLElBQUksR0FBNkIsZ0JBQWdCO1FBQ3JELENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFO1FBQ25ELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFZCxNQUFNLGNBQWMsR0FBRyxJQUFBLDZCQUFvQixFQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkYsTUFBTSxXQUFXLEdBQUcsSUFBQSwwQkFBaUIsRUFBQztRQUNwQyxPQUFPO1FBQ1AsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLElBQUk7UUFDSixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsU0FB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RUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUk7WUFDckQsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUMvQixRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRO1NBQ2hDLEVBQ0QsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUNqRSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLE1BQW9CO0lBQy9DLE1BQU0sQ0FBQyxHQUFHLFVBQWlELENBQUM7SUFDNUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsQ0FBQztJQUM5RixJQUFJLENBQUMsU0FBUztRQUFFLE9BQU87SUFDdkIsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FDVixtRkFBbUY7WUFDakYsK0RBQStEO1lBQy9ELDBFQUEwRSxDQUM3RSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBdWRpdENsaWVudCwgdHlwZSBBdWRpdENsaWVudCB9IGZyb20gJy4vYXVkaXQvY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUJ1c2luZXNzQ2xpZW50LCB0eXBlIEJ1c2luZXNzQ2xpZW50IH0gZnJvbSAnLi9idXNpbmVzcy9jbGllbnQnO1xuaW1wb3J0IHsgY3JlYXRlWm9uZXNDbGllbnQsIHR5cGUgWm9uZXNDbGllbnQgfSBmcm9tICcuL3pvbmVzL2NsaWVudCc7XG5pbXBvcnQgeyBhdXRoIGFzIGF1dGhOYW1lc3BhY2UgfSBmcm9tICcuL2F1dGgnO1xuaW1wb3J0IHtcbiAgZ2V0QWNjZXNzVG9rZW4gYXMgcmVzb2x2ZUFjY2Vzc1Rva2VuLFxuICBtYWtlVG9rZW5Tb3VyY2VTdGF0ZSxcbiAgdHlwZSBUb2tlblNvdXJjZVN0YXRlLFxufSBmcm9tICcuL3Rva2VuLXNvdXJjZSc7XG5pbXBvcnQgeyBDb25maWdFcnJvciwgQXV0aGVudGljYXRpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1BdXRoIH0gZnJvbSAnLi9jb25maWcnO1xuXG4vKipcbiAqIENhbGxlci1mYWNpbmcgY29uZmlnIGZvciBgY3JlYXRlQ2xpZW50KC4uLilgLlxuICpcbiAqIGBjcmVhdGVDbGllbnQoKWAgKG5vIGFyZ3MpIHJlYWRzIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3RhbmRhcmRcbiAqIGBVRU5HQUdFXypgIGVudmlyb25tZW50IHZhcmlhYmxlcyDigJQgY29udmVuaWVudCBmb3IgTGFtYmRhcyB0aGF0XG4gKiBhbHJlYWR5IGhhdmUgdGhlaXIgY29uZmlnIGluamVjdGVkIGJ5IHRoZSBkZXBsb3kgc3RhY2suIEFueSBmaWVsZFxuICogcGFzc2VkIGV4cGxpY2l0bHkgb3ZlcnJpZGVzIHRoZSBtYXRjaGluZyBlbnYgZGVmYXVsdCBmb3IgdGhhdCBvbmVcbiAqIGNhbGwgb25seSAobm8gc2hhcmVkIG11dGFibGUgc3RhdGUsIG5vIHNpbmdsZXRvbikuXG4gKlxuICogQXV0aC1tb2RlIGZpZWxkcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBQaWNrIG9uZTpcbiAqICAgLSBgc2VydmljZUlkYCArIGBzZXJ2aWNlU2VjcmV0YCAgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscy5cbiAqICAgLSBgYXV0aFRva2VuYCAgICAgICAgICAgICAgICAgICAgc3RhdGljIEJlYXJlciB0b2tlbiwgb3IgYXN5bmNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgdGhhdCByZXR1cm5zIG9uZS5cbiAqICAgLSBgc2Vzc2lvbjoge2lkLCB0b2tlbn1gICAgICAgICAgbGVnYWN5IHVFbmdhZ2UgKGlkLCBhcGlUb2tlbikgL1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWQsIGFkZG9fY29udGFjdHNfbWFwcGluZy50b2tlbilcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpci4gVGhlIFNESyBwcm9iZXMgdGhlIGJ1c2luZXNzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UgKHVzZXJzKSBmaXJzdCwgZmFsbHMgYmFja1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY3VzdG9tZXIgc3VyZmFjZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkb19jb250YWN0c19tYXBwaW5nKSBpZiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3MgcHJvYmUgcmV0dXJuc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgaW52YWxpZF9ncmFudGAsIGFuZCBjYWNoZXMgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZyBKV1QuXG4gKlxuICogUGFzc2luZyBtb3JlIHRoYW4gb25lIGV4cGxpY2l0bHkgaXMgYSBgQ29uZmlnRXJyb3JgLiBQYXNzaW5nIGFueSBvbmVcbiAqIG9mIHRoZW0gc3VwcHJlc3NlcyBldmVyeSBlbnYtZGVyaXZlZCBhdXRoIGRlZmF1bHQsIHNvIGEgY2FsbGVyJ3NcbiAqIGV4cGxpY2l0IG92ZXJyaWRlIGlzIG5ldmVyIHNpbGVudGx5IG1lcmdlZCB3aXRoIGVudiBjcmVkZW50aWFscyBvZlxuICogYSBkaWZmZXJlbnQgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRDb25maWcge1xuICBiYXNlVXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogQXV0aCBzdXJmYWNlIGJhc2UgdXNlZCB0byBib290c3RyYXAgdGhlIGZpcnN0IGNsaWVudF9jcmVkZW50aWFsc1xuICAgKiBtaW50LiBEZWZhdWx0cyB0byBgJHtiYXNlVXJsfS9hdXRoL2J1c2luZXNzYC5cbiAgICovXG4gIGF1dGhCYXNlVXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogQ3VzdG9tZXIgYXV0aCBzdXJmYWNlIGJhc2UgdXNlZCBieSBgc2Vzc2lvbmAgZXhjaGFuZ2VzLiBEZWZhdWx0cyB0b1xuICAgKiBgJHtiYXNlVXJsfS9hdXRoL2N1c3RvbWVyYC5cbiAgICovXG4gIGN1c3RvbWVyQXV0aEJhc2VVcmw/OiBzdHJpbmc7XG5cbiAgLy8g4pSA4pSA4pSAIEF1dGggbW9kZXMgKG11dHVhbGx5IGV4Y2x1c2l2ZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8qKiBPQXV0aDIgYGNsaWVudF9jcmVkZW50aWFsc2AgY2xpZW50SWQuIFBhaXIgd2l0aCBgc2VydmljZVNlY3JldGAuICovXG4gIHNlcnZpY2VJZD86IHN0cmluZztcbiAgLyoqIE9BdXRoMiBgY2xpZW50X2NyZWRlbnRpYWxzYCBjbGllbnRTZWNyZXQuIFBhaXIgd2l0aCBgc2VydmljZUlkYC4gKi9cbiAgc2VydmljZVNlY3JldD86IHN0cmluZztcbiAgLyoqIFNwYWNlLXNlcGFyYXRlZCBzY29wZSBsaXN0IHRvIHJlcXVlc3Qgd2hlbiBtaW50aW5nIHZpYSBjbGllbnRfY3JlZGVudGlhbHMuICovXG4gIHNjb3BlPzogc3RyaW5nO1xuICAvKiogU3RhdGljIEJlYXJlciBKV1QsIG9yIGFzeW5jIGNhbGxiYWNrIHRoYXQgcmV0dXJucyBvbmUuICovXG4gIGF1dGhUb2tlbj86IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4pO1xuICAvKipcbiAgICogTGVnYWN5IHVFbmdhZ2UgKGlkLCB0b2tlbikgcGFpci4gYGlkYCBpcyBgdXNlcnMudXNlcklkYCBmb3Igc3RhZmZcbiAgICogdXNlcnMgKG1hdGNoZWQgdmlhIHRoZSBidXNpbmVzcyBzdXJmYWNlKSBvclxuICAgKiBgYWRkb19jb250YWN0c19tYXBwaW5nLmlkYC9gY29udGFjdElkYCBmb3IgY3VzdG9tZXJzIChtYXRjaGVkIHZpYVxuICAgKiB0aGUgY3VzdG9tZXIgc3VyZmFjZSkuIFRoZSBTREsgcHJvYmVzIHRoZSBidXNpbmVzcyBzdXJmYWNlIGZpcnN0XG4gICAqIGFuZCBmYWxscyBiYWNrIHRvIGN1c3RvbWVyIG9uIGBpbnZhbGlkX2dyYW50YC5cbiAgICovXG4gIHNlc3Npb24/OiB7IGlkOiBzdHJpbmcgfCBudW1iZXI7IHRva2VuOiBzdHJpbmcgfTtcbiAgLyoqXG4gICAqIGAoYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbilgIHBhaXIgZnJvbSBhIGZpbmlzaGVkIGxvZ2luIGZsb3dcbiAgICogKGBhdXRoLmxvZ2luV2l0aFBhc3N3b3JkKC4uLilgLCBgYXV0aC52ZXJpZnlPdHAoLi4uKWAsIGV0YykuIFRoZVxuICAgKiBTREsgdXNlcyB0aGUgYWNjZXNzIHRva2VuIHVudGlsIGl0IGV4cGlyZXMsIHRoZW4gcm90YXRlcyB2aWFcbiAgICogYGF1dGgucmVmcmVzaCguLi4pYCB0cmFuc3BhcmVudGx5LiBgb25Sb3RhdGVgIGZpcmVzIGFmdGVyIGV2ZXJ5XG4gICAqIHJvdGF0aW9uIHNvIGNhbGxlcnMgY2FuIHBlcnNpc3QgdGhlIG5ldyBwYWlyLlxuICAgKi9cbiAgdG9rZW5zPzoge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgLyoqIEFjY2VzcyB0b2tlbiBUVEwgKHNlY29uZHMpLCBhcyByZXR1cm5lZCBieSB0aGUgYXV0aCBzdXJmYWNlLiAqL1xuICAgIGV4cGlyZXNJbjogbnVtYmVyO1xuICAgIC8qKiBPQXV0aCBjbGllbnQgaWQgdXNlZCBkdXJpbmcgdGhlIG9yaWdpbmFsIGxvZ2luIChyZXF1aXJlZCBieSB0aGUgcmVmcmVzaCBoYW5kbGVyKS4gKi9cbiAgICBjbGllbnRJZDogc3RyaW5nO1xuICAgIG9uUm90YXRlPzogKHBhaXI6IHtcbiAgICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICAgIH0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIGlkZW50aWZpZXIgdGhlIGF1ZGl0IGNsaWVudCBzaG91bGQgc3RhbXAgaW50byBgYWN0b3IudmlhYFxuICAgKiBvbiBlbWl0dGVkIGV2ZW50cy4gRGVmYXVsdHMgdG8gYHNlcnZpY2VJZGAgd2hlbiBzZXQ7IG90aGVyd2lzZVxuICAgKiBhdWRpdCBgcmVjb3JkKClgIGNhbGxzIGxvZyBhbiBlcnJvciBhbmQgZHJvcCB0aGUgZXZlbnQuXG4gICAqL1xuICBhY3RvclZpYT86IHN0cmluZztcbiAgZXhwaXJ5QnVmZmVyTXM/OiBudW1iZXI7XG4gIGZldGNoRm4/OiB0eXBlb2YgZmV0Y2g7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1DbGllbnQge1xuICBidXNpbmVzczogQnVzaW5lc3NDbGllbnQ7XG4gIGF1ZGl0OiBBdWRpdENsaWVudDtcbiAgem9uZXM6IFpvbmVzQ2xpZW50O1xuICBhdXRoOiB0eXBlb2YgYXV0aE5hbWVzcGFjZTtcbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGN1cnJlbnQgYWNjZXNzIHRva2VuLCBtaW50aW5nIHZpYSB0aGUgY29uZmlndXJlZCBhdXRoXG4gICAqIG1vZGUgaWYgdGhlIGNhY2hlIGlzIGNvbGQuIFVzZWZ1bCBmb3IgYGF1dGgudmVyaWZ5QWNjZXNzVG9rZW4oLi4uKWBcbiAgICogcm91bmQtdHJpcHMgYW5kIGZvciBjYWxsZXJzIHRoYXQgd2FudCB0byBsb2cgLyBmb3J3YXJkIHRoZSBiZWFyZXJcbiAgICogdG8gYSBkb3duc3RyZWFtIHNlcnZpY2UuXG4gICAqXG4gICAqIFRocm93cyBgQ29uZmlnRXJyb3JgIHdoZW4gdGhlIGNsaWVudCB3YXMgYnVpbHQgd2l0aCBubyBhdXRoIG1vZGUuXG4gICAqL1xuICBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbmNvbnN0IERFRkFVTFRfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pbyc7XG5cbi8qKlxuICogQnVpbGQgYSBmcmVzaCwgaXNvbGF0ZWQgY2xpZW50LiBXaXRoIG5vIGFyZ3MsIHJlYWRzIGBVRU5HQUdFXypgXG4gKiBlbnYgdmFyczsgZXhwbGljaXQgZmllbGRzIG92ZXJyaWRlIHBlciBjYWxsLiBFYWNoIGNhbGwgZ2V0cyBpdHMgb3duXG4gKiBUb2tlblNvdXJjZSBzdGF0ZSDigJQgY29uY3VycmVudCBgY3JlYXRlQ2xpZW50KC4uLilgIHVzZSBkb2VzIG5vdFxuICogc3RhbXBlZGUgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xpZW50KGlucHV0OiBDbGllbnRDb25maWcgPSB7fSk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgY29uc3QgbWVyZ2VkID0gbWVyZ2VXaXRoRW52KGlucHV0KTtcbiAgd2FybklmQnJvd3NlclNlY3JldChtZXJnZWQpO1xuICByZXR1cm4gYnVpbGRDbGllbnQobWVyZ2VkKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGllbnQoaW5wdXQ6IENsaWVudENvbmZpZyk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgY29uc3QgYmFzZVVybCA9IGlucHV0LmJhc2VVcmwgPz8gREVGQVVMVF9CQVNFX1VSTDtcbiAgY29uc3QgdG9rZW5Tb3VyY2VTdGF0ZSA9IHJlc29sdmVUb2tlblNvdXJjZShpbnB1dCwgYmFzZVVybCk7XG4gIGNvbnN0IGF1dGg6IFBsYXRmb3JtQXV0aCB8IHVuZGVmaW5lZCA9IHRva2VuU291cmNlU3RhdGVcbiAgICA/IHsgdHlwZTogJ3Rva2VuLXNvdXJjZScsIHN0YXRlOiB0b2tlblNvdXJjZVN0YXRlIH1cbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBidXNpbmVzc0NsaWVudCA9IGNyZWF0ZUJ1c2luZXNzQ2xpZW50KHsgYmFzZVVybCwgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiwgYXV0aCB9KTtcbiAgY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVBdWRpdENsaWVudCh7XG4gICAgYmFzZVVybCxcbiAgICBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLFxuICAgIGF1dGgsXG4gICAgYWN0b3JWaWE6IGlucHV0LmFjdG9yVmlhID8/IGlucHV0LnNlcnZpY2VJZCxcbiAgfSk7XG4gIGNvbnN0IHpvbmVzQ2xpZW50ID0gY3JlYXRlWm9uZXNDbGllbnQoeyBiYXNlVXJsLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLCBhdXRoIH0pO1xuXG4gIHJldHVybiB7XG4gICAgYnVzaW5lc3M6IGJ1c2luZXNzQ2xpZW50LFxuICAgIGF1ZGl0OiBhdWRpdENsaWVudCxcbiAgICB6b25lczogem9uZXNDbGllbnQsXG4gICAgYXV0aDogYXV0aE5hbWVzcGFjZSxcbiAgICBnZXRBY2Nlc3NUb2tlbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCF0b2tlblNvdXJjZVN0YXRlKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWdFcnJvcihcbiAgICAgICAgICAnZ2V0QWNjZXNzVG9rZW46IG5vIGF1dGggbW9kZSBjb25maWd1cmVkLiBQYXNzIHtzZXJ2aWNlSWQsIHNlcnZpY2VTZWNyZXR9IHwge2F1dGhUb2tlbn0gfCB7c2Vzc2lvbn0uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlQWNjZXNzVG9rZW4odG9rZW5Tb3VyY2VTdGF0ZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuY29uc3QgQVVUSF9NT0RFX0ZJRUxEUyA9IFtcbiAgJ3NlcnZpY2VJZCcsXG4gICdzZXJ2aWNlU2VjcmV0JyxcbiAgJ3Njb3BlJyxcbiAgJ2F1dGhUb2tlbicsXG4gICdzZXNzaW9uJyxcbiAgJ3Rva2VucycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE1lcmdlIGVudi1kZXJpdmVkIGRlZmF1bHRzIHdpdGggdGhlIGNhbGxlcidzIGV4cGxpY2l0IGlucHV0LiBBbnlcbiAqIGV4cGxpY2l0IGF1dGgtbW9kZSBmaWVsZCBzdXBwcmVzc2VzICphbGwqIGVudi1kZXJpdmVkIGF1dGggZGVmYXVsdHMsXG4gKiBzbyBhbiBleHBsaWNpdCBge2F1dGhUb2tlbn1gIG92ZXJyaWRlIGRvZXNuJ3QgYWNjaWRlbnRhbGx5IGluaGVyaXRcbiAqIGBzZXJ2aWNlSWRgL2BzZXJ2aWNlU2VjcmV0YCBmcm9tIGVudi4gTm9uLWF1dGggZmllbGRzIGZhbGwgdGhyb3VnaFxuICogbm9ybWFsbHkgKGNhbGxlciBgYmFzZVVybGAgb3ZlcnJpZGVzIGVudiBiYXNlVXJsOyBhYnNlbnQgaW5wdXQga2VlcHNcbiAqIGVudiBiYXNlVXJsKS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VXaXRoRW52KGlucHV0OiBDbGllbnRDb25maWcpOiBDbGllbnRDb25maWcge1xuICBjb25zdCBlbnYgPSByZWFkRW52RGVmYXVsdHMoKTtcbiAgY29uc3QgaW5wdXRIYXNBdXRoID0gaW5wdXRIYXNBdXRoTW9kZShpbnB1dCk7XG4gIGNvbnN0IGVudkZvck1lcmdlID0gaW5wdXRIYXNBdXRoID8gd2l0aG91dEF1dGhGaWVsZHMoZW52KSA6IGVudjtcblxuICBjb25zdCBtZXJnZWQ6IENsaWVudENvbmZpZyA9IHtcbiAgICBiYXNlVXJsOiBpbnB1dC5iYXNlVXJsID8/IGVudkZvck1lcmdlLmJhc2VVcmwsXG4gICAgYXV0aEJhc2VVcmw6IGlucHV0LmF1dGhCYXNlVXJsID8/IGVudkZvck1lcmdlLmF1dGhCYXNlVXJsLFxuICAgIGN1c3RvbWVyQXV0aEJhc2VVcmw6IGlucHV0LmN1c3RvbWVyQXV0aEJhc2VVcmwgPz8gZW52Rm9yTWVyZ2UuY3VzdG9tZXJBdXRoQmFzZVVybCxcbiAgICBzZXJ2aWNlSWQ6IGlucHV0LnNlcnZpY2VJZCA/PyBlbnZGb3JNZXJnZS5zZXJ2aWNlSWQsXG4gICAgc2VydmljZVNlY3JldDogaW5wdXQuc2VydmljZVNlY3JldCA/PyBlbnZGb3JNZXJnZS5zZXJ2aWNlU2VjcmV0LFxuICAgIHNjb3BlOiBpbnB1dC5zY29wZSA/PyBlbnZGb3JNZXJnZS5zY29wZSxcbiAgICBhdXRoVG9rZW46IGlucHV0LmF1dGhUb2tlbiA/PyBlbnZGb3JNZXJnZS5hdXRoVG9rZW4sXG4gICAgc2Vzc2lvbjogaW5wdXQuc2Vzc2lvbiA/PyBlbnZGb3JNZXJnZS5zZXNzaW9uLFxuICAgIHRva2VuczogaW5wdXQudG9rZW5zLFxuICAgIGFjdG9yVmlhOiBpbnB1dC5hY3RvclZpYSA/PyBlbnZGb3JNZXJnZS5hY3RvclZpYSxcbiAgICBleHBpcnlCdWZmZXJNczogaW5wdXQuZXhwaXJ5QnVmZmVyTXMgPz8gZW52Rm9yTWVyZ2UuZXhwaXJ5QnVmZmVyTXMsXG4gICAgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbixcbiAgfTtcbiAgYXNzZXJ0RXhhY3RseU9uZUF1dGhNb2RlKG1lcmdlZCk7XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRFbnZEZWZhdWx0cygpOiBDbGllbnRDb25maWcge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnKSByZXR1cm4ge307XG4gIGNvbnN0IGUgPSAocHJvY2VzcyBhcyB7IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSkuZW52ID8/IHt9O1xuICBjb25zdCBleHBpcnkgPSBlLlVFTkdBR0VfRVhQSVJZX0JVRkZFUl9NUyA/IE51bWJlcihlLlVFTkdBR0VfRVhQSVJZX0JVRkZFUl9NUykgOiB1bmRlZmluZWQ7XG4gIC8vIFVFTkdBR0VfU0VTU0lPTl9JRCArIFVFTkdBR0VfU0VTU0lPTl9UT0tFTiBtdXN0IGJlIHBhaXJlZDsgZWl0aGVyIGFsb25lIGlzIGlnbm9yZWRcbiAgLy8gc28gYW4gZW52LW9ubHkgc2V0dXAgbmV2ZXIgcHJvZHVjZXMgYSBoYWxmLWNvbmZpZ3VyZWQgc2Vzc2lvbi5cbiAgY29uc3Qgc2Vzc2lvbiA9XG4gICAgZS5VRU5HQUdFX1NFU1NJT05fSUQgJiYgZS5VRU5HQUdFX1NFU1NJT05fVE9LRU5cbiAgICAgID8geyBpZDogZS5VRU5HQUdFX1NFU1NJT05fSUQsIHRva2VuOiBlLlVFTkdBR0VfU0VTU0lPTl9UT0tFTiB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVXJsOiBlLlVFTkdBR0VfQkFTRV9VUkwsXG4gICAgYXV0aEJhc2VVcmw6IGUuVUVOR0FHRV9BVVRIX0JBU0VfVVJMLFxuICAgIGN1c3RvbWVyQXV0aEJhc2VVcmw6IGUuVUVOR0FHRV9DVVNUT01FUl9BVVRIX0JBU0VfVVJMLFxuICAgIHNlcnZpY2VJZDogZS5VRU5HQUdFX1NFUlZJQ0VfSUQsXG4gICAgc2VydmljZVNlY3JldDogZS5VRU5HQUdFX1NFUlZJQ0VfU0VDUkVULFxuICAgIHNjb3BlOiBlLlVFTkdBR0VfU0NPUEUsXG4gICAgYXV0aFRva2VuOiBlLlVFTkdBR0VfQVVUSF9UT0tFTixcbiAgICBzZXNzaW9uLFxuICAgIGFjdG9yVmlhOiBlLlVFTkdBR0VfQUNUT1JfVklBLFxuICAgIGV4cGlyeUJ1ZmZlck1zOiBOdW1iZXIuaXNGaW5pdGUoZXhwaXJ5KSA/IChleHBpcnkgYXMgbnVtYmVyKSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5wdXRIYXNBdXRoTW9kZShpbnB1dDogQ2xpZW50Q29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBBVVRIX01PREVfRklFTERTLnNvbWUoKGYpID0+IGlucHV0W2ZdICE9PSB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiB3aXRob3V0QXV0aEZpZWxkcyhjOiBDbGllbnRDb25maWcpOiBDbGllbnRDb25maWcge1xuICByZXR1cm4ge1xuICAgIC4uLmMsXG4gICAgc2VydmljZUlkOiB1bmRlZmluZWQsXG4gICAgc2VydmljZVNlY3JldDogdW5kZWZpbmVkLFxuICAgIHNjb3BlOiB1bmRlZmluZWQsXG4gICAgYXV0aFRva2VuOiB1bmRlZmluZWQsXG4gICAgc2Vzc2lvbjogdW5kZWZpbmVkLFxuICAgIHRva2VuczogdW5kZWZpbmVkLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRFeGFjdGx5T25lQXV0aE1vZGUoaW5wdXQ6IENsaWVudENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBtb2Rlczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGlucHV0LmF1dGhUb2tlbiAhPT0gdW5kZWZpbmVkKSBtb2Rlcy5wdXNoKCdhdXRoVG9rZW4nKTtcbiAgaWYgKGlucHV0LnNlc3Npb24gIT09IHVuZGVmaW5lZCkgbW9kZXMucHVzaCgnc2Vzc2lvbicpO1xuICBpZiAoaW5wdXQudG9rZW5zICE9PSB1bmRlZmluZWQpIG1vZGVzLnB1c2goJ3Rva2VucycpO1xuICBpZiAoaW5wdXQuc2VydmljZUlkICE9PSB1bmRlZmluZWQgfHwgaW5wdXQuc2VydmljZVNlY3JldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbW9kZXMucHVzaCgnc2VydmljZUlkK3NlcnZpY2VTZWNyZXQnKTtcbiAgfVxuICBpZiAobW9kZXMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBDb25maWdFcnJvcihcbiAgICAgIGBjcmVhdGVDbGllbnQ6IHBpY2sgZXhhY3RseSBvbmUgYXV0aCBtb2RlLiBHb3QgJHttb2Rlcy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICdVc2Ugb25lIG9mIHtzZXJ2aWNlSWQsIHNlcnZpY2VTZWNyZXR9IHwge2F1dGhUb2tlbn0gfCB7c2Vzc2lvbn0gfCB7dG9rZW5zfS4nLFxuICAgICk7XG4gIH1cbiAgLy8gWmVybyBtb2RlcyBpcyBhbGxvd2VkIOKAlCBjYWxsZXIgbWF5IHdhbnQgYSBmdWxseS1hbm9ueW1vdXMgY2xpZW50IGZvclxuICAvLyBwdWJsaWMgZW5kcG9pbnRzLiBUaGUgZmlyc3QgcmVxdWVzdCB0aGF0IG5lZWRzIGF1dGggd2lsbCBzdXJmYWNlIGFcbiAgLy8gQ29uZmlnRXJyb3IgZG93bnN0cmVhbS5cbn1cblxuLyoqXG4gKiBQcm9iZSB0aGUgYnVzaW5lc3MgYGxlZ2FjeV9zZXNzaW9uYCBncmFudCBmaXJzdCwgZmFsbCBiYWNrIHRvIGN1c3RvbWVyXG4gKiBvbiBgaW52YWxpZF9ncmFudGAuIEVpdGhlciBzdXJmYWNlIG1pbnRzIGEgSldUIOKAlCB0aGUgU0RLIGRvZXNuJ3QgY2FyZVxuICogd2hpY2ggc2lkZSBhbnN3ZXJlZC5cbiAqXG4gKiBXaHkgcHJvYmUgYm90aDogYGlkYCAobnVtZXJpYykgb3ZlcmxhcHMgdXNlcnMudXNlcklkIHZzXG4gKiBhZGRvX2NvbnRhY3RzX21hcHBpbmcuaWQvY29udGFjdElkLiBDYWxsZXJzIHVzdWFsbHkgZG9uJ3Qga25vdyB3aGljaFxuICogdGFibGUgdGhlaXIgKGlkLCB0b2tlbikgcGFpciBiZWxvbmdzIHRvLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGNoYW5nZUxlZ2FjeVNlc3Npb24oXG4gIHNlc3Npb246IHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgdG9rZW46IHN0cmluZyB9LFxuICBhdXRoQmFzZVVybDogc3RyaW5nLFxuICBjdXN0b21lckF1dGhCYXNlVXJsOiBzdHJpbmcsXG4gIGZldGNoRm46IHR5cGVvZiBmZXRjaCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGJvZHkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICBncmFudF90eXBlOiAnbGVnYWN5X3Nlc3Npb24nLFxuICAgIGlkOiBTdHJpbmcoc2Vzc2lvbi5pZCksXG4gICAgdG9rZW46IHNlc3Npb24udG9rZW4sXG4gIH0pLnRvU3RyaW5nKCk7XG5cbiAgY29uc3QgYnVzaW5lc3NSZXMgPSBhd2FpdCBmZXRjaEZuKGAke2F1dGhCYXNlVXJsfS9vYXV0aC90b2tlbmAsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LFxuICAgIGJvZHksXG4gIH0pO1xuICBpZiAoYnVzaW5lc3NSZXMub2spIHtcbiAgICByZXR1cm4gcGFyc2VBY2Nlc3NUb2tlbihidXNpbmVzc1Jlcyk7XG4gIH1cbiAgaWYgKGF3YWl0IGlzSW52YWxpZEdyYW50KGJ1c2luZXNzUmVzKSkge1xuICAgIGNvbnN0IGN1c3RvbWVyUmVzID0gYXdhaXQgZmV0Y2hGbihgJHtjdXN0b21lckF1dGhCYXNlVXJsfS9vYXV0aC90b2tlbmAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfSxcbiAgICAgIGJvZHksXG4gICAgfSk7XG4gICAgaWYgKGN1c3RvbWVyUmVzLm9rKSB7XG4gICAgICByZXR1cm4gcGFyc2VBY2Nlc3NUb2tlbihjdXN0b21lclJlcyk7XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSBhd2FpdCBjdXN0b21lclJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKFxuICAgICAgYGxlZ2FjeV9zZXNzaW9uIGV4Y2hhbmdlIGZhaWxlZCBvbiBib3RoIHN1cmZhY2VzOiBjdXN0b21lciBIVFRQICR7Y3VzdG9tZXJSZXMuc3RhdHVzfSAke3RleHR9YCxcbiAgICApO1xuICB9XG4gIGNvbnN0IHRleHQgPSBhd2FpdCBidXNpbmVzc1Jlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FcnJvcihcbiAgICBgbGVnYWN5X3Nlc3Npb24gZXhjaGFuZ2UgZmFpbGVkOiBIVFRQICR7YnVzaW5lc3NSZXMuc3RhdHVzfSAke3RleHR9YCxcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNJbnZhbGlkR3JhbnQocmVzOiBSZXNwb25zZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAocmVzLnN0YXR1cyAhPT0gNDAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGNsb25lZCA9IHJlcy5jbG9uZSgpO1xuICBjb25zdCBqc29uID0gKGF3YWl0IGNsb25lZC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSkpIGFzIHsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgcmV0dXJuIGpzb24uZXJyb3IgPT09ICdpbnZhbGlkX2dyYW50Jztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VBY2Nlc3NUb2tlbihyZXM6IFJlc3BvbnNlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QganNvbiA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IGFjY2Vzc190b2tlbj86IHN0cmluZyB9O1xuICBpZiAoIWpzb24uYWNjZXNzX3Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdsZWdhY3lfc2Vzc2lvbiBleGNoYW5nZSByZXNwb25zZSBtaXNzaW5nIGFjY2Vzc190b2tlbicpO1xuICB9XG4gIHJldHVybiBqc29uLmFjY2Vzc190b2tlbjtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRva2VuU291cmNlKGlucHV0OiBDbGllbnRDb25maWcsIGJhc2VVcmw6IHN0cmluZyk6IFRva2VuU291cmNlU3RhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBhdXRoQmFzZVVybCA9IGlucHV0LmF1dGhCYXNlVXJsID8/IGAke2Jhc2VVcmx9L2F1dGgvYnVzaW5lc3NgO1xuICBjb25zdCBmZXRjaEZuID0gaW5wdXQuZmV0Y2hGbiA/PyAoZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gpO1xuXG4gIGlmIChpbnB1dC5hdXRoVG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQuYXV0aFRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAgICB7IGtpbmQ6ICdzdGF0aWMtc3RyaW5nJywgdG9rZW46IGlucHV0LmF1dGhUb2tlbiB9LFxuICAgICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAgeyBraW5kOiAnY2FsbGJhY2snLCBnZXRUb2tlbjogaW5wdXQuYXV0aFRva2VuIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgaWYgKGlucHV0LnNlc3Npb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGN1c3RvbWVyQXV0aEJhc2VVcmwgPSBpbnB1dC5jdXN0b21lckF1dGhCYXNlVXJsID8/IGAke2Jhc2VVcmx9L2F1dGgvY3VzdG9tZXJgO1xuICAgIGNvbnN0IHNlc3Npb24gPSBpbnB1dC5zZXNzaW9uO1xuICAgIHJldHVybiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgICAgIHtcbiAgICAgICAga2luZDogJ2NhbGxiYWNrJyxcbiAgICAgICAgZ2V0VG9rZW46ICgpID0+IGV4Y2hhbmdlTGVnYWN5U2Vzc2lvbihzZXNzaW9uLCBhdXRoQmFzZVVybCwgY3VzdG9tZXJBdXRoQmFzZVVybCwgZmV0Y2hGbiksXG4gICAgICB9LFxuICAgICAgeyBleHBpcnlCdWZmZXJNczogaW5wdXQuZXhwaXJ5QnVmZmVyTXMsIGZldGNoRm46IGlucHV0LmZldGNoRm4gfSxcbiAgICApO1xuICB9XG4gIGlmIChpbnB1dC5zZXJ2aWNlSWQgJiYgaW5wdXQuc2VydmljZVNlY3JldCkge1xuICAgIHJldHVybiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgICAgIHtcbiAgICAgICAga2luZDogJ3NlcnZpY2UtY3JlZGVudGlhbHMnLFxuICAgICAgICBjbGllbnRJZDogaW5wdXQuc2VydmljZUlkLFxuICAgICAgICBjbGllbnRTZWNyZXQ6IGlucHV0LnNlcnZpY2VTZWNyZXQsXG4gICAgICAgIGF1dGhCYXNlVXJsLFxuICAgICAgICBzY29wZTogaW5wdXQuc2NvcGUsXG4gICAgICB9LFxuICAgICAgeyBleHBpcnlCdWZmZXJNczogaW5wdXQuZXhwaXJ5QnVmZmVyTXMsIGZldGNoRm46IGlucHV0LmZldGNoRm4gfSxcbiAgICApO1xuICB9XG4gIGlmIChpbnB1dC50b2tlbnMpIHtcbiAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICB7XG4gICAgICAgIGtpbmQ6ICdhY2Nlc3MtcmVmcmVzaC1wYWlyJyxcbiAgICAgICAgYWNjZXNzVG9rZW46IGlucHV0LnRva2Vucy5hY2Nlc3NUb2tlbixcbiAgICAgICAgcmVmcmVzaFRva2VuOiBpbnB1dC50b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBpbnB1dC50b2tlbnMuZXhwaXJlc0luICogMTAwMCxcbiAgICAgICAgY2xpZW50SWQ6IGlucHV0LnRva2Vucy5jbGllbnRJZCxcbiAgICAgICAgb25Sb3RhdGU6IGlucHV0LnRva2Vucy5vblJvdGF0ZSxcbiAgICAgIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2FybklmQnJvd3NlclNlY3JldChjb25maWc6IENsaWVudENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHsgZG9jdW1lbnQ/OiB1bmtub3duIH0gfTtcbiAgY29uc3QgaW5Ccm93c2VyID0gdHlwZW9mIGcud2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZy53aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuICBpZiAoIWluQnJvd3NlcikgcmV0dXJuO1xuICBpZiAoY29uZmlnLnNlcnZpY2VTZWNyZXQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3VlbmdhZ2UtcGxhdGZvcm0tc2RrXSBzZXJ2aWNlU2VjcmV0IHNob3VsZCBub3QgYmUgdXNlZCBpbiBicm93c2VyIGVudmlyb25tZW50cy4gJyArXG4gICAgICAgICdTZXJ2aWNlIGNyZWRlbnRpYWxzIGluIGJyb3dzZXIgYnVuZGxlcyBhcmUgcHVibGljbHkgdmlzaWJsZS4gJyArXG4gICAgICAgICdVc2UgYGF1dGhUb2tlbmAgKGEgQmVhcmVyIG9idGFpbmVkIHZpYSBPQXV0aCkgb3IgYHNlc3Npb25Ub2tlbmAgaW5zdGVhZC4nLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/http.d.ts
CHANGED
|
@@ -22,3 +22,25 @@ export interface SignedHeaderParams {
|
|
|
22
22
|
* and refreshes on expiry / 401
|
|
23
23
|
*/
|
|
24
24
|
export declare function buildHeaders(config: PlatformConfig, params: SignedHeaderParams): Promise<Record<string, string>>;
|
|
25
|
+
export interface SendRequestParams {
|
|
26
|
+
method: string;
|
|
27
|
+
/** URL pathname only, without query string. Must match `c.req.path` server-side. */
|
|
28
|
+
path: string;
|
|
29
|
+
/** Fully-qualified URL the fetch is sent to (base + path + querystring). */
|
|
30
|
+
url: string;
|
|
31
|
+
/** Raw JSON body string, or undefined for none. */
|
|
32
|
+
body?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Send a request with the SDK's standard 401-retry-once behaviour.
|
|
36
|
+
*
|
|
37
|
+
* Only retries when auth is `token-source`, since that's the case
|
|
38
|
+
* where the cached token may have expired server-side. HMAC and
|
|
39
|
+
* static bearer 401s mean the auth is misconfigured and a retry
|
|
40
|
+
* would just fail again. Bubble the response so the caller surfaces it.
|
|
41
|
+
*
|
|
42
|
+
* Shared by every namespace client (business, audit, zones, ...) so
|
|
43
|
+
* the retry semantics are uniform. Lifted out of `business/client.ts`
|
|
44
|
+
* with no behaviour change.
|
|
45
|
+
*/
|
|
46
|
+
export declare function sendWithAuthRetry(config: PlatformConfig, params: SendRequestParams): Promise<Response>;
|
package/dist/http.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildHeaders = buildHeaders;
|
|
4
|
+
exports.sendWithAuthRetry = sendWithAuthRetry;
|
|
4
5
|
const node_crypto_1 = require("node:crypto");
|
|
5
6
|
const token_source_1 = require("./token-source");
|
|
6
7
|
const version_1 = require("./version");
|
|
@@ -40,4 +41,41 @@ async function buildHeaders(config, params) {
|
|
|
40
41
|
headers['authorization'] = `Bearer ${token}`;
|
|
41
42
|
return headers;
|
|
42
43
|
}
|
|
43
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Send a request with the SDK's standard 401-retry-once behaviour.
|
|
46
|
+
*
|
|
47
|
+
* Only retries when auth is `token-source`, since that's the case
|
|
48
|
+
* where the cached token may have expired server-side. HMAC and
|
|
49
|
+
* static bearer 401s mean the auth is misconfigured and a retry
|
|
50
|
+
* would just fail again. Bubble the response so the caller surfaces it.
|
|
51
|
+
*
|
|
52
|
+
* Shared by every namespace client (business, audit, zones, ...) so
|
|
53
|
+
* the retry semantics are uniform. Lifted out of `business/client.ts`
|
|
54
|
+
* with no behaviour change.
|
|
55
|
+
*/
|
|
56
|
+
async function sendWithAuthRetry(config, params) {
|
|
57
|
+
const headers = await buildHeaders(config, {
|
|
58
|
+
method: params.method,
|
|
59
|
+
path: params.path,
|
|
60
|
+
body: params.body,
|
|
61
|
+
});
|
|
62
|
+
const res = await config.fetchFn(params.url, {
|
|
63
|
+
method: params.method,
|
|
64
|
+
headers,
|
|
65
|
+
body: params.body,
|
|
66
|
+
});
|
|
67
|
+
if (res.status !== 401 || config.auth?.type !== 'token-source')
|
|
68
|
+
return res;
|
|
69
|
+
(0, token_source_1.invalidateToken)(config.auth.state);
|
|
70
|
+
const retryHeaders = await buildHeaders(config, {
|
|
71
|
+
method: params.method,
|
|
72
|
+
path: params.path,
|
|
73
|
+
body: params.body,
|
|
74
|
+
});
|
|
75
|
+
return config.fetchFn(params.url, {
|
|
76
|
+
method: params.method,
|
|
77
|
+
headers: retryHeaders,
|
|
78
|
+
body: params.body,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOEJBLG9DQXVCQztBQXdCRCw4Q0EwQkM7QUF2R0QsNkNBQXlDO0FBRXpDLGlEQUFpRTtBQUNqRSx1Q0FBd0M7QUFVeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFFckU7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSSxLQUFLLFVBQVUsWUFBWSxDQUNoQyxNQUFzQixFQUN0QixNQUEwQjtJQUUxQixNQUFNLE9BQU8sR0FBMkI7UUFDdEMsWUFBWSxFQUFFLHdCQUF3QixxQkFBVyxFQUFFO0tBQ3BELENBQUM7SUFDRixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztJQUM1RSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFBLHdCQUFVLEdBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFFakMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFBLDZCQUFjLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxLQUFLLEVBQUUsQ0FBQztJQUM3QyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBWUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLE1BQXNCLEVBQ3RCLE1BQXlCO0lBRXpCLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sRUFBRTtRQUN6QyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7SUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUMzQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsT0FBTztRQUNQLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7SUFDSCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLGNBQWM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUMzRSxJQUFBLDhCQUFlLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxNQUFNLFlBQVksR0FBRyxNQUFNLFlBQVksQ0FBQyxNQUFNLEVBQUU7UUFDOUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDaEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLE9BQU8sRUFBRSxZQUFZO1FBQ3JCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiwgaW52YWxpZGF0ZVRva2VuIH0gZnJvbSAnLi90b2tlbi1zb3VyY2UnO1xuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25lZEhlYWRlclBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGhuYW1lIG9ubHksIHdpdGhvdXQgcXVlcnkgc3RyaW5nLiBNdXN0IG1hdGNoIGBjLnJlcS5wYXRoYCBzZXJ2ZXItc2lkZS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogUmF3IEpTT04gYm9keSBzdHJpbmcsIG9yIGVtcHR5IGZvciBub25lLiAqL1xuICBib2R5Pzogc3RyaW5nO1xufVxuXG5jb25zdCBNVVRBVElOR19NRVRIT0RTID0gbmV3IFNldChbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJywgJ0RFTEVURSddKTtcblxuLyoqXG4gKiBCdWlsZCB0aGUgaGVhZGVycyBmb3IgYSByZXF1ZXN0IHRvIHRoZSBwbGF0Zm9ybSBBUEkuXG4gKlxuICogQWRkcyB0aHJlZSBwbGF0Zm9ybS13aWRlIGhlYWRlcnMgYXV0b21hdGljYWxseTpcbiAqICAgLSBgVXNlci1BZ2VudGAgc28gdGhlIGdhdGV3YXkgY2FuIGF0dHJpYnV0ZSB0cmFmZmljIHRvIFNESyB2ZXJzaW9uXG4gKiAgIC0gYElkZW1wb3RlbmN5LUtleWAgKFVVSUQgdjQpIG9uIG11dGF0aW5nIG1ldGhvZHMsIHNvIGNhbGxlcnMgZG9uJ3RcbiAqICAgICBoYXZlIHRvIGdlbmVyYXRlIG9uZSBwZXIgY2FsbFxuICogICAtIGBjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25gIHdoZW4gYSBib2R5IGlzIHN1cHBsaWVkXG4gKlxuICogQXV0aCBjb21lcyBmcm9tIGBjb25maWcuYXV0aGA6XG4gKiAgIC0gYGJlYXJlcmA6IHRoZSB0b2tlbiBpcyBzZW50IHZlcmJhdGltIChjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yXG4gKiAgICAgZnJlc2huZXNzOyBTREsgdGhyb3dzIFRva2VuRXhwaXJlZEVycm9yIG9uIGxvY2FsLWRldGVjdGVkIGV4cGlyeSlcbiAqICAgLSBgdG9rZW4tc291cmNlYDogU0RLIG1pbnRzICsgY2FjaGVzIHZpYSBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzXG4gKiAgICAgYW5kIHJlZnJlc2hlcyBvbiBleHBpcnkgLyA0MDFcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSGVhZGVycyhcbiAgY29uZmlnOiBQbGF0Zm9ybUNvbmZpZyxcbiAgcGFyYW1zOiBTaWduZWRIZWFkZXJQYXJhbXMsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAndXNlci1hZ2VudCc6IGB1ZW5nYWdlLXBsYXRmb3JtLXNkay8ke1NES19WRVJTSU9OfWAsXG4gIH07XG4gIGlmIChwYXJhbXMuYm9keSAhPT0gdW5kZWZpbmVkKSBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgaWYgKE1VVEFUSU5HX01FVEhPRFMuaGFzKHBhcmFtcy5tZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICBoZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSA9IHJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIGlmICghY29uZmlnLmF1dGgpIHJldHVybiBoZWFkZXJzO1xuXG4gIGlmIChjb25maWcuYXV0aC50eXBlID09PSAnYmVhcmVyJykge1xuICAgIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHtjb25maWcuYXV0aC50b2tlbn1gO1xuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgLy8gdG9rZW4tc291cmNlOiBtaW50ICsgY2FjaGUgKyByZWZyZXNoLWRlZHVwIGhhcHBlbnMgaW4gZ2V0QWNjZXNzVG9rZW5cbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihjb25maWcuYXV0aC5zdGF0ZSk7XG4gIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICByZXR1cm4gaGVhZGVycztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUmVxdWVzdFBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGhuYW1lIG9ubHksIHdpdGhvdXQgcXVlcnkgc3RyaW5nLiBNdXN0IG1hdGNoIGBjLnJlcS5wYXRoYCBzZXJ2ZXItc2lkZS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogRnVsbHktcXVhbGlmaWVkIFVSTCB0aGUgZmV0Y2ggaXMgc2VudCB0byAoYmFzZSArIHBhdGggKyBxdWVyeXN0cmluZykuICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogUmF3IEpTT04gYm9keSBzdHJpbmcsIG9yIHVuZGVmaW5lZCBmb3Igbm9uZS4gKi9cbiAgYm9keT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZW5kIGEgcmVxdWVzdCB3aXRoIHRoZSBTREsncyBzdGFuZGFyZCA0MDEtcmV0cnktb25jZSBiZWhhdmlvdXIuXG4gKlxuICogT25seSByZXRyaWVzIHdoZW4gYXV0aCBpcyBgdG9rZW4tc291cmNlYCwgc2luY2UgdGhhdCdzIHRoZSBjYXNlXG4gKiB3aGVyZSB0aGUgY2FjaGVkIHRva2VuIG1heSBoYXZlIGV4cGlyZWQgc2VydmVyLXNpZGUuIEhNQUMgYW5kXG4gKiBzdGF0aWMgYmVhcmVyIDQwMXMgbWVhbiB0aGUgYXV0aCBpcyBtaXNjb25maWd1cmVkIGFuZCBhIHJldHJ5XG4gKiB3b3VsZCBqdXN0IGZhaWwgYWdhaW4uIEJ1YmJsZSB0aGUgcmVzcG9uc2Ugc28gdGhlIGNhbGxlciBzdXJmYWNlcyBpdC5cbiAqXG4gKiBTaGFyZWQgYnkgZXZlcnkgbmFtZXNwYWNlIGNsaWVudCAoYnVzaW5lc3MsIGF1ZGl0LCB6b25lcywgLi4uKSBzb1xuICogdGhlIHJldHJ5IHNlbWFudGljcyBhcmUgdW5pZm9ybS4gTGlmdGVkIG91dCBvZiBgYnVzaW5lc3MvY2xpZW50LnRzYFxuICogd2l0aCBubyBiZWhhdmlvdXIgY2hhbmdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZFdpdGhBdXRoUmV0cnkoXG4gIGNvbmZpZzogUGxhdGZvcm1Db25maWcsXG4gIHBhcmFtczogU2VuZFJlcXVlc3RQYXJhbXMsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBidWlsZEhlYWRlcnMoY29uZmlnLCB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIHBhdGg6IHBhcmFtcy5wYXRoLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICB9KTtcbiAgY29uc3QgcmVzID0gYXdhaXQgY29uZmlnLmZldGNoRm4ocGFyYW1zLnVybCwge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICB9KTtcbiAgaWYgKHJlcy5zdGF0dXMgIT09IDQwMSB8fCBjb25maWcuYXV0aD8udHlwZSAhPT0gJ3Rva2VuLXNvdXJjZScpIHJldHVybiByZXM7XG4gIGludmFsaWRhdGVUb2tlbihjb25maWcuYXV0aC5zdGF0ZSk7XG4gIGNvbnN0IHJldHJ5SGVhZGVycyA9IGF3YWl0IGJ1aWxkSGVhZGVycyhjb25maWcsIHtcbiAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG4gICAgcGF0aDogcGFyYW1zLnBhdGgsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xuICByZXR1cm4gY29uZmlnLmZldGNoRm4ocGFyYW1zLnVybCwge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBoZWFkZXJzOiByZXRyeUhlYWRlcnMsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xufVxuIl19
|
package/dist/index.d.ts
CHANGED
|
@@ -1,24 +1,8 @@
|
|
|
1
1
|
export * from './audit';
|
|
2
2
|
export * from './business';
|
|
3
|
+
export * from './zones';
|
|
3
4
|
export * from './errors';
|
|
4
5
|
export { auth } from './auth';
|
|
5
6
|
export type { PkcePair, AuthorizeUrlInput, ExchangeCodeInput, RefreshInput, TokenPair, } from './auth';
|
|
6
7
|
export { type PlatformAuth, type PlatformAuthInput, type PlatformConfig, type PlatformConfigInput, DEFAULT_BASE_URL, } from './config';
|
|
7
|
-
export { createClient,
|
|
8
|
-
/**
|
|
9
|
-
* Default singleton clients. Both read defaults from the environment on
|
|
10
|
-
* every call:
|
|
11
|
-
* - UENGAGE_BASE_URL defaults to https://api.platform.uengage.io
|
|
12
|
-
* - UENGAGE_AUTH_TOKEN static Bearer token
|
|
13
|
-
* - UENGAGE_SERVICE_ID OAuth2 client_credentials clientId
|
|
14
|
-
* - UENGAGE_SERVICE_SECRET OAuth2 client_credentials clientSecret
|
|
15
|
-
* - UENGAGE_SERVICE_SCOPE optional space-separated scope list
|
|
16
|
-
*
|
|
17
|
-
* The chainable `.config({...})` / `.auth({...})` API on the audit and
|
|
18
|
-
* business clients is preserved for back-compat. `.auth({token})`
|
|
19
|
-
* accepts a static Bearer token; for OAuth2 client_credentials use the
|
|
20
|
-
* unified `createClient(...)` factory instead — that builds a
|
|
21
|
-
* TokenSource which handles caching + refresh dedup + 401 retry.
|
|
22
|
-
*/
|
|
23
|
-
export declare const audit: import("./audit").AuditClient;
|
|
24
|
-
export declare const business: import("./business").BusinessClient;
|
|
8
|
+
export { createClient, type ClientConfig, type PlatformClient } from './client';
|