@privateconnect/sdk 0.7.1 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +72 -76
- package/dist/index.js +154 -120
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Private Connect SDK
|
|
3
3
|
*
|
|
4
|
-
* Programmatic access to Private Connect services and agent orchestration.
|
|
4
|
+
* Programmatic access to Private Connect services, grants, and agent orchestration.
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
* ```typescript
|
|
@@ -9,15 +9,21 @@
|
|
|
9
9
|
*
|
|
10
10
|
* const pc = new PrivateConnect({ apiKey: 'your-api-key' });
|
|
11
11
|
*
|
|
12
|
-
* // Connect to a service
|
|
12
|
+
* // Connect to a service (assumes tunnel is already open)
|
|
13
13
|
* const db = await pc.connect('postgres-prod');
|
|
14
14
|
* console.log(db.connectionString); // postgres://localhost:5432/...
|
|
15
15
|
*
|
|
16
|
+
* // Grant an AI agent temporary access
|
|
17
|
+
* const grant = await pc.grants.create({
|
|
18
|
+
* agentLabel: 'claude',
|
|
19
|
+
* resourceType: 'db',
|
|
20
|
+
* resourceName: 'postgres',
|
|
21
|
+
* ttl: '5m',
|
|
22
|
+
* });
|
|
23
|
+
* console.log(grant.token); // gnt_...
|
|
24
|
+
*
|
|
16
25
|
* // List all agents
|
|
17
26
|
* const agents = await pc.agents.list();
|
|
18
|
-
*
|
|
19
|
-
* // Send message to another agent
|
|
20
|
-
* await pc.agents.sendMessage(targetAgentId, { action: 'deploy' });
|
|
21
27
|
* ```
|
|
22
28
|
*/
|
|
23
29
|
export interface PrivateConnectConfig {
|
|
@@ -25,7 +31,7 @@ export interface PrivateConnectConfig {
|
|
|
25
31
|
apiKey: string;
|
|
26
32
|
/** Hub URL (default: https://api.privateconnect.co) */
|
|
27
33
|
hubUrl?: string;
|
|
28
|
-
/** Agent ID (auto-detected from config if not provided) */
|
|
34
|
+
/** Agent ID (auto-detected from local config if not provided) */
|
|
29
35
|
agentId?: string;
|
|
30
36
|
/** Disable usage tracking (default: false) */
|
|
31
37
|
disableTracking?: boolean;
|
|
@@ -55,6 +61,10 @@ export interface Connection {
|
|
|
55
61
|
port: number;
|
|
56
62
|
connectionString: string;
|
|
57
63
|
envVar: string;
|
|
64
|
+
/** Present when using a grant-based connection */
|
|
65
|
+
grantToken?: string;
|
|
66
|
+
/** Present when using a grant-based connection */
|
|
67
|
+
grantEndpoint?: string;
|
|
58
68
|
}
|
|
59
69
|
export interface Message {
|
|
60
70
|
id: string;
|
|
@@ -69,137 +79,123 @@ export interface Message {
|
|
|
69
79
|
createdAt: string;
|
|
70
80
|
isRead: boolean;
|
|
71
81
|
}
|
|
72
|
-
export interface
|
|
82
|
+
export interface Grant {
|
|
73
83
|
id: string;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
84
|
+
agentLabel: string;
|
|
85
|
+
resourceType: string;
|
|
86
|
+
resourceName: string;
|
|
87
|
+
scope: string;
|
|
77
88
|
expiresAt: string;
|
|
78
|
-
|
|
89
|
+
expiresInMinutes?: number;
|
|
90
|
+
token?: string;
|
|
91
|
+
endpoint?: string;
|
|
92
|
+
}
|
|
93
|
+
export interface GrantCreateOptions {
|
|
94
|
+
agentLabel: string;
|
|
95
|
+
resourceType: 'db' | 'api' | 'path';
|
|
96
|
+
resourceName: string;
|
|
97
|
+
scope?: 'read-only' | 'full';
|
|
98
|
+
/** Duration string: 60s, 5m, 1h, 1d */
|
|
99
|
+
ttl: string;
|
|
79
100
|
}
|
|
80
|
-
/**
|
|
81
|
-
* Agents API for discovery and orchestration
|
|
82
|
-
*/
|
|
83
101
|
export declare class AgentsAPI {
|
|
84
102
|
private client;
|
|
85
103
|
constructor(client: PrivateConnect);
|
|
86
|
-
/**
|
|
87
|
-
* List all agents in the workspace
|
|
88
|
-
*/
|
|
89
104
|
list(options?: {
|
|
90
105
|
onlineOnly?: boolean;
|
|
91
106
|
}): Promise<Agent[]>;
|
|
92
|
-
/**
|
|
93
|
-
* Find agents by capability
|
|
94
|
-
*/
|
|
95
107
|
findByCapability(capability: string): Promise<Agent[]>;
|
|
96
|
-
/**
|
|
97
|
-
* Register capabilities for this agent
|
|
98
|
-
*/
|
|
99
108
|
registerCapabilities(capabilities: Array<{
|
|
100
109
|
name: string;
|
|
101
110
|
metadata?: Record<string, unknown>;
|
|
102
111
|
}>): Promise<void>;
|
|
103
|
-
/**
|
|
104
|
-
* Send a message to another agent
|
|
105
|
-
*/
|
|
106
112
|
sendMessage(toAgentId: string, payload: Record<string, unknown>, options?: {
|
|
107
113
|
channel?: string;
|
|
108
114
|
type?: 'request' | 'response' | 'event';
|
|
109
115
|
}): Promise<{
|
|
110
116
|
messageId: string;
|
|
111
117
|
}>;
|
|
112
|
-
/**
|
|
113
|
-
* Broadcast a message to all online agents
|
|
114
|
-
*/
|
|
115
118
|
broadcast(payload: Record<string, unknown>, options?: {
|
|
116
119
|
channel?: string;
|
|
117
120
|
}): Promise<{
|
|
118
121
|
sent: number;
|
|
119
122
|
}>;
|
|
120
|
-
/**
|
|
121
|
-
* Get messages for this agent
|
|
122
|
-
*/
|
|
123
123
|
getMessages(options?: {
|
|
124
124
|
channel?: string;
|
|
125
125
|
unreadOnly?: boolean;
|
|
126
126
|
limit?: number;
|
|
127
127
|
}): Promise<Message[]>;
|
|
128
|
-
/**
|
|
129
|
-
* Mark messages as read
|
|
130
|
-
*/
|
|
131
128
|
markRead(messageIds: string[]): Promise<void>;
|
|
132
129
|
}
|
|
133
|
-
/**
|
|
134
|
-
* Services API for connecting to and managing services
|
|
135
|
-
*/
|
|
136
130
|
export declare class ServicesAPI {
|
|
137
131
|
private client;
|
|
138
132
|
constructor(client: PrivateConnect);
|
|
139
|
-
/**
|
|
140
|
-
* List all services
|
|
141
|
-
*/
|
|
142
133
|
list(): Promise<Service[]>;
|
|
143
|
-
/**
|
|
144
|
-
* Get a specific service by name
|
|
145
|
-
*/
|
|
146
134
|
get(name: string): Promise<Service | null>;
|
|
147
135
|
/**
|
|
148
|
-
* Get connection details for a service
|
|
136
|
+
* Get connection details for a service.
|
|
137
|
+
*
|
|
138
|
+
* If `grantToken` is provided, returns a proxied connection via the hub's
|
|
139
|
+
* grant endpoint instead of assuming a local tunnel.
|
|
149
140
|
*/
|
|
150
|
-
getConnection(serviceName: string
|
|
141
|
+
getConnection(serviceName: string, options?: {
|
|
142
|
+
grantToken?: string;
|
|
143
|
+
}): Promise<Connection>;
|
|
144
|
+
private getGrantConnection;
|
|
151
145
|
}
|
|
152
|
-
|
|
153
|
-
* Sessions API for ephemeral orchestration sessions
|
|
154
|
-
*/
|
|
155
|
-
export declare class SessionsAPI {
|
|
146
|
+
export declare class GrantsAPI {
|
|
156
147
|
private client;
|
|
157
|
-
private activeSessions;
|
|
158
148
|
constructor(client: PrivateConnect);
|
|
159
149
|
/**
|
|
160
|
-
* Create an
|
|
150
|
+
* Create a time-limited access grant for an AI agent or external consumer.
|
|
161
151
|
*/
|
|
162
|
-
create(
|
|
163
|
-
ttlMinutes?: number;
|
|
164
|
-
metadata?: Record<string, unknown>;
|
|
165
|
-
}): Promise<Session>;
|
|
152
|
+
create(options: GrantCreateOptions): Promise<Grant>;
|
|
166
153
|
/**
|
|
167
|
-
*
|
|
154
|
+
* List active grants in the workspace.
|
|
168
155
|
*/
|
|
169
|
-
|
|
156
|
+
list(options?: {
|
|
157
|
+
includeExpired?: boolean;
|
|
158
|
+
}): Promise<Grant[]>;
|
|
159
|
+
/**
|
|
160
|
+
* Revoke an active grant immediately.
|
|
161
|
+
*/
|
|
162
|
+
revoke(grantId: string): Promise<void>;
|
|
170
163
|
/**
|
|
171
|
-
*
|
|
164
|
+
* Validate a grant token (public endpoint — no API key required).
|
|
165
|
+
* Returns the grant if valid, null otherwise.
|
|
172
166
|
*/
|
|
173
|
-
|
|
167
|
+
validate(token: string): Promise<Grant | null>;
|
|
174
168
|
}
|
|
175
|
-
/**
|
|
176
|
-
* Main Private Connect SDK client
|
|
177
|
-
*/
|
|
178
169
|
export declare class PrivateConnect {
|
|
179
170
|
private config;
|
|
180
171
|
/** Agents API for discovery and orchestration */
|
|
181
172
|
agents: AgentsAPI;
|
|
182
173
|
/** Services API for connecting to services */
|
|
183
174
|
services: ServicesAPI;
|
|
184
|
-
/**
|
|
185
|
-
|
|
175
|
+
/** Grants API for managing time-limited access tokens */
|
|
176
|
+
grants: GrantsAPI;
|
|
186
177
|
constructor(config: PrivateConnectConfig);
|
|
187
|
-
/**
|
|
188
|
-
* Get the agent ID
|
|
189
|
-
*/
|
|
178
|
+
/** The resolved agent ID, or undefined if not configured. */
|
|
190
179
|
get agentId(): string | undefined;
|
|
180
|
+
/** The hub URL this client is connected to. */
|
|
181
|
+
get hubUrl(): string;
|
|
191
182
|
/**
|
|
192
|
-
*
|
|
183
|
+
* Shorthand: get connection details for a service.
|
|
184
|
+
* Pass `grantToken` to connect via the grant proxy instead of a local tunnel.
|
|
193
185
|
*/
|
|
194
|
-
connect(serviceName: string
|
|
186
|
+
connect(serviceName: string, options?: {
|
|
187
|
+
grantToken?: string;
|
|
188
|
+
}): Promise<Connection>;
|
|
195
189
|
/**
|
|
196
|
-
*
|
|
190
|
+
* Returns the agent ID or throws if not configured.
|
|
191
|
+
* Used by APIs that require an authenticated agent identity.
|
|
197
192
|
*/
|
|
193
|
+
requireAgentId(): string;
|
|
194
|
+
/** Internal fetch with API key auth. */
|
|
198
195
|
fetch(path: string, options?: RequestInit): Promise<Response>;
|
|
199
|
-
/**
|
|
200
|
-
* Try to detect agent ID from local config
|
|
201
|
-
*/
|
|
202
|
-
private detectAgentId;
|
|
203
196
|
}
|
|
204
197
|
export default PrivateConnect;
|
|
205
|
-
|
|
198
|
+
/** Convenience function for quick one-off connections. */
|
|
199
|
+
export declare function connect(serviceName: string, config?: PrivateConnectConfig & {
|
|
200
|
+
grantToken?: string;
|
|
201
|
+
}): Promise<Connection>;
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Private Connect SDK
|
|
4
4
|
*
|
|
5
|
-
* Programmatic access to Private Connect services and agent orchestration.
|
|
5
|
+
* Programmatic access to Private Connect services, grants, and agent orchestration.
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* ```typescript
|
|
@@ -10,21 +10,32 @@
|
|
|
10
10
|
*
|
|
11
11
|
* const pc = new PrivateConnect({ apiKey: 'your-api-key' });
|
|
12
12
|
*
|
|
13
|
-
* // Connect to a service
|
|
13
|
+
* // Connect to a service (assumes tunnel is already open)
|
|
14
14
|
* const db = await pc.connect('postgres-prod');
|
|
15
15
|
* console.log(db.connectionString); // postgres://localhost:5432/...
|
|
16
16
|
*
|
|
17
|
+
* // Grant an AI agent temporary access
|
|
18
|
+
* const grant = await pc.grants.create({
|
|
19
|
+
* agentLabel: 'claude',
|
|
20
|
+
* resourceType: 'db',
|
|
21
|
+
* resourceName: 'postgres',
|
|
22
|
+
* ttl: '5m',
|
|
23
|
+
* });
|
|
24
|
+
* console.log(grant.token); // gnt_...
|
|
25
|
+
*
|
|
17
26
|
* // List all agents
|
|
18
27
|
* const agents = await pc.agents.list();
|
|
19
|
-
*
|
|
20
|
-
* // Send message to another agent
|
|
21
|
-
* await pc.agents.sendMessage(targetAgentId, { action: 'deploy' });
|
|
22
28
|
* ```
|
|
23
29
|
*/
|
|
24
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.PrivateConnect = exports.
|
|
31
|
+
exports.PrivateConnect = exports.GrantsAPI = exports.ServicesAPI = exports.AgentsAPI = void 0;
|
|
26
32
|
exports.connect = connect;
|
|
27
|
-
|
|
33
|
+
const fs = require("fs");
|
|
34
|
+
const path = require("path");
|
|
35
|
+
const os = require("os");
|
|
36
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
37
|
+
// Tracking
|
|
38
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
28
39
|
function trackSdkUsage(hubUrl) {
|
|
29
40
|
const data = JSON.stringify({
|
|
30
41
|
os: typeof process !== 'undefined' ? process.platform : 'browser',
|
|
@@ -36,18 +47,44 @@ function trackSdkUsage(hubUrl) {
|
|
|
36
47
|
method: 'POST',
|
|
37
48
|
headers: { 'Content-Type': 'application/json' },
|
|
38
49
|
body: data,
|
|
39
|
-
}).catch(() => { });
|
|
50
|
+
}).catch(() => { });
|
|
40
51
|
}
|
|
52
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
53
|
+
// Agent ID Detection
|
|
54
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
55
|
+
const CONFIG_PATH = path.join(os.homedir(), '.private-connect', 'config.json');
|
|
41
56
|
/**
|
|
42
|
-
*
|
|
57
|
+
* Detect the agent ID from local config or environment.
|
|
58
|
+
* Returns undefined if no agent is configured — callers that need an agent ID
|
|
59
|
+
* should surface a clear error rather than using a fake one.
|
|
43
60
|
*/
|
|
61
|
+
function detectAgentId() {
|
|
62
|
+
// 1. Environment variables (highest priority — useful in CI)
|
|
63
|
+
const envId = process.env.PRIVATECONNECT_AGENT_ID || process.env.CONNECT_AGENT_ID;
|
|
64
|
+
if (envId)
|
|
65
|
+
return envId;
|
|
66
|
+
// 2. Local config file (~/.private-connect/config.json)
|
|
67
|
+
try {
|
|
68
|
+
if (fs.existsSync(CONFIG_PATH)) {
|
|
69
|
+
const raw = fs.readFileSync(CONFIG_PATH, 'utf-8');
|
|
70
|
+
const config = JSON.parse(raw);
|
|
71
|
+
if (config.agentId && typeof config.agentId === 'string') {
|
|
72
|
+
return config.agentId;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Config unreadable or malformed — fall through
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
82
|
+
// Agents API
|
|
83
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
44
84
|
class AgentsAPI {
|
|
45
85
|
constructor(client) {
|
|
46
86
|
this.client = client;
|
|
47
87
|
}
|
|
48
|
-
/**
|
|
49
|
-
* List all agents in the workspace
|
|
50
|
-
*/
|
|
51
88
|
async list(options) {
|
|
52
89
|
const response = await this.client.fetch('/v1/agents/orchestration');
|
|
53
90
|
const data = await response.json();
|
|
@@ -65,47 +102,36 @@ class AgentsAPI {
|
|
|
65
102
|
services: a.services?.map((s) => s.name) || [],
|
|
66
103
|
}));
|
|
67
104
|
}
|
|
68
|
-
/**
|
|
69
|
-
* Find agents by capability
|
|
70
|
-
*/
|
|
71
105
|
async findByCapability(capability) {
|
|
72
106
|
const response = await this.client.fetch(`/v1/agents/by-capability/${encodeURIComponent(capability)}`);
|
|
73
107
|
const data = await response.json();
|
|
74
108
|
return data.agents || [];
|
|
75
109
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Register capabilities for this agent
|
|
78
|
-
*/
|
|
79
110
|
async registerCapabilities(capabilities) {
|
|
80
|
-
|
|
111
|
+
const agentId = this.client.requireAgentId();
|
|
112
|
+
await this.client.fetch(`/v1/agents/${agentId}/capabilities`, {
|
|
81
113
|
method: 'POST',
|
|
82
114
|
body: JSON.stringify({ capabilities }),
|
|
83
115
|
});
|
|
84
116
|
}
|
|
85
|
-
/**
|
|
86
|
-
* Send a message to another agent
|
|
87
|
-
*/
|
|
88
117
|
async sendMessage(toAgentId, payload, options) {
|
|
89
|
-
const
|
|
118
|
+
const agentId = this.client.requireAgentId();
|
|
119
|
+
const response = await this.client.fetch(`/v1/agents/${agentId}/messages/send`, {
|
|
90
120
|
method: 'POST',
|
|
91
121
|
body: JSON.stringify({ toAgentId, payload, ...options }),
|
|
92
122
|
});
|
|
93
123
|
return response.json();
|
|
94
124
|
}
|
|
95
|
-
/**
|
|
96
|
-
* Broadcast a message to all online agents
|
|
97
|
-
*/
|
|
98
125
|
async broadcast(payload, options) {
|
|
99
|
-
const
|
|
126
|
+
const agentId = this.client.requireAgentId();
|
|
127
|
+
const response = await this.client.fetch(`/v1/agents/${agentId}/messages/broadcast`, {
|
|
100
128
|
method: 'POST',
|
|
101
129
|
body: JSON.stringify({ payload, ...options }),
|
|
102
130
|
});
|
|
103
131
|
return response.json();
|
|
104
132
|
}
|
|
105
|
-
/**
|
|
106
|
-
* Get messages for this agent
|
|
107
|
-
*/
|
|
108
133
|
async getMessages(options) {
|
|
134
|
+
const agentId = this.client.requireAgentId();
|
|
109
135
|
const params = new URLSearchParams();
|
|
110
136
|
if (options?.channel)
|
|
111
137
|
params.set('channel', options.channel);
|
|
@@ -113,46 +139,44 @@ class AgentsAPI {
|
|
|
113
139
|
params.set('unreadOnly', String(options.unreadOnly));
|
|
114
140
|
if (options?.limit)
|
|
115
141
|
params.set('limit', String(options.limit));
|
|
116
|
-
const response = await this.client.fetch(`/v1/agents/${
|
|
142
|
+
const response = await this.client.fetch(`/v1/agents/${agentId}/messages?${params}`);
|
|
117
143
|
const data = await response.json();
|
|
118
144
|
return data.messages || [];
|
|
119
145
|
}
|
|
120
|
-
/**
|
|
121
|
-
* Mark messages as read
|
|
122
|
-
*/
|
|
123
146
|
async markRead(messageIds) {
|
|
124
|
-
|
|
147
|
+
const agentId = this.client.requireAgentId();
|
|
148
|
+
await this.client.fetch(`/v1/agents/${agentId}/messages/read`, {
|
|
125
149
|
method: 'POST',
|
|
126
150
|
body: JSON.stringify({ messageIds }),
|
|
127
151
|
});
|
|
128
152
|
}
|
|
129
153
|
}
|
|
130
154
|
exports.AgentsAPI = AgentsAPI;
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
155
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
156
|
+
// Services API
|
|
157
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
134
158
|
class ServicesAPI {
|
|
135
159
|
constructor(client) {
|
|
136
160
|
this.client = client;
|
|
137
161
|
}
|
|
138
|
-
/**
|
|
139
|
-
* List all services
|
|
140
|
-
*/
|
|
141
162
|
async list() {
|
|
142
163
|
const response = await this.client.fetch('/v1/services');
|
|
143
164
|
return response.json();
|
|
144
165
|
}
|
|
145
|
-
/**
|
|
146
|
-
* Get a specific service by name
|
|
147
|
-
*/
|
|
148
166
|
async get(name) {
|
|
149
167
|
const services = await this.list();
|
|
150
168
|
return services.find(s => s.name.toLowerCase() === name.toLowerCase()) || null;
|
|
151
169
|
}
|
|
152
170
|
/**
|
|
153
|
-
* Get connection details for a service
|
|
171
|
+
* Get connection details for a service.
|
|
172
|
+
*
|
|
173
|
+
* If `grantToken` is provided, returns a proxied connection via the hub's
|
|
174
|
+
* grant endpoint instead of assuming a local tunnel.
|
|
154
175
|
*/
|
|
155
|
-
async getConnection(serviceName) {
|
|
176
|
+
async getConnection(serviceName, options) {
|
|
177
|
+
if (options?.grantToken) {
|
|
178
|
+
return this.getGrantConnection(serviceName, options.grantToken);
|
|
179
|
+
}
|
|
156
180
|
const service = await this.get(serviceName);
|
|
157
181
|
if (!service) {
|
|
158
182
|
throw new Error(`Service "${serviceName}" not found`);
|
|
@@ -185,108 +209,127 @@ class ServicesAPI {
|
|
|
185
209
|
connectionString = `tcp://${host}:${port}`;
|
|
186
210
|
envVar = `${serviceName.toUpperCase().replace(/-/g, '_')}_URL`;
|
|
187
211
|
}
|
|
212
|
+
return { service: serviceName, host, port, connectionString, envVar };
|
|
213
|
+
}
|
|
214
|
+
getGrantConnection(serviceName, grantToken) {
|
|
215
|
+
const hubUrl = this.client.hubUrl;
|
|
216
|
+
const grantEndpoint = `${hubUrl}/grant/${encodeURIComponent(serviceName)}`;
|
|
188
217
|
return {
|
|
189
218
|
service: serviceName,
|
|
190
|
-
host,
|
|
191
|
-
port,
|
|
192
|
-
connectionString,
|
|
193
|
-
envVar,
|
|
219
|
+
host: new URL(hubUrl).hostname,
|
|
220
|
+
port: new URL(hubUrl).port ? parseInt(new URL(hubUrl).port, 10) : 443,
|
|
221
|
+
connectionString: grantEndpoint,
|
|
222
|
+
envVar: 'GRANT_URL',
|
|
223
|
+
grantToken,
|
|
224
|
+
grantEndpoint,
|
|
194
225
|
};
|
|
195
226
|
}
|
|
196
227
|
}
|
|
197
228
|
exports.ServicesAPI = ServicesAPI;
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
class
|
|
229
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
230
|
+
// Grants API
|
|
231
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
232
|
+
class GrantsAPI {
|
|
202
233
|
constructor(client) {
|
|
203
234
|
this.client = client;
|
|
204
|
-
this.activeSessions = new Map();
|
|
205
235
|
}
|
|
206
236
|
/**
|
|
207
|
-
* Create an
|
|
237
|
+
* Create a time-limited access grant for an AI agent or external consumer.
|
|
208
238
|
*/
|
|
209
|
-
async create(
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
createdBy: this.client.agentId,
|
|
217
|
-
createdAt: new Date().toISOString(),
|
|
218
|
-
expiresAt: expiresAt.toISOString(),
|
|
219
|
-
metadata: options?.metadata,
|
|
220
|
-
};
|
|
221
|
-
this.activeSessions.set(sessionId, session);
|
|
222
|
-
// Broadcast session creation
|
|
223
|
-
await this.client.agents.broadcast({ type: 'session:created', session }, { channel: 'orchestration' });
|
|
224
|
-
return session;
|
|
239
|
+
async create(options) {
|
|
240
|
+
const response = await this.client.fetch('/v1/grants', {
|
|
241
|
+
method: 'POST',
|
|
242
|
+
body: JSON.stringify(options),
|
|
243
|
+
});
|
|
244
|
+
const data = await response.json();
|
|
245
|
+
return data.grant;
|
|
225
246
|
}
|
|
226
247
|
/**
|
|
227
|
-
*
|
|
248
|
+
* List active grants in the workspace.
|
|
228
249
|
*/
|
|
229
|
-
async
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
endedAt: new Date().toISOString(),
|
|
237
|
-
}, { channel: 'orchestration' });
|
|
250
|
+
async list(options) {
|
|
251
|
+
const params = new URLSearchParams();
|
|
252
|
+
if (options?.includeExpired)
|
|
253
|
+
params.set('includeExpired', 'true');
|
|
254
|
+
const response = await this.client.fetch(`/v1/grants?${params}`);
|
|
255
|
+
const data = await response.json();
|
|
256
|
+
return data.grants || [];
|
|
238
257
|
}
|
|
239
258
|
/**
|
|
240
|
-
*
|
|
259
|
+
* Revoke an active grant immediately.
|
|
241
260
|
*/
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
261
|
+
async revoke(grantId) {
|
|
262
|
+
await this.client.fetch(`/v1/grants/${grantId}`, { method: 'DELETE' });
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Validate a grant token (public endpoint — no API key required).
|
|
266
|
+
* Returns the grant if valid, null otherwise.
|
|
267
|
+
*/
|
|
268
|
+
async validate(token) {
|
|
269
|
+
try {
|
|
270
|
+
const url = `${this.client.hubUrl}/v1/grants/validate`;
|
|
271
|
+
const response = await fetch(url, {
|
|
272
|
+
method: 'POST',
|
|
273
|
+
headers: { 'Content-Type': 'application/json' },
|
|
274
|
+
body: JSON.stringify({ token }),
|
|
275
|
+
});
|
|
276
|
+
if (!response.ok)
|
|
277
|
+
return null;
|
|
278
|
+
const data = await response.json();
|
|
279
|
+
return data.valid ? data.grant : null;
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return null;
|
|
252
283
|
}
|
|
253
|
-
return active;
|
|
254
284
|
}
|
|
255
285
|
}
|
|
256
|
-
exports.
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
286
|
+
exports.GrantsAPI = GrantsAPI;
|
|
287
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
288
|
+
// Main Client
|
|
289
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
260
290
|
class PrivateConnect {
|
|
261
291
|
constructor(config) {
|
|
262
292
|
this.config = {
|
|
263
293
|
apiKey: config.apiKey,
|
|
264
294
|
hubUrl: config.hubUrl || 'https://api.privateconnect.co',
|
|
265
|
-
agentId: config.agentId ||
|
|
295
|
+
agentId: config.agentId || detectAgentId(),
|
|
266
296
|
};
|
|
267
297
|
this.agents = new AgentsAPI(this);
|
|
268
298
|
this.services = new ServicesAPI(this);
|
|
269
|
-
this.
|
|
270
|
-
// Track SDK usage (non-blocking)
|
|
299
|
+
this.grants = new GrantsAPI(this);
|
|
271
300
|
if (!config.disableTracking) {
|
|
272
301
|
trackSdkUsage(this.config.hubUrl);
|
|
273
302
|
}
|
|
274
303
|
}
|
|
275
|
-
/**
|
|
276
|
-
* Get the agent ID
|
|
277
|
-
*/
|
|
304
|
+
/** The resolved agent ID, or undefined if not configured. */
|
|
278
305
|
get agentId() {
|
|
279
306
|
return this.config.agentId;
|
|
280
307
|
}
|
|
308
|
+
/** The hub URL this client is connected to. */
|
|
309
|
+
get hubUrl() {
|
|
310
|
+
return this.config.hubUrl;
|
|
311
|
+
}
|
|
281
312
|
/**
|
|
282
|
-
*
|
|
313
|
+
* Shorthand: get connection details for a service.
|
|
314
|
+
* Pass `grantToken` to connect via the grant proxy instead of a local tunnel.
|
|
283
315
|
*/
|
|
284
|
-
async connect(serviceName) {
|
|
285
|
-
return this.services.getConnection(serviceName);
|
|
316
|
+
async connect(serviceName, options) {
|
|
317
|
+
return this.services.getConnection(serviceName, options);
|
|
286
318
|
}
|
|
287
319
|
/**
|
|
288
|
-
*
|
|
320
|
+
* Returns the agent ID or throws if not configured.
|
|
321
|
+
* Used by APIs that require an authenticated agent identity.
|
|
289
322
|
*/
|
|
323
|
+
requireAgentId() {
|
|
324
|
+
if (!this.config.agentId) {
|
|
325
|
+
throw new Error('Agent ID not found. Either:\n' +
|
|
326
|
+
' 1. Run "connect up" to register this machine, or\n' +
|
|
327
|
+
' 2. Set PRIVATECONNECT_AGENT_ID environment variable, or\n' +
|
|
328
|
+
' 3. Pass agentId in the PrivateConnect constructor.');
|
|
329
|
+
}
|
|
330
|
+
return this.config.agentId;
|
|
331
|
+
}
|
|
332
|
+
/** Internal fetch with API key auth. */
|
|
290
333
|
async fetch(path, options) {
|
|
291
334
|
const url = `${this.config.hubUrl}${path}`;
|
|
292
335
|
const response = await fetch(url, {
|
|
@@ -303,25 +346,16 @@ class PrivateConnect {
|
|
|
303
346
|
}
|
|
304
347
|
return response;
|
|
305
348
|
}
|
|
306
|
-
/**
|
|
307
|
-
* Try to detect agent ID from local config
|
|
308
|
-
*/
|
|
309
|
-
detectAgentId() {
|
|
310
|
-
// In a real implementation, this would read from ~/.connect/config.json
|
|
311
|
-
// For now, generate a default ID
|
|
312
|
-
return `sdk-${Date.now()}`;
|
|
313
|
-
}
|
|
314
349
|
}
|
|
315
350
|
exports.PrivateConnect = PrivateConnect;
|
|
316
|
-
// Default export
|
|
317
351
|
exports.default = PrivateConnect;
|
|
318
|
-
|
|
352
|
+
/** Convenience function for quick one-off connections. */
|
|
319
353
|
async function connect(serviceName, config) {
|
|
320
354
|
const apiKey = config?.apiKey || process.env.PRIVATECONNECT_API_KEY;
|
|
321
355
|
if (!apiKey) {
|
|
322
356
|
throw new Error('API key required. Set PRIVATECONNECT_API_KEY or pass config.apiKey');
|
|
323
357
|
}
|
|
324
358
|
const client = new PrivateConnect({ ...config, apiKey });
|
|
325
|
-
return client.connect(serviceName);
|
|
359
|
+
return client.connect(serviceName, { grantToken: config?.grantToken });
|
|
326
360
|
}
|
|
327
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7OztBQWlaSCwwQkFRQztBQTVZRCxvQ0FBb0M7QUFDcEMsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLEVBQUUsRUFBRSxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUsSUFBSSxFQUFFLE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMvRixPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLEdBQUcsTUFBTSxvQkFBb0IsRUFBRTtRQUNuQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtRQUMvQyxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7QUFDL0MsQ0FBQztBQWtERDs7R0FFRztBQUNILE1BQWEsU0FBUztJQUNwQixZQUFvQixNQUFzQjtRQUF0QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtJQUFHLENBQUM7SUFFOUM7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWtDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBC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O1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLG1CQUFtQixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYTtRQUNuQix3RUFBd0U7UUFDeEUsaUNBQWlDO1FBQ2pDLE9BQU8sT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUF6RUQsd0NBeUVDO0FBRUQsaUJBQWlCO0FBQ2pCLGtCQUFlLGNBQWMsQ0FBQztBQUU5Qix1QkFBdUI7QUFDaEIsS0FBSyxVQUFVLE9BQU8sQ0FBQyxXQUFtQixFQUFFLE1BQTZCO0lBQzlFLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJpdmF0ZSBDb25uZWN0IFNES1xuICogXG4gKiBQcm9ncmFtbWF0aWMgYWNjZXNzIHRvIFByaXZhdGUgQ29ubmVjdCBzZXJ2aWNlcyBhbmQgYWdlbnQgb3JjaGVzdHJhdGlvbi5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFByaXZhdGVDb25uZWN0IH0gZnJvbSAnQHByaXZhdGVjb25uZWN0L3Nkayc7XG4gKiBcbiAqIGNvbnN0IHBjID0gbmV3IFByaXZhdGVDb25uZWN0KHsgYXBpS2V5OiAneW91ci1hcGkta2V5JyB9KTtcbiAqIFxuICogLy8gQ29ubmVjdCB0byBhIHNlcnZpY2VcbiAqIGNvbnN0IGRiID0gYXdhaXQgcGMuY29ubmVjdCgncG9zdGdyZXMtcHJvZCcpO1xuICogY29uc29sZS5sb2coZGIuY29ubmVjdGlvblN0cmluZyk7IC8vIHBvc3RncmVzOi8vbG9jYWxob3N0OjU0MzIvLi4uXG4gKiBcbiAqIC8vIExpc3QgYWxsIGFnZW50c1xuICogY29uc3QgYWdlbnRzID0gYXdhaXQgcGMuYWdlbnRzLmxpc3QoKTtcbiAqIFxuICogLy8gU2VuZCBtZXNzYWdlIHRvIGFub3RoZXIgYWdlbnRcbiAqIGF3YWl0IHBjLmFnZW50cy5zZW5kTWVzc2FnZSh0YXJnZXRBZ2VudElkLCB7IGFjdGlvbjogJ2RlcGxveScgfSk7XG4gKiBgYGBcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVDb25uZWN0Q29uZmlnIHtcbiAgLyoqIEFQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uICovXG4gIGFwaUtleTogc3RyaW5nO1xuICAvKiogSHViIFVSTCAoZGVmYXVsdDogaHR0cHM6Ly9hcGkucHJpdmF0ZWNvbm5lY3QuY28pICovXG4gIGh1YlVybD86IHN0cmluZztcbiAgLyoqIEFnZW50IElEIChhdXRvLWRldGVjdGVkIGZyb20gY29uZmlnIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgYWdlbnRJZD86IHN0cmluZztcbiAgLyoqIERpc2FibGUgdXNhZ2UgdHJhY2tpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBkaXNhYmxlVHJhY2tpbmc/OiBib29sZWFuO1xufVxuXG4vLyBUcmFjayBTREsgdXNhZ2UgKGZpcmUgYW5kIGZvcmdldClcbmZ1bmN0aW9uIHRyYWNrU2RrVXNhZ2UoaHViVXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBvczogdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnID8gcHJvY2Vzcy5wbGF0Zm9ybSA6ICdicm93c2VyJyxcbiAgICBhcmNoOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnID8gJ2FybTY0JyA6ICd4NjQnKSA6ICd1bmtub3duJyxcbiAgICB2ZXJzaW9uOiAnc2RrJyxcbiAgICBzb3VyY2U6ICdzZGsnLFxuICB9KTtcbiAgXG4gIGZldGNoKGAke2h1YlVybH0vdjEvZXZlbnRzL2luc3RhbGxgLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogZGF0YSxcbiAgfSkuY2F0Y2goKCkgPT4ge30pOyAvLyBTaWxlbnRseSBpZ25vcmUgZXJyb3JzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0SG9zdDogc3RyaW5nO1xuICB0YXJnZXRQb3J0OiBudW1iZXI7XG4gIHR1bm5lbFBvcnQ/OiBudW1iZXI7XG4gIHByb3RvY29sOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBhZ2VudExhYmVsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgaXNPbmxpbmU6IGJvb2xlYW47XG4gIGxhc3RTZWVuQXQ6IHN0cmluZztcbiAgY2FwYWJpbGl0aWVzOiBzdHJpbmdbXTtcbiAgc2VydmljZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb24ge1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICBjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmc7XG4gIGVudlZhcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICBpZDogc3RyaW5nO1xuICBmcm9tOiB7IGlkOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH07XG4gIGNoYW5uZWw6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIGlzUmVhZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIGV4cGlyZXNBdDogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSBhbmQgb3JjaGVzdHJhdGlvblxuICovXG5leHBvcnQgY2xhc3MgQWdlbnRzQVBJIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxuXG4gIC8qKlxuICAgKiBMaXN0IGFsbCBhZ2VudHMgaW4gdGhlIHdvcmtzcGFjZVxuICAgKi9cbiAgYXN5bmMgbGlzdChvcHRpb25zPzogeyBvbmxpbmVPbmx5PzogYm9vbGVhbiB9KTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL2FnZW50cy9vcmNoZXN0cmF0aW9uJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBsZXQgYWdlbnRzID0gZGF0YS5hZ2VudHMgfHwgW107XG4gICAgXG4gICAgaWYgKG9wdGlvbnM/Lm9ubGluZU9ubHkpIHtcbiAgICAgIGFnZW50cyA9IGFnZW50cy5maWx0ZXIoKGE6IGFueSkgPT4gYS5pc09ubGluZSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBhZ2VudHMubWFwKChhOiBhbnkpID0+ICh7XG4gICAgICBpZDogYS5pZCxcbiAgICAgIG5hbWU6IGEubmFtZSxcbiAgICAgIGxhYmVsOiBhLmxhYmVsLFxuICAgICAgaXNPbmxpbmU6IGEuaXNPbmxpbmUsXG4gICAgICBsYXN0U2VlbkF0OiBhLmxhc3RTZWVuQXQsXG4gICAgICBjYXBhYmlsaXRpZXM6IGEuY2FwYWJpbGl0aWVzPy5tYXAoKGM6IGFueSkgPT4gYy5uYW1lKSB8fCBbXSxcbiAgICAgIHNlcnZpY2VzOiBhLnNlcnZpY2VzPy5tYXAoKHM6IGFueSkgPT4gcy5uYW1lKSB8fCBbXSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhZ2VudHMgYnkgY2FwYWJpbGl0eVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5Q2FwYWJpbGl0eShjYXBhYmlsaXR5OiBzdHJpbmcpOiBQcm9taXNlPEFnZW50W10+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzL2J5LWNhcGFiaWxpdHkvJHtlbmNvZGVVUklDb21wb25lbnQoY2FwYWJpbGl0eSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4gZGF0YS5hZ2VudHMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGFnZW50XG4gICAqL1xuICBhc3luYyByZWdpc3RlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHt0aGlzLmNsaWVudC5hZ2VudElkfS9jYXBhYmlsaXRpZXNgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY2FwYWJpbGl0aWVzIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBtZXNzYWdlIHRvIGFub3RoZXIgYWdlbnRcbiAgICovXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgIHRvQWdlbnRJZDogc3RyaW5nLFxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHR5cGU/OiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JyB9XG4gICk6IFByb21pc2U8eyBtZXNzYWdlSWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke3RoaXMuY2xpZW50LmFnZW50SWR9L21lc3NhZ2VzL3NlbmRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdG9BZ2VudElkLCBwYXlsb2FkLCAuLi5vcHRpb25zIH0pLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byBhbGwgb25saW5lIGFnZW50c1xuICAgKi9cbiAgYXN5bmMgYnJvYWRjYXN0KFxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmcgfVxuICApOiBQcm9taXNlPHsgc2VudDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7dGhpcy5jbGllbnQuYWdlbnRJZH0vbWVzc2FnZXMvYnJvYWRjYXN0YCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBheWxvYWQsIC4uLm9wdGlvbnMgfSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZXMgZm9yIHRoaXMgYWdlbnRcbiAgICovXG4gIGFzeW5jIGdldE1lc3NhZ2VzKG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHVucmVhZE9ubHk/OiBib29sZWFuOyBsaW1pdD86IG51bWJlciB9KTogUHJvbWlzZTxNZXNzYWdlW10+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgaWYgKG9wdGlvbnM/LmNoYW5uZWwpIHBhcmFtcy5zZXQoJ2NoYW5uZWwnLCBvcHRpb25zLmNoYW5uZWwpO1xuICAgIGlmIChvcHRpb25zPy51bnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ3VucmVhZE9ubHknLCBTdHJpbmcob3B0aW9ucy51bnJlYWRPbmx5KSk7XG4gICAgaWYgKG9wdGlvbnM/LmxpbWl0KSBwYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhvcHRpb25zLmxpbWl0KSk7XG4gICAgXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke3RoaXMuY2xpZW50LmFnZW50SWR9L21lc3NhZ2VzPyR7cGFyYW1zfWApO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIGRhdGEubWVzc2FnZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogTWFyayBtZXNzYWdlcyBhcyByZWFkXG4gICAqL1xuICBhc3luYyBtYXJrUmVhZChtZXNzYWdlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7dGhpcy5jbGllbnQuYWdlbnRJZH0vbWVzc2FnZXMvcmVhZGAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXNzYWdlSWRzIH0pLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU2VydmljZXMgQVBJIGZvciBjb25uZWN0aW5nIHRvIGFuZCBtYW5hZ2luZyBzZXJ2aWNlc1xuICovXG5leHBvcnQgY2xhc3MgU2VydmljZXNBUEkge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUHJpdmF0ZUNvbm5lY3QpIHt9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIHNlcnZpY2VzXG4gICAqL1xuICBhc3luYyBsaXN0KCk6IFByb21pc2U8U2VydmljZVtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL3NlcnZpY2VzJyk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzcGVjaWZpYyBzZXJ2aWNlIGJ5IG5hbWVcbiAgICovXG4gIGFzeW5jIGdldChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFNlcnZpY2UgfCBudWxsPiB7XG4gICAgY29uc3Qgc2VydmljZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gc2VydmljZXMuZmluZChzID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbm5lY3Rpb24gZGV0YWlscyBmb3IgYSBzZXJ2aWNlXG4gICAqL1xuICBhc3luYyBnZXRDb25uZWN0aW9uKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5nZXQoc2VydmljZU5hbWUpO1xuICAgIGlmICghc2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXJ2aWNlIFwiJHtzZXJ2aWNlTmFtZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gc2VydmljZS50dW5uZWxQb3J0IHx8IHNlcnZpY2UudGFyZ2V0UG9ydDtcbiAgICBjb25zdCBob3N0ID0gJ2xvY2FsaG9zdCc7XG4gICAgXG4gICAgbGV0IGNvbm5lY3Rpb25TdHJpbmcgPSAnJztcbiAgICBsZXQgZW52VmFyID0gJ1NFUlZJQ0VfVVJMJztcbiAgICBcbiAgICBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA1NDMyIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdwb3N0Z3JlcycpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgcG9zdGdyZXM6Ly8ke2hvc3R9OiR7cG9ydH0vcG9zdGdyZXNgO1xuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDMzMDYgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ215c3FsJykge1xuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBteXNxbDovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnREFUQUJBU0VfVVJMJztcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gNjM3OSB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAncmVkaXMnKSB7XG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHJlZGlzOi8vJHtob3N0fToke3BvcnR9YDtcbiAgICAgIGVudlZhciA9ICdSRURJU19VUkwnO1xuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSAyNzAxNyB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbW9uZ29kYicpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgbW9uZ29kYjovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnTU9OR09EQl9VUkknO1xuICAgIH0gZWxzZSBpZiAoc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHAnIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdodHRwcycpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgaHR0cDovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnQVBJX1VSTCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgdGNwOi8vJHtob3N0fToke3BvcnR9YDtcbiAgICAgIGVudlZhciA9IGAke3NlcnZpY2VOYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpfV9VUkxgO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSxcbiAgICAgIGhvc3QsXG4gICAgICBwb3J0LFxuICAgICAgY29ubmVjdGlvblN0cmluZyxcbiAgICAgIGVudlZhcixcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU2Vzc2lvbnMgQVBJIGZvciBlcGhlbWVyYWwgb3JjaGVzdHJhdGlvbiBzZXNzaW9uc1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbnNBUEkge1xuICBwcml2YXRlIGFjdGl2ZVNlc3Npb25zID0gbmV3IE1hcDxzdHJpbmcsIFNlc3Npb24+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gb3JjaGVzdHJhdGlvbiBzZXNzaW9uXG4gICAqL1xuICBhc3luYyBjcmVhdGUobmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyB0dGxNaW51dGVzPzogbnVtYmVyOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPFNlc3Npb24+IHtcbiAgICBjb25zdCB0dGxNaW51dGVzID0gb3B0aW9ucz8udHRsTWludXRlcyB8fCA2MDtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSBgJHt0aGlzLmNsaWVudC5hZ2VudElkfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDgpfWA7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIHR0bE1pbnV0ZXMgKiA2MCAqIDEwMDApO1xuXG4gICAgY29uc3Qgc2Vzc2lvbjogU2Vzc2lvbiA9IHtcbiAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICBuYW1lLFxuICAgICAgY3JlYXRlZEJ5OiB0aGlzLmNsaWVudC5hZ2VudElkISxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZXhwaXJlc0F0OiBleHBpcmVzQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zPy5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgdGhpcy5hY3RpdmVTZXNzaW9ucy5zZXQoc2Vzc2lvbklkLCBzZXNzaW9uKTtcblxuICAgIC8vIEJyb2FkY2FzdCBzZXNzaW9uIGNyZWF0aW9uXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuYWdlbnRzLmJyb2FkY2FzdChcbiAgICAgIHsgdHlwZTogJ3Nlc3Npb246Y3JlYXRlZCcsIHNlc3Npb24gfSxcbiAgICAgIHsgY2hhbm5lbDogJ29yY2hlc3RyYXRpb24nIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogRW5kIGFuIG9yY2hlc3RyYXRpb24gc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgZW5kKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hY3RpdmVTZXNzaW9ucy5kZWxldGUoc2Vzc2lvbklkKTtcblxuICAgIC8vIEJyb2FkY2FzdCBzZXNzaW9uIGVuZFxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmFnZW50cy5icm9hZGNhc3QoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdzZXNzaW9uOmVuZGVkJyxcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBlbmRlZEJ5OiB0aGlzLmNsaWVudC5hZ2VudElkLFxuICAgICAgICBlbmRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9LFxuICAgICAgeyBjaGFubmVsOiAnb3JjaGVzdHJhdGlvbicgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFjdGl2ZSBzZXNzaW9uc1xuICAgKi9cbiAgZ2V0QWN0aXZlKCk6IFNlc3Npb25bXSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBhY3RpdmU6IFNlc3Npb25bXSA9IFtdO1xuICAgIFxuICAgIGZvciAoY29uc3QgW2lkLCBzZXNzaW9uXSBvZiB0aGlzLmFjdGl2ZVNlc3Npb25zKSB7XG4gICAgICBpZiAobmV3IERhdGUoc2Vzc2lvbi5leHBpcmVzQXQpID4gbm93KSB7XG4gICAgICAgIGFjdGl2ZS5wdXNoKHNlc3Npb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTZXNzaW9ucy5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYWN0aXZlO1xuICB9XG59XG5cbi8qKlxuICogTWFpbiBQcml2YXRlIENvbm5lY3QgU0RLIGNsaWVudFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZUNvbm5lY3Qge1xuICBwcml2YXRlIGNvbmZpZzogeyBhcGlLZXk6IHN0cmluZzsgaHViVXJsOiBzdHJpbmc7IGFnZW50SWQ6IHN0cmluZyB9O1xuICBcbiAgLyoqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSBhbmQgb3JjaGVzdHJhdGlvbiAqL1xuICBwdWJsaWMgYWdlbnRzOiBBZ2VudHNBUEk7XG4gIFxuICAvKiogU2VydmljZXMgQVBJIGZvciBjb25uZWN0aW5nIHRvIHNlcnZpY2VzICovXG4gIHB1YmxpYyBzZXJ2aWNlczogU2VydmljZXNBUEk7XG4gIFxuICAvKiogU2Vzc2lvbnMgQVBJIGZvciBlcGhlbWVyYWwgb3JjaGVzdHJhdGlvbiAqL1xuICBwdWJsaWMgc2Vzc2lvbnM6IFNlc3Npb25zQVBJO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUHJpdmF0ZUNvbm5lY3RDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcbiAgICAgIGh1YlVybDogY29uZmlnLmh1YlVybCB8fCAnaHR0cHM6Ly9hcGkucHJpdmF0ZWNvbm5lY3QuY28nLFxuICAgICAgYWdlbnRJZDogY29uZmlnLmFnZW50SWQgfHwgdGhpcy5kZXRlY3RBZ2VudElkKCksXG4gICAgfTtcblxuICAgIHRoaXMuYWdlbnRzID0gbmV3IEFnZW50c0FQSSh0aGlzKTtcbiAgICB0aGlzLnNlcnZpY2VzID0gbmV3IFNlcnZpY2VzQVBJKHRoaXMpO1xuICAgIHRoaXMuc2Vzc2lvbnMgPSBuZXcgU2Vzc2lvbnNBUEkodGhpcyk7XG5cbiAgICAvLyBUcmFjayBTREsgdXNhZ2UgKG5vbi1ibG9ja2luZylcbiAgICBpZiAoIWNvbmZpZy5kaXNhYmxlVHJhY2tpbmcpIHtcbiAgICAgIHRyYWNrU2RrVXNhZ2UodGhpcy5jb25maWcuaHViVXJsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhZ2VudCBJRFxuICAgKi9cbiAgZ2V0IGFnZW50SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWdlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIGEgc2VydmljZSBhbmQgZ2V0IGNvbm5lY3Rpb24gZGV0YWlsc1xuICAgKi9cbiAgYXN5bmMgY29ubmVjdChzZXJ2aWNlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXMuZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgZmV0Y2ggaGVscGVyXG4gICAqL1xuICBhc3luYyBmZXRjaChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5odWJVcmx9JHtwYXRofWA7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICd4LWFwaS1rZXknOiB0aGlzLmNvbmZpZy5hcGlLZXksXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnMsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgbWVzc2FnZTogJ1Vua25vd24gZXJyb3InIH0pKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlIHx8IGBSZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byBkZXRlY3QgYWdlbnQgSUQgZnJvbSBsb2NhbCBjb25maWdcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0QWdlbnRJZCgpOiBzdHJpbmcge1xuICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCByZWFkIGZyb20gfi8uY29ubmVjdC9jb25maWcuanNvblxuICAgIC8vIEZvciBub3csIGdlbmVyYXRlIGEgZGVmYXVsdCBJRFxuICAgIHJldHVybiBgc2RrLSR7RGF0ZS5ub3coKX1gO1xuICB9XG59XG5cbi8vIERlZmF1bHQgZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBQcml2YXRlQ29ubmVjdDtcblxuLy8gQ29udmVuaWVuY2UgZnVuY3Rpb25cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnKTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XG4gIGNvbnN0IGFwaUtleSA9IGNvbmZpZz8uYXBpS2V5IHx8IHByb2Nlc3MuZW52LlBSSVZBVEVDT05ORUNUX0FQSV9LRVk7XG4gIGlmICghYXBpS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBUEkga2V5IHJlcXVpcmVkLiBTZXQgUFJJVkFURUNPTk5FQ1RfQVBJX0tFWSBvciBwYXNzIGNvbmZpZy5hcGlLZXknKTtcbiAgfVxuICBcbiAgY29uc3QgY2xpZW50ID0gbmV3IFByaXZhdGVDb25uZWN0KHsgLi4uY29uZmlnLCBhcGlLZXkgfSk7XG4gIHJldHVybiBjbGllbnQuY29ubmVjdChzZXJ2aWNlTmFtZSk7XG59XG5cbiJdfQ==
|
|
361
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7OztBQWljSCwwQkFXQztBQTFjRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQWlGekIsZ0ZBQWdGO0FBQ2hGLFdBQVc7QUFDWCxnRkFBZ0Y7QUFFaEYsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLEVBQUUsRUFBRSxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUsSUFBSSxFQUFFLE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMvRixPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLEdBQUcsTUFBTSxvQkFBb0IsRUFBRTtRQUNuQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtRQUMvQyxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixxQkFBcUI7QUFDckIsZ0ZBQWdGO0FBRWhGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFD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RUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRjtBQWpGRCx3Q0FpRkM7QUFFRCxrQkFBZSxjQUFjLENBQUM7QUFFOUIsMERBQTBEO0FBQ25ELEtBQUssVUFBVSxPQUFPLENBQzNCLFdBQW1CLEVBQ25CLE1BQXVEO0lBRXZELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByaXZhdGUgQ29ubmVjdCBTREtcbiAqXG4gKiBQcm9ncmFtbWF0aWMgYWNjZXNzIHRvIFByaXZhdGUgQ29ubmVjdCBzZXJ2aWNlcywgZ3JhbnRzLCBhbmQgYWdlbnQgb3JjaGVzdHJhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgUHJpdmF0ZUNvbm5lY3QgfSBmcm9tICdAcHJpdmF0ZWNvbm5lY3Qvc2RrJztcbiAqXG4gKiBjb25zdCBwYyA9IG5ldyBQcml2YXRlQ29ubmVjdCh7IGFwaUtleTogJ3lvdXItYXBpLWtleScgfSk7XG4gKlxuICogLy8gQ29ubmVjdCB0byBhIHNlcnZpY2UgKGFzc3VtZXMgdHVubmVsIGlzIGFscmVhZHkgb3BlbilcbiAqIGNvbnN0IGRiID0gYXdhaXQgcGMuY29ubmVjdCgncG9zdGdyZXMtcHJvZCcpO1xuICogY29uc29sZS5sb2coZGIuY29ubmVjdGlvblN0cmluZyk7IC8vIHBvc3RncmVzOi8vbG9jYWxob3N0OjU0MzIvLi4uXG4gKlxuICogLy8gR3JhbnQgYW4gQUkgYWdlbnQgdGVtcG9yYXJ5IGFjY2Vzc1xuICogY29uc3QgZ3JhbnQgPSBhd2FpdCBwYy5ncmFudHMuY3JlYXRlKHtcbiAqICAgYWdlbnRMYWJlbDogJ2NsYXVkZScsXG4gKiAgIHJlc291cmNlVHlwZTogJ2RiJyxcbiAqICAgcmVzb3VyY2VOYW1lOiAncG9zdGdyZXMnLFxuICogICB0dGw6ICc1bScsXG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKGdyYW50LnRva2VuKTsgLy8gZ250Xy4uLlxuICpcbiAqIC8vIExpc3QgYWxsIGFnZW50c1xuICogY29uc3QgYWdlbnRzID0gYXdhaXQgcGMuYWdlbnRzLmxpc3QoKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gVHlwZXNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVDb25uZWN0Q29uZmlnIHtcbiAgLyoqIEFQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uICovXG4gIGFwaUtleTogc3RyaW5nO1xuICAvKiogSHViIFVSTCAoZGVmYXVsdDogaHR0cHM6Ly9hcGkucHJpdmF0ZWNvbm5lY3QuY28pICovXG4gIGh1YlVybD86IHN0cmluZztcbiAgLyoqIEFnZW50IElEIChhdXRvLWRldGVjdGVkIGZyb20gbG9jYWwgY29uZmlnIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgYWdlbnRJZD86IHN0cmluZztcbiAgLyoqIERpc2FibGUgdXNhZ2UgdHJhY2tpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBkaXNhYmxlVHJhY2tpbmc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2Uge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhcmdldEhvc3Q6IHN0cmluZztcbiAgdGFyZ2V0UG9ydDogbnVtYmVyO1xuICB0dW5uZWxQb3J0PzogbnVtYmVyO1xuICBwcm90b2NvbDogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgYWdlbnRMYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGlzT25saW5lOiBib29sZWFuO1xuICBsYXN0U2VlbkF0OiBzdHJpbmc7XG4gIGNhcGFiaWxpdGllczogc3RyaW5nW107XG4gIHNlcnZpY2VzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uIHtcbiAgc2VydmljZTogc3RyaW5nO1xuICBob3N0OiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbiAgY29ubmVjdGlvblN0cmluZzogc3RyaW5nO1xuICBlbnZWYXI6IHN0cmluZztcbiAgLyoqIFByZXNlbnQgd2hlbiB1c2luZyBhIGdyYW50LWJhc2VkIGNvbm5lY3Rpb24gKi9cbiAgZ3JhbnRUb2tlbj86IHN0cmluZztcbiAgLyoqIFByZXNlbnQgd2hlbiB1c2luZyBhIGdyYW50LWJhc2VkIGNvbm5lY3Rpb24gKi9cbiAgZ3JhbnRFbmRwb2ludD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgaWQ6IHN0cmluZztcbiAgZnJvbTogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9O1xuICBjaGFubmVsOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICBpc1JlYWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JhbnQge1xuICBpZDogc3RyaW5nO1xuICBhZ2VudExhYmVsOiBzdHJpbmc7XG4gIHJlc291cmNlVHlwZTogc3RyaW5nO1xuICByZXNvdXJjZU5hbWU6IHN0cmluZztcbiAgc2NvcGU6IHN0cmluZztcbiAgZXhwaXJlc0F0OiBzdHJpbmc7XG4gIGV4cGlyZXNJbk1pbnV0ZXM/OiBudW1iZXI7XG4gIHRva2VuPzogc3RyaW5nO1xuICBlbmRwb2ludD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmFudENyZWF0ZU9wdGlvbnMge1xuICBhZ2VudExhYmVsOiBzdHJpbmc7XG4gIHJlc291cmNlVHlwZTogJ2RiJyB8ICdhcGknIHwgJ3BhdGgnO1xuICByZXNvdXJjZU5hbWU6IHN0cmluZztcbiAgc2NvcGU/OiAncmVhZC1vbmx5JyB8ICdmdWxsJztcbiAgLyoqIER1cmF0aW9uIHN0cmluZzogNjBzLCA1bSwgMWgsIDFkICovXG4gIHR0bDogc3RyaW5nO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFRyYWNraW5nXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gdHJhY2tTZGtVc2FnZShodWJVcmw6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIG9zOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9jZXNzLnBsYXRmb3JtIDogJ2Jyb3dzZXInLFxuICAgIGFyY2g6IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IChwcm9jZXNzLmFyY2ggPT09ICdhcm02NCcgPyAnYXJtNjQnIDogJ3g2NCcpIDogJ3Vua25vd24nLFxuICAgIHZlcnNpb246ICdzZGsnLFxuICAgIHNvdXJjZTogJ3NkaycsXG4gIH0pO1xuXG4gIGZldGNoKGAke2h1YlVybH0vdjEvZXZlbnRzL2luc3RhbGxgLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogZGF0YSxcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFnZW50IElEIERldGVjdGlvblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IENPTkZJR19QQVRIID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5wcml2YXRlLWNvbm5lY3QnLCAnY29uZmlnLmpzb24nKTtcblxuLyoqXG4gKiBEZXRlY3QgdGhlIGFnZW50IElEIGZyb20gbG9jYWwgY29uZmlnIG9yIGVudmlyb25tZW50LlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm8gYWdlbnQgaXMgY29uZmlndXJlZCDigJQgY2FsbGVycyB0aGF0IG5lZWQgYW4gYWdlbnQgSURcbiAqIHNob3VsZCBzdXJmYWNlIGEgY2xlYXIgZXJyb3IgcmF0aGVyIHRoYW4gdXNpbmcgYSBmYWtlIG9uZS5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0QWdlbnRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyAxLiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKGhpZ2hlc3QgcHJpb3JpdHkg4oCUIHVzZWZ1bCBpbiBDSSlcbiAgY29uc3QgZW52SWQgPSBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BR0VOVF9JRCB8fCBwcm9jZXNzLmVudi5DT05ORUNUX0FHRU5UX0lEO1xuICBpZiAoZW52SWQpIHJldHVybiBlbnZJZDtcblxuICAvLyAyLiBMb2NhbCBjb25maWcgZmlsZSAofi8ucHJpdmF0ZS1jb25uZWN0L2NvbmZpZy5qc29uKVxuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKENPTkZJR19QQVRIKSkge1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKENPTkZJR19QQVRILCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgIGlmIChjb25maWcuYWdlbnRJZCAmJiB0eXBlb2YgY29uZmlnLmFnZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBjb25maWcuYWdlbnRJZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIENvbmZpZyB1bnJlYWRhYmxlIG9yIG1hbGZvcm1lZCDigJQgZmFsbCB0aHJvdWdoXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFnZW50cyBBUElcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY2xhc3MgQWdlbnRzQVBJIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxuXG4gIGFzeW5jIGxpc3Qob3B0aW9ucz86IHsgb25saW5lT25seT86IGJvb2xlYW4gfSk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9hZ2VudHMvb3JjaGVzdHJhdGlvbicpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgbGV0IGFnZW50cyA9IGRhdGEuYWdlbnRzIHx8IFtdO1xuXG4gICAgaWYgKG9wdGlvbnM/Lm9ubGluZU9ubHkpIHtcbiAgICAgIGFnZW50cyA9IGFnZW50cy5maWx0ZXIoKGE6IGFueSkgPT4gYS5pc09ubGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFnZW50cy5tYXAoKGE6IGFueSkgPT4gKHtcbiAgICAgIGlkOiBhLmlkLFxuICAgICAgbmFtZTogYS5uYW1lLFxuICAgICAgbGFiZWw6IGEubGFiZWwsXG4gICAgICBpc09ubGluZTogYS5pc09ubGluZSxcbiAgICAgIGxhc3RTZWVuQXQ6IGEubGFzdFNlZW5BdCxcbiAgICAgIGNhcGFiaWxpdGllczogYS5jYXBhYmlsaXRpZXM/Lm1hcCgoYzogYW55KSA9PiBjLm5hbWUpIHx8IFtdLFxuICAgICAgc2VydmljZXM6IGEuc2VydmljZXM/Lm1hcCgoczogYW55KSA9PiBzLm5hbWUpIHx8IFtdLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRCeUNhcGFiaWxpdHkoY2FwYWJpbGl0eTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy9ieS1jYXBhYmlsaXR5LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhcGFiaWxpdHkpfWApO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIGRhdGEuYWdlbnRzIHx8IFtdO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vY2FwYWJpbGl0aWVzYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNhcGFiaWxpdGllcyB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgIHRvQWdlbnRJZDogc3RyaW5nLFxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHR5cGU/OiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JyB9XG4gICk6IFByb21pc2U8eyBtZXNzYWdlSWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgYWdlbnRJZCA9IHRoaXMuY2xpZW50LnJlcXVpcmVBZ2VudElkKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3NlbmRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdG9BZ2VudElkLCBwYXlsb2FkLCAuLi5vcHRpb25zIH0pLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gIH1cblxuICBhc3luYyBicm9hZGNhc3QoXG4gICAgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgb3B0aW9ucz86IHsgY2hhbm5lbD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8eyBzZW50OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcy9icm9hZGNhc3RgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF5bG9hZCwgLi4ub3B0aW9ucyB9KSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWVzc2FnZXMob3B0aW9ucz86IHsgY2hhbm5lbD86IHN0cmluZzsgdW5yZWFkT25seT86IGJvb2xlYW47IGxpbWl0PzogbnVtYmVyIH0pOiBQcm9taXNlPE1lc3NhZ2VbXT4ge1xuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAob3B0aW9ucz8uY2hhbm5lbCkgcGFyYW1zLnNldCgnY2hhbm5lbCcsIG9wdGlvbnMuY2hhbm5lbCk7XG4gICAgaWYgKG9wdGlvbnM/LnVucmVhZE9ubHkgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgndW5yZWFkT25seScsIFN0cmluZyhvcHRpb25zLnVucmVhZE9ubHkpKTtcbiAgICBpZiAob3B0aW9ucz8ubGltaXQpIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKG9wdGlvbnMubGltaXQpKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcz8ke3BhcmFtc31gKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiBkYXRhLm1lc3NhZ2VzIHx8IFtdO1xuICB9XG5cbiAgYXN5bmMgbWFya1JlYWQobWVzc2FnZUlkczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3JlYWRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZUlkcyB9KSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNlcnZpY2VzIEFQSVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlc0FQSSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cblxuICBhc3luYyBsaXN0KCk6IFByb21pc2U8U2VydmljZVtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL3NlcnZpY2VzJyk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIGFzeW5jIGdldChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFNlcnZpY2UgfCBudWxsPiB7XG4gICAgY29uc3Qgc2VydmljZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gc2VydmljZXMuZmluZChzID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbm5lY3Rpb24gZGV0YWlscyBmb3IgYSBzZXJ2aWNlLlxuICAgKlxuICAgKiBJZiBgZ3JhbnRUb2tlbmAgaXMgcHJvdmlkZWQsIHJldHVybnMgYSBwcm94aWVkIGNvbm5lY3Rpb24gdmlhIHRoZSBodWInc1xuICAgKiBncmFudCBlbmRwb2ludCBpbnN0ZWFkIG9mIGFzc3VtaW5nIGEgbG9jYWwgdHVubmVsLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBncmFudFRva2VuPzogc3RyaW5nIH0pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcbiAgICBpZiAob3B0aW9ucz8uZ3JhbnRUb2tlbikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0R3JhbnRDb25uZWN0aW9uKHNlcnZpY2VOYW1lLCBvcHRpb25zLmdyYW50VG9rZW4pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBhd2FpdCB0aGlzLmdldChzZXJ2aWNlTmFtZSk7XG4gICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlcnZpY2UgXCIke3NlcnZpY2VOYW1lfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBzZXJ2aWNlLnR1bm5lbFBvcnQgfHwgc2VydmljZS50YXJnZXRQb3J0O1xuICAgIGNvbnN0IGhvc3QgPSAnbG9jYWxob3N0JztcblxuICAgIGxldCBjb25uZWN0aW9uU3RyaW5nID0gJyc7XG4gICAgbGV0IGVudlZhciA9ICdTRVJWSUNFX1VSTCc7XG5cbiAgICBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA1NDMyIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdwb3N0Z3JlcycpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgcG9zdGdyZXM6Ly8ke2hvc3R9OiR7cG9ydH0vcG9zdGdyZXNgO1xuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDMzMDYgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ215c3FsJykge1xuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBteXNxbDovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnREFUQUJBU0VfVVJMJztcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gNjM3OSB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAncmVkaXMnKSB7XG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHJlZGlzOi8vJHtob3N0fToke3BvcnR9YDtcbiAgICAgIGVudlZhciA9ICdSRURJU19VUkwnO1xuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSAyNzAxNyB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbW9uZ29kYicpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgbW9uZ29kYjovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnTU9OR09EQl9VUkknO1xuICAgIH0gZWxzZSBpZiAoc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHAnIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdodHRwcycpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgaHR0cDovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnQVBJX1VSTCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgdGNwOi8vJHtob3N0fToke3BvcnR9YDtcbiAgICAgIGVudlZhciA9IGAke3NlcnZpY2VOYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpfV9VUkxgO1xuICAgIH1cblxuICAgIHJldHVybiB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCBob3N0LCBwb3J0LCBjb25uZWN0aW9uU3RyaW5nLCBlbnZWYXIgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3JhbnRDb25uZWN0aW9uKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGdyYW50VG9rZW46IHN0cmluZyk6IENvbm5lY3Rpb24ge1xuICAgIGNvbnN0IGh1YlVybCA9IHRoaXMuY2xpZW50Lmh1YlVybDtcbiAgICBjb25zdCBncmFudEVuZHBvaW50ID0gYCR7aHViVXJsfS9ncmFudC8ke2VuY29kZVVSSUNvbXBvbmVudChzZXJ2aWNlTmFtZSl9YDtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSxcbiAgICAgIGhvc3Q6IG5ldyBVUkwoaHViVXJsKS5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IG5ldyBVUkwoaHViVXJsKS5wb3J0ID8gcGFyc2VJbnQobmV3IFVSTChodWJVcmwpLnBvcnQsIDEwKSA6IDQ0MyxcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmc6IGdyYW50RW5kcG9pbnQsXG4gICAgICBlbnZWYXI6ICdHUkFOVF9VUkwnLFxuICAgICAgZ3JhbnRUb2tlbixcbiAgICAgIGdyYW50RW5kcG9pbnQsXG4gICAgfTtcbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEdyYW50cyBBUElcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY2xhc3MgR3JhbnRzQVBJIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0aW1lLWxpbWl0ZWQgYWNjZXNzIGdyYW50IGZvciBhbiBBSSBhZ2VudCBvciBleHRlcm5hbCBjb25zdW1lci5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBHcmFudENyZWF0ZU9wdGlvbnMpOiBQcm9taXNlPEdyYW50PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL2dyYW50cycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkob3B0aW9ucyksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4gZGF0YS5ncmFudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFjdGl2ZSBncmFudHMgaW4gdGhlIHdvcmtzcGFjZS5cbiAgICovXG4gIGFzeW5jIGxpc3Qob3B0aW9ucz86IHsgaW5jbHVkZUV4cGlyZWQ/OiBib29sZWFuIH0pOiBQcm9taXNlPEdyYW50W10+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgaWYgKG9wdGlvbnM/LmluY2x1ZGVFeHBpcmVkKSBwYXJhbXMuc2V0KCdpbmNsdWRlRXhwaXJlZCcsICd0cnVlJyk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2dyYW50cz8ke3BhcmFtc31gKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiBkYXRhLmdyYW50cyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2UgYW4gYWN0aXZlIGdyYW50IGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgcmV2b2tlKGdyYW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvZ3JhbnRzLyR7Z3JhbnRJZH1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBncmFudCB0b2tlbiAocHVibGljIGVuZHBvaW50IOKAlCBubyBBUEkga2V5IHJlcXVpcmVkKS5cbiAgICogUmV0dXJucyB0aGUgZ3JhbnQgaWYgdmFsaWQsIG51bGwgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGUodG9rZW46IHN0cmluZyk6IFByb21pc2U8R3JhbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuY2xpZW50Lmh1YlVybH0vdjEvZ3JhbnRzL3ZhbGlkYXRlYDtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0b2tlbiB9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgcmV0dXJuIGRhdGEudmFsaWQgPyBkYXRhLmdyYW50IDogbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIE1haW4gQ2xpZW50XG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIFByaXZhdGVDb25uZWN0IHtcbiAgcHJpdmF0ZSBjb25maWc6IHsgYXBpS2V5OiBzdHJpbmc7IGh1YlVybDogc3RyaW5nOyBhZ2VudElkPzogc3RyaW5nIH07XG5cbiAgLyoqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSBhbmQgb3JjaGVzdHJhdGlvbiAqL1xuICBwdWJsaWMgYWdlbnRzOiBBZ2VudHNBUEk7XG5cbiAgLyoqIFNlcnZpY2VzIEFQSSBmb3IgY29ubmVjdGluZyB0byBzZXJ2aWNlcyAqL1xuICBwdWJsaWMgc2VydmljZXM6IFNlcnZpY2VzQVBJO1xuXG4gIC8qKiBHcmFudHMgQVBJIGZvciBtYW5hZ2luZyB0aW1lLWxpbWl0ZWQgYWNjZXNzIHRva2VucyAqL1xuICBwdWJsaWMgZ3JhbnRzOiBHcmFudHNBUEk7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQcml2YXRlQ29ubmVjdENvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgYXBpS2V5OiBjb25maWcuYXBpS2V5LFxuICAgICAgaHViVXJsOiBjb25maWcuaHViVXJsIHx8ICdodHRwczovL2FwaS5wcml2YXRlY29ubmVjdC5jbycsXG4gICAgICBhZ2VudElkOiBjb25maWcuYWdlbnRJZCB8fCBkZXRlY3RBZ2VudElkKCksXG4gICAgfTtcblxuICAgIHRoaXMuYWdlbnRzID0gbmV3IEFnZW50c0FQSSh0aGlzKTtcbiAgICB0aGlzLnNlcnZpY2VzID0gbmV3IFNlcnZpY2VzQVBJKHRoaXMpO1xuICAgIHRoaXMuZ3JhbnRzID0gbmV3IEdyYW50c0FQSSh0aGlzKTtcblxuICAgIGlmICghY29uZmlnLmRpc2FibGVUcmFja2luZykge1xuICAgICAgdHJhY2tTZGtVc2FnZSh0aGlzLmNvbmZpZy5odWJVcmwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgcmVzb2x2ZWQgYWdlbnQgSUQsIG9yIHVuZGVmaW5lZCBpZiBub3QgY29uZmlndXJlZC4gKi9cbiAgZ2V0IGFnZW50SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWdlbnRJZDtcbiAgfVxuXG4gIC8qKiBUaGUgaHViIFVSTCB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8uICovXG4gIGdldCBodWJVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaHViVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3J0aGFuZDogZ2V0IGNvbm5lY3Rpb24gZGV0YWlscyBmb3IgYSBzZXJ2aWNlLlxuICAgKiBQYXNzIGBncmFudFRva2VuYCB0byBjb25uZWN0IHZpYSB0aGUgZ3JhbnQgcHJveHkgaW5zdGVhZCBvZiBhIGxvY2FsIHR1bm5lbC5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3Qoc2VydmljZU5hbWU6IHN0cmluZywgb3B0aW9ucz86IHsgZ3JhbnRUb2tlbj86IHN0cmluZyB9KTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXMuZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYWdlbnQgSUQgb3IgdGhyb3dzIGlmIG5vdCBjb25maWd1cmVkLlxuICAgKiBVc2VkIGJ5IEFQSXMgdGhhdCByZXF1aXJlIGFuIGF1dGhlbnRpY2F0ZWQgYWdlbnQgaWRlbnRpdHkuXG4gICAqL1xuICByZXF1aXJlQWdlbnRJZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb25maWcuYWdlbnRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQWdlbnQgSUQgbm90IGZvdW5kLiBFaXRoZXI6XFxuJyArXG4gICAgICAgICcgIDEuIFJ1biBcImNvbm5lY3QgdXBcIiB0byByZWdpc3RlciB0aGlzIG1hY2hpbmUsIG9yXFxuJyArXG4gICAgICAgICcgIDIuIFNldCBQUklWQVRFQ09OTkVDVF9BR0VOVF9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3JcXG4nICtcbiAgICAgICAgJyAgMy4gUGFzcyBhZ2VudElkIGluIHRoZSBQcml2YXRlQ29ubmVjdCBjb25zdHJ1Y3Rvci4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWdlbnRJZDtcbiAgfVxuXG4gIC8qKiBJbnRlcm5hbCBmZXRjaCB3aXRoIEFQSSBrZXkgYXV0aC4gKi9cbiAgYXN5bmMgZmV0Y2gocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5jb25maWcuaHViVXJsfSR7cGF0aH1gO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAneC1hcGkta2V5JzogdGhpcy5jb25maWcuYXBpS2V5LFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IG1lc3NhZ2U6ICdVbmtub3duIGVycm9yJyB9KSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSB8fCBgUmVxdWVzdCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQcml2YXRlQ29ubmVjdDtcblxuLyoqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBxdWljayBvbmUtb2ZmIGNvbm5lY3Rpb25zLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QoXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnICYgeyBncmFudFRva2VuPzogc3RyaW5nIH0sXG4pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcbiAgY29uc3QgYXBpS2V5ID0gY29uZmlnPy5hcGlLZXkgfHwgcHJvY2Vzcy5lbnYuUFJJVkFURUNPTk5FQ1RfQVBJX0tFWTtcbiAgaWYgKCFhcGlLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FQSSBrZXkgcmVxdWlyZWQuIFNldCBQUklWQVRFQ09OTkVDVF9BUElfS0VZIG9yIHBhc3MgY29uZmlnLmFwaUtleScpO1xuICB9XG5cbiAgY29uc3QgY2xpZW50ID0gbmV3IFByaXZhdGVDb25uZWN0KHsgLi4uY29uZmlnLCBhcGlLZXkgfSk7XG4gIHJldHVybiBjbGllbnQuY29ubmVjdChzZXJ2aWNlTmFtZSwgeyBncmFudFRva2VuOiBjb25maWc/LmdyYW50VG9rZW4gfSk7XG59XG4iXX0=
|
package/package.json
CHANGED