@angular-architects/native-federation 20.0.6 → 20.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -351,7 +351,7 @@ We support combining Native Federation with Module Federation. Please find [more
351
351
  Since version 19.0.13, Native Federation for Angular supports Angular I18N. Here are some things to keep in mind:
352
352
 
353
353
  - Make sure, you also add I18N support to your shell (e.g., `ng add @angular/localize --project shell`)
354
- - Configure I18N in your `angular.json`. Dont use command line parameters (as the Native Federation Builder does not forward them to the ApplicationBuilder by design)
354
+ - Configure I18N in your `angular.json`. Don't use command line parameters (as the Native Federation Builder does not forward them to the ApplicationBuilder by design)
355
355
  - In production, make sure your `federation.manifest.json` points to the right language versions of your remotes
356
356
 
357
357
  ### Angular Localization
@@ -362,7 +362,7 @@ Since version 20.0.6, loading locales works out of the box, when the feature `ig
362
362
 
363
363
  ```js
364
364
  features: {
365
- ignoreUnusedDeps: true
365
+ ignoreUnusedDeps: true;
366
366
  }
367
367
  ```
368
368
 
@@ -384,6 +384,106 @@ module.exports = withNativeFederation({
384
384
 
385
385
  This option was introduced with version 19.0.14.
386
386
 
387
+ #### Shell reloading when MFE finishes building for local development
388
+
389
+ During development, you might want your shell application to automatically reload when a remote Micro Frontend finishes rebuilding. This is especially useful when you're developing multiple applications simultaneously and want to see changes immediately without manual refresh.
390
+
391
+ Native Federation provides a **build notifications system** that enables automatic page reloads when federation artifacts are rebuilt.
392
+
393
+ ##### Configuration
394
+
395
+ **1. Enable build notifications in the remote MFE**
396
+
397
+ In your remote's `angular.json`, add the `buildNotifications` configuration:
398
+
399
+ ```json
400
+ {
401
+ "projects": {
402
+ "mfe1": {
403
+ "architect": {
404
+ "build": {
405
+ "builder": "@angular-architects/native-federation:build",
406
+ "options": {
407
+ "target": "mfe1:esbuild:development",
408
+ "rebuildDelay": 0,
409
+ "dev": true,
410
+ "buildNotifications": {
411
+ "enable": true
412
+ }
413
+ }
414
+ }
415
+ }
416
+ }
417
+ }
418
+ }
419
+ ```
420
+
421
+ **2. Add the watcher to your shell application**
422
+
423
+ Import and call `watchFederationBuildCompletion` in your shell's `main.ts`:
424
+
425
+ ```typescript
426
+ import {
427
+ watchFederationBuildCompletion,
428
+ BUILD_NOTIFICATIONS_ENDPOINT,
429
+ } from '@angular-architects/native-federation';
430
+
431
+ // Shell watching MFE1 (running on port 4201)
432
+ if (!environment.production) {
433
+ watchFederationBuildCompletion(
434
+ `http://localhost:4201${BUILD_NOTIFICATIONS_ENDPOINT}`
435
+ );
436
+ }
437
+
438
+ bootstrapApplication(AppComponent, appConfig);
439
+ ```
440
+
441
+ ##### Multiple MFEs
442
+
443
+ If your shell watches multiple MFEs, you can call the function multiple times:
444
+
445
+ ```typescript
446
+ if (!environment.production) {
447
+ // Watch MFE1 on port 4201
448
+ watchFederationBuildCompletion(
449
+ `http://localhost:4201${BUILD_NOTIFICATIONS_ENDPOINT}`
450
+ );
451
+
452
+ // Watch MFE2 on port 4202
453
+ watchFederationBuildCompletion(
454
+ `http://localhost:4202${BUILD_NOTIFICATIONS_ENDPOINT}`
455
+ );
456
+ }
457
+ ```
458
+
459
+ ##### Requirements
460
+
461
+ - Only works in development mode (`dev: true`)
462
+ - Requires `buildNotifications.enable: true` in the target MFE's configuration
463
+ - MFEs must be running with the native-federation dev server
464
+ - Should never be enabled in production builds
465
+
466
+ ##### Custom Endpoints
467
+
468
+ You can customize the notification endpoint if needed:
469
+
470
+ ```json
471
+ {
472
+ "buildNotifications": {
473
+ "enable": true,
474
+ "endpoint": "/my-custom-build-events"
475
+ }
476
+ }
477
+ ```
478
+
479
+ Then use it in your shell's watcher:
480
+
481
+ ```typescript
482
+ watchFederationBuildCompletion('http://localhost:4201/my-custom-build-events');
483
+ ```
484
+
485
+ This feature significantly improves the development experience by eliminating manual page refreshes and ensuring your shell always reflects the latest changes from your remote micro frontends.
486
+
387
487
  ## FAQ
388
488
 
389
489
  ### When to use this package?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular-architects/native-federation",
3
- "version": "20.0.6",
3
+ "version": "20.0.7",
4
4
  "main": "src/index.js",
5
5
  "generators": "./collection.json",
6
6
  "builders": "./builders.json",
@@ -20,8 +20,8 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "@babel/core": "^7.19.0",
23
- "@softarc/native-federation": "3.2.0",
24
- "@softarc/native-federation-runtime": "3.2.0",
23
+ "@softarc/native-federation": "3.3.0",
24
+ "@softarc/native-federation-runtime": "3.3.0",
25
25
  "@chialab/esbuild-plugin-commonjs": "^0.18.0",
26
26
  "esbuild": "^0.25.1",
27
27
  "mrmime": "^1.0.1",
@@ -2,27 +2,25 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runBuilder = runBuilder;
4
4
  const tslib_1 = require("tslib");
5
- const path = tslib_1.__importStar(require("path"));
6
5
  const fs = tslib_1.__importStar(require("fs"));
7
6
  const mrmime = tslib_1.__importStar(require("mrmime"));
7
+ const path = tslib_1.__importStar(require("path"));
8
8
  const build_1 = require("@angular/build");
9
9
  const private_1 = require("@angular/build/private");
10
10
  const architect_1 = require("@angular-devkit/architect");
11
11
  const options_1 = require("@angular-devkit/build-angular/src/builders/dev-server/options");
12
12
  const build_2 = require("@softarc/native-federation/build");
13
+ const architect_2 = require("@angular-devkit/architect");
13
14
  const build_3 = require("@softarc/native-federation/build");
14
15
  const angular_esbuild_adapter_1 = require("../../utils/angular-esbuild-adapter");
15
- const build_4 = require("@softarc/native-federation/build");
16
- const build_5 = require("@softarc/native-federation/build");
17
- const build_6 = require("@softarc/native-federation/build");
18
- const architect_2 = require("@angular-devkit/architect");
19
- const rebuild_events_1 = require("../../utils/rebuild-events");
20
- const updateIndexHtml_1 = require("../../utils/updateIndexHtml");
21
16
  const fs_1 = require("fs");
17
+ const fstart_as_data_url_1 = require("../../tools/fstart-as-data-url");
18
+ const i18n_1 = require("../../utils/i18n");
22
19
  const mem_resuts_1 = require("../../utils/mem-resuts");
20
+ const rebuild_events_1 = require("../../utils/rebuild-events");
23
21
  const shared_mappings_plugin_1 = require("../../utils/shared-mappings-plugin");
24
- const i18n_1 = require("../../utils/i18n");
25
- const fstart_as_data_url_1 = require("../../tools/fstart-as-data-url");
22
+ const updateIndexHtml_1 = require("../../utils/updateIndexHtml");
23
+ const federation_build_notifier_1 = require("./federation-build-notifier");
26
24
  function _buildApplication(options, context, pluginsOrExtensions) {
27
25
  let extensions;
28
26
  if (pluginsOrExtensions && Array.isArray(pluginsOrExtensions)) {
@@ -38,6 +36,7 @@ function _buildApplication(options, context, pluginsOrExtensions) {
38
36
  function runBuilder(nfOptions, context) {
39
37
  return tslib_1.__asyncGenerator(this, arguments, function* runBuilder_1() {
40
38
  var _a, e_1, _b, _c;
39
+ var _d;
41
40
  let target = (0, architect_2.targetFromTargetString)(nfOptions.target);
42
41
  let _options = (yield tslib_1.__await(context.getTargetOptions(target)));
43
42
  let builder = yield tslib_1.__await(context.getBuilderNameForTarget(target));
@@ -108,10 +107,11 @@ function runBuilder(nfOptions, context) {
108
107
  watch: false, // options.watch,
109
108
  dev: !!nfOptions.dev,
110
109
  entryPoint,
110
+ buildNotifications: nfOptions.buildNotifications,
111
111
  };
112
112
  const activateSsr = nfOptions.ssr && !nfOptions.dev;
113
- const config = yield tslib_1.__await((0, build_5.loadFederationConfig)(fedOptions));
114
- const externals = (0, build_4.getExternals)(config);
113
+ const config = yield tslib_1.__await((0, build_3.loadFederationConfig)(fedOptions));
114
+ const externals = (0, build_3.getExternals)(config);
115
115
  const plugins = [
116
116
  (0, shared_mappings_plugin_1.createSharedMappingsPlugin)(config.sharedMappings),
117
117
  {
@@ -127,7 +127,17 @@ function runBuilder(nfOptions, context) {
127
127
  if (activateSsr) {
128
128
  options.externalDependencies = externals;
129
129
  }
130
+ const isLocalDevelopment = runServer && nfOptions.dev;
131
+ // Initialize SSE reloader only for local development
132
+ if (isLocalDevelopment && ((_d = nfOptions.buildNotifications) === null || _d === void 0 ? void 0 : _d.enable)) {
133
+ federation_build_notifier_1.federationBuildNotifier.initialize(nfOptions.buildNotifications.endpoint);
134
+ }
130
135
  const middleware = [
136
+ ...(isLocalDevelopment
137
+ ? [
138
+ federation_build_notifier_1.federationBuildNotifier.createEventMiddleware((req) => removeBaseHref(req, options.baseHref)),
139
+ ]
140
+ : []),
131
141
  (req, res, next) => {
132
142
  const url = removeBaseHref(req, options.baseHref);
133
143
  const fileName = path.join(fedOptions.workspaceRoot, devServerOutputPath, url);
@@ -171,7 +181,7 @@ function runBuilder(nfOptions, context) {
171
181
  }
172
182
  let federationResult;
173
183
  try {
174
- federationResult = yield tslib_1.__await((0, build_6.buildForFederation)(config, fedOptions, externals));
184
+ federationResult = yield tslib_1.__await((0, build_3.buildForFederation)(config, fedOptions, externals));
175
185
  }
176
186
  catch (e) {
177
187
  console.error(e);
@@ -200,56 +210,76 @@ function runBuilder(nfOptions, context) {
200
210
  indexHtmlTransformer: transformIndexHtml(nfOptions),
201
211
  });
202
212
  try {
203
- // builderRun.output.subscribe(async (output) => {
204
- for (var _d = true, builderRun_1 = tslib_1.__asyncValues(builderRun), builderRun_1_1; builderRun_1_1 = yield tslib_1.__await(builderRun_1.next()), _a = builderRun_1_1.done, !_a; _d = true) {
205
- _c = builderRun_1_1.value;
206
- _d = false;
207
- const output = _c;
208
- lastResult = output;
209
- if (!write && output['outputFiles']) {
210
- memResults.add(output['outputFiles'].map((file) => new mem_resuts_1.EsBuildResult(file)));
211
- }
212
- if (!write && output['assetFiles']) {
213
- memResults.add(output['assetFiles'].map((file) => new mem_resuts_1.NgCliAssetResult(file)));
214
- }
215
- // if (write && !runServer && !nfOptions.skipHtmlTransform) {
216
- // updateIndexHtml(fedOptions, nfOptions);
217
- // }
218
- // if (!runServer) {
219
- // yield output;
220
- // }
221
- if (!first && (nfOptions.dev || watch)) {
222
- setTimeout(() => tslib_1.__awaiter(this, void 0, void 0, function* () {
223
- try {
224
- federationResult = yield (0, build_6.buildForFederation)(config, fedOptions, externals);
225
- if (hasLocales && localeFilter) {
226
- (0, i18n_1.translateFederationArtefacts)(i18n, localeFilter, outputOptions.base, federationResult);
213
+ try {
214
+ // builderRun.output.subscribe(async (output) => {
215
+ for (var _e = true, builderRun_1 = tslib_1.__asyncValues(builderRun), builderRun_1_1; builderRun_1_1 = yield tslib_1.__await(builderRun_1.next()), _a = builderRun_1_1.done, !_a; _e = true) {
216
+ _c = builderRun_1_1.value;
217
+ _e = false;
218
+ const output = _c;
219
+ lastResult = output;
220
+ if (!write && output['outputFiles']) {
221
+ memResults.add(output['outputFiles'].map((file) => new mem_resuts_1.EsBuildResult(file)));
222
+ }
223
+ if (!write && output['assetFiles']) {
224
+ memResults.add(output['assetFiles'].map((file) => new mem_resuts_1.NgCliAssetResult(file)));
225
+ }
226
+ // if (write && !runServer && !nfOptions.skipHtmlTransform) {
227
+ // updateIndexHtml(fedOptions, nfOptions);
228
+ // }
229
+ // if (!runServer) {
230
+ // yield output;
231
+ // }
232
+ if (!first && (nfOptions.dev || watch)) {
233
+ setTimeout(() => tslib_1.__awaiter(this, void 0, void 0, function* () {
234
+ try {
235
+ federationResult = yield (0, build_3.buildForFederation)(config, fedOptions, externals, {
236
+ skipMappingsAndExposed: false,
237
+ skipShared: true,
238
+ });
239
+ if (hasLocales && localeFilter) {
240
+ (0, i18n_1.translateFederationArtefacts)(i18n, localeFilter, outputOptions.base, federationResult);
241
+ }
242
+ build_2.logger.info('Done!');
243
+ // Notifies about build completion
244
+ if (isLocalDevelopment) {
245
+ federation_build_notifier_1.federationBuildNotifier.broadcastBuildCompletion();
246
+ }
247
+ }
248
+ catch (error) {
249
+ build_2.logger.error('Federation rebuild failed!');
250
+ // Notifies about build failure
251
+ if (isLocalDevelopment) {
252
+ federation_build_notifier_1.federationBuildNotifier.broadcastBuildError(error);
253
+ }
227
254
  }
228
- build_2.logger.info('Done!');
229
- }
230
- catch (_a) {
231
- build_2.logger.error('Not successful!');
232
- }
233
- // if (runServer) {
234
- // setTimeout(() => reloadShell(nfOptions.shell), 0);
235
- // }
236
- }), nfOptions.rebuildDelay);
255
+ }), nfOptions.rebuildDelay);
256
+ }
257
+ first = false;
237
258
  }
238
- first = false;
259
+ }
260
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
261
+ finally {
262
+ try {
263
+ if (!_e && !_a && (_b = builderRun_1.return)) yield tslib_1.__await(_b.call(builderRun_1));
264
+ }
265
+ finally { if (e_1) throw e_1.error; }
239
266
  }
240
267
  }
241
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
242
268
  finally {
243
- try {
244
- if (!_d && !_a && (_b = builderRun_1.return)) yield tslib_1.__await(_b.call(builderRun_1));
269
+ if (isLocalDevelopment) {
270
+ federation_build_notifier_1.federationBuildNotifier.stopEventServer();
245
271
  }
246
- finally { if (e_1) throw e_1.error; }
247
272
  }
248
273
  yield yield tslib_1.__await(lastResult || { success: false });
249
274
  });
250
275
  }
251
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
252
- exports.default = (0, architect_1.createBuilder)(runBuilder);
276
+ function removeBaseHref(req, baseHref) {
277
+ let url = req.url;
278
+ if (baseHref && url.startsWith(baseHref)) {
279
+ url = url.substr(baseHref.length);
280
+ }
281
+ return url;
282
+ }
253
283
  function writeFstartScript(fedOptions) {
254
284
  const serverOutpath = path.join(fedOptions.outputPath, '../server');
255
285
  const fstartPath = path.join(serverOutpath, 'fstart.mjs');
@@ -267,13 +297,6 @@ function getLocaleFilter(options, runServer) {
267
297
  }
268
298
  return localize;
269
299
  }
270
- function removeBaseHref(req, baseHref) {
271
- let url = req.url;
272
- if (baseHref && url.startsWith(baseHref)) {
273
- url = url.substr(baseHref.length);
274
- }
275
- return url;
276
- }
277
300
  function infereConfigPath(tsConfig) {
278
301
  const relProjectPath = path.dirname(tsConfig);
279
302
  const relConfigPath = path.join(relProjectPath, 'federation.config.js');
@@ -295,4 +318,6 @@ function addDebugInformation(fileName, rawBody) {
295
318
  remoteEntry.shared = [...shared, ...sharedForVite];
296
319
  return JSON.stringify(remoteEntry, null, 2);
297
320
  }
321
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
322
+ exports.default = (0, architect_1.createBuilder)(runBuilder);
298
323
  //# sourceMappingURL=builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../../../../libs/native-federation/src/builders/build/builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../../../../libs/native-federation/src/builders/build/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { IncomingMessage, ServerResponse } from 'http';
2
+ type NextFunction = (error?: Error) => void;
3
+ type MiddlewareFunction = (req: IncomingMessage, res: ServerResponse, next: NextFunction) => void;
4
+ /**
5
+ * Manages Server-Sent Events for federation hot reload in local development
6
+ * Only active when running in development mode with dev server
7
+ */
8
+ export declare class FederationBuildNotifier {
9
+ private connections;
10
+ private cleanupInterval;
11
+ private isActive;
12
+ private endpoint;
13
+ /**
14
+ * Initializes the SSE reloader for local development
15
+ */
16
+ initialize(endpoint: string): void;
17
+ /**
18
+ * Creates SSE middleware for federation events
19
+ */
20
+ createEventMiddleware(removeBaseHref: (req: IncomingMessage) => string): MiddlewareFunction;
21
+ /**
22
+ * Sets up a new SSE connection
23
+ */
24
+ private _setupSSEConnection;
25
+ /**
26
+ * Removes a connection from the pool
27
+ */
28
+ private _removeConnection;
29
+ /**
30
+ * Broadcasts an event to all connected clients
31
+ * Only works in local development mode
32
+ */
33
+ private _broadcastEvent;
34
+ /**
35
+ * Sends an event to a specific response stream
36
+ */
37
+ private _sendEvent;
38
+ /**
39
+ * Starts periodic cleanup of dead connections
40
+ */
41
+ private startCleanup;
42
+ /**
43
+ * Notifies about successful federation rebuild
44
+ */
45
+ broadcastBuildCompletion(): void;
46
+ /**
47
+ * Notifies about failed federation rebuild
48
+ */
49
+ broadcastBuildError(error: unknown): void;
50
+ /**
51
+ * Stops cleanup and closes all connections
52
+ * Should be called when development server stops
53
+ */
54
+ stopEventServer(): void;
55
+ /**
56
+ * Returns the number of active connections
57
+ */
58
+ get activeConnections(): number;
59
+ /**
60
+ * Returns whether the reloader is active
61
+ */
62
+ get isRunning(): boolean;
63
+ }
64
+ export declare const federationBuildNotifier: FederationBuildNotifier;
65
+ export {};
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.federationBuildNotifier = exports.FederationBuildNotifier = void 0;
4
+ const native_federation_runtime_1 = require("@softarc/native-federation-runtime");
5
+ const build_1 = require("@softarc/native-federation/build");
6
+ /**
7
+ * Manages Server-Sent Events for federation hot reload in local development
8
+ * Only active when running in development mode with dev server
9
+ */
10
+ class FederationBuildNotifier {
11
+ constructor() {
12
+ this.connections = [];
13
+ this.cleanupInterval = null;
14
+ this.isActive = false;
15
+ }
16
+ /**
17
+ * Initializes the SSE reloader for local development
18
+ */
19
+ initialize(endpoint) {
20
+ if (this.isActive) {
21
+ return;
22
+ }
23
+ this.endpoint = endpoint;
24
+ this.isActive = true;
25
+ this.startCleanup();
26
+ build_1.logger.info(`[Federation SSE] Local reloader initialized with endpoint ${this.endpoint}`);
27
+ }
28
+ /**
29
+ * Creates SSE middleware for federation events
30
+ */
31
+ createEventMiddleware(removeBaseHref) {
32
+ if (!this.isActive) {
33
+ return (req, res, next) => next();
34
+ }
35
+ return (req, res, next) => {
36
+ const url = removeBaseHref(req);
37
+ if (url !== this.endpoint) {
38
+ return next();
39
+ }
40
+ this._setupSSEConnection(req, res);
41
+ };
42
+ }
43
+ /**
44
+ * Sets up a new SSE connection
45
+ */
46
+ _setupSSEConnection(req, res) {
47
+ res.writeHead(200, {
48
+ 'Content-Type': 'text/event-stream',
49
+ 'Cache-Control': 'no-cache',
50
+ Connection: 'keep-alive',
51
+ 'Access-Control-Allow-Origin': '*',
52
+ 'Access-Control-Allow-Headers': 'Cache-Control',
53
+ });
54
+ // Send initial connection event
55
+ this._sendEvent(res, {
56
+ type: 'connected',
57
+ timestamp: Date.now(),
58
+ });
59
+ // Store connection
60
+ const connection = { response: res, request: req };
61
+ this.connections.push(connection);
62
+ // Handle disconnection
63
+ req.on('close', () => this._removeConnection(connection));
64
+ req.on('error', () => this._removeConnection(connection));
65
+ build_1.logger.info(`[Federation SSE] Client connected. Active connections: ${this.connections.length}`);
66
+ }
67
+ /**
68
+ * Removes a connection from the pool
69
+ */
70
+ _removeConnection(connection) {
71
+ const index = this.connections.indexOf(connection);
72
+ if (index !== -1) {
73
+ this.connections.splice(index, 1);
74
+ build_1.logger.info(`[Federation SSE] Client disconnected. Active connections: ${this.connections.length}`);
75
+ }
76
+ }
77
+ /**
78
+ * Broadcasts an event to all connected clients
79
+ * Only works in local development mode
80
+ */
81
+ _broadcastEvent(event) {
82
+ if (!this.isActive || this.connections.length === 0) {
83
+ return;
84
+ }
85
+ const deadConnections = [];
86
+ this.connections.forEach((connection) => {
87
+ try {
88
+ this._sendEvent(connection.response, event);
89
+ }
90
+ catch (error) {
91
+ deadConnections.push(connection);
92
+ }
93
+ });
94
+ // Remove dead connections
95
+ deadConnections.forEach((connection) => this._removeConnection(connection));
96
+ if (this.connections.length > 0) {
97
+ build_1.logger.info(`[Federation SSE] Event '${event.type}' broadcast to ${this.connections.length} clients`);
98
+ }
99
+ }
100
+ /**
101
+ * Sends an event to a specific response stream
102
+ */
103
+ _sendEvent(res, event) {
104
+ const data = JSON.stringify(event);
105
+ res.write(`data: ${data}\n\n`);
106
+ }
107
+ /**
108
+ * Starts periodic cleanup of dead connections
109
+ */
110
+ startCleanup() {
111
+ if (this.cleanupInterval) {
112
+ return;
113
+ }
114
+ this.cleanupInterval = setInterval(() => {
115
+ const aliveBefore = this.connections.length;
116
+ this.connections = this.connections.filter((connection) => !connection.response.destroyed &&
117
+ !connection.request.destroyed &&
118
+ connection.response.writable);
119
+ if (this.connections.length !== aliveBefore) {
120
+ build_1.logger.info(`[Federation SSE] Cleaned up ${aliveBefore - this.connections.length} dead connections`);
121
+ }
122
+ }, 30000); // Clean every 30 seconds
123
+ }
124
+ /**
125
+ * Notifies about successful federation rebuild
126
+ */
127
+ broadcastBuildCompletion() {
128
+ this._broadcastEvent({
129
+ type: native_federation_runtime_1.BuildNotificationType.COMPLETED,
130
+ timestamp: Date.now(),
131
+ });
132
+ }
133
+ /**
134
+ * Notifies about failed federation rebuild
135
+ */
136
+ broadcastBuildError(error) {
137
+ this._broadcastEvent({
138
+ type: native_federation_runtime_1.BuildNotificationType.ERROR,
139
+ timestamp: Date.now(),
140
+ error: error instanceof Error ? error.message : 'Unknown error',
141
+ });
142
+ }
143
+ /**
144
+ * Stops cleanup and closes all connections
145
+ * Should be called when development server stops
146
+ */
147
+ stopEventServer() {
148
+ if (!this.isActive) {
149
+ return;
150
+ }
151
+ if (this.cleanupInterval) {
152
+ clearInterval(this.cleanupInterval);
153
+ this.cleanupInterval = null;
154
+ }
155
+ this.connections.forEach((connection) => {
156
+ try {
157
+ connection.response.end();
158
+ }
159
+ catch (error) {
160
+ // Connection might already be closed
161
+ }
162
+ });
163
+ this.connections = [];
164
+ this.isActive = false;
165
+ build_1.logger.info('[Federation SSE] Local reloader disposed');
166
+ }
167
+ /**
168
+ * Returns the number of active connections
169
+ */
170
+ get activeConnections() {
171
+ return this.connections.length;
172
+ }
173
+ /**
174
+ * Returns whether the reloader is active
175
+ */
176
+ get isRunning() {
177
+ return this.isActive;
178
+ }
179
+ }
180
+ exports.FederationBuildNotifier = FederationBuildNotifier;
181
+ // Singleton instance for local development
182
+ exports.federationBuildNotifier = new FederationBuildNotifier();
183
+ //# sourceMappingURL=federation-build-notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-build-notifier.js","sourceRoot":"","sources":["../../../../../../libs/native-federation/src/builders/build/federation-build-notifier.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { JsonObject } from '@angular-devkit/core';
2
+ import type { BuildNotificationOptions } from '@softarc/native-federation-runtime';
2
3
  import type { ESMSInitOptions } from 'es-module-shims';
3
4
 
4
5
  export interface NfBuilderSchema extends JsonObject {
@@ -7,6 +8,7 @@ export interface NfBuilderSchema extends JsonObject {
7
8
  port: number;
8
9
  open: boolean;
9
10
  rebuildDelay: number;
11
+ buildNotifications?: BuildNotificationOptions;
10
12
  shell: string;
11
13
  watch: boolean;
12
14
  skipHtmlTransform: boolean;
@@ -64,6 +64,21 @@
64
64
  "devServer": {
65
65
  "type": "boolean",
66
66
  "description": "can be used to disable the dev server when dev=true"
67
+ },
68
+ "buildNotifications": {
69
+ "type": "object",
70
+ "properties": {
71
+ "enable": {
72
+ "type": "boolean",
73
+ "default": true,
74
+ "description": "Enable build completion notifications for local development. It will send events to notify when the federation build is complete."
75
+ },
76
+ "endpoint": {
77
+ "type": "string",
78
+ "default": "/@angular-architects/native-federation:build-notifications",
79
+ "description": "You can override the default endpoint to send build completion events to."
80
+ }
81
+ }
67
82
  }
68
83
  }
69
84
  }
@@ -48,8 +48,12 @@ function config(options) {
48
48
  }
49
49
  const federationConfigPath = path.join(projectRoot, 'federation.config.js');
50
50
  const exists = tree.exists(federationConfigPath);
51
- const cand1 = path.join(projectSourceRoot, 'app', 'app.component.ts');
52
- const cand2 = path.join(projectSourceRoot, 'app', 'app.ts');
51
+ const cand1 = path
52
+ .join(projectSourceRoot, 'app', 'app.component.ts')
53
+ .replace(/\\/g, '/');
54
+ const cand2 = path
55
+ .join(projectSourceRoot, 'app', 'app.ts')
56
+ .replace(/\\/g, '/');
53
57
  const appComponent = tree.exists(cand1)
54
58
  ? cand1
55
59
  : tree.exists(cand2)
@@ -1 +1 @@
1
- {"version":3,"file":"schematic.js","sourceRoot":"","sources":["../../../../../../libs/native-federation/src/schematics/init/schematic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schematic.js","sourceRoot":"","sources":["../../../../../../libs/native-federation/src/schematics/init/schematic.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export declare const fstart = "Ly8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvbm9kZS9pbml0LW5vZGUtZmVkZXJhdGlvbi50cwppbXBvcnQgeyByZWdpc3RlciB9IGZyb20gIm5vZGU6bW9kdWxlIjsKaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gIm5vZGU6dXJsIjsKaW1wb3J0ICogYXMgZnMyIGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgKiBhcyBwYXRoMiBmcm9tICJub2RlOnBhdGgiOwoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvaW1wb3J0LW1hcC50cwpmdW5jdGlvbiBtZXJnZUltcG9ydE1hcHMobWFwMSwgbWFwMikgewogIHJldHVybiB7CiAgICBpbXBvcnRzOiB7IC4uLm1hcDEuaW1wb3J0cywgLi4ubWFwMi5pbXBvcnRzIH0sCiAgICBzY29wZXM6IHsgLi4ubWFwMS5zY29wZXMsIC4uLm1hcDIuc2NvcGVzIH0KICB9Owp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9nbG9iYWwtY2FjaGUudHMKdmFyIG5mTmFtZXNwYWNlID0gIl9fTkFUSVZFX0ZFREVSQVRJT05fXyI7CnZhciBnbG9iYWwyID0gZ2xvYmFsVGhpczsKZ2xvYmFsMltuZk5hbWVzcGFjZV0gPz89IHsKICBleHRlcm5hbHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksCiAgcmVtb3RlTmFtZXNUb1JlbW90ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwKICBiYXNlVXJsVG9SZW1vdGVOYW1lczogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKQp9Owp2YXIgZ2xvYmFsQ2FjaGUgPSBnbG9iYWwyW25mTmFtZXNwYWNlXTsKCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL21vZGVsL2V4dGVybmFscy50cwp2YXIgZXh0ZXJuYWxzID0gZ2xvYmFsQ2FjaGUuZXh0ZXJuYWxzOwpmdW5jdGlvbiBnZXRFeHRlcm5hbEtleShzaGFyZWQpIHsKICByZXR1cm4gYCR7c2hhcmVkLnBhY2thZ2VOYW1lfUAke3NoYXJlZC52ZXJzaW9ufWA7Cn0KZnVuY3Rpb24gZ2V0RXh0ZXJuYWxVcmwoc2hhcmVkKSB7CiAgY29uc3QgcGFja2FnZUtleSA9IGdldEV4dGVybmFsS2V5KHNoYXJlZCk7CiAgcmV0dXJuIGV4dGVybmFscy5nZXQocGFja2FnZUtleSk7Cn0KZnVuY3Rpb24gc2V0RXh0ZXJuYWxVcmwoc2hhcmVkLCB1cmwyKSB7CiAgY29uc3QgcGFja2FnZUtleSA9IGdldEV4dGVybmFsS2V5KHNoYXJlZCk7CiAgZXh0ZXJuYWxzLnNldChwYWNrYWdlS2V5LCB1cmwyKTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvdXRpbHMvcGF0aC11dGlscy50cwpmdW5jdGlvbiBnZXREaXJlY3RvcnkodXJsMikgewogIGNvbnN0IHBhcnRzID0gdXJsMi5zcGxpdCgiLyIpOwogIHBhcnRzLnBvcCgpOwogIHJldHVybiBwYXJ0cy5qb2luKCIvIik7Cn0KZnVuY3Rpb24gam9pblBhdGhzKHBhdGgxLCBwYXRoMjIpIHsKICB3aGlsZSAocGF0aDEuZW5kc1dpdGgoIi8iKSkgewogICAgcGF0aDEgPSBwYXRoMS5zdWJzdHJpbmcoMCwgcGF0aDEubGVuZ3RoIC0gMSk7CiAgfQogIGlmIChwYXRoMjIuc3RhcnRzV2l0aCgiLi8iKSkgewogICAgcGF0aDIyID0gcGF0aDIyLnN1YnN0cmluZygyLCBwYXRoMjIubGVuZ3RoKTsKICB9CiAgcmV0dXJuIGAke3BhdGgxfS8ke3BhdGgyMn1gOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9yZW1vdGVzLnRzCnZhciByZW1vdGVOYW1lc1RvUmVtb3RlID0gZ2xvYmFsQ2FjaGUucmVtb3RlTmFtZXNUb1JlbW90ZTsKdmFyIGJhc2VVcmxUb1JlbW90ZU5hbWVzID0gZ2xvYmFsQ2FjaGUuYmFzZVVybFRvUmVtb3RlTmFtZXM7CmZ1bmN0aW9uIGFkZFJlbW90ZShyZW1vdGVOYW1lLCByZW1vdGUpIHsKICByZW1vdGVOYW1lc1RvUmVtb3RlLnNldChyZW1vdGVOYW1lLCByZW1vdGUpOwogIGJhc2VVcmxUb1JlbW90ZU5hbWVzLnNldChyZW1vdGUuYmFzZVVybCwgcmVtb3RlTmFtZSk7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL2luaXQtZmVkZXJhdGlvbi50cwphc3luYyBmdW5jdGlvbiBwcm9jZXNzUmVtb3RlSW5mb3MocmVtb3Rlcywgb3B0aW9ucyA9IHsgdGhyb3dJZlJlbW90ZU5vdEZvdW5kOiBmYWxzZSB9KSB7CiAgY29uc3QgcHJvY2Vzc1JlbW90ZUluZm9Qcm9taXNlcyA9IE9iamVjdC5rZXlzKHJlbW90ZXMpLm1hcCgKICAgIGFzeW5jIChyZW1vdGVOYW1lKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgbGV0IHVybDIgPSByZW1vdGVzW3JlbW90ZU5hbWVdOwogICAgICAgIGlmIChvcHRpb25zLmNhY2hlVGFnKSB7CiAgICAgICAgICBjb25zdCBhZGRBcHBlbmQgPSByZW1vdGVzW3JlbW90ZU5hbWVdLmluY2x1ZGVzKCI/IikgPyAiJiIgOiAiPyI7CiAgICAgICAgICB1cmwyICs9IGAke2FkZEFwcGVuZH10PSR7b3B0aW9ucy5jYWNoZVRhZ31gOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXdhaXQgcHJvY2Vzc1JlbW90ZUluZm8odXJsMiwgcmVtb3RlTmFtZSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBjb25zdCBlcnJvciA9IGBFcnJvciBsb2FkaW5nIHJlbW90ZSBlbnRyeSBmb3IgJHtyZW1vdGVOYW1lfSBmcm9tIGZpbGUgJHtyZW1vdGVzW3JlbW90ZU5hbWVdfWA7CiAgICAgICAgaWYgKG9wdGlvbnMudGhyb3dJZlJlbW90ZU5vdEZvdW5kKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpOwogICAgICAgIH0KICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICk7CiAgY29uc3QgcmVtb3RlSW1wb3J0TWFwcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb2Nlc3NSZW1vdGVJbmZvUHJvbWlzZXMpOwogIGNvbnN0IGltcG9ydE1hcCA9IHJlbW90ZUltcG9ydE1hcHMucmVkdWNlKAogICAgKGFjYywgcmVtb3RlSW1wb3J0TWFwKSA9PiByZW1vdGVJbXBvcnRNYXAgPyBtZXJnZUltcG9ydE1hcHMoYWNjLCByZW1vdGVJbXBvcnRNYXApIDogYWNjLAogICAgeyBpbXBvcnRzOiB7fSwgc2NvcGVzOiB7fSB9CiAgKTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbmZvKGZlZGVyYXRpb25JbmZvVXJsLCByZW1vdGVOYW1lKSB7CiAgY29uc3QgYmFzZVVybCA9IGdldERpcmVjdG9yeShmZWRlcmF0aW9uSW5mb1VybCk7CiAgY29uc3QgcmVtb3RlSW5mbyA9IGF3YWl0IGxvYWRGZWRlcmF0aW9uSW5mbyhmZWRlcmF0aW9uSW5mb1VybCk7CiAgaWYgKCFyZW1vdGVOYW1lKSB7CiAgICByZW1vdGVOYW1lID0gcmVtb3RlSW5mby5uYW1lOwogIH0KICBjb25zdCBpbXBvcnRNYXAgPSBjcmVhdGVSZW1vdGVJbXBvcnRNYXAocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCk7CiAgYWRkUmVtb3RlKHJlbW90ZU5hbWUsIHsgLi4ucmVtb3RlSW5mbywgYmFzZVVybCB9KTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUltcG9ydE1hcChyZW1vdGVJbmZvLCByZW1vdGVOYW1lLCBiYXNlVXJsKSB7CiAgY29uc3QgaW1wb3J0cyA9IHByb2Nlc3NFeHBvc2VkKHJlbW90ZUluZm8sIHJlbW90ZU5hbWUsIGJhc2VVcmwpOwogIGNvbnN0IHNjb3BlcyA9IHByb2Nlc3NSZW1vdGVJbXBvcnRzKHJlbW90ZUluZm8sIGJhc2VVcmwpOwogIHJldHVybiB7IGltcG9ydHMsIHNjb3BlcyB9Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGZWRlcmF0aW9uSW5mbyh1cmwyKSB7CiAgY29uc3QgaW5mbyA9IGF3YWl0IGZldGNoKHVybDIpLnRoZW4oKHIpID0+IHIuanNvbigpKTsKICByZXR1cm4gaW5mbzsKfQpmdW5jdGlvbiBwcm9jZXNzUmVtb3RlSW1wb3J0cyhyZW1vdGVJbmZvLCBiYXNlVXJsKSB7CiAgY29uc3Qgc2NvcGVzID0ge307CiAgY29uc3Qgc2NvcGVkSW1wb3J0cyA9IHt9OwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIHJlbW90ZUluZm8uc2hhcmVkKSB7CiAgICBjb25zdCBvdXRGaWxlTmFtZSA9IGdldEV4dGVybmFsVXJsKHNoYXJlZCkgPz8gam9pblBhdGhzKGJhc2VVcmwsIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgICBzZXRFeHRlcm5hbFVybChzaGFyZWQsIG91dEZpbGVOYW1lKTsKICAgIHNjb3BlZEltcG9ydHNbc2hhcmVkLnBhY2thZ2VOYW1lXSA9IG91dEZpbGVOYW1lOwogIH0KICBzY29wZXNbYmFzZVVybCArICIvIl0gPSBzY29wZWRJbXBvcnRzOwogIHJldHVybiBzY29wZXM7Cn0KZnVuY3Rpb24gcHJvY2Vzc0V4cG9zZWQocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCkgewogIGNvbnN0IGltcG9ydHMgPSB7fTsKICBmb3IgKGNvbnN0IGV4cG9zZWQgb2YgcmVtb3RlSW5mby5leHBvc2VzKSB7CiAgICBjb25zdCBrZXkgPSBqb2luUGF0aHMocmVtb3RlTmFtZSwgZXhwb3NlZC5rZXkpOwogICAgY29uc3QgdmFsdWUgPSBqb2luUGF0aHMoYmFzZVVybCwgZXhwb3NlZC5vdXRGaWxlTmFtZSk7CiAgICBpbXBvcnRzW2tleV0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIGltcG9ydHM7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0hvc3RJbmZvKGhvc3RJbmZvLCByZWxCdW5kbGVzUGF0aCA9ICIuLyIpIHsKICBjb25zdCBpbXBvcnRzID0gaG9zdEluZm8uc2hhcmVkLnJlZHVjZSgKICAgIChhY2MsIGN1cikgPT4gKHsKICAgICAgLi4uYWNjLAogICAgICBbY3VyLnBhY2thZ2VOYW1lXTogcmVsQnVuZGxlc1BhdGggKyBjdXIub3V0RmlsZU5hbWUKICAgIH0pLAogICAge30KICApOwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIGhvc3RJbmZvLnNoYXJlZCkgewogICAgc2V0RXh0ZXJuYWxVcmwoc2hhcmVkLCByZWxCdW5kbGVzUGF0aCArIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgfQogIHJldHVybiB7IGltcG9ydHMsIHNjb3Blczoge30gfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvdXRpbHMvaW1wb3J0LW1hcC1sb2FkZXIuanMKaW1wb3J0IHBhdGggZnJvbSAicGF0aCI7CmltcG9ydCB1cmwgZnJvbSAidXJsIjsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICJmcyI7CnZhciBJTVBPUlRfTUFQX0ZJTEVfTkFNRSA9ICJub2RlLmltcG9ydG1hcCI7CnZhciBiYXNlVVJMID0gdXJsLnBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSkgKyBwYXRoLnNlcDsKZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CiAgbGV0IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0ge307CiAgaWYgKHBhcnNlZC5oYXNPd25Qcm9wZXJ0eSgiaW1wb3J0cyIpKSB7CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLmltcG9ydHMpKSB7CiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSAiaW1wb3J0cyIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3RgKTsKICAgIH0KICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcGFyc2VkLmltcG9ydHMsCiAgICAgIGJhc2VVUkwKICAgICk7CiAgfQogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0ge307CiAgaWYgKHBhcnNlZC5oYXNPd25Qcm9wZXJ0eSgic2NvcGVzIikpIHsKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuc2NvcGVzKSkgewogICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBpbXBvcnQgbWFwIC0gInNjb3BlcyIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3RgKTsKICAgIH0KICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSBzb3J0QW5kTm9ybWFsaXplU2NvcGVzKHBhcnNlZC5zY29wZXMsIGJhc2VVUkwpOwogIH0KICBjb25zdCBpbnZhbGlkS2V5cyA9IE9iamVjdC5rZXlzKHBhcnNlZCkuZmlsdGVyKAogICAgKGtleSkgPT4ga2V5ICE9PSAiaW1wb3J0cyIgJiYga2V5ICE9PSAic2NvcGVzIgogICk7CiAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCA+IDApIHsKICAgIGNvbnNvbGUud2FybigKICAgICAgYEludmFsaWQgdG9wLWxldmVsIGtleSR7aW52YWxpZEtleXMubGVuZ3RoID4gMCA/ICJzIiA6ICIifSBpbiBpbXBvcnQgbWFwIC0gJHtpbnZhbGlkS2V5cy5qb2luKCIsICIpfWAKICAgICk7CiAgfQogIHJldHVybiB7CiAgICBpbXBvcnRzOiBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cywKICAgIHNjb3Blczogc29ydGVkQW5kTm9ybWFsaXplZFNjb3BlcwogIH07Cn0KZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcChtYXAsIGJhc2VVUkwyKSB7CiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9OwogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBtYXApIHsKICAgIGNvbnN0IHZhbHVlID0gbWFwW3NwZWNpZmllcktleV07CiAgICBjb25zdCBub3JtYWxpemVkU3BlY2lmaWVyS2V5ID0gbm9ybWFsaXplU3BlY2lmaWVyS2V5KHNwZWNpZmllcktleSwgYmFzZVVSTDIpOwogICAgaWYgKG5vcm1hbGl6ZWRTcGVjaWZpZXJLZXkgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBsZXQgYWRkcmVzc1VSTCA9IHBhcnNlVVJMTGlrZVNwZWNpZmllcih2YWx1ZSwgYmFzZVVSTDIpOwogICAgaWYgKGFkZHJlc3NVUkwgPT09IG51bGwpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9J2AKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHNwZWNpZmllcktleS5lbmRzV2l0aCgiLyIpICYmICFhZGRyZXNzVVJMLmVuZHNXaXRoKCIvIikpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9JyAtIHNpbmNlIHRoZSBzcGVjaWZpZXIgZW5kcyBpbiBzbGFzaCwgc28gbXVzdCB0aGUgYWRkcmVzc2AKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IGFkZHJlc3NVUkw7CiAgfQogIHJldHVybiBub3JtYWxpemVkOwp9CmZ1bmN0aW9uIG5vcm1hbGl6ZVNwZWNpZmllcktleShrZXkpIHsKICBpZiAoa2V5ID09PSAiIikgewogICAgY29uc29sZS53YXJuKGBTcGVjaWZpZXIga2V5cyBpbiBpbXBvcnQgbWFwcyBtYXkgbm90IGJlIHRoZSBlbXB0eSBzdHJpbmdgKTsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKGtleSwgYmFzZVVSTCkgfHwga2V5Owp9CmZ1bmN0aW9uIHBhcnNlVVJMTGlrZVNwZWNpZmllcihzcGVjaWZpZXIsIGJhc2VVUkwyKSB7CiAgY29uc3QgdXNlQmFzZVVybEFzUGFyZW50ID0gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoIi8iKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgiLi8iKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgiLi4vIik7CiAgdHJ5IHsKICAgIHJldHVybiBuZXcgVVJMKHNwZWNpZmllciwgdXNlQmFzZVVybEFzUGFyZW50ID8gYmFzZVVSTDIgOiB2b2lkIDApLmhyZWY7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNjb3BlcyhtYXAsIGJhc2VVUkwyKSB7CiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTsKICBmb3IgKGxldCBzY29wZVByZWZpeCBpbiBtYXApIHsKICAgIGNvbnN0IHBvdGVudGlhbFNwZWNpZmllck1hcCA9IG1hcFtzY29wZVByZWZpeF07CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocG90ZW50aWFsU3BlY2lmaWVyTWFwKSkgewogICAgICB0aHJvdyBUeXBlRXJyb3IoCiAgICAgICAgYFRoZSB2YWx1ZSBvZiBzY29wZSAke3Njb3BlUHJlZml4fSBtdXN0IGJlIGEgSlNPTiBvYmplY3RgCiAgICAgICk7CiAgICB9CiAgICBsZXQgc2NvcGVQcmVmaXhVUkw7CiAgICB0cnkgewogICAgICBzY29wZVByZWZpeFVSTCA9IG5ldyBVUkwoc2NvcGVQcmVmaXgsIGJhc2VVUkwyKS5ocmVmOwogICAgfSBjYXRjaCB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgU2NvcGUgcHJlZml4IFVSTCAnJHtzY29wZVByZWZpeH0nIHdhcyBub3QgcGFyc2VhYmxlIGluIGltcG9ydCBtYXBgCiAgICAgICk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbm9ybWFsaXplZFtzY29wZVByZWZpeFVSTF0gPSBzb3J0QW5kTm9ybWFsaXplU3BlY2lmaWVyTWFwKAogICAgICBwb3RlbnRpYWxTcGVjaWZpZXJNYXAsCiAgICAgIGJhc2VVUkwyCiAgICApOwogIH0KICByZXR1cm4gbm9ybWFsaXplZDsKfQpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikgewogIHJldHVybiBvYmogPT09IE9iamVjdChvYmopICYmICFBcnJheS5pc0FycmF5KG9iaik7Cn0KdmFyIGltcG9ydE1hcFByb21pc2UgPSBnZXRJbXBvcnRNYXBQcm9taXNlKCk7CmFzeW5jIGZ1bmN0aW9uIGdldEltcG9ydE1hcFByb21pc2UoKSB7CiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcHJvY2Vzcy5lbnYuSU1QT1JUX01BUF9QQVRIIHx8IElNUE9SVF9NQVBfRklMRV9OQU1FOwogIGNvbnN0IGltcG9ydE1hcFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVsYXRpdmVQYXRoKTsKICBsZXQgc3RyOwogIHRyeSB7CiAgICBzdHIgPSBhd2FpdCBmcy5yZWFkRmlsZShpbXBvcnRNYXBQYXRoKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBlbXB0eU1hcCgpOwogIH0KICBsZXQganNvbjsKICB0cnkgewogICAganNvbiA9IGF3YWl0IEpTT04ucGFyc2Uoc3RyKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHRocm93IEVycm9yKAogICAgICBgSW1wb3J0IG1hcCBhdCAke2ltcG9ydE1hcFBhdGh9IGNvbnRhaW5zIGludmFsaWQganNvbjogJHtlcnIubWVzc2FnZX1gCiAgICApOwogIH0KICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAoanNvbik7Cn0KZ2xvYmFsLm5vZGVMb2FkZXIgPSBnbG9iYWwubm9kZUxvYWRlciB8fCB7fTsKZ2xvYmFsLm5vZGVMb2FkZXIuc2V0SW1wb3J0TWFwUHJvbWlzZSA9IGZ1bmN0aW9uIHNldEltcG9ydE1hcFByb21pc2UocHJvbWlzZSkgewogIGltcG9ydE1hcFByb21pc2UgPSBwcm9taXNlLnRoZW4oKG1hcCkgPT4gewogICAgcmV0dXJuIHJlc29sdmVBbmRDb21wb3NlSW1wb3J0TWFwKG1hcCk7CiAgfSk7Cn07CmZ1bmN0aW9uIGVtcHR5TWFwKCkgewogIHJldHVybiB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH07Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2xvYWRlci1hcy1kYXRhLXVybC5qcwp2YXIgcmVzb2x2ZXIgPSAiYVcxd2IzSjBJSEJoZEdnZ1puSnZiU0FuY0dGMGFDYzdDbWx0Y0c5eWRDQjFjbXdnWm5KdmJTQW5kWEpzSnpzS2FXMXdiM0owSUhzZ2NISnZiV2x6WlhNZ1lYTWdabk1nZlNCbWNtOXRJQ2RtY3ljN0NncGxlSEJ2Y25RZ1kyOXVjM1FnU1UxUVQxSlVYMDFCVUY5R1NVeEZYMDVCVFVVZ1BTQW5ibTlrWlM1cGJYQnZjblJ0WVhBbk93b0tZMjl1YzNRZ1ltRnpaVlZTVENBOUlIVnliQzV3WVhSb1ZHOUdhV3hsVlZKTUtIQnliMk5sYzNNdVkzZGtLQ2twSUNzZ2NHRjBhQzV6WlhBN0Nnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU51WlhjdGNtVnpiMngyWlMxaGJHZHZjbWwwYUcwS1pYaHdiM0owSUdaMWJtTjBhVzl1SUhKbGMyOXNkbVZUY0dWamFXWnBaWElvYVcxd2IzSjBUV0Z3TENCemNHVmphV1pwWlhJc0lIQmhjbVZ1ZEZWU1RDa2dld29nSUd4bGRDQmpkWEp5Wlc1MFFtRnpaVlZTVERzS0lDQnBaaUFvY0dGeVpXNTBWVkpNS1NCN0NpQWdJQ0JqYjI1emRDQnNZWE4wVTJ4aGMyaEpibVJsZUNBOUlIQmhjbVZ1ZEZWU1RDNXNZWE4wU1c1a1pYaFBaaWh3WVhSb0xuTmxjQ2s3Q2lBZ0lDQmpkWEp5Wlc1MFFtRnpaVlZTVENBOUlIQmhjbVZ1ZEZWU1RDNXpiR2xqWlNnd0xDQnNZWE4wVTJ4aGMyaEpibVJsZUNBcklERXBPd29nSUgwZ1pXeHpaU0I3Q2lBZ0lDQmpkWEp5Wlc1MFFtRnpaVlZTVENBOUlHSmhjMlZWVWt3N0NpQWdmUW9nSUdOdmJuTjBJRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWElnUFFvZ0lDQWdjR0Z5YzJWVlVreE1hV3RsVTNCbFkybG1hV1Z5S0hOd1pXTnBabWxsY2l3Z1kzVnljbVZ1ZEVKaGMyVlZVa3dwSUh4OElITndaV05wWm1sbGNqc0tJQ0JtYjNJZ0tHeGxkQ0J6WTI5d1pWQnlaV1pwZUNCcGJpQnBiWEJ2Y25STllYQXVjMk52Y0dWektTQjdDaUFnSUNCcFppQW9DaUFnSUNBZ0lITmpiM0JsVUhKbFptbDRJRDA5UFNCamRYSnlaVzUwUW1GelpWVlNUQ0I4ZkFvZ0lDQWdJQ0FvYzJOdmNHVlFjbVZtYVhndVpXNWtjMWRwZEdnb0p5OG5LU0FtSmlCamRYSnlaVzUwUW1GelpWVlNUQzV6ZEdGeWRITlhhWFJvS0hOamIzQmxVSEpsWm1sNEtTa0tJQ0FnSUNrZ2V3b2dJQ0FnSUNCamIyNXpkQ0J6WTI5d1pVbHRjRzl5ZEhOTllYUmphQ0E5SUhKbGMyOXNkbVZKYlhCdmNuUnpUV0YwWTJnb0NpQWdJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpd0tJQ0FnSUNBZ0lDQnBiWEJ2Y25STllYQXVjMk52Y0dWelczTmpiM0JsVUhKbFptbDRYUW9nSUNBZ0lDQXBPd29nSUNBZ0lDQnBaaUFvYzJOdmNHVkpiWEJ2Y25SelRXRjBZMmdwSUhzS0lDQWdJQ0FnSUNCeVpYUjFjbTRnYzJOdmNHVkpiWEJ2Y25SelRXRjBZMmc3Q2lBZ0lDQWdJSDBLSUNBZ0lIMGdaV3h6WlNCN0NpQWdJQ0FnSUdOdmJuTjBJSFJ2Y0V4bGRtVnNTVzF3YjNKMGMwMWhkR05vSUQwZ2NtVnpiMngyWlVsdGNHOXlkSE5OWVhSamFDZ0tJQ0FnSUNBZ0lDQnViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlMQW9nSUNBZ0lDQWdJR2x0Y0c5eWRFMWhjQzVwYlhCdmNuUnpDaUFnSUNBZ0lDazdDaUFnSUNBZ0lHbG1JQ2gwYjNCTVpYWmxiRWx0Y0c5eWRITk5ZWFJqYUNrZ2V3b2dJQ0FnSUNBZ0lISmxkSFZ5YmlCMGIzQk1aWFpsYkVsdGNHOXlkSE5OWVhSamFEc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lIMEtDaUFnY21WMGRYSnVJSEpsYzI5c2RtVkpiWEJ2Y25SelRXRjBZMmdvYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2l3Z2FXMXdiM0owVFdGd0xtbHRjRzl5ZEhNcE93cDlDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOeVpYTnZiSFpsTFdGdUxXbHRjRzl5ZEhNdGJXRjBZMmdLWm5WdVkzUnBiMjRnY21WemIyeDJaVWx0Y0c5eWRITk5ZWFJqYUNodWIzSnRZV3hwZW1Wa1UzQmxZMmxtYVdWeUxDQnpjR1ZqYVdacFpYSk5ZWEFwSUhzS0lDQm1iM0lnS0d4bGRDQnpjR1ZqYVdacFpYSkxaWGtnYVc0Z2MzQmxZMmxtYVdWeVRXRndLU0I3Q2lBZ0lDQmpiMjV6ZENCeVpYTnZiSFYwYVc5dVVtVnpkV3gwSUQwZ2MzQmxZMmxtYVdWeVRXRndXM053WldOcFptbGxja3RsZVYwN0Nnb2dJQ0FnYVdZZ0tITndaV05wWm1sbGNrdGxlU0E5UFQwZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpa2dld29nSUNBZ0lDQnBaaUFvY21WemIyeDFkR2x2YmxKbGMzVnNkQ0E5UFQwZ2JuVnNiQ2tnZXdvZ0lDQWdJQ0FnSUhSb2NtOTNJRlI1Y0dWRmNuSnZjaWdLSUNBZ0lDQWdJQ0FnSUdCVWFHVWdhVzF3YjNKMElHMWhjQ0J5WlhOdmJIVjBhVzl1SUc5bUlDUjdjM0JsWTJsbWFXVnlTMlY1ZlNCbVlXbHNaV1FnWkhWbElIUnZJR0VnYm5Wc2JDQmxiblJ5ZVdBS0lDQWdJQ0FnSUNBcE93b2dJQ0FnSUNCOUNpQWdJQ0FnSUhKbGRIVnliaUJ5WlhOdmJIVjBhVzl1VW1WemRXeDBPd29nSUNBZ2ZTQmxiSE5sSUdsbUlDZ0tJQ0FnSUNBZ2MzQmxZMmxtYVdWeVMyVjVMbVZ1WkhOWGFYUm9LQ2N2SnlrZ0ppWUtJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpNXpkR0Z5ZEhOWGFYUm9LSE53WldOcFptbGxja3RsZVNrS0lDQWdJQ2tnZXdvZ0lDQWdJQ0JwWmlBb2NtVnpiMngxZEdsdmJsSmxjM1ZzZENBOVBUMGdiblZzYkNrZ2V3b2dJQ0FnSUNBZ0lIUm9jbTkzSUZSNWNHVkZjbkp2Y2lnS0lDQWdJQ0FnSUNBZ0lHQlVhR1VnYVcxd2IzSjBJRzFoY0NCeVpYTnZiSFYwYVc5dUlHOW1JQ1I3YzNCbFkybG1hV1Z5UzJWNWZTQm1ZV2xzWldRZ1pIVmxJSFJ2SUdFZ2JuVnNiQ0JsYm5SeWVXQUtJQ0FnSUNBZ0lDQXBPd29nSUNBZ0lDQjlDaUFnSUNBZ0lHTnZibk4wSUdGbWRHVnlVSEpsWm1sNElEMGdibTl5YldGc2FYcGxaRk53WldOcFptbGxjaTV6YkdsalpTaHpjR1ZqYVdacFpYSkxaWGt1YkdWdVozUm9LVHNLSUNBZ0lDQWdkSEo1SUhzS0lDQWdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lGVlNUQ2hoWm5SbGNsQnlaV1pwZUN3Z2NtVnpiMngxZEdsdmJsSmxjM1ZzZENrdWFISmxaanNLSUNBZ0lDQWdmU0JqWVhSamFDQjdDaUFnSUNBZ0lDQWdkR2h5YjNjZ1ZIbHdaVVZ5Y205eUtBb2dJQ0FnSUNBZ0lDQWdZRlJvWlNCcGJYQnZjblFnYldGd0lISmxjMjlzZFhScGIyNGdiMllnSkh0emNHVmphV1pwWlhKTFpYbDlJR1poYVd4bFpDQmtkV1VnZEc4Z1ZWSk1JSEJoY25ObElHWmhhV3gxY21WZ0NpQWdJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lIMEtDaUFnY21WMGRYSnVJRzUxYkd3N0NuMEtDaTh2SUdoMGRIQnpPaTh2ZDJsalp5NW5hWFJvZFdJdWFXOHZhVzF3YjNKMExXMWhjSE12STNCaGNuTnBibWNLWlhod2IzSjBJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVkJibVJEYjIxd2IzTmxTVzF3YjNKMFRXRndLSEJoY25ObFpDa2dld29nSUM4dklGTjBaWEFnTWdvZ0lHbG1JQ2doYVhOUWJHRnBiazlpYW1WamRDaHdZWEp6WldRcEtTQjdDaUFnSUNCMGFISnZkeUJGY25KdmNpaGdTVzUyWVd4cFpDQnBiWEJ2Y25RZ2JXRndJQzBnZEc5d0lHeGxkbVZzSUcxMWMzUWdZbVVnWVc0Z2IySnFaV04wWUNrN0NpQWdmUW9LSUNBdkx5QlRkR1Z3SURNS0lDQnNaWFFnYzI5eWRHVmtRVzVrVG05eWJXRnNhWHBsWkVsdGNHOXlkSE1nUFNCN2ZUc0tDaUFnTHk4Z1UzUmxjQ0EwQ2lBZ2FXWWdLSEJoY25ObFpDNW9ZWE5QZDI1UWNtOXdaWEowZVNnbmFXMXdiM0owY3ljcEtTQjdDaUFnSUNBdkx5QlRkR1Z3SURRdU1Rb2dJQ0FnYVdZZ0tDRnBjMUJzWVdsdVQySnFaV04wS0hCaGNuTmxaQzVwYlhCdmNuUnpLU2tnZXdvZ0lDQWdJQ0IwYUhKdmR5QkZjbkp2Y2loZ1NXNTJZV3hwWkNCcGJYQnZjblFnYldGd0lDMGdJbWx0Y0c5eWRITWlJSEJ5YjNCbGNuUjVJRzExYzNRZ1ltVWdZVzRnYjJKcVpXTjBZQ2s3Q2lBZ0lDQjlDZ29nSUNBZ0x5OGdVM1JsY0NBMExqSUtJQ0FnSUhOdmNuUmxaRUZ1WkU1dmNtMWhiR2w2WldSSmJYQnZjblJ6SUQwZ2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDZ0tJQ0FnSUNBZ2NHRnljMlZrTG1sdGNHOXlkSE1zQ2lBZ0lDQWdJR0poYzJWVlVrd0tJQ0FnSUNrN0NpQWdmUW9LSUNBdkx5QlRkR1Z3SURVS0lDQnNaWFFnYzI5eWRHVmtRVzVrVG05eWJXRnNhWHBsWkZOamIzQmxjeUE5SUh0OU93b0tJQ0F2THlCVGRHVndJRFlLSUNCcFppQW9jR0Z5YzJWa0xtaGhjMDkzYmxCeWIzQmxjblI1S0NkelkyOXdaWE1uS1NrZ2V3b2dJQ0FnTHk4Z1UzUmxjQ0EyTGpFS0lDQWdJR2xtSUNnaGFYTlFiR0ZwYms5aWFtVmpkQ2h3WVhKelpXUXVjMk52Y0dWektTa2dld29nSUNBZ0lDQjBhSEp2ZHlCRmNuSnZjaWhnU1c1MllXeHBaQ0JwYlhCdmNuUWdiV0Z3SUMwZ0luTmpiM0JsY3lJZ2NISnZjR1Z5ZEhrZ2JYVnpkQ0JpWlNCaGJpQnZZbXBsWTNSZ0tUc0tJQ0FnSUgwS0NpQWdJQ0F2THlCVGRHVndJRFl1TWdvZ0lDQWdjMjl5ZEdWa1FXNWtUbTl5YldGc2FYcGxaRk5qYjNCbGN5QTlJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRZMjl3WlhNb2NHRnljMlZrTG5OamIzQmxjeXdnWW1GelpWVlNUQ2s3Q2lBZ2ZRb0tJQ0F2THlCVGRHVndJRGNLSUNCamIyNXpkQ0JwYm5aaGJHbGtTMlY1Y3lBOUlFOWlhbVZqZEM1clpYbHpLSEJoY25ObFpDa3VabWxzZEdWeUtBb2dJQ0FnS0d0bGVTa2dQVDRnYTJWNUlDRTlQU0FuYVcxd2IzSjBjeWNnSmlZZ2EyVjVJQ0U5UFNBbmMyTnZjR1Z6SndvZ0lDazdDaUFnYVdZZ0tHbHVkbUZzYVdSTFpYbHpMbXhsYm1kMGFDQStJREFwSUhzS0lDQWdJR052Ym5OdmJHVXVkMkZ5YmlnS0lDQWdJQ0FnWUVsdWRtRnNhV1FnZEc5d0xXeGxkbVZzSUd0bGVTUjdDaUFnSUNBZ0lDQWdhVzUyWVd4cFpFdGxlWE11YkdWdVozUm9JRDRnTUNBL0lDZHpKeUE2SUNjbkNpQWdJQ0FnSUgwZ2FXNGdhVzF3YjNKMElHMWhjQ0F0SUNSN2FXNTJZV3hwWkV0bGVYTXVhbTlwYmlnbkxDQW5LWDFnQ2lBZ0lDQXBPd29nSUgwS0NpQWdMeThnVTNSbGNDQTRDaUFnY21WMGRYSnVJSHNLSUNBZ0lHbHRjRzl5ZEhNNklITnZjblJsWkVGdVpFNXZjbTFoYkdsNlpXUkpiWEJ2Y25SekxBb2dJQ0FnYzJOdmNHVnpPaUJ6YjNKMFpXUkJibVJPYjNKdFlXeHBlbVZrVTJOdmNHVnpMQW9nSUgwN0NuMEtDaTh2SUdoMGRIQnpPaTh2ZDJsalp5NW5hWFJvZFdJdWFXOHZhVzF3YjNKMExXMWhjSE12STNOdmNuUXRZVzVrTFc1dmNtMWhiR2w2WlMxaExYTndaV05wWm1sbGNpMXRZWEFLWm5WdVkzUnBiMjRnYzI5eWRFRnVaRTV2Y20xaGJHbDZaVk53WldOcFptbGxjazFoY0NodFlYQXNJR0poYzJWVlVrd3BJSHNLSUNCamIyNXpkQ0J1YjNKdFlXeHBlbVZrSUQwZ2UzMDdDZ29nSUdadmNpQW9iR1YwSUhOd1pXTnBabWxsY2t0bGVTQnBiaUJ0WVhBcElIc0tJQ0FnSUdOdmJuTjBJSFpoYkhWbElEMGdiV0Z3VzNOd1pXTnBabWxsY2t0bGVWMDdDZ29nSUNBZ1kyOXVjM1FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVTQTlJRzV2Y20xaGJHbDZaVk53WldOcFptbGxja3RsZVNoemNHVmphV1pwWlhKTFpYa3NJR0poYzJWVlVrd3BPd29nSUNBZ2FXWWdLRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWEpMWlhrZ1BUMDlJRzUxYkd3cElIc0tJQ0FnSUNBZ1kyOXVkR2x1ZFdVN0NpQWdJQ0I5Q2dvZ0lDQWdiR1YwSUdGa1pISmxjM05WVWt3Z1BTQndZWEp6WlZWU1RFeHBhMlZUY0dWamFXWnBaWElvZG1Gc2RXVXNJR0poYzJWVlVrd3BPd29nSUNBZ2FXWWdLR0ZrWkhKbGMzTlZVa3dnUFQwOUlHNTFiR3dwSUhzS0lDQWdJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNBZ0lHQkpiblpoYkdsa0lGVlNUQ0JoWkdSeVpYTnpJR1p2Y2lCcGJYQnZjblFnYldGd0lITndaV05wWm1sbGNpQW5KSHR6Y0dWamFXWnBaWEpMWlhsOUoyQUtJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGdHViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlTMlY1WFNBOUlHNTFiR3c3Q2lBZ0lDQWdJR052Ym5ScGJuVmxPd29nSUNBZ2ZRb0tJQ0FnSUdsbUlDaHpjR1ZqYVdacFpYSkxaWGt1Wlc1a2MxZHBkR2dvSnk4bktTQW1KaUFoWVdSa2NtVnpjMVZTVEM1bGJtUnpWMmwwYUNnbkx5Y3BLU0I3Q2lBZ0lDQWdJR052Ym5OdmJHVXVkMkZ5YmlnS0lDQWdJQ0FnSUNCZ1NXNTJZV3hwWkNCVlVrd2dZV1JrY21WemN5Qm1iM0lnYVcxd2IzSjBJRzFoY0NCemNHVmphV1pwWlhJZ0p5UjdjM0JsWTJsbWFXVnlTMlY1ZlNjZ0xTQnphVzVqWlNCMGFHVWdjM0JsWTJsbWFXVnlJR1Z1WkhNZ2FXNGdjMnhoYzJnc0lITnZJRzExYzNRZ2RHaGxJR0ZrWkhKbGMzTmdDaUFnSUNBZ0lDazdDaUFnSUNBZ0lHNXZjbTFoYkdsNlpXUmJibTl5YldGc2FYcGxaRk53WldOcFptbGxja3RsZVYwZ1BTQnVkV3hzT3dvZ0lDQWdJQ0JqYjI1MGFXNTFaVHNLSUNBZ0lIMEtDaUFnSUNCdWIzSnRZV3hwZW1Wa1cyNXZjbTFoYkdsNlpXUlRjR1ZqYVdacFpYSkxaWGxkSUQwZ1lXUmtjbVZ6YzFWU1REc0tJQ0I5Q2dvZ0lISmxkSFZ5YmlCdWIzSnRZV3hwZW1Wa093cDlDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOdWIzSnRZV3hwZW1VdFlTMXpjR1ZqYVdacFpYSXRhMlY1Q21aMWJtTjBhVzl1SUc1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2t0bGVTaHJaWGtwSUhzS0lDQnBaaUFvYTJWNUlEMDlQU0FuSnlrZ2V3b2dJQ0FnWTI5dWMyOXNaUzUzWVhKdUtHQlRjR1ZqYVdacFpYSWdhMlY1Y3lCcGJpQnBiWEJ2Y25RZ2JXRndjeUJ0WVhrZ2JtOTBJR0psSUhSb1pTQmxiWEIwZVNCemRISnBibWRnS1RzS0lDQWdJSEpsZEhWeWJpQnVkV3hzT3dvZ0lIMEtDaUFnY21WMGRYSnVJSEJoY25ObFZWSk1UR2xyWlZOd1pXTnBabWxsY2loclpYa3NJR0poYzJWVlVrd3BJSHg4SUd0bGVUc0tmUW9LTHk4Z2FIUjBjSE02THk5M2FXTm5MbWRwZEdoMVlpNXBieTlwYlhCdmNuUXRiV0Z3Y3k4amNHRnljMlV0WVMxMWNtd3RiR2xyWlMxcGJYQnZjblF0YzNCbFkybG1hV1Z5Q21aMWJtTjBhVzl1SUhCaGNuTmxWVkpNVEdsclpWTndaV05wWm1sbGNpaHpjR1ZqYVdacFpYSXNJR0poYzJWVlVrd3BJSHNLSUNCamIyNXpkQ0IxYzJWQ1lYTmxWWEpzUVhOUVlYSmxiblFnUFFvZ0lDQWdjM0JsWTJsbWFXVnlMbk4wWVhKMGMxZHBkR2dvSnk4bktTQjhmQW9nSUNBZ2MzQmxZMmxtYVdWeUxuTjBZWEowYzFkcGRHZ29KeTR2SnlrZ2ZId0tJQ0FnSUhOd1pXTnBabWxsY2k1emRHRnlkSE5YYVhSb0tDY3VMaThuS1RzS0NpQWdkSEo1SUhzS0lDQWdJSEpsZEhWeWJpQnVaWGNnVlZKTUtITndaV05wWm1sbGNpd2dkWE5sUW1GelpWVnliRUZ6VUdGeVpXNTBJRDhnWW1GelpWVlNUQ0E2SUhWdVpHVm1hVzVsWkNrdWFISmxaanNLSUNCOUlHTmhkR05vSUhzS0lDQWdJSEpsZEhWeWJpQnVkV3hzT3dvZ0lIMEtmUW9LTHk4Z2FIUjBjSE02THk5M2FXTm5MbWRwZEdoMVlpNXBieTlwYlhCdmNuUXRiV0Z3Y3k4amMyOXlkQzFoYm1RdGJtOXliV0ZzYVhwbExYTmpiM0JsY3dwbWRXNWpkR2x2YmlCemIzSjBRVzVrVG05eWJXRnNhWHBsVTJOdmNHVnpLRzFoY0N3Z1ltRnpaVlZTVENrZ2V3b2dJR3hsZENCdWIzSnRZV3hwZW1Wa0lEMGdlMzA3Q2dvZ0lHWnZjaUFvYkdWMElITmpiM0JsVUhKbFptbDRJR2x1SUcxaGNDa2dld29nSUNBZ1kyOXVjM1FnY0c5MFpXNTBhV0ZzVTNCbFkybG1hV1Z5VFdGd0lEMGdiV0Z3VzNOamIzQmxVSEpsWm1sNFhUc0tJQ0FnSUdsbUlDZ2hhWE5RYkdGcGJrOWlhbVZqZENod2IzUmxiblJwWVd4VGNHVmphV1pwWlhKTllYQXBLU0I3Q2lBZ0lDQWdJSFJvY205M0lGUjVjR1ZGY25KdmNpZ0tJQ0FnSUNBZ0lDQmdWR2hsSUhaaGJIVmxJRzltSUhOamIzQmxJQ1I3YzJOdmNHVlFjbVZtYVhoOUlHMTFjM1FnWW1VZ1lTQktVMDlPSUc5aWFtVmpkR0FLSUNBZ0lDQWdLVHNLSUNBZ0lIMEtDaUFnSUNCc1pYUWdjMk52Y0dWUWNtVm1hWGhWVWt3N0NpQWdJQ0IwY25rZ2V3b2dJQ0FnSUNCelkyOXdaVkJ5WldacGVGVlNUQ0E5SUc1bGR5QlZVa3dvYzJOdmNHVlFjbVZtYVhnc0lHSmhjMlZWVWt3cExtaHlaV1k3Q2lBZ0lDQjlJR05oZEdOb0lIc0tJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLQW9nSUNBZ0lDQWdJR0JUWTI5d1pTQndjbVZtYVhnZ1ZWSk1JQ2NrZTNOamIzQmxVSEpsWm1sNGZTY2dkMkZ6SUc1dmRDQndZWEp6WldGaWJHVWdhVzRnYVcxd2IzSjBJRzFoY0dBS0lDQWdJQ0FnS1RzS0lDQWdJQ0FnWTI5dWRHbHVkV1U3Q2lBZ0lDQjlDZ29nSUNBZ2JtOXliV0ZzYVhwbFpGdHpZMjl3WlZCeVpXWnBlRlZTVEYwZ1BTQnpiM0owUVc1a1RtOXliV0ZzYVhwbFUzQmxZMmxtYVdWeVRXRndLQW9nSUNBZ0lDQndiM1JsYm5ScFlXeFRjR1ZqYVdacFpYSk5ZWEFzQ2lBZ0lDQWdJR0poYzJWVlVrd0tJQ0FnSUNrN0NpQWdmUW9LSUNCeVpYUjFjbTRnYm05eWJXRnNhWHBsWkRzS2ZRb0tablZ1WTNScGIyNGdhWE5RYkdGcGJrOWlhbVZqZENodlltb3BJSHNLSUNCeVpYUjFjbTRnYjJKcUlEMDlQU0JQWW1wbFkzUW9iMkpxS1NBbUppQWhRWEp5WVhrdWFYTkJjbkpoZVNodlltb3BPd3A5Q2dvdkx5QXRMUzBLQ214bGRDQnBiWEJ2Y25STllYQlFjbTl0YVhObElEMGdaMlYwU1cxd2IzSjBUV0Z3VUhKdmJXbHpaU2dwT3dvS1pYaHdiM0owSUdGemVXNWpJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVW9jM0JsWTJsbWFXVnlMQ0JqYjI1MFpYaDBMQ0JrWldaaGRXeDBVbVZ6YjJ4MlpTa2dld29nSUdOdmJuTjBJSHNnY0dGeVpXNTBWVkpNSUQwZ2JuVnNiQ0I5SUQwZ1kyOXVkR1Y0ZERzS0lDQmpiMjV6ZENCcGJYQnZjblJOWVhBZ1BTQmhkMkZwZENCcGJYQnZjblJOWVhCUWNtOXRhWE5sT3dvZ0lHTnZibk4wSUdsdGNHOXlkRTFoY0ZWeWJDQTlJSEpsYzI5c2RtVlRjR1ZqYVdacFpYSW9hVzF3YjNKMFRXRndMQ0J6Y0dWamFXWnBaWElzSUhCaGNtVnVkRlZTVENrN0Nnb2dJSEpsZEhWeWJpQmtaV1poZFd4MFVtVnpiMngyWlNocGJYQnZjblJOWVhCVmNtd2dQejhnYzNCbFkybG1hV1Z5TENCamIyNTBaWGgwTENCa1pXWmhkV3gwVW1WemIyeDJaU2s3Q24wS0NtVjRjRzl5ZENCaGMzbHVZeUJtZFc1amRHbHZiaUJzYjJGa0tIVnliQ3dnWTI5dWRHVjRkQ3dnWkdWbVlYVnNkRXh2WVdRcElIc0tJQ0JwWmlBb2RYSnNMbk4wWVhKMGMxZHBkR2dvSjJoMGRIQTZMeThuS1NCOGZDQjFjbXd1YzNSaGNuUnpWMmwwYUNnbmFIUjBjSE02THk4bktTa2dld29nSUNBZ1kyOXVjM1FnY21WeklEMGdZWGRoYVhRZ1ptVjBZMmdvZFhKc0tUc0tJQ0FnSUdsbUlDZ2hjbVZ6TG05cktTQjdDaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2loZ1JtRnBiR1ZrSUhSdklHWmxkR05vSUcxdlpIVnNaU0JtY205dElDUjdkWEpzZldBcE93b2dJQ0FnZlFvZ0lDQWdZMjl1YzNRZ2MyOTFjbU5sSUQwZ1lYZGhhWFFnY21WekxuUmxlSFFvS1RzS0lDQWdJSEpsZEhWeWJpQjdDaUFnSUNBZ0lITm9iM0owUTJseVkzVnBkRG9nZEhKMVpTd0tJQ0FnSUNBZ1ptOXliV0YwT2lBbmJXOWtkV3hsSnl3Z0NpQWdJQ0FnSUhOdmRYSmpaU3dLSUNBZ0lIMDdDaUFnZlFvS0lDQnBaaUFvSVhWeWJDNXpkR0Z5ZEhOWGFYUm9LQ2R1YjJSbE9pY3BLU0I3Q2lBZ0lDQmpiMjUwWlhoMExtWnZjbTFoZENBOUlDZHRiMlIxYkdVbk93b2dJSDBLSUNBS0lDQnlaWFIxY200Z1pHVm1ZWFZzZEV4dllXUW9kWEpzTENCamIyNTBaWGgwTENCa1pXWmhkV3gwVEc5aFpDazdDbjBLQ21GemVXNWpJR1oxYm1OMGFXOXVJR2RsZEVsdGNHOXlkRTFoY0ZCeWIyMXBjMlVvS1NCN0NpQWdZMjl1YzNRZ2NtVnNZWFJwZG1WUVlYUm9JRDBnY0hKdlkyVnpjeTVsYm5ZdVNVMVFUMUpVWDAxQlVGOVFRVlJJSUh4OElFbE5VRTlTVkY5TlFWQmZSa2xNUlY5T1FVMUZPd29nSUdOdmJuTjBJR2x0Y0c5eWRFMWhjRkJoZEdnZ1BTQndZWFJvTG5KbGMyOXNkbVVvY0hKdlkyVnpjeTVqZDJRb0tTd2djbVZzWVhScGRtVlFZWFJvS1RzS0NpQWdiR1YwSUhOMGNqc0tJQ0IwY25rZ2V3b2dJQ0FnYzNSeUlEMGdZWGRoYVhRZ1puTXVjbVZoWkVacGJHVW9hVzF3YjNKMFRXRndVR0YwYUNrN0NpQWdmU0JqWVhSamFDQW9aWEp5S1NCN0NpQWdJQ0J5WlhSMWNtNGdaVzF3ZEhsTllYQW9LVHNLSUNCOUNnb2dJR3hsZENCcWMyOXVPd29nSUhSeWVTQjdDaUFnSUNCcWMyOXVJRDBnWVhkaGFYUWdTbE5QVGk1d1lYSnpaU2h6ZEhJcE93b2dJSDBnWTJGMFkyZ2dLR1Z5Y2lrZ2V3b2dJQ0FnZEdoeWIzY2dSWEp5YjNJb0NpQWdJQ0FnSUdCSmJYQnZjblFnYldGd0lHRjBJQ1I3YVcxd2IzSjBUV0Z3VUdGMGFIMGdZMjl1ZEdGcGJuTWdhVzUyWVd4cFpDQnFjMjl1T2lBa2UyVnljaTV0WlhOellXZGxmV0FLSUNBZ0lDazdDaUFnZlFvS0lDQnlaWFIxY200Z2NtVnpiMngyWlVGdVpFTnZiWEJ2YzJWSmJYQnZjblJOWVhBb2FuTnZiaWs3Q24wS0NtZHNiMkpoYkM1dWIyUmxURzloWkdWeUlEMGdaMnh2WW1Gc0xtNXZaR1ZNYjJGa1pYSWdmSHdnZTMwN0NncG5iRzlpWVd3dWJtOWtaVXh2WVdSbGNpNXpaWFJKYlhCdmNuUk5ZWEJRY205dGFYTmxJRDBnWm5WdVkzUnBiMjRnYzJWMFNXMXdiM0owVFdGd1VISnZiV2x6WlNod2NtOXRhWE5sS1NCN0NpQWdhVzF3YjNKMFRXRndVSEp2YldselpTQTlJSEJ5YjIxcGMyVXVkR2hsYmlnb2JXRndLU0E5UGlCN0NpQWdJQ0J5WlhSMWNtNGdjbVZ6YjJ4MlpVRnVaRU52YlhCdmMyVkpiWEJ2Y25STllYQW9iV0Z3S1RzS0lDQjlLVHNLZlRzS0NtWjFibU4wYVc5dUlHVnRjSFI1VFdGd0tDa2dld29nSUhKbGRIVnliaUI3SUdsdGNHOXlkSE02SUh0OUxDQnpZMjl3WlhNNklIdDlJSDA3Q24wSyI7CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi9ub2RlL2luaXQtbm9kZS1mZWRlcmF0aW9uLnRzCnZhciBkZWZhdWx0T3B0aW9ucyA9IHsKICByZW1vdGVzT3JNYW5pZmVzdFVybDoge30sCiAgcmVsQnVuZGxlUGF0aDogIi4uL2Jyb3dzZXIiLAogIHRocm93SWZSZW1vdGVOb3RGb3VuZDogZmFsc2UKfTsKYXN5bmMgZnVuY3Rpb24gaW5pdE5vZGVGZWRlcmF0aW9uKG9wdGlvbnMpIHsKICBjb25zdCBtZXJnZWRPcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9OwogIGNvbnN0IGltcG9ydE1hcCA9IGF3YWl0IGNyZWF0ZU5vZGVJbXBvcnRNYXAobWVyZ2VkT3B0aW9ucyk7CiAgYXdhaXQgd3JpdGVJbXBvcnRNYXAoaW1wb3J0TWFwKTsKICBhd2FpdCB3cml0ZVJlc29sdmVyKCk7CiAgcmVnaXN0ZXIocGF0aFRvRmlsZVVSTCgiLi9mZWRlcmF0aW9uLXJlc29sdmVyLm1qcyIpLmhyZWYpOwp9CmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5vZGVJbXBvcnRNYXAob3B0aW9ucykgewogIGNvbnN0IHsgcmVtb3Rlc09yTWFuaWZlc3RVcmwsIHJlbEJ1bmRsZVBhdGggfSA9IG9wdGlvbnM7CiAgY29uc3QgcmVtb3RlcyA9IHR5cGVvZiByZW1vdGVzT3JNYW5pZmVzdFVybCA9PT0gIm9iamVjdCIgPyByZW1vdGVzT3JNYW5pZmVzdFVybCA6IGF3YWl0IGxvYWRGc01hbmlmZXN0KHJlbW90ZXNPck1hbmlmZXN0VXJsKTsKICBjb25zdCBob3N0SW5mbyA9IGF3YWl0IGxvYWRGc0ZlZGVyYXRpb25JbmZvKHJlbEJ1bmRsZVBhdGgpOwogIGNvbnN0IGhvc3RJbXBvcnRNYXAgPSBhd2FpdCBwcm9jZXNzSG9zdEluZm8oaG9zdEluZm8sICIuLyIgKyByZWxCdW5kbGVQYXRoKTsKICBjb25zdCByZW1vdGVzSW1wb3J0TWFwID0gYXdhaXQgcHJvY2Vzc1JlbW90ZUluZm9zKHJlbW90ZXMsIHsKICAgIHRocm93SWZSZW1vdGVOb3RGb3VuZDogb3B0aW9ucy50aHJvd0lmUmVtb3RlTm90Rm91bmQsCiAgICBjYWNoZVRhZzogb3B0aW9ucy5jYWNoZVRhZwogIH0pOwogIGNvbnN0IGltcG9ydE1hcCA9IG1lcmdlSW1wb3J0TWFwcyhob3N0SW1wb3J0TWFwLCByZW1vdGVzSW1wb3J0TWFwKTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGc01hbmlmZXN0KG1hbmlmZXN0VXJsKSB7CiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzMi5yZWFkRmlsZShtYW5pZmVzdFVybCwgInV0Zi04Iik7CiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGNvbnRlbnQpOwogIHJldHVybiBtYW5pZmVzdDsKfQphc3luYyBmdW5jdGlvbiBsb2FkRnNGZWRlcmF0aW9uSW5mbyhyZWxCdW5kbGVQYXRoKSB7CiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aDIuam9pbihyZWxCdW5kbGVQYXRoLCAicmVtb3RlRW50cnkuanNvbiIpOwogIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmczIucmVhZEZpbGUobWFuaWZlc3RQYXRoLCAidXRmLTgiKTsKICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoY29udGVudCk7CiAgcmV0dXJuIG1hbmlmZXN0Owp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlSW1wb3J0TWFwKG1hcCkgewogIGF3YWl0IGZzMi53cml0ZUZpbGUoCiAgICBJTVBPUlRfTUFQX0ZJTEVfTkFNRSwKICAgIEpTT04uc3RyaW5naWZ5KG1hcCwgbnVsbCwgMiksCiAgICAidXRmLTgiCiAgKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZVJlc29sdmVyKCkgewogIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc29sdmVyLCAiYmFzZTY0Iik7CiAgYXdhaXQgZnMyLndyaXRlRmlsZSgiZmVkZXJhdGlvbi1yZXNvbHZlci5tanMiLCBidWZmZXIsICJ1dGYtOCIpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi91dGlscy9mc3RhcnQtYXJncy1wYXJzZXIudHMKaW1wb3J0ICogYXMgZnMzIGZyb20gIm5vZGU6ZnMiOwp2YXIgZGVmYXVsdEFyZ3MgPSB7CiAgZW50cnk6ICIuL3NlcnZlci5tanMiLAogIHJlbW90ZXNPck1hbmlmZXN0VXJsOiAiLi4vYnJvd3Nlci9mZWRlcmF0aW9uLm1hbmlmZXN0Lmpzb24iLAogIHJlbEJ1bmRsZVBhdGg6ICIuLi9icm93c2VyLyIKfTsKZnVuY3Rpb24gcGFyc2VGU3RhcnRBcmdzKCkgewogIGNvbnN0IGFyZ3MyID0gewogICAgZW50cnk6ICIiLAogICAgcmVtb3Rlc09yTWFuaWZlc3RVcmw6ICIiLAogICAgcmVsQnVuZGxlUGF0aDogIiIKICB9OwogIGxldCBrZXkgPSAiIjsKICBmb3IgKGxldCBpID0gMjsgaSA8IHByb2Nlc3MuYXJndi5sZW5ndGg7IGkrKykgewogICAgY29uc3QgY2FuZCA9IHByb2Nlc3MuYXJndltpXTsKICAgIGlmIChjYW5kLnN0YXJ0c1dpdGgoIi0tIikpIHsKICAgICAgY29uc3QgY2FuZEtleSA9IGNhbmQuc3Vic3RyaW5nKDIpOwogICAgICBpZiAoZGVmYXVsdEFyZ3NbY2FuZEtleV0pIHsKICAgICAgICBrZXkgPSBjYW5kS2V5OwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYHN3aXRjaCAke2NhbmR9IG5vdCBzdXBwb3J0ZWQhYCk7CiAgICAgICAgZXhpdFdpdGhVc2FnZShkZWZhdWx0QXJncyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoa2V5KSB7CiAgICAgIGFyZ3MyW2tleV0gPSBjYW5kOwogICAgICBrZXkgPSAiIjsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYHVucmVsYWRlZCB2YWx1ZSAke2NhbmR9IWApOwogICAgICBleGl0V2l0aFVzYWdlKGRlZmF1bHRBcmdzKTsKICAgIH0KICB9CiAgYXBwbHlEZWZhdWx0QXJncyhhcmdzMik7CiAgcmV0dXJuIGFyZ3MyOwp9CmZ1bmN0aW9uIGFwcGx5RGVmYXVsdEFyZ3MoYXJnczIpIHsKICBpZiAoYXJnczIucmVsQnVuZGxlUGF0aCAmJiAhYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwpIHsKICAgIGNvbnN0IGNhbmQgPSBkZWZhdWx0QXJncy5yZWxCdW5kbGVQYXRoICsgImZlZGVyYXRpb24ubWFuaWZlc3QuanNvbiI7CiAgICBpZiAoZnMzLmV4aXN0c1N5bmMoY2FuZCkpIHsKICAgICAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSBjYW5kOwogICAgfQogIH0KICBhcmdzMi5lbnRyeSA9IGFyZ3MyLmVudHJ5IHx8IGRlZmF1bHRBcmdzLmVudHJ5OwogIGFyZ3MyLnJlbEJ1bmRsZVBhdGggPSBhcmdzMi5yZWxCdW5kbGVQYXRoIHx8IGRlZmF1bHRBcmdzLnJlbEJ1bmRsZVBhdGg7CiAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCB8fCBkZWZhdWx0QXJncy5yZW1vdGVzT3JNYW5pZmVzdFVybDsKICBpZiAoIWZzMy5leGlzdHNTeW5jKGFyZ3MyLnJlbW90ZXNPck1hbmlmZXN0VXJsKSkgewogICAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSB2b2lkIDA7CiAgfQp9CmZ1bmN0aW9uIGV4aXRXaXRoVXNhZ2UoZGVmYXVsdEFyZ3MyKSB7CiAgbGV0IGFyZ3MyID0gIiI7CiAgZm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdEFyZ3MyKSB7CiAgICBhcmdzMiArPSBgWy0tJHtrZXl9ICR7ZGVmYXVsdEFyZ3MyW2tleV19XSBgOwogIH0KICBjb25zb2xlLmxvZygidXNhZ2U6IG5mc3RhcnQgIiArIGFyZ3MyKTsKICBwcm9jZXNzLmV4aXQoMSk7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2ZzdGFydC50cwp2YXIgYXJncyA9IHBhcnNlRlN0YXJ0QXJncygpOwooYXN5bmMgKCkgPT4gewogIGF3YWl0IGluaXROb2RlRmVkZXJhdGlvbih7CiAgICAuLi5hcmdzLnJlbW90ZXNPck1hbmlmZXN0VXJsID8geyByZW1vdGVzT3JNYW5pZmVzdFVybDogYXJncy5yZW1vdGVzT3JNYW5pZmVzdFVybCB9IDoge30sCiAgICByZWxCdW5kbGVQYXRoOiBhcmdzLnJlbEJ1bmRsZVBhdGgKICB9KTsKICBhd2FpdCBpbXBvcnQoYXJncy5lbnRyeSk7Cn0pKCk7Cg==";
1
+ export declare const fstart = "Ly8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvbm9kZS9pbml0LW5vZGUtZmVkZXJhdGlvbi50cwppbXBvcnQgeyByZWdpc3RlciB9IGZyb20gIm5vZGU6bW9kdWxlIjsKaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gIm5vZGU6dXJsIjsKaW1wb3J0ICogYXMgZnMyIGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgKiBhcyBwYXRoMiBmcm9tICJub2RlOnBhdGgiOwoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvZ2xvYmFsLWNhY2hlLnRzCnZhciBuZk5hbWVzcGFjZSA9ICJfX05BVElWRV9GRURFUkFUSU9OX18iOwp2YXIgZ2xvYmFsMiA9IGdsb2JhbFRoaXM7Cmdsb2JhbDJbbmZOYW1lc3BhY2VdID8/PSB7CiAgZXh0ZXJuYWxzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogIHJlbW90ZU5hbWVzVG9SZW1vdGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksCiAgYmFzZVVybFRvUmVtb3RlTmFtZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkKfTsKdmFyIGdsb2JhbENhY2hlID0gZ2xvYmFsMltuZk5hbWVzcGFjZV07CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9leHRlcm5hbHMudHMKdmFyIGV4dGVybmFscyA9IGdsb2JhbENhY2hlLmV4dGVybmFsczsKZnVuY3Rpb24gZ2V0RXh0ZXJuYWxLZXkoc2hhcmVkKSB7CiAgcmV0dXJuIGAke3NoYXJlZC5wYWNrYWdlTmFtZX1AJHtzaGFyZWQudmVyc2lvbn1gOwp9CmZ1bmN0aW9uIGdldEV4dGVybmFsVXJsKHNoYXJlZCkgewogIGNvbnN0IHBhY2thZ2VLZXkgPSBnZXRFeHRlcm5hbEtleShzaGFyZWQpOwogIHJldHVybiBleHRlcm5hbHMuZ2V0KHBhY2thZ2VLZXkpOwp9CmZ1bmN0aW9uIHNldEV4dGVybmFsVXJsKHNoYXJlZCwgdXJsMikgewogIGNvbnN0IHBhY2thZ2VLZXkgPSBnZXRFeHRlcm5hbEtleShzaGFyZWQpOwogIGV4dGVybmFscy5zZXQocGFja2FnZUtleSwgdXJsMik7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL21vZGVsL2ltcG9ydC1tYXAudHMKZnVuY3Rpb24gbWVyZ2VJbXBvcnRNYXBzKG1hcDEsIG1hcDIpIHsKICByZXR1cm4gewogICAgaW1wb3J0czogeyAuLi5tYXAxLmltcG9ydHMsIC4uLm1hcDIuaW1wb3J0cyB9LAogICAgc2NvcGVzOiB7IC4uLm1hcDEuc2NvcGVzLCAuLi5tYXAyLnNjb3BlcyB9CiAgfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvcmVtb3Rlcy50cwp2YXIgcmVtb3RlTmFtZXNUb1JlbW90ZSA9IGdsb2JhbENhY2hlLnJlbW90ZU5hbWVzVG9SZW1vdGU7CnZhciBiYXNlVXJsVG9SZW1vdGVOYW1lcyA9IGdsb2JhbENhY2hlLmJhc2VVcmxUb1JlbW90ZU5hbWVzOwpmdW5jdGlvbiBhZGRSZW1vdGUocmVtb3RlTmFtZSwgcmVtb3RlKSB7CiAgcmVtb3RlTmFtZXNUb1JlbW90ZS5zZXQocmVtb3RlTmFtZSwgcmVtb3RlKTsKICBiYXNlVXJsVG9SZW1vdGVOYW1lcy5zZXQocmVtb3RlLmJhc2VVcmwsIHJlbW90ZU5hbWUpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi91dGlscy9wYXRoLXV0aWxzLnRzCmZ1bmN0aW9uIGdldERpcmVjdG9yeSh1cmwyKSB7CiAgY29uc3QgcGFydHMgPSB1cmwyLnNwbGl0KCIvIik7CiAgcGFydHMucG9wKCk7CiAgcmV0dXJuIHBhcnRzLmpvaW4oIi8iKTsKfQpmdW5jdGlvbiBqb2luUGF0aHMocGF0aDEsIHBhdGgyMikgewogIHdoaWxlIChwYXRoMS5lbmRzV2l0aCgiLyIpKSB7CiAgICBwYXRoMSA9IHBhdGgxLnN1YnN0cmluZygwLCBwYXRoMS5sZW5ndGggLSAxKTsKICB9CiAgaWYgKHBhdGgyMi5zdGFydHNXaXRoKCIuLyIpKSB7CiAgICBwYXRoMjIgPSBwYXRoMjIuc3Vic3RyaW5nKDIsIHBhdGgyMi5sZW5ndGgpOwogIH0KICByZXR1cm4gYCR7cGF0aDF9LyR7cGF0aDIyfWA7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL3dhdGNoLWZlZGVyYXRpb24tYnVpbGQudHMKZnVuY3Rpb24gd2F0Y2hGZWRlcmF0aW9uQnVpbGRDb21wbGV0aW9uKGVuZHBvaW50KSB7CiAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoZW5kcG9pbnQpOwogIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsKICAgIGlmIChkYXRhLnR5cGUgPT09ICJmZWRlcmF0aW9uLXJlYnVpbGQtY29tcGxldGUiIC8qIENPTVBMRVRFRCAqLykgewogICAgICBjb25zb2xlLmxvZygiW0ZlZGVyYXRpb25dIFJlYnVpbGQgY29tcGxldGVkLCByZWxvYWRpbmcuLi4iKTsKICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfQogIH07CiAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjb25zb2xlLndhcm4oIltGZWRlcmF0aW9uXSBTU0UgY29ubmVjdGlvbiBlcnJvcjoiLCBldmVudCk7CiAgfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvaW5pdC1mZWRlcmF0aW9uLnRzCmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbmZvcyhyZW1vdGVzLCBvcHRpb25zID0geyB0aHJvd0lmUmVtb3RlTm90Rm91bmQ6IGZhbHNlIH0pIHsKICBjb25zdCBwcm9jZXNzUmVtb3RlSW5mb1Byb21pc2VzID0gT2JqZWN0LmtleXMocmVtb3RlcykubWFwKAogICAgYXN5bmMgKHJlbW90ZU5hbWUpID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBsZXQgdXJsMiA9IHJlbW90ZXNbcmVtb3RlTmFtZV07CiAgICAgICAgaWYgKG9wdGlvbnMuY2FjaGVUYWcpIHsKICAgICAgICAgIGNvbnN0IGFkZEFwcGVuZCA9IHJlbW90ZXNbcmVtb3RlTmFtZV0uaW5jbHVkZXMoIj8iKSA/ICImIiA6ICI/IjsKICAgICAgICAgIHVybDIgKz0gYCR7YWRkQXBwZW5kfXQ9JHtvcHRpb25zLmNhY2hlVGFnfWA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhd2FpdCBwcm9jZXNzUmVtb3RlSW5mbyh1cmwyLCByZW1vdGVOYW1lKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnN0IGVycm9yID0gYEVycm9yIGxvYWRpbmcgcmVtb3RlIGVudHJ5IGZvciAke3JlbW90ZU5hbWV9IGZyb20gZmlsZSAke3JlbW90ZXNbcmVtb3RlTmFtZV19YDsKICAgICAgICBpZiAob3B0aW9ucy50aHJvd0lmUmVtb3RlTm90Rm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7CiAgICAgICAgfQogICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgKTsKICBjb25zdCByZW1vdGVJbXBvcnRNYXBzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvY2Vzc1JlbW90ZUluZm9Qcm9taXNlcyk7CiAgY29uc3QgaW1wb3J0TWFwID0gcmVtb3RlSW1wb3J0TWFwcy5yZWR1Y2UoCiAgICAoYWNjLCByZW1vdGVJbXBvcnRNYXApID0+IHJlbW90ZUltcG9ydE1hcCA/IG1lcmdlSW1wb3J0TWFwcyhhY2MsIHJlbW90ZUltcG9ydE1hcCkgOiBhY2MsCiAgICB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH0KICApOwogIHJldHVybiBpbXBvcnRNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1JlbW90ZUluZm8oZmVkZXJhdGlvbkluZm9VcmwsIHJlbW90ZU5hbWUpIHsKICBjb25zdCBiYXNlVXJsID0gZ2V0RGlyZWN0b3J5KGZlZGVyYXRpb25JbmZvVXJsKTsKICBjb25zdCByZW1vdGVJbmZvID0gYXdhaXQgbG9hZEZlZGVyYXRpb25JbmZvKGZlZGVyYXRpb25JbmZvVXJsKTsKICBpZiAoIXJlbW90ZU5hbWUpIHsKICAgIHJlbW90ZU5hbWUgPSByZW1vdGVJbmZvLm5hbWU7CiAgfQogIGlmIChyZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50KSB7CiAgICB3YXRjaEZlZGVyYXRpb25CdWlsZENvbXBsZXRpb24oCiAgICAgIGJhc2VVcmwgKyByZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50CiAgICApOwogIH0KICBjb25zdCBpbXBvcnRNYXAgPSBjcmVhdGVSZW1vdGVJbXBvcnRNYXAocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCk7CiAgYWRkUmVtb3RlKHJlbW90ZU5hbWUsIHsgLi4ucmVtb3RlSW5mbywgYmFzZVVybCB9KTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUltcG9ydE1hcChyZW1vdGVJbmZvLCByZW1vdGVOYW1lLCBiYXNlVXJsKSB7CiAgY29uc3QgaW1wb3J0cyA9IHByb2Nlc3NFeHBvc2VkKHJlbW90ZUluZm8sIHJlbW90ZU5hbWUsIGJhc2VVcmwpOwogIGNvbnN0IHNjb3BlcyA9IHByb2Nlc3NSZW1vdGVJbXBvcnRzKHJlbW90ZUluZm8sIGJhc2VVcmwpOwogIHJldHVybiB7IGltcG9ydHMsIHNjb3BlcyB9Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGZWRlcmF0aW9uSW5mbyh1cmwyKSB7CiAgY29uc3QgaW5mbyA9IGF3YWl0IGZldGNoKHVybDIpLnRoZW4oKHIpID0+IHIuanNvbigpKTsKICByZXR1cm4gaW5mbzsKfQpmdW5jdGlvbiBwcm9jZXNzUmVtb3RlSW1wb3J0cyhyZW1vdGVJbmZvLCBiYXNlVXJsKSB7CiAgY29uc3Qgc2NvcGVzID0ge307CiAgY29uc3Qgc2NvcGVkSW1wb3J0cyA9IHt9OwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIHJlbW90ZUluZm8uc2hhcmVkKSB7CiAgICBjb25zdCBvdXRGaWxlTmFtZSA9IGdldEV4dGVybmFsVXJsKHNoYXJlZCkgPz8gam9pblBhdGhzKGJhc2VVcmwsIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgICBzZXRFeHRlcm5hbFVybChzaGFyZWQsIG91dEZpbGVOYW1lKTsKICAgIHNjb3BlZEltcG9ydHNbc2hhcmVkLnBhY2thZ2VOYW1lXSA9IG91dEZpbGVOYW1lOwogIH0KICBzY29wZXNbYmFzZVVybCArICIvIl0gPSBzY29wZWRJbXBvcnRzOwogIHJldHVybiBzY29wZXM7Cn0KZnVuY3Rpb24gcHJvY2Vzc0V4cG9zZWQocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCkgewogIGNvbnN0IGltcG9ydHMgPSB7fTsKICBmb3IgKGNvbnN0IGV4cG9zZWQgb2YgcmVtb3RlSW5mby5leHBvc2VzKSB7CiAgICBjb25zdCBrZXkgPSBqb2luUGF0aHMocmVtb3RlTmFtZSwgZXhwb3NlZC5rZXkpOwogICAgY29uc3QgdmFsdWUgPSBqb2luUGF0aHMoYmFzZVVybCwgZXhwb3NlZC5vdXRGaWxlTmFtZSk7CiAgICBpbXBvcnRzW2tleV0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIGltcG9ydHM7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0hvc3RJbmZvKGhvc3RJbmZvLCByZWxCdW5kbGVzUGF0aCA9ICIuLyIpIHsKICBjb25zdCBpbXBvcnRzID0gaG9zdEluZm8uc2hhcmVkLnJlZHVjZSgKICAgIChhY2MsIGN1cikgPT4gKHsKICAgICAgLi4uYWNjLAogICAgICBbY3VyLnBhY2thZ2VOYW1lXTogcmVsQnVuZGxlc1BhdGggKyBjdXIub3V0RmlsZU5hbWUKICAgIH0pLAogICAge30KICApOwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIGhvc3RJbmZvLnNoYXJlZCkgewogICAgc2V0RXh0ZXJuYWxVcmwoc2hhcmVkLCByZWxCdW5kbGVzUGF0aCArIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgfQogIHJldHVybiB7IGltcG9ydHMsIHNjb3Blczoge30gfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvdXRpbHMvaW1wb3J0LW1hcC1sb2FkZXIuanMKaW1wb3J0IHBhdGggZnJvbSAicGF0aCI7CmltcG9ydCB1cmwgZnJvbSAidXJsIjsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICJmcyI7CnZhciBJTVBPUlRfTUFQX0ZJTEVfTkFNRSA9ICJub2RlLmltcG9ydG1hcCI7CnZhciBiYXNlVVJMID0gdXJsLnBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSkgKyBwYXRoLnNlcDsKZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CiAgbGV0IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0ge307CiAgaWYgKHBhcnNlZC5oYXNPd25Qcm9wZXJ0eSgiaW1wb3J0cyIpKSB7CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLmltcG9ydHMpKSB7CiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSAiaW1wb3J0cyIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3RgKTsKICAgIH0KICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcGFyc2VkLmltcG9ydHMsCiAgICAgIGJhc2VVUkwKICAgICk7CiAgfQogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0ge307CiAgaWYgKHBhcnNlZC5oYXNPd25Qcm9wZXJ0eSgic2NvcGVzIikpIHsKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuc2NvcGVzKSkgewogICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBpbXBvcnQgbWFwIC0gInNjb3BlcyIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3RgKTsKICAgIH0KICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSBzb3J0QW5kTm9ybWFsaXplU2NvcGVzKHBhcnNlZC5zY29wZXMsIGJhc2VVUkwpOwogIH0KICBjb25zdCBpbnZhbGlkS2V5cyA9IE9iamVjdC5rZXlzKHBhcnNlZCkuZmlsdGVyKAogICAgKGtleSkgPT4ga2V5ICE9PSAiaW1wb3J0cyIgJiYga2V5ICE9PSAic2NvcGVzIgogICk7CiAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCA+IDApIHsKICAgIGNvbnNvbGUud2FybigKICAgICAgYEludmFsaWQgdG9wLWxldmVsIGtleSR7aW52YWxpZEtleXMubGVuZ3RoID4gMCA/ICJzIiA6ICIifSBpbiBpbXBvcnQgbWFwIC0gJHtpbnZhbGlkS2V5cy5qb2luKCIsICIpfWAKICAgICk7CiAgfQogIHJldHVybiB7CiAgICBpbXBvcnRzOiBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cywKICAgIHNjb3Blczogc29ydGVkQW5kTm9ybWFsaXplZFNjb3BlcwogIH07Cn0KZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcChtYXAsIGJhc2VVUkwyKSB7CiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9OwogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBtYXApIHsKICAgIGNvbnN0IHZhbHVlID0gbWFwW3NwZWNpZmllcktleV07CiAgICBjb25zdCBub3JtYWxpemVkU3BlY2lmaWVyS2V5ID0gbm9ybWFsaXplU3BlY2lmaWVyS2V5KHNwZWNpZmllcktleSwgYmFzZVVSTDIpOwogICAgaWYgKG5vcm1hbGl6ZWRTcGVjaWZpZXJLZXkgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBsZXQgYWRkcmVzc1VSTCA9IHBhcnNlVVJMTGlrZVNwZWNpZmllcih2YWx1ZSwgYmFzZVVSTDIpOwogICAgaWYgKGFkZHJlc3NVUkwgPT09IG51bGwpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9J2AKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHNwZWNpZmllcktleS5lbmRzV2l0aCgiLyIpICYmICFhZGRyZXNzVVJMLmVuZHNXaXRoKCIvIikpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9JyAtIHNpbmNlIHRoZSBzcGVjaWZpZXIgZW5kcyBpbiBzbGFzaCwgc28gbXVzdCB0aGUgYWRkcmVzc2AKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IGFkZHJlc3NVUkw7CiAgfQogIHJldHVybiBub3JtYWxpemVkOwp9CmZ1bmN0aW9uIG5vcm1hbGl6ZVNwZWNpZmllcktleShrZXkpIHsKICBpZiAoa2V5ID09PSAiIikgewogICAgY29uc29sZS53YXJuKGBTcGVjaWZpZXIga2V5cyBpbiBpbXBvcnQgbWFwcyBtYXkgbm90IGJlIHRoZSBlbXB0eSBzdHJpbmdgKTsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKGtleSwgYmFzZVVSTCkgfHwga2V5Owp9CmZ1bmN0aW9uIHBhcnNlVVJMTGlrZVNwZWNpZmllcihzcGVjaWZpZXIsIGJhc2VVUkwyKSB7CiAgY29uc3QgdXNlQmFzZVVybEFzUGFyZW50ID0gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoIi8iKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgiLi8iKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgiLi4vIik7CiAgdHJ5IHsKICAgIHJldHVybiBuZXcgVVJMKHNwZWNpZmllciwgdXNlQmFzZVVybEFzUGFyZW50ID8gYmFzZVVSTDIgOiB2b2lkIDApLmhyZWY7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNjb3BlcyhtYXAsIGJhc2VVUkwyKSB7CiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTsKICBmb3IgKGxldCBzY29wZVByZWZpeCBpbiBtYXApIHsKICAgIGNvbnN0IHBvdGVudGlhbFNwZWNpZmllck1hcCA9IG1hcFtzY29wZVByZWZpeF07CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocG90ZW50aWFsU3BlY2lmaWVyTWFwKSkgewogICAgICB0aHJvdyBUeXBlRXJyb3IoCiAgICAgICAgYFRoZSB2YWx1ZSBvZiBzY29wZSAke3Njb3BlUHJlZml4fSBtdXN0IGJlIGEgSlNPTiBvYmplY3RgCiAgICAgICk7CiAgICB9CiAgICBsZXQgc2NvcGVQcmVmaXhVUkw7CiAgICB0cnkgewogICAgICBzY29wZVByZWZpeFVSTCA9IG5ldyBVUkwoc2NvcGVQcmVmaXgsIGJhc2VVUkwyKS5ocmVmOwogICAgfSBjYXRjaCB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgU2NvcGUgcHJlZml4IFVSTCAnJHtzY29wZVByZWZpeH0nIHdhcyBub3QgcGFyc2VhYmxlIGluIGltcG9ydCBtYXBgCiAgICAgICk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbm9ybWFsaXplZFtzY29wZVByZWZpeFVSTF0gPSBzb3J0QW5kTm9ybWFsaXplU3BlY2lmaWVyTWFwKAogICAgICBwb3RlbnRpYWxTcGVjaWZpZXJNYXAsCiAgICAgIGJhc2VVUkwyCiAgICApOwogIH0KICByZXR1cm4gbm9ybWFsaXplZDsKfQpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikgewogIHJldHVybiBvYmogPT09IE9iamVjdChvYmopICYmICFBcnJheS5pc0FycmF5KG9iaik7Cn0KdmFyIGltcG9ydE1hcFByb21pc2UgPSBnZXRJbXBvcnRNYXBQcm9taXNlKCk7CmFzeW5jIGZ1bmN0aW9uIGdldEltcG9ydE1hcFByb21pc2UoKSB7CiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcHJvY2Vzcy5lbnYuSU1QT1JUX01BUF9QQVRIIHx8IElNUE9SVF9NQVBfRklMRV9OQU1FOwogIGNvbnN0IGltcG9ydE1hcFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVsYXRpdmVQYXRoKTsKICBsZXQgc3RyOwogIHRyeSB7CiAgICBzdHIgPSBhd2FpdCBmcy5yZWFkRmlsZShpbXBvcnRNYXBQYXRoKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBlbXB0eU1hcCgpOwogIH0KICBsZXQganNvbjsKICB0cnkgewogICAganNvbiA9IGF3YWl0IEpTT04ucGFyc2Uoc3RyKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHRocm93IEVycm9yKAogICAgICBgSW1wb3J0IG1hcCBhdCAke2ltcG9ydE1hcFBhdGh9IGNvbnRhaW5zIGludmFsaWQganNvbjogJHtlcnIubWVzc2FnZX1gCiAgICApOwogIH0KICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAoanNvbik7Cn0KZ2xvYmFsLm5vZGVMb2FkZXIgPSBnbG9iYWwubm9kZUxvYWRlciB8fCB7fTsKZ2xvYmFsLm5vZGVMb2FkZXIuc2V0SW1wb3J0TWFwUHJvbWlzZSA9IGZ1bmN0aW9uIHNldEltcG9ydE1hcFByb21pc2UocHJvbWlzZSkgewogIGltcG9ydE1hcFByb21pc2UgPSBwcm9taXNlLnRoZW4oKG1hcCkgPT4gewogICAgcmV0dXJuIHJlc29sdmVBbmRDb21wb3NlSW1wb3J0TWFwKG1hcCk7CiAgfSk7Cn07CmZ1bmN0aW9uIGVtcHR5TWFwKCkgewogIHJldHVybiB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH07Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2xvYWRlci1hcy1kYXRhLXVybC5qcwp2YXIgcmVzb2x2ZXIgPSAiYVcxd2IzSjBJSEJoZEdnZ1puSnZiU0FuY0dGMGFDYzdDbWx0Y0c5eWRDQjFjbXdnWm5KdmJTQW5kWEpzSnpzS2FXMXdiM0owSUhzZ2NISnZiV2x6WlhNZ1lYTWdabk1nZlNCbWNtOXRJQ2RtY3ljN0NncGxlSEJ2Y25RZ1kyOXVjM1FnU1UxUVQxSlVYMDFCVUY5R1NVeEZYMDVCVFVVZ1BTQW5ibTlrWlM1cGJYQnZjblJ0WVhBbk93b0tZMjl1YzNRZ1ltRnpaVlZTVENBOUlIVnliQzV3WVhSb1ZHOUdhV3hsVlZKTUtIQnliMk5sYzNNdVkzZGtLQ2twSUNzZ2NHRjBhQzV6WlhBN0Nnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU51WlhjdGNtVnpiMngyWlMxaGJHZHZjbWwwYUcwS1pYaHdiM0owSUdaMWJtTjBhVzl1SUhKbGMyOXNkbVZUY0dWamFXWnBaWElvYVcxd2IzSjBUV0Z3TENCemNHVmphV1pwWlhJc0lIQmhjbVZ1ZEZWU1RDa2dld29nSUd4bGRDQmpkWEp5Wlc1MFFtRnpaVlZTVERzS0lDQnBaaUFvY0dGeVpXNTBWVkpNS1NCN0NpQWdJQ0JqYjI1emRDQnNZWE4wVTJ4aGMyaEpibVJsZUNBOUlIQmhjbVZ1ZEZWU1RDNXNZWE4wU1c1a1pYaFBaaWh3WVhSb0xuTmxjQ2s3Q2lBZ0lDQmpkWEp5Wlc1MFFtRnpaVlZTVENBOUlIQmhjbVZ1ZEZWU1RDNXpiR2xqWlNnd0xDQnNZWE4wVTJ4aGMyaEpibVJsZUNBcklERXBPd29nSUgwZ1pXeHpaU0I3Q2lBZ0lDQmpkWEp5Wlc1MFFtRnpaVlZTVENBOUlHSmhjMlZWVWt3N0NpQWdmUW9nSUdOdmJuTjBJRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWElnUFFvZ0lDQWdjR0Z5YzJWVlVreE1hV3RsVTNCbFkybG1hV1Z5S0hOd1pXTnBabWxsY2l3Z1kzVnljbVZ1ZEVKaGMyVlZVa3dwSUh4OElITndaV05wWm1sbGNqc0tJQ0JtYjNJZ0tHeGxkQ0J6WTI5d1pWQnlaV1pwZUNCcGJpQnBiWEJ2Y25STllYQXVjMk52Y0dWektTQjdDaUFnSUNCcFppQW9DaUFnSUNBZ0lITmpiM0JsVUhKbFptbDRJRDA5UFNCamRYSnlaVzUwUW1GelpWVlNUQ0I4ZkFvZ0lDQWdJQ0FvYzJOdmNHVlFjbVZtYVhndVpXNWtjMWRwZEdnb0p5OG5LU0FtSmlCamRYSnlaVzUwUW1GelpWVlNUQzV6ZEdGeWRITlhhWFJvS0hOamIzQmxVSEpsWm1sNEtTa0tJQ0FnSUNrZ2V3b2dJQ0FnSUNCamIyNXpkQ0J6WTI5d1pVbHRjRzl5ZEhOTllYUmphQ0E5SUhKbGMyOXNkbVZKYlhCdmNuUnpUV0YwWTJnb0NpQWdJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpd0tJQ0FnSUNBZ0lDQnBiWEJ2Y25STllYQXVjMk52Y0dWelczTmpiM0JsVUhKbFptbDRYUW9nSUNBZ0lDQXBPd29nSUNBZ0lDQnBaaUFvYzJOdmNHVkpiWEJ2Y25SelRXRjBZMmdwSUhzS0lDQWdJQ0FnSUNCeVpYUjFjbTRnYzJOdmNHVkpiWEJ2Y25SelRXRjBZMmc3Q2lBZ0lDQWdJSDBLSUNBZ0lIMGdaV3h6WlNCN0NpQWdJQ0FnSUdOdmJuTjBJSFJ2Y0V4bGRtVnNTVzF3YjNKMGMwMWhkR05vSUQwZ2NtVnpiMngyWlVsdGNHOXlkSE5OWVhSamFDZ0tJQ0FnSUNBZ0lDQnViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlMQW9nSUNBZ0lDQWdJR2x0Y0c5eWRFMWhjQzVwYlhCdmNuUnpDaUFnSUNBZ0lDazdDaUFnSUNBZ0lHbG1JQ2gwYjNCTVpYWmxiRWx0Y0c5eWRITk5ZWFJqYUNrZ2V3b2dJQ0FnSUNBZ0lISmxkSFZ5YmlCMGIzQk1aWFpsYkVsdGNHOXlkSE5OWVhSamFEc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lIMEtDaUFnY21WMGRYSnVJSEpsYzI5c2RtVkpiWEJ2Y25SelRXRjBZMmdvYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2l3Z2FXMXdiM0owVFdGd0xtbHRjRzl5ZEhNcE93cDlDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOeVpYTnZiSFpsTFdGdUxXbHRjRzl5ZEhNdGJXRjBZMmdLWm5WdVkzUnBiMjRnY21WemIyeDJaVWx0Y0c5eWRITk5ZWFJqYUNodWIzSnRZV3hwZW1Wa1UzQmxZMmxtYVdWeUxDQnpjR1ZqYVdacFpYSk5ZWEFwSUhzS0lDQm1iM0lnS0d4bGRDQnpjR1ZqYVdacFpYSkxaWGtnYVc0Z2MzQmxZMmxtYVdWeVRXRndLU0I3Q2lBZ0lDQmpiMjV6ZENCeVpYTnZiSFYwYVc5dVVtVnpkV3gwSUQwZ2MzQmxZMmxtYVdWeVRXRndXM053WldOcFptbGxja3RsZVYwN0Nnb2dJQ0FnYVdZZ0tITndaV05wWm1sbGNrdGxlU0E5UFQwZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpa2dld29nSUNBZ0lDQnBaaUFvY21WemIyeDFkR2x2YmxKbGMzVnNkQ0E5UFQwZ2JuVnNiQ2tnZXdvZ0lDQWdJQ0FnSUhSb2NtOTNJRlI1Y0dWRmNuSnZjaWdLSUNBZ0lDQWdJQ0FnSUdCVWFHVWdhVzF3YjNKMElHMWhjQ0J5WlhOdmJIVjBhVzl1SUc5bUlDUjdjM0JsWTJsbWFXVnlTMlY1ZlNCbVlXbHNaV1FnWkhWbElIUnZJR0VnYm5Wc2JDQmxiblJ5ZVdBS0lDQWdJQ0FnSUNBcE93b2dJQ0FnSUNCOUNpQWdJQ0FnSUhKbGRIVnliaUJ5WlhOdmJIVjBhVzl1VW1WemRXeDBPd29nSUNBZ2ZTQmxiSE5sSUdsbUlDZ0tJQ0FnSUNBZ2MzQmxZMmxtYVdWeVMyVjVMbVZ1WkhOWGFYUm9LQ2N2SnlrZ0ppWUtJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpNXpkR0Z5ZEhOWGFYUm9LSE53WldOcFptbGxja3RsZVNrS0lDQWdJQ2tnZXdvZ0lDQWdJQ0JwWmlBb2NtVnpiMngxZEdsdmJsSmxjM1ZzZENBOVBUMGdiblZzYkNrZ2V3b2dJQ0FnSUNBZ0lIUm9jbTkzSUZSNWNHVkZjbkp2Y2lnS0lDQWdJQ0FnSUNBZ0lHQlVhR1VnYVcxd2IzSjBJRzFoY0NCeVpYTnZiSFYwYVc5dUlHOW1JQ1I3YzNCbFkybG1hV1Z5UzJWNWZTQm1ZV2xzWldRZ1pIVmxJSFJ2SUdFZ2JuVnNiQ0JsYm5SeWVXQUtJQ0FnSUNBZ0lDQXBPd29nSUNBZ0lDQjlDaUFnSUNBZ0lHTnZibk4wSUdGbWRHVnlVSEpsWm1sNElEMGdibTl5YldGc2FYcGxaRk53WldOcFptbGxjaTV6YkdsalpTaHpjR1ZqYVdacFpYSkxaWGt1YkdWdVozUm9LVHNLSUNBZ0lDQWdkSEo1SUhzS0lDQWdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lGVlNUQ2hoWm5SbGNsQnlaV1pwZUN3Z2NtVnpiMngxZEdsdmJsSmxjM1ZzZENrdWFISmxaanNLSUNBZ0lDQWdmU0JqWVhSamFDQjdDaUFnSUNBZ0lDQWdkR2h5YjNjZ1ZIbHdaVVZ5Y205eUtBb2dJQ0FnSUNBZ0lDQWdZRlJvWlNCcGJYQnZjblFnYldGd0lISmxjMjlzZFhScGIyNGdiMllnSkh0emNHVmphV1pwWlhKTFpYbDlJR1poYVd4bFpDQmtkV1VnZEc4Z1ZWSk1JSEJoY25ObElHWmhhV3gxY21WZ0NpQWdJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lIMEtDaUFnY21WMGRYSnVJRzUxYkd3N0NuMEtDaTh2SUdoMGRIQnpPaTh2ZDJsalp5NW5hWFJvZFdJdWFXOHZhVzF3YjNKMExXMWhjSE12STNCaGNuTnBibWNLWlhod2IzSjBJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVkJibVJEYjIxd2IzTmxTVzF3YjNKMFRXRndLSEJoY25ObFpDa2dld29nSUM4dklGTjBaWEFnTWdvZ0lHbG1JQ2doYVhOUWJHRnBiazlpYW1WamRDaHdZWEp6WldRcEtTQjdDaUFnSUNCMGFISnZkeUJGY25KdmNpaGdTVzUyWVd4cFpDQnBiWEJ2Y25RZ2JXRndJQzBnZEc5d0lHeGxkbVZzSUcxMWMzUWdZbVVnWVc0Z2IySnFaV04wWUNrN0NpQWdmUW9LSUNBdkx5QlRkR1Z3SURNS0lDQnNaWFFnYzI5eWRHVmtRVzVrVG05eWJXRnNhWHBsWkVsdGNHOXlkSE1nUFNCN2ZUc0tDaUFnTHk4Z1UzUmxjQ0EwQ2lBZ2FXWWdLSEJoY25ObFpDNW9ZWE5QZDI1UWNtOXdaWEowZVNnbmFXMXdiM0owY3ljcEtTQjdDaUFnSUNBdkx5QlRkR1Z3SURRdU1Rb2dJQ0FnYVdZZ0tDRnBjMUJzWVdsdVQySnFaV04wS0hCaGNuTmxaQzVwYlhCdmNuUnpLU2tnZXdvZ0lDQWdJQ0IwYUhKdmR5QkZjbkp2Y2loZ1NXNTJZV3hwWkNCcGJYQnZjblFnYldGd0lDMGdJbWx0Y0c5eWRITWlJSEJ5YjNCbGNuUjVJRzExYzNRZ1ltVWdZVzRnYjJKcVpXTjBZQ2s3Q2lBZ0lDQjlDZ29nSUNBZ0x5OGdVM1JsY0NBMExqSUtJQ0FnSUhOdmNuUmxaRUZ1WkU1dmNtMWhiR2w2WldSSmJYQnZjblJ6SUQwZ2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDZ0tJQ0FnSUNBZ2NHRnljMlZrTG1sdGNHOXlkSE1zQ2lBZ0lDQWdJR0poYzJWVlVrd0tJQ0FnSUNrN0NpQWdmUW9LSUNBdkx5QlRkR1Z3SURVS0lDQnNaWFFnYzI5eWRHVmtRVzVrVG05eWJXRnNhWHBsWkZOamIzQmxjeUE5SUh0OU93b0tJQ0F2THlCVGRHVndJRFlLSUNCcFppQW9jR0Z5YzJWa0xtaGhjMDkzYmxCeWIzQmxjblI1S0NkelkyOXdaWE1uS1NrZ2V3b2dJQ0FnTHk4Z1UzUmxjQ0EyTGpFS0lDQWdJR2xtSUNnaGFYTlFiR0ZwYms5aWFtVmpkQ2h3WVhKelpXUXVjMk52Y0dWektTa2dld29nSUNBZ0lDQjBhSEp2ZHlCRmNuSnZjaWhnU1c1MllXeHBaQ0JwYlhCdmNuUWdiV0Z3SUMwZ0luTmpiM0JsY3lJZ2NISnZjR1Z5ZEhrZ2JYVnpkQ0JpWlNCaGJpQnZZbXBsWTNSZ0tUc0tJQ0FnSUgwS0NpQWdJQ0F2THlCVGRHVndJRFl1TWdvZ0lDQWdjMjl5ZEdWa1FXNWtUbTl5YldGc2FYcGxaRk5qYjNCbGN5QTlJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRZMjl3WlhNb2NHRnljMlZrTG5OamIzQmxjeXdnWW1GelpWVlNUQ2s3Q2lBZ2ZRb0tJQ0F2THlCVGRHVndJRGNLSUNCamIyNXpkQ0JwYm5aaGJHbGtTMlY1Y3lBOUlFOWlhbVZqZEM1clpYbHpLSEJoY25ObFpDa3VabWxzZEdWeUtBb2dJQ0FnS0d0bGVTa2dQVDRnYTJWNUlDRTlQU0FuYVcxd2IzSjBjeWNnSmlZZ2EyVjVJQ0U5UFNBbmMyTnZjR1Z6SndvZ0lDazdDaUFnYVdZZ0tHbHVkbUZzYVdSTFpYbHpMbXhsYm1kMGFDQStJREFwSUhzS0lDQWdJR052Ym5OdmJHVXVkMkZ5YmlnS0lDQWdJQ0FnWUVsdWRtRnNhV1FnZEc5d0xXeGxkbVZzSUd0bGVTUjdDaUFnSUNBZ0lDQWdhVzUyWVd4cFpFdGxlWE11YkdWdVozUm9JRDRnTUNBL0lDZHpKeUE2SUNjbkNpQWdJQ0FnSUgwZ2FXNGdhVzF3YjNKMElHMWhjQ0F0SUNSN2FXNTJZV3hwWkV0bGVYTXVhbTlwYmlnbkxDQW5LWDFnQ2lBZ0lDQXBPd29nSUgwS0NpQWdMeThnVTNSbGNDQTRDaUFnY21WMGRYSnVJSHNLSUNBZ0lHbHRjRzl5ZEhNNklITnZjblJsWkVGdVpFNXZjbTFoYkdsNlpXUkpiWEJ2Y25SekxBb2dJQ0FnYzJOdmNHVnpPaUJ6YjNKMFpXUkJibVJPYjNKdFlXeHBlbVZrVTJOdmNHVnpMQW9nSUgwN0NuMEtDaTh2SUdoMGRIQnpPaTh2ZDJsalp5NW5hWFJvZFdJdWFXOHZhVzF3YjNKMExXMWhjSE12STNOdmNuUXRZVzVrTFc1dmNtMWhiR2w2WlMxaExYTndaV05wWm1sbGNpMXRZWEFLWm5WdVkzUnBiMjRnYzI5eWRFRnVaRTV2Y20xaGJHbDZaVk53WldOcFptbGxjazFoY0NodFlYQXNJR0poYzJWVlVrd3BJSHNLSUNCamIyNXpkQ0J1YjNKdFlXeHBlbVZrSUQwZ2UzMDdDZ29nSUdadmNpQW9iR1YwSUhOd1pXTnBabWxsY2t0bGVTQnBiaUJ0WVhBcElIc0tJQ0FnSUdOdmJuTjBJSFpoYkhWbElEMGdiV0Z3VzNOd1pXTnBabWxsY2t0bGVWMDdDZ29nSUNBZ1kyOXVjM1FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVTQTlJRzV2Y20xaGJHbDZaVk53WldOcFptbGxja3RsZVNoemNHVmphV1pwWlhKTFpYa3NJR0poYzJWVlVrd3BPd29nSUNBZ2FXWWdLRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWEpMWlhrZ1BUMDlJRzUxYkd3cElIc0tJQ0FnSUNBZ1kyOXVkR2x1ZFdVN0NpQWdJQ0I5Q2dvZ0lDQWdiR1YwSUdGa1pISmxjM05WVWt3Z1BTQndZWEp6WlZWU1RFeHBhMlZUY0dWamFXWnBaWElvZG1Gc2RXVXNJR0poYzJWVlVrd3BPd29nSUNBZ2FXWWdLR0ZrWkhKbGMzTlZVa3dnUFQwOUlHNTFiR3dwSUhzS0lDQWdJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNBZ0lHQkpiblpoYkdsa0lGVlNUQ0JoWkdSeVpYTnpJR1p2Y2lCcGJYQnZjblFnYldGd0lITndaV05wWm1sbGNpQW5KSHR6Y0dWamFXWnBaWEpMWlhsOUoyQUtJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGdHViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlTMlY1WFNBOUlHNTFiR3c3Q2lBZ0lDQWdJR052Ym5ScGJuVmxPd29nSUNBZ2ZRb0tJQ0FnSUdsbUlDaHpjR1ZqYVdacFpYSkxaWGt1Wlc1a2MxZHBkR2dvSnk4bktTQW1KaUFoWVdSa2NtVnpjMVZTVEM1bGJtUnpWMmwwYUNnbkx5Y3BLU0I3Q2lBZ0lDQWdJR052Ym5OdmJHVXVkMkZ5YmlnS0lDQWdJQ0FnSUNCZ1NXNTJZV3hwWkNCVlVrd2dZV1JrY21WemN5Qm1iM0lnYVcxd2IzSjBJRzFoY0NCemNHVmphV1pwWlhJZ0p5UjdjM0JsWTJsbWFXVnlTMlY1ZlNjZ0xTQnphVzVqWlNCMGFHVWdjM0JsWTJsbWFXVnlJR1Z1WkhNZ2FXNGdjMnhoYzJnc0lITnZJRzExYzNRZ2RHaGxJR0ZrWkhKbGMzTmdDaUFnSUNBZ0lDazdDaUFnSUNBZ0lHNXZjbTFoYkdsNlpXUmJibTl5YldGc2FYcGxaRk53WldOcFptbGxja3RsZVYwZ1BTQnVkV3hzT3dvZ0lDQWdJQ0JqYjI1MGFXNTFaVHNLSUNBZ0lIMEtDaUFnSUNCdWIzSnRZV3hwZW1Wa1cyNXZjbTFoYkdsNlpXUlRjR1ZqYVdacFpYSkxaWGxkSUQwZ1lXUmtjbVZ6YzFWU1REc0tJQ0I5Q2dvZ0lISmxkSFZ5YmlCdWIzSnRZV3hwZW1Wa093cDlDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOdWIzSnRZV3hwZW1VdFlTMXpjR1ZqYVdacFpYSXRhMlY1Q21aMWJtTjBhVzl1SUc1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2t0bGVTaHJaWGtwSUhzS0lDQnBaaUFvYTJWNUlEMDlQU0FuSnlrZ2V3b2dJQ0FnWTI5dWMyOXNaUzUzWVhKdUtHQlRjR1ZqYVdacFpYSWdhMlY1Y3lCcGJpQnBiWEJ2Y25RZ2JXRndjeUJ0WVhrZ2JtOTBJR0psSUhSb1pTQmxiWEIwZVNCemRISnBibWRnS1RzS0lDQWdJSEpsZEhWeWJpQnVkV3hzT3dvZ0lIMEtDaUFnY21WMGRYSnVJSEJoY25ObFZWSk1UR2xyWlZOd1pXTnBabWxsY2loclpYa3NJR0poYzJWVlVrd3BJSHg4SUd0bGVUc0tmUW9LTHk4Z2FIUjBjSE02THk5M2FXTm5MbWRwZEdoMVlpNXBieTlwYlhCdmNuUXRiV0Z3Y3k4amNHRnljMlV0WVMxMWNtd3RiR2xyWlMxcGJYQnZjblF0YzNCbFkybG1hV1Z5Q21aMWJtTjBhVzl1SUhCaGNuTmxWVkpNVEdsclpWTndaV05wWm1sbGNpaHpjR1ZqYVdacFpYSXNJR0poYzJWVlVrd3BJSHNLSUNCamIyNXpkQ0IxYzJWQ1lYTmxWWEpzUVhOUVlYSmxiblFnUFFvZ0lDQWdjM0JsWTJsbWFXVnlMbk4wWVhKMGMxZHBkR2dvSnk4bktTQjhmQW9nSUNBZ2MzQmxZMmxtYVdWeUxuTjBZWEowYzFkcGRHZ29KeTR2SnlrZ2ZId0tJQ0FnSUhOd1pXTnBabWxsY2k1emRHRnlkSE5YYVhSb0tDY3VMaThuS1RzS0NpQWdkSEo1SUhzS0lDQWdJSEpsZEhWeWJpQnVaWGNnVlZKTUtITndaV05wWm1sbGNpd2dkWE5sUW1GelpWVnliRUZ6VUdGeVpXNTBJRDhnWW1GelpWVlNUQ0E2SUhWdVpHVm1hVzVsWkNrdWFISmxaanNLSUNCOUlHTmhkR05vSUhzS0lDQWdJSEpsZEhWeWJpQnVkV3hzT3dvZ0lIMEtmUW9LTHk4Z2FIUjBjSE02THk5M2FXTm5MbWRwZEdoMVlpNXBieTlwYlhCdmNuUXRiV0Z3Y3k4amMyOXlkQzFoYm1RdGJtOXliV0ZzYVhwbExYTmpiM0JsY3dwbWRXNWpkR2x2YmlCemIzSjBRVzVrVG05eWJXRnNhWHBsVTJOdmNHVnpLRzFoY0N3Z1ltRnpaVlZTVENrZ2V3b2dJR3hsZENCdWIzSnRZV3hwZW1Wa0lEMGdlMzA3Q2dvZ0lHWnZjaUFvYkdWMElITmpiM0JsVUhKbFptbDRJR2x1SUcxaGNDa2dld29nSUNBZ1kyOXVjM1FnY0c5MFpXNTBhV0ZzVTNCbFkybG1hV1Z5VFdGd0lEMGdiV0Z3VzNOamIzQmxVSEpsWm1sNFhUc0tJQ0FnSUdsbUlDZ2hhWE5RYkdGcGJrOWlhbVZqZENod2IzUmxiblJwWVd4VGNHVmphV1pwWlhKTllYQXBLU0I3Q2lBZ0lDQWdJSFJvY205M0lGUjVjR1ZGY25KdmNpZ0tJQ0FnSUNBZ0lDQmdWR2hsSUhaaGJIVmxJRzltSUhOamIzQmxJQ1I3YzJOdmNHVlFjbVZtYVhoOUlHMTFjM1FnWW1VZ1lTQktVMDlPSUc5aWFtVmpkR0FLSUNBZ0lDQWdLVHNLSUNBZ0lIMEtDaUFnSUNCc1pYUWdjMk52Y0dWUWNtVm1hWGhWVWt3N0NpQWdJQ0IwY25rZ2V3b2dJQ0FnSUNCelkyOXdaVkJ5WldacGVGVlNUQ0E5SUc1bGR5QlZVa3dvYzJOdmNHVlFjbVZtYVhnc0lHSmhjMlZWVWt3cExtaHlaV1k3Q2lBZ0lDQjlJR05oZEdOb0lIc0tJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLQW9nSUNBZ0lDQWdJR0JUWTI5d1pTQndjbVZtYVhnZ1ZWSk1JQ2NrZTNOamIzQmxVSEpsWm1sNGZTY2dkMkZ6SUc1dmRDQndZWEp6WldGaWJHVWdhVzRnYVcxd2IzSjBJRzFoY0dBS0lDQWdJQ0FnS1RzS0lDQWdJQ0FnWTI5dWRHbHVkV1U3Q2lBZ0lDQjlDZ29nSUNBZ2JtOXliV0ZzYVhwbFpGdHpZMjl3WlZCeVpXWnBlRlZTVEYwZ1BTQnpiM0owUVc1a1RtOXliV0ZzYVhwbFUzQmxZMmxtYVdWeVRXRndLQW9nSUNBZ0lDQndiM1JsYm5ScFlXeFRjR1ZqYVdacFpYSk5ZWEFzQ2lBZ0lDQWdJR0poYzJWVlVrd0tJQ0FnSUNrN0NpQWdmUW9LSUNCeVpYUjFjbTRnYm05eWJXRnNhWHBsWkRzS2ZRb0tablZ1WTNScGIyNGdhWE5RYkdGcGJrOWlhbVZqZENodlltb3BJSHNLSUNCeVpYUjFjbTRnYjJKcUlEMDlQU0JQWW1wbFkzUW9iMkpxS1NBbUppQWhRWEp5WVhrdWFYTkJjbkpoZVNodlltb3BPd3A5Q2dvdkx5QXRMUzBLQ214bGRDQnBiWEJ2Y25STllYQlFjbTl0YVhObElEMGdaMlYwU1cxd2IzSjBUV0Z3VUhKdmJXbHpaU2dwT3dvS1pYaHdiM0owSUdGemVXNWpJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVW9jM0JsWTJsbWFXVnlMQ0JqYjI1MFpYaDBMQ0JrWldaaGRXeDBVbVZ6YjJ4MlpTa2dld29nSUdOdmJuTjBJSHNnY0dGeVpXNTBWVkpNSUQwZ2JuVnNiQ0I5SUQwZ1kyOXVkR1Y0ZERzS0lDQmpiMjV6ZENCcGJYQnZjblJOWVhBZ1BTQmhkMkZwZENCcGJYQnZjblJOWVhCUWNtOXRhWE5sT3dvZ0lHTnZibk4wSUdsdGNHOXlkRTFoY0ZWeWJDQTlJSEpsYzI5c2RtVlRjR1ZqYVdacFpYSW9hVzF3YjNKMFRXRndMQ0J6Y0dWamFXWnBaWElzSUhCaGNtVnVkRlZTVENrN0Nnb2dJSEpsZEhWeWJpQmtaV1poZFd4MFVtVnpiMngyWlNocGJYQnZjblJOWVhCVmNtd2dQejhnYzNCbFkybG1hV1Z5TENCamIyNTBaWGgwTENCa1pXWmhkV3gwVW1WemIyeDJaU2s3Q24wS0NtVjRjRzl5ZENCaGMzbHVZeUJtZFc1amRHbHZiaUJzYjJGa0tIVnliQ3dnWTI5dWRHVjRkQ3dnWkdWbVlYVnNkRXh2WVdRcElIc0tJQ0JwWmlBb2RYSnNMbk4wWVhKMGMxZHBkR2dvSjJoMGRIQTZMeThuS1NCOGZDQjFjbXd1YzNSaGNuUnpWMmwwYUNnbmFIUjBjSE02THk4bktTa2dld29nSUNBZ1kyOXVjM1FnY21WeklEMGdZWGRoYVhRZ1ptVjBZMmdvZFhKc0tUc0tJQ0FnSUdsbUlDZ2hjbVZ6TG05cktTQjdDaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2loZ1JtRnBiR1ZrSUhSdklHWmxkR05vSUcxdlpIVnNaU0JtY205dElDUjdkWEpzZldBcE93b2dJQ0FnZlFvZ0lDQWdZMjl1YzNRZ2MyOTFjbU5sSUQwZ1lYZGhhWFFnY21WekxuUmxlSFFvS1RzS0lDQWdJSEpsZEhWeWJpQjdDaUFnSUNBZ0lITm9iM0owUTJseVkzVnBkRG9nZEhKMVpTd0tJQ0FnSUNBZ1ptOXliV0YwT2lBbmJXOWtkV3hsSnl3Z0NpQWdJQ0FnSUhOdmRYSmpaU3dLSUNBZ0lIMDdDaUFnZlFvS0lDQnBaaUFvSVhWeWJDNXpkR0Z5ZEhOWGFYUm9LQ2R1YjJSbE9pY3BLU0I3Q2lBZ0lDQmpiMjUwWlhoMExtWnZjbTFoZENBOUlDZHRiMlIxYkdVbk93b2dJSDBLSUNBS0lDQnlaWFIxY200Z1pHVm1ZWFZzZEV4dllXUW9kWEpzTENCamIyNTBaWGgwTENCa1pXWmhkV3gwVEc5aFpDazdDbjBLQ21GemVXNWpJR1oxYm1OMGFXOXVJR2RsZEVsdGNHOXlkRTFoY0ZCeWIyMXBjMlVvS1NCN0NpQWdZMjl1YzNRZ2NtVnNZWFJwZG1WUVlYUm9JRDBnY0hKdlkyVnpjeTVsYm5ZdVNVMVFUMUpVWDAxQlVGOVFRVlJJSUh4OElFbE5VRTlTVkY5TlFWQmZSa2xNUlY5T1FVMUZPd29nSUdOdmJuTjBJR2x0Y0c5eWRFMWhjRkJoZEdnZ1BTQndZWFJvTG5KbGMyOXNkbVVvY0hKdlkyVnpjeTVqZDJRb0tTd2djbVZzWVhScGRtVlFZWFJvS1RzS0NpQWdiR1YwSUhOMGNqc0tJQ0IwY25rZ2V3b2dJQ0FnYzNSeUlEMGdZWGRoYVhRZ1puTXVjbVZoWkVacGJHVW9hVzF3YjNKMFRXRndVR0YwYUNrN0NpQWdmU0JqWVhSamFDQW9aWEp5S1NCN0NpQWdJQ0J5WlhSMWNtNGdaVzF3ZEhsTllYQW9LVHNLSUNCOUNnb2dJR3hsZENCcWMyOXVPd29nSUhSeWVTQjdDaUFnSUNCcWMyOXVJRDBnWVhkaGFYUWdTbE5QVGk1d1lYSnpaU2h6ZEhJcE93b2dJSDBnWTJGMFkyZ2dLR1Z5Y2lrZ2V3b2dJQ0FnZEdoeWIzY2dSWEp5YjNJb0NpQWdJQ0FnSUdCSmJYQnZjblFnYldGd0lHRjBJQ1I3YVcxd2IzSjBUV0Z3VUdGMGFIMGdZMjl1ZEdGcGJuTWdhVzUyWVd4cFpDQnFjMjl1T2lBa2UyVnljaTV0WlhOellXZGxmV0FLSUNBZ0lDazdDaUFnZlFvS0lDQnlaWFIxY200Z2NtVnpiMngyWlVGdVpFTnZiWEJ2YzJWSmJYQnZjblJOWVhBb2FuTnZiaWs3Q24wS0NtZHNiMkpoYkM1dWIyUmxURzloWkdWeUlEMGdaMnh2WW1Gc0xtNXZaR1ZNYjJGa1pYSWdmSHdnZTMwN0NncG5iRzlpWVd3dWJtOWtaVXh2WVdSbGNpNXpaWFJKYlhCdmNuUk5ZWEJRY205dGFYTmxJRDBnWm5WdVkzUnBiMjRnYzJWMFNXMXdiM0owVFdGd1VISnZiV2x6WlNod2NtOXRhWE5sS1NCN0NpQWdhVzF3YjNKMFRXRndVSEp2YldselpTQTlJSEJ5YjIxcGMyVXVkR2hsYmlnb2JXRndLU0E5UGlCN0NpQWdJQ0J5WlhSMWNtNGdjbVZ6YjJ4MlpVRnVaRU52YlhCdmMyVkpiWEJ2Y25STllYQW9iV0Z3S1RzS0lDQjlLVHNLZlRzS0NtWjFibU4wYVc5dUlHVnRjSFI1VFdGd0tDa2dld29nSUhKbGRIVnliaUI3SUdsdGNHOXlkSE02SUh0OUxDQnpZMjl3WlhNNklIdDlJSDA3Q24wSyI7CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi9ub2RlL2luaXQtbm9kZS1mZWRlcmF0aW9uLnRzCnZhciBkZWZhdWx0T3B0aW9ucyA9IHsKICByZW1vdGVzT3JNYW5pZmVzdFVybDoge30sCiAgcmVsQnVuZGxlUGF0aDogIi4uL2Jyb3dzZXIiLAogIHRocm93SWZSZW1vdGVOb3RGb3VuZDogZmFsc2UKfTsKYXN5bmMgZnVuY3Rpb24gaW5pdE5vZGVGZWRlcmF0aW9uKG9wdGlvbnMpIHsKICBjb25zdCBtZXJnZWRPcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9OwogIGNvbnN0IGltcG9ydE1hcCA9IGF3YWl0IGNyZWF0ZU5vZGVJbXBvcnRNYXAobWVyZ2VkT3B0aW9ucyk7CiAgYXdhaXQgd3JpdGVJbXBvcnRNYXAoaW1wb3J0TWFwKTsKICBhd2FpdCB3cml0ZVJlc29sdmVyKCk7CiAgcmVnaXN0ZXIocGF0aFRvRmlsZVVSTCgiLi9mZWRlcmF0aW9uLXJlc29sdmVyLm1qcyIpLmhyZWYpOwp9CmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5vZGVJbXBvcnRNYXAob3B0aW9ucykgewogIGNvbnN0IHsgcmVtb3Rlc09yTWFuaWZlc3RVcmwsIHJlbEJ1bmRsZVBhdGggfSA9IG9wdGlvbnM7CiAgY29uc3QgcmVtb3RlcyA9IHR5cGVvZiByZW1vdGVzT3JNYW5pZmVzdFVybCA9PT0gIm9iamVjdCIgPyByZW1vdGVzT3JNYW5pZmVzdFVybCA6IGF3YWl0IGxvYWRGc01hbmlmZXN0KHJlbW90ZXNPck1hbmlmZXN0VXJsKTsKICBjb25zdCBob3N0SW5mbyA9IGF3YWl0IGxvYWRGc0ZlZGVyYXRpb25JbmZvKHJlbEJ1bmRsZVBhdGgpOwogIGNvbnN0IGhvc3RJbXBvcnRNYXAgPSBhd2FpdCBwcm9jZXNzSG9zdEluZm8oaG9zdEluZm8sICIuLyIgKyByZWxCdW5kbGVQYXRoKTsKICBjb25zdCByZW1vdGVzSW1wb3J0TWFwID0gYXdhaXQgcHJvY2Vzc1JlbW90ZUluZm9zKHJlbW90ZXMsIHsKICAgIHRocm93SWZSZW1vdGVOb3RGb3VuZDogb3B0aW9ucy50aHJvd0lmUmVtb3RlTm90Rm91bmQsCiAgICBjYWNoZVRhZzogb3B0aW9ucy5jYWNoZVRhZwogIH0pOwogIGNvbnN0IGltcG9ydE1hcCA9IG1lcmdlSW1wb3J0TWFwcyhob3N0SW1wb3J0TWFwLCByZW1vdGVzSW1wb3J0TWFwKTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGc01hbmlmZXN0KG1hbmlmZXN0VXJsKSB7CiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzMi5yZWFkRmlsZShtYW5pZmVzdFVybCwgInV0Zi04Iik7CiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGNvbnRlbnQpOwogIHJldHVybiBtYW5pZmVzdDsKfQphc3luYyBmdW5jdGlvbiBsb2FkRnNGZWRlcmF0aW9uSW5mbyhyZWxCdW5kbGVQYXRoKSB7CiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aDIuam9pbihyZWxCdW5kbGVQYXRoLCAicmVtb3RlRW50cnkuanNvbiIpOwogIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmczIucmVhZEZpbGUobWFuaWZlc3RQYXRoLCAidXRmLTgiKTsKICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoY29udGVudCk7CiAgcmV0dXJuIG1hbmlmZXN0Owp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlSW1wb3J0TWFwKG1hcCkgewogIGF3YWl0IGZzMi53cml0ZUZpbGUoCiAgICBJTVBPUlRfTUFQX0ZJTEVfTkFNRSwKICAgIEpTT04uc3RyaW5naWZ5KG1hcCwgbnVsbCwgMiksCiAgICAidXRmLTgiCiAgKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZVJlc29sdmVyKCkgewogIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc29sdmVyLCAiYmFzZTY0Iik7CiAgYXdhaXQgZnMyLndyaXRlRmlsZSgiZmVkZXJhdGlvbi1yZXNvbHZlci5tanMiLCBidWZmZXIsICJ1dGYtOCIpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi91dGlscy9mc3RhcnQtYXJncy1wYXJzZXIudHMKaW1wb3J0ICogYXMgZnMzIGZyb20gIm5vZGU6ZnMiOwp2YXIgZGVmYXVsdEFyZ3MgPSB7CiAgZW50cnk6ICIuL3NlcnZlci5tanMiLAogIHJlbW90ZXNPck1hbmlmZXN0VXJsOiAiLi4vYnJvd3Nlci9mZWRlcmF0aW9uLm1hbmlmZXN0Lmpzb24iLAogIHJlbEJ1bmRsZVBhdGg6ICIuLi9icm93c2VyLyIKfTsKZnVuY3Rpb24gcGFyc2VGU3RhcnRBcmdzKCkgewogIGNvbnN0IGFyZ3MyID0gewogICAgZW50cnk6ICIiLAogICAgcmVtb3Rlc09yTWFuaWZlc3RVcmw6ICIiLAogICAgcmVsQnVuZGxlUGF0aDogIiIKICB9OwogIGxldCBrZXkgPSAiIjsKICBmb3IgKGxldCBpID0gMjsgaSA8IHByb2Nlc3MuYXJndi5sZW5ndGg7IGkrKykgewogICAgY29uc3QgY2FuZCA9IHByb2Nlc3MuYXJndltpXTsKICAgIGlmIChjYW5kLnN0YXJ0c1dpdGgoIi0tIikpIHsKICAgICAgY29uc3QgY2FuZEtleSA9IGNhbmQuc3Vic3RyaW5nKDIpOwogICAgICBpZiAoZGVmYXVsdEFyZ3NbY2FuZEtleV0pIHsKICAgICAgICBrZXkgPSBjYW5kS2V5OwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYHN3aXRjaCAke2NhbmR9IG5vdCBzdXBwb3J0ZWQhYCk7CiAgICAgICAgZXhpdFdpdGhVc2FnZShkZWZhdWx0QXJncyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoa2V5KSB7CiAgICAgIGFyZ3MyW2tleV0gPSBjYW5kOwogICAgICBrZXkgPSAiIjsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYHVucmVsYWRlZCB2YWx1ZSAke2NhbmR9IWApOwogICAgICBleGl0V2l0aFVzYWdlKGRlZmF1bHRBcmdzKTsKICAgIH0KICB9CiAgYXBwbHlEZWZhdWx0QXJncyhhcmdzMik7CiAgcmV0dXJuIGFyZ3MyOwp9CmZ1bmN0aW9uIGFwcGx5RGVmYXVsdEFyZ3MoYXJnczIpIHsKICBpZiAoYXJnczIucmVsQnVuZGxlUGF0aCAmJiAhYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwpIHsKICAgIGNvbnN0IGNhbmQgPSBkZWZhdWx0QXJncy5yZWxCdW5kbGVQYXRoICsgImZlZGVyYXRpb24ubWFuaWZlc3QuanNvbiI7CiAgICBpZiAoZnMzLmV4aXN0c1N5bmMoY2FuZCkpIHsKICAgICAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSBjYW5kOwogICAgfQogIH0KICBhcmdzMi5lbnRyeSA9IGFyZ3MyLmVudHJ5IHx8IGRlZmF1bHRBcmdzLmVudHJ5OwogIGFyZ3MyLnJlbEJ1bmRsZVBhdGggPSBhcmdzMi5yZWxCdW5kbGVQYXRoIHx8IGRlZmF1bHRBcmdzLnJlbEJ1bmRsZVBhdGg7CiAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCB8fCBkZWZhdWx0QXJncy5yZW1vdGVzT3JNYW5pZmVzdFVybDsKICBpZiAoIWZzMy5leGlzdHNTeW5jKGFyZ3MyLnJlbW90ZXNPck1hbmlmZXN0VXJsKSkgewogICAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSB2b2lkIDA7CiAgfQp9CmZ1bmN0aW9uIGV4aXRXaXRoVXNhZ2UoZGVmYXVsdEFyZ3MyKSB7CiAgbGV0IGFyZ3MyID0gIiI7CiAgZm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdEFyZ3MyKSB7CiAgICBhcmdzMiArPSBgWy0tJHtrZXl9ICR7ZGVmYXVsdEFyZ3MyW2tleV19XSBgOwogIH0KICBjb25zb2xlLmxvZygidXNhZ2U6IG5mc3RhcnQgIiArIGFyZ3MyKTsKICBwcm9jZXNzLmV4aXQoMSk7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2ZzdGFydC50cwp2YXIgYXJncyA9IHBhcnNlRlN0YXJ0QXJncygpOwooYXN5bmMgKCkgPT4gewogIGF3YWl0IGluaXROb2RlRmVkZXJhdGlvbih7CiAgICAuLi5hcmdzLnJlbW90ZXNPck1hbmlmZXN0VXJsID8geyByZW1vdGVzT3JNYW5pZmVzdFVybDogYXJncy5yZW1vdGVzT3JNYW5pZmVzdFVybCB9IDoge30sCiAgICByZWxCdW5kbGVQYXRoOiBhcmdzLnJlbEJ1bmRsZVBhdGgKICB9KTsKICBhd2FpdCBpbXBvcnQoYXJncy5lbnRyeSk7Cn0pKCk7Cg==";
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fstart = void 0;
4
- exports.fstart = "Ly8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvbm9kZS9pbml0LW5vZGUtZmVkZXJhdGlvbi50cwppbXBvcnQgeyByZWdpc3RlciB9IGZyb20gIm5vZGU6bW9kdWxlIjsKaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gIm5vZGU6dXJsIjsKaW1wb3J0ICogYXMgZnMyIGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgKiBhcyBwYXRoMiBmcm9tICJub2RlOnBhdGgiOwoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvaW1wb3J0LW1hcC50cwpmdW5jdGlvbiBtZXJnZUltcG9ydE1hcHMobWFwMSwgbWFwMikgewogIHJldHVybiB7CiAgICBpbXBvcnRzOiB7IC4uLm1hcDEuaW1wb3J0cywgLi4ubWFwMi5pbXBvcnRzIH0sCiAgICBzY29wZXM6IHsgLi4ubWFwMS5zY29wZXMsIC4uLm1hcDIuc2NvcGVzIH0KICB9Owp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9nbG9iYWwtY2FjaGUudHMKdmFyIG5mTmFtZXNwYWNlID0gIl9fTkFUSVZFX0ZFREVSQVRJT05fXyI7CnZhciBnbG9iYWwyID0gZ2xvYmFsVGhpczsKZ2xvYmFsMltuZk5hbWVzcGFjZV0gPz89IHsKICBleHRlcm5hbHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksCiAgcmVtb3RlTmFtZXNUb1JlbW90ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwKICBiYXNlVXJsVG9SZW1vdGVOYW1lczogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKQp9Owp2YXIgZ2xvYmFsQ2FjaGUgPSBnbG9iYWwyW25mTmFtZXNwYWNlXTsKCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL21vZGVsL2V4dGVybmFscy50cwp2YXIgZXh0ZXJuYWxzID0gZ2xvYmFsQ2FjaGUuZXh0ZXJuYWxzOwpmdW5jdGlvbiBnZXRFeHRlcm5hbEtleShzaGFyZWQpIHsKICByZXR1cm4gYCR7c2hhcmVkLnBhY2thZ2VOYW1lfUAke3NoYXJlZC52ZXJzaW9ufWA7Cn0KZnVuY3Rpb24gZ2V0RXh0ZXJuYWxVcmwoc2hhcmVkKSB7CiAgY29uc3QgcGFja2FnZUtleSA9IGdldEV4dGVybmFsS2V5KHNoYXJlZCk7CiAgcmV0dXJuIGV4dGVybmFscy5nZXQocGFja2FnZUtleSk7Cn0KZnVuY3Rpb24gc2V0RXh0ZXJuYWxVcmwoc2hhcmVkLCB1cmwyKSB7CiAgY29uc3QgcGFja2FnZUtleSA9IGdldEV4dGVybmFsS2V5KHNoYXJlZCk7CiAgZXh0ZXJuYWxzLnNldChwYWNrYWdlS2V5LCB1cmwyKTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvdXRpbHMvcGF0aC11dGlscy50cwpmdW5jdGlvbiBnZXREaXJlY3RvcnkodXJsMikgewogIGNvbnN0IHBhcnRzID0gdXJsMi5zcGxpdCgiLyIpOwogIHBhcnRzLnBvcCgpOwogIHJldHVybiBwYXJ0cy5qb2luKCIvIik7Cn0KZnVuY3Rpb24gam9pblBhdGhzKHBhdGgxLCBwYXRoMjIpIHsKICB3aGlsZSAocGF0aDEuZW5kc1dpdGgoIi8iKSkgewogICAgcGF0aDEgPSBwYXRoMS5zdWJzdHJpbmcoMCwgcGF0aDEubGVuZ3RoIC0gMSk7CiAgfQogIGlmIChwYXRoMjIuc3RhcnRzV2l0aCgiLi8iKSkgewogICAgcGF0aDIyID0gcGF0aDIyLnN1YnN0cmluZygyLCBwYXRoMjIubGVuZ3RoKTsKICB9CiAgcmV0dXJuIGAke3BhdGgxfS8ke3BhdGgyMn1gOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9yZW1vdGVzLnRzCnZhciByZW1vdGVOYW1lc1RvUmVtb3RlID0gZ2xvYmFsQ2FjaGUucmVtb3RlTmFtZXNUb1JlbW90ZTsKdmFyIGJhc2VVcmxUb1JlbW90ZU5hbWVzID0gZ2xvYmFsQ2FjaGUuYmFzZVVybFRvUmVtb3RlTmFtZXM7CmZ1bmN0aW9uIGFkZFJlbW90ZShyZW1vdGVOYW1lLCByZW1vdGUpIHsKICByZW1vdGVOYW1lc1RvUmVtb3RlLnNldChyZW1vdGVOYW1lLCByZW1vdGUpOwogIGJhc2VVcmxUb1JlbW90ZU5hbWVzLnNldChyZW1vdGUuYmFzZVVybCwgcmVtb3RlTmFtZSk7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL2luaXQtZmVkZXJhdGlvbi50cwphc3luYyBmdW5jdGlvbiBwcm9jZXNzUmVtb3RlSW5mb3MocmVtb3Rlcywgb3B0aW9ucyA9IHsgdGhyb3dJZlJlbW90ZU5vdEZvdW5kOiBmYWxzZSB9KSB7CiAgY29uc3QgcHJvY2Vzc1JlbW90ZUluZm9Qcm9taXNlcyA9IE9iamVjdC5rZXlzKHJlbW90ZXMpLm1hcCgKICAgIGFzeW5jIChyZW1vdGVOYW1lKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgbGV0IHVybDIgPSByZW1vdGVzW3JlbW90ZU5hbWVdOwogICAgICAgIGlmIChvcHRpb25zLmNhY2hlVGFnKSB7CiAgICAgICAgICBjb25zdCBhZGRBcHBlbmQgPSByZW1vdGVzW3JlbW90ZU5hbWVdLmluY2x1ZGVzKCI/IikgPyAiJiIgOiAiPyI7CiAgICAgICAgICB1cmwyICs9IGAke2FkZEFwcGVuZH10PSR7b3B0aW9ucy5jYWNoZVRhZ31gOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXdhaXQgcHJvY2Vzc1JlbW90ZUluZm8odXJsMiwgcmVtb3RlTmFtZSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBjb25zdCBlcnJvciA9IGBFcnJvciBsb2FkaW5nIHJlbW90ZSBlbnRyeSBmb3IgJHtyZW1vdGVOYW1lfSBmcm9tIGZpbGUgJHtyZW1vdGVzW3JlbW90ZU5hbWVdfWA7CiAgICAgICAgaWYgKG9wdGlvbnMudGhyb3dJZlJlbW90ZU5vdEZvdW5kKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpOwogICAgICAgIH0KICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICk7CiAgY29uc3QgcmVtb3RlSW1wb3J0TWFwcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb2Nlc3NSZW1vdGVJbmZvUHJvbWlzZXMpOwogIGNvbnN0IGltcG9ydE1hcCA9IHJlbW90ZUltcG9ydE1hcHMucmVkdWNlKAogICAgKGFjYywgcmVtb3RlSW1wb3J0TWFwKSA9PiByZW1vdGVJbXBvcnRNYXAgPyBtZXJnZUltcG9ydE1hcHMoYWNjLCByZW1vdGVJbXBvcnRNYXApIDogYWNjLAogICAgeyBpbXBvcnRzOiB7fSwgc2NvcGVzOiB7fSB9CiAgKTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbmZvKGZlZGVyYXRpb25JbmZvVXJsLCByZW1vdGVOYW1lKSB7CiAgY29uc3QgYmFzZVVybCA9IGdldERpcmVjdG9yeShmZWRlcmF0aW9uSW5mb1VybCk7CiAgY29uc3QgcmVtb3RlSW5mbyA9IGF3YWl0IGxvYWRGZWRlcmF0aW9uSW5mbyhmZWRlcmF0aW9uSW5mb1VybCk7CiAgaWYgKCFyZW1vdGVOYW1lKSB7CiAgICByZW1vdGVOYW1lID0gcmVtb3RlSW5mby5uYW1lOwogIH0KICBjb25zdCBpbXBvcnRNYXAgPSBjcmVhdGVSZW1vdGVJbXBvcnRNYXAocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCk7CiAgYWRkUmVtb3RlKHJlbW90ZU5hbWUsIHsgLi4ucmVtb3RlSW5mbywgYmFzZVVybCB9KTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUltcG9ydE1hcChyZW1vdGVJbmZvLCByZW1vdGVOYW1lLCBiYXNlVXJsKSB7CiAgY29uc3QgaW1wb3J0cyA9IHByb2Nlc3NFeHBvc2VkKHJlbW90ZUluZm8sIHJlbW90ZU5hbWUsIGJhc2VVcmwpOwogIGNvbnN0IHNjb3BlcyA9IHByb2Nlc3NSZW1vdGVJbXBvcnRzKHJlbW90ZUluZm8sIGJhc2VVcmwpOwogIHJldHVybiB7IGltcG9ydHMsIHNjb3BlcyB9Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGZWRlcmF0aW9uSW5mbyh1cmwyKSB7CiAgY29uc3QgaW5mbyA9IGF3YWl0IGZldGNoKHVybDIpLnRoZW4oKHIpID0+IHIuanNvbigpKTsKICByZXR1cm4gaW5mbzsKfQpmdW5jdGlvbiBwcm9jZXNzUmVtb3RlSW1wb3J0cyhyZW1vdGVJbmZvLCBiYXNlVXJsKSB7CiAgY29uc3Qgc2NvcGVzID0ge307CiAgY29uc3Qgc2NvcGVkSW1wb3J0cyA9IHt9OwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIHJlbW90ZUluZm8uc2hhcmVkKSB7CiAgICBjb25zdCBvdXRGaWxlTmFtZSA9IGdldEV4dGVybmFsVXJsKHNoYXJlZCkgPz8gam9pblBhdGhzKGJhc2VVcmwsIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgICBzZXRFeHRlcm5hbFVybChzaGFyZWQsIG91dEZpbGVOYW1lKTsKICAgIHNjb3BlZEltcG9ydHNbc2hhcmVkLnBhY2thZ2VOYW1lXSA9IG91dEZpbGVOYW1lOwogIH0KICBzY29wZXNbYmFzZVVybCArICIvIl0gPSBzY29wZWRJbXBvcnRzOwogIHJldHVybiBzY29wZXM7Cn0KZnVuY3Rpb24gcHJvY2Vzc0V4cG9zZWQocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCkgewogIGNvbnN0IGltcG9ydHMgPSB7fTsKICBmb3IgKGNvbnN0IGV4cG9zZWQgb2YgcmVtb3RlSW5mby5leHBvc2VzKSB7CiAgICBjb25zdCBrZXkgPSBqb2luUGF0aHMocmVtb3RlTmFtZSwgZXhwb3NlZC5rZXkpOwogICAgY29uc3QgdmFsdWUgPSBqb2luUGF0aHMoYmFzZVVybCwgZXhwb3NlZC5vdXRGaWxlTmFtZSk7CiAgICBpbXBvcnRzW2tleV0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIGltcG9ydHM7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0hvc3RJbmZvKGhvc3RJbmZvLCByZWxCdW5kbGVzUGF0aCA9ICIuLyIpIHsKICBjb25zdCBpbXBvcnRzID0gaG9zdEluZm8uc2hhcmVkLnJlZHVjZSgKICAgIChhY2MsIGN1cikgPT4gKHsKICAgICAgLi4uYWNjLAogICAgICBbY3VyLnBhY2thZ2VOYW1lXTogcmVsQnVuZGxlc1BhdGggKyBjdXIub3V0RmlsZU5hbWUKICAgIH0pLAogICAge30KICApOwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIGhvc3RJbmZvLnNoYXJlZCkgewogICAgc2V0RXh0ZXJuYWxVcmwoc2hhcmVkLCByZWxCdW5kbGVzUGF0aCArIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgfQogIHJldHVybiB7IGltcG9ydHMsIHNjb3Blczoge30gfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvdXRpbHMvaW1wb3J0LW1hcC1sb2FkZXIuanMKaW1wb3J0IHBhdGggZnJvbSAicGF0aCI7CmltcG9ydCB1cmwgZnJvbSAidXJsIjsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICJmcyI7CnZhciBJTVBPUlRfTUFQX0ZJTEVfTkFNRSA9ICJub2RlLmltcG9ydG1hcCI7CnZhciBiYXNlVVJMID0gdXJsLnBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSkgKyBwYXRoLnNlcDsKZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CiAgbGV0IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0ge307CiAgaWYgKHBhcnNlZC5oYXNPd25Qcm9wZXJ0eSgiaW1wb3J0cyIpKSB7CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLmltcG9ydHMpKSB7CiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSAiaW1wb3J0cyIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3RgKTsKICAgIH0KICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcGFyc2VkLmltcG9ydHMsCiAgICAgIGJhc2VVUkwKICAgICk7CiAgfQogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0ge307CiAgaWYgKHBhcnNlZC5oYXNPd25Qcm9wZXJ0eSgic2NvcGVzIikpIHsKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuc2NvcGVzKSkgewogICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBpbXBvcnQgbWFwIC0gInNjb3BlcyIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3RgKTsKICAgIH0KICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSBzb3J0QW5kTm9ybWFsaXplU2NvcGVzKHBhcnNlZC5zY29wZXMsIGJhc2VVUkwpOwogIH0KICBjb25zdCBpbnZhbGlkS2V5cyA9IE9iamVjdC5rZXlzKHBhcnNlZCkuZmlsdGVyKAogICAgKGtleSkgPT4ga2V5ICE9PSAiaW1wb3J0cyIgJiYga2V5ICE9PSAic2NvcGVzIgogICk7CiAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCA+IDApIHsKICAgIGNvbnNvbGUud2FybigKICAgICAgYEludmFsaWQgdG9wLWxldmVsIGtleSR7aW52YWxpZEtleXMubGVuZ3RoID4gMCA/ICJzIiA6ICIifSBpbiBpbXBvcnQgbWFwIC0gJHtpbnZhbGlkS2V5cy5qb2luKCIsICIpfWAKICAgICk7CiAgfQogIHJldHVybiB7CiAgICBpbXBvcnRzOiBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cywKICAgIHNjb3Blczogc29ydGVkQW5kTm9ybWFsaXplZFNjb3BlcwogIH07Cn0KZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcChtYXAsIGJhc2VVUkwyKSB7CiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9OwogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBtYXApIHsKICAgIGNvbnN0IHZhbHVlID0gbWFwW3NwZWNpZmllcktleV07CiAgICBjb25zdCBub3JtYWxpemVkU3BlY2lmaWVyS2V5ID0gbm9ybWFsaXplU3BlY2lmaWVyS2V5KHNwZWNpZmllcktleSwgYmFzZVVSTDIpOwogICAgaWYgKG5vcm1hbGl6ZWRTcGVjaWZpZXJLZXkgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBsZXQgYWRkcmVzc1VSTCA9IHBhcnNlVVJMTGlrZVNwZWNpZmllcih2YWx1ZSwgYmFzZVVSTDIpOwogICAgaWYgKGFkZHJlc3NVUkwgPT09IG51bGwpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9J2AKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHNwZWNpZmllcktleS5lbmRzV2l0aCgiLyIpICYmICFhZGRyZXNzVVJMLmVuZHNXaXRoKCIvIikpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9JyAtIHNpbmNlIHRoZSBzcGVjaWZpZXIgZW5kcyBpbiBzbGFzaCwgc28gbXVzdCB0aGUgYWRkcmVzc2AKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IGFkZHJlc3NVUkw7CiAgfQogIHJldHVybiBub3JtYWxpemVkOwp9CmZ1bmN0aW9uIG5vcm1hbGl6ZVNwZWNpZmllcktleShrZXkpIHsKICBpZiAoa2V5ID09PSAiIikgewogICAgY29uc29sZS53YXJuKGBTcGVjaWZpZXIga2V5cyBpbiBpbXBvcnQgbWFwcyBtYXkgbm90IGJlIHRoZSBlbXB0eSBzdHJpbmdgKTsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKGtleSwgYmFzZVVSTCkgfHwga2V5Owp9CmZ1bmN0aW9uIHBhcnNlVVJMTGlrZVNwZWNpZmllcihzcGVjaWZpZXIsIGJhc2VVUkwyKSB7CiAgY29uc3QgdXNlQmFzZVVybEFzUGFyZW50ID0gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoIi8iKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgiLi8iKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgiLi4vIik7CiAgdHJ5IHsKICAgIHJldHVybiBuZXcgVVJMKHNwZWNpZmllciwgdXNlQmFzZVVybEFzUGFyZW50ID8gYmFzZVVSTDIgOiB2b2lkIDApLmhyZWY7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNjb3BlcyhtYXAsIGJhc2VVUkwyKSB7CiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTsKICBmb3IgKGxldCBzY29wZVByZWZpeCBpbiBtYXApIHsKICAgIGNvbnN0IHBvdGVudGlhbFNwZWNpZmllck1hcCA9IG1hcFtzY29wZVByZWZpeF07CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocG90ZW50aWFsU3BlY2lmaWVyTWFwKSkgewogICAgICB0aHJvdyBUeXBlRXJyb3IoCiAgICAgICAgYFRoZSB2YWx1ZSBvZiBzY29wZSAke3Njb3BlUHJlZml4fSBtdXN0IGJlIGEgSlNPTiBvYmplY3RgCiAgICAgICk7CiAgICB9CiAgICBsZXQgc2NvcGVQcmVmaXhVUkw7CiAgICB0cnkgewogICAgICBzY29wZVByZWZpeFVSTCA9IG5ldyBVUkwoc2NvcGVQcmVmaXgsIGJhc2VVUkwyKS5ocmVmOwogICAgfSBjYXRjaCB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgU2NvcGUgcHJlZml4IFVSTCAnJHtzY29wZVByZWZpeH0nIHdhcyBub3QgcGFyc2VhYmxlIGluIGltcG9ydCBtYXBgCiAgICAgICk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbm9ybWFsaXplZFtzY29wZVByZWZpeFVSTF0gPSBzb3J0QW5kTm9ybWFsaXplU3BlY2lmaWVyTWFwKAogICAgICBwb3RlbnRpYWxTcGVjaWZpZXJNYXAsCiAgICAgIGJhc2VVUkwyCiAgICApOwogIH0KICByZXR1cm4gbm9ybWFsaXplZDsKfQpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikgewogIHJldHVybiBvYmogPT09IE9iamVjdChvYmopICYmICFBcnJheS5pc0FycmF5KG9iaik7Cn0KdmFyIGltcG9ydE1hcFByb21pc2UgPSBnZXRJbXBvcnRNYXBQcm9taXNlKCk7CmFzeW5jIGZ1bmN0aW9uIGdldEltcG9ydE1hcFByb21pc2UoKSB7CiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcHJvY2Vzcy5lbnYuSU1QT1JUX01BUF9QQVRIIHx8IElNUE9SVF9NQVBfRklMRV9OQU1FOwogIGNvbnN0IGltcG9ydE1hcFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVsYXRpdmVQYXRoKTsKICBsZXQgc3RyOwogIHRyeSB7CiAgICBzdHIgPSBhd2FpdCBmcy5yZWFkRmlsZShpbXBvcnRNYXBQYXRoKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBlbXB0eU1hcCgpOwogIH0KICBsZXQganNvbjsKICB0cnkgewogICAganNvbiA9IGF3YWl0IEpTT04ucGFyc2Uoc3RyKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHRocm93IEVycm9yKAogICAgICBgSW1wb3J0IG1hcCBhdCAke2ltcG9ydE1hcFBhdGh9IGNvbnRhaW5zIGludmFsaWQganNvbjogJHtlcnIubWVzc2FnZX1gCiAgICApOwogIH0KICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAoanNvbik7Cn0KZ2xvYmFsLm5vZGVMb2FkZXIgPSBnbG9iYWwubm9kZUxvYWRlciB8fCB7fTsKZ2xvYmFsLm5vZGVMb2FkZXIuc2V0SW1wb3J0TWFwUHJvbWlzZSA9IGZ1bmN0aW9uIHNldEltcG9ydE1hcFByb21pc2UocHJvbWlzZSkgewogIGltcG9ydE1hcFByb21pc2UgPSBwcm9taXNlLnRoZW4oKG1hcCkgPT4gewogICAgcmV0dXJuIHJlc29sdmVBbmRDb21wb3NlSW1wb3J0TWFwKG1hcCk7CiAgfSk7Cn07CmZ1bmN0aW9uIGVtcHR5TWFwKCkgewogIHJldHVybiB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH07Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2xvYWRlci1hcy1kYXRhLXVybC5qcwp2YXIgcmVzb2x2ZXIgPSAiYVcxd2IzSjBJSEJoZEdnZ1puSnZiU0FuY0dGMGFDYzdDbWx0Y0c5eWRDQjFjbXdnWm5KdmJTQW5kWEpzSnpzS2FXMXdiM0owSUhzZ2NISnZiV2x6WlhNZ1lYTWdabk1nZlNCbWNtOXRJQ2RtY3ljN0NncGxlSEJ2Y25RZ1kyOXVjM1FnU1UxUVQxSlVYMDFCVUY5R1NVeEZYMDVCVFVVZ1BTQW5ibTlrWlM1cGJYQnZjblJ0WVhBbk93b0tZMjl1YzNRZ1ltRnpaVlZTVENBOUlIVnliQzV3WVhSb1ZHOUdhV3hsVlZKTUtIQnliMk5sYzNNdVkzZGtLQ2twSUNzZ2NHRjBhQzV6WlhBN0Nnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU51WlhjdGNtVnpiMngyWlMxaGJHZHZjbWwwYUcwS1pYaHdiM0owSUdaMWJtTjBhVzl1SUhKbGMyOXNkbVZUY0dWamFXWnBaWElvYVcxd2IzSjBUV0Z3TENCemNHVmphV1pwWlhJc0lIQmhjbVZ1ZEZWU1RDa2dld29nSUd4bGRDQmpkWEp5Wlc1MFFtRnpaVlZTVERzS0lDQnBaaUFvY0dGeVpXNTBWVkpNS1NCN0NpQWdJQ0JqYjI1emRDQnNZWE4wVTJ4aGMyaEpibVJsZUNBOUlIQmhjbVZ1ZEZWU1RDNXNZWE4wU1c1a1pYaFBaaWh3WVhSb0xuTmxjQ2s3Q2lBZ0lDQmpkWEp5Wlc1MFFtRnpaVlZTVENBOUlIQmhjbVZ1ZEZWU1RDNXpiR2xqWlNnd0xDQnNZWE4wVTJ4aGMyaEpibVJsZUNBcklERXBPd29nSUgwZ1pXeHpaU0I3Q2lBZ0lDQmpkWEp5Wlc1MFFtRnpaVlZTVENBOUlHSmhjMlZWVWt3N0NpQWdmUW9nSUdOdmJuTjBJRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWElnUFFvZ0lDQWdjR0Z5YzJWVlVreE1hV3RsVTNCbFkybG1hV1Z5S0hOd1pXTnBabWxsY2l3Z1kzVnljbVZ1ZEVKaGMyVlZVa3dwSUh4OElITndaV05wWm1sbGNqc0tJQ0JtYjNJZ0tHeGxkQ0J6WTI5d1pWQnlaV1pwZUNCcGJpQnBiWEJ2Y25STllYQXVjMk52Y0dWektTQjdDaUFnSUNCcFppQW9DaUFnSUNBZ0lITmpiM0JsVUhKbFptbDRJRDA5UFNCamRYSnlaVzUwUW1GelpWVlNUQ0I4ZkFvZ0lDQWdJQ0FvYzJOdmNHVlFjbVZtYVhndVpXNWtjMWRwZEdnb0p5OG5LU0FtSmlCamRYSnlaVzUwUW1GelpWVlNUQzV6ZEdGeWRITlhhWFJvS0hOamIzQmxVSEpsWm1sNEtTa0tJQ0FnSUNrZ2V3b2dJQ0FnSUNCamIyNXpkQ0J6WTI5d1pVbHRjRzl5ZEhOTllYUmphQ0E5SUhKbGMyOXNkbVZKYlhCdmNuUnpUV0YwWTJnb0NpQWdJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpd0tJQ0FnSUNBZ0lDQnBiWEJ2Y25STllYQXVjMk52Y0dWelczTmpiM0JsVUhKbFptbDRYUW9nSUNBZ0lDQXBPd29nSUNBZ0lDQnBaaUFvYzJOdmNHVkpiWEJ2Y25SelRXRjBZMmdwSUhzS0lDQWdJQ0FnSUNCeVpYUjFjbTRnYzJOdmNHVkpiWEJ2Y25SelRXRjBZMmc3Q2lBZ0lDQWdJSDBLSUNBZ0lIMGdaV3h6WlNCN0NpQWdJQ0FnSUdOdmJuTjBJSFJ2Y0V4bGRtVnNTVzF3YjNKMGMwMWhkR05vSUQwZ2NtVnpiMngyWlVsdGNHOXlkSE5OWVhSamFDZ0tJQ0FnSUNBZ0lDQnViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlMQW9nSUNBZ0lDQWdJR2x0Y0c5eWRFMWhjQzVwYlhCdmNuUnpDaUFnSUNBZ0lDazdDaUFnSUNBZ0lHbG1JQ2gwYjNCTVpYWmxiRWx0Y0c5eWRITk5ZWFJqYUNrZ2V3b2dJQ0FnSUNBZ0lISmxkSFZ5YmlCMGIzQk1aWFpsYkVsdGNHOXlkSE5OWVhSamFEc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lIMEtDaUFnY21WMGRYSnVJSEpsYzI5c2RtVkpiWEJ2Y25SelRXRjBZMmdvYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2l3Z2FXMXdiM0owVFdGd0xtbHRjRzl5ZEhNcE93cDlDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOeVpYTnZiSFpsTFdGdUxXbHRjRzl5ZEhNdGJXRjBZMmdLWm5WdVkzUnBiMjRnY21WemIyeDJaVWx0Y0c5eWRITk5ZWFJqYUNodWIzSnRZV3hwZW1Wa1UzQmxZMmxtYVdWeUxDQnpjR1ZqYVdacFpYSk5ZWEFwSUhzS0lDQm1iM0lnS0d4bGRDQnpjR1ZqYVdacFpYSkxaWGtnYVc0Z2MzQmxZMmxtYVdWeVRXRndLU0I3Q2lBZ0lDQmpiMjV6ZENCeVpYTnZiSFYwYVc5dVVtVnpkV3gwSUQwZ2MzQmxZMmxtYVdWeVRXRndXM053WldOcFptbGxja3RsZVYwN0Nnb2dJQ0FnYVdZZ0tITndaV05wWm1sbGNrdGxlU0E5UFQwZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpa2dld29nSUNBZ0lDQnBaaUFvY21WemIyeDFkR2x2YmxKbGMzVnNkQ0E5UFQwZ2JuVnNiQ2tnZXdvZ0lDQWdJQ0FnSUhSb2NtOTNJRlI1Y0dWRmNuSnZjaWdLSUNBZ0lDQWdJQ0FnSUdCVWFHVWdhVzF3YjNKMElHMWhjQ0J5WlhOdmJIVjBhVzl1SUc5bUlDUjdjM0JsWTJsbWFXVnlTMlY1ZlNCbVlXbHNaV1FnWkhWbElIUnZJR0VnYm5Wc2JDQmxiblJ5ZVdBS0lDQWdJQ0FnSUNBcE93b2dJQ0FnSUNCOUNpQWdJQ0FnSUhKbGRIVnliaUJ5WlhOdmJIVjBhVzl1VW1WemRXeDBPd29nSUNBZ2ZTQmxiSE5sSUdsbUlDZ0tJQ0FnSUNBZ2MzQmxZMmxtYVdWeVMyVjVMbVZ1WkhOWGFYUm9LQ2N2SnlrZ0ppWUtJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpNXpkR0Z5ZEhOWGFYUm9LSE53WldOcFptbGxja3RsZVNrS0lDQWdJQ2tnZXdvZ0lDQWdJQ0JwWmlBb2NtVnpiMngxZEdsdmJsSmxjM1ZzZENBOVBUMGdiblZzYkNrZ2V3b2dJQ0FnSUNBZ0lIUm9jbTkzSUZSNWNHVkZjbkp2Y2lnS0lDQWdJQ0FnSUNBZ0lHQlVhR1VnYVcxd2IzSjBJRzFoY0NCeVpYTnZiSFYwYVc5dUlHOW1JQ1I3YzNCbFkybG1hV1Z5UzJWNWZTQm1ZV2xzWldRZ1pIVmxJSFJ2SUdFZ2JuVnNiQ0JsYm5SeWVXQUtJQ0FnSUNBZ0lDQXBPd29nSUNBZ0lDQjlDaUFnSUNBZ0lHTnZibk4wSUdGbWRHVnlVSEpsWm1sNElEMGdibTl5YldGc2FYcGxaRk53WldOcFptbGxjaTV6YkdsalpTaHpjR1ZqYVdacFpYSkxaWGt1YkdWdVozUm9LVHNLSUNBZ0lDQWdkSEo1SUhzS0lDQWdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lGVlNUQ2hoWm5SbGNsQnlaV1pwZUN3Z2NtVnpiMngxZEdsdmJsSmxjM1ZzZENrdWFISmxaanNLSUNBZ0lDQWdmU0JqWVhSamFDQjdDaUFnSUNBZ0lDQWdkR2h5YjNjZ1ZIbHdaVVZ5Y205eUtBb2dJQ0FnSUNBZ0lDQWdZRlJvWlNCcGJYQnZjblFnYldGd0lISmxjMjlzZFhScGIyNGdiMllnSkh0emNHVmphV1pwWlhKTFpYbDlJR1poYVd4bFpDQmtkV1VnZEc4Z1ZWSk1JSEJoY25ObElHWmhhV3gxY21WZ0NpQWdJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lIMEtDaUFnY21WMGRYSnVJRzUxYkd3N0NuMEtDaTh2SUdoMGRIQnpPaTh2ZDJsalp5NW5hWFJvZFdJdWFXOHZhVzF3YjNKMExXMWhjSE12STNCaGNuTnBibWNLWlhod2IzSjBJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVkJibVJEYjIxd2IzTmxTVzF3YjNKMFRXRndLSEJoY25ObFpDa2dld29nSUM4dklGTjBaWEFnTWdvZ0lHbG1JQ2doYVhOUWJHRnBiazlpYW1WamRDaHdZWEp6WldRcEtTQjdDaUFnSUNCMGFISnZkeUJGY25KdmNpaGdTVzUyWVd4cFpDQnBiWEJ2Y25RZ2JXRndJQzBnZEc5d0lHeGxkbVZzSUcxMWMzUWdZbVVnWVc0Z2IySnFaV04wWUNrN0NpQWdmUW9LSUNBdkx5QlRkR1Z3SURNS0lDQnNaWFFnYzI5eWRHVmtRVzVrVG05eWJXRnNhWHBsWkVsdGNHOXlkSE1nUFNCN2ZUc0tDaUFnTHk4Z1UzUmxjQ0EwQ2lBZ2FXWWdLSEJoY25ObFpDNW9ZWE5QZDI1UWNtOXdaWEowZVNnbmFXMXdiM0owY3ljcEtTQjdDaUFnSUNBdkx5QlRkR1Z3SURRdU1Rb2dJQ0FnYVdZZ0tDRnBjMUJzWVdsdVQySnFaV04wS0hCaGNuTmxaQzVwYlhCdmNuUnpLU2tnZXdvZ0lDQWdJQ0IwYUhKdmR5QkZjbkp2Y2loZ1NXNTJZV3hwWkNCcGJYQnZjblFnYldGd0lDMGdJbWx0Y0c5eWRITWlJSEJ5YjNCbGNuUjVJRzExYzNRZ1ltVWdZVzRnYjJKcVpXTjBZQ2s3Q2lBZ0lDQjlDZ29nSUNBZ0x5OGdVM1JsY0NBMExqSUtJQ0FnSUhOdmNuUmxaRUZ1WkU1dmNtMWhiR2w2WldSSmJYQnZjblJ6SUQwZ2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDZ0tJQ0FnSUNBZ2NHRnljMlZrTG1sdGNHOXlkSE1zQ2lBZ0lDQWdJR0poYzJWVlVrd0tJQ0FnSUNrN0NpQWdmUW9LSUNBdkx5QlRkR1Z3SURVS0lDQnNaWFFnYzI5eWRHVmtRVzVrVG05eWJXRnNhWHBsWkZOamIzQmxjeUE5SUh0OU93b0tJQ0F2THlCVGRHVndJRFlLSUNCcFppQW9jR0Z5YzJWa0xtaGhjMDkzYmxCeWIzQmxjblI1S0NkelkyOXdaWE1uS1NrZ2V3b2dJQ0FnTHk4Z1UzUmxjQ0EyTGpFS0lDQWdJR2xtSUNnaGFYTlFiR0ZwYms5aWFtVmpkQ2h3WVhKelpXUXVjMk52Y0dWektTa2dld29nSUNBZ0lDQjBhSEp2ZHlCRmNuSnZjaWhnU1c1MllXeHBaQ0JwYlhCdmNuUWdiV0Z3SUMwZ0luTmpiM0JsY3lJZ2NISnZjR1Z5ZEhrZ2JYVnpkQ0JpWlNCaGJpQnZZbXBsWTNSZ0tUc0tJQ0FnSUgwS0NpQWdJQ0F2THlCVGRHVndJRFl1TWdvZ0lDQWdjMjl5ZEdWa1FXNWtUbTl5YldGc2FYcGxaRk5qYjNCbGN5QTlJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRZMjl3WlhNb2NHRnljMlZrTG5OamIzQmxjeXdnWW1GelpWVlNUQ2s3Q2lBZ2ZRb0tJQ0F2THlCVGRHVndJRGNLSUNCamIyNXpkQ0JwYm5aaGJHbGtTMlY1Y3lBOUlFOWlhbVZqZEM1clpYbHpLSEJoY25ObFpDa3VabWxzZEdWeUtBb2dJQ0FnS0d0bGVTa2dQVDRnYTJWNUlDRTlQU0FuYVcxd2IzSjBjeWNnSmlZZ2EyVjVJQ0U5UFNBbmMyTnZjR1Z6SndvZ0lDazdDaUFnYVdZZ0tHbHVkbUZzYVdSTFpYbHpMbXhsYm1kMGFDQStJREFwSUhzS0lDQWdJR052Ym5OdmJHVXVkMkZ5YmlnS0lDQWdJQ0FnWUVsdWRtRnNhV1FnZEc5d0xXeGxkbVZzSUd0bGVTUjdDaUFnSUNBZ0lDQWdhVzUyWVd4cFpFdGxlWE11YkdWdVozUm9JRDRnTUNBL0lDZHpKeUE2SUNjbkNpQWdJQ0FnSUgwZ2FXNGdhVzF3YjNKMElHMWhjQ0F0SUNSN2FXNTJZV3hwWkV0bGVYTXVhbTlwYmlnbkxDQW5LWDFnQ2lBZ0lDQXBPd29nSUgwS0NpQWdMeThnVTNSbGNDQTRDaUFnY21WMGRYSnVJSHNLSUNBZ0lHbHRjRzl5ZEhNNklITnZjblJsWkVGdVpFNXZjbTFoYkdsNlpXUkpiWEJ2Y25SekxBb2dJQ0FnYzJOdmNHVnpPaUJ6YjNKMFpXUkJibVJPYjNKdFlXeHBlbVZrVTJOdmNHVnpMQW9nSUgwN0NuMEtDaTh2SUdoMGRIQnpPaTh2ZDJsalp5NW5hWFJvZFdJdWFXOHZhVzF3YjNKMExXMWhjSE12STNOdmNuUXRZVzVrTFc1dmNtMWhiR2w2WlMxaExYTndaV05wWm1sbGNpMXRZWEFLWm5WdVkzUnBiMjRnYzI5eWRFRnVaRTV2Y20xaGJHbDZaVk53WldOcFptbGxjazFoY0NodFlYQXNJR0poYzJWVlVrd3BJSHNLSUNCamIyNXpkQ0J1YjNKdFlXeHBlbVZrSUQwZ2UzMDdDZ29nSUdadmNpQW9iR1YwSUhOd1pXTnBabWxsY2t0bGVTQnBiaUJ0WVhBcElIc0tJQ0FnSUdOdmJuTjBJSFpoYkhWbElEMGdiV0Z3VzNOd1pXTnBabWxsY2t0bGVWMDdDZ29nSUNBZ1kyOXVjM1FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVTQTlJRzV2Y20xaGJHbDZaVk53WldOcFptbGxja3RsZVNoemNHVmphV1pwWlhKTFpYa3NJR0poYzJWVlVrd3BPd29nSUNBZ2FXWWdLRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWEpMWlhrZ1BUMDlJRzUxYkd3cElIc0tJQ0FnSUNBZ1kyOXVkR2x1ZFdVN0NpQWdJQ0I5Q2dvZ0lDQWdiR1YwSUdGa1pISmxjM05WVWt3Z1BTQndZWEp6WlZWU1RFeHBhMlZUY0dWamFXWnBaWElvZG1Gc2RXVXNJR0poYzJWVlVrd3BPd29nSUNBZ2FXWWdLR0ZrWkhKbGMzTlZVa3dnUFQwOUlHNTFiR3dwSUhzS0lDQWdJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNBZ0lHQkpiblpoYkdsa0lGVlNUQ0JoWkdSeVpYTnpJR1p2Y2lCcGJYQnZjblFnYldGd0lITndaV05wWm1sbGNpQW5KSHR6Y0dWamFXWnBaWEpMWlhsOUoyQUtJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGdHViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlTMlY1WFNBOUlHNTFiR3c3Q2lBZ0lDQWdJR052Ym5ScGJuVmxPd29nSUNBZ2ZRb0tJQ0FnSUdsbUlDaHpjR1ZqYVdacFpYSkxaWGt1Wlc1a2MxZHBkR2dvSnk4bktTQW1KaUFoWVdSa2NtVnpjMVZTVEM1bGJtUnpWMmwwYUNnbkx5Y3BLU0I3Q2lBZ0lDQWdJR052Ym5OdmJHVXVkMkZ5YmlnS0lDQWdJQ0FnSUNCZ1NXNTJZV3hwWkNCVlVrd2dZV1JrY21WemN5Qm1iM0lnYVcxd2IzSjBJRzFoY0NCemNHVmphV1pwWlhJZ0p5UjdjM0JsWTJsbWFXVnlTMlY1ZlNjZ0xTQnphVzVqWlNCMGFHVWdjM0JsWTJsbWFXVnlJR1Z1WkhNZ2FXNGdjMnhoYzJnc0lITnZJRzExYzNRZ2RHaGxJR0ZrWkhKbGMzTmdDaUFnSUNBZ0lDazdDaUFnSUNBZ0lHNXZjbTFoYkdsNlpXUmJibTl5YldGc2FYcGxaRk53WldOcFptbGxja3RsZVYwZ1BTQnVkV3hzT3dvZ0lDQWdJQ0JqYjI1MGFXNTFaVHNLSUNBZ0lIMEtDaUFnSUNCdWIzSnRZV3hwZW1Wa1cyNXZjbTFoYkdsNlpXUlRjR1ZqYVdacFpYSkxaWGxkSUQwZ1lXUmtjbVZ6YzFWU1REc0tJQ0I5Q2dvZ0lISmxkSFZ5YmlCdWIzSnRZV3hwZW1Wa093cDlDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOdWIzSnRZV3hwZW1VdFlTMXpjR1ZqYVdacFpYSXRhMlY1Q21aMWJtTjBhVzl1SUc1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2t0bGVTaHJaWGtwSUhzS0lDQnBaaUFvYTJWNUlEMDlQU0FuSnlrZ2V3b2dJQ0FnWTI5dWMyOXNaUzUzWVhKdUtHQlRjR1ZqYVdacFpYSWdhMlY1Y3lCcGJpQnBiWEJ2Y25RZ2JXRndjeUJ0WVhrZ2JtOTBJR0psSUhSb1pTQmxiWEIwZVNCemRISnBibWRnS1RzS0lDQWdJSEpsZEhWeWJpQnVkV3hzT3dvZ0lIMEtDaUFnY21WMGRYSnVJSEJoY25ObFZWSk1UR2xyWlZOd1pXTnBabWxsY2loclpYa3NJR0poYzJWVlVrd3BJSHg4SUd0bGVUc0tmUW9LTHk4Z2FIUjBjSE02THk5M2FXTm5MbWRwZEdoMVlpNXBieTlwYlhCdmNuUXRiV0Z3Y3k4amNHRnljMlV0WVMxMWNtd3RiR2xyWlMxcGJYQnZjblF0YzNCbFkybG1hV1Z5Q21aMWJtTjBhVzl1SUhCaGNuTmxWVkpNVEdsclpWTndaV05wWm1sbGNpaHpjR1ZqYVdacFpYSXNJR0poYzJWVlVrd3BJSHNLSUNCamIyNXpkQ0IxYzJWQ1lYTmxWWEpzUVhOUVlYSmxiblFnUFFvZ0lDQWdjM0JsWTJsbWFXVnlMbk4wWVhKMGMxZHBkR2dvSnk4bktTQjhmQW9nSUNBZ2MzQmxZMmxtYVdWeUxuTjBZWEowYzFkcGRHZ29KeTR2SnlrZ2ZId0tJQ0FnSUhOd1pXTnBabWxsY2k1emRHRnlkSE5YYVhSb0tDY3VMaThuS1RzS0NpQWdkSEo1SUhzS0lDQWdJSEpsZEhWeWJpQnVaWGNnVlZKTUtITndaV05wWm1sbGNpd2dkWE5sUW1GelpWVnliRUZ6VUdGeVpXNTBJRDhnWW1GelpWVlNUQ0E2SUhWdVpHVm1hVzVsWkNrdWFISmxaanNLSUNCOUlHTmhkR05vSUhzS0lDQWdJSEpsZEhWeWJpQnVkV3hzT3dvZ0lIMEtmUW9LTHk4Z2FIUjBjSE02THk5M2FXTm5MbWRwZEdoMVlpNXBieTlwYlhCdmNuUXRiV0Z3Y3k4amMyOXlkQzFoYm1RdGJtOXliV0ZzYVhwbExYTmpiM0JsY3dwbWRXNWpkR2x2YmlCemIzSjBRVzVrVG05eWJXRnNhWHBsVTJOdmNHVnpLRzFoY0N3Z1ltRnpaVlZTVENrZ2V3b2dJR3hsZENCdWIzSnRZV3hwZW1Wa0lEMGdlMzA3Q2dvZ0lHWnZjaUFvYkdWMElITmpiM0JsVUhKbFptbDRJR2x1SUcxaGNDa2dld29nSUNBZ1kyOXVjM1FnY0c5MFpXNTBhV0ZzVTNCbFkybG1hV1Z5VFdGd0lEMGdiV0Z3VzNOamIzQmxVSEpsWm1sNFhUc0tJQ0FnSUdsbUlDZ2hhWE5RYkdGcGJrOWlhbVZqZENod2IzUmxiblJwWVd4VGNHVmphV1pwWlhKTllYQXBLU0I3Q2lBZ0lDQWdJSFJvY205M0lGUjVjR1ZGY25KdmNpZ0tJQ0FnSUNBZ0lDQmdWR2hsSUhaaGJIVmxJRzltSUhOamIzQmxJQ1I3YzJOdmNHVlFjbVZtYVhoOUlHMTFjM1FnWW1VZ1lTQktVMDlPSUc5aWFtVmpkR0FLSUNBZ0lDQWdLVHNLSUNBZ0lIMEtDaUFnSUNCc1pYUWdjMk52Y0dWUWNtVm1hWGhWVWt3N0NpQWdJQ0IwY25rZ2V3b2dJQ0FnSUNCelkyOXdaVkJ5WldacGVGVlNUQ0E5SUc1bGR5QlZVa3dvYzJOdmNHVlFjbVZtYVhnc0lHSmhjMlZWVWt3cExtaHlaV1k3Q2lBZ0lDQjlJR05oZEdOb0lIc0tJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLQW9nSUNBZ0lDQWdJR0JUWTI5d1pTQndjbVZtYVhnZ1ZWSk1JQ2NrZTNOamIzQmxVSEpsWm1sNGZTY2dkMkZ6SUc1dmRDQndZWEp6WldGaWJHVWdhVzRnYVcxd2IzSjBJRzFoY0dBS0lDQWdJQ0FnS1RzS0lDQWdJQ0FnWTI5dWRHbHVkV1U3Q2lBZ0lDQjlDZ29nSUNBZ2JtOXliV0ZzYVhwbFpGdHpZMjl3WlZCeVpXWnBlRlZTVEYwZ1BTQnpiM0owUVc1a1RtOXliV0ZzYVhwbFUzQmxZMmxtYVdWeVRXRndLQW9nSUNBZ0lDQndiM1JsYm5ScFlXeFRjR1ZqYVdacFpYSk5ZWEFzQ2lBZ0lDQWdJR0poYzJWVlVrd0tJQ0FnSUNrN0NpQWdmUW9LSUNCeVpYUjFjbTRnYm05eWJXRnNhWHBsWkRzS2ZRb0tablZ1WTNScGIyNGdhWE5RYkdGcGJrOWlhbVZqZENodlltb3BJSHNLSUNCeVpYUjFjbTRnYjJKcUlEMDlQU0JQWW1wbFkzUW9iMkpxS1NBbUppQWhRWEp5WVhrdWFYTkJjbkpoZVNodlltb3BPd3A5Q2dvdkx5QXRMUzBLQ214bGRDQnBiWEJ2Y25STllYQlFjbTl0YVhObElEMGdaMlYwU1cxd2IzSjBUV0Z3VUhKdmJXbHpaU2dwT3dvS1pYaHdiM0owSUdGemVXNWpJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVW9jM0JsWTJsbWFXVnlMQ0JqYjI1MFpYaDBMQ0JrWldaaGRXeDBVbVZ6YjJ4MlpTa2dld29nSUdOdmJuTjBJSHNnY0dGeVpXNTBWVkpNSUQwZ2JuVnNiQ0I5SUQwZ1kyOXVkR1Y0ZERzS0lDQmpiMjV6ZENCcGJYQnZjblJOWVhBZ1BTQmhkMkZwZENCcGJYQnZjblJOWVhCUWNtOXRhWE5sT3dvZ0lHTnZibk4wSUdsdGNHOXlkRTFoY0ZWeWJDQTlJSEpsYzI5c2RtVlRjR1ZqYVdacFpYSW9hVzF3YjNKMFRXRndMQ0J6Y0dWamFXWnBaWElzSUhCaGNtVnVkRlZTVENrN0Nnb2dJSEpsZEhWeWJpQmtaV1poZFd4MFVtVnpiMngyWlNocGJYQnZjblJOWVhCVmNtd2dQejhnYzNCbFkybG1hV1Z5TENCamIyNTBaWGgwTENCa1pXWmhkV3gwVW1WemIyeDJaU2s3Q24wS0NtVjRjRzl5ZENCaGMzbHVZeUJtZFc1amRHbHZiaUJzYjJGa0tIVnliQ3dnWTI5dWRHVjRkQ3dnWkdWbVlYVnNkRXh2WVdRcElIc0tJQ0JwWmlBb2RYSnNMbk4wWVhKMGMxZHBkR2dvSjJoMGRIQTZMeThuS1NCOGZDQjFjbXd1YzNSaGNuUnpWMmwwYUNnbmFIUjBjSE02THk4bktTa2dld29nSUNBZ1kyOXVjM1FnY21WeklEMGdZWGRoYVhRZ1ptVjBZMmdvZFhKc0tUc0tJQ0FnSUdsbUlDZ2hjbVZ6TG05cktTQjdDaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2loZ1JtRnBiR1ZrSUhSdklHWmxkR05vSUcxdlpIVnNaU0JtY205dElDUjdkWEpzZldBcE93b2dJQ0FnZlFvZ0lDQWdZMjl1YzNRZ2MyOTFjbU5sSUQwZ1lYZGhhWFFnY21WekxuUmxlSFFvS1RzS0lDQWdJSEpsZEhWeWJpQjdDaUFnSUNBZ0lITm9iM0owUTJseVkzVnBkRG9nZEhKMVpTd0tJQ0FnSUNBZ1ptOXliV0YwT2lBbmJXOWtkV3hsSnl3Z0NpQWdJQ0FnSUhOdmRYSmpaU3dLSUNBZ0lIMDdDaUFnZlFvS0lDQnBaaUFvSVhWeWJDNXpkR0Z5ZEhOWGFYUm9LQ2R1YjJSbE9pY3BLU0I3Q2lBZ0lDQmpiMjUwWlhoMExtWnZjbTFoZENBOUlDZHRiMlIxYkdVbk93b2dJSDBLSUNBS0lDQnlaWFIxY200Z1pHVm1ZWFZzZEV4dllXUW9kWEpzTENCamIyNTBaWGgwTENCa1pXWmhkV3gwVEc5aFpDazdDbjBLQ21GemVXNWpJR1oxYm1OMGFXOXVJR2RsZEVsdGNHOXlkRTFoY0ZCeWIyMXBjMlVvS1NCN0NpQWdZMjl1YzNRZ2NtVnNZWFJwZG1WUVlYUm9JRDBnY0hKdlkyVnpjeTVsYm5ZdVNVMVFUMUpVWDAxQlVGOVFRVlJJSUh4OElFbE5VRTlTVkY5TlFWQmZSa2xNUlY5T1FVMUZPd29nSUdOdmJuTjBJR2x0Y0c5eWRFMWhjRkJoZEdnZ1BTQndZWFJvTG5KbGMyOXNkbVVvY0hKdlkyVnpjeTVqZDJRb0tTd2djbVZzWVhScGRtVlFZWFJvS1RzS0NpQWdiR1YwSUhOMGNqc0tJQ0IwY25rZ2V3b2dJQ0FnYzNSeUlEMGdZWGRoYVhRZ1puTXVjbVZoWkVacGJHVW9hVzF3YjNKMFRXRndVR0YwYUNrN0NpQWdmU0JqWVhSamFDQW9aWEp5S1NCN0NpQWdJQ0J5WlhSMWNtNGdaVzF3ZEhsTllYQW9LVHNLSUNCOUNnb2dJR3hsZENCcWMyOXVPd29nSUhSeWVTQjdDaUFnSUNCcWMyOXVJRDBnWVhkaGFYUWdTbE5QVGk1d1lYSnpaU2h6ZEhJcE93b2dJSDBnWTJGMFkyZ2dLR1Z5Y2lrZ2V3b2dJQ0FnZEdoeWIzY2dSWEp5YjNJb0NpQWdJQ0FnSUdCSmJYQnZjblFnYldGd0lHRjBJQ1I3YVcxd2IzSjBUV0Z3VUdGMGFIMGdZMjl1ZEdGcGJuTWdhVzUyWVd4cFpDQnFjMjl1T2lBa2UyVnljaTV0WlhOellXZGxmV0FLSUNBZ0lDazdDaUFnZlFvS0lDQnlaWFIxY200Z2NtVnpiMngyWlVGdVpFTnZiWEJ2YzJWSmJYQnZjblJOWVhBb2FuTnZiaWs3Q24wS0NtZHNiMkpoYkM1dWIyUmxURzloWkdWeUlEMGdaMnh2WW1Gc0xtNXZaR1ZNYjJGa1pYSWdmSHdnZTMwN0NncG5iRzlpWVd3dWJtOWtaVXh2WVdSbGNpNXpaWFJKYlhCdmNuUk5ZWEJRY205dGFYTmxJRDBnWm5WdVkzUnBiMjRnYzJWMFNXMXdiM0owVFdGd1VISnZiV2x6WlNod2NtOXRhWE5sS1NCN0NpQWdhVzF3YjNKMFRXRndVSEp2YldselpTQTlJSEJ5YjIxcGMyVXVkR2hsYmlnb2JXRndLU0E5UGlCN0NpQWdJQ0J5WlhSMWNtNGdjbVZ6YjJ4MlpVRnVaRU52YlhCdmMyVkpiWEJ2Y25STllYQW9iV0Z3S1RzS0lDQjlLVHNLZlRzS0NtWjFibU4wYVc5dUlHVnRjSFI1VFdGd0tDa2dld29nSUhKbGRIVnliaUI3SUdsdGNHOXlkSE02SUh0OUxDQnpZMjl3WlhNNklIdDlJSDA3Q24wSyI7CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi9ub2RlL2luaXQtbm9kZS1mZWRlcmF0aW9uLnRzCnZhciBkZWZhdWx0T3B0aW9ucyA9IHsKICByZW1vdGVzT3JNYW5pZmVzdFVybDoge30sCiAgcmVsQnVuZGxlUGF0aDogIi4uL2Jyb3dzZXIiLAogIHRocm93SWZSZW1vdGVOb3RGb3VuZDogZmFsc2UKfTsKYXN5bmMgZnVuY3Rpb24gaW5pdE5vZGVGZWRlcmF0aW9uKG9wdGlvbnMpIHsKICBjb25zdCBtZXJnZWRPcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9OwogIGNvbnN0IGltcG9ydE1hcCA9IGF3YWl0IGNyZWF0ZU5vZGVJbXBvcnRNYXAobWVyZ2VkT3B0aW9ucyk7CiAgYXdhaXQgd3JpdGVJbXBvcnRNYXAoaW1wb3J0TWFwKTsKICBhd2FpdCB3cml0ZVJlc29sdmVyKCk7CiAgcmVnaXN0ZXIocGF0aFRvRmlsZVVSTCgiLi9mZWRlcmF0aW9uLXJlc29sdmVyLm1qcyIpLmhyZWYpOwp9CmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5vZGVJbXBvcnRNYXAob3B0aW9ucykgewogIGNvbnN0IHsgcmVtb3Rlc09yTWFuaWZlc3RVcmwsIHJlbEJ1bmRsZVBhdGggfSA9IG9wdGlvbnM7CiAgY29uc3QgcmVtb3RlcyA9IHR5cGVvZiByZW1vdGVzT3JNYW5pZmVzdFVybCA9PT0gIm9iamVjdCIgPyByZW1vdGVzT3JNYW5pZmVzdFVybCA6IGF3YWl0IGxvYWRGc01hbmlmZXN0KHJlbW90ZXNPck1hbmlmZXN0VXJsKTsKICBjb25zdCBob3N0SW5mbyA9IGF3YWl0IGxvYWRGc0ZlZGVyYXRpb25JbmZvKHJlbEJ1bmRsZVBhdGgpOwogIGNvbnN0IGhvc3RJbXBvcnRNYXAgPSBhd2FpdCBwcm9jZXNzSG9zdEluZm8oaG9zdEluZm8sICIuLyIgKyByZWxCdW5kbGVQYXRoKTsKICBjb25zdCByZW1vdGVzSW1wb3J0TWFwID0gYXdhaXQgcHJvY2Vzc1JlbW90ZUluZm9zKHJlbW90ZXMsIHsKICAgIHRocm93SWZSZW1vdGVOb3RGb3VuZDogb3B0aW9ucy50aHJvd0lmUmVtb3RlTm90Rm91bmQsCiAgICBjYWNoZVRhZzogb3B0aW9ucy5jYWNoZVRhZwogIH0pOwogIGNvbnN0IGltcG9ydE1hcCA9IG1lcmdlSW1wb3J0TWFwcyhob3N0SW1wb3J0TWFwLCByZW1vdGVzSW1wb3J0TWFwKTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGc01hbmlmZXN0KG1hbmlmZXN0VXJsKSB7CiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzMi5yZWFkRmlsZShtYW5pZmVzdFVybCwgInV0Zi04Iik7CiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGNvbnRlbnQpOwogIHJldHVybiBtYW5pZmVzdDsKfQphc3luYyBmdW5jdGlvbiBsb2FkRnNGZWRlcmF0aW9uSW5mbyhyZWxCdW5kbGVQYXRoKSB7CiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aDIuam9pbihyZWxCdW5kbGVQYXRoLCAicmVtb3RlRW50cnkuanNvbiIpOwogIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmczIucmVhZEZpbGUobWFuaWZlc3RQYXRoLCAidXRmLTgiKTsKICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoY29udGVudCk7CiAgcmV0dXJuIG1hbmlmZXN0Owp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlSW1wb3J0TWFwKG1hcCkgewogIGF3YWl0IGZzMi53cml0ZUZpbGUoCiAgICBJTVBPUlRfTUFQX0ZJTEVfTkFNRSwKICAgIEpTT04uc3RyaW5naWZ5KG1hcCwgbnVsbCwgMiksCiAgICAidXRmLTgiCiAgKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZVJlc29sdmVyKCkgewogIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc29sdmVyLCAiYmFzZTY0Iik7CiAgYXdhaXQgZnMyLndyaXRlRmlsZSgiZmVkZXJhdGlvbi1yZXNvbHZlci5tanMiLCBidWZmZXIsICJ1dGYtOCIpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi91dGlscy9mc3RhcnQtYXJncy1wYXJzZXIudHMKaW1wb3J0ICogYXMgZnMzIGZyb20gIm5vZGU6ZnMiOwp2YXIgZGVmYXVsdEFyZ3MgPSB7CiAgZW50cnk6ICIuL3NlcnZlci5tanMiLAogIHJlbW90ZXNPck1hbmlmZXN0VXJsOiAiLi4vYnJvd3Nlci9mZWRlcmF0aW9uLm1hbmlmZXN0Lmpzb24iLAogIHJlbEJ1bmRsZVBhdGg6ICIuLi9icm93c2VyLyIKfTsKZnVuY3Rpb24gcGFyc2VGU3RhcnRBcmdzKCkgewogIGNvbnN0IGFyZ3MyID0gewogICAgZW50cnk6ICIiLAogICAgcmVtb3Rlc09yTWFuaWZlc3RVcmw6ICIiLAogICAgcmVsQnVuZGxlUGF0aDogIiIKICB9OwogIGxldCBrZXkgPSAiIjsKICBmb3IgKGxldCBpID0gMjsgaSA8IHByb2Nlc3MuYXJndi5sZW5ndGg7IGkrKykgewogICAgY29uc3QgY2FuZCA9IHByb2Nlc3MuYXJndltpXTsKICAgIGlmIChjYW5kLnN0YXJ0c1dpdGgoIi0tIikpIHsKICAgICAgY29uc3QgY2FuZEtleSA9IGNhbmQuc3Vic3RyaW5nKDIpOwogICAgICBpZiAoZGVmYXVsdEFyZ3NbY2FuZEtleV0pIHsKICAgICAgICBrZXkgPSBjYW5kS2V5OwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYHN3aXRjaCAke2NhbmR9IG5vdCBzdXBwb3J0ZWQhYCk7CiAgICAgICAgZXhpdFdpdGhVc2FnZShkZWZhdWx0QXJncyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoa2V5KSB7CiAgICAgIGFyZ3MyW2tleV0gPSBjYW5kOwogICAgICBrZXkgPSAiIjsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYHVucmVsYWRlZCB2YWx1ZSAke2NhbmR9IWApOwogICAgICBleGl0V2l0aFVzYWdlKGRlZmF1bHRBcmdzKTsKICAgIH0KICB9CiAgYXBwbHlEZWZhdWx0QXJncyhhcmdzMik7CiAgcmV0dXJuIGFyZ3MyOwp9CmZ1bmN0aW9uIGFwcGx5RGVmYXVsdEFyZ3MoYXJnczIpIHsKICBpZiAoYXJnczIucmVsQnVuZGxlUGF0aCAmJiAhYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwpIHsKICAgIGNvbnN0IGNhbmQgPSBkZWZhdWx0QXJncy5yZWxCdW5kbGVQYXRoICsgImZlZGVyYXRpb24ubWFuaWZlc3QuanNvbiI7CiAgICBpZiAoZnMzLmV4aXN0c1N5bmMoY2FuZCkpIHsKICAgICAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSBjYW5kOwogICAgfQogIH0KICBhcmdzMi5lbnRyeSA9IGFyZ3MyLmVudHJ5IHx8IGRlZmF1bHRBcmdzLmVudHJ5OwogIGFyZ3MyLnJlbEJ1bmRsZVBhdGggPSBhcmdzMi5yZWxCdW5kbGVQYXRoIHx8IGRlZmF1bHRBcmdzLnJlbEJ1bmRsZVBhdGg7CiAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCB8fCBkZWZhdWx0QXJncy5yZW1vdGVzT3JNYW5pZmVzdFVybDsKICBpZiAoIWZzMy5leGlzdHNTeW5jKGFyZ3MyLnJlbW90ZXNPck1hbmlmZXN0VXJsKSkgewogICAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSB2b2lkIDA7CiAgfQp9CmZ1bmN0aW9uIGV4aXRXaXRoVXNhZ2UoZGVmYXVsdEFyZ3MyKSB7CiAgbGV0IGFyZ3MyID0gIiI7CiAgZm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdEFyZ3MyKSB7CiAgICBhcmdzMiArPSBgWy0tJHtrZXl9ICR7ZGVmYXVsdEFyZ3MyW2tleV19XSBgOwogIH0KICBjb25zb2xlLmxvZygidXNhZ2U6IG5mc3RhcnQgIiArIGFyZ3MyKTsKICBwcm9jZXNzLmV4aXQoMSk7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2ZzdGFydC50cwp2YXIgYXJncyA9IHBhcnNlRlN0YXJ0QXJncygpOwooYXN5bmMgKCkgPT4gewogIGF3YWl0IGluaXROb2RlRmVkZXJhdGlvbih7CiAgICAuLi5hcmdzLnJlbW90ZXNPck1hbmlmZXN0VXJsID8geyByZW1vdGVzT3JNYW5pZmVzdFVybDogYXJncy5yZW1vdGVzT3JNYW5pZmVzdFVybCB9IDoge30sCiAgICByZWxCdW5kbGVQYXRoOiBhcmdzLnJlbEJ1bmRsZVBhdGgKICB9KTsKICBhd2FpdCBpbXBvcnQoYXJncy5lbnRyeSk7Cn0pKCk7Cg==";
4
+ exports.fstart = "Ly8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvbm9kZS9pbml0LW5vZGUtZmVkZXJhdGlvbi50cwppbXBvcnQgeyByZWdpc3RlciB9IGZyb20gIm5vZGU6bW9kdWxlIjsKaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gIm5vZGU6dXJsIjsKaW1wb3J0ICogYXMgZnMyIGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgKiBhcyBwYXRoMiBmcm9tICJub2RlOnBhdGgiOwoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvZ2xvYmFsLWNhY2hlLnRzCnZhciBuZk5hbWVzcGFjZSA9ICJfX05BVElWRV9GRURFUkFUSU9OX18iOwp2YXIgZ2xvYmFsMiA9IGdsb2JhbFRoaXM7Cmdsb2JhbDJbbmZOYW1lc3BhY2VdID8/PSB7CiAgZXh0ZXJuYWxzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogIHJlbW90ZU5hbWVzVG9SZW1vdGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksCiAgYmFzZVVybFRvUmVtb3RlTmFtZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkKfTsKdmFyIGdsb2JhbENhY2hlID0gZ2xvYmFsMltuZk5hbWVzcGFjZV07CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9leHRlcm5hbHMudHMKdmFyIGV4dGVybmFscyA9IGdsb2JhbENhY2hlLmV4dGVybmFsczsKZnVuY3Rpb24gZ2V0RXh0ZXJuYWxLZXkoc2hhcmVkKSB7CiAgcmV0dXJuIGAke3NoYXJlZC5wYWNrYWdlTmFtZX1AJHtzaGFyZWQudmVyc2lvbn1gOwp9CmZ1bmN0aW9uIGdldEV4dGVybmFsVXJsKHNoYXJlZCkgewogIGNvbnN0IHBhY2thZ2VLZXkgPSBnZXRFeHRlcm5hbEtleShzaGFyZWQpOwogIHJldHVybiBleHRlcm5hbHMuZ2V0KHBhY2thZ2VLZXkpOwp9CmZ1bmN0aW9uIHNldEV4dGVybmFsVXJsKHNoYXJlZCwgdXJsMikgewogIGNvbnN0IHBhY2thZ2VLZXkgPSBnZXRFeHRlcm5hbEtleShzaGFyZWQpOwogIGV4dGVybmFscy5zZXQocGFja2FnZUtleSwgdXJsMik7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL21vZGVsL2ltcG9ydC1tYXAudHMKZnVuY3Rpb24gbWVyZ2VJbXBvcnRNYXBzKG1hcDEsIG1hcDIpIHsKICByZXR1cm4gewogICAgaW1wb3J0czogeyAuLi5tYXAxLmltcG9ydHMsIC4uLm1hcDIuaW1wb3J0cyB9LAogICAgc2NvcGVzOiB7IC4uLm1hcDEuc2NvcGVzLCAuLi5tYXAyLnNjb3BlcyB9CiAgfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvcmVtb3Rlcy50cwp2YXIgcmVtb3RlTmFtZXNUb1JlbW90ZSA9IGdsb2JhbENhY2hlLnJlbW90ZU5hbWVzVG9SZW1vdGU7CnZhciBiYXNlVXJsVG9SZW1vdGVOYW1lcyA9IGdsb2JhbENhY2hlLmJhc2VVcmxUb1JlbW90ZU5hbWVzOwpmdW5jdGlvbiBhZGRSZW1vdGUocmVtb3RlTmFtZSwgcmVtb3RlKSB7CiAgcmVtb3RlTmFtZXNUb1JlbW90ZS5zZXQocmVtb3RlTmFtZSwgcmVtb3RlKTsKICBiYXNlVXJsVG9SZW1vdGVOYW1lcy5zZXQocmVtb3RlLmJhc2VVcmwsIHJlbW90ZU5hbWUpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi91dGlscy9wYXRoLXV0aWxzLnRzCmZ1bmN0aW9uIGdldERpcmVjdG9yeSh1cmwyKSB7CiAgY29uc3QgcGFydHMgPSB1cmwyLnNwbGl0KCIvIik7CiAgcGFydHMucG9wKCk7CiAgcmV0dXJuIHBhcnRzLmpvaW4oIi8iKTsKfQpmdW5jdGlvbiBqb2luUGF0aHMocGF0aDEsIHBhdGgyMikgewogIHdoaWxlIChwYXRoMS5lbmRzV2l0aCgiLyIpKSB7CiAgICBwYXRoMSA9IHBhdGgxLnN1YnN0cmluZygwLCBwYXRoMS5sZW5ndGggLSAxKTsKICB9CiAgaWYgKHBhdGgyMi5zdGFydHNXaXRoKCIuLyIpKSB7CiAgICBwYXRoMjIgPSBwYXRoMjIuc3Vic3RyaW5nKDIsIHBhdGgyMi5sZW5ndGgpOwogIH0KICByZXR1cm4gYCR7cGF0aDF9LyR7cGF0aDIyfWA7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL3dhdGNoLWZlZGVyYXRpb24tYnVpbGQudHMKZnVuY3Rpb24gd2F0Y2hGZWRlcmF0aW9uQnVpbGRDb21wbGV0aW9uKGVuZHBvaW50KSB7CiAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoZW5kcG9pbnQpOwogIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsKICAgIGlmIChkYXRhLnR5cGUgPT09ICJmZWRlcmF0aW9uLXJlYnVpbGQtY29tcGxldGUiIC8qIENPTVBMRVRFRCAqLykgewogICAgICBjb25zb2xlLmxvZygiW0ZlZGVyYXRpb25dIFJlYnVpbGQgY29tcGxldGVkLCByZWxvYWRpbmcuLi4iKTsKICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfQogIH07CiAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjb25zb2xlLndhcm4oIltGZWRlcmF0aW9uXSBTU0UgY29ubmVjdGlvbiBlcnJvcjoiLCBldmVudCk7CiAgfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvaW5pdC1mZWRlcmF0aW9uLnRzCmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbmZvcyhyZW1vdGVzLCBvcHRpb25zID0geyB0aHJvd0lmUmVtb3RlTm90Rm91bmQ6IGZhbHNlIH0pIHsKICBjb25zdCBwcm9jZXNzUmVtb3RlSW5mb1Byb21pc2VzID0gT2JqZWN0LmtleXMocmVtb3RlcykubWFwKAogICAgYXN5bmMgKHJlbW90ZU5hbWUpID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBsZXQgdXJsMiA9IHJlbW90ZXNbcmVtb3RlTmFtZV07CiAgICAgICAgaWYgKG9wdGlvbnMuY2FjaGVUYWcpIHsKICAgICAgICAgIGNvbnN0IGFkZEFwcGVuZCA9IHJlbW90ZXNbcmVtb3RlTmFtZV0uaW5jbHVkZXMoIj8iKSA/ICImIiA6ICI/IjsKICAgICAgICAgIHVybDIgKz0gYCR7YWRkQXBwZW5kfXQ9JHtvcHRpb25zLmNhY2hlVGFnfWA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhd2FpdCBwcm9jZXNzUmVtb3RlSW5mbyh1cmwyLCByZW1vdGVOYW1lKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnN0IGVycm9yID0gYEVycm9yIGxvYWRpbmcgcmVtb3RlIGVudHJ5IGZvciAke3JlbW90ZU5hbWV9IGZyb20gZmlsZSAke3JlbW90ZXNbcmVtb3RlTmFtZV19YDsKICAgICAgICBpZiAob3B0aW9ucy50aHJvd0lmUmVtb3RlTm90Rm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7CiAgICAgICAgfQogICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgKTsKICBjb25zdCByZW1vdGVJbXBvcnRNYXBzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvY2Vzc1JlbW90ZUluZm9Qcm9taXNlcyk7CiAgY29uc3QgaW1wb3J0TWFwID0gcmVtb3RlSW1wb3J0TWFwcy5yZWR1Y2UoCiAgICAoYWNjLCByZW1vdGVJbXBvcnRNYXApID0+IHJlbW90ZUltcG9ydE1hcCA/IG1lcmdlSW1wb3J0TWFwcyhhY2MsIHJlbW90ZUltcG9ydE1hcCkgOiBhY2MsCiAgICB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH0KICApOwogIHJldHVybiBpbXBvcnRNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1JlbW90ZUluZm8oZmVkZXJhdGlvbkluZm9VcmwsIHJlbW90ZU5hbWUpIHsKICBjb25zdCBiYXNlVXJsID0gZ2V0RGlyZWN0b3J5KGZlZGVyYXRpb25JbmZvVXJsKTsKICBjb25zdCByZW1vdGVJbmZvID0gYXdhaXQgbG9hZEZlZGVyYXRpb25JbmZvKGZlZGVyYXRpb25JbmZvVXJsKTsKICBpZiAoIXJlbW90ZU5hbWUpIHsKICAgIHJlbW90ZU5hbWUgPSByZW1vdGVJbmZvLm5hbWU7CiAgfQogIGlmIChyZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50KSB7CiAgICB3YXRjaEZlZGVyYXRpb25CdWlsZENvbXBsZXRpb24oCiAgICAgIGJhc2VVcmwgKyByZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50CiAgICApOwogIH0KICBjb25zdCBpbXBvcnRNYXAgPSBjcmVhdGVSZW1vdGVJbXBvcnRNYXAocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCk7CiAgYWRkUmVtb3RlKHJlbW90ZU5hbWUsIHsgLi4ucmVtb3RlSW5mbywgYmFzZVVybCB9KTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUltcG9ydE1hcChyZW1vdGVJbmZvLCByZW1vdGVOYW1lLCBiYXNlVXJsKSB7CiAgY29uc3QgaW1wb3J0cyA9IHByb2Nlc3NFeHBvc2VkKHJlbW90ZUluZm8sIHJlbW90ZU5hbWUsIGJhc2VVcmwpOwogIGNvbnN0IHNjb3BlcyA9IHByb2Nlc3NSZW1vdGVJbXBvcnRzKHJlbW90ZUluZm8sIGJhc2VVcmwpOwogIHJldHVybiB7IGltcG9ydHMsIHNjb3BlcyB9Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGZWRlcmF0aW9uSW5mbyh1cmwyKSB7CiAgY29uc3QgaW5mbyA9IGF3YWl0IGZldGNoKHVybDIpLnRoZW4oKHIpID0+IHIuanNvbigpKTsKICByZXR1cm4gaW5mbzsKfQpmdW5jdGlvbiBwcm9jZXNzUmVtb3RlSW1wb3J0cyhyZW1vdGVJbmZvLCBiYXNlVXJsKSB7CiAgY29uc3Qgc2NvcGVzID0ge307CiAgY29uc3Qgc2NvcGVkSW1wb3J0cyA9IHt9OwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIHJlbW90ZUluZm8uc2hhcmVkKSB7CiAgICBjb25zdCBvdXRGaWxlTmFtZSA9IGdldEV4dGVybmFsVXJsKHNoYXJlZCkgPz8gam9pblBhdGhzKGJhc2VVcmwsIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgICBzZXRFeHRlcm5hbFVybChzaGFyZWQsIG91dEZpbGVOYW1lKTsKICAgIHNjb3BlZEltcG9ydHNbc2hhcmVkLnBhY2thZ2VOYW1lXSA9IG91dEZpbGVOYW1lOwogIH0KICBzY29wZXNbYmFzZVVybCArICIvIl0gPSBzY29wZWRJbXBvcnRzOwogIHJldHVybiBzY29wZXM7Cn0KZnVuY3Rpb24gcHJvY2Vzc0V4cG9zZWQocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCkgewogIGNvbnN0IGltcG9ydHMgPSB7fTsKICBmb3IgKGNvbnN0IGV4cG9zZWQgb2YgcmVtb3RlSW5mby5leHBvc2VzKSB7CiAgICBjb25zdCBrZXkgPSBqb2luUGF0aHMocmVtb3RlTmFtZSwgZXhwb3NlZC5rZXkpOwogICAgY29uc3QgdmFsdWUgPSBqb2luUGF0aHMoYmFzZVVybCwgZXhwb3NlZC5vdXRGaWxlTmFtZSk7CiAgICBpbXBvcnRzW2tleV0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIGltcG9ydHM7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0hvc3RJbmZvKGhvc3RJbmZvLCByZWxCdW5kbGVzUGF0aCA9ICIuLyIpIHsKICBjb25zdCBpbXBvcnRzID0gaG9zdEluZm8uc2hhcmVkLnJlZHVjZSgKICAgIChhY2MsIGN1cikgPT4gKHsKICAgICAgLi4uYWNjLAogICAgICBbY3VyLnBhY2thZ2VOYW1lXTogcmVsQnVuZGxlc1BhdGggKyBjdXIub3V0RmlsZU5hbWUKICAgIH0pLAogICAge30KICApOwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIGhvc3RJbmZvLnNoYXJlZCkgewogICAgc2V0RXh0ZXJuYWxVcmwoc2hhcmVkLCByZWxCdW5kbGVzUGF0aCArIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgfQogIHJldHVybiB7IGltcG9ydHMsIHNjb3Blczoge30gfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvdXRpbHMvaW1wb3J0LW1hcC1sb2FkZXIuanMKaW1wb3J0IHBhdGggZnJvbSAicGF0aCI7CmltcG9ydCB1cmwgZnJvbSAidXJsIjsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICJmcyI7CnZhciBJTVBPUlRfTUFQX0ZJTEVfTkFNRSA9ICJub2RlLmltcG9ydG1hcCI7CnZhciBiYXNlVVJMID0gdXJsLnBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSkgKyBwYXRoLnNlcDsKZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CiAgbGV0IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0ge307CiAgaWYgKHBhcnNlZC5oYXNPd25Qcm9wZXJ0eSgiaW1wb3J0cyIpKSB7CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLmltcG9ydHMpKSB7CiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSAiaW1wb3J0cyIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3RgKTsKICAgIH0KICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcGFyc2VkLmltcG9ydHMsCiAgICAgIGJhc2VVUkwKICAgICk7CiAgfQogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0ge307CiAgaWYgKHBhcnNlZC5oYXNPd25Qcm9wZXJ0eSgic2NvcGVzIikpIHsKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuc2NvcGVzKSkgewogICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBpbXBvcnQgbWFwIC0gInNjb3BlcyIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3RgKTsKICAgIH0KICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSBzb3J0QW5kTm9ybWFsaXplU2NvcGVzKHBhcnNlZC5zY29wZXMsIGJhc2VVUkwpOwogIH0KICBjb25zdCBpbnZhbGlkS2V5cyA9IE9iamVjdC5rZXlzKHBhcnNlZCkuZmlsdGVyKAogICAgKGtleSkgPT4ga2V5ICE9PSAiaW1wb3J0cyIgJiYga2V5ICE9PSAic2NvcGVzIgogICk7CiAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCA+IDApIHsKICAgIGNvbnNvbGUud2FybigKICAgICAgYEludmFsaWQgdG9wLWxldmVsIGtleSR7aW52YWxpZEtleXMubGVuZ3RoID4gMCA/ICJzIiA6ICIifSBpbiBpbXBvcnQgbWFwIC0gJHtpbnZhbGlkS2V5cy5qb2luKCIsICIpfWAKICAgICk7CiAgfQogIHJldHVybiB7CiAgICBpbXBvcnRzOiBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cywKICAgIHNjb3Blczogc29ydGVkQW5kTm9ybWFsaXplZFNjb3BlcwogIH07Cn0KZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcChtYXAsIGJhc2VVUkwyKSB7CiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9OwogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBtYXApIHsKICAgIGNvbnN0IHZhbHVlID0gbWFwW3NwZWNpZmllcktleV07CiAgICBjb25zdCBub3JtYWxpemVkU3BlY2lmaWVyS2V5ID0gbm9ybWFsaXplU3BlY2lmaWVyS2V5KHNwZWNpZmllcktleSwgYmFzZVVSTDIpOwogICAgaWYgKG5vcm1hbGl6ZWRTcGVjaWZpZXJLZXkgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBsZXQgYWRkcmVzc1VSTCA9IHBhcnNlVVJMTGlrZVNwZWNpZmllcih2YWx1ZSwgYmFzZVVSTDIpOwogICAgaWYgKGFkZHJlc3NVUkwgPT09IG51bGwpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9J2AKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHNwZWNpZmllcktleS5lbmRzV2l0aCgiLyIpICYmICFhZGRyZXNzVVJMLmVuZHNXaXRoKCIvIikpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9JyAtIHNpbmNlIHRoZSBzcGVjaWZpZXIgZW5kcyBpbiBzbGFzaCwgc28gbXVzdCB0aGUgYWRkcmVzc2AKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IGFkZHJlc3NVUkw7CiAgfQogIHJldHVybiBub3JtYWxpemVkOwp9CmZ1bmN0aW9uIG5vcm1hbGl6ZVNwZWNpZmllcktleShrZXkpIHsKICBpZiAoa2V5ID09PSAiIikgewogICAgY29uc29sZS53YXJuKGBTcGVjaWZpZXIga2V5cyBpbiBpbXBvcnQgbWFwcyBtYXkgbm90IGJlIHRoZSBlbXB0eSBzdHJpbmdgKTsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKGtleSwgYmFzZVVSTCkgfHwga2V5Owp9CmZ1bmN0aW9uIHBhcnNlVVJMTGlrZVNwZWNpZmllcihzcGVjaWZpZXIsIGJhc2VVUkwyKSB7CiAgY29uc3QgdXNlQmFzZVVybEFzUGFyZW50ID0gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoIi8iKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgiLi8iKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgiLi4vIik7CiAgdHJ5IHsKICAgIHJldHVybiBuZXcgVVJMKHNwZWNpZmllciwgdXNlQmFzZVVybEFzUGFyZW50ID8gYmFzZVVSTDIgOiB2b2lkIDApLmhyZWY7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNjb3BlcyhtYXAsIGJhc2VVUkwyKSB7CiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTsKICBmb3IgKGxldCBzY29wZVByZWZpeCBpbiBtYXApIHsKICAgIGNvbnN0IHBvdGVudGlhbFNwZWNpZmllck1hcCA9IG1hcFtzY29wZVByZWZpeF07CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocG90ZW50aWFsU3BlY2lmaWVyTWFwKSkgewogICAgICB0aHJvdyBUeXBlRXJyb3IoCiAgICAgICAgYFRoZSB2YWx1ZSBvZiBzY29wZSAke3Njb3BlUHJlZml4fSBtdXN0IGJlIGEgSlNPTiBvYmplY3RgCiAgICAgICk7CiAgICB9CiAgICBsZXQgc2NvcGVQcmVmaXhVUkw7CiAgICB0cnkgewogICAgICBzY29wZVByZWZpeFVSTCA9IG5ldyBVUkwoc2NvcGVQcmVmaXgsIGJhc2VVUkwyKS5ocmVmOwogICAgfSBjYXRjaCB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgU2NvcGUgcHJlZml4IFVSTCAnJHtzY29wZVByZWZpeH0nIHdhcyBub3QgcGFyc2VhYmxlIGluIGltcG9ydCBtYXBgCiAgICAgICk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbm9ybWFsaXplZFtzY29wZVByZWZpeFVSTF0gPSBzb3J0QW5kTm9ybWFsaXplU3BlY2lmaWVyTWFwKAogICAgICBwb3RlbnRpYWxTcGVjaWZpZXJNYXAsCiAgICAgIGJhc2VVUkwyCiAgICApOwogIH0KICByZXR1cm4gbm9ybWFsaXplZDsKfQpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikgewogIHJldHVybiBvYmogPT09IE9iamVjdChvYmopICYmICFBcnJheS5pc0FycmF5KG9iaik7Cn0KdmFyIGltcG9ydE1hcFByb21pc2UgPSBnZXRJbXBvcnRNYXBQcm9taXNlKCk7CmFzeW5jIGZ1bmN0aW9uIGdldEltcG9ydE1hcFByb21pc2UoKSB7CiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcHJvY2Vzcy5lbnYuSU1QT1JUX01BUF9QQVRIIHx8IElNUE9SVF9NQVBfRklMRV9OQU1FOwogIGNvbnN0IGltcG9ydE1hcFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVsYXRpdmVQYXRoKTsKICBsZXQgc3RyOwogIHRyeSB7CiAgICBzdHIgPSBhd2FpdCBmcy5yZWFkRmlsZShpbXBvcnRNYXBQYXRoKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBlbXB0eU1hcCgpOwogIH0KICBsZXQganNvbjsKICB0cnkgewogICAganNvbiA9IGF3YWl0IEpTT04ucGFyc2Uoc3RyKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHRocm93IEVycm9yKAogICAgICBgSW1wb3J0IG1hcCBhdCAke2ltcG9ydE1hcFBhdGh9IGNvbnRhaW5zIGludmFsaWQganNvbjogJHtlcnIubWVzc2FnZX1gCiAgICApOwogIH0KICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAoanNvbik7Cn0KZ2xvYmFsLm5vZGVMb2FkZXIgPSBnbG9iYWwubm9kZUxvYWRlciB8fCB7fTsKZ2xvYmFsLm5vZGVMb2FkZXIuc2V0SW1wb3J0TWFwUHJvbWlzZSA9IGZ1bmN0aW9uIHNldEltcG9ydE1hcFByb21pc2UocHJvbWlzZSkgewogIGltcG9ydE1hcFByb21pc2UgPSBwcm9taXNlLnRoZW4oKG1hcCkgPT4gewogICAgcmV0dXJuIHJlc29sdmVBbmRDb21wb3NlSW1wb3J0TWFwKG1hcCk7CiAgfSk7Cn07CmZ1bmN0aW9uIGVtcHR5TWFwKCkgewogIHJldHVybiB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH07Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2xvYWRlci1hcy1kYXRhLXVybC5qcwp2YXIgcmVzb2x2ZXIgPSAiYVcxd2IzSjBJSEJoZEdnZ1puSnZiU0FuY0dGMGFDYzdDbWx0Y0c5eWRDQjFjbXdnWm5KdmJTQW5kWEpzSnpzS2FXMXdiM0owSUhzZ2NISnZiV2x6WlhNZ1lYTWdabk1nZlNCbWNtOXRJQ2RtY3ljN0NncGxlSEJ2Y25RZ1kyOXVjM1FnU1UxUVQxSlVYMDFCVUY5R1NVeEZYMDVCVFVVZ1BTQW5ibTlrWlM1cGJYQnZjblJ0WVhBbk93b0tZMjl1YzNRZ1ltRnpaVlZTVENBOUlIVnliQzV3WVhSb1ZHOUdhV3hsVlZKTUtIQnliMk5sYzNNdVkzZGtLQ2twSUNzZ2NHRjBhQzV6WlhBN0Nnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU51WlhjdGNtVnpiMngyWlMxaGJHZHZjbWwwYUcwS1pYaHdiM0owSUdaMWJtTjBhVzl1SUhKbGMyOXNkbVZUY0dWamFXWnBaWElvYVcxd2IzSjBUV0Z3TENCemNHVmphV1pwWlhJc0lIQmhjbVZ1ZEZWU1RDa2dld29nSUd4bGRDQmpkWEp5Wlc1MFFtRnpaVlZTVERzS0lDQnBaaUFvY0dGeVpXNTBWVkpNS1NCN0NpQWdJQ0JqYjI1emRDQnNZWE4wVTJ4aGMyaEpibVJsZUNBOUlIQmhjbVZ1ZEZWU1RDNXNZWE4wU1c1a1pYaFBaaWh3WVhSb0xuTmxjQ2s3Q2lBZ0lDQmpkWEp5Wlc1MFFtRnpaVlZTVENBOUlIQmhjbVZ1ZEZWU1RDNXpiR2xqWlNnd0xDQnNZWE4wVTJ4aGMyaEpibVJsZUNBcklERXBPd29nSUgwZ1pXeHpaU0I3Q2lBZ0lDQmpkWEp5Wlc1MFFtRnpaVlZTVENBOUlHSmhjMlZWVWt3N0NpQWdmUW9nSUdOdmJuTjBJRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWElnUFFvZ0lDQWdjR0Z5YzJWVlVreE1hV3RsVTNCbFkybG1hV1Z5S0hOd1pXTnBabWxsY2l3Z1kzVnljbVZ1ZEVKaGMyVlZVa3dwSUh4OElITndaV05wWm1sbGNqc0tJQ0JtYjNJZ0tHeGxkQ0J6WTI5d1pWQnlaV1pwZUNCcGJpQnBiWEJ2Y25STllYQXVjMk52Y0dWektTQjdDaUFnSUNCcFppQW9DaUFnSUNBZ0lITmpiM0JsVUhKbFptbDRJRDA5UFNCamRYSnlaVzUwUW1GelpWVlNUQ0I4ZkFvZ0lDQWdJQ0FvYzJOdmNHVlFjbVZtYVhndVpXNWtjMWRwZEdnb0p5OG5LU0FtSmlCamRYSnlaVzUwUW1GelpWVlNUQzV6ZEdGeWRITlhhWFJvS0hOamIzQmxVSEpsWm1sNEtTa0tJQ0FnSUNrZ2V3b2dJQ0FnSUNCamIyNXpkQ0J6WTI5d1pVbHRjRzl5ZEhOTllYUmphQ0E5SUhKbGMyOXNkbVZKYlhCdmNuUnpUV0YwWTJnb0NpQWdJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpd0tJQ0FnSUNBZ0lDQnBiWEJ2Y25STllYQXVjMk52Y0dWelczTmpiM0JsVUhKbFptbDRYUW9nSUNBZ0lDQXBPd29nSUNBZ0lDQnBaaUFvYzJOdmNHVkpiWEJ2Y25SelRXRjBZMmdwSUhzS0lDQWdJQ0FnSUNCeVpYUjFjbTRnYzJOdmNHVkpiWEJ2Y25SelRXRjBZMmc3Q2lBZ0lDQWdJSDBLSUNBZ0lIMGdaV3h6WlNCN0NpQWdJQ0FnSUdOdmJuTjBJSFJ2Y0V4bGRtVnNTVzF3YjNKMGMwMWhkR05vSUQwZ2NtVnpiMngyWlVsdGNHOXlkSE5OWVhSamFDZ0tJQ0FnSUNBZ0lDQnViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlMQW9nSUNBZ0lDQWdJR2x0Y0c5eWRFMWhjQzVwYlhCdmNuUnpDaUFnSUNBZ0lDazdDaUFnSUNBZ0lHbG1JQ2gwYjNCTVpYWmxiRWx0Y0c5eWRITk5ZWFJqYUNrZ2V3b2dJQ0FnSUNBZ0lISmxkSFZ5YmlCMGIzQk1aWFpsYkVsdGNHOXlkSE5OWVhSamFEc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lIMEtDaUFnY21WMGRYSnVJSEpsYzI5c2RtVkpiWEJ2Y25SelRXRjBZMmdvYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2l3Z2FXMXdiM0owVFdGd0xtbHRjRzl5ZEhNcE93cDlDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOeVpYTnZiSFpsTFdGdUxXbHRjRzl5ZEhNdGJXRjBZMmdLWm5WdVkzUnBiMjRnY21WemIyeDJaVWx0Y0c5eWRITk5ZWFJqYUNodWIzSnRZV3hwZW1Wa1UzQmxZMmxtYVdWeUxDQnpjR1ZqYVdacFpYSk5ZWEFwSUhzS0lDQm1iM0lnS0d4bGRDQnpjR1ZqYVdacFpYSkxaWGtnYVc0Z2MzQmxZMmxtYVdWeVRXRndLU0I3Q2lBZ0lDQmpiMjV6ZENCeVpYTnZiSFYwYVc5dVVtVnpkV3gwSUQwZ2MzQmxZMmxtYVdWeVRXRndXM053WldOcFptbGxja3RsZVYwN0Nnb2dJQ0FnYVdZZ0tITndaV05wWm1sbGNrdGxlU0E5UFQwZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpa2dld29nSUNBZ0lDQnBaaUFvY21WemIyeDFkR2x2YmxKbGMzVnNkQ0E5UFQwZ2JuVnNiQ2tnZXdvZ0lDQWdJQ0FnSUhSb2NtOTNJRlI1Y0dWRmNuSnZjaWdLSUNBZ0lDQWdJQ0FnSUdCVWFHVWdhVzF3YjNKMElHMWhjQ0J5WlhOdmJIVjBhVzl1SUc5bUlDUjdjM0JsWTJsbWFXVnlTMlY1ZlNCbVlXbHNaV1FnWkhWbElIUnZJR0VnYm5Wc2JDQmxiblJ5ZVdBS0lDQWdJQ0FnSUNBcE93b2dJQ0FnSUNCOUNpQWdJQ0FnSUhKbGRIVnliaUJ5WlhOdmJIVjBhVzl1VW1WemRXeDBPd29nSUNBZ2ZTQmxiSE5sSUdsbUlDZ0tJQ0FnSUNBZ2MzQmxZMmxtYVdWeVMyVjVMbVZ1WkhOWGFYUm9LQ2N2SnlrZ0ppWUtJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpNXpkR0Z5ZEhOWGFYUm9LSE53WldOcFptbGxja3RsZVNrS0lDQWdJQ2tnZXdvZ0lDQWdJQ0JwWmlBb2NtVnpiMngxZEdsdmJsSmxjM1ZzZENBOVBUMGdiblZzYkNrZ2V3b2dJQ0FnSUNBZ0lIUm9jbTkzSUZSNWNHVkZjbkp2Y2lnS0lDQWdJQ0FnSUNBZ0lHQlVhR1VnYVcxd2IzSjBJRzFoY0NCeVpYTnZiSFYwYVc5dUlHOW1JQ1I3YzNCbFkybG1hV1Z5UzJWNWZTQm1ZV2xzWldRZ1pIVmxJSFJ2SUdFZ2JuVnNiQ0JsYm5SeWVXQUtJQ0FnSUNBZ0lDQXBPd29nSUNBZ0lDQjlDaUFnSUNBZ0lHTnZibk4wSUdGbWRHVnlVSEpsWm1sNElEMGdibTl5YldGc2FYcGxaRk53WldOcFptbGxjaTV6YkdsalpTaHpjR1ZqYVdacFpYSkxaWGt1YkdWdVozUm9LVHNLSUNBZ0lDQWdkSEo1SUhzS0lDQWdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lGVlNUQ2hoWm5SbGNsQnlaV1pwZUN3Z2NtVnpiMngxZEdsdmJsSmxjM1ZzZENrdWFISmxaanNLSUNBZ0lDQWdmU0JqWVhSamFDQjdDaUFnSUNBZ0lDQWdkR2h5YjNjZ1ZIbHdaVVZ5Y205eUtBb2dJQ0FnSUNBZ0lDQWdZRlJvWlNCcGJYQnZjblFnYldGd0lISmxjMjlzZFhScGIyNGdiMllnSkh0emNHVmphV1pwWlhKTFpYbDlJR1poYVd4bFpDQmtkV1VnZEc4Z1ZWSk1JSEJoY25ObElHWmhhV3gxY21WZ0NpQWdJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnZlFvZ0lIMEtDaUFnY21WMGRYSnVJRzUxYkd3N0NuMEtDaTh2SUdoMGRIQnpPaTh2ZDJsalp5NW5hWFJvZFdJdWFXOHZhVzF3YjNKMExXMWhjSE12STNCaGNuTnBibWNLWlhod2IzSjBJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVkJibVJEYjIxd2IzTmxTVzF3YjNKMFRXRndLSEJoY25ObFpDa2dld29nSUM4dklGTjBaWEFnTWdvZ0lHbG1JQ2doYVhOUWJHRnBiazlpYW1WamRDaHdZWEp6WldRcEtTQjdDaUFnSUNCMGFISnZkeUJGY25KdmNpaGdTVzUyWVd4cFpDQnBiWEJ2Y25RZ2JXRndJQzBnZEc5d0lHeGxkbVZzSUcxMWMzUWdZbVVnWVc0Z2IySnFaV04wWUNrN0NpQWdmUW9LSUNBdkx5QlRkR1Z3SURNS0lDQnNaWFFnYzI5eWRHVmtRVzVrVG05eWJXRnNhWHBsWkVsdGNHOXlkSE1nUFNCN2ZUc0tDaUFnTHk4Z1UzUmxjQ0EwQ2lBZ2FXWWdLSEJoY25ObFpDNW9ZWE5QZDI1UWNtOXdaWEowZVNnbmFXMXdiM0owY3ljcEtTQjdDaUFnSUNBdkx5QlRkR1Z3SURRdU1Rb2dJQ0FnYVdZZ0tDRnBjMUJzWVdsdVQySnFaV04wS0hCaGNuTmxaQzVwYlhCdmNuUnpLU2tnZXdvZ0lDQWdJQ0IwYUhKdmR5QkZjbkp2Y2loZ1NXNTJZV3hwWkNCcGJYQnZjblFnYldGd0lDMGdJbWx0Y0c5eWRITWlJSEJ5YjNCbGNuUjVJRzExYzNRZ1ltVWdZVzRnYjJKcVpXTjBZQ2s3Q2lBZ0lDQjlDZ29nSUNBZ0x5OGdVM1JsY0NBMExqSUtJQ0FnSUhOdmNuUmxaRUZ1WkU1dmNtMWhiR2w2WldSSmJYQnZjblJ6SUQwZ2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDZ0tJQ0FnSUNBZ2NHRnljMlZrTG1sdGNHOXlkSE1zQ2lBZ0lDQWdJR0poYzJWVlVrd0tJQ0FnSUNrN0NpQWdmUW9LSUNBdkx5QlRkR1Z3SURVS0lDQnNaWFFnYzI5eWRHVmtRVzVrVG05eWJXRnNhWHBsWkZOamIzQmxjeUE5SUh0OU93b0tJQ0F2THlCVGRHVndJRFlLSUNCcFppQW9jR0Z5YzJWa0xtaGhjMDkzYmxCeWIzQmxjblI1S0NkelkyOXdaWE1uS1NrZ2V3b2dJQ0FnTHk4Z1UzUmxjQ0EyTGpFS0lDQWdJR2xtSUNnaGFYTlFiR0ZwYms5aWFtVmpkQ2h3WVhKelpXUXVjMk52Y0dWektTa2dld29nSUNBZ0lDQjBhSEp2ZHlCRmNuSnZjaWhnU1c1MllXeHBaQ0JwYlhCdmNuUWdiV0Z3SUMwZ0luTmpiM0JsY3lJZ2NISnZjR1Z5ZEhrZ2JYVnpkQ0JpWlNCaGJpQnZZbXBsWTNSZ0tUc0tJQ0FnSUgwS0NpQWdJQ0F2THlCVGRHVndJRFl1TWdvZ0lDQWdjMjl5ZEdWa1FXNWtUbTl5YldGc2FYcGxaRk5qYjNCbGN5QTlJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRZMjl3WlhNb2NHRnljMlZrTG5OamIzQmxjeXdnWW1GelpWVlNUQ2s3Q2lBZ2ZRb0tJQ0F2THlCVGRHVndJRGNLSUNCamIyNXpkQ0JwYm5aaGJHbGtTMlY1Y3lBOUlFOWlhbVZqZEM1clpYbHpLSEJoY25ObFpDa3VabWxzZEdWeUtBb2dJQ0FnS0d0bGVTa2dQVDRnYTJWNUlDRTlQU0FuYVcxd2IzSjBjeWNnSmlZZ2EyVjVJQ0U5UFNBbmMyTnZjR1Z6SndvZ0lDazdDaUFnYVdZZ0tHbHVkbUZzYVdSTFpYbHpMbXhsYm1kMGFDQStJREFwSUhzS0lDQWdJR052Ym5OdmJHVXVkMkZ5YmlnS0lDQWdJQ0FnWUVsdWRtRnNhV1FnZEc5d0xXeGxkbVZzSUd0bGVTUjdDaUFnSUNBZ0lDQWdhVzUyWVd4cFpFdGxlWE11YkdWdVozUm9JRDRnTUNBL0lDZHpKeUE2SUNjbkNpQWdJQ0FnSUgwZ2FXNGdhVzF3YjNKMElHMWhjQ0F0SUNSN2FXNTJZV3hwWkV0bGVYTXVhbTlwYmlnbkxDQW5LWDFnQ2lBZ0lDQXBPd29nSUgwS0NpQWdMeThnVTNSbGNDQTRDaUFnY21WMGRYSnVJSHNLSUNBZ0lHbHRjRzl5ZEhNNklITnZjblJsWkVGdVpFNXZjbTFoYkdsNlpXUkpiWEJ2Y25SekxBb2dJQ0FnYzJOdmNHVnpPaUJ6YjNKMFpXUkJibVJPYjNKdFlXeHBlbVZrVTJOdmNHVnpMQW9nSUgwN0NuMEtDaTh2SUdoMGRIQnpPaTh2ZDJsalp5NW5hWFJvZFdJdWFXOHZhVzF3YjNKMExXMWhjSE12STNOdmNuUXRZVzVrTFc1dmNtMWhiR2w2WlMxaExYTndaV05wWm1sbGNpMXRZWEFLWm5WdVkzUnBiMjRnYzI5eWRFRnVaRTV2Y20xaGJHbDZaVk53WldOcFptbGxjazFoY0NodFlYQXNJR0poYzJWVlVrd3BJSHNLSUNCamIyNXpkQ0J1YjNKdFlXeHBlbVZrSUQwZ2UzMDdDZ29nSUdadmNpQW9iR1YwSUhOd1pXTnBabWxsY2t0bGVTQnBiaUJ0WVhBcElIc0tJQ0FnSUdOdmJuTjBJSFpoYkhWbElEMGdiV0Z3VzNOd1pXTnBabWxsY2t0bGVWMDdDZ29nSUNBZ1kyOXVjM1FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVTQTlJRzV2Y20xaGJHbDZaVk53WldOcFptbGxja3RsZVNoemNHVmphV1pwWlhKTFpYa3NJR0poYzJWVlVrd3BPd29nSUNBZ2FXWWdLRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWEpMWlhrZ1BUMDlJRzUxYkd3cElIc0tJQ0FnSUNBZ1kyOXVkR2x1ZFdVN0NpQWdJQ0I5Q2dvZ0lDQWdiR1YwSUdGa1pISmxjM05WVWt3Z1BTQndZWEp6WlZWU1RFeHBhMlZUY0dWamFXWnBaWElvZG1Gc2RXVXNJR0poYzJWVlVrd3BPd29nSUNBZ2FXWWdLR0ZrWkhKbGMzTlZVa3dnUFQwOUlHNTFiR3dwSUhzS0lDQWdJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNBZ0lHQkpiblpoYkdsa0lGVlNUQ0JoWkdSeVpYTnpJR1p2Y2lCcGJYQnZjblFnYldGd0lITndaV05wWm1sbGNpQW5KSHR6Y0dWamFXWnBaWEpMWlhsOUoyQUtJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGdHViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlTMlY1WFNBOUlHNTFiR3c3Q2lBZ0lDQWdJR052Ym5ScGJuVmxPd29nSUNBZ2ZRb0tJQ0FnSUdsbUlDaHpjR1ZqYVdacFpYSkxaWGt1Wlc1a2MxZHBkR2dvSnk4bktTQW1KaUFoWVdSa2NtVnpjMVZTVEM1bGJtUnpWMmwwYUNnbkx5Y3BLU0I3Q2lBZ0lDQWdJR052Ym5OdmJHVXVkMkZ5YmlnS0lDQWdJQ0FnSUNCZ1NXNTJZV3hwWkNCVlVrd2dZV1JrY21WemN5Qm1iM0lnYVcxd2IzSjBJRzFoY0NCemNHVmphV1pwWlhJZ0p5UjdjM0JsWTJsbWFXVnlTMlY1ZlNjZ0xTQnphVzVqWlNCMGFHVWdjM0JsWTJsbWFXVnlJR1Z1WkhNZ2FXNGdjMnhoYzJnc0lITnZJRzExYzNRZ2RHaGxJR0ZrWkhKbGMzTmdDaUFnSUNBZ0lDazdDaUFnSUNBZ0lHNXZjbTFoYkdsNlpXUmJibTl5YldGc2FYcGxaRk53WldOcFptbGxja3RsZVYwZ1BTQnVkV3hzT3dvZ0lDQWdJQ0JqYjI1MGFXNTFaVHNLSUNBZ0lIMEtDaUFnSUNCdWIzSnRZV3hwZW1Wa1cyNXZjbTFoYkdsNlpXUlRjR1ZqYVdacFpYSkxaWGxkSUQwZ1lXUmtjbVZ6YzFWU1REc0tJQ0I5Q2dvZ0lISmxkSFZ5YmlCdWIzSnRZV3hwZW1Wa093cDlDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOdWIzSnRZV3hwZW1VdFlTMXpjR1ZqYVdacFpYSXRhMlY1Q21aMWJtTjBhVzl1SUc1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2t0bGVTaHJaWGtwSUhzS0lDQnBaaUFvYTJWNUlEMDlQU0FuSnlrZ2V3b2dJQ0FnWTI5dWMyOXNaUzUzWVhKdUtHQlRjR1ZqYVdacFpYSWdhMlY1Y3lCcGJpQnBiWEJ2Y25RZ2JXRndjeUJ0WVhrZ2JtOTBJR0psSUhSb1pTQmxiWEIwZVNCemRISnBibWRnS1RzS0lDQWdJSEpsZEhWeWJpQnVkV3hzT3dvZ0lIMEtDaUFnY21WMGRYSnVJSEJoY25ObFZWSk1UR2xyWlZOd1pXTnBabWxsY2loclpYa3NJR0poYzJWVlVrd3BJSHg4SUd0bGVUc0tmUW9LTHk4Z2FIUjBjSE02THk5M2FXTm5MbWRwZEdoMVlpNXBieTlwYlhCdmNuUXRiV0Z3Y3k4amNHRnljMlV0WVMxMWNtd3RiR2xyWlMxcGJYQnZjblF0YzNCbFkybG1hV1Z5Q21aMWJtTjBhVzl1SUhCaGNuTmxWVkpNVEdsclpWTndaV05wWm1sbGNpaHpjR1ZqYVdacFpYSXNJR0poYzJWVlVrd3BJSHNLSUNCamIyNXpkQ0IxYzJWQ1lYTmxWWEpzUVhOUVlYSmxiblFnUFFvZ0lDQWdjM0JsWTJsbWFXVnlMbk4wWVhKMGMxZHBkR2dvSnk4bktTQjhmQW9nSUNBZ2MzQmxZMmxtYVdWeUxuTjBZWEowYzFkcGRHZ29KeTR2SnlrZ2ZId0tJQ0FnSUhOd1pXTnBabWxsY2k1emRHRnlkSE5YYVhSb0tDY3VMaThuS1RzS0NpQWdkSEo1SUhzS0lDQWdJSEpsZEhWeWJpQnVaWGNnVlZKTUtITndaV05wWm1sbGNpd2dkWE5sUW1GelpWVnliRUZ6VUdGeVpXNTBJRDhnWW1GelpWVlNUQ0E2SUhWdVpHVm1hVzVsWkNrdWFISmxaanNLSUNCOUlHTmhkR05vSUhzS0lDQWdJSEpsZEhWeWJpQnVkV3hzT3dvZ0lIMEtmUW9LTHk4Z2FIUjBjSE02THk5M2FXTm5MbWRwZEdoMVlpNXBieTlwYlhCdmNuUXRiV0Z3Y3k4amMyOXlkQzFoYm1RdGJtOXliV0ZzYVhwbExYTmpiM0JsY3dwbWRXNWpkR2x2YmlCemIzSjBRVzVrVG05eWJXRnNhWHBsVTJOdmNHVnpLRzFoY0N3Z1ltRnpaVlZTVENrZ2V3b2dJR3hsZENCdWIzSnRZV3hwZW1Wa0lEMGdlMzA3Q2dvZ0lHWnZjaUFvYkdWMElITmpiM0JsVUhKbFptbDRJR2x1SUcxaGNDa2dld29nSUNBZ1kyOXVjM1FnY0c5MFpXNTBhV0ZzVTNCbFkybG1hV1Z5VFdGd0lEMGdiV0Z3VzNOamIzQmxVSEpsWm1sNFhUc0tJQ0FnSUdsbUlDZ2hhWE5RYkdGcGJrOWlhbVZqZENod2IzUmxiblJwWVd4VGNHVmphV1pwWlhKTllYQXBLU0I3Q2lBZ0lDQWdJSFJvY205M0lGUjVjR1ZGY25KdmNpZ0tJQ0FnSUNBZ0lDQmdWR2hsSUhaaGJIVmxJRzltSUhOamIzQmxJQ1I3YzJOdmNHVlFjbVZtYVhoOUlHMTFjM1FnWW1VZ1lTQktVMDlPSUc5aWFtVmpkR0FLSUNBZ0lDQWdLVHNLSUNBZ0lIMEtDaUFnSUNCc1pYUWdjMk52Y0dWUWNtVm1hWGhWVWt3N0NpQWdJQ0IwY25rZ2V3b2dJQ0FnSUNCelkyOXdaVkJ5WldacGVGVlNUQ0E5SUc1bGR5QlZVa3dvYzJOdmNHVlFjbVZtYVhnc0lHSmhjMlZWVWt3cExtaHlaV1k3Q2lBZ0lDQjlJR05oZEdOb0lIc0tJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLQW9nSUNBZ0lDQWdJR0JUWTI5d1pTQndjbVZtYVhnZ1ZWSk1JQ2NrZTNOamIzQmxVSEpsWm1sNGZTY2dkMkZ6SUc1dmRDQndZWEp6WldGaWJHVWdhVzRnYVcxd2IzSjBJRzFoY0dBS0lDQWdJQ0FnS1RzS0lDQWdJQ0FnWTI5dWRHbHVkV1U3Q2lBZ0lDQjlDZ29nSUNBZ2JtOXliV0ZzYVhwbFpGdHpZMjl3WlZCeVpXWnBlRlZTVEYwZ1BTQnpiM0owUVc1a1RtOXliV0ZzYVhwbFUzQmxZMmxtYVdWeVRXRndLQW9nSUNBZ0lDQndiM1JsYm5ScFlXeFRjR1ZqYVdacFpYSk5ZWEFzQ2lBZ0lDQWdJR0poYzJWVlVrd0tJQ0FnSUNrN0NpQWdmUW9LSUNCeVpYUjFjbTRnYm05eWJXRnNhWHBsWkRzS2ZRb0tablZ1WTNScGIyNGdhWE5RYkdGcGJrOWlhbVZqZENodlltb3BJSHNLSUNCeVpYUjFjbTRnYjJKcUlEMDlQU0JQWW1wbFkzUW9iMkpxS1NBbUppQWhRWEp5WVhrdWFYTkJjbkpoZVNodlltb3BPd3A5Q2dvdkx5QXRMUzBLQ214bGRDQnBiWEJ2Y25STllYQlFjbTl0YVhObElEMGdaMlYwU1cxd2IzSjBUV0Z3VUhKdmJXbHpaU2dwT3dvS1pYaHdiM0owSUdGemVXNWpJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVW9jM0JsWTJsbWFXVnlMQ0JqYjI1MFpYaDBMQ0JrWldaaGRXeDBVbVZ6YjJ4MlpTa2dld29nSUdOdmJuTjBJSHNnY0dGeVpXNTBWVkpNSUQwZ2JuVnNiQ0I5SUQwZ1kyOXVkR1Y0ZERzS0lDQmpiMjV6ZENCcGJYQnZjblJOWVhBZ1BTQmhkMkZwZENCcGJYQnZjblJOWVhCUWNtOXRhWE5sT3dvZ0lHTnZibk4wSUdsdGNHOXlkRTFoY0ZWeWJDQTlJSEpsYzI5c2RtVlRjR1ZqYVdacFpYSW9hVzF3YjNKMFRXRndMQ0J6Y0dWamFXWnBaWElzSUhCaGNtVnVkRlZTVENrN0Nnb2dJSEpsZEhWeWJpQmtaV1poZFd4MFVtVnpiMngyWlNocGJYQnZjblJOWVhCVmNtd2dQejhnYzNCbFkybG1hV1Z5TENCamIyNTBaWGgwTENCa1pXWmhkV3gwVW1WemIyeDJaU2s3Q24wS0NtVjRjRzl5ZENCaGMzbHVZeUJtZFc1amRHbHZiaUJzYjJGa0tIVnliQ3dnWTI5dWRHVjRkQ3dnWkdWbVlYVnNkRXh2WVdRcElIc0tJQ0JwWmlBb2RYSnNMbk4wWVhKMGMxZHBkR2dvSjJoMGRIQTZMeThuS1NCOGZDQjFjbXd1YzNSaGNuUnpWMmwwYUNnbmFIUjBjSE02THk4bktTa2dld29nSUNBZ1kyOXVjM1FnY21WeklEMGdZWGRoYVhRZ1ptVjBZMmdvZFhKc0tUc0tJQ0FnSUdsbUlDZ2hjbVZ6TG05cktTQjdDaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2loZ1JtRnBiR1ZrSUhSdklHWmxkR05vSUcxdlpIVnNaU0JtY205dElDUjdkWEpzZldBcE93b2dJQ0FnZlFvZ0lDQWdZMjl1YzNRZ2MyOTFjbU5sSUQwZ1lYZGhhWFFnY21WekxuUmxlSFFvS1RzS0lDQWdJSEpsZEhWeWJpQjdDaUFnSUNBZ0lITm9iM0owUTJseVkzVnBkRG9nZEhKMVpTd0tJQ0FnSUNBZ1ptOXliV0YwT2lBbmJXOWtkV3hsSnl3Z0NpQWdJQ0FnSUhOdmRYSmpaU3dLSUNBZ0lIMDdDaUFnZlFvS0lDQnBaaUFvSVhWeWJDNXpkR0Z5ZEhOWGFYUm9LQ2R1YjJSbE9pY3BLU0I3Q2lBZ0lDQmpiMjUwWlhoMExtWnZjbTFoZENBOUlDZHRiMlIxYkdVbk93b2dJSDBLSUNBS0lDQnlaWFIxY200Z1pHVm1ZWFZzZEV4dllXUW9kWEpzTENCamIyNTBaWGgwTENCa1pXWmhkV3gwVEc5aFpDazdDbjBLQ21GemVXNWpJR1oxYm1OMGFXOXVJR2RsZEVsdGNHOXlkRTFoY0ZCeWIyMXBjMlVvS1NCN0NpQWdZMjl1YzNRZ2NtVnNZWFJwZG1WUVlYUm9JRDBnY0hKdlkyVnpjeTVsYm5ZdVNVMVFUMUpVWDAxQlVGOVFRVlJJSUh4OElFbE5VRTlTVkY5TlFWQmZSa2xNUlY5T1FVMUZPd29nSUdOdmJuTjBJR2x0Y0c5eWRFMWhjRkJoZEdnZ1BTQndZWFJvTG5KbGMyOXNkbVVvY0hKdlkyVnpjeTVqZDJRb0tTd2djbVZzWVhScGRtVlFZWFJvS1RzS0NpQWdiR1YwSUhOMGNqc0tJQ0IwY25rZ2V3b2dJQ0FnYzNSeUlEMGdZWGRoYVhRZ1puTXVjbVZoWkVacGJHVW9hVzF3YjNKMFRXRndVR0YwYUNrN0NpQWdmU0JqWVhSamFDQW9aWEp5S1NCN0NpQWdJQ0J5WlhSMWNtNGdaVzF3ZEhsTllYQW9LVHNLSUNCOUNnb2dJR3hsZENCcWMyOXVPd29nSUhSeWVTQjdDaUFnSUNCcWMyOXVJRDBnWVhkaGFYUWdTbE5QVGk1d1lYSnpaU2h6ZEhJcE93b2dJSDBnWTJGMFkyZ2dLR1Z5Y2lrZ2V3b2dJQ0FnZEdoeWIzY2dSWEp5YjNJb0NpQWdJQ0FnSUdCSmJYQnZjblFnYldGd0lHRjBJQ1I3YVcxd2IzSjBUV0Z3VUdGMGFIMGdZMjl1ZEdGcGJuTWdhVzUyWVd4cFpDQnFjMjl1T2lBa2UyVnljaTV0WlhOellXZGxmV0FLSUNBZ0lDazdDaUFnZlFvS0lDQnlaWFIxY200Z2NtVnpiMngyWlVGdVpFTnZiWEJ2YzJWSmJYQnZjblJOWVhBb2FuTnZiaWs3Q24wS0NtZHNiMkpoYkM1dWIyUmxURzloWkdWeUlEMGdaMnh2WW1Gc0xtNXZaR1ZNYjJGa1pYSWdmSHdnZTMwN0NncG5iRzlpWVd3dWJtOWtaVXh2WVdSbGNpNXpaWFJKYlhCdmNuUk5ZWEJRY205dGFYTmxJRDBnWm5WdVkzUnBiMjRnYzJWMFNXMXdiM0owVFdGd1VISnZiV2x6WlNod2NtOXRhWE5sS1NCN0NpQWdhVzF3YjNKMFRXRndVSEp2YldselpTQTlJSEJ5YjIxcGMyVXVkR2hsYmlnb2JXRndLU0E5UGlCN0NpQWdJQ0J5WlhSMWNtNGdjbVZ6YjJ4MlpVRnVaRU52YlhCdmMyVkpiWEJ2Y25STllYQW9iV0Z3S1RzS0lDQjlLVHNLZlRzS0NtWjFibU4wYVc5dUlHVnRjSFI1VFdGd0tDa2dld29nSUhKbGRIVnliaUI3SUdsdGNHOXlkSE02SUh0OUxDQnpZMjl3WlhNNklIdDlJSDA3Q24wSyI7CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi9ub2RlL2luaXQtbm9kZS1mZWRlcmF0aW9uLnRzCnZhciBkZWZhdWx0T3B0aW9ucyA9IHsKICByZW1vdGVzT3JNYW5pZmVzdFVybDoge30sCiAgcmVsQnVuZGxlUGF0aDogIi4uL2Jyb3dzZXIiLAogIHRocm93SWZSZW1vdGVOb3RGb3VuZDogZmFsc2UKfTsKYXN5bmMgZnVuY3Rpb24gaW5pdE5vZGVGZWRlcmF0aW9uKG9wdGlvbnMpIHsKICBjb25zdCBtZXJnZWRPcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9OwogIGNvbnN0IGltcG9ydE1hcCA9IGF3YWl0IGNyZWF0ZU5vZGVJbXBvcnRNYXAobWVyZ2VkT3B0aW9ucyk7CiAgYXdhaXQgd3JpdGVJbXBvcnRNYXAoaW1wb3J0TWFwKTsKICBhd2FpdCB3cml0ZVJlc29sdmVyKCk7CiAgcmVnaXN0ZXIocGF0aFRvRmlsZVVSTCgiLi9mZWRlcmF0aW9uLXJlc29sdmVyLm1qcyIpLmhyZWYpOwp9CmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5vZGVJbXBvcnRNYXAob3B0aW9ucykgewogIGNvbnN0IHsgcmVtb3Rlc09yTWFuaWZlc3RVcmwsIHJlbEJ1bmRsZVBhdGggfSA9IG9wdGlvbnM7CiAgY29uc3QgcmVtb3RlcyA9IHR5cGVvZiByZW1vdGVzT3JNYW5pZmVzdFVybCA9PT0gIm9iamVjdCIgPyByZW1vdGVzT3JNYW5pZmVzdFVybCA6IGF3YWl0IGxvYWRGc01hbmlmZXN0KHJlbW90ZXNPck1hbmlmZXN0VXJsKTsKICBjb25zdCBob3N0SW5mbyA9IGF3YWl0IGxvYWRGc0ZlZGVyYXRpb25JbmZvKHJlbEJ1bmRsZVBhdGgpOwogIGNvbnN0IGhvc3RJbXBvcnRNYXAgPSBhd2FpdCBwcm9jZXNzSG9zdEluZm8oaG9zdEluZm8sICIuLyIgKyByZWxCdW5kbGVQYXRoKTsKICBjb25zdCByZW1vdGVzSW1wb3J0TWFwID0gYXdhaXQgcHJvY2Vzc1JlbW90ZUluZm9zKHJlbW90ZXMsIHsKICAgIHRocm93SWZSZW1vdGVOb3RGb3VuZDogb3B0aW9ucy50aHJvd0lmUmVtb3RlTm90Rm91bmQsCiAgICBjYWNoZVRhZzogb3B0aW9ucy5jYWNoZVRhZwogIH0pOwogIGNvbnN0IGltcG9ydE1hcCA9IG1lcmdlSW1wb3J0TWFwcyhob3N0SW1wb3J0TWFwLCByZW1vdGVzSW1wb3J0TWFwKTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGc01hbmlmZXN0KG1hbmlmZXN0VXJsKSB7CiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzMi5yZWFkRmlsZShtYW5pZmVzdFVybCwgInV0Zi04Iik7CiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGNvbnRlbnQpOwogIHJldHVybiBtYW5pZmVzdDsKfQphc3luYyBmdW5jdGlvbiBsb2FkRnNGZWRlcmF0aW9uSW5mbyhyZWxCdW5kbGVQYXRoKSB7CiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aDIuam9pbihyZWxCdW5kbGVQYXRoLCAicmVtb3RlRW50cnkuanNvbiIpOwogIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmczIucmVhZEZpbGUobWFuaWZlc3RQYXRoLCAidXRmLTgiKTsKICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoY29udGVudCk7CiAgcmV0dXJuIG1hbmlmZXN0Owp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlSW1wb3J0TWFwKG1hcCkgewogIGF3YWl0IGZzMi53cml0ZUZpbGUoCiAgICBJTVBPUlRfTUFQX0ZJTEVfTkFNRSwKICAgIEpTT04uc3RyaW5naWZ5KG1hcCwgbnVsbCwgMiksCiAgICAidXRmLTgiCiAgKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZVJlc29sdmVyKCkgewogIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc29sdmVyLCAiYmFzZTY0Iik7CiAgYXdhaXQgZnMyLndyaXRlRmlsZSgiZmVkZXJhdGlvbi1yZXNvbHZlci5tanMiLCBidWZmZXIsICJ1dGYtOCIpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi91dGlscy9mc3RhcnQtYXJncy1wYXJzZXIudHMKaW1wb3J0ICogYXMgZnMzIGZyb20gIm5vZGU6ZnMiOwp2YXIgZGVmYXVsdEFyZ3MgPSB7CiAgZW50cnk6ICIuL3NlcnZlci5tanMiLAogIHJlbW90ZXNPck1hbmlmZXN0VXJsOiAiLi4vYnJvd3Nlci9mZWRlcmF0aW9uLm1hbmlmZXN0Lmpzb24iLAogIHJlbEJ1bmRsZVBhdGg6ICIuLi9icm93c2VyLyIKfTsKZnVuY3Rpb24gcGFyc2VGU3RhcnRBcmdzKCkgewogIGNvbnN0IGFyZ3MyID0gewogICAgZW50cnk6ICIiLAogICAgcmVtb3Rlc09yTWFuaWZlc3RVcmw6ICIiLAogICAgcmVsQnVuZGxlUGF0aDogIiIKICB9OwogIGxldCBrZXkgPSAiIjsKICBmb3IgKGxldCBpID0gMjsgaSA8IHByb2Nlc3MuYXJndi5sZW5ndGg7IGkrKykgewogICAgY29uc3QgY2FuZCA9IHByb2Nlc3MuYXJndltpXTsKICAgIGlmIChjYW5kLnN0YXJ0c1dpdGgoIi0tIikpIHsKICAgICAgY29uc3QgY2FuZEtleSA9IGNhbmQuc3Vic3RyaW5nKDIpOwogICAgICBpZiAoZGVmYXVsdEFyZ3NbY2FuZEtleV0pIHsKICAgICAgICBrZXkgPSBjYW5kS2V5OwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYHN3aXRjaCAke2NhbmR9IG5vdCBzdXBwb3J0ZWQhYCk7CiAgICAgICAgZXhpdFdpdGhVc2FnZShkZWZhdWx0QXJncyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoa2V5KSB7CiAgICAgIGFyZ3MyW2tleV0gPSBjYW5kOwogICAgICBrZXkgPSAiIjsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYHVucmVsYWRlZCB2YWx1ZSAke2NhbmR9IWApOwogICAgICBleGl0V2l0aFVzYWdlKGRlZmF1bHRBcmdzKTsKICAgIH0KICB9CiAgYXBwbHlEZWZhdWx0QXJncyhhcmdzMik7CiAgcmV0dXJuIGFyZ3MyOwp9CmZ1bmN0aW9uIGFwcGx5RGVmYXVsdEFyZ3MoYXJnczIpIHsKICBpZiAoYXJnczIucmVsQnVuZGxlUGF0aCAmJiAhYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwpIHsKICAgIGNvbnN0IGNhbmQgPSBkZWZhdWx0QXJncy5yZWxCdW5kbGVQYXRoICsgImZlZGVyYXRpb24ubWFuaWZlc3QuanNvbiI7CiAgICBpZiAoZnMzLmV4aXN0c1N5bmMoY2FuZCkpIHsKICAgICAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSBjYW5kOwogICAgfQogIH0KICBhcmdzMi5lbnRyeSA9IGFyZ3MyLmVudHJ5IHx8IGRlZmF1bHRBcmdzLmVudHJ5OwogIGFyZ3MyLnJlbEJ1bmRsZVBhdGggPSBhcmdzMi5yZWxCdW5kbGVQYXRoIHx8IGRlZmF1bHRBcmdzLnJlbEJ1bmRsZVBhdGg7CiAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCB8fCBkZWZhdWx0QXJncy5yZW1vdGVzT3JNYW5pZmVzdFVybDsKICBpZiAoIWZzMy5leGlzdHNTeW5jKGFyZ3MyLnJlbW90ZXNPck1hbmlmZXN0VXJsKSkgewogICAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSB2b2lkIDA7CiAgfQp9CmZ1bmN0aW9uIGV4aXRXaXRoVXNhZ2UoZGVmYXVsdEFyZ3MyKSB7CiAgbGV0IGFyZ3MyID0gIiI7CiAgZm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdEFyZ3MyKSB7CiAgICBhcmdzMiArPSBgWy0tJHtrZXl9ICR7ZGVmYXVsdEFyZ3MyW2tleV19XSBgOwogIH0KICBjb25zb2xlLmxvZygidXNhZ2U6IG5mc3RhcnQgIiArIGFyZ3MyKTsKICBwcm9jZXNzLmV4aXQoMSk7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2ZzdGFydC50cwp2YXIgYXJncyA9IHBhcnNlRlN0YXJ0QXJncygpOwooYXN5bmMgKCkgPT4gewogIGF3YWl0IGluaXROb2RlRmVkZXJhdGlvbih7CiAgICAuLi5hcmdzLnJlbW90ZXNPck1hbmlmZXN0VXJsID8geyByZW1vdGVzT3JNYW5pZmVzdFVybDogYXJncy5yZW1vdGVzT3JNYW5pZmVzdFVybCB9IDoge30sCiAgICByZWxCdW5kbGVQYXRoOiBhcmdzLnJlbEJ1bmRsZVBhdGgKICB9KTsKICBhd2FpdCBpbXBvcnQoYXJncy5lbnRyeSk7Cn0pKCk7Cg==";
5
5
  //# sourceMappingURL=fstart-as-data-url.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fstart-as-data-url.js","sourceRoot":"","sources":["../../../../../libs/native-federation/src/tools/fstart-as-data-url.ts"],"names":[],"mappings":";;;AAAa,QAAA,MAAM,GAAG,839BAA839B,CAAC"}
1
+ {"version":3,"file":"fstart-as-data-url.js","sourceRoot":"","sources":["../../../../../libs/native-federation/src/tools/fstart-as-data-url.ts"],"names":[],"mappings":";;;AAAa,QAAA,MAAM,GAAG,8x/BAA8x/B,CAAC"}