@privateconnect/sdk 0.7.5 → 0.7.7
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 +192 -174
- package/dist/index.d.ts +92 -16
- package/dist/index.js +251 -20
- package/package.json +10 -6
package/README.md
CHANGED
|
@@ -1,174 +1,192 @@
|
|
|
1
|
-
# Private Connect SDK
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @privateconnect/sdk
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
//
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
1
|
+
# Private Connect SDK
|
|
2
|
+
|
|
3
|
+
Define your connections in `pconnect.yml`. Access them from anywhere — your app, CI, an AI agent.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @privateconnect/sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
**1. Create `pconnect.yml` in your project root:**
|
|
14
|
+
|
|
15
|
+
```yaml
|
|
16
|
+
resources:
|
|
17
|
+
staging-db:
|
|
18
|
+
type: postgres
|
|
19
|
+
host: internal-db
|
|
20
|
+
port: 5432
|
|
21
|
+
access:
|
|
22
|
+
mode: tcp
|
|
23
|
+
redis-cache:
|
|
24
|
+
type: redis
|
|
25
|
+
host: redis.internal
|
|
26
|
+
port: 6379
|
|
27
|
+
access:
|
|
28
|
+
mode: tcp
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**2. Use it in your code:**
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { PrivateConnect } from '@privateconnect/sdk';
|
|
35
|
+
|
|
36
|
+
const pc = PrivateConnect.fromManifest();
|
|
37
|
+
|
|
38
|
+
const db = pc.resource('staging-db');
|
|
39
|
+
console.log(db.connectionString); // postgres://internal-db:5432
|
|
40
|
+
console.log(db.envVar); // DATABASE_URL
|
|
41
|
+
|
|
42
|
+
const cache = pc.resource('redis-cache');
|
|
43
|
+
console.log(cache.connectionString); // redis://redis.internal:6379
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**3. Run `connect dev` to make it live:**
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
connect dev
|
|
50
|
+
# → Provisions tunnels for every resource in pconnect.yml
|
|
51
|
+
# → Your app's connection strings now resolve to live services
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
That's it. Your app declares what it connects to. `connect dev` makes it work. An AI agent (or a teammate) can modify `pconnect.yml` to change the topology — without touching application code.
|
|
55
|
+
|
|
56
|
+
## Why This Matters
|
|
57
|
+
|
|
58
|
+
The `pconnect.yml` file is a diffable, reviewable, mergeable description of your project's connectivity. When an AI modifies it — adding a read replica, changing a TTL, switching an access mode — that's a PR you can review and merge. The SDK reads the manifest; the agent provisions it.
|
|
59
|
+
|
|
60
|
+
## Manifest API
|
|
61
|
+
|
|
62
|
+
### `PrivateConnect.fromManifest(path?, config?)`
|
|
63
|
+
|
|
64
|
+
Load a manifest and return a configured client. Auto-discovers `pconnect.yml` in the current directory (or parents) if no path is given.
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// Auto-discover
|
|
68
|
+
const pc = PrivateConnect.fromManifest();
|
|
69
|
+
|
|
70
|
+
// Explicit path
|
|
71
|
+
const pc = PrivateConnect.fromManifest('./infra/pconnect.yml');
|
|
72
|
+
|
|
73
|
+
// With hub API access (for grants, orchestration, etc.)
|
|
74
|
+
const pc = PrivateConnect.fromManifest('./pconnect.yml', {
|
|
75
|
+
apiKey: process.env.PRIVATECONNECT_API_KEY,
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### `pc.resource(name)`
|
|
80
|
+
|
|
81
|
+
Get a resource by name. Returns its resolved type, host, port, connection string, and suggested environment variable.
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
const db = pc.resource('staging-db');
|
|
85
|
+
// {
|
|
86
|
+
// name: 'staging-db',
|
|
87
|
+
// type: 'postgres',
|
|
88
|
+
// host: 'internal-db',
|
|
89
|
+
// port: 5432,
|
|
90
|
+
// connectionString: 'postgres://internal-db:5432',
|
|
91
|
+
// envVar: 'DATABASE_URL',
|
|
92
|
+
// accessMode: 'tcp',
|
|
93
|
+
// via: 'direct'
|
|
94
|
+
// }
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### `pc.resources()`
|
|
98
|
+
|
|
99
|
+
List all resources declared in the manifest.
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
const all = pc.resources();
|
|
103
|
+
all.forEach(r => console.log(`${r.name}: ${r.connectionString}`));
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### `pc.envBlock()`
|
|
107
|
+
|
|
108
|
+
Generate a `.env`-compatible block for all resources.
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
console.log(pc.envBlock());
|
|
112
|
+
// DATABASE_URL=postgres://internal-db:5432
|
|
113
|
+
// REDIS_URL=redis://redis.internal:6379
|
|
114
|
+
// API_URL=http://payments.service.internal:3000
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Hub API
|
|
118
|
+
|
|
119
|
+
When you pass an API key, you also get access to the hub APIs for grants, agents, and services.
|
|
120
|
+
|
|
121
|
+
### Grants
|
|
122
|
+
|
|
123
|
+
Grant an AI agent temporary, scoped access to a private resource.
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
const pc = PrivateConnect.fromManifest('./pconnect.yml', {
|
|
127
|
+
apiKey: process.env.PRIVATECONNECT_API_KEY,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
const grant = await pc.grants.create({
|
|
131
|
+
agentLabel: 'claude',
|
|
132
|
+
resourceType: 'db',
|
|
133
|
+
resourceName: 'postgres',
|
|
134
|
+
ttl: '5m',
|
|
135
|
+
});
|
|
136
|
+
console.log(grant.token); // gnt_...
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Agent Orchestration
|
|
140
|
+
|
|
141
|
+
Coordinate agents across machines.
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
const agents = await pc.agents.list({ onlineOnly: true });
|
|
145
|
+
const gpuAgents = await pc.agents.findByCapability('gpu');
|
|
146
|
+
|
|
147
|
+
await pc.agents.sendMessage(gpuAgents[0].id, {
|
|
148
|
+
action: 'run-training',
|
|
149
|
+
dataset: 'v2',
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Services
|
|
154
|
+
|
|
155
|
+
Query hub-registered services directly.
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
const services = await pc.services.list();
|
|
159
|
+
const conn = await pc.connect('prod-db');
|
|
160
|
+
console.log(conn.connectionString);
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Manifest Format
|
|
164
|
+
|
|
165
|
+
The `pconnect.yml` file supports the following resource types:
|
|
166
|
+
|
|
167
|
+
| Type | Default Port | Connection String | Env Var |
|
|
168
|
+
|------|-------------|-------------------|---------|
|
|
169
|
+
| `postgres` | 5432 | `postgres://host:port` | `DATABASE_URL` |
|
|
170
|
+
| `mysql` | 3306 | `mysql://host:port` | `DATABASE_URL` |
|
|
171
|
+
| `redis` | 6379 | `redis://host:port` | `REDIS_URL` |
|
|
172
|
+
| `http` | 80 | `http://host:port` | `API_URL` |
|
|
173
|
+
| `generic-tcp` | — | `tcp://host:port` | `<NAME>_URL` |
|
|
174
|
+
|
|
175
|
+
Access modes:
|
|
176
|
+
- `tcp` — direct TCP tunnel (databases, Redis, generic)
|
|
177
|
+
- `http` — HTTP-level proxying
|
|
178
|
+
|
|
179
|
+
Transport:
|
|
180
|
+
- `direct` (default) — connect directly to the target
|
|
181
|
+
- `hub` — route through the Private Connect hub when the target isn't directly reachable
|
|
182
|
+
|
|
183
|
+
## Environment Variables
|
|
184
|
+
|
|
185
|
+
| Variable | Purpose |
|
|
186
|
+
|----------|---------|
|
|
187
|
+
| `PRIVATECONNECT_API_KEY` | API key for hub access (grants, orchestration) |
|
|
188
|
+
| `CONNECT_HUB_URL` | Hub URL (default: `https://api.privateconnect.co`) |
|
|
189
|
+
|
|
190
|
+
## License
|
|
191
|
+
|
|
192
|
+
[FSL-1.1-MIT](LICENSE)
|
package/dist/index.d.ts
CHANGED
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Private Connect SDK
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Define your connections in pconnect.yml. Access them from anywhere.
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
* ```typescript
|
|
8
8
|
* import { PrivateConnect } from '@privateconnect/sdk';
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* // Load your project's connection manifest
|
|
11
|
+
* const pc = PrivateConnect.fromManifest();
|
|
11
12
|
*
|
|
12
|
-
* //
|
|
13
|
-
* const db =
|
|
14
|
-
* console.log(db.connectionString); // postgres://
|
|
13
|
+
* // Get a resource declared in pconnect.yml
|
|
14
|
+
* const db = pc.resource('staging-db');
|
|
15
|
+
* console.log(db.connectionString); // postgres://internal-db:5432
|
|
16
|
+
* console.log(db.envVar); // DATABASE_URL
|
|
15
17
|
*
|
|
16
|
-
* //
|
|
17
|
-
* const
|
|
18
|
+
* // With an API key, you also get hub API access
|
|
19
|
+
* const pc2 = PrivateConnect.fromManifest('./pconnect.yml', {
|
|
20
|
+
* apiKey: process.env.PRIVATECONNECT_API_KEY,
|
|
21
|
+
* });
|
|
22
|
+
* const grant = await pc2.grants.create({
|
|
18
23
|
* agentLabel: 'claude',
|
|
19
24
|
* resourceType: 'db',
|
|
20
25
|
* resourceName: 'postgres',
|
|
21
26
|
* ttl: '5m',
|
|
22
27
|
* });
|
|
23
|
-
* console.log(grant.token); // gnt_...
|
|
24
|
-
*
|
|
25
|
-
* // List all agents
|
|
26
|
-
* const agents = await pc.agents.list();
|
|
27
28
|
* ```
|
|
28
29
|
*/
|
|
29
30
|
export interface PrivateConnectConfig {
|
|
30
|
-
/** API key for authentication */
|
|
31
|
-
apiKey
|
|
31
|
+
/** API key for authentication. Required for hub API calls; optional for manifest-only usage. */
|
|
32
|
+
apiKey?: string;
|
|
32
33
|
/** Hub URL (default: https://api.privateconnect.co) */
|
|
33
34
|
hubUrl?: string;
|
|
34
35
|
/** Agent ID (auto-detected from local config if not provided) */
|
|
@@ -100,6 +101,34 @@ export interface GrantCreateOptions {
|
|
|
100
101
|
/** Duration string: 60s, 5m, 1h, 1d. Omit for persistent grant. */
|
|
101
102
|
ttl?: string;
|
|
102
103
|
}
|
|
104
|
+
export declare const RESOURCE_TYPES: readonly ["postgres", "mysql", "redis", "http", "generic-tcp"];
|
|
105
|
+
export type ResourceType = typeof RESOURCE_TYPES[number];
|
|
106
|
+
export declare const ACCESS_MODES: readonly ["tcp", "http"];
|
|
107
|
+
export type AccessMode = typeof ACCESS_MODES[number];
|
|
108
|
+
export declare const TRANSPORT_MODES: readonly ["direct", "hub"];
|
|
109
|
+
export type TransportVia = typeof TRANSPORT_MODES[number];
|
|
110
|
+
export interface ManifestResourceConfig {
|
|
111
|
+
type: ResourceType;
|
|
112
|
+
host?: string;
|
|
113
|
+
port?: number;
|
|
114
|
+
targetHost?: string;
|
|
115
|
+
targetPort?: number;
|
|
116
|
+
url?: string;
|
|
117
|
+
access: {
|
|
118
|
+
mode: AccessMode;
|
|
119
|
+
via?: TransportVia;
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export interface ManifestResource {
|
|
123
|
+
name: string;
|
|
124
|
+
type: ResourceType;
|
|
125
|
+
host: string;
|
|
126
|
+
port: number;
|
|
127
|
+
connectionString: string;
|
|
128
|
+
envVar: string;
|
|
129
|
+
accessMode: AccessMode;
|
|
130
|
+
via: TransportVia;
|
|
131
|
+
}
|
|
103
132
|
export declare class AgentsAPI {
|
|
104
133
|
private client;
|
|
105
134
|
constructor(client: PrivateConnect);
|
|
@@ -170,13 +199,53 @@ export declare class GrantsAPI {
|
|
|
170
199
|
}
|
|
171
200
|
export declare class PrivateConnect {
|
|
172
201
|
private config;
|
|
202
|
+
private manifest;
|
|
203
|
+
private manifestPath?;
|
|
173
204
|
/** Agents API for discovery and orchestration */
|
|
174
205
|
agents: AgentsAPI;
|
|
175
206
|
/** Services API for connecting to services */
|
|
176
207
|
services: ServicesAPI;
|
|
177
208
|
/** Grants API for managing scoped access tokens (time-limited or persistent) */
|
|
178
209
|
grants: GrantsAPI;
|
|
179
|
-
constructor(config
|
|
210
|
+
constructor(config?: PrivateConnectConfig);
|
|
211
|
+
/**
|
|
212
|
+
* Load a pconnect.yml manifest and return a configured client.
|
|
213
|
+
*
|
|
214
|
+
* Auto-discovers pconnect.yml in the current directory (or parents) if no
|
|
215
|
+
* path is given. Pass a config to also enable hub API access.
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* ```typescript
|
|
219
|
+
* const pc = PrivateConnect.fromManifest();
|
|
220
|
+
* const db = pc.resource('staging-db');
|
|
221
|
+
* console.log(db.connectionString); // postgres://internal-db:5432
|
|
222
|
+
* ```
|
|
223
|
+
*/
|
|
224
|
+
static fromManifest(manifestPath?: string, config?: PrivateConnectConfig): PrivateConnect;
|
|
225
|
+
/**
|
|
226
|
+
* Get a resource declared in pconnect.yml by name.
|
|
227
|
+
*
|
|
228
|
+
* Returns its type, host, port, connection string, and suggested env var.
|
|
229
|
+
* When `connect dev` is running, the connection string points to a live
|
|
230
|
+
* local tunnel.
|
|
231
|
+
*/
|
|
232
|
+
resource(name: string): ManifestResource;
|
|
233
|
+
/**
|
|
234
|
+
* List all resources declared in the loaded manifest.
|
|
235
|
+
*/
|
|
236
|
+
resources(): ManifestResource[];
|
|
237
|
+
/**
|
|
238
|
+
* Generate a `.env`-compatible block for all manifest resources.
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```typescript
|
|
242
|
+
* const pc = PrivateConnect.fromManifest();
|
|
243
|
+
* console.log(pc.envBlock());
|
|
244
|
+
* // DATABASE_URL=postgres://internal-db:5432
|
|
245
|
+
* // REDIS_URL=redis://redis.internal:6379
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
envBlock(): string;
|
|
180
249
|
/** The resolved agent ID, or undefined if not configured. */
|
|
181
250
|
get agentId(): string | undefined;
|
|
182
251
|
/** The hub URL this client is connected to. */
|
|
@@ -193,11 +262,18 @@ export declare class PrivateConnect {
|
|
|
193
262
|
* Used by APIs that require an authenticated agent identity.
|
|
194
263
|
*/
|
|
195
264
|
requireAgentId(): string;
|
|
265
|
+
/** Requires an API key or throws. */
|
|
266
|
+
private requireApiKey;
|
|
196
267
|
/** Internal fetch with API key auth. */
|
|
197
|
-
fetch(
|
|
268
|
+
fetch(urlPath: string, options?: RequestInit): Promise<Response>;
|
|
198
269
|
}
|
|
199
270
|
export default PrivateConnect;
|
|
200
|
-
/** Convenience function for quick one-off connections. */
|
|
271
|
+
/** Convenience function for quick one-off connections via the hub API. */
|
|
201
272
|
export declare function connect(serviceName: string, config?: PrivateConnectConfig & {
|
|
202
273
|
grantToken?: string;
|
|
203
274
|
}): Promise<Connection>;
|
|
275
|
+
/**
|
|
276
|
+
* Load pconnect.yml and get a resource by name.
|
|
277
|
+
* Shorthand for `PrivateConnect.fromManifest().resource(name)`.
|
|
278
|
+
*/
|
|
279
|
+
export declare function fromManifest(manifestPath?: string): PrivateConnect;
|
package/dist/index.js
CHANGED
|
@@ -2,37 +2,169 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Private Connect SDK
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Define your connections in pconnect.yml. Access them from anywhere.
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* ```typescript
|
|
9
9
|
* import { PrivateConnect } from '@privateconnect/sdk';
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* // Load your project's connection manifest
|
|
12
|
+
* const pc = PrivateConnect.fromManifest();
|
|
12
13
|
*
|
|
13
|
-
* //
|
|
14
|
-
* const db =
|
|
15
|
-
* console.log(db.connectionString); // postgres://
|
|
14
|
+
* // Get a resource declared in pconnect.yml
|
|
15
|
+
* const db = pc.resource('staging-db');
|
|
16
|
+
* console.log(db.connectionString); // postgres://internal-db:5432
|
|
17
|
+
* console.log(db.envVar); // DATABASE_URL
|
|
16
18
|
*
|
|
17
|
-
* //
|
|
18
|
-
* const
|
|
19
|
+
* // With an API key, you also get hub API access
|
|
20
|
+
* const pc2 = PrivateConnect.fromManifest('./pconnect.yml', {
|
|
21
|
+
* apiKey: process.env.PRIVATECONNECT_API_KEY,
|
|
22
|
+
* });
|
|
23
|
+
* const grant = await pc2.grants.create({
|
|
19
24
|
* agentLabel: 'claude',
|
|
20
25
|
* resourceType: 'db',
|
|
21
26
|
* resourceName: 'postgres',
|
|
22
27
|
* ttl: '5m',
|
|
23
28
|
* });
|
|
24
|
-
* console.log(grant.token); // gnt_...
|
|
25
|
-
*
|
|
26
|
-
* // List all agents
|
|
27
|
-
* const agents = await pc.agents.list();
|
|
28
29
|
* ```
|
|
29
30
|
*/
|
|
30
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
-
exports.PrivateConnect = exports.GrantsAPI = exports.ServicesAPI = exports.AgentsAPI = void 0;
|
|
32
|
+
exports.PrivateConnect = exports.GrantsAPI = exports.ServicesAPI = exports.AgentsAPI = exports.TRANSPORT_MODES = exports.ACCESS_MODES = exports.RESOURCE_TYPES = void 0;
|
|
32
33
|
exports.connect = connect;
|
|
34
|
+
exports.fromManifest = fromManifest;
|
|
33
35
|
const fs = require("fs");
|
|
34
36
|
const path = require("path");
|
|
35
37
|
const os = require("os");
|
|
38
|
+
const yaml = require("js-yaml");
|
|
39
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
40
|
+
// Manifest Types
|
|
41
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
42
|
+
exports.RESOURCE_TYPES = ['postgres', 'mysql', 'redis', 'http', 'generic-tcp'];
|
|
43
|
+
exports.ACCESS_MODES = ['tcp', 'http'];
|
|
44
|
+
exports.TRANSPORT_MODES = ['direct', 'hub'];
|
|
45
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
46
|
+
// Manifest Parsing
|
|
47
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
48
|
+
const MANIFEST_FILENAMES = [
|
|
49
|
+
'pconnect.yml',
|
|
50
|
+
'pconnect.yaml',
|
|
51
|
+
'pconnect.json',
|
|
52
|
+
'.pconnect.yml',
|
|
53
|
+
'.pconnect.yaml',
|
|
54
|
+
'.pconnect.json',
|
|
55
|
+
];
|
|
56
|
+
const DEFAULT_PORTS = {
|
|
57
|
+
postgres: 5432,
|
|
58
|
+
mysql: 3306,
|
|
59
|
+
redis: 6379,
|
|
60
|
+
http: 80,
|
|
61
|
+
'generic-tcp': 0,
|
|
62
|
+
};
|
|
63
|
+
const PROTOCOL_SCHEMES = {
|
|
64
|
+
postgres: 'postgres',
|
|
65
|
+
mysql: 'mysql',
|
|
66
|
+
redis: 'redis',
|
|
67
|
+
http: 'http',
|
|
68
|
+
'generic-tcp': 'tcp',
|
|
69
|
+
};
|
|
70
|
+
const ENV_VAR_MAP = {
|
|
71
|
+
postgres: 'DATABASE_URL',
|
|
72
|
+
mysql: 'DATABASE_URL',
|
|
73
|
+
redis: 'REDIS_URL',
|
|
74
|
+
http: 'API_URL',
|
|
75
|
+
'generic-tcp': 'TCP_URL',
|
|
76
|
+
};
|
|
77
|
+
function findManifest(startDir) {
|
|
78
|
+
let dir = startDir || process.cwd();
|
|
79
|
+
for (let depth = 0; depth < 4; depth++) {
|
|
80
|
+
for (const filename of MANIFEST_FILENAMES) {
|
|
81
|
+
const filePath = path.join(dir, filename);
|
|
82
|
+
if (fs.existsSync(filePath))
|
|
83
|
+
return filePath;
|
|
84
|
+
}
|
|
85
|
+
const parent = path.dirname(dir);
|
|
86
|
+
if (parent === dir)
|
|
87
|
+
break;
|
|
88
|
+
dir = parent;
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
function parseManifestFile(filePath) {
|
|
93
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
94
|
+
let raw;
|
|
95
|
+
if (filePath.endsWith('.json')) {
|
|
96
|
+
raw = JSON.parse(content);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
raw = yaml.load(content);
|
|
100
|
+
}
|
|
101
|
+
if (!raw || typeof raw !== 'object' || !raw.resources || typeof raw.resources !== 'object') {
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
const resources = {};
|
|
105
|
+
const rawResources = raw.resources;
|
|
106
|
+
for (const [name, value] of Object.entries(rawResources)) {
|
|
107
|
+
if (!value || typeof value !== 'object')
|
|
108
|
+
continue;
|
|
109
|
+
const obj = value;
|
|
110
|
+
const type = obj.type;
|
|
111
|
+
if (!exports.RESOURCE_TYPES.includes(type))
|
|
112
|
+
continue;
|
|
113
|
+
const accessObj = (obj.access && typeof obj.access === 'object')
|
|
114
|
+
? obj.access
|
|
115
|
+
: { mode: 'tcp' };
|
|
116
|
+
resources[name] = {
|
|
117
|
+
type: type,
|
|
118
|
+
host: typeof obj.host === 'string' ? obj.host : undefined,
|
|
119
|
+
port: typeof obj.port === 'number' ? obj.port : undefined,
|
|
120
|
+
targetHost: typeof obj.targetHost === 'string' ? obj.targetHost : undefined,
|
|
121
|
+
targetPort: typeof obj.targetPort === 'number' ? obj.targetPort : undefined,
|
|
122
|
+
url: typeof obj.url === 'string' ? obj.url : undefined,
|
|
123
|
+
access: {
|
|
124
|
+
mode: (exports.ACCESS_MODES.includes(accessObj.mode)
|
|
125
|
+
? accessObj.mode
|
|
126
|
+
: 'tcp'),
|
|
127
|
+
via: (exports.TRANSPORT_MODES.includes(accessObj.via)
|
|
128
|
+
? accessObj.via
|
|
129
|
+
: 'direct'),
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return resources;
|
|
134
|
+
}
|
|
135
|
+
function resolveManifestResource(name, config) {
|
|
136
|
+
let host;
|
|
137
|
+
let port;
|
|
138
|
+
if (config.type === 'http' && config.url) {
|
|
139
|
+
try {
|
|
140
|
+
const parsed = new URL(config.url);
|
|
141
|
+
host = parsed.hostname;
|
|
142
|
+
port = parsed.port ? parseInt(parsed.port, 10) : (parsed.protocol === 'https:' ? 443 : 80);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
host = config.host || config.targetHost || 'localhost';
|
|
146
|
+
port = config.port || config.targetPort || DEFAULT_PORTS[config.type];
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
host = config.targetHost || config.host || 'localhost';
|
|
151
|
+
port = config.targetPort || config.port || DEFAULT_PORTS[config.type];
|
|
152
|
+
}
|
|
153
|
+
const scheme = PROTOCOL_SCHEMES[config.type];
|
|
154
|
+
const connectionString = `${scheme}://${host}:${port}`;
|
|
155
|
+
const envVar = ENV_VAR_MAP[config.type]
|
|
156
|
+
|| `${name.toUpperCase().replace(/-/g, '_')}_URL`;
|
|
157
|
+
return {
|
|
158
|
+
name,
|
|
159
|
+
type: config.type,
|
|
160
|
+
host,
|
|
161
|
+
port,
|
|
162
|
+
connectionString,
|
|
163
|
+
envVar,
|
|
164
|
+
accessMode: config.access.mode,
|
|
165
|
+
via: config.access.via || 'direct',
|
|
166
|
+
};
|
|
167
|
+
}
|
|
36
168
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
37
169
|
// Tracking
|
|
38
170
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -183,8 +315,8 @@ class ServicesAPI {
|
|
|
183
315
|
}
|
|
184
316
|
const port = service.tunnelPort || service.targetPort;
|
|
185
317
|
const host = 'localhost';
|
|
186
|
-
let connectionString
|
|
187
|
-
let envVar
|
|
318
|
+
let connectionString;
|
|
319
|
+
let envVar;
|
|
188
320
|
if (service.targetPort === 5432 || service.protocol === 'postgres') {
|
|
189
321
|
connectionString = `postgres://${host}:${port}/postgres`;
|
|
190
322
|
envVar = 'DATABASE_URL';
|
|
@@ -288,7 +420,8 @@ exports.GrantsAPI = GrantsAPI;
|
|
|
288
420
|
// Main Client
|
|
289
421
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
290
422
|
class PrivateConnect {
|
|
291
|
-
constructor(config) {
|
|
423
|
+
constructor(config = {}) {
|
|
424
|
+
this.manifest = new Map();
|
|
292
425
|
this.config = {
|
|
293
426
|
apiKey: config.apiKey,
|
|
294
427
|
hubUrl: config.hubUrl || 'https://api.privateconnect.co',
|
|
@@ -301,6 +434,87 @@ class PrivateConnect {
|
|
|
301
434
|
trackSdkUsage(this.config.hubUrl);
|
|
302
435
|
}
|
|
303
436
|
}
|
|
437
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
438
|
+
// Manifest API — the primary way to use the SDK
|
|
439
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
440
|
+
/**
|
|
441
|
+
* Load a pconnect.yml manifest and return a configured client.
|
|
442
|
+
*
|
|
443
|
+
* Auto-discovers pconnect.yml in the current directory (or parents) if no
|
|
444
|
+
* path is given. Pass a config to also enable hub API access.
|
|
445
|
+
*
|
|
446
|
+
* @example
|
|
447
|
+
* ```typescript
|
|
448
|
+
* const pc = PrivateConnect.fromManifest();
|
|
449
|
+
* const db = pc.resource('staging-db');
|
|
450
|
+
* console.log(db.connectionString); // postgres://internal-db:5432
|
|
451
|
+
* ```
|
|
452
|
+
*/
|
|
453
|
+
static fromManifest(manifestPath, config) {
|
|
454
|
+
const resolvedPath = manifestPath
|
|
455
|
+
? path.resolve(manifestPath)
|
|
456
|
+
: findManifest();
|
|
457
|
+
if (!resolvedPath) {
|
|
458
|
+
throw new Error('No pconnect.yml found. Create one in your project root:\n\n' +
|
|
459
|
+
' resources:\n' +
|
|
460
|
+
' staging-db:\n' +
|
|
461
|
+
' type: postgres\n' +
|
|
462
|
+
' host: internal-db\n' +
|
|
463
|
+
' port: 5432\n' +
|
|
464
|
+
' access:\n' +
|
|
465
|
+
' mode: tcp\n');
|
|
466
|
+
}
|
|
467
|
+
const instance = new PrivateConnect(config || { disableTracking: true });
|
|
468
|
+
instance.manifestPath = resolvedPath;
|
|
469
|
+
const rawResources = parseManifestFile(resolvedPath);
|
|
470
|
+
for (const [name, rawConfig] of Object.entries(rawResources)) {
|
|
471
|
+
instance.manifest.set(name, resolveManifestResource(name, rawConfig));
|
|
472
|
+
}
|
|
473
|
+
return instance;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Get a resource declared in pconnect.yml by name.
|
|
477
|
+
*
|
|
478
|
+
* Returns its type, host, port, connection string, and suggested env var.
|
|
479
|
+
* When `connect dev` is running, the connection string points to a live
|
|
480
|
+
* local tunnel.
|
|
481
|
+
*/
|
|
482
|
+
resource(name) {
|
|
483
|
+
const r = this.manifest.get(name);
|
|
484
|
+
if (!r) {
|
|
485
|
+
const available = Array.from(this.manifest.keys());
|
|
486
|
+
const msg = available.length
|
|
487
|
+
? `Available: ${available.join(', ')}`
|
|
488
|
+
: 'No resources loaded. Did you call PrivateConnect.fromManifest()?';
|
|
489
|
+
throw new Error(`Resource "${name}" not found. ${msg}`);
|
|
490
|
+
}
|
|
491
|
+
return r;
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* List all resources declared in the loaded manifest.
|
|
495
|
+
*/
|
|
496
|
+
resources() {
|
|
497
|
+
return Array.from(this.manifest.values());
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Generate a `.env`-compatible block for all manifest resources.
|
|
501
|
+
*
|
|
502
|
+
* @example
|
|
503
|
+
* ```typescript
|
|
504
|
+
* const pc = PrivateConnect.fromManifest();
|
|
505
|
+
* console.log(pc.envBlock());
|
|
506
|
+
* // DATABASE_URL=postgres://internal-db:5432
|
|
507
|
+
* // REDIS_URL=redis://redis.internal:6379
|
|
508
|
+
* ```
|
|
509
|
+
*/
|
|
510
|
+
envBlock() {
|
|
511
|
+
return this.resources()
|
|
512
|
+
.map(r => `${r.envVar}=${r.connectionString}`)
|
|
513
|
+
.join('\n');
|
|
514
|
+
}
|
|
515
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
516
|
+
// Existing APIs
|
|
517
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
304
518
|
/** The resolved agent ID, or undefined if not configured. */
|
|
305
519
|
get agentId() {
|
|
306
520
|
return this.config.agentId;
|
|
@@ -329,13 +543,23 @@ class PrivateConnect {
|
|
|
329
543
|
}
|
|
330
544
|
return this.config.agentId;
|
|
331
545
|
}
|
|
546
|
+
/** Requires an API key or throws. */
|
|
547
|
+
requireApiKey() {
|
|
548
|
+
if (!this.config.apiKey) {
|
|
549
|
+
throw new Error('API key required for hub API calls. Either:\n' +
|
|
550
|
+
' 1. Set PRIVATECONNECT_API_KEY environment variable, or\n' +
|
|
551
|
+
' 2. Pass apiKey in the config.');
|
|
552
|
+
}
|
|
553
|
+
return this.config.apiKey;
|
|
554
|
+
}
|
|
332
555
|
/** Internal fetch with API key auth. */
|
|
333
|
-
async fetch(
|
|
334
|
-
const
|
|
556
|
+
async fetch(urlPath, options) {
|
|
557
|
+
const apiKey = this.requireApiKey();
|
|
558
|
+
const url = `${this.config.hubUrl}${urlPath}`;
|
|
335
559
|
const response = await fetch(url, {
|
|
336
560
|
...options,
|
|
337
561
|
headers: {
|
|
338
|
-
'x-api-key':
|
|
562
|
+
'x-api-key': apiKey,
|
|
339
563
|
'Content-Type': 'application/json',
|
|
340
564
|
...options?.headers,
|
|
341
565
|
},
|
|
@@ -349,7 +573,7 @@ class PrivateConnect {
|
|
|
349
573
|
}
|
|
350
574
|
exports.PrivateConnect = PrivateConnect;
|
|
351
575
|
exports.default = PrivateConnect;
|
|
352
|
-
/** Convenience function for quick one-off connections. */
|
|
576
|
+
/** Convenience function for quick one-off connections via the hub API. */
|
|
353
577
|
async function connect(serviceName, config) {
|
|
354
578
|
const apiKey = config?.apiKey || process.env.PRIVATECONNECT_API_KEY;
|
|
355
579
|
if (!apiKey) {
|
|
@@ -358,4 +582,11 @@ async function connect(serviceName, config) {
|
|
|
358
582
|
const client = new PrivateConnect({ ...config, apiKey });
|
|
359
583
|
return client.connect(serviceName, { grantToken: config?.grantToken });
|
|
360
584
|
}
|
|
361
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7OztBQW1jSCwwQkFXQztBQTVjRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQW1GekIsZ0ZBQWdGO0FBQ2hGLFdBQVc7QUFDWCxnRkFBZ0Y7QUFFaEYsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLEVBQUUsRUFBRSxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUsSUFBSSxFQUFFLE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMvRixPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLEdBQUcsTUFBTSxvQkFBb0IsRUFBRTtRQUNuQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtRQUMvQyxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixxQkFBcUI7QUFDckIsZ0ZBQWdGO0FBRWhGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFD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RUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRjtBQWpGRCx3Q0FpRkM7QUFFRCxrQkFBZSxjQUFjLENBQUM7QUFFOUIsMERBQTBEO0FBQ25ELEtBQUssVUFBVSxPQUFPLENBQzNCLFdBQW1CLEVBQ25CLE1BQXVEO0lBRXZELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUHJpdmF0ZSBDb25uZWN0IFNES1xyXG4gKlxyXG4gKiBQcm9ncmFtbWF0aWMgYWNjZXNzIHRvIFByaXZhdGUgQ29ubmVjdCBzZXJ2aWNlcywgZ3JhbnRzLCBhbmQgYWdlbnQgb3JjaGVzdHJhdGlvbi5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpbXBvcnQgeyBQcml2YXRlQ29ubmVjdCB9IGZyb20gJ0Bwcml2YXRlY29ubmVjdC9zZGsnO1xyXG4gKlxyXG4gKiBjb25zdCBwYyA9IG5ldyBQcml2YXRlQ29ubmVjdCh7IGFwaUtleTogJ3lvdXItYXBpLWtleScgfSk7XHJcbiAqXHJcbiAqIC8vIENvbm5lY3QgdG8gYSBzZXJ2aWNlIChhc3N1bWVzIHR1bm5lbCBpcyBhbHJlYWR5IG9wZW4pXHJcbiAqIGNvbnN0IGRiID0gYXdhaXQgcGMuY29ubmVjdCgncG9zdGdyZXMtcHJvZCcpO1xyXG4gKiBjb25zb2xlLmxvZyhkYi5jb25uZWN0aW9uU3RyaW5nKTsgLy8gcG9zdGdyZXM6Ly9sb2NhbGhvc3Q6NTQzMi8uLi5cclxuICpcclxuICogLy8gR3JhbnQgYW4gQUkgYWdlbnQgdGVtcG9yYXJ5IGFjY2Vzc1xyXG4gKiBjb25zdCBncmFudCA9IGF3YWl0IHBjLmdyYW50cy5jcmVhdGUoe1xyXG4gKiAgIGFnZW50TGFiZWw6ICdjbGF1ZGUnLFxyXG4gKiAgIHJlc291cmNlVHlwZTogJ2RiJyxcclxuICogICByZXNvdXJjZU5hbWU6ICdwb3N0Z3JlcycsXHJcbiAqICAgdHRsOiAnNW0nLFxyXG4gKiB9KTtcclxuICogY29uc29sZS5sb2coZ3JhbnQudG9rZW4pOyAvLyBnbnRfLi4uXHJcbiAqXHJcbiAqIC8vIExpc3QgYWxsIGFnZW50c1xyXG4gKiBjb25zdCBhZ2VudHMgPSBhd2FpdCBwYy5hZ2VudHMubGlzdCgpO1xyXG4gKiBgYGBcclxuICovXHJcblxyXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBUeXBlc1xyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZUNvbm5lY3RDb25maWcge1xyXG4gIC8qKiBBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbiAqL1xyXG4gIGFwaUtleTogc3RyaW5nO1xyXG4gIC8qKiBIdWIgVVJMIChkZWZhdWx0OiBodHRwczovL2FwaS5wcml2YXRlY29ubmVjdC5jbykgKi9cclxuICBodWJVcmw/OiBzdHJpbmc7XHJcbiAgLyoqIEFnZW50IElEIChhdXRvLWRldGVjdGVkIGZyb20gbG9jYWwgY29uZmlnIGlmIG5vdCBwcm92aWRlZCkgKi9cclxuICBhZ2VudElkPzogc3RyaW5nO1xyXG4gIC8qKiBEaXNhYmxlIHVzYWdlIHRyYWNraW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cclxuICBkaXNhYmxlVHJhY2tpbmc/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2Uge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHRhcmdldEhvc3Q6IHN0cmluZztcclxuICB0YXJnZXRQb3J0OiBudW1iZXI7XHJcbiAgdHVubmVsUG9ydD86IG51bWJlcjtcclxuICBwcm90b2NvbDogc3RyaW5nO1xyXG4gIHN0YXR1czogc3RyaW5nO1xyXG4gIGFnZW50TGFiZWw/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnQge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZT86IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGlzT25saW5lOiBib29sZWFuO1xyXG4gIGxhc3RTZWVuQXQ6IHN0cmluZztcclxuICBjYXBhYmlsaXRpZXM6IHN0cmluZ1tdO1xyXG4gIHNlcnZpY2VzOiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uIHtcclxuICBzZXJ2aWNlOiBzdHJpbmc7XHJcbiAgaG9zdDogc3RyaW5nO1xyXG4gIHBvcnQ6IG51bWJlcjtcclxuICBjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmc7XHJcbiAgZW52VmFyOiBzdHJpbmc7XHJcbiAgLyoqIFByZXNlbnQgd2hlbiB1c2luZyBhIGdyYW50LWJhc2VkIGNvbm5lY3Rpb24gKi9cclxuICBncmFudFRva2VuPzogc3RyaW5nO1xyXG4gIC8qKiBQcmVzZW50IHdoZW4gdXNpbmcgYSBncmFudC1iYXNlZCBjb25uZWN0aW9uICovXHJcbiAgZ3JhbnRFbmRwb2ludD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGZyb206IHsgaWQ6IHN0cmluZzsgbmFtZT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfTtcclxuICBjaGFubmVsOiBzdHJpbmc7XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xyXG4gIGlzUmVhZDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHcmFudCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBhZ2VudExhYmVsOiBzdHJpbmc7XHJcbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XHJcbiAgcmVzb3VyY2VOYW1lOiBzdHJpbmc7XHJcbiAgc2NvcGU6IHN0cmluZztcclxuICB0b2tlblByZWZpeD86IHN0cmluZztcclxuICBwZXJzaXN0ZW50OiBib29sZWFuO1xyXG4gIGV4cGlyZXNBdDogc3RyaW5nIHwgbnVsbDtcclxuICBleHBpcmVzSW5NaW51dGVzPzogbnVtYmVyIHwgbnVsbDtcclxuICB0b2tlbj86IHN0cmluZztcclxuICBlbmRwb2ludD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHcmFudENyZWF0ZU9wdGlvbnMge1xyXG4gIGFnZW50TGFiZWw6IHN0cmluZztcclxuICByZXNvdXJjZVR5cGU6ICdkYicgfCAnYXBpJyB8ICdwYXRoJztcclxuICByZXNvdXJjZU5hbWU6IHN0cmluZztcclxuICBzY29wZT86ICdyZWFkLW9ubHknIHwgJ2Z1bGwnO1xyXG4gIC8qKiBEdXJhdGlvbiBzdHJpbmc6IDYwcywgNW0sIDFoLCAxZC4gT21pdCBmb3IgcGVyc2lzdGVudCBncmFudC4gKi9cclxuICB0dGw/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBUcmFja2luZ1xyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmZ1bmN0aW9uIHRyYWNrU2RrVXNhZ2UoaHViVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgb3M6IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3MucGxhdGZvcm0gOiAnYnJvd3NlcicsXHJcbiAgICBhcmNoOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnID8gJ2FybTY0JyA6ICd4NjQnKSA6ICd1bmtub3duJyxcclxuICAgIHZlcnNpb246ICdzZGsnLFxyXG4gICAgc291cmNlOiAnc2RrJyxcclxuICB9KTtcclxuXHJcbiAgZmV0Y2goYCR7aHViVXJsfS92MS9ldmVudHMvaW5zdGFsbGAsIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICBib2R5OiBkYXRhLFxyXG4gIH0pLmNhdGNoKCgpID0+IHt9KTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIEFnZW50IElEIERldGVjdGlvblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmNvbnN0IENPTkZJR19QQVRIID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5wcml2YXRlLWNvbm5lY3QnLCAnY29uZmlnLmpzb24nKTtcclxuXHJcbi8qKlxyXG4gKiBEZXRlY3QgdGhlIGFnZW50IElEIGZyb20gbG9jYWwgY29uZmlnIG9yIGVudmlyb25tZW50LlxyXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBhZ2VudCBpcyBjb25maWd1cmVkIOKAlCBjYWxsZXJzIHRoYXQgbmVlZCBhbiBhZ2VudCBJRFxyXG4gKiBzaG91bGQgc3VyZmFjZSBhIGNsZWFyIGVycm9yIHJhdGhlciB0aGFuIHVzaW5nIGEgZmFrZSBvbmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZXRlY3RBZ2VudElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgLy8gMS4gRW52aXJvbm1lbnQgdmFyaWFibGVzIChoaWdoZXN0IHByaW9yaXR5IOKAlCB1c2VmdWwgaW4gQ0kpXHJcbiAgY29uc3QgZW52SWQgPSBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BR0VOVF9JRCB8fCBwcm9jZXNzLmVudi5DT05ORUNUX0FHRU5UX0lEO1xyXG4gIGlmIChlbnZJZCkgcmV0dXJuIGVudklkO1xyXG5cclxuICAvLyAyLiBMb2NhbCBjb25maWcgZmlsZSAofi8ucHJpdmF0ZS1jb25uZWN0L2NvbmZpZy5qc29uKVxyXG4gIHRyeSB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhDT05GSUdfUEFUSCkpIHtcclxuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKENPTkZJR19QQVRILCAndXRmLTgnKTtcclxuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShyYXcpO1xyXG4gICAgICBpZiAoY29uZmlnLmFnZW50SWQgJiYgdHlwZW9mIGNvbmZpZy5hZ2VudElkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBjb25maWcuYWdlbnRJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gY2F0Y2gge1xyXG4gICAgLy8gQ29uZmlnIHVucmVhZGFibGUgb3IgbWFsZm9ybWVkIOKAlCBmYWxsIHRocm91Z2hcclxuICB9XHJcblxyXG4gIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBBZ2VudHMgQVBJXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW50c0FQSSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxyXG5cclxuICBhc3luYyBsaXN0KG9wdGlvbnM/OiB7IG9ubGluZU9ubHk/OiBib29sZWFuIH0pOiBQcm9taXNlPEFnZW50W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9hZ2VudHMvb3JjaGVzdHJhdGlvbicpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIGxldCBhZ2VudHMgPSBkYXRhLmFnZW50cyB8fCBbXTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8ub25saW5lT25seSkge1xyXG4gICAgICBhZ2VudHMgPSBhZ2VudHMuZmlsdGVyKChhOiBhbnkpID0+IGEuaXNPbmxpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhZ2VudHMubWFwKChhOiBhbnkpID0+ICh7XHJcbiAgICAgIGlkOiBhLmlkLFxyXG4gICAgICBuYW1lOiBhLm5hbWUsXHJcbiAgICAgIGxhYmVsOiBhLmxhYmVsLFxyXG4gICAgICBpc09ubGluZTogYS5pc09ubGluZSxcclxuICAgICAgbGFzdFNlZW5BdDogYS5sYXN0U2VlbkF0LFxyXG4gICAgICBjYXBhYmlsaXRpZXM6IGEuY2FwYWJpbGl0aWVzPy5tYXAoKGM6IGFueSkgPT4gYy5uYW1lKSB8fCBbXSxcclxuICAgICAgc2VydmljZXM6IGEuc2VydmljZXM/Lm1hcCgoczogYW55KSA9PiBzLm5hbWUpIHx8IFtdLFxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZEJ5Q2FwYWJpbGl0eShjYXBhYmlsaXR5OiBzdHJpbmcpOiBQcm9taXNlPEFnZW50W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvYnktY2FwYWJpbGl0eS8ke2VuY29kZVVSSUNvbXBvbmVudChjYXBhYmlsaXR5KX1gKTtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICByZXR1cm4gZGF0YS5hZ2VudHMgfHwgW107XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWdpc3RlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vY2FwYWJpbGl0aWVzYCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjYXBhYmlsaXRpZXMgfSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxyXG4gICAgdG9BZ2VudElkOiBzdHJpbmcsXHJcbiAgICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcclxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHR5cGU/OiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JyB9XHJcbiAgKTogUHJvbWlzZTx7IG1lc3NhZ2VJZDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3NlbmRgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRvQWdlbnRJZCwgcGF5bG9hZCwgLi4ub3B0aW9ucyB9KSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGJyb2FkY2FzdChcclxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgb3B0aW9ucz86IHsgY2hhbm5lbD86IHN0cmluZyB9XHJcbiAgKTogUHJvbWlzZTx7IHNlbnQ6IG51bWJlciB9PiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcy9icm9hZGNhc3RgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBheWxvYWQsIC4uLm9wdGlvbnMgfSksXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRNZXNzYWdlcyhvcHRpb25zPzogeyBjaGFubmVsPzogc3RyaW5nOyB1bnJlYWRPbmx5PzogYm9vbGVhbjsgbGltaXQ/OiBudW1iZXIgfSk6IFByb21pc2U8TWVzc2FnZVtdPiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgIGlmIChvcHRpb25zPy5jaGFubmVsKSBwYXJhbXMuc2V0KCdjaGFubmVsJywgb3B0aW9ucy5jaGFubmVsKTtcclxuICAgIGlmIChvcHRpb25zPy51bnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ3VucmVhZE9ubHknLCBTdHJpbmcob3B0aW9ucy51bnJlYWRPbmx5KSk7XHJcbiAgICBpZiAob3B0aW9ucz8ubGltaXQpIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKG9wdGlvbnMubGltaXQpKTtcclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vbWVzc2FnZXM/JHtwYXJhbXN9YCk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEubWVzc2FnZXMgfHwgW107XHJcbiAgfVxyXG5cclxuICBhc3luYyBtYXJrUmVhZChtZXNzYWdlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWdlbnRJZCA9IHRoaXMuY2xpZW50LnJlcXVpcmVBZ2VudElkKCk7XHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3JlYWRgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG1lc3NhZ2VJZHMgfSksXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBTZXJ2aWNlcyBBUElcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZXNBUEkge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cclxuXHJcbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFNlcnZpY2VbXT4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL3NlcnZpY2VzJyk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8U2VydmljZSB8IG51bGw+IHtcclxuICAgIGNvbnN0IHNlcnZpY2VzID0gYXdhaXQgdGhpcy5saXN0KCk7XHJcbiAgICByZXR1cm4gc2VydmljZXMuZmluZChzID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29ubmVjdGlvbiBkZXRhaWxzIGZvciBhIHNlcnZpY2UuXHJcbiAgICpcclxuICAgKiBJZiBgZ3JhbnRUb2tlbmAgaXMgcHJvdmlkZWQsIHJldHVybnMgYSBwcm94aWVkIGNvbm5lY3Rpb24gdmlhIHRoZSBodWInc1xyXG4gICAqIGdyYW50IGVuZHBvaW50IGluc3RlYWQgb2YgYXNzdW1pbmcgYSBsb2NhbCB0dW5uZWwuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBncmFudFRva2VuPzogc3RyaW5nIH0pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcclxuICAgIGlmIChvcHRpb25zPy5ncmFudFRva2VuKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEdyYW50Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSwgb3B0aW9ucy5ncmFudFRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5nZXQoc2VydmljZU5hbWUpO1xyXG4gICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VydmljZSBcIiR7c2VydmljZU5hbWV9XCIgbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9ydCA9IHNlcnZpY2UudHVubmVsUG9ydCB8fCBzZXJ2aWNlLnRhcmdldFBvcnQ7XHJcbiAgICBjb25zdCBob3N0ID0gJ2xvY2FsaG9zdCc7XHJcblxyXG4gICAgbGV0IGNvbm5lY3Rpb25TdHJpbmcgPSAnJztcclxuICAgIGxldCBlbnZWYXIgPSAnU0VSVklDRV9VUkwnO1xyXG5cclxuICAgIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDU0MzIgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ3Bvc3RncmVzJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHBvc3RncmVzOi8vJHtob3N0fToke3BvcnR9L3Bvc3RncmVzYDtcclxuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XHJcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gMzMwNiB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbXlzcWwnKSB7XHJcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgbXlzcWw6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnREFUQUJBU0VfVVJMJztcclxuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA2Mzc5IHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdyZWRpcycpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGByZWRpczovLyR7aG9zdH06JHtwb3J0fWA7XHJcbiAgICAgIGVudlZhciA9ICdSRURJU19VUkwnO1xyXG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDI3MDE3IHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdtb25nb2RiJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYG1vbmdvZGI6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnTU9OR09EQl9VUkknO1xyXG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnByb3RvY29sID09PSAnaHR0cCcgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHBzJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnQVBJX1VSTCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHRjcDovLyR7aG9zdH06JHtwb3J0fWA7XHJcbiAgICAgIGVudlZhciA9IGAke3NlcnZpY2VOYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpfV9VUkxgO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCBob3N0LCBwb3J0LCBjb25uZWN0aW9uU3RyaW5nLCBlbnZWYXIgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0R3JhbnRDb25uZWN0aW9uKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGdyYW50VG9rZW46IHN0cmluZyk6IENvbm5lY3Rpb24ge1xyXG4gICAgY29uc3QgaHViVXJsID0gdGhpcy5jbGllbnQuaHViVXJsO1xyXG4gICAgY29uc3QgZ3JhbnRFbmRwb2ludCA9IGAke2h1YlVybH0vZ3JhbnQvJHtlbmNvZGVVUklDb21wb25lbnQoc2VydmljZU5hbWUpfWA7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VydmljZTogc2VydmljZU5hbWUsXHJcbiAgICAgIGhvc3Q6IG5ldyBVUkwoaHViVXJsKS5ob3N0bmFtZSxcclxuICAgICAgcG9ydDogbmV3IFVSTChodWJVcmwpLnBvcnQgPyBwYXJzZUludChuZXcgVVJMKGh1YlVybCkucG9ydCwgMTApIDogNDQzLFxyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nOiBncmFudEVuZHBvaW50LFxyXG4gICAgICBlbnZWYXI6ICdHUkFOVF9VUkwnLFxyXG4gICAgICBncmFudFRva2VuLFxyXG4gICAgICBncmFudEVuZHBvaW50LFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBHcmFudHMgQVBJXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIEdyYW50c0FQSSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSB0aW1lLWxpbWl0ZWQgYWNjZXNzIGdyYW50IGZvciBhbiBBSSBhZ2VudCBvciBleHRlcm5hbCBjb25zdW1lci5cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGUob3B0aW9uczogR3JhbnRDcmVhdGVPcHRpb25zKTogUHJvbWlzZTxHcmFudD4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL2dyYW50cycsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuZ3JhbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0IGFjdGl2ZSBncmFudHMgaW4gdGhlIHdvcmtzcGFjZS5cclxuICAgKi9cclxuICBhc3luYyBsaXN0KG9wdGlvbnM/OiB7IGluY2x1ZGVFeHBpcmVkPzogYm9vbGVhbiB9KTogUHJvbWlzZTxHcmFudFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XHJcbiAgICBpZiAob3B0aW9ucz8uaW5jbHVkZUV4cGlyZWQpIHBhcmFtcy5zZXQoJ2luY2x1ZGVFeHBpcmVkJywgJ3RydWUnKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9ncmFudHM/JHtwYXJhbXN9YCk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuZ3JhbnRzIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV2b2tlIGFuIGFjdGl2ZSBncmFudCBpbW1lZGlhdGVseS5cclxuICAgKi9cclxuICBhc3luYyByZXZva2UoZ3JhbnRJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2dyYW50cy8ke2dyYW50SWR9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgYSBncmFudCB0b2tlbiAocHVibGljIGVuZHBvaW50IOKAlCBubyBBUEkga2V5IHJlcXVpcmVkKS5cclxuICAgKiBSZXR1cm5zIHRoZSBncmFudCBpZiB2YWxpZCwgbnVsbCBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYXN5bmMgdmFsaWRhdGUodG9rZW46IHN0cmluZyk6IFByb21pc2U8R3JhbnQgfCBudWxsPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNsaWVudC5odWJVcmx9L3YxL2dyYW50cy92YWxpZGF0ZWA7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0b2tlbiB9KSxcclxuICAgICAgfSk7XHJcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHJldHVybiBudWxsO1xyXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICByZXR1cm4gZGF0YS52YWxpZCA/IGRhdGEuZ3JhbnQgOiBudWxsO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIE1haW4gQ2xpZW50XHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIFByaXZhdGVDb25uZWN0IHtcclxuICBwcml2YXRlIGNvbmZpZzogeyBhcGlLZXk6IHN0cmluZzsgaHViVXJsOiBzdHJpbmc7IGFnZW50SWQ/OiBzdHJpbmcgfTtcclxuXHJcbiAgLyoqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSBhbmQgb3JjaGVzdHJhdGlvbiAqL1xyXG4gIHB1YmxpYyBhZ2VudHM6IEFnZW50c0FQSTtcclxuXHJcbiAgLyoqIFNlcnZpY2VzIEFQSSBmb3IgY29ubmVjdGluZyB0byBzZXJ2aWNlcyAqL1xyXG4gIHB1YmxpYyBzZXJ2aWNlczogU2VydmljZXNBUEk7XHJcblxyXG4gIC8qKiBHcmFudHMgQVBJIGZvciBtYW5hZ2luZyBzY29wZWQgYWNjZXNzIHRva2VucyAodGltZS1saW1pdGVkIG9yIHBlcnNpc3RlbnQpICovXHJcbiAgcHVibGljIGdyYW50czogR3JhbnRzQVBJO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFByaXZhdGVDb25uZWN0Q29uZmlnKSB7XHJcbiAgICB0aGlzLmNvbmZpZyA9IHtcclxuICAgICAgYXBpS2V5OiBjb25maWcuYXBpS2V5LFxyXG4gICAgICBodWJVcmw6IGNvbmZpZy5odWJVcmwgfHwgJ2h0dHBzOi8vYXBpLnByaXZhdGVjb25uZWN0LmNvJyxcclxuICAgICAgYWdlbnRJZDogY29uZmlnLmFnZW50SWQgfHwgZGV0ZWN0QWdlbnRJZCgpLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFnZW50cyA9IG5ldyBBZ2VudHNBUEkodGhpcyk7XHJcbiAgICB0aGlzLnNlcnZpY2VzID0gbmV3IFNlcnZpY2VzQVBJKHRoaXMpO1xyXG4gICAgdGhpcy5ncmFudHMgPSBuZXcgR3JhbnRzQVBJKHRoaXMpO1xyXG5cclxuICAgIGlmICghY29uZmlnLmRpc2FibGVUcmFja2luZykge1xyXG4gICAgICB0cmFja1Nka1VzYWdlKHRoaXMuY29uZmlnLmh1YlVybCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHJlc29sdmVkIGFnZW50IElELCBvciB1bmRlZmluZWQgaWYgbm90IGNvbmZpZ3VyZWQuICovXHJcbiAgZ2V0IGFnZW50SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hZ2VudElkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBodWIgVVJMIHRoaXMgY2xpZW50IGlzIGNvbm5lY3RlZCB0by4gKi9cclxuICBnZXQgaHViVXJsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaHViVXJsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvcnRoYW5kOiBnZXQgY29ubmVjdGlvbiBkZXRhaWxzIGZvciBhIHNlcnZpY2UuXHJcbiAgICogUGFzcyBgZ3JhbnRUb2tlbmAgdG8gY29ubmVjdCB2aWEgdGhlIGdyYW50IHByb3h5IGluc3RlYWQgb2YgYSBsb2NhbCB0dW5uZWwuXHJcbiAgICovXHJcbiAgYXN5bmMgY29ubmVjdChzZXJ2aWNlTmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBncmFudFRva2VuPzogc3RyaW5nIH0pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VzLmdldENvbm5lY3Rpb24oc2VydmljZU5hbWUsIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgYWdlbnQgSUQgb3IgdGhyb3dzIGlmIG5vdCBjb25maWd1cmVkLlxyXG4gICAqIFVzZWQgYnkgQVBJcyB0aGF0IHJlcXVpcmUgYW4gYXV0aGVudGljYXRlZCBhZ2VudCBpZGVudGl0eS5cclxuICAgKi9cclxuICByZXF1aXJlQWdlbnRJZCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5hZ2VudElkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnQWdlbnQgSUQgbm90IGZvdW5kLiBFaXRoZXI6XFxuJyArXHJcbiAgICAgICAgJyAgMS4gUnVuIFwiY29ubmVjdCB1cFwiIHRvIHJlZ2lzdGVyIHRoaXMgbWFjaGluZSwgb3JcXG4nICtcclxuICAgICAgICAnICAyLiBTZXQgUFJJVkFURUNPTk5FQ1RfQUdFTlRfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yXFxuJyArXHJcbiAgICAgICAgJyAgMy4gUGFzcyBhZ2VudElkIGluIHRoZSBQcml2YXRlQ29ubmVjdCBjb25zdHJ1Y3Rvci4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWdlbnRJZDtcclxuICB9XHJcblxyXG4gIC8qKiBJbnRlcm5hbCBmZXRjaCB3aXRoIEFQSSBrZXkgYXV0aC4gKi9cclxuICBhc3luYyBmZXRjaChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuY29uZmlnLmh1YlVybH0ke3BhdGh9YDtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAneC1hcGkta2V5JzogdGhpcy5jb25maWcuYXBpS2V5LFxyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVycyxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgbWVzc2FnZTogJ1Vua25vd24gZXJyb3InIH0pKTtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UgfHwgYFJlcXVlc3QgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQcml2YXRlQ29ubmVjdDtcclxuXHJcbi8qKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcXVpY2sgb25lLW9mZiBjb25uZWN0aW9ucy4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QoXHJcbiAgc2VydmljZU5hbWU6IHN0cmluZyxcclxuICBjb25maWc/OiBQcml2YXRlQ29ubmVjdENvbmZpZyAmIHsgZ3JhbnRUb2tlbj86IHN0cmluZyB9LFxyXG4pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcclxuICBjb25zdCBhcGlLZXkgPSBjb25maWc/LmFwaUtleSB8fCBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BUElfS0VZO1xyXG4gIGlmICghYXBpS2V5KSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FQSSBrZXkgcmVxdWlyZWQuIFNldCBQUklWQVRFQ09OTkVDVF9BUElfS0VZIG9yIHBhc3MgY29uZmlnLmFwaUtleScpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xpZW50ID0gbmV3IFByaXZhdGVDb25uZWN0KHsgLi4uY29uZmlnLCBhcGlLZXkgfSk7XHJcbiAgcmV0dXJuIGNsaWVudC5jb25uZWN0KHNlcnZpY2VOYW1lLCB7IGdyYW50VG9rZW46IGNvbmZpZz8uZ3JhbnRUb2tlbiB9KTtcclxufVxyXG4iXX0=
|
|
585
|
+
/**
|
|
586
|
+
* Load pconnect.yml and get a resource by name.
|
|
587
|
+
* Shorthand for `PrivateConnect.fromManifest().resource(name)`.
|
|
588
|
+
*/
|
|
589
|
+
function fromManifest(manifestPath) {
|
|
590
|
+
return PrivateConnect.fromManifest(manifestPath);
|
|
591
|
+
}
|
|
592
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHOzs7QUErdEJILDBCQVdDO0FBTUQsb0NBRUM7QUFodkJELHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLGdDQUFnQztBQW1GaEMsZ0ZBQWdGO0FBQ2hGLGlCQUFpQjtBQUNqQixnRkFBZ0Y7QUFFbkUsUUFBQSxjQUFjLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFVLENBQUM7QUFHaEYsUUFBQSxZQUFZLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFVLENBQUM7QUFHeEMsUUFBQSxlQUFlLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFVLENBQUM7QUF3QjFELGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsZ0ZBQWdGO0FBRWhGLE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsY0FBYztJQUNkLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixnQkFBZ0I7Q0FDakIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFpQztJQUNsRCxRQUFRLEVBQUUsSUFBSTtJQUNkLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxJQUFJLEVBQUUsRUFBRTtJQUNSLGFBQWEsRUFBRSxDQUFDO0NBQ2pCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFpQztJQUNyRCxRQUFRLEVBQUUsVUFBVTtJQUNwQixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBSSxFQUFFLE1BQU07SUFDWixhQUFhLEVBQUUsS0FBSztDQUNyQixDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQWlDO0lBQ2hELFFBQVEsRUFBRSxjQUFjO0lBQ3hCLEtB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LEVBQ25CLE1BQXVEO0lBRXZELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixZQUFZLENBQUMsWUFBcUI7SUFDaEQsT0FBTyxjQUFjLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUHJpdmF0ZSBDb25uZWN0IFNES1xyXG4gKlxyXG4gKiBEZWZpbmUgeW91ciBjb25uZWN0aW9ucyBpbiBwY29ubmVjdC55bWwuIEFjY2VzcyB0aGVtIGZyb20gYW55d2hlcmUuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaW1wb3J0IHsgUHJpdmF0ZUNvbm5lY3QgfSBmcm9tICdAcHJpdmF0ZWNvbm5lY3Qvc2RrJztcclxuICpcclxuICogLy8gTG9hZCB5b3VyIHByb2plY3QncyBjb25uZWN0aW9uIG1hbmlmZXN0XHJcbiAqIGNvbnN0IHBjID0gUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCk7XHJcbiAqXHJcbiAqIC8vIEdldCBhIHJlc291cmNlIGRlY2xhcmVkIGluIHBjb25uZWN0LnltbFxyXG4gKiBjb25zdCBkYiA9IHBjLnJlc291cmNlKCdzdGFnaW5nLWRiJyk7XHJcbiAqIGNvbnNvbGUubG9nKGRiLmNvbm5lY3Rpb25TdHJpbmcpOyAvLyBwb3N0Z3JlczovL2ludGVybmFsLWRiOjU0MzJcclxuICogY29uc29sZS5sb2coZGIuZW52VmFyKTsgICAgICAgICAgIC8vIERBVEFCQVNFX1VSTFxyXG4gKlxyXG4gKiAvLyBXaXRoIGFuIEFQSSBrZXksIHlvdSBhbHNvIGdldCBodWIgQVBJIGFjY2Vzc1xyXG4gKiBjb25zdCBwYzIgPSBQcml2YXRlQ29ubmVjdC5mcm9tTWFuaWZlc3QoJy4vcGNvbm5lY3QueW1sJywge1xyXG4gKiAgIGFwaUtleTogcHJvY2Vzcy5lbnYuUFJJVkFURUNPTk5FQ1RfQVBJX0tFWSxcclxuICogfSk7XHJcbiAqIGNvbnN0IGdyYW50ID0gYXdhaXQgcGMyLmdyYW50cy5jcmVhdGUoe1xyXG4gKiAgIGFnZW50TGFiZWw6ICdjbGF1ZGUnLFxyXG4gKiAgIHJlc291cmNlVHlwZTogJ2RiJyxcclxuICogICByZXNvdXJjZU5hbWU6ICdwb3N0Z3JlcycsXHJcbiAqICAgdHRsOiAnNW0nLFxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqL1xyXG5cclxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XHJcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XHJcblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuLy8gVHlwZXNcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVDb25uZWN0Q29uZmlnIHtcclxuICAvKiogQVBJIGtleSBmb3IgYXV0aGVudGljYXRpb24uIFJlcXVpcmVkIGZvciBodWIgQVBJIGNhbGxzOyBvcHRpb25hbCBmb3IgbWFuaWZlc3Qtb25seSB1c2FnZS4gKi9cclxuICBhcGlLZXk/OiBzdHJpbmc7XHJcbiAgLyoqIEh1YiBVUkwgKGRlZmF1bHQ6IGh0dHBzOi8vYXBpLnByaXZhdGVjb25uZWN0LmNvKSAqL1xyXG4gIGh1YlVybD86IHN0cmluZztcclxuICAvKiogQWdlbnQgSUQgKGF1dG8tZGV0ZWN0ZWQgZnJvbSBsb2NhbCBjb25maWcgaWYgbm90IHByb3ZpZGVkKSAqL1xyXG4gIGFnZW50SWQ/OiBzdHJpbmc7XHJcbiAgLyoqIERpc2FibGUgdXNhZ2UgdHJhY2tpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xyXG4gIGRpc2FibGVUcmFja2luZz86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdGFyZ2V0SG9zdDogc3RyaW5nO1xyXG4gIHRhcmdldFBvcnQ6IG51bWJlcjtcclxuICB0dW5uZWxQb3J0PzogbnVtYmVyO1xyXG4gIHByb3RvY29sOiBzdHJpbmc7XHJcbiAgc3RhdHVzOiBzdHJpbmc7XHJcbiAgYWdlbnRMYWJlbD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBZ2VudCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgaXNPbmxpbmU6IGJvb2xlYW47XHJcbiAgbGFzdFNlZW5BdDogc3RyaW5nO1xyXG4gIGNhcGFiaWxpdGllczogc3RyaW5nW107XHJcbiAgc2VydmljZXM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb24ge1xyXG4gIHNlcnZpY2U6IHN0cmluZztcclxuICBob3N0OiBzdHJpbmc7XHJcbiAgcG9ydDogbnVtYmVyO1xyXG4gIGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZztcclxuICBlbnZWYXI6IHN0cmluZztcclxuICAvKiogUHJlc2VudCB3aGVuIHVzaW5nIGEgZ3JhbnQtYmFzZWQgY29ubmVjdGlvbiAqL1xyXG4gIGdyYW50VG9rZW4/OiBzdHJpbmc7XHJcbiAgLyoqIFByZXNlbnQgd2hlbiB1c2luZyBhIGdyYW50LWJhc2VkIGNvbm5lY3Rpb24gKi9cclxuICBncmFudEVuZHBvaW50Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgZnJvbTogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9O1xyXG4gIGNoYW5uZWw6IHN0cmluZztcclxuICB0eXBlOiBzdHJpbmc7XHJcbiAgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XHJcbiAgaXNSZWFkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGFnZW50TGFiZWw6IHN0cmluZztcclxuICByZXNvdXJjZVR5cGU6IHN0cmluZztcclxuICByZXNvdXJjZU5hbWU6IHN0cmluZztcclxuICBzY29wZTogc3RyaW5nO1xyXG4gIHRva2VuUHJlZml4Pzogc3RyaW5nO1xyXG4gIHBlcnNpc3RlbnQ6IGJvb2xlYW47XHJcbiAgZXhwaXJlc0F0OiBzdHJpbmcgfCBudWxsO1xyXG4gIGV4cGlyZXNJbk1pbnV0ZXM/OiBudW1iZXIgfCBudWxsO1xyXG4gIHRva2VuPzogc3RyaW5nO1xyXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50Q3JlYXRlT3B0aW9ucyB7XHJcbiAgYWdlbnRMYWJlbDogc3RyaW5nO1xyXG4gIHJlc291cmNlVHlwZTogJ2RiJyB8ICdhcGknIHwgJ3BhdGgnO1xyXG4gIHJlc291cmNlTmFtZTogc3RyaW5nO1xyXG4gIHNjb3BlPzogJ3JlYWQtb25seScgfCAnZnVsbCc7XHJcbiAgLyoqIER1cmF0aW9uIHN0cmluZzogNjBzLCA1bSwgMWgsIDFkLiBPbWl0IGZvciBwZXJzaXN0ZW50IGdyYW50LiAqL1xyXG4gIHR0bD86IHN0cmluZztcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIE1hbmlmZXN0IFR5cGVzXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNvbnN0IFJFU09VUkNFX1RZUEVTID0gWydwb3N0Z3JlcycsICdteXNxbCcsICdyZWRpcycsICdodHRwJywgJ2dlbmVyaWMtdGNwJ10gYXMgY29uc3Q7XHJcbmV4cG9ydCB0eXBlIFJlc291cmNlVHlwZSA9IHR5cGVvZiBSRVNPVVJDRV9UWVBFU1tudW1iZXJdO1xyXG5cclxuZXhwb3J0IGNvbnN0IEFDQ0VTU19NT0RFUyA9IFsndGNwJywgJ2h0dHAnXSBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgQWNjZXNzTW9kZSA9IHR5cGVvZiBBQ0NFU1NfTU9ERVNbbnVtYmVyXTtcclxuXHJcbmV4cG9ydCBjb25zdCBUUkFOU1BPUlRfTU9ERVMgPSBbJ2RpcmVjdCcsICdodWInXSBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgVHJhbnNwb3J0VmlhID0gdHlwZW9mIFRSQU5TUE9SVF9NT0RFU1tudW1iZXJdO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdFJlc291cmNlQ29uZmlnIHtcclxuICB0eXBlOiBSZXNvdXJjZVR5cGU7XHJcbiAgaG9zdD86IHN0cmluZztcclxuICBwb3J0PzogbnVtYmVyO1xyXG4gIHRhcmdldEhvc3Q/OiBzdHJpbmc7XHJcbiAgdGFyZ2V0UG9ydD86IG51bWJlcjtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgYWNjZXNzOiB7IG1vZGU6IEFjY2Vzc01vZGU7IHZpYT86IFRyYW5zcG9ydFZpYSB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1hbmlmZXN0UmVzb3VyY2Uge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0eXBlOiBSZXNvdXJjZVR5cGU7XHJcbiAgaG9zdDogc3RyaW5nO1xyXG4gIHBvcnQ6IG51bWJlcjtcclxuICBjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmc7XHJcbiAgZW52VmFyOiBzdHJpbmc7XHJcbiAgYWNjZXNzTW9kZTogQWNjZXNzTW9kZTtcclxuICB2aWE6IFRyYW5zcG9ydFZpYTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIE1hbmlmZXN0IFBhcnNpbmdcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5jb25zdCBNQU5JRkVTVF9GSUxFTkFNRVMgPSBbXHJcbiAgJ3Bjb25uZWN0LnltbCcsXHJcbiAgJ3Bjb25uZWN0LnlhbWwnLFxyXG4gICdwY29ubmVjdC5qc29uJyxcclxuICAnLnBjb25uZWN0LnltbCcsXHJcbiAgJy5wY29ubmVjdC55YW1sJyxcclxuICAnLnBjb25uZWN0Lmpzb24nLFxyXG5dO1xyXG5cclxuY29uc3QgREVGQVVMVF9QT1JUUzogUmVjb3JkPFJlc291cmNlVHlwZSwgbnVtYmVyPiA9IHtcclxuICBwb3N0Z3JlczogNTQzMixcclxuICBteXNxbDogMzMwNixcclxuICByZWRpczogNjM3OSxcclxuICBodHRwOiA4MCxcclxuICAnZ2VuZXJpYy10Y3AnOiAwLFxyXG59O1xyXG5cclxuY29uc3QgUFJPVE9DT0xfU0NIRU1FUzogUmVjb3JkPFJlc291cmNlVHlwZSwgc3RyaW5nPiA9IHtcclxuICBwb3N0Z3JlczogJ3Bvc3RncmVzJyxcclxuICBteXNxbDogJ215c3FsJyxcclxuICByZWRpczogJ3JlZGlzJyxcclxuICBodHRwOiAnaHR0cCcsXHJcbiAgJ2dlbmVyaWMtdGNwJzogJ3RjcCcsXHJcbn07XHJcblxyXG5jb25zdCBFTlZfVkFSX01BUDogUmVjb3JkPFJlc291cmNlVHlwZSwgc3RyaW5nPiA9IHtcclxuICBwb3N0Z3JlczogJ0RBVEFCQVNFX1VSTCcsXHJcbiAgbXlzcWw6ICdEQVRBQkFTRV9VUkwnLFxyXG4gIHJlZGlzOiAnUkVESVNfVVJMJyxcclxuICBodHRwOiAnQVBJX1VSTCcsXHJcbiAgJ2dlbmVyaWMtdGNwJzogJ1RDUF9VUkwnLFxyXG59O1xyXG5cclxuZnVuY3Rpb24gZmluZE1hbmlmZXN0KHN0YXJ0RGlyPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgbGV0IGRpciA9IHN0YXJ0RGlyIHx8IHByb2Nlc3MuY3dkKCk7XHJcblxyXG4gIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCA0OyBkZXB0aCsrKSB7XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE1BTklGRVNUX0ZJTEVOQU1FUykge1xyXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIGZpbGVuYW1lKTtcclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gZmlsZVBhdGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGlyKTtcclxuICAgIGlmIChwYXJlbnQgPT09IGRpcikgYnJlYWs7XHJcbiAgICBkaXIgPSBwYXJlbnQ7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VNYW5pZmVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0UmVzb3VyY2VDb25maWc+IHtcclxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcclxuICBsZXQgcmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuXHJcbiAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XHJcbiAgICByYXcgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByYXcgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgfVxyXG5cclxuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JyB8fCAhcmF3LnJlc291cmNlcyB8fCB0eXBlb2YgcmF3LnJlc291cmNlcyAhPT0gJ29iamVjdCcpIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc291cmNlczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RSZXNvdXJjZUNvbmZpZz4gPSB7fTtcclxuICBjb25zdCByYXdSZXNvdXJjZXMgPSByYXcucmVzb3VyY2VzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmF3UmVzb3VyY2VzKSkge1xyXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSBjb250aW51ZTtcclxuICAgIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBvYmoudHlwZSBhcyBzdHJpbmc7XHJcbiAgICBpZiAoIVJFU09VUkNFX1RZUEVTLmluY2x1ZGVzKHR5cGUgYXMgUmVzb3VyY2VUeXBlKSkgY29udGludWU7XHJcblxyXG4gICAgY29uc3QgYWNjZXNzT2JqID0gKG9iai5hY2Nlc3MgJiYgdHlwZW9mIG9iai5hY2Nlc3MgPT09ICdvYmplY3QnKVxyXG4gICAgICA/IG9iai5hY2Nlc3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICAgICAgOiB7IG1vZGU6ICd0Y3AnIH07XHJcblxyXG4gICAgcmVzb3VyY2VzW25hbWVdID0ge1xyXG4gICAgICB0eXBlOiB0eXBlIGFzIFJlc291cmNlVHlwZSxcclxuICAgICAgaG9zdDogdHlwZW9mIG9iai5ob3N0ID09PSAnc3RyaW5nJyA/IG9iai5ob3N0IDogdW5kZWZpbmVkLFxyXG4gICAgICBwb3J0OiB0eXBlb2Ygb2JqLnBvcnQgPT09ICdudW1iZXInID8gb2JqLnBvcnQgOiB1bmRlZmluZWQsXHJcbiAgICAgIHRhcmdldEhvc3Q6IHR5cGVvZiBvYmoudGFyZ2V0SG9zdCA9PT0gJ3N0cmluZycgPyBvYmoudGFyZ2V0SG9zdCA6IHVuZGVmaW5lZCxcclxuICAgICAgdGFyZ2V0UG9ydDogdHlwZW9mIG9iai50YXJnZXRQb3J0ID09PSAnbnVtYmVyJyA/IG9iai50YXJnZXRQb3J0IDogdW5kZWZpbmVkLFxyXG4gICAgICB1cmw6IHR5cGVvZiBvYmoudXJsID09PSAnc3RyaW5nJyA/IG9iai51cmwgOiB1bmRlZmluZWQsXHJcbiAgICAgIGFjY2Vzczoge1xyXG4gICAgICAgIG1vZGU6IChBQ0NFU1NfTU9ERVMuaW5jbHVkZXMoYWNjZXNzT2JqLm1vZGUgYXMgQWNjZXNzTW9kZSlcclxuICAgICAgICAgID8gYWNjZXNzT2JqLm1vZGVcclxuICAgICAgICAgIDogJ3RjcCcpIGFzIEFjY2Vzc01vZGUsXHJcbiAgICAgICAgdmlhOiAoVFJBTlNQT1JUX01PREVTLmluY2x1ZGVzKGFjY2Vzc09iai52aWEgYXMgVHJhbnNwb3J0VmlhKVxyXG4gICAgICAgICAgPyBhY2Nlc3NPYmoudmlhXHJcbiAgICAgICAgICA6ICdkaXJlY3QnKSBhcyBUcmFuc3BvcnRWaWEsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc291cmNlcztcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzb2x2ZU1hbmlmZXN0UmVzb3VyY2UobmFtZTogc3RyaW5nLCBjb25maWc6IE1hbmlmZXN0UmVzb3VyY2VDb25maWcpOiBNYW5pZmVzdFJlc291cmNlIHtcclxuICBsZXQgaG9zdDogc3RyaW5nO1xyXG4gIGxldCBwb3J0OiBudW1iZXI7XHJcblxyXG4gIGlmIChjb25maWcudHlwZSA9PT0gJ2h0dHAnICYmIGNvbmZpZy51cmwpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwoY29uZmlnLnVybCk7XHJcbiAgICAgIGhvc3QgPSBwYXJzZWQuaG9zdG5hbWU7XHJcbiAgICAgIHBvcnQgPSBwYXJzZWQucG9ydCA/IHBhcnNlSW50KHBhcnNlZC5wb3J0LCAxMCkgOiAocGFyc2VkLnByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICBob3N0ID0gY29uZmlnLmhvc3QgfHwgY29uZmlnLnRhcmdldEhvc3QgfHwgJ2xvY2FsaG9zdCc7XHJcbiAgICAgIHBvcnQgPSBjb25maWcucG9ydCB8fCBjb25maWcudGFyZ2V0UG9ydCB8fCBERUZBVUxUX1BPUlRTW2NvbmZpZy50eXBlXTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgaG9zdCA9IGNvbmZpZy50YXJnZXRIb3N0IHx8IGNvbmZpZy5ob3N0IHx8ICdsb2NhbGhvc3QnO1xyXG4gICAgcG9ydCA9IGNvbmZpZy50YXJnZXRQb3J0IHx8IGNvbmZpZy5wb3J0IHx8IERFRkFVTFRfUE9SVFNbY29uZmlnLnR5cGVdO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2NoZW1lID0gUFJPVE9DT0xfU0NIRU1FU1tjb25maWcudHlwZV07XHJcbiAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IGAke3NjaGVtZX06Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG5cclxuICBjb25zdCBlbnZWYXIgPSBFTlZfVkFSX01BUFtjb25maWcudHlwZV1cclxuICAgIHx8IGAke25hbWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKC8tL2csICdfJyl9X1VSTGA7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBuYW1lLFxyXG4gICAgdHlwZTogY29uZmlnLnR5cGUsXHJcbiAgICBob3N0LFxyXG4gICAgcG9ydCxcclxuICAgIGNvbm5lY3Rpb25TdHJpbmcsXHJcbiAgICBlbnZWYXIsXHJcbiAgICBhY2Nlc3NNb2RlOiBjb25maWcuYWNjZXNzLm1vZGUsXHJcbiAgICB2aWE6IGNvbmZpZy5hY2Nlc3MudmlhIHx8ICdkaXJlY3QnLFxyXG4gIH07XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBUcmFja2luZ1xyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmZ1bmN0aW9uIHRyYWNrU2RrVXNhZ2UoaHViVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgb3M6IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3MucGxhdGZvcm0gOiAnYnJvd3NlcicsXHJcbiAgICBhcmNoOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnID8gJ2FybTY0JyA6ICd4NjQnKSA6ICd1bmtub3duJyxcclxuICAgIHZlcnNpb246ICdzZGsnLFxyXG4gICAgc291cmNlOiAnc2RrJyxcclxuICB9KTtcclxuXHJcbiAgZmV0Y2goYCR7aHViVXJsfS92MS9ldmVudHMvaW5zdGFsbGAsIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICBib2R5OiBkYXRhLFxyXG4gIH0pLmNhdGNoKCgpID0+IHt9KTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIEFnZW50IElEIERldGVjdGlvblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmNvbnN0IENPTkZJR19QQVRIID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5wcml2YXRlLWNvbm5lY3QnLCAnY29uZmlnLmpzb24nKTtcclxuXHJcbi8qKlxyXG4gKiBEZXRlY3QgdGhlIGFnZW50IElEIGZyb20gbG9jYWwgY29uZmlnIG9yIGVudmlyb25tZW50LlxyXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBhZ2VudCBpcyBjb25maWd1cmVkIOKAlCBjYWxsZXJzIHRoYXQgbmVlZCBhbiBhZ2VudCBJRFxyXG4gKiBzaG91bGQgc3VyZmFjZSBhIGNsZWFyIGVycm9yIHJhdGhlciB0aGFuIHVzaW5nIGEgZmFrZSBvbmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZXRlY3RBZ2VudElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgLy8gMS4gRW52aXJvbm1lbnQgdmFyaWFibGVzIChoaWdoZXN0IHByaW9yaXR5IOKAlCB1c2VmdWwgaW4gQ0kpXHJcbiAgY29uc3QgZW52SWQgPSBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BR0VOVF9JRCB8fCBwcm9jZXNzLmVudi5DT05ORUNUX0FHRU5UX0lEO1xyXG4gIGlmIChlbnZJZCkgcmV0dXJuIGVudklkO1xyXG5cclxuICAvLyAyLiBMb2NhbCBjb25maWcgZmlsZSAofi8ucHJpdmF0ZS1jb25uZWN0L2NvbmZpZy5qc29uKVxyXG4gIHRyeSB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhDT05GSUdfUEFUSCkpIHtcclxuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKENPTkZJR19QQVRILCAndXRmLTgnKTtcclxuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShyYXcpO1xyXG4gICAgICBpZiAoY29uZmlnLmFnZW50SWQgJiYgdHlwZW9mIGNvbmZpZy5hZ2VudElkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBjb25maWcuYWdlbnRJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gY2F0Y2gge1xyXG4gICAgLy8gQ29uZmlnIHVucmVhZGFibGUgb3IgbWFsZm9ybWVkIOKAlCBmYWxsIHRocm91Z2hcclxuICB9XHJcblxyXG4gIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBBZ2VudHMgQVBJXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW50c0FQSSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxyXG5cclxuICBhc3luYyBsaXN0KG9wdGlvbnM/OiB7IG9ubGluZU9ubHk/OiBib29sZWFuIH0pOiBQcm9taXNlPEFnZW50W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9hZ2VudHMvb3JjaGVzdHJhdGlvbicpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIGxldCBhZ2VudHMgPSBkYXRhLmFnZW50cyB8fCBbXTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8ub25saW5lT25seSkge1xyXG4gICAgICBhZ2VudHMgPSBhZ2VudHMuZmlsdGVyKChhOiBhbnkpID0+IGEuaXNPbmxpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhZ2VudHMubWFwKChhOiBhbnkpID0+ICh7XHJcbiAgICAgIGlkOiBhLmlkLFxyXG4gICAgICBuYW1lOiBhLm5hbWUsXHJcbiAgICAgIGxhYmVsOiBhLmxhYmVsLFxyXG4gICAgICBpc09ubGluZTogYS5pc09ubGluZSxcclxuICAgICAgbGFzdFNlZW5BdDogYS5sYXN0U2VlbkF0LFxyXG4gICAgICBjYXBhYmlsaXRpZXM6IGEuY2FwYWJpbGl0aWVzPy5tYXAoKGM6IGFueSkgPT4gYy5uYW1lKSB8fCBbXSxcclxuICAgICAgc2VydmljZXM6IGEuc2VydmljZXM/Lm1hcCgoczogYW55KSA9PiBzLm5hbWUpIHx8IFtdLFxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZEJ5Q2FwYWJpbGl0eShjYXBhYmlsaXR5OiBzdHJpbmcpOiBQcm9taXNlPEFnZW50W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvYnktY2FwYWJpbGl0eS8ke2VuY29kZVVSSUNvbXBvbmVudChjYXBhYmlsaXR5KX1gKTtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICByZXR1cm4gZGF0YS5hZ2VudHMgfHwgW107XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWdpc3RlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vY2FwYWJpbGl0aWVzYCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjYXBhYmlsaXRpZXMgfSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxyXG4gICAgdG9BZ2VudElkOiBzdHJpbmcsXHJcbiAgICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcclxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHR5cGU/OiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JyB9XHJcbiAgKTogUHJvbWlzZTx7IG1lc3NhZ2VJZDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3NlbmRgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRvQWdlbnRJZCwgcGF5bG9hZCwgLi4ub3B0aW9ucyB9KSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGJyb2FkY2FzdChcclxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgb3B0aW9ucz86IHsgY2hhbm5lbD86IHN0cmluZyB9XHJcbiAgKTogUHJvbWlzZTx7IHNlbnQ6IG51bWJlciB9PiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcy9icm9hZGNhc3RgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBheWxvYWQsIC4uLm9wdGlvbnMgfSksXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRNZXNzYWdlcyhvcHRpb25zPzogeyBjaGFubmVsPzogc3RyaW5nOyB1bnJlYWRPbmx5PzogYm9vbGVhbjsgbGltaXQ/OiBudW1iZXIgfSk6IFByb21pc2U8TWVzc2FnZVtdPiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgIGlmIChvcHRpb25zPy5jaGFubmVsKSBwYXJhbXMuc2V0KCdjaGFubmVsJywgb3B0aW9ucy5jaGFubmVsKTtcclxuICAgIGlmIChvcHRpb25zPy51bnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ3VucmVhZE9ubHknLCBTdHJpbmcob3B0aW9ucy51bnJlYWRPbmx5KSk7XHJcbiAgICBpZiAob3B0aW9ucz8ubGltaXQpIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKG9wdGlvbnMubGltaXQpKTtcclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vbWVzc2FnZXM/JHtwYXJhbXN9YCk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEubWVzc2FnZXMgfHwgW107XHJcbiAgfVxyXG5cclxuICBhc3luYyBtYXJrUmVhZChtZXNzYWdlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWdlbnRJZCA9IHRoaXMuY2xpZW50LnJlcXVpcmVBZ2VudElkKCk7XHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3JlYWRgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG1lc3NhZ2VJZHMgfSksXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBTZXJ2aWNlcyBBUElcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZXNBUEkge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cclxuXHJcbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFNlcnZpY2VbXT4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL3NlcnZpY2VzJyk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8U2VydmljZSB8IG51bGw+IHtcclxuICAgIGNvbnN0IHNlcnZpY2VzID0gYXdhaXQgdGhpcy5saXN0KCk7XHJcbiAgICByZXR1cm4gc2VydmljZXMuZmluZChzID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29ubmVjdGlvbiBkZXRhaWxzIGZvciBhIHNlcnZpY2UuXHJcbiAgICpcclxuICAgKiBJZiBgZ3JhbnRUb2tlbmAgaXMgcHJvdmlkZWQsIHJldHVybnMgYSBwcm94aWVkIGNvbm5lY3Rpb24gdmlhIHRoZSBodWInc1xyXG4gICAqIGdyYW50IGVuZHBvaW50IGluc3RlYWQgb2YgYXNzdW1pbmcgYSBsb2NhbCB0dW5uZWwuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBncmFudFRva2VuPzogc3RyaW5nIH0pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcclxuICAgIGlmIChvcHRpb25zPy5ncmFudFRva2VuKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEdyYW50Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSwgb3B0aW9ucy5ncmFudFRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5nZXQoc2VydmljZU5hbWUpO1xyXG4gICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VydmljZSBcIiR7c2VydmljZU5hbWV9XCIgbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9ydCA9IHNlcnZpY2UudHVubmVsUG9ydCB8fCBzZXJ2aWNlLnRhcmdldFBvcnQ7XHJcbiAgICBjb25zdCBob3N0ID0gJ2xvY2FsaG9zdCc7XHJcblxyXG4gICAgbGV0IGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZztcclxuICAgIGxldCBlbnZWYXI6IHN0cmluZztcclxuXHJcbiAgICBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA1NDMyIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdwb3N0Z3JlcycpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBwb3N0Z3JlczovLyR7aG9zdH06JHtwb3J0fS9wb3N0Z3Jlc2A7XHJcbiAgICAgIGVudlZhciA9ICdEQVRBQkFTRV9VUkwnO1xyXG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDMzMDYgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ215c3FsJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYG15c3FsOi8vJHtob3N0fToke3BvcnR9YDtcclxuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XHJcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gNjM3OSB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAncmVkaXMnKSB7XHJcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgcmVkaXM6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnUkVESVNfVVJMJztcclxuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSAyNzAxNyB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbW9uZ29kYicpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBtb25nb2RiOi8vJHtob3N0fToke3BvcnR9YDtcclxuICAgICAgZW52VmFyID0gJ01PTkdPREJfVVJJJztcclxuICAgIH0gZWxzZSBpZiAoc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHAnIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdodHRwcycpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBodHRwOi8vJHtob3N0fToke3BvcnR9YDtcclxuICAgICAgZW52VmFyID0gJ0FQSV9VUkwnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGB0Y3A6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSBgJHtzZXJ2aWNlTmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoLy0vZywgJ18nKX1fVVJMYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSwgaG9zdCwgcG9ydCwgY29ubmVjdGlvblN0cmluZywgZW52VmFyIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyYW50Q29ubmVjdGlvbihzZXJ2aWNlTmFtZTogc3RyaW5nLCBncmFudFRva2VuOiBzdHJpbmcpOiBDb25uZWN0aW9uIHtcclxuICAgIGNvbnN0IGh1YlVybCA9IHRoaXMuY2xpZW50Lmh1YlVybDtcclxuICAgIGNvbnN0IGdyYW50RW5kcG9pbnQgPSBgJHtodWJVcmx9L2dyYW50LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2VOYW1lKX1gO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNlcnZpY2U6IHNlcnZpY2VOYW1lLFxyXG4gICAgICBob3N0OiBuZXcgVVJMKGh1YlVybCkuaG9zdG5hbWUsXHJcbiAgICAgIHBvcnQ6IG5ldyBVUkwoaHViVXJsKS5wb3J0ID8gcGFyc2VJbnQobmV3IFVSTChodWJVcmwpLnBvcnQsIDEwKSA6IDQ0MyxcclxuICAgICAgY29ubmVjdGlvblN0cmluZzogZ3JhbnRFbmRwb2ludCxcclxuICAgICAgZW52VmFyOiAnR1JBTlRfVVJMJyxcclxuICAgICAgZ3JhbnRUb2tlbixcclxuICAgICAgZ3JhbnRFbmRwb2ludCxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuLy8gR3JhbnRzIEFQSVxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmFudHNBUEkge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgdGltZS1saW1pdGVkIGFjY2VzcyBncmFudCBmb3IgYW4gQUkgYWdlbnQgb3IgZXh0ZXJuYWwgY29uc3VtZXIuXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IEdyYW50Q3JlYXRlT3B0aW9ucyk6IFByb21pc2U8R3JhbnQ+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9ncmFudHMnLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvcHRpb25zKSxcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIHJldHVybiBkYXRhLmdyYW50O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGlzdCBhY3RpdmUgZ3JhbnRzIGluIHRoZSB3b3Jrc3BhY2UuXHJcbiAgICovXHJcbiAgYXN5bmMgbGlzdChvcHRpb25zPzogeyBpbmNsdWRlRXhwaXJlZD86IGJvb2xlYW4gfSk6IFByb21pc2U8R3JhbnRbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xyXG4gICAgaWYgKG9wdGlvbnM/LmluY2x1ZGVFeHBpcmVkKSBwYXJhbXMuc2V0KCdpbmNsdWRlRXhwaXJlZCcsICd0cnVlJyk7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvZ3JhbnRzPyR7cGFyYW1zfWApO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIHJldHVybiBkYXRhLmdyYW50cyB8fCBbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldm9rZSBhbiBhY3RpdmUgZ3JhbnQgaW1tZWRpYXRlbHkuXHJcbiAgICovXHJcbiAgYXN5bmMgcmV2b2tlKGdyYW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9ncmFudHMvJHtncmFudElkfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIGEgZ3JhbnQgdG9rZW4gKHB1YmxpYyBlbmRwb2ludCDigJQgbm8gQVBJIGtleSByZXF1aXJlZCkuXHJcbiAgICogUmV0dXJucyB0aGUgZ3JhbnQgaWYgdmFsaWQsIG51bGwgb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGFzeW5jIHZhbGlkYXRlKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEdyYW50IHwgbnVsbD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5jbGllbnQuaHViVXJsfS92MS9ncmFudHMvdmFsaWRhdGVgO1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdG9rZW4gfSksXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSByZXR1cm4gbnVsbDtcclxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgcmV0dXJuIGRhdGEudmFsaWQgPyBkYXRhLmdyYW50IDogbnVsbDtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBNYWluIENsaWVudFxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmV4cG9ydCBjbGFzcyBQcml2YXRlQ29ubmVjdCB7XHJcbiAgcHJpdmF0ZSBjb25maWc6IHsgYXBpS2V5Pzogc3RyaW5nOyBodWJVcmw6IHN0cmluZzsgYWdlbnRJZD86IHN0cmluZyB9O1xyXG4gIHByaXZhdGUgbWFuaWZlc3Q6IE1hcDxzdHJpbmcsIE1hbmlmZXN0UmVzb3VyY2U+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgbWFuaWZlc3RQYXRoPzogc3RyaW5nO1xyXG5cclxuICAvKiogQWdlbnRzIEFQSSBmb3IgZGlzY292ZXJ5IGFuZCBvcmNoZXN0cmF0aW9uICovXHJcbiAgcHVibGljIGFnZW50czogQWdlbnRzQVBJO1xyXG5cclxuICAvKiogU2VydmljZXMgQVBJIGZvciBjb25uZWN0aW5nIHRvIHNlcnZpY2VzICovXHJcbiAgcHVibGljIHNlcnZpY2VzOiBTZXJ2aWNlc0FQSTtcclxuXHJcbiAgLyoqIEdyYW50cyBBUEkgZm9yIG1hbmFnaW5nIHNjb3BlZCBhY2Nlc3MgdG9rZW5zICh0aW1lLWxpbWl0ZWQgb3IgcGVyc2lzdGVudCkgKi9cclxuICBwdWJsaWMgZ3JhbnRzOiBHcmFudHNBUEk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUHJpdmF0ZUNvbm5lY3RDb25maWcgPSB7fSkge1xyXG4gICAgdGhpcy5jb25maWcgPSB7XHJcbiAgICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcclxuICAgICAgaHViVXJsOiBjb25maWcuaHViVXJsIHx8ICdodHRwczovL2FwaS5wcml2YXRlY29ubmVjdC5jbycsXHJcbiAgICAgIGFnZW50SWQ6IGNvbmZpZy5hZ2VudElkIHx8IGRldGVjdEFnZW50SWQoKSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5hZ2VudHMgPSBuZXcgQWdlbnRzQVBJKHRoaXMpO1xyXG4gICAgdGhpcy5zZXJ2aWNlcyA9IG5ldyBTZXJ2aWNlc0FQSSh0aGlzKTtcclxuICAgIHRoaXMuZ3JhbnRzID0gbmV3IEdyYW50c0FQSSh0aGlzKTtcclxuXHJcbiAgICBpZiAoIWNvbmZpZy5kaXNhYmxlVHJhY2tpbmcpIHtcclxuICAgICAgdHJhY2tTZGtVc2FnZSh0aGlzLmNvbmZpZy5odWJVcmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbiAgLy8gTWFuaWZlc3QgQVBJIOKAlCB0aGUgcHJpbWFyeSB3YXkgdG8gdXNlIHRoZSBTREtcclxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBhIHBjb25uZWN0LnltbCBtYW5pZmVzdCBhbmQgcmV0dXJuIGEgY29uZmlndXJlZCBjbGllbnQuXHJcbiAgICpcclxuICAgKiBBdXRvLWRpc2NvdmVycyBwY29ubmVjdC55bWwgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IChvciBwYXJlbnRzKSBpZiBub1xyXG4gICAqIHBhdGggaXMgZ2l2ZW4uIFBhc3MgYSBjb25maWcgdG8gYWxzbyBlbmFibGUgaHViIEFQSSBhY2Nlc3MuXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBjb25zdCBwYyA9IFByaXZhdGVDb25uZWN0LmZyb21NYW5pZmVzdCgpO1xyXG4gICAqIGNvbnN0IGRiID0gcGMucmVzb3VyY2UoJ3N0YWdpbmctZGInKTtcclxuICAgKiBjb25zb2xlLmxvZyhkYi5jb25uZWN0aW9uU3RyaW5nKTsgLy8gcG9zdGdyZXM6Ly9pbnRlcm5hbC1kYjo1NDMyXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgc3RhdGljIGZyb21NYW5pZmVzdChcclxuICAgIG1hbmlmZXN0UGF0aD86IHN0cmluZyxcclxuICAgIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnLFxyXG4gICk6IFByaXZhdGVDb25uZWN0IHtcclxuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IG1hbmlmZXN0UGF0aFxyXG4gICAgICA/IHBhdGgucmVzb2x2ZShtYW5pZmVzdFBhdGgpXHJcbiAgICAgIDogZmluZE1hbmlmZXN0KCk7XHJcblxyXG4gICAgaWYgKCFyZXNvbHZlZFBhdGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdObyBwY29ubmVjdC55bWwgZm91bmQuIENyZWF0ZSBvbmUgaW4geW91ciBwcm9qZWN0IHJvb3Q6XFxuXFxuJyArXHJcbiAgICAgICAgJyAgcmVzb3VyY2VzOlxcbicgK1xyXG4gICAgICAgICcgICAgc3RhZ2luZy1kYjpcXG4nICtcclxuICAgICAgICAnICAgICAgdHlwZTogcG9zdGdyZXNcXG4nICtcclxuICAgICAgICAnICAgICAgaG9zdDogaW50ZXJuYWwtZGJcXG4nICtcclxuICAgICAgICAnICAgICAgcG9ydDogNTQzMlxcbicgK1xyXG4gICAgICAgICcgICAgICBhY2Nlc3M6XFxuJyArXHJcbiAgICAgICAgJyAgICAgICAgbW9kZTogdGNwXFxuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFByaXZhdGVDb25uZWN0KGNvbmZpZyB8fCB7IGRpc2FibGVUcmFja2luZzogdHJ1ZSB9KTtcclxuICAgIGluc3RhbmNlLm1hbmlmZXN0UGF0aCA9IHJlc29sdmVkUGF0aDtcclxuXHJcbiAgICBjb25zdCByYXdSZXNvdXJjZXMgPSBwYXJzZU1hbmlmZXN0RmlsZShyZXNvbHZlZFBhdGgpO1xyXG4gICAgZm9yIChjb25zdCBbbmFtZSwgcmF3Q29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhyYXdSZXNvdXJjZXMpKSB7XHJcbiAgICAgIGluc3RhbmNlLm1hbmlmZXN0LnNldChuYW1lLCByZXNvbHZlTWFuaWZlc3RSZXNvdXJjZShuYW1lLCByYXdDb25maWcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYSByZXNvdXJjZSBkZWNsYXJlZCBpbiBwY29ubmVjdC55bWwgYnkgbmFtZS5cclxuICAgKlxyXG4gICAqIFJldHVybnMgaXRzIHR5cGUsIGhvc3QsIHBvcnQsIGNvbm5lY3Rpb24gc3RyaW5nLCBhbmQgc3VnZ2VzdGVkIGVudiB2YXIuXHJcbiAgICogV2hlbiBgY29ubmVjdCBkZXZgIGlzIHJ1bm5pbmcsIHRoZSBjb25uZWN0aW9uIHN0cmluZyBwb2ludHMgdG8gYSBsaXZlXHJcbiAgICogbG9jYWwgdHVubmVsLlxyXG4gICAqL1xyXG4gIHJlc291cmNlKG5hbWU6IHN0cmluZyk6IE1hbmlmZXN0UmVzb3VyY2Uge1xyXG4gICAgY29uc3QgciA9IHRoaXMubWFuaWZlc3QuZ2V0KG5hbWUpO1xyXG4gICAgaWYgKCFyKSB7XHJcbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IEFycmF5LmZyb20odGhpcy5tYW5pZmVzdC5rZXlzKCkpO1xyXG4gICAgICBjb25zdCBtc2cgPSBhdmFpbGFibGUubGVuZ3RoXHJcbiAgICAgICAgPyBgQXZhaWxhYmxlOiAke2F2YWlsYWJsZS5qb2luKCcsICcpfWBcclxuICAgICAgICA6ICdObyByZXNvdXJjZXMgbG9hZGVkLiBEaWQgeW91IGNhbGwgUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCk/JztcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXNvdXJjZSBcIiR7bmFtZX1cIiBub3QgZm91bmQuICR7bXNnfWApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0IGFsbCByZXNvdXJjZXMgZGVjbGFyZWQgaW4gdGhlIGxvYWRlZCBtYW5pZmVzdC5cclxuICAgKi9cclxuICByZXNvdXJjZXMoKTogTWFuaWZlc3RSZXNvdXJjZVtdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubWFuaWZlc3QudmFsdWVzKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgYSBgLmVudmAtY29tcGF0aWJsZSBibG9jayBmb3IgYWxsIG1hbmlmZXN0IHJlc291cmNlcy5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAqIGNvbnN0IHBjID0gUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCk7XHJcbiAgICogY29uc29sZS5sb2cocGMuZW52QmxvY2soKSk7XHJcbiAgICogLy8gREFUQUJBU0VfVVJMPXBvc3RncmVzOi8vaW50ZXJuYWwtZGI6NTQzMlxyXG4gICAqIC8vIFJFRElTX1VSTD1yZWRpczovL3JlZGlzLmludGVybmFsOjYzNzlcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBlbnZCbG9jaygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzKClcclxuICAgICAgLm1hcChyID0+IGAke3IuZW52VmFyfT0ke3IuY29ubmVjdGlvblN0cmluZ31gKVxyXG4gICAgICAuam9pbignXFxuJyk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICAvLyBFeGlzdGluZyBBUElzXHJcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBUaGUgcmVzb2x2ZWQgYWdlbnQgSUQsIG9yIHVuZGVmaW5lZCBpZiBub3QgY29uZmlndXJlZC4gKi9cclxuICBnZXQgYWdlbnRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFnZW50SWQ7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGh1YiBVUkwgdGhpcyBjbGllbnQgaXMgY29ubmVjdGVkIHRvLiAqL1xyXG4gIGdldCBodWJVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5odWJVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG9ydGhhbmQ6IGdldCBjb25uZWN0aW9uIGRldGFpbHMgZm9yIGEgc2VydmljZS5cclxuICAgKiBQYXNzIGBncmFudFRva2VuYCB0byBjb25uZWN0IHZpYSB0aGUgZ3JhbnQgcHJveHkgaW5zdGVhZCBvZiBhIGxvY2FsIHR1bm5lbC5cclxuICAgKi9cclxuICBhc3luYyBjb25uZWN0KHNlcnZpY2VOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGdyYW50VG9rZW4/OiBzdHJpbmcgfSk6IFByb21pc2U8Q29ubmVjdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXMuZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBhZ2VudCBJRCBvciB0aHJvd3MgaWYgbm90IGNvbmZpZ3VyZWQuXHJcbiAgICogVXNlZCBieSBBUElzIHRoYXQgcmVxdWlyZSBhbiBhdXRoZW50aWNhdGVkIGFnZW50IGlkZW50aXR5LlxyXG4gICAqL1xyXG4gIHJlcXVpcmVBZ2VudElkKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmFnZW50SWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdBZ2VudCBJRCBub3QgZm91bmQuIEVpdGhlcjpcXG4nICtcclxuICAgICAgICAnICAxLiBSdW4gXCJjb25uZWN0IHVwXCIgdG8gcmVnaXN0ZXIgdGhpcyBtYWNoaW5lLCBvclxcbicgK1xyXG4gICAgICAgICcgIDIuIFNldCBQUklWQVRFQ09OTkVDVF9BR0VOVF9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3JcXG4nICtcclxuICAgICAgICAnICAzLiBQYXNzIGFnZW50SWQgaW4gdGhlIFByaXZhdGVDb25uZWN0IGNvbnN0cnVjdG9yLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hZ2VudElkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlcXVpcmVzIGFuIEFQSSBrZXkgb3IgdGhyb3dzLiAqL1xyXG4gIHByaXZhdGUgcmVxdWlyZUFwaUtleSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5hcGlLZXkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdBUEkga2V5IHJlcXVpcmVkIGZvciBodWIgQVBJIGNhbGxzLiBFaXRoZXI6XFxuJyArXHJcbiAgICAgICAgJyAgMS4gU2V0IFBSSVZBVEVDT05ORUNUX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yXFxuJyArXHJcbiAgICAgICAgJyAgMi4gUGFzcyBhcGlLZXkgaW4gdGhlIGNvbmZpZy4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXBpS2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIGZldGNoIHdpdGggQVBJIGtleSBhdXRoLiAqL1xyXG4gIGFzeW5jIGZldGNoKHVybFBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgYXBpS2V5ID0gdGhpcy5yZXF1aXJlQXBpS2V5KCk7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5odWJVcmx9JHt1cmxQYXRofWA7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ3gtYXBpLWtleSc6IGFwaUtleSxcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnMsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IG1lc3NhZ2U6ICdVbmtub3duIGVycm9yJyB9KSk7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlIHx8IGBSZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJpdmF0ZUNvbm5lY3Q7XHJcblxyXG4vKiogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHF1aWNrIG9uZS1vZmYgY29ubmVjdGlvbnMgdmlhIHRoZSBodWIgQVBJLiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdChcclxuICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxyXG4gIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnICYgeyBncmFudFRva2VuPzogc3RyaW5nIH0sXHJcbik6IFByb21pc2U8Q29ubmVjdGlvbj4ge1xyXG4gIGNvbnN0IGFwaUtleSA9IGNvbmZpZz8uYXBpS2V5IHx8IHByb2Nlc3MuZW52LlBSSVZBVEVDT05ORUNUX0FQSV9LRVk7XHJcbiAgaWYgKCFhcGlLZXkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQVBJIGtleSByZXF1aXJlZC4gU2V0IFBSSVZBVEVDT05ORUNUX0FQSV9LRVkgb3IgcGFzcyBjb25maWcuYXBpS2V5Jyk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBjbGllbnQgPSBuZXcgUHJpdmF0ZUNvbm5lY3QoeyAuLi5jb25maWcsIGFwaUtleSB9KTtcclxuICByZXR1cm4gY2xpZW50LmNvbm5lY3Qoc2VydmljZU5hbWUsIHsgZ3JhbnRUb2tlbjogY29uZmlnPy5ncmFudFRva2VuIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogTG9hZCBwY29ubmVjdC55bWwgYW5kIGdldCBhIHJlc291cmNlIGJ5IG5hbWUuXHJcbiAqIFNob3J0aGFuZCBmb3IgYFByaXZhdGVDb25uZWN0LmZyb21NYW5pZmVzdCgpLnJlc291cmNlKG5hbWUpYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWFuaWZlc3QobWFuaWZlc3RQYXRoPzogc3RyaW5nKTogUHJpdmF0ZUNvbm5lY3Qge1xyXG4gIHJldHVybiBQcml2YXRlQ29ubmVjdC5mcm9tTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcclxufVxyXG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@privateconnect/sdk",
|
|
3
|
-
"version": "0.7.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.7.7",
|
|
4
|
+
"description": "Define your connections in pconnect.yml. Access them from anywhere.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"files": [
|
|
@@ -14,10 +14,11 @@
|
|
|
14
14
|
},
|
|
15
15
|
"keywords": [
|
|
16
16
|
"private-connect",
|
|
17
|
+
"connectivity",
|
|
18
|
+
"manifest",
|
|
19
|
+
"infrastructure",
|
|
17
20
|
"tunnel",
|
|
18
|
-
"
|
|
19
|
-
"orchestration",
|
|
20
|
-
"agent"
|
|
21
|
+
"orchestration"
|
|
21
22
|
],
|
|
22
23
|
"license": "FSL-1.1-MIT",
|
|
23
24
|
"repository": {
|
|
@@ -26,8 +27,11 @@
|
|
|
26
27
|
"directory": "packages/sdk"
|
|
27
28
|
},
|
|
28
29
|
"devDependencies": {
|
|
30
|
+
"@types/js-yaml": "^4.0.9",
|
|
29
31
|
"@types/node": "^20.0.0",
|
|
30
32
|
"typescript": "^5.0.0"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"js-yaml": "^4.1.1"
|
|
31
36
|
}
|
|
32
37
|
}
|
|
33
|
-
|