finary-community 0.1.0 → 0.1.1

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 CHANGED
@@ -1,229 +1,234 @@
1
- # Finary Community Library
2
-
3
- Une bibliothèque non-officielle et communautaire pour s'interfacer avec l'API Finary. Elle permet de récupérer vos données de patrimoine, transactions, insights et bien plus encore de manière programmatique.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install finary-community
9
- ```
10
-
11
- ## Configuration & Authentification
12
-
13
- L'authentification sur Finary étant complexe (protection anti-bot), cette librairie fonctionne actuellement en utilisant une session navigateur existante.
14
-
15
- Vous devez créer un fichier `credentials.json` à la racine de votre projet.
16
- Vous pouvez le générer automatiquement en lançant la commande interactive :
17
-
18
- ```bash
19
- npm run setup
20
- ```
21
-
22
- Ou le créer manuellement :
23
-
24
- ### Structure du fichier `credentials.json`
25
-
26
- ```json
27
- {
28
- "token": "JWT_TOKEN_ICI",
29
- "clerkSession": "CLERK_SESSION_ID_ICI",
30
- "headers": {
31
- "user-agent": "Mozilla/5.0 ...",
32
- "cookie": "..."
33
- }
34
- }
35
- ```
36
-
37
- > **Note :** Le `clerkSession` et les `headers` (cookie) sont essentiels pour permettre le rafraîchissement automatique du token.
38
-
39
- ## API Reference
40
-
41
- Voici la documentation détaillée de chaque fonction disponible dans la librairie.
42
-
43
- ### Types et Enums Communs
44
-
45
- Plusieurs fonctions utilisent les énumérations suivantes pour filtrer les données :
46
-
47
- * **`FinaryPeriod`** : Période temporelle pour les graphiques et variations.
48
- * `'1d'` (24h), `'1w'` (Semaine), `'1m'` (Mois), `'ytd'` (Depuis début d'année), `'1y'` (1 an), `'all'` (Tout).
49
- * **`TimeseriesType`** : Type de série temporelle.
50
- * `'sum'` (Valeur cumulée), `'all'` (Détail).
51
- * **`DistributionType`** : Type de répartition.
52
- * `'account'` (Par compte).
53
- * **`InvestmentDistributionType`** : Type de répartition investissement.
54
- * `'stock'` (Par action/actif).
55
-
56
- ---
57
-
58
- ### 1. Client Principal (`FinaryClient`)
59
-
60
- Point d'entrée de la librairie.
61
-
62
- #### `constructor(config)`
63
- Initialise le client.
64
- * **Paramètres** :
65
- * `config` (`AuthConfig`) : Objet de configuration `{ credentialsPath: string }`.
66
-
67
- #### `getUserProfile()`
68
- Récupère les informations du profil utilisateur connecté.
69
- * **Retourne** : `Promise<UserProfile>` (Nom, email, paramètres, etc.)
70
-
71
- #### `getOrganizations()`
72
- Liste les organisations (souvent appelées "familles" dans l'UI) associées à l'utilisateur. Vous aurez besoin de l'ID de l'organisation et du membre pour la plupart des autres appels.
73
- * **Retourne** : `Promise<Organization[]>`
74
-
75
- ---
76
-
77
- ### 2. Investissements (`client.investments`)
78
-
79
- Tous les appels nécessitent généralement `organizationId` et `membershipId`.
80
-
81
- #### `getPortfolio(organizationId, membershipId, period)`
82
- Vue d'ensemble du portefeuille d'investissements (Actions, Crypto, Immo, etc.).
83
- * **Paramètres** :
84
- * `organizationId` (`string`) : ID de l'organisation.
85
- * `membershipId` (`string`) : ID du membre.
86
- * `period` (`FinaryPeriod`, défaut: `YTD`) : Période de calcul des plus/moins-values.
87
- * **Retourne** : `Promise<InvestmentPortfolio>`
88
-
89
- #### `getTimeseries(organizationId, membershipId, period, type)`
90
- Récupère l'historique de la valeur du portefeuille (graphique).
91
- * **Paramètres** :
92
- * `period` (`FinaryPeriod`, défaut: `YTD`).
93
- * `type` (`TimeseriesType`, défaut: `SUM`).
94
- * **Retourne** : `Promise<Timeseries[]>`
95
-
96
- #### `getDistribution(organizationId, membershipId, type, period)`
97
- Répartition des actifs.
98
- * **Paramètres** :
99
- * `type` (`InvestmentDistributionType`, défaut: `STOCK`).
100
- * **Retourne** : `Promise<Distribution>`
101
-
102
- #### `getDividends(organizationId, membershipId, withRealEstate)`
103
- Liste les dividendes perçus et à venir.
104
- * **Paramètres** :
105
- * `withRealEstate` (`boolean`, défaut: `true`) : Inclure les loyers/dividendes immobiliers (SCPI).
106
- * **Retourne** : `Promise<DividendsResponse>`
107
-
108
- #### `getSectorAllocation(organizationId, membershipId)`
109
- Répartition sectorielle du portefeuille (Technologie, Santé, Finance...).
110
- * **Retourne** : `Promise<SectorAllocationResponse>`
111
-
112
- #### `getGeographicalAllocation(organizationId, membershipId)`
113
- Répartition géographique du portefeuille (USA, Europe, Asie...).
114
- * **Retourne** : `Promise<GeographicalAllocationResponse>`
115
-
116
- #### `getFees(organizationId, membershipId)`
117
- Analyse des frais sur les enveloppes (PEA, CTO, AV...).
118
- * **Retourne** : `Promise<FeesResponse>`
119
-
120
- #### `getAccount(organizationId, membershipId, accountId, period)`
121
- Détails d'un compte spécifique (ex: un PEA particulier).
122
- * **Paramètres** :
123
- * `accountId` (`string`) : ID du compte.
124
- * **Retourne** : `Promise<InvestmentAccount>`
125
-
126
- #### Méthodes "Account" Spécifiques
127
- De la même manière que pour le portefeuille global, vous pouvez appeler ces méthodes pour un compte précis :
128
- * `getAccountTimeseries(orgId, memId, accountId, period, type)`
129
- * `getAccountDistribution(orgId, memId, accountId, type, period)`
130
- * `getAccountDividends(orgId, memId, accountId, withRealEstate)`
131
- * `getAccountSectorAllocation(orgId, memId, accountId)`
132
- * `getAccountGeographicalAllocation(orgId, memId, accountId)`
133
- * `getAccountFees(orgId, memId, accountId)`
134
-
135
- ---
136
-
137
- ### 3. Épargne (`client.savings`)
138
-
139
- Concerne les livrets bancaires, fonds euros, etc.
140
-
141
- #### `getPortfolio(organizationId, membershipId, period)`
142
- Vue d'ensemble de l'épargne.
143
- * **Retourne** : `Promise<SavingsPortfolio>`
144
-
145
- #### `getAccounts(organizationId, membershipId, period)`
146
- Liste tous les comptes d'épargne.
147
- * **Retourne** : `Promise<SavingsAccount[]>`
148
-
149
- #### `getAccount(organizationId, membershipId, accountId, period)`
150
- Détails d'un compte épargne spécifique.
151
- * **Retourne** : `Promise<SavingsAccount>`
152
-
153
- #### `getTransaction(organizationId, membershipId, page, perPage, query, accountId)`
154
- Récupère les transactions (virements, intérêts).
155
- * **Paramètres** :
156
- * `page` (`number`, défaut: `1`) : Numéro de page.
157
- * `perPage` (`number`, défaut: `50`) : Nombre d'éléments par page.
158
- * `query` (`string`, optionnel) : Recherche textuelle.
159
- * `accountId` (`string`, optionnel) : Filtrer par compte spécifique.
160
- * **Retourne** : `Promise<Transaction[]>`
161
-
162
- #### `getTimeseries(...)` et `getAccountTimeseries(...)`
163
- Historique de valeur.
164
-
165
- ---
166
-
167
- ### 4. Comptes Courants (`client.checkings`)
168
-
169
- #### `getPortfolio(organizationId, membershipId, period)`
170
- Solde total des comptes courants.
171
- * **Retourne** : `Promise<CheckingPortfolio>`
172
-
173
- #### `getAccounts(organizationId, membershipId, period)`
174
- Liste des comptes bancaires.
175
- * **Retourne** : `Promise<CheckingAccount[]>`
176
-
177
- #### `getTransactions(...)`
178
- Récupère les transactions bancaires. Fonctionne identiquement à celle de l'épargne.
179
-
180
- ---
181
-
182
- ### 5. Benchmarks (`client.benchmarks`)
183
-
184
- #### `getAvailableAssets(organizationId, membershipId, period)`
185
- Récupère la liste des actifs disponibles pour faire des comparaisons de performance.
186
- * **Retourne** : `Promise<BenchmarkAsset[]>`
187
-
188
- ## Exemple Complet
189
-
190
- ```typescript
191
- import { FinaryClient, FinaryPeriod } from 'finary-community';
192
-
193
- const client = new FinaryClient({ credentialsPath: './credentials.json' });
194
-
195
- async function main() {
196
- // 1. Setup
197
- const orgs = await client.getOrganizations();
198
- const orgId = orgs[0].id;
199
- const memberId = orgs[0].members[0].id;
200
-
201
- console.log(`Utilisateur : ${orgs[0].name}`);
202
-
203
- // 2. Investissements
204
- const investments = await client.investments.getPortfolio(orgId, memberId, FinaryPeriod.YTD);
205
- console.log(`--- Investissements ---`);
206
- console.log(`Total : ${investments.total.amount} €`);
207
- console.log(`Plus-value latente : ${investments.total.unrealized_pnl} €`);
208
-
209
- // 3. Dividendes à venir
210
- const dividends = await client.investments.getDividends(orgId, memberId);
211
- if(dividends.upcoming_dividends.length > 0) {
212
- console.log(`--- Prochains Dividendes ---`);
213
- dividends.upcoming_dividends.forEach(div => {
214
- console.log(`${div.date} : ${div.amount}€ (${div.asset.name})`);
215
- });
216
- }
217
-
218
- // 4. Recherche de transactions Livret A
219
- const savings = await client.savings.getAccounts(orgId, memberId);
220
- const livretA = savings.find(s => s.name.includes("Livret A"));
221
- if (livretA) {
222
- console.log(`--- Transactions Livret A ---`);
223
- const txs = await client.savings.getTransactions(orgId, memberId, 1, 5, '', livretA.id);
224
- txs.forEach(t => console.log(`${t.date} : ${t.amount}€ - ${t.description}`));
225
- }
226
- }
227
-
228
- main().catch(console.error);
229
- ```
1
+ # Finary Community Library
2
+
3
+ Une bibliothèque non-officielle et communautaire pour s'interfacer avec l'API Finary. Elle permet de récupérer vos données de patrimoine, transactions, insights et bien plus encore de manière programmatique.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install finary-community
9
+ ```
10
+
11
+ ## Configuration & Authentification
12
+
13
+ L'authentification sur Finary étant complexe (protection anti-bot), cette librairie fonctionne en utilisant une session navigateur existante qu'elle capture pour vous.
14
+
15
+ Vous devez générer un fichier `credentials.json` qui permettra à votre code de se connecter.
16
+
17
+ ### Méthode Recommandée (Assistant Interactif)
18
+
19
+ Si vous avez installé la librairie via NPM dans votre projet, executez simplement cette commande dans votre terminal (**à la racine où se trouve votre `node_modules`**) :
20
+
21
+ ```bash
22
+ npx finary-community setup
23
+ ```
24
+
25
+ Cela ouvrira une fenêtre de navigateur contrôlée. Connectez-vous simplement à Finary, et le script capturera automatiquement vos tokens et cookies pour générer le fichier `credentials.json`.
26
+
27
+ ### Méthode Manuelle
28
+
29
+ Vous pouvez créer manuellement un fichier `credentials.json` à la racine de votre projet avec la structure suivante :
30
+
31
+ ```json
32
+ {
33
+ "token": "VOTRE_JWT_TOKEN",
34
+ "clerkSession": "VOTRE_CLERK_SESSION_ID",
35
+ "headers": {
36
+ "user-agent": "Mozilla/5.0 ...",
37
+ "cookie": "..."
38
+ }
39
+ }
40
+ ```
41
+
42
+ > **Important :** Le `clerkSession` (cookie `__session`) et les `headers` (notamment le `User-Agent` et `Cookie`) sont **obligatoires** pour permettre à la librairie de rafraîchir le token automatiquement lorsqu'il expire. Sans cela, le script cessera de fonctionner après 20 minutes.
43
+
44
+ ## API Reference
45
+
46
+ Voici la documentation détaillée de chaque fonction disponible dans la librairie.
47
+
48
+ ### Types et Enums Communs
49
+
50
+ Plusieurs fonctions utilisent les énumérations suivantes pour filtrer les données :
51
+
52
+ * **`FinaryPeriod`** : Période temporelle pour les graphiques et variations.
53
+ * `'1d'` (24h), `'1w'` (Semaine), `'1m'` (Mois), `'ytd'` (Depuis début d'année), `'1y'` (1 an), `'all'` (Tout).
54
+ * **`TimeseriesType`** : Type de série temporelle.
55
+ * `'sum'` (Valeur cumulée), `'all'` (Détail).
56
+ * **`DistributionType`** : Type de répartition.
57
+ * `'account'` (Par compte).
58
+ * **`InvestmentDistributionType`** : Type de répartition investissement.
59
+ * `'stock'` (Par action/actif).
60
+
61
+ ---
62
+
63
+ ### 1. Client Principal (`FinaryClient`)
64
+
65
+ Point d'entrée de la librairie.
66
+
67
+ #### `constructor(config)`
68
+ Initialise le client.
69
+ * **Paramètres** :
70
+ * `config` (`AuthConfig`) : Objet de configuration `{ credentialsPath: string }`.
71
+
72
+ #### `getUserProfile()`
73
+ Récupère les informations du profil utilisateur connecté.
74
+ * **Retourne** : `Promise<UserProfile>` (Nom, email, paramètres, etc.)
75
+
76
+ #### `getOrganizations()`
77
+ Liste les organisations (souvent appelées "familles" dans l'UI) associées à l'utilisateur. Vous aurez besoin de l'ID de l'organisation et du membre pour la plupart des autres appels.
78
+ * **Retourne** : `Promise<Organization[]>`
79
+
80
+ ---
81
+
82
+ ### 2. Investissements (`client.investments`)
83
+
84
+ Tous les appels nécessitent généralement `organizationId` et `membershipId`.
85
+
86
+ #### `getPortfolio(organizationId, membershipId, period)`
87
+ Vue d'ensemble du portefeuille d'investissements (Actions, Crypto, Immo, etc.).
88
+ * **Paramètres** :
89
+ * `organizationId` (`string`) : ID de l'organisation.
90
+ * `membershipId` (`string`) : ID du membre.
91
+ * `period` (`FinaryPeriod`, défaut: `YTD`) : Période de calcul des plus/moins-values.
92
+ * **Retourne** : `Promise<InvestmentPortfolio>`
93
+
94
+ #### `getTimeseries(organizationId, membershipId, period, type)`
95
+ Récupère l'historique de la valeur du portefeuille (graphique).
96
+ * **Paramètres** :
97
+ * `period` (`FinaryPeriod`, défaut: `YTD`).
98
+ * `type` (`TimeseriesType`, défaut: `SUM`).
99
+ * **Retourne** : `Promise<Timeseries[]>`
100
+
101
+ #### `getDistribution(organizationId, membershipId, type, period)`
102
+ Répartition des actifs.
103
+ * **Paramètres** :
104
+ * `type` (`InvestmentDistributionType`, défaut: `STOCK`).
105
+ * **Retourne** : `Promise<Distribution>`
106
+
107
+ #### `getDividends(organizationId, membershipId, withRealEstate)`
108
+ Liste les dividendes perçus et à venir.
109
+ * **Paramètres** :
110
+ * `withRealEstate` (`boolean`, défaut: `true`) : Inclure les loyers/dividendes immobiliers (SCPI).
111
+ * **Retourne** : `Promise<DividendsResponse>`
112
+
113
+ #### `getSectorAllocation(organizationId, membershipId)`
114
+ Répartition sectorielle du portefeuille (Technologie, Santé, Finance...).
115
+ * **Retourne** : `Promise<SectorAllocationResponse>`
116
+
117
+ #### `getGeographicalAllocation(organizationId, membershipId)`
118
+ Répartition géographique du portefeuille (USA, Europe, Asie...).
119
+ * **Retourne** : `Promise<GeographicalAllocationResponse>`
120
+
121
+ #### `getFees(organizationId, membershipId)`
122
+ Analyse des frais sur les enveloppes (PEA, CTO, AV...).
123
+ * **Retourne** : `Promise<FeesResponse>`
124
+
125
+ #### `getAccount(organizationId, membershipId, accountId, period)`
126
+ Détails d'un compte spécifique (ex: un PEA particulier).
127
+ * **Paramètres** :
128
+ * `accountId` (`string`) : ID du compte.
129
+ * **Retourne** : `Promise<InvestmentAccount>`
130
+
131
+ #### Méthodes "Account" Spécifiques
132
+ De la même manière que pour le portefeuille global, vous pouvez appeler ces méthodes pour un compte précis :
133
+ * `getAccountTimeseries(orgId, memId, accountId, period, type)`
134
+ * `getAccountDistribution(orgId, memId, accountId, type, period)`
135
+ * `getAccountDividends(orgId, memId, accountId, withRealEstate)`
136
+ * `getAccountSectorAllocation(orgId, memId, accountId)`
137
+ * `getAccountGeographicalAllocation(orgId, memId, accountId)`
138
+ * `getAccountFees(orgId, memId, accountId)`
139
+
140
+ ---
141
+
142
+ ### 3. Épargne (`client.savings`)
143
+
144
+ Concerne les livrets bancaires, fonds euros, etc.
145
+
146
+ #### `getPortfolio(organizationId, membershipId, period)`
147
+ Vue d'ensemble de l'épargne.
148
+ * **Retourne** : `Promise<SavingsPortfolio>`
149
+
150
+ #### `getAccounts(organizationId, membershipId, period)`
151
+ Liste tous les comptes d'épargne.
152
+ * **Retourne** : `Promise<SavingsAccount[]>`
153
+
154
+ #### `getAccount(organizationId, membershipId, accountId, period)`
155
+ Détails d'un compte épargne spécifique.
156
+ * **Retourne** : `Promise<SavingsAccount>`
157
+
158
+ #### `getTransaction(organizationId, membershipId, page, perPage, query, accountId)`
159
+ Récupère les transactions (virements, intérêts).
160
+ * **Paramètres** :
161
+ * `page` (`number`, défaut: `1`) : Numéro de page.
162
+ * `perPage` (`number`, défaut: `50`) : Nombre d'éléments par page.
163
+ * `query` (`string`, optionnel) : Recherche textuelle.
164
+ * `accountId` (`string`, optionnel) : Filtrer par compte spécifique.
165
+ * **Retourne** : `Promise<Transaction[]>`
166
+
167
+ #### `getTimeseries(...)` et `getAccountTimeseries(...)`
168
+ Historique de valeur.
169
+
170
+ ---
171
+
172
+ ### 4. Comptes Courants (`client.checkings`)
173
+
174
+ #### `getPortfolio(organizationId, membershipId, period)`
175
+ Solde total des comptes courants.
176
+ * **Retourne** : `Promise<CheckingPortfolio>`
177
+
178
+ #### `getAccounts(organizationId, membershipId, period)`
179
+ Liste des comptes bancaires.
180
+ * **Retourne** : `Promise<CheckingAccount[]>`
181
+
182
+ #### `getTransactions(...)`
183
+ Récupère les transactions bancaires. Fonctionne identiquement à celle de l'épargne.
184
+
185
+ ---
186
+
187
+ ### 5. Benchmarks (`client.benchmarks`)
188
+
189
+ #### `getAvailableAssets(organizationId, membershipId, period)`
190
+ Récupère la liste des actifs disponibles pour faire des comparaisons de performance.
191
+ * **Retourne** : `Promise<BenchmarkAsset[]>`
192
+
193
+ ## Exemple Complet
194
+
195
+ ```typescript
196
+ import { FinaryClient, FinaryPeriod } from 'finary-community';
197
+
198
+ const client = new FinaryClient({ credentialsPath: './credentials.json' });
199
+
200
+ async function main() {
201
+ // 1. Setup
202
+ const orgs = await client.getOrganizations();
203
+ const orgId = orgs[0].id;
204
+ const memberId = orgs[0].members[0].id;
205
+
206
+ console.log(`Utilisateur : ${orgs[0].name}`);
207
+
208
+ // 2. Investissements
209
+ const investments = await client.investments.getPortfolio(orgId, memberId, FinaryPeriod.YTD);
210
+ console.log(`--- Investissements ---`);
211
+ console.log(`Total : ${investments.total.amount} €`);
212
+ console.log(`Plus-value latente : ${investments.total.unrealized_pnl} €`);
213
+
214
+ // 3. Dividendes à venir
215
+ const dividends = await client.investments.getDividends(orgId, memberId);
216
+ if(dividends.upcoming_dividends.length > 0) {
217
+ console.log(`--- Prochains Dividendes ---`);
218
+ dividends.upcoming_dividends.forEach(div => {
219
+ console.log(`${div.date} : ${div.amount}€ (${div.asset.name})`);
220
+ });
221
+ }
222
+
223
+ // 4. Recherche de transactions Livret A
224
+ const savings = await client.savings.getAccounts(orgId, memberId);
225
+ const livretA = savings.find(s => s.name.includes("Livret A"));
226
+ if (livretA) {
227
+ console.log(`--- Transactions Livret A ---`);
228
+ const txs = await client.savings.getTransactions(orgId, memberId, 1, 5, '', livretA.id);
229
+ txs.forEach(t => console.log(`${t.date} : ${t.amount}€ - ${t.description}`));
230
+ }
231
+ }
232
+
233
+ main().catch(console.error);
234
+ ```
@@ -117,4 +117,4 @@ class AuthManager {
117
117
  }
118
118
  }
119
119
  exports.AuthManager = AuthManager;
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvYXV0aC1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUFtRDtBQUduRCxNQUFhLFdBQVc7SUFLcEIsWUFBWSxNQUFrQjtRQUp0QixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUU1QixzQkFBaUIsR0FBdUIsSUFBSSxDQUFDO1FBR2pELElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztJQUNsRCxDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUUxRCxJQUFJLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBQSxzQkFBWSxFQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBZ0IsQ0FBQztnQkFDekQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDbEMsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsSUFBSSxDQUFDLGVBQWUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRO1FBQ2pCLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFbEMsTUFBTSxLQUFLLEdBQUcsSUFB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TSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNMLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUEvSEQsa0NBK0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcclxuaW1wb3J0IHsgQXV0aENvbmZpZywgQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEF1dGhNYW5hZ2VyIHtcclxuICAgIHByaXZhdGUgdG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBjcmVkZW50aWFsc1BhdGg6IHN0cmluZztcclxuICAgIHByaXZhdGUgY2FjaGVkQ3JlZGVudGlhbHM6IENyZWRlbnRpYWxzIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBBdXRoQ29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5jcmVkZW50aWFsc1BhdGggPSBjb25maWcuY3JlZGVudGlhbHNQYXRoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZENyZWRlbnRpYWxzKCk6IENyZWRlbnRpYWxzIHtcclxuICAgICAgICBpZiAodGhpcy5jYWNoZWRDcmVkZW50aWFscykgcmV0dXJuIHRoaXMuY2FjaGVkQ3JlZGVudGlhbHM7XHJcblxyXG4gICAgICAgIGlmIChleGlzdHNTeW5jKHRoaXMuY3JlZGVudGlhbHNQYXRoKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJlYWRGaWxlU3luYyh0aGlzLmNyZWRlbnRpYWxzUGF0aCwgXCJ1dGYtOFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVkQ3JlZGVudGlhbHMgPSBKU09OLnBhcnNlKGRhdGEpIGFzIENyZWRlbnRpYWxzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkQ3JlZGVudGlhbHM7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBjcmVkZW50aWFscyBhdCAke3RoaXMuY3JlZGVudGlhbHNQYXRofTogJHtlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWRlbnRpYWxzLmpzb24gbm90IGZvdW5kIGF0ICR7dGhpcy5jcmVkZW50aWFsc1BhdGh9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKHRoaXMudG9rZW4pIHJldHVybiB0aGlzLnRva2VuO1xyXG5cclxuICAgICAgICBjb25zdCBjcmVkcyA9IHRoaXMubG9hZENyZWRlbnRpYWxzKCk7XHJcbiAgICAgICAgaWYgKGNyZWRzLnRva2VuKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSBjcmVkcy50b2tlbjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9rZW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB0b2tlbiBmb3VuZCBpbiBjcmVkZW50aWFscy5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENyZWRlbnRpYWxzKCk6IENyZWRlbnRpYWxzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ3JlZGVudGlhbHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgcmVmcmVzaFRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgY29uc3QgY3JlZHMgPSB0aGlzLmxvYWRDcmVkZW50aWFscygpO1xyXG5cclxuICAgICAgICAvLyAxLiBDbGVyayBSZWZyZXNoXHJcbiAgICAgICAgaWYgKGNyZWRzLmNsZXJrU2Vzc2lvbiAmJiB0aGlzLnRva2VuKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5wYXJzZUp3dCh0aGlzLnRva2VuKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGRlY29kZWQgPyBkZWNvZGVkLnNpZCA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZXJrVXJsID0gYGh0dHBzOi8vY2xlcmsuZmluYXJ5LmNvbS92MS9jbGllbnQvc2Vzc2lvbnMvJHtzZXNzaW9uSWR9L3Rva2Vucz9fX2NsZXJrX2FwaV92ZXJzaW9uPTIwMjUtMTEtMTAmX2NsZXJrX2pzX3ZlcnNpb249NS4xMTcuMGA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29va2llSGVhZGVyID0gY3JlZHMuY29va2llSGVhZGVyIHx8IGBfX3Nlc3Npb249JHtjcmVkcy5jbGVya1Nlc3Npb259YDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChjbGVya1VybCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNvb2tpZVwiOiBjb29raWVIZWFkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5cIjogXCJodHRwczovL2FwcC5maW5hcnkuY29tXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlJlZmVyZXJcIjogXCJodHRwczovL2FwcC5maW5hcnkuY29tL1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGNyZWRzLmhlYWRlcnM/LlsndXNlci1hZ2VudCddIHx8IFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzE0My4wLjAuMCBTYWZhcmkvNTM3LjM2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogXCJvcmdhbml6YXRpb25faWQ9XCJcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBhbnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuand0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2VuID0gZGF0YS5qd3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbiBhcyBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENsZXJrIHJlZnJlc2ggZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENsZXJrIHJlZnJlc2ggZXJyb3I6ICR7ZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gMi4gTGVnYWN5IFJlZnJlc2hcclxuICAgICAgICBpZiAoIWNyZWRzLnJlZnJlc2hVcmwgfHwgIWNyZWRzLmhlYWRlcnMpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBpbmZvIHRvIHJlZnJlc2ggdG9rZW4gKGxlZ2FjeSkuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgLi4uY3JlZHMuaGVhZGVycyB9O1xyXG4gICAgICAgICAgICAvLyBDbGVhbnVwIGhlYWRlcnMgbWFudWFsbHkgc2luY2Ugd2UgY2FuJ3QgdXNlIGFyYml0cmFyeSB0eXBlcyBlYXNpbHkgb24gaGVhZGVycyBvYmplY3RcclxuICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzWydob3N0J107XHJcbiAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzWydjb25uZWN0aW9uJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzWydvcmlnaW4nXTtcclxuICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbJ3JlZmVyZXInXTtcclxuICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbJ2Nvb2tpZSddO1xyXG5cclxuICAgICAgICAgICAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChrZXkgPT4geyBpZiAoa2V5LnN0YXJ0c1dpdGgoJzonKSkgZGVsZXRlIGhlYWRlcnNba2V5XTsgfSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGNyZWRzLnJlZnJlc2hVcmwsIHtcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGVnYWN5IHJlZnJlc2ggZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIGFueTtcclxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5qd3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9rZW4gPSBkYXRhLmp3dDtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2VuIGFzIHN0cmluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBKV1QgaW4gcmVmcmVzaCByZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBUb2tlbiBSZWZyZXNoIEVycm9yOiAke2V9YCk7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGFyc2VKd3QodG9rZW46IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoQnVmZmVyLmZyb20odG9rZW4uc3BsaXQoJy4nKVsxXSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvYXV0aC1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUFtRDtBQUduRCxNQUFhLFdBQVc7SUFLcEIsWUFBWSxNQUFrQjtRQUp0QixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUU1QixzQkFBaUIsR0FBdUIsSUFBSSxDQUFDO1FBR2pELElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztJQUNsRCxDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUUxRCxJQUFJLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBQSxzQkFBWSxFQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBZ0IsQ0FBQztnQkFDekQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDbEMsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsSUFBSSxDQUFDLGVBQWUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRO1FBQ2pCLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFbEMsTUFBTSxLQUFLLEdBQUcsSUFB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TSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNMLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUEvSEQsa0NBK0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IEF1dGhDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcblxuZXhwb3J0IGNsYXNzIEF1dGhNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGNyZWRlbnRpYWxzUGF0aDogc3RyaW5nO1xuICAgIHByaXZhdGUgY2FjaGVkQ3JlZGVudGlhbHM6IENyZWRlbnRpYWxzIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IEF1dGhDb25maWcpIHtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFsc1BhdGggPSBjb25maWcuY3JlZGVudGlhbHNQYXRoO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZENyZWRlbnRpYWxzKCk6IENyZWRlbnRpYWxzIHtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVkQ3JlZGVudGlhbHMpIHJldHVybiB0aGlzLmNhY2hlZENyZWRlbnRpYWxzO1xuXG4gICAgICAgIGlmIChleGlzdHNTeW5jKHRoaXMuY3JlZGVudGlhbHNQYXRoKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gcmVhZEZpbGVTeW5jKHRoaXMuY3JlZGVudGlhbHNQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVkQ3JlZGVudGlhbHMgPSBKU09OLnBhcnNlKGRhdGEpIGFzIENyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlZENyZWRlbnRpYWxzO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBjcmVkZW50aWFscyBhdCAke3RoaXMuY3JlZGVudGlhbHNQYXRofTogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjcmVkZW50aWFscy5qc29uIG5vdCBmb3VuZCBhdCAke3RoaXMuY3JlZGVudGlhbHNQYXRofWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy50b2tlbikgcmV0dXJuIHRoaXMudG9rZW47XG5cbiAgICAgICAgY29uc3QgY3JlZHMgPSB0aGlzLmxvYWRDcmVkZW50aWFscygpO1xuICAgICAgICBpZiAoY3JlZHMudG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSBjcmVkcy50b2tlbjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdG9rZW4gZm91bmQgaW4gY3JlZGVudGlhbHMuXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDcmVkZW50aWFscygpOiBDcmVkZW50aWFscyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRDcmVkZW50aWFscygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWZyZXNoVG9rZW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgY3JlZHMgPSB0aGlzLmxvYWRDcmVkZW50aWFscygpO1xuXG4gICAgICAgIC8vIDEuIENsZXJrIFJlZnJlc2hcbiAgICAgICAgaWYgKGNyZWRzLmNsZXJrU2Vzc2lvbiAmJiB0aGlzLnRva2VuKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLnBhcnNlSnd0KHRoaXMudG9rZW4pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGRlY29kZWQgPyBkZWNvZGVkLnNpZCA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZXJrVXJsID0gYGh0dHBzOi8vY2xlcmsuZmluYXJ5LmNvbS92MS9jbGllbnQvc2Vzc2lvbnMvJHtzZXNzaW9uSWR9L3Rva2Vucz9fX2NsZXJrX2FwaV92ZXJzaW9uPTIwMjUtMTEtMTAmX2NsZXJrX2pzX3ZlcnNpb249NS4xMTcuMGA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb2tpZUhlYWRlciA9IGNyZWRzLmNvb2tpZUhlYWRlciB8fCBgX19zZXNzaW9uPSR7Y3JlZHMuY2xlcmtTZXNzaW9ufWA7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChjbGVya1VybCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNvb2tpZVwiOiBjb29raWVIZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpblwiOiBcImh0dHBzOi8vYXBwLmZpbmFyeS5jb21cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlJlZmVyZXJcIjogXCJodHRwczovL2FwcC5maW5hcnkuY29tL1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBjcmVkcy5oZWFkZXJzPy5bJ3VzZXItYWdlbnQnXSB8fCBcIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xNDMuMC4wLjAgU2FmYXJpLzUzNy4zNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogXCJvcmdhbml6YXRpb25faWQ9XCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5qd3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2VuID0gZGF0YS5qd3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9rZW4gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBDbGVyayByZWZyZXNoIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ2xlcmsgcmVmcmVzaCBlcnJvcjogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gTGVnYWN5IFJlZnJlc2hcbiAgICAgICAgaWYgKCFjcmVkcy5yZWZyZXNoVXJsIHx8ICFjcmVkcy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGluZm8gdG8gcmVmcmVzaCB0b2tlbiAobGVnYWN5KS5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgLi4uY3JlZHMuaGVhZGVycyB9O1xuICAgICAgICAgICAgLy8gQ2xlYW51cCBoZWFkZXJzIG1hbnVhbGx5IHNpbmNlIHdlIGNhbid0IHVzZSBhcmJpdHJhcnkgdHlwZXMgZWFzaWx5IG9uIGhlYWRlcnMgb2JqZWN0XG4gICAgICAgICAgICBkZWxldGUgaGVhZGVyc1snY29udGVudC1sZW5ndGgnXTtcbiAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzWydob3N0J107XG4gICAgICAgICAgICBkZWxldGUgaGVhZGVyc1snY29ubmVjdGlvbiddO1xuICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbJ29yaWdpbiddO1xuICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbJ3JlZmVyZXInXTtcbiAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzWydjb29raWUnXTtcblxuICAgICAgICAgICAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChrZXkgPT4geyBpZiAoa2V5LnN0YXJ0c1dpdGgoJzonKSkgZGVsZXRlIGhlYWRlcnNba2V5XTsgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goY3JlZHMucmVmcmVzaFVybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZWdhY3kgcmVmcmVzaCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgYW55O1xuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5qd3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRva2VuID0gZGF0YS5qd3Q7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9rZW4gYXMgc3RyaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gSldUIGluIHJlZnJlc2ggcmVzcG9uc2VcIik7XG5cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgVG9rZW4gUmVmcmVzaCBFcnJvcjogJHtlfWApO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VKd3QodG9rZW46IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShCdWZmZXIuZnJvbSh0b2tlbi5zcGxpdCgnLicpWzFdLCAnYmFzZTY0JykudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -160,4 +160,4 @@ async function createSession(options = {}) {
160
160
  await browser.close();
161
161
  }
162
162
  }
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4taGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvbG9naW4taGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBU0Esc0NBMEtDO0FBbkxELDBEQUFrQztBQUNsQyxzREFBeUI7QUFDekIsMERBQTZCO0FBT3RCLEtBQUssVUFBVSxhQUFhLENBQUMsVUFBZ0MsRUFBRTtJQUNsRSxNQUFNLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQzFELE9BQU8sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFFMUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNiLDBCQUEwQjtRQUMxQixNQUFNLEdBQUcsR0FBRyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUM7Z0JBQ0QsaUJBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBRXZELElBQUksT0FBTyxDQUFD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TyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM1RCxDQUFDO1lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztnQkFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixVQUFVLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3JFLE1BQU0sQ0FBQyxDQUFDO1lBQ1osQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDNUQsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUUxRCxPQUFPLGVBQWUsQ0FBQztJQUUzQixDQUFDO1lBQVMsQ0FBQztRQUNQLElBQUksT0FBTztZQUFFLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xyXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XHJcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVNlc3Npb25PcHRpb25zIHtcclxuICAgIGhlYWRsZXNzPzogYm9vbGVhbjtcclxuICAgIG91dHB1dFBhdGg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZXNzaW9uKG9wdGlvbnM6IENyZWF0ZVNlc3Npb25PcHRpb25zID0ge30pIHtcclxuICAgIGNvbnN0IHsgaGVhZGxlc3MgPSBmYWxzZSwgb3V0cHV0UGF0aCB9ID0gb3B0aW9ucztcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiKTtcclxuICAgIGNvbnNvbGUubG9nKFwiICAgRmluYXJ5IFNldHVwIC0gQnJvd3NlciBMb2dpblwiKTtcclxuICAgIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCIpO1xyXG5cclxuICAgIGlmIChvdXRwdXRQYXRoKSB7XHJcbiAgICAgICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcclxuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUob3V0cHV0UGF0aCk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGRpcikpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgY3JlYXRpbmcgZGlyZWN0b3J5ICR7ZGlyfTogJHtlLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2coYFdpbGwgc2F2ZSB0bzogJHtvdXRwdXRQYXRofWApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiTGF1bmNoaW5nIGJyb3dzZXIgZm9yIGF1dGhlbnRpY2F0aW9uLi4uXCIpO1xyXG5cclxuICAgIGxldCBicm93c2VyO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCh7XHJcbiAgICAgICAgICAgIGhlYWRsZXNzOiBoZWFkbGVzcyxcclxuICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiBudWxsLFxyXG4gICAgICAgICAgICBhcmdzOiBbJy0tc3RhcnQtbWF4aW1pemVkJ10gLy8gRmluZCBicm93c2VyIHdpbmRvdyBlYXNpZXJcclxuICAgICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbGF1bmNoIGJyb3dzZXIuIE1ha2Ugc3VyZSB5b3UgaW5zdGFsbGVkIHB1cHBldGVlcjogbnBtIGluc3RhbGwgcHVwcGV0ZWVyXCIpO1xyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XHJcblxyXG4gICAgICAgIGF3YWl0IHBhZ2Uuc2V0UmVxdWVzdEludGVyY2VwdGlvbihmYWxzZSk7IC8vIEVuc3VyZSBpbnRlcmNlcHRpb24gZG9lcyBub3QgYmxvY2sgdW5sZXNzIGludGVuZGVkXHJcbiAgICAgICAgcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybCgpO1xyXG4gICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdjbGVyay5maW5hcnkuY29tJykpIHtcclxuICAgICAgICAgICAgICAgIC8vIE9wdGlvbmFsOiBsb2cgb3IgaGFuZGxlIGNsZXJrIHJlcXVlc3RzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJOYXZpZ2F0aW5nIHRvIEZpbmFyeSBsb2dpbiBwYWdlLi4uXCIpO1xyXG4gICAgICAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9hcHAuZmluYXJ5LmNvbS92MicsIHsgd2FpdFVudGlsOiAnZG9tY29udGVudGxvYWRlZCcgfSk7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiXFxuQUNUSU9OIFJFUVVJUkVEOiBQbGVhc2UgbG9nIGluIHRvIHlvdXIgRmluYXJ5IGFjY291bnQgaW4gdGhlIG9wZW5lZCBicm93c2VyIHdpbmRvdy5cXG5cIik7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJTY2FubmluZyBuZXR3b3JrIHRyYWZmaWMgZm9yIGF1dGhlbnRpY2F0aW9uIHRva2VuLi4uXCIpO1xyXG5cclxuICAgICAgICAvLyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmFsaWQgdG9rZW4gaXMgZm91bmRcclxuICAgICAgICBjb25zdCB3YWl0Rm9yVG9rZW4gPSBuZXcgUHJvbWlzZTx7IHRva2VuOiBzdHJpbmcsIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfT4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgcGFnZS5vbigncmVzcG9uc2UnLCByZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gcmVzcG9uc2UucmVxdWVzdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmwoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgQVBJIHJlcXVlc3RzXHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdhcGkuZmluYXJ5LmNvbScpIHx8IHVybC5pbmNsdWRlcygnY2xlcmsuZmluYXJ5LmNvbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSB3YW50IHN1Y2Nlc3NmdWwgcmVxdWVzdHMgdG8gZW5zdXJlIHRoZSB0b2tlbiBpcyB2YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMoKSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSByZXF1ZXN0LmhlYWRlcnMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0aCA9IGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRoICYmIGF1dGguc3RhcnRzV2l0aCgnQmVhcmVyIGV5JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gYXV0aC5yZXBsYWNlKCdCZWFyZXIgJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLinIUgVmFsaWQgdG9rZW4gc3VjY2Vzc2Z1bGx5IGRldGVjdGVkIGZyb20gc3VjY2Vzc2Z1bCByZXF1ZXN0IVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyB0b2tlbiwgaGVhZGVycyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHsgdG9rZW4sIGhlYWRlcnMgfSA9IGF3YWl0IHdhaXRGb3JUb2tlbjtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJUb2tlbiBkZXRlY3RlZCEgY2FwdHVyaW5nIGNvb2tpZXMuLi5cIik7XHJcbiAgICAgICAgLy8gQ2FwdHVyZSBjb29raWVzIGZvciBib3RoIHRoZSBtYWluIGFwcCBhbmQgdGhlIGNsZXJrIHN1YmRvbWFpbiB0byBlbnN1cmUgd2UgZ2V0IF9fY2xpZW50LCBfX3Nlc3Npb24sIGV0Yy5cclxuICAgICAgICBjb25zdCBjb29raWVzID0gYXdhaXQgcGFnZS5jb29raWVzKCdodHRwczovL2FwcC5maW5hcnkuY29tJywgJ2h0dHBzOi8vY2xlcmsuZmluYXJ5LmNvbScpO1xyXG4gICAgICAgIGNvbnN0IGNvb2tpZUhlYWRlciA9IGNvb2tpZXMubWFwKGMgPT4gYCR7Yy5uYW1lfT0ke2MudmFsdWV9YCkuam9pbignOyAnKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbkNvb2tpZSA9IGNvb2tpZXMuZmluZChjID0+IGMubmFtZSA9PT0gJ19fc2Vzc2lvbicpO1xyXG4gICAgICAgIGNvbnN0IGNsZXJrU2Vzc2lvbiA9IHNlc3Npb25Db29raWUgPyBzZXNzaW9uQ29va2llLnZhbHVlIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGNvb2tpZUhlYWRlcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuKchSBDb29raWVzIGNhcHR1cmVkIVwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCLimqDvuI8gTm8gY29va2llcyBmb3VuZC4gUmVmcmVzaCB2ZXJpZnkgbWlnaHQgZmFpbC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIkZldGNoaW5nIHVzZXIgZGV0YWlscy4uLlwiKTtcclxuXHJcbiAgICAgICAgLy8gVXNlIHRoZSB0b2tlbiB0byBpZGVudGlmeSB0aGUgdXNlclxyXG4gICAgICAgIGxldCBlbWFpbCA9IFwidW5rbm93bl91c2VyQGV4YW1wbGUuY29tXCI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgbWVSZXNwID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2FwaS5maW5hcnkuY29tL3VzZXJzL21lXCIsIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIjogYEJlYXJlciAke3Rva2VufWAsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IFwiTW96aWxsYS81LjBcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtZVJlc3Aub2spIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBtZVJlc3AuanNvbigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmVtYWlsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW1haWwgPSBkYXRhLnJlc3VsdC5lbWFpbDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSWRlbnRpZmllZCBhczogJHtlbWFpbH1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgZmV0Y2ggdXNlciBlbWFpbCAobWlub3IgaXNzdWUpLCBwcm9jZWVkaW5nIGFueXdheS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGaWx0ZXIgaGVhZGVycyBiYXNlZCBvbiB1c2VyIHJlcXVlc3QgKFwib25seSB0aGVzZSBzcGVjaWZpYyBoZWFkZXJzXCIpXHJcbiAgICAgICAgY29uc3QgYWxsb3dlZEhlYWRlcktleXMgPSBbXHJcbiAgICAgICAgICAgIFwic2VjLWNoLXVhLXBsYXRmb3JtXCIsXHJcbiAgICAgICAgICAgIFwieC1jbGllbnQtYXBpLXZlcnNpb25cIixcclxuICAgICAgICAgICAgXCJyZWZlcmVyXCIsXHJcbiAgICAgICAgICAgIFwiYWNjZXB0LWxhbmd1YWdlXCIsXHJcbiAgICAgICAgICAgIFwic2VjLWNoLXVhXCIsXHJcbiAgICAgICAgICAgIFwic2VjLWNoLXVhLW1vYmlsZVwiLFxyXG4gICAgICAgICAgICBcInVzZXItYWdlbnRcIixcclxuICAgICAgICAgICAgXCJ4LWZpbmFyeS1jbGllbnQtaWRcIixcclxuICAgICAgICAgICAgXCI6YXV0aG9yaXR5XCIsXHJcbiAgICAgICAgICAgIFwiOm1ldGhvZFwiLFxyXG4gICAgICAgICAgICBcIjpzY2hlbWVcIixcclxuICAgICAgICAgICAgXCJhY2NlcHRcIixcclxuICAgICAgICAgICAgXCJhY2NlcHQtZW5jb2RpbmdcIixcclxuICAgICAgICAgICAgXCJvcmlnaW5cIixcclxuICAgICAgICAgICAgXCJwcmlvcml0eVwiLFxyXG4gICAgICAgICAgICBcInNlYy1mZXRjaC1kZXN0XCIsXHJcbiAgICAgICAgICAgIFwic2VjLWZldGNoLW1vZGVcIixcclxuICAgICAgICAgICAgXCJzZWMtZmV0Y2gtc2l0ZVwiXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsdGVyZWRIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgYWxsb3dlZEhlYWRlcktleXMpIHtcclxuICAgICAgICAgICAgaWYgKGhlYWRlcnNba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRIZWFkZXJzW2tleV0gPSBoZWFkZXJzW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWxzRGF0YSA9IHtcclxuICAgICAgICAgICAgdG9rZW46IHRva2VuLFxyXG4gICAgICAgICAgICByZWZyZXNoVXJsOiBcImh0dHBzOi8vY2xlcmsuZmluYXJ5LmNvbS92MS9jbGllbnQvc2Vzc2lvbnNcIixcclxuICAgICAgICAgICAgaGVhZGVyczogZmlsdGVyZWRIZWFkZXJzLFxyXG4gICAgICAgICAgICBjbGVya1Nlc3Npb246IGNsZXJrU2Vzc2lvbiwgLy8gS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxyXG4gICAgICAgICAgICBjb29raWVIZWFkZXI6IGNvb2tpZUhlYWRlcixcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAob3V0cHV0UGF0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBqc29uQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KGNyZWRlbnRpYWxzRGF0YSwgbnVsbCwgNCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIGpzb25Db250ZW50KTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbT0tdIFNhdmVkIGNyZWRlbnRpYWxzIHRvOiAke291dHB1dFBhdGh9YCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0VSUl0gRmFpbGVkIHRvIHNhdmUgdG8gJHtvdXRwdXRQYXRofTogJHtlLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIlxcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlNVQ0NFU1MhIFNldHVwIGNvbXBsZXRlLlwiKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzRGF0YTtcclxuXHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGlmIChicm93c2VyKSBhd2FpdCBicm93c2VyLmNsb3NlKCk7XHJcbiAgICB9XHJcbn1cclxuIl19
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4taGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvbG9naW4taGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBU0Esc0NBMEtDO0FBbkxELDBEQUFrQztBQUNsQyxzREFBeUI7QUFDekIsMERBQTZCO0FBT3RCLEtBQUssVUFBVSxhQUFhLENBQUMsVUFBZ0MsRUFBRTtJQUNsRSxNQUFNLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQzFELE9BQU8sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFFMUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNiLDBCQUEwQjtRQUMxQixNQUFNLEdBQUcsR0FBRyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUM7Z0JBQ0QsaUJBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBRXZELElBQUksT0FBTyxDQUFD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TyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM1RCxDQUFDO1lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztnQkFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixVQUFVLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3JFLE1BQU0sQ0FBQyxDQUFDO1lBQ1osQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDNUQsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUUxRCxPQUFPLGVBQWUsQ0FBQztJQUUzQixDQUFDO1lBQVMsQ0FBQztRQUNQLElBQUksT0FBTztZQUFFLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTZXNzaW9uT3B0aW9ucyB7XG4gICAgaGVhZGxlc3M/OiBib29sZWFuO1xuICAgIG91dHB1dFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZXNzaW9uKG9wdGlvbnM6IENyZWF0ZVNlc3Npb25PcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGhlYWRsZXNzID0gZmFsc2UsIG91dHB1dFBhdGggfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiKTtcbiAgICBjb25zb2xlLmxvZyhcIiAgIEZpbmFyeSBTZXR1cCAtIEJyb3dzZXIgTG9naW5cIik7XG4gICAgY29uc29sZS5sb2coXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XG5cbiAgICBpZiAob3V0cHV0UGF0aCkge1xuICAgICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUob3V0cHV0UGF0aCk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBjcmVhdGluZyBkaXJlY3RvcnkgJHtkaXJ9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgV2lsbCBzYXZlIHRvOiAke291dHB1dFBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXCJMYXVuY2hpbmcgYnJvd3NlciBmb3IgYXV0aGVudGljYXRpb24uLi5cIik7XG5cbiAgICBsZXQgYnJvd3NlcjtcbiAgICB0cnkge1xuICAgICAgICBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCh7XG4gICAgICAgICAgICBoZWFkbGVzczogaGVhZGxlc3MsXG4gICAgICAgICAgICBkZWZhdWx0Vmlld3BvcnQ6IG51bGwsXG4gICAgICAgICAgICBhcmdzOiBbJy0tc3RhcnQtbWF4aW1pemVkJ10gLy8gRmluZCBicm93c2VyIHdpbmRvdyBlYXNpZXJcbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbGF1bmNoIGJyb3dzZXIuIE1ha2Ugc3VyZSB5b3UgaW5zdGFsbGVkIHB1cHBldGVlcjogbnBtIGluc3RhbGwgcHVwcGV0ZWVyXCIpO1xuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcblxuICAgICAgICBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24oZmFsc2UpOyAvLyBFbnN1cmUgaW50ZXJjZXB0aW9uIGRvZXMgbm90IGJsb2NrIHVubGVzcyBpbnRlbmRlZFxuICAgICAgICBwYWdlLm9uKCdyZXF1ZXN0JywgcmVxdWVzdCA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybCgpO1xuICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnY2xlcmsuZmluYXJ5LmNvbScpKSB7XG4gICAgICAgICAgICAgICAgLy8gT3B0aW9uYWw6IGxvZyBvciBoYW5kbGUgY2xlcmsgcmVxdWVzdHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJOYXZpZ2F0aW5nIHRvIEZpbmFyeSBsb2dpbiBwYWdlLi4uXCIpO1xuICAgICAgICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vYXBwLmZpbmFyeS5jb20vdjInLCB7IHdhaXRVbnRpbDogJ2RvbWNvbnRlbnRsb2FkZWQnIH0pO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKFwiXFxuQUNUSU9OIFJFUVVJUkVEOiBQbGVhc2UgbG9nIGluIHRvIHlvdXIgRmluYXJ5IGFjY291bnQgaW4gdGhlIG9wZW5lZCBicm93c2VyIHdpbmRvdy5cXG5cIik7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiU2Nhbm5pbmcgbmV0d29yayB0cmFmZmljIGZvciBhdXRoZW50aWNhdGlvbiB0b2tlbi4uLlwiKTtcblxuICAgICAgICAvLyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmFsaWQgdG9rZW4gaXMgZm91bmRcbiAgICAgICAgY29uc3Qgd2FpdEZvclRva2VuID0gbmV3IFByb21pc2U8eyB0b2tlbjogc3RyaW5nLCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBwYWdlLm9uKCdyZXNwb25zZScsIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gcmVzcG9uc2UucmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgQVBJIHJlcXVlc3RzXG4gICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnYXBpLmZpbmFyeS5jb20nKSB8fCB1cmwuaW5jbHVkZXMoJ2NsZXJrLmZpbmFyeS5jb20nKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHdhbnQgc3VjY2Vzc2Z1bCByZXF1ZXN0cyB0byBlbnN1cmUgdGhlIHRva2VuIGlzIHZhbGlkXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMoKSA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gcmVxdWVzdC5oZWFkZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRoID0gaGVhZGVyc1snYXV0aG9yaXphdGlvbiddO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aCAmJiBhdXRoLnN0YXJ0c1dpdGgoJ0JlYXJlciBleScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBhdXRoLnJlcGxhY2UoJ0JlYXJlciAnLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLinIUgVmFsaWQgdG9rZW4gc3VjY2Vzc2Z1bGx5IGRldGVjdGVkIGZyb20gc3VjY2Vzc2Z1bCByZXF1ZXN0IVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgdG9rZW4sIGhlYWRlcnMgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgeyB0b2tlbiwgaGVhZGVycyB9ID0gYXdhaXQgd2FpdEZvclRva2VuO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVG9rZW4gZGV0ZWN0ZWQhIGNhcHR1cmluZyBjb29raWVzLi4uXCIpO1xuICAgICAgICAvLyBDYXB0dXJlIGNvb2tpZXMgZm9yIGJvdGggdGhlIG1haW4gYXBwIGFuZCB0aGUgY2xlcmsgc3ViZG9tYWluIHRvIGVuc3VyZSB3ZSBnZXQgX19jbGllbnQsIF9fc2Vzc2lvbiwgZXRjLlxuICAgICAgICBjb25zdCBjb29raWVzID0gYXdhaXQgcGFnZS5jb29raWVzKCdodHRwczovL2FwcC5maW5hcnkuY29tJywgJ2h0dHBzOi8vY2xlcmsuZmluYXJ5LmNvbScpO1xuICAgICAgICBjb25zdCBjb29raWVIZWFkZXIgPSBjb29raWVzLm1hcChjID0+IGAke2MubmFtZX09JHtjLnZhbHVlfWApLmpvaW4oJzsgJyk7XG5cbiAgICAgICAgY29uc3Qgc2Vzc2lvbkNvb2tpZSA9IGNvb2tpZXMuZmluZChjID0+IGMubmFtZSA9PT0gJ19fc2Vzc2lvbicpO1xuICAgICAgICBjb25zdCBjbGVya1Nlc3Npb24gPSBzZXNzaW9uQ29va2llID8gc2Vzc2lvbkNvb2tpZS52YWx1ZSA6IG51bGw7XG5cbiAgICAgICAgaWYgKGNvb2tpZUhlYWRlcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLinIUgQ29va2llcyBjYXB0dXJlZCFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCLimqDvuI8gTm8gY29va2llcyBmb3VuZC4gUmVmcmVzaCB2ZXJpZnkgbWlnaHQgZmFpbC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhcIkZldGNoaW5nIHVzZXIgZGV0YWlscy4uLlwiKTtcblxuICAgICAgICAvLyBVc2UgdGhlIHRva2VuIHRvIGlkZW50aWZ5IHRoZSB1c2VyXG4gICAgICAgIGxldCBlbWFpbCA9IFwidW5rbm93bl91c2VyQGV4YW1wbGUuY29tXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZVJlc3AgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmZpbmFyeS5jb20vdXNlcnMvbWVcIiwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICAgICAgICAgICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChtZVJlc3Aub2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgbWVSZXNwLmpzb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuZW1haWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1haWwgPSBkYXRhLnJlc3VsdC5lbWFpbDtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYElkZW50aWZpZWQgYXM6ICR7ZW1haWx9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCBmZXRjaCB1c2VyIGVtYWlsIChtaW5vciBpc3N1ZSksIHByb2NlZWRpbmcgYW55d2F5LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbHRlciBoZWFkZXJzIGJhc2VkIG9uIHVzZXIgcmVxdWVzdCAoXCJvbmx5IHRoZXNlIHNwZWNpZmljIGhlYWRlcnNcIilcbiAgICAgICAgY29uc3QgYWxsb3dlZEhlYWRlcktleXMgPSBbXG4gICAgICAgICAgICBcInNlYy1jaC11YS1wbGF0Zm9ybVwiLFxuICAgICAgICAgICAgXCJ4LWNsaWVudC1hcGktdmVyc2lvblwiLFxuICAgICAgICAgICAgXCJyZWZlcmVyXCIsXG4gICAgICAgICAgICBcImFjY2VwdC1sYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJzZWMtY2gtdWFcIixcbiAgICAgICAgICAgIFwic2VjLWNoLXVhLW1vYmlsZVwiLFxuICAgICAgICAgICAgXCJ1c2VyLWFnZW50XCIsXG4gICAgICAgICAgICBcIngtZmluYXJ5LWNsaWVudC1pZFwiLFxuICAgICAgICAgICAgXCI6YXV0aG9yaXR5XCIsXG4gICAgICAgICAgICBcIjptZXRob2RcIixcbiAgICAgICAgICAgIFwiOnNjaGVtZVwiLFxuICAgICAgICAgICAgXCJhY2NlcHRcIixcbiAgICAgICAgICAgIFwiYWNjZXB0LWVuY29kaW5nXCIsXG4gICAgICAgICAgICBcIm9yaWdpblwiLFxuICAgICAgICAgICAgXCJwcmlvcml0eVwiLFxuICAgICAgICAgICAgXCJzZWMtZmV0Y2gtZGVzdFwiLFxuICAgICAgICAgICAgXCJzZWMtZmV0Y2gtbW9kZVwiLFxuICAgICAgICAgICAgXCJzZWMtZmV0Y2gtc2l0ZVwiXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgZmlsdGVyZWRIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFsbG93ZWRIZWFkZXJLZXlzKSB7XG4gICAgICAgICAgICBpZiAoaGVhZGVyc1trZXldKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRIZWFkZXJzW2tleV0gPSBoZWFkZXJzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjcmVkZW50aWFsc0RhdGEgPSB7XG4gICAgICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVXJsOiBcImh0dHBzOi8vY2xlcmsuZmluYXJ5LmNvbS92MS9jbGllbnQvc2Vzc2lvbnNcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IGZpbHRlcmVkSGVhZGVycyxcbiAgICAgICAgICAgIGNsZXJrU2Vzc2lvbjogY2xlcmtTZXNzaW9uLCAvLyBLZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICBjb29raWVIZWFkZXI6IGNvb2tpZUhlYWRlcixcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob3V0cHV0UGF0aCkge1xuICAgICAgICAgICAgY29uc3QganNvbkNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShjcmVkZW50aWFsc0RhdGEsIG51bGwsIDQpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIGpzb25Db250ZW50KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW09LXSBTYXZlZCBjcmVkZW50aWFscyB0bzogJHtvdXRwdXRQYXRofWApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0VSUl0gRmFpbGVkIHRvIHNhdmUgdG8gJHtvdXRwdXRQYXRofTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKFwiXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCIpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlNVQ0NFU1MhIFNldHVwIGNvbXBsZXRlLlwiKTtcbiAgICAgICAgY29uc29sZS5sb2coXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XG5cbiAgICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzRGF0YTtcblxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChicm93c2VyKSBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gICAgfVxufVxuIl19
@@ -12,4 +12,4 @@ class BenchmarkClient {
12
12
  }
13
13
  }
14
14
  exports.BenchmarkClient = BenchmarkClient;
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvYmVuY2htYXJrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4Q0FBNkU7QUFHN0UsTUFBYSxlQUFlO0lBQ3hCLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUFJLENBQUM7SUFFaEQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGNBQXNCLEVBQUUsWUFBb0IsRUFBRSxTQUF1Qix5QkFBWSxDQUFDLEdBQUc7UUFDakgsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUMzRCxrQkFBa0IsY0FBYyxnQkFBZ0IsWUFBWSx1Q0FBdUMsTUFBTSxFQUFFLENBQzlHLENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztDQUNKO0FBVEQsMENBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaW5hcnlSZXNwb25zZSwgQmVuY2htYXJrQXNzZXQsIEZpbmFyeVBlcmlvZCB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IFJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcIi4vY2hlY2tpbmdzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQmVuY2htYXJrQ2xpZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVxdWVzdEhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKSB7IH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0QXZhaWxhYmxlQXNzZXRzKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIG1lbWJlcnNoaXBJZDogc3RyaW5nLCBwZXJpb2Q6IEZpbmFyeVBlcmlvZCA9IEZpbmFyeVBlcmlvZC5ZVEQpOiBQcm9taXNlPEJlbmNobWFya0Fzc2V0W10+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdEhhbmRsZXIuYXV0aGVudGljYXRlZFJlcXVlc3Q8RmluYXJ5UmVzcG9uc2U8QmVuY2htYXJrQXNzZXRbXT4+KFxyXG4gICAgICAgICAgICBgL29yZ2FuaXphdGlvbnMvJHtvcmdhbml6YXRpb25JZH0vbWVtYmVyc2hpcHMvJHttZW1iZXJzaGlwSWR9L2JlbmNobWFya3MvYXZhaWxhYmxlX2Fzc2V0cz9wZXJpb2Q9JHtwZXJpb2R9YFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdDtcclxuICAgIH1cclxufVxyXG4iXX0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvYmVuY2htYXJrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4Q0FBNkU7QUFHN0UsTUFBYSxlQUFlO0lBQ3hCLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUFJLENBQUM7SUFFaEQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGNBQXNCLEVBQUUsWUFBb0IsRUFBRSxTQUF1Qix5QkFBWSxDQUFDLEdBQUc7UUFDakgsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUMzRCxrQkFBa0IsY0FBYyxnQkFBZ0IsWUFBWSx1Q0FBdUMsTUFBTSxFQUFFLENBQzlHLENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztDQUNKO0FBVEQsMENBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaW5hcnlSZXNwb25zZSwgQmVuY2htYXJrQXNzZXQsIEZpbmFyeVBlcmlvZCB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCIuL2NoZWNraW5nc1wiO1xuXG5leHBvcnQgY2xhc3MgQmVuY2htYXJrQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlcXVlc3RIYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcikgeyB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0QXZhaWxhYmxlQXNzZXRzKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIG1lbWJlcnNoaXBJZDogc3RyaW5nLCBwZXJpb2Q6IEZpbmFyeVBlcmlvZCA9IEZpbmFyeVBlcmlvZC5ZVEQpOiBQcm9taXNlPEJlbmNobWFya0Fzc2V0W10+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3RIYW5kbGVyLmF1dGhlbnRpY2F0ZWRSZXF1ZXN0PEZpbmFyeVJlc3BvbnNlPEJlbmNobWFya0Fzc2V0W10+PihcbiAgICAgICAgICAgIGAvb3JnYW5pemF0aW9ucy8ke29yZ2FuaXphdGlvbklkfS9tZW1iZXJzaGlwcy8ke21lbWJlcnNoaXBJZH0vYmVuY2htYXJrcy9hdmFpbGFibGVfYXNzZXRzP3BlcmlvZD0ke3BlcmlvZH1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQ7XG4gICAgfVxufVxuIl19