@here/olp-sdk-dataservice-read 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bundle.umd.dev.js CHANGED
@@ -11945,20 +11945,7 @@ class VersionedLayerClient {
11945
11945
  this.version = params.version;
11946
11946
  }
11947
11947
  }
11948
- /**
11949
- * @brief Fetches data of a tile or its closest ancestor.
11950
- * Use this API for tile-tree structures where children tile data is aggregated and stored in parent tiles.
11951
- *
11952
- * @param request The `TileRequest` instance that contains a complete set
11953
- * of request parameters.
11954
- * @param abortSignal A signal object that allows you to communicate with a request (such as the `fetch` request)
11955
- * and, if required, abort it using the `AbortController` object.
11956
- *
11957
- * For more information, see the [`AbortController` documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).
11958
- *
11959
- * @return Tile data (if it exists) or the nearest parent tile data
11960
- */
11961
- async getAggregatedData(request, abortSignal) {
11948
+ async getAggregatedData(request, abortSignal, options) {
11962
11949
  let catalogVersion = this.version;
11963
11950
  if (catalogVersion === undefined) {
11964
11951
  catalogVersion = await this.getLatestVersion(request.getBillingTag());
@@ -11970,7 +11957,10 @@ class VersionedLayerClient {
11970
11957
  settings: this.settings,
11971
11958
  catalogVersion
11972
11959
  };
11973
- return (0, getTile_1.getTile)(request, params, abortSignal);
11960
+ const tileResponse = await (0, getTile_1.getTile)(request, params, abortSignal, {
11961
+ includeTileKey: true
11962
+ });
11963
+ return options?.includeTileKey ? tileResponse : tileResponse.response;
11974
11964
  }
11975
11965
  /**
11976
11966
  * Fetches partition data using one of the following methods: ID, quadkey, or data handle.
@@ -12465,41 +12455,14 @@ const olp_sdk_dataservice_api_1 = __webpack_require__(/*! @here/olp-sdk-dataserv
12465
12455
  const QuadTreeIndexCacheRepository_1 = __webpack_require__(/*! ../cache/QuadTreeIndexCacheRepository */ "./lib/cache/QuadTreeIndexCacheRepository.js");
12466
12456
  const QuadTreeIndexRequest_1 = __webpack_require__(/*! ../client/QuadTreeIndexRequest */ "./lib/client/QuadTreeIndexRequest.js");
12467
12457
  const QueryClient_1 = __webpack_require__(/*! ../client/QueryClient */ "./lib/client/QueryClient.js");
12458
+ async function getTile(request, params, abortSignal, options) {
12459
+ const tileResponse = await fetchTile(request, params, abortSignal);
12460
+ return options?.includeTileKey ? tileResponse : tileResponse.response;
12461
+ }
12468
12462
  /**
12469
- * Fetches asynchronously data from a tile or from its nearest ancestor if not found.
12470
- *
12471
- * The tile is a geometric area represented as a HERE tile.
12472
- * The quad tree metadata fetches the blob of needed tile from the HERE Query Service,
12473
- * then caches it, and returns to the user.
12474
- * To disable caching of metadata use `request.withFetchOption(FetchOptions.OnlineOnly)`.
12475
- *
12476
- * @param request Requests the [[TileRequest]] instance with the configured parameters.
12477
- * @see [[TileRequest]]
12478
- *
12479
- * @param abortSignal The signal object that allows you to communicate with a request (such as the `fetch` request)
12480
- * and, if required, abort it using the `AbortController` object.
12481
- * @see the [`AbortController` documentation](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).
12482
- *
12483
- * @example
12484
- *
12485
- * ```
12486
- * const params: GetTileParams = {
12487
- * settings: "% your `OlpClientSettings` instance % ",
12488
- * catalogHrn: "% the HRN instance of your catalog %",
12489
- * layerId: "% your layer ID %",
12490
- * layerType: "% versioned or volatile %",
12491
- * }
12492
- *
12493
- * const request = new TileRequest();
12494
- *
12495
- * const tile1 = await getTile(request.withTileKey(yourTileKey1), params);
12496
- * const tile2 = await getTile(request.withTileKey(yourTileKey2), params);
12497
- *
12498
- * ```
12499
- *
12500
- * @returns The blob of the requested tile or the blob of the closest parent Tile.
12463
+ * @hidden
12501
12464
  */
12502
- async function getTile(request, params, abortSignal) {
12465
+ async function fetchTile(request, params, abortSignal) {
12503
12466
  let catalogVersion;
12504
12467
  const quadKey = request.getTileKey();
12505
12468
  if (!quadKey) {
@@ -12510,65 +12473,86 @@ async function getTile(request, params, abortSignal) {
12510
12473
  }
12511
12474
  const blobType = params.layerType === "versioned" ? "blob" : "volatile-blob";
12512
12475
  const blobRequestBuilder = await olp_sdk_core_1.RequestFactory.create(blobType, "v1", params.settings, params.catalogHrn, abortSignal);
12513
- const delta = 4;
12476
+ const depth = 4;
12514
12477
  const requestedTileKey = olp_sdk_core_1.TileKey.fromRowColumnLevel(quadKey.row, quadKey.column, quadKey.level);
12515
- let quadTreeIndex = null;
12478
+ const quadTreeIndexRoot = requestedTileKey.changedLevelBy(-depth);
12479
+ let quadTreeIndex;
12516
12480
  if (request.getFetchOption() !== olp_sdk_core_1.FetchOptions.OnlineOnly) {
12517
12481
  const cache = new QuadTreeIndexCacheRepository_1.QuadTreeIndexCacheRepository(params.settings.cache);
12518
- for (let i = 1; i <= delta; i++) {
12519
- const parentInCache = requestedTileKey.changedLevelBy(-i);
12520
- const cachedTree = cache.get({
12521
- hrn: params.catalogHrn.toString(),
12522
- layerId: params.layerId,
12523
- depth: delta,
12524
- root: parentInCache,
12525
- version: catalogVersion
12526
- });
12527
- if (cachedTree) {
12528
- quadTreeIndex = cachedTree;
12529
- }
12530
- }
12482
+ quadTreeIndex = cache.get({
12483
+ hrn: params.catalogHrn.toString(),
12484
+ layerId: params.layerId,
12485
+ depth,
12486
+ root: quadTreeIndexRoot,
12487
+ version: catalogVersion
12488
+ });
12531
12489
  }
12532
- const parentTileKey = requestedTileKey.changedLevelBy(-delta);
12533
12490
  if (!quadTreeIndex) {
12534
12491
  quadTreeIndex = await fetchQuadTreeIndex({
12535
12492
  ...params,
12536
12493
  catalogVersion,
12537
- depth: delta,
12494
+ depth,
12538
12495
  fetchOptions: request.getFetchOption(),
12539
- tileKey: parentTileKey,
12496
+ tileKey: quadTreeIndexRoot,
12540
12497
  abortSignal,
12541
12498
  billingTag: request.getBillingTag()
12542
12499
  });
12543
12500
  }
12544
- if (!quadTreeIndex.subQuads || !quadTreeIndex.subQuads.length) {
12545
- return Promise.resolve(new Response(null, {
12546
- status: 204,
12547
- statusText: "No Content"
12548
- }));
12549
- }
12550
- // Return the data for the requested QuadKey or for the closest parent
12551
- const subQuads = quadTreeIndex.subQuads;
12552
- let currentTileKey = requestedTileKey;
12553
- let currentDelta = delta;
12554
- for (let level = currentTileKey.level; level >= parentTileKey.level; --level) {
12555
- const metadata = subQuads.find((item) => item.subQuadKey === currentTileKey.getSubHereTile(currentDelta));
12556
- if (metadata) {
12557
- return olp_sdk_dataservice_api_1.BlobApi.getBlob(blobRequestBuilder, {
12558
- dataHandle: metadata.dataHandle,
12559
- layerId: params.layerId,
12560
- billingTag: request.getBillingTag()
12561
- });
12562
- }
12563
- try {
12564
- currentTileKey = currentTileKey.parent();
12565
- currentDelta = parentTileKey.level - currentTileKey.level;
12501
+ const subQuads = quadTreeIndex.subQuads ?? [];
12502
+ const parentQuads = quadTreeIndex.parentQuads ?? [];
12503
+ if (!subQuads.length && !parentQuads.length) {
12504
+ return Promise.resolve({
12505
+ response: new Response(null, {
12506
+ status: 204,
12507
+ statusText: "No Content"
12508
+ }),
12509
+ parentTileKey: undefined
12510
+ });
12511
+ }
12512
+ const closestParent = findClosestParent(requestedTileKey, quadTreeIndex, quadTreeIndexRoot);
12513
+ if (!closestParent) {
12514
+ return Promise.reject(new Error(`Error getting blob for Tile: ${requestedTileKey.toHereTile()}`));
12515
+ }
12516
+ return {
12517
+ response: await olp_sdk_dataservice_api_1.BlobApi.getBlob(blobRequestBuilder, {
12518
+ dataHandle: closestParent.parentQuad.dataHandle,
12519
+ layerId: params.layerId,
12520
+ billingTag: request.getBillingTag()
12521
+ }),
12522
+ parentTileKey: closestParent.tileKey
12523
+ };
12524
+ }
12525
+ /**
12526
+ * Helper function to get the closest parent quad for a given tile key.
12527
+ * @hidden
12528
+ */
12529
+ function findClosestParent(tileKey, quadTreeIndex, quadTreeIndexRoot) {
12530
+ const subQuads = quadTreeIndex.subQuads ?? [];
12531
+ const parentQuads = quadTreeIndex.parentQuads ?? [];
12532
+ // First, iterate through the sub quad trees, starting from lowest level up to the quad tree index root
12533
+ let currentTileKey = tileKey;
12534
+ while (currentTileKey.level >= quadTreeIndexRoot.level) {
12535
+ const currentDelta = currentTileKey.level - quadTreeIndexRoot.level;
12536
+ const subHereTile = currentTileKey.getSubHereTile(currentDelta);
12537
+ const subQuad = subQuads.find((item) => item.subQuadKey === subHereTile);
12538
+ if (subQuad) {
12539
+ return { parentQuad: subQuad, tileKey: currentTileKey };
12566
12540
  }
12567
- catch (error) {
12568
- continue;
12541
+ // Stop before requesting the parent of the quad tree index root -
12542
+ // that root can be the global root tile (level 0), whose parent()
12543
+ // throws rather than returning another tile.
12544
+ if (currentTileKey.level === quadTreeIndexRoot.level) {
12545
+ break;
12569
12546
  }
12547
+ currentTileKey = currentTileKey.parent();
12570
12548
  }
12571
- return Promise.reject(new Error(`Error getting blob for Tile: ${JSON.stringify(quadKey)}`));
12549
+ // not found? Find the closest parent quad
12550
+ return parentQuads.reduce((closest, parentQuad) => {
12551
+ const tileKey = olp_sdk_core_1.TileKey.fromHereTile(parentQuad.partition);
12552
+ return !closest || tileKey.level > closest.tileKey.level
12553
+ ? { parentQuad, tileKey }
12554
+ : closest;
12555
+ }, undefined);
12572
12556
  }
12573
12557
  /**
12574
12558
  * The function should request quad tree index for the parent tile with delta 4
@@ -12586,7 +12570,8 @@ async function fetchQuadTreeIndex(params) {
12586
12570
  }
12587
12571
  const quadTreeIndex = await queryClient.fetchQuadTreeIndex(quadTreeIndexRequest, params.abortSignal);
12588
12572
  if (params.fetchOptions !== olp_sdk_core_1.FetchOptions.OnlineOnly &&
12589
- quadTreeIndex.subQuads) {
12573
+ (quadTreeIndex.subQuads !== undefined ||
12574
+ quadTreeIndex.parentQuads !== undefined)) {
12590
12575
  cache.put({
12591
12576
  hrn: params.catalogHrn.toString(),
12592
12577
  layerId: params.layerId,
@@ -12785,4 +12770,4 @@ function validatePartitionsIdsList(list) {
12785
12770
  /******/ })()
12786
12771
  ;
12787
12772
  });
12788
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QWE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELFVBQVUsNEJBQTRCLGlCQUFpQjtBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGdDQUFnQztBQUNoQyxvQkFBb0IsbUJBQU8sQ0FBQywyREFBYTtBQUN6QyxnQkFBZ0IsbUJBQU8sQ0FBQyxtREFBUztBQUNqQyxvQkFBb0IsbUJBQU8sQ0FBQywyREFBYTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRixZQUFZO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSx3RkFBd0YsWUFBWSxJQUFJLGdCQUFnQixFQUFFLDBCQUEwQjtBQUNwSjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxzQkFBc0I7Ozs7Ozs7Ozs7O0FDL0dUO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLE9BQU87QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixLQUFLLFdBQVcsT0FBTztBQUNwRCxtQkFBbUIsS0FBSztBQUN4QixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixLQUFLLFdBQVcsT0FBTztBQUNwRCxtQkFBbUIsS0FBSztBQUN4QixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEtBQUssWUFBWSxLQUFLO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEtBQUsscUJBQXFCLEtBQUs7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixLQUFLLFdBQVcsT0FBTztBQUNwRCxtQkFBbUIsS0FBSztBQUN4QixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsS0FBSyxjQUFjLFdBQVc7QUFDM0QsbUJBQW1CLEtBQUs7QUFDeEIsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEtBQUssd0JBQXdCLEtBQUs7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxVQUFVLE9BQU87QUFDdkQsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsWUFBWSxRQUFRO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxZQUFZLFFBQVE7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsVUFBVSxPQUFPO0FBQ3ZELG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxvQkFBb0IsUUFBUTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLGtCQUFrQixRQUFRO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsdUJBQXVCLFFBQVE7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsVUFBVSxPQUFPO0FBQ3ZELG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLFlBQVksUUFBUTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLFVBQVUsT0FBTztBQUN6RCxtQkFBbUIsUUFBUTtBQUMzQixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxZQUFZLFNBQVM7QUFDN0QsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVEsWUFBWSxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxZQUFZLFFBQVE7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLFVBQVUsT0FBTztBQUN6RCxtQkFBbUIsUUFBUTtBQUMzQixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVEsWUFBWSxTQUFTO0FBQzdELG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVEsWUFBWSxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxvQkFBb0I7QUFDL0QsMENBQTBDLG1CQUFtQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxVQUFVLE9BQU87QUFDekQsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxZQUFZLFNBQVM7QUFDN0QsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSx1QkFBdUIsUUFBUTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLG9CQUFvQixRQUFRO0FBQ3BFO0FBQ0EsdURBQXVELGdDQUFnQztBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLHNCQUFzQixRQUFRO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVEsWUFBWSxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFTLHFCQUFxQixTQUFTO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFTLFlBQVksU0FBUztBQUMvRDtBQUNBLCtDQUErQyx3QkFBd0I7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFNBQVMsV0FBVyxlQUFlO0FBQ3BFLG1CQUFtQixTQUFTO0FBQzVCLG1CQUFtQixlQUFlO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsU0FBUyxxQkFBcUIsU0FBUztBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyx3QkFBd0I7QUFDdkUsMENBQTBDLG1CQUFtQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFTLHFCQUFxQixTQUFTO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFNBQVMsV0FBVyxlQUFlO0FBQ3BFLG1CQUFtQixTQUFTO0FBQzVCLG1CQUFtQixlQUFlO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFTLFdBQVcsZUFBZTtBQUNwRSxtQkFBbUIsU0FBUztBQUM1QixtQkFBbUIsZUFBZTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxVQUFVLE9BQU8sV0FBVyxPQUFPO0FBQzNFLG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixPQUFPO0FBQzFCLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLHFCQUFxQixRQUFRO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxXQUFXLE9BQU87QUFDMUQsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLFVBQVUsT0FBTyxXQUFXLE9BQU87QUFDM0UsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUIsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLFdBQVcsT0FBTztBQUMxRCxtQkFBbUIsUUFBUTtBQUMzQixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxVQUFVLE9BQU87QUFDekQsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxVQUFVLE9BQU8sV0FBVyxPQUFPO0FBQzNFLG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixPQUFPO0FBQzFCLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVEsV0FBVyxPQUFPO0FBQzFELG1CQUFtQixRQUFRO0FBQzNCLG1C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LFdBQVc7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsV0FBVyxZQUFZLFdBQVc7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixNQUFNLFlBQVksTUFBTTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsV0FBVyxZQUFZLFdBQVc7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxxQkFBcUIsUUFBUTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsaUJBQWlCLFFBQVE7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsZ0JBQWdCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLG9CQUFvQixRQUFRO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxvQkFBb0IsUUFBUTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLE9BQU8sU0FBUyxFQUFFLE9BQU87QUFDL0QsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLFNBQVM7QUFDNUIsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxnQkFBZ0I7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLHVCQUF1QixRQUFRO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxvQkFBb0IsUUFBUTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsbUJBQW1CLFFBQVE7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLFdBQVcsVUFBVTtBQUMzRCxtQkFBbUIsUUFBUTtBQUMzQixtQkFBbUIsVUFBVTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEscUJBQXFCLFFBQVE7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsV0FBVyxVQUFVO0FBQzNELG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEscUJBQXFCLFFBQVE7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsV0FBVyxVQUFVO0FBQzNELG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEscUJBQXFCLFFBQVE7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQy8yQmE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qs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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc01BQXNNLFNBQVMsY0FBYyxZQUFZLEtBQUssSUFBSTtBQUNsUDtBQUNBO0FBQ0EscUJBQXFCOzs7Ozs7Ozs7OztBQzFMUjtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7Ozs7Ozs7Ozs7QUNoRU47QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZ0NBQWdDO0FBQ2hDLDZCQUE2QixtQkFBTyxDQUFDLHNFQUE2QjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDOzs7Ozs7Ozs7OztBQ2pIbkI7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsNEJBQTRCO0FBQzVCLDZCQUE2QixtQkFBTyxDQUFDLHNFQUE2QjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMElBQTBJLFlBQVksU0FBUyxTQUFTO0FBQ3hLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7Ozs7Ozs7Ozs7O0FDak9mO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELDJCQUEyQjtBQUMzQix1QkFBdUIsbUJBQU8sQ0FBQyx3REFBb0I7QUFDbkQsa0NBQWtDLG1CQUFPLENBQUMsMEVBQStCO0FBQ3pFLGtDQUFrQyxtQkFBTyxDQUFDLGdGQUFrQztBQUM1RSxrQkFBa0IsbUJBQU8sQ0FBQyxnREFBa0I7QUFDNUMsNEJBQTRCLG1CQUFPLENBQUMsOERBQXFCO0FBQ3pELG1DQUFtQyxtQkFBTyxDQUFDLDRFQUE0QjtBQUN2RSwrQkFBK0IsbUJBQU8sQ0FBQyxvRUFBd0I7QUFDL0Qsc0JBQXNCLG1CQUFPLENBQUMsa0RBQWU7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsWUFBWTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMElBQTBJLFlBQVksU0FBUyxTQUFTO0FBQ3hLO0FBQ0E7QUFDQSwyQkFBMkI7Ozs7Ozs7Ozs7O0FDN0xkO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9DQUFvQztBQUNuRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGFBQWEsbUJBQU8sQ0FBQyxzREFBaUI7QUFDdEMsYUFBYSxtQkFBTyxDQUFDLHdEQUFrQjtBQUN2QyxhQUFhLG1CQUFPLENBQUMsa0RBQWU7QUFDcEMsYUFBYSxtQkFBTyxDQUFDLDREQUFvQjtBQUN6QyxhQUFhLG1CQUFPLENBQUMsOERBQXFCO0FBQzFDLGFBQWEsbUJBQU8sQ0FBQyx3REFBa0I7QUFDdkMsYUFBYSxtQkFBTyxDQUFDLG9FQUF3QjtBQUM3QyxhQUFhLG1CQUFPLENBQUMsa0VBQXVCO0FBQzVDLGFBQWEsbUJBQU8sQ0FBQyxvREFBZ0I7QUFDckMsYUFBYSxtQkFBTyxDQUFDLDBEQUFtQjtBQUN4QyxhQUFhLG1CQUFPLENBQUMsb0VBQXdCO0FBQzdDLGFBQWEsbUJBQU8sQ0FBQyx3REFBa0I7QUFDdkMsYUFBYSxtQkFBTyxDQUFDLDhEQUFxQjtBQUMxQyxhQUFhLG1CQUFPLENBQUMsa0RBQWU7QUFDcEMsYUFBYSxtQkFBTyxDQUFDLG9FQUF3QjtBQUM3QyxhQUFhLG1CQUFPLENBQUMsNEVBQTRCO0FBQ2pELGFBQWEsbUJBQU8sQ0FBQyxzREFBaUI7QUFDdEMsYUFBYSxtQkFBTyxDQUFDLHNFQUF5QjtBQUM5QyxhQUFhLG1CQUFPLENBQUMsb0VBQXdCO0FBQzdDLGFBQWEsbUJBQU8sQ0FBQyw0REFBb0I7QUFDekMsYUFBYSxtQkFBTyxDQUFDLDhEQUFxQjtBQUMxQyxhQUFhLG1CQUFPLENBQUMsOERBQXFCO0FBQzFDLGFBQWEsbUJBQU8sQ0FBQyw0REFBb0I7QUFDekMsYUFBYSxtQkFBTyxDQUFDLGtEQUFlO0FBQ3BDLGFBQWEsbUJBQU8sQ0FBQyxnRUFBc0I7QUFDM0MsYUFBYSxtQkFBTyxDQUFDLGtEQUFlO0FBQ3BDLGFBQWEsbUJBQU8sQ0FBQyxrREFBZTs7Ozs7Ozs7Ozs7QUM1RHZCO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9DQUFvQztBQUNuRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGFBQWEsbUJBQU8sQ0FBQyxxQ0FBUztBQUM5QixhQUFhLG1CQUFPLENBQUMsdUNBQVU7QUFDL0IsYUFBYSxtQkFBTyxDQUFDLHFDQUFTOzs7Ozs7Ozs7OztBQ3BDakI7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZUFBZTtBQUNmLDBCQUEwQjtBQUMxQix1QkFBdUIsbUJBQU8sQ0FBQyx3REFBb0I7QUFDbkQsa0NBQWtDLG1CQUFPLENBQUMsMEVBQStCO0FBQ3pFLHVDQUF1QyxtQkFBTyxDQUFDLDBGQUF1QztBQUN0RiwrQkFBK0IsbUJBQU8sQ0FBQyw0RUFBZ0M7QUFDdkUsc0JBQXNCLG1CQUFPLENBQUMsMERBQXVCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsWUFBWTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLDhCQUE4QjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLHdCQUF3QjtBQUM1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDL0phO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9DQUFvQztBQUNuRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGFBQWEsbUJBQU8sQ0FBQywrREFBc0I7QUFDM0MsYUFBYSxtQkFBTyxDQUFDLDZFQUE2QjtBQUNsRCxhQUFhLG1CQUFPLENBQUMseUNBQVc7Ozs7Ozs7Ozs7O0FDcENuQjtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsS0FBSztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ25DYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztVQ3BDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7O1VFNUJBO1VBQ0E7VUFDQTtVQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2luZGV4LndlYi5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi52ZXJzaW9uLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL2NhY2hlL0FwaUNhY2hlUmVwb3NpdG9yeS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi9jYWNoZS9LZXlWYWx1ZUNhY2hlLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL2NhY2hlL0xSVUNhY2hlLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL2NhY2hlL2luZGV4LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL2NsaWVudC9PbHBDbGllbnRTZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi9jbGllbnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvdXRpbHMvRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL0Rvd25sb2FkTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi91dGlscy9GZXRjaE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvdXRpbHMvSFJOLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL0h0dHBFcnJvci5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi91dGlscy9SZXF1ZXN0QnVpbGRlckZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvdXRpbHMvVGlsZUtleS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi91dGlscy9VdWlkLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL2dldERhdGFTaXplVXRpbC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi91dGlscy9nZXRFbnZMb29rdXBVcmwuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvdXRpbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvdXRpbHMvdXNlckFnZW50LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9pbmRleC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL1JlcXVlc3RCdWlsZGVyLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvYXJ0aWZhY3QtYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvYXV0aG9yaXphdGlvbi1hcGktdjEuMS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL2Jsb2ItYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvYmxvYi52Mi5hcGkuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9jb25maWctYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvY292ZXJhZ2UtYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvaW5kZXgtYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvaW50ZXJhY3RpdmUtYXBpLXYxLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvbG9va3VwLWFwaS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL21ldGFkYXRhLWFwaS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL3B1Ymxpc2gtYXBpLXYyLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvcXVlcnktYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvc3RyZWFtLWFwaS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL3ZvbGF0aWxlLWJsb2ItYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2luZGV4LndlYi5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2FjaGUvTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NhY2hlL1F1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnkuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NhY2hlL2luZGV4LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvQXJ0aWZhY3RDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9DYXRhbG9nQ2xpZW50LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvQ2F0YWxvZ1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9DYXRhbG9nVmVyc2lvblJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9DYXRhbG9nc1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9Db25maWdDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9EYXRhUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L0luZGV4TGF5ZXJDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9JbmRleFF1ZXJ5UmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L0xheWVyVmVyc2lvbnNSZXF1ZXN0LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvUGFydGl0aW9uc1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9Qb2xsUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1F1YWRUcmVlSW5kZXhSZXF1ZXN0LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvUXVlcnlDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9TY2hlbWFEZXRhaWxzUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1NjaGVtYVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9TZWVrUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1N0YXRpc3RpY3NDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9TdGF0aXN0aWNzUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1N0cmVhbUxheWVyQ2xpZW50LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvU3Vic2NyaWJlUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1N1bW1hcnlSZXF1ZXN0LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvVGlsZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9VbnN1YnNjcmliZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9WZXJzaW9uZWRMYXllckNsaWVudC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1ZvbGF0aWxlTGF5ZXJDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9pbmRleC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL3V0aWxzL2dldFRpbGUuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL3V0aWxzL2luZGV4LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi91dGlscy92YWxpZGF0ZUJpbGxpbmdUYWcuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL3V0aWxzL3ZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2Uge1xuXHRcdHZhciBhID0gZmFjdG9yeSgpO1xuXHRcdGZvcih2YXIgaSBpbiBhKSAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnID8gZXhwb3J0cyA6IHJvb3QpW2ldID0gYVtpXTtcblx0fVxufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2xpYlwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbGliLnZlcnNpb25cIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjQgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxJQl9WRVJTSU9OID0gdm9pZCAwO1xuZXhwb3J0cy5MSUJfVkVSU0lPTiA9IFwiMi4wLjBcIjtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BcGlDYWNoZVJlcG9zaXRvcnkgPSB2b2lkIDA7XG4vKipcbiAqIENhY2hlcyB0aGUgYmFzZSBVUkxzIG9mIHRoZSBBUEkgdXNpbmcgYSBrZXktdmFsdWUgcGFpci5cbiAqIFRoZSBrZXkgZm9ybWF0IGlzIGA8aHJuPjo6PHNlcnZpY2VfbmFtZT46OjxzZXJ2aWNlVmVyc2lvbj46OmFwaWAuXG4gKi9cbmNsYXNzIEFwaUNhY2hlUmVwb3NpdG9yeSB7XG4gICAgY2FjaGU7XG4gICAgaHJuO1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgW1tBcGlDYWNoZVJlcG9zaXRvcnldXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYWNoZSBUaGUgW1tLZXlWYWx1ZUNhY2hlXV0gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGhybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIGZvciB3aGljaCB5b3Ugd2FudCB0byB1c2UgdGhlIFtbQXBpQ2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tBcGlDYWNoZVJlcG9zaXRvcnldXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYWNoZSwgaHJuKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgICAgICAgdGhpcy5ocm4gPSBocm4gPyBocm4udG9TdHJpbmcoKSA6IFwicGxhdGZvcm0tYXBpXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3JlcyBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBuYW1lIG9mIHRoZSBBUEkgc2VydmljZSBmb3Igd2hpY2ggeW91IG5lZWQgdGhlIGtleS12YWx1ZSBwYWlyLlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgc2VydmljZS5cbiAgICAgKiBAcGFyYW0gc2VydmljZVVybCBUaGUgYmFzZSBVUkwgb2YgdGhlIHNlcnZpY2UuXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1dChzZXJ2aWNlLCBzZXJ2aWNlVmVyc2lvbiwgc2VydmljZVVybCwgdHlwZSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZUtleSh0aGlzLmhybiwgc2VydmljZSwgc2VydmljZVZlcnNpb24sIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5wdXQoa2V5LCBzZXJ2aWNlVXJsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJhc2UgVVJMIGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIG5hbWUgb2YgdGhlIEFQSSBzZXJ2aWNlIGZvciB3aGljaCB5b3Ugd2FudCB0byBnZXQgdGhlIGJhc2UgVVJMLlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlVmVyc2lvbiBUaGUgc2VydmljZSB2ZXJzaW9uLlxuICAgICAqIEByZXR1cm4gVGhlIGJhc2UgVVJMIG9mIHRoZSBzZXJ2aWNlLCBvciB1bmRlZmluZWQgaWYgdGhlIGJhc2UgVVJMIGRvZXMgbm90IGV4aXN0LlxuICAgICAqL1xuICAgIGdldChzZXJ2aWNlLCBzZXJ2aWNlVmVyc2lvbiwgdHlwZSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZUtleSh0aGlzLmhybiwgc2VydmljZSwgc2VydmljZVZlcnNpb24sIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgY3JlYXRlS2V5KGhybiwgc2VydmljZSwgc2VydmljZVZlcnNpb24sIHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGAke2hybn06OiR7c2VydmljZX06OiR7c2VydmljZVZlcnNpb259Ojoke3R5cGV9YDtcbiAgICB9XG59XG5leHBvcnRzLkFwaUNhY2hlUmVwb3NpdG9yeSA9IEFwaUNhY2hlUmVwb3NpdG9yeTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5LZXlWYWx1ZUNhY2hlID0gdm9pZCAwO1xuY29uc3QgZ2V0RGF0YVNpemVVdGlsXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvZ2V0RGF0YVNpemVVdGlsXCIpO1xuY29uc3QgTFJVQ2FjaGVfMSA9IHJlcXVpcmUoXCIuL0xSVUNhY2hlXCIpO1xuY29uc3QgQllURVNfSU5fTUIgPSAxMDI0O1xuLyoqXG4gKiBBbiBpbi1tZW1vcnkgY2FjaGluZyBpbnN0YW5jZS5cbiAqXG4gKiBBbGwgdGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VzIHVzZSBpdCBmb3IgcmVhZGluZyBvciBjYWNoaW5nIGluZm9ybWF0aW9uLlxuICovXG5jbGFzcyBLZXlWYWx1ZUNhY2hlIHtcbiAgICBjYWNoZTtcbiAgICAvKipcbiAgICAgKiBDZXJhdGVzIHRoZSBgS2V5VmFsdWVDYWNoZWAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgS2V5VmFsdWVDYWNoZWAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTFJVQ2FjaGVfMS5MUlVDYWNoZShCWVRFU19JTl9NQiAqIEJZVEVTX0lOX01CICogMiwgZ2V0RGF0YVNpemVVdGlsXzEuZ2V0RGF0YVNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoaXMgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIHR5cGUuXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bDsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1dChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSB2YWx1ZSB0aGF0IHlvdSB3YW50IHRvIHJlbW92ZSBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsOyBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVtb3ZlKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBjYWNoZSBhbmQgcmVtb3ZlcyBhbGwgc3RvcmVkIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgY2FjaGUuXG4gICAgICpcbiAgICAgKiBJZiBgbmV3Q2FwYWNpdHlgIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBjYWNoZSBzaXplLFxuICAgICAqIGFsbCBpdGVtcyBhcmUgZXZpY3RlZCB1bnRpbCB0aGUgY2FjaGUgc2hyaW5rcyB0byBgbmV3Q2FwYWNpdHlgLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5ld0NhcGFjaXR5IFRoZSBuZXcgY2FwYWNpdHkgb2YgdGhpcyBjYWNoZSBpbiBNQi5cbiAgICAgKi9cbiAgICBzZXRDYXBhY2l0eShuZXdDYXBhY2l0eSkge1xuICAgICAgICB0aGlzLmNhY2hlLnNldENhcGFjaXR5KG5ld0NhcGFjaXR5ICogQllURVNfSU5fTUIgKiBCWVRFU19JTl9NQik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5IG9mIHRoZSBjYWNoZVxuICAgICAqIHRoYXQgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgdGhlIGNhY2hlIGluIE1CLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGNhcGFjaXR5IG9mIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXRDYXBhY2l0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0Q2FwYWNpdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlXG4gICAgICogdGhhdCBpcyB0aGUgc3VtIG9mIGFsbCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBzaXplIG9mIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRTaXplKCk7XG4gICAgfVxufVxuZXhwb3J0cy5LZXlWYWx1ZUNhY2hlID0gS2V5VmFsdWVDYWNoZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTFJVQ2FjaGUgPSBleHBvcnRzLkVudHJ5ID0gdm9pZCAwO1xuLyoqIEBoaWRkZW4gKi9cbmNsYXNzIEVudHJ5IHtcbiAgICBrZXk7XG4gICAgdmFsdWU7XG4gICAgc2l6ZTtcbiAgICBuZXdlcjtcbiAgICBvbGRlcjtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBzaXplLCBuZXdlciwgb2xkZXIpIHtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5uZXdlciA9IG5ld2VyO1xuICAgICAgICB0aGlzLm9sZGVyID0gb2xkZXI7XG4gICAgfVxufVxuZXhwb3J0cy5FbnRyeSA9IEVudHJ5O1xuLyoqXG4gKiBGaXhlZCBzaXplIGNhY2hlIHRoYXQgZXZpY3RzIGl0cyBlbnRyaWVzIGluIGxlYXN0LXJlY2VudGx5LXVzZWQgb3JkZXIgd2hlbiBpdCBvdmVyZmxvd3MuXG4gKiBNb2RlbGVkIGFmdGVyIHN0YW5kYXJkIEphdmFTY3JpcHQgYE1hcGAgb3RoZXJ3aXNlLlxuICovXG5jbGFzcyBMUlVDYWNoZSB7XG4gICAgbWF4Q2FwYWNpdHk7XG4gICAgc2l6ZUZ1bmN0aW9uO1xuICAgIGNhY2hlU2l6ZSA9IDA7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVybmFsIG1hcCBvYmplY3QgdGhhdCBrZWVwcyB0aGUga2V5LXZhbHVlIHBhaXJzIGFuZCB0aGVpciBvcmRlci5cbiAgICAgKi9cbiAgICBtYXAgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogVGhlIG5ld2VzdCBlbnRyeSwgaS5lLiB0aGUgbW9zdCByZWNlbnRseSB1c2VkIGl0ZW0uXG4gICAgICovXG4gICAgbmV3ZXN0RW50cnkgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvbGRlc3QgZW50cnksIGkuZS4gdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgaXRlbS5cbiAgICAgKi9cbiAgICBvbGRlc3RFbnRyeSA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBgTFJVQ2FjaGVgLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIFtbc2l6ZUZ1bmN0aW9uXV0gY2FuIGJlIHVzZWQgdG8gZmluZSB0dW5lIHRoZSBtZW1vcnkgY29uc3VtcHRpb24gb2YgYWxsIGNhY2hlZFxuICAgICAqIGVsZW1lbnRzLCB0aHVzIFtbY2FjaGVDYXBhY2l0eV1dIG1lYW5zIHRoZW4gbWVtb3J5IHVzZWQuIE90aGVyd2lzZSwgaWZcbiAgICAgKiBbW3NpemVGdW5jdGlvbl1dIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBbW2NhY2hlQ2FwYWNpdHldXSBhY2NvdW50cyBmb3IgdGhlIG1heGltdW1cbiAgICAgKiBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhY2hlQ2FwYWNpdHkgTnVtYmVyIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtYXhpbXVtIGNhY2hlIHNpemUsIG1heSBleHByZXNzXG4gICAgICogbnVtYmVyIG9mIGVudHJpZXMgb3IgbWVtb3J5IGNvbnN1bWVkIGluIGJ5dGVzL21lZ2FieXRlcyBkZXBlbmRpbmcgb24gW1tzaXplRnVuY3Rpb25dXS5cbiAgICAgKiBAcGFyYW0gc2l6ZUZ1bmN0aW9uIEEgZnVuY3Rpb24gZGV0ZXJtaW5pbmcgdGhlIHNpemUgcGVyIGVsZW1lbnQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWF4Q2FwYWNpdHksIHNpemVGdW5jdGlvbiA9ICgpID0+IDEpIHtcbiAgICAgICAgdGhpcy5tYXhDYXBhY2l0eSA9IG1heENhcGFjaXR5O1xuICAgICAgICB0aGlzLnNpemVGdW5jdGlvbiA9IHNpemVGdW5jdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlLCBpLmUuIHRoZSBzdW0gb2YgYWxsIHRoZSBzaXplcyBvZiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHNpemUgb2YgdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlU2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBjYXBhY2l0eSBvZiB0aGUgY2FjaGUsIGkuZS5cbiAgICAgKiB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB0aGF0IG1heSBiZSBjb25zdW1lZCBieSBjYWNoZSBpbiBNQlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGNhcGFjaXR5IG9mIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXRDYXBhY2l0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4Q2FwYWNpdHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG5ld2VzdCBlbnRyeSBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBOZXdlc3QgZW50cnkgaW4gdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIGdldE5ld2VzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3ZXN0RW50cnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG9sZGVzdCBlbnRyeSBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBOb3RlOiBEb2VzIG5vdCBwcm9tb3RlIHRoZSBvbGRlc3QgaXRlbSBhcyBtb3N0IHJlY2VudGx5IHVzZWQgaXRlbS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIE9sZGVzdCBlbnRyeSBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgZ2V0T2xkZXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbGRlc3RFbnRyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBjYXBhY2l0eSBvZiB0aGlzIGNhY2hlLiBJZiBgbmV3Q2FwYWNpdHlgIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBjYWNoZSBzaXplLFxuICAgICAqIGFsbCBpdGVtcyB3aWxsIGJlIGV2aWN0ZWQgdW50aWwgdGhlIGNhY2hlIHNocmlua3MgdG8gYG5ld0NhcGFjaXR5YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXdDYXBhY2l0eSBUaGUgbmV3IGNhcGFjaXR5IG9mIHRoaXMgY2FjaGUuXG4gICAgICovXG4gICAgc2V0Q2FwYWNpdHkobmV3Q2FwYWNpdHkpIHtcbiAgICAgICAgdGhpcy5tYXhDYXBhY2l0eSA9IG5ld0NhcGFjaXR5O1xuICAgICAgICB0aGlzLmV2aWN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgb3IgdXBkYXRlcyBhIGtleS92YWx1ZSBwYWlyIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdGVkIGluIHRoZSBjYWNoZSwgaXQgd2lsbCBiZSB1cGRhdGVkIGFuZCBwcm9tb3RlZCB0byB0aGUgbW9zdCByZWNlbnRseVxuICAgICAqIHVzZWQgaXRlbS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBrZXkgZGlkbid0IGV4aXN0IGluIHRoZSBjYWNoZSwgaXQgd2lsbCBiZSBpbnNlcnRlZCBhcyBtb3N0IHJlY2VudGx5IHVzZWQgaXRlbS4gQW5cbiAgICAgKiBldmljdGlvbiBvZiB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtIHRha2VzIHBsYWNlIGlmIHRoZSBjYWNoZSBleGNlZWRlZCBpdHMgY2FwYWNpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBrZXktdmFsdWUgcGFpciB0byBpbnNlcnQgb3IgdXBkYXRlLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBrZXktdmFsdWUgcGFpciB0byBpbnNlcnQgb3IgdXBkYXRlLlxuICAgICAqIEB0aHJvd3MgQW4gZXJyb3IgaWYgdmFsdWUgc2l6ZSBpcyBiaWdnZXIgdGhhbiBjYWNoZSBzaXplLlxuICAgICAqL1xuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlU2l6ZSA9IHRoaXMuc2l6ZUZ1bmN0aW9uKHZhbHVlKTtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlU2l6ZSA9IHRoaXMuY2FjaGVTaXplIC0gZW50cnkuc2l6ZSArIHZhbHVlU2l6ZTtcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICBlbnRyeS5zaXplID0gdmFsdWVTaXplO1xuICAgICAgICAgICAgdGhpcy5wcm9tb3RlRW50cnkoZW50cnkpO1xuICAgICAgICAgICAgdGhpcy5ldmljdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA+IHRoaXMubWF4Q2FwYWNpdHkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yLiBWYWx1ZSBzaXplICgke3ZhbHVlU2l6ZX0pIGlzIHRvIGJpZyBmb3IgY2FjaGUgaXQgKCR7dGhpcy5tYXhDYXBhY2l0eX0pLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cnkgPSBuZXcgRW50cnkoa2V5LCB2YWx1ZSwgdmFsdWVTaXplLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hcC5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXdlc3RFbnRyeSA9IHRoaXMub2xkZXN0RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5ld2VzdEVudHJ5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld2VzdCA9IHRoaXMubmV3ZXN0RW50cnk7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5Lm9sZGVyID0gdGhpcy5uZXdlc3RFbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgbmV3ZXN0Lm5ld2VyID0gZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3ZXN0RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoa2V5LCBlbnRyeSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlU2l6ZSArPSB2YWx1ZVNpemU7XG4gICAgICAgICAgICB0aGlzLmV2aWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiBhIGtleS92YWx1ZSBwYWlyIGlzIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUga2V5LXZhbHVlIHBhaXIgaXMgaW4gdGhlIGNhY2hlLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5oYXMoa2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAga2V5IGluIHRoZSBjYWNoZSBhbmQgcmV0dXJucyB0aGUgYXNzb2NpYXRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIHZhbHVlLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUga2V5LXZhbHVlIHBhaXIgaXMgbm90IGluIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvbW90ZUVudHJ5KGVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGNhY2hlIGFuZCByZW1vdmVzIGFsbCBzdG9yZWQga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLm5ld2VzdEVudHJ5ID0gdGhpcy5vbGRlc3RFbnRyeSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FjaGVTaXplID0gMDtcbiAgICAgICAgdGhpcy5tYXAuY2xlYXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhwbGljaXRseSByZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAbm90ZTogVGhpcyBpcyBhbiBleHBsaWNpdCByZW1vdmFsLCB0aHVzLCB0aGUgZXZpY3Rpb24gY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBrZXktdmFsdWUgcGFpciB0byBkZWxldGUuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBrZXktdmFsdWUgcGFpciBleGlzdGVkIGFuZCB3YXMgZGVsZXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMubWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVsZXRlRW50cnkoZW50cnkpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGV2aWN0KCkge1xuICAgICAgICB3aGlsZSAodGhpcy5vbGRlc3RFbnRyeSAhPT0gbnVsbCAmJiB0aGlzLmNhY2hlU2l6ZSA+IHRoaXMubWF4Q2FwYWNpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2aWN0ZWQgPSB0aGlzLmV2aWN0T2xkZXN0KCk7XG4gICAgICAgICAgICBpZiAoZXZpY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGV2aWN0T2xkZXN0KCkge1xuICAgICAgICBpZiAodGhpcy5vbGRlc3RFbnRyeSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbVRvUmVtb3ZlID0gdGhpcy5vbGRlc3RFbnRyeTtcbiAgICAgICAgICAgIHRoaXMub2xkZXN0RW50cnkgPSBpdGVtVG9SZW1vdmUubmV3ZXI7XG4gICAgICAgICAgICBpZiAoaXRlbVRvUmVtb3ZlLm5ld2VyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaXRlbVRvUmVtb3ZlLm5ld2VyLm9sZGVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWFwLmRlbGV0ZShpdGVtVG9SZW1vdmUua2V5KTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVTaXplIC09IGl0ZW1Ub1JlbW92ZS5zaXplO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1Ub1JlbW92ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm9tb3RlRW50cnkoZW50cnkpIHtcbiAgICAgICAgaWYgKGVudHJ5ID09PSB0aGlzLm5ld2VzdEVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gYWxyZWFkeSBuZXdlc3QsIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgLy8gcmUtbGluayBuZXdlciBhbmQgb2xkZXIgaXRlbXNcbiAgICAgICAgaWYgKGVudHJ5Lm5ld2VyKSB7XG4gICAgICAgICAgICBlbnRyeS5uZXdlci5vbGRlciA9IGVudHJ5Lm9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeS5vbGRlcikge1xuICAgICAgICAgICAgZW50cnkub2xkZXIubmV3ZXIgPSBlbnRyeS5uZXdlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkgPT09IHRoaXMub2xkZXN0RW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMub2xkZXN0RW50cnkgPSBlbnRyeS5uZXdlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZS1saW5rIG91cnNlbHZlc1xuICAgICAgICBlbnRyeS5uZXdlciA9IG51bGw7XG4gICAgICAgIGVudHJ5Lm9sZGVyID0gdGhpcy5uZXdlc3RFbnRyeTtcbiAgICAgICAgLy8gZmluYWxseSwgc2V0IG91cnNlbHZlcyBhcyB0aGUgbmV3ZXN0IGVudHJ5XG4gICAgICAgIGlmICh0aGlzLm5ld2VzdEVudHJ5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdlc3QgPSB0aGlzLm5ld2VzdEVudHJ5O1xuICAgICAgICAgICAgbmV3ZXN0Lm5ld2VyID0gZW50cnk7XG4gICAgICAgICAgICB0aGlzLm5ld2VzdEVudHJ5ID0gZW50cnk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlRW50cnkoZW50cnkpIHtcbiAgICAgICAgaWYgKGVudHJ5ID09PSB0aGlzLm5ld2VzdEVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLm5ld2VzdEVudHJ5ID0gZW50cnkub2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZW50cnkubmV3ZXIpIHtcbiAgICAgICAgICAgIGVudHJ5Lm5ld2VyLm9sZGVyID0gZW50cnkub2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5ID09PSB0aGlzLm9sZGVzdEVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLm9sZGVzdEVudHJ5ID0gZW50cnkubmV3ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZW50cnkub2xkZXIpIHtcbiAgICAgICAgICAgIGVudHJ5Lm9sZGVyLm5ld2VyID0gZW50cnkubmV3ZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZVNpemUgLT0gZW50cnkuc2l6ZTtcbiAgICB9XG59XG5leHBvcnRzLkxSVUNhY2hlID0gTFJVQ2FjaGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9MUlVDYWNoZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQXBpQ2FjaGVSZXBvc2l0b3J5XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9LZXlWYWx1ZUNhY2hlXCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5PbHBDbGllbnRTZXR0aW5ncyA9IHZvaWQgMDtcbmNvbnN0IEtleVZhbHVlQ2FjaGVfMSA9IHJlcXVpcmUoXCIuLi9jYWNoZS9LZXlWYWx1ZUNhY2hlXCIpO1xuY29uc3QgRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyXCIpO1xuLyoqXG4gKiDQoW9uZmlndXJlcyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBwbGF0Zm9ybSBjbGllbnRzIChmb3IgZXhhbXBsZSwgW1tDYXRhbG9nQ2xpZW50XV0gb3IgW1tWZXJzaW9uZWRMYXllckNsaWVudF1dKS5cbiAqL1xuY2xhc3MgT2xwQ2xpZW50U2V0dGluZ3Mge1xuICAgIGtleVZhbHVlQ2FjaGU7XG4gICAgZ2V0VmFsaWRUb2tlbjtcbiAgICBlbnY7XG4gICAgZG07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBbW09scENsaWVudFNldHRpbmdzXV0gY2xhc3MuXG4gICAgICogQHJldHVybiBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmdldFZhbGlkVG9rZW4gPSBwYXJhbXMuZ2V0VG9rZW47XG4gICAgICAgIHRoaXMuZW52ID0gcGFyYW1zLmVudmlyb25tZW50O1xuICAgICAgICB0aGlzLmRtID0gcGFyYW1zLmRtIHx8IG5ldyBEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXJfMS5EYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIoKTtcbiAgICAgICAgdGhpcy5rZXlWYWx1ZUNhY2hlID0gbmV3IEtleVZhbHVlQ2FjaGVfMS5LZXlWYWx1ZUNhY2hlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZG93bmxvYWQgbWFuYWdlciBmb3IgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBbW0Rvd25sb2FkTWFuYWdlcl1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGdldCBkb3dubG9hZE1hbmFnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhc3luY2hyb25vdXMgY2FsbGJhY2sgdXNlZCB0byByZXR1cm4gYSBgUHJvbWlzZWAgd2l0aCB0aGUgYWNjZXNzIHRva2VuIGZvciByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGBQcm9taXNlYCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4gc3RyaW5nIGZvciByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBnZXQgdG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkVG9rZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGVudmlyb25tZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IHRoZSBVUkwgb2YgdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAgICAgKiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhIFVSTCBvZiB5b3VyIGN1c3RvbSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3RyaW5nIHdpdGggdGhlIGVudmlyb25tZW50IG5hbWUgb3IgdGhlIFVSTCBvZiB5b3VyIGxvY2FsIGVudmlyb25tZW50LlxuICAgICAqL1xuICAgIGdldCBlbnZpcm9ubWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW52O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWNoZXMgdXNpbmcgYSBrZXktdmFsdWUgcGFpci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBbW0tleVZhbHVlQ2FjaGVdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleVZhbHVlQ2FjaGU7XG4gICAgfVxufVxuZXhwb3J0cy5PbHBDbGllbnRTZXR0aW5ncyA9IE9scENsaWVudFNldHRpbmdzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vT2xwQ2xpZW50U2V0dGluZ3NcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vY2FjaGVcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3V0aWxzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jbGllbnRcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRhdGFTdG9yZURvd25sb2FkTWFuYWdlciA9IHZvaWQgMDtcbmNvbnN0IEh0dHBFcnJvcl8xID0gcmVxdWlyZShcIi4vSHR0cEVycm9yXCIpO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuL2luZGV4XCIpO1xuY29uc3QgdXNlckFnZW50XzEgPSByZXF1aXJlKFwiLi91c2VyQWdlbnRcIik7XG4vKiogQGludGVybmFsXG4gKiAnRGVmZXJyZWRQcm9taXNlJyB0YWtlcyBhbiBleGVjdXRvciBmdW5jdGlvbiBmb3IgZXhlY3V0aW5nIGl0IGxhdGVyLCB3aGVuIFtbZXhlY11dIGlzIGNhbGxlZC5cbiAqIFRoaXMgY2xhc3MgYWxsb3dzIHdyYXBwaW5nIG90aGVyIHByb21pc2VzIG9yIGxvbmcgcnVubmluZyBmdW5jdGlvbnMgZm9yIGxhdGVyIGV4ZWN1dGlvbi5cbiAqL1xuY2xhc3MgRGVmZXJyZWRQcm9taXNlIHtcbiAgICBleGVjdXRvcjtcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBwcm9taXNlIHRvIHN0b3JlIHRoZSBkZWZlcnJlZCBleGVjdXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwcm9taXNlO1xuICAgIHJlc29sdmVGdW5jO1xuICAgIHJlamVjdEZ1bmM7XG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yO1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVGdW5jID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0RnVuYyA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gYGV4ZWNgIGlzIGNhbGxlZCB0aGUgZGVmZXJyZWQgZXhlY3V0b3IgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG4gICAgICovXG4gICAgZXhlYygpIHtcbiAgICAgICAgdGhpcy5leGVjdXRvcigpLnRoZW4odGhpcy5yZXNvbHZlRnVuYykuY2F0Y2godGhpcy5yZWplY3RGdW5jKTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbW0Rvd25sb2FkTWFuYWdlcl1dIGludGVyZmFjZSByZXF1ZXN0ZWQgYnkgdGhlIGBkYXRhc3RvcmUtYXBpYCBtb2R1bGVcbiAqIGZvciBmZXRjaGluZyBkYXRhIGZyb20gdGhlIGJhY2tlbmQgb3Igc2VuZGluZyByZXF1ZXN0cyB0byB0aGUgYmFja2VuZC5cbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzIHlvdSB0byBmZXRjaCBibG9iIG9yIEpTT04gZGF0YSB3aXRoIGFib3J0aW5nIG9yIHJlLXNlbmRpbmcgKG9uIHRpbWVvdXRzKSBtZWNoYW5pc21zXG4gKiB0aGF0IGxpbWl0IG1heGltdW0gcGFyYWxsZWwgcmVxdWVzdHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKlxuICogKiBMaW1pdHMgdGhlIG51bWJlciBvZiBwYXJhbGxlbCBkb3dubG9hZHMuIEl0IGlzIHVzZWZ1bCB3aGVuIHJlcXVlc3RpbmcgYSBsYXJnZSBudW1iZXIgb2YgVVJMcyB0aGF0XG4gKiAgIHdvdWxkIG90aGVyd2lzZSBzdGFsbCB0aGUgYnJvd3Nlci5cbiAqICogUmV0cmllcyB0aGUgZG93bmxvYWRzIHdpdGggYW4gaW5jcmVhc2luZyB0aW1lb3V0IG9uIEhUVFAgNTAzIHJlcGxpZXMuXG4gKi9cbmNsYXNzIERhdGFTdG9yZURvd25sb2FkTWFuYWdlciB7XG4gICAgZmV0Y2hGdW5jdGlvbjtcbiAgICBtYXhSZXRyaWVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIHRvIHdhaXQgYmV0d2VlbiByZXRyaWVzLiBUaGlzIHRpbWVvdXQgaXMgbXVsdGlwbGllZCB3aXRoIHRoZVxuICAgICAqIG51bWJlciBvZiByZXRyaWVzLiBGaXJzdCByZXRyeSB3YWl0cyBmb3IgMCBtcywgc2Vjb25kIHJldHJ5IGZvciA1MDAgbXMsIHRoaXJkIGZvciAxMDAwIG1zLCBhbmRcbiAgICAgKiBzbyBvbi5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmV0cnlUaW1lb3V0ID0gNTAwO1xuICAgIC8qKiBUaGUgbnVtYmVyIG9mIG1heGltdW0gcGFyYWxsZWwgZG93bmxvYWRzLiAqL1xuICAgIHN0YXRpYyBtYXhQYXJhbGxlbERvd25sb2FkcyA9IDE2O1xuICAgIGFjdGl2ZURvd25sb2FkQ291bnQgPSAwO1xuICAgIGRvd25sb2FkUXVldWUgPSBuZXcgQXJyYXkoKTtcbiAgICAvKipcbiAgICAgKiBSZXRyaWVzIHRoZSBkb3dubG9hZHMgd2l0aCBhbiBpbmNyZWFzaW5nIHRpbWVvdXQgb24gSFRUUCA1MDMgcmVwbGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmZXRjaEZ1bmN0aW9uIFRoZSB0eXBlIG9mIGZldGNoLlxuICAgICAqIEBwYXJhbSByZXRyeUNvdW50IGludCwgVGhlIGNvdW50ZXIgb2YgdHJpZXMgdG8gcmUtZmV0Y2ggcmVzcG9uc2UgYWZ0ZXIgdGhlIDUwMyByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gbWF4UmV0cmllcyBpbnQsIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0cmllcyB0byByZS1mZXRjaCBhZnRlciB0aGUgNTAzIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSB1cmwgc3RyaW5nLCBUaGUgVVJMIG9mIHRoZSBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0gaW5pdCBSZXF1ZXN0SW5pdCwgVGhlIGV4dHJhIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZmV0Y2hSZXBlYXRlZGx5KGZldGNoRnVuY3Rpb24sIHJldHJ5Q291bnQsIG1heFJldHJpZXMsIHVybCwgaW5pdCkge1xuICAgICAgICBjb25zdCBtYXhTdWNjZXNzUmVzcG9uc2VDb2RlID0gMjk5O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZ1bmN0aW9uKCgwLCB1c2VyQWdlbnRfMS5hZGRTZW50V2l0aFBhcmFtKSh1cmwpLCBpbml0KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZXF1ZXN0U2hvdWxkUmV0cnlPbkVycm9yKHJlc3BvbnNlLnN0YXR1cykgfHxcbiAgICAgICAgICAgICAgICByZXRyeUNvdW50ID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDw9IG1heFN1Y2Nlc3NSZXNwb25zZUNvZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSBpbmRleF8xLlNUQVRVU19DT0RFUy5GT1VORCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZVRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBcIiB8IEluZm86IFwiICsgcmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgSHR0cEVycm9yXzEuSHR0cEVycm9yKHJlc3BvbnNlLnN0YXR1cywgZXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIuaGFzT3duUHJvcGVydHkoXCJpc0NhbmNlbGxlZFwiKSB8fFxuICAgICAgICAgICAgICAgIChlcnIuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpICYmIGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgfHxcbiAgICAgICAgICAgICAgICByZXRyeUNvdW50ID4gbWF4UmV0cmllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIud2FpdEZvcihEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIucmV0cnlUaW1lb3V0ICogcmV0cnlDb3VudCkudGhlbigoKSA9PiBEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIuZmV0Y2hSZXBlYXRlZGx5KGZldGNoRnVuY3Rpb24sIHJldHJ5Q291bnQgKyAxLCBtYXhSZXRyaWVzLCB1cmwsIGluaXQpKTtcbiAgICB9XG4gICAgc3RhdGljIHJlcXVlc3RTaG91bGRSZXRyeU9uRXJyb3IoY29kZSkge1xuICAgICAgICByZXR1cm4gKChjb2RlID49IGluZGV4XzEuU1RBVFVTX0NPREVTLklOVEVSTkFMX1NFUlZFUl9FUlJPUiAmJlxuICAgICAgICAgICAgY29kZSA8PSBpbmRleF8xLlNUQVRVU19DT0RFUy5ORVRXT1JLX0NPTk5FQ1RfVElNRU9VVCkgfHxcbiAgICAgICAgICAgIGNvZGUgPT09IGluZGV4XzEuU1RBVFVTX0NPREVTLlRPX01BTllfUkVRVUVTVFMpO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgd2FpdEZvcihtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBbW0RhdGFTdG9yZURvd25sb2FkTWFuYWdlcl1dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZldGNoRnVuY3Rpb24gVGhlIGRlZmF1bHQgZmV0Y2ggZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIG1heFJldHJpZXMgVGhlIG1heGltdW0gYW1vdW50IG9mIHRyaWVzIHRvIHJlLWZldGNoIGEgcmVzb3VyY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXJdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihmZXRjaEZ1bmN0aW9uID0gZmV0Y2gsIG1heFJldHJpZXMgPSA1KSB7XG4gICAgICAgIHRoaXMuZmV0Y2hGdW5jdGlvbiA9IGZldGNoRnVuY3Rpb247XG4gICAgICAgIHRoaXMubWF4UmV0cmllcyA9IG1heFJldHJpZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERvd25sb2FkcyBhIFVSTCBhbmQgcmV0dXJucyB0aGUgYFJlc3BvbnNlYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IG1lcmdlIG11bHRpcGxlIHJlcXVlc3RzIHRvIHRoZSBzYW1lIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0aGF0IHlvdSB3YW50IHRvIGRvd25sb2FkLlxuICAgICAqIEBwYXJhbSBpbml0IEV4dHJhIHBhcmFtZXRlcnMgZm9yIHRoZSBkb3dubG9hZC5cbiAgICAgKiBAcmV0dXJuIFRoZSBVUkwgdGhhdCBpcyB1c2VkIHRvIGRvd25sb2FkIGRhdGEuXG4gICAgICovXG4gICAgYXN5bmMgZG93bmxvYWQodXJsLCBpbml0KSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvd25sb2FkQ291bnQgPj1cbiAgICAgICAgICAgIERhdGFTdG9yZURvd25sb2FkTWFuYWdlci5tYXhQYXJhbGxlbERvd25sb2Fkcykge1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWRQcm9taXNlKCgpID0+IHRoaXMuZG9Eb3dubG9hZCh1cmwsIGluaXQpKTtcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRRdWV1ZS5wdXNoKGRlZmVycmVkKTtcbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRvRG93bmxvYWQodXJsLCBpbml0KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Eb3dubG9hZCh1cmwsIGluaXQpIHtcbiAgICAgICAgKyt0aGlzLmFjdGl2ZURvd25sb2FkQ291bnQ7XG4gICAgICAgIHJldHVybiBEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIuZmV0Y2hSZXBlYXRlZGx5KHRoaXMuZmV0Y2hGdW5jdGlvbiwgMCwgdGhpcy5tYXhSZXRyaWVzLCB1cmwsIGluaXQpXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25Eb3dubG9hZERvbmUoKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChhc3luYyAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRG93bmxvYWREb25lKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uRG93bmxvYWREb25lKCkge1xuICAgICAgICAtLXRoaXMuYWN0aXZlRG93bmxvYWRDb3VudDtcbiAgICAgICAgdGhpcy5leGVjRGVmZXJyZWREb3dubG9hZCgpO1xuICAgIH1cbiAgICBleGVjRGVmZXJyZWREb3dubG9hZCgpIHtcbiAgICAgICAgY29uc3QgZnV0dXJlID0gdGhpcy5kb3dubG9hZFF1ZXVlLnBvcCgpO1xuICAgICAgICBpZiAoZnV0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmdXR1cmUuZXhlYygpO1xuICAgIH1cbn1cbmV4cG9ydHMuRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyID0gRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRhdGFTdG9yZVJlcXVlc3RCdWlsZGVyID0gdm9pZCAwO1xuY29uc3QgbGliX3ZlcnNpb25fMSA9IHJlcXVpcmUoXCIuLi8uLi9saWIudmVyc2lvblwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIEFkZHMgYmVhcmVyIHRva2VuIHRvIHRoZSByZXF1ZXN0IGhlYWRlcnNcbiAqIEBwYXJhbSBnZXRCZWFyZXJUb2tlbiBhc3luYyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdG9rZW4gc3RyaW5nLlxuICogQHBhcmFtIGluaXQgcGFyYW1zIHRvIHRoZSByZXF1ZXN0LiBAc2VlIFJlcXVlc3RJbml0IGludGVyZmFjZS5cbiAqXG4gKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdXBkYXRlZCByZXF1ZXN0IHBhcmFtcyAod2l0aCBhZGRlZCB0b2tlbiB0byB0aGUgaGVhZGVycykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFkZEJlYXJlclRva2VuKGdldEJlYXJlclRva2VuLCBpbml0KSB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRCZWFyZXJUb2tlbigpO1xuICAgIGlmIChpbml0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gaWYgZW1wdHkgUmVxdWVzdEluaXQsIGp1c3QgY3JlYXRlIG5ldyBvbmUgYW5kIGFkZCBCZWFyZXIgcm9rZW4gdG8gdGhlIGhlYWRlcnNcbiAgICAgICAgaW5pdCA9IHt9O1xuICAgICAgICBpbml0LmhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgICBpbml0LmhlYWRlcnMuYXBwZW5kKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIiArIHRva2VuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIGNvbnZlcnQgaW5pdC5oZWFkZXJzIHRvIHRoZSBIZWFkZXJzIGlmIHJlY2VpdmVkIGEgcGxhaW4gb2JqZWN0XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgICAgICAvLyBhZGRpbmcgdG9rZW4gdG8gdGhlIGhlYWRlcnNcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgdG9rZW4pO1xuICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGluaXQpO1xufVxuLyoqXG4gKiBBZGRzIHVzZXItYWdlbnQgdG8gdGhlIHJlcXVlc3QgaGVhZGVyc1xuICogQHBhcmFtIGluaXQgcGFyYW1zIHRvIHRoZSByZXF1ZXN0LiBAc2VlIFJlcXVlc3RJbml0IGludGVyZmFjZS5cbiAqXG4gKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdXBkYXRlZCByZXF1ZXN0IHBhcmFtcyAod2l0aCBhZGRlZCB1c2VyLWFnZW50IHRvIHRoZSBoZWFkZXJzKS5cbiAqL1xuZnVuY3Rpb24gYWRkVXNlckFnZW50KGluaXQpIHtcbiAgICBjb25zdCBVU0VSX0FHRU5UID0gYE9MUC1UUy1TREsvJHtsaWJfdmVyc2lvbl8xLkxJQl9WRVJTSU9OfWA7XG4gICAgaWYgKGluaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBpZiBlbXB0eSBSZXF1ZXN0SW5pdCwganVzdCBjcmVhdGUgbmV3IG9uZSBhbmQgYWRkIHVzZXItYWdlbnQgdG8gdGhlIGhlYWRlcnNcbiAgICAgICAgaW5pdCA9IHt9O1xuICAgICAgICBpbml0LmhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gY29udmVydCBpbml0LmhlYWRlcnMgdG8gdGhlIEhlYWRlcnMgaWYgcmVjZWl2ZWQgYSBwbGFpbiBvYmplY3RcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycyk7XG4gICAgICAgIGluaXQuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgfVxuICAgIHJldHVybiBpbml0O1xufVxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBbW1JlcXVlc3RCdWlsZGVyXV0gYW5kIHRoZSBgZG93bmxvYWRCbG9iYCBhbmQgYGRvd25sb2FkYCBtZXRob2RzLlxuICogSXQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIFtbUmVxdWVzdEJ1aWxkZXJdXSBpbnN0YW5jZSB3aXRoIGEgYmFzZSBVUkwgb2YgYSBzZXJ2aWNlLlxuICovXG5jbGFzcyBEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlciBleHRlbmRzIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuUmVxdWVzdEJ1aWxkZXIge1xuICAgIGRvd25sb2FkTWFuYWdlcjtcbiAgICBnZXRCZWFyZXJUb2tlbjtcbiAgICBhYm9ydFNpZ25hbDtcbiAgICAvKipcbiAgICAgKiBDZXJhdGVzIHRoZSBbW0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG93bmxvYWRNYW5hZ2VyIFRoZSBjb25maWd1cmVkIGluc3RhbmNlIG9mIHRoZSBbW0Rvd25sb2FkTWFuYWdlcl1dIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBZb3UgY2FuIHVzZSBvdXIgZGVmYXVsdCBgRGF0YXN0b3JlRG93bmxvYWRNYW5hZ2VyYCBvciBjcmVhdGUgeW91ciBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0gYmFzZVVybCBUaGUgVVJMIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZ2V0QmVhcmVyVG9rZW4gUmV0cmlldmVzIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgW1tEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcl1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRvd25sb2FkTWFuYWdlciwgYmFzZVVybCwgZ2V0QmVhcmVyVG9rZW4sIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIC8qKiBUaGUgVVJMIHN0cmluZy4gKi9cbiAgICAgICAgc3VwZXIoYmFzZVVybCk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyID0gZG93bmxvYWRNYW5hZ2VyO1xuICAgICAgICB0aGlzLmdldEJlYXJlclRva2VuID0gZ2V0QmVhcmVyVG9rZW47XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwgPSBhYm9ydFNpZ25hbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWRzIGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgVVJMLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhIHRoYXQgeW91IHdhbnQgdG8gZG93bmxvYWQuXG4gICAgICogQHBhcmFtIGluaXQgVGhlIGhlbHBlciBvYmplY3QgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBnZW5lcmljcy5cbiAgICAgKi9cbiAgICBhc3luYyBkb3dubG9hZCh1cmwsIGluaXQpIHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmFkZEJlYXJlclRva2VuKGluaXQpO1xuICAgICAgICBvcHRpb25zID0gdGhpcy5hZGRVc2VyQWdlbnQob3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLmFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5hZGRBYm9ydFNpZ25hbChpbml0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZE1hbmFnZXJcbiAgICAgICAgICAgIC5kb3dubG9hZCh1cmwsIG9wdGlvbnMpXG4gICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiByZXN1bHQuanNvbigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWRzIHRoZSBibG9iIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgYmxvYiBkYXRhIHRoYXQgeW91IHdhbnQgdG8gZG93bmxvYWQuXG4gICAgICogQHBhcmFtIGluaXQgVGhlIGhlbHBlciBvYmplY3QgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm4gVGhlIGJsb2IgZGF0YS5cbiAgICAgKi9cbiAgICBhc3luYyBkb3dubG9hZEJsb2IodXJsLCBpbml0KSB7XG4gICAgICAgIGxldCBvcHRpb25zID0gYXdhaXQgdGhpcy5hZGRCZWFyZXJUb2tlbihpbml0KTtcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMuYWRkVXNlckFnZW50KG9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5hYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuYWRkQWJvcnRTaWduYWwoaW5pdClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRNYW5hZ2VyLmRvd25sb2FkKHVybCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGFzeW5jIGFkZEJlYXJlclRva2VuKGluaXQpIHtcbiAgICAgICAgcmV0dXJuIGFkZEJlYXJlclRva2VuKHRoaXMuZ2V0QmVhcmVyVG9rZW4sIGluaXQpO1xuICAgIH1cbiAgICBhZGRVc2VyQWdlbnQoaW5pdCkge1xuICAgICAgICByZXR1cm4gYWRkVXNlckFnZW50KGluaXQpO1xuICAgIH1cbiAgICBhZGRBYm9ydFNpZ25hbChpbml0KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBpbml0IHx8IHt9O1xuICAgICAgICBvcHRpb25zLnNpZ25hbCA9IHRoaXMuYWJvcnRTaWduYWw7XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbn1cbmV4cG9ydHMuRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIgPSBEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRmV0Y2hPcHRpb25zID0gdm9pZCAwO1xuLyoqXG4gKiBFbnVtZXJhdGVzIHRoZSBmZXRjaCBvcHRpb24gdGhhdCBjb250cm9scyBob3cgcmVxdWVzdHMgYXJlIGhhbmRsZWQuXG4gKi9cbnZhciBGZXRjaE9wdGlvbnM7XG4oZnVuY3Rpb24gKEZldGNoT3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIEEgZGVmYXVsdCBvcHRpb24uIFF1ZXJpZXMgdGhlIG5ldHdvcmsgaWYgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3RcbiAgICAgKiBmb3VuZCBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgRmV0Y2hPcHRpb25zW0ZldGNoT3B0aW9uc1tcIk9ubGluZUlmTm90Rm91bmRcIl0gPSAwXSA9IFwiT25saW5lSWZOb3RGb3VuZFwiO1xuICAgIC8qKlxuICAgICAqIFNraXBzIGNhY2hlIGxvb2t1cHMgYW5kIHF1ZXJpZXMgdGhlIG5ldHdvcmsgcmlnaHQgYXdheS5cbiAgICAgKi9cbiAgICBGZXRjaE9wdGlvbnNbRmV0Y2hPcHRpb25zW1wiT25saW5lT25seVwiXSA9IDFdID0gXCJPbmxpbmVPbmx5XCI7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbW1lZGlhdGVseSBpZiBhIGNhY2hlIGxvb2t1cCBmYWlscy5cbiAgICAgKi9cbiAgICBGZXRjaE9wdGlvbnNbRmV0Y2hPcHRpb25zW1wiQ2FjaGVPbmx5XCJdID0gMl0gPSBcIkNhY2hlT25seVwiO1xufSkoRmV0Y2hPcHRpb25zIHx8IChleHBvcnRzLkZldGNoT3B0aW9ucyA9IEZldGNoT3B0aW9ucyA9IHt9KSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkhSTiA9IHZvaWQgMDtcbi8qKlxuICogQ29udGFpbnMgYSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgJm5kYXNoOyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciByZXNvdXJjZXMgc3VjaCBhcyBjYXRhbG9ncywgc2NoZW1hcywgYW5kIHBpcGVsaW5lcy5cbiAqL1xuY2xhc3MgSFJOIHtcbiAgICBkYXRhO1xuICAgIHN0YXRpYyBQQVJUSVRJT05fUE9TID0gMTtcbiAgICBzdGF0aWMgU0VSVklDRV9QT1MgPSAyO1xuICAgIHN0YXRpYyBSRUdJT05fUE9TID0gMztcbiAgICBzdGF0aWMgQUNDT1VOVF9QT1MgPSA0O1xuICAgIHN0YXRpYyBSRVNPVVJDRV9QT1MgPSA1O1xuICAgIHN0YXRpYyBFTlRSSUVTX0NPVU5UID0gSFJOLlJFU09VUkNFX1BPUyArIDE7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBIUk4gZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBIUk4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBgaHJuOmhlcmU6ZGF0YTo6OmV4YW1wbGUtY2F0YWxvZ2BcbiAgICAgKlxuICAgICAqIEBwYXJhbSBocm4gVGhlIEhSTiBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgbmV3IEhSTi5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhocm4pIHtcbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gYWxzbyBhbGxvdyBodHRwIGFuZCBodHRwcyBhcyAnY2F0YWxvZy11cmwnIGxvY2FsIFVSTHNcbiAgICAgICAgaWYgKGhybi5zdGFydHNXaXRoKFwiaHR0cDpcIikgfHwgaHJuLnN0YXJ0c1dpdGgoXCJodHRwczpcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSFJOKHtcbiAgICAgICAgICAgICAgICBwYXJ0aXRpb246IFwiY2F0YWxvZy11cmxcIixcbiAgICAgICAgICAgICAgICBzZXJ2aWNlOiBcImRhdGFzdG9yZVwiLFxuICAgICAgICAgICAgICAgIHJlZ2lvbjogXCJcIixcbiAgICAgICAgICAgICAgICBhY2NvdW50OiBcIlwiLFxuICAgICAgICAgICAgICAgIHJlc291cmNlOiBlbmNvZGVVUklDb21wb25lbnQoaHJuKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGhybi5zcGxpdChcIjpcIik7XG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA8IHRoaXMuRU5UUklFU19DT1VOVCB8fCBlbnRyaWVzWzBdICE9PSBcImhyblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEhSTlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhSTih7XG4gICAgICAgICAgICBwYXJ0aXRpb246IGVudHJpZXNbdGhpcy5QQVJUSVRJT05fUE9TXSxcbiAgICAgICAgICAgIHNlcnZpY2U6IGVudHJpZXNbdGhpcy5TRVJWSUNFX1BPU10sXG4gICAgICAgICAgICByZWdpb246IGVudHJpZXNbdGhpcy5SRUdJT05fUE9TXSxcbiAgICAgICAgICAgIGFjY291bnQ6IGVudHJpZXNbdGhpcy5BQ0NPVU5UX1BPU10sXG4gICAgICAgICAgICByZXNvdXJjZTogZW50cmllcy5zbGljZSh0aGlzLlJFU09VUkNFX1BPUykuam9pbihcIjpcIilcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSFJOIGJhc2VkIG9uIHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIFtbSFJORGF0YV1dLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBUeXBlU2NyaXB0XG4gICAgICogY29uc3QgbXlIcm4gPSBuZXcgSFJOKHtcbiAgICAgKiAgICAgcGFydGl0aW9uOiAnaGVyZS1kZXYnLFxuICAgICAqICAgICBzZXJ2aWNlOiAnZGF0YScsXG4gICAgICogICAgIHJlc291cmNlOiAnZXhhbXBsZS1jYXRhbG9nJ1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVXNlcyBbW2Zyb21TdHJpbmddXSB0byBjcmVhdGUgYW4gSFJOIGZyb20gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIGZyb20gdGhpcyBIUk4uXG4gICAgICogQHJldHVybiBUaGUgW1tIUk5dXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgSFJOIHRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBocm46cGFydGl0aW9uOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBIUk4uXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiAoXCJocm46XCIgK1xuICAgICAgICAgICAgdGhpcy5kYXRhLnBhcnRpdGlvbiArXG4gICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICB0aGlzLmRhdGEuc2VydmljZSArXG4gICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICAodGhpcy5kYXRhLnJlZ2lvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHRoaXMuZGF0YS5yZWdpb24pICtcbiAgICAgICAgICAgIFwiOlwiICtcbiAgICAgICAgICAgICh0aGlzLmRhdGEuYWNjb3VudCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHRoaXMuZGF0YS5hY2NvdW50KSArXG4gICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICB0aGlzLmRhdGEucmVzb3VyY2UpO1xuICAgIH1cbn1cbmV4cG9ydHMuSFJOID0gSFJOO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwRXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIFByb3ZpZGVzIG1vcmUgdXNhYmxlIGVycm9ycyBmcm9tIHRoZSBIRVJFIHBsYXRmb3JtIFNlcnZpY2VzLlxuICpcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiB0aGUgbWV0aG9kc1xuICogdG8gcHJvcGFnYXRlIGVycm9ycyB3aXRoIGFuIEhUVFAgc3RhdHVzIGNvZGUgYW5kIHdpdGggYSBtZXNzYWdlXG4gKiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgdGhlIHJlcXVlc3QuXG4gKiBUaGUgYEh0dHBFcnJvcmAgY2xhc3MgZXh0ZW5kcyBnZW5lcmljIGBFcnJvcmAgY2xhc3MgZnJvbSBWOCBhbmRcbiAqIGFkZHMgcHJvcGVydHkgY29kZSB0byB0aGUgSFRUUCBzdGF0dXNlcy5cbiAqL1xuY2xhc3MgSHR0cEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIHN0YXR1cztcbiAgICAvKiogQSBuYW1lIG9mIHRoZSBlcnJvciB0eXBlLiBUaGUgaW5pdGlhbCB2YWx1ZSBpcyBgRXJyb3JgLiAqL1xuICAgIG5hbWU7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyB0aGUgYEh0dHBFcnJvcmAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBlcnJvciBzdGF0dXMgbnVtYmVyLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHN0YXR1cywgbWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiSHR0cEVycm9yXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZXJyb3IgaXMgYW4gSFRUUCBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgYEVycm9yYCBvYmplY3QgdGhhdCBpcyBjaGVja2VkLlxuICAgICAqIEByZXR1cm5zIFRydWUgaXMgdGhlIGdpdmVuIGVycm9yIGlzIGFuIEhUVFAgZXJyb3I7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNIdHRwRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yLm5hbWUgPT09IFwiSHR0cEVycm9yXCI7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwRXJyb3IgPSBIdHRwRXJyb3I7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVxdWVzdEZhY3RvcnkgPSB2b2lkIDA7XG5jb25zdCBBcGlDYWNoZVJlcG9zaXRvcnlfMSA9IHJlcXVpcmUoXCIuLi9jYWNoZS9BcGlDYWNoZVJlcG9zaXRvcnlcIik7XG5jb25zdCBEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXJcIik7XG5jb25zdCBIdHRwRXJyb3JfMSA9IHJlcXVpcmUoXCIuL0h0dHBFcnJvclwiKTtcbmNvbnN0IGdldEVudkxvb2t1cFVybF8xID0gcmVxdWlyZShcIi4vZ2V0RW52TG9va3VwVXJsXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IE1JTExJU0VDT05EU19JTl9TRUNPTkQgPSAxMDAwO1xuLyoqXG4gKiBBIGhlbHBlciB1dGlscyB0aGF0IG1ha2VzIHRoZSBgUmVxdWVzdGAgb2JqZWN0IHdpdGggdGhlIGJhc2UgVVJMcyBvZiB0aGUgQVBJIExvb2t1cCBTZXJ2aWNlLCB0b2tlbiBjYWxsYmFjaywgYW5kIGRvd25sb2FkIG1hbmFnZXIuXG4gKlxuICogQWxzbywgeW91IGNhbiB1c2UgaXQgdG8gZ2V0IHRoZSBiYXNlIFVSTHMgb2YgdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAqL1xuY2xhc3MgUmVxdWVzdEZhY3Rvcnkge1xuICAgIC8qKlxuICAgICAqIEZhY3RvcnkgbWV0aG9kIGZvciBidWlsZGluZyBbW0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgaW4gdGhlIEFQSS5cbiAgICAgKiBAcGFyYW0gc2VydmljZVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGhybiBBIEhFUkUgUmVzb3VyY2UgTmFtZSAoW1tIUk5dXSkgb2YgdGhlIGNhdGFsb2cuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIFByb21pc2Ugd2l0aCBjb25zdHJ1Y3RlZCBbW0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXV0uXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGNyZWF0ZShzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIHNldHRpbmdzLCBocm4sIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0RmFjdG9yeS5nZXRCYXNlVXJsKHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgc2V0dGluZ3MsIGhybikudGhlbihhc3luYyAoYmFzZVVybCkgPT4gYmFzZVVybFxuICAgICAgICAgICAgPyBQcm9taXNlLnJlc29sdmUobmV3IERhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXzEuRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIoc2V0dGluZ3MuZG93bmxvYWRNYW5hZ2VyLCBiYXNlVXJsLCBzZXR0aW5ncy50b2tlbiwgYWJvcnRTaWduYWwpKVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYmFzZSB1cmwgdG8gdGhlIHNlcnZpY2U6ICR7c2VydmljZU5hbWV9YCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJhc2UgVVJMIG9mIHRoZSBBUEkgc2VydmljZSB0aGF0IHN1cHBvcnRzIGNhY2hpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIEFQSSBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgc2VydmljZS5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gaHJuIFRoZSBbW0hSTl1dIG9mIHRoZSBjYXRhbG9nLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgUHJvbWlzZSB3aXRoIHRoZSBiYXNlIFVSTCBvZiB0aGUgc2VydmljZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZ2V0QmFzZVVybChzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIHNldHRpbmdzLCBocm4pIHtcbiAgICAgICAgY29uc3QgTk9UX0ZPVU5EX0NPREUgPSA0MDQ7XG4gICAgICAgIGNvbnN0IE5PX0NPTlRFTlRfQ09ERSA9IDIwNDtcbiAgICAgICAgY29uc3QgYXBpQ2FjaGUgPSBuZXcgQXBpQ2FjaGVSZXBvc2l0b3J5XzEuQXBpQ2FjaGVSZXBvc2l0b3J5KHNldHRpbmdzLmNhY2hlLCBocm4pO1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gYXBpQ2FjaGUuZ2V0KHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgXCJhcGlcIik7XG4gICAgICAgIGNvbnN0IGNhY2hlTWF4QWdlID0gYXBpQ2FjaGUuZ2V0KHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgXCJhZ2VcIik7XG4gICAgICAgIGNvbnN0IGNhY2hlT25seVZlcnNpb24gPSBcInYxXCI7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAoYmFzZVVybCAmJiBjYWNoZU1heEFnZSAmJiBub3cgPCBwYXJzZUludChjYWNoZU1heEFnZSwgMTApKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJhc2VVcmwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvb2tVcFVybCA9ICgwLCBnZXRFbnZMb29rdXBVcmxfMS5nZXRFbnZMb29rVXBVcmwpKHNldHRpbmdzLmVudmlyb25tZW50KTtcbiAgICAgICAgY29uc3QgbG9va1VwQXBpUmVxdWVzdCA9IG5ldyBEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcl8xLkRhdGFTdG9yZVJlcXVlc3RCdWlsZGVyKHNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgbG9va1VwVXJsLCBzZXR0aW5ncy50b2tlbik7XG4gICAgICAgIGNvbnN0IGxvb2t1cFByb21pc2UgPSBocm5cbiAgICAgICAgICAgID8gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5Mb29rdXBBcGkuZ2V0UmVzb3VyY2VBUElMaXN0KGxvb2tVcEFwaVJlcXVlc3QsIHtcbiAgICAgICAgICAgICAgICBocm46IGhybi50b1N0cmluZygpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkxvb2t1cEFwaS5nZXRQbGF0Zm9ybUFQSUxpc3QobG9va1VwQXBpUmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBsb29rdXBQcm9taXNlLnRoZW4oYXN5bmMgKHJlc3ApID0+IHtcbiAgICAgICAgICAgIGxldCBtYXhBZ2U7XG4gICAgICAgICAgICBpZiAocmVzcC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVDb250cm9sID0gcmVzcC5oZWFkZXJzLmdldChcImNhY2hlLWNvbnRyb2xcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlQ29udHJvbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhTaXplID0gY2FjaGVDb250cm9sLm1hdGNoKC9tYXgtYWdlPShcXGQrKS8pO1xuICAgICAgICAgICAgICAgICAgICBtYXhBZ2UgPSBtYXhTaXplID8gcGFyc2VJbnQobWF4U2l6ZVsxXSwgMTApIDogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcl8xLkh0dHBFcnJvcihyZXMuc3RhdHVzIHx8IE5PX0NPTlRFTlRfQ09ERSwgcmVzLnRpdGxlIHx8IFwiTm8gY29udGVudFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udmVyc2lvbiA9PT0gY2FjaGVPbmx5VmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBhcGlDYWNoZS5wdXQoaXRlbS5hcGksIGl0ZW0udmVyc2lvbiwgaXRlbS5iYXNlVVJMLCBcImFwaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heEFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhBZ2UgKiBNSUxMSVNFQ09ORFNfSU5fU0VDT05EO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBpQ2FjaGUucHV0KGl0ZW0uYXBpLCBpdGVtLnZlcnNpb24sIHRpbWUudG9TdHJpbmcoKSwgXCJhZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VVcmxJbmRleCA9IHJlcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uYXBpID09PSBzZXJ2aWNlTmFtZSAmJiBpdGVtLnZlcnNpb24gPT09IHNlcnZpY2VWZXJzaW9uKTtcbiAgICAgICAgICAgIGlmIChiYXNlVXJsSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcl8xLkh0dHBFcnJvcihOT1RfRk9VTkRfQ09ERSwgYE5vIEJhc2VVcmwgZm91bmQgZm9yICR7c2VydmljZU5hbWV9LCAke3NlcnZpY2VWZXJzaW9ufSAke2hybiA/IGhybi50b1N0cmluZygpIDogXCJcIn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNbYmFzZVVybEluZGV4XS5iYXNlVVJMO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RGYWN0b3J5ID0gUmVxdWVzdEZhY3Rvcnk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVGlsZUtleSA9IHZvaWQgMDtcbi8qKlxuICogVGhlIGBUaWxlS2V5YCBpbnN0YW5jZXMgYXJlIHVzZWQgdG8gYWRkcmVzcyBhIHRpbGUgaW4gYSBxdWFkdHJlZS5cbiAqXG4gKiBBIHRpbGUga2V5IGlzIGRlZmluZWQgYnkgYSByb3csIGEgY29sdW1uLCBhbmQgYSBsZXZlbC4gVGhlIHRyZWUgaGFzIGEgcm9vdCBhdCBsZXZlbCAwLCB3aXRoIG9uZVxuICogc2luZ2xlIHRpbGUuIE9uIGV2ZXJ5IGxldmVsLCBlYWNoIHRpbGUgaXMgZGl2aWRlZCBpbnRvIGZvdXIgY2hpbGRyZW4gKHRoZXJlZm9yZSB0aGUgbmFtZVxuICogcXVhZHRyZWUpLlxuICpcbiAqIFdpdGhpbiBlYWNoIFtbbGV2ZWxdXSwgYW55IHBhcnRpY3VsYXIgdGlsZSBpcyBhZGRyZXNzZWQgd2l0aCBbW3Jvd11dIGFuZCBbW2NvbHVtbl1dLiBUaGUgbnVtYmVyXG4gKiBvZiByb3dzIGFuZCBjb2x1bW5zIGluIGVhY2ggbGV2ZWwgaXMgMiB0byB0aGUgcG93ZXIgb2YgdGhlIGxldmVsLiBUaGlzIG1lYW5zOiBPbiBsZXZlbCAwLCBvbmx5XG4gKiBvbmUgdGlsZSBleGlzdHMsIFtbY29sdW1uc0F0TGV2ZWxdXSgpIGFuZCBbW3Jvd3NBdExldmVsXV0oKSBhcmUgYm90aCAxLiBPbiBsZXZlbCAxLCA0IHRpbGVzXG4gKiBleGlzdCwgaW4gMiByb3dzIGFuZCAyIGNvbHVtbnMuIE9uIGxldmVsIDIgd2UgaGF2ZSAxNiB0aWxlcywgaW4gNCByb3dzIGFuZCA0IGNvbHVtbnMuIEFuZCBzbyBvbi5cbiAqXG4gKiBBIHRpbGUga2V5IGlzIHVzdWFsbHkgY3JlYXRlZCB1c2luZyBbW2Zyb21Sb3dDb2x1bW5MZXZlbF1dKCkgbWV0aG9kLlxuICpcbiAqIGBUaWxlS2V5YCBpbnN0YW5jZXMgYXJlIGltbXV0YWJsZSwgYWxsIG1lbWJlcnMgcmV0dXJuIG5ldyBpbnN0YW5jZXMgb2YgYFRpbGVLZXlgIGFuZCBkbyBub3RcbiAqIG1vZGlmeSB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICpcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGxpa2UgW1twYXJlbnRdXSgpLCBbW2NoYW5nZWRMZXZlbEJ5XV0oKSwgYW5kIFtbY2hhbmdlZExldmVsVG9dXSgpIGFsbG93IGZvclxuICogZWFzeSB2ZXJ0aWNhbCBuYXZpZ2F0aW9uIG9mIHRoZSB0cmVlLiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByb3dzIGFuZCBjb2x1bW5zIGluIHRoZSB0aWxlJ3NcbiAqIGxldmVsIGlzIGdpdmVuIHdpdGggW1tyb3dDb3VudF1dKCkgYW5kIFtbY29sdW1uQ291bnRdXSgpLlxuICpcbiAqIFRpbGUga2V5cyBjYW4gYmUgY3JlYXRlZCBmcm9tIGFuZCBjb252ZXJ0ZWQgaW50byB2YXJpb3VzIGFsdGVybmF0aXZlIGZvcm1hdHM6XG4gKlxuICogIC0gW1t0b1F1YWRLZXldXSgpIC8gW1tmcm9tUXVhZEtleV1dKCkgLSBzdHJpbmcgcmVwcmVzZW50YXRpb24gNC1iYXNlZFxuICogIC0gW1t0b0hlcmVUaWxlXV0oKSAvIFtbZnJvbUhlcmVUaWxlXV0oKSAtIHN0cmluZyByZXByZXNlbnRhdGlvbiAxMC1iYXNlZFxuICogIC0gW1ttb3J0b25Db2RlXV0oKSAvIFtbZnJvbU1vcnRvbkNvZGVdXSgpIC0gbnVtYmVyIHJlcHJlc2VudGF0aW9uXG4gKlxuICogTm90ZSAtIGFzIEphdmFTY3JpcHQncyBudW1iZXIgdHlwZSBjYW4gaG9sZCA1MyBiaXRzIGluIGl0cyBtYW50aXNzYSwgb25seSBsZXZlbHMgdXAgdG8gMjYgY2FuIGJlXG4gKiByZXByZXNlbnRlZCBpbiB0aGUgbnVtYmVyIHJlcHJlc2VudGF0aW9uIHJldHVybmVkIGJ5IFtbbW9ydG9uQ29kZV1dKCkuXG4gKi9cbmNsYXNzIFRpbGVLZXkge1xuICAgIHJvdztcbiAgICBjb2x1bW47XG4gICAgbGV2ZWw7XG4gICAgbV9tb3J0b25Db2RlO1xuICAgIG1faGVyZVRpbGU7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbW11dGFibGUgaW5zdGFuY2Ugb2YgYSBgVGlsZUtleWAuXG4gICAgICpcbiAgICAgKiBGb3IgdGhlIGJldHRlciByZWFkYWJpbGl0eSwgW1tUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbF1dIHNob3VsZCBiZSBwcmVmZXJyZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIC0gcm93IGFuZCBjb2x1bW4gbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJvd3MvY29sdW1ucyBmb3IgdGhlIGdpdmVuIGxldmVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvdyBSZXByZXNlbnRzIHRoZSByb3cgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqIEBwYXJhbSBjb2x1bW4gUmVwcmVzZW50cyB0aGUgY29sdW1uIGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKiBAcGFyYW0gbGV2ZWwgUmVwcmVzZW50cyB0aGUgbGV2ZWwgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvdywgY29sdW1uLCBsZXZlbCkge1xuICAgICAgICB0aGlzLnJvdyA9IHJvdztcbiAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRpbGUga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvdyBUaGUgcmVxdWVzdGVkIHJvdy4gTXVzdCBiZSBsZXNzIHRoYW4gMiB0byB0aGUgcG93ZXIgb2YgbGV2ZWwuXG4gICAgICogQHBhcmFtIGNvbHVtbiBUaGUgcmVxdWVzdGVkIGNvbHVtbi4gTXVzdCBiZSBsZXNzIHRoYW4gMiB0byB0aGUgcG93ZXIgb2YgbGV2ZWwuXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21Sb3dDb2x1bW5MZXZlbChyb3csIGNvbHVtbiwgbGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUaWxlS2V5KHJvdywgY29sdW1uLCBsZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0aWxlIGtleSBmcm9tIGEgcXVhZCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgcXVhZCBzdHJpbmcgY2FuIGJlIGNyZWF0ZWQgd2l0aCBbW3RvUXVhZEtleV1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRrZXkgVGhlIHF1YWRrZXkgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiBgVGlsZUtleWAuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21RdWFkS2V5KHF1YWRrZXkpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBxdWFka2V5Lmxlbmd0aDtcbiAgICAgICAgbGV0IHJvdyA9IDA7XG4gICAgICAgIGxldCBjb2x1bW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YWRrZXkubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSAxIDw8IGk7XG4gICAgICAgICAgICBjb25zdCBkID0gcGFyc2VJbnQocXVhZGtleS5jaGFyQXQobGV2ZWwgLSBpIC0gMSksIDEwKTtcbiAgICAgICAgICAgIGlmIChkICYgMHgxKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uIHw9IG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZCAmIDB4Mikge1xuICAgICAgICAgICAgICAgIHJvdyB8PSBtYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChyb3csIGNvbHVtbiwgbGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGlsZSBrZXkgZnJvbSBhIG51bWVyaWMgTW9ydG9uIGNvZGUgcmVwcmVzZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGNvbnZlcnQgYSB0aWxlIGtleSBpbnRvIGEgbnVtZXJpYyBNb3J0b24gY29kZSB3aXRoIFtbbW9ydG9uQ29kZV1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRLZXk2NCBUaGUgTW9ydG9uIGNvZGUgdG8gYmUgY29udmVydGVkLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIFtbVGlsZUtleV1dLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tTW9ydG9uQ29kZShxdWFkS2V5NjQpIHtcbiAgICAgICAgbGV0IGxldmVsID0gMDtcbiAgICAgICAgbGV0IHJvdyA9IDA7XG4gICAgICAgIGxldCBjb2x1bW4gPSAwO1xuICAgICAgICBsZXQgcXVhZEtleSA9IHF1YWRLZXk2NDtcbiAgICAgICAgd2hpbGUgKHF1YWRLZXkgPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBtYXNrID0gMSA8PCBsZXZlbDtcbiAgICAgICAgICAgIGlmIChxdWFkS2V5ICYgMHgxKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uIHw9IG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocXVhZEtleSAmIDB4Mikge1xuICAgICAgICAgICAgICAgIHJvdyB8PSBtYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWwrKztcbiAgICAgICAgICAgIHF1YWRLZXkgPSAocXVhZEtleSAtIChxdWFkS2V5ICYgMHgzKSkgLyA0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKHJvdywgY29sdW1uLCBsZXZlbCk7XG4gICAgICAgIHJlc3VsdC5tX21vcnRvbkNvZGUgPSBxdWFkS2V5NjQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0aWxlIGtleSBmcm9tIGEgaGVyZXRpbGUgY29kZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgc3RyaW5nIGNhbiBiZSBjcmVhdGVkIHdpdGggW1t0b0hlcmVUaWxlXV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcXVhZGtleTY0IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEhFUkUgdGlsZSBrZXkuXG4gICAgICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgYFRpbGVLZXlgLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSGVyZVRpbGUocXVhZGtleTY0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFRpbGVLZXkuZnJvbU1vcnRvbkNvZGUocGFyc2VJbnQocXVhZGtleTY0LCAxMCkpO1xuICAgICAgICByZXN1bHQubV9oZXJlVGlsZSA9IHF1YWRrZXk2NDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb2x1bW5zIGF0IGEgZ2l2ZW4gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIDIgdG8gdGhlIHBvd2VyIG9mIHRoZSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZXZlbCBUaGUgbGV2ZWwgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuXG4gICAgICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSBjb2x1bW5zIGF0IHRoZSBnaXZlbiBsZXZlbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgY29sdW1uc0F0TGV2ZWwobGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByb3dzIGF0IGEgZ2l2ZW4gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIDIgdG8gdGhlIHBvd2VyIG9mIHRoZSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZXZlbCBUaGUgbGV2ZWwgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MuXG4gICAgICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSByb3dzIGF0IHRoZSBnaXZlbiBsZXZlbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcm93c0F0TGV2ZWwobGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBtYXRjaGluZyBgVGlsZUtleWAgaW4gYSBjYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWwgVGhlIGxldmVsIGZvciB0aGUgdGlsZSBrZXkuXG4gICAgICogQHBhcmFtIGNvb3JkWCBUaGUgWCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSBjb29yZFkgVGhlIFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0gdG90YWxXaWR0aCBUaGUgbWF4aW11bSBYIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHRvdGFsSGVpZ2h0IFRoZSBtYXhpbXVtIFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB0aWxlIGtleSBhdCB0aGUgZ2l2ZW4gbGV2ZWwgdGhhdCBpbmNsdWRlcyB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgc3RhdGljIGF0Q29vcmRzKGxldmVsLCBjb29yZFgsIGNvb3JkWSwgdG90YWxXaWR0aCwgdG90YWxIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKE1hdGguZmxvb3IoY29vcmRZIC8gKHRvdGFsSGVpZ2h0IC8gVGlsZUtleS5yb3dzQXRMZXZlbChsZXZlbCkpKSwgTWF0aC5mbG9vcihjb29yZFggLyAodG90YWxXaWR0aCAvIFRpbGVLZXkuY29sdW1uc0F0TGV2ZWwobGV2ZWwpKSksIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIE1vcnRvbiBjb2RlIG9mIHRoZSBwYXJlbnQgdGlsZSBrZXkgb2YgdGhlIGdpdmVuIE1vcnRvbiBjb2RlLlxuICAgICAqXG4gICAgICogTm90ZTogVGhlIHBhcmVudCBrZXkgb2YgdGhlIHJvb3Qga2V5IGlzIHRoZSByb290IGtleSBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9ydG9uQ29kZSBBIE1vcnRvbiBjb2RlLCBmb3IgZXhhbXBsZSwgb2J0YWluZWQgZnJvbSBbW21vcnRvbkNvZGVdXS5cbiAgICAgKiBAcmV0dXJucyBUaGUgTW9ydG9uIGNvZGUgb2YgdGhlIHBhcmVudCB0aWxlLlxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJlbnRNb3J0b25Db2RlKG1vcnRvbkNvZGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobW9ydG9uQ29kZSAvIDQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBxdWFka2V5IGlzIHZhbGlkLlxuICAgICAqXG4gICAgICogVGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBpbiB0aGUgZ2l2ZW4gbGV2ZWwuXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4gYSBsZXZlbCBpcyBjb21wdXRlZCBhcyAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAbm90ZSBBcyB0aGUgSmF2YVNjcmlwdCBudW1iZXIgdHlwZSBjYW4gaG9sZCA1MyBiaXRzIGluIGl0cyBtYW50aXNzYSwgb25seSBsZXZlbHMgdXAgdG8gMjYgY2FuIGJlXG4gICAgICogcmVwcmVzZW50ZWQgaW4gdGhlIG51bWJlciByZXByZXNlbnRhdGlvbiByZXR1cm5lZCBieSBbW21vcnRvbkNvZGVGcm9tUXVhZEtleV1dLlxuICAgICAqIEEgbGV2ZWwgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIDI2LlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUgY3VycmVudCBxdWFka2V5LlxuICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcXVhZGtleSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc1ZhbGlkKGtleSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICBpZiAoa2V5LmxldmVsIDwgMCB8fCBrZXkubGV2ZWwgPiAyNikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbkF0TGV2ZWwgPSBNYXRoLnBvdygyLCBrZXkubGV2ZWwpO1xuICAgICAgICBjb25zdCByb3dWYWxpZCA9IGtleS5yb3cgPj0gMCAmJiBrZXkucm93IDwgZGltZW5zaW9uQXRMZXZlbDtcbiAgICAgICAgY29uc3QgY29sdW1uVmFsaWQgPSBrZXkuY29sdW1uID49IDAgJiYga2V5LmNvbHVtbiA8IGRpbWVuc2lvbkF0TGV2ZWw7XG4gICAgICAgIHJldHVybiByb3dWYWxpZCAmJiBjb2x1bW5WYWxpZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHRpbGUga2V5IHJlcHJlc2VudGluZyB0aGUgcGFyZW50IG9mIHRoZSB0aWxlIGFkZHJlc3NlZCBieSB0aGlzIHRpbGUga2V5LlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpcyB0aGlzIHRpbGUgaXMgYWxyZWFkeSB0aGUgcm9vdC5cbiAgICAgKi9cbiAgICBwYXJlbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxldmVsID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZ2V0IHRoZSBwYXJlbnQgb2YgdGhlIHJvb3QgdGlsZSBrZXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKHRoaXMucm93ID4+PiAxLCB0aGlzLmNvbHVtbiA+Pj4gMSwgdGhpcy5sZXZlbCAtIDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHRpbGUga2V5IGF0IGEgbGV2ZWwgdGhhdCBkaWZmZXJzIGZyb20gdGhpcyB0aWxlJ3MgbGV2ZWwgYnkgZGVsdGEuXG4gICAgICpcbiAgICAgKiBFcXVpdmFsZW50IHRvIGBjaGFuZ2VkTGV2ZWxUbyhsZXZlbCgpICsgZGVsdGEpYC5cbiAgICAgKlxuICAgICAqIE5vdGUgLSByb290IGtleSBpcyByZXR1cm5lZCBpZiBgZGVsdGFgIGlzIHNtYWxsZXIgdGhhbiB0aGUgbGV2ZWwgb2YgdGhpcyB0aWxlIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgbnVtZXJpYyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgbGV2ZWwgYW5kIHRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICovXG4gICAgY2hhbmdlZExldmVsQnkoZGVsdGEpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBNYXRoLm1heCgwLCB0aGlzLmxldmVsICsgZGVsdGEpO1xuICAgICAgICBsZXQgcm93ID0gdGhpcy5yb3c7XG4gICAgICAgIGxldCBjb2x1bW4gPSB0aGlzLmNvbHVtbjtcbiAgICAgICAgaWYgKGRlbHRhID49IDApIHtcbiAgICAgICAgICAgIHJvdyA8PD0gZGVsdGE7XG4gICAgICAgICAgICBjb2x1bW4gPDw9IGRlbHRhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcm93ID4+Pj0gLWRlbHRhO1xuICAgICAgICAgICAgY29sdW1uID4+Pj0gLWRlbHRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChyb3csIGNvbHVtbiwgbGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHRpbGUga2V5IGF0IHRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgcmVxdWVzdGVkIGxldmVsIGlzIHNtYWxsZXIgdGhhbiB0aGUgdGlsZSdzIGxldmVsLCB0aGVuIHRoZSBrZXkgb2YgYW4gYW5jZXN0b3Igb2YgdGhpc1xuICAgICAqIHRpbGUgaXMgcmV0dXJuZWQuIElmIHRoZSByZXF1ZXN0ZWQgbGV2ZWwgaXMgbGFyZ2VyIHRoYW4gdGhlIHRpbGUncyBsZXZlbCwgdGhlbiB0aGUga2V5IG9mXG4gICAgICogZmlyc3QgY2hpbGQgb3IgZ3JhbmRjaGlsZCBvZiB0aGlzIHRpbGUgaXMgcmV0dXJuZWQsIGZvciBleGFtcGxlLCB0aGUgY2hpbGQgd2l0aCB0aGUgbG93ZXN0XG4gICAgICogcm93IGFuZCBjb2x1bW4gbnVtYmVyLiBJZiB0aGUgcmVxdWVzdGVkIGxldmVsIGVxdWFscyB0aGlzIHRpbGUncyBsZXZlbCwgdGhlbiB0aGUgdGlsZSBrZXlcbiAgICAgKiBpdHNlbGYgaXMgcmV0dXJuZWQuIElmIHRoZSByZXF1ZXN0ZWQgbGV2ZWwgaXMgbmVnYXRpdmUsIHRoZSByb290IHRpbGUga2V5IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICovXG4gICAgY2hhbmdlZExldmVsVG8obGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlZExldmVsQnkobGV2ZWwgLSB0aGlzLmxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHRpbGUga2V5IHRvIGEgbnVtZXJpYyBjb2RlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqXG4gICAgICogWW91IGNhbiBjcmVhdGUgYSB0aWxlIGtleSBmcm9tIGEgbnVtZXJpYyBNb3J0b24gY29kZSB3aXRoIFtbZnJvbU1vcnRvbkNvZGVdXS5cbiAgICAgKlxuICAgICAqIE5vdGUgLSBvbmx5IGxldmVscyA8PSAyNiBhcmUgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIG1vcnRvbkNvZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm1fbW9ydG9uQ29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgY29sdW1uID0gdGhpcy5jb2x1bW47XG4gICAgICAgICAgICBsZXQgcm93ID0gdGhpcy5yb3c7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcG93ZXJPZlR3b1t0aGlzLmxldmVsIDw8IDFdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxldmVsOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uICYgMHgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBwb3dlck9mVHdvWzIgKiBpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvdyAmIDB4MSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gcG93ZXJPZlR3b1syICogaSArIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4gPj4+PSAxO1xuICAgICAgICAgICAgICAgIHJvdyA+Pj49IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1fbW9ydG9uQ29kZSA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tX21vcnRvbkNvZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSB0aWxlIGtleSBpbnRvIGEgc3RyaW5nIGZvciB1c2luZyBpbiBSRVNUIEFQSSBjYWxscy5cbiAgICAgKlxuICAgICAqIFRoZSBzdHJpbmcgaXMgYSBxdWFka2V5IE1vcnRvbiBjb2RlIHJlcHJlc2VudGF0aW9uIGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogWW91IGNhbiBjb252ZXJ0IGJhY2sgZnJvbSBhIHF1YWRrZXkgc3RyaW5nIHdpdGggW1tmcm9tSGVyZVRpbGVdXS5cbiAgICAgKi9cbiAgICB0b0hlcmVUaWxlKCkge1xuICAgICAgICBpZiAodGhpcy5tX2hlcmVUaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubV9oZXJlVGlsZSA9IHRoaXMubW9ydG9uQ29kZSgpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubV9oZXJlVGlsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHRpbGUga2V5IGludG8gYSBzdHJpbmcgZm9yIHVzaW5nIGluIFJFU1QgQVBJIGNhbGxzLlxuICAgICAqXG4gICAgICogSWYgdGhlIHRpbGUgaXMgdGhlIHJvb3QgdGlsZSwgdGhlIHF1YWRrZXkgaXMgJy0nLiBPdGhlcndpc2UgdGhlIHN0cmluZyBpcyBhIG51bWJlciB0byB0aGVcbiAgICAgKiBiYXNlIG9mIDQsIGJ1dCB3aXRob3V0IHRoZSBsZWFkaW5nIDEsIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAqICAxLiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBlcXVhbHMgdGhlIGxldmVsLlxuICAgICAqICAyLiByZW1vdmluZyB0aGUgbGFzdCBkaWdpdCBnaXZlcyB0aGUgcGFyZW50IHRpbGUncyBxdWFka2V5IHN0cmluZywgaS5lLiBhcHBlbmRpbmcgMCwxLDIsM1xuICAgICAqICAgICB0byBhIHF1YWRrZXkgc3RyaW5nIGdpdmVzIHRoZSB0aWxlcydzIGNoaWxkcmVuLlxuICAgICAqXG4gICAgICogWW91IGNhbiBjb252ZXJ0IGJhY2sgZnJvbSBhIHF1YWRrZXkgc3RyaW5nIHdpdGggW1tmcm9tUXVhZEtleV1dLlxuICAgICAqL1xuICAgIHRvUXVhZEtleSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIi1cIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGV2ZWw7IGkgPiAwOyAtLWkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSAxIDw8IChpIC0gMSk7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSAodGhpcy5jb2x1bW4gJiBtYXNrKSAhPT0gMDtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9ICh0aGlzLnJvdyAmIG1hc2spICE9PSAwO1xuICAgICAgICAgICAgaWYgKGNvbCAmJiByb3cpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIzXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyb3cpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIyXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIxXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXF1YWxpdHkgb3BlcmF0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcW5yIFRoZSB0aWxlIGtleSB0byBjb21wYXJlIHRvLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHRpbGUga2V5IGhhcyBpZGVudGljYWwgcm93LCBjb2x1bW4gYW5kIGxldmVsLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBlcXVhbHMocW5yKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5yb3cgPT09IHFuci5yb3cgJiZcbiAgICAgICAgICAgIHRoaXMuY29sdW1uID09PSBxbnIuY29sdW1uICYmXG4gICAgICAgICAgICB0aGlzLmxldmVsID09PSBxbnIubGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBxdWFka2V5IHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSBpdHMgc3ViIHF1YWRrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3ViIFRoZSBzdWIga2V5LlxuICAgICAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSB0aWxlIGtleSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICovXG4gICAgYWRkZWRTdWJLZXkoc3ViKSB7XG4gICAgICAgIGNvbnN0IHN1YlF1YWQgPSBUaWxlS2V5LmZyb21RdWFkS2V5KHN1Yi5sZW5ndGggPT09IDAgPyBcIi1cIiA6IHN1Yik7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5jaGFuZ2VkTGV2ZWxCeShzdWJRdWFkLmxldmVsKTtcbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKGNoaWxkLnJvdyArIHN1YlF1YWQucm93LCBjaGlsZC5jb2x1bW4gKyBzdWJRdWFkLmNvbHVtbiwgY2hpbGQubGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBxdWFka2V5IHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSBpdHMgc3ViIEhFUkUgdGlsZSBrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3ViIFRoZSBzdWIgSEVSRSBrZXkuXG4gICAgICogQHJldHVybnMgVGhlIGFic29sdXRlIHRpbGUga2V5IGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKi9cbiAgICBhZGRlZFN1YkhlcmVUaWxlKHN1Yikge1xuICAgICAgICBjb25zdCBzdWJRdWFkID0gVGlsZUtleS5mcm9tSGVyZVRpbGUoc3ViKTtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLmNoYW5nZWRMZXZlbEJ5KHN1YlF1YWQubGV2ZWwpO1xuICAgICAgICByZXR1cm4gVGlsZUtleS5mcm9tUm93Q29sdW1uTGV2ZWwoY2hpbGQucm93ICsgc3ViUXVhZC5yb3csIGNoaWxkLmNvbHVtbiArIHN1YlF1YWQuY29sdW1uLCBjaGlsZC5sZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzdWIgcXVhZGtleSB0aGF0IGlzIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHN1YiBrZXlzIHRoYXQgYXJlIHJlbGF0aXZlIHRvIGEgcGFyZW50IHRoYXQgaXMgZGVsdGFcbiAgICAgKiBsZXZlbHMgdXAgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgc2hvcnRlbmVkIGtleXMgZm9yIHF1YWRzIG9uIGxvd2VyIGxldmVscyBpZiB0aGUgcGFyZW50IGlzXG4gICAgICoga25vd24uXG4gICAgICpcbiAgICAgKiBOb3RlIC0gdGhlIHN1YiBxdWFka2V5cyBmaXQgaW4gYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBpZiB0aGUgYGRlbHRhYCBpcyBzbWFsbGVyIHRoYW4gOC4gSWZcbiAgICAgKiBgZGVsdGFgIGlzIHNtYWxsZXIgdGhhbiAxNiwgdGhlIHN1YiBxdWFka2V5IGZpdHMgaW50byBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlci5cbiAgICAgKlxuICAgICAqIERlbHRhcyBsYXJnZXIgdGhhbiAxNiBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgbnVtYmVyIG9mIGxldmVscyByZWxhdGl2ZSB0byBpdHMgcGFyZW50IHF1YWRrZXkuIE11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0b1xuICAgICAqIDAgYW5kIHNtYWxsZXIgdGhhbiAxNi5cbiAgICAgKiBAcmV0dXJucyBUaGUgcXVhZGtleSByZWxhdGl2ZSB0byBpdHMgcGFyZW50IHRoYXQgaXMgYGRlbHRhYCBsZXZlbHMgdXAgdGhlIHRyZWUuXG4gICAgICovXG4gICAgZ2V0U3ViSGVyZVRpbGUoZGVsdGEpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5tb3J0b25Db2RlKCk7XG4gICAgICAgIGNvbnN0IG1zYiA9IDEgPDwgKGRlbHRhICogMik7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBtc2IgLSAxO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoa2V5ICYgbWFzaykgfCBtc2I7XG4gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByb3dzIGluIHRoZSB0aWxlJ3MgW1tsZXZlbF1dLlxuICAgICAqXG4gICAgICogVGhpcyBpcyAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbGV2ZWwuXG4gICAgICovXG4gICAgcm93Q291bnQoKSB7XG4gICAgICAgIHJldHVybiBUaWxlS2V5LnJvd3NBdExldmVsKHRoaXMubGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbHVtbnMgaW4gdGhlIHRpbGUncyBbW2xldmVsXV0uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIDIgdG8gdGhlIHBvd2VyIG9mIHRoZSBsZXZlbC5cbiAgICAgKi9cbiAgICBjb2x1bW5Db3VudCgpIHtcbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuY29sdW1uc0F0TGV2ZWwodGhpcy5sZXZlbCk7XG4gICAgfVxufVxuZXhwb3J0cy5UaWxlS2V5ID0gVGlsZUtleTtcbi8qKiBAaGlkZGVuICovXG5jb25zdCBwb3dlck9mVHdvID0gW1xuICAgIDB4MSxcbiAgICAweDIsXG4gICAgMHg0LFxuICAgIDB4OCxcbiAgICAweDEwLFxuICAgIDB4MjAsXG4gICAgMHg0MCxcbiAgICAweDgwLFxuICAgIDB4MTAwLFxuICAgIDB4MjAwLFxuICAgIDB4NDAwLFxuICAgIDB4ODAwLFxuICAgIDB4MTAwMCxcbiAgICAweDIwMDAsXG4gICAgMHg0MDAwLFxuICAgIDB4ODAwMCxcbiAgICAweDEwMDAwLFxuICAgIDB4MjAwMDAsXG4gICAgMHg0MDAwMCxcbiAgICAweDgwMDAwLFxuICAgIDB4MTAwMDAwLFxuICAgIDB4MjAwMDAwLFxuICAgIDB4NDAwMDAwLFxuICAgIDB4ODAwMDAwLFxuICAgIDB4MTAwMDAwMCxcbiAgICAweDIwMDAwMDAsXG4gICAgMHg0MDAwMDAwLFxuICAgIDB4ODAwMDAwMCxcbiAgICAweDEwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMCxcbiAgICAweDgwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAwLFxuICAgIDB4NDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwMCxcbiAgICAweDIwMDAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwMCxcbiAgICAweDEwMDAwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMDAwMCxcbiAgICAweDgwMDAwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAwMDAwLFxuICAgIDB4NDAwMDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwMDAwMCxcbiAgICAweDIwMDAwMDAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwMDAwMCxcbiAgICAweDEwMDAwMDAwMDAwMDAwIC8vIE1hdGgucG93KDIsIDUyKSwgaGlnaGVzdCBiaXQgdGhhdCBjYW4gYmUgc2V0IGNvcnJlY3RseS5cbl07XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlV1aWQgPSB2b2lkIDA7XG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1iaXR3aXNlXG4vLyB0c2xpbnQ6ZGlzYWJsZTogbm8tbWFnaWMtbnVtYmVyc1xuLyoqXG4gKiBAYnJpZWYgTGV0cyB5b3UgZ2VuZXJhdGUgdXVpZCBjb2RlXG4gKi9cbmNsYXNzIFV1aWQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gVVVJRFxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBVdWlkLmdlbmVyYXRlKDIpLFxuICAgICAgICAgICAgVXVpZC5nZW5lcmF0ZSgxKSxcbiAgICAgICAgICAgIFV1aWQuZ2VuZXJhdGUoMSksXG4gICAgICAgICAgICBVdWlkLmdlbmVyYXRlKDEpLFxuICAgICAgICAgICAgVXVpZC5nZW5lcmF0ZSgzKVxuICAgICAgICBdLmpvaW4oXCItXCIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2VuZXJhdGUoY291bnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICgoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApIHwgMClcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAgICAgICAgICAgLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuVXVpZCA9IFV1aWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldERhdGFTaXplID0gZ2V0RGF0YVNpemU7XG5jb25zdCBCWVRFU19JTl9OVU1CRVIgPSA4O1xuY29uc3QgQllURVNfSU5fQk9PTEVBTiA9IDQ7XG4vKipcbiAqIENhbGN1bGF0ZSBtZW1vcnkgc2l6ZSBvZiBqYXZhc2NyaXB0IG9iamVjdCwgaXQgaXMgbm90IGFuIGFjY3VyYXRlIHZhbHVlXG4gKiBAcGFyYW0gZGF0YS4gVGhlIHN0cmluZyBvciBudW1iZXIgb3IgYm9vbGVhbiBvciBhcnJheSBvciBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgc2l6ZSBvZiB2YWx1ZSBpbiBieXRlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGF0YVNpemUoZGF0YSkge1xuICAgIGxldCBieXRlcyA9IDA7XG4gICAgZnVuY3Rpb24gc2l6ZU9mKG9iaikge1xuICAgICAgICBpZiAob2JqICE9PSBudWxsICYmIG9iaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBvYmopIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzICs9IEJZVEVTX0lOX05VTUJFUjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBieXRlcyArPSBvYmoubGVuZ3RoICogMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gQllURVNfSU5fQk9PTEVBTjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmpDbGFzcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2JqQ2xhc3MgPT09IFwiW29iamVjdCBPYmplY3RdXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iakNsYXNzID09PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVPZihvYmpba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyArPSBvYmoudG9TdHJpbmcoKS5sZW5ndGggKiAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICB9XG4gICAgcmV0dXJuIHNpemVPZihkYXRhKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0RW52TG9va1VwVXJsID0gZ2V0RW52TG9va1VwVXJsO1xuLyoqXG4gKiBHZXRzIHRoZSBVUkwgc3RyaW5nIG9mIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UuXG4gKlxuICogQHBhcmFtIGVudiBUaGUgZW52aXJvbm1lbnQgdGhhdCB5b3UgdXNlIGZvciB3b3JrLiBZb3UgY2FuIGFsc28gcGFzcyB0aGUgVVJMIHN0cmluZyBvZiB5b3VyIGxvY2FsIG9yIGN1c3RvbSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm4gQmFzZWQgb24gdGhlIHNwZWNpZmllZCBlbnZpcm9ubWVudCwgdGhlIFVSTCBzdHJpbmcgb2YgdGhlIEFQSSBMb29rdXAgU2VydmljZSBvciB0aGUgVVJMIHN0cmluZyBvZiB0aGUgY3VzdG9tIHNlcnZpY2UuXG4gKi9cbmZ1bmN0aW9uIGdldEVudkxvb2tVcFVybChlbnYpIHtcbiAgICBmdW5jdGlvbiBpc1VSTChzdHIpIHtcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBgKD86KD86W2Etel0rOik/Ly8pYDtcbiAgICAgICAgY29uc3QgaXAgPSBgKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSl7M31gO1xuICAgICAgICBjb25zdCBob3N0ID0gXCIoPzooPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV1bLV9dKikqW2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKylcIjtcbiAgICAgICAgY29uc3QgZG9tYWluID0gXCIoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XS0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSpcIjtcbiAgICAgICAgY29uc3QgdGxkID0gYCg/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmZdezIsfSkpXFxcXC4/YDtcbiAgICAgICAgY29uc3QgcG9ydCA9IFwiKD86OlxcXFxkezIsNX0pP1wiO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHF1b3RlbWFya1xuICAgICAgICBjb25zdCBwYXRoID0gJyg/OlsvPyNdW15cXFxcc1wiXSopPyc7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgKD86JHtwcm90b2NvbH18d3d3XFxcXC4pKD86bG9jYWxob3N0fCR7aXB9fCR7aG9zdH0ke2RvbWFpbn0ke3RsZH0pJHtwb3J0fSR7cGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3Qoc3RyLnRyaW0oKSk7XG4gICAgfVxuICAgIGlmIChpc1VSTChlbnYpKSB7XG4gICAgICAgIHJldHVybiBlbnY7XG4gICAgfVxuICAgIHN3aXRjaCAoZW52KSB7XG4gICAgICAgIGNhc2UgXCJoZXJlLWRldlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9hcGktbG9va3VwLmRhdGEuYXBpLnBsYXRmb3JtLnNpdC5oZXJlLmNvbS9sb29rdXAvdjFcIjtcbiAgICAgICAgY2FzZSBcImhlcmUtY25cIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vYXBpLWxvb2t1cC5kYXRhLmFwaS5wbGF0Zm9ybS5oZXJlb2xwLmNuL2xvb2t1cC92MVwiO1xuICAgICAgICBjYXNlIFwiaGVyZS1jbi1kZXZcIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vYXBpLWxvb2t1cC5kYXRhLmFwaS5wbGF0Zm9ybS5pbi5oZXJlb2xwLmNuL2xvb2t1cC92MVwiO1xuICAgICAgICBjYXNlIFwibG9jYWxcIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzEwMDUvbG9va3VwL3YxXCI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gXCJodHRwczovL2FwaS1sb29rdXAuZGF0YS5hcGkucGxhdGZvcm0uaGVyZS5jb20vbG9va3VwL3YxXCI7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU1RBVFVTX0NPREVTID0gdm9pZCAwO1xuLyoqXG4gKiBTdGF0dXMgY29kZXMgb2YgSFRUUCByZXNwb25zZXMuXG4gKi9cbnZhciBTVEFUVVNfQ09ERVM7XG4oZnVuY3Rpb24gKFNUQVRVU19DT0RFUykge1xuICAgIFNUQVRVU19DT0RFU1tTVEFUVVNfQ09ERVNbXCJPS1wiXSA9IDIwMF0gPSBcIk9LXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIkNSRUFURURcIl0gPSAyMDFdID0gXCJDUkVBVEVEXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIk5PX0NPTlRFTlRcIl0gPSAyMDRdID0gXCJOT19DT05URU5UXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIkZPVU5EXCJdID0gMzAyXSA9IFwiRk9VTkRcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiQkFEX1JFUVVFU1RcIl0gPSA0MDBdID0gXCJCQURfUkVRVUVTVFwiO1xuICAgIFNUQVRVU19DT0RFU1tTVEFUVVNfQ09ERVNbXCJOT1RfRk9VTkRcIl0gPSA0MDRdID0gXCJOT1RfRk9VTkRcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiVE9fTUFOWV9SRVFVRVNUU1wiXSA9IDQyOV0gPSBcIlRPX01BTllfUkVRVUVTVFNcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCJdID0gNTAwXSA9IFwiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIlNFUlZJQ0VfVU5BVkFJQkxFXCJdID0gNTAzXSA9IFwiU0VSVklDRV9VTkFWQUlCTEVcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiTkVUV09SS19DT05ORUNUX1RJTUVPVVRcIl0gPSA1OTldID0gXCJORVRXT1JLX0NPTk5FQ1RfVElNRU9VVFwiO1xufSkoU1RBVFVTX0NPREVTIHx8IChleHBvcnRzLlNUQVRVU19DT0RFUyA9IFNUQVRVU19DT0RFUyA9IHt9KSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRG93bmxvYWRNYW5hZ2VyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlckZhY3RvcnlcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2dldEVudkxvb2t1cFVybFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vSFJOXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9nZXREYXRhU2l6ZVV0aWxcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0h0dHBFcnJvclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRmV0Y2hPcHRpb25zXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9UaWxlS2V5XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9VdWlkXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi91c2VyQWdlbnRcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TRU5UX1dJVEhfUEFSQU0gPSB2b2lkIDA7XG5leHBvcnRzLmFkZFNlbnRXaXRoUGFyYW0gPSBhZGRTZW50V2l0aFBhcmFtO1xuY29uc3QgbGliX3ZlcnNpb25fMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmUvbGliLnZlcnNpb25cIik7XG4vKipcbiAqIFRoZSBzdHJpbmcgZm9yIGFkZGluZyB0byB0aGUgcmVxdWVzdHMgYXMgcXVlcnkgcGFyYW1ldGVyLlxuICovXG5leHBvcnRzLlNFTlRfV0lUSF9QQVJBTSA9IGBzZW50V2l0aD1PTFAtVFMtU0RLLSR7bGliX3ZlcnNpb25fMS5MSUJfVkVSU0lPTn1gO1xuLyoqXG4gKiBBZGRzIHNlbnRXaXRoIHBhcmFtIHRvIHRoZSB1cmwuXG4gKiBAcGFyYW0gdXJsIHRoZSBzdHJpbmcsIHJlcHJlc2VudGluZyB0aGUgdXJsXG4gKiBAcmV0dXJucyB0aGUgc3RyaW5nLCByZXByZXNlbnRpbmcgdXBkYXRlZCBVUkxcbiAqL1xuZnVuY3Rpb24gYWRkU2VudFdpdGhQYXJhbSh1cmwpIHtcbiAgICByZXR1cm4gdXJsLnNwbGl0KFwiP1wiKS5sZW5ndGggPT09IDFcbiAgICAgICAgPyBgJHt1cmx9PyR7ZXhwb3J0cy5TRU5UX1dJVEhfUEFSQU19YFxuICAgICAgICA6IGAke3VybH0mJHtleHBvcnRzLlNFTlRfV0lUSF9QQVJBTX1gO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSW50ZXJhY3RpdmVBcGkgPSBleHBvcnRzLk9iamVjdFN0b3JlQXBpID0gZXhwb3J0cy5QdWJsaXNoQXBpID0gZXhwb3J0cy5TdHJlYW1BcGkgPSBleHBvcnRzLkluZGV4QXBpID0gZXhwb3J0cy5Wb2xhdGlsZUJsb2JBcGkgPSBleHBvcnRzLkJsb2JBcGkgPSBleHBvcnRzLkNvdmVyYWdlQXBpID0gZXhwb3J0cy5RdWVyeUFwaSA9IGV4cG9ydHMuQXJ0aWZhY3RBcGkgPSBleHBvcnRzLkNvbmZpZ0FwaSA9IGV4cG9ydHMuTWV0YWRhdGFBcGkgPSBleHBvcnRzLkxvb2t1cEFwaSA9IGV4cG9ydHMuQXV0aG9yaXphdGlvbkFQSSA9IHZvaWQgMDtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9saWIvUmVxdWVzdEJ1aWxkZXJcIiksIGV4cG9ydHMpO1xuY29uc3QgQXJ0aWZhY3RBcGkgPSByZXF1aXJlKFwiLi9saWIvYXJ0aWZhY3QtYXBpXCIpO1xuZXhwb3J0cy5BcnRpZmFjdEFwaSA9IEFydGlmYWN0QXBpO1xuY29uc3QgQXV0aG9yaXphdGlvbkFQSSA9IHJlcXVpcmUoXCIuL2xpYi9hdXRob3JpemF0aW9uLWFwaS12MS4xXCIpO1xuZXhwb3J0cy5BdXRob3JpemF0aW9uQVBJID0gQXV0aG9yaXphdGlvbkFQSTtcbmNvbnN0IEJsb2JBcGkgPSByZXF1aXJlKFwiLi9saWIvYmxvYi1hcGlcIik7XG5leHBvcnRzLkJsb2JBcGkgPSBCbG9iQXBpO1xuY29uc3QgQ29uZmlnQXBpID0gcmVxdWlyZShcIi4vbGliL2NvbmZpZy1hcGlcIik7XG5leHBvcnRzLkNvbmZpZ0FwaSA9IENvbmZpZ0FwaTtcbmNvbnN0IENvdmVyYWdlQXBpID0gcmVxdWlyZShcIi4vbGliL2NvdmVyYWdlLWFwaVwiKTtcbmV4cG9ydHMuQ292ZXJhZ2VBcGkgPSBDb3ZlcmFnZUFwaTtcbmNvbnN0IEluZGV4QXBpID0gcmVxdWlyZShcIi4vbGliL2luZGV4LWFwaVwiKTtcbmV4cG9ydHMuSW5kZXhBcGkgPSBJbmRleEFwaTtcbmNvbnN0IExvb2t1cEFwaSA9IHJlcXVpcmUoXCIuL2xpYi9sb29rdXAtYXBpXCIpO1xuZXhwb3J0cy5Mb29rdXBBcGkgPSBMb29rdXBBcGk7XG5jb25zdCBNZXRhZGF0YUFwaSA9IHJlcXVpcmUoXCIuL2xpYi9tZXRhZGF0YS1hcGlcIik7XG5leHBvcnRzLk1ldGFkYXRhQXBpID0gTWV0YWRhdGFBcGk7XG5jb25zdCBQdWJsaXNoQXBpID0gcmVxdWlyZShcIi4vbGliL3B1Ymxpc2gtYXBpLXYyXCIpO1xuZXhwb3J0cy5QdWJsaXNoQXBpID0gUHVibGlzaEFwaTtcbmNvbnN0IFF1ZXJ5QXBpID0gcmVxdWlyZShcIi4vbGliL3F1ZXJ5LWFwaVwiKTtcbmV4cG9ydHMuUXVlcnlBcGkgPSBRdWVyeUFwaTtcbmNvbnN0IFN0cmVhbUFwaSA9IHJlcXVpcmUoXCIuL2xpYi9zdHJlYW0tYXBpXCIpO1xuZXhwb3J0cy5TdHJlYW1BcGkgPSBTdHJlYW1BcGk7XG5jb25zdCBWb2xhdGlsZUJsb2JBcGkgPSByZXF1aXJlKFwiLi9saWIvdm9sYXRpbGUtYmxvYi1hcGlcIik7XG5leHBvcnRzLlZvbGF0aWxlQmxvYkFwaSA9IFZvbGF0aWxlQmxvYkFwaTtcbmNvbnN0IE9iamVjdFN0b3JlQXBpID0gcmVxdWlyZShcIi4vbGliL2Jsb2IudjIuYXBpXCIpO1xuZXhwb3J0cy5PYmplY3RTdG9yZUFwaSA9IE9iamVjdFN0b3JlQXBpO1xuY29uc3QgSW50ZXJhY3RpdmVBcGkgPSByZXF1aXJlKFwiLi9saWIvaW50ZXJhY3RpdmUtYXBpLXYxXCIpO1xuZXhwb3J0cy5JbnRlcmFjdGl2ZUFwaSA9IEludGVyYWN0aXZlQXBpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZXF1ZXN0QnVpbGRlciA9IGV4cG9ydHMuVXJsQnVpbGRlciA9IHZvaWQgMDtcbi8qKlxuICogSGVscGVyIGNsYXNzIHRoYXQgYnVpbGRzIFVSTHMgZnJvbSBhIGJhc2VVcmwgYW5kIGdpdmVuIHF1ZXJ5IHBhcmFtZXRlcnNcbiAqL1xuY2xhc3MgVXJsQnVpbGRlciB7XG4gICAgdXJsO1xuICAgIGhhc1F1ZXJ5O1xuICAgIC8qKlxuICAgICAqIFN0YXRpYyBtZXRob2QgdGhhdCBjcmVhdGVzIGFuIFVSTCBxdWVyeSBzdHJpbmcgZnJvbSBhIGtleSwgdmFsdWUgcGFpciBwcm92aWRlZCBhcyBwYXJhbSAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBudW1iZXIgdG8gYmUgY29udmVydGVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBzdHJpbmdpZnlRdWVyeSh2YWx1ZXMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlcykge1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBVcmxCdWlsZGVyLmFwcGVuZFF1ZXJ5U3RyaW5nKHJlc3VsdCwgXCJcIiwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXRpYyBtZXRob2QgdGhhdCBjb252ZXJ0cyB0aGUgcGFyYW1ldGVyIHRvIGEgc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW0gZWl0aGVyIGEgc3RyaW5nIG9yIGEgbnVtYmVyIHRvIGJlIGNvbnZlcnRlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgdG9TdHJpbmcocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJhbSA9PT0gXCJzdHJpbmdcIiA/IHBhcmFtIDogcGFyYW0udG9TdHJpbmcoKTtcbiAgICB9XG4gICAgc3RhdGljIGFwcGVuZFF1ZXJ5U3RyaW5nKHVybCwgc2VwYXJhdG9yLCBrZXksIHZhbHVlLCBvcGVyYXRvciA9IFwiPVwiKSB7XG4gICAgICAgIHVybCArPSBzZXBhcmF0b3I7XG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIG9wZXJhdG9yO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB1cmwgKz0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB1cmwgKz0gYCR7dmFsdWV9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjb21tYSBpcyBhIHZhbGlkIHN1Yi1kZWxpbWl0ZXIgb2YgYSBxdWVyeSBjb21wb25lbnQgYW5kIGlzXG4gICAgICAgICAgICAvLyB1c2VkIGJ5IHRoZSBEYXRhIEFQSXMgYXMgYSBsaXN0IHNlcGFyYXRvciwgdGhlIHNhbWUgd2F5IGFzIGZvclxuICAgICAgICAgICAgLy8gdGhlIGFycmF5IHZhbHVlcyBiZWxvdy4gS2VlcCBpdCB1bmVzY2FwZWQuXG4gICAgICAgICAgICB1cmwgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKS5yZXBsYWNlKC8lMkMvZywgXCIsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkVmFsdWVzID0gW107XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWVzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1cmwgKz0gZW5jb2RlZFZhbHVlcy5qb2luKFwiLFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVybCBUaGUgYmFzZSBVUkwuXG4gICAgICogQHBhcmFtIGhhc1F1ZXJ5IFdoZXRoZXIgdGhlIGJhc2UgVVJMIGFscmVhZHkgY29udGFpbnMgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIGhhc1F1ZXJ5ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMuaGFzUXVlcnkgPSBoYXNRdWVyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHF1ZXJ5IHBhcmFtZXRlciB0byB0aGUgVVJMLCBlaXRoZXIgdXNpbmcgJyZrZXk9dmFsdWUnIG9yICc/a2V5PXZhbHVlJ1xuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgW1toYXNRdWVyeV1dIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEVzY2FwZXMgYWxsIHN0cmluZ3MgdXNpbmcgYGVuY29kZVVSSUNvbXBvbmVudGAsIGV4Y2VwdCBmb3IgdGhlIGNvbW1hLFxuICAgICAqIHdoaWNoIGlzIGtlcHQgdW5lc2NhcGVkIGFzIGEgbGlzdCBzZXBhcmF0b3IuXG4gICAgICpcbiAgICAgKiBTdHJpbmcgYXJyYXlzIGFyZSBjb25jYXRlbmF0ZWQgdXNpbmcgY29tbWFzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIGFwcGVuZFF1ZXJ5KGtleSwgdmFsdWUsIG9wZXJhdG9yID0gXCI9XCIpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVybCA9IFVybEJ1aWxkZXIuYXBwZW5kUXVlcnlTdHJpbmcodGhpcy51cmwsIHRoaXMuaGFzUXVlcnkgPyBcIiZcIiA6IFwiP1wiLCBrZXksIHZhbHVlLCBvcGVyYXRvcik7XG4gICAgICAgIHRoaXMuaGFzUXVlcnkgPSB0cnVlO1xuICAgIH1cbn1cbmV4cG9ydHMuVXJsQnVpbGRlciA9IFVybEJ1aWxkZXI7XG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIHVzZWQgZm9yIGJ1aWxkaW5nIHJlcXVlc3RzIHRvIGEgUkVTVCBBUEkuXG4gKi9cbmNsYXNzIFJlcXVlc3RCdWlsZGVyIHtcbiAgICBiYXNlVXJsO1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUmVxdWVzdEJ1aWxkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmFzZVVybCBUaGUgYmFzZSBVUkwgb2YgdGhlIHNlcnZpY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYmFzZVVybCkge1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGRvd25sb2FkIHRoZSByZXNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmxPYmogdGhlIFVSTCB0byBmZXRjaC5cbiAgICAgKi9cbiAgICBhc3luYyByZXF1ZXN0KHVybE9iaiwgaW5pdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZCh1cmxPYmoudXJsLCBpbml0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBkb3dubG9hZCB0aGUgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsT2JqIHRoZSBVUkwgdG8gZmV0Y2guXG4gICAgICovXG4gICAgYXN5bmMgcmVxdWVzdEJsb2IodXJsT2JqLCBpbml0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkQmxvYih1cmxPYmoudXJsLCBpbml0KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RCdWlsZGVyID0gUmVxdWVzdEJ1aWxkZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVsZXRlQXJ0aWZhY3RVc2luZ0RFTEVURSA9IGRlbGV0ZUFydGlmYWN0VXNpbmdERUxFVEU7XG5leHBvcnRzLmRlbGV0ZUZpbGVVc2luZ0RFTEVURSA9IGRlbGV0ZUZpbGVVc2luZ0RFTEVURTtcbmV4cG9ydHMuZ2V0QXJ0aWZhY3RGaWxlVXNpbmdHRVQgPSBnZXRBcnRpZmFjdEZpbGVVc2luZ0dFVDtcbmV4cG9ydHMuZ2V0QXJ0aWZhY3RVc2luZ0dFVCA9IGdldEFydGlmYWN0VXNpbmdHRVQ7XG5leHBvcnRzLnB1dEFydGlmYWN0RmlsZVVzaW5nUFVUID0gcHV0QXJ0aWZhY3RGaWxlVXNpbmdQVVQ7XG5leHBvcnRzLnJlZ2lzdGVyQXJ0aWZhY3RVc2luZ1BVVCA9IHJlZ2lzdGVyQXJ0aWZhY3RVc2luZ1BVVDtcbmV4cG9ydHMuZGVsZXRlU2NoZW1hVXNpbmdERUxFVEUgPSBkZWxldGVTY2hlbWFVc2luZ0RFTEVURTtcbmV4cG9ydHMuZ2V0RG9jdW1lbnRVc2luZ0dFVCA9IGdldERvY3VtZW50VXNpbmdHRVQ7XG5leHBvcnRzLmdldFNjaGVtYVVzaW5nR0VUID0gZ2V0U2NoZW1hVXNpbmdHRVQ7XG5leHBvcnRzLmxpc3RVc2luZ0dFVCA9IGxpc3RVc2luZ0dFVDtcbmV4cG9ydHMudXBkYXRlU2NoZW1hUGVybWlzc2lvblVzaW5nUE9TVCA9IHVwZGF0ZVNjaGVtYVBlcm1pc3Npb25Vc2luZ1BPU1Q7XG4vKipcbiAqIEFydGlmYWN0IFNlcnZpY2UgdjFcbiAqIE5vIGRlc2NyaXB0aW9uIHByb3ZpZGVkIChnZW5lcmF0ZWQgYnkgU3dhZ2dlciBDb2RlZ2VuIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4pXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC4xXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBBcnRpZmFjdHNBcGlcbiAqL1xuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdtb2RpZnlSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgYSBzcGVjaWZpYyBhcnRpZmFjdFxuICogQHBhcmFtIGFydGlmYWN0SHJuIFRoZSBIUk4gb2YgdGhlIGFydGlmYWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFydGlmYWN0VXNpbmdERUxFVEUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2FydGlmYWN0L3thcnRpZmFjdEhybn1cIi5yZXBsYWNlKFwie2FydGlmYWN0SHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXJ0aWZhY3RIcm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdtb2RpZnlSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgYSBzcGVjaWZpYyBhcnRpZmFjdCBmaWxlXG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcGF0aCB0byBhcnRpZmFjdCBmaWxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZpbGVVc2luZ0RFTEVURShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvYXJ0aWZhY3Qve2FydGlmYWN0SHJufS97ZmlsZU5hbWV9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7YXJ0aWZhY3RIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhcnRpZmFjdEhyblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2ZpbGVOYW1lfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmlsZU5hbWVcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdyZWFkUmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOXG4gKlxuICogQHN1bW1hcnkgUmV0cmlldmUgYSBzcGVjaWZpYyBhcnRpZmFjdCBmaWxlXG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcGF0aCB0byBhcnRpZmFjdCBmaWxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFydGlmYWN0RmlsZVVzaW5nR0VUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9hcnRpZmFjdC97YXJ0aWZhY3RIcm59L3tmaWxlTmFtZX1cIlxuICAgICAgICAucmVwbGFjZShcInthcnRpZmFjdEhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFydGlmYWN0SHJuXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7ZmlsZU5hbWV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmaWxlTmFtZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEBzdW1tYXJ5IGdldEFydGlmYWN0XG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXJ0aWZhY3RVc2luZ0dFVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIve2FydGlmYWN0SHJufVwiLnJlcGxhY2UoXCJ7YXJ0aWZhY3RIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhcnRpZmFjdEhyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdtb2RpZnlSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBDcmVhdGUgb3IgdXBkYXRlIGEgc3BlY2lmaWMgYXJ0aWZhY3RcbiAqIEBwYXJhbSBhcnRpZmFjdEhybiBUaGUgSFJOIG9mIHRoZSBhcnRpZmFjdFxuICogQHBhcmFtIGZpbGVOYW1lIFRoZSBwYXRoIHRvIGFydGlmYWN0IGZpbGVcbiAqIEBwYXJhbSBmaWxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1dEFydGlmYWN0RmlsZVVzaW5nUFVUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9hcnRpZmFjdC97YXJ0aWZhY3RIcm59L3tmaWxlTmFtZX1cIlxuICAgICAgICAucmVwbGFjZShcInthcnRpZmFjdEhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFydGlmYWN0SHJuXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7ZmlsZU5hbWV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmaWxlTmFtZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiZmlsZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImZpbGVcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAnYXBpQWNjZXNzJ1xuICpcbiAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGEgbmV3IGdyb3VwIGFuZCBhcnRpZmFjdFxuICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwSWQgb2YgdGhlIGFydGlmYWN0LiBSZXZlcnNlZCBpbnRlcm5ldCBkb21haW4gbmFtZSBzdWNoIGFzIGNvbS5oZXJlLnJpYi5zY2hlbWFcbiAqIEBwYXJhbSBhcnRpZmFjdElkIFRoZSBJRCBvZiB0aGUgYXJ0aWZhY3RcbiAqIEBwYXJhbSByZWdpc3RlclJlcXVlc3QgVGhlIHJlZ2lzdGVyIHJlcXVlc3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJBcnRpZmFjdFVzaW5nUFVUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9hcnRpZmFjdC9yZWdpc3Rlci97Z3JvdXBJZH0ve2FydGlmYWN0SWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcInthcnRpZmFjdElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXJ0aWZhY3RJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wicmVnaXN0ZXJSZXF1ZXN0XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wicmVnaXN0ZXJSZXF1ZXN0XCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjaGVtYXNBcGlcbiAqL1xuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdtb2RpZnlSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgc2NoZW1hXG4gKiBAcGFyYW0gc2NoZW1hSHJuIFRoZSBIUk4gb2YgdGhlIHNjaGVtYVxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVTY2hlbWFVc2luZ0RFTEVURShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvc2NoZW1hL3tzY2hlbWFIcm59XCIucmVwbGFjZShcIntzY2hlbWFIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJzY2hlbWFIcm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdyZWFkUmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOXG4gKlxuICogQHN1bW1hcnkgUmVzb2x2ZSBhIHNjaGVtYSBkb2MgdmFyaWFudCBVUkxcbiAqIEBwYXJhbSBzY2hlbWFIcm4gVGhlIEhSTiBvZiB0aGUgc2NoZW1hXG4gKiBAcGFyYW0gZmlsZSBUaGUgcGF0aCB0byBzY2hlbWEgZmlsZVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXREb2N1bWVudFVzaW5nR0VUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9zY2hlbWEve3NjaGVtYUhybn0vZG9jL3tmaWxlfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3NjaGVtYUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInNjaGVtYUhyblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2ZpbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmaWxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAncmVhZFJlc291cmNlJyBmb3IgdGhlIGdpdmVuIEhSTlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIHNjaGVtYSBkZXRhaWxzXG4gKiBAcGFyYW0gc2NoZW1hSHJuIFRoZSBIUk4gb2YgdGhlIHNjaGVtYVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRTY2hlbWFVc2luZ0dFVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvc2NoZW1hL3tzY2hlbWFIcm59XCIucmVwbGFjZShcIntzY2hlbWFIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJzY2hlbWFIcm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdhcGlBY2Nlc3MnXG4gKlxuICogQHN1bW1hcnkgTGlzdCB0aGUgYXZhaWxhYmxlIHNjaGVtYXNcbiAqIEBwYXJhbSBzb3J0XG4gKiBAcGFyYW0gb3JkZXJcbiAqIEBwYXJhbSBmcm9tXG4gKiBAcGFyYW0gbGltaXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdFVzaW5nR0VUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9zY2hlbWFcIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic29ydFwiLCBwYXJhbXNbXCJzb3J0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwib3JkZXJcIiwgcGFyYW1zW1wib3JkZXJcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmcm9tXCIsIHBhcmFtc1tcImZyb21cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUkVBRCBncmFudHMgJ3JlYWRSZXNvdXJjZScsIE1PRElGWSBncmFudHMgJ21vZGlmeVJlc291cmNlJywgU0hBUkUgZ3JhbnRzICdzaGFyZVJlc291cmNlJy5cbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ3NoYXJlUmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOLlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZSBzY2hlbWEgcGVybWlzc2lvbnMgZm9yIHVzZXIgb24gdGhlIHNwZWNpZmllZCBzY2hlbWEgYW5kIGFzc29jaWF0ZWQgYXJ0aWZhY3QuXG4gKiBAcGFyYW0gc2NoZW1hSHJuIFRoZSBIUk4gb2YgdGhlIHNjaGVtYVxuICogQHBhcmFtIHVwZGF0ZVBlcm1pc3Npb25SZXF1ZXN0IFRoZSBwZXJtaXNzaW9uIHJlcXVlc3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NoZW1hUGVybWlzc2lvblVzaW5nUE9TVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvc2NoZW1hL3tzY2hlbWFIcm59L3Blcm1pc3Npb25cIi5yZXBsYWNlKFwie3NjaGVtYUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInNjaGVtYUhyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcInVwZGF0ZVBlcm1pc3Npb25SZXF1ZXN0XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1widXBkYXRlUGVybWlzc2lvblJlcXVlc3RcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi4gYW5kIGl0cyBhZmZpbGlhdGUocykuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBjb250YWluIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uXG4gKiBjb250cm9sbGVkIGJ5IEhFUkUgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGVnaXNsYXRpb24uXG4gKiBBbnkgdXNlIGFuZCB1dGlsaXphdGlvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgYW5kXG4gKiBkaXNjbG9zdXJlIHRvIGFueSB0aGlyZCBwYXJ0aWVzIGlzIGNvbmRpdGlvbmFsIHVwb24gaGF2aW5nIGEgc2VwYXJhdGVcbiAqIGFncmVlbWVudCB3aXRoIEhFUkUgZm9yIHRoZSBhY2Nlc3MsIHVzZSwgdXRpbGl6YXRpb24gb3IgZGlzY2xvc3VyZSBvZiB0aGlzXG4gKiBzb2Z0d2FyZS4gSW4gdGhlIGFic2VuY2Ugb2Ygc3VjaCBhZ3JlZW1lbnQsIHRoZSB1c2Ugb2YgdGhlIHNvZnR3YXJlIGlzIG5vdFxuICogYWxsb3dlZC5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRFbnRpdHlHcm91cE1lbWJlcnNoaXAgPSBnZXRFbnRpdHlHcm91cE1lbWJlcnNoaXA7XG5leHBvcnRzLmdldEVudGl0eU1hbmFnZWRHcm91cHMgPSBnZXRFbnRpdHlNYW5hZ2VkR3JvdXBzO1xuZXhwb3J0cy5nZXRSZWFsbU1lbWJlciA9IGdldFJlYWxtTWVtYmVyO1xuZXhwb3J0cy5nZXRSZWFsbU1lbWJlcnMgPSBnZXRSZWFsbU1lbWJlcnM7XG5leHBvcnRzLmNhbmNlbFJlYWxtTWVtYmVySW52aXRlID0gY2FuY2VsUmVhbG1NZW1iZXJJbnZpdGU7XG5leHBvcnRzLmNyZWF0ZVJlYWxtTWVtYmVySW52aXRlID0gY3JlYXRlUmVhbG1NZW1iZXJJbnZpdGU7XG5leHBvcnRzLnJlc2VuZFJlYWxtTWVtYmVySW52aXRlID0gcmVzZW5kUmVhbG1NZW1iZXJJbnZpdGU7XG5leHBvcnRzLnNlYXJjaFJlYWxtTWVtYmVySW52aXRlcyA9IHNlYXJjaFJlYWxtTWVtYmVySW52aXRlcztcbmV4cG9ydHMuYWRkR3JhbnQgPSBhZGRHcmFudDtcbmV4cG9ydHMuZ2V0R3JhbnQgPSBnZXRHcmFudDtcbmV4cG9ydHMuZ2V0R3JhbnRzID0gZ2V0R3JhbnRzO1xuZXhwb3J0cy5saXN0R3JhbnRzID0gbGlzdEdyYW50cztcbmV4cG9ydHMucmVtb3ZlR3JhbnQgPSByZW1vdmVHcmFudDtcbmV4cG9ydHMuYWRkUm9sZUVudGl0eSA9IGFkZFJvbGVFbnRpdHk7XG5leHBvcnRzLmRlbGV0ZVJvbGVFbnRpdHkgPSBkZWxldGVSb2xlRW50aXR5O1xuZXhwb3J0cy5nZXRNeVJvbGVzID0gZ2V0TXlSb2xlcztcbmV4cG9ydHMuZ2V0Um9sZSA9IGdldFJvbGU7XG5leHBvcnRzLmdldFJvbGVFbnRpdGllcyA9IGdldFJvbGVFbnRpdGllcztcbmV4cG9ydHMuZ2V0Um9sZUVudGl0eSA9IGdldFJvbGVFbnRpdHk7XG5leHBvcnRzLmdldFJvbGVQZXJtaXNzaW9uID0gZ2V0Um9sZVBlcm1pc3Npb247XG5leHBvcnRzLmdldFJvbGVQZXJtaXNzaW9ucyA9IGdldFJvbGVQZXJtaXNzaW9ucztcbmV4cG9ydHMuZ2V0Um9sZXMgPSBnZXRSb2xlcztcbmV4cG9ydHMuYWRkR3JvdXBNZW1iZXIgPSBhZGRHcm91cE1lbWJlcjtcbmV4cG9ydHMuY3JlYXRlR3JvdXAgPSBjcmVhdGVHcm91cDtcbmV4cG9ydHMuZGVsZXRlR3JvdXAgPSBkZWxldGVHcm91cDtcbmV4cG9ydHMuZ2V0R3JvdXAgPSBnZXRHcm91cDtcbmV4cG9ydHMuZ2V0R3JvdXBNZW1iZXIgPSBnZXRHcm91cE1lbWJlcjtcbmV4cG9ydHMuZ2V0R3JvdXBNZW1iZXJzID0gZ2V0R3JvdXBNZW1iZXJzO1xuZXhwb3J0cy5nZXRHcm91cFJvbGVzID0gZ2V0R3JvdXBSb2xlcztcbmV4cG9ydHMuZ2V0R3JvdXBzID0gZ2V0R3JvdXBzO1xuZXhwb3J0cy5nZXRNeUdyb3VwcyA9IGdldE15R3JvdXBzO1xuZXhwb3J0cy5sZWF2ZUdyb3VwID0gbGVhdmVHcm91cDtcbmV4cG9ydHMucmVtb3ZlR3JvdXBNZW1iZXIgPSByZW1vdmVHcm91cE1lbWJlcjtcbmV4cG9ydHMudXBkYXRlR3JvdXAgPSB1cGRhdGVHcm91cDtcbmV4cG9ydHMuYWRkUHJvamVjdE1lbWJlciA9IGFkZFByb2plY3RNZW1iZXI7XG5leHBvcnRzLmFkZFByb2plY3RSZXNvdXJjZVJlbGF0aW9uID0gYWRkUHJvamVjdFJlc291cmNlUmVsYXRpb247XG5leHBvcnRzLmNoZWNrUHJvamVjdEV4aXN0YW5jZSA9IGNoZWNrUHJvamVjdEV4aXN0YW5jZTtcbmV4cG9ydHMuY3JlYXRlUHJvamVjdCA9IGNyZWF0ZVByb2plY3Q7XG5leHBvcnRzLmRlbGV0ZVByb2plY3QgPSBkZWxldGVQcm9qZWN0O1xuZXhwb3J0cy5kZWxldGVQcm9qZWN0TWVtYmVyID0gZGVsZXRlUHJvamVjdE1lbWJlcjtcbmV4cG9ydHMuZGVsZXRlUHJvamVjdFJlc291cmNlUmVmZXJlbmNlID0gZGVsZXRlUHJvamVjdFJlc291cmNlUmVmZXJlbmNlO1xuZXhwb3J0cy5nZXRBbGxQcm9qZWN0TGlzdCA9IGdldEFsbFByb2plY3RMaXN0O1xuZXhwb3J0cy5nZXRQcm9qZWN0ID0gZ2V0UHJvamVjdDtcbmV4cG9ydHMuZ2V0UHJvamVjdExpc3QgPSBnZXRQcm9qZWN0TGlzdDtcbmV4cG9ydHMuZ2V0UHJvamVjdE1lbWJlciA9IGdldFByb2plY3RNZW1iZXI7XG5leHBvcnRzLmdldFByb2plY3RSZXNvdXJjZSA9IGdldFByb2plY3RSZXNvdXJjZTtcbmV4cG9ydHMubGVhdmVQcm9qZWN0ID0gbGVhdmVQcm9qZWN0O1xuZXhwb3J0cy5saXN0UHJvamVjdE1lbWJlcnMgPSBsaXN0UHJvamVjdE1lbWJlcnM7XG5leHBvcnRzLmxpc3RQcm9qZWN0UmVzb3VyY2VzID0gbGlzdFByb2plY3RSZXNvdXJjZXM7XG5leHBvcnRzLnBhdGNoUHJvamVjdCA9IHBhdGNoUHJvamVjdDtcbmV4cG9ydHMuZ2V0TGlzdE9mV2F5c1Jlc291cmNlSXNMaW5rYWJsZSA9IGdldExpc3RPZldheXNSZXNvdXJjZUlzTGlua2FibGU7XG5leHBvcnRzLmdldFJlc291cmNlID0gZ2V0UmVzb3VyY2U7XG5leHBvcnRzLmdldFJlc291cmNlTGlua2FiaWxpdHkgPSBnZXRSZXNvdXJjZUxpbmthYmlsaXR5O1xuZXhwb3J0cy5nZXRSZXNvdXJjZVByb2plY3RzID0gZ2V0UmVzb3VyY2VQcm9qZWN0cztcbmV4cG9ydHMuZ2V0UmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzO1xuZXhwb3J0cy5saXN0UmVhbG1SZXNvdXJjZXMgPSBsaXN0UmVhbG1SZXNvdXJjZXM7XG5leHBvcnRzLm1ha2VSZXNvdXJjZUxpbmthYmxlID0gbWFrZVJlc291cmNlTGlua2FibGU7XG5leHBvcnRzLnJlbW92ZVJlc291cmNlTGlua2FiaWxpdHkgPSByZW1vdmVSZXNvdXJjZUxpbmthYmlsaXR5O1xuZXhwb3J0cy51cGRhdGVSZXNvdXJjZUxpbmthYmlsaXR5ID0gdXBkYXRlUmVzb3VyY2VMaW5rYWJpbGl0eTtcbmV4cG9ydHMuYXR0YWNoUHJvamVjdFBvbGljeVRvTWVtYmVyID0gYXR0YWNoUHJvamVjdFBvbGljeVRvTWVtYmVyO1xuZXhwb3J0cy5jcmVhdGVQcm9qZWN0UG9saWN5ID0gY3JlYXRlUHJvamVjdFBvbGljeTtcbmV4cG9ydHMuZGVsZXRlUHJvamVjdFBvbGljeSA9IGRlbGV0ZVByb2plY3RQb2xpY3k7XG5leHBvcnRzLmRldGFjaFByb2plY3RQb2xpY3lGcm9tTWVtYmVyID0gZGV0YWNoUHJvamVjdFBvbGljeUZyb21NZW1iZXI7XG5leHBvcnRzLmdldEFsbFByb2plY3RNZW1iZXJzV2l0aEF0dGFjaGVkUG9saWN5ID0gZ2V0QWxsUHJvamVjdE1lbWJlcnNXaXRoQXR0YWNoZWRQb2xpY3k7XG5leHBvcnRzLmdldEF0dGFjaGVkUHJvamVjdFBvbGljaWVzRm9yTWVtYmVyID0gZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWNpZXNGb3JNZW1iZXI7XG5leHBvcnRzLmdldEF0dGFjaGVkUHJvamVjdFBvbGljeUZvck1lbWJlciA9IGdldEF0dGFjaGVkUHJvamVjdFBvbGljeUZvck1lbWJlcjtcbmV4cG9ydHMuZ2V0UHJvamVjdFBvbGljeSA9IGdldFByb2plY3RQb2xpY3k7XG5leHBvcnRzLmdldFByb2plY3RQb2xpY3lMaXN0ID0gZ2V0UHJvamVjdFBvbGljeUxpc3Q7XG5leHBvcnRzLnNldEF0dGFjaGVkUHJvamVjdFBvbGljaWVzVG9NZW1iZXIgPSBzZXRBdHRhY2hlZFByb2plY3RQb2xpY2llc1RvTWVtYmVyO1xuZXhwb3J0cy51cGRhdGVQcm9qZWN0UG9saWN5ID0gdXBkYXRlUHJvamVjdFBvbGljeTtcbmV4cG9ydHMuZ2V0UmVzb3VyY2VBY3Rpb25zRm9yUHJvamVjdCA9IGdldFJlc291cmNlQWN0aW9uc0ZvclByb2plY3Q7XG5leHBvcnRzLmdldFJlc291cmNlVHlwZUFjdGlvbkxpc3QgPSBnZXRSZXNvdXJjZVR5cGVBY3Rpb25MaXN0O1xuLyoqXG4gKiBBdXRob3JpemF0aW9uIEFQSSB2MS4xXG4gKiAgIFRoaXMgc3BlY2lmaWNhdGlvbiBpcyBpbnRlbmRlZCB0byBkZXNjcmliZSB0aGUgQXV0aG9yaXphdGlvbiB2MS4xIEFQSXNcbiAqXG4gKiAgIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjEuMFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKipcbiAqIFJldHJpZXZlIHRoZSBncm91cHMgYSBnaXZlbiBlbnRpdHkgaXMgYSBtZW1iZXIgb2YuIFJlc3RyaWN0aW9uczpcbiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkR3JvdXBzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCBlbnRpdHkuXG4gKlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSBncm91cHMgYSB1c2VyLCBIRVJFLTRiYTlhY2EzLWZkZjktNGNhZC1hM2RhLTUzNDQ5NGQ2MTk4ZiwgaXMgYSBtZW1iZXIgb2YsXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogXCJhY3Rpb25cIiA6IFwicmVhZEdyb3Vwc1wiXG4gKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06dXNlci9IRVJFLTRiYTlhY2EzLWZkZjktNGNhZC1hM2RhLTUzNDQ5NGQ2MTk4ZlwiXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0XG4gKlxuICogQHN1bW1hcnkgR2V0IGVudGl0eSBncm91cCBtZW1iZXJzaGlwXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgZ3JvdXAgb3IgcmVhbG0gbWVtYmVyXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RW50aXR5R3JvdXBNZW1iZXJzaGlwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZWFsbXMve3JlYWxtfS9tZW1iZXJzL3ttZW1iZXJ9L2dyb3Vwc1wiXG4gICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBncm91cHMgb3ZlciB3aGljaCB0aGUgcHJvdmlkZWQgZW50aXR5IGhhcyBiZWVuIGdyYW50ZWQgdGhlIHJvbGUgb2YgR3JvdXBBZG1pbi5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRHcm91cHMqKiBhY3Rpb24gYWdhaW5zdFxuICogdGhlIHNwZWNpZmllZCBlbnRpdHkuXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGdyb3VwcyBhIHVzZXIsIEhFUkUtNGJhOWFjYTMtZmRmOS00Y2FkLWEzZGEtNTM0NDk0ZDYxOThmLFxuICogaXMgYW4gYWRtaW4gb2YsIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRHcm91cHNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06dXNlci9IRVJFLTRiYTlhY2EzLWZkZjktNGNhZC1hM2RhLTUzNDQ5NGQ2MTk4ZlwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGVudGl0eSBtYW5hZ2VkIGdyb3VwXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgZ3JvdXAgb3IgcmVhbG0gbWVtYmVyXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RW50aXR5TWFuYWdlZEdyb3VwcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vbWVtYmVycy97bWVtYmVyfS9tYW5hZ2VkR3JvdXBzXCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlIHRoZSB1c2VyIG9yIGFwcGxpY2F0aW9uIGRldGFpbHMgb2YgdGhlIG1lbWJlciBkZWZpbmVkIGJ5IG1lbWJlcklkLiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0XG4gKiB0aGUgc3BlY2lmaWVkIHJlYWxtLlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIHJldHJpZXZlIGEgbWVtYmVyIG9mIHRoZSByZWFsbSwgX015UmVhbG1fLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nXG4gKiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHJlYWxtIG1lbWJlclxuICogQHBhcmFtIHJlYWxtIEhSTiBpZGVudGlmeWluZyB0aGUgcmVhbG1cbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIGdyb3VwIG9yIHJlYWxtIG1lbWJlclxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWFsbU1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBtZW1iZXJzIHdpdGhpbiB0aGUgcmVhbG0uIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRNZW1iZXJzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gbGlzdCB0aGUgbWVtYmVycyBvZiB0aGUgcmVhbG0sIF9NeVJlYWxtXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCByZWFsbSBtZW1iZXJzXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdHlwZSBvZiBtZW1iZXJzIHRvIHJldHVybiBpbiB0aGUgcmVzdWx0LlxuICogT25lIG9mICd1c2VyJyBvciAnYXBwJy4gICBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhbGwgZW50aXR5IHR5cGVzIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gcSBBIGZyZWUgdGV4dCBxdWVyeSBzdHJpbmcgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuXG4gKiBBIHNlYXJjaCBhZ2FpbnN0IG1lbWJlcnMgaW4gdGhlIHJlYWxtIHdpbGwgY29uc2lkZXIgdGhlXG4gKiAndXNlcklkJyxcbiAqICdmaXJzdG5hbWUnLFxuICogJ2xhc3RuYW1lJyxcbiAqICdlbWFpbCcsXG4gKiAnY2xpZW50SWQnLFxuICogJ25hbWUnIGFuZCAncm9sZXMnIGZpZWxkcyBvZiB0aGUgbWVtYmVycy5cbiAqIFRoZSBwcmVjaXNlIHNlYXJjaCBhbGdvcml0aG0gdXNlZCB0byBtYXRjaCBtZW1iZXJzIGlzIG5vdCBzcGVjaWZpZWQsXG4gKiBidXQgZ2VuZXJhbGx5IGFueSBtZW1iZXIgd2hlcmUgb25lIG9mIHRoZSBjb25zaWRlcmVkIGZpZWxkcyBoYXMgYSBmdWxsIG9yIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLlxuICogQHBhcmFtIHN0YXRlIE9ubHkgcmV0dXJuIHVzZXIgbWVtYmVycyB3aXRoIHRoZSBnaXZlbiAnc3RhdGUnIGluIHRoZSByZXN1bHRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWFsbU1lbWJlcnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L21lbWJlcnNcIi5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicVwiLCBwYXJhbXNbXCJxXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhdGVcIiwgcGFyYW1zW1wic3RhdGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENhbmNlbCBhbiBpbnZpdGF0aW9uIHRvIHRoZSByZWFsbS4gUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlSW52aXRlcyoqXG4gKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlYWxtLlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIGRlbGV0ZSBhbiBpbnZpdGF0aW9uIHRvIHRoZSByZWFsbSxcbiAqIF9NeVJlYWxtXywgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlSW52aXRlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBDYW5jZWwgYSB1c2VyIGludml0YXRpb24gdG8gYSByZWFsbVxuICogQHBhcmFtIHJlYWxtIEhSTiBpZGVudGlmeWluZyB0aGUgcmVhbG1cbiAqIEBwYXJhbSBpbnZpdGUgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gaW52aXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBjYW5jZWxSZWFsbU1lbWJlckludml0ZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vaW52aXRlcy97aW52aXRlfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAucmVwbGFjZShcIntpbnZpdGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJpbnZpdGVcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlIGFuZCBzZW5kIGFuIGludml0YXRpb24gdG8gYWRkIGEgbmV3IG1lbWJlciB0byB0aGUgcmVhbG0sXG4gKiBvcHRpb25hbGx5IGFzc2lnbiBtZW1iZXJzaGlwIHRvIG9uZSBvciBtb3JlIGdyb3VwcyBpZiB0aGUgSW52aXRlciBpcyBhbHNvIGEgKipHcm91cEFkbWluKipcbiAqIGZvciB0aGUgZ3JvdXAuIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZVxuICogKiptYW5hZ2VJbnZpdGVzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZWFsbS5cbiAqIEBleGFtcGxlOiBJbiBvcmRlciB0byBpbnZpdGUgYSBuZXcgdXNlciB0byB0aGUgcmVhbG0sIF9NeVJlYWxtXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUludml0ZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gaW52aXRlIGEgbmV3IHVzZXIgdG8gdGhlIHJlYWxtLCBfTXlSZWFsbV8sXG4gKiBhcyBhIG1lbWJlciBvZiB0aGUgZ3JvdXAgR1JPVVAtYTNkZWUyZmUtZmIzOC00MTgzLWI2ODYtMTRmZGVhNTk2NGMwLFxuICogdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9ucyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlSW52aXRlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC1hM2RlZTJmZS1mYjM4LTQxODMtYjY4Ni0xNGZkZWE1OTY0Y1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIGFuZCBzZW5kIGEgdXNlciBpbnZpdGF0aW9uIGZvciBhIHJlYWxtXG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHJlYWxtIEhSTiBpZGVudGlmeWluZyB0aGUgcmVhbG1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVhbG1NZW1iZXJJbnZpdGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L2ludml0ZXNcIi5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJlc2VuZCBhbiBpbnZpdGF0aW9uIHRvIGEgbmV3IG1lbWJlciB0byB0aGUgcmVhbG0uXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VJbnZpdGVzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIHJlc2VuZCBhbiBpbnZpdGUgdG8gYSBuZXcgdXNlciB0byB0aGUgcmVhbG0sIF9NeVJlYWxtXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUludml0ZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVzZW5kIGFuIGludml0YXRpb24gdG8gYSB1c2VyIGluIGEgcmVhbG1cbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKiBAcGFyYW0gaW52aXRlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGludml0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzZW5kUmVhbG1NZW1iZXJJbnZpdGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L2ludml0ZXMve2ludml0ZX1cIlxuICAgICAgICAucmVwbGFjZShcIntyZWFsbX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlYWxtXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7aW52aXRlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiaW52aXRlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBTZWFyY2ggZm9yIGludml0YXRpb25zIGluIHRoZSByZWFsbSwgb3B0aW9uYWxseSBwcm92aWRpbmcgYSBncm91cC5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZUludml0ZXMqKlxuICogYWN0aW9uIGFnYWluc3QgdGhlIHJlYWxtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyBwYXJ0eS5cbiAqXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gbGlzdCB0aGUgaW52aXRhdGlvbnMgd2l0aGluIHRoZSBjYWxsaW5nIHBhcnR5J3MgcmVhbG0gYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlSW52aXRlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGludml0YXRpb25zIGluIGEgcmVhbG1cbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKiBAcGFyYW0gZ3JvdXAgSFJOIGlkZW5pdGlmeWluZyB0aGUgZ3JvdXAgdG8gc2VhcmNoLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKiBAcGFyYW0gcSBBIGZyZWUgdGV4dCBxdWVyeSBzdHJpbmcgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuXG4gKiBBIHNlYXJjaCBhZ2FpbnN0IGludml0ZXMgaW4gdGhlIHJlYWxtIHdpbGwgY29uc2lkZXIgdGhlICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCBhbmQgJ2VtYWlsQWRkcmVzcycgZmllbGRzIG9mIHRoZSBpbnZpdGVzLlxuICogVGhlIHByZWNpc2Ugc2VhcmNoIGFsZ29yaXRobSB1c2VkIHRvIG1hdGNoIGludml0ZXMgaXMgbm90IHNwZWNpZmllZCwgYnV0IGdlbmVyYWxseSBhbnkgaW52aXRlIHdoZXJlIG9uZVxuICogb2YgdGhlIGNvbnNpZGVyZWQgZmllbGRzIGhhcyBhIGZ1bGwgb3IgcGFydGlhbCBtYXRjaCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlYXJjaFJlYWxtTWVtYmVySW52aXRlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vaW52aXRlc1wiLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJncm91cFwiLCBwYXJhbXNbXCJncm91cFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInFcIiwgcGFyYW1zW1wicVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR3JhbnRzQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogR3JhbnQgYWNjZXNzIHRvIGEgcmVzb3VyY2UgdG8gYW4gZW50aXR5LlxuICogVGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgaXMgdGhhdCB0aGUgc3BlY2lmaWVkIGVudGl0eSB3aWxsIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIHJlYWxtIG9mIHRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBtYXRjaCB0aGUgcmVhbG0gb2YgdGhlIHJlcXVlc3RlZCBlbnRpdHkuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiphZGRHcmFudDp7YWN0aW9uSWR9KiogT1IgKipzaGFyZSoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGFkZCBhIGdyYW50IGZvciB0aGUgKipyZWFkUmVzb3VyY2UqKiBhY3Rpb24gYWdhaW5zdCByZXNvdXJjZSAqKmhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZyoqIGEgcGVybWlzc2lvblxuICogd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJhZGRHcmFudDpyZWFkUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiBPUlxuICogKiBcImFjdGlvblwiIDogXCJzaGFyZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHcmFudCBhY2Nlc3MgdG8gYSByZXNvdXJjZSB0byBhbiBlbnRpdHkuXG4gKiBAcGFyYW0gcmVzb3VyY2VIcm4gVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlXG4gKiBAcGFyYW0gZW50aXR5SWQgVGhlIHRhcmdldCBlbnRpdHlJZCB0byBncmFudCBhY2Nlc3MgdG9cbiAqIEBwYXJhbSBhY3Rpb25JZCBUaGUgYWN0aW9uIHRvIGFzc2lnbiBhcyBhbGxvd2VkIGFnYWluc3QgdGhlIHJlc291cmNlXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5IHRvIGdyYW50IGFjY2VzcyB0by4gIE11c3QgYmUgb25lIG9mIHVzZXIsIGFwcCwgb3IgZ3JvdXBcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkR3JhbnQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2dyYW50cy9yZXNvdXJjZXMve3Jlc291cmNlSHJufS9lbnRpdGllcy97ZW50aXR5SWR9L2FjdGlvbnMve2FjdGlvbklkfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VIcm5cIl0pKVxuICAgICAgICAucmVwbGFjZShcIntlbnRpdHlJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eUlkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7YWN0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhY3Rpb25JZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbnRpdHlUeXBlXCIsIHBhcmFtc1tcImVudGl0eVR5cGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgYSBzaW5nbGUgZ3JhbnQgZ2l2ZW4gdG8gYW4gZW50aXR5LlxuICogVGhpcyBjYWxscyByZXR1cm5zIGFueSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlIHNwZWNpZmllZCBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIG9uIHRoZSByZXF1ZXN0ZWQgZW50aXR5LlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgcmVhbG0gb2YgdGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIG1hdGNoIHRoZSByZWFsbSBvZiB0aGUgcmVxdWVzdGVkIGFwcC5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKmxpc3RHcmFudHMqKiBPUiAqKnNoYXJlKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqICogSW4gb3JkZXIgdG8gZ2V0IGEgZ3JhbnQgYWdhaW5zdCByZXNvdXJjZSAqKmhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZyoqXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0R3JhbnRzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogT1JcbiAqICogXCJhY3Rpb25cIiA6IFwic2hhcmVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgc2luZ2xlIGdyYW50IGdpdmVuIHRvIGFuIGVudGl0eVxuICogQHBhcmFtIHJlc291cmNlSHJuIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIGVudGl0eUlkIFRoZSB0YXJnZXQgZW50aXR5SWQgdG8gZ2V0IHRoZSBncmFudCBvZlxuICogQHBhcmFtIGFjdGlvbklkIFRoZSBhY3Rpb24gb2YgdGhlIGdyYW50XG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5IHRvIGdldCB0aGUgZ3JhbnQgb2YuICBNdXN0IGJlIG9uZSBvZiB1c2VyLCBhcHAsIG9yIGdyb3VwXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEdyYW50KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncmFudHMvcmVzb3VyY2VzL3tyZXNvdXJjZUhybn0vZW50aXRpZXMve2VudGl0eUlkfS9hY3Rpb25zL3thY3Rpb25JZH1cIlxuICAgICAgICAucmVwbGFjZShcIntyZXNvdXJjZUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlSHJuXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7ZW50aXR5SWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJlbnRpdHlJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2FjdGlvbklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYWN0aW9uSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgZ3JhbnRzLiBUaGlzIGNhbGwgZGVzY3JpYmVzIHRoZSBwZXJtaXNzaW9ucyBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWVkIGVudGl0eSB0aGF0IGdyYW50IGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIHJlYWxtIG9mIHRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBtYXRjaCB0aGUgcmVhbG0gb2YgdGhlIHJlcXVlc3RlZCBlbnRpdHkuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipsaXN0R3JhbnRzKiogT1IgKipzaGFyZSoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBnZXQgZ3JhbnRzIGFnYWluc3QgcmVzb3VyY2UgKipocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2cqKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0R3JhbnRzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogT1JcbiAqICogXCJhY3Rpb25cIiA6IFwic2hhcmVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGdyYW50cyBnaXZlbiB0byBhIHVzZXIsIGFwcCwgb3IgZ3JvdXBcbiAqIEBwYXJhbSByZXNvdXJjZUhybiBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSBlbnRpdHlJZCBUaGUgZW50aXR5SWQgdG8gZ2V0IHRoZSBncmFudHMgb2ZcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgcmVxdWVzdGVkLiAgTXVzdCBiZSBvbmUgb2YgdXNlciwgYXBwLCBvciBncm91cFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRHcmFudHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2dyYW50cy9yZXNvdXJjZXMve3Jlc291cmNlSHJufS9lbnRpdGllcy97ZW50aXR5SWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2VudGl0eUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZW50aXR5SWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBMaXN0IGdyYW50cyBvbiB1c2VyLCBhcHBzLCBvciBncm91cHMuXG4gKiBUaGlzIGNhbGwgZGVzY3JpYmVzIHRoZSBwZXJtaXNzaW9ucyBhc3NpZ25lZCB0byBhbnkgdXNlciwgYXBwLCBvciBncm91cCAqKmluIHRoZSBzYW1lIHJlYWxtIGFzIHRoZSBjYWxsaW5nIHByaW5jaXBhbCoqXG4gKiB0aGF0IGhhcyBiZWVuIGdyYW50ZWQgYWNjZXNzIHRvIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdGhyb3VnaCBhbiBleGFjdCBtYXRjaGluZyBwZXJtaXNzaW9uLlxuICogUGVybWlzc2lvbnMgZ3JhbnRlZCB0aHJvdWdoIHBvbGljaWVzIGFuZCByb2xlcyBhcmUgbm90IGluY2x1ZGVkLlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbGlzdEdyYW50cyoqIE9SICoqc2hhcmUqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbGlzdCBncmFudHMgYWdhaW5zdCByZXNvdXJjZSAqKmhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZyoqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcImxpc3RHcmFudHNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiBPUlxuICogKiBcImFjdGlvblwiIDogXCJzaGFyZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBMaXN0IGdyYW50cyBvbiB1c2VycywgYXBwcywgb3IgZ3JvdXBzXG4gKiBAcGFyYW0gcmVzb3VyY2VIcm4gVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBSZXN0cmljdCB0byBvbmx5IHRoaXMgdHlwZSBvZiBlbnRpdHkgIGluIHRoZSByZXNwb25zZS4gIE11c3QgYmUgb25lIG9mIHVzZXIsIGFwcCwgb3IgZ3JvdXBcbiAqIEBwYXJhbSBwYWdlVG9rZW4gV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuICdjb3VudCcgdG90YWwgcmVjb3JkcywgdXNlIHRoZSBwYWdlVG9rZW4gZnJvbSB0aGUgcHJldmlvdXMgcGFnZSB0byByZXRyaWV2ZSB0aGUgbmV4dCBwYWdlXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RHcmFudHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2dyYW50cy9yZXNvdXJjZXMve3Jlc291cmNlSHJufS9lbnRpdGllc1wiLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbnRpdHlUeXBlXCIsIHBhcmFtc1tcImVudGl0eVR5cGVcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldm9rZSBhY2Nlc3MgdG8gYSByZXNvdXJjZSBmcm9tIGFuIGVudGl0eS5cbiAqIFRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIGlzIHRoYXQgdGhlIHNwZWNpZmllZCBlbnRpdHkgd2lsbCBoYXZlIGFueSBkaXJlY3RseSBhc3NpZ25lZCBwZXJtaXNzaW9uXG4gKiB0byB0YWtlIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZSByZW1vdmVkLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIHJlYWxtIG9mIHRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBtYXRjaCB0aGUgcmVhbG0gb2YgdGhlIHJlcXVlc3RlZCBhcHAuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZW1vdmVHcmFudDp7YWN0aW9uSWR9KipcbiAqIE9SICoqc2hhcmUqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gcmVtb3ZlIGEgZ3JhbnQgZm9yIHRoZSAqKnJlYWRSZXNvdXJjZSoqIGFjdGlvbiBhZ2FpbnN0IHJlc291cmNlICoqaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nKipcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlbW92ZUdyYW50OnJlYWRSZXNvdXJjZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqIE9SXG4gKiAqIFwiYWN0aW9uXCIgOiBcInNoYXJlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFJldm9rZSBhY2Nlc3MgdG8gYSByZXNvdXJjZSBmcm9tIGFuIGVudGl0eVxuICogQHBhcmFtIHJlc291cmNlSHJuIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIGVudGl0eUlkIFRoZSB0YXJnZXQgZW50aXR5SWQgdG8gcmV2b2tlIGFjY2VzcyBmcm9tXG4gKiBAcGFyYW0gYWN0aW9uSWQgVGhlIGFjdGlvbiBhZ2FpbnN0IHRoZSByZXNvdXJjZSB0byByZXZva2UgYWNjZXNzIGZyb21cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgdG8gcmV2b2tlIGFjY2VzcyBmcm9tLiAgTXVzdCBiZSBvbmUgb2YgdXNlciwgYXBwLCBvciBncm91cFxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHcmFudChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JhbnRzL3Jlc291cmNlcy97cmVzb3VyY2VIcm59L2VudGl0aWVzL3tlbnRpdHlJZH0vYWN0aW9ucy97YWN0aW9uSWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2VudGl0eUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZW50aXR5SWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcInthY3Rpb25JZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFjdGlvbklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImVudGl0eVR5cGVcIiwgcGFyYW1zW1wiZW50aXR5VHlwZVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJvbGVzQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQXNzaWduIHRoZSByb2xlIHByb3ZpZGVkIHRvIHRoZSBnaXZlbiBlbnRpdHkuXG4gKiBJZiB0aGUgcHJvdmlkZWQgcm9sZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBncm91cCwgdGhlIGVudGl0eSBiZWluZyBhc3NpZ25lZCB0aGUgcm9sZSBtdXN0IGJlIGEgbWVtYmVyIG9mIHRoZSBhc3NvY2lhdGVkIGdyb3VwLlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlRW50aXRpZXMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGFzc2lnbiB0aGUgcm9sZSwgX0dyb3VwQWRtaW5fLCB0byBhbiBlbnRpdHkgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZFxuICogYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUVudGl0aWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEFzc2lnbiBhIHJvbGUgdG8gYW4gZW50aXR5XG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gZW50aXR5IEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGVudGl0eVxuICovXG5hc3luYyBmdW5jdGlvbiBhZGRSb2xlRW50aXR5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vZW50aXRpZXMve2VudGl0eX1cIlxuICAgICAgICAucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2VudGl0eX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSByb2xlIHByb3ZpZGVkIHRvIGZyb20gdGhlIGdpdmVuIG1lbWJlci5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZUVudGl0aWVzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByb2xlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byByZXZva2UgdGhlIHJvbGUsIF9Hcm91cEFkbWluXywgZnJvbSBhbiBlbnRpdHkgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlRW50aXRpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cm9sZS9ST0xFLWMxNjYyMTM4LWExNzAtNDI2NC1iYTE4LTdiNTA2YTcwOGMzN1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmV2b2tlIGEgcm9sZSBmcm9tIGFuIGVudGl0eVxuICogQHBhcmFtIHJvbGUgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gcm9sZVxuICogQHBhcmFtIGVudGl0eSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiBlbnRpdHlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlUm9sZUVudGl0eShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXMve3JvbGV9L2VudGl0aWVzL3tlbnRpdHl9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cm9sZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJvbGVcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntlbnRpdHl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJlbnRpdHlcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2Ygcm9sZXMgd2hpY2ggaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIHRoZSBjYWxsaW5nIHBhcnR5LlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgTXkgUm9sZXNcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRNeVJvbGVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy9tZVwiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgdGhlIHJvbGUgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgUm9sZSBIUk4uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZFJvbGVzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZWFsbS5cbiAqXG4gKiAgRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJldHJpZXZlIGEgcm9sZSB3aXRoaW4gdGhlIHJlYWxtLCBfTXlSZWFsbV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkUm9sZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IFJvbGVcbiAqIEBwYXJhbSByb2xlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIHJvbGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Um9sZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXMve3JvbGV9XCIucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGVudGl0aWVzIHdoaWNoIGhhdmUgYmVlbiBhc3NpZ25lZCB0aGUgcm9sZSBhcyBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCByb2xlIEhSTi5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkRW50aXRpZXMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gKlxuICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGxpc3QgdGhlIGVudGl0aWVzIGFzc2lnbmVkIHRoZSByb2xlLCBfXG4gKiBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZEVudGl0aWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCByb2xlIGVudGl0aWVzXG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Um9sZUVudGl0aWVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vZW50aXRpZXNcIi5yZXBsYWNlKFwie3JvbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyb2xlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmUgYSBzaW5nbGUgZW50aXR5IHdoaWNoIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSByb2xlIGFzIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIHJvbGUgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRFbnRpdGllcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gcmV0cmlldmUgYW4gZW50aXR5IGFzc2lnbmVkIHRoZSByb2xlLCBfR3JvdXBBZG1pbl8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkRW50aXRpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cm9sZS9ST0xFLWMxNjYyMTM4LWExNzAtNDI2NC1iYTE4LTdiNTA2YTcwOGMzN1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgc2luZ2xlIHJvbGUgZW50aXR5XG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gZW50aXR5IEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGVudGl0eVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSb2xlRW50aXR5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vZW50aXRpZXMve2VudGl0eX1cIlxuICAgICAgICAucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2VudGl0eX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldCBhIHNpbmdsZSBwZXJtaXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm9sZSBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBSb2xlIEhSTi5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkUGVybWlzc2lvbnMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIHJldHJpZXZlIGEgc2luZ2xlIHJvbGUgcGVybWlzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCByb2xlIGluIHJlYWxtIF9NeVJlYWxtXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRQZXJtaXNzaW9uc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpyb2xlL1JPTEUtYzE2NjIxMzgtYTE3MC00MjY0LWJhMTgtN2I1MDZhNzA4YzM3XCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgUm9sZSBQZXJtaXNzaW9uXG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gcGVybWlzc2lvbiBQZXJtaXNzaW9uIGlkZW50aWZpZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Um9sZVBlcm1pc3Npb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3JvbGVzL3tyb2xlfS9wZXJtaXNzaW9ucy97cGVybWlzc2lvbn1cIlxuICAgICAgICAucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie3Blcm1pc3Npb259XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwZXJtaXNzaW9uXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBwZXJtaXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHJvbGUgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgUm9sZSBIUk4uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZFBlcm1pc3Npb25zKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByb2xlLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBsaXN0IHJvbGUgcGVybWlzc2lvbnMgZm9yIHRoZSBzcGVjaWZpZWQgcm9sZSBpbiByZWFsbSBfTXlSZWFsbV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkUGVybWlzc2lvbnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cm9sZS9ST0xFLWMxNjYyMTM4LWExNzAtNDI2NC1iYTE4LTdiNTA2YTcwOGMzN1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IFJvbGUgUGVybWlzc2lvbnNcbiAqIEBwYXJhbSByb2xlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIHJvbGVcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSb2xlUGVybWlzc2lvbnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3JvbGVzL3tyb2xlfS9wZXJtaXNzaW9uc1wiLnJlcGxhY2UoXCJ7cm9sZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJvbGVcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiByb2xlcyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb3ZpZGVkIHJlYWxtLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRSb2xlcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGxpc3Qgcm9sZXMgd2l0aGluIHRoZSByZWFsbSwgX015UmVhbG1fLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkXG4gKiBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFJvbGVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBSb2xlc1xuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKiBAcGFyYW0gcm9sZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJvbGUgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdCBzZXQuXG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiBvZiB0aGUgcmVzb3VyY2Ugd2hpY2ggdGhlIHJvbGVzIHJldHVybmVkIGluIHRoZSByZXN1bHQgc2V0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFJvbGVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlc1wiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicm9sZU5hbWVcIiwgcGFyYW1zW1wicm9sZU5hbWVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVzb3VyY2VcIiwgcGFyYW1zW1wicmVzb3VyY2VcIl0pO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHcm91cHNBcGlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbWVtYmVyIHRvIGEgZ3JvdXAuXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBncm91cFxuICogaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGFkZCBhIG1lbWJlciB0byB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkXG4gKiBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEFkZCBhIG1lbWJlciB0byBhIGdyb3VwXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIGdyb3VwIG9yIHJlYWxtIG1lbWJlclxuICovXG5hc3luYyBmdW5jdGlvbiBhZGRHcm91cE1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZSBhIGdyb3VwIHdpdGhpbiB0aGUgcmVhbG0gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgcGFydHkuXG4gKiBUaGUgY2FsbGluZyBwYXJ0eSB3aWxsIGJlIG1hZGUgYSBtZW1iZXIgYW5kIGFuIGFkbWluaXN0cmF0b3Igb2YgdGhlIGNyZWF0ZWQgZ3JvdXAuXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqY3JlYXRlR3JvdXAqKiBhY3Rpb25cbiAqIGFnYWluc3QgdGhlIHJlYWxtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyBwYXJ0eS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBjcmVhdGUgYSBncm91cCB3aXRoaW4gdGhlIGNhbGxpbmcgcGFydHkncyByZWFsbSBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJjcmVhdGVHcm91cFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBDcmVhdGUgZ3JvdXBcbiAqIEBwYXJhbSBib2R5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUdyb3VwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHNcIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlbGV0ZSB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlXG4gKiB0aGUgKipkZWxldGVHcm91cCoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZGVsZXRlIHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJkZWxldGVHcm91cFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IGRlbGV0ZSBncm91cFxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUdyb3VwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9XCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRNZW1iZXJzKiogYWN0aW9uXG4gKiBhZ2FpbnN0IHRoZSByZWFsbSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgcGFydHkuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmV0cmlldmUgYSBncm91cCB3aXRoaW4gdGhlIGNhbGxpbmcgcGFydHkncyByZWFsbSBhIHBlcm1pc3Npb25cbiAqIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHNpbmdsZSBncm91cFxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEdyb3VwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9XCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlIGEgc2luZ2xlIGdyb3VwIG1lbWJlci5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0XG4gKiB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJldHJpZXZlIGEgc2luZ2xlIG1lbWJlciBvZiB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgc2luZ2xlIEdyb3VwIG1lbWJlclxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyBncm91cCBvciByZWFsbSBtZW1iZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0R3JvdXBNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwcy97Z3JvdXBJZH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2dyb3VwSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJncm91cElkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgbWVtYmVycyBvZiB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRNZW1iZXJzKiogYWN0aW9uIGFnYWluc3QgdGhlIGdyb3VwXG4gKiBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgbWVtYmVycyBvZiB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgR3JvdXAgbWVtYmVyc1xuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0eXBlIG9mIG1lbWJlcnMgdG8gcmV0dXJuIGluIHRoZSByZXN1bHQuXG4gKiBPbmUgb2YgJ3VzZXInLCAnYXBwJywgb3IgJ2ludml0ZScuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhbGwgZW50aXR5IHR5cGVzIHdpbGwgYmUgcmV0dXJuZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEdyb3VwTWVtYmVycyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzXCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbnRpdHlUeXBlXCIsIHBhcmFtc1tcImVudGl0eVR5cGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIExpc3QgdGhlIHJvbGVzIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGdyb3VwLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRSb2xlcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgZ3JvdXAuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIGxpc3QgdGhlIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFJvbGVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmdyb3VwL0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGdyb3VwIHJvbGVzXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRHcm91cFJvbGVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9L3JvbGVzXCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGdyb3VwcyB3aXRoaW4gdGhlIHJlYWxtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyBwYXJ0eS5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSByZWFsbSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgcGFydHkuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbGlzdCB0aGUgZ3JvdXBzIHdpdGhpbiB0aGUgY2FsbGluZyBwYXJ0eSdzIHJlYWxtIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBncm91cHNcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICogQHBhcmFtIHEgQSBmcmVlIHRleHQgcXVlcnkgc3RyaW5nIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRzLlxuICogQSBzZWFyY2ggYWdhaW5zdCBncm91cHMgaW4gdGhlIHJlYWxtIHdpbGwgY29uc2lkZXIgdGhlICdpZCcsICduYW1lJywgYW5kICdkZXNjcmlwdGlvbicgZmllbGRzIG9mIHRoZSBncm91cHMuXG4gKiBUaGUgcHJlY2lzZSBzZWFyY2ggYWxnb3JpdGhtIHVzZWQgdG8gbWF0Y2ggZ3JvdXBzIGlzIG5vdCBzcGVjaWZpZWQsIGJ1dCBnZW5lcmFsbHkgYW55IG1lbWJlciB3aGVyZVxuICogb25lIG9mIHRoZSBjb25zaWRlcmVkIGZpZWxkcyBoYXMgYSBmdWxsIG9yIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRHcm91cHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwc1wiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicVwiLCBwYXJhbXNbXCJxXCJdKTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmUgYSBsaXN0IG9mIGdyb3VwcyBvZiBhIG1lbWJlclxuICpcbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IE15IEdyb3Vwc1xuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE15R3JvdXBzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMvbWVcIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBjYWxsaW5nIHBhcnR5IGZyb20gdGhlIGdyb3VwLiBUaGlzIG9wZXJhdGlvbiB3aWxsIGFsc28gcmVtb3ZlIGFkbWluaXN0cmF0aXZlIHJvbGVzIGZyb20gdGhpcyBtZW1iZXIuXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFJlbW92ZXMgdGhlIGNhbGxpbmcgcGFydHkgZnJvbSBhIGdyb3VwXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGVhdmVHcm91cChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzL21lXCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZW1vdmUgYSBtZW1iZXIgZnJvbSB0aGUgZ3JvdXAuIFRoaXMgb3BlcmF0aW9uIHdpbGwgYWxzbyByZW1vdmUgYWRtaW5pc3RyYXRpdmUgcm9sZXMgZnJvbSB0aGlzIG1lbWJlci5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVtb3ZlIGEgbWVtYmVyIGZyb20gdGhlIGdyb3VwLCBfR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBSZW1vdmUgYSBtZW1iZXIgZnJvbSB0aGUgZ3JvdXAuXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIGdyb3VwIG9yIHJlYWxtIG1lbWJlclxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHcm91cE1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogVXBkYXRlIHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4gYnkgdXBkYXRpbmcgYWxsIHdyaXRhYmxlIGdyb3VwIGZpZWxkcyBpbmNsdWRpbmcgbmFtZSBhbmQgZGVzY3JpcHRpb24uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICAqKnVwZGF0ZUdyb3VwKiogYWN0aW9uXG4gKiBhZ2FpbnN0IHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbW9kaWZ5IHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJ1cGRhdGVHcm91cFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZSBncm91cFxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSBncm91cElkIEhSTiBpZGVudGlmeWluZyBhIGdyb3VwLlxuICovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVHcm91cChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfVwiLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFByb2plY3RzQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQWRkIHRoZSBtZW1iZXIgdG8gdGhlIHJlcXVlc3RlZCBQcm9qZWN0LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZU1lbWJlcnMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gYWRkIGEgbWVtYmVyIHRvIHRoZSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgbWVtYmVyIHRvIHRoZSByZXF1ZXN0ZWQgUHJvamVjdFxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBhZGRQcm9qZWN0TWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBBZGQgdGhlIHJlc291cmNlIHRvIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBhcyBhIGhvbWUgb3IgYSByZWZlcmVuY2UobGluaykuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlbiAgKipXaGVuIHJlbGF0aW9uPWhvbWUqKlxuICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSB3aWxsIGJlIGFzc2lnbmVkIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCBhcyBpdHMgcmVzb3VyY2UgaG9tZS5cbiAqIFRoZSByZXNvdXJjZSAqKk1VU1QgTk9UKiogYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIHJlc291cmNlIGhvbWUuXG4gKlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUmVzb3VyY2VIb21lKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QgKipBTkQqKlxuICogdGhlICoqc2hhcmUqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBhZGQgcmVzb3VyY2UgXCJocm46aGVyZTpkYXRhOjpteXJlYWxtOm15LWNhdGFsb2ctMDAwMFwiIHRvIHRoZSBwcm9qZWN0XG4gKiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIiwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9ucyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogUGVybWlzc2lvbiAxOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZUhvbWVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICpcbiAqICogUGVybWlzc2lvbiAyOlxuICogKiBcImFjdGlvblwiIDogXCJzaGFyZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6bXlyZWFsbTpteS1jYXRhbG9nLTAwMDBcIiAqKldoZW4gcmVsYXRpb249cmVmZXJlbmNlKipcbiAqIExpbmsgdGhlIHJlc291cmNlIHRvIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBhcyBhIHJlZmVyZW5jZShsaW5rKS5cbiAqIFRoZSByZXF1ZXN0ZWQgcmVzb3VyY2Ugd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgcmVxdWVzdGVkIHByb2plY3QgYXMgcmVmZXJlbmNlKGxpbmspLlxuICpcbiAqIFRoZSByZXNvdXJjZSAqKk1VU1QqKiBiZSBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byBhdHRhY2ggYXMgYSByZXNvdXJjZSByZWZlcmVuY2UobGluaykuXG4gKiBBIHJlc291cmNlIGlzIHJlZmVyZW5jZWFibGUgaWYgaXQgaGFzIGJlZW4gbWFya2VkIGFzIHJlZmVyZW5jZWFibGUgYW5kIHRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb24gdG8gYWxsIHJlZmVyZW5jZSBlbmFibGVkIGFjdGlvbnNcbiAqIGFnYWluc3QgdGhlIHJlc291cmNlIE9SIFRoZSByZXNvdXJjZSBoYXMgYmVlbiBtYWRlIGxpbmthYmxlIHRvIHRoZSBwcm9qZWN0L3JlYWxtIGZvciB0aGUgcHJvamVjdCBsaW5raW5nIGVuYWJsZWQgYWN0aW9uXG4gKiBUaGUgZXhjbHVzaXZlIGxpc3Qgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIGF0dGFjaCBhcyBhIHJlc291cmNlIHJlZmVyZW5jZShsaW5rKSBpcyBhY2Nlc3NpYmxlIHZpYSBhIGNhbGxcbiAqIHRvIC9yZXNvdXJjZXM/cmVmZXJlbmNlYWJsZT10cnVlIG9yIC9yZXNvdXJjZXM/bGlua2FibGU9dHJ1ZVxuICpcbiAqICogVGhlIGF1dGhvcml6YXRpb24gY29udGV4dCAqKm11c3QqKiBzYXRpc2Z5IG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgaGFzIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VSZXNvdXJjZVJlZmVyZW5jZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gYWRkIGEgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiLFxuICogdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZVJlZmVyZW5jZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgaXMgYSAqKm1lbWJlcioqIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byBhdHRhY2ggdGhlIHJlc291cmNlIGFzIGEgcmVmZXJlbmNlYWJsZSByZXNvdXJjZS5cbiAqIEEgcmVzb3VyY2UgaXMgcmVmZXJlbmNlYWJsZSB0byB0aGUgY2FsbGVyIGlmOlxuICogKiBJdCBoYXMgYmVlbiBtYXJrZWQgYXMgcmVmZXJlbmNlYWJsZSBhbmQgVGhlIGNhbGxlciBoYXMgcGVybWlzc2lvbiB0byBhbGwgcmVmZXJlbmNlIGVuYWJsZWQgYWN0aW9ucyBhZ2FpbnN0IHRoZSByZXNvdXJjZS5cbiAqXG4gKiBPUlxuICpcbiAqICogVGhlIHJlc291cmNlIGhhcyBiZWVuIG1hZGUgbGlua2FibGUgdG8gdGhlIHByb2plY3QvcmVhbG0gZm9yIHRoZSBwcm9qZWN0IGxpbmtpbmcgZW5hYmxlZCBhY3Rpb25cbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBBZGQgYSByZXNvdXJjZSB0byB0aGUgcmVxdWVzdGVkIFByb2plY3QgYXMgYSBSZXNvdXJjZSBIb21lIG9yIFJlc291cmNlIFJlZmVyZW5jZShMaW5rKVxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSByZWxhdGlvbiBUaGUgcmVsYXRpb24gb2YgdGhlIHJlc291cmNlLiBNdXN0IGJlIGhvbWUgb3IgcmVmZXJlbmNlKGxpbmspXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkUHJvamVjdFJlc291cmNlUmVsYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXMve3Jlc291cmNlfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWxhdGlvblwiLCBwYXJhbXNbXCJyZWxhdGlvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInR5cGVcIiwgcGFyYW1zW1widHlwZVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHByb2plY3QgZXhpc3RzIHdpdGggcmVxdWVzdGVkIHByb2plY3QgaHJuIGluIGNhbGxlciByZWFsbS5cbiAqXG4gKiBJZiBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBzYW1lIHJlYWxtIGl0IHdpbGwgcmV0dXJuIDQwNC5cbiAqXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ2hlY2tzIHRoZSBleGlzdGFuY2Ugb2YgYSBwcm9qZWN0IGluIGNhbGxlciByZWFsbS5cbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUHJvamVjdEV4aXN0YW5jZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9XCIucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiSEVBRFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBpbiB0aGUgY2FsbGVycyByZWFsbVxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqY3JlYXRlUHJvamVjdCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGNyZWF0ZSBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwiY3JlYXRlUHJvamVjdFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgUHJvamVjdFxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0c1wiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgUHJvamVjdFxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBkZWxldGUgYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlIHRoZSBzcGVjaWZpZWQgUHJvamVjdFxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH1cIi5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgbWVtYmVyIGZyb20gdGhlIHNwZWNpZmllZCBQcm9qZWN0XG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlbW92ZSBhIG1lbWJlciBmcm9tIGEgUHJvamVjdCwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBSZW1vdmUgdGhlIG1lbWJlciBmcm9tIHRoZSBzcGVjaWZpZWQgUHJvamVjdFxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVByb2plY3RNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBwcm9qZWN0LlxuICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBtYXkgb25seSBiZSBsaW5rZWQgYXMgYSByZWZlcmVuY2UsIHJlbW92aW5nIGEgaG9tZSByZXNvdXJjZSByZXF1aXJlcyBkZWxldGluZyB0aGUgcmVzb3VyY2UgZnJvbSB0aGVcbiAqIHJlc291cmNlIHNlcnZpY2UuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUmVzb3VyY2VSZWZlcmVuY2VzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVtb3ZlIGEgcmVzb3VyY2UgcmVmZXJlbmNlKGxpbmspIGZyb20gdGhlIHByb2plY3RcbiAqIFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVJlc291cmNlUmVmZXJlbmNlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVtb3ZlIGEgUmVzb3VyY2UgUmVmZXJlbmNlKExpbmspIGZyb20gYSBwcm9qZWN0XG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHJlbGF0aW9uIFRoZSByZWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UuIE11c3QgYmUgcmVmZXJlbmNlKGxpbmspXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVQcm9qZWN0UmVzb3VyY2VSZWZlcmVuY2UoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXMve3Jlc291cmNlfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWxhdGlvblwiLCBwYXJhbXNbXCJyZWxhdGlvblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgYWxsIFByb2plY3RzIGluIHRoZSBPcmdcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipsaXN0QWxsUHJvamVjdHMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZ2V0IGEgbGlzdCBvZiBwcm9qZWN0cywgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0QWxsUHJvamVjdHNcIlxuICpcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxpc3Qgb2YgYWxsIFByb2plY3RzIGluIHRoZSBPcmdcbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsUHJvamVjdExpc3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSByZXF1ZXN0ZWQgUHJvamVjdFxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZ2V0IGEgcHJvamVjdCwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHJlcXVlc3RlZCBQcm9qZWN0XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFByb2plY3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fVwiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgUHJvamVjdHMgeW91IGFyZSBhICBwcm9qZWN0IGFkbWluIG9yIGEgbWVtYmVyIGJhc2VkIG9uIHRoZSBcImNhbk1hbmFnZVwiIG9yIFwiaXNNZW1iZXJcIiBwYXJhbWV0ZXIncyB2YWx1ZS5cbiAqXG4gKiBAbm90ZSBJZiBuZWl0aGVyIFwiY2FuTWFuYWdlXCIgbm9yIFwiaXNNZW1iZXJcIiBpcyBzcGVjaWZpZWQsIFwiaXNNZW1iZXI9dHJ1ZVwiIHByb2plY3RzIGFyZSByZXR1cm5lZC5cbiAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIFwiY2FuTWFuYWdlXCIgLyBcImlzTWVtYmVyXCIgaXMgOiBbdHJ1ZV1cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIFByb2plY3RzIHRoYXQgeW91IGFyZSBhIHByb2plY3QgYWRtaW4gb3IgYSBtZW1iZXIgYmFzZWQgb24gdGhlIFwiY2FuTWFuYWdlXCIgb3IgXCJpc01lbWJlclwiIHBhcmFtZXRlcidzIHZhbHVlXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY2FuTWFuYWdlIGlmIHRydWUgcmV0dXJucyBhbGwgcHJvamVjdHMgb2Ygd2hpY2ggdGhlIGNhbGxlcih1c2VyL2FwcCkgaXMgYSBwcm9qZWN0IGFkbWluLlxuICogQHBhcmFtIGlzTWVtYmVyIGlmIHRydWUgcmV0dXJucyBhbGwgcHJvamVjdHMgb2Ygd2hpY2ggdGhlIGNhbGxlcih1c2VyL2FwcCkgaXMgYSBtZW1iZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFByb2plY3RMaXN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy9tZVwiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjYW5NYW5hZ2VcIiwgYCR7cGFyYW1zW1wiY2FuTWFuYWdlXCJdfWApO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJpc01lbWJlclwiLCBgJHtwYXJhbXNbXCJpc01lbWJlclwiXX1gKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgdGhlIHJlcXVlc3RlZCBQcm9qZWN0IE1lbWJlclxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGdldCBhIG1lbWJlciBvZiBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBNZW1iZXJcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgbWVtYmVyLiBFaXRoZXIgdXNlciwgYXBwIG9yIGdyb3VwXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQcm9qZWN0TWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSByZXNvdXJjZSB0aGF0IGlzIGxpbmtlZCB0byB0aGUgcmVxdWVzdGVkIFByb2plY3QuXG4gKlxuICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBtYXkgYmUgbGlua2VkIGFzIGVpdGhlciBhIGhvbWUgb3IgYSByZWZlcmVuY2UobGluaykuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0XG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBnZXQgcmVzb3VyY2UgXCJocm46aGVyZTpkYXRhOjpteXJlYWxtOm15LWNhdGFsb2ctMDAwMFwiIGluIHRoZSBwcm9qZWN0XG4gKiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIiwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgcmVzb3VyY2UgdGhhdCBpcyBsaW5rZWQgdG8gYSBQcm9qZWN0IGFzIGVpdGhlciBhIFJlc291cmNlIEhvbWUgb3IgUmVzb3VyY2UgUmVmZXJlbmNlKExpbmspXG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gcmVsYXRpb24gVGhlIHJlbGF0aW9uIG9mIHRoZSByZXNvdXJjZS4gQSByZXNvdXJjZSBpcyBvbmx5IHJldHVybmVkIGluIHRoZSByZXNwb25zZSBpZiBpdCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgcmVsYXRpb24uXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQcm9qZWN0UmVzb3VyY2UoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXMve3Jlc291cmNlfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWxhdGlvblwiLCBwYXJhbXNbXCJyZWxhdGlvblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBjYWxsZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIEF1dGhvcml6YXRpb24gOiBOb25lXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVtb3ZlIHRoZSBjYWxsZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGVhdmVQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy9tZVwiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIG1lbWJlcnMgb2YgdGhlIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGdldCBhIGxpc3Qgb2YgcHJvamVjdCBtZW1iZXJzLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICogKiBpZiAnb25seUluY2x1ZGVJZGVudGl0aWVzJyBxdWVyeSBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsICd0b3RhbCcgaXMgTk9UIHJldHVybmVkIGluIFJlc3BvbnNlXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIG1lbWJlcnMgb2YgdGhlIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG9ubHlJbmNsdWRlSWRlbnRpdGllcyBJZiB0cnVlLCByZXR1cm5zIGFuIGVmZmVjdGl2ZSBwcm9qZWN0IG1lbWJlcnMgbGlzdCBjb250YWluaW5nIG9ubHkgdXNlciBhbmQgYXBwIGlkZW50aXRpZXMsXG4gKiBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGUgcHJvamVjdCBpbmRpcmVjdGx5IHZpYSBhIGdyb3VwLlxuICogSXQgd2lsbCBhbHNvIHJldHVybiB1c2VycyB3aG8gYXJlIHByb2plY3QgYWRtaW5zIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCwgYW5kIFJlc291cmNlIE1hbmFnZXJzIGZvciB0aGUgcmVhbG0uXG4gKiBSZXNwb25zZSB3aWxsIE5PVCBpbmNsdWRlIHRvdGFsIG51bWJlciBvZiBpZGVudGl0aWVzLlxuICogSWYgZmFsc2UsIHJldHVybnMgdXNlcnMsIGFwcHMsIGFuZCBncm91cHMgdGhhdCBhcmUgZGlyZWN0IG1lbWJlcnMgb2YgdGhlIHByb2plY3QsIGV4Y2x1ZGluZyBhbnkgdXNlcnMgYW5kIGFwcHMgdGhhdCBvbmx5IGhhdmVcbiAqIG1lbWJlcnNoaXAgdmlhIGEgZ3JvdXAuIERlZmF1bHRzIHRvIGZhbHNlLiAgU3VwcG9zZSB0aGVyZSBhcmUgYSB1c2VyIFUgYW5kIGEgZ3JvdXAgRyB3aXRoIGFwcCBBIGluIGl0LlxuICogU3VwcG9zZSB1c2VyIFUgYW5kIGdyb3VwIEcgYXJlIHRoZSBtZW1iZXJzIG9mIHRoZSBwcm9qZWN0LCB0aGVuICogb25seUluY2x1ZGVJZGVudGl0aWVzOiB0cnVlIHdpbGwgcmV0dXJuIFUgYW5kIEFcbiAqICogb25seUluY2x1ZGVJZGVudGl0aWVzOmZhbHNlIG9yIGFic2VudCB3aWxsIHJldHVybiBVIGFuZCBHXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RQcm9qZWN0TWVtYmVycyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnNcIi5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm9ubHlJbmNsdWRlSWRlbnRpdGllc1wiLCBgJHtwYXJhbXNbXCJvbmx5SW5jbHVkZUlkZW50aXRpZXNcIl19YCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHJlc291cmNlcyBpbiB0aGUgcmVxdWVzdGVkIFByb2plY3QgJiByZWZlcmVuY2VkIGluKGxpbmtlZCB0bykgdGhlIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGdldCB0aGUgbGlzdCBvZiByZXNvdXJjZXMgaW4gdGhlIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIHJlc291cmNlcyBpbiB0aGUgcmVxdWVzdGVkIFByb2plY3QgJiByZWZlcmVuY2VkIGluKGxpbmtlZCB0bykgdGhlIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHJlbGF0aW9uIFRoZSByZWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UuIEEgcmVzb3VyY2UgaXMgb25seSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgaWYgaXQgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIHJlbGF0aW9uLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0UHJvamVjdFJlc291cmNlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3Jlc291cmNlc1wiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidHlwZVwiLCBwYXJhbXNbXCJ0eXBlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVsYXRpb25cIiwgcGFyYW1zW1wicmVsYXRpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFVwZGF0ZSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKip3cml0ZSoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqICpcbiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byB1cGRhdGUgYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIndyaXRlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNwZWNpZmllZCBQcm9qZWN0XG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBwYXRjaFByb2plY3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fVwiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXNvdXJjZSBJbmZvIEFuZCBNYW5hZ2VtZW50IEFwaVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEdldCBhIGxpc3Qgb2Ygd2F5cyB0aGlzIHJlc291cmNlIGhhcyBiZWVuIG1hZGUgbGlua2FibGVcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIGFsbCB0aGUgXCJyZXF1aXJlZFRvTWFrZUxpbmthYmxlXCIgYWN0aW9ucyBhZ2FpbnN0XG4gKiB0aGUgc2VydmljZSBpbmZlcnJlZCB2aWEgdGhlIHJlc2VydmVkIHJlc291cmNlIHByZWZpeCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHBhdGggaW4gdGhlIHNjb3BlIG9mIHRoZSAgIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbWFrZSBhIGNhdGFsb2cgbGlua2FibGUsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgYSBsaXN0IG9mIHdheXMgdGhlIHJlc291cmNlIGhhcyBiZWVuIG1hZGUgbGlua2FibGVcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRMaXN0T2ZXYXlzUmVzb3VyY2VJc0xpbmthYmxlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfS9saW5rYWJsZVwiLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldCB0aGUgUmVzb3VyY2UgdGhhdCB0aGUgY2FsbGVyIGlzIGFsbG93ZWQgdG8gc2VlIGJhc2VkIG9uIHRoZSBpbnB1dCBxdWVyeSBwYXJhbWV0ZXJzXG4gKlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgYSBzaW5nbGUgcmVzb3VyY2VcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gcmVmZXJlbmNlYWJsZSBHZXQgdGhlIHJlc291cmNlIG9ubHkgaWYgaXQgaXMgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIgdG8gYXR0YWNoIGFzIGEgcmVmZXJlbmNlIHRvIHByb2plY3RzLlxuICogQSByZXNvdXJjZSBpcyByZWZlcmVuY2VhYmxlIGlmIGl0IGlzIG1hcmtlZCBhcyByZWZlcmVuY2VhYmxlIGFuZCB0aGUgY2FsbGVyIGhhcyBwZXJtaXNzaW9uIHRvIGFsbCByZWZlcmVuY2UgZW5hYmxlZCBhY3Rpb25zXG4gKiBhZ2FpbnN0IHRoZSByZXNvdXJjZS4gIE90aGVyd2lzZSA0MDQuICBPbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyB0cnVlLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc291cmNlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfVwiLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZlcmVuY2VhYmxlXCIsIGAke3BhcmFtc1tcInJlZmVyZW5jZWFibGVcIl19YCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBhdmFpbGFiaWxpdHkgZm9yIGxpbmtpbmcgdGhpcyByZXNvdXJjZSB0byBlaXRoZXIgYSBwcm9qZWN0IG9yIHJlYWxtLlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgYWxsIHRoZSBcInJlcXVpcmVkVG9NYWtlTGlua2FibGVcIiBhY3Rpb25zIGFnYWluc3RcbiAqIHRoZSBzZXJ2aWNlIGluZmVycmVkIHZpYSB0aGUgcmVzZXJ2ZWQgcmVzb3VyY2UgcHJlZml4IG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgcGF0aCBpbiB0aGUgc2NvcGUgb2YgdGhlICAgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGdldCB0aGUgY2F0YWxvZyBsaW5rYWJpbGl0eSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6b2xwLWhlcmU6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBzY29wZWQgdG8gdGhlIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaW5rYWJpbGl0eSBvZiBhIHJlc291cmNlXG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIGF2YWlsYWJsZVRvSHJuIFRoZSBocm4gb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbWFkZSBsaW5rYWJsZSBhZ2FpbnN0IG9yXG4gKiBUaGUgaHJuIG9mIHRoZSByZWFsbSB0aGF0IHRoZSByZXNvdXJjZSBpcyBtYWRlIGxpbmthYmxlIGFnYWluc3QuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzb3VyY2VMaW5rYWJpbGl0eShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tyZXNvdXJjZX0vbGlua2FibGUve2F2YWlsYWJsZVRvSHJufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VcIl0pKVxuICAgICAgICAucmVwbGFjZShcInthdmFpbGFibGVUb0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImF2YWlsYWJsZVRvSHJuXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIFByb2plY3RzIHRoYXQgdGhlIHJlc291cmNlIGJlbG9uZ3MgdG8gb3IgaXMgcmVmZXJlbmNlZCBpbihsaW5rZWQgdG8pLlxuICogVGhlIHJldHVybmVkIGxpc3Qgd2lsbCBvbmx5IGluY2x1ZGUgcHJvamVjdHMgdGhhdCBhcmUgaW4gdGhlIGNhbGxlcidzIHJlYWxtLlxuICpcbiAqIEBub3RlXG4gKiBJZiB0aGUgcHJlc2VudGVkIGFjY2VzcyB0b2tlbiBoYXMgYSBwcm9qZWN0IHNjb3BlLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlOlxuICogLSBUaGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZVxuICogLSBUaGUgbGlzdCBvZiBQcm9qZWN0cyB0aGF0IHRoZSByZXNvdXJjZSBoYXMgYmVlbiBtYWRlIGxpbmthYmxlIHRvXG4gKiAtIFRoZSBpbmNsdWRlIHRoZSBsaXN0IG9mIFByb2plY3RzIHRoYXQgdGhlIHJlc291cmNlIGhhcyBiZWVuIGxpbmtlZCB0b1xuICpcbiAqIElmIHRoZSBwcmVzZW50ZWQgYWNjZXNzIHRva2VuIGhhcyBubyBzY29wZSwgdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZTpcbiAqIC0gVGhlIGxpc3Qgb2YgUHJvamVjdHMgZmlsdGVyZWQgb3V0IGJhc2VkIG9uIHRoZSBtZW1iZXJzaGlwIG9mIHRoZSBjYWxsZXIuXG4gKlxuICogQWNjZXNzIENvbnRyb2wgZm9yIHByb2plY3Qgc2NvcGVkIGNhbGw6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSBhbGwgdGhlIFwicmVxdWlyZWRUb01ha2VMaW5rYWJsZVwiIGFjdGlvbnMgYWdhaW5zdFxuICogdGhlIHNlcnZpY2UgaW5mZXJyZWQgdmlhIHRoZSByZXNlcnZlZCByZXNvdXJjZSBwcmVmaXggb2YgdGhlIHJlc291cmNlIGluIHRoZSBwYXRoIGluIHRoZSBzY29wZSBvZiB0aGUgICBob21lIHByb2plY3Qgb2YgdGhlIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gbWFrZSBhIGNhdGFsb2cgbGlua2FibGUsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHJlcXVlc3RlZCBQcm9qZWN0cyB0aGF0IHRoZSByZXNvdXJjZSBiZWxvbmdzIHRvIG9yIGlzIHJlZmVyZW5jZWQgaW4obGlua2VkIHRvKVxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICogQHBhcmFtIHJlbGF0aW9uIFRoZSByZWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UuIEEgcmVzb3VyY2UgaXMgb25seSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgaWYgaXQgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIHJlbGF0aW9uLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc291cmNlUHJvamVjdHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Jlc291cmNlcy97cmVzb3VyY2V9L3Byb2plY3RzXCIucmVwbGFjZShcIntyZXNvdXJjZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlbGF0aW9uXCIsIHBhcmFtc1tcInJlbGF0aW9uXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIFJlc291cmNlcyB0aGF0IHRoZSBjYWxsZXIgaXMgYWxsb3dlZCB0byBzZWUgYmFzZWQgb24gdGhlIGlucHV0IHF1ZXJ5IHBhcmFtZXRlcnMuXG4gKlxuICogQG5vdGVcbiAqIElmIHRoZSBwcmVzZW50ZWQgYWNjZXNzIHRva2VuIGhhcyBhIHByb2plY3Qgc2NvcGU6XG4gKiAtIFRoZSByZXNwb25zZSB3aWxsIG9ubHkgaW5jbHVkZSByZXNvdXJjZXMgZnJvbSB0aGF0IHByb2plY3Qgb3IsXG4gKiAtIElmIHJlZmVyZW5jZWFibGU9dHJ1ZSBvciBsaW5rYWJsZT10cnVlLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlIHRoZSByZXNvdXJjZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIgdG9cbiAqIGxpbmsgdG8gdGhlIHByb2plY3QgaW4gdGhlIHRva2VuJ3MgcHJvamVjdCBzY29wZS5cbiAqXG4gKiAtIElmIHRoZSBwcmVzZW50ZWQgYWNjZXNzIHRva2VuIGhhcyBubyBzY29wZTpcbiAqIC0gVGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSByZXNvdXJjZXMgZnJvbSBhbGwgcHJvamVjdHMgdGhhdCB0aGUgY2FsbGVyIGhhcyBhY2Nlc3MgdG8uXG4gKiAtIEZvciB0eXBlPSdjYXRhbG9nJyB0aGUgcmVzcG9uc2Ugd2lsbCBhbHNvIGluY2x1ZGUgcmVzb3VyY2VzIHRoYXQgZXhpc3Qgb3V0c2lkZSBvZiBhbnkgcHJvamVjdC5cbiAqIC0gRm9yIGFsbCBvdGhlciB0eXBlcywgdGhlIHJlc3BvbnNlIHdpbGwgTk9UIGluY2x1ZGUgcmVzb3VyY2VzIHRoYXQgZXhpc3Qgb3V0c2lkZSBvZiBhbnkgcHJvamVjdC5cbiAqIC0gRm9yIHJlZmVyZW5jZWFibGU9dHJ1ZSBvciBsaW5rYWJsZT10cnVlLCB0aGUgcmVzcG9uc2Ugd2lsbCBPTkxZIGluY2x1ZGUgdGhlIEhFUkUgcHVibGljIHJlc291cmNlcyB0aGF0IGFyZSBhdmFpbGFibGVcbiAqIHRvIHRoZSBjYWxsZXIgdG8gbGluayB0byBBTlkgcHJvamVjdCAqIFRoaXMgQVBJIHdvcmtzIHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCBhbmQgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgbGlzdCBvZiByZXNvdXJjZXNcbiAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGFjY2VzcyBGaWx0ZXIgdGhlIHJlc291cmNlcyBhY2Nlc3NpYmxlIHRvIHRoZSBjYWxsZXIgYmFzZWQgb24gdGhlIGFjY2VzcyB0eXBlcy5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFwiZGVmYXVsdFwiLlxuICogTm90IGFwcGxpY2FibGUgdG8gdXNlIGFsb25nIHdpdGggdGhlIHF1ZXJ5IHBhcmFtZXRlciBcInJlZmVyZW5jZWFibGVcIjogXCJ0cnVlXCIgb3IgXCJsaW5rYWJsZVwiOiBcInRydWVcIlxuICogSWYgXCJkZWZhdWx0XCIgaW5jbHVkZXMgcmVzb3VyY2VzIHdoZXJlOlxuICogLSBUaGUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSByZXNvdXJjZVwicyBob21lIHByb2plY3QgT1JcbiAqIC0gVGhlIHVzZXIgaGFzIGFjY2VzcyB0byBhIHByb2plY3QgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbGlua2VkIHRvIGFzIGEgcmVmZXJlbmNlIE9SXG4gKiAtIFRoZSB0eXBlXCI6IFwiXCJjYXRhbG9nXCIgYW5kIHRoZSByZXNvdXJjZSBpcyBub3QgaW4gYW55IHByb2plY3QgYW5kIHRoZSB1c2VyIGhhcyBcInJlYWRcIiBhY2Nlc3MgdG8gaXQgT1JcbiAqIC0gVGhlIHR5cGVcIjogXCJcImNhdGFsb2dcIiBhbmQgdGhlIHJlc291cmNlIGlzIG5vdCBpbiBhbnkgcHJvamVjdCBhbmQgdGhlIHVzZXIgaGFzIFwid3JpdGVcIiBhY2Nlc3MgdG8gaXQgT1JcbiAqIC0gVGhlIHR5cGVcIjogXCJcImNhdGFsb2dcIiBhbmQgdGhlIHJlc291cmNlIGlzIG5vdCBpbiBhbnkgcHJvamVjdCBhbmQgdGhlIHVzZXIgaGFzIFwibWFuYWdlXCIgYWNjZXNzIHRvIGl0LlxuICpcbiAqIElmIFwibWFuYWdlXCIgaW5jbHVkZXMgcmVzb3VyY2VzIHdoZXJlOlxuICogLSBUaGUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSByZXNvdXJjZVwicyBob21lIHByb2plY3QgT1JcbiAqIC0gVGhlIHR5cGVcIjogXCJcImNhdGFsb2dcIiBhbmQgdGhlIHJlc291cmNlIGlzIG5vdCBpbiBhbnkgcHJvamVjdCBhbmQgdGhlIHVzZXIgaGFzIFwibWFuYWdlXCIgYWNjZXNzIHRvIGl0LlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VhYmxlIEdldCBhbGwgcmVmZXJlbmNlYWJsZShsaW5rYWJsZSkgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIGF0dGFjaCBhcyBhIHJlZmVyZW5jZShsaW5rKSB0byBwcm9qZWN0cy5cbiAqIE9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIHRydWUuIE5vdGUgLSBDYW4gYmUgdXNlZCBhcyBhIHN5bm9ueW0gZm9yIGxpbmthYmxlICBBIHJlc291cmNlIGlzIHJlZmVyZW5jZWFibGUobGlua2FibGUpIGlmIGl0IGlzIG1hcmtlZFxuICogYXMgcmVmZXJlbmNlYWJsZTpcbiAqIC0gYW5kIHRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb24gdG8gYWxsIHJlZmVyZW5jZSBlbmFibGVkIGFjdGlvbnMgYWdhaW5zdCB0aGUgcmVzb3VyY2Ugb3IsXG4gKiAtIGluIGNhc2Ugb2YgYSBwcm9qZWN0IHNjb3BlZCB0b2tlbiwgdGhlIGNhbGxlciBoYXMgZWZmZWN0aXZlIG1lbWJlcnNoaXAgb24gdGhlIHByb2plY3RzIHRvIGF0dGFjaCByZXNvdXJjZXNcbiAqIGFzIGEgcmVmZXJlbmNlKGxpbmspIHRvIHRoZSBQcm9qZWN0LlxuICpcbiAqIEBwYXJhbSBsaW5rYWJsZSBHZXQgYWxsIGxpbmthYmxlIHJlc291cmNlcyBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byBhdHRhY2ggYXMgYSBsaW5rIHRvIHByb2plY3QuXG4gKiBPbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyB0cnVlLiBOb3RlIC0gQ2FuIGJlIHVzZWQgYXMgYSBzeW5vbnltIGZvciByZWZlcmVuY2VhYmxlXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzb3VyY2VzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXNcIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidHlwZVwiLCBwYXJhbXNbXCJ0eXBlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWNjZXNzXCIsIHBhcmFtc1tcImFjY2Vzc1wiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlZmVyZW5jZWFibGVcIiwgYCR7cGFyYW1zW1wicmVmZXJlbmNlYWJsZVwiXX1gKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGlua2FibGVcIiwgYCR7cGFyYW1zW1wibGlua2FibGVcIl19YCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IExpc3Qgb2YgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIHJlYWxtIG9mIHRoZSBjYWxsZXJcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipsaXN0UmVhbG1SZXNvdXJjZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZ2V0IGEgbGlzdCBvZiBwcm9qZWN0cywgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0UmVhbG1SZXNvdXJjZXNcIlxuICpcbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgTGlzdCBvZiBhbGwgdGhlIHJlc291cmNlcyBpbiB0aGUgcmVhbG0gb2YgdGhlIGNhbGxlclxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdFJlYWxtUmVzb3VyY2VzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZWFsbS9yZXNvdXJjZXNcIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidHlwZVwiLCBwYXJhbXNbXCJ0eXBlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBBZGRzIGEgbGlzdGluZyB0byBtYWtlIHRoaXMgcmVzb3VyY2UgbGlua2FibGUgdG8gZWl0aGVyIGEgcHJvamVjdCBvciBlbnRpcmUgcmVhbG0uXG4gKlxuICogVGhlIHJlc291cmNlIG11c3QgYmVsb25nIHRvIGEgcHJvamVjdCB0byBiZSBtYWRlIGxpbmthYmxlLiBFaXRoZXIgcHJvamVjdEhybiBvciByZWFsbUhybiBtdXN0IGJlIHByb3ZpZGVkIHRvIG1ha2UgdGhlIHJlc291cmNlXG4gKiBsaW5rYWJsZSB0by5cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIGFsbCB0aGUgXCJyZXF1aXJlZFRvTWFrZUxpbmthYmxlXCIgYWN0aW9ucyBhZ2FpbnN0XG4gKiB0aGUgc2VydmljZSBpbmZlcnJlZCB2aWEgdGhlIHJlc2VydmVkIHJlc291cmNlIHByZWZpeCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHBhdGggaW4gdGhlIHNjb3BlIG9mIHRoZSAgIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbWFrZSBhIGNhdGFsb2cgbGlua2FibGUsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBNYWtlIGEgcmVzb3VyY2UgTGlua2FibGVcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1ha2VSZXNvdXJjZUxpbmthYmxlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfS9saW5rYWJsZVwiLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBsaW5rYWJpbGl0eSBvZiB0aGlzIHJlc291cmNlIGFnYWluc3QgdGhlIHJlcXVlc3RlZCBwcm9qZWN0IG9yIHJlYWxtLlxuICpcbiAqIEBub3RlIFRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGltcGFjdCBvbiBwcmUtZXhpc3RpbmcgbGlua3MuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSBhbGwgdGhlIFwicmVxdWlyZWRUb01ha2VMaW5rYWJsZVwiIGFjdGlvbnMgYWdhaW5zdFxuICogdGhlIHNlcnZpY2UgaW5mZXJyZWQgdmlhIHRoZSByZXNlcnZlZCByZXNvdXJjZSBwcmVmaXggb2YgdGhlIHJlc291cmNlIGluIHRoZSBwYXRoIGluIHRoZSBzY29wZSBvZiB0aGUgICBob21lIHByb2plY3Qgb2YgdGhlIHJlc291cmNlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byByZW1vdmUgdGhlIGNhdGFsb2cgbGlua2FiaWxpdHksIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBSZW1vdmUgdGhlIGxpbmthYmlsaXR5IG9mIGEgcmVzb3VyY2VcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gYXZhaWxhYmxlVG9Icm4gVGhlIGhybiBvZiB0aGUgcHJvamVjdCB0aGF0IHRoZSByZXNvdXJjZSBpcyBtYWRlIGxpbmthYmxlIGFnYWluc3Qgb3IgVGhlIGhybiBvZiB0aGUgcmVhbG0gdGhhdCB0aGUgcmVzb3VyY2VcbiAqIGlzIG1hZGUgbGlua2FibGUgYWdhaW5zdC5cbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVSZXNvdXJjZUxpbmthYmlsaXR5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfS9saW5rYWJsZS97YXZhaWxhYmxlVG9Icm59XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2F2YWlsYWJsZVRvSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXZhaWxhYmxlVG9Icm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogVXBkYXRlIHRoZSBsaW5rYWJpbGl0eSBvZiB0aGlzIHJlc291cmNlIGFnYWluc3QgdGhlIHJlcXVlc3RlZCBwcm9qZWN0IG9yIHJlYWxtLlxuICpcbiAqIEFjY2VzcyBDb250cm9sOiAgKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgYWxsIHRoZSBcInJlcXVpcmVkVG9NYWtlTGlua2FibGVcIiBhY3Rpb25zIGFnYWluc3RcbiAqIHRoZSBzZXJ2aWNlIGluZmVycmVkIHZpYSB0aGUgcmVzZXJ2ZWQgcmVzb3VyY2UgcHJlZml4IG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgcGF0aCBpbiB0aGUgc2NvcGUgb2YgdGhlICAgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byB1cGRhdGUgdGhlIGNhdGFsb2cgbGlua2FiaWxpdHksIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGxpbmthYmlsaXR5IG9mIGEgcmVzb3VyY2VcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIGF2YWlsYWJsZVRvSHJuIFRoZSBocm4gb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbWFkZSBsaW5rYWJsZSBhZ2FpbnN0IG9yIFRoZSBocm4gb2YgdGhlIHJlYWxtIHRoYXQgdGhlIHJlc291cmNlXG4gKiBpcyBtYWRlIGxpbmthYmxlIGFnYWluc3QuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUmVzb3VyY2VMaW5rYWJpbGl0eShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tyZXNvdXJjZX0vbGlua2FibGUve2F2YWlsYWJsZVRvSHJufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VcIl0pKVxuICAgICAgICAucmVwbGFjZShcInthdmFpbGFibGVUb0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImF2YWlsYWJsZVRvSHJuXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEF0dGFjaGVzIHRoZSBQcm9qZWN0IFBvbGljeSB0byB0aGUgbWVtYmVyIG9mIHRoZSBQcm9qZWN0LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZU1lbWJlcnMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gYXR0YWNoIGEgY3VzdG9tIHBvbGljeSBpbiBhIFByb2plY3QgdG8gYSBtZW1iZXIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnMgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogQU5EXG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEF0dGFjaCBQcm9qZWN0IFBvbGljeSB0byBNZW1iZXJcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgbWVtYmVyLiBFaXRoZXIgdXNlciwgYXBwIG9yIGdyb3VwXG4gKiBAcGFyYW0gcG9saWN5IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBwb2xpY3kuIEZvciBIRVJFIHByb3ZpZGVkIHBvbGljaWVzLFxuICogdGhlIEhSTiBmb3JtYXQgd291bGQgYmUgLSBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmRlZmF1bHQ6cG9saWN5L3JlYWQtb25seS1hY2Nlc3MtdG8tYWxsLWNhdGFsb2dzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGF0dGFjaFByb2plY3RQb2xpY3lUb01lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnMve21lbWJlcn0vcG9saWNpZXMve3BvbGljeX1cIlxuICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie3BvbGljeX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInBvbGljeVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgY3VzdG9tIHBvbGljeSBpbiB0aGUgUHJvamVjdFxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZVBvbGljaWVzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGNyZWF0ZSBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IENyZWF0ZSB0aGUgcmVxdWVzdGVkIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVByb2plY3RQb2xpY3koYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llc1wiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlbGV0ZSB0aGUgY3VzdG9tIHBvbGljeSBpbiB0aGUgUHJvamVjdFxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZVBvbGljaWVzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHVwZGF0ZSBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZSB0aGUgY3VzdG9tIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlUHJvamVjdFBvbGljeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntwb2xpY3l9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwb2xpY3lcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogRGV0YWNoZWQgdGhlIHJlcXVlc3RlZCBjdXN0b20gUHJvamVjdCBQb2xpY3kgZnJvbSBhIE1lbWJiZXJcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGRldGFjaCBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0IGZyb20gYSBtZW1iZXIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnMgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogQU5EXG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IERldGFjaCB0aGUgUHJvamVjdCBQb2xpY3kgZnJvbSBhIE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGV0YWNoUHJvamVjdFBvbGljeUZyb21NZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntwb2xpY3l9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwb2xpY3lcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIGFsbCBQcm9qZWN0IE1lbWJlcnMgd2l0aCB0aGUgYXR0YWNoZWQgUG9saWN5XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byByZWFkIHRoZSBsaXN0IG9mIGFsbCBtZW1iZXJzIGF0dGFjaGVkIHRvIGEgcHJvamVjdCBwb2xpY3ksIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIEluIHRoZSBQcm9qZWN0IHdvcmtmbG93LCB0aGUgYWJvdmUgcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFsbCBQcm9qZWN0IE1lbWJlcnMsIFByb2plY3QgQWRtaW5zLCBPcmcgQWRtaW5zXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIGFsbCBQcm9qZWN0IE1lbWJlcnMgd2l0aCB0aGUgYXR0YWNoZWQgUG9saWN5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCxcbiAqIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbFByb2plY3RNZW1iZXJzV2l0aEF0dGFjaGVkUG9saWN5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vcG9saWNpZXMve3BvbGljeX0vbWVtYmVyc1wiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIEF0dGFjaGVkIFByb2plY3QgUG9saWNpZXMgRm9yIGEgTWVtYmVyXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byByZWFkIHRoZSBsaXN0IG9mIHRoZSBhdHRhY2hlZCBwcm9qZWN0IHBvbGljaWVzLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBNZW1iZXJzLCBQcm9qZWN0IEFkbWlucywgT3JnIEFkbWluc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbGlzdCBvZiBBdHRhY2hlZCBQcm9qZWN0IFBvbGljaWVzIEZvciBhIE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBdHRhY2hlZFByb2plY3RQb2xpY2llc0Zvck1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnMve21lbWJlcn0vcG9saWNpZXNcIlxuICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldCB0aGUgYXR0YWNoZWQgUHJvamVjdCBQb2xpY3kgRm9yIGEgTWVtYmVyXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byByZWFkIHRoZSBhdHRhY2hlZCBwcm9qZWN0IHBvbGljeSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgTWVtYmVycywgUHJvamVjdCBBZG1pbnMsIE9yZyBBZG1pbnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGF0dGFjaGVkIFByb2plY3QgUG9saWN5IGZvciBhIE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWN5Rm9yTWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfS9wb2xpY2llcy97cG9saWN5fVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBQb2xpY3lcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlYWQgYSBwcm9qZWN0IHBvbGljeSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICAqIEluIHRoZSBQcm9qZWN0IHdvcmtmbG93LCB0aGUgYWJvdmUgcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFsbCBQcm9qZWN0IE1lbWJlcnMsIFByb2plY3QgQWRtaW5zLCBPcmcgQWRtaW5zXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBQcm9qZWN0IFBvbGljeVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gcG9saWN5IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBwb2xpY3kuIEZvciBIRVJFIHByb3ZpZGVkIHBvbGljaWVzLFxuICogdGhlIEhSTiBmb3JtYXQgd291bGQgYmUgLSBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmRlZmF1bHQ6cG9saWN5L3JlYWQtb25seS1hY2Nlc3MtdG8tYWxsLWNhdGFsb2dzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFByb2plY3RQb2xpY3koYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llcy97cG9saWN5fVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTGlzdCB0aGUgUG9saWNpZXMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gbWVtYmVycyBvZiB0aGUgUHJvamVjdC5cbiAqIFRoaXMgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIHRoZSBIRVJFIHByb3ZpZGVkIHBvbGljaWVzIGFuZCBhbnkgY3VzdG9tIHVzZXIgZGVmaW5lZCBwb2xpY2llcyBjcmVhdGVkIGluIHRoZSBQcm9qZWN0LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVhZCBhIHBvbGljeSBsaXN0IG9mIGEgUHJvamVjdCwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgTWVtYmVycywgUHJvamVjdCBBZG1pbnMsIE9yZyBBZG1pbnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBMaXN0IHRoZSBQb2xpY2llcyBpbiBhIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LFxuICogaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKiBAcGFyYW0gcHJvamVjdFBvbGljeVR5cGUgVGhlIHR5cGUgb2YgdGhlIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdFBvbGljeUxpc3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llc1wiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicHJvamVjdFBvbGljeVR5cGVcIiwgcGFyYW1zW1wicHJvamVjdFBvbGljeVR5cGVcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFNldHMgdGhlIEF0dGFjaGVkIFBvbGljaWVzIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgUHJvamVjdCBNZW1iZXIsIG92ZXJ3cml0aW5nIGFueSBwcmUtZXhpc3RpbmcgQXR0YWNoZWQgUG9saWNpZXMuXG4gKiBUaGUgcmVxdWVzdCBib2R5IHdpbGwgcmVwbGFjZSBhbnkgcHJlLWV4aXN0aW5nIFBvbGljeSBhdHRhY2htZW50KHMpLCBhbmQgcmVwbGFjZSB0aGF0IGxpc3Qgd2l0aCB0aG9zZSBQb2xpY2llc1xuICogaWRlbnRpZmllZCBpbiB0aGUgcmVxdWVzdCBib2R5LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZU1lbWJlcnMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gYXR0YWNoIGEgY3VzdG9tIHBvbGljeSBpbiBhIFByb2plY3QgdG8gYSBtZW1iZXIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnMgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIiAgICAgIEFORCAgICAgICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUG9saWNpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBBZG1pbnMgYW5kIFJlc291cmNlIE1hbmFnZXJzXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgU2V0IEF0dGFjaGVkIFBvbGljaWVzIGZvciBNZW1iZXJcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IG1lbWJlci4gRWl0aGVyIHVzZXIsIGFwcCBvciBncm91cFxuICovXG5hc3luYyBmdW5jdGlvbiBzZXRBdHRhY2hlZFByb2plY3RQb2xpY2llc1RvTWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfS9wb2xpY2llc1wiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBVcGRhdGUgdGhlIHJlcXVlc3RlZCBjdXN0b20gcG9saWN5IGluIHRoZSBQcm9qZWN0XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUG9saWNpZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gdXBkYXRlIGEgY3VzdG9tIHBvbGljeSBpbiBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUG9saWNpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBBZG1pbnMgYW5kIFJlc291cmNlIE1hbmFnZXJzXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgVXBkYXRlIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBQb2xpY3lcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJvamVjdFBvbGljeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntwb2xpY3l9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwb2xpY3lcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0cyB0aGUgYWN0aW9ucyBsaXN0IGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLlxuICpcbiAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhY3Rpb25zIGFyZSBmaWx0ZXJlZCBiYXNlZCBvbiB0aGUgcmVsYXRpb24gb2YgdGhlIHJlc291cmNlLCBlaXRoZXIgaG9tZSBvciByZWZlcmVuY2Ugd2l0aCB0aGUgYWxsb3dlZCBhY3Rpb25zLlxuICogVGhpcyBBUEkgcHJvdmlkZXMgYSBsaXN0IG9mIGF2YWlsYWJsZSBhY3Rpb25zIGR1cmluZyBwcm9qZWN0IHdvcmtmbG93cyBsaWtlIGxpbmtpbmcgb3IgcHJvamVjdCBwb2xpY3kgY3JlYXRpb24uXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0XG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZ2V0IHJlc291cmNlIFwiaHJuOmhlcmU6ZGF0YTo6bXlyZWFsbTpteS1jYXRhbG9nLTAwMDBcIiBpbiB0aGUgcHJvamVjdFxuICogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgbGlzdCBvZiBhY3Rpb25zIHRoYXQgYXJlIGFsbG93ZWQgZm9yIHRoZSBwcm9qZWN0IHJlc291cmNlXG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBhY3Rpb24gZm9yIHRoZSByZXNvdXJjZSB0eXBlLlxuICogLSBsaW5rYWJsZSA6IEFjdGlvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBsaW5rZWRcbiAqIC0gcHJvamVjdEVuYWJsZWQgOiBBY3Rpb25zIHRoYXQgYXJlIGVuYWJsZWQgZm9yIFByb2plY3RzIGFjY2Vzc1xuICogLSByZXF1aXJlZFRvTWFrZUxpbmthYmxlIDogQWN0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB3aGVuIGFuIGlkZW50aXR5IGlzIG1ha2luZyBhIHJlc291cmNlIGxpbmthYmxlIHRvIGEgcmVhbG0gb3Igb3RoZXIgcHJvamVjdHNcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZXNvdXJjZUFjdGlvbnNGb3JQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vcmVzb3VyY2VzL3tyZXNvdXJjZX0vYWN0aW9uc1wiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ0eXBlXCIsIHBhcmFtc1tcInR5cGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldHMgdGhlIGFjdGlvbnMgbGlzdCBmb3IgdGhlIHJlc291cmNlIHR5cGUgYmFzZWQgb24gdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgbGlzdCBvZiBhY3Rpb25zIGZvciB0aGUgcmVzb3VyY2UgdHlwZVxuICogQHBhcmFtIHJlc291cmNlVHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBhY3Rpb24gZm9yIHRoZSByZXNvdXJjZSB0eXBlLlxuICogLSBsaW5rYWJsZSA6IEFjdGlvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBsaW5rZWRcbiAqIC0gcHJvamVjdEVuYWJsZWQgOiBBY3Rpb25zIHRoYXQgYXJlIGVuYWJsZWQgZm9yIFByb2plY3RzIGFjY2Vzc1xuICogLSByZXF1aXJlZFRvTWFrZUxpbmthYmxlIDogQWN0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB3aGVuIGFuIGlkZW50aXR5IGlzIG1ha2luZyBhIHJlc291cmNlIGxpbmthYmxlIHRvIGEgcmVhbG0gb3Igb3RoZXIgcHJvamVjdHNcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZXNvdXJjZVR5cGVBY3Rpb25MaXN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZVR5cGVzL3tyZXNvdXJjZVR5cGV9L2FjdGlvbnNcIi5yZXBsYWNlKFwie3Jlc291cmNlVHlwZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlVHlwZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ0eXBlXCIsIHBhcmFtc1tcInR5cGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2FuY2VsTXVsdGlwYXJ0VXBsb2FkID0gY2FuY2VsTXVsdGlwYXJ0VXBsb2FkO1xuZXhwb3J0cy5jaGVja0Jsb2JFeGlzdHNTdGF0dXMgPSBjaGVja0Jsb2JFeGlzdHNTdGF0dXM7XG5leHBvcnRzLmRlbGV0ZUJsb2IgPSBkZWxldGVCbG9iO1xuZXhwb3J0cy5nZXRCbG9iID0gZ2V0QmxvYjtcbmV4cG9ydHMuZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzID0gZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzO1xuZXhwb3J0cy5wdXREYXRhID0gcHV0RGF0YTtcbmV4cG9ydHMuc3RhcnRNdWx0aXBhcnRVcGxvYWQgPSBzdGFydE11bHRpcGFydFVwbG9hZDtcbmV4cG9ydHMuZG9Db21wbGV0ZU11bHRpcGFydFVwbG9hZCA9IGRvQ29tcGxldGVNdWx0aXBhcnRVcGxvYWQ7XG5leHBvcnRzLmRvVXBsb2FkUGFydCA9IGRvVXBsb2FkUGFydDtcbi8qKlxuICogQmxvYiBBUEkgdjFcbiAqIFRoZSBgYmxvYmAgc2VydmljZSBzdXBwb3J0cyB0aGUgdXBsb2FkIGFuZCByZXRyaWV2YWwgb2YgbGFyZ2Ugdm9sdW1lcyBvZiBkYXRhIGZyb20gdGhlIHN0b3JhZ2Ugb2YgYSBjYXRhbG9nLlxuICogRWFjaCBkaXNjcmV0ZSBjaHVuayBvZiBkYXRhIGlzIHN0b3JlZCBhcyBhIGJsb2IgKEJpbmFyeSBMYXJnZSBPYmplY3QpLiBFYWNoIGJsb2IgaGFzIGl0cyBvd24gdW5pcXVlIElEIChkYXRhIGhhbmRsZSkuXG4gKiBUaGUgZGF0YSBoYW5kbGVzIGNhbiBiZSBzdG9yZWQgaW4gIHNlcnZpY2VzIGxpa2UgYG1ldGFkYXRhYCwgYGluZGV4YCBvciBgc3RyZWFtYC5cbiAqIFRvIGdldCBkYXRhLCB5b3UgZmlyc3QgdXNlIHRoZSBhbnkgb2YgdGhvc2Ugc2VydmljZXMgdG8gcmV0cmlldmUgdGhlIGRhdGEgaGFuZGxlIG9mIHRoZSByZWxldmFudCBibG9icy5cbiAqIFlvdSB0aGVuIHVzZSB0aGUgZGF0YSBoYW5kbGUgdG8gcHVsbCB0aGUgZGF0YSB1c2luZyB0aGUgYGJsb2JgIHNlcnZpY2UuXG4gKiBJZiB5b3UgYXJlIHdyaXRpbmcgdG8gYSB2b2xhdGlsZSBsYXllciwgc2VlIHZvbGF0aWxlLWJsb2IgQVBJIGRlZmluaXRpb24uXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC40XG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCbG9iQXBpXG4gKi9cbi8qKlxuICogQ2FuY2VscyBhbiBlbnRpcmUgbXVsdGlwYXJ0IHVwbG9hZCBvcGVyYXRpb24uIFlvdSBjYW4gb25seSBjYW5jZWwgYSBtdWx0aXBhcnQgdXBsb2FkIGJlZm9yZSBpdCBoYXMgYmVlbiBjb21wbGV0ZWQuXG4gKiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGFjdHVhbCBVUkwgZm9yIHRoaXMgb3BlcmF0aW9uIG11c3QgYmUgb2J0YWluZWQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keSBvZiBzdGFydCBtdWx0aXBhcnRcbiAqIG9wZXJhdGlvbiB0aGF0IGlzICdQT1NUIC9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHMnIGZyb20gdGhlICdkZWxldGUnIGVsZW1lbnQgdW5kZXJcbiAqIHRoZSB0b3AgbGV2ZWwgJ2xpbmtzJyBlbGVtZW50IG9mIHRoZSByZXNwb25zZS5cbiAqXG4gKiBAc3VtbWFyeSBDYW5jZWxzIGEgbXVsdGlwYXJ0IHVwbG9hZFxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBkYXRhIGJsb2IgcGFydCBiZWxvbmdzIHRvLiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyXG4gKiBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgbGF5ZXIgYWxyZWFkeSBjb25maWd1cmVkIGluIHRoZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgKElEKSByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIGJsb2Igd2hpY2ggdGhlIHBhcnQgYmVsb25ncyB0by5cbiAqIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgJiMzOTstJiMzOTsgYW5kICYjMzk7LiYjMzk7IGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS5cbiAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBtdWx0aVBhcnRUb2tlbiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbXVsdGkgcGFydCB1cGxvYWQgKHRva2VuKS4gQ29udGVudCBvZiB0aGlzIHBhcmFtZXRlciBtdXN0IHJlZmVyIHRvXG4gKlxuICogYSB2YWxpZCB0b2tlbiByZXRyaWV2ZWQgd2hlbiBzdGFydGluZyB0aGUgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbmNlbE11bHRpcGFydFVwbG9hZChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfS9tdWx0aXBhcnRzL3ttdWx0aVBhcnRUb2tlbn1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlQYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aVBhcnRUb2tlblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBibG9iIGV4aXN0cyBmb3IgdGhlIHJlcXVlc3RlZCBkYXRhIGhhbmRsZS5cbiAqXG4gKiBAc3VtbWFyeSBDaGVja3MgaWYgYSBkYXRhIGhhbmRsZSBleGlzdHNcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJ3MgY29udGVudHMuXG4gKiBUaGUgZGF0YSBoYW5kbGUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsIFwiLVwiIGFuZCBcIi5cIiBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uXG4gKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0Jsb2JFeGlzdHNTdGF0dXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBEZWxldGVzIGEgZGF0YSBibG9iIGZyb20gdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBtZWNoYW5pc20gKHZvbHVtZSkuIFdoZW4geW91IGRlbGV0ZSBhIGJsb2IsIHlvdSBjYW5ub3QgdXBsb2FkXG4gKiBkYXRhIHRvIHRoZSBkZWxldGVkIGJsb2IncyBkYXRhIGhhbmRsZSBmb3IgYXQgbGVhc3QgMyBkYXlzLiBUaGUgREVMRVRFIG1ldGhvZCB3b3JrcyBvbmx5IGZvciBpbmRleCBsYXllcnMuXG4gKiBERUxFVEUgcmVxdWVzdHMgZm9yIGJsb2JzIHN0b3JlZCBmb3Igb3RoZXIga2luZCBvZiBsYXllcnMgd2lsbCBiZSByZWplY3RlZC5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgZGF0YSBibG9iIGZyb20gYW4gaW5kZXggbGF5ZXIuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIGRhdGEgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIG9mIHRoZSBibG9iIHlvdSB3YW50IHRvIGRlbGV0ZS4gVGhlIGRhdGEgaGFuZGxlIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLFxuICogJiMzOTstJiMzOTsgYW5kICYjMzk7LiYjMzk7IGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS4gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlcyBhIGJsb2IgZnJvbSBzdG9yYWdlLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgYSBibG9iXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJiMzOTtzIGNvbnRlbnRzLlxuICogVGhlIGRhdGEgaGFuZGxlIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLCAmIzM5Oy0mIzM5OyBhbmQgJiMzOTsuJiMzOTsgY2hhcmFjdGVycywgWzAtOSwgYS16LCBBLVosIC0sIC5dLlxuICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqIEBwYXJhbSByYW5nZSBVc2UgdGhpcyBwYXJhbWV0ZXIgdG8gcmVzdW1lIGRvd25sb2FkIG9mIGEgbGFyZ2UgcmVzcG9uc2Ugd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gaXNzdWUgYmV0d2VlblxuICogdGhlIGNsaWVudCBhbmQgc2VydmVyLCBvciB0byBmZXRjaCBhIHNwZWNpZmljIHNsaWNlIG9mIHRoZSBibG9iLiBUbyByZXN1bWUgZG93bmxvYWQgYWZ0ZXIgYSBjb25uZWN0aW9uIGlzc3VlLFxuICogc3BlY2lmeSBhIHNpbmdsZSBieXRlIHJhbmdlIG9mZnNldCBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqIFRvIGZldGNoIGEgc3BlY2lmaWMgc2xpY2Ugb2YgdGhlIGJsb2IsIHNwZWNpZnkgYSBzbGljZSBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLTEwMCYjeDYwOy5cbiAqIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudCB3aXRoIFtSRkMgNzIzM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMpLCBidXQgbm90ZSB0aGF0IHRoaXNcbiAqIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGJ5dGUgcmFuZ2UuIFRoZSAmI3g2MDtyYW5nZSYjeDYwOyBwYXJhbWV0ZXIgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGFzXG4gKiBhIHF1ZXJ5IHBhcmFtZXRlciwgaS5lLiAmI3g2MDtyYW5nZSYjeDNEO2J5dGVzJiN4M0Q7MTAtJiN4NjA7LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCbG9iKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJyYW5nZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJSYW5nZVwiXSA9IHBhcmFtc1tcInJhbmdlXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0cyB0aGUgc3RhdHVzIG9mIGEgbXVsdGlwYXJ0IHVwbG9hZC4gVGhlIHN0YXR1cyBjYW4gYmUgcmVjZWl2ZWQgb25seSB3aGVuIHRoZSB1cGxvYWQgaGFzIGJlZW4gY29tcGxldGVkLlxuICogUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBhY3R1YWwgVVJMIGZvciB0aGlzIG9wZXJhdGlvbiBtdXN0IGJlIG9idGFpbmVkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkgb2Ygc3RhcnRcbiAqIG11bHRpcGFydCBvcGVyYXRpb24gdGhhdCBpcyAnUE9TVCAvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfS9tdWx0aXBhcnRzJyBmcm9tIHRoZSAnc3RhdHVzJyBlbGVtZW50XG4gKiB1bmRlciB0aGUgdG9wIGxldmVsICdsaW5rcycgZWxlbWVudCBvZiB0aGUgcmVzcG9uc2UuXG4gKlxuICogQHN1bW1hcnkgR2V0cyB0aGUgc3RhdHVzIG9mIGEgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgZGF0YSBibG9iIHBhcnQgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIGlzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIGJsb2Igd2hpY2ggdGhlIHBhcnQgYmVsb25ncyB0by5cbiAqIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgJiMzOTstJiMzOTsgYW5kICYjMzk7LiYjMzk7IGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS5cbiAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBtdWx0aVBhcnRUb2tlbiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCAodG9rZW4pLiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYVxuICogdmFsaWQgdG9rZW4gd2hpY2ggd2FzIHByb3ZpZGVkIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYXRlZC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHMve211bHRpUGFydFRva2VufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKVxuICAgICAgICAucmVwbGFjZShcInttdWx0aVBhcnRUb2tlbn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm11bHRpUGFydFRva2VuXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUGVyc2lzdHMgdGhlIGRhdGEgYmxvYiBpbiB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSAodm9sdW1lKS5cbiAqIFVzZSB0aGlzIHVwbG9hZCBtZWNoYW5pc20gZm9yIGJsb2JzIHNtYWxsZXIgdGhhbiA1MCBNQi5cbiAqIFRoZSBzaXplIGxpbWl0IGZvciBibG9icyB1cGxvYWRlZCB0aGlzIHdheSBpcyA1IEdCIGJ1dCB3ZSBkbyBub3QgcmVjb21tZW5kIHVwbG9hZGluZyBibG9ic1xuICogdGhpcyBsYXJnZSB3aXRoIHRoaXMgbWV0aG9kLCBzbyB1c2UgbXVsdGlwYXJ0IHVwbG9hZCBpbnN0ZWFkLlxuICogV2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGRhdGEgYmxvYiB3aWxsIGJlXG4gKiBpbW1lZGlhdGVseSBhdmFpbGFibGUgYWx0aG91Z2ggaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlLlxuICogVG8gY2hlY2sgaWYgdGhlIGRhdGEgYmxvYiBpcyBhdmFpbGFibGUgdXNlIHRoZSBIRUFEIG1ldGhvZC5cbiAqXG4gKiBAc3VtbWFyeSBQdWJsaXNoZXMgYSBkYXRhIGJsb2JcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgZGF0YSBibG9iIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgKElEKSByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIGJsb2IuXG4gKiBUaGUgZGF0YSBoYW5kbGUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsIFwiLVwiIGFuZCBcIi5cIiBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uXG4gKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gYm9keSBUaGUgZGF0YSB0byB1cGxvYWQuIENhbiBiZSBCbG9iIG9yIEJ1ZmZlci5cbiAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFNpemUgb2YgdGhlIGVudGl0eS1ib2R5LCBpbiBieXRlcy5cbiAqIEBwYXJhbSBjb250ZW50VHlwZSBBIHN0YW5kYXJkIE1JTUUgdHlwZSBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2IgZGF0YS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1JGQyAyNjE2LCBzZWN0aW9uIDE0LjE3OiBDb250ZW50LVR5cGVdKGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzE0Lmh0bWwjc2VjMTQuMTcpLlxuICogVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIG11c3QgbWF0Y2ggdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnRlbnRUeXBlIGZpZWxkIHdoZW4gdGhlIG11bHRpcGFydFxuICogdXBsb2FkIHdhcyBpbml0aWFsaXplZCwgYW5kIHRoaXMgY29udGVudCB0eXBlIG11c3QgYWxzbyBtYXRjaCB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgbGF5ZXIncyBjb25maWd1cmF0aW9uLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDcyMzAsIHNlY3Rpb24gMy4zLjI6IENvbnRlbnQtTGVuZ3RoXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yKS5cbiAqIEBwYXJhbSBjb250ZW50RW5jb2RpbmcgT3B0aW9uYWwgcGFyYW0sIGNhbiBiZSBgZ3ppcGAgb2YgYHVuZGVmaW5lZGAuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBwdXREYXRhKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IHBhcmFtc1tcImJvZHlcIl07XG4gICAgfVxuICAgIGlmIChwYXJhbXNbXCJjb250ZW50VHlwZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBwYXJhbXNbXCJjb250ZW50VHlwZVwiXTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSBwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdO1xuICAgIH1cbiAgICBpZiAocGFyYW1zW1wiY29udGVudEVuY29kaW5nXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtRW5jb2RpbmdcIl0gPSBwYXJhbXNbXCJjb250ZW50RW5jb2RpbmdcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBQdWJsaXNoZXMgbGFyZ2UgZGF0YSBibG9icyB3aGVyZSB0aGUgZGF0YSBwYXlsb2FkIG5lZWRzIHRvIGJlIHNwbGl0IGludG8gbXVsdGlwbGUgcGFydHMuXG4gKiBUaGUgbXVsdGlwYXJ0IHVwbG9hZCBzdGFydCBpcyB0byBiZSBmb2xsb3dlZCBieSB0aGUgaW5kaXZpZHVhbCBwYXJ0cyB1cGxvYWQgYW5kIGNvbXBsZXRlZCB3aXRoIGFcbiAqIGNhbGwgdG8gY29tcGxldGUgdGhlIHVwbG9hZC4gVGhlIGxpbWl0IG9mIHRoZSBibG9iIHVwbG9hZGVkIHRoaXMgd2F5IGlzIDUwR0IuXG4gKlxuICogQHN1bW1hcnkgU3RhcnRzIGEgbXVsdGlwYXJ0IHVwbG9hZCBvZiBhIGJsb2IgYW5kIHJldHVybnMgVVJMcyBmb3IgdGhlIG5leHQgbXVsdGlwYXJ0IHVwbG9hZCBvcGVyYXRpb25zLlxuICogVGhlIFVSTHMgY29udGFpbiB0aGUgdXBsb2FkIHRva2VuLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBkYXRhIGJsb2IgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgYmxvYiB3aGljaCBjb250ZW50cyB3aWxsIGJlIHBlcnNpc3RlZC5cbiAqIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgJiMzOTstJiMzOTsgYW5kICYjMzk7LiYjMzk7IGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS5cbiAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBib2R5IGJvZHlcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TXVsdGlwYXJ0VXBsb2FkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHNcIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDYWxsIHRoaXMgQVBJIHdoZW4gYWxsIHBhcnRzIGhhdmUgYmVlbiB1cGxvYWRlZC4gUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBhY3R1YWwgVVJMIGZvciB0aGlzIG9wZXJhdGlvblxuICogbXVzdCBiZSBvYnRhaW5lZCBmcm9tIHRoZSByZXNwb25zZSBib2R5IG9mIHN0YXJ0IG11bHRpcGFydCBvcGVyYXRpb24gdGhhdCBpc1xuICogJ1BPU1QgL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX0vbXVsdGlwYXJ0cycgZnJvbSB0aGUgJ2NvbXBsZXRlJyBlbGVtZW50IHVuZGVyIHRoZSB0b3AgbGV2ZWwgJ2xpbmtzJyBlbGVtZW50IG9mIHRoZSByZXNwb25zZS5cbiAqXG4gKiBAc3VtbWFyeSBDb21wbGV0ZXMgYSBtdWx0aXBhcnQgdXBsb2FkXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIGRhdGEgYmxvYiBwYXJ0IGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgKElEKSByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIGJsb2Igd2hpY2ggdGhlIHBhcnRcbiAqIGJlbG9uZ3MgdG8uIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgXCItXCI7IGFuZCBcIi5cIiBjaGFyYWN0ZXJzLFxuICogWzAtOSwgYS16LCBBLVosIC0sIC5dLiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gbXVsdGlQYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpIHBhcnQgdXBsb2FkICh0b2tlbikuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdFxuICogcmVmZXIgdG8gYSB2YWxpZCBuYW5kIHN0YXJ0ZWQgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBwYXJ0cyBUaGUgcGFydCBpZHMgdXBsb2FkZWQgaW4gdGhpcyBtdWx0aXBhcnQgdXBsb2FkIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIHRoZSByZXN1bHRpbmcgYmxvYi5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvQ29tcGxldGVNdWx0aXBhcnRVcGxvYWQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIocGFyYW1zLnVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJwYXJ0c1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcInBhcnRzXCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFVwbG9hZCBhIHNpbmdsZSBwYXJ0IG9mIGEgbXVsdGlwYXJ0IHVwbG9hZCBmb3IgdGhlIGJsb2IuIEV2ZXJ5IHVwbG9hZGVkIHBhcnQgZXhjZXB0IHRoZSBsYXN0IG9uZSBtdXN0IGhhdmUgYVxuICogbWluaW11bSA1IE1CIG9mIGRhdGEgYW5kIG1heGltdW0gb2YgNSBHQiwgYnV0IHdlIGRvIG5vdCByZWNvbW1lbmQgdXBsb2FkaW5nIHBhcnRzIHRoaXMgbGFyZ2UuXG4gKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFydHMgaXMgMTAsMDAwLiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGFjdHVhbCBVUkwgZm9yIHRoaXMgb3BlcmF0aW9uXG4gKiBtdXN0IGJlIG9idGFpbmVkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkgb2Ygc3RhcnQgbXVsdGlwYXJ0IG9wZXJhdGlvbiB0aGF0IGlzICdQT1NUIC9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHMnXG4gKiBmcm9tIHRoZSAndXBsb2FkUGFydCcgZWxlbWVudCB1bmRlciB0aGUgdG9wIGxldmVsICdsaW5rcycgZWxlbWVudCBvZiB0aGUgcmVzcG9uc2UuXG4gKlxuICogQHN1bW1hcnkgVXBsb2FkcyBhIHBhcnRcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgZGF0YSBibG9iIHBhcnQgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgYmxvYiB3aGljaCB0aGUgcGFydCBiZWxvbmdzIHRvLiBUaGUgZGF0YSBoYW5kbGVcbiAqIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLCAnLScgYW5kICcuJyBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uXG4gKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gbXVsdGlQYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpIHBhcnQgdXBsb2FkICh0b2tlbikuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXJcbiAqIG11c3QgcmVmZXIgdG8gYSB2YWxpZCBuYW5kIHN0YXJ0ZWQgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBwYXJ0TnVtYmVyIFRoZSBudW1iZXIgb2YgdGhlIHBhcnQgZm9yIHRoZSBtdWx0aSBwYXJ0IHVwbG9hZC4gVGhlIG51bWJlcnMgb2YgdGhlIHVwbG9hZCBwYXJ0c1xuICogbXVzdCBzdGFydCBmcm9tIDEsIGJlIG5vIGdyZWF0ZXIgdGhhbiAxMCwwMDAgYW5kIGJlIGNvbnNlY3V0aXZlLiBQYXJ0cyB1cGxvYWRlZCB3aXRoIHRoZSBzYW1lICYjeDYwO3BhcnROdW1iZXImI3g2MDtcbiAqIGFyZSBvdmVycmlkZGVuLiBEbyBub3QgcmV1c2UgdGhlIHNhbWUgJ3BhcnRudW1iZXInIHdoZW4gcmV0cnlpbmcgYW4gdXBsb2FkIGluIGFuIGVycm9yIHNpdHVhdGlvblxuICogKG5ldHdvcmsgcHJvYmxlbXMsIDR4eCBvciA1eHggcmVzcG9uc2VzKS4gUmV1c2luZyB0aGUgc2FtZSAmI3g2MDtwYXJ0bnVtYmVyJiN4NjA7IGluIGEgcmV0cnkgbWF5IGNhdXNlIHRoZSBwdWJsaWNhdGlvbiB0byBmYWlsLlxuICogQHBhcmFtIGJvZHkgVGhlIGRhdGEgdG8gdXBsb2FkIGFzIHBhcnQgb2YgdGhlIGJsb2IuXG4gKiBAcGFyYW0gY29udGVudFR5cGUgQSBzdGFuZGFyZCBNSU1FIHR5cGUgZGVzY3JpYmluZyB0aGUgZm9ybWF0IG9mIHRoZSBibG9iIGRhdGEuIEZvciBtb3JlIGluZm9ybWF0aW9uLFxuICogc2VlIFtSRkMgMjYxNiwgc2VjdGlvbiAxNC4xNzogQ29udGVudC1UeXBlXShodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxNC5odG1sI3NlYzE0LjE3KS5cbiAqIFRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlciBtdXN0IG1hdGNoIHRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGluIHRoZSBjb250ZW50VHlwZSBmaWVsZCB3aGVuIHRoZSBtdWx0aXBhcnRcbiAqIHVwbG9hZCB3YXMgaW5pdGlhbGl6ZWQsIGFuZCB0aGlzIGNvbnRlbnQgdHlwZSBtdXN0IGFsc28gbWF0Y2ggdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGxheWVyJ3MgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFNpemUgb2YgdGhlIGVudGl0eS1ib2R5LCBpbiBieXRlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1JGQyA3MjMwLCBzZWN0aW9uIDMuMy4yOiBDb250ZW50LUxlbmd0aF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMikuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb1VwbG9hZFBhcnQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIocGFyYW1zLnVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcnROdW1iZXJcIiwgcGFyYW1zW1wicGFydE51bWJlclwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IHBhcmFtc1tcImJvZHlcIl07XG4gICAgfVxuICAgIGlmIChwYXJhbXNbXCJjb250ZW50VHlwZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBwYXJhbXNbXCJjb250ZW50VHlwZVwiXTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSBwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2FuY2VsTXVsdGlwYXJ0VXBsb2FkQnlLZXkgPSBjYW5jZWxNdWx0aXBhcnRVcGxvYWRCeUtleTtcbmV4cG9ydHMuY2hlY2tLZXlFeGlzdHMgPSBjaGVja0tleUV4aXN0cztcbmV4cG9ydHMuY29tcGxldGVNdWx0aXBhcnRVcGxvYWRCeUtleSA9IGNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkQnlLZXk7XG5leHBvcnRzLmRlbGV0ZUJsb2JCeUtleSA9IGRlbGV0ZUJsb2JCeUtleTtcbmV4cG9ydHMuZ2V0QmxvYkJ5S2V5ID0gZ2V0QmxvYkJ5S2V5O1xuZXhwb3J0cy5nZXRNdWx0aXBhcnRVcGxvYWRTdGF0dXNCeUtleSA9IGdldE11bHRpcGFydFVwbG9hZFN0YXR1c0J5S2V5O1xuZXhwb3J0cy5saXN0S2V5cyA9IGxpc3RLZXlzO1xuZXhwb3J0cy5wdXRCbG9iQnlLZXkgPSBwdXRCbG9iQnlLZXk7XG5leHBvcnRzLnN0YXJ0TXVsdGlwYXJ0VXBsb2FkQnlLZXkgPSBzdGFydE11bHRpcGFydFVwbG9hZEJ5S2V5O1xuZXhwb3J0cy51cGxvYWRQYXJ0QnlLZXkgPSB1cGxvYWRQYXJ0QnlLZXk7XG4vKipcbiAqIEJsb2IgQVBJIHYyXG4gKiBUaGUgYGJsb2JgIHNlcnZpY2Ugc3VwcG9ydHMgdGhlIHVwbG9hZCBhbmQgcmV0cmlldmFsIG9mIGxhcmdlIHZvbHVtZXMgb2YgZGF0YSBmcm9tIHRoZSBzdG9yYWdlIG9mIGEgY2F0YWxvZy5cbiAqIEVhY2ggZGlzY3JldGUgY2h1bmsgb2YgZGF0YSBpcyBzdG9yZWQgYXMgYSBibG9iIChCaW5hcnkgTGFyZ2UgT2JqZWN0KS4gRWFjaCBibG9iIGhhcyBpdHMgb3duIHVuaXF1ZSBJRCAoaGFuZGxlIG9yIGtleSksXG4gKiB3aGljaCBjYW4gYmUgc3RvcmVkIGFzIHBhcnRpdGlvbiBtZXRhZGF0YS5cbiAqIEFjY2Vzc2luZyBibG9icyBjYW4gYmUgZG9uZSBlaXRoZXIgYnkga2V5IG9yIGJ5IGhhbmRsZSwgbm90IGJvdGggZm9yIHRoZSBzYW1lIGxheWVyLlxuICogV2hlbiBhY2Nlc3NpbmcgYnkga2V5IGlzIGVuYWJsZWQsIHlvdSBjYW4gdXNlIGtleXMgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGJsb2JzLCBidXQgbm90IGRhdGEgaGFuZGxlcy5cbiAqIEtleXMgZm9sbG93IGEgdXNlci1kZWZpbmVkIGZvcm1hdCBmb3IgdGhlIGxheWVycyB3aGlsZSBkYXRhIGhhbmRsZXMgYXJlIG9wYXF1ZSBpZGVudGlmaWVycy5cbiAqIFRoZSBhY2Nlc3MtYnkta2V5IEFQSSBoYXMgZGlmZmVyZW50IGNhcGFiaWxpdGllcyBvZiB0aGUgYWNjZXNzLWJ5LWRhdGEtaGFuZGxlIEFQSSBhbmQgZGlmZmVyZW50IGVuZHBvaW50czpcbiAqIGVuYWJsaW5nIGFjY2VzcyBieSBrZXkgaW1wbGllcyB0aGUgY2FwYWJpbGl0eSB0byB1cGRhdGUgYmxvYnMsIHdoaWxlIG9wZXJhdGluZyB2aWEgZGF0YSBoYW5kbGVzIGlzIG1vcmUgZWZmaWNpZW50XG4gKiBhbmQgcHJvdmlkZXMgcm9vbSBmb3Igb3B0aW1pemF0aW9uIG9uIGJvdGggdGhlIGNsaWVudCBzaWRlIGFuZCBpbnNpZGUgdGhlIHNlcnZpY2UuIEluIGNhc2UgdGhlIGFjY2VzcyBwYXR0ZXJuIGlzIGJ5IGtleSxcbiAqIHlvdSBjYW4gZW5hYmxlIHRoZSBvcHRpb25hbCBjYXBhYmlsaXR5IG9mIGxpc3Rpbmcgd2hpY2gga2V5cyBhcmUgc3RvcmVkIGluIHRoZSBsYXllci4gVGhpcyBjYXBhYmlsaXR5IGhhcyBhIG5lZ2F0aXZlIGltcGFjdFxuICogb24gdGhlIGFjY2VzcyB0aW1lcyB3aGVuIGdldHRpbmcgYW5kIHNhdmluZyBibG9icyBhbmQgdGhlcmVmb3JlIG11c3QgYmUgZW5hYmxlZCBleHBsaWNpdGx5LlxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAyLjAuMFxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLypcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJ5S2V5QXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQ2FuY2VscyBhbiBlbnRpcmUgbXVsdGlwYXJ0IHVwbG9hZCBvcGVyYXRpb24uIFlvdSBjYW4gb25seSBjYW5jZWwgYSBtdWx0aXBhcnQgdXBsb2FkIGJlZm9yZSBpdCBoYXMgYmVlbiBjb21wbGV0ZWQuXG4gKlxuICogQHN1bW1hcnkgQ2FuY2VscyBhIG11bHRpcGFydCB1cGxvYWQuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIG11bHRpcGFydFRva2VuIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtdWx0aXBhcnQgdXBsb2FkICh0b2tlbikuXG4gKiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYSB2YWxpZCB0b2tlbiB3aGljaCB3aGVuIHRoZSBtdWx0aXBhcnQgdXBsb2FkIHdhcyBpbml0aWF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbmNlbE11bHRpcGFydFVwbG9hZEJ5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXNNdWx0aXBhcnQve211bHRpcGFydFRva2VufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlwYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aXBhcnRUb2tlblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBibG9iIGV4aXN0cyBmb3IgdGhlIHJlcXVlc3RlZCBrZXkuXG4gKlxuICogQHN1bW1hcnkgQ2hlY2tzIGlmIGEga2V5IGV4aXN0cy5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2IncyBjb250ZW50cy5cbiAqIEtleSBjYW4gb25seSBjb250YWluIGFsbG93ZWQgY2hhcmFjdGVyczogYS16QS1aMC05LltdKCl7fS9fLSYuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrS2V5RXhpc3RzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXMve2tleX1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2tleX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImtleVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiSEVBRFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ2FsbCB0aGlzIEFQSSB3aGVuIGFsbCBwYXJ0cyBoYXZlIGJlZW4gdXBsb2FkZWQuXG4gKlxuICogQHN1bW1hcnkgQ29tcGxldGVzIGEgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0gbXVsdGlwYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpcGFydCB1cGxvYWQgKHRva2VuKS5cbiAqIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIHRva2VuIHdoaWNoIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYXRlZC5cbiAqIEBwYXJhbSBib2R5IFRoZSBwYXJ0IElEcyB1cGxvYWRlZCBpbiB0aGlzIG11bHRpcGFydCB1cGxvYWQgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHJlc3VsdGluZyBibG9iLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wbGV0ZU11bHRpcGFydFVwbG9hZEJ5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXNNdWx0aXBhcnQve211bHRpcGFydFRva2VufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlwYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aXBhcnRUb2tlblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogRGVsZXRlcyBhIGRhdGEgYmxvYi5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgZGF0YSBibG9iLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYidzIGNvbnRlbnRzLlxuICogS2V5IGNhbiBvbmx5IGNvbnRhaW4gYWxsb3dlZCBjaGFyYWN0ZXJzOiBhLXpBLVowLTkuW10mKCl7fS9fLSYuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJsb2JCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzL3trZXl9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntrZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJrZXlcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmVzIGEgYmxvYiBmcm9tIHN0b3JhZ2UuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBhIGJsb2IuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIGtleSBUaGUga2V5IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJ3MgY29udGVudHMuXG4gKiBLZXkgY2FuIG9ubHkgY29udGFpbiBhbGxvd2VkIGNoYXJhY3RlcnM6IGEtekEtWjAtOS5bXSYoKXt9L187LlxuICogQHBhcmFtIHJhbmdlIFVzZSB0aGlzIHBhcmFtZXRlciB0byByZXN1bWUgZG93bmxvYWQgb2YgYSBsYXJnZSByZXNwb25zZSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbiBpc3N1ZSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlcixcbiAqIG9yIHRvIGZldGNoIGEgc3BlY2lmaWMgc2xpY2Ugb2YgdGhlIGJsb2IuIFRvIHJlc3VtZSBkb3dubG9hZCBhZnRlciBhIGNvbm5lY3Rpb24gaXNzdWUsXG4gKiBzcGVjaWZ5IGEgc2luZ2xlIGJ5dGUgcmFuZ2Ugb2Zmc2V0IGFzIGZvbGxvd3M6IFJhbmdlOiBieXRlcyYxMDsuXG4gKiBUbyBmZXRjaCBhIHNwZWNpZmljIHNsaWNlIG9mIHRoZSBibG9iLCBzcGVjaWZ5IGEgc2xpY2UgYXMgZm9sbG93czpcbiAqIFJhbmdlOiBieXRlcyYxMC0xMDAuIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudCB3aXRoIFtSRkMgNzIzM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMpLFxuICogYnV0IG5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGJ5dGUgcmFuZ2UuXG4gKiBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgcmFuZ2UgcGFyYW1ldGVyIGFzIGEgcXVlcnkgcGFyYW1ldGVyLCBmb3IgZXhhbXBsZSByYW5nZSZieXRlcyYxMDsuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEJsb2JCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzL3trZXl9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntrZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJrZXlcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wicmFuZ2VcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiUmFuZ2VcIl0gPSBwYXJhbXNbXCJyYW5nZVwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldHMgdGhlIHN0YXR1cyBvZiBhIG11bHRpcGFydCB1cGxvYWQuIFRoZSBzdGF0dXMgY2FuIGJlIHJlY2VpdmVkIG9ubHkgd2hlbiB0aGUgdXBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtdWx0aXBhcnQgdXBsb2FkLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBtdWx0aXBhcnRUb2tlbiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCAodG9rZW4pLlxuICogQ29udGVudCBvZiB0aGlzIHBhcmFtZXRlciBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgdG9rZW4gd2hpY2ggd2hlbiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCB3YXMgaW5pdGlhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRNdWx0aXBhcnRVcGxvYWRTdGF0dXNCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzTXVsdGlwYXJ0L3ttdWx0aXBhcnRUb2tlbn1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie211bHRpcGFydFRva2VufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibXVsdGlwYXJ0VG9rZW5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBMaXN0IHZpcnR1YWwgZGlyZWN0b3J5LWxpa2Ugc3RydWN0dXJlIGNyZWF0ZWQgZnJvbSBrZXlzIGluIHRoZSBzdG9yYWdlIHdoZXJlICcvJyBpcyB1c2VkIGFzIGEgc2VwYXJhdG9yLlxuICpcbiAqIEBzdW1tYXJ5IExpc3Qga2V5cy5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0gcGFyZW50IENvbW1vbiBwcmVmaXggdG8gYSBsaXN0LlxuICogQHBhcmFtIHBhZ2VUb2tlbiBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHRoZSBzcGVjaWZpYyBwYWdlIGJhc2VkIG9uIHRoZSB0b2tlbi5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4gcGVyIHBhZ2UuXG4gKiBAcGFyYW0gZGVlcCBVc2UgZGVlcCAocmVjdXJzaXZlKSBsaXN0aW5nIG9mIG9iamVjdHMgaW5zdGVhZCBvZiBoaWVyYXJjaGljYWwgbGlzdGluZy5cbiAqIERlZXAgbGlzdGluZyB3aWxsIG5vdCBwcm9kdWNlIGFueSBjb21tb24gcHJlZml4ZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RLZXlzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcmVudFwiLCBwYXJhbXNbXCJwYXJlbnRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJkZWVwXCIsIHBhcmFtc1tcImRlZXBcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFBlcnNpc3RzIHRoZSBkYXRhIGJsb2IgdXAgdG8gMTkyIE1CLiBXaGVuIHRoZSBvcGVyYXRpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSxcbiAqIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBkYXRhIGJsb2Igd2lsbCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUsIGFsdGhvdWdoIGluIG1vc3QgY2FzZXMsXG4gKiBpdCB3aWxsIGJlLiBUbyBjaGVjayBpZiB0aGUgZGF0YSBibG9iIGlzIGF2YWlsYWJsZSwgdXNlIHRoZSDCtEhFQUTCtCBtZXRob2QuIFRoZSBtYXhpbXVtIGtleSBsZW5ndGggaXMgNDUwIGNoYXJhY3RlcnMuXG4gKlxuICogQHN1bW1hcnkgUHVibGlzaGVzIGEgZGF0YSBibG9iIG9yIGNvcGllcyBhbiBleGlzdGluZyBibG9iLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYidzIGNvbnRlbnRzLlxuICogS2V5IGNhbiBvbmx5IGNvbnRhaW4gYWxsb3dlZCBjaGFyYWN0ZXJzOiBhLXpBLVowLTkuW10mKCl7fS9fOy5cbiAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFNpemUgb2YgdGhlIGVudGl0eS1ib2R5LCBpbiBieXRlcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyA3MjMwLCBzZWN0aW9uIDMuMy4yOiBDb250ZW50LUxlbmd0aF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMikuXG4gKiBAcGFyYW0gYm9keSBSZXF1ZXN0IGJvZHkuIE11c3QgYmUgZW1wdHkgd2hlbiBjb3B5aW5nIGFuIG9iamVjdCB1c2luZyB0aGUgc291cmNlIHBhcmFtZXRlci5cbiAqIEBwYXJhbSBzb3VyY2UgQ29weSBhbiBhbHJlYWR5LWV4aXN0aW5nIG9iamVjdCwgaW5zdGVhZCBvZiB1cGxvYWRpbmcgYSBuZXcgb25lLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBwcmVzZW50LFxuICogdGVoIHJlcXVlc3QgcGF5bG9hZCBtdXN0IGJlIGVtcHR5LlxuICovXG5hc3luYyBmdW5jdGlvbiBwdXRCbG9iQnlLZXkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0va2V5cy97a2V5fVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7a2V5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wia2V5XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNvdXJjZVwiLCBwYXJhbXNbXCJzb3VyY2VcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICBpZiAocGFyYW1zW1wiY29udGVudExlbmd0aFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LUxlbmd0aFwiXSA9IGAke3BhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl19YDtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFB1Ymxpc2hlcyBsYXJnZSBkYXRhIGJsb2JzIHdoZXJlIHRoZSBkYXRhIHBheWxvYWQgbmVlZHMgdG8gYmUgc3BsaXQgaW50byBtdWx0aXBsZSBwYXJ0cy5cbiAqIFRoZSBtdWx0aXBhcnQgdXBsb2FkIHN0YXJ0IGlzIHRvIGJlIGZvbGxvd2VkIGJ5IHRoZSBpbmRpdmlkdWFsIHBhcnRzIHVwbG9hZCBhbmQgY29tcGxldGVkXG4gKiB3aXRoIGEgY2FsbCB0byBjb21wbGV0ZSB0aGUgdXBsb2FkLiBUaGUgbGltaXQgb2YgdGhlIGJsb2IgdXBsb2FkZWQgdGhpcyB3YXkgaXMgNTBHQi5cbiAqIE1heCBrZXkgbGVuZ3RoIGlzIDQ1MCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBzdW1tYXJ5IFN0YXJ0cyBhIG11bHRpcGFydCB1cGxvYWQuXG4gKiBAcGFyYW0gYm9keSBBbiBvYmplY3QgdGhhdCBjb250YWlucyBtZXRhZGF0YSBvZiB0aGUgdXBsb2FkZWQgb2JqZWN0LlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYidzIGNvbnRlbnRzLlxuICogS2V5IGNhbiBvbmx5IGNvbnRhaW4gYWxsb3dlZCBjaGFyYWN0ZXJzOiBhLXpBLVowLTkuW10mKCl7fS9fOy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhcnRNdWx0aXBhcnRVcGxvYWRCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzL3trZXl9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntrZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJrZXlcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFVwbG9hZCBvciBjb3B5IGEgc2luZ2xlIHBhcnQgb2YgYSBtdWx0aXBhcnQgdXBsb2FkIG9yIG11bHRpcGFydCBjb3B5IGZvciB0aGUgYmxvYi5cbiAqIEV2ZXJ5IHBhcnQgZXhjZXB0IHRoZSBsYXN0IG9uZSBtdXN0IGhhdmUgYSBtaW5pbXVtIDUgTUIgb2YgZGF0YSBhbmQgbWF4aW11bSBvZiA5NiBNQi5cbiAqIFRoZSBsZW5ndGggb2YgZXZlcnkgcGFydCBleGNlcHQgdGhlIGxhc3Qgb25lIG11c3QgYmUgbXVsdGlwbGUgb2YgMU1CICgxMDI0S0IpLlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRzIGlzIDEwLDAwMC5cbiAqXG4gKiBAc3VtbWFyeSBVcGxvYWRzIGEgcGFydCBvciBjcmVhdGVzIGEgbmV3IHBhcnQgZnJvbSBwYXJ0IG9mIGFuIGV4aXN0aW5nIGJsb2IuXG4gKiBAcGFyYW0gYm9keSBUaGUgYm9keSByZWxhdGVzIHRvIHVwbG9hZCBvbmx5LiBUaGUgZGF0YSB0byB1cGxvYWQgYXMgcGFydCBvZiB0aGUgYmxvYi5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0gbXVsdGlwYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpcGFydCB1cGxvYWQgKHRva2VuKS5cbiAqIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIHRva2VuIHdoaWNoIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYXRlZC5cbiAqIEBwYXJhbSBwYXJ0TnVtYmVyIFRoaXMgcGFyYW1ldGVyIHJlbGF0ZXMgdG8gdXBsb2FkIGFuZCBjb3B5LiBUaGUgbnVtYmVyIG9mIHRoZSBwYXJ0IGZvciB0aGUgbXVsdGlwYXJ0IHVwbG9hZCBvciBjb3B5LlxuICogVGhlIG51bWJlcnMgb2YgdGhlIHVwbG9hZCBwYXJ0cyBtdXN0IHN0YXJ0IGZyb20gMSwgYmUgbm8gZ3JlYXRlciB0aGFuIDEwLDAwMCBhbmQgYmUgY29uc2VjdXRpdmUuXG4gKiBQYXJ0cyB1cGxvYWRlZCB3aXRoIHRoZSBzYW1lIHBhcnROdW1iZXIgYXJlIG92ZXJyaWRkZW4uIERvIG5vdCByZXVzZSB0aGUgc2FtZSBwYXJ0TnVtYmVyIHdoZW4gcmV0cnlpbmdcbiAqIGFuIHVwbG9hZCBvciBjb3B5IGluIGFuIGVycm9yIHNpdHVhdGlvbiAobmV0d29yayBwcm9ibGVtcywgNHh4IG9yIDV4eCByZXNwb25zZXMpLlxuICogUmV1c2luZyB0aGUgc2FtZSBwYXJ0TnVtYmVyIGluIGEgcmV0cnkgbWF5IGNhdXNlIHRoZSBwdWJsaWNhdGlvbiB0byBmYWlsLlxuICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhpcyBoZWFkZXIgcmVsYXRlcyB0byB1cGxvYWQgb25seS4gU2l6ZSBvZiB0aGUgZW50aXR5LWJvZHksIGluIGJ5dGVzLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDcyMzAsIHNlY3Rpb24gMy4zLjI6IENvbnRlbnQtTGVuZ3RoXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yKS5cbiAqIEBwYXJhbSBjb250ZW50VHlwZSBUaGlzIGhlYWRlciByZWxhdGVzIHRvIHVwbG9hZCBvbmx5LiBBIHN0YW5kYXJkIE1JTUUgdHlwZSBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2IgZGF0YS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAyNjE2LCBzZWN0aW9uIDE0LjE3OiBDb250ZW50LVR5cGVdKGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzE0Lmh0bWwjc2VjMTQuMTcpLlxuICogVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIG11c3QgbWF0Y2ggdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnRlbnRUeXBlIGZpZWxkIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYWxpemVkLFxuICogYW5kIHRoaXMgY29udGVudCB0eXBlIG11c3QgYWxzbyBtYXRjaCB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgbGF5ZXIncyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHNvdXJjZSBDb3B5IHBhcnQgZnJvbSBhbiBleGlzdGluZyBvYmplY3QsIHVzZSByYW5nZSB0byBzcGVjaWZ5IHdoaWNoIHBhcnRzIG9mIHRoZSBvYmplY3QgdG8gY29weS5cbiAqIEBwYXJhbSByYW5nZSBUaGlzIGhlYWRlci9wYXJhbWV0ZXIgcmVsYXRlcyB0byBvYmplY3QgY29weSB1c2luZyB0aGUgJ3NvdXJjZScgcGFyYW1ldGVyLiBVc2UgdGhpcyBwYXJhbWV0ZXJcbiAqIHRvIGNvcHkgYSBzcGVjaWZpYyBzbGljZSBvZiB0aGUgYmxvYiBsaWtlIHRoaXM6IFJhbmdlOiBieXRlcyYwLTEwNDg1NzUuIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudFxuICogd2l0aCBbUkZDIDcyMzNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMzKSwgYnV0IG5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGFcbiAqIHNpbmdsZSBieXRlIHJhbmdlIGFuZCBib3RoIGJlZ2luIGFuZCBlbmQgdmFsdWVzIG9mIHRoZSByYW5nZSBtdXN0IGJlIHNwZWNpZmllZC5cbiAqIFRoZSByYW5nZSBiZWdpbiB2YWx1ZSBtdXN0IGJlIG11bHRpcGxlIG9mIDFNQiAoMTAyNEtCKS5cbiAqIFRoZSBsZW5ndGggb2YgZXZlcnkgcGFydCBleGNlcHQgdGhlIGxhc3Qgb25lIG11c3QgYmUgbXVsdGlwbGUgb2YgMU1CICgxMDI0S0IpLlxuICogVGhlIHJhbmdlIHBhcmFtZXRlciBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYXMgYSBxdWVyeSBwYXJhbWV0ZXIsIGZvciBleGFtcGxlIHJhbmdlJmJ5dGVzJjAtMTA0ODU3NS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBsb2FkUGFydEJ5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXNNdWx0aXBhcnQve211bHRpcGFydFRva2VufS9wYXJ0c1wiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlwYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aXBhcnRUb2tlblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYXJ0TnVtYmVyXCIsIHBhcmFtc1tcInBhcnROdW1iZXJcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzb3VyY2VcIiwgcGFyYW1zW1wic291cmNlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIG9wdGlvbnMuYm9keSA9IHBhcmFtc1tcImJvZHlcIl07XG4gICAgaWYgKHBhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSBgJHtwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdfWA7XG4gICAgfVxuICAgIGlmIChwYXJhbXNbXCJjb250ZW50VHlwZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBwYXJhbXNbXCJjb250ZW50VHlwZVwiXTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcInJhbmdlXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlJhbmdlXCJdID0gcGFyYW1zW1wicmFuZ2VcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2F0YWxvZ0V4aXN0cyA9IGNhdGFsb2dFeGlzdHM7XG5leHBvcnRzLmNyZWF0ZUNhdGFsb2cgPSBjcmVhdGVDYXRhbG9nO1xuZXhwb3J0cy5kZWxldGVDYXRhbG9nID0gZGVsZXRlQ2F0YWxvZztcbmV4cG9ydHMuZGVsZXRlTGF5ZXIgPSBkZWxldGVMYXllcjtcbmV4cG9ydHMuZGlzYWJsZUF1dG9tYXRpY1ZlcnNpb25EZWxldGlvbiA9IGRpc2FibGVBdXRvbWF0aWNWZXJzaW9uRGVsZXRpb247XG5leHBvcnRzLmdldENhdGFsb2cgPSBnZXRDYXRhbG9nO1xuZXhwb3J0cy5nZXRDYXRhbG9nU3RhdHVzID0gZ2V0Q2F0YWxvZ1N0YXR1cztcbmV4cG9ydHMuZ2V0Q2F0YWxvZ3MgPSBnZXRDYXRhbG9ncztcbmV4cG9ydHMucGF0Y2hDYXRhbG9nID0gcGF0Y2hDYXRhbG9nO1xuZXhwb3J0cy5wYXRjaExheWVyID0gcGF0Y2hMYXllcjtcbmV4cG9ydHMudXBkYXRlQ2F0YWxvZyA9IHVwZGF0ZUNhdGFsb2c7XG4vKipcbiAqIENvbmZpZyBBUEkgdjFcbiAqIFRoZSBgY29uZmlnYCBzZXJ2aWNlIHByb3ZpZGVzIGJhc2ljIGNhdGFsb2cgbWFuYWdlbWVudCBvcGVyYXRpb25zLlxuICogSXQgbWFuYWdlcyBhbGwgcGxhdGZvcm0gcmVzb3VyY2VzIG5lZWRlZCBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIGNhdGFsb2dzIGFuZCBvcGVyYXRpb25zIG9uIHRoZW0uXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMS43XG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uZmlnQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBjYXRhbG9nIHdpdGggdGhlIHNwZWNpZmllZCBIUk4gZXhpc3RzLlxuICpcbiAqIEBzdW1tYXJ5IENoZWNrcyB0aGUgZXhpc3RlbmNlIG9mIGEgY2F0YWxvZ1xuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nXG4gKiByZWNvcmRzIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhdGFsb2dFeGlzdHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzL3tjYXRhbG9nSHJufVwiLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkhFQURcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY2F0YWxvZyB3aXRoIHRoZSBzcGVjaWZpZWQgbGF5ZXJzLiBUaGUgY3JlYXRlIGNhdGFsb2cgb3BlcmF0aW9uIHJ1bnMgYXN5bmNocm9ub3VzbHkuXG4gKiBPbmNlIHlvdSd2ZSBzdWJtaXR0ZWQgdGhlIGNhdGFsb2cgZm9yIGNyZWF0aW9uLCB5b3UnbGwgcmVjZWl2ZSBhIHJhbmRvbWx5IGdlbmVyYXRlZCB0b2tlbiB0aGF0IHlvdSBjYW4gdXNlIHRvIG1vbml0b3JcbiAqIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgY2F0YWxvZ1xuICogQHBhcmFtIGJvZHkgQSBjYXRhbG9nIG9iamVjdCB0aGF0IGNvbnRhaW5zIG1ldGFkYXRhIGFuZCBsYXllciBkZWZpbml0aW9ucy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nXG4gKiByZWNvcmRzIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNhdGFsb2coYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBEZWxldGVzIGEgY2F0YWxvZyBhbmQgYW55IGxheWVycyB3aXRoaW4gdGhhdCBjYXRhbG9nLlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZXMgYSBjYXRhbG9nXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBUaGUgYGJpbGxpbmdUYWdgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgeW91IGNhbiB1c2UgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlbGV0ZXMgYSBsYXllciBvZiB0aGUgY2F0YWxvZyBpZiBpdCdzIG9mIGxheWVyVHlwZSAnaW5kZXgnLCAndm9sYXRpbGUnLCBvciAnc3RyZWFtJy4gT3RoZXIgYGxheWVyVHlwZXNgIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgYSBsYXllclxuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZ1xuICogQHBhcmFtIGxheWVySWQgVGhlIGxheWVyIElEXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxheWVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9jYXRhbG9ncy97Y2F0YWxvZ0hybn0vbGF5ZXJzL3tsYXllcklkfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2NhdGFsb2dIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJjYXRhbG9nSHJuXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBEaXNhYmxlIGF1dG9tYXRpYyByZXRpcmVkIHZlcnNpb25zIGNsZWFudXAuXG4gKlxuICogQHN1bW1hcnkgRGlzYWJsZSBhdXRvbWF0aWMgdmVyc2lvbiBkZWxldGlvblxuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlzYWJsZUF1dG9tYXRpY1ZlcnNpb25EZWxldGlvbihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59L2F1dG9tYXRpY1ZlcnNpb25EZWxldGlvblwiLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBmdWxsIGNhdGFsb2cgY29uZmlndXJhdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBjYXRhbG9nLiBUaGUgY2F0YWxvZyBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGRlc2NyaXB0aXZlIGFuZFxuICogc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBzdWNoIGFzIGxheWVyIGRlZmluaXRpb25zIGFuZCBsYXllciB0eXBlcy5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBkZXRhaWxzIG9mIGEgY2F0YWxvZ1xuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZ1xuICogQHBhcmFtIGJpbGxpbmdUYWcgVGhlIGBiaWxsaW5nVGFnYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGdyb3VwIGJpbGxpbmdcbiAqIHJlY29yZHMgdG9nZXRoZXIuIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFRha2VzIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgdG9rZW4gdGhhdCB5b3UgcmVjZWl2ZSB3aGVuIHlvdSBzdWJtaXQgYSBjYXRhbG9nIGZvciBjcmVhdGlvbi4gWW91IGNhbiB1c2UgaXQgdG8gbW9uaXRvciB0aGUgc3RhdHVzXG4gKiBvZiB5b3VyIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgR2V0cyB0aGUgc3RhdHVzIG9mIGEgY3JlYXRlLCB1cGRhdGUgb3IgZGVsZXRlIGNhdGFsb2cgcmVxdWVzdC5cbiAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gb2YgY2F0YWxvZyBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIGRlbGV0aW9uIHRhc2tcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nIHJlY29yZHNcbiAqIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENhdGFsb2dTdGF0dXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3N0YXR1cy97dG9rZW59XCIucmVwbGFjZShcInt0b2tlbn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInRva2VuXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTGlzdHMgYWxsIGNhdGFsb2dzIHRoYXQgeW91ciBhY2NvdW50IGhhcyBhY2Nlc3MgdG8uIFRvIGdldCBhY2Nlc3MgdG8gYSBjYXRhbG9nLCB5b3VyIGFkbWluaXN0cmF0b3IgbXVzdCBhc3NvY2lhdGUgdGhpcyBjYXRhbG9nXG4gKiBpbiB5b3VyIEhFUkUgcGxhdGZvcm0gYWNjb3VudC4gQnkgZGVmYXVsdCwgdGhlIGxpc3QgcHJvdmlkZXMgc3VtbWFyeSBkYXRhIGZvciBlYWNoIGNhdGFsb2cgc3VjaCBhcyB0aGUgdGl0bGUsIHRoZSBjb25maWd1cmF0aW9uXG4gKiBVUkwsIGFuZCB0aGUgcmVzb3VyY2UgdHlwZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGEgbGlzdCBvZiBhbGwgY2F0YWxvZ3NcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nIHJlY29yZHNcbiAqIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCAgIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqIEBwYXJhbSB2ZXJib3NlIEluZGljYXRlcyBpZiB0aGUgcmVzcG9uc2Ugc2hvdWxkIGNvbnRhaW4gZnVsbHkgZXhwYW5kZWQgY2F0YWxvZyBjb25maWd1cmF0aW9ucy4gXCJ0cnVlXCIgfCBcImZhbHNlXCIuXG4gKiBAcGFyYW0gcSBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gVGhlIHJlc3VsdCBjb250YWlucyBvbmx5IHRob3NlIGl0ZW1zIHdoaWNoIGhhdmUgdGhlIGdpdmVuIHN0cmluZ1xuICogYXMgYSBwYXJ0IG9mIHRoZSB2YWx1ZSBvZiBvbmUgb3IgbW9yZSBzZWFyY2hhYmxlIGZpZWxkcyAoc3Vic3RyaW5nIGNvbXBhcmUpLiBJdCB3aWxsIHNlYXJjaCB0aGUgZm9sbG93aW5nIGNhdGFsb2cgZGV0YWlsc1xuICogZmllbGRzOiBpZCwgbmFtZSwgc3VtbWFyeSwgZGVzY3JpcHRpb24sIHRhZ3MgYW5kIGxheWVyIGRldGFpbHM6IGlkLCBuYW1lLCBzdW1tYXJ5LCBkZXNjcmlwdGlvbiwgdGFncywgc2NoZW1hLWhyblxuICogQHBhcmFtIG9yZ2FuaXNhdGlvbiBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gRmlsdGVycyBvbmx5IGNhdGFsb2dzIChsYXllcnMpIHRoYXQgYmVsb25nIHRvIGEgc3BlY2lmaWVkXG4gKiBvcmdhbmlzYXRpb24uIFlvdSBjYW4gZmlsdGVyIG9ubHkgYnkgY2F0YWxvZyAobGF5ZXIpIG93bmVyIG9yZ2FuaXNhdGlvbiBJRC4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFuIG9yZ2FuaXNhdGlvbiwgdGhlIHNlYXJjaFxuICogaXMgdW5maWx0ZXJlZC5cbiAqIEBwYXJhbSBvcmdhbmlzYXRpb25UeXBlIFdvcmtzIG9ubHkgd2hlbiB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCB0byB0cnVlLiBGaWx0ZXJzIG9ubHkgY2F0YWxvZ3MgdGhhdCBiZWxvbmcgdG8gYW4gb3JnYW5pc2F0aW9uLlxuICogSWYgc2V0IHRvIGBgbXlPcmdhbmlzYXRpb25gYCwgdGhlIHNlYXJjaCBpcyBmb3IgY2F0YWxvZ3MgKGxheWVycykgd2l0aCB0aGUgc2FtZSBvd25lciBvcmdhbmlzYXRpb24gSUQgbGlrZSB0aGVcbiAqIHJlcXVlc3RlcmBgcy4gSWYgc2V0IHRvIGBgaGVyZWBgLCB0aGUgc2VhcmNoIGlzIGZvciBjYXRhbG9ncyAobGF5ZXJzKSB3aXRoIHRoZSBzYW1lIG93bmVyIG9yZ2FuaXNhdGlvbiBJRFxuICogaXMgZXF1YWwgdG8gdGhlIEhlcmUgb3JnYW5pc2F0aW9uLiBJZiBzZXQgdG8gYGBvdGhlcmBgLCB0aGUgc2VhcmNoIGlzIGZvciBjYXRhbG9ncyAobGF5ZXJzKSB3aXRoIGFuIG93bmVyIG9yZ2FuaXNhdGlvblxuICogIElEIG5vdCBlcXVhbCB0byB0aGUgcmVxdWVzdGVyIG9yZ2FuaXNhdGlvbiBhbmQgbm90IGVxdWFsIHRvIEhFUkUgb3JnYW5pc2F0aW9uLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYW4gb3JnYW5pc2F0aW9uLFxuICogdGhlIHNlYXJjaCBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIGxheWVyVHlwZSBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGF5ZXIgdHlwZXMgKHdpdGggT1Igc2VtYW50aWMpIHRvIGxvb2sgZm9yXG4gKiBpbiB0aGUgbGF5ZXIgdHlwZS4gRmlsdGVycyBvbmx5IGNhdGFsb2dzIHRoYXQgY29udGFpbiBsYXllcnMgd2l0aCBsYXllciB0eXBlIHByZXNlbnRlZCBpbiBhIGdpdmVuIGxpc3QuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIGxheWVyXG4gKiAgdHlwZSwgdGhlIHNlYXJjaCBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIHJlZ2lvbiBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVnaW9ucyAod2l0aCBPUiBzZW1hbnRpYykgdG8gbG9vayBmb3JcbiAqICBpbiB0aGUgY2F0YWxvZyByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uLiBGaWx0ZXJzIG9ubHkgY2F0YWxvZ3MgdGhhdCBjb250YWluIHJlZ2lvbiBwcmVzZW50ZWQgaW4gZ2l2ZW4gbGlzdC5cbiAqIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHJlZ2lvbiwgdGhlIHNlYXJjaCBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIHNjaGVtYUhybiBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gRmlsdGVycyBvbmx5IGNhdGFsb2dzIChsYXllcnMpIGJ5IHRoZSBzcGVjaWZpZWQgbGF5ZXIgc2NoZW1hIEhSTi5cbiAqIFlvdSBjYW4gb25seSBmaWx0ZXIgYnkgbGF5ZXIgc2NoZW1hLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBzY2hlbWEsIHRoZSBzZWFyY2ggaXMgdW5maWx0ZXJlZC5cbiAqIEBwYXJhbSByZXNvdXJjZVR5cGUgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIFNwZWNpZmllcyBvdGhlciBmaWx0ZXJzIGJlaGF2aW9yLiBJZiBzZXQgdG8gYGNhdGFsb2dgLFxuICogdGhpcyBhcHBsaWVzIG90aGVyIGZpbHRlcnMgdG8gc2VhcmNoIGNhdGFsb2dzIChhbmQgbGF5ZXJzIGluc2lkZSkuIElmIHNldCB0byBgbGF5ZXJgLCB0aGlzIGFwcGxpZXMgb3RoZXIgZmlsdGVycyB0byBzZWFyY2ggbGF5ZXJzLlxuICogVGhlIHJldHVybmVkIGpzb24gc3RydWN0dXJlIGlzIHRoZSBzYW1lIGZvciBib3RoIGNhc2VzIChsaXN0IG9mIGNhdGFsb2dzIHdpdGggbGlzdCBvZiBsYXllcnMgaW5zaWRlIGVhY2ggY2F0YWxvZykuXG4gKiBAcGFyYW0gY292ZXJhZ2UgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvdW50cmllcyAod2l0aCBPUiBzZW1hbnRpYykgdG8gbG9vayBmb3JcbiAqIGluIHRoZSBjYXRhbG9nIChsYXllcikgY292ZXJhZ2UuIE9ubHkgY2F0YWxvZ3MgKGxheWVycykgY292ZXJpbmcgc3BlY2lmaWVkIGNvdW50cmllcyB3aWxsIGJlIHJldHVybmVkLiBUaGlzIGZpbGVkIGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgY292ZXJhZ2UsIHRoZSBzZWFyY2ggaW5jbHVkZXMgYWxsIGNvdW50cmllcy5cbiAqIEBwYXJhbSBhY2Nlc3MgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFjY2VzcyB0eXBlcyAod2l0aCBPUiBzZW1hbnRpYylcbiAqIHRvIGZpbHRlciByZXN1bHQuIElmIHNldCB0byBgZGVmYXVsdGAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBjYXRhbG9ncyB0aGUgdXNlciBoYXMgcmVhZCBvciBtYW5hZ2UgYWNjZXNzIHRvLiBJZiBzZXQgdG8gYGNyZWF0ZWAsXG4gKiB0aGUgcmVzcG9uc2UgaW5jbHVkZXMgY2F0YWxvZ3MgdGhlIHVzZXIgaGFzIGNyZWF0ZWQgYW5kIHdoaWNoIG1hdGNoIHRoZSBgb3duZXIuY3JlYXRvcmAgZmllbGQsIGlmIHNldCB0byBgbWFuYWdlYCxcbiAqIHRoZSByZXNwb25zZSBpbmNsdWRlcyBjYXRhbG9ncyB0aGUgdXNlciBoYXMgbWFuYWdlIGFjY2VzcyB0by4gSWYgc2V0IHRvIGBvcmdBZG1pbmAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBjYXRhbG9ncyB0aGUgYE9yZ0FkbWluYFxuICogdXNlciBoYXZlIGFjY2VzcyB0by5cbiAqIEBwYXJhbSBtYXJrZXRwbGFjZVJlYWR5IEluZGljYXRlcyBpZiB0aGUgcmVzcG9uc2Ugc2hvdWxkIGNvbnRhaW4gb25seSBNYXJrZXRwbGFjZS1yZWFkeSBjYXRhbG9ncy4gSWYgdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLFxuICogdGhlIHNlcnZpY2Ugd2lsbCByZXR1cm4gb25seSBjYXRhbG9ncyB3aXRoIHRoZSBgbWFya2V0cGxhY2VSZWFkeWAgZWxlbWVudCBzZXQgdG8gdHJ1ZS5cbiAqIEBwYXJhbSBsaW1pdCBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gV2hlbiBzcGVjaWZpZWQsIHJlc3VsdCBlbGVtZW50IGNvdW50IHdpbGwgYmUgbGltaXRlZCB0byB0aGlzIHZhbHVlLlxuICogTWluaW11bTogMS5cbiAqIEBwYXJhbSBzb3J0QnkgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIFNwZWNpZmllcyBzb3J0IGZpZWxkLiBJZiBzZXQgdG8gYG5hbWVgLCB0aGUgcmVzcG9uc2UgY29udGFpbnMgY2F0YWxvZ3NcbiAqIHNvcnRlZCBieSBjYXRhbG9nIG5hbWUuIElmIHNldCB0byBgY3JlYXRlZGAsIHRoZSB0aGUgcmVzcG9uc2UgY29udGFpbnMgY2F0YWxvZ3Mgc29ydGVkYnkgY2F0YWxvZyBjcmVhdGUgdGltZS4gTGF5ZXJzIGluc2lkZSBhIGNhdGFsb2dcbiAqIGFyZSBhbHdheXMgc29ydGVkIGJ5IGxheWVyIG5hbWUuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIGBzb3J0QnlgLCB0aGUgcmVzcG9uc2UgY29udGFpbnMgY2F0YWxvZ3Mgc29ydGVkIGJ5IGBuYW1lYC5cbiAqIEBwYXJhbSBzb3J0T3JkZXIgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIFNwZWNpZmllcyB0aGUgc29ydCBvcmRlci4gSWYgc2V0IHRvIGBhc2NgLFxuICogdGhlIHNvcnQgb3JkZXIgaXMgYXNjZW5kaW5nLiBJZiBzZXQgdG8gYGRlc2NgLCB0aGUgc29ydCBvcmRlciBpcyBkZXNjZW5kaW5nLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYHNvcnRPcmRlcmAsXG4gKiB0aGUgc29ydCBvcmRlciBpcyBhc2NlbmRpbmcuXG4gKiBAcGFyYW0gbGlua2FibGUgSW5kaWNhdGVzIGlmIHRoZSByZXNwb25zZSBzaG91bGQgb25seSByZXR1cm4gdGhlIGxpc3Qgb2YgbGlua2FibGUgY2F0YWxvZ3MuICBOb3RlOiAtIElmIHNldCB0b1xuICogYHRydWVgIGFuZCB0aGUgYWNjZXNzIHRva2VuIGhhcyBhIHByb2plY3Qgc2NvcGUsIHRoZW4gdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSB0aGUgY2F0YWxvZ3NcbiAqIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIGxpbmsgdG8gdGhlIHByb2plY3QgaW4gdGhlIHRva2VuYHMgcHJvamVjdCBzY29wZSBhbmQgSEVSRSBwdWJsaWMgY2F0YWxvZ3MuXG4gKiAtIElmIHNldCB0byBgdHJ1ZWAgYW5kIHRoZSBhY2Nlc3MgdG9rZW4gaGFzIG5vIHNjb3BlLCB0aGVuIHRoZSByZXNwb25zZSB3aWxsIGluY2x1ZGUgYWxsIEhFUkUgcHVibGljIGNhdGFsb2dzIG9ubHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENhdGFsb2dzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9jYXRhbG9nc1wiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ2ZXJib3NlXCIsIHBhcmFtc1tcInZlcmJvc2VcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJxXCIsIHBhcmFtc1tcInFcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJvcmdhbmlzYXRpb25cIiwgcGFyYW1zW1wib3JnYW5pc2F0aW9uXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwib3JnYW5pc2F0aW9uVHlwZVwiLCBwYXJhbXNbXCJvcmdhbmlzYXRpb25UeXBlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGF5ZXJUeXBlXCIsIHBhcmFtc1tcImxheWVyVHlwZVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlZ2lvblwiLCBwYXJhbXNbXCJyZWdpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzY2hlbWFIcm5cIiwgcGFyYW1zW1wic2NoZW1hSHJuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVzb3VyY2VUeXBlXCIsIHBhcmFtc1tcInJlc291cmNlVHlwZVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdmVyYWdlXCIsIHBhcmFtc1tcImNvdmVyYWdlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWNjZXNzXCIsIHBhcmFtc1tcImFjY2Vzc1wiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm1hcmtldHBsYWNlUmVhZHlcIiwgcGFyYW1zW1wibWFya2V0cGxhY2VSZWFkeVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic29ydEJ5XCIsIHBhcmFtc1tcInNvcnRCeVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNvcnRPcmRlclwiLCBwYXJhbXNbXCJzb3J0T3JkZXJcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW5rYWJsZVwiLCBwYXJhbXNbXCJsaW5rYWJsZVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTW9kaWZ5IHNvbWUgZmllbGRzIG9mIHRoZSBjYXRhbG9nLiBUaGUgZXhpc3RpbmcgSFRUUCBQVVQgbWV0aG9kIG9ubHkgYWxsb3dzIGEgY29tcGxldGUgcmVwbGFjZW1lbnQgb2YgYSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24sXG4gKiBIVFRQIFBBVENIIG1ldGhvZCBpcyB1c2VkIHRvIG1vZGlmeSBzb21lIGZpZWxkcyBvZiBleGlzdGluZyBjYXRhbG9nIGNvbmZpZ3VyYXRpb24uIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLlxuICogU3BlY2lmeSBmaWVsZCB2YWx1ZSB0byBtb2RpZnkgaXQsIG5vdCBzcGVjaWZpZWQgZmllbGRzIGFyZSBpZ25vcmVkLiBUbyByZW1vdmUgdGhlIGZpZWxkIHZhbHVlIHVzZSB0aGUgbnVsbCB2YWx1ZS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgUkZDIDczOTYgLSBKU09OIE1lcmdlIFBhdGNoLlxuICpcbiAqIEBzdW1tYXJ5IE1vZGlmeSBhIGNhdGFsb2dcbiAqIEBwYXJhbSBib2R5IEEgY2F0YWxvZyBvYmplY3QgdGhhdCBjb250YWlucyBtb2RpZmljYXRpb24gb2YgY2F0YWxvZyBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBhdGNoQ2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIE1vZGlmeSBzb21lIGZpZWxkcyBvZiB0aGUgY2F0YWxvZyBsYXllci4gSFRUUCBQQVRDSCBtZXRob2QgaXMgdXNlZCB0byBtb2RpZnkgc29tZSBmaWVsZHMgb2YgZXhpc3RpbmcgbGF5ZXIgY29uZmlndXJhdGlvbi5cbiAqIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTcGVjaWZ5IGZpZWxkIHZhbHVlIHRvIG1vZGlmeSBpdCwgbm90IHNwZWNpZmllZCBmaWVsZHMgYXJlIGlnbm9yZWQuIFRvIHJlbW92ZSB0aGUgZmllbGQgdmFsdWUgdXNlIHRoZSBudWxsXG4gKiB2YWx1ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIFJGQyA3Mzk2IC0gSlNPTiBNZXJnZSBQYXRjaC5cbiAqXG4gKiBAc3VtbWFyeSBNb2RpZnkgYSBjYXRhbG9nIGxheWVyXG4gKiBAcGFyYW0gYm9keSBBIGxheWVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIG1vZGlmaWNhdGlvbiBvZiBsYXllciBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgbGF5ZXIgSURcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGF0Y2hMYXllcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59L2xheWVycy97bGF5ZXJJZH1cIlxuICAgICAgICAucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogVXBkYXRlcyBhbnkgZGVzY3JpcHRpdmUgYW5kIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gaW4gdGhlIGNhdGFsb2cuIFRvIHVwZGF0ZSBhIGNhdGFsb2csIHNlbmQgYSBuZXcgdmVyc2lvbiBvZiB5b3VyIGNhdGFsb2dcbiAqIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgdXBkYXRlZCBkYXRhIGFuZCBhbnkgcmVxdWlyZWQgZmllbGRzLlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZXMgYSBjYXRhbG9nXG4gKiBAcGFyYW0gYm9keSBBIGNhdGFsb2cgb2JqZWN0IHRoYXQgY29udGFpbnMgbWV0YWRhdGEgYW5kIGxheWVyIGRlZmluaXRpb25zLlxuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZ1xuICogQHBhcmFtIGJpbGxpbmdUYWcgVGhlIGBiaWxsaW5nVGFnYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXREYXRhQ292ZXJhZ2VBZG1pbkFyZWFzID0gZ2V0RGF0YUNvdmVyYWdlQWRtaW5BcmVhcztcbmV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlU2l6ZU1hcCA9IGdldERhdGFDb3ZlcmFnZVNpemVNYXA7XG5leHBvcnRzLmdldERhdGFDb3ZlcmFnZVN1bW1hcnkgPSBnZXREYXRhQ292ZXJhZ2VTdW1tYXJ5O1xuZXhwb3J0cy5nZXREYXRhQ292ZXJhZ2VUaWxlID0gZ2V0RGF0YUNvdmVyYWdlVGlsZTtcbmV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlVGltZU1hcCA9IGdldERhdGFDb3ZlcmFnZVRpbWVNYXA7XG4vKipcbiAqIFN0YXRpc3RpY3MgQVBJXG4gKiBBUEkgdG8gcmV0cmlldmUgc3RhdGlzdGljcyBmb3IgdGhlIGRhdGEgY292ZXJhZ2Ugb2YgdGhlIEhFUkUgcGxhdGZvcm0gY2F0YWxvZ3MuXG4gKiAgSXQgc2hvd3Mgd2hlcmUgZGF0YSBleGlzdHMsIGZyZXNobmVzcyBvZiB0aGUgZGF0YSBhbmQgb3RoZXIgc3RhdGlzdGljc1xuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAyLjAuMFxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRGF0YUNvdmVyYWdlQ29yZUFQSXNBcGlcbiAqL1xuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIEFkbWluIEFyZWFzIHNob3dpbmcgRGF0YUNvdmVyYWdlIGluIHdvcmxkIGZvciBwcm92aWRlZCBsYXllciBJZCBhbmQgdmVyc2lvblxuICogQHBhcmFtIGxheWVySWQgVW5pcXVlIExheWVyIElkZW50aWZpZXJcbiAqIEBwYXJhbSBkYXRhbGV2ZWwgVGlsZSBsZXZlbC4gQ3VycmVudGx5LCBzaG91bGQgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGxldmVsIDExXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldERhdGFDb3ZlcmFnZUFkbWluQXJlYXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vYWRtaW5hcmVhc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZGF0YWxldmVsXCIsIHBhcmFtc1tcImRhdGFsZXZlbFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICpcbiAqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZSBTaXplTWFwIGRhdGEgc2hvd2luZyBEYXRhQ292ZXJhZ2UgaW4gd29ybGQgZm9yIHByb3ZpZGVkXG4gKiBsYXllciBpZCBhbmQgdmVyc2lvbi4gQVBJIHNob3dzIGhlYXRtYXAgYmFzZWQgb24gdGhlIHBhcnRpdGlvbiBzaXplXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgTGF5ZXIgSWRlbnRpZmllclxuICogQHBhcmFtIGRhdGFsZXZlbCBUaWxlIGxldmVsLiBDdXJyZW50bHksIHNob3VsZCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gbGV2ZWwgMTFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RGF0YUNvdmVyYWdlU2l6ZU1hcChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9oZWF0bWFwL3NpemVcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImRhdGFsZXZlbFwiLCBwYXJhbXNbXCJkYXRhbGV2ZWxcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIExheWVyIHNpemUgZGF0YSBmb3IgcHJvdmlkZWQgbGF5ZXIgaWQgYW5kIHZlcnNpb25cbiAqIEBwYXJhbSBsYXllcklkIFVuaXF1ZSBMYXllciBJZGVudGlmaWVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldERhdGFDb3ZlcmFnZVN1bW1hcnkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc3VtbWFyeVwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIEJpdE1hcCBzaG93aW5nIERhdGFDb3ZlcmFnZSBpbiB3b3JsZCBmb3IgcHJvdmlkZWQgbGF5ZXIgaWQgYW5kIHZlcnNpb24uXG4gKiBBUEkgc2hvd3MgZGF0YSBjb3ZlcmFnZSBieSBwYXJ0aXRpb25zLCBzbyB0aGUgdXNlciBjYW4gc2VlIHdoZXJlIG9uIHRoZSB3b3JsZCBtYXAgdGhlcmUgaXMgYSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIGNhdGFsb2cgbGF5ZXJcbiAqIEBwYXJhbSBsYXllcklkIFVuaXF1ZSBMYXllciBJZGVudGlmaWVyXG4gKiBAcGFyYW0gZGF0YWxldmVsIFRpbGUgbGV2ZWwuIEN1cnJlbnRseSwgc2hvdWxkIGJlIGVxdWFsIG9yIGxlc3MgdGhhbiBsZXZlbCAxMVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXREYXRhQ292ZXJhZ2VUaWxlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3RpbGVtYXBcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImRhdGFsZXZlbFwiLCBwYXJhbXNbXCJkYXRhbGV2ZWxcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIFRpbWVNYXAgc2hvd2luZyBEYXRhQ292ZXJhZ2UgaW4gd29ybGQgZm9yIHByb3ZpZGVkIGxheWVyIGlkIGFuZCB2ZXJzaW9uXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgTGF5ZXIgSWRlbnRpZmllclxuICogQHBhcmFtIGRhdGFsZXZlbCBUaWxlIGxldmVsLiBDdXJyZW50bHksIHNob3VsZCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gbGV2ZWwgMTFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RGF0YUNvdmVyYWdlVGltZU1hcChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9oZWF0bWFwL2FnZVwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZGF0YWxldmVsXCIsIHBhcmFtc1tcImRhdGFsZXZlbFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNhdGFsb2dIUk5cIiwgcGFyYW1zW1wiY2F0YWxvZ0hSTlwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaW5zZXJ0SW5kZXhlcyA9IGluc2VydEluZGV4ZXM7XG5leHBvcnRzLnBlcmZvcm1RdWVyeSA9IHBlcmZvcm1RdWVyeTtcbmV4cG9ydHMucGVyZm9ybVVwZGF0ZSA9IHBlcmZvcm1VcGRhdGU7XG4vKipcbiAqIEluZGV4IEFQSSB2MVxuICogVXNlIHRoZSBgaW5kZXhgIHNlcnZpY2UgdG8gZ2V0IHRoZSBkYXRhIGhhbmRsZXMgb2YgdGhlIHBhcnRpdGlvbnMgdGhhdCBtYXRjaCBhIHF1ZXJ5LlxuICogVGhlbiwgdXNlIHRoZSBkYXRhIGhhbmRsZXMgd2l0aCB0aGUgYGJsb2JgIHNlcnZpY2UgdG8gZ2V0IHRoZSBkYXRhIGZyb20gdGhlIHBhcnRpdGlvbnMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbixcbiAqIHNlZSBbR2V0IERhdGEgZnJvbSBhbiBJbmRleCBMYXllcl0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLXN0b3JlL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLWluZGV4Lmh0bWwpLlxuICogWW91IGNhbiBhbHNvIHVzZSB0aGUgYGluZGV4YCBzZXJ2aWNlIHRvIHB1Ymxpc2ggZGF0YSB0byBhbiBpbmRleCBsYXllci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1B1Ymxpc2ggdG8gYW4gSW5kZXggTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1zdG9yZS9kYXRhX2Rldl9ndWlkZS9yZXN0L3B1Ymxpc2hpbmctZGF0YS1pbmRleC5odG1sKS5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluZGV4QXBpXG4gKi9cbi8qKlxuICogQWRkcyBpbmRleCBkYXRhIGZvciBhIGdpdmVuIGRhdGEgYmxvYiB0byBhbiBpbmRleCBsYXllci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1B1Ymxpc2ggdG8gYW4gSW5kZXggTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1zdG9yZS9kYXRhX2Rldl9ndWlkZS9yZXN0L3B1Ymxpc2hpbmctZGF0YS1pbmRleC5odG1sKS5cbiAqXG4gKiBAc3VtbWFyeSBJbnNlcnRzIGluZGV4IGRhdGEgdG8gYW4gaW5kZXggbGF5ZXJcbiAqIEBwYXJhbSBpbmRleGVzIEFuIGFycmF5IG9mIGluZGV4IGF0dHJpYnV0ZXMgYW5kIHZhbHVlcyB0byBiZSBpbnNlcnRlZC5cbiAqIEBwYXJhbSBsYXllcklEIFRoZSBsYXllciBJRCBvZiB0aGUgaW5kZXggbGF5ZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluc2VydEluZGV4ZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJRH1cIi5yZXBsYWNlKFwie2xheWVySUR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklEXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiaW5kZXhlc1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImluZGV4ZXNcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUXVlcmllcyB0aGUgaW5kZXggbGF5ZXIgZm9yIHRoZSBwYXJ0aXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5LlxuICogUmV0dXJucyBlYWNoIHBhcnRpdGlvbiB0aGF0IG1hdGNoZXMgdGhlIHF1ZXJ5LCBpbmNsdWRpbmcgZWFjaCBwYXJ0aXRpb24ncyBkYXRhIGhhbmRsZSxcbiAqIHdoaWNoIHlvdSB1c2Ugd2l0aCB0aGUgYGJsb2JgIEFQSSB0byByZXRyaWV2ZSBkYXRhIGZvciBlYWNoIHBhcnRpdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBwYXJ0aXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5XG4gKiBAcGFyYW0gbGF5ZXJJRCBUaGUgSUQgb2YgdGhlIGluZGV4IGxheWVyIHlvdSB3YW50IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHF1ZXJ5IEFuIFJTUUwgcXVlcnkgdG8gdXNlIHRvIHJldHJpZXZlIHBhcnRpdGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4gKiBbR2V0IERhdGEgZnJvbSBhbiBJbmRleCBMYXllcl0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLXN0b3JlL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLWluZGV4Lmh0bWwpLlxuICogVGhlIHF1ZXJ5IG11c3QgdXNlIHRoZSBpbmRleGluZyBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhlIGluZGV4IGxheWVyLlxuICogQHBhcmFtIGh1Z2UgU2V0IHRvIHRydWUgZm9yIGh1Z2UgcXVlcnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1RdWVyeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklEfVwiLnJlcGxhY2UoXCJ7bGF5ZXJJRH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySURcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiaHVnZVwiLCBwYXJhbXNbXCJodWdlXCJdID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJxdWVyeVwiLCBwYXJhbXNbXCJxdWVyeVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTW9kaWZpZXMgcGFydGl0aW9ucyBpbiBhbiBpbmRleCBsYXllci5cbiAqXG4gKiBAc3VtbWFyeSBVcGRhdGVzIGluZGV4IGxheWVyIHBhcnRpdGlvbnNcbiAqIEBwYXJhbSBsYXllcklEIFRoZSBsYXllciBJRCBvZiB0aGUgaW5kZXggbGF5ZXIuXG4gKiBAcGFyYW0gcmVxdWVzdCBDb250YWlucyB0aGUgZGF0YSB5b3Ugd2FudCB0byBhZGQgb3IgcmVtb3ZlIGZyb20gdGhlIGluZGV4IGxheWVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1VcGRhdGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJRH1cIi5yZXBsYWNlKFwie2xheWVySUR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklEXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJyZXF1ZXN0XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wicmVxdWVzdFwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIxIEhFUkUgRXVyb3BlIEIuVi4gYW5kIGl0cyBhZmZpbGlhdGUocykuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBjb250YWluIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uXG4gKiBjb250cm9sbGVkIGJ5IEhFUkUgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGVnaXNsYXRpb24uXG4gKiBBbnkgdXNlIGFuZCB1dGlsaXphdGlvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgYW5kXG4gKiBkaXNjbG9zdXJlIHRvIGFueSB0aGlyZCBwYXJ0aWVzIGlzIGNvbmRpdGlvbmFsIHVwb24gaGF2aW5nIGEgc2VwYXJhdGVcbiAqIGFncmVlbWVudCB3aXRoIEhFUkUgZm9yIHRoZSBhY2Nlc3MsIHVzZSwgdXRpbGl6YXRpb24gb3IgZGlzY2xvc3VyZSBvZiB0aGlzXG4gKiBzb2Z0d2FyZS4gSW4gdGhlIGFic2VuY2Ugb2Ygc3VjaCBhZ3JlZW1lbnQsIHRoZSB1c2Ugb2YgdGhlIHNvZnR3YXJlIGlzIG5vdFxuICogYWxsb3dlZC5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRBcGlWZXJzaW9uID0gZ2V0QXBpVmVyc2lvbjtcbmV4cG9ydHMuZ2V0SGVhbHRoID0gZ2V0SGVhbHRoO1xuZXhwb3J0cy5nZXRGZWF0dXJlID0gZ2V0RmVhdHVyZTtcbmV4cG9ydHMuZ2V0RmVhdHVyZXMgPSBnZXRGZWF0dXJlcztcbmV4cG9ydHMuZ2V0RmVhdHVyZXNCeUJCb3ggPSBnZXRGZWF0dXJlc0J5QkJveDtcbmV4cG9ydHMuZ2V0RmVhdHVyZXNCeVNwYXRpYWwgPSBnZXRGZWF0dXJlc0J5U3BhdGlhbDtcbmV4cG9ydHMuZ2V0RmVhdHVyZXNCeVNwYXRpYWxQb3N0ID0gZ2V0RmVhdHVyZXNCeVNwYXRpYWxQb3N0O1xuZXhwb3J0cy5nZXRGZWF0dXJlc0J5VGlsZSA9IGdldEZlYXR1cmVzQnlUaWxlO1xuZXhwb3J0cy5nZXRTdGF0aXN0aWNzID0gZ2V0U3RhdGlzdGljcztcbmV4cG9ydHMuaXRlcmF0ZUZlYXR1cmVzID0gaXRlcmF0ZUZlYXR1cmVzO1xuZXhwb3J0cy5zZWFyY2hGZWF0dXJlcyA9IHNlYXJjaEZlYXR1cmVzO1xuZXhwb3J0cy5kZWxldGVGZWF0dXJlID0gZGVsZXRlRmVhdHVyZTtcbmV4cG9ydHMuZGVsZXRlRmVhdHVyZXMgPSBkZWxldGVGZWF0dXJlcztcbmV4cG9ydHMucGF0Y2hGZWF0dXJlID0gcGF0Y2hGZWF0dXJlO1xuZXhwb3J0cy5wb3N0RmVhdHVyZXMgPSBwb3N0RmVhdHVyZXM7XG5leHBvcnRzLnB1dEZlYXR1cmUgPSBwdXRGZWF0dXJlO1xuZXhwb3J0cy5wdXRGZWF0dXJlcyA9IHB1dEZlYXR1cmVzO1xuLyoqXG4gKiBJbnRlcmFjdGl2ZSBBUEkgdjFcbiAqIEludGVyYWN0aXZlIEFQSSB2MSBpcyBhIFJFU1QgQVBJIGZvciBzaW1wbGUgYWNjZXNzIHRvIGdlbyBkYXRhLlxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjAuMFxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZTphcnJheS10eXBlXG4vLyB0c2xpbnQ6ZGlzYWJsZTogdW5pZmllZC1zaWduYXR1cmVzXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKipcbiAqIFJldHJpZXZlcyBBUEkgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGlWZXJzaW9uKGJ1aWxkZXIpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvdmVyc2lvblwiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFRlc3RzIGJhc2ljIGhlYWx0aCBvZiB0aGUgc2VydmljZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0SGVhbHRoKGJ1aWxkZXIpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvaGVhbHRoXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmZWF0dXJlIHdpdGggdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgZmVhdHVyZSBieSBJRC5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIGZlYXR1cmUgaW4gdGhlIGxheWVyLlxuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb24gQSBsaXN0IG9mIHByb3BlcnRpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZlYXR1cmVzIHJlc3VsdCBsaXN0LlxuICogTXVsdGlwbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGNvbW1hKCwpLlxuICogRXhhbXBsZTogYD9zZWxlY3Rpb249cC5uYW1lLHAuY2FwYWNpdHkscC5jb2xvcmAuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIGB0cnVlYCB0aGUgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlIHdpbGwgaGF2ZSBvbmx5IFgncyBhbmQgWSdzIGFzIGNvb3JkaW5hdGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGZWF0dXJlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzL3tmZWF0dXJlSWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntmZWF0dXJlSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmZWF0dXJlSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2VsZWN0aW9uXCIsIHBhcmFtc1tcInNlbGVjdGlvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0dXJucyBhbGwgb2YgdGhlIGZlYXR1cmVzIGZvdW5kIGZvciB0aGUgcHJvdmlkZWQgbGlzdCBvZiBpZHMuXG4gKiBUaGUgcmVzcG9uc2UgaXMgYWx3YXlzIGEgRmVhdHVyZUNvbGxlY3Rpb24sIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGZlYXR1cmVzIHdpdGggdGhlIHByb3ZpZGVkIGlkcy5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZmVhdHVyZXMgYnkgSUQuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGlkIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdW5pcXVlIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gKiBUaGVzZSBhcmUgdGhlIGFjY2VwdGFibGUgZm9ybWF0cyBmb3IgdGhpcyBmaWVsZDpcbiAqIGBgYFxuICogaWQ9dmFsdWUxLHZhbHVlMlxuICogYGBgXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvbiBBIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmVhdHVyZXMgcmVzdWx0IGxpc3QuXG4gKiBNdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgY29tbWEoLCkuXG4gKiBFeGFtcGxlOiBgP3NlbGVjdGlvbj1wLm5hbWUscC5jYXBhY2l0eSxwLmNvbG9yYC5cbiAqXG4gKiBAcGFyYW0gZm9yY2UyRCBJZiBzZXQgdG8gYHRydWVgIHRoZSBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBoYXZlIG9ubHkgWCdzIGFuZCBZJ3MgYXMgY29vcmRpbmF0ZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZlYXR1cmVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJpZFwiLCBwYXJhbXNbXCJpZFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHVybiB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlIGluc2lkZSBhIGJvdW5kaW5nIGJveCBzdGlwdWxhdGVkIGJ5IGJib3ggcGFyYW1ldGVyLlxuICpcbiAqIEBzdW1tYXJ5IEdldCBmZWF0dXJlcyBieSBib3VuZGluZyBib3guXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGJib3ggQm90aCB3ZXN0LCBzb3V0aCwgZWFzdCBhbmQgbm9ydGggY29vcmRpbmF0ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hLlxuICogRXhhbXBsZTogYGJib3g9MTMuMDgyLDUyLjQxNiwxMy42MjgsNTIuNjI2YCAtIEJvdW5kaW5nIGJveCBvZiBCZXJsaW4uXG4gKlxuICogQHBhcmFtIGNsaXAgSWYgc2V0IHRvIHRydWUgdGhlIGZlYXR1cmVzJyBnZW9tZXRyaWVzIGFyZSBjbGlwcGVkIHRvIHRoZSBnZW9tZXRyeSBvZiB0aGVcbiAqIHRpbGUgb3IgYm91bmRpbmcgYm94LiBEZWZhdWx0IGlzIGZhbHNlLlxuICpcbiAqIEBwYXJhbSBsaW1pdCBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlLiBEZWZhdWx0IGlzIDMwMDAwLiBIYXJkIGxpbWl0IGlzIDEwMDAwMC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIEFkZGl0aW9uYWwgZmVhdHVyZSBmaWx0ZXJzIHdoaWNoIGNvbXBhcmVzIHRoZSBmZWF0dXJlJ3MgcHJvcGVydHkncyB2YWx1ZSB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkXG4gKiBpbiB0aGUgcXVlcnksIHJlc3VsdGluZyBpbiBhIHN1YnNldCBvZiBmZWF0dXJlcy5cbiAqIFRoZSB1c2FnZSBvZiBtdWx0aXBsZSBwcm9wZXJ0eSBuYW1lcyByZXByZXNlbnRzIGFuIEFORCBvcGVyYXRpb24uXG4gKiBUaGUgdXNhZ2Ugb2YgYSBjb21tYSAoLCkgc2VwYXJhdGluZyB0aGUgcHJvcGVydGllcyB2YWx1ZXMsIHJlcHJlc2VudHMgYW4gT1Igb3BlcmF0aW9uLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAnZi4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgd2hpY2ggYXJlIGFkZGVkIGJ5IGRlZmF1bHQgaW4gdGhlIHN0b3JlZCBmZWF0dXJlLlxuICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6ICdmLmlkJywgJ2YuY3JlYXRlZEF0JyBhbmQgJ2YudXBkYXRlZEF0Jy5cbiAqIFByb3BlcnRpZXMgaW5pdGlhdGVkIHdpdGggJ3AuJyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIGluIHRoZSBzdG9yZWQgZmVhdHVyZSB3aGljaCBhcmUgdW5kZXIgdGhlICdwcm9wZXJ0aWVzJyBwcm9wZXJ0eS5cbiAqIFVzZSBpdCBhcyBhIHNob3J0aGFuZCBhY2Nlc3NvciBmb3IgJ3Byb3BlcnRpZXMnIHZhbHVlcy5cbiAqIFRoZSBmb3JtYXQgc2hvdWxkIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBiZWxvd1xuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9cHJvcGVydHlfdmFsdWVfMSZmLnNwZWNpYWxfcHJvcGVydHlfbmFtZV8xPXNwZWNpYWxfcHJvcGVydHlfdmFsdWVfMVxuICogYGBgXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBhYm92ZSBxdWVyeSwgdGhlIEZlYXR1cmVzIHdpbGwgYmUgZmlsdGVyZWQgYnkgJ3Byb3BlcnR5JyBBTkQgJ3NwZWNpYWwgcHJvcGVydHknIGVxdWFscyB0byB0aGVpclxuICogcmVzcGVjdGl2ZSB2YWx1ZXMuXG4gKlxuICogV2hpbGUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGBgYD9wLnByb3BlcnR5X25hbWVfMT12YWx1ZV8xLHZhbHVlXzJgYGBcbiAqIFRoZSByZXN1bHRpbmcgRmVhdHVyZXMgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIGVsZW1lbnRzIGhhdmluZyBgdmFsdWVfMWAgT1IgYHZhbHVlXzJgLlxuICpcbiAqIEFkZGl0aW9uYWxseSB0byB0aGUgb3BlcmF0b3JzIHVzZWQgaW4gdGhlIGV4YW1wbGVzIGFib3ZlLCB0aGUgcXVlcnkgY2FuIGJlIHdyaXR0ZW4sIHdpdGggdGhlIHNhbWUgc2VtYW50aWMsXG4gKiBieSB1c2luZyB0aGUgbG9uZyBvcGVyYXRvcnM6IGBcIj1ndGU9XCIsIFwiPWx0ZT1cIiwgXCI9Z3Q9XCIsIFwiPWx0PVwiIGFuZCBcIj1jcz1cImAuXG4gKlxuICogVGhlIGJlbG93IHF1ZXJpZXMgeWllbGQgdGhlIHNhbWUgcmVzdWx0OlxuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE+PTEwXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9Z3RlPTEwXG4gKiBgYGBcbiAqXG4gKiBUaGUgYXZhaWxhYmxlIG9wZXJhdG9ycyBhcmU6XG4gKiBcIj1cIiAtIGVxdWFsc1xuICogXCIhPVwiIC0gbm90IGVxdWFsc1xuICogXCI+PVwiIG9yIFwiPWd0ZT1cIiAtIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHNcbiAqIFwiPD1cIiBvciBcIj1sdGU9XCIgLSBsZXNzIHRoYW4gb3IgZXF1YWxzXG4gKiBcIj5cIiBvciBcIj1ndD1cIiAtIGdyZWF0ZXIgdGhhblxuICogXCI8XCIgb3IgXCI9bHQ9XCIgLSBsZXNzIHRoYW5cbiAqIFwiQD5cIiBvciBcIj1jcz1cIiAtIGNvbnRhaW5zXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvbiBBIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmVhdHVyZXMgcmVzdWx0IGxpc3QuXG4gKiBNdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgY29tbWEoLCkuXG4gKiBFeGFtcGxlOiBgP3NlbGVjdGlvbj1wLm5hbWUscC5jYXBhY2l0eSxwLmNvbG9yYC5cbiAqXG4gKiBAcGFyYW0gc2tpcENhY2hlIElmIHNldCB0byB0cnVlIHRoZSByZXNwb25zZSBpcyBub3QgcmV0dXJuZWQgZnJvbSBjYWNoZS4gRGVmYXVsdCBpcyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gY2x1c3RlcmluZyBUaGUgY2x1c3RlcmluZyBhbGdvcml0aG0gdG8gYXBwbHkgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSByZXN1bHQuXG4gKiBQcm92aWRpbmcgdGhpcyBxdWVyeSBwYXJhbWV0ZXIgdGhlIGRhdGEgd2lsbCBiZSByZXR1cm5lZCBpbiBhIGNsdXN0ZXJlZCB3YXkuXG4gKiBUaGlzIG1lYW5zIHRoZSBkYXRhIHdvbid0IG5lY2Vzc2FyaWx5IGJlIHJldHVybmVkIGluIGl0cyBvcmlnaW5hbCBzaGFwZSBvciB3aXRoIGl0cyBvcmlnaW5hbCBwcm9wZXJ0aWVzLlxuICogRGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gY2x1c3RlcmluZyBhbGdvcml0aG0gdGhlcmUgY291bGQgYmUgZGlmZmVyZW50IG1hbmRhdG9yeSBhbmQvb3Igb3B0aW9uYWwgcGFyYW1ldGVyc1xuICogdG8gc3BlY2lmeSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsZ29yaXRobS5cbiAqIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gKlxuICogYGhleGJpbmAgLSBUaGUgaGV4YmluIGFsZ29yaXRobSBkaXZpZGVzIHRoZSB3b3JsZCBpbiBoZXhhZ29uYWwgXCJiaW5zXCIgb24gYSBzcGVjaWZpZWQgcmVzb2x1dGlvbi5cbiAqIEVhY2ggaGV4YWdvbiBoYXMgYW4gYWRkcmVzcyBiZWluZyBkZXNjcmliZWQgYnkgdGhlIEgzIGFkZHJlc3Npbmcgc2NoZW1lLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhhdCB0b3BpYyBzZWU6IGh0dHBzOi8vZW5nLnViZXIuY29tL2gzLy5cbiAqXG4gKiBgcXVhZGJpbmAgLSBUaGUgcXVhZGJpbiBhbGdvcml0aG0gdGFrZXMgdGhlIGdlb21ldHJ5IGlucHV0IGZyb20gdGhlIHJlcXVlc3QgKGUuZy4gcXVhZGtleSAvIGJib3guLilcbiAqIGFuZCBjb3VudCB0aGUgZmVhdHVyZXMgaW4gaXQuXG4gKiBUaGlzIGNsdXN0ZXJpbmcgbW9kZSB3b3JrcyBhbHNvIGZvciB2ZXJ5IGxhcmdlIGxheWVycyBhbmQgY2FuIGJlIHVzZWQgZm9yIGdldHRpbmcgYW4gb3ZlcnZpZXdcbiAqIHdoZXJlIGRhdGEgaXMgcHJlc2VudCBpbiBhIGdpdmVuIGxheWVyLiBGdXJ0aGVybW9yZSwgYSBwcm9wZXJ0eSBmaWx0ZXIgb24gb25lIHByb3BlcnR5IGlzIGFwcGxpY2FibGUuXG4gKlxuICogQHBhcmFtIGNsdXN0ZXJpbmdQYXJhbXMgU29tZSBwYXJhbWV0ZXJzIGZvciB0aGUgY2hvc2VuIGNsdXN0ZXJpbmcgYWxnb3JpdGhtLlxuICogRGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gY2x1c3RlcmluZyBhbGdvcml0aG0gdGhlcmUgY291bGQgYmUgZGlmZmVyZW50IG1hbmRhdG9yeSBhbmQvb3Igb3B0aW9uYWwgcGFyYW1ldGVycyB0byBzcGVjaWZ5XG4gKiB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsZ29yaXRobS5cbiAqXG4gKiBDbHVzdGVyaW5nLVBhcmFtZXRlciByZWZlcmVuY2UuXG4gKiBOT1RFOiBUaGUgYWN0dWFsIHF1ZXJ5IHBhcmFtZXRlcnMgaW4gdGhlIFVSTCBhcmUgbG9va2luZyBsaWtlOiBgP2NsdXN0ZXJpbmcuYVBhcmFtZXRlck5hbWU9YVZhbHVlYC5cbiAqXG4gKiBDbHVzdGVyaW5nLXR5cGU6IFwiaGV4YmluXCI6XG4gKiBUaGVyZSBhcmUgc2V2ZXJhbCBwYXJhbWV0ZXJzIG5lZWRlZCBieSB0aGUgSDMgYmFzZWQgaGV4YmluIGFsZ29yaXRobS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoYXQgdG9waWMgc2VlOiBodHRwczovL2VuZy51YmVyLmNvbS9oMy8uXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogfCAgICAgIFBhcmFtZXRlciAgICAgICB8ICAgVHlwZSAgIHwgICBNYW5kYXRvcnkgICB8ICAgICAgICAgICAgICAgICAgICAgIE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiB8ICBhYnNvbHV0ZVJlc29sdXRpb24gIHwgIE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgVGhlIEgzIGhleGFnb24gcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgICAgIHJlc29sdXRpb25cdCAgICAgIHwgIE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgZGVwcmVjYXRlZCwgcmVuYW1lZCB0byBhYnNvbHV0ZVJlc29sdXRpb24gICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgcmVsYXRpdmVSZXNvbHV0aW9uICAgfFx0IE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgaW50ZWdlciB2YWx1ZSBbMC00XSB0byBiZSBhZGRlZCB0byBjdXJyZW50IHVzZWQgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICB8IHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB8ICAgICAgIHByb3BlcnR5XHQgICAgICB8ICBTdHJpbmcgIHwgICAgICAgTk9cdCAgICAgfCBBIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBmZWF0dXJlcyBmb3Igd2hpY2ggdG8gICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgY2FsY3VsYXRlIHN0YXRpc3RpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgICAgICAgcG9pbnRtb2RlXHQgIHwgIEJvb2xlYW4gfCAgICAgICBOT1x0ICAgICB8IHJldHVucyB0aGUgY2VudHJvaWQgb2YgaGV4YWdvbnMgYXMgZ2VvanNvbiBmZWF0dXJlIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICpcbiAqIEBwYXJhbSBmb3JjZTJEIElmIHNldCB0byBgdHJ1ZWAgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RmVhdHVyZXNCeUJCb3goYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vYmJveFwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmJveFwiLCBwYXJhbXNbXCJiYm94XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2xpcFwiLCBwYXJhbXNbXCJjbGlwXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHBhcmFtcy5wYXJhbXM7XG4gICAgaWYgKHNlYXJjaFBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHNlYXJjaFBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkocGFyYW0ua2V5LCBwYXJhbS52YWx1ZSwgcGFyYW0ub3BlcmF0b3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJza2lwQ2FjaGVcIiwgcGFyYW1zW1wic2tpcENhY2hlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2x1c3RlcmluZ1wiLCBwYXJhbXNbXCJjbHVzdGVyaW5nXCJdKTtcbiAgICBpZiAocGFyYW1zW1wiY2x1c3RlcmluZ1BhcmFtc1wiXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNsdXN0ZXJpbmdQYXJhbSBpbiBwYXJhbXNbXCJjbHVzdGVyaW5nUGFyYW1zXCJdKSB7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KGBjbHVzdGVyaW5nLiR7Y2x1c3RlcmluZ1BhcmFtfWAsIHBhcmFtc1tcImNsdXN0ZXJpbmdQYXJhbXNcIl1bY2x1c3RlcmluZ1BhcmFtXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTGlzdCB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlIGluc2lkZSB0aGUgc3BlY2lmaWVkIHJhZGl1cy4gVGhlIG9yaWdpbiByYWRpdXMgcG9pbnQgaXMgY2FsY3VsYXRlZFxuICogYmFzZWQgZWl0aGVyIG9uIGxhdGl0dWRlICYgbG9uZ2l0dWRlIG9yIGJ5IHNwZWNpZnlpbmcgYSBmZWF0dXJlJ3MgZ2VvbWV0cnkuXG4gKlxuICogQHN1bW1hcnkgR2V0IGZlYXR1cmVzIHdpdGggcmFkaXVzIHNlYXJjaC5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gbGF0IFRoZSBsYXRpdHVkZSBpbiBXR1MnODQgZGVjaW1hbCBkZWdyZWUgKC05MCB0byArOTApIG9mIHRoZSBjZW50ZXIgUG9pbnQuXG4gKlxuICogQHBhcmFtIGxuZyBUaGUgbG9uZ2l0dWRlIGluIFdHUyc4NCBkZWNpbWFsIGRlZ3JlZSAoLTE4MCB0byArMTgwKSBvZiB0aGUgY2VudGVyIFBvaW50LlxuICpcbiAqIEBwYXJhbSByZWZDYXRhbG9nSHJuIFRoZSBjYXRhbG9nIEhSTiB3aGVyZSB0aGUgbGF5ZXIgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlIGlzIHN0b3JlZC5cbiAqIEFsd2F5cyB0byB1c2UgaW4gY29tYmluYXRpb24gd2l0aCByZWZGZWF0dXJlSWQuXG4gKlxuICogQHBhcmFtIHJlZkxheWVySWQgQXMgYWx0ZXJuYXRpdmUgZm9yIGRlZmluaW5nIGNlbnRlciBjb29yZGluYXRlcyxcbiAqIGl0IGlzIHBvc3NpYmxlIHRvIHJlZmVyZW5jZSBhIGdlb21ldHJ5IGluIGEgbGF5ZXIuXG4gKiBUaGVyZWZvcmUgaXQgaXMgbmVlZGVkIHRvIHByb3ZpZGUgdGhlIGxheWVyIGlkIHdoZXJlIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUgaXMgc3RvcmVkLlxuICogQWx3YXlzIHRvIHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIHJlZkZlYXR1cmVJZC5cbiAqXG4gKiBAcGFyYW0gcmVmRmVhdHVyZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIGZlYXR1cmUgaW4gdGhlIHJlZmVyZW5jZWQgbGF5ZXIuXG4gKiBUaGUgZ2VvbWV0cnkgb2YgdGhhdCBmZWF0dXJlIGdldHMgdXNlZCBmb3IgdGhlIHNwYXRpYWwgcXVlcnkuXG4gKiBBbHdheXMgdG8gdXNlIGluIGNvbWJpbmF0aW9uIHdpdGggcmVmQ2F0YWxvZ0hybiBhbmQgcmVmTGF5ZXJJZC5cbiAqXG4gKiBAcGFyYW0gcmFkaXVzIFJhZGl1cyBpbiBtZXRlciB3aGljaCBkZWZpbmVzIHRoZSBkaWFtZXRlciBvZiB0aGUgc2VhcmNoIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGxpbWl0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2UuIERlZmF1bHQgaXMgMzAwMDAuIEhhcmQgbGltaXQgaXMgMTAwMDAwLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgQWRkaXRpb25hbCBmZWF0dXJlIGZpbHRlcnMgd2hpY2ggY29tcGFyZXMgdGhlIGZlYXR1cmUncyBwcm9wZXJ0eSdzIHZhbHVlIHdpdGggdGhlIG9uZSBzcGVjaWZpZWRcbiAqIGluIHRoZSBxdWVyeSwgcmVzdWx0aW5nIGluIGEgc3Vic2V0IG9mIGZlYXR1cmVzLlxuICogVGhlIHVzYWdlIG9mIG11bHRpcGxlIHByb3BlcnR5IG5hbWVzIHJlcHJlc2VudHMgYW4gQU5EIG9wZXJhdGlvbi5cbiAqIFRoZSB1c2FnZSBvZiBhIGNvbW1hICgsKSBzZXBhcmF0aW5nIHRoZSBwcm9wZXJ0aWVzIHZhbHVlcywgcmVwcmVzZW50cyBhbiBPUiBvcGVyYXRpb24uXG4gKiBQcm9wZXJ0aWVzIGluaXRpYXRlZCB3aXRoICdmLicgYXJlIHVzZWQgdG8gYWNjZXNzIHZhbHVlcyB3aGljaCBhcmUgYWRkZWQgYnkgZGVmYXVsdCBpbiB0aGUgc3RvcmVkIGZlYXR1cmUuXG4gKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTogJ2YuaWQnLCAnZi5jcmVhdGVkQXQnIGFuZCAnZi51cGRhdGVkQXQnLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAncC4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgaW4gdGhlIHN0b3JlZCBmZWF0dXJlIHdoaWNoIGFyZSB1bmRlciB0aGUgJ3Byb3BlcnRpZXMnIHByb3BlcnR5LlxuICogVXNlIGl0IGFzIGEgc2hvcnRoYW5kIGFjY2Vzc29yIGZvciAncHJvcGVydGllcycgdmFsdWVzLlxuICogVGhlIGZvcm1hdCBzaG91bGQgZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uIGJlbG93XG4gKiBgYGBcbiAqID9wLnByb3BlcnR5X25hbWVfMT1wcm9wZXJ0eV92YWx1ZV8xJmYuc3BlY2lhbF9wcm9wZXJ0eV9uYW1lXzE9c3BlY2lhbF9wcm9wZXJ0eV92YWx1ZV8xXG4gKiBgYGBcbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGFib3ZlIHF1ZXJ5LCB0aGUgRmVhdHVyZXMgd2lsbCBiZSBmaWx0ZXJlZCBieSAncHJvcGVydHknIEFORCAnc3BlY2lhbCBwcm9wZXJ0eScgZXF1YWxzIHRvIHRoZWlyXG4gKiByZXNwZWN0aXZlIHZhbHVlcy5cbiAqXG4gKiBXaGlsZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYGBgP3AucHJvcGVydHlfbmFtZV8xPXZhbHVlXzEsdmFsdWVfMmBgYFxuICogVGhlIHJlc3VsdGluZyBGZWF0dXJlcyBsaXN0IHdpbGwgY29udGFpbiBhbGwgZWxlbWVudHMgaGF2aW5nIGB2YWx1ZV8xYCBPUiBgdmFsdWVfMmAuXG4gKlxuICogQWRkaXRpb25hbGx5IHRvIHRoZSBvcGVyYXRvcnMgdXNlZCBpbiB0aGUgZXhhbXBsZXMgYWJvdmUsIHRoZSBxdWVyeSBjYW4gYmUgd3JpdHRlbiwgd2l0aCB0aGUgc2FtZSBzZW1hbnRpYyxcbiAqIGJ5IHVzaW5nIHRoZSBsb25nIG9wZXJhdG9yczogYFwiPWd0ZT1cIiwgXCI9bHRlPVwiLCBcIj1ndD1cIiwgXCI9bHQ9XCIgYW5kIFwiPWNzPVwiYC5cbiAqXG4gKiBUaGUgYmVsb3cgcXVlcmllcyB5aWVsZCB0aGUgc2FtZSByZXN1bHQ6XG4gKiBgYGBcbiAqID9wLnByb3BlcnR5X25hbWVfMT49MTBcbiAqID9wLnByb3BlcnR5X25hbWVfMT1ndGU9MTBcbiAqIGBgYFxuICpcbiAqIFRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGFyZTpcbiAqIFwiPVwiIC0gZXF1YWxzXG4gKiBcIiE9XCIgLSBub3QgZXF1YWxzXG4gKiBcIj49XCIgb3IgXCI9Z3RlPVwiIC0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsc1xuICogXCI8PVwiIG9yIFwiPWx0ZT1cIiAtIGxlc3MgdGhhbiBvciBlcXVhbHNcbiAqIFwiPlwiIG9yIFwiPWd0PVwiIC0gZ3JlYXRlciB0aGFuXG4gKiBcIjxcIiBvciBcIj1sdD1cIiAtIGxlc3MgdGhhblxuICogXCJAPlwiIG9yIFwiPWNzPVwiIC0gY29udGFpbnNcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmZWF0dXJlcyByZXN1bHQgbGlzdC5cbiAqIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBieSB1c2luZyBjb21tYSgsKS5cbiAqIEV4YW1wbGU6IGA/c2VsZWN0aW9uPXAubmFtZSxwLmNhcGFjaXR5LHAuY29sb3JgLlxuICpcbiAqIEBwYXJhbSBza2lwQ2FjaGUgSWYgc2V0IHRvIHRydWUgdGhlIHJlc3BvbnNlIGlzIG5vdCByZXR1cm5lZCBmcm9tIGNhY2hlLiBEZWZhdWx0IGlzIGZhbHNlLlxuICpcbiAqIEBwYXJhbSBmb3JjZTJEIElmIHNldCB0byBgdHJ1ZWAgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RmVhdHVyZXNCeVNwYXRpYWwoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc3BhdGlhbFwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGF0XCIsIHBhcmFtc1tcImxhdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxuZ1wiLCBwYXJhbXNbXCJsbmdcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZDYXRhbG9nSHJuXCIsIHBhcmFtc1tcInJlZkNhdGFsb2dIcm5cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZMYXllcklkXCIsIHBhcmFtc1tcInJlZkxheWVySWRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZGZWF0dXJlSWRcIiwgcGFyYW1zW1wicmVmRmVhdHVyZUlkXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmFkaXVzXCIsIHBhcmFtc1tcInJhZGl1c1wiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBwYXJhbXMucGFyYW1zO1xuICAgIGlmIChzZWFyY2hQYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBzZWFyY2hQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KHBhcmFtLmtleSwgcGFyYW0udmFsdWUsIHBhcmFtLm9wZXJhdG9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzZWxlY3Rpb25cIiwgcGFyYW1zW1wic2VsZWN0aW9uXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2tpcENhY2hlXCIsIHBhcmFtc1tcInNraXBDYWNoZVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTGlzdCB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlIGluc2lkZSB0aGUgc3BlY2lmaWVkIHJhZGl1cy4gVGhlIG9yaWdpbiBwb2ludCBpcyBjYWxjdWxhdGVkIGJhc2VkXG4gKiBvbiB0aGUgZ2VvbWV0cnkgcHJvdmlkZWQgYXMgcGF5bG9hZC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZmVhdHVyZXMgd2hpY2ggaW50ZXJzZWN0cyB0aGUgcHJvdmlkZWQgZ2VvbWV0cnkuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGJvZHkgQSBnZW9tZXRyeSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSByYWRpdXMgUmFkaXVzIGluIG1ldGVyIHdoaWNoIGRlZmluZXMgdGhlIGRpYW1ldGVyIG9mIHRoZSBzZWFyY2ggcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS5cbiAqIERlZmF1bHQgaXMgMzAwMDAuIEhhcmQgbGltaXQgaXMgMTAwMDAwLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgQWRkaXRpb25hbCBmZWF0dXJlIGZpbHRlcnMgd2hpY2ggY29tcGFyZXMgdGhlIGZlYXR1cmUncyBwcm9wZXJ0eSdzIHZhbHVlIHdpdGggdGhlIG9uZSBzcGVjaWZpZWRcbiAqIGluIHRoZSBxdWVyeSwgcmVzdWx0aW5nIGluIGEgc3Vic2V0IG9mIGZlYXR1cmVzLlxuICogVGhlIHVzYWdlIG9mIG11bHRpcGxlIHByb3BlcnR5IG5hbWVzIHJlcHJlc2VudHMgYW4gQU5EIG9wZXJhdGlvbi5cbiAqIFRoZSB1c2FnZSBvZiBhIGNvbW1hICgsKSBzZXBhcmF0aW5nIHRoZSBwcm9wZXJ0aWVzIHZhbHVlcywgcmVwcmVzZW50cyBhbiBPUiBvcGVyYXRpb24uXG4gKiBQcm9wZXJ0aWVzIGluaXRpYXRlZCB3aXRoICdmLicgYXJlIHVzZWQgdG8gYWNjZXNzIHZhbHVlcyB3aGljaCBhcmUgYWRkZWQgYnkgZGVmYXVsdCBpbiB0aGUgc3RvcmVkIGZlYXR1cmUuXG4gKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTogJ2YuaWQnLCAnZi5jcmVhdGVkQXQnIGFuZCAnZi51cGRhdGVkQXQnLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAncC4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgaW4gdGhlIHN0b3JlZCBmZWF0dXJlIHdoaWNoIGFyZSB1bmRlciB0aGUgJ3Byb3BlcnRpZXMnIHByb3BlcnR5LlxuICogVXNlIGl0IGFzIGEgc2hvcnRoYW5kIGFjY2Vzc29yIGZvciAncHJvcGVydGllcycgdmFsdWVzLlxuICogVGhlIGZvcm1hdCBzaG91bGQgZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uIGJlbG93XG4gKiBgYGBcbiAqID9wLnByb3BlcnR5X25hbWVfMT1wcm9wZXJ0eV92YWx1ZV8xJmYuc3BlY2lhbF9wcm9wZXJ0eV9uYW1lXzE9c3BlY2lhbF9wcm9wZXJ0eV92YWx1ZV8xXG4gKiBgYGBcbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGFib3ZlIHF1ZXJ5LCB0aGUgRmVhdHVyZXMgd2lsbCBiZSBmaWx0ZXJlZCBieSAncHJvcGVydHknIEFORCAnc3BlY2lhbCBwcm9wZXJ0eScgZXF1YWxzIHRvIHRoZWlyXG4gKiByZXNwZWN0aXZlIHZhbHVlcy5cbiAqXG4gKiBXaGlsZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYGBgP3AucHJvcGVydHlfbmFtZV8xPXZhbHVlXzEsdmFsdWVfMmBgYFxuICogVGhlIHJlc3VsdGluZyBGZWF0dXJlcyBsaXN0IHdpbGwgY29udGFpbiBhbGwgZWxlbWVudHMgaGF2aW5nIGB2YWx1ZV8xYCBPUiBgdmFsdWVfMmAuXG4gKlxuICogQWRkaXRpb25hbGx5IHRvIHRoZSBvcGVyYXRvcnMgdXNlZCBpbiB0aGUgZXhhbXBsZXMgYWJvdmUsIHRoZSBxdWVyeSBjYW4gYmUgd3JpdHRlbiwgd2l0aCB0aGUgc2FtZSBzZW1hbnRpYyxcbiAqIGJ5IHVzaW5nIHRoZSBsb25nIG9wZXJhdG9yczogYFwiPWd0ZT1cIiwgXCI9bHRlPVwiLCBcIj1ndD1cIiwgXCI9bHQ9XCIgYW5kIFwiPWNzPVwiYC5cbiAqXG4gKiBUaGUgYmVsb3cgcXVlcmllcyB5aWVsZCB0aGUgc2FtZSByZXN1bHQ6XG4gKiBgYGBcbiAqID9wLnByb3BlcnR5X25hbWVfMT49MTBcbiAqID9wLnByb3BlcnR5X25hbWVfMT1ndGU9MTBcbiAqIGBgYFxuICpcbiAqIFRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGFyZTpcbiAqIFwiPVwiIC0gZXF1YWxzXG4gKiBcIiE9XCIgLSBub3QgZXF1YWxzXG4gKiBcIj49XCIgb3IgXCI9Z3RlPVwiIC0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsc1xuICogXCI8PVwiIG9yIFwiPWx0ZT1cIiAtIGxlc3MgdGhhbiBvciBlcXVhbHNcbiAqIFwiPlwiIG9yIFwiPWd0PVwiIC0gZ3JlYXRlciB0aGFuXG4gKiBcIjxcIiBvciBcIj1sdD1cIiAtIGxlc3MgdGhhblxuICogXCJAPlwiIG9yIFwiPWNzPVwiIC0gY29udGFpbnNcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmZWF0dXJlcyByZXN1bHQgbGlzdC5cbiAqIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBieSB1c2luZyBjb21tYSgsKS5cbiAqIEV4YW1wbGU6IGA/c2VsZWN0aW9uPXAubmFtZSxwLmNhcGFjaXR5LHAuY29sb3JgLlxuICpcbiAqIEBwYXJhbSBza2lwQ2FjaGUgSWYgc2V0IHRvIHRydWUgdGhlIHJlc3BvbnNlIGlzIG5vdCByZXR1cm5lZCBmcm9tIGNhY2hlLiBEZWZhdWx0IGlzIGZhbHNlLlxuICpcbiAqIEBwYXJhbSBmb3JjZTJEIElmIHNldCB0byBgdHJ1ZWAgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RmVhdHVyZXNCeVNwYXRpYWxQb3N0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3NwYXRpYWxcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJhZGl1c1wiLCBwYXJhbXNbXCJyYWRpdXNcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gcGFyYW1zLnBhcmFtcztcbiAgICBpZiAoc2VhcmNoUGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgc2VhcmNoUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShwYXJhbS5rZXksIHBhcmFtLnZhbHVlLCBwYXJhbS5vcGVyYXRvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2VsZWN0aW9uXCIsIHBhcmFtc1tcInNlbGVjdGlvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNraXBDYWNoZVwiLCBwYXJhbXNbXCJza2lwQ2FjaGVcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IGZlYXR1cmVzIGluIHRpbGVcbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gdGlsZVR5cGUgVGhlIHR5cGUgb2YgdGlsZSBpZGVudGlmaWVyLlxuICogRGVmYXVsdDogXCJxdWFka2V5XCIuXG4gKiBFbnVtOiBcInF1YWRrZXlcIiBcIndlYlwiIFwidG1zXCIgXCJoZXJlXCIuXG4gKiBcInF1YWRrZXlcIiAtIFZpcnR1YWwgRWFydGgsXG4gKiBcIndlYlwiIC0gV2ViIE1lcmNhdG9yLFxuICogXCJ0bXNcIiAtIE9TR0VPIFRpbGUgTWFwIFNlcnZpY2UsXG4gKiBcImhlcmVcIiAtIEhlcmUgVGlsZSBTY2hlbWEuXG4gKlxuICogQHBhcmFtIHRpbGVJZCBUaGUgdGlsZSBpZGVudGlmaWVyIGNhbiBiZSBwcm92aWRlZCBhcyBxdWFka2V5ICgxKSxcbiAqIFdlYiBNZXJjYXRvciBsZXZlbCx4LHkgY29vcmRpbmF0ZXMgKDFfMV8wKSBvciBPU0dFTyBUaWxlIE1hcCBTZXJ2aWNlIGxldmVsLHgseSAoMV8xXzApLlxuICpcbiAqIEBwYXJhbSBjbGlwIElmIHNldCB0byB0cnVlIHRoZSBmZWF0dXJlcycgZ2VvbWV0cmllcyBhcmUgY2xpcHBlZCB0byB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRpbGUgb3IgYm91bmRpbmcgYm94LlxuICogRGVmYXVsdCBpcyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIEFkZGl0aW9uYWwgZmVhdHVyZSBmaWx0ZXJzIHdoaWNoIGNvbXBhcmVzIHRoZSBmZWF0dXJlJ3MgcHJvcGVydHkncyB2YWx1ZSB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkXG4gKiBpbiB0aGUgcXVlcnksIHJlc3VsdGluZyBpbiBhIHN1YnNldCBvZiBmZWF0dXJlcy5cbiAqIFRoZSB1c2FnZSBvZiBtdWx0aXBsZSBwcm9wZXJ0eSBuYW1lcyByZXByZXNlbnRzIGFuIEFORCBvcGVyYXRpb24uXG4gKiBUaGUgdXNhZ2Ugb2YgYSBjb21tYSAoLCkgc2VwYXJhdGluZyB0aGUgcHJvcGVydGllcyB2YWx1ZXMsIHJlcHJlc2VudHMgYW4gT1Igb3BlcmF0aW9uLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAnZi4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgd2hpY2ggYXJlIGFkZGVkIGJ5IGRlZmF1bHQgaW4gdGhlIHN0b3JlZCBmZWF0dXJlLlxuICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6ICdmLmlkJywgJ2YuY3JlYXRlZEF0JyBhbmQgJ2YudXBkYXRlZEF0Jy5cbiAqIFByb3BlcnRpZXMgaW5pdGlhdGVkIHdpdGggJ3AuJyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIGluIHRoZSBzdG9yZWQgZmVhdHVyZSB3aGljaCBhcmUgdW5kZXIgdGhlICdwcm9wZXJ0aWVzJyBwcm9wZXJ0eS5cbiAqIFVzZSBpdCBhcyBhIHNob3J0aGFuZCBhY2Nlc3NvciBmb3IgJ3Byb3BlcnRpZXMnIHZhbHVlcy5cbiAqIFRoZSBmb3JtYXQgc2hvdWxkIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBiZWxvd1xuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9cHJvcGVydHlfdmFsdWVfMSZmLnNwZWNpYWxfcHJvcGVydHlfbmFtZV8xPXNwZWNpYWxfcHJvcGVydHlfdmFsdWVfMVxuICogYGBgXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBhYm92ZSBxdWVyeSwgdGhlIEZlYXR1cmVzIHdpbGwgYmUgZmlsdGVyZWQgYnkgJ3Byb3BlcnR5JyBBTkQgJ3NwZWNpYWwgcHJvcGVydHknIGVxdWFscyB0byB0aGVpclxuICogcmVzcGVjdGl2ZSB2YWx1ZXMuXG4gKlxuICogV2hpbGUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGBgYD9wLnByb3BlcnR5X25hbWVfMT12YWx1ZV8xLHZhbHVlXzJgYGBcbiAqIFRoZSByZXN1bHRpbmcgRmVhdHVyZXMgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIGVsZW1lbnRzIGhhdmluZyBgdmFsdWVfMWAgT1IgYHZhbHVlXzJgLlxuICpcbiAqIEFkZGl0aW9uYWxseSB0byB0aGUgb3BlcmF0b3JzIHVzZWQgaW4gdGhlIGV4YW1wbGVzIGFib3ZlLCB0aGUgcXVlcnkgY2FuIGJlIHdyaXR0ZW4sIHdpdGggdGhlIHNhbWUgc2VtYW50aWMsXG4gKiBieSB1c2luZyB0aGUgbG9uZyBvcGVyYXRvcnM6IGBcIj1ndGU9XCIsIFwiPWx0ZT1cIiwgXCI9Z3Q9XCIsIFwiPWx0PVwiIGFuZCBcIj1jcz1cImAuXG4gKlxuICogVGhlIGJlbG93IHF1ZXJpZXMgeWllbGQgdGhlIHNhbWUgcmVzdWx0OlxuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE+PTEwXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9Z3RlPTEwXG4gKiBgYGBcbiAqXG4gKiBUaGUgYXZhaWxhYmxlIG9wZXJhdG9ycyBhcmU6XG4gKiBcIj1cIiAtIGVxdWFsc1xuICogXCIhPVwiIC0gbm90IGVxdWFsc1xuICogXCI+PVwiIG9yIFwiPWd0ZT1cIiAtIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHNcbiAqIFwiPD1cIiBvciBcIj1sdGU9XCIgLSBsZXNzIHRoYW4gb3IgZXF1YWxzXG4gKiBcIj5cIiBvciBcIj1ndD1cIiAtIGdyZWF0ZXIgdGhhblxuICogXCI8XCIgb3IgXCI9bHQ9XCIgLSBsZXNzIHRoYW5cbiAqIFwiQD5cIiBvciBcIj1jcz1cIiAtIGNvbnRhaW5zXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvbiBBIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmVhdHVyZXMgcmVzdWx0IGxpc3QuXG4gKiBNdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgY29tbWEoLCkuXG4gKiBFeGFtcGxlOiBgP3NlbGVjdGlvbj1wLm5hbWUscC5jYXBhY2l0eSxwLmNvbG9yYC5cbiAqXG4gKiBAcGFyYW0gc2tpcENhY2hlIElmIHNldCB0byB0cnVlIHRoZSByZXNwb25zZSBpcyBub3QgcmV0dXJuZWQgZnJvbSBjYWNoZS4gRGVmYXVsdCBpcyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gY2x1c3RlcmluZyBUaGUgY2x1c3RlcmluZyBhbGdvcml0aG0gdG8gYXBwbHkgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSByZXN1bHQuXG4gKiBQcm92aWRpbmcgdGhpcyBxdWVyeSBwYXJhbWV0ZXIgdGhlIGRhdGEgd2lsbCBiZSByZXR1cm5lZCBpbiBhIGNsdXN0ZXJlZCB3YXkuXG4gKiBUaGlzIG1lYW5zIHRoZSBkYXRhIHdvbid0IG5lY2Vzc2FyaWx5IGJlIHJldHVybmVkIGluIGl0cyBvcmlnaW5hbCBzaGFwZSBvciB3aXRoIGl0cyBvcmlnaW5hbCBwcm9wZXJ0aWVzLlxuICogRGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gY2x1c3RlcmluZyBhbGdvcml0aG0gdGhlcmUgY291bGQgYmUgZGlmZmVyZW50IG1hbmRhdG9yeSBhbmQvb3Igb3B0aW9uYWwgcGFyYW1ldGVyc1xuICogdG8gc3BlY2lmeSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsZ29yaXRobS5cbiAqIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gKlxuICogYGhleGJpbmAgLSBUaGUgaGV4YmluIGFsZ29yaXRobSBkaXZpZGVzIHRoZSB3b3JsZCBpbiBoZXhhZ29uYWwgXCJiaW5zXCIgb24gYSBzcGVjaWZpZWQgcmVzb2x1dGlvbi5cbiAqIEVhY2ggaGV4YWdvbiBoYXMgYW4gYWRkcmVzcyBiZWluZyBkZXNjcmliZWQgYnkgdGhlIEgzIGFkZHJlc3Npbmcgc2NoZW1lLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhhdCB0b3BpYyBzZWU6IGh0dHBzOi8vZW5nLnViZXIuY29tL2gzLy5cbiAqXG4gKiBgcXVhZGJpbmAgLSBUaGUgcXVhZGJpbiBhbGdvcml0aG0gdGFrZXMgdGhlIGdlb21ldHJ5IGlucHV0IGZyb20gdGhlIHJlcXVlc3QgKGUuZy4gcXVhZGtleSAvIGJib3guLilcbiAqIGFuZCBjb3VudCB0aGUgZmVhdHVyZXMgaW4gaXQuXG4gKiBUaGlzIGNsdXN0ZXJpbmcgbW9kZSB3b3JrcyBhbHNvIGZvciB2ZXJ5IGxhcmdlIGxheWVycyBhbmQgY2FuIGJlIHVzZWQgZm9yIGdldHRpbmcgYW4gb3ZlcnZpZXdcbiAqIHdoZXJlIGRhdGEgaXMgcHJlc2VudCBpbiBhIGdpdmVuIGxheWVyLiBGdXJ0aGVybW9yZSwgYSBwcm9wZXJ0eSBmaWx0ZXIgb24gb25lIHByb3BlcnR5IGlzIGFwcGxpY2FibGUuXG4gKlxuICogQHBhcmFtIGNsdXN0ZXJpbmdQYXJhbXMgU29tZSBwYXJhbWV0ZXJzIGZvciB0aGUgY2hvc2VuIGNsdXN0ZXJpbmcgYWxnb3JpdGhtLlxuICogRGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gY2x1c3RlcmluZyBhbGdvcml0aG0gdGhlcmUgY291bGQgYmUgZGlmZmVyZW50IG1hbmRhdG9yeSBhbmQvb3Igb3B0aW9uYWwgcGFyYW1ldGVycyB0byBzcGVjaWZ5XG4gKiB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsZ29yaXRobS5cbiAqXG4gKiBDbHVzdGVyaW5nLVBhcmFtZXRlciByZWZlcmVuY2UuXG4gKiBOT1RFOiBUaGUgYWN0dWFsIHF1ZXJ5IHBhcmFtZXRlcnMgaW4gdGhlIFVSTCBhcmUgbG9va2luZyBsaWtlOiBgP2NsdXN0ZXJpbmcuYVBhcmFtZXRlck5hbWU9YVZhbHVlYC5cbiAqXG4gKiBDbHVzdGVyaW5nLXR5cGU6IFwiaGV4YmluXCI6XG4gKiBUaGVyZSBhcmUgc2V2ZXJhbCBwYXJhbWV0ZXJzIG5lZWRlZCBieSB0aGUgSDMgYmFzZWQgaGV4YmluIGFsZ29yaXRobS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoYXQgdG9waWMgc2VlOiBodHRwczovL2VuZy51YmVyLmNvbS9oMy8uXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogfCAgICAgIFBhcmFtZXRlciAgICAgICB8ICAgVHlwZSAgIHwgICBNYW5kYXRvcnkgICB8ICAgICAgICAgICAgICAgICAgICAgIE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiB8ICBhYnNvbHV0ZVJlc29sdXRpb24gIHwgIE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgVGhlIEgzIGhleGFnb24gcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgICAgIHJlc29sdXRpb25cdCAgICAgIHwgIE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgZGVwcmVjYXRlZCwgcmVuYW1lZCB0byBhYnNvbHV0ZVJlc29sdXRpb24gICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgcmVsYXRpdmVSZXNvbHV0aW9uICAgfFx0IE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgaW50ZWdlciB2YWx1ZSBbMC00XSB0byBiZSBhZGRlZCB0byBjdXJyZW50IHVzZWQgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICB8IHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB8ICAgICAgIHByb3BlcnR5XHQgICAgICB8ICBTdHJpbmcgIHwgICAgICAgTk9cdCAgICAgfCBBIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBmZWF0dXJlcyBmb3Igd2hpY2ggdG8gICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgY2FsY3VsYXRlIHN0YXRpc3RpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgICAgICAgcG9pbnRtb2RlXHQgIHwgIEJvb2xlYW4gfCAgICAgICBOT1x0ICAgICB8IHJldHVucyB0aGUgY2VudHJvaWQgb2YgaGV4YWdvbnMgYXMgZ2VvanNvbiBmZWF0dXJlIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogQHBhcmFtIG1hcmdpbiBNYXJnaW4gaW4gcGl4ZWxzIG9uIHRoZSByZXNwZWN0aXZlIHByb2plY3RlZCBsZXZlbCBhcm91bmQgdGhlIHRpbGUuIERlZmF1bHQgaXMgMC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS4gRGVmYXVsdCBpcyAzMDAwMC4gSGFyZCBsaW1pdCBpcyAxMDAwMDAuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIGB0cnVlYCB0aGUgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlIHdpbGwgaGF2ZSBvbmx5IFgncyBhbmQgWSdzIGFzIGNvb3JkaW5hdGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGZWF0dXJlc0J5VGlsZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS90aWxlL3t0aWxlVHlwZX0ve3RpbGVJZH1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie3RpbGVUeXBlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widGlsZVR5cGVcIl0pKVxuICAgICAgICAucmVwbGFjZShcInt0aWxlSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJ0aWxlSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2xpcFwiLCBwYXJhbXNbXCJjbGlwXCJdKTtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBwYXJhbXMucGFyYW1zO1xuICAgIGlmIChzZWFyY2hQYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBzZWFyY2hQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KHBhcmFtLmtleSwgcGFyYW0udmFsdWUsIHBhcmFtLm9wZXJhdG9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzZWxlY3Rpb25cIiwgcGFyYW1zW1wic2VsZWN0aW9uXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2tpcENhY2hlXCIsIHBhcmFtc1tcInNraXBDYWNoZVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNsdXN0ZXJpbmdcIiwgcGFyYW1zW1wiY2x1c3RlcmluZ1wiXSk7XG4gICAgaWYgKHBhcmFtc1tcImNsdXN0ZXJpbmdQYXJhbXNcIl0pIHtcbiAgICAgICAgZm9yIChjb25zdCBjbHVzdGVyaW5nUGFyYW0gaW4gcGFyYW1zW1wiY2x1c3RlcmluZ1BhcmFtc1wiXSkge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShgY2x1c3RlcmluZy4ke2NsdXN0ZXJpbmdQYXJhbX1gLCBwYXJhbXNbXCJjbHVzdGVyaW5nUGFyYW1zXCJdW2NsdXN0ZXJpbmdQYXJhbV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtYXJnaW5cIiwgcGFyYW1zW1wibWFyZ2luXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHVybnMgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBsYXllci5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgc3RhdGlzdGljcy5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gc2tpcENhY2hlIElmIHNldCB0byB0cnVlIHRoZSByZXNwb25zZSBpcyBub3QgcmV0dXJuZWQgZnJvbSBjYWNoZS5cbiAqIERlZmF1bHQgaXMgZmFsc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFN0YXRpc3RpY3MoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc3RhdGlzdGljc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2tpcENhY2hlXCIsIHBhcmFtc1tcInNraXBDYWNoZVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogSXRlcmF0ZXMgYWxsIG9mIHRoZSBmZWF0dXJlcyBpbiB0aGUgbGF5ZXIuIFRoZSBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2UgYXJlIG9yZGVyZWQgc29cbiAqIHRoYXQgbm8gZmVhdHVyZSBpcyByZXR1cm5lZCB0d2ljZS4gSWYgdGhlcmUgYXJlIG1vcmUgZmVhdHVyZXMsIHdoaWNoIGNvdWxkIGJlIGxvYWRlZCxcbiAqIHRoZSByZXNwb25zZSBGZWF0dXJlQ29sbGVjdGlvbiB3aWxsIGNvbnRhaW4gdGhlIHJvb3QgYXR0cmlidXRlIG5leHRQYWdlVG9rZW4uXG4gKiBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHBhc3NlZCBhcyBhIHF1ZXJ5IHBhcmFtZXRlciBmb3IgdGhlIGZvbGxvd2luZyByZXF1ZXN0XG4gKiBpbiBvcmRlciB0byBjb250aW51ZSB0aGUgaXRlcmF0aW9uIGZyb20gdGhlIG1hcmtlZCBwb3NpdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBJdGVyYXRlIGZlYXR1cmVzIGluIHRoZSBsYXllci5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS4gRGVmYXVsdCBpcyAzMDAwMC4gSGFyZCBsaW1pdCBpcyAxMDAwMDAuXG4gKlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgcGFnZSB0b2tlbiB3aGVyZSB0aGUgaXRlcmF0aW9uIHdpbGwgY29udGludWUuXG4gKlxuICogQHBhcmFtIHBhcnQgUmVxdWVzdHMgZGlzanVuY3QgcGFydHMgb2YgaXRlcmF0aW9uIHJlc3VsdHMgKHVzZWQgd2l0aCBzb3J0KS5cbiAqIExpc3Qgb2YgdHdvIGludGVnZXJzIFwicGFydCx0b3RhbFwiLiBwYXJ0PTEsNCByZWFkIGFzIGZpcnN0IHBhcnQgb3V0IG9mIDQsIC4uLiB1bnRpbCBwYXJ0PTQsNCAuXG4gKiBFeGFtcGxlOiA/cGFydD03LDlcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmZWF0dXJlcyByZXN1bHQgbGlzdC5cbiAqIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBieSB1c2luZyBjb21tYSgsKS5cbiAqIEV4YW1wbGU6IGA/c2VsZWN0aW9uPXAubmFtZSxwLmNhcGFjaXR5LHAuY29sb3JgLlxuICpcbiAqIEBwYXJhbSBzb3J0IFNwZWNpZmllcyB0aGUgc29ydCBvcmRlciBieSBhIGxpc3Qgb2YgcHJvcGVydGllcy5cbiAqIEFzY2VuZGluZyBhc3N1bWVkIGlmIG5vIHNvcnQgZGlyZWN0aW9uICg6YXNjLCA6ZGVzYykgaXMgc3BlY2lmaWVkLlxuICogRXhhbXBsZTogc29ydCA9IFtcInAubmFtZTphc2NcIiwgXCJwLmNvbG9yOmRlc2NcIl0gPT4gP3NvcnQ9cC5uYW1lOmFzYyxwLmNvbG9yOmRlc2MuXG4gKlxuICogQHBhcmFtIHNraXBDYWNoZSBJZiBzZXQgdG8gdHJ1ZSB0aGUgcmVzcG9uc2UgaXMgbm90IHJldHVybmVkIGZyb20gY2FjaGUuIERlZmF1bHQgaXMgZmFsc2UuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIHRydWUgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXRlcmF0ZUZlYXR1cmVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2l0ZXJhdGVcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcnRcIiwgcGFyYW1zW1wicGFydFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzb3J0XCIsIHBhcmFtc1tcInNvcnRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJza2lwQ2FjaGVcIiwgcGFyYW1zW1wic2tpcENhY2hlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZm9yY2UyRFwiLCBwYXJhbXNbXCJmb3JjZTJEXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBTZWFyY2hlcyBmb3IgZmVhdHVyZXMgaW4gdGhlIGxheWVyLiBUaGUgcmVzdWx0cyBhcmUgdW5vcmRlcmVkIGFuZCB0aGUgcmVxdWVzdCBkb2VzIG5vdCBhbGxvdyB0byBjb250aW51ZVxuICogdGhlIHNlYXJjaCwgd2hpY2ggaXMgdGhlIG1haW4gZGlmZmVyZW5jZSB3aGVuIGNvbXBhcmVkIHRvIHRoZSBpdGVyYXRlIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgU2VhcmNoIGZvciBmZWF0dXJlcy5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS4gRGVmYXVsdCBpcyAzMDAwMC4gSGFyZCBsaW1pdCBpcyAxMDAwMDAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIGZlYXR1cmUgZmlsdGVycyB3aGljaCBjb21wYXJlcyB0aGUgZmVhdHVyZSdzIHByb3BlcnR5J3MgdmFsdWUgd2l0aCB0aGUgb25lIHNwZWNpZmllZFxuICogaW4gdGhlIHF1ZXJ5LCByZXN1bHRpbmcgaW4gYSBzdWJzZXQgb2YgZmVhdHVyZXMuXG4gKiBUaGUgdXNhZ2Ugb2YgbXVsdGlwbGUgcHJvcGVydHkgbmFtZXMgcmVwcmVzZW50cyBhbiBBTkQgb3BlcmF0aW9uLlxuICogVGhlIHVzYWdlIG9mIGEgY29tbWEgKCwpIHNlcGFyYXRpbmcgdGhlIHByb3BlcnRpZXMgdmFsdWVzLCByZXByZXNlbnRzIGFuIE9SIG9wZXJhdGlvbi5cbiAqIFByb3BlcnRpZXMgaW5pdGlhdGVkIHdpdGggJ2YuJyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIHdoaWNoIGFyZSBhZGRlZCBieSBkZWZhdWx0IGluIHRoZSBzdG9yZWQgZmVhdHVyZS5cbiAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiAnZi5pZCcsICdmLmNyZWF0ZWRBdCcgYW5kICdmLnVwZGF0ZWRBdCcuXG4gKiBQcm9wZXJ0aWVzIGluaXRpYXRlZCB3aXRoICdwLicgYXJlIHVzZWQgdG8gYWNjZXNzIHZhbHVlcyBpbiB0aGUgc3RvcmVkIGZlYXR1cmUgd2hpY2ggYXJlIHVuZGVyIHRoZSAncHJvcGVydGllcycgcHJvcGVydHkuXG4gKiBVc2UgaXQgYXMgYSBzaG9ydGhhbmQgYWNjZXNzb3IgZm9yICdwcm9wZXJ0aWVzJyB2YWx1ZXMuXG4gKiBUaGUgZm9ybWF0IHNob3VsZCBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24gYmVsb3dcbiAqIGBgYFxuICogP3AucHJvcGVydHlfbmFtZV8xPXByb3BlcnR5X3ZhbHVlXzEmZi5zcGVjaWFsX3Byb3BlcnR5X25hbWVfMT1zcGVjaWFsX3Byb3BlcnR5X3ZhbHVlXzFcbiAqIGBgYFxuICpcbiAqIEZvciBleGFtcGxlLCB0aGUgYWJvdmUgcXVlcnksIHRoZSBGZWF0dXJlcyB3aWxsIGJlIGZpbHRlcmVkIGJ5ICdwcm9wZXJ0eScgQU5EICdzcGVjaWFsIHByb3BlcnR5JyBlcXVhbHMgdG8gdGhlaXJcbiAqIHJlc3BlY3RpdmUgdmFsdWVzLlxuICpcbiAqIFdoaWxlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBgYGA/cC5wcm9wZXJ0eV9uYW1lXzE9dmFsdWVfMSx2YWx1ZV8yYGBgXG4gKiBUaGUgcmVzdWx0aW5nIEZlYXR1cmVzIGxpc3Qgd2lsbCBjb250YWluIGFsbCBlbGVtZW50cyBoYXZpbmcgYHZhbHVlXzFgIE9SIGB2YWx1ZV8yYC5cbiAqXG4gKiBBZGRpdGlvbmFsbHkgdG8gdGhlIG9wZXJhdG9ycyB1c2VkIGluIHRoZSBleGFtcGxlcyBhYm92ZSwgdGhlIHF1ZXJ5IGNhbiBiZSB3cml0dGVuLCB3aXRoIHRoZSBzYW1lIHNlbWFudGljLFxuICogYnkgdXNpbmcgdGhlIGxvbmcgb3BlcmF0b3JzOiBgXCI9Z3RlPVwiLCBcIj1sdGU9XCIsIFwiPWd0PVwiLCBcIj1sdD1cIiBhbmQgXCI9Y3M9XCJgLlxuICpcbiAqIFRoZSBiZWxvdyBxdWVyaWVzIHlpZWxkIHRoZSBzYW1lIHJlc3VsdDpcbiAqIGBgYFxuICogP3AucHJvcGVydHlfbmFtZV8xPj0xMFxuICogP3AucHJvcGVydHlfbmFtZV8xPWd0ZT0xMFxuICogYGBgXG4gKlxuICogVGhlIGF2YWlsYWJsZSBvcGVyYXRvcnMgYXJlOlxuICogXCI9XCIgLSBlcXVhbHNcbiAqIFwiIT1cIiAtIG5vdCBlcXVhbHNcbiAqIFwiPj1cIiBvciBcIj1ndGU9XCIgLSBncmVhdGVyIHRoYW4gb3IgZXF1YWxzXG4gKiBcIjw9XCIgb3IgXCI9bHRlPVwiIC0gbGVzcyB0aGFuIG9yIGVxdWFsc1xuICogXCI+XCIgb3IgXCI9Z3Q9XCIgLSBncmVhdGVyIHRoYW5cbiAqIFwiPFwiIG9yIFwiPWx0PVwiIC0gbGVzcyB0aGFuXG4gKiBcIkA+XCIgb3IgXCI9Y3M9XCIgLSBjb250YWluc1xuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb24gQSBsaXN0IG9mIHByb3BlcnRpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZlYXR1cmVzIHJlc3VsdCBsaXN0LlxuICogTXVsdGlwbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGNvbW1hKCwpLlxuICogRXhhbXBsZTogYD9zZWxlY3Rpb249cC5uYW1lLHAuY2FwYWNpdHkscC5jb2xvcmAuXG4gKlxuICogQHBhcmFtIHNraXBDYWNoZSBJZiBzZXQgdG8gdHJ1ZSB0aGUgcmVzcG9uc2UgaXMgbm90IHJldHVybmVkIGZyb20gY2FjaGUuIERlZmF1bHQgaXMgZmFsc2UuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIHRydWUgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VhcmNoRmVhdHVyZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc2VhcmNoXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gcGFyYW1zLnBhcmFtcztcbiAgICBpZiAoc2VhcmNoUGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgc2VhcmNoUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShwYXJhbS5rZXksIHBhcmFtLnZhbHVlLCBwYXJhbS5vcGVyYXRvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2VsZWN0aW9uXCIsIHBhcmFtc1tcInNlbGVjdGlvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNraXBDYWNoZVwiLCBwYXJhbXNbXCJza2lwQ2FjaGVcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlbGV0ZXMgYW4gZXhpc3RpbmcgZmVhdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgZmVhdHVyZS5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIGZlYXR1cmUgaW4gdGhlIGxheWVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGZWF0dXJlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzL3tmZWF0dXJlSWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntmZWF0dXJlSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmZWF0dXJlSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogVGhlIHdpbGRjYXJkIHNpZ24oKikgY291bGQgYmUgdXNlZCB0byBkZWxldGUgYWxsIGZlYXR1cmVzIGluIHRoZSBsYXllci5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgbXVsdGlwbGUgZmVhdHVyZXMgZnJvbSB0aGUgbGF5ZXIuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGlkIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdW5pcXVlIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gKiBUaGVzZSBhcmUgdGhlIGFjY2VwdGFibGUgZm9ybWF0cyBmb3IgdGhpcyBmaWVsZDpcbiAqIGBgYFxuICogaWQ9dmFsdWUxLHZhbHVlMlxuICogaWQ9dmFsdWUxLGlkPXZhbHVlMlxuICogYGBgXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZlYXR1cmVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJpZFwiLCBwYXJhbXNbXCJpZFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFBhdGNoZXMgYW4gZXhpc3RpbmcgZmVhdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSBQYXRjaCBhIGZlYXR1cmUuXG4gKlxuICogQHBhcmFtIGJvZHkgQSBmZWF0dXJlIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGZlYXR1cmVJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgYSBmZWF0dXJlIGluIHRoZSBsYXllci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGF0Y2hGZWF0dXJlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzL3tmZWF0dXJlSWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntmZWF0dXJlSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmZWF0dXJlSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGUgb3IgcGF0Y2ggZmVhdHVyZXMuXG4gKlxuICogQHN1bW1hcnkgTW9kaWZ5IGZlYXR1cmVzLlxuICpcbiAqIEBwYXJhbSBib2R5IEEgRmVhdHVyZUNvbGxlY3Rpb24gb2JqZWN0IG9yIGEgRmVhdHVyZU1vZGlmaWNhdGlvbkxpc3Qgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICovXG5hc3luYyBmdW5jdGlvbiBwb3N0RmVhdHVyZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGVzIG9yIHJlcGxhY2VzIGEgZmVhdHVyZSBpbiB0aGUgbGF5ZXIuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIG9yIHJlcGxhY2UgYSBmZWF0dXJlLlxuICpcbiAqIEBwYXJhbSBib2R5IEEgZmVhdHVyZSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICpcbiAqIEBwYXJhbSBmZWF0dXJlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgZmVhdHVyZSBpbiB0aGUgbGF5ZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1dEZlYXR1cmUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXMve2ZlYXR1cmVJZH1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2ZlYXR1cmVJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImZlYXR1cmVJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGUgb3IgcmVwbGFjZSB0aGUgcHJvdmlkZWQgZmVhdHVyZXMuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIG9yIHJlcGxhY2UgbXVsdGlwbGUgZmVhdHVyZXMuXG4gKlxuICogQHBhcmFtIGJvZHkgQSBmZWF0dXJlIGNvbGxlY3Rpb24gcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHV0RmVhdHVyZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBsYXRmb3JtQVBJID0gcGxhdGZvcm1BUEk7XG5leHBvcnRzLmdldFBsYXRmb3JtQVBJTGlzdCA9IGdldFBsYXRmb3JtQVBJTGlzdDtcbmV4cG9ydHMucmVzb3VyY2VBUEkgPSByZXNvdXJjZUFQSTtcbmV4cG9ydHMuZ2V0UmVzb3VyY2VBUElMaXN0ID0gZ2V0UmVzb3VyY2VBUElMaXN0O1xuLyoqXG4gKiBBUEkgTG9va3VwIFNlcnZpY2UgdjFcbiAqIFRoZSBBUEkgTG9va3VwIFNlcnZpY2UgaXMgYSBwbGF0Zm9ybSBzZXJ2aWNlIHdpdGggZm9sbG93aW5nIGdvYWxzOlxuICogLSBSZWRpcmVjdCB1c2VycyB0byBSRVNUIEFQSXMgcmVsYXRlZCB0byBhIHJlc291cmNlIGlkZW50aWZpZWQgYnkgYW4gSFJOXG4gKiAtIEdpdmVuIGFuIEhSTiwgcHJvdmlkZSBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgaW4gUkVTVCBBUElzIGNhbGxzLiAtIERpc2NvdmVyeSBvZiBvdGhlciBIRVJFIEFQSXMuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC4zXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQbGF0Zm9ybUFwaVxuICovXG4vKipcbiAqIFJldHVybiBkZXRhaWxzIG9mIGEgc2luZ2xlIHBsYXRmb3JtIEFQSS4gVGhpcyByZXNwb25zZSBpcyB2YWxpZCBmb3IgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5ICdDYWNoZS1Db250cm9sJyBoZWFkZXIuXG4gKlxuICogQHN1bW1hcnkgUmV0dXJuIGRldGFpbHMgb2YgYSBzaW5nbGUgcGxhdGZvcm0gQVBJLlxuICogQHBhcmFtIGFwaSBUaGUgaWRlbnRpZmllciBvZiB0aGUgQVBJXG4gKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgQVBJXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBsYXRmb3JtQVBJKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wbGF0Zm9ybS9hcGlzL3thcGl9L3t2ZXJzaW9ufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2FwaX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFwaVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie3ZlcnNpb259XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJ2ZXJzaW9uXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0IG9mIHRoZSBIRVJFIEFQSXMuIFRoaXMgcmVzcG9uc2UgaXMgdmFsaWQgZm9yIHRoZSB0aW1lIHNwZWNpZmllZCBieSAnQ2FjaGUtQ29udHJvbCcgaGVhZGVyLlxuICpcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgbGlzdCBvZiB0aGUgSEVSRSBBUElzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybUFQSUxpc3QoYnVpbGRlcikge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wbGF0Zm9ybS9hcGlzXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXNvdXJjZXNBcGlcbiAqL1xuLyoqXG4gKiBSZXR1cm4gZGV0YWlscyBvZiBhIHNpbmdsZSBBUEkgZm9yIGEgZ2l2ZW4gcmVzb3VyY2UgaWRlbnRpZmllZCBieSBocm4sIGFwaSBhbmQgdmVyc2lvbi5cbiAqIFRoaXMgcmVzcG9uc2UgaXMgdmFsaWQgZm9yIHRoZSB0aW1lIHNwZWNpZmllZCBieSAnQ2FjaGUtQ29udHJvbCcgaGVhZGVyLlxuICpcbiAqIEBzdW1tYXJ5IFJldHVybiBkZXRhaWxzIG9mIGEgc2luZ2xlIEFQSSBmb3IgYSBnaXZlbiByZXNvdXJjZS5cbiAqIEBwYXJhbSBocm4gVGhlIEhSTiBpZGVudGlmeWluZyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSBhcGkgVGhlIGlkZW50aWZpZXIgb2YgdGhlIEFQSVxuICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIEFQSVxuICogQHBhcmFtIHJlZ2lvbiBJZiB5b3Ugd2FudCB0byBsb29rIHVwIGEgc3BlY2lmaWMgcmVnaW9uIGZvciBhIGdpdmVuIHJlc291cmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvdXJjZUFQSShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tocm59L2FwaXMve2FwaX0ve3ZlcnNpb259XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7aHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiaHJuXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7YXBpfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXBpXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7dmVyc2lvbn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInZlcnNpb25cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVnaW9uXCIsIHBhcmFtc1tcInJlZ2lvblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0IG9mIEFQSXMgZm9yIGEgZ2l2ZW4gcmVzb3VyY2UgaWRlbnRpZmllZCBieSBocm4uIFRoaXMgcmVzcG9uc2UgaXMgdmFsaWQgZm9yIHRoZSB0aW1lIHNwZWNpZmllZCBieSAnQ2FjaGUtQ29udHJvbCcgaGVhZGVyLlxuICpcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgbGlzdCBvZiBBUElzIGZvciBhIGdpdmVuIHJlc291cmNlLlxuICogQHBhcmFtIGhybiBUaGUgSFJOIGlkZW50aWZ5aW5nIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIHJlZ2lvbiBJZiB5b3Ugd2FudCB0byBsb29rIHVwIGEgc3BlY2lmaWMgcmVnaW9uIGZvciBhIGdpdmVuIHJlc291cmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZXNvdXJjZUFQSUxpc3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Jlc291cmNlcy97aHJufS9hcGlzXCIucmVwbGFjZShcIntocm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJocm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVnaW9uXCIsIHBhcmFtc1tcInJlZ2lvblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldENoYW5nZXMgPSBnZXRDaGFuZ2VzO1xuZXhwb3J0cy5nZXRMYXllclZlcnNpb25zID0gZ2V0TGF5ZXJWZXJzaW9ucztcbmV4cG9ydHMuZ2V0UGFydGl0aW9ucyA9IGdldFBhcnRpdGlvbnM7XG5leHBvcnRzLmxhdGVzdFZlcnNpb24gPSBsYXRlc3RWZXJzaW9uO1xuZXhwb3J0cy5saXN0VmVyc2lvbnMgPSBsaXN0VmVyc2lvbnM7XG5leHBvcnRzLm1pbmltdW1WZXJzaW9uID0gbWluaW11bVZlcnNpb247XG4vKipcbiAqIE1ldGFkYXRhIEFQSSB2MVxuICogVGhlIGBtZXRhZGF0YWAgc2VydmljZSBwcm92aWRlcyBhIHdheSB0byBnZXQgaW5mb3JtYXRpb24gKG1ldGFkYXRhKSBhYm91dCBsYXllcnMgYW5kIHBhcnRpdGlvbnMgc3RvcmVkIGluIGEgY2F0YWxvZy5cbiAqIFRoaXMgc2VydmljZSBleHBvc2VzIHRoZSBtZXRhZGF0YSBmb3IgYWxsIHRoZSBwYXJ0aXRpb25zIG9yIGFsbCB0aGUgY2hhbmdlZCBwYXJ0aXRpb25zLiBGb3IgYSBjYXRhbG9nIHdpdGggdmVyc2lvbmVkIGxheWVycyxcbiAqIHlvdSBjYW4gcmV0cmlldmUgbWV0YWRhdGEgZm9yIGEgcGFydGljdWxhciB2ZXJzaW9uIG9yIHZlcnNpb24gcmFuZ2Ugb2YgdGhlIGNhdGFsb2cuXG4gKiBZb3UgY2FuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGZvciBhIGNhdGFsb2cgd2l0aCB2ZXJzaW9uZWQgbGF5ZXJzOlxuICogLSBMaXN0IHZlcnNpb25zIG9mIHRoZSBjYXRhbG9nIC0gR2V0IGxhdGVzdCBhbmQgbWluaW11bSB2ZXJzaW9uIG9mIHRoZSBjYXRhbG9nXG4gKiAtIEdldCBtZXRhZGF0YSBvZiB0aGUgc3BlY2lmaWMgbGF5ZXJzICBGb3IgYSB2b2xhdGlsZSBsYXllciwgeW91IGNhbiBnZXQgbWV0YWRhdGEgZm9yIGFsbCBvciBhIHN1YnNldCBvZiBwYXJ0aXRpb25zIG9mIHRoZSBsYXllci5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIE1ldGFkYXRhQXBpXG4gKi9cbi8qKlxuICogR2V0cyB0aGUgbGF0ZXN0IHBhcnRpdGlvbiBtZXRhZGF0YSBpbiBhIHZlcnNpb24gcmFuZ2UgZm9yIGEgdmVyc2lvbmVkIGxheWVyIG9yIGEgdGltZSByYW5nZSBmb3IgYSB2b2xhdGlsZSBsYXllci5cbiAqIEZvciB2ZXJzaW9uZWQgbGF5ZXJzIHRoZSByYW5nZSBpcyBleHByZXNzZWQgYXMgYSBzdGFydCBhbmQgZW5kIHZlcnNpb24gYW5kIG1pZ2h0IG5vdCByZXR1cm4gYWxsIGNoYW5nZXMgZm9yIHRoZSBwYXJ0aXRpb25zXG4gKiB3aGljaCB3ZXJlIGFkZGVkIGFuZCByZW1vdmVkIGluIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdGFydCBhbmQgZW5kIHZlcnNpb25zLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgY2hhbmdlcyBmb3IgdGhlIHZlcnNpb24gcmFuZ2UuXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgbGF5ZXIgSUQuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIGxheWVyIElELlxuICogQHBhcmFtIHN0YXJ0VmVyc2lvbiBNYW5kYXRvcnkgZm9yIHZlcnNpb25lZCBsYXllcnM7IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlIG9mIHZlcnNpb25zIHlvdSB3YW50IHRvIGdldCAoZXhjbHVzaXZlKS5cbiAqIEJ5IGNvbnZlbnRpb24gLTEgaW5kaWNhdGVzIHRoZSBpbml0aWFsIHZlcnNpb24gYmVmb3JlIHRoZSBmaXJzdCBwdWJsaWNhdGlvbi4gQWZ0ZXIgdGhlIGZpcnN0IHB1YmxpY2F0aW9uLCB0aGUgY2F0YWxvZyB2ZXJzaW9uIGlzIDAuXG4gKiBAcGFyYW0gZW5kVmVyc2lvbiBNYW5kYXRvcnkgZm9yIHZlcnNpb25lZCBsYXllcnM7IHRoZSBlbmQgb2YgdGhlIHJhbmdlIG9mIHZlcnNpb25zIHlvdSB3YW50IHRvIGdldCAoaW5jbHVzaXZlKS5cbiAqIFRoaXMgbXVzdCBiZSBhIHZhbGlkIGNhdGFsb2cgdmVyc2lvbiBncmVhdGVyIHRoYW4gdGhlIHN0YXJ0VmVyc2lvbi5cbiAqIEBwYXJhbSBzaW5jZVRpbWUgTWFuZGF0b3J5IGZvciB2b2xhdGlsZSBsYXllcnM7IHdpbGwgcmV0dXJuIHBhcnRpdGlvbnMgd2hvc2UgZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGlzIHRpbWUsXG4gKiBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2gsIGluY2x1c2l2ZS5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFkZGl0aW9uYWwgZmllbGRzIC0gJiN4NjA7ZGF0YVNpemUmI3g2MDssICYjeDYwO2NoZWNrc3VtJiN4NjA7LCAmI3g2MDtjb21wcmVzc2VkRGF0YVNpemUmI3g2MDtcbiAqIEBwYXJhbSByYW5nZSBVc2UgdGhpcyBwYXJhbWV0ZXIgdG8gcmVzdW1lIGRvd25sb2FkIG9mIGEgbGFyZ2UgcmVzcG9uc2UgZm9yIHZlcnNpb25lZCBsYXllcnMgd2hlbiB0aGVyZVxuICogIGlzIGEgY29ubmVjdGlvbiBpc3N1ZSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4gU3BlY2lmeSBhIHNpbmdsZSBieXRlIHJhbmdlIG9mZnNldCBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqICBUaGlzIHBhcmFtZXRlciBpcyBjb21wbGlhbnQgd2l0aCBbUkZDIDcyMzNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMzKSxcbiAqIGJ1dCBub3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgb25seSBzdXBwb3J0cyBhIHNpbmdsZSBieXRlIHJhbmdlLlxuICogVGhlICYjeDYwO3JhbmdlJiN4NjA7IHBhcmFtZXRlciBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYXMgYSBxdWVyeSBwYXJhbWV0ZXIsIGkuZS4gJiN4NjA7cmFuZ2UmI3gzRDtieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqIEZvciB2b2xhdGlsZSBsYXllcnMgdXNlIHRoZSBwYWdpbmF0aW9uIGxpbmtzIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5LlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENoYW5nZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vY2hhbmdlc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhcnRWZXJzaW9uXCIsIHBhcmFtc1tcInN0YXJ0VmVyc2lvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImVuZFZlcnNpb25cIiwgcGFyYW1zW1wiZW5kVmVyc2lvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNpbmNlVGltZVwiLCBwYXJhbXNbXCJzaW5jZVRpbWVcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJhZGRpdGlvbmFsRmllbGRzXCIsIHBhcmFtc1tcImFkZGl0aW9uYWxGaWVsZHNcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJyYW5nZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJSYW5nZVwiXSA9IHBhcmFtc1tcInJhbmdlXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGxheWVyIHZlcnNpb25zIGZvciB0aGUgY2F0YWxvZyB2ZXJzaW9uLlxuICogSXQgd2lsbCByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGNhdGFsb2cgZG9lcyBub3QgaGF2ZSBhbnkgdmVyc2lvbnMgb3IgaWYgdGhlIHZlcnNpb24gcGFzc2VkIGluIHRoZSBxdWVyeSBwYXJhbWV0ZXIgZG9lcyBub3QgZXhpc3QuXG4gKiBJZiBhIGxheWVyIGRvZXMgbm90IGhhdmUgYW55IGRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBpdCBpcyBleGNsdWRlZCBmcm9tIHRoZSByZXNwb25zZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGxheWVyIHZlcnNpb25zIGZvciBjYXRhbG9nIHZlcnNpb25cbiAqIEBwYXJhbSB2ZXJzaW9uIENhdGFsb2cgdmVyc2lvblxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRMYXllclZlcnNpb25zKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllclZlcnNpb25zXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInZlcnNpb25cIiwgcGFyYW1zW1widmVyc2lvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0cyB0aGUgbWV0YWRhdGEgZm9yIGFsbCBwYXJ0aXRpb25zIGluIGEgc3BlY2lmaWMgbGF5ZXIuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgbGF5ZXIgSUQuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIGxheWVyIElELlxuICogQHBhcmFtIHZlcnNpb24gSWYgeW91IGFyZSBnZXR0aW5nIG1ldGFkYXRhIGZyb20gYSB2ZXJzaW9uZWQgbGF5ZXIsIHNwZWNpZnkgdGhlIHZlcnNpb24gb2YgdGhlIGxheWVyIHlvdSB3YW50LlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgZm9yIHZlcnNpb25lZCBsYXllcnMuIElmIHlvdSBhcmUgZ2V0dGluZyBtZXRhZGF0YSBmcm9tIGFub3RoZXIgbGF5ZXIgdHlwZSwgZG8gbm90IHNwZWNpZnkgdGhpcyBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBBZGRpdGlvbmFsIGZpZWxkcyAtICYjeDYwO2RhdGFTaXplJiN4NjA7LCAmI3g2MDtjaGVja3N1bSYjeDYwOywgJiN4NjA7Y29tcHJlc3NlZERhdGFTaXplJiN4NjA7XG4gKiBAcGFyYW0gcmFuZ2UgVXNlIHRoaXMgcGFyYW1ldGVyIHRvIHJlc3VtZSBkb3dubG9hZCBvZiBhIGxhcmdlIHJlc3BvbnNlIGZvciB2ZXJzaW9uZWQgbGF5ZXJzIHdoZW4gdGhlcmUgaXMgYSBjb25uZWN0aW9uXG4gKiBpc3N1ZSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4gU3BlY2lmeSBhIHNpbmdsZSBieXRlIHJhbmdlIG9mZnNldCBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudCB3aXRoIFtSRkMgNzIzM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMpLFxuICogYnV0IG5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGJ5dGUgcmFuZ2UuXG4gKiBUaGUgJiN4NjA7cmFuZ2UmI3g2MDsgcGFyYW1ldGVyIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBhIHF1ZXJ5IHBhcmFtZXRlciwgaS5lLiAmI3g2MDtyYW5nZSYjeDNEO2J5dGVzJiN4M0Q7MTAtJiN4NjA7LlxuICogRm9yIHZvbGF0aWxlIGxheWVycyB1c2UgdGhlIHBhZ2luYXRpb24gbGlua3MgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQYXJ0aXRpb25zKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3BhcnRpdGlvbnNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInZlcnNpb25cIiwgcGFyYW1zW1widmVyc2lvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImFkZGl0aW9uYWxGaWVsZHNcIiwgcGFyYW1zW1wiYWRkaXRpb25hbEZpZWxkc1wiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInJhbmdlXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlJhbmdlXCJdID0gcGFyYW1zW1wicmFuZ2VcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gY2F0YWxvZy4gSWYgdGhlIGNhdGFsb2cgZG9lc24ndCBjb250YWluIGFueSB2ZXJzaW9ucyBhIDQwNCB3aWxsIGJlIHJldHVybmVkLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uXG4gKiBAcGFyYW0gc3RhcnRWZXJzaW9uIFRoZSBjYXRhbG9nIHZlcnNpb24gcmV0dXJuZWQgZnJvbSBhIHByaW9yIHJlcXVlc3QgdG8gJiN4NjA7L3ZlcnNpb25zL2xhdGVzdCYjeDYwOy5cbiAqIFlvdSBzaG91bGQgc2F2ZSB0aGUgdmVyc2lvbiBmcm9tIGVhY2ggcmVxdWVzdCBzbyB0aGF0IHlvdSBjYW4gdXNlIGl0IGluIHRoZSAmI3g2MDtzdGFydFZlcnNpb24mI3g2MDsgcGFyYW1ldGVyIG9mIHN1YnNlcXVlbnQgcmVxdWVzdHMuXG4gKiBJZiB5b3UgZG9uJiMzOTt0IGhhdmUgdGhlIHZlcnNpb24gZnJvbSBhIHByaW9yIHJlcXVlc3QsIHNldCB0aGUgcGFyYW1ldGVyIHRvIC0xLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxhdGVzdFZlcnNpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25zL2xhdGVzdFwiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdGFydFZlcnNpb25cIiwgcGFyYW1zW1wic3RhcnRWZXJzaW9uXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGNhdGFsb2cgdmVyc2lvbihzKS5cbiAqIElmIHRoZSBjYXRhbG9nIGRvZXNuJ3QgY29udGFpbiBhbnkgdmVyc2lvbnMgNDA0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBNYXhpbXVtIG51bWJlciBvZiB2ZXJzaW9ucyB0byBiZSByZXR1cm5lZCBwZXIgY2FsbCBpcyAxMDAwIHZlcnNpb25zLlxuICogSWYgcmVxdWVzdGVkIHJhbmdlIGlzIGJpZ2dlciB0aGFuIDEwMDAgdmVyc2lvbnMgNDAwIEJhZCBSZXF1ZXN0IHdpbGwgYmUgcmV0dXJuZWRcbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGNhdGFsb2cgdmVyc2lvbnNcbiAqIEBwYXJhbSBzdGFydFZlcnNpb24gVGhlIGJlZ2lubmluZyBvZiB0aGUgcmFuZ2Ugb2YgdmVyc2lvbnMgeW91IHdhbnQgdG8gZ2V0IChleGNsdXNpdmUpLlxuICogQnkgY29udmVudGlvbiAtMSBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uLiBBZnRlciB0aGUgZmlyc3QgcHVibGljYXRpb24sIHRoZSBjYXRhbG9nIHZlcnNpb24gaXMgMC5cbiAqIEBwYXJhbSBlbmRWZXJzaW9uIFRoZSBlbmQgb2YgdGhlIHJhbmdlIG9mIHZlcnNpb25zIHlvdSB3YW50IHRvIGdldCAoaW5jbHVzaXZlKS5cbiAqIFRoaXMgbXVzdCBiZSBhIHZhbGlkIGNhdGFsb2cgdmVyc2lvbiBncmVhdGVyIHRoYW4gdGhlIHN0YXJ0VmVyc2lvbi5cbiAqIFRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyByZXR1cm5lZCBmcm9tIHRoZSAmI3g2MDsvdmVyc2lvbnMvbGF0ZXN0JiN4NjA7IGVuZHBvaW50LlxuICogSWYgdGhpcyB2ZXJzaW9uIGRvZXMgbm90IGV4aXN0LCA0MDAgQmFkIFJlcXVlc3QgaXMgcmV0dXJuZWRcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0VmVyc2lvbnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25zXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN0YXJ0VmVyc2lvblwiLCBwYXJhbXNbXCJzdGFydFZlcnNpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbmRWZXJzaW9uXCIsIHBhcmFtc1tcImVuZFZlcnNpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHVybnMgbWluaW11bSB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gY2F0YWxvZy4gSWYgdGhlIGNhdGFsb2cgZG9lc24ndCBjb250YWluIGFueSB2ZXJzaW9ucyA0MDQgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBlYXJsaWVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWluaW11bVZlcnNpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25zL21pbmltdW1cIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi4gYW5kIGl0cyBhZmZpbGlhdGUocykuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBjb250YWluIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uXG4gKiBjb250cm9sbGVkIGJ5IEhFUkUgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGVnaXNsYXRpb24uXG4gKiBBbnkgdXNlIGFuZCB1dGlsaXphdGlvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgYW5kXG4gKiBkaXNjbG9zdXJlIHRvIGFueSB0aGlyZCBwYXJ0aWVzIGlzIGNvbmRpdGlvbmFsIHVwb24gaGF2aW5nIGEgc2VwYXJhdGVcbiAqIGFncmVlbWVudCB3aXRoIEhFUkUgZm9yIHRoZSBhY2Nlc3MsIHVzZSwgdXRpbGl6YXRpb24gb3IgZGlzY2xvc3VyZSBvZiB0aGlzXG4gKiBzb2Z0d2FyZS4gSW4gdGhlIGFic2VuY2Ugb2Ygc3VjaCBhZ3JlZW1lbnQsIHRoZSB1c2Ugb2YgdGhlIHNvZnR3YXJlIGlzIG5vdFxuICogYWxsb3dlZC5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jYW5jZWxQdWJsaWNhdGlvbiA9IGNhbmNlbFB1YmxpY2F0aW9uO1xuZXhwb3J0cy5nZXRQdWJsaWNhdGlvbiA9IGdldFB1YmxpY2F0aW9uO1xuZXhwb3J0cy5pbml0UHVibGljYXRpb24gPSBpbml0UHVibGljYXRpb247XG5leHBvcnRzLnN1Ym1pdFB1YmxpY2F0aW9uID0gc3VibWl0UHVibGljYXRpb247XG5leHBvcnRzLnVwbG9hZFBhcnRpdGlvbnMgPSB1cGxvYWRQYXJ0aXRpb25zO1xuLyoqXG4gKiBQdWJsaXNoIEFQSSB2MlxuICogTm8gZGVzY3JpcHRpb24gcHJvdmlkZWQgKGdlbmVyYXRlZCBieSBTd2FnZ2VyIENvZGVnZW4gaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbilcbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMi4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdWJsaXNoQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQ2FuY2VscyBhIHB1YmxpY2F0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkLlxuICogV2lsbCBmYWlsIGlmIGF0dGVtcHRpbmcgdG8gY2FuY2VsIGEgc3VibWl0dGVkIHB1YmxpY2F0aW9uLlxuICogVGhpcyBhbGxvd3MgdGhlIHNwZWNpZmllZCBwdWJsaWNhdGlvbiB0byBiZSBhYmFuZG9uZWQuXG4gKiBTZWUgRGF0YSBBUEkgRGV2ZWxvcGVy4oCZcyBHdWlkZSBpbiB0aGUgRG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBwdWJsaWNhdGlvbiBzdGF0ZXMgZGlhZ3JhbVxuICogYW5kIGFsbCBwb3NzaWJsZSBwdWJsaWNhdGlvbiBzdGF0ZXMgdHJhbnNpdGlvbnMuXG4gKlxuICogQHN1bW1hcnkgQ2FuY2VscyBhIHB1YmxpY2F0aW9uXG4gKiBAcGFyYW0gcHVibGljYXRpb25JZCBUaGUgSUQgb2YgdGhlIHB1YmxpY2F0aW9uIHRvIGNhbmNlbC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FuY2VsUHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH1cIi5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgZGV0YWlscyBvZiB0aGUgc3BlY2lmaWVkIHB1YmxpY2F0aW9uLlxuICpcbiAqIFB1YmxpY2F0aW9uIGNhbiBiZSBpbiBvbmUgb2YgdGhlc2Ugc3RhdGVzOlxuICogIC0gSW5pdGlhbGl6ZWQsXG4gKiAgLSBTdWJtaXR0ZWQsXG4gKiAgLSBDYW5jZWxsZWQsXG4gKiAgLSBGYWlsZWQsXG4gKiAgLSBTdWNjZWVkZWQsXG4gKiAgLSBFeHBpcmVkLlxuICpcbiAqIFNlZSBEYXRhIEFQSSBEZXZlbG9wZXLigJlzIEd1aWRlIGluIHRoZSBEb2N1bWVudGF0aW9uIHNlY3Rpb24gZm9yIHRoZSBwdWJsaWNhdGlvbiBzdGF0ZSBkaWFncmFtLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgYSBwdWJsaWNhdGlvblxuICogQHBhcmFtIHB1YmxpY2F0aW9uSWQgVGhlIElEIG9mIHRoZSBwdWJsaWNhdGlvbiB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH1cIi5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogSW5pdGlhbGl6ZXMgYSBuZXcgcHVibGljYXRpb24gZm9yIHB1Ymxpc2hpbmcgbWV0YWRhdGEuXG4gKiBEZXRlcm1pbmVzIHRoZSBwdWJsaWNhdGlvbiB0eXBlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBsYXllciBJRHMuXG4gKiBBIHB1YmxpY2F0aW9uIGNhbiBvbmx5IGNvbnNpc3Qgb2YgbGF5ZXIgSURzIHRoYXQgaGF2ZSB0aGUgc2FtZSBsYXllciB0eXBlLlxuICogRm9yIGV4YW1wbGUsIHlvdSBjYW4gaGF2ZSBhIHB1YmxpY2F0aW9uIGZvciBtdWx0aXBsZSBsYXllcnMgb2YgdHlwZSBgdmVyc2lvbmVkYCxcbiAqIGJ1dCB5b3UgY2Fubm90IGhhdmUgYSBzaW5nbGUgcHVibGljYXRpb24gdGhhdCBwdWJsaXNoZXMgdG8gYm90aCBgdmVyc2lvbmVkYCBhbmQgYHN0cmVhbWAgbGF5ZXJzLlxuICogSW4gYWRkaXRpb24sIHlvdSBtYXkgb25seSBoYXZlIG9uZSBgdmVyc2lvbmVkYCBvciBgdm9sYXRpbGVgIHB1YmxpY2F0aW9uIGluIHByb2Nlc3MgYXQgYSB0aW1lLlxuICogWW91IGNhbm5vdCBoYXZlIG11bHRpcGxlIGFjdGl2ZSBwdWJsaWNhdGlvbnMgdG8gdGhlIHNhbWUgY2F0YWxvZyBmb3IgYHZlcnNpb25lZGAgYW5kIGB2b2xhdGlsZWAgbGF5ZXIgdHlwZXMuXG4gKiBUaGUgYm9keSBmaWVsZCBgdmVyc2lvbkRlcGVuZGVuY2llc2AgaXMgb3B0aW9uYWwgYW5kIGlzIHVzZWQgZm9yIGB2ZXJzaW9uZWRgIGxheWVycyB0byBkZWNsYXJlIHZlcnNpb24gZGVwZW5kZW5jaWVzLlxuICpcbiAqIEBzdW1tYXJ5IEluaXRpYWxpemUgYSBuZXcgcHVibGljYXRpb25cbiAqIEBwYXJhbSBib2R5IEZpZWxkcyB0byBpbml0aWFsaXplIGEgcHVibGljYXRpb24uXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0UHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9uc1wiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogU3VibWl0cyB0aGUgcHVibGljYXRpb24gYW5kIGluaXRpYXRlcyBwb3N0IHByb2Nlc3NpbmcgaWYgbmVjZXNzYXJ5LlxuICogUHVibGljYXRpb24gc3RhdGUgYmVjb21lcyBgU3VibWl0dGVkYCBkaXJlY3RseSBhZnRlciBzdWJtaXNzaW9uIGFuZCBgU3VjY2VlZGVkYCBhZnRlciBzdWNjZXNzZnVsIHByb2Nlc3NpbmcuXG4gKiBTZWUgRGF0YSBBUEkgRGV2ZWxvcGVy4oCZcyBHdWlkZSBpbiB0aGUgRG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBjb21wbGV0ZSBwdWJsaWNhdGlvbiBzdGF0ZXMgZGlhZ3JhbS5cbiAqXG4gKiBAc3VtbWFyeSBTdWJtaXRzIGEgcHVibGljYXRpb25cbiAqIEBwYXJhbSBwdWJsaWNhdGlvbklkIElEIG9mIHB1YmxpY2F0aW9uIHRvIHN1Ym1pdC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0UHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH1cIi5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFVwbG9hZCBwYXJ0aXRpb25zIHRvIHRoZSBnaXZlbiBsYXllci5cbiAqIERlcGVuZGVuZGluZyBvbiB0aGUgcHVibGljYXRpb24gdHlwZSwgcG9zdCBwcm9jZXNzaW5nIG1heSBiZSByZXF1aXJlZCBiZWZvcmUgdGhlIHBhcnRpdGlvbnMgYXJlIHB1Ymxpc2hlZC5cbiAqIEZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYmF0Y2ggeW91ciBwYXJ0aXRpb25zIChlLmcuIDEwMDAgcGVyIHJlcXVlc3QpLCByYXRoZXIgdGhhbiB1cGxvYWRpbmcgdGhlbSBpbmRpdmlkdWFsbHkuXG4gKlxuICogQHN1bW1hcnkgVXBsb2FkIHBhcnRpdGlvbnNcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gcHVibGlzaCB0by5cbiAqIEBwYXJhbSBwdWJsaWNhdGlvbklkIFRoZSBJRCBvZiBwdWJsaWNhdGlvbiB0byBwdWJsaXNoIHRvLlxuICogQHBhcmFtIGJvZHkgUHVibGljYXRpb24gcGFydGl0aW9ucy4gRGF0YSBhbmQgRGF0YUhhbmRsZSBmaWVsZHMgY2Fubm90IGJlIHBvcHVsYXRlZCBhdCB0aGUgc2FtZSB0aW1lLlxuICogU2VlIFBhcnRpdGlvbiBvYmplY3QgZm9yIG1vcmUgZGV0YWlscyBvbiBib2R5IGZpZWxkc1xuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiB1cGxvYWRQYXJ0aXRpb25zKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH0vcGFydGl0aW9uc1wiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cHVibGljYXRpb25JZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInB1YmxpY2F0aW9uSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRDaGFuZ2VzQnlJZCA9IGdldENoYW5nZXNCeUlkO1xuZXhwb3J0cy5nZXRQYXJ0aXRpb25zQnlJZCA9IGdldFBhcnRpdGlvbnNCeUlkO1xuZXhwb3J0cy5xdWFkVHJlZUluZGV4ID0gcXVhZFRyZWVJbmRleDtcbmV4cG9ydHMucXVhZFRyZWVJbmRleFZvbGF0aWxlID0gcXVhZFRyZWVJbmRleFZvbGF0aWxlO1xuLyoqXG4gKiBRdWVyeSBBUEkgdjFcbiAqIFRoZSBgcXVlcnlgIHNlcnZpY2UgcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IGluZm9ybWF0aW9uIChtZXRhZGF0YSkgYWJvdXQgbGF5ZXJzIGFuZCBwYXJ0aXRpb25zIHN0b3JlZCBpbiBhIGNhdGFsb2cuXG4gKiBUaGlzIHNlcnZpY2UgZXhwb3NlcyB0aGUgbWV0YWRhdGEgZm9yIHNpbmdsZSBwYXJ0aXRpb25zIHRoYXQgdXNlcnMgY2FuIHF1ZXJ5IG9uZSBieSBvbmUgb3IgYnkgc3BlY2lmeWluZyBhIHBhcmVudCB0aWxlLlxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjAuMVxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUXVlcnlBcGlcbiAqL1xuLyoqXG4gKiBHZXRzIHRoZSBsYXRlc3QgcGFydGl0aW9uIGNoYW5nZXMgZm9yIGEgdmVyc2lvbiByYW5nZSBpbiBhIHZlcnNpb25lZCBsYXllciBvciBhIHRpbWUgcmFuZ2VcbiAqIGZvciBhIHZvbGF0aWxlIGxheWVyLiBPbmx5IHRoZSBsYXRlc3QgY2hhbmdlIGZvciBlYWNoIGNoYW5nZWQgcGFydGl0aW9uIGlzIHJldHVybmVkLCBub3RcbiAqICBpbnRlcm1lZGlhdGUgY2hhbmdlcy4gSWYgdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGEgcGFydGl0aW9uIHdpdGggYW4gZW1wdHkgJ2RhdGFIYW5kbGUnIHZhbHVlLFxuICogIHRoZSBwYXJ0aXRpb24gd2FzIGRlbGV0ZWQgYXQgdGhlIHZlcnNpb24gaW5kaWNhdGVkIGJ5IHRoZSAndmVyc2lvbicgZmllbGQgb2YgdGhlIHBhcnRpdGlvbiBvYmplY3QuXG4gKiAgSWYgYSBwYXJ0aXRpb24gd2FzIGNyZWF0ZWQgYW5kIGRlbGV0ZWQgYmV0d2VlbiB0aGUgdmVyc2lvbnMgc3BlY2lmaWVkIGluIHRoZSAnc3RhcnRWZXJzaW9uJyBhbmQgJ2VuZFZlcnNpb24nXG4gKiBwYXJhbWV0ZXJzLCB0aGUgcGFydGl0aW9uIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UuIEZvciBleGFtcGxlLCBpZiB5b3UgcmVxdWVzdCB2ZXJzaW9ucyAwIHRvIDEwLCBhbmQgYVxuICogcGFydGl0aW9uIHdhcyBjcmVhdGVkIGluIHZlcnNpb24gMyB0aGVuIGRlbGV0ZWQgaW4gdmVyc2lvbiA3LCBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgY2hhbmdlcyBmb3IgdGhlIHZlcnNpb24gb3IgdGltZSByYW5nZSBmb3IgdGhlIHNwZWNpZmljIHBhcnRpdGlvbihzKS5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBUaGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhXG4gKiAgdmFsaWQgbGF5ZXIgYWxyZWFkeSBjb25maWd1cmVkIGluIHRoZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBsYXllcnMgYXMgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHBhcnRpdGlvbiBUaGUgcGFydGl0aW9ucyB5b3Ugd2FudCB0byBpbmNsdWRlIGluIHRoZSByZXNwb25zZS4gVGhpcyBhbGxvd3MgeW91IHRvIGxpbWl0IHRoZSByZXNwb25zZSB0b1xuICogc3BlY2lmaWMgcGFydGl0aW9ucy4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIHBhcnRpdGlvbnMgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuIFRoZSBtYXhpbXVtXG4gKiAgbnVtYmVyIG9mIHBhcnRpdGlvbnMgcGVyIGNhbGwgaXMgMTAwLlxuICogQHBhcmFtIHN0YXJ0VmVyc2lvbiBTdGFydCB2ZXJzaW9uIGZvciB0aGUgY2F0YWxvZyAoZXhjbHVzaXZlKS4gQnkgY29udmVudGlvbiAtMSBpbmRpY2F0ZXMgdGhlIHZpcnR1YWwgaW5pdGlhbFxuICogIHZlcnNpb24gYmVmb3JlIHRoZSBmaXJzdCBwdWJsaWNhdGlvbiB3aGljaCB3aWxsIGhhdmUgdmVyc2lvbiAwLlxuICogQHBhcmFtIGVuZFZlcnNpb24gRW5kIHZlcnNpb24gKGluY2x1c2l2ZSkuIFRoaXMgaGFzIHRvIGJlIGEgdmFsaWQgY2F0YWxvZyB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiB0aGUgc3RhcnRWZXJzaW9uLlxuICogQHBhcmFtIHNpbmNlVGltZSBXaWxsIHJldHVybiBwYXJ0aXRpb25zIHdob3NlIGRhdGEgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhpcyB0aW1lLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2gsIGluY2x1c2l2ZS5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFkZGl0aW9uYWwgZmllbGRzIC0gJiN4NjA7ZGF0YVNpemUmI3g2MDssICYjeDYwO2NoZWNrc3VtJiN4NjA7LCAmI3g2MDtjb21wcmVzc2VkRGF0YVNpemUmI3g2MDsuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqICBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENoYW5nZXNCeUlkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2NoYW5nZXNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN0YXJ0VmVyc2lvblwiLCBwYXJhbXNbXCJzdGFydFZlcnNpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbmRWZXJzaW9uXCIsIHBhcmFtc1tcImVuZFZlcnNpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzaW5jZVRpbWVcIiwgcGFyYW1zW1wic2luY2VUaW1lXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFydGl0aW9uXCIsIHBhcmFtc1tcInBhcnRpdGlvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0cyBtZXRhZGF0YSBmb3Igc3BlY2lmaWMgcGFydGl0aW9uIGlkcy4gSWYgdGhlIGxheWVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBleGlzdCwgdGhlIHJlcXVlc3QgcmVzdWx0cyBpbiBhbiBlcnJvci5cbiAqIElmIGEgcGFydGl0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBleGlzdCwgdGhlIHJlc3BvbnNlIGRvZXMgbm90IGluY2x1ZGUgdGhpcyBwYXJ0aXRpb24uXG4gKiAgTWF4aW11biBhbGxvd2VkIG51bWJlciBvZiBwYXJ0aXRpb25zIGlkcyBwZXIgY2FsbCBpcyAxMDAuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBtZXRhZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4gVGhlIGNvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXJcbiAqICBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgbGF5ZXIgYWxyZWFkeSBjb25maWd1cmVkIGluIHRoZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24uXG4gKiAgWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIHBhcnRpdGlvbnMgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuXG4gKiBAcGFyYW0gcGFydGl0aW9uIFBhcnRpdGlvbiBpZHMgdG8gdXNlIGZvciBmaWx0ZXJpbmcuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZVxuICogIHBhcnRpdGlvbnMgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuIE1heGltdW0gYWxsb3dlZCBwYXJ0aXRpb25zIGlkcyBwZXIgY2FsbCBpcyAxMDAuXG4gKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZyBhZ2FpbnN0IHdoaWNoIHRvIHJ1biB0aGUgcXVlcnkuIE11c3QgYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24uXG4gKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBBZGRpdGlvbmFsIGZpZWxkcyAtICYjeDYwO2RhdGFTaXplJiN4NjA7LCAmI3g2MDtjaGVja3N1bSYjeDYwOywgJiN4NjA7Y29tcHJlc3NlZERhdGFTaXplJiN4NjA7XG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmdcbiAqICByZWNvcmRzIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpY1xuICogQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBhcnRpdGlvbnNCeUlkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3BhcnRpdGlvbnNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgcGFyYW1zW1wicGFydGl0aW9uXCJdLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcnRpdGlvblwiLCBpdGVtKTtcbiAgICB9KTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidmVyc2lvblwiLCBwYXJhbXNbXCJ2ZXJzaW9uXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXRzIG1ldGFkYXRhIGZvciB0aGUgcmVxdWVzdGVkIGluZGV4LiBPbmx5IGF2YWlsYWJsZSBmb3IgdmVyc2lvbmVkIGxheWVycyB3aGVyZSB0aGUgcGFydGl0aW9uaW5nIHNjaGVtZSBpcyBgaGVyZXRpbGVgLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgaW5kZXggbWV0YWRhdGEgb2YgdmVyc2lvbmVkXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4gQ29udGVudCBvZiB0aGlzXG4gKiBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIGxheWVyIGFscmVhZHkgY29uZmlndXJlZCBpbiB0aGUgY2F0YWxvZyBjb25maWd1cmF0aW9uLiBFeGFjdGx5IG9uZSBsYXllciBJRCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cgYWdhaW5zdCB3aGljaCB0byBydW4gdGhlIHF1ZXJ5LiBNdXN0IGJlIGEgdmFsaWQgY2F0YWxvZyB2ZXJzaW9uLlxuICogQHBhcmFtIHF1YWRLZXkgVGhlIGdlb21ldHJpYyBhcmVhIHNwZWNpZmllZCBieSBhbiBpbmRleCBpbiB0aGUgcmVxdWVzdCwgcmVwcmVzZW50ZWQgYXMgYSBIRVJFIHRpbGVcbiAqIEBwYXJhbSBkZXB0aCBUaGUgcmVjdXJzaW9uIGRlcHRoIG9mIHRoZSByZXNwb25zZS4gSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlc1xuICogIG9ubHkgZGF0YSBmb3IgdGhlIHF1YWRLZXkgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBJbiB0aGlzIHdheSwgZGVwdGggZGVzY3JpYmVzIHRoZVxuICogbWF4aW11bSBsZW5ndGggb2YgdGhlIHN1YlF1YWRLZXlzIGluIHRoZSByZXNwb25zZS4gVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGRlcHRoIHBhcmFtZXRlciBpcyA0LlxuICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgQWRkaXRpb25hbCBmaWVsZHMgLSAmI3g2MDtkYXRhU2l6ZSYjeDYwOywgJiN4NjA7Y2hlY2tzdW0mI3g2MDssICYjeDYwO2NvbXByZXNzZWREYXRhU2l6ZSYjeDYwO1xuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB1c2VkIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3Jkc1xuICogIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzIGFuZCAgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpY1xuICogIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcXVhZFRyZWVJbmRleChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS92ZXJzaW9ucy97dmVyc2lvbn0vcXVhZGtleXMve3F1YWRLZXl9L2RlcHRocy97ZGVwdGh9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcInt2ZXJzaW9ufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widmVyc2lvblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie3F1YWRLZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJxdWFkS2V5XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7ZGVwdGh9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkZXB0aFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJhZGRpdGlvbmFsRmllbGRzXCIsIHBhcmFtc1tcImFkZGl0aW9uYWxGaWVsZHNcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldHMgbWV0YWRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgaW5kZXguIE9ubHkgYXZhaWxhYmxlIGZvciB2b2xhdGlsZSBsYXllcnMgd2hlcmUgdGhlIHBhcnRpdGlvbmluZyBzY2hlbWUgaXMgYGhlcmV0aWxlYC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGluZGV4IG1ldGFkYXRhIGZvciB2b2xhdGlsZSBsYXllcnNcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYVxuICogIHZhbGlkIGxheWVyIGFscmVhZHkgY29uZmlndXJlZCBpbiB0aGUgY2F0YWxvZyBjb25maWd1cmF0aW9uLiBFeGFjdGx5IG9uZSBsYXllciBJRCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQHBhcmFtIHF1YWRLZXkgVGhlIGdlb21ldHJpYyBhcmVhIHNwZWNpZmllZCBieSBhbiBpbmRleCBpbiB0aGUgcmVxdWVzdCwgcmVwcmVzZW50ZWQgYXMgYSBIRVJFIHRpbGVcbiAqIEBwYXJhbSBkZXB0aCBUaGUgcmVjdXJzaW9uIGRlcHRoIG9mIHRoZSByZXNwb25zZS4gSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBvbmx5IGRhdGEgZm9yXG4gKiAgdGhlIHF1YWRLZXkgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBJbiB0aGlzIHdheSwgZGVwdGggZGVzY3JpYmVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc3ViUXVhZEtleXNcbiAqICBpbiB0aGUgcmVzcG9uc2UuIFRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgZm9yIHRoZSBkZXB0aCBwYXJhbWV0ZXIgaXMgNC5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFkZGl0aW9uYWwgZmllbGRzIC0gJiN4NjA7ZGF0YVNpemUmI3g2MDssICYjeDYwO2NoZWNrc3VtJiN4NjA7LCAmI3g2MDtjb21wcmVzc2VkRGF0YVNpemUmI3g2MDtcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdXNlZCB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzIGFuZCAgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzXG4gKiAgW0EtWmEtejAtOV0uIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBxdWFkVHJlZUluZGV4Vm9sYXRpbGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vcXVhZGtleXMve3F1YWRLZXl9L2RlcHRocy97ZGVwdGh9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntxdWFkS2V5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicXVhZEtleVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RlcHRofVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGVwdGhcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBpZiAocGFyYW1zW1wiYWRkaXRpb25hbEZpZWxkc1wiXSkge1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICB9XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuIGFuZCBpdHMgYWZmaWxpYXRlKHMpLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgY29udGFpbiBwcm9wcmlldGFyeSBpbmZvcm1hdGlvblxuICogY29udHJvbGxlZCBieSBIRVJFIGFuZCBhcmUgcHJvdGVjdGVkIGJ5IGFwcGxpY2FibGUgY29weXJpZ2h0IGxlZ2lzbGF0aW9uLlxuICogQW55IHVzZSBhbmQgdXRpbGl6YXRpb24gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgb3RoZXIgbWF0ZXJpYWxzIGFuZFxuICogZGlzY2xvc3VyZSB0byBhbnkgdGhpcmQgcGFydGllcyBpcyBjb25kaXRpb25hbCB1cG9uIGhhdmluZyBhIHNlcGFyYXRlXG4gKiBhZ3JlZW1lbnQgd2l0aCBIRVJFIGZvciB0aGUgYWNjZXNzLCB1c2UsIHV0aWxpemF0aW9uIG9yIGRpc2Nsb3N1cmUgb2YgdGhpc1xuICogc29mdHdhcmUuIEluIHRoZSBhYnNlbmNlIG9mIHN1Y2ggYWdyZWVtZW50LCB0aGUgdXNlIG9mIHRoZSBzb2Z0d2FyZSBpcyBub3RcbiAqIGFsbG93ZWQuXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZG9Db21taXRPZmZzZXRzID0gZG9Db21taXRPZmZzZXRzO1xuZXhwb3J0cy5jb25zdW1lRGF0YSA9IGNvbnN1bWVEYXRhO1xuZXhwb3J0cy5kZWxldGVTdWJzY3JpcHRpb24gPSBkZWxldGVTdWJzY3JpcHRpb247XG5leHBvcnRzLmVuZHBvaW50ID0gZW5kcG9pbnQ7XG5leHBvcnRzLmVuZHBvaW50QnlDb25zdW1lciA9IGVuZHBvaW50QnlDb25zdW1lcjtcbmV4cG9ydHMuc2Vla1RvT2Zmc2V0ID0gc2Vla1RvT2Zmc2V0O1xuZXhwb3J0cy5zdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4vKipcbiAqIFN0cmVhbSBBUEkgdjJcbiAqIFRoZSBgc3RyZWFtYCBzZXJ2aWNlIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGNvbnN1bWUgZGF0YSBmcm9tIGEgc3RyZWFtIGxheWVyLlxuICogV2l0aCB0aGlzIHNlcnZpY2UgeW91IGNhbiBzdWJzY3JpYmUgdG8gYSBzdHJlYW0gbGF5ZXIgYW5kIGNvbnN1bWUgbWVzc2FnZXMuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDIuMC4wXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKipcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQXBpXG4gKi9cbi8qKlxuICogQWZ0ZXIgcmVhZGluZyBkYXRhLCB5b3Ugc2hvdWxkIGNvbW1pdCB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IG1lc3NhZ2UgcmVhZCBmcm9tIGVhY2ggcGFydGl0aW9uIHNvXG4gKiB0aGF0IHlvdXIgYXBwbGljYXRpb24gY2FuIHJlc3VtZSByZWFkaW5nIG5ldyBtZXNzYWdlcyBmcm9tIHRoZSBjb3JyZWN0IHBhcnRpdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCB0aGVyZSBpcyBhXG4gKiBkaXNydXB0aW9uIHRvIHRoZSBzdWJzY3JpcHRpb24sIHN1Y2ggYXMgYW4gYXBwbGljYXRpb24gY3Jhc2guIEFuIG9mZnNldCBjYW4gYWxzbyBiZSB1c2VmdWwgaWYgeW91IGRlbGV0ZSBhIHN1YnNjcmlwdGlvblxuICogdGhlbiByZWNyZWF0ZSBhIHN1YnNjcmlwdGlvbiBmb3IgdGhlIHNhbWUgbGF5ZXIsIGJlY2F1c2UgdGhlIG5ldyBzdWJzY3JpcHRpb24gY2FuIHN0YXJ0IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBvZmZzZXQuXG4gKiBUbyByZWFkIG1lc3NhZ2VzIGFscmVhZHkgY29tbWl0dGVkLCB1c2UgdGhlIC9zZWVrIGVuZHBvaW50LCB0aGVuIHVzZSAvcGFydGl0aW9ucy5cbiAqIFRoZSBiYXNlIHBhdGggdG8gdXNlIGlzIHRoZSB2YWx1ZSBvZiAnbm9kZUJhc2VVUkwnIHJldHVybmVkIGZyb20gL3N1YnNjcmliZSBQT1NUIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgQ29tbWl0cyBvZmZzZXRzIG9mIHRoZSBsYXN0IG1lc3NhZ2UgcmVhZFxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gY29tbWl0T2Zmc2V0cyBUaGUgb2Zmc2V0cyB0byBjb21taXQuIEl0IHNob3VsZCBiZSBzYW1lIGFzIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UgeW91IHdpc2ggdG8gY29tbWl0LlxuICogRG8gbm90IHBhc3Mgb2Zmc2V0ICsgMSBhcyBtZW50aW9uZWQgaW4gS2Fma2EgQ29uc3VtZXIgZG9jdW1lbnRhdGlvbi4gVGhlIHNlcnZpY2UgYWRkcyBvbmUgdG8gdGhlIG9mZnNldCB5b3Ugc3BlY2lmeS5cbiAqIEBwYXJhbSBzdWJzY3JpcHRpb25JZCBUaGUgc3Vic2NyaXB0aW9uSWQgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG9mIHRoZSAvc3Vic2NyaWJlIHJlcXVlc3QgKHJlcXVpcmVkIGlmIG1vZGUmI3gzRDtwYXJhbGxlbCkuXG4gKiBAcGFyYW0gbW9kZSBUaGUgc3Vic2NyaXB0aW9uIG1vZGUgb2YgdGhpcyBzdWJzY3JpcHRpb25JZCAoYXMgcHJvdmlkZWQgaW4gL3N1YnNjcmliZSBQT1NUIEFQSSkuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSWQgVGhlIGNvcnJlbGF0aW9uLWlkICh2YWx1ZSBvZiBSZXNwb25zZSBIZWFkZXIgJiMzOTtYLUNvcnJlbGF0aW9uLUlkJiMzOTspIGZyb20gcHJpb3Igc3RlcCBpbiBwcm9jZXNzLlxuICogIFNlZSB0aGUgW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1hcGkvYXBpLXJlZmVyZW5jZS5odG1sKSBmb3IgdGhlICYjeDYwO3N0cmVhbSYjeDYwOyBBUElcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZG9Db21taXRPZmZzZXRzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L29mZnNldHNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN1YnNjcmlwdGlvbklkXCIsIHBhcmFtc1tcInN1YnNjcmlwdGlvbklkXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibW9kZVwiLCBwYXJhbXNbXCJtb2RlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImNvbW1pdE9mZnNldHNcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJjb21taXRPZmZzZXRzXCJdKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSWRcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JZFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENvbnN1bWVzIGRhdGEgZnJvbSBhIGxheWVyLiBSZXR1cm5zIG1lc3NhZ2VzIGZyb20gYSBzdHJlYW0gbGF5ZXIgZm9ybWF0dGVkIHNpbWlsYXIgdG8gYVxuICogW1BhcnRpdGlvbiBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1jbGllbnQtbGlicmFyeS9hcGlfcmVmZXJlbmNlX3NjYWxhL2luZGV4Lmh0bWwuUGFydGl0aW9uKS5cbiAqIElmIHRoZSBkYXRhIHNpemUgaXMgbGVzcyB0aGFuIDEgTUIsIHRoZSBgZGF0YWAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQuXG4gKiBJZiB0aGUgZGF0YSBzaXplIGlzIGdyZWF0ZXIgdGhhbiAxIE1CLCBhIGRhdGEgaGFuZGxlIHdpbGwgYmUgcmV0dXJuZWQgcG9pbnRpbmcgdG8gdGhlIG9iamVjdCBzdG9yZWQgaW4gdGhlIEJsb2Igc3RvcmUuXG4gKiBUaGUgYmFzZSBwYXRoIHRvIGJlIHVzZWQgaXMgdGhlIHZhbHVlIG9mICdub2RlQmFzZVVSTCcgcmV0dXJuZWQgZnJvbSAvc3Vic2NyaWJlIFBPU1QgcmVxdWVzdC5cbiAqXG4gKiBAc3VtbWFyeSBDb25zdW1lcyBkYXRhIGZyb20gYSBsYXllclxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uSWQgVGhlIHN1YnNjcmlwdGlvbklkIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBvZiB0aGUgL3N1YnNjcmliZSByZXF1ZXN0IChyZXF1aXJlZCBpZiBtb2RlJiN4M0Q7cGFyYWxsZWwpLlxuICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlIG9mIHRoaXMgc3Vic2NyaXB0aW9uSWQgKGFzIHByb3ZpZGVkIGluIC9zdWJzY3JpYmUgUE9TVCBBUEkpLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklkIFRoZSBjb3JyZWxhdGlvbi1pZCAodmFsdWUgb2YgUmVzcG9uc2UgSGVhZGVyICYjMzk7WC1Db3JyZWxhdGlvbi1JZCYjMzk7KSBmcm9tIHByaW9yIHN0ZXAgaW4gcHJvY2Vzcy5cbiAqIFNlZSB0aGUgW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1hcGkvYXBpLXJlZmVyZW5jZS5odG1sKSBmb3IgdGhlICYjeDYwO3N0cmVhbSYjeDYwOyBBUElcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uc3VtZURhdGEoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vcGFydGl0aW9uc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3Vic2NyaXB0aW9uSWRcIiwgcGFyYW1zW1wic3Vic2NyaXB0aW9uSWRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtb2RlXCIsIHBhcmFtc1tcIm1vZGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JZFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlkXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSWRcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBEZWxldGVzIGEgc3Vic2NyaXB0aW9uIHRvIGEgbGF5ZXIgKHRvcGljKS4gVGhpcyBvcGVyYXRpb24gcmVtb3ZlcyB0aGUgc3Vic2NyaXB0aW9uIGZyb20gdGhlIHNlcnZpY2UuXG4gKiBUaGUgYmFzZSBwYXRoIHRvIHVzZSBpcyB0aGUgdmFsdWUgb2YgJ25vZGVCYXNlVVJMJyByZXR1cm5lZCBmcm9tIC9zdWJzY3JpYmUgUE9TVCByZXF1ZXN0LlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZSBzdWJzY3JpcHRpb24gdG8gYSBsYXllclxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uSWQgVGhlIHN1YnNjcmlwdGlvbklkIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBvZiB0aGUgL3N1YnNjcmliZSByZXF1ZXN0IChyZXF1aXJlZCBpZiBtb2RlJiN4M0Q7cGFyYWxsZWwpLlxuICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlIG9mIHRoaXMgc3Vic2NyaXB0aW9uSWQgKGFzIHByb3ZpZGVkIGluIC9zdWJzY3JpYmUgUE9TVCBBUEkpLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklkIEEgdHJhY2UgSUQgdG8gdXNlIHRvIGFzc29jaWF0ZSB0aGlzIHJlcXVlc3Qgd2l0aCBvdGhlciByZXF1ZXN0cyBpbiB5b3VyIHByb2Nlc3MuXG4gKiBUaGUgY29ycmVsYXRpb24gSUQgaXMgdGhlIHZhbHVlIG9mIHRoZSByZXNwb25zZSBoZWFkZXIgJiN4NjA7WC1Db3JyZWxhdGlvbi1JZCYjeDYwOyBmcm9tIHRoZSBwcmlvciByZXF1ZXN0IGluIHlvdXIgcHJvY2Vzcy5cbiAqIE9uY2UgeW91IHVzZSBhIGNvcnJlbGF0aW9uIElEIGluIGEgJiN4NjA7L2RlbGV0ZSYjeDYwOyByZXF1ZXN0LCBkbyBub3QgdXNlIGl0IGFnYWluIHNpbmNlICYjeDYwOy9kZWxldGUmI3g2MDsgbWFya3MgdGhlIGVuZCBvZiBhIHByb2Nlc3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVN1YnNjcmlwdGlvbihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9zdWJzY3JpYmVcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN1YnNjcmlwdGlvbklkXCIsIHBhcmFtc1tcInN1YnNjcmlwdGlvbklkXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibW9kZVwiLCBwYXJhbXNbXCJtb2RlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSWRcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JZFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgS2Fma2EgQnJva2VyIFVSTCdzLCBjbGllbnQgSUQgKHJlcXVpcmVkIHRvIGVuZm9yY2UgcXVvdGFzKSwgYW5kIEdyb3VwIElEIHByZWZpeC4gVHlwZSBpcyBzZXQgdG8gYSBjb25zdW1lci5cbiAqXG4gKiBAc3VtbWFyeSBFeHBvc2UgdGhlIGVuZHBvaW50IHRvIGNvbnN1bWUgdGhlIGRhdGEgb2YgdGhlIGxheWVyIGRpcmVjdGx5XG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5kcG9pbnQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZW5kcG9pbnRcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogRXhwb3NlcyB0aGUgZW5kcG9pbnQgdG8gdXNlIHRvIHByb2R1Y2UgYW5kIGNvbnN1bWUgdGhlIGRhdGEgb2YgdGhlIGxheWVyIGRpcmVjdGx5LCBwZXIgdHlwZSBvZiB1c2VyIC0gY29uc3VtZXIgb3IgcHJvZHVjZXIuXG4gKiBJdCByZXR1cm5zIGEgbGlzdCBvZiBLYWZrYSBCcm9rZXIgVVJMJ3MsIGNsaWVudCBJRCAocmVxdWlyZWQgdG8gZW5mb3JjZSBxdW90YXMpLCBhbmQgR3JvdXAgSUQgcHJlZml4LlxuICpcbiAqIEBzdW1tYXJ5IEV4cG9zZXMgdGhlIGVuZHBvaW50IHRvIHVzZSB0byBwcm9kdWNlIGFuZCBjb25zdW1lIHRoZSBkYXRhIG9mIHRoZSBsYXllciBkaXJlY3RseVxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gdHlwZSBJZGVudGlmaWVzIHdoZXRoZXIgdGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGFyZSBmb3IgYSBwcm9kdWNlciBvciBjb25zdW1lci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5kcG9pbnRCeUNvbnN1bWVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3t0eXBlfS9lbmRwb2ludFwiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7dHlwZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInR5cGVcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBFbmFibGVzIHlvdSB0byBzdGFydCByZWFkaW5nIGRhdGEgZnJvbSBhIHNwZWNpZmllZCBvZmZzZXQuXG4gKiBZb3UgY2FuIG1vdmUgdGhlIG1lc3NhZ2UgcG9pbnRlciB0byBhbnkgb2Zmc2V0IGluIHRoZSBsYXllciAodG9waWMpLlxuICogTWVzc2FnZSBjb25zdW1wdGlvbiB3aWxsIHN0YXJ0IGZyb20gdGhhdCBvZmZzZXQuXG4gKiBPbmNlIHlvdSBzZWVrIHRvIGFuIG9mZnNldCwgdGhlcmUgaXMgbm8gcmV0dXJuaW5nIHRvIHRoZSBpbml0aWFsIG9mZnNldCwgdW5sZXNzIHRoZSBpbml0aWFsIG9mZnNldCBpcyBzYXZlZC5cbiAqIFRoZSBiYXNlIHBhdGggdG8gdXNlIGlzIHRoZSB2YWx1ZSBvZiAnbm9kZUJhc2VVUkwnIHJldHVybmVkIGZyb20gL3N1YnNjcmliZSBQT1NUIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgU2VlayB0byBwcmVkZWZpbmVkIG9mZnNldC5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgc3RyZWFtIGxheWVyLlxuICogQHBhcmFtIHNlZWtPZmZzZXRzIExpc3Qgb2Ygb2Zmc2V0cyBhbmQgb2Zmc2V0IHBhcnRpdGlvbnNcbiAqIEBwYXJhbSBzdWJzY3JpcHRpb25JZCBUaGUgc3Vic2NyaXB0aW9uSWQgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG9mIHRoZSAvc3Vic2NyaWJlIHJlcXVlc3QgKHJlcXVpcmVkIGlmIG1vZGUmI3gzRDtwYXJhbGxlbCkuXG4gKiBAcGFyYW0gbW9kZSBUaGUgc3Vic2NyaXB0aW9uIG1vZGUgb2YgdGhpcyBzdWJzY3JpcHRpb25JZCAoYXMgcHJvdmlkZWQgaW4gL3N1YnNjcmliZSBQT1NUIEFQSSkuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSWQgVGhlIGNvcnJlbGF0aW9uLWlkICh2YWx1ZSBvZiBSZXNwb25zZSBIZWFkZXIgJiMzOTtYLUNvcnJlbGF0aW9uLUlkJiMzOTspIGZyb20gcHJpb3Igc3RlcCBpbiBwcm9jZXNzLlxuICogU2VlIHRoZSBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLXN0b3JlL2FwaS1yZWZlcmVuY2UuaHRtbCkgZm9yIHRoZSAmI3g2MDtzdHJlYW0mI3g2MDsgQVBJXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlZWtUb09mZnNldChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9zZWVrXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdWJzY3JpcHRpb25JZFwiLCBwYXJhbXNbXCJzdWJzY3JpcHRpb25JZFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm1vZGVcIiwgcGFyYW1zW1wibW9kZVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJzZWVrT2Zmc2V0c1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcInNlZWtPZmZzZXRzXCJdKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSWRcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JZFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEVuYWJsZXMgbWVzc2FnZSBjb25zdW1wdGlvbiBmcm9tIGEgc3BlY2lmaWMgc3RyZWFtIGxheWVyICh0b3BpYykuXG4gKiBVc2UgdGhlIGJhc2UgcGF0aCByZXR1cm5lZCBmcm9tIHRoZSBBUEkgTG9va3VwIHNlcnZpY2UuIE5vdGU6IEZvciAqKm1vZGUgPSBwYXJhbGxlbCoqLFxuICogb25lIHVuaXQgb2YgcGFyYWxsZWxpc20gY3VycmVudGx5IGVxdWFscyAxIE1CcHMgaW5ib3VuZCBvciAyIE1CcHMgb3V0Ym91bmQsIHdoaWNoZXZlciBpcyBncmVhdGVyLCByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXG4gKiBUaGUgbnVtYmVyIG9mIHN1YnNjcmlwdGlvbnMgd2l0aGluIHRoZSBzYW1lIGdyb3VwIGNhbm5vdCBleGNlZWQgdGhlIHBhcmFsbGVsaXNtIGFsbG93ZWQuXG4gKiBGb3IgbW9yZSBkZXRhaWxzIHNlZVxuICogW0dldCBEYXRhIGZyb20gYSBTdHJlYW0gTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1hcGkvZGF0YV9kZXZfZ3VpZGUvcmVzdC9nZXR0aW5nLWRhdGEtc3RyZWFtLmh0bWwpLlxuICpcbiAqIEBzdW1tYXJ5IEVuYWJsZSBtZXNzYWdlIGNvbnN1bXB0aW9uIGZyb20gYSBzcGVjaWZpYyBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSBtb2RlIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBzZXJpYWwgb3IgcGFyYWxsZWwgc3Vic2NyaXB0aW9uIG1vZGUuIEZvciBtb3JlIGRldGFpbHMgc2VlXG4gKiBbR2V0IERhdGEgZnJvbSBhIFN0cmVhbSBMYXllcl0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9kYXRhX2Rldl9ndWlkZS9yZXN0L2dldHRpbmctZGF0YS1zdHJlYW0uaHRtbCkuXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uSWQgSW5jbHVkZSB0aGlzIHBhcmFtZXRlciBpZiB5b3Ugd2FudCB0byBsb29rIHVwIHRoZSAmI3g2MDtub2RlQmFzZVVSTCYjeDYwOyBmb3IgYSBnaXZlbiBzdWJzY3JpcHRpb25JZC5cbiAqIEBwYXJhbSBjb25zdW1lcklkIFRoZSBJRCB0byB1c2UgdG8gaWRlbnRpZnkgdGhpcyBjb25zdW1lci4gSXQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBjb25zdW1lciBncm91cC5cbiAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSBvbmUsIHRoZSBzeXN0ZW0gd2lsbCBnZW5lcmF0ZSBvbmUuXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uUHJvcGVydGllcyBPbmUgb3IgbW9yZSBLYWZrYSBDb25zdW1lciBwcm9wZXJ0aWVzIHRvIHVzZSBmb3IgdGhpcyBzdWJzY3JpcHRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbiAqIFtHZXQgRGF0YSBmcm9tIGEgU3RyZWFtIExheWVyXShodHRwczovL2RldmVsb3Blci5oZXJlLmNvbS9kb2N1bWVudGF0aW9uL2RhdGEtYXBpL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLXN0cmVhbS5odG1sKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3Vic2NyaWJlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3N1YnNjcmliZVwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibW9kZVwiLCBwYXJhbXNbXCJtb2RlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3Vic2NyaXB0aW9uSWRcIiwgcGFyYW1zW1wic3Vic2NyaXB0aW9uSWRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb25zdW1lcklkXCIsIHBhcmFtc1tcImNvbnN1bWVySWRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcInN1YnNjcmlwdGlvblByb3BlcnRpZXNcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBrYWZrYUNvbnN1bWVyUHJvcGVydGllczogcGFyYW1zW1wic3Vic2NyaXB0aW9uUHJvcGVydGllc1wiXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2hlY2tIYW5kbGVFeGlzdHMgPSBjaGVja0hhbmRsZUV4aXN0cztcbmV4cG9ydHMuZGVsZXRlVm9sYXRpbGVCbG9iID0gZGVsZXRlVm9sYXRpbGVCbG9iO1xuZXhwb3J0cy5nZXRWb2xhdGlsZUJsb2IgPSBnZXRWb2xhdGlsZUJsb2I7XG5leHBvcnRzLnB1dFZvbGF0aWxlQmxvYiA9IHB1dFZvbGF0aWxlQmxvYjtcbi8qKlxuICogVm9sYXRpbGUgQmxvYiBBUEkgdjFcbiAqIFRoZSBgdm9sYXRpbGUtYmxvYmAgc2VydmljZSBzdXBwb3J0cyB0aGUgdXBsb2FkIGFuZCByZXRyaWV2YWwgb2Ygdm9sYXRpbGUgZGF0YSBmcm9tIHRoZSBzdG9yYWdlIG9mIGEgY2F0YWxvZy5cbiAqIEVhY2ggZGlzY3JldGUgY2h1bmsgb2YgZGF0YSBpcyBzdG9yZWQgYXMgYSBibG9iIChCaW5hcnkgTGFyZ2UgT2JqZWN0KS5cbiAqIEVhY2ggYmxvYiBoYXMgaXRzIG93biB1bmlxdWUgaWQgKGRhdGEgaGFuZGxlKSB3aGljaCBpcyBzdG9yZWQgYXMgcGFydGl0aW9uIG1ldGFkYXRhLlxuICogVG8gZ2V0IGEgcGFydGl0aW9uJ3MgZGF0YSwgeW91IGZpcnN0IHVzZSBgbWV0YWRhdGFgIHNlcnZpY2UgdG8gcmV0cmlldmVcbiAqIHRoZSBwYXJ0aXRpb24ncyBtZXRhZGF0YSAoZGF0YSBoYW5kbGUpIHdpdGggdGhlIGFkZHJlc3NlcyBvZiB0aGUgcmVsZXZhbnQgYmxvYnMuXG4gKiBZb3UgdGhlbiB1c2UgdGhvc2UgYWRkcmVzc2VzIHRvIHB1bGwgdGhlIGRhdGEgdXNpbmcgdGhlIGB2b2xhdGlsZS1ibG9iYCBzZXJ2aWNlLlxuICogVW5saWtlIHRoZSBgYmxvYmAgc2VydmljZSwgZGF0YSBoYW5kbGVzIGNhbiBiZSBvdmVyd3JpdHRlbi4gSGVuY2UgdGhlIHZvbGF0aWxlIGFzcGVjdC5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjFcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFZvbGF0aWxlQmxvYkFwaVxuICovXG4vKipcbiAqIENoZWNrcyBpZiBhIHZvbGF0aWxlIGJsb2IgZXhpc3RzIGZvciB0aGUgcmVxdWVzdGVkIGRhdGEgaGFuZGxlLlxuICpcbiAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhIGRhdGEgaGFuZGxlIGV4aXN0c1xuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSB2b2xhdGlsZSBibG9iIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIHZvbGF0aWxlIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2ImIzM5O3MgY29udGVudHMuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tIYW5kbGVFeGlzdHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlbGV0ZXMgYSB2b2xhdGlsZSBkYXRhIGJsb2IgZnJvbSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSAodm9sdW1lKS5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgdm9sYXRpbGUgZGF0YSBibG9iXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIHZvbGF0aWxlIGRhdGEgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUgdm9sYXRpbGUgZGF0YSBibG9iIHdoaWNoIGNvbnRlbnRzIHdpbGwgYmUgZGVsZXRlZC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVWb2xhdGlsZUJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlcyBhIHZvbGF0aWxlIGRhdGEgYmxvYiBmcm9tIHN0b3JhZ2UuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBhIHZvbGF0aWxlIGJsb2JcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIHZvbGF0aWxlIGRhdGEgYmxvYi5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgdm9sYXRpbGUgZGF0YSBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJiMzOTtzIGNvbnRlbnRzLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Vm9sYXRpbGVCbG9iKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBQZXJzaXN0cyB0aGUgdm9sYXRpbGUgZGF0YSBibG9iIGluIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtICh2b2x1bWUpLlxuICpcbiAqIEBzdW1tYXJ5IFB1Ymxpc2hlcyBhIHZvbGF0aWxlIGRhdGEgYmxvYlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSB2b2xhdGlsZSBkYXRhIGJsb2IgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHZvbGF0aWxlIGRhdGEgYmxvYi5cbiAqIEBwYXJhbSBib2R5IFRoZSBkYXRhIHRvIHVwbG9hZCBhcyBwYXJ0IG9mIHRoZSBibG9iLiBTaXplIGxpbWl0OiAyIE1CXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHV0Vm9sYXRpbGVCbG9iKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2xpYlwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5ID0gdm9pZCAwO1xuLyoqXG4gKiBDYWNoZXMgdGhlIHBhcnRpdGlvbnMgbWV0YWRhdGEgdXNpbmcgYSBrZXktdmFsdWUgcGFpci5cbiAqL1xuY2xhc3MgTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkge1xuICAgIGNhY2hlO1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgW1tNZXRhZGF0YUNhY2hlUmVwb3NpdG9yeV1dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhY2hlIFRoZSBbW0tleVZhbHVlQ2FjaGVdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW01ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2FjaGUpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHV0KHJxLCBocm4sIGxheWVySWQsIHBhcnRpdGlvbnMsIHZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgcGFydGl0aW9uc0lkcyA9IHJxLmdldFBhcnRpdGlvbklkcygpO1xuICAgICAgICBsZXQga2V5O1xuICAgICAgICBpZiAocGFydGl0aW9uc0lkcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBtZXRhZGF0YSBvZiBwYXJ0aXRpb25zKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gdGhpcy5jcmVhdGVLZXkoe1xuICAgICAgICAgICAgICAgICAgICBocm4sXG4gICAgICAgICAgICAgICAgICAgIGxheWVySWQsXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbklkOiBtZXRhZGF0YS5wYXJ0aXRpb25cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlLnB1dChrZXksIEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBrZXkgPSB0aGlzLmNyZWF0ZUtleSh7XG4gICAgICAgICAgICBocm4sXG4gICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgdmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUucHV0KGtleSwgSlNPTi5zdHJpbmdpZnkocGFydGl0aW9ucykpO1xuICAgIH1cbiAgICBnZXQocnEsIGhybiwgbGF5ZXJJZCwgdmVyc2lvbikge1xuICAgICAgICBjb25zdCBwYXJ0aXRpb25zSWRzID0gcnEuZ2V0UGFydGl0aW9uSWRzKCk7XG4gICAgICAgIGxldCBrZXk7XG4gICAgICAgIGlmIChwYXJ0aXRpb25zSWRzKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVQYXJ0aXRpb25zID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhcnRpdGlvbklkIG9mIHBhcnRpdGlvbnNJZHMpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLmNyZWF0ZUtleSh7XG4gICAgICAgICAgICAgICAgICAgIGhybixcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uSWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkUGFydGl0aW9uID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplZFBhcnRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVQYXJ0aXRpb25zLnB1c2goSlNPTi5wYXJzZShzZXJpYWxpemVkUGFydGl0aW9uKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnNJZHMubGVuZ3RoICE9PSBhdmFpbGFibGVQYXJ0aXRpb25zLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBZGRpdGlvbmFsRmllbGRzQXZhaWxhYmxlKGF2YWlsYWJsZVBhcnRpdGlvbnMsIHJxLmdldEFkZGl0aW9uYWxGaWVsZHMoKSkpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBJbiB0aGUgY2FzZSB3aGVuIG5vdCBhbGwgcGFydGl0aW9ucyBhcmUgYXZhaWxhYmxlLCBvciBzb21lIG9mIHBhcnRpdGlvbiBoYXMgbm90IHJlcXVlc3RlZCBhIHNvbWUgb2YgYWRkaXRpb25hbCBmaWVsZCxcbiAgICAgICAgICAgICAgICAgKiB3ZSBmYWlsIHRoZSBjYWNoZSBsb29rdXAuXG4gICAgICAgICAgICAgICAgICogVGhpcyBjYW4gYmUgZW5oYW5jZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZVBhcnRpdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAga2V5ID0gdGhpcy5jcmVhdGVLZXkoe1xuICAgICAgICAgICAgaHJuLFxuICAgICAgICAgICAgbGF5ZXJJZCxcbiAgICAgICAgICAgIHZlcnNpb25cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRQYXJ0aXRpb25zID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWRQYXJ0aXRpb25zXG4gICAgICAgICAgICA/IEpTT04ucGFyc2Uoc2VyaWFsaXplZFBhcnRpdGlvbnMpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3JlYXRlS2V5KHBhcmFtcykge1xuICAgICAgICByZXR1cm4gKGAke3BhcmFtcy5ocm59Ojoke3BhcmFtcy5sYXllcklkfTo6YCArXG4gICAgICAgICAgICAocGFyYW1zLnZlcnNpb24gPyBgJHtwYXJhbXMudmVyc2lvbn06OmAgOiBcIlwiKSArXG4gICAgICAgICAgICAocGFyYW1zLnBhcnRpdGlvbklkXG4gICAgICAgICAgICAgICAgPyBgJHtwYXJhbXMucGFydGl0aW9uSWR9OjpwYXJ0aXRpb25gXG4gICAgICAgICAgICAgICAgOiBcInBhcnRpdGlvbnNcIikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgYWxsIGNhY2hlZCBwYXJ0aXRpb25zIHdpdGggYWRkaXRpb25hbCBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FjaGVkUGFydGl0aW9ucyBUaGUgYXJyYXkgb2YgdGhlIGNhY2hlZCBwYXJ0aXRpb25zXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgdGhlIGFycmF5IG9mIHRoZSByZXF1ZXN0ZWQgYWRkaXRpb25hbCBmaWVsZHMuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiBzb21lIG9mIHRoZSBjYWNoZWQgcGFydGl0aW9uIGRvZXMgbm90IGhhdmUgc29tZSBhZGRpdGlvbmFsIGZpZWxkLlxuICAgICAqIEZhbHNlIG90aGVyd2lzZSBvciBpZiBhbnkgYWRkaXRpb25hbEZpZWxkcyBoYXMgbm90IGJlZW4gcmVxdWVzdGVkLlxuICAgICAqL1xuICAgIGNoZWNrQWRkaXRpb25hbEZpZWxkc0F2YWlsYWJsZShjYWNoZWRQYXJ0aXRpb25zLCBhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsRmllbGRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNhY2hlZFBhcnRpdGlvbiBvZiBjYWNoZWRQYXJ0aXRpb25zKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFkZGl0aW9uYWxGaWVsZCBvZiBhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZWRQYXJ0aXRpb24uaGFzT3duUHJvcGVydHkoYWRkaXRpb25hbEZpZWxkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydHMuTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkgPSBNZXRhZGF0YUNhY2hlUmVwb3NpdG9yeTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeSA9IHZvaWQgMDtcbi8qKlxuICogQ2FjaGVzIHRoZSBRdWFkVHJlZUluZGV4IHVzaW5nIGEga2V5LXZhbHVlIHBhaXIuXG4gKi9cbmNsYXNzIFF1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnkge1xuICAgIGNhY2hlO1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgW1tRdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FjaGUgVGhlIFtbS2V5VmFsdWVDYWNoZV1dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gVGhlIFtbUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeV1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhY2hlKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcmVzIGEga2V5LXZhbHVlIHBhaXIgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1dChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUucHV0KHRoaXMuY3JlYXRlS2V5KHBhcmFtcyksIEpTT04uc3RyaW5naWZ5KHBhcmFtcy50cmVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBRdWFkVHJlZUluZGV4IGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBbW1F1YWRUcmVlSW5kZXhDYWNoZVBhcmFtc11dIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIFRoZSBRdWFkVHJlZUluZGV4IGZvciB0aGUgVGlsZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSBRdWFkVHJlZUluZGV4IGRvZXMgbm90IGV4aXN0LlxuICAgICAqL1xuICAgIGdldChwYXJhbXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jcmVhdGVLZXkocGFyYW1zKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFRyZWUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZFRyZWUgPyBKU09OLnBhcnNlKHNlcmlhbGl6ZWRUcmVlKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3JlYXRlS2V5KHBhcmFtcykge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gcGFyYW1zLnZlcnNpb24gIT09IHVuZGVmaW5lZCA/IGA6OiR7cGFyYW1zLnZlcnNpb259YCA6IFwiXCI7XG4gICAgICAgIHJldHVybiBgJHtwYXJhbXMuaHJufTo6JHtwYXJhbXMubGF5ZXJJZH06OiR7cGFyYW1zLnJvb3QudG9IZXJlVGlsZSgpfSR7dmVyc2lvbn06OiR7cGFyYW1zLmRlcHRofTo6cXVhZHRyZWVgO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeSA9IFF1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL01ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5XCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BcnRpZmFjdENsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIEdldHMgc2NoZW1hIG1ldGFkYXRhIGFuZCBkYXRhIGZyb20gdGhlIHBsYXRmb3JtIEFydGlmYWN0IFNlcnZpY2UuXG4gKi9cbmNsYXNzIEFydGlmYWN0Q2xpZW50IHtcbiAgICBzZXR0aW5ncztcbiAgICBhcGlWZXJzaW9uID0gXCJ2MVwiO1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgY2xpZW50IHRvIHdvcmsgd2l0aCBzY2hlbWFzIGRhdGEgaW4gdGhlIHBsYXRmb3JtIEFydGlmYWN0IFNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW0FydGlmYWN0Q2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHNjaGVtYSBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWFEZXRhaWxzUmVxdWVzdCBUaGUgW1tTY2hlbWFEZXRhaWxzUmVxdWVzdF1dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gQW4gb2JqZWN0IHdpdGggdGhlIHNjaGVtYSBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRTY2hlbWFEZXRhaWxzKHNjaGVtYURldGFpbHNSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGhybiA9IHNjaGVtYURldGFpbHNSZXF1ZXN0LmdldFNjaGVtYSgpO1xuICAgICAgICBpZiAoIWhybikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgUGxlYXNlIHByb3ZpZGUgdGhlIHNjaGVtYSBIUk4gYnkgc2NoZW1hRGV0YWlsc1JlcXVlc3Qud2l0aFNjaGVtYSgpYCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhyblN0ciA9IGhybi50b1N0cmluZygpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwiYXJ0aWZhY3RcIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQXJ0aWZhY3RBcGkuZ2V0U2NoZW1hVXNpbmdHRVQocmVxdWVzdCwge1xuICAgICAgICAgICAgc2NoZW1hSHJuOiBocm5TdHJcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgc2NoZW1hIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2NoZW1hUmVxdWVzdCBUaGUgW1tTY2hlbWFSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBBIGJsb2Igd2l0aCB0aGUgc2NoZW1hLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFNjaGVtYShzY2hlbWFSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSBzY2hlbWFSZXF1ZXN0LmdldFZhcmlhbnQoKTtcbiAgICAgICAgaWYgKCF2YXJpYW50KSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBQbGVhc2UgcHJvdmlkZSB0aGUgc2NoZW1hIHZhcmlhbnQgYnkgc2NoZW1hUmVxdWVzdC53aXRoVmFyaWFudCgpYCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJhcnRpZmFjdFwiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQXJ0aWZhY3RBcGkuZ2V0QXJ0aWZhY3RVc2luZ0dFVChyZXF1ZXN0LCB7XG4gICAgICAgICAgICBhcnRpZmFjdEhybjogdmFyaWFudC51cmxcbiAgICAgICAgfSkuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHtcbiAgICAgICAgICAgICAgICA0MDA6IFwiQmFkIHJlcXVlc3RcIixcbiAgICAgICAgICAgICAgICA0MDE6IFwiWW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB2aWV3IHRoZSBzY2hlbWFcIixcbiAgICAgICAgICAgICAgICA0MDM6IFwiQWNjZXNzaW5nIHRoZSBzY2hlbWEgaXMgZm9yYmlkZGVuXCIsXG4gICAgICAgICAgICAgICAgNDA0OiBcIlRoZSBzY2hlbWEgd2FzIG5vdCBmb3VuZFwiLFxuICAgICAgICAgICAgICAgIDUwMDogXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5zdGF0dXNUZXh0IHx8IG1lc3NhZ2VzW2Vycm9yLnN0YXR1c107XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBBcnRpZmFjdCBTZXJ2aWNlIGVycm9yOiBIVFRQICR7ZXJyb3Iuc3RhdHVzfTogJHttZXNzYWdlfWApKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgIH1cbn1cbmV4cG9ydHMuQXJ0aWZhY3RDbGllbnQgPSBBcnRpZmFjdENsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYXRhbG9nQ2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IENhdGFsb2dWZXJzaW9uUmVxdWVzdF8xID0gcmVxdWlyZShcIi4vQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XCIpO1xuLyoqXG4gKiBJbnRlcmFjdHMgd2l0aCB0aGUgYERhdGFTdG9yZWAgY2F0YWxvZy5cbiAqL1xuY2xhc3MgQ2F0YWxvZ0NsaWVudCB7XG4gICAgc2V0dGluZ3M7XG4gICAgYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICBocm47XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyB0aGUgW1tDYXRhbG9nQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nLlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gVGhlIFtbQ2F0YWxvZ0NsaWVudF1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhdGFsb2dIcm4sIHNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5ocm4gPSBjYXRhbG9nSHJuLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWRzIGFuZCBjYWNoZXMgdGhlIGZ1bGwgY2F0YWxvZyBjb25maWd1cmF0aW9uIGZvciB0aGUgcmVxdWVzdGVkIGNhdGFsb2cuXG4gICAgICogVGhlIGNhdGFsb2cgY29uZmlndXJhdGlvbiBjb250YWlucyBkZXNjcmlwdGl2ZSBhbmQgc3RydWN0dXJhbFxuICAgICAqIGluZm9ybWF0aW9uIHN1Y2ggYXMgbGF5ZXIgZGVmaW5pdGlvbnMgYW5kIGxheWVyIHR5cGVzLlxuICAgICAqXG4gICAgICogQHN1bW1hcnkgR2V0cyBkZXRhaWxzIGFib3V0IHRoZSByZXF1ZXN0ZWQgY2F0YWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBbW0NhdGFsb2dSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJlZCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY2F0YWxvZyBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRDYXRhbG9nKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwiY29uZmlnXCIsIHVuZGVmaW5lZCwgYWJvcnRTaWduYWwpO1xuICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5Db25maWdBcGkuZ2V0Q2F0YWxvZyhidWlsZGVyLCB7XG4gICAgICAgICAgICBjYXRhbG9nSHJuOiB0aGlzLmhybixcbiAgICAgICAgICAgIGJpbGxpbmdUYWc6IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG1pbmltdW0gdmVyc2lvbiBmb3IgdGhlIGdpdmVuIGNhdGFsb2cuIElmIHRoZSBjYXRhbG9nIGRvZXNuJ3QgY29udGFpbiBhbnkgdmVyc2lvbnMgZXJyb3Igd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBJcyBbW0NhdGFsb2dWZXJzaW9uUmVxdWVzdF1dIGluc3RhbmNlIGFuZCBoYXMgKChnZXRCaWxsaW5nVGFnKSkgbWV0aG9kLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIGEgRmV0Y2gpXG4gICAgICogYW5kIGFib3J0IGl0IGlmIHJlcXVpcmVkIHZpYSBhbiBBYm9ydENvbnRyb2xsZXIgb2JqZWN0LlxuICAgICAqICBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydFNpZ25hbFxuICAgICAqICBAcmV0dXJucyBBIHByb21pc2Ugb2YgdGhlIGh0dHAgcmVzcG9uc2UgdGhhdCBjb250YWlucyB0aGUgcG1pbmltdW0gdmVyc2lvbiBmb3IgdGhlIGdpdmVuIGNhdGFsb2cuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0RWFybGllc3RWZXJzaW9uKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwibWV0YWRhdGFcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIGNvbnN0IGVhcmxpZXN0VmVyc2lvbiA9IGF3YWl0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubWluaW11bVZlcnNpb24oYnVpbGRlciwge1xuICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZWFybGllc3RWZXJzaW9uLnZlcnNpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGxheWVyIHZlcnNpb25zIGZvciB0aGUgY2F0YWxvZyB2ZXJzaW9uLiBJdCB3aWxsIHJldHVybiBhcnJheSB3aXRoXG4gICAgICogYWxsIGNhdGFsb2cgbGF5ZXJzIGFuZCBsYXRlc3QgdmVyc2lvbiBmb3IgZWFjaCBsYXllciBvciByZXR1cm4gZXJyb3IgaWYgdGhlIGNhdGFsb2cgZG9lcyBub3RcbiAgICAgKiBoYXZlIGFueSB2ZXJzaW9ucyBvciBpZiB0aGUgdmVyc2lvbiBwYXNzZWQgaW4gdGhlIHF1ZXJ5IHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC4gSWYgYSBsYXllclxuICAgICAqIGRvZXMgbm90IGhhdmUgYW55IGRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBpdCBpcyBleGNsdWRlZCBmcm9tIHRoZSByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IElzIFtbTGF5ZXJWZXJzaW9uc1JlcXVlc3RdXSBpbnN0YW5jZSBhbmQgaGFzICgoZ2V0VmVyc2lvbikpIG1ldGhvZC5cbiAgICAgKiBWZXJzaW9uIC0gY2F0YWxvZyB2ZXJzaW9uIHRvIGdldCBhbGwgcmVsYXRlZCBsYXllcnMgdmVyc2lvbnMuIElmIG5vdCBkZWZpbmVkLCB0aGVuIHRoZSB2ZXJzaW9uIHdpbGwgYmUgdGhlIGxhdGVzdCBjYXRhbG9nIHZlcnNpb24uXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgYSBGZXRjaClcbiAgICAgKiBhbmQgYWJvcnQgaXQgaWYgcmVxdWlyZWQgdmlhIGFuIEFib3J0Q29udHJvbGxlciBvYmplY3QuXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIG9mIHRoZSBodHRwIHJlc3BvbnNlIHRoYXQgY29udGFpbnMgYW4gYXJyYXkgd2l0aCBhbGwgY2F0YWxvZyBsYXllcnMgYW5kIGxhdGVzdCB2ZXJzaW9uIGZvciBlYWNoIGxheWVyLlxuICAgICAqL1xuICAgIGFzeW5jIGdldExheWVyVmVyc2lvbnMocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgbGV0IHJlcXVlc3RlZENhdGFsb2dWZXJzaW9uID0gcmVxdWVzdC5nZXRWZXJzaW9uKCk7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWRDYXRhbG9nVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBiaWxsaW5ndGFnID0gcmVxdWVzdC5nZXRCaWxsaW5nVGFnKCk7XG4gICAgICAgICAgICBjb25zdCBjYXRhbG9nVmVyc2lvblJlcXVlc3QgPSBuZXcgQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XzEuQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0KCk7XG4gICAgICAgICAgICBpZiAoYmlsbGluZ3RhZykge1xuICAgICAgICAgICAgICAgIGNhdGFsb2dWZXJzaW9uUmVxdWVzdC53aXRoQmlsbGluZ1RhZyhiaWxsaW5ndGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcXVlc3RlZENhdGFsb2dWZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRMYXRlc3RWZXJzaW9uKGNhdGFsb2dWZXJzaW9uUmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcXVlc3RlZENhdGFsb2dWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJQbGVhc2Ugc2V0IHZlcnNpb24gd2l0aCBMYXllclZlcnNpb25zUmVxdWVzdC53aXRoVmVyc2lvbigpIG1ldGhvZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxheWVyVmVyc2lvbnMgPSBhd2FpdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmdldExheWVyVmVyc2lvbnMoYnVpbGRlciwge1xuICAgICAgICAgICAgdmVyc2lvbjogcmVxdWVzdGVkQ2F0YWxvZ1ZlcnNpb24sXG4gICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICB9KS5jYXRjaChhc3luYyAoZXJyb3IpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihlcnJvcikpKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXllclZlcnNpb25zLmxheWVyVmVyc2lvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhIGNhdGFsb2cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tDYXRhbG9nVmVyc2lvblJlcXVlc3RdXSBpbnN0YW5jZSB3aXRoIHRoZSBgZ2V0U3RhcnRWZXJzaW9uYCBtZXRob2QgdXNlZCB0byBnZXRcbiAgICAgKiB0aGUgY2F0YWxvZyBzdGFydCB2ZXJzaW9uIChleGNsdXNpdmUpLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgLTEuIEJ5IGNvbnZlbnRpb24gLTFcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIHZpcnR1YWwgaW5pdGlhbCB2ZXJzaW9uIGJlZm9yZSB0aGUgZmlyc3QgcHVibGljYXRpb24gdGhhdCBoYXMgdmVyc2lvbiAwLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvZiB0aGUgSFRUUCByZXNwb25zZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXlsb2FkIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldExhdGVzdFZlcnNpb24ocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgbGV0IHN0YXJ0VmVyc2lvbiA9IHJlcXVlc3QuZ2V0U3RhcnRWZXJzaW9uKCk7XG4gICAgICAgIGlmIChzdGFydFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhcnRWZXJzaW9uID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGF3YWl0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubGF0ZXN0VmVyc2lvbihidWlsZGVyLCB7XG4gICAgICAgICAgICBzdGFydFZlcnNpb24sXG4gICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXRlc3RWZXJzaW9uLnZlcnNpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGNhdGFsb2cgdmVyc2lvbnMuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB2ZXJzaW9ucyB0byBiZVxuICAgICAqIHJldHVybmVkIHBlciBjYWxsIGlzIDEwMDAgdmVyc2lvbnMuIElmIHRoZSByYW5nZSBpcyBiaWdnZXIgdGhhbiAxMDAwIHZlcnNpb25zLCB5b3UgZ2V0IHRoZSA0MDAgQmFkIFJlcXVlc3QgZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tDYXRhbG9nVmVyc2lvblJlcXVlc3RdXSBpbnN0YW5jZSB3aXRoIHRoZSBgZ2V0U3RhcnRWZXJzaW9uYCBhbmQgYGdldEVuZFZlcnNpb25gIG1ldGhvZHMuXG4gICAgICogKiBgU3RhcnRWZXJzaW9uYCAtIGEgY2F0YWxvZyBzdGFydCB2ZXJzaW9uIChleGNsdXNpdmUpLiBEZWZhdWx0IGlzIC0xLiBCeSBjb252ZW50aW9uIC0xXG4gICAgICogaW5kaWNhdGVzIHRoZSB2aXJ0dWFsIGluaXRpYWwgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uIHRoYXQgaGFzIHZlcnNpb24gMC5cbiAgICAgKiAqIGBFbmRWZXJzaW9uYCAtIGEgY2F0YWxvZyBlbmQgdmVyc2lvbiAoaW5jbHVzaXZlKS4gSWYgbm90IGRlZmluZWQsIHRoZW4gdGhlIGxhdGVzdCBjYXRhbG9nXG4gICAgICogdmVyc2lvbiBpcyBmZXRoY2VkIGFuZCB1c2VkLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvZiB0aGUgSFRUUCByZXNwb25zZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXlsb2FkIHdpdGggdmVyc2lvbnMgaW4gdGhlIHJlcXVlc3RlZFxuICAgICAqIHJhbmdlLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFZlcnNpb25zKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGxldCBzdGFydFZlcnNpb24gPSByZXF1ZXN0LmdldFN0YXJ0VmVyc2lvbigpO1xuICAgICAgICBpZiAoc3RhcnRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXJ0VmVyc2lvbiA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbmRWZXJzaW9uID0gcmVxdWVzdC5nZXRFbmRWZXJzaW9uKCk7XG4gICAgICAgIGlmIChlbmRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVuZFZlcnNpb24gPSBhd2FpdCB0aGlzLmdldExhdGVzdFZlcnNpb24ocmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubGlzdFZlcnNpb25zKGJ1aWxkZXIsIHtcbiAgICAgICAgICAgIHN0YXJ0VmVyc2lvbixcbiAgICAgICAgICAgIGVuZFZlcnNpb24sXG4gICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBgYmFzZVVybGAgYW5kIGNyZWF0ZXMgYHJlcXVlc3RCdWlsZGVyYCBmb3Igc2VuZGluZyByZXF1ZXN0cyB0byB0aGUgQVBJIExvb2t1cCBTZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBidWlsZGVyVHlwZSBUaGUgZW5kcG9pbnQgbmFtZSB0aGF0IGlzIG5lZWRlZCB0byBjcmVhdGUgYXByb3ByaWF0ZSBgcmVxdWVzdEJ1aWxkZXJgLlxuICAgICAqIEBwYXJhbSBocm4gVGhlIGNhdGFsb2cgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGByZXF1ZXN0QnVpbGRlcmBcbiAgICAgKi9cbiAgICBhc3luYyBnZXRSZXF1ZXN0QnVpbGRlcihidWlsZGVyVHlwZSwgaHJuLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKGJ1aWxkZXJUeXBlLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpLmNhdGNoKChlcnIpID0+IFByb21pc2UucmVqZWN0KGBFcnJvciByZXRyaWV2aW5nIGZyb20gY2FjaGUgYnVpbGRlciBmb3IgcmVzb3VyY2UgXCIke3RoaXMuaHJufVwiIGFuZCBhcGk6IFwiJHtidWlsZGVyVHlwZX0uXFxuJHtlcnJ9XCJgKSk7XG4gICAgfVxufVxuZXhwb3J0cy5DYXRhbG9nQ2xpZW50ID0gQ2F0YWxvZ0NsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYXRhbG9nUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBjYXRhbG9nIG1ldGFkYXRhIGZyb20gdGhlIHBsYXRmb3JtIENvbmZpZyBTZXJ2aWNlLlxuICovXG5jbGFzcyBDYXRhbG9nUmVxdWVzdCB7XG4gICAgYmlsbGluZ1RhZztcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tDYXRhbG9nUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gKDAsIHZhbGlkYXRlQmlsbGluZ1RhZ18xLnZhbGlkYXRlQmlsbGluZ1RhZykodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxufVxuZXhwb3J0cy5DYXRhbG9nUmVxdWVzdCA9IENhdGFsb2dSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNhdGFsb2dWZXJzaW9uUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBBcnRpZmFjdCBTZXJ2aWNlLlxuICovXG5jbGFzcyBDYXRhbG9nVmVyc2lvblJlcXVlc3Qge1xuICAgIHN0YXJ0VmVyc2lvbjtcbiAgICBlbmRWZXJzaW9uO1xuICAgIGJpbGxpbmdUYWc7XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGNhdGFsb2cgc3RhcnQgdmVyc2lvbiAoZXhjbHVzaXZlKSBmb3IgdGhlIHJlcXVlc3QuIERlZmF1bHQgaXMgLTEuIEJ5IGNvbnZlbnRpb24gLTFcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIHZpcnR1YWwgaW5pdGlhbCB2ZXJzaW9uIGJlZm9yZSB0aGUgZmlyc3QgcHVibGljYXRpb24gdGhhdCBoYXMgdmVyc2lvbiAwLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY2F0YWxvZyBzdGFydCB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGdldFN0YXJ0VmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRWZXJzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgY2F0YWxvZyBlbmQgdmVyc2lvbiAoaW5jbHVzaXZlKSBmb3IgdGhlIHJlcXVlc3QuIElmIG5vdCBkZWZpbmVkLCB0aGVuIHRoZSBsYXRlc3QgY2F0YWxvZ1xuICAgICAqIHZlcnNpb24gaXMgZmV0aGNlZCBhbmQgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNhdGFsb2cgZW5kIHZlcnNpb24uXG4gICAgICovXG4gICAgZ2V0RW5kVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kVmVyc2lvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHN0YXJ0VmVyc2lvbmAgdmFsdWUgdGhhdCBpcyB1c2VkIGluIHRoZSBgZ2V0VmVyc2lvbnMgYW5kIGBnZXRMYXRlc3RWZXJzaW9uYCBtZXRob2RzIG9mIFtbQ2F0YWxvZ0NsaWVudF1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXJ0VmVyc2lvbiBTcGVjaWZ5IHRoZSBlbmQgY2F0YWxvZyB2ZXJzaW9uIG9yLCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGxhdGVzdCBjYXRhbG9nIHZlcnNpb24sIHNldCB0byB1bmRlZmluZWQuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tDYXRhbG9nVmVyc2lvblJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFN0YXJ0VmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuc3RhcnRWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBlbmRWZXJzaW9uYCB2YWx1ZSB0aGF0IGlzIHVzZWQgaW4gdGhlIGBnZXRWZXJzaW9uc2AgbWV0aG9kIG9mIFtbQ2F0YWxvZ0NsaWVudF1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcnNpb24gU3BlY2lmeSB0aGUgZW5kIGNhdGFsb2cgdmVyc2lvbiBvciwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgY2F0YWxvZyB2ZXJzaW9uLCBzZXQgdG8gdW5kZWZpbmVkLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhFbmRWZXJzaW9uKHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5lbmRWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNCZuZGFzaDsxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0NhdGFsb2dWZXJzaW9uUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gKDAsIHZhbGlkYXRlQmlsbGluZ1RhZ18xLnZhbGlkYXRlQmlsbGluZ1RhZykodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxufVxuZXhwb3J0cy5DYXRhbG9nVmVyc2lvblJlcXVlc3QgPSBDYXRhbG9nVmVyc2lvblJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ2F0YWxvZ3NSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3QgdmFsaWRhdGVCaWxsaW5nVGFnXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvdmFsaWRhdGVCaWxsaW5nVGFnXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGNhdGFsb2dzIGZyb20gdGhlIHBsYXRmb3JtIENvbmZpZyBTZXJ2aWNlLlxuICovXG5jbGFzcyBDYXRhbG9nc1JlcXVlc3Qge1xuICAgIHNjaGVtYUhybjtcbiAgICBiaWxsaW5nVGFnO1xuICAgIC8qKlxuICAgICAqICBHZXRzIGEgc2NoZW1hIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzY2hlbWEgSFJOLlxuICAgICAqL1xuICAgIGdldFNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hSHJuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgb2YgYSBsYXllciBzY2hlbWEgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIHRoYXQgaXMgdXNlZCBpbiB0aGUgYGdldENhdGFsb2dzYCBtZXRob2Qgb2YgdGhlIFtbQ29uZmlnQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICogSWYgdGhlIHNjaGVtYSBpcyBzZXQsIHRoZSBgZ2V0Q2F0YWxvZ3NgIG1ldGhvZCByZXR1cm5zIGNhdGFsb2dzIHdpdGNoIGhhdmUgYSBsYXllciBvciBsYXllcnMgd2l0aCB0aGUgc3BlY2lmaWMgc2NoZW1hIEhSTi5cbiAgICAgKiBJZiB0aGUgc2NoZW1hIGlzIG5vdCBzZXQsIHRoZSBmaWx0ZXIgcmV0dXJucyBhbGwgb2YgdGhlIGNhdGFsb2dzIHRvIHdoaWNoIHlvdSBoYXZlIGFjY2Vzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWFIcm4gVGhlIGxheWVyIHNjaGVtYSBIUk4uXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0NhdGFsb2dSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hSHJuKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hSHJuID0gc2NoZW1hSHJuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbQ2F0YWxvZ3NSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLkNhdGFsb2dzUmVxdWVzdCA9IENhdGFsb2dzUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db25maWdDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuLyoqXG4gKiBBIGNsaWVudCBmb3IgdGhlIHBsYXRmb3JtIENvbmZpZyBTZXJ2aWNlLlxuICovXG5jbGFzcyBDb25maWdDbGllbnQge1xuICAgIHNldHRpbmdzO1xuICAgIGFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBjbGllbnQgZm9yIHRoZSBkYXRhIHN0b3JlIHRvIHdvcmsgd2l0aCBkYXRhXG4gICAgICogYWJvdXQgY2F0YWxvZ3MgY29uZmlndXJhdGlvbnMgaW4gdGhlIHN0b3JlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tDb25maWdDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzeW5jaHJvbm91c2x5IHJldHJpZXZlcyBhIGxpc3Qgb2YgY2F0YWxvZ3MgdG8gd2hpY2ggeW91IGhhdmUgYWNjZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFtbQ2F0YWxvZ3NSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgbGlzdCBvZiBjYXRhbG9ncyB0byB3aGljaCB5b3UgaGF2ZSBhY2Nlc3MuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc2NoZW1hIGlzIHNldCwgeW91IGdldCB0aGUgY2F0YWxvZ3Mgd2l0aCBsYXllcnMgZmlsdGVyZWQgYnkgdGhlIHNwZWNpZmllZCBsYXllciBzY2hlbWEgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pLlxuICAgICAqIElmIHRoZSBzY2hlbWEgaXMgbm90IHNldCwgdGhlIGZpbHRlciByZXR1cm5zIGFsbCBvZiB0aGUgY2F0YWxvZ3MgdG8gd2hpY2ggeW91IGhhdmUgYWNjZXNzLlxuICAgICAqL1xuICAgIGFzeW5jIGdldENhdGFsb2dzKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSBhd2FpdCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJjb25maWdcIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICBwYXJhbXMuYmlsbGluZ1RhZyA9IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMudmVyYm9zZSA9IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zY2hlbWFIcm4gPSByZXF1ZXN0LmdldFNjaGVtYSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkNvbmZpZ0FwaS5nZXRDYXRhbG9ncyhyZXF1ZXN0QnVpbGRlciwgcGFyYW1zKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbmZpZ0NsaWVudCA9IENvbmZpZ0NsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EYXRhUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKlxuICogIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgZGF0YSBmcm9tIHRoZSBIRVJFIEJsb2IgU2VydmljZS5cbiAqL1xuY2xhc3MgRGF0YVJlcXVlc3Qge1xuICAgIGRhdGFIYW5kbGU7XG4gICAgcGFydGl0aW9uSWQ7XG4gICAgYmlsbGluZ1RhZztcbiAgICBmZXRjaE9wdGlvbiA9IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVJZk5vdEZvdW5kO1xuICAgIC8qKlxuICAgICAqIEdldHMgYSBkYXRhIGhhbmRsZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGUgZGF0YSBoYW5kbGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGUgY29udGVudHMgb2YgdGhhdCBibG9iLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYERhdGFIYW5kbGVgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXREYXRhSGFuZGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSGFuZGxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwcm92aWRlZCBkYXRhIGhhbmRsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBgRGF0YUhhbmRsZXJgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbRGF0YVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aERhdGFIYW5kbGUoZGF0YUhhbmRsZSkge1xuICAgICAgICB0aGlzLmRhdGFIYW5kbGUgPSBkYXRhSGFuZGxlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHBhcnRpdGlvbiBJRCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgcGFydGl0aW9uSURgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRQYXJ0aXRpb25JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGl0aW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHByb3ZpZGVkIHBhcnRpdGlvbiBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJ0aXRpb25JZCBUaGUgYHBhcnRpdGlvbklEYCBzdHJpbmcuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tEYXRhUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoUGFydGl0aW9uSWQocGFydGl0aW9uSWQpIHtcbiAgICAgICAgdGhpcy5wYXJ0aXRpb25JZCA9IHBhcnRpdGlvbklkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDTigJMxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQeKAk1ph4oCTejDigJM5XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0RhdGFSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgeW91IGNhbiB1c2UgdG8gc2V0IHRoZSBzb3VyY2UgZnJvbVxuICAgICAqIHdoaWNoIGRhdGEgc2hvdWxkIGJlIGZldGNoZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIGBnZXRGZXRjaE9wdGlvbigpYCBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIGBGZXRjaE9wdGlvbmAgZW51bS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIHVwZGF0ZWQgYERhdGFSZXF1ZXN0YCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICB3aXRoRmV0Y2hPcHRpb24ob3B0aW9uKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb24gPSBvcHRpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmZXRjaCBvcHRpb24gdGhhdCBjb250cm9scyBob3cgcmVxdWVzdHMgYXJlIGhhbmRsZWQuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBvcHRpb24gaXMgYE9ubGluZUlmTm90Rm91bmRgLiBJdCBxdWVyaWVzIHRoZSBuZXR3b3JrIGlmXG4gICAgICogdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgZmV0Y2ggb3B0aW9uLlxuICAgICAqL1xuICAgIGdldEZldGNoT3B0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaE9wdGlvbjtcbiAgICB9XG59XG5leHBvcnRzLkRhdGFSZXF1ZXN0ID0gRGF0YVJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSW5kZXhMYXllckNsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhIGluZGV4IGxheWVyIGFuZCBwcm92aWRlcyB0aGUgcG9zc2liaWxpdHkgdG8gZ2V0IHBhcnRpdGlvbnMgbWV0YWRhdGEgYW5kIGRhdGEuXG4gKi9cbmNsYXNzIEluZGV4TGF5ZXJDbGllbnQge1xuICAgIGFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgLyoqXG4gICAgICogSFJOIG9mIHRoZSBjYXRhbG9nLlxuICAgICAqL1xuICAgIGhybjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGxheWVyLlxuICAgICAqL1xuICAgIGxheWVySWQ7XG4gICAgLyoqXG4gICAgICogVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzZXR0aW5ncztcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBbW0luZGV4TGF5ZXJDbGllbnRdXSBpbnN0YW5jZSB3aXRoIEluZGV4TGF5ZXJDbGllbnRQYXJhbXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnMgZm9yIHVzZSB0byBpbml0aWFsaXplIEluZGV4TGF5ZXJDbGllbnQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuaHJuID0gcGFyYW1zLmNhdGFsb2dIcm4udG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5sYXllcklkID0gcGFyYW1zLmxheWVySWQ7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgYWxsIHBhcnRpdGlvbnMgbWV0YWRhdGEgZnJvbSBhIGxheWVyIHRoYXQgbWF0Y2ggYSBxdWVyeSBmcm9tIHRoZSBbW0luZGV4UXVlcnlSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gSW5kZXhRdWVyeVJlcXVlc3QgVGhlIFtbSW5kZXhRdWVyeVJlcXVlc3RdXSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgbWV0YWRhdGEgZm9yIGVhY2ggb2YgdGhlIHBhcnRpdGlvbnMgZnJvbSB0aGUgcmVxdWVzdGVkIGxheWVyLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhcnRpdGlvbnMocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7XG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IHF1ZXJ5XCIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJpbmRleFwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgY29uc3QgaW5kZXhNZXRhZGF0YSA9IGF3YWl0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuSW5kZXhBcGkucGVyZm9ybVF1ZXJ5KHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBsYXllcklEOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIGh1Z2U6IHJlcXVlc3QuZ2V0SHVnZVJlc3BvbnNlKClcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbmRleE1ldGFkYXRhLmRhdGFcbiAgICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKGluZGV4TWV0YWRhdGEuZGF0YSlcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZWplY3QoaW5kZXhNZXRhZGF0YS5lcnJvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgcGFydGl0aW9uIGRhdGEgdXNpbmcgZGF0YSBoYW5kbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZWwgVGhlIGRhdGEgbW9kZWwgb2YgcGFydGl0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHBhcnRpdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXREYXRhKG1vZGVsLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICBpZiAoIW1vZGVsLmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gZGF0YSBoYW5kbGUgZm9yIHRoaXMgcGFydGl0aW9uXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWlsZGVyID0gYXdhaXQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihcImJsb2JcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkJsb2JBcGkuZ2V0QmxvYihidWlsZGVyLCB7XG4gICAgICAgICAgICBkYXRhSGFuZGxlOiBtb2RlbC5pZCxcbiAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggYmFzZVVybCBhbmQgY3JlYXRlIHJlcXVlc3RCdWlsZGVyIGZvciBzZW5kaW5nIHJlcXVlc3RzIHRvIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UuXG4gICAgICogQHBhcmFtIGJ1aWxkZXJUeXBlIGVuZHBvaW50IG5hbWUgaXMgbmVlZGVkIHRvIGNyZWF0ZSBwcm9wcmlhdGUgcmVxdWVzdEJ1aWxkZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHJlcXVlc3RCdWlsZGVyXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmVxdWVzdEJ1aWxkZXIoYnVpbGRlclR5cGUsIGhybiwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShidWlsZGVyVHlwZSwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCBocm4sIGFib3J0U2lnbmFsKTtcbiAgICB9XG59XG5leHBvcnRzLkluZGV4TGF5ZXJDbGllbnQgPSBJbmRleExheWVyQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5JbmRleFF1ZXJ5UmVxdWVzdCA9IHZvaWQgMDtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGZyb20gdGhlIHBsYXRmb3JtIEluZGV4IFNlcnZpY2UuXG4gKi9cbmNsYXNzIEluZGV4UXVlcnlSZXF1ZXN0IHtcbiAgICBxdWVyeVN0cmluZztcbiAgICBpc0h1Z2VSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcXVlcnkgQW4gUlNRTCBxdWVyeSB0byB1c2UgdG8gcmV0cmlldmUgcGFydGl0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeS5cbiAgICAgKiBUaGUgcXVlcnkgbXVzdCB1c2UgdGhlIGluZGV4aW5nIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiB0aGUgaW5kZXggbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tJbmRleFF1ZXJ5UmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoUXVlcnlTdHJpbmcocXVlcnkpIHtcbiAgICAgICAgdGhpcy5xdWVyeVN0cmluZyA9IHF1ZXJ5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBpc0h1Z2VSZXNwb25zZSBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXNIdWdlIFRoZSBib29sZWFuIHBhcmFtZXRlciBzaG93cyBpcyB0aGUgcXVlcnkgaHVnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbSW5kZXhRdWVyeVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEh1Z2VSZXNwb25zZShpc0h1Z2UpIHtcbiAgICAgICAgdGhpcy5pc0h1Z2VSZXNwb25zZSA9IGlzSHVnZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBxdWVyeVN0cmluZyBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBxdWVyeVN0cmluZyBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0UXVlcnlTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U3RyaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGlzSHVnZVJlc3BvbnNlIHByb3BlcnR5IGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBpc0h1Z2VSZXNwb25zZWAgYm9vbGVhbi5cbiAgICAgKi9cbiAgICBnZXRIdWdlUmVzcG9uc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSHVnZVJlc3BvbnNlO1xuICAgIH1cbn1cbmV4cG9ydHMuSW5kZXhRdWVyeVJlcXVlc3QgPSBJbmRleFF1ZXJ5UmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MYXllclZlcnNpb25zUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGxheWVyIHZlcnNpb25zIG9mIGEgc3BlY2lmaWMgY2F0YWxvZyB2ZXJzaW9uLiAqL1xuY2xhc3MgTGF5ZXJWZXJzaW9uc1JlcXVlc3Qge1xuICAgIHZlcnNpb247XG4gICAgYmlsbGluZ1RhZztcbiAgICAvKipcbiAgICAgKiBHZXRzIGEgY2F0YWxvZyB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGNhdGFsb2cgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBnZXRWZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjYXRhbG9nIHZlcnNpb24gdmFsdWUgdGhhdCBpcyB1c2VkIGluIHRoZSAnZ2V0TGF5ZXJWZXJzaW9ucycgbWV0aG9kIG9mIFtbQ2F0YWxvZ0NsaWVudF1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcnNpb24gU3BlY2lmeSB0aGUgY2F0YWxvZyB2ZXJzaW9uLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbTGF5ZXJWZXJzaW9uc1JlcXVlc3RdXSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHdpdGhWZXJzaW9uKHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA04oCTMTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0HigJNaYeKAk3ow4oCTOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tMYXllclZlcnNpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNOKAkzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtB4oCTWmHigJN6MOKAkzldLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLkxheWVyVmVyc2lvbnNSZXF1ZXN0ID0gTGF5ZXJWZXJzaW9uc1JlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGFydGl0aW9uc1JlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCB2YWxpZGF0ZUJpbGxpbmdUYWdfMSA9IHJlcXVpcmUoXCIuLi91dGlscy92YWxpZGF0ZUJpbGxpbmdUYWdcIik7XG5jb25zdCB2YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0XzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvdmFsaWRhdGVQYXJ0aXRpb25zSWRzTGlzdFwiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGZyb20gdGhlIE1ldGFkYXRhIFNlcnZpY2UgQVBJLlxuICovXG5jbGFzcyBQYXJ0aXRpb25zUmVxdWVzdCB7XG4gICAgdmVyc2lvbjtcbiAgICBiaWxsaW5nVGFnO1xuICAgIHBhcnRpdGlvbklkcztcbiAgICBhZGRpdGlvbmFsRmllbGRzO1xuICAgIGZldGNoT3B0aW9uID0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZUlmTm90Rm91bmQ7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDTigJMxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQeKAk1ph4oCTejDigJM5XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1BhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcHJvdmlkZWQgcGFydGl0aW9uIElEcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZHMgVGhlIElEcyBvZiBwYXJ0aXRpb25zIGZyb20gd2hpY2ggeW91IHdhbnQgdG8gZ2V0IG1ldGFkYXRhLlxuICAgICAqXG4gICAgICogVGhlIHJlcXVpcmVkIHF1YW50aXR5IGlzIGJldHdlZW4gMSBhbmQgMTAwLlxuICAgICAqIElmIHBhcnRpdGlvbiBJRHMgYXJlIG5vdCBwcm92aWRlZCwgYWxsIHBhcnRpdGlvbnMgYXJlIHJldHJpZXZlZC5cbiAgICAgKiBJZiB0aGUgcXVhbnRpdHkgb2YgcGFydGl0aW9uIElEcyBpcyBsZXNzIHRoYW4gMSAoZW1wdHkgYXJyYXkpIG9yIG1vcmUgdGhhbiAxMDAsIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1BhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhQYXJ0aXRpb25JZHMoaWRzKSB7XG4gICAgICAgIHRoaXMucGFydGl0aW9uSWRzID0gKDAsIHZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3RfMS52YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0KShpZHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBwYXJ0aXRpb24gSURzIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBwYXJ0aXRpb25JZHNgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRQYXJ0aXRpb25JZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnRpdGlvbklkcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcHJvdmlkZWQgYWRkaXRpb25hbCBmaWVsZHM6IGBkYXRhU2l6ZWAsIGBjaGVja3N1bWAsIGBjb21wcmVzc2VkRGF0YVNpemVgLCBhbmQgYGNyY2AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBUaGUgYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICAgKiBUaGUgYXJyYXkgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB2YWx1ZXM6IGBkYXRhU2l6ZWAsIGBjaGVja3N1bWAsIGBjb21wcmVzc2VkRGF0YVNpemVgLCBhbmQgYGNyY2AuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1BhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhBZGRpdGlvbmFsRmllbGRzKGFkZGl0aW9uYWxGaWVsZHMpIHtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFkZGl0aW9uYWxGaWVsZHMgPSBhZGRpdGlvbmFsRmllbGRzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvci4gUGFyYW1ldGVyICdhZGRpdGlvbmFsRmllbGRzJyBjb3VsZCBub3QgY29udGFpbiBlbXB0eSBhcnJheS4gQWRkIHZhbHVlIG9yIGRvIG5vdCB1c2UgdGhpcyBtZXRob2QuXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYWRkaXRpb25hbCBmaWVsZHMgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYHBhcnRpdGlvbklkc2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEFkZGl0aW9uYWxGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxGaWVsZHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZldGNoIG9wdGlvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIHNldCB0aGUgc291cmNlIGZyb21cbiAgICAgKiB3aGljaCBkYXRhIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgICAqXG4gICAgICogQHNlZSBgZ2V0RmV0Y2hPcHRpb24oKWAgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBgRmV0Y2hPcHRpb25gIGVudW0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoZSB1cGRhdGVkIGBQYXJ0aXRpb25zUmVxdWVzdGAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgd2l0aEZldGNoT3B0aW9uKG9wdGlvbikge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9uID0gb3B0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgY29udHJvbHMgaG93IHJlcXVlc3RzIGFyZSBoYW5kbGVkLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgb3B0aW9uIGlzIGBPbmxpbmVJZk5vdEZvdW5kYC4gSXQgcXVlcmllcyB0aGUgbmV0d29yayBpZlxuICAgICAqIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgbm90IGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGZldGNoIG9wdGlvbi5cbiAgICAgKi9cbiAgICBnZXRGZXRjaE9wdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hPcHRpb247XG4gICAgfVxufVxuZXhwb3J0cy5QYXJ0aXRpb25zUmVxdWVzdCA9IFBhcnRpdGlvbnNSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Qb2xsUmVxdWVzdCA9IHZvaWQgMDtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBTdHJlYW0gU2VydmljZS5cbiAqL1xuY2xhc3MgUG9sbFJlcXVlc3Qge1xuICAgIG1vZGU7XG4gICAgc3Vic2NyaXB0aW9uSWQ7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2NyaXB0aW9uIG1vZGUgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIG1vZGUuXG4gICAgICovXG4gICAgZ2V0TW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tQb2xsUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTW9kZShtb2RlKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gaWQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqL1xuICAgIGdldFN1YnNjcmlwdGlvbklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tQb2xsUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoU3Vic2NyaXB0aW9uSWQoaWQpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IGlkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLlBvbGxSZXF1ZXN0ID0gUG9sbFJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3QgdmFsaWRhdGVCaWxsaW5nVGFnXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvdmFsaWRhdGVCaWxsaW5nVGFnXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IHF1YWR0cmVlIG1ldGFkYXRhIGZyb20gdGhlIFF1ZXJ5IFNlcnZpY2UgQVBJLlxuICpcbiAqIFRoaXMgY2xhc3Mgd29ya3Mgb25seSB3aXRoIHZlcnNpb25lZCBhbmQgdm9sYXRpbGUgbGF5ZXJzIHdoZXJlIHRoZSBwYXJ0aXRpb25pbmcgc2NoZW1lIGlzIEhFUkUgVGlsZS5cbiAqL1xuY2xhc3MgUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0IHtcbiAgICBxdWFkS2V5O1xuICAgIGRlcHRoO1xuICAgIGJpbGxpbmdUYWc7XG4gICAgYWRkaXRpb25hbEZpZWxkcztcbiAgICAvKipcbiAgICAgKiBBIGdlb21ldHJpYyBhcmVhIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRLZXkgQWRkcmVzc2VzIGEgdGlsZSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFF1YWRLZXkocXVhZEtleSkge1xuICAgICAgICB0aGlzLnF1YWRLZXkgPSBxdWFkS2V5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlY3Vyc2lvbiBkZXB0aCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGRlcHRoIHBhcmFtZXRlciBpcyA0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlcHRoIFRoZSByZWN1cnNpb24gZGVwdGggb2YgdGhlIHJlc3BvbnNlLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqXG4gICAgICogSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBvbmx5IGRhdGEgZnJvbSB0aGUgcXVhZGtleSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogSW4gdGhpcyB3YXksIHRoZSBkZXB0aCBkZXNjcmliZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdWJRdWFkS2V5cyBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICovXG4gICAgd2l0aERlcHRoKGRlcHRoKSB7XG4gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBhZGRpdGlvbmFsIGZpZWxkc1xuICAgICAqXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgQXJyYXkgb2Ygc3RyaW5ncy4gQXJyYXkgY291bGQgY29udGFpbiBuZXh0IHZhbHVlcyBcImRhdGFTaXplXCIgfCBcImNoZWNrc3VtXCIgfCBcImNvbXByZXNzZWREYXRhU2l6ZSB8IFwiY3JjXCJcIi5cbiAgICAgKiBUaGlzIHZhbHVlcyBjb3VsZCBiZSB1c2VmdWwgZm9yIGdldFBhcnRpdGlvbnMgbWV0aG9kIGZyb20gdmVyc2lvbmVkTGF5ZXJDbGllbnQgYW5kIHZvbGF0aWxlTGF5ZXJDbGllbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQWRkaXRpb25hbEZpZWxkcyhhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgIHRoaXMuYWRkaXRpb25hbEZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIFtbUXVhZEtleV1dIG9iamVjdCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSB0aGUgY29uZmlndXJlZCBbW1F1YWRLZXldXSBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0UXVhZEtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVhZEtleTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBkZXB0aCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGhlIGNvbmZpZ3VyZWQgZGVwdGguXG4gICAgICovXG4gICAgZ2V0RGVwdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlcHRoIHx8IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFkZGl0aW9uYWwgZmllbGRzIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQWRkaXRpb25hbCBmaWVsZHMuXG4gICAgICovXG4gICAgZ2V0QWRkaXRpb25hbEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkaXRpb25hbEZpZWxkcztcbiAgICB9XG59XG5leHBvcnRzLlF1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdCA9IFF1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWFkVHJlZUluZGV4UmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBxdWFkdHJlZSBtZXRhZGF0YSBmcm9tIHRoZSBRdWVyeSBTZXJ2aWNlIEFQSS5cbiAqXG4gKiBUaGlzIGNsYXNzIHdvcmtzIG9ubHkgd2l0aCB2ZXJzaW9uZWQgb3Igdm9sYXRpbGUgbGF5ZXJzIHdoZXJlIHRoZSBwYXJ0aXRpb25pbmcgc2NoZW1lIGlzIEhFUkUgVGlsZS5cbiAqL1xuY2xhc3MgUXVhZFRyZWVJbmRleFJlcXVlc3Qge1xuICAgIGNhdGFsb2dIcm47XG4gICAgbGF5ZXJJZDtcbiAgICBsYXllclR5cGU7XG4gICAgdmVyc2lvbjtcbiAgICBxdWFkS2V5O1xuICAgIGRlcHRoO1xuICAgIGJpbGxpbmdUYWc7XG4gICAgYWRkaXRpb25hbEZpZWxkcztcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBbW1F1YWRUcmVlSW5kZXhSZXF1ZXN0XV0gaW5zdGFuY2UgZm9yIGZldGNoaW5nIHRoZSBxdWFkdHJlZSBpbmRleCBmcm9tIHRoZSBRdWVyeSBTZXJ2aWNlIEFQSVxuICAgICAqIGZvciB2b2xhdGlsZSBvciB2ZXJzaW9uZWQgbGF5ZXJzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUgKFtbSFJOXV0pLlxuICAgICAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIuXG4gICAgICogQHBhcmFtIGxheWVyVHlwZSBUaGUgdHlwZSBvZiBsYXllciB0aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QuIEJ5IGRlZmF1bHQsIGEgbGF5ZXIgb2YgdGhlIHZlcnNpb25lZCB0eXBlIGlzIHVzZWQuXG4gICAgICogQHJldHVybiBUaGUgW1tRdWFkVHJlZUluZGV4UmVxdWVzdF1dIGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2F0YWxvZ0hybiwgbGF5ZXJJZCwgbGF5ZXJUeXBlID0gXCJ2ZXJzaW9uZWRcIikge1xuICAgICAgICB0aGlzLmNhdGFsb2dIcm4gPSBjYXRhbG9nSHJuO1xuICAgICAgICB0aGlzLmxheWVySWQgPSBsYXllcklkO1xuICAgICAgICB0aGlzLmxheWVyVHlwZSA9IGxheWVyVHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cgYWdhaW5zdCB3aGljaCB5b3Ugd2FudCB0byBydW4gdGhlIHF1ZXJ5LlxuICAgICAqIEl0IG11c3QgYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBTcGVjaWZ5IHRoZSBjYXRhbG9nIHZlcnNpb24gb3IsIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgbGF0ZXN0IGNhdGFsb2cgdmVyc2lvbiwgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoVmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGdlb21ldHJpYyBhcmVhIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRLZXkgQWRkcmVzc2VzIGEgdGlsZSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFF1YWRLZXkocXVhZEtleSkge1xuICAgICAgICB0aGlzLnF1YWRLZXkgPSBxdWFkS2V5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlY3Vyc2lvbiBkZXB0aCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGRlcHRoIHBhcmFtZXRlciBpcyA0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlcHRoIFRoZSByZWN1cnNpb24gZGVwdGggb2YgdGhlIHJlc3BvbnNlLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqXG4gICAgICogSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBvbmx5IGRhdGEgZnJvbSB0aGUgcXVhZGtleSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogSW4gdGhpcyB3YXksIHRoZSBkZXB0aCBkZXNjcmliZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdWJRdWFkS2V5cyBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICovXG4gICAgd2l0aERlcHRoKGRlcHRoKSB7XG4gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbUXVhZFRyZWVJbmRleFJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9ICgwLCB2YWxpZGF0ZUJpbGxpbmdUYWdfMS52YWxpZGF0ZUJpbGxpbmdUYWcpKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGFkZGl0aW9uYWwgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgQXJyYXkgb2Ygc3RyaW5ncy4gQXJyYXkgY291bGQgY29udGFpbiBuZXh0IHZhbHVlcyBcImRhdGFTaXplXCIgfCBcImNoZWNrc3VtXCIgfCBcImNvbXByZXNzZWREYXRhU2l6ZSB8IFwiY3JjXCJcIi5cbiAgICAgKiBUaGlzIHZhbHVlcyBjb3VsZCBiZSB1c2VmdWwgZm9yIGdldFBhcnRpdGlvbnMgbWV0aG9kIGZyb20gdmVyc2lvbmVkTGF5ZXJDbGllbnQgYW5kIHZvbGF0aWxlTGF5ZXJDbGllbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRUcmVlSW5kZXhSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhBZGRpdGlvbmFsRmllbGRzKGFkZGl0aW9uYWxGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5hZGRpdGlvbmFsRmllbGRzID0gYWRkaXRpb25hbEZpZWxkcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWd1cmVkIGNhdGFsb2cgdmVyc2lvbiBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjYXRhbG9nIHZlcnNpb24gbnVtYmVyLlxuICAgICAqL1xuICAgIGdldFZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgW1tRdWFkS2V5XV0gb2JqZWN0IGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHRoZSBjb25maWd1cmVkIFtbUXVhZEtleV1dIG9iamVjdC5cbiAgICAgKi9cbiAgICBnZXRRdWFkS2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWFkS2V5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIGRlcHRoIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aGUgY29uZmlndXJlZCBkZXB0aC5cbiAgICAgKi9cbiAgICBnZXREZXB0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVwdGggfHwgMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCB0eXBlIG9mIHRoZSBsYXllciBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICogQnkgZGVmYXVsdCwgYSBsYXllciBvZiB0aGUgdmVyc2lvbmVkIHR5cGUgaXMgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGxheWVyIHR5cGUuXG4gICAgICovXG4gICAgZ2V0TGF5ZXJUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllclR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgW1tIUk5dXSBpbnN0YW5jZSBvZiB0aGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUoSFJOKSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIFtbSFJOXV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgZ2V0Q2F0YWxvZ0hybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ0hybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxheWVyIElEIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGxheWVyIElEIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRMYXllcklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllcklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEFkZGl0aW9uYWwgZmllbGRzLlxuICAgICAqL1xuICAgIGdldEFkZGl0aW9uYWxGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxGaWVsZHM7XG4gICAgfVxufVxuZXhwb3J0cy5RdWFkVHJlZUluZGV4UmVxdWVzdCA9IFF1YWRUcmVlSW5kZXhSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1ZXJ5Q2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IE1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XzEgPSByZXF1aXJlKFwiLi4vY2FjaGUvTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlcIik7XG4vKipcbiAqIEEgY2xpZW50IGZvciB0aGUgUXVlcnkgU2VydmljZSBBUEkgdGhhdCBwcm92aWRlcyBhIHdheSB0byBnZXQgaW5mb3JtYXRpb24gKG1ldGFkYXRhKVxuICogYWJvdXQgbGF5ZXJzIGFuZCBwYXJ0aXRpb25zIHN0b3JlZCBpbiBhIGNhdGFsb2cuXG4gKiBUaGlzIHNlcnZpY2UgZXhwb3NlcyB0aGUgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHBhcnRpdGlvbiB0aGF0IHlvdSBjYW4gcXVlcnkgb25lIGJ5IG9uZSBvciB1c2luZyBhIHBhcmVudCB0aWxlLlxuICovXG5jbGFzcyBRdWVyeUNsaWVudCB7XG4gICAgc2V0dGluZ3M7XG4gICAgYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsaWVudCBmb3IgdGhlIFF1ZXJ5IFNlcnZpY2UgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tRdWVyeUNsaWVudF1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyB0aGUgcXVhZHRyZWUgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgY29uZmlndXJlZCBbW1F1YWRUcmVlSW5kZXhSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgcXVhZHRyZWUgaW5kZXggb2JqZWN0LlxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoUXVhZFRyZWVJbmRleChyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICBjb25zdCBxdWFkS2V5ID0gcmVxdWVzdC5nZXRRdWFkS2V5KCk7XG4gICAgICAgIGNvbnN0IGxheWVySWQgPSByZXF1ZXN0LmdldExheWVySWQoKTtcbiAgICAgICAgaWYgKCFxdWFkS2V5IHx8ICFvbHBfc2RrX2NvcmVfMS5UaWxlS2V5LmlzVmFsaWQocXVhZEtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgUXVhZEtleVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxheWVySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgSWQgb2YgdGhlIExheWVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYXRhbG9nVmVyc2lvbiA9IHJlcXVlc3QuZ2V0VmVyc2lvbigpO1xuICAgICAgICBpZiAocmVxdWVzdC5nZXRMYXllclR5cGUoKSA9PT0gXCJ2ZXJzaW9uZWRcIiAmJlxuICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPSBhd2FpdCB0aGlzLmdldENhdGFsb2dMYXRlc3RWZXJzaW9uKHJlcXVlc3QuZ2V0Q2F0YWxvZ0hybigpLCBhYm9ydFNpZ25hbCwgcmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoYEVycm9yIGdldHRpbmcgdGhlIGxhc3QgY2F0YWxvZyB2ZXJzaW9uOiAke2Vycm9yfWApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC5nZXRMYXllclR5cGUoKSA9PT0gXCJ2ZXJzaW9uZWRcIiAmJlxuICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGNhdGFsb2cgdmVyc2lvbmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCdWlsZGVyID0gYXdhaXQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwicXVlcnlcIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCByZXF1ZXN0LmdldENhdGFsb2dIcm4oKSwgYWJvcnRTaWduYWwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoYEVyb3JyIGNyZWF0aW5nIHJlcXVlc3Qgb2JqZWN0IGZvciBxdWVyeSBzZXJ2aWNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgY29uc3Qgc3ViUXVhZEtleXNNYXhMZW5ndGggPSByZXF1ZXN0LmdldERlcHRoKCk7XG4gICAgICAgIGxldCBmZXRjaGluZ1F1YWRUcmVlSW5kZXhGdW5jdGlvbjtcbiAgICAgICAgbGV0IHBhcmFtc0ZvckZldGNoUXVhZFRyZWVJbmRleCA9IHtcbiAgICAgICAgICAgIHZlcnNpb246IDAsXG4gICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgZGVwdGg6IHN1YlF1YWRLZXlzTWF4TGVuZ3RoLFxuICAgICAgICAgICAgcXVhZEtleTogb2xwX3Nka19jb3JlXzEuVGlsZUtleS5mcm9tUm93Q29sdW1uTGV2ZWwocXVhZEtleS5yb3csIHF1YWRLZXkuY29sdW1uLCBxdWFkS2V5LmxldmVsKVxuICAgICAgICAgICAgICAgIC5tb3J0b25Db2RlKClcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGJpbGxpbmdUYWc6IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpLFxuICAgICAgICAgICAgYWRkaXRpb25hbEZpZWxkczogcmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHJlcXVlc3QuZ2V0TGF5ZXJUeXBlKCkgPT09IFwidm9sYXRpbGVcIikge1xuICAgICAgICAgICAgZmV0Y2hpbmdRdWFkVHJlZUluZGV4RnVuY3Rpb24gPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlF1ZXJ5QXBpLnF1YWRUcmVlSW5kZXhWb2xhdGlsZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZldGNoaW5nUXVhZFRyZWVJbmRleEZ1bmN0aW9uID0gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5RdWVyeUFwaS5xdWFkVHJlZUluZGV4O1xuICAgICAgICAgICAgcGFyYW1zRm9yRmV0Y2hRdWFkVHJlZUluZGV4ID0ge1xuICAgICAgICAgICAgICAgIC4uLnBhcmFtc0ZvckZldGNoUXVhZFRyZWVJbmRleCxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBjYXRhbG9nVmVyc2lvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmV0Y2hpbmdRdWFkVHJlZUluZGV4RnVuY3Rpb24ocmVxdWVzdEJ1aWxkZXIsIHBhcmFtc0ZvckZldGNoUXVhZFRyZWVJbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgcGFydGl0aW9ucyB1c2luZyB0aGVpciBJRHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgYFBhcnRpdGlvbnNSZXF1ZXN0YCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIGZyb20gd2hpY2ggeW91IHdhbnQgdG8gZ2V0IHBhcnRpdGlvbnMuXG4gICAgICogQHBhcmFtIGhybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgcGFydGl0aW9ucy5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYXJ0aXRpb25zQnlJZChyZXF1ZXN0LCBsYXllcklkLCBocm4sIGFib3J0U2lnbmFsLCBjYXRhbG9nVmVyc2lvbikge1xuICAgICAgICBjb25zdCBpZHNMaXN0ID0gcmVxdWVzdC5nZXRQYXJ0aXRpb25JZHMoKTtcbiAgICAgICAgaWYgKCFpZHNMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IHBhcnRpdGlvbklkcyBsaXN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IE1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XzEuTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkodGhpcy5zZXR0aW5ncy5jYWNoZSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5KSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWRQYXJ0aXRpb25zID0gY2FjaGUuZ2V0KHJlcXVlc3QsIGhybi50b1N0cmluZygpLCBsYXllcklkLCBjYXRhbG9nVmVyc2lvbik7XG4gICAgICAgICAgICBpZiAoY2FjaGVkUGFydGl0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25zOiBjYWNoZWRQYXJ0aXRpb25zXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSBhd2FpdCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJxdWVyeVwiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoYEVyb3JyIGNyZWF0aW5nIHJlcXVlc3Qgb2JqZWN0IGZvciBxdWVyeSBzZXJ2aWNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgY29uc3QgbWVkYXRhZGEgPSBhd2FpdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlF1ZXJ5QXBpLmdldFBhcnRpdGlvbnNCeUlkKHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgcGFydGl0aW9uOiBpZHNMaXN0LFxuICAgICAgICAgICAgYWRkaXRpb25hbEZpZWxkczogcmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKCksXG4gICAgICAgICAgICB2ZXJzaW9uOiBjYXRhbG9nVmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gYCR7Y2F0YWxvZ1ZlcnNpb259YCA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSAhPT0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZU9ubHkgJiZcbiAgICAgICAgICAgIG1lZGF0YWRhICYmXG4gICAgICAgICAgICBtZWRhdGFkYS5wYXJ0aXRpb25zICYmXG4gICAgICAgICAgICBtZWRhdGFkYS5wYXJ0aXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcGFydGl0aW9ucyA9IG1lZGF0YWRhLnBhcnRpdGlvbnMubWFwKChwYXJ0aXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgY2hlY2tzdW06IHBhcnRpdGlvbi5jaGVja3N1bSxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2VkRGF0YVNpemU6IHBhcnRpdGlvbi5jb21wcmVzc2VkRGF0YVNpemUsXG4gICAgICAgICAgICAgICAgZGF0YUhhbmRsZTogcGFydGl0aW9uLmRhdGFIYW5kbGUgfHwgXCJcIixcbiAgICAgICAgICAgICAgICBkYXRhU2l6ZTogcGFydGl0aW9uLmRhdGFTaXplLFxuICAgICAgICAgICAgICAgIHBhcnRpdGlvbjogcGFydGl0aW9uLnBhcnRpdGlvbixcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBwYXJ0aXRpb24udmVyc2lvblxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY2FjaGUucHV0KHJlcXVlc3QsIGhybi50b1N0cmluZygpLCBsYXllcklkLCBwYXJ0aXRpb25zLCBjYXRhbG9nVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtZWRhdGFkYSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0Q2F0YWxvZ0xhdGVzdFZlcnNpb24oY2F0YWxvZ0hybiwgYWJvcnRTaWduYWwsIGJpbGxpbmdUYWcpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShcIm1ldGFkYXRhXCIsIHRoaXMuYXBpVmVyc2lvbiwgdGhpcy5zZXR0aW5ncywgY2F0YWxvZ0hybiwgYWJvcnRTaWduYWwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoYEVyb3JyIGNyZWF0aW5nIHJlcXVlc3Qgb2JqZWN0IGZvciBtZXRhZGF0YSBzZXJ2aWNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGF3YWl0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubGF0ZXN0VmVyc2lvbihyZXF1ZXN0LCB7XG4gICAgICAgICAgICBzdGFydFZlcnNpb246IC0xLFxuICAgICAgICAgICAgYmlsbGluZ1RhZ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXRlc3RWZXJzaW9uLnZlcnNpb24pO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVlcnlDbGllbnQgPSBRdWVyeUNsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TY2hlbWFEZXRhaWxzUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBBcnRpZmFjdCBTZXJ2aWNlLlxuICovXG5jbGFzcyBTY2hlbWFEZXRhaWxzUmVxdWVzdCB7XG4gICAgc2NoZW1hSHJuO1xuICAgIGJpbGxpbmdUYWc7XG4gICAgLyoqXG4gICAgICogR2V0cyBzY2hlbWEgbWV0YWRhdGEgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHNjaGVtYURldGFpbHNSZXF1ZXN0IFRoZSBbW1NjaGVtYURldGFpbHNSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNjaGVtYSBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBnZXRTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjaGVtYUhybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIG9mIGEgc2NoZW1hIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSB0aGF0IGlzIHVzZWQgaW5cbiAgICAgKiB0aGUgYGdldFNjaGVtYWAgYW5kIGBnZXRTY2hlbWFEZXRhaWxzYCBtZXRob2RzIG9mIFtbQXJ0aWZhY3RDbGllbnRdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWFIcm4gVGhlIGxheWVyIHNjaGVtYSBIUk4uXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1NjaGVtYURldGFpbHNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hSHJuKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hSHJuID0gc2NoZW1hSHJuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tTY2hlbWFEZXRhaWxzUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gKDAsIHZhbGlkYXRlQmlsbGluZ1RhZ18xLnZhbGlkYXRlQmlsbGluZ1RhZykodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxufVxuZXhwb3J0cy5TY2hlbWFEZXRhaWxzUmVxdWVzdCA9IFNjaGVtYURldGFpbHNSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNjaGVtYVJlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCB2YWxpZGF0ZUJpbGxpbmdUYWdfMSA9IHJlcXVpcmUoXCIuLi91dGlscy92YWxpZGF0ZUJpbGxpbmdUYWdcIik7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byB0aGUgcGxhdGZvcm0gQXJ0aWZhY3QgU2VydmljZS5cbiAqL1xuY2xhc3MgU2NoZW1hUmVxdWVzdCB7XG4gICAgdmFyaWFudDtcbiAgICBiaWxsaW5nVGFnO1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGBWYXJpYW50YCBvYmplY3Qgb2YgdGhlIHNjaGVtYSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgVmFyaWFudGAgb2JqZWN0IG9mIHRoZSBzY2hlbWEuXG4gICAgICovXG4gICAgZ2V0VmFyaWFudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFyaWFudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIG9mIGEgc2NoZW1hIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSB0aGF0IGlzIHVzZWQgaW5cbiAgICAgKiB0aGUgYGdldFNjaGVtYWAgYW5kIGBnZXRTY2hlbWFEZXRhaWxzYCBtZXRob2RzIG9mIFtbQXJ0aWZhY3RDbGllbnRdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YXJpYW50IFRoZSBgVmFyaWFudGAgb2JqZWN0IG9mIHRoZSBzY2hlbWFcbiAgICAgKiBAcmV0dXJuIFRoZSBbW1NjaGVtYVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFZhcmlhbnQodmFyaWFudCkge1xuICAgICAgICB0aGlzLnZhcmlhbnQgPSB2YXJpYW50O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tTY2hlbWFSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLlNjaGVtYVJlcXVlc3QgPSBTY2hlbWFSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TZWVrUmVxdWVzdCA9IHZvaWQgMDtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBTdHJlYW0gU2VydmljZS5cbiAqL1xuY2xhc3MgU2Vla1JlcXVlc3Qge1xuICAgIG1vZGU7XG4gICAgc3Vic2NyaXB0aW9uSWQ7XG4gICAgb2Zmc2V0cztcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKi9cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1NlZWtSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhNb2RlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN1YnNjcmlwdGlvbiBpZCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gaWQuXG4gICAgICovXG4gICAgZ2V0U3Vic2NyaXB0aW9uSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1NlZWtSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTdWJzY3JpcHRpb25JZChpZCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkID0gaWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB3aXRoU2Vla09mZnNldHMob2Zmc2V0cykge1xuICAgICAgICB0aGlzLm9mZnNldHMgPSBvZmZzZXRzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ2V0U2Vla09mZnNldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldHM7XG4gICAgfVxufVxuZXhwb3J0cy5TZWVrUmVxdWVzdCA9IFNlZWtSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlN0YXRpc3RpY3NDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuY29uc3QgU3RhdGlzdGljc1JlcXVlc3RfMSA9IHJlcXVpcmUoXCIuL1N0YXRpc3RpY3NSZXF1ZXN0XCIpO1xuLyoqXG4gKiBBIGNsaWVudCBmb3IgdGhlIHBsYXRmb3JtIFN0YXRpc3RpY3MgU2VydmljZS5cbiAqL1xuY2xhc3MgU3RhdGlzdGljc0NsaWVudCB7XG4gICAgc2V0dGluZ3M7XG4gICAgYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBbW1N0YXRpc3RpY3NDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgW1tTdGF0aXN0aWNzQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIGFuZCByZXR1cm5zIGEgbGF5ZXIgc3VtbWFyeSBmcm9tIHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3VtbWFyeVJlcXVlc3QgUGFyYW1ldGVycyB0aGF0IGFyZSBuZWVkZWQgdG8gZmV0Y2ggdGhlIGxheWVyIHN1bW1hcnkuXG4gICAgICogSW5jbHVkZXMgW1tjYXRhbG9nSHJuXV0gYW5kIFtbbGF5ZXJJZF1dLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggdGhlIGxheWVyIHN1bW1hcnkuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0U3VtbWFyeShzdW1tYXJ5UmVxdWVzdCkge1xuICAgICAgICBjb25zdCBsYXllcklkID0gc3VtbWFyeVJlcXVlc3QuZ2V0TGF5ZXJJZCgpO1xuICAgICAgICBjb25zdCBjYXRhbG9nSHJuID0gc3VtbWFyeVJlcXVlc3QuZ2V0Q2F0YWxvZ0hybigpO1xuICAgICAgICBpZiAoY2F0YWxvZ0hybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBObyBjYXRhbG9nSHJuIHByb3ZpZGVkYCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXllcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGxheWVySWQgcHJvdmlkZWRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY292ZXJhZ2VSZXF1ZXN0QnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoY2F0YWxvZ0hybik7XG4gICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkNvdmVyYWdlQXBpLmdldERhdGFDb3ZlcmFnZVN1bW1hcnkoY292ZXJhZ2VSZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgbGF5ZXJJZFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVwZW5kaW5nIG9uIHRoZSBtYXAgdHlwZSB0aGF0IHlvdSBzcGVjaWZ5IGluIHRoZSBbW1N0YXRpc3RpY3NSZXF1ZXN0XV0gaW5zdGFuY2UsIGdldHMgdGhlIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZVxuICAgICAqIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6XG4gICAgICogKiBCSVRNQVAgJm5kYXNoOyBmZXRjaGVzIGEgYml0bWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGRhdGEgaW4gcGFydGl0aW9ucy5cbiAgICAgKiAqIFNJWkVNQVAgJm5kYXNoOyBmZXRjaGVzIGEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgYSBwYXJ0aXRpb24gc2l6ZS5cbiAgICAgKiAqIFRJTUVNQVAgJm5kYXNoOyBmZXRjaGVzIGEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgcGFydGl0aW9uIHVwZGF0ZSB0aW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXRpc3RpY3NSZXF1ZXN0IFRoZSBbW1N0YXRpc3RpY3NSZXF1ZXN0XV0gaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWVzdGVkIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgW1N0YXRpc3RpY3NSZXF1ZXN0XV0gaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWVzdGVkIHNldHRpbmdzLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFN0YXRpc3RpY3Moc3RhdGlzdGljc1JlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHN0YXRpc3RpY3NSZXF1ZXN0LmdldExheWVySWQoKTtcbiAgICAgICAgY29uc3QgY2F0YWxvZ0hSTiA9IHN0YXRpc3RpY3NSZXF1ZXN0LmdldENhdGFsb2dIcm4oKTtcbiAgICAgICAgY29uc3QgdHlwZW1hcCA9IHN0YXRpc3RpY3NSZXF1ZXN0LmdldFR5cGVtYXAoKTtcbiAgICAgICAgY29uc3QgZGF0YWxldmVsID0gc3RhdGlzdGljc1JlcXVlc3QuZ2V0RGF0YUxldmVsKCk7XG4gICAgICAgIGlmIChjYXRhbG9nSFJOID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGNhdGFsb2dIcm4gcHJvdmlkZWRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxheWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTm8gbGF5ZXJJZCBwcm92aWRlZGApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBObyB0eXBlbWFwIHByb3ZpZGVkYCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdmVyYWdlUmVxdWVzdEJ1aWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKGNhdGFsb2dIUk4pO1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgc3dpdGNoICh0eXBlbWFwKSB7XG4gICAgICAgICAgICBjYXNlIFN0YXRpc3RpY3NSZXF1ZXN0XzEuQ292ZXJhZ2VEYXRhVHlwZS5CSVRNQVA6XG4gICAgICAgICAgICAgICAgcmVxdWVzdCA9IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQ292ZXJhZ2VBcGkuZ2V0RGF0YUNvdmVyYWdlVGlsZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3RhdGlzdGljc1JlcXVlc3RfMS5Db3ZlcmFnZURhdGFUeXBlLlNJWkVNQVA6XG4gICAgICAgICAgICAgICAgcmVxdWVzdCA9IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQ292ZXJhZ2VBcGkuZ2V0RGF0YUNvdmVyYWdlU2l6ZU1hcDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3RhdGlzdGljc1JlcXVlc3RfMS5Db3ZlcmFnZURhdGFUeXBlLlRJTUVNQVA6XG4gICAgICAgICAgICAgICAgcmVxdWVzdCA9IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQ292ZXJhZ2VBcGkuZ2V0RGF0YUNvdmVyYWdlVGltZU1hcDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgSW5jb3JyZWN0IHR5cGVtYXAgcHJvdmlkZWQ6ICR7dHlwZW1hcH1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3QoY292ZXJhZ2VSZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgbGF5ZXJJZCxcbiAgICAgICAgICAgIGRhdGFsZXZlbCxcbiAgICAgICAgICAgIGNhdGFsb2dIUk5cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGdldFJlcXVlc3RCdWlsZGVyKGhybikge1xuICAgICAgICByZXR1cm4gb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwic3RhdGlzdGljc1wiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKGhybikpO1xuICAgIH1cbn1cbmV4cG9ydHMuU3RhdGlzdGljc0NsaWVudCA9IFN0YXRpc3RpY3NDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3RhdGlzdGljc1JlcXVlc3QgPSBleHBvcnRzLkNvdmVyYWdlRGF0YVR5cGUgPSB2b2lkIDA7XG5jb25zdCB2YWxpZGF0ZUJpbGxpbmdUYWdfMSA9IHJlcXVpcmUoXCIuLi91dGlscy92YWxpZGF0ZUJpbGxpbmdUYWdcIik7XG4vKipcbiAqIEEgbWFwIHR5cGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIFN0YXRpc3RpY3MgU2VydmljZS5cbiAqL1xudmFyIENvdmVyYWdlRGF0YVR5cGU7XG4oZnVuY3Rpb24gKENvdmVyYWdlRGF0YVR5cGUpIHtcbiAgICAvKiogUmVwcmVzZW50cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGRhdGEgaW4gcGFydGl0aW9ucy4gKi9cbiAgICBDb3ZlcmFnZURhdGFUeXBlW1wiQklUTUFQXCJdID0gXCJ0aWxlbWFwXCI7XG4gICAgLyoqIEEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgYSBwYXJ0aXRpb24gc2l6ZS4gKi9cbiAgICBDb3ZlcmFnZURhdGFUeXBlW1wiU0laRU1BUFwiXSA9IFwiaGVhdG1hcC9zaXplXCI7XG4gICAgLyoqIEEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgcGFydGl0aW9uIHVwZGF0ZSB0aW1lLiAqL1xuICAgIENvdmVyYWdlRGF0YVR5cGVbXCJUSU1FTUFQXCJdID0gXCJoZWF0bWFwL2FnZVwiO1xufSkoQ292ZXJhZ2VEYXRhVHlwZSB8fCAoZXhwb3J0cy5Db3ZlcmFnZURhdGFUeXBlID0gQ292ZXJhZ2VEYXRhVHlwZSA9IHt9KSk7XG4vKipcbiAqICBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IHN0YXRpc3RpY3MgZnJvbSB0aGUgcGxhdGZvcm0gU3RhdGlzdGljcyBTZXJ2aWNlLlxuICovXG5jbGFzcyBTdGF0aXN0aWNzUmVxdWVzdCB7XG4gICAgY2F0YWxvZ0hybjtcbiAgICBsYXllcklkO1xuICAgIHR5cGVtYXA7XG4gICAgZGF0YUxldmVsO1xuICAgIGJpbGxpbmdUYWc7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBbW0hSTl1dIHN0cmluZyBvZiB0aGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUoSFJOKSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIFtbSFJOXV0gc3RyaW5nLlxuICAgICAqL1xuICAgIGdldENhdGFsb2dIcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGFsb2dIcm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBsYXllciBJRCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBsYXllciBJRCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0TGF5ZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIG1hcCB0eXBlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgbWFwIHR5cGUuXG4gICAgICovXG4gICAgZ2V0VHlwZW1hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZW1hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHRpbGUgbGV2ZWwgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm4gVGhlIHJlcXVlc3RlZCB0aWxlIGxldmVsIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXREYXRhTGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFMZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBjYXRhbG9nIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBocm4gVGhlIGNhdGFsb2cgSFJOLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aENhdGFsb2dIcm4oaHJuKSB7XG4gICAgICAgIHRoaXMuY2F0YWxvZ0hybiA9IGhybi50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSByZXF1ZXN0ZWQgYGxheWVySWRgIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTGF5ZXJJZChsYXllcklkKSB7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IGxheWVySWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGBjb3ZlcmFnZURhdGFUeXBlYCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY292ZXJhZ2VEYXRhVHlwZSBQb2ludHMgYXQgb25lIG9mIHRoZSBmb2xsb3dpbmcgU3RhdGlzdGljIEFQSSBlbmRwb2ludHM6XG4gICAgICogKiBCSVRNQVAgJm5kYXNoOyBmZXRjaGVzIGEgYml0bWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGRhdGEgaW4gcGFydGl0aW9ucy5cbiAgICAgKiAqIFNJWkVNQVAgJm5kYXNoOyBmZXRjaGVzIGEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgYSBwYXJ0aXRpb24gc2l6ZS5cbiAgICAgKiAqIFRJTUVNQVAgJm5kYXNoOyBmZXRjaGVzIGEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgcGFydGl0aW9uIHVwZGF0ZSB0aW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFR5cGVtYXAoY292ZXJhZ2VEYXRhVHlwZSkge1xuICAgICAgICB0aGlzLnR5cGVtYXAgPSBjb3ZlcmFnZURhdGFUeXBlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBgZGF0YUxldmVsYCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YUxldmVsIGRhdGFMZXZlbCBTcGVjaWZ5IHRoZSB0aWxlIGxldmVsIGFib3V0IHdoaWNoIHlvdSB3YW50IHRvIGdldCBzdGF0aXN0aWNhbCBkYXRhLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aERhdGFMZXZlbChkYXRhTGV2ZWwpIHtcbiAgICAgICAgdGhpcy5kYXRhTGV2ZWwgPSBOdW1iZXIoZGF0YUxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9ICgwLCB2YWxpZGF0ZUJpbGxpbmdUYWdfMS52YWxpZGF0ZUJpbGxpbmdUYWcpKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbn1cbmV4cG9ydHMuU3RhdGlzdGljc1JlcXVlc3QgPSBTdGF0aXN0aWNzUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdHJlYW1MYXllckNsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhIHN0cmVhbSBsYXllci5cbiAqL1xuY2xhc3MgU3RyZWFtTGF5ZXJDbGllbnQge1xuICAgIGFwaVZlcnNpb24gPSBcInYyXCI7XG4gICAgeENvcnJlbGF0aW9uSWQ7XG4gICAgc3Vic2NyaWJ0aW9uTm9kZUJhc2VVcmw7XG4gICAgY2F0YWxvZ0hybjtcbiAgICBsYXllcklkO1xuICAgIHNldHRpbmdzO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIFtbU3RyZWFtTGF5ZXJDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXMgVGhlIFtbU3RyZWFtTGF5ZXJDbGllbnRQYXJhbXNdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW1N0cmVhbUxheWVyQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuY2F0YWxvZ0hybiA9IHBhcmFtcy5jYXRhbG9nSHJuO1xuICAgICAgICB0aGlzLmxheWVySWQgPSBwYXJhbXMubGF5ZXJJZDtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHBhcmFtcy5zZXR0aW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtZXNzYWdlIGNvbnN1bXB0aW9uIGZyb20gYSBzcGVjaWZpYyBzdHJlYW0gbGF5ZXIuIFVzZSB0aGUgYmFzZSBwYXRoIHJldHVybmVkIGZyb20gdGhlIEFQSSBMb29rdXAgc2VydmljZS5cbiAgICAgKiBGb3IgbW9kZSA9IHBhcmFsbGVsLCBvbmUgdW5pdCBvZiBwYXJhbGxlbGlzbSBjdXJyZW50bHkgZXF1YWxzIDEgTUJwcyBpbmJvdW5kIG9yIDIgTUJwcyBvdXRib3VuZCxcbiAgICAgKiB3aGljaGV2ZXIgaXMgZ3JlYXRlciwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxuICAgICAqIFRoZSBudW1iZXIgb2Ygc3Vic2NyaXB0aW9ucyB3aXRoaW4gdGhlIHNhbWUgZ3JvdXAgY2Fubm90IGV4Y2VlZCB0aGUgcGFyYWxsZWxpc20gYWxsb3dlZC5cbiAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIHNlZVxuICAgICAqIFtHZXQgRGF0YSBmcm9tIGEgU3RyZWFtIExheWVyXShodHRwczovL2RldmVsb3Blci5oZXJlLmNvbS9kb2N1bWVudGF0aW9uL2RhdGEtYXBpL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLXN0cmVhbS5odG1sKVxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFtbU3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmVkIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTdWJzY3JpcHRpb24gSWRcbiAgICAgKi9cbiAgICBhc3luYyBzdWJzY3JpYmUocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSBhd2FpdCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJzdHJlYW1cIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCB0aGlzLmNhdGFsb2dIcm4sIGFib3J0U2lnbmFsKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJ0aW9uUmVxdWVzdFBhcmFtcyA9IHtcbiAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgIG1vZGU6IHJlcXVlc3QuZ2V0TW9kZSgpLFxuICAgICAgICAgICAgY29uc3VtZXJJZDogcmVxdWVzdC5nZXRDb25zdW1lcklkKCksXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uUHJvcGVydGllczogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25Qcm9wZXJ0aWVzKClcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uUmVzdWx0ID0gYXdhaXQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuc3Vic2NyaWJlKHJlcXVlc3RCdWlsZGVyLCBzdWJzY3JpYnRpb25SZXF1ZXN0UGFyYW1zKS50aGVuKGFzeW5jIChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHhDb3JyZWxhdGlvbklkID0gcmVzLmhlYWRlcnMuZ2V0KFwiWC1Db3JyZWxhdGlvbi1JZFwiKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHhDb3JyZWxhdGlvbklkLCAuLi5yZXNwb25zZURhdGEgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBVcGRhdGUgeENvcnJlbGF0aW9uSWRcbiAgICAgICAgdGhpcy54Q29ycmVsYXRpb25JZCA9IHN1YnNjcmlwdGlvblJlc3VsdC54Q29ycmVsYXRpb25JZDtcbiAgICAgICAgdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCA9IHN1YnNjcmlwdGlvblJlc3VsdC5ub2RlQmFzZVVSTDtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdWJzY3JpcHRpb25SZXN1bHQuc3Vic2NyaXB0aW9uSWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdW1lcyBkYXRhIGZyb20gYSBsYXllci4gUmV0dXJucyBtZXNzYWdlcyBmcm9tIGEgc3RyZWFtIGxheWVyLlxuICAgICAqIElmIHRoZSBkYXRhIHNpemUgaXMgbGVzcyB0aGFuIDEgTUIsIHRoZSBkYXRhIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkLlxuICAgICAqIElmIHRoZSBkYXRhIHNpemUgaXMgZ3JlYXRlciB0aGFuIDEgTUIsIGEgZGF0YSBoYW5kbGUgd2lsbCBiZSByZXR1cm5lZCBwb2ludGluZyB0byB0aGUgb2JqZWN0IHN0b3JlZCBpbiB0aGUgQmxvYiBzdG9yZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBbW1BvbGxSZXF1ZXN0XV0gaW5zdGFuY2Ugb2YgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIE1lc3NhZ2VzIFtbU3RyZWFtQXBpLk1lc3NhZ2VzXV0gZnJvbSBhIHN0cmVhbSBsYXllclxuICAgICAqL1xuICAgIGFzeW5jIHBvbGwocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgaWYgKHJlcXVlc3QuZ2V0TW9kZSgpID09PSBcInBhcmFsbGVsXCIgJiYgIXJlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVycm9yOiBmb3IgJ3BhcmFsbGVsJyBtb2RlICdzdWJzY3JpcHRpb25JZCcgaXMgcmVxdWlyZWQuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3Vic2NyaWJ0aW9uTm9kZUJhc2VVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIHZhbGlkIG5vZGVCYXNldXJsIHByb3ZpZGVkIGZvciB0aGUgc3Vic2NyaWJ0aW9uIGlkPSR7cmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpfSwgcGxlYXNlIGNoZWNrIHlvdXIgc3Vic2NyaWJ0aW9uYCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCdWlsZGVyID0gbmV3IG9scF9zZGtfY29yZV8xLkRhdGFTdG9yZVJlcXVlc3RCdWlsZGVyKHRoaXMuc2V0dGluZ3MuZG93bmxvYWRNYW5hZ2VyLCB0aGlzLnN1YnNjcmlidGlvbk5vZGVCYXNlVXJsLCB0aGlzLnNldHRpbmdzLnRva2VuLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIGNvbnN0IGNvbnN1bWVEYXRhUGFyYW1zID0ge1xuICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgbW9kZTogcmVxdWVzdC5nZXRNb2RlKCksXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpLFxuICAgICAgICAgICAgeENvcnJlbGF0aW9uSWQ6IHRoaXMueENvcnJlbGF0aW9uSWRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY29uc3VtZVJlc3BvbnNlID0gYXdhaXQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuY29uc3VtZURhdGEocmVxdWVzdEJ1aWxkZXIsIGNvbnN1bWVEYXRhUGFyYW1zKS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgIHhDb3JyZWxhdGlvbklkOiByZXNwb25zZS5oZWFkZXJzLmdldChcIlgtQ29ycmVsYXRpb24tSWRcIikgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEgJiYgZGF0YS5tZXNzYWdlcyA/IGRhdGEubWVzc2FnZXMgOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBVcGRhdGUgeENvcnJlbGF0aW9uSWRcbiAgICAgICAgdGhpcy54Q29ycmVsYXRpb25JZCA9IGNvbnN1bWVSZXNwb25zZS54Q29ycmVsYXRpb25JZDtcbiAgICAgICAgaWYgKGNvbnN1bWVSZXNwb25zZS5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIENvbW1pdCBvZmZzZXRzXG4gICAgICAgICAgICBjb25zdCBsYXRlc3RPZmZzZXRzID0gY29uc3VtZVJlc3BvbnNlLmRhdGFcbiAgICAgICAgICAgICAgICAubWFwKChtc2cpID0+IG1zZy5vZmZzZXQpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW2N1cnIucGFydGl0aW9uXSA9XG4gICAgICAgICAgICAgICAgICAgIGFjY1tjdXJyLnBhcnRpdGlvbl0gPiBjdXJyLm9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhY2NbY3Vyci5wYXJ0aXRpb25dXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnIub2Zmc2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICBhd2FpdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlN0cmVhbUFwaS5kb0NvbW1pdE9mZnNldHMocmVxdWVzdEJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBjb21taXRPZmZzZXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldHM6IE9iamVjdC5rZXlzKGxhdGVzdE9mZnNldHMpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uOiAra2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBsYXRlc3RPZmZzZXRzW2tleV1cbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpLFxuICAgICAgICAgICAgICAgIG1vZGU6IHJlcXVlc3QuZ2V0TW9kZSgpLFxuICAgICAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICB4Q29ycmVsYXRpb25JZDogdGhpcy54Q29ycmVsYXRpb25JZFxuICAgICAgICAgICAgfSkuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbW1pdCBvZmZzZXRzIHVuc3VjY2Vzc2Z1bCwgZXJyb3I9JHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25zdW1lUmVzcG9uc2UuZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBkZWxldGVzIGEgc3Vic2NyaXB0aW9uIHRvIGEgbGF5ZXIuIFRoaXMgb3BlcmF0aW9uIHJlbW92ZXMgdGhlIHN1YnNjcmlwdGlvbiBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFtbVW5zdWJzY3JpYmVSZXF1ZXN0XV0gaW5zdGFuY2Ugb2YgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKi9cbiAgICBhc3luYyB1bnN1YnNjcmliZShyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICBpZiAocmVxdWVzdC5nZXRNb2RlKCkgPT09IFwicGFyYWxsZWxcIiAmJiAhcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRXJyb3I6IGZvciAncGFyYWxsZWwnIG1vZGUgJ3N1YnNjcmlwdGlvbklkJyBpcyByZXF1aXJlZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgU3Vic2NyaWJ0aW9uIGVycm9yLiBObyB2YWxpZCBub2RlQmFzZXVybCBwcm92aWRlZCBmb3IgdGhlIHN1YnNjcmlidGlvbiBpZD0ke3JlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKX0sIHBsZWFzZSBjaGVjayB5b3VyIHN1YnNjcmlidGlvbmApKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IG5ldyBvbHBfc2RrX2NvcmVfMS5EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcih0aGlzLnNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCwgdGhpcy5zZXR0aW5ncy50b2tlbiwgYWJvcnRTaWduYWwpO1xuICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuZGVsZXRlU3Vic2NyaXB0aW9uKHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICBtb2RlOiByZXF1ZXN0LmdldE1vZGUoKSxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiByZXF1ZXN0LmdldFN1YnNjcmlwdGlvbklkKCksXG4gICAgICAgICAgICB4Q29ycmVsYXRpb25JZDogdGhpcy54Q29ycmVsYXRpb25JZFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBwYXJ0aXRpb24gZGF0YSB1c2luZyBkYXRhIGhhbmRsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGRhdGEgb2YgcGFydGl0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHBhcnRpdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXREYXRhKG1lc3NhZ2UsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5tZXRhRGF0YSB8fCAhbWVzc2FnZS5tZXRhRGF0YS5kYXRhSGFuZGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gZGF0YSBoYW5kbGUgZm9yIHRoaXMgcGFydGl0aW9uXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IGF3YWl0IG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShcImJsb2JcIiwgXCJ2MVwiLCB0aGlzLnNldHRpbmdzLCB0aGlzLmNhdGFsb2dIcm4sIGFib3J0U2lnbmFsKTtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQmxvYkFwaS5nZXRCbG9iKHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBkYXRhSGFuZGxlOiBtZXNzYWdlLm1ldGFEYXRhLmRhdGFIYW5kbGUsXG4gICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBhbGxvd3MgdG8gc3RhcnQgcmVhZGluZyBkYXRhIGZyb20gYSBzcGVjaWZpZWQgb2Zmc2V0LlxuICAgICAqIFRoZSBtZXNzYWdlIHBvaW50ZXIgY2FuIGJlIG1vdmVkIHRvIGFueSBvZmZzZXQgaW4gdGhlIGxheWVyICh0b3BpYykuXG4gICAgICogTWVzc2FnZSBjb25zdW1wdGlvbiB3aWxsIHN0YXJ0IGZyb20gdGhhdCBvZmZzZXQuIE9uY2UgeW91IHNlZWsgdG8gYW4gb2Zmc2V0LFxuICAgICAqIHRoZXJlIGlzIG5vIHJldHVybmluZyB0byB0aGUgaW5pdGlhbCBvZmZzZXQsIHVubGVzcyB0aGUgaW5pdGlhbCBvZmZzZXQgaXMgc2F2ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tTZWVrUmVxdWVzdF1dIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmVkIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSB3aXRoIHN0YXR1cyAyMDAgaWYgc3VjY2Vzcy5cbiAgICAgKi9cbiAgICBhc3luYyBzZWVrKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldHNPYmplY3QgPSByZXF1ZXN0LmdldFNlZWtPZmZzZXRzKCk7XG4gICAgICAgIGlmICghb2Zmc2V0c09iamVjdCB8fFxuICAgICAgICAgICAgIW9mZnNldHNPYmplY3Qub2Zmc2V0cyB8fFxuICAgICAgICAgICAgIW9mZnNldHNPYmplY3Qub2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFcnJvcjogb2Zmc2V0cyBhcmUgcmVxdWlyZWQuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC5nZXRNb2RlKCkgPT09IFwicGFyYWxsZWxcIiAmJiAhcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRXJyb3I6IGZvciAncGFyYWxsZWwnIG1vZGUgJ3N1YnNjcmlwdGlvbklkJyBpcyByZXF1aXJlZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgU3Vic2NyaWJ0aW9uIGVycm9yLiBObyB2YWxpZCBub2RlQmFzZXVybCBwcm92aWRlZCBmb3IgdGhlIHN1YnNjcmlidGlvbiBpZD0ke3JlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKX0sIHBsZWFzZSBjaGVjayB5b3VyIHN1YnNjcmlidGlvbmApKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IG5ldyBvbHBfc2RrX2NvcmVfMS5EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcih0aGlzLnNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCwgdGhpcy5zZXR0aW5ncy50b2tlbiwgYWJvcnRTaWduYWwpO1xuICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuc2Vla1RvT2Zmc2V0KHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICBzZWVrT2Zmc2V0czogb2Zmc2V0c09iamVjdCxcbiAgICAgICAgICAgIG1vZGU6IHJlcXVlc3QuZ2V0TW9kZSgpLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHJlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKSxcbiAgICAgICAgICAgIHhDb3JyZWxhdGlvbklkOiB0aGlzLnhDb3JyZWxhdGlvbklkXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnhDb3JyZWxhdGlvbklkID1cbiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLmdldChcIlgtQ29ycmVsYXRpb24tSWRcIikgfHwgdGhpcy54Q29ycmVsYXRpb25JZDtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5TdHJlYW1MYXllckNsaWVudCA9IFN0cmVhbUxheWVyQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdWJzY3JpYmVSZXF1ZXN0ID0gdm9pZCAwO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gdGhlIHBsYXRmb3JtIFN0cmVhbSBTZXJ2aWNlLlxuICovXG5jbGFzcyBTdWJzY3JpYmVSZXF1ZXN0IHtcbiAgICBtb2RlO1xuICAgIHN1YnNjcmlwdGlvbklkO1xuICAgIGNvbnN1bWVySWQ7XG4gICAgc3Vic2NyaXB0aW9uUHJvcGVydGllcztcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKi9cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1N1YnNjcmliZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aE1vZGUobW9kZSkge1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2NyaXB0aW9uIGlkIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKi9cbiAgICBnZXRTdWJzY3JpcHRpb25JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIFRoZSBzdWJzY3JpcHRpb24gaWQuXG4gICAgICogQHJldHVybnMgVGhlIFtbU3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoU3Vic2NyaXB0aW9uSWQoaWQpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IGlkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uc3VtZXIgaWQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY29uc3VtZXIgaWQuXG4gICAgICovXG4gICAgZ2V0Q29uc3VtZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3VtZXJJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBjb25zdW1lciBpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgY29uc3VtZXIgaWQuXG4gICAgICogQHJldHVybnMgVGhlIFtbU3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQ29uc3VtZXJJZChpZCkge1xuICAgICAgICB0aGlzLmNvbnN1bWVySWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN1YnNjcmlwdGlvblByb3BlcnRpZXMgZm9yIHRoZSByZXF1ZXN0IC0gY29uc3VtZXIgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uUHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBnZXRTdWJzY3JpcHRpb25Qcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25Qcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzIFRoZSBzdWJzY3JpcHRpb25Qcm9wZXJ0aWVzIC0gY29uc3VtZXIgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtzdWJzY3JpcHRpb24gcHJvcGVydGllc11cbiAgICAgKiAoaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9kYXRhX2Rldl9ndWlkZS9yZXN0L2dldHRpbmctZGF0YS1zdHJlYW0uaHRtbCNzdWJzY3JpcHRpb24tcHJvcGVydGllcylcbiAgICAgKiBAcmV0dXJucyBUaGUgW1tTdWJzY3JpYmVSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTdWJzY3JpcHRpb25Qcm9wZXJ0aWVzKHByb3BzKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uUHJvcGVydGllcyA9IHByb3BzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLlN1YnNjcmliZVJlcXVlc3QgPSBTdWJzY3JpYmVSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlN1bW1hcnlSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3QgdmFsaWRhdGVCaWxsaW5nVGFnXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvdmFsaWRhdGVCaWxsaW5nVGFnXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGEgc3VtbWFyeSBmcm9tIHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFN1bW1hcnlSZXF1ZXN0IHtcbiAgICBjYXRhbG9nSHJuO1xuICAgIGxheWVySWQ7XG4gICAgYmlsbGluZ1RhZztcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIFtbSFJOXV0gc3RyaW5nIG9mIHRoZSBjYXRhbG9nIEhFUkUgUmVzb3VyY2UgTmFtZShIUk4pIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgW1tIUk5dXSBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0Q2F0YWxvZ0hybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ0hybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxheWVyIElEIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGxheWVyIElEIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRMYXllcklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllcklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGNhdGFsb2cgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pLlxuICAgICAqXG4gICAgICogQHBhcmFtIGhybiBUaGUgY2F0YWxvZyBIUk4uXG4gICAgICogQHJldHVybnMgVGhlIFtbU3VtbWFyeVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aENhdGFsb2dIcm4oaHJuKSB7XG4gICAgICAgIHRoaXMuY2F0YWxvZ0hybiA9IGhybi50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBgbGF5ZXJJZGAgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tTdW1tYXJ5UmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTGF5ZXJJZChsYXllcklkKSB7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IGxheWVySWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNCZuZGFzaDsxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1N1bW1hcnlSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLlN1bW1hcnlSZXF1ZXN0ID0gU3VtbWFyeVJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVGlsZVJlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCB2YWxpZGF0ZUJpbGxpbmdUYWdfMSA9IHJlcXVpcmUoXCIuLi91dGlscy92YWxpZGF0ZUJpbGxpbmdUYWdcIik7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgdGhlIHRpbGUgYmxvYiBkYXRhIGJ5IHRoZSB0aWxlIGtleS5cbiAqXG4gKiBUaGlzIGNsYXNzIHdvcmtzIG9ubHkgd2l0aCB2ZXJzaW9uZWQgYW5kIHZvbGF0aWxlIGxheWVycyB3aGVyZSB0aGUgcGFydGl0aW9uaW5nIHNjaGVtZSBpcyBIRVJFIFRpbGUuXG4gKlxuICogWW91IGNhbiBpbml0aWFsaXplIHRoZSByZXF1ZXN0IGNsYXNzIG9uY2UgZm9yIGEgc3BlY2lmaWMgY2F0YWxvZywgbGF5ZXIsIGFuZCB2ZXJzaW9uIChAc2VlIFtbVGlsZVJlcXVlc3RQYXJhbXNdXSlcbiAqIGFuZCB1c2UgaXQgbWFueSB0aW1lcyB0byBnZXQgdGhlIGEgdGlsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYFxuICogIGNvbnN0IHBhcmFtczogVGlsZVJlcXVlc3RQYXJhbXMgPSB7XG4gKiAgICAgICBzZXR0aW5nczogXCIlIHlvdXIgYE9scENsaWVudFNldHRpbmdzYCBpbnN0YW5jZSAlIFwiLFxuICogICAgICAgY2F0YWxvZ0hybjogXCIlIHRoZSBIUk4gaW5zdGFuY2Ugb2YgeW91ciBjYXRhbG9nICVcIixcbiAqICAgICAgIGxheWVySWQ6IFwiJSB5b3VyIGxheWVyIElEICVcIixcbiAqICAgICAgIGxheWVyVHlwZTogXCIlIHZlcnNpb25lZCBvciB2b2xhdGlsZSAlXCIsXG4gKiAgICAgICBjYXRhbG9nVmVyc2lvbjogXCIlIHRoZSBjYXRhbG9nIHZlcnNpb247IGZvciB2ZXJzaW9uZWQgbGF5ZXJzLCB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgdXNlZCBieSBkZWZhdWx0ICVcIlxuICogICB9XG4gKlxuICogIGNvbnN0IHJlcXVlc3QgPSBuZXcgVGlsZVJlcXVlc3QocGFyYW1zKTtcbiAqXG4gKiAgY29uc3QgcmVxdWVzdEZvclRpbGUxID0gcmVxdWVzdC53aXRoVGlsZUtleSh5b3VyVGlsZUtleTEpO1xuICogIGNvbnN0IHJlcXVlc3RGb3JUaWxlMiA9IHJlcXVlc3Qud2l0aFRpbGVLZXkoeW91clRpbGVLZXkyKTtcbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgVGlsZVJlcXVlc3Qge1xuICAgIHF1YWRLZXk7XG4gICAgYmlsbGluZ1RhZztcbiAgICBmZXRjaE9wdGlvbiA9IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVJZk5vdEZvdW5kO1xuICAgIC8qKlxuICAgICAqIEEgZ2VvbWV0cmljIGFyZWEgcmVwcmVzZW50ZWQgYXMgYSBIRVJFIHRpbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcXVhZEtleSBBZGRyZXNzZXMgYSB0aWxlIGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1RpbGVSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhUaWxlS2V5KHF1YWRLZXkpIHtcbiAgICAgICAgdGhpcy5xdWFkS2V5ID0gcXVhZEtleTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA04oCTMTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0HigJNaYeKAk3ow4oCTOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tUaWxlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gKDAsIHZhbGlkYXRlQmlsbGluZ1RhZ18xLnZhbGlkYXRlQmlsbGluZ1RhZykodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgW1tRdWFkS2V5XV0gb2JqZWN0IGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgW1tRdWFkS2V5XV0gb2JqZWN0LlxuICAgICAqL1xuICAgIGdldFRpbGVLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1YWRLZXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZldGNoIG9wdGlvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIHNldCB0aGUgc291cmNlIGZyb21cbiAgICAgKiB3aGljaCBkYXRhIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgICAqXG4gICAgICogQHNlZSBgZ2V0RmV0Y2hPcHRpb24oKWAgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBgRmV0Y2hPcHRpb25gIGVudW0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoZSB1cGRhdGVkIGBQYXJ0aXRpb25zUmVxdWVzdGAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgd2l0aEZldGNoT3B0aW9uKG9wdGlvbikge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9uID0gb3B0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgY29udHJvbHMgaG93IHJlcXVlc3RzIGFyZSBoYW5kbGVkLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgb3B0aW9uIGlzIGBPbmxpbmVJZk5vdEZvdW5kYC4gSXQgcXVlcmllcyB0aGUgbmV0d29yayBpZlxuICAgICAqIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgbm90IGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGZldGNoIG9wdGlvbi5cbiAgICAgKi9cbiAgICBnZXRGZXRjaE9wdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hPcHRpb247XG4gICAgfVxufVxuZXhwb3J0cy5UaWxlUmVxdWVzdCA9IFRpbGVSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5VbnN1YnNjcmliZVJlcXVlc3QgPSB2b2lkIDA7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byB0aGUgcGxhdGZvcm0gU3RyZWFtIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFVuc3Vic2NyaWJlUmVxdWVzdCB7XG4gICAgbW9kZTtcbiAgICBzdWJzY3JpcHRpb25JZDtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKi9cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1Vuc3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTW9kZShtb2RlKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gaWQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqL1xuICAgIGdldFN1YnNjcmlwdGlvbklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tVbnN1YnNjcmliZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFN1YnNjcmlwdGlvbklkKGlkKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuZXhwb3J0cy5VbnN1YnNjcmliZVJlcXVlc3QgPSBVbnN1YnNjcmliZVJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVmVyc2lvbmVkTGF5ZXJDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuY29uc3QgTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlfMSA9IHJlcXVpcmUoXCIuLi9jYWNoZS9NZXRhZGF0YUNhY2hlUmVwb3NpdG9yeVwiKTtcbmNvbnN0IGdldFRpbGVfMSA9IHJlcXVpcmUoXCIuLi91dGlscy9nZXRUaWxlXCIpO1xuY29uc3QgUGFydGl0aW9uc1JlcXVlc3RfMSA9IHJlcXVpcmUoXCIuL1BhcnRpdGlvbnNSZXF1ZXN0XCIpO1xuY29uc3QgUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XzEgPSByZXF1aXJlKFwiLi9RdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RcIik7XG5jb25zdCBRdWFkVHJlZUluZGV4UmVxdWVzdF8xID0gcmVxdWlyZShcIi4vUXVhZFRyZWVJbmRleFJlcXVlc3RcIik7XG5jb25zdCBRdWVyeUNsaWVudF8xID0gcmVxdWlyZShcIi4vUXVlcnlDbGllbnRcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhIHZlcnNpb25lZCBsYXllciBhbmQgcHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGFuZCBkYXRhLlxuICovXG5jbGFzcyBWZXJzaW9uZWRMYXllckNsaWVudCB7XG4gICAgYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICAvKipcbiAgICAgKiBIUk4gb2YgdGhlIGNhdGFsb2cuXG4gICAgICovXG4gICAgaHJuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgbGF5ZXIuXG4gICAgICovXG4gICAgbGF5ZXJJZDtcbiAgICAvKipcbiAgICAgKiBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHNldHRpbmdzO1xuICAgIC8vIExheWVyIHZlcnNpb24uXG4gICAgdmVyc2lvbjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBbW1ZlcnNpb25lZExheWVyQ2xpZW50XV0gaW5zdGFuY2Ugd2l0aCBWZXJzaW9uZWRMYXllckNsaWVudFBhcmFtcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVycyBmb3IgdXNlIHRvIGluaXRpYWxpemUgVmVyc2lvbkxheWVyQ2xpZW50LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmhybiA9IHBhcmFtcy5jYXRhbG9nSHJuLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IHBhcmFtcy5sYXllcklkO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gcGFyYW1zLnNldHRpbmdzO1xuICAgICAgICBpZiAocGFyYW1zLnZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMudmVyc2lvbiA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnNpb24gPSBwYXJhbXMudmVyc2lvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAYnJpZWYgRmV0Y2hlcyBkYXRhIG9mIGEgdGlsZSBvciBpdHMgY2xvc2VzdCBhbmNlc3Rvci5cbiAgICAgKiBVc2UgdGhpcyBBUEkgZm9yIHRpbGUtdHJlZSBzdHJ1Y3R1cmVzIHdoZXJlIGNoaWxkcmVuIHRpbGUgZGF0YSBpcyBhZ2dyZWdhdGVkIGFuZCBzdG9yZWQgaW4gcGFyZW50IHRpbGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGBUaWxlUmVxdWVzdGAgaW5zdGFuY2UgdGhhdCBjb250YWlucyBhIGNvbXBsZXRlIHNldFxuICAgICAqIG9mIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRpbGUgZGF0YSAoaWYgaXQgZXhpc3RzKSBvciB0aGUgbmVhcmVzdCBwYXJlbnQgdGlsZSBkYXRhXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QWdncmVnYXRlZERhdGEocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgbGV0IGNhdGFsb2dWZXJzaW9uID0gdGhpcy52ZXJzaW9uO1xuICAgICAgICBpZiAoY2F0YWxvZ1ZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPSBhd2FpdCB0aGlzLmdldExhdGVzdFZlcnNpb24ocmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIGNhdGFsb2dIcm46IG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSxcbiAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgIGxheWVyVHlwZTogXCJ2ZXJzaW9uZWRcIixcbiAgICAgICAgICAgIHNldHRpbmdzOiB0aGlzLnNldHRpbmdzLFxuICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb25cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuICgwLCBnZXRUaWxlXzEuZ2V0VGlsZSkocmVxdWVzdCwgcGFyYW1zLCBhYm9ydFNpZ25hbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgcGFydGl0aW9uIGRhdGEgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kczogSUQsIHF1YWRrZXksIG9yIGRhdGEgaGFuZGxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFSZXF1ZXN0IFRoZSBbW0RhdGFSZXF1ZXN0XV0gaW5zdGFuY2Ugb2YgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHBhcnRpdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXREYXRhKGRhdGFSZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICBjb25zdCBkYXRhSGFuZGxlID0gZGF0YVJlcXVlc3QuZ2V0RGF0YUhhbmRsZSgpO1xuICAgICAgICBpZiAoZGF0YUhhbmRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRQYXJ0aXRpb24oZGF0YUhhbmRsZSwgYWJvcnRTaWduYWwsIGRhdGFSZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFydGl0aW9uSWQgPSBkYXRhUmVxdWVzdC5nZXRQYXJ0aXRpb25JZCgpO1xuICAgICAgICBpZiAodGhpcy52ZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGZldGNoIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgbG9jayBpdCB0byB0aGUgaW5zdGFuY2UuXG4gICAgICAgICAgICB0aGlzLnZlcnNpb24gPSBhd2FpdCB0aGlzLmdldExhdGVzdFZlcnNpb24oZGF0YVJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52ZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBsYXRlc3QgdmVyc2lvbi4gUGxlYXNlIHByb3ZpZGUgdmVyc2lvbiB0byB0aGUgRGF0YVJlcXVlc3Qgb3IgbG9jayB2ZXJzaW9uIGluIHRoZSBjb25zdHJ1Y3RvcmApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGl0aW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbklkRGF0YUhhbmRsZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUhhbmRsZUJ5UGFydGl0aW9uSWQocGFydGl0aW9uSWQsIGRhdGFSZXF1ZXN0LmdldEZldGNoT3B0aW9uKCksIGRhdGFSZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFBhcnRpdGlvbihwYXJ0aXRpb25JZERhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBkYXRhUmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGRhdGEgcHJvdmlkZWQuIEFkZCBkYXRhSGFuZGxlLCBwYXJ0aXRpb25JZCBvciBxdWFkS2V5IHRvIHRoZSBEYXRhUmVxdWVzdCBvYmplY3RgKSk7XG4gICAgfVxuICAgIGFzeW5jIGdldFBhcnRpdGlvbnMocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBmZXRjaCB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kIGxvY2sgaXQgdG8gdGhlIGluc3RhbmNlLlxuICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRMYXRlc3RWZXJzaW9uKHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52ZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBsYXRlc3QgdmVyc2lvbi4gUGxlYXNlIHByb3ZpZGUgdmVyc2lvbiB0byB0aGUgUmVxdWVzdCBvciBsb2NrIHZlcnNpb24gaW4gdGhlIGNvbnN0cnVjdG9yYCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XzEuUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0KSB7XG4gICAgICAgICAgICBjb25zdCBxdWFkS2V5ID0gcmVxdWVzdC5nZXRRdWFkS2V5KCk7XG4gICAgICAgICAgICBpZiAoIXF1YWRLZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBRdWFkS2V5XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IFF1ZXJ5Q2xpZW50XzEuUXVlcnlDbGllbnQodGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICBjb25zdCBxdWFkVHJlZUluZGV4UmVxdWVzdCA9IG5ldyBRdWFkVHJlZUluZGV4UmVxdWVzdF8xLlF1YWRUcmVlSW5kZXhSZXF1ZXN0KG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgdGhpcy5sYXllcklkLCBcInZlcnNpb25lZFwiKVxuICAgICAgICAgICAgICAgIC53aXRoUXVhZEtleShxdWFkS2V5KVxuICAgICAgICAgICAgICAgIC53aXRoVmVyc2lvbih0aGlzLnZlcnNpb24pXG4gICAgICAgICAgICAgICAgLndpdGhEZXB0aChyZXF1ZXN0LmdldERlcHRoKCkpXG4gICAgICAgICAgICAgICAgLndpdGhBZGRpdGlvbmFsRmllbGRzKHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeUNsaWVudC5mZXRjaFF1YWRUcmVlSW5kZXgocXVhZFRyZWVJbmRleFJlcXVlc3QsIGFib3J0U2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC5nZXRQYXJ0aXRpb25JZHMoKSkge1xuICAgICAgICAgICAgY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnRfMS5RdWVyeUNsaWVudCh0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeUNsaWVudC5nZXRQYXJ0aXRpb25zQnlJZChyZXF1ZXN0LCB0aGlzLmxheWVySWQsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgYWJvcnRTaWduYWwsIHRoaXMudmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlfMS5NZXRhZGF0YUNhY2hlUmVwb3NpdG9yeSh0aGlzLnNldHRpbmdzLmNhY2hlKTtcbiAgICAgICAgaWYgKHJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSAhPT0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZU9ubHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnMgPSBjYWNoZS5nZXQocmVxdWVzdCwgdGhpcy5ocm4udG9TdHJpbmcoKSwgdGhpcy5sYXllcklkLCB0aGlzLnZlcnNpb24pO1xuICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsRmllbGRzID0gcmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKCk7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0RmllbGRzO1xuICAgICAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0RmllbGRzID0gYWRkaXRpb25hbEZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9ucy5ldmVyeSgocGFydGl0aW9uKSA9PiBwYXJ0aXRpb25bZmllbGRdICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFhZGRpdGlvbmFsRmllbGRzIHx8XG4gICAgICAgICAgICAgICAgICAgICFleGlzdEZpZWxkcyB8fFxuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmllbGRzLmxlbmd0aCA9PT0gZXhpc3RGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBwYXJ0aXRpb25zIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhUmVxdWVzdEJpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmdldFBhcnRpdGlvbnMobWV0YVJlcXVlc3RCaWxkZXIsIHtcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxGaWVsZHM6IHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpLFxuICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5ICYmXG4gICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FjaGUucHV0KHJlcXVlc3QsIHRoaXMuaHJuLnRvU3RyaW5nKCksIHRoaXMubGF5ZXJJZCwgbWV0YWRhdGEucGFydGl0aW9ucywgdGhpcy52ZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ldGFkYXRhKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW5kIHJldHVybnMgcGFydGl0aW9uIG1ldGFkYXRhXG4gICAgICogQHBhcmFtIHBhcnRpdGlvbklkIFRoZSBuYW1lIG9mIHRoZSBwYXJ0aXRpb24gdG8gZmV0Y2guXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGxheWVyIHRvIGZldGNoXG4gICAgICogQHBhcmFtIGZldGNoT3B0aW9uIFRoZSBvcHRpb24gb2YgY2FjaGluZyAob25saW5lIG9ubHkgb3IgcmV0dXJuIGZyb20gY2FjaGUgaWYgZXhpc3QpXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIG9mIHBhcnRpdGlvbiBtZXRhZGF0YSB3aGljaCB1c2VkIHRvIGdldCBwYXJ0aXRpb24gZGF0YVxuICAgICAqL1xuICAgIGFzeW5jIGdldERhdGFIYW5kbGVCeVBhcnRpdGlvbklkKHBhcnRpdGlvbklkLCBmZXRjaE9wdGlvbiwgYmlsbGluZ1RhZykge1xuICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBRdWVyeUNsaWVudF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBwYXJ0aXRpb25zUmVxdWVzdCA9IG5ldyBQYXJ0aXRpb25zUmVxdWVzdF8xLlBhcnRpdGlvbnNSZXF1ZXN0KClcbiAgICAgICAgICAgIC53aXRoUGFydGl0aW9uSWRzKFtwYXJ0aXRpb25JZF0pXG4gICAgICAgICAgICAud2l0aEZldGNoT3B0aW9uKGZldGNoT3B0aW9uKTtcbiAgICAgICAgaWYgKGJpbGxpbmdUYWcpIHtcbiAgICAgICAgICAgIHBhcnRpdGlvbnNSZXF1ZXN0LndpdGhCaWxsaW5nVGFnKGJpbGxpbmdUYWcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgcXVlcnlDbGllbnQuZ2V0UGFydGl0aW9uc0J5SWQocGFydGl0aW9uc1JlcXVlc3QsIHRoaXMubGF5ZXJJZCwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCB1bmRlZmluZWQsIHRoaXMudmVyc2lvbik7XG4gICAgICAgIHJldHVybiBtZXRhZGF0YS5wYXJ0aXRpb25zICYmXG4gICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdICYmXG4gICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdLmRhdGFIYW5kbGVcbiAgICAgICAgICAgID8gbWV0YWRhdGEucGFydGl0aW9uc1swXS5kYXRhSGFuZGxlXG4gICAgICAgICAgICA6IFByb21pc2UucmVqZWN0KG5ldyBvbHBfc2RrX2NvcmVfMS5IdHRwRXJyb3Iob2xwX3Nka19jb3JlXzEuU1RBVFVTX0NPREVTLk5PVF9GT1VORCwgYE5vIHBhcnRpdGlvbiBkYXRhSGFuZGxlIGZvciBwYXJ0aXRpb24gJHtwYXJ0aXRpb25JZH0uIEhSTjogJHt0aGlzLmhybn1gKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uIHdoYXQgY2FuIGJlIHVzZWQgYXMgbGF0ZXN0IGxheWVyIHZlcnNpb25cbiAgICAgKi9cbiAgICBhc3luYyBnZXRMYXRlc3RWZXJzaW9uKGJpbGxpbmdUYWcpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybikpO1xuICAgICAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gYXdhaXQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5NZXRhZGF0YUFwaS5sYXRlc3RWZXJzaW9uKGJ1aWxkZXIsIHtcbiAgICAgICAgICAgIHN0YXJ0VmVyc2lvbjogLTEsXG4gICAgICAgICAgICBiaWxsaW5nVGFnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxhdGVzdFZlcnNpb24udmVyc2lvbik7XG4gICAgfVxuICAgIGFzeW5jIGRvd25sb2FkUGFydGl0aW9uKGRhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBiaWxsaW5nVGFnKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwiYmxvYlwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQmxvYkFwaS5nZXRCbG9iKGJ1aWxkZXIsIHtcbiAgICAgICAgICAgIGRhdGFIYW5kbGUsXG4gICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICBiaWxsaW5nVGFnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCBiYXNlVXJsIGFuZCBjcmVhdGUgcmVxdWVzdEJ1aWxkZXIgZm9yIHNlbmRpbmcgcmVxdWVzdHMgdG8gdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAgICAgKiBAcGFyYW0gYnVpbGRlclR5cGUgZW5kcG9pbnQgbmFtZSBpcyBuZWVkZWQgdG8gY3JlYXRlIHByb3ByaWF0ZSByZXF1ZXN0QnVpbGRlclxuICAgICAqXG4gICAgICogQHJldHVybnMgcmVxdWVzdEJ1aWxkZXJcbiAgICAgKi9cbiAgICBhc3luYyBnZXRSZXF1ZXN0QnVpbGRlcihidWlsZGVyVHlwZSwgaHJuLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKGJ1aWxkZXJUeXBlLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpO1xuICAgIH1cbn1cbmV4cG9ydHMuVmVyc2lvbmVkTGF5ZXJDbGllbnQgPSBWZXJzaW9uZWRMYXllckNsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Wb2xhdGlsZUxheWVyQ2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IE1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XzEgPSByZXF1aXJlKFwiLi4vY2FjaGUvTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlcIik7XG5jb25zdCBnZXRUaWxlXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvZ2V0VGlsZVwiKTtcbmNvbnN0IFBhcnRpdGlvbnNSZXF1ZXN0XzEgPSByZXF1aXJlKFwiLi9QYXJ0aXRpb25zUmVxdWVzdFwiKTtcbmNvbnN0IFF1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdF8xID0gcmVxdWlyZShcIi4vUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XCIpO1xuY29uc3QgUXVhZFRyZWVJbmRleFJlcXVlc3RfMSA9IHJlcXVpcmUoXCIuL1F1YWRUcmVlSW5kZXhSZXF1ZXN0XCIpO1xuY29uc3QgUXVlcnlDbGllbnRfMSA9IHJlcXVpcmUoXCIuL1F1ZXJ5Q2xpZW50XCIpO1xuLyoqXG4gKiBEZXNjcmliZXMgYSB2b2FsdGlsZSBsYXllciBhbmQgcHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGFuZCBkYXRhLlxuICovXG5jbGFzcyBWb2xhdGlsZUxheWVyQ2xpZW50IHtcbiAgICBhcGlWZXJzaW9uID0gXCJ2MVwiO1xuICAgIC8qKlxuICAgICAqIEhSTiBvZiB0aGUgY2F0YWxvZy5cbiAgICAgKi9cbiAgICBocm47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBsYXllci5cbiAgICAgKi9cbiAgICBsYXllcklkO1xuICAgIC8qKlxuICAgICAqIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgc2V0dGluZ3M7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgW1tWb2xhdGlsZUxheWVyQ2xpZW50XV0gaW5zdGFuY2Ugd2l0aCBWb2xhdGlsZUxheWVyQ2xpZW50UGFyYW1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBwYXJhbWV0ZXJzIGZvciB1c2UgdG8gaW5pdGlhbGl6ZSBWb2xhdGlsZUxheWVyQ2xpZW50LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmhybiA9IHBhcmFtcy5jYXRhbG9nSHJuLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IHBhcmFtcy5sYXllcklkO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gcGFyYW1zLnNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAYnJpZWYgRmV0Y2hlcyBkYXRhIG9mIGEgdGlsZSBvciBpdHMgY2xvc2VzdCBhbmNlc3Rvci5cbiAgICAgKiBVc2UgdGhpcyBBUEkgZm9yIHRpbGUtdHJlZSBzdHJ1Y3R1cmVzIHdoZXJlIGNoaWxkcmVuIHRpbGUgZGF0YSBpcyBhZ2dyZWdhdGVkIGFuZCBzdG9yZWQgaW4gcGFyZW50IHRpbGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGBUaWxlUmVxdWVzdGAgaW5zdGFuY2UgdGhhdCBjb250YWlucyBhIGNvbXBsZXRlIHNldFxuICAgICAqIG9mIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRpbGUgZGF0YSAoaWYgaXQgZXhpc3RzKSBvciB0aGUgbmVhcmVzdCBwYXJlbnQgdGlsZSBkYXRhXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QWdncmVnYXRlZERhdGEocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgY2F0YWxvZ0hybjogb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLFxuICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgbGF5ZXJUeXBlOiBcInZvbGF0aWxlXCIsXG4gICAgICAgICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5nc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gKDAsIGdldFRpbGVfMS5nZXRUaWxlKShyZXF1ZXN0LCBwYXJhbXMsIGFib3J0U2lnbmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBwYXJ0aXRpb24gZGF0YSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOiBJRCwgcXVhZGtleSwgb3IgZGF0YSBoYW5kbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVJlcXVlc3QgVGhlIFtbRGF0YVJlcXVlc3RdXSBpbnN0YW5jZSBvZiB0aGUgY29uZmlndXJlZCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgZGF0YSBmcm9tIHRoZSByZXF1ZXN0ZWQgcGFydGl0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldERhdGEoZGF0YVJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGNvbnN0IGRhdGFIYW5kbGUgPSBkYXRhUmVxdWVzdC5nZXREYXRhSGFuZGxlKCk7XG4gICAgICAgIGNvbnN0IHBhcnRpdGlvbklkID0gZGF0YVJlcXVlc3QuZ2V0UGFydGl0aW9uSWQoKTtcbiAgICAgICAgaWYgKGRhdGFIYW5kbGUgIT09IHVuZGVmaW5lZCB8fCBwYXJ0aXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoZGF0YUhhbmRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkUGFydGl0aW9uKGRhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBkYXRhUmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcnRpdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydGl0aW9uSWREYXRhSGFuZGxlID0gYXdhaXQgdGhpcy5nZXREYXRhSGFuZGxlQnlQYXJ0aXRpb25JZChwYXJ0aXRpb25JZCwgZGF0YVJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSwgZGF0YVJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFBhcnRpdGlvbihwYXJ0aXRpb25JZERhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBkYXRhUmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGRhdGEgcHJvdmlkZWQuIEFkZCBkYXRhSGFuZGxlLCBwYXJ0aXRpb25JZCBvciBxdWFkS2V5IHRvIHRoZSBEYXRhUmVxdWVzdCBvYmplY3RgKSk7XG4gICAgfVxuICAgIGFzeW5jIGdldFBhcnRpdGlvbnMocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RfMS5RdWFkS2V5UGFydGl0aW9uc1JlcXVlc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1YWRLZXkgPSByZXF1ZXN0LmdldFF1YWRLZXkoKTtcbiAgICAgICAgICAgIGlmICghcXVhZEtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IFF1YWRLZXlcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnRfMS5RdWVyeUNsaWVudCh0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHF1YWRUcmVlSW5kZXhSZXF1ZXN0ID0gbmV3IFF1YWRUcmVlSW5kZXhSZXF1ZXN0XzEuUXVhZFRyZWVJbmRleFJlcXVlc3Qob2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCB0aGlzLmxheWVySWQsIFwidm9sYXRpbGVcIilcbiAgICAgICAgICAgICAgICAud2l0aFF1YWRLZXkocXVhZEtleSlcbiAgICAgICAgICAgICAgICAud2l0aERlcHRoKHJlcXVlc3QuZ2V0RGVwdGgoKSlcbiAgICAgICAgICAgICAgICAud2l0aEFkZGl0aW9uYWxGaWVsZHMocmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmZldGNoUXVhZFRyZWVJbmRleChxdWFkVHJlZUluZGV4UmVxdWVzdCwgYWJvcnRTaWduYWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0LmdldFBhcnRpdGlvbklkcygpKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBRdWVyeUNsaWVudF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmdldFBhcnRpdGlvbnNCeUlkKHJlcXVlc3QsIHRoaXMubGF5ZXJJZCwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlfMS5NZXRhZGF0YUNhY2hlUmVwb3NpdG9yeSh0aGlzLnNldHRpbmdzLmNhY2hlKTtcbiAgICAgICAgaWYgKHJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSAhPT0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZU9ubHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnMgPSBjYWNoZS5nZXQocmVxdWVzdCwgdGhpcy5ocm4udG9TdHJpbmcoKSwgdGhpcy5sYXllcklkKTtcbiAgICAgICAgICAgIGlmIChwYXJ0aXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbEZpZWxkcyA9IHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpO1xuICAgICAgICAgICAgICAgIGxldCBleGlzdEZpZWxkcztcbiAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICBleGlzdEZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbnMuZXZlcnkoKHBhcnRpdGlvbikgPT4gcGFydGl0aW9uW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYWRkaXRpb25hbEZpZWxkcyB8fFxuICAgICAgICAgICAgICAgICAgICAhZXhpc3RGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEZpZWxkcy5sZW5ndGggPT09IGV4aXN0RmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgcGFydGl0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YVJlcXVlc3RCaWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwibWV0YWRhdGFcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmdldFBhcnRpdGlvbnMobWV0YVJlcXVlc3RCaWxkZXIsIHtcbiAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxGaWVsZHM6IHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpLFxuICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5ICYmXG4gICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FjaGUucHV0KHJlcXVlc3QsIHRoaXMuaHJuLnRvU3RyaW5nKCksIHRoaXMubGF5ZXJJZCwgbWV0YWRhdGEucGFydGl0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtZXRhZGF0YSk7XG4gICAgfVxuICAgIGFzeW5jIGRvd25sb2FkUGFydGl0aW9uKGRhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBiaWxsaW5nVGFnKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwidm9sYXRpbGUtYmxvYlwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuVm9sYXRpbGVCbG9iQXBpLmdldFZvbGF0aWxlQmxvYihidWlsZGVyLCB7XG4gICAgICAgICAgICBkYXRhSGFuZGxlLFxuICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgYmlsbGluZ1RhZ1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBiYXNlVXJsIGFuZCBjcmVhdGVzIHJlcXVlc3RCdWlsZGVyIGZvciBzZW5kaW5nIHJlcXVlc3RzIHRvIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UuXG4gICAgICogQHBhcmFtIGJ1aWxkZXJUeXBlIGVuZHBvaW50IG5hbWUgaXMgbmVlZGVkIHRvIGNyZWF0ZSBwcm9wcmlhdGUgcmVxdWVzdEJ1aWxkZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHJlcXVlc3RCdWlsZGVyXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmVxdWVzdEJ1aWxkZXIoYnVpbGRlclR5cGUsIGhybiwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShidWlsZGVyVHlwZSwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCBocm4sIGFib3J0U2lnbmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW5kIHJldHVybnMgcGFydGl0aW9uIG1ldGFkYXRhXG4gICAgICogQHBhcmFtIHBhcnRpdGlvbklkIFRoZSBuYW1lIG9mIHRoZSBwYXJ0aXRpb24gdG8gZmV0Y2guXG4gICAgICogQHBhcmFtIGZldGNoT3B0aW9uIFRoZSBvcHRpb24gb2YgY2FjaGluZyAob25saW5lIG9ubHkgb3IgcmV0dXJuIGZyb20gY2FjaGUgaWYgZXhpc3QpXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIG9mIHBhcnRpdGlvbiBtZXRhZGF0YSB3aGljaCB1c2VkIHRvIGdldCBwYXJ0aXRpb24gZGF0YVxuICAgICAqL1xuICAgIGFzeW5jIGdldERhdGFIYW5kbGVCeVBhcnRpdGlvbklkKHBhcnRpdGlvbklkLCBmZXRjaE9wdGlvbiwgYmlsbGluZ1RhZykge1xuICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBRdWVyeUNsaWVudF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBwYXJ0aXRpb25zUmVxdWVzdCA9IG5ldyBQYXJ0aXRpb25zUmVxdWVzdF8xLlBhcnRpdGlvbnNSZXF1ZXN0KClcbiAgICAgICAgICAgIC53aXRoUGFydGl0aW9uSWRzKFtwYXJ0aXRpb25JZF0pXG4gICAgICAgICAgICAud2l0aEZldGNoT3B0aW9uKGZldGNoT3B0aW9uKTtcbiAgICAgICAgaWYgKGJpbGxpbmdUYWcpIHtcbiAgICAgICAgICAgIHBhcnRpdGlvbnNSZXF1ZXN0LndpdGhCaWxsaW5nVGFnKGJpbGxpbmdUYWcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgcXVlcnlDbGllbnQuZ2V0UGFydGl0aW9uc0J5SWQocGFydGl0aW9uc1JlcXVlc3QsIHRoaXMubGF5ZXJJZCwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pKTtcbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnBhcnRpdGlvbnMgJiZcbiAgICAgICAgICAgIG1ldGFkYXRhLnBhcnRpdGlvbnNbMF0gJiZcbiAgICAgICAgICAgIG1ldGFkYXRhLnBhcnRpdGlvbnNbMF0uZGF0YUhhbmRsZVxuICAgICAgICAgICAgPyBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdLmRhdGFIYW5kbGVcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZWplY3QobmV3IG9scF9zZGtfY29yZV8xLkh0dHBFcnJvcihvbHBfc2RrX2NvcmVfMS5TVEFUVVNfQ09ERVMuTk9UX0ZPVU5ELCBgTm8gcGFydGl0aW9uIGRhdGFIYW5kbGUgZm9yIHBhcnRpdGlvbiAke3BhcnRpdGlvbklkfS4gSFJOOiAke3RoaXMuaHJufWApKTtcbiAgICB9XG59XG5leHBvcnRzLlZvbGF0aWxlTGF5ZXJDbGllbnQgPSBWb2xhdGlsZUxheWVyQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9DYXRhbG9nQ2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9DYXRhbG9nUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRGF0YVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0YXRpc3RpY3NDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0YXRpc3RpY3NSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TdW1tYXJ5UmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vVmVyc2lvbmVkTGF5ZXJDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1ZvbGF0aWxlTGF5ZXJDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0NvbmZpZ0NsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQ2F0YWxvZ3NSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TY2hlbWFEZXRhaWxzUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQXJ0aWZhY3RDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1BhcnRpdGlvbnNSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9RdWVyeUNsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vUXVhZFRyZWVJbmRleFJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vU2NoZW1hUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9MYXllclZlcnNpb25zUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vSW5kZXhMYXllckNsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vSW5kZXhRdWVyeVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0cmVhbUxheWVyQ2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TdWJzY3JpYmVSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9Qb2xsUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vVW5zdWJzY3JpYmVSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TZWVrUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vVGlsZVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi91dGlsc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vY2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jYWNoZVwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0VGlsZSA9IGdldFRpbGU7XG5leHBvcnRzLmZldGNoUXVhZFRyZWVJbmRleCA9IGZldGNoUXVhZFRyZWVJbmRleDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG5jb25zdCBRdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5XzEgPSByZXF1aXJlKFwiLi4vY2FjaGUvUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeVwiKTtcbmNvbnN0IFF1YWRUcmVlSW5kZXhSZXF1ZXN0XzEgPSByZXF1aXJlKFwiLi4vY2xpZW50L1F1YWRUcmVlSW5kZXhSZXF1ZXN0XCIpO1xuY29uc3QgUXVlcnlDbGllbnRfMSA9IHJlcXVpcmUoXCIuLi9jbGllbnQvUXVlcnlDbGllbnRcIik7XG4vKipcbiAqIEZldGNoZXMgYXN5bmNocm9ub3VzbHkgZGF0YSBmcm9tIGEgdGlsZSBvciBmcm9tIGl0cyBuZWFyZXN0IGFuY2VzdG9yIGlmIG5vdCBmb3VuZC5cbiAqXG4gKiBUaGUgdGlsZSBpcyBhIGdlb21ldHJpYyBhcmVhIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlLlxuICogVGhlIHF1YWQgdHJlZSBtZXRhZGF0YSBmZXRjaGVzIHRoZSBibG9iIG9mIG5lZWRlZCB0aWxlIGZyb20gdGhlIEhFUkUgUXVlcnkgU2VydmljZSxcbiAqIHRoZW4gY2FjaGVzIGl0LCBhbmQgcmV0dXJucyB0byB0aGUgdXNlci5cbiAqIFRvIGRpc2FibGUgY2FjaGluZyBvZiBtZXRhZGF0YSB1c2UgYHJlcXVlc3Qud2l0aEZldGNoT3B0aW9uKEZldGNoT3B0aW9ucy5PbmxpbmVPbmx5KWAuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdHMgdGhlIFtbVGlsZVJlcXVlc3RdXSBpbnN0YW5jZSB3aXRoIHRoZSBjb25maWd1cmVkIHBhcmFtZXRlcnMuXG4gKiBAc2VlIFtbVGlsZVJlcXVlc3RdXVxuICpcbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCBUaGUgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gKiBAc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqICBjb25zdCBwYXJhbXM6IEdldFRpbGVQYXJhbXMgPSB7XG4gKiAgICAgICBzZXR0aW5nczogXCIlIHlvdXIgYE9scENsaWVudFNldHRpbmdzYCBpbnN0YW5jZSAlIFwiLFxuICogICAgICAgY2F0YWxvZ0hybjogXCIlIHRoZSBIUk4gaW5zdGFuY2Ugb2YgeW91ciBjYXRhbG9nICVcIixcbiAqICAgICAgIGxheWVySWQ6IFwiJSB5b3VyIGxheWVyIElEICVcIixcbiAqICAgICAgIGxheWVyVHlwZTogXCIlIHZlcnNpb25lZCBvciB2b2xhdGlsZSAlXCIsXG4gKiAgIH1cbiAqXG4gKiAgY29uc3QgcmVxdWVzdCA9IG5ldyBUaWxlUmVxdWVzdCgpO1xuICpcbiAqICBjb25zdCB0aWxlMSA9IGF3YWl0IGdldFRpbGUocmVxdWVzdC53aXRoVGlsZUtleSh5b3VyVGlsZUtleTEpLCBwYXJhbXMpO1xuICogIGNvbnN0IHRpbGUyID0gYXdhaXQgZ2V0VGlsZShyZXF1ZXN0LndpdGhUaWxlS2V5KHlvdXJUaWxlS2V5MiksIHBhcmFtcyk7XG4gKlxuICogYGBgXG4gKlxuICogQHJldHVybnMgVGhlIGJsb2Igb2YgdGhlIHJlcXVlc3RlZCB0aWxlIG9yIHRoZSBibG9iIG9mIHRoZSBjbG9zZXN0IHBhcmVudCBUaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRUaWxlKHJlcXVlc3QsIHBhcmFtcywgYWJvcnRTaWduYWwpIHtcbiAgICBsZXQgY2F0YWxvZ1ZlcnNpb247XG4gICAgY29uc3QgcXVhZEtleSA9IHJlcXVlc3QuZ2V0VGlsZUtleSgpO1xuICAgIGlmICghcXVhZEtleSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBRdWFkS2V5XCIpKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5sYXllclR5cGUgPT09IFwidmVyc2lvbmVkXCIpIHtcbiAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPSBwYXJhbXMuY2F0YWxvZ1ZlcnNpb247XG4gICAgfVxuICAgIGNvbnN0IGJsb2JUeXBlID0gcGFyYW1zLmxheWVyVHlwZSA9PT0gXCJ2ZXJzaW9uZWRcIiA/IFwiYmxvYlwiIDogXCJ2b2xhdGlsZS1ibG9iXCI7XG4gICAgY29uc3QgYmxvYlJlcXVlc3RCdWlsZGVyID0gYXdhaXQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKGJsb2JUeXBlLCBcInYxXCIsIHBhcmFtcy5zZXR0aW5ncywgcGFyYW1zLmNhdGFsb2dIcm4sIGFib3J0U2lnbmFsKTtcbiAgICBjb25zdCBkZWx0YSA9IDQ7XG4gICAgY29uc3QgcmVxdWVzdGVkVGlsZUtleSA9IG9scF9zZGtfY29yZV8xLlRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKHF1YWRLZXkucm93LCBxdWFkS2V5LmNvbHVtbiwgcXVhZEtleS5sZXZlbCk7XG4gICAgbGV0IHF1YWRUcmVlSW5kZXggPSBudWxsO1xuICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5KSB7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IFF1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnlfMS5RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5KHBhcmFtcy5zZXR0aW5ncy5jYWNoZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRlbHRhOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEluQ2FjaGUgPSByZXF1ZXN0ZWRUaWxlS2V5LmNoYW5nZWRMZXZlbEJ5KC1pKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZFRyZWUgPSBjYWNoZS5nZXQoe1xuICAgICAgICAgICAgICAgIGhybjogcGFyYW1zLmNhdGFsb2dIcm4udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBsYXllcklkOiBwYXJhbXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICBkZXB0aDogZGVsdGEsXG4gICAgICAgICAgICAgICAgcm9vdDogcGFyZW50SW5DYWNoZSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBjYXRhbG9nVmVyc2lvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkVHJlZSkge1xuICAgICAgICAgICAgICAgIHF1YWRUcmVlSW5kZXggPSBjYWNoZWRUcmVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFRpbGVLZXkgPSByZXF1ZXN0ZWRUaWxlS2V5LmNoYW5nZWRMZXZlbEJ5KC1kZWx0YSk7XG4gICAgaWYgKCFxdWFkVHJlZUluZGV4KSB7XG4gICAgICAgIHF1YWRUcmVlSW5kZXggPSBhd2FpdCBmZXRjaFF1YWRUcmVlSW5kZXgoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24sXG4gICAgICAgICAgICBkZXB0aDogZGVsdGEsXG4gICAgICAgICAgICBmZXRjaE9wdGlvbnM6IHJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSxcbiAgICAgICAgICAgIHRpbGVLZXk6IHBhcmVudFRpbGVLZXksXG4gICAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICAgIGJpbGxpbmdUYWc6IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXF1YWRUcmVlSW5kZXguc3ViUXVhZHMgfHwgIXF1YWRUcmVlSW5kZXguc3ViUXVhZHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IFJlc3BvbnNlKG51bGwsIHtcbiAgICAgICAgICAgIHN0YXR1czogMjA0LFxuICAgICAgICAgICAgc3RhdHVzVGV4dDogXCJObyBDb250ZW50XCJcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgUXVhZEtleSBvciBmb3IgdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgY29uc3Qgc3ViUXVhZHMgPSBxdWFkVHJlZUluZGV4LnN1YlF1YWRzO1xuICAgIGxldCBjdXJyZW50VGlsZUtleSA9IHJlcXVlc3RlZFRpbGVLZXk7XG4gICAgbGV0IGN1cnJlbnREZWx0YSA9IGRlbHRhO1xuICAgIGZvciAobGV0IGxldmVsID0gY3VycmVudFRpbGVLZXkubGV2ZWw7IGxldmVsID49IHBhcmVudFRpbGVLZXkubGV2ZWw7IC0tbGV2ZWwpIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBzdWJRdWFkcy5maW5kKChpdGVtKSA9PiBpdGVtLnN1YlF1YWRLZXkgPT09IGN1cnJlbnRUaWxlS2V5LmdldFN1YkhlcmVUaWxlKGN1cnJlbnREZWx0YSkpO1xuICAgICAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkJsb2JBcGkuZ2V0QmxvYihibG9iUmVxdWVzdEJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBkYXRhSGFuZGxlOiBtZXRhZGF0YS5kYXRhSGFuZGxlLFxuICAgICAgICAgICAgICAgIGxheWVySWQ6IHBhcmFtcy5sYXllcklkLFxuICAgICAgICAgICAgICAgIGJpbGxpbmdUYWc6IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY3VycmVudFRpbGVLZXkgPSBjdXJyZW50VGlsZUtleS5wYXJlbnQoKTtcbiAgICAgICAgICAgIGN1cnJlbnREZWx0YSA9IHBhcmVudFRpbGVLZXkubGV2ZWwgLSBjdXJyZW50VGlsZUtleS5sZXZlbDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYmxvYiBmb3IgVGlsZTogJHtKU09OLnN0cmluZ2lmeShxdWFkS2V5KX1gKSk7XG59XG4vKipcbiAqIFRoZSBmdW5jdGlvbiBzaG91bGQgcmVxdWVzdCBxdWFkIHRyZWUgaW5kZXggZm9yIHRoZSBwYXJlbnQgdGlsZSB3aXRoIGRlbHRhIDRcbiAqIGFuZCBjYWNoZSB0aGUgcmVzcG9uc2VzIGluIGNhY2hlIGZvciBsYXRlciBjYWxscy5cbiAqIEBoaWRkZW5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hRdWFkVHJlZUluZGV4KHBhcmFtcykge1xuICAgIGNvbnN0IGNhY2hlID0gbmV3IFF1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnlfMS5RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5KHBhcmFtcy5zZXR0aW5ncy5jYWNoZSk7XG4gICAgY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnRfMS5RdWVyeUNsaWVudChwYXJhbXMuc2V0dGluZ3MpO1xuICAgIGNvbnN0IHF1YWRUcmVlSW5kZXhSZXF1ZXN0ID0gbmV3IFF1YWRUcmVlSW5kZXhSZXF1ZXN0XzEuUXVhZFRyZWVJbmRleFJlcXVlc3QocGFyYW1zLmNhdGFsb2dIcm4sIHBhcmFtcy5sYXllcklkLCBwYXJhbXMubGF5ZXJUeXBlKVxuICAgICAgICAud2l0aFF1YWRLZXkocGFyYW1zLnRpbGVLZXkpXG4gICAgICAgIC53aXRoRGVwdGgocGFyYW1zLmRlcHRoKTtcbiAgICBpZiAocGFyYW1zLmxheWVyVHlwZSA9PT0gXCJ2ZXJzaW9uZWRcIikge1xuICAgICAgICBxdWFkVHJlZUluZGV4UmVxdWVzdC53aXRoVmVyc2lvbihwYXJhbXMuY2F0YWxvZ1ZlcnNpb24pO1xuICAgIH1cbiAgICBjb25zdCBxdWFkVHJlZUluZGV4ID0gYXdhaXQgcXVlcnlDbGllbnQuZmV0Y2hRdWFkVHJlZUluZGV4KHF1YWRUcmVlSW5kZXhSZXF1ZXN0LCBwYXJhbXMuYWJvcnRTaWduYWwpO1xuICAgIGlmIChwYXJhbXMuZmV0Y2hPcHRpb25zICE9PSBvbHBfc2RrX2NvcmVfMS5GZXRjaE9wdGlvbnMuT25saW5lT25seSAmJlxuICAgICAgICBxdWFkVHJlZUluZGV4LnN1YlF1YWRzKSB7XG4gICAgICAgIGNhY2hlLnB1dCh7XG4gICAgICAgICAgICBocm46IHBhcmFtcy5jYXRhbG9nSHJuLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBsYXllcklkOiBwYXJhbXMubGF5ZXJJZCxcbiAgICAgICAgICAgIGRlcHRoOiBwYXJhbXMuZGVwdGgsXG4gICAgICAgICAgICByb290OiBwYXJhbXMudGlsZUtleSxcbiAgICAgICAgICAgIHRyZWU6IHF1YWRUcmVlSW5kZXgsXG4gICAgICAgICAgICB2ZXJzaW9uOiBwYXJhbXMuY2F0YWxvZ1ZlcnNpb25cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocXVhZFRyZWVJbmRleCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdmFsaWRhdGVQYXJ0aXRpb25zSWRzTGlzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZ2V0VGlsZVwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnZhbGlkYXRlQmlsbGluZ1RhZyA9IHZhbGlkYXRlQmlsbGluZ1RhZztcbi8qKlxuICogVmFsaWRhdGVzIHRoZSBiaWxsaW5pZyB0YWcuXG4gKlxuICogSXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICpcbiAqIEBwYXJhbSB0YWcgVGhlIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGJpbGxpbmcgdGFnLlxuICogQHJldHVybiBUaGUgYmlsbGluZyB0YWcgaWYgaXQncyB2YWxpZC4gT3RoZXJ3aXNlLCB0aHJvd3MgYW4gZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gL15bQS1aYS16MC05Xy1dezQsMTZ9JC87XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QodGFnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYmlsbGluZyB0YWcgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGFnO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy52YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0ID0gdmFsaWRhdGVQYXJ0aXRpb25zSWRzTGlzdDtcbi8qKlxuICogVmFsaWRhdGVzIGEgbGlzdCBvZiBwYXJ0aXRpb25zIElEcy5cbiAqXG4gKiBJdCBtdXN0IGJlIGJldHdlZW4gMSZuZGFzaDsxMDAgaXRlbXMuXG4gKlxuICogQHBhcmFtIGxpc3QgVGhlIGxpc3RzIG9mIHN0cmluZ3MgdGhhdCByZXByZXNlbnQgdGhlIHBhcnRpdGlvbnMgSURzLlxuICogQHJldHVybnMgVGhlIGxpc3Qgb2Ygc3RyaW5ncyBpZiBpdCdzIHZhbGlkLiBPdGhlcndpc2UsIHRocm93cyBhbiBlcnJvci5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXJ0aXRpb25zSWRzTGlzdChsaXN0KSB7XG4gICAgY29uc3QgTElTVF9NQVhfTEVOR1RIID0gMTAwO1xuICAgIGNvbnN0IGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPCAxIHx8IGxlbmd0aCA+IExJU1RfTUFYX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFydGl0aW9uIGlkcyBxdWFudGl0eSBtdXN0IGJlIGJldHdlZW4gMSAtIDEwMFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG5jb25zdCBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdGNvbnN0IGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHRjb25zdCBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0Y29uc3QgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyBtb2R1bGVJZCArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbmxldCBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vaW5kZXgud2ViLmpzXCIpO1xuIiwiIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
12773
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QWE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELFVBQVUsNEJBQTRCLGlCQUFpQjtBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGdDQUFnQztBQUNoQyxvQkFBb0IsbUJBQU8sQ0FBQywyREFBYTtBQUN6QyxnQkFBZ0IsbUJBQU8sQ0FBQyxtREFBUztBQUNqQyxvQkFBb0IsbUJBQU8sQ0FBQywyREFBYTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRixZQUFZO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSx3RkFBd0YsWUFBWSxJQUFJLGdCQUFnQixFQUFFLDBCQUEwQjtBQUNwSjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxzQkFBc0I7Ozs7Ozs7Ozs7O0FDL0dUO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLE9BQU87QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixLQUFLLFdBQVcsT0FBTztBQUNwRCxtQkFBbUIsS0FBSztBQUN4QixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixLQUFLLFdBQVcsT0FBTztBQUNwRCxtQkFBbUIsS0FBSztBQUN4QixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEtBQUssWUFBWSxLQUFLO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEtBQUsscUJBQXFCLEtBQUs7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixLQUFLLFdBQVcsT0FBTztBQUNwRCxtQkFBbUIsS0FBSztBQUN4QixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsS0FBSyxjQUFjLFdBQVc7QUFDM0QsbUJBQW1CLEtBQUs7QUFDeEIsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEtBQUssd0JBQXdCLEtBQUs7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxVQUFVLE9BQU87QUFDdkQsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsWUFBWSxRQUFRO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxZQUFZLFFBQVE7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsVUFBVSxPQUFPO0FBQ3ZELG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxvQkFBb0IsUUFBUTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLGtCQUFrQixRQUFRO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsdUJBQXVCLFFBQVE7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsVUFBVSxPQUFPO0FBQ3ZELG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLFlBQVksUUFBUTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLFVBQVUsT0FBTztBQUN6RCxtQkFBbUIsUUFBUTtBQUMzQixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxZQUFZLFNBQVM7QUFDN0QsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVEsWUFBWSxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxZQUFZLFFBQVE7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLFVBQVUsT0FBTztBQUN6RCxtQkFBbUIsUUFBUTtBQUMzQixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVEsWUFBWSxTQUFTO0FBQzdELG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVEsWUFBWSxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxvQkFBb0I7QUFDL0QsMENBQTBDLG1CQUFtQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxVQUFVLE9BQU87QUFDekQsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxZQUFZLFNBQVM7QUFDN0QsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSx1QkFBdUIsUUFBUTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLG9CQUFvQixRQUFRO0FBQ3BFO0FBQ0EsdURBQXVELGdDQUFnQztBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLHNCQUFzQixRQUFRO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVEsWUFBWSxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFTLHFCQUFxQixTQUFTO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFTLFlBQVksU0FBUztBQUMvRDtBQUNBLCtDQUErQyx3QkFBd0I7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFNBQVMsV0FBVyxlQUFlO0FBQ3BFLG1CQUFtQixTQUFTO0FBQzVCLG1CQUFtQixlQUFlO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsU0FBUyxxQkFBcUIsU0FBUztBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyx3QkFBd0I7QUFDdkUsMENBQTBDLG1CQUFtQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFTLHFCQUFxQixTQUFTO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFNBQVMsV0FBVyxlQUFlO0FBQ3BFLG1CQUFtQixTQUFTO0FBQzVCLG1CQUFtQixlQUFlO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFTLFdBQVcsZUFBZTtBQUNwRSxtQkFBbUIsU0FBUztBQUM1QixtQkFBbUIsZUFBZTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxVQUFVLE9BQU8sV0FBVyxPQUFPO0FBQzNFLG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixPQUFPO0FBQzFCLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLHFCQUFxQixRQUFRO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxXQUFXLE9BQU87QUFDMUQsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLFVBQVUsT0FBTyxXQUFXLE9BQU87QUFDM0UsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUIsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxRQUFRLFdBQVcsT0FBTztBQUMxRCxtQkFBbUIsUUFBUTtBQUMzQixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxVQUFVLE9BQU87QUFDekQsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsUUFBUSxVQUFVLE9BQU8sV0FBVyxPQUFPO0FBQzNFLG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixPQUFPO0FBQzFCLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFFBQVEsV0FBVyxPQUFPO0FBQzFELG1CQUFtQixRQUFRO0FBQzNCLG1C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LFdBQVc7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsV0FBVyxZQUFZLFdBQVc7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixNQUFNLFlBQVksTUFBTTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsV0FBVyxZQUFZLFdBQVc7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxxQkFBcUIsUUFBUTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsaUJBQWlCLFFBQVE7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsZ0JBQWdCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLG9CQUFvQixRQUFRO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxvQkFBb0IsUUFBUTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLE9BQU8sU0FBUyxFQUFFLE9BQU87QUFDL0QsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLFNBQVM7QUFDNUIsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxnQkFBZ0I7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLHVCQUF1QixRQUFRO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUSxvQkFBb0IsUUFBUTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsbUJBQW1CLFFBQVE7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixRQUFRLFdBQVcsVUFBVTtBQUMzRCxtQkFBbUIsUUFBUTtBQUMzQixtQkFBbUIsVUFBVTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEscUJBQXFCLFFBQVE7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsV0FBVyxVQUFVO0FBQzNELG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEscUJBQXFCLFFBQVE7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEsV0FBVyxVQUFVO0FBQzNELG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFFBQVEscUJBQXFCLFFBQVE7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQy8yQmE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qs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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc01BQXNNLFNBQVMsY0FBYyxZQUFZLEtBQUssSUFBSTtBQUNsUDtBQUNBO0FBQ0EscUJBQXFCOzs7Ozs7Ozs7OztBQzFMUjtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7Ozs7Ozs7Ozs7QUNoRU47QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsZ0NBQWdDO0FBQ2hDLDZCQUE2QixtQkFBTyxDQUFDLHNFQUE2QjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDOzs7Ozs7Ozs7OztBQ2pIbkI7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsNEJBQTRCO0FBQzVCLDZCQUE2QixtQkFBTyxDQUFDLHNFQUE2QjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7Ozs7Ozs7Ozs7QUMvS2Y7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsbUJBQW1CO0FBQ25CLHVCQUF1QixtQkFBTyxDQUFDLHdEQUFvQjtBQUNuRCxrQ0FBa0MsbUJBQU8sQ0FBQywwRUFBK0I7QUFDekUsa0NBQWtDLG1CQUFPLENBQUMsZ0ZBQWtDO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsME1BQTBNLE1BQU07QUFDaE47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZPQUE2TyxNQUFNO0FBQ25QO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EseU5BQXlOLE1BQU07QUFDL047QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsZUFBZTtBQUN0RSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK05BQStOLE1BQU07QUFDck87QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7Ozs7Ozs7Ozs7QUM3Sk47QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsNEJBQTRCO0FBQzVCLDZCQUE2QixtQkFBTyxDQUFDLHNFQUE2QjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7Ozs7Ozs7Ozs7O0FDckVmO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHFCQUFxQjtBQUNyQiw2QkFBNkIsbUJBQU8sQ0FBQyxzRUFBNkI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7Ozs7Ozs7Ozs7QUNwRVI7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7Ozs7Ozs7Ozs7QUN4RU47QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsd0JBQXdCO0FBQ3hCLHVCQUF1QixtQkFBTyxDQUFDLHdEQUFvQjtBQUNuRCxrQ0FBa0MsbUJBQU8sQ0FBQywwRUFBK0I7QUFDekUsNEJBQTRCLG1CQUFPLENBQUMsOERBQXFCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4Qix5QkFBeUI7QUFDekIseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRUFBK0UsUUFBUTtBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7Ozs7Ozs7Ozs7O0FDaEhYO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHlCQUF5QixHQUFHLHdCQUF3QjtBQUNwRCw2QkFBNkIsbUJBQU8sQ0FBQyxzRUFBNkI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsdUJBQXVCLHdCQUF3Qix3QkFBd0I7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEIseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCOzs7Ozs7Ozs7OztBQzFJWjtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCx5QkFBeUI7QUFDekIsdUJBQXVCLG1CQUFPLENBQUMsd0RBQW9CO0FBQ25ELGtDQUFrQyxtQkFBTyxDQUFDLDBFQUErQjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxpQ0FBaUM7QUFDdEUsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxR0FBcUcsNEJBQTRCO0FBQ2pJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLElBQUk7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2Isa0VBQWtFLGNBQWM7QUFDaEYsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5SEFBeUgsNEJBQTRCO0FBQ3JKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlIQUF5SCw0QkFBNEI7QUFDcko7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLHlCQUF5Qjs7Ozs7Ozs7Ozs7QUNyT1o7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7Ozs7Ozs7Ozs7O0FDeEdYO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHNCQUFzQjtBQUN0Qiw2QkFBNkIsbUJBQU8sQ0FBQyxzRUFBNkI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjs7Ozs7Ozs7Ozs7QUNwRVQ7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsbUJBQW1CO0FBQ25CLHVCQUF1QixtQkFBTyxDQUFDLHdEQUFvQjtBQUNuRCw2QkFBNkIsbUJBQU8sQ0FBQyxzRUFBNkI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7Ozs7Ozs7Ozs7QUNySE47QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOzs7Ozs7Ozs7OztBQ2hFYjtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCw0QkFBNEI7QUFDNUIsdUJBQXVCLG1CQUFPLENBQUMsd0RBQW9CO0FBQ25ELGtDQUFrQyxtQkFBTyxDQUFDLDBFQUErQjtBQUN6RSxrQ0FBa0MsbUJBQU8sQ0FBQyxnRkFBa0M7QUFDNUUsa0JBQWtCLG1CQUFPLENBQUMsZ0RBQWtCO0FBQzVDLDRCQUE0QixtQkFBTyxDQUFDLDhEQUFxQjtBQUN6RCxtQ0FBbUMsbUJBQU8sQ0FBQyw0RUFBNEI7QUFDdkUsK0JBQStCLG1CQUFPLENBQUMsb0VBQXdCO0FBQy9ELHNCQUFzQixtQkFBTyxDQUFDLGtEQUFlO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMElBQTBJLFlBQVksU0FBUyxTQUFTO0FBQ3hLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7Ozs7Ozs7Ozs7O0FDdk5mO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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ZWFkL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2luZGV4LndlYi5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi52ZXJzaW9uLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL2NhY2hlL0FwaUNhY2hlUmVwb3NpdG9yeS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi9jYWNoZS9LZXlWYWx1ZUNhY2hlLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL2NhY2hlL0xSVUNhY2hlLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL2NhY2hlL2luZGV4LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL2NsaWVudC9PbHBDbGllbnRTZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi9jbGllbnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvdXRpbHMvRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL0Rvd25sb2FkTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi91dGlscy9GZXRjaE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvdXRpbHMvSFJOLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL0h0dHBFcnJvci5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi91dGlscy9SZXF1ZXN0QnVpbGRlckZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvdXRpbHMvVGlsZUtleS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi91dGlscy9VdWlkLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL2dldERhdGFTaXplVXRpbC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1jb3JlL2xpYi91dGlscy9nZXRFbnZMb29rdXBVcmwuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvdXRpbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstY29yZS9saWIvdXRpbHMvdXNlckFnZW50LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9pbmRleC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL1JlcXVlc3RCdWlsZGVyLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvYXJ0aWZhY3QtYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvYXV0aG9yaXphdGlvbi1hcGktdjEuMS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL2Jsb2ItYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvYmxvYi52Mi5hcGkuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4uL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9jb25maWctYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvY292ZXJhZ2UtYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvaW5kZXgtYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvaW50ZXJhY3RpdmUtYXBpLXYxLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvbG9va3VwLWFwaS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL21ldGFkYXRhLWFwaS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL3B1Ymxpc2gtYXBpLXYyLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvcXVlcnktYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uLi9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvc3RyZWFtLWFwaS5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi4vb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL3ZvbGF0aWxlLWJsb2ItYXBpLmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2luZGV4LndlYi5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2FjaGUvTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NhY2hlL1F1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnkuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NhY2hlL2luZGV4LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvQXJ0aWZhY3RDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9DYXRhbG9nQ2xpZW50LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvQ2F0YWxvZ1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9DYXRhbG9nVmVyc2lvblJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9DYXRhbG9nc1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9Db25maWdDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9EYXRhUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L0luZGV4TGF5ZXJDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9JbmRleFF1ZXJ5UmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L0xheWVyVmVyc2lvbnNSZXF1ZXN0LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvUGFydGl0aW9uc1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9Qb2xsUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1F1YWRUcmVlSW5kZXhSZXF1ZXN0LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvUXVlcnlDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9TY2hlbWFEZXRhaWxzUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1NjaGVtYVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9TZWVrUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1N0YXRpc3RpY3NDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9TdGF0aXN0aWNzUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1N0cmVhbUxheWVyQ2xpZW50LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvU3Vic2NyaWJlUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1N1bW1hcnlSZXF1ZXN0LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi9jbGllbnQvVGlsZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9VbnN1YnNjcmliZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9WZXJzaW9uZWRMYXllckNsaWVudC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvY2xpZW50L1ZvbGF0aWxlTGF5ZXJDbGllbnQuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL2NsaWVudC9pbmRleC5qcyIsIndlYnBhY2s6Ly9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWQvLi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL3V0aWxzL2dldFRpbGUuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL3V0aWxzL2luZGV4LmpzIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC8uL2xpYi91dGlscy92YWxpZGF0ZUJpbGxpbmdUYWcuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkLy4vbGliL3V0aWxzL3ZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3QuanMiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZC93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2Uge1xuXHRcdHZhciBhID0gZmFjdG9yeSgpO1xuXHRcdGZvcih2YXIgaSBpbiBhKSAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnID8gZXhwb3J0cyA6IHJvb3QpW2ldID0gYVtpXTtcblx0fVxufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2xpYlwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbGliLnZlcnNpb25cIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjQgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxJQl9WRVJTSU9OID0gdm9pZCAwO1xuZXhwb3J0cy5MSUJfVkVSU0lPTiA9IFwiMi4wLjBcIjtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BcGlDYWNoZVJlcG9zaXRvcnkgPSB2b2lkIDA7XG4vKipcbiAqIENhY2hlcyB0aGUgYmFzZSBVUkxzIG9mIHRoZSBBUEkgdXNpbmcgYSBrZXktdmFsdWUgcGFpci5cbiAqIFRoZSBrZXkgZm9ybWF0IGlzIGA8aHJuPjo6PHNlcnZpY2VfbmFtZT46OjxzZXJ2aWNlVmVyc2lvbj46OmFwaWAuXG4gKi9cbmNsYXNzIEFwaUNhY2hlUmVwb3NpdG9yeSB7XG4gICAgY2FjaGU7XG4gICAgaHJuO1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgW1tBcGlDYWNoZVJlcG9zaXRvcnldXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYWNoZSBUaGUgW1tLZXlWYWx1ZUNhY2hlXV0gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGhybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIGZvciB3aGljaCB5b3Ugd2FudCB0byB1c2UgdGhlIFtbQXBpQ2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tBcGlDYWNoZVJlcG9zaXRvcnldXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYWNoZSwgaHJuKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgICAgICAgdGhpcy5ocm4gPSBocm4gPyBocm4udG9TdHJpbmcoKSA6IFwicGxhdGZvcm0tYXBpXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3JlcyBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBuYW1lIG9mIHRoZSBBUEkgc2VydmljZSBmb3Igd2hpY2ggeW91IG5lZWQgdGhlIGtleS12YWx1ZSBwYWlyLlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgc2VydmljZS5cbiAgICAgKiBAcGFyYW0gc2VydmljZVVybCBUaGUgYmFzZSBVUkwgb2YgdGhlIHNlcnZpY2UuXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1dChzZXJ2aWNlLCBzZXJ2aWNlVmVyc2lvbiwgc2VydmljZVVybCwgdHlwZSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZUtleSh0aGlzLmhybiwgc2VydmljZSwgc2VydmljZVZlcnNpb24sIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5wdXQoa2V5LCBzZXJ2aWNlVXJsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJhc2UgVVJMIGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIG5hbWUgb2YgdGhlIEFQSSBzZXJ2aWNlIGZvciB3aGljaCB5b3Ugd2FudCB0byBnZXQgdGhlIGJhc2UgVVJMLlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlVmVyc2lvbiBUaGUgc2VydmljZSB2ZXJzaW9uLlxuICAgICAqIEByZXR1cm4gVGhlIGJhc2UgVVJMIG9mIHRoZSBzZXJ2aWNlLCBvciB1bmRlZmluZWQgaWYgdGhlIGJhc2UgVVJMIGRvZXMgbm90IGV4aXN0LlxuICAgICAqL1xuICAgIGdldChzZXJ2aWNlLCBzZXJ2aWNlVmVyc2lvbiwgdHlwZSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZUtleSh0aGlzLmhybiwgc2VydmljZSwgc2VydmljZVZlcnNpb24sIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgY3JlYXRlS2V5KGhybiwgc2VydmljZSwgc2VydmljZVZlcnNpb24sIHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGAke2hybn06OiR7c2VydmljZX06OiR7c2VydmljZVZlcnNpb259Ojoke3R5cGV9YDtcbiAgICB9XG59XG5leHBvcnRzLkFwaUNhY2hlUmVwb3NpdG9yeSA9IEFwaUNhY2hlUmVwb3NpdG9yeTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5LZXlWYWx1ZUNhY2hlID0gdm9pZCAwO1xuY29uc3QgZ2V0RGF0YVNpemVVdGlsXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvZ2V0RGF0YVNpemVVdGlsXCIpO1xuY29uc3QgTFJVQ2FjaGVfMSA9IHJlcXVpcmUoXCIuL0xSVUNhY2hlXCIpO1xuY29uc3QgQllURVNfSU5fTUIgPSAxMDI0O1xuLyoqXG4gKiBBbiBpbi1tZW1vcnkgY2FjaGluZyBpbnN0YW5jZS5cbiAqXG4gKiBBbGwgdGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VzIHVzZSBpdCBmb3IgcmVhZGluZyBvciBjYWNoaW5nIGluZm9ybWF0aW9uLlxuICovXG5jbGFzcyBLZXlWYWx1ZUNhY2hlIHtcbiAgICBjYWNoZTtcbiAgICAvKipcbiAgICAgKiBDZXJhdGVzIHRoZSBgS2V5VmFsdWVDYWNoZWAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgS2V5VmFsdWVDYWNoZWAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTFJVQ2FjaGVfMS5MUlVDYWNoZShCWVRFU19JTl9NQiAqIEJZVEVTX0lOX01CICogMiwgZ2V0RGF0YVNpemVVdGlsXzEuZ2V0RGF0YVNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoaXMgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIHR5cGUuXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bDsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1dChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSB2YWx1ZSB0aGF0IHlvdSB3YW50IHRvIHJlbW92ZSBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsOyBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVtb3ZlKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBjYWNoZSBhbmQgcmVtb3ZlcyBhbGwgc3RvcmVkIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgY2FjaGUuXG4gICAgICpcbiAgICAgKiBJZiBgbmV3Q2FwYWNpdHlgIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBjYWNoZSBzaXplLFxuICAgICAqIGFsbCBpdGVtcyBhcmUgZXZpY3RlZCB1bnRpbCB0aGUgY2FjaGUgc2hyaW5rcyB0byBgbmV3Q2FwYWNpdHlgLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5ld0NhcGFjaXR5IFRoZSBuZXcgY2FwYWNpdHkgb2YgdGhpcyBjYWNoZSBpbiBNQi5cbiAgICAgKi9cbiAgICBzZXRDYXBhY2l0eShuZXdDYXBhY2l0eSkge1xuICAgICAgICB0aGlzLmNhY2hlLnNldENhcGFjaXR5KG5ld0NhcGFjaXR5ICogQllURVNfSU5fTUIgKiBCWVRFU19JTl9NQik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5IG9mIHRoZSBjYWNoZVxuICAgICAqIHRoYXQgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgdGhlIGNhY2hlIGluIE1CLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGNhcGFjaXR5IG9mIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXRDYXBhY2l0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0Q2FwYWNpdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlXG4gICAgICogdGhhdCBpcyB0aGUgc3VtIG9mIGFsbCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBzaXplIG9mIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRTaXplKCk7XG4gICAgfVxufVxuZXhwb3J0cy5LZXlWYWx1ZUNhY2hlID0gS2V5VmFsdWVDYWNoZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTFJVQ2FjaGUgPSBleHBvcnRzLkVudHJ5ID0gdm9pZCAwO1xuLyoqIEBoaWRkZW4gKi9cbmNsYXNzIEVudHJ5IHtcbiAgICBrZXk7XG4gICAgdmFsdWU7XG4gICAgc2l6ZTtcbiAgICBuZXdlcjtcbiAgICBvbGRlcjtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBzaXplLCBuZXdlciwgb2xkZXIpIHtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5uZXdlciA9IG5ld2VyO1xuICAgICAgICB0aGlzLm9sZGVyID0gb2xkZXI7XG4gICAgfVxufVxuZXhwb3J0cy5FbnRyeSA9IEVudHJ5O1xuLyoqXG4gKiBGaXhlZCBzaXplIGNhY2hlIHRoYXQgZXZpY3RzIGl0cyBlbnRyaWVzIGluIGxlYXN0LXJlY2VudGx5LXVzZWQgb3JkZXIgd2hlbiBpdCBvdmVyZmxvd3MuXG4gKiBNb2RlbGVkIGFmdGVyIHN0YW5kYXJkIEphdmFTY3JpcHQgYE1hcGAgb3RoZXJ3aXNlLlxuICovXG5jbGFzcyBMUlVDYWNoZSB7XG4gICAgbWF4Q2FwYWNpdHk7XG4gICAgc2l6ZUZ1bmN0aW9uO1xuICAgIGNhY2hlU2l6ZSA9IDA7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVybmFsIG1hcCBvYmplY3QgdGhhdCBrZWVwcyB0aGUga2V5LXZhbHVlIHBhaXJzIGFuZCB0aGVpciBvcmRlci5cbiAgICAgKi9cbiAgICBtYXAgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogVGhlIG5ld2VzdCBlbnRyeSwgaS5lLiB0aGUgbW9zdCByZWNlbnRseSB1c2VkIGl0ZW0uXG4gICAgICovXG4gICAgbmV3ZXN0RW50cnkgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvbGRlc3QgZW50cnksIGkuZS4gdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgaXRlbS5cbiAgICAgKi9cbiAgICBvbGRlc3RFbnRyeSA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBgTFJVQ2FjaGVgLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIFtbc2l6ZUZ1bmN0aW9uXV0gY2FuIGJlIHVzZWQgdG8gZmluZSB0dW5lIHRoZSBtZW1vcnkgY29uc3VtcHRpb24gb2YgYWxsIGNhY2hlZFxuICAgICAqIGVsZW1lbnRzLCB0aHVzIFtbY2FjaGVDYXBhY2l0eV1dIG1lYW5zIHRoZW4gbWVtb3J5IHVzZWQuIE90aGVyd2lzZSwgaWZcbiAgICAgKiBbW3NpemVGdW5jdGlvbl1dIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBbW2NhY2hlQ2FwYWNpdHldXSBhY2NvdW50cyBmb3IgdGhlIG1heGltdW1cbiAgICAgKiBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhY2hlQ2FwYWNpdHkgTnVtYmVyIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtYXhpbXVtIGNhY2hlIHNpemUsIG1heSBleHByZXNzXG4gICAgICogbnVtYmVyIG9mIGVudHJpZXMgb3IgbWVtb3J5IGNvbnN1bWVkIGluIGJ5dGVzL21lZ2FieXRlcyBkZXBlbmRpbmcgb24gW1tzaXplRnVuY3Rpb25dXS5cbiAgICAgKiBAcGFyYW0gc2l6ZUZ1bmN0aW9uIEEgZnVuY3Rpb24gZGV0ZXJtaW5pbmcgdGhlIHNpemUgcGVyIGVsZW1lbnQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWF4Q2FwYWNpdHksIHNpemVGdW5jdGlvbiA9ICgpID0+IDEpIHtcbiAgICAgICAgdGhpcy5tYXhDYXBhY2l0eSA9IG1heENhcGFjaXR5O1xuICAgICAgICB0aGlzLnNpemVGdW5jdGlvbiA9IHNpemVGdW5jdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlLCBpLmUuIHRoZSBzdW0gb2YgYWxsIHRoZSBzaXplcyBvZiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHNpemUgb2YgdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlU2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBjYXBhY2l0eSBvZiB0aGUgY2FjaGUsIGkuZS5cbiAgICAgKiB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB0aGF0IG1heSBiZSBjb25zdW1lZCBieSBjYWNoZSBpbiBNQlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGNhcGFjaXR5IG9mIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXRDYXBhY2l0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4Q2FwYWNpdHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG5ld2VzdCBlbnRyeSBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBOZXdlc3QgZW50cnkgaW4gdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIGdldE5ld2VzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3ZXN0RW50cnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG9sZGVzdCBlbnRyeSBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBOb3RlOiBEb2VzIG5vdCBwcm9tb3RlIHRoZSBvbGRlc3QgaXRlbSBhcyBtb3N0IHJlY2VudGx5IHVzZWQgaXRlbS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIE9sZGVzdCBlbnRyeSBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgZ2V0T2xkZXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbGRlc3RFbnRyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBjYXBhY2l0eSBvZiB0aGlzIGNhY2hlLiBJZiBgbmV3Q2FwYWNpdHlgIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBjYWNoZSBzaXplLFxuICAgICAqIGFsbCBpdGVtcyB3aWxsIGJlIGV2aWN0ZWQgdW50aWwgdGhlIGNhY2hlIHNocmlua3MgdG8gYG5ld0NhcGFjaXR5YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXdDYXBhY2l0eSBUaGUgbmV3IGNhcGFjaXR5IG9mIHRoaXMgY2FjaGUuXG4gICAgICovXG4gICAgc2V0Q2FwYWNpdHkobmV3Q2FwYWNpdHkpIHtcbiAgICAgICAgdGhpcy5tYXhDYXBhY2l0eSA9IG5ld0NhcGFjaXR5O1xuICAgICAgICB0aGlzLmV2aWN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgb3IgdXBkYXRlcyBhIGtleS92YWx1ZSBwYWlyIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdGVkIGluIHRoZSBjYWNoZSwgaXQgd2lsbCBiZSB1cGRhdGVkIGFuZCBwcm9tb3RlZCB0byB0aGUgbW9zdCByZWNlbnRseVxuICAgICAqIHVzZWQgaXRlbS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBrZXkgZGlkbid0IGV4aXN0IGluIHRoZSBjYWNoZSwgaXQgd2lsbCBiZSBpbnNlcnRlZCBhcyBtb3N0IHJlY2VudGx5IHVzZWQgaXRlbS4gQW5cbiAgICAgKiBldmljdGlvbiBvZiB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtIHRha2VzIHBsYWNlIGlmIHRoZSBjYWNoZSBleGNlZWRlZCBpdHMgY2FwYWNpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBrZXktdmFsdWUgcGFpciB0byBpbnNlcnQgb3IgdXBkYXRlLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBrZXktdmFsdWUgcGFpciB0byBpbnNlcnQgb3IgdXBkYXRlLlxuICAgICAqIEB0aHJvd3MgQW4gZXJyb3IgaWYgdmFsdWUgc2l6ZSBpcyBiaWdnZXIgdGhhbiBjYWNoZSBzaXplLlxuICAgICAqL1xuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlU2l6ZSA9IHRoaXMuc2l6ZUZ1bmN0aW9uKHZhbHVlKTtcbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlU2l6ZSA9IHRoaXMuY2FjaGVTaXplIC0gZW50cnkuc2l6ZSArIHZhbHVlU2l6ZTtcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICBlbnRyeS5zaXplID0gdmFsdWVTaXplO1xuICAgICAgICAgICAgdGhpcy5wcm9tb3RlRW50cnkoZW50cnkpO1xuICAgICAgICAgICAgdGhpcy5ldmljdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA+IHRoaXMubWF4Q2FwYWNpdHkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yLiBWYWx1ZSBzaXplICgke3ZhbHVlU2l6ZX0pIGlzIHRvIGJpZyBmb3IgY2FjaGUgaXQgKCR7dGhpcy5tYXhDYXBhY2l0eX0pLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cnkgPSBuZXcgRW50cnkoa2V5LCB2YWx1ZSwgdmFsdWVTaXplLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hcC5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXdlc3RFbnRyeSA9IHRoaXMub2xkZXN0RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5ld2VzdEVudHJ5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld2VzdCA9IHRoaXMubmV3ZXN0RW50cnk7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5Lm9sZGVyID0gdGhpcy5uZXdlc3RFbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgbmV3ZXN0Lm5ld2VyID0gZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3ZXN0RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoa2V5LCBlbnRyeSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlU2l6ZSArPSB2YWx1ZVNpemU7XG4gICAgICAgICAgICB0aGlzLmV2aWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdCBpZiBhIGtleS92YWx1ZSBwYWlyIGlzIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUga2V5LXZhbHVlIHBhaXIgaXMgaW4gdGhlIGNhY2hlLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5oYXMoa2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAga2V5IGluIHRoZSBjYWNoZSBhbmQgcmV0dXJucyB0aGUgYXNzb2NpYXRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIHZhbHVlLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUga2V5LXZhbHVlIHBhaXIgaXMgbm90IGluIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvbW90ZUVudHJ5KGVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGNhY2hlIGFuZCByZW1vdmVzIGFsbCBzdG9yZWQga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLm5ld2VzdEVudHJ5ID0gdGhpcy5vbGRlc3RFbnRyeSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FjaGVTaXplID0gMDtcbiAgICAgICAgdGhpcy5tYXAuY2xlYXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhwbGljaXRseSByZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAbm90ZTogVGhpcyBpcyBhbiBleHBsaWNpdCByZW1vdmFsLCB0aHVzLCB0aGUgZXZpY3Rpb24gY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBrZXktdmFsdWUgcGFpciB0byBkZWxldGUuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBrZXktdmFsdWUgcGFpciBleGlzdGVkIGFuZCB3YXMgZGVsZXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMubWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVsZXRlRW50cnkoZW50cnkpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGV2aWN0KCkge1xuICAgICAgICB3aGlsZSAodGhpcy5vbGRlc3RFbnRyeSAhPT0gbnVsbCAmJiB0aGlzLmNhY2hlU2l6ZSA+IHRoaXMubWF4Q2FwYWNpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2aWN0ZWQgPSB0aGlzLmV2aWN0T2xkZXN0KCk7XG4gICAgICAgICAgICBpZiAoZXZpY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGV2aWN0T2xkZXN0KCkge1xuICAgICAgICBpZiAodGhpcy5vbGRlc3RFbnRyeSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbVRvUmVtb3ZlID0gdGhpcy5vbGRlc3RFbnRyeTtcbiAgICAgICAgICAgIHRoaXMub2xkZXN0RW50cnkgPSBpdGVtVG9SZW1vdmUubmV3ZXI7XG4gICAgICAgICAgICBpZiAoaXRlbVRvUmVtb3ZlLm5ld2VyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaXRlbVRvUmVtb3ZlLm5ld2VyLm9sZGVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWFwLmRlbGV0ZShpdGVtVG9SZW1vdmUua2V5KTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVTaXplIC09IGl0ZW1Ub1JlbW92ZS5zaXplO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1Ub1JlbW92ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm9tb3RlRW50cnkoZW50cnkpIHtcbiAgICAgICAgaWYgKGVudHJ5ID09PSB0aGlzLm5ld2VzdEVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gYWxyZWFkeSBuZXdlc3QsIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgLy8gcmUtbGluayBuZXdlciBhbmQgb2xkZXIgaXRlbXNcbiAgICAgICAgaWYgKGVudHJ5Lm5ld2VyKSB7XG4gICAgICAgICAgICBlbnRyeS5uZXdlci5vbGRlciA9IGVudHJ5Lm9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeS5vbGRlcikge1xuICAgICAgICAgICAgZW50cnkub2xkZXIubmV3ZXIgPSBlbnRyeS5uZXdlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkgPT09IHRoaXMub2xkZXN0RW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMub2xkZXN0RW50cnkgPSBlbnRyeS5uZXdlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZS1saW5rIG91cnNlbHZlc1xuICAgICAgICBlbnRyeS5uZXdlciA9IG51bGw7XG4gICAgICAgIGVudHJ5Lm9sZGVyID0gdGhpcy5uZXdlc3RFbnRyeTtcbiAgICAgICAgLy8gZmluYWxseSwgc2V0IG91cnNlbHZlcyBhcyB0aGUgbmV3ZXN0IGVudHJ5XG4gICAgICAgIGlmICh0aGlzLm5ld2VzdEVudHJ5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdlc3QgPSB0aGlzLm5ld2VzdEVudHJ5O1xuICAgICAgICAgICAgbmV3ZXN0Lm5ld2VyID0gZW50cnk7XG4gICAgICAgICAgICB0aGlzLm5ld2VzdEVudHJ5ID0gZW50cnk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlRW50cnkoZW50cnkpIHtcbiAgICAgICAgaWYgKGVudHJ5ID09PSB0aGlzLm5ld2VzdEVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLm5ld2VzdEVudHJ5ID0gZW50cnkub2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZW50cnkubmV3ZXIpIHtcbiAgICAgICAgICAgIGVudHJ5Lm5ld2VyLm9sZGVyID0gZW50cnkub2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5ID09PSB0aGlzLm9sZGVzdEVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLm9sZGVzdEVudHJ5ID0gZW50cnkubmV3ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZW50cnkub2xkZXIpIHtcbiAgICAgICAgICAgIGVudHJ5Lm9sZGVyLm5ld2VyID0gZW50cnkubmV3ZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZVNpemUgLT0gZW50cnkuc2l6ZTtcbiAgICB9XG59XG5leHBvcnRzLkxSVUNhY2hlID0gTFJVQ2FjaGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9MUlVDYWNoZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQXBpQ2FjaGVSZXBvc2l0b3J5XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9LZXlWYWx1ZUNhY2hlXCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5PbHBDbGllbnRTZXR0aW5ncyA9IHZvaWQgMDtcbmNvbnN0IEtleVZhbHVlQ2FjaGVfMSA9IHJlcXVpcmUoXCIuLi9jYWNoZS9LZXlWYWx1ZUNhY2hlXCIpO1xuY29uc3QgRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyXCIpO1xuLyoqXG4gKiDQoW9uZmlndXJlcyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBwbGF0Zm9ybSBjbGllbnRzIChmb3IgZXhhbXBsZSwgW1tDYXRhbG9nQ2xpZW50XV0gb3IgW1tWZXJzaW9uZWRMYXllckNsaWVudF1dKS5cbiAqL1xuY2xhc3MgT2xwQ2xpZW50U2V0dGluZ3Mge1xuICAgIGtleVZhbHVlQ2FjaGU7XG4gICAgZ2V0VmFsaWRUb2tlbjtcbiAgICBlbnY7XG4gICAgZG07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBbW09scENsaWVudFNldHRpbmdzXV0gY2xhc3MuXG4gICAgICogQHJldHVybiBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmdldFZhbGlkVG9rZW4gPSBwYXJhbXMuZ2V0VG9rZW47XG4gICAgICAgIHRoaXMuZW52ID0gcGFyYW1zLmVudmlyb25tZW50O1xuICAgICAgICB0aGlzLmRtID0gcGFyYW1zLmRtIHx8IG5ldyBEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXJfMS5EYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIoKTtcbiAgICAgICAgdGhpcy5rZXlWYWx1ZUNhY2hlID0gbmV3IEtleVZhbHVlQ2FjaGVfMS5LZXlWYWx1ZUNhY2hlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZG93bmxvYWQgbWFuYWdlciBmb3IgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBbW0Rvd25sb2FkTWFuYWdlcl1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGdldCBkb3dubG9hZE1hbmFnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhc3luY2hyb25vdXMgY2FsbGJhY2sgdXNlZCB0byByZXR1cm4gYSBgUHJvbWlzZWAgd2l0aCB0aGUgYWNjZXNzIHRva2VuIGZvciByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGBQcm9taXNlYCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4gc3RyaW5nIGZvciByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBnZXQgdG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkVG9rZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGVudmlyb25tZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IHRoZSBVUkwgb2YgdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAgICAgKiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhIFVSTCBvZiB5b3VyIGN1c3RvbSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3RyaW5nIHdpdGggdGhlIGVudmlyb25tZW50IG5hbWUgb3IgdGhlIFVSTCBvZiB5b3VyIGxvY2FsIGVudmlyb25tZW50LlxuICAgICAqL1xuICAgIGdldCBlbnZpcm9ubWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW52O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWNoZXMgdXNpbmcgYSBrZXktdmFsdWUgcGFpci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBbW0tleVZhbHVlQ2FjaGVdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleVZhbHVlQ2FjaGU7XG4gICAgfVxufVxuZXhwb3J0cy5PbHBDbGllbnRTZXR0aW5ncyA9IE9scENsaWVudFNldHRpbmdzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vT2xwQ2xpZW50U2V0dGluZ3NcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vY2FjaGVcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3V0aWxzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jbGllbnRcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRhdGFTdG9yZURvd25sb2FkTWFuYWdlciA9IHZvaWQgMDtcbmNvbnN0IEh0dHBFcnJvcl8xID0gcmVxdWlyZShcIi4vSHR0cEVycm9yXCIpO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuL2luZGV4XCIpO1xuY29uc3QgdXNlckFnZW50XzEgPSByZXF1aXJlKFwiLi91c2VyQWdlbnRcIik7XG4vKiogQGludGVybmFsXG4gKiAnRGVmZXJyZWRQcm9taXNlJyB0YWtlcyBhbiBleGVjdXRvciBmdW5jdGlvbiBmb3IgZXhlY3V0aW5nIGl0IGxhdGVyLCB3aGVuIFtbZXhlY11dIGlzIGNhbGxlZC5cbiAqIFRoaXMgY2xhc3MgYWxsb3dzIHdyYXBwaW5nIG90aGVyIHByb21pc2VzIG9yIGxvbmcgcnVubmluZyBmdW5jdGlvbnMgZm9yIGxhdGVyIGV4ZWN1dGlvbi5cbiAqL1xuY2xhc3MgRGVmZXJyZWRQcm9taXNlIHtcbiAgICBleGVjdXRvcjtcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBwcm9taXNlIHRvIHN0b3JlIHRoZSBkZWZlcnJlZCBleGVjdXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwcm9taXNlO1xuICAgIHJlc29sdmVGdW5jO1xuICAgIHJlamVjdEZ1bmM7XG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yO1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVGdW5jID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0RnVuYyA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gYGV4ZWNgIGlzIGNhbGxlZCB0aGUgZGVmZXJyZWQgZXhlY3V0b3IgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG4gICAgICovXG4gICAgZXhlYygpIHtcbiAgICAgICAgdGhpcy5leGVjdXRvcigpLnRoZW4odGhpcy5yZXNvbHZlRnVuYykuY2F0Y2godGhpcy5yZWplY3RGdW5jKTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbW0Rvd25sb2FkTWFuYWdlcl1dIGludGVyZmFjZSByZXF1ZXN0ZWQgYnkgdGhlIGBkYXRhc3RvcmUtYXBpYCBtb2R1bGVcbiAqIGZvciBmZXRjaGluZyBkYXRhIGZyb20gdGhlIGJhY2tlbmQgb3Igc2VuZGluZyByZXF1ZXN0cyB0byB0aGUgYmFja2VuZC5cbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzIHlvdSB0byBmZXRjaCBibG9iIG9yIEpTT04gZGF0YSB3aXRoIGFib3J0aW5nIG9yIHJlLXNlbmRpbmcgKG9uIHRpbWVvdXRzKSBtZWNoYW5pc21zXG4gKiB0aGF0IGxpbWl0IG1heGltdW0gcGFyYWxsZWwgcmVxdWVzdHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKlxuICogKiBMaW1pdHMgdGhlIG51bWJlciBvZiBwYXJhbGxlbCBkb3dubG9hZHMuIEl0IGlzIHVzZWZ1bCB3aGVuIHJlcXVlc3RpbmcgYSBsYXJnZSBudW1iZXIgb2YgVVJMcyB0aGF0XG4gKiAgIHdvdWxkIG90aGVyd2lzZSBzdGFsbCB0aGUgYnJvd3Nlci5cbiAqICogUmV0cmllcyB0aGUgZG93bmxvYWRzIHdpdGggYW4gaW5jcmVhc2luZyB0aW1lb3V0IG9uIEhUVFAgNTAzIHJlcGxpZXMuXG4gKi9cbmNsYXNzIERhdGFTdG9yZURvd25sb2FkTWFuYWdlciB7XG4gICAgZmV0Y2hGdW5jdGlvbjtcbiAgICBtYXhSZXRyaWVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIHRvIHdhaXQgYmV0d2VlbiByZXRyaWVzLiBUaGlzIHRpbWVvdXQgaXMgbXVsdGlwbGllZCB3aXRoIHRoZVxuICAgICAqIG51bWJlciBvZiByZXRyaWVzLiBGaXJzdCByZXRyeSB3YWl0cyBmb3IgMCBtcywgc2Vjb25kIHJldHJ5IGZvciA1MDAgbXMsIHRoaXJkIGZvciAxMDAwIG1zLCBhbmRcbiAgICAgKiBzbyBvbi5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmV0cnlUaW1lb3V0ID0gNTAwO1xuICAgIC8qKiBUaGUgbnVtYmVyIG9mIG1heGltdW0gcGFyYWxsZWwgZG93bmxvYWRzLiAqL1xuICAgIHN0YXRpYyBtYXhQYXJhbGxlbERvd25sb2FkcyA9IDE2O1xuICAgIGFjdGl2ZURvd25sb2FkQ291bnQgPSAwO1xuICAgIGRvd25sb2FkUXVldWUgPSBuZXcgQXJyYXkoKTtcbiAgICAvKipcbiAgICAgKiBSZXRyaWVzIHRoZSBkb3dubG9hZHMgd2l0aCBhbiBpbmNyZWFzaW5nIHRpbWVvdXQgb24gSFRUUCA1MDMgcmVwbGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmZXRjaEZ1bmN0aW9uIFRoZSB0eXBlIG9mIGZldGNoLlxuICAgICAqIEBwYXJhbSByZXRyeUNvdW50IGludCwgVGhlIGNvdW50ZXIgb2YgdHJpZXMgdG8gcmUtZmV0Y2ggcmVzcG9uc2UgYWZ0ZXIgdGhlIDUwMyByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gbWF4UmV0cmllcyBpbnQsIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0cmllcyB0byByZS1mZXRjaCBhZnRlciB0aGUgNTAzIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSB1cmwgc3RyaW5nLCBUaGUgVVJMIG9mIHRoZSBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0gaW5pdCBSZXF1ZXN0SW5pdCwgVGhlIGV4dHJhIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZmV0Y2hSZXBlYXRlZGx5KGZldGNoRnVuY3Rpb24sIHJldHJ5Q291bnQsIG1heFJldHJpZXMsIHVybCwgaW5pdCkge1xuICAgICAgICBjb25zdCBtYXhTdWNjZXNzUmVzcG9uc2VDb2RlID0gMjk5O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZ1bmN0aW9uKCgwLCB1c2VyQWdlbnRfMS5hZGRTZW50V2l0aFBhcmFtKSh1cmwpLCBpbml0KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZXF1ZXN0U2hvdWxkUmV0cnlPbkVycm9yKHJlc3BvbnNlLnN0YXR1cykgfHxcbiAgICAgICAgICAgICAgICByZXRyeUNvdW50ID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDw9IG1heFN1Y2Nlc3NSZXNwb25zZUNvZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSBpbmRleF8xLlNUQVRVU19DT0RFUy5GT1VORCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZVRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBcIiB8IEluZm86IFwiICsgcmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgSHR0cEVycm9yXzEuSHR0cEVycm9yKHJlc3BvbnNlLnN0YXR1cywgZXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIuaGFzT3duUHJvcGVydHkoXCJpc0NhbmNlbGxlZFwiKSB8fFxuICAgICAgICAgICAgICAgIChlcnIuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpICYmIGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgfHxcbiAgICAgICAgICAgICAgICByZXRyeUNvdW50ID4gbWF4UmV0cmllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIud2FpdEZvcihEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIucmV0cnlUaW1lb3V0ICogcmV0cnlDb3VudCkudGhlbigoKSA9PiBEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIuZmV0Y2hSZXBlYXRlZGx5KGZldGNoRnVuY3Rpb24sIHJldHJ5Q291bnQgKyAxLCBtYXhSZXRyaWVzLCB1cmwsIGluaXQpKTtcbiAgICB9XG4gICAgc3RhdGljIHJlcXVlc3RTaG91bGRSZXRyeU9uRXJyb3IoY29kZSkge1xuICAgICAgICByZXR1cm4gKChjb2RlID49IGluZGV4XzEuU1RBVFVTX0NPREVTLklOVEVSTkFMX1NFUlZFUl9FUlJPUiAmJlxuICAgICAgICAgICAgY29kZSA8PSBpbmRleF8xLlNUQVRVU19DT0RFUy5ORVRXT1JLX0NPTk5FQ1RfVElNRU9VVCkgfHxcbiAgICAgICAgICAgIGNvZGUgPT09IGluZGV4XzEuU1RBVFVTX0NPREVTLlRPX01BTllfUkVRVUVTVFMpO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgd2FpdEZvcihtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBbW0RhdGFTdG9yZURvd25sb2FkTWFuYWdlcl1dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZldGNoRnVuY3Rpb24gVGhlIGRlZmF1bHQgZmV0Y2ggZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIG1heFJldHJpZXMgVGhlIG1heGltdW0gYW1vdW50IG9mIHRyaWVzIHRvIHJlLWZldGNoIGEgcmVzb3VyY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXJdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihmZXRjaEZ1bmN0aW9uID0gZmV0Y2gsIG1heFJldHJpZXMgPSA1KSB7XG4gICAgICAgIHRoaXMuZmV0Y2hGdW5jdGlvbiA9IGZldGNoRnVuY3Rpb247XG4gICAgICAgIHRoaXMubWF4UmV0cmllcyA9IG1heFJldHJpZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERvd25sb2FkcyBhIFVSTCBhbmQgcmV0dXJucyB0aGUgYFJlc3BvbnNlYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IG1lcmdlIG11bHRpcGxlIHJlcXVlc3RzIHRvIHRoZSBzYW1lIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0aGF0IHlvdSB3YW50IHRvIGRvd25sb2FkLlxuICAgICAqIEBwYXJhbSBpbml0IEV4dHJhIHBhcmFtZXRlcnMgZm9yIHRoZSBkb3dubG9hZC5cbiAgICAgKiBAcmV0dXJuIFRoZSBVUkwgdGhhdCBpcyB1c2VkIHRvIGRvd25sb2FkIGRhdGEuXG4gICAgICovXG4gICAgYXN5bmMgZG93bmxvYWQodXJsLCBpbml0KSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvd25sb2FkQ291bnQgPj1cbiAgICAgICAgICAgIERhdGFTdG9yZURvd25sb2FkTWFuYWdlci5tYXhQYXJhbGxlbERvd25sb2Fkcykge1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWRQcm9taXNlKCgpID0+IHRoaXMuZG9Eb3dubG9hZCh1cmwsIGluaXQpKTtcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRRdWV1ZS5wdXNoKGRlZmVycmVkKTtcbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRvRG93bmxvYWQodXJsLCBpbml0KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Eb3dubG9hZCh1cmwsIGluaXQpIHtcbiAgICAgICAgKyt0aGlzLmFjdGl2ZURvd25sb2FkQ291bnQ7XG4gICAgICAgIHJldHVybiBEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIuZmV0Y2hSZXBlYXRlZGx5KHRoaXMuZmV0Y2hGdW5jdGlvbiwgMCwgdGhpcy5tYXhSZXRyaWVzLCB1cmwsIGluaXQpXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25Eb3dubG9hZERvbmUoKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChhc3luYyAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRG93bmxvYWREb25lKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uRG93bmxvYWREb25lKCkge1xuICAgICAgICAtLXRoaXMuYWN0aXZlRG93bmxvYWRDb3VudDtcbiAgICAgICAgdGhpcy5leGVjRGVmZXJyZWREb3dubG9hZCgpO1xuICAgIH1cbiAgICBleGVjRGVmZXJyZWREb3dubG9hZCgpIHtcbiAgICAgICAgY29uc3QgZnV0dXJlID0gdGhpcy5kb3dubG9hZFF1ZXVlLnBvcCgpO1xuICAgICAgICBpZiAoZnV0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmdXR1cmUuZXhlYygpO1xuICAgIH1cbn1cbmV4cG9ydHMuRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyID0gRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRhdGFTdG9yZVJlcXVlc3RCdWlsZGVyID0gdm9pZCAwO1xuY29uc3QgbGliX3ZlcnNpb25fMSA9IHJlcXVpcmUoXCIuLi8uLi9saWIudmVyc2lvblwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIEFkZHMgYmVhcmVyIHRva2VuIHRvIHRoZSByZXF1ZXN0IGhlYWRlcnNcbiAqIEBwYXJhbSBnZXRCZWFyZXJUb2tlbiBhc3luYyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdG9rZW4gc3RyaW5nLlxuICogQHBhcmFtIGluaXQgcGFyYW1zIHRvIHRoZSByZXF1ZXN0LiBAc2VlIFJlcXVlc3RJbml0IGludGVyZmFjZS5cbiAqXG4gKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdXBkYXRlZCByZXF1ZXN0IHBhcmFtcyAod2l0aCBhZGRlZCB0b2tlbiB0byB0aGUgaGVhZGVycykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFkZEJlYXJlclRva2VuKGdldEJlYXJlclRva2VuLCBpbml0KSB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRCZWFyZXJUb2tlbigpO1xuICAgIGlmIChpbml0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gaWYgZW1wdHkgUmVxdWVzdEluaXQsIGp1c3QgY3JlYXRlIG5ldyBvbmUgYW5kIGFkZCBCZWFyZXIgcm9rZW4gdG8gdGhlIGhlYWRlcnNcbiAgICAgICAgaW5pdCA9IHt9O1xuICAgICAgICBpbml0LmhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgICBpbml0LmhlYWRlcnMuYXBwZW5kKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIiArIHRva2VuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIGNvbnZlcnQgaW5pdC5oZWFkZXJzIHRvIHRoZSBIZWFkZXJzIGlmIHJlY2VpdmVkIGEgcGxhaW4gb2JqZWN0XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgICAgICAvLyBhZGRpbmcgdG9rZW4gdG8gdGhlIGhlYWRlcnNcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgdG9rZW4pO1xuICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGluaXQpO1xufVxuLyoqXG4gKiBBZGRzIHVzZXItYWdlbnQgdG8gdGhlIHJlcXVlc3QgaGVhZGVyc1xuICogQHBhcmFtIGluaXQgcGFyYW1zIHRvIHRoZSByZXF1ZXN0LiBAc2VlIFJlcXVlc3RJbml0IGludGVyZmFjZS5cbiAqXG4gKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdXBkYXRlZCByZXF1ZXN0IHBhcmFtcyAod2l0aCBhZGRlZCB1c2VyLWFnZW50IHRvIHRoZSBoZWFkZXJzKS5cbiAqL1xuZnVuY3Rpb24gYWRkVXNlckFnZW50KGluaXQpIHtcbiAgICBjb25zdCBVU0VSX0FHRU5UID0gYE9MUC1UUy1TREsvJHtsaWJfdmVyc2lvbl8xLkxJQl9WRVJTSU9OfWA7XG4gICAgaWYgKGluaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBpZiBlbXB0eSBSZXF1ZXN0SW5pdCwganVzdCBjcmVhdGUgbmV3IG9uZSBhbmQgYWRkIHVzZXItYWdlbnQgdG8gdGhlIGhlYWRlcnNcbiAgICAgICAgaW5pdCA9IHt9O1xuICAgICAgICBpbml0LmhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gY29udmVydCBpbml0LmhlYWRlcnMgdG8gdGhlIEhlYWRlcnMgaWYgcmVjZWl2ZWQgYSBwbGFpbiBvYmplY3RcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycyk7XG4gICAgICAgIGluaXQuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgfVxuICAgIHJldHVybiBpbml0O1xufVxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBbW1JlcXVlc3RCdWlsZGVyXV0gYW5kIHRoZSBgZG93bmxvYWRCbG9iYCBhbmQgYGRvd25sb2FkYCBtZXRob2RzLlxuICogSXQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIFtbUmVxdWVzdEJ1aWxkZXJdXSBpbnN0YW5jZSB3aXRoIGEgYmFzZSBVUkwgb2YgYSBzZXJ2aWNlLlxuICovXG5jbGFzcyBEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlciBleHRlbmRzIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuUmVxdWVzdEJ1aWxkZXIge1xuICAgIGRvd25sb2FkTWFuYWdlcjtcbiAgICBnZXRCZWFyZXJUb2tlbjtcbiAgICBhYm9ydFNpZ25hbDtcbiAgICAvKipcbiAgICAgKiBDZXJhdGVzIHRoZSBbW0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG93bmxvYWRNYW5hZ2VyIFRoZSBjb25maWd1cmVkIGluc3RhbmNlIG9mIHRoZSBbW0Rvd25sb2FkTWFuYWdlcl1dIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBZb3UgY2FuIHVzZSBvdXIgZGVmYXVsdCBgRGF0YXN0b3JlRG93bmxvYWRNYW5hZ2VyYCBvciBjcmVhdGUgeW91ciBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0gYmFzZVVybCBUaGUgVVJMIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZ2V0QmVhcmVyVG9rZW4gUmV0cmlldmVzIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgW1tEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcl1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRvd25sb2FkTWFuYWdlciwgYmFzZVVybCwgZ2V0QmVhcmVyVG9rZW4sIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIC8qKiBUaGUgVVJMIHN0cmluZy4gKi9cbiAgICAgICAgc3VwZXIoYmFzZVVybCk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyID0gZG93bmxvYWRNYW5hZ2VyO1xuICAgICAgICB0aGlzLmdldEJlYXJlclRva2VuID0gZ2V0QmVhcmVyVG9rZW47XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwgPSBhYm9ydFNpZ25hbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWRzIGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgVVJMLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhIHRoYXQgeW91IHdhbnQgdG8gZG93bmxvYWQuXG4gICAgICogQHBhcmFtIGluaXQgVGhlIGhlbHBlciBvYmplY3QgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBnZW5lcmljcy5cbiAgICAgKi9cbiAgICBhc3luYyBkb3dubG9hZCh1cmwsIGluaXQpIHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmFkZEJlYXJlclRva2VuKGluaXQpO1xuICAgICAgICBvcHRpb25zID0gdGhpcy5hZGRVc2VyQWdlbnQob3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLmFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5hZGRBYm9ydFNpZ25hbChpbml0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZE1hbmFnZXJcbiAgICAgICAgICAgIC5kb3dubG9hZCh1cmwsIG9wdGlvbnMpXG4gICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiByZXN1bHQuanNvbigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWRzIHRoZSBibG9iIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgYmxvYiBkYXRhIHRoYXQgeW91IHdhbnQgdG8gZG93bmxvYWQuXG4gICAgICogQHBhcmFtIGluaXQgVGhlIGhlbHBlciBvYmplY3QgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm4gVGhlIGJsb2IgZGF0YS5cbiAgICAgKi9cbiAgICBhc3luYyBkb3dubG9hZEJsb2IodXJsLCBpbml0KSB7XG4gICAgICAgIGxldCBvcHRpb25zID0gYXdhaXQgdGhpcy5hZGRCZWFyZXJUb2tlbihpbml0KTtcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMuYWRkVXNlckFnZW50KG9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5hYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuYWRkQWJvcnRTaWduYWwoaW5pdClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRNYW5hZ2VyLmRvd25sb2FkKHVybCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGFzeW5jIGFkZEJlYXJlclRva2VuKGluaXQpIHtcbiAgICAgICAgcmV0dXJuIGFkZEJlYXJlclRva2VuKHRoaXMuZ2V0QmVhcmVyVG9rZW4sIGluaXQpO1xuICAgIH1cbiAgICBhZGRVc2VyQWdlbnQoaW5pdCkge1xuICAgICAgICByZXR1cm4gYWRkVXNlckFnZW50KGluaXQpO1xuICAgIH1cbiAgICBhZGRBYm9ydFNpZ25hbChpbml0KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBpbml0IHx8IHt9O1xuICAgICAgICBvcHRpb25zLnNpZ25hbCA9IHRoaXMuYWJvcnRTaWduYWw7XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbn1cbmV4cG9ydHMuRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIgPSBEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRmV0Y2hPcHRpb25zID0gdm9pZCAwO1xuLyoqXG4gKiBFbnVtZXJhdGVzIHRoZSBmZXRjaCBvcHRpb24gdGhhdCBjb250cm9scyBob3cgcmVxdWVzdHMgYXJlIGhhbmRsZWQuXG4gKi9cbnZhciBGZXRjaE9wdGlvbnM7XG4oZnVuY3Rpb24gKEZldGNoT3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIEEgZGVmYXVsdCBvcHRpb24uIFF1ZXJpZXMgdGhlIG5ldHdvcmsgaWYgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3RcbiAgICAgKiBmb3VuZCBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgRmV0Y2hPcHRpb25zW0ZldGNoT3B0aW9uc1tcIk9ubGluZUlmTm90Rm91bmRcIl0gPSAwXSA9IFwiT25saW5lSWZOb3RGb3VuZFwiO1xuICAgIC8qKlxuICAgICAqIFNraXBzIGNhY2hlIGxvb2t1cHMgYW5kIHF1ZXJpZXMgdGhlIG5ldHdvcmsgcmlnaHQgYXdheS5cbiAgICAgKi9cbiAgICBGZXRjaE9wdGlvbnNbRmV0Y2hPcHRpb25zW1wiT25saW5lT25seVwiXSA9IDFdID0gXCJPbmxpbmVPbmx5XCI7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbW1lZGlhdGVseSBpZiBhIGNhY2hlIGxvb2t1cCBmYWlscy5cbiAgICAgKi9cbiAgICBGZXRjaE9wdGlvbnNbRmV0Y2hPcHRpb25zW1wiQ2FjaGVPbmx5XCJdID0gMl0gPSBcIkNhY2hlT25seVwiO1xufSkoRmV0Y2hPcHRpb25zIHx8IChleHBvcnRzLkZldGNoT3B0aW9ucyA9IEZldGNoT3B0aW9ucyA9IHt9KSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkhSTiA9IHZvaWQgMDtcbi8qKlxuICogQ29udGFpbnMgYSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgJm5kYXNoOyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciByZXNvdXJjZXMgc3VjaCBhcyBjYXRhbG9ncywgc2NoZW1hcywgYW5kIHBpcGVsaW5lcy5cbiAqL1xuY2xhc3MgSFJOIHtcbiAgICBkYXRhO1xuICAgIHN0YXRpYyBQQVJUSVRJT05fUE9TID0gMTtcbiAgICBzdGF0aWMgU0VSVklDRV9QT1MgPSAyO1xuICAgIHN0YXRpYyBSRUdJT05fUE9TID0gMztcbiAgICBzdGF0aWMgQUNDT1VOVF9QT1MgPSA0O1xuICAgIHN0YXRpYyBSRVNPVVJDRV9QT1MgPSA1O1xuICAgIHN0YXRpYyBFTlRSSUVTX0NPVU5UID0gSFJOLlJFU09VUkNFX1BPUyArIDE7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBIUk4gZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBIUk4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBgaHJuOmhlcmU6ZGF0YTo6OmV4YW1wbGUtY2F0YWxvZ2BcbiAgICAgKlxuICAgICAqIEBwYXJhbSBocm4gVGhlIEhSTiBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgbmV3IEhSTi5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhocm4pIHtcbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gYWxzbyBhbGxvdyBodHRwIGFuZCBodHRwcyBhcyAnY2F0YWxvZy11cmwnIGxvY2FsIFVSTHNcbiAgICAgICAgaWYgKGhybi5zdGFydHNXaXRoKFwiaHR0cDpcIikgfHwgaHJuLnN0YXJ0c1dpdGgoXCJodHRwczpcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSFJOKHtcbiAgICAgICAgICAgICAgICBwYXJ0aXRpb246IFwiY2F0YWxvZy11cmxcIixcbiAgICAgICAgICAgICAgICBzZXJ2aWNlOiBcImRhdGFzdG9yZVwiLFxuICAgICAgICAgICAgICAgIHJlZ2lvbjogXCJcIixcbiAgICAgICAgICAgICAgICBhY2NvdW50OiBcIlwiLFxuICAgICAgICAgICAgICAgIHJlc291cmNlOiBlbmNvZGVVUklDb21wb25lbnQoaHJuKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGhybi5zcGxpdChcIjpcIik7XG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA8IHRoaXMuRU5UUklFU19DT1VOVCB8fCBlbnRyaWVzWzBdICE9PSBcImhyblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEhSTlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhSTih7XG4gICAgICAgICAgICBwYXJ0aXRpb246IGVudHJpZXNbdGhpcy5QQVJUSVRJT05fUE9TXSxcbiAgICAgICAgICAgIHNlcnZpY2U6IGVudHJpZXNbdGhpcy5TRVJWSUNFX1BPU10sXG4gICAgICAgICAgICByZWdpb246IGVudHJpZXNbdGhpcy5SRUdJT05fUE9TXSxcbiAgICAgICAgICAgIGFjY291bnQ6IGVudHJpZXNbdGhpcy5BQ0NPVU5UX1BPU10sXG4gICAgICAgICAgICByZXNvdXJjZTogZW50cmllcy5zbGljZSh0aGlzLlJFU09VUkNFX1BPUykuam9pbihcIjpcIilcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSFJOIGJhc2VkIG9uIHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIFtbSFJORGF0YV1dLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBUeXBlU2NyaXB0XG4gICAgICogY29uc3QgbXlIcm4gPSBuZXcgSFJOKHtcbiAgICAgKiAgICAgcGFydGl0aW9uOiAnaGVyZS1kZXYnLFxuICAgICAqICAgICBzZXJ2aWNlOiAnZGF0YScsXG4gICAgICogICAgIHJlc291cmNlOiAnZXhhbXBsZS1jYXRhbG9nJ1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVXNlcyBbW2Zyb21TdHJpbmddXSB0byBjcmVhdGUgYW4gSFJOIGZyb20gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIGZyb20gdGhpcyBIUk4uXG4gICAgICogQHJldHVybiBUaGUgW1tIUk5dXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgSFJOIHRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBocm46cGFydGl0aW9uOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBIUk4uXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiAoXCJocm46XCIgK1xuICAgICAgICAgICAgdGhpcy5kYXRhLnBhcnRpdGlvbiArXG4gICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICB0aGlzLmRhdGEuc2VydmljZSArXG4gICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICAodGhpcy5kYXRhLnJlZ2lvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHRoaXMuZGF0YS5yZWdpb24pICtcbiAgICAgICAgICAgIFwiOlwiICtcbiAgICAgICAgICAgICh0aGlzLmRhdGEuYWNjb3VudCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHRoaXMuZGF0YS5hY2NvdW50KSArXG4gICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICB0aGlzLmRhdGEucmVzb3VyY2UpO1xuICAgIH1cbn1cbmV4cG9ydHMuSFJOID0gSFJOO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwRXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIFByb3ZpZGVzIG1vcmUgdXNhYmxlIGVycm9ycyBmcm9tIHRoZSBIRVJFIHBsYXRmb3JtIFNlcnZpY2VzLlxuICpcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiB0aGUgbWV0aG9kc1xuICogdG8gcHJvcGFnYXRlIGVycm9ycyB3aXRoIGFuIEhUVFAgc3RhdHVzIGNvZGUgYW5kIHdpdGggYSBtZXNzYWdlXG4gKiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgdGhlIHJlcXVlc3QuXG4gKiBUaGUgYEh0dHBFcnJvcmAgY2xhc3MgZXh0ZW5kcyBnZW5lcmljIGBFcnJvcmAgY2xhc3MgZnJvbSBWOCBhbmRcbiAqIGFkZHMgcHJvcGVydHkgY29kZSB0byB0aGUgSFRUUCBzdGF0dXNlcy5cbiAqL1xuY2xhc3MgSHR0cEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIHN0YXR1cztcbiAgICAvKiogQSBuYW1lIG9mIHRoZSBlcnJvciB0eXBlLiBUaGUgaW5pdGlhbCB2YWx1ZSBpcyBgRXJyb3JgLiAqL1xuICAgIG5hbWU7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyB0aGUgYEh0dHBFcnJvcmAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBlcnJvciBzdGF0dXMgbnVtYmVyLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHN0YXR1cywgbWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiSHR0cEVycm9yXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZXJyb3IgaXMgYW4gSFRUUCBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgYEVycm9yYCBvYmplY3QgdGhhdCBpcyBjaGVja2VkLlxuICAgICAqIEByZXR1cm5zIFRydWUgaXMgdGhlIGdpdmVuIGVycm9yIGlzIGFuIEhUVFAgZXJyb3I7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNIdHRwRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yLm5hbWUgPT09IFwiSHR0cEVycm9yXCI7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwRXJyb3IgPSBIdHRwRXJyb3I7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVxdWVzdEZhY3RvcnkgPSB2b2lkIDA7XG5jb25zdCBBcGlDYWNoZVJlcG9zaXRvcnlfMSA9IHJlcXVpcmUoXCIuLi9jYWNoZS9BcGlDYWNoZVJlcG9zaXRvcnlcIik7XG5jb25zdCBEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXJcIik7XG5jb25zdCBIdHRwRXJyb3JfMSA9IHJlcXVpcmUoXCIuL0h0dHBFcnJvclwiKTtcbmNvbnN0IGdldEVudkxvb2t1cFVybF8xID0gcmVxdWlyZShcIi4vZ2V0RW52TG9va3VwVXJsXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IE1JTExJU0VDT05EU19JTl9TRUNPTkQgPSAxMDAwO1xuLyoqXG4gKiBBIGhlbHBlciB1dGlscyB0aGF0IG1ha2VzIHRoZSBgUmVxdWVzdGAgb2JqZWN0IHdpdGggdGhlIGJhc2UgVVJMcyBvZiB0aGUgQVBJIExvb2t1cCBTZXJ2aWNlLCB0b2tlbiBjYWxsYmFjaywgYW5kIGRvd25sb2FkIG1hbmFnZXIuXG4gKlxuICogQWxzbywgeW91IGNhbiB1c2UgaXQgdG8gZ2V0IHRoZSBiYXNlIFVSTHMgb2YgdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAqL1xuY2xhc3MgUmVxdWVzdEZhY3Rvcnkge1xuICAgIC8qKlxuICAgICAqIEZhY3RvcnkgbWV0aG9kIGZvciBidWlsZGluZyBbW0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgaW4gdGhlIEFQSS5cbiAgICAgKiBAcGFyYW0gc2VydmljZVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGhybiBBIEhFUkUgUmVzb3VyY2UgTmFtZSAoW1tIUk5dXSkgb2YgdGhlIGNhdGFsb2cuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIFByb21pc2Ugd2l0aCBjb25zdHJ1Y3RlZCBbW0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXV0uXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGNyZWF0ZShzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIHNldHRpbmdzLCBocm4sIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0RmFjdG9yeS5nZXRCYXNlVXJsKHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgc2V0dGluZ3MsIGhybikudGhlbihhc3luYyAoYmFzZVVybCkgPT4gYmFzZVVybFxuICAgICAgICAgICAgPyBQcm9taXNlLnJlc29sdmUobmV3IERhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXzEuRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIoc2V0dGluZ3MuZG93bmxvYWRNYW5hZ2VyLCBiYXNlVXJsLCBzZXR0aW5ncy50b2tlbiwgYWJvcnRTaWduYWwpKVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYmFzZSB1cmwgdG8gdGhlIHNlcnZpY2U6ICR7c2VydmljZU5hbWV9YCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJhc2UgVVJMIG9mIHRoZSBBUEkgc2VydmljZSB0aGF0IHN1cHBvcnRzIGNhY2hpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIEFQSSBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgc2VydmljZS5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gaHJuIFRoZSBbW0hSTl1dIG9mIHRoZSBjYXRhbG9nLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgUHJvbWlzZSB3aXRoIHRoZSBiYXNlIFVSTCBvZiB0aGUgc2VydmljZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZ2V0QmFzZVVybChzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIHNldHRpbmdzLCBocm4pIHtcbiAgICAgICAgY29uc3QgTk9UX0ZPVU5EX0NPREUgPSA0MDQ7XG4gICAgICAgIGNvbnN0IE5PX0NPTlRFTlRfQ09ERSA9IDIwNDtcbiAgICAgICAgY29uc3QgYXBpQ2FjaGUgPSBuZXcgQXBpQ2FjaGVSZXBvc2l0b3J5XzEuQXBpQ2FjaGVSZXBvc2l0b3J5KHNldHRpbmdzLmNhY2hlLCBocm4pO1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gYXBpQ2FjaGUuZ2V0KHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgXCJhcGlcIik7XG4gICAgICAgIGNvbnN0IGNhY2hlTWF4QWdlID0gYXBpQ2FjaGUuZ2V0KHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgXCJhZ2VcIik7XG4gICAgICAgIGNvbnN0IGNhY2hlT25seVZlcnNpb24gPSBcInYxXCI7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAoYmFzZVVybCAmJiBjYWNoZU1heEFnZSAmJiBub3cgPCBwYXJzZUludChjYWNoZU1heEFnZSwgMTApKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJhc2VVcmwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvb2tVcFVybCA9ICgwLCBnZXRFbnZMb29rdXBVcmxfMS5nZXRFbnZMb29rVXBVcmwpKHNldHRpbmdzLmVudmlyb25tZW50KTtcbiAgICAgICAgY29uc3QgbG9va1VwQXBpUmVxdWVzdCA9IG5ldyBEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcl8xLkRhdGFTdG9yZVJlcXVlc3RCdWlsZGVyKHNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgbG9va1VwVXJsLCBzZXR0aW5ncy50b2tlbik7XG4gICAgICAgIGNvbnN0IGxvb2t1cFByb21pc2UgPSBocm5cbiAgICAgICAgICAgID8gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5Mb29rdXBBcGkuZ2V0UmVzb3VyY2VBUElMaXN0KGxvb2tVcEFwaVJlcXVlc3QsIHtcbiAgICAgICAgICAgICAgICBocm46IGhybi50b1N0cmluZygpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkxvb2t1cEFwaS5nZXRQbGF0Zm9ybUFQSUxpc3QobG9va1VwQXBpUmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBsb29rdXBQcm9taXNlLnRoZW4oYXN5bmMgKHJlc3ApID0+IHtcbiAgICAgICAgICAgIGxldCBtYXhBZ2U7XG4gICAgICAgICAgICBpZiAocmVzcC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVDb250cm9sID0gcmVzcC5oZWFkZXJzLmdldChcImNhY2hlLWNvbnRyb2xcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlQ29udHJvbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhTaXplID0gY2FjaGVDb250cm9sLm1hdGNoKC9tYXgtYWdlPShcXGQrKS8pO1xuICAgICAgICAgICAgICAgICAgICBtYXhBZ2UgPSBtYXhTaXplID8gcGFyc2VJbnQobWF4U2l6ZVsxXSwgMTApIDogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcl8xLkh0dHBFcnJvcihyZXMuc3RhdHVzIHx8IE5PX0NPTlRFTlRfQ09ERSwgcmVzLnRpdGxlIHx8IFwiTm8gY29udGVudFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udmVyc2lvbiA9PT0gY2FjaGVPbmx5VmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBhcGlDYWNoZS5wdXQoaXRlbS5hcGksIGl0ZW0udmVyc2lvbiwgaXRlbS5iYXNlVVJMLCBcImFwaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heEFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhBZ2UgKiBNSUxMSVNFQ09ORFNfSU5fU0VDT05EO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBpQ2FjaGUucHV0KGl0ZW0uYXBpLCBpdGVtLnZlcnNpb24sIHRpbWUudG9TdHJpbmcoKSwgXCJhZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VVcmxJbmRleCA9IHJlcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uYXBpID09PSBzZXJ2aWNlTmFtZSAmJiBpdGVtLnZlcnNpb24gPT09IHNlcnZpY2VWZXJzaW9uKTtcbiAgICAgICAgICAgIGlmIChiYXNlVXJsSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcl8xLkh0dHBFcnJvcihOT1RfRk9VTkRfQ09ERSwgYE5vIEJhc2VVcmwgZm91bmQgZm9yICR7c2VydmljZU5hbWV9LCAke3NlcnZpY2VWZXJzaW9ufSAke2hybiA/IGhybi50b1N0cmluZygpIDogXCJcIn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNbYmFzZVVybEluZGV4XS5iYXNlVVJMO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RGYWN0b3J5ID0gUmVxdWVzdEZhY3Rvcnk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVGlsZUtleSA9IHZvaWQgMDtcbi8qKlxuICogVGhlIGBUaWxlS2V5YCBpbnN0YW5jZXMgYXJlIHVzZWQgdG8gYWRkcmVzcyBhIHRpbGUgaW4gYSBxdWFkdHJlZS5cbiAqXG4gKiBBIHRpbGUga2V5IGlzIGRlZmluZWQgYnkgYSByb3csIGEgY29sdW1uLCBhbmQgYSBsZXZlbC4gVGhlIHRyZWUgaGFzIGEgcm9vdCBhdCBsZXZlbCAwLCB3aXRoIG9uZVxuICogc2luZ2xlIHRpbGUuIE9uIGV2ZXJ5IGxldmVsLCBlYWNoIHRpbGUgaXMgZGl2aWRlZCBpbnRvIGZvdXIgY2hpbGRyZW4gKHRoZXJlZm9yZSB0aGUgbmFtZVxuICogcXVhZHRyZWUpLlxuICpcbiAqIFdpdGhpbiBlYWNoIFtbbGV2ZWxdXSwgYW55IHBhcnRpY3VsYXIgdGlsZSBpcyBhZGRyZXNzZWQgd2l0aCBbW3Jvd11dIGFuZCBbW2NvbHVtbl1dLiBUaGUgbnVtYmVyXG4gKiBvZiByb3dzIGFuZCBjb2x1bW5zIGluIGVhY2ggbGV2ZWwgaXMgMiB0byB0aGUgcG93ZXIgb2YgdGhlIGxldmVsLiBUaGlzIG1lYW5zOiBPbiBsZXZlbCAwLCBvbmx5XG4gKiBvbmUgdGlsZSBleGlzdHMsIFtbY29sdW1uc0F0TGV2ZWxdXSgpIGFuZCBbW3Jvd3NBdExldmVsXV0oKSBhcmUgYm90aCAxLiBPbiBsZXZlbCAxLCA0IHRpbGVzXG4gKiBleGlzdCwgaW4gMiByb3dzIGFuZCAyIGNvbHVtbnMuIE9uIGxldmVsIDIgd2UgaGF2ZSAxNiB0aWxlcywgaW4gNCByb3dzIGFuZCA0IGNvbHVtbnMuIEFuZCBzbyBvbi5cbiAqXG4gKiBBIHRpbGUga2V5IGlzIHVzdWFsbHkgY3JlYXRlZCB1c2luZyBbW2Zyb21Sb3dDb2x1bW5MZXZlbF1dKCkgbWV0aG9kLlxuICpcbiAqIGBUaWxlS2V5YCBpbnN0YW5jZXMgYXJlIGltbXV0YWJsZSwgYWxsIG1lbWJlcnMgcmV0dXJuIG5ldyBpbnN0YW5jZXMgb2YgYFRpbGVLZXlgIGFuZCBkbyBub3RcbiAqIG1vZGlmeSB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICpcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGxpa2UgW1twYXJlbnRdXSgpLCBbW2NoYW5nZWRMZXZlbEJ5XV0oKSwgYW5kIFtbY2hhbmdlZExldmVsVG9dXSgpIGFsbG93IGZvclxuICogZWFzeSB2ZXJ0aWNhbCBuYXZpZ2F0aW9uIG9mIHRoZSB0cmVlLiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByb3dzIGFuZCBjb2x1bW5zIGluIHRoZSB0aWxlJ3NcbiAqIGxldmVsIGlzIGdpdmVuIHdpdGggW1tyb3dDb3VudF1dKCkgYW5kIFtbY29sdW1uQ291bnRdXSgpLlxuICpcbiAqIFRpbGUga2V5cyBjYW4gYmUgY3JlYXRlZCBmcm9tIGFuZCBjb252ZXJ0ZWQgaW50byB2YXJpb3VzIGFsdGVybmF0aXZlIGZvcm1hdHM6XG4gKlxuICogIC0gW1t0b1F1YWRLZXldXSgpIC8gW1tmcm9tUXVhZEtleV1dKCkgLSBzdHJpbmcgcmVwcmVzZW50YXRpb24gNC1iYXNlZFxuICogIC0gW1t0b0hlcmVUaWxlXV0oKSAvIFtbZnJvbUhlcmVUaWxlXV0oKSAtIHN0cmluZyByZXByZXNlbnRhdGlvbiAxMC1iYXNlZFxuICogIC0gW1ttb3J0b25Db2RlXV0oKSAvIFtbZnJvbU1vcnRvbkNvZGVdXSgpIC0gbnVtYmVyIHJlcHJlc2VudGF0aW9uXG4gKlxuICogTm90ZSAtIGFzIEphdmFTY3JpcHQncyBudW1iZXIgdHlwZSBjYW4gaG9sZCA1MyBiaXRzIGluIGl0cyBtYW50aXNzYSwgb25seSBsZXZlbHMgdXAgdG8gMjYgY2FuIGJlXG4gKiByZXByZXNlbnRlZCBpbiB0aGUgbnVtYmVyIHJlcHJlc2VudGF0aW9uIHJldHVybmVkIGJ5IFtbbW9ydG9uQ29kZV1dKCkuXG4gKi9cbmNsYXNzIFRpbGVLZXkge1xuICAgIHJvdztcbiAgICBjb2x1bW47XG4gICAgbGV2ZWw7XG4gICAgbV9tb3J0b25Db2RlO1xuICAgIG1faGVyZVRpbGU7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbW11dGFibGUgaW5zdGFuY2Ugb2YgYSBgVGlsZUtleWAuXG4gICAgICpcbiAgICAgKiBGb3IgdGhlIGJldHRlciByZWFkYWJpbGl0eSwgW1tUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbF1dIHNob3VsZCBiZSBwcmVmZXJyZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIC0gcm93IGFuZCBjb2x1bW4gbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJvd3MvY29sdW1ucyBmb3IgdGhlIGdpdmVuIGxldmVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvdyBSZXByZXNlbnRzIHRoZSByb3cgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqIEBwYXJhbSBjb2x1bW4gUmVwcmVzZW50cyB0aGUgY29sdW1uIGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKiBAcGFyYW0gbGV2ZWwgUmVwcmVzZW50cyB0aGUgbGV2ZWwgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvdywgY29sdW1uLCBsZXZlbCkge1xuICAgICAgICB0aGlzLnJvdyA9IHJvdztcbiAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRpbGUga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvdyBUaGUgcmVxdWVzdGVkIHJvdy4gTXVzdCBiZSBsZXNzIHRoYW4gMiB0byB0aGUgcG93ZXIgb2YgbGV2ZWwuXG4gICAgICogQHBhcmFtIGNvbHVtbiBUaGUgcmVxdWVzdGVkIGNvbHVtbi4gTXVzdCBiZSBsZXNzIHRoYW4gMiB0byB0aGUgcG93ZXIgb2YgbGV2ZWwuXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21Sb3dDb2x1bW5MZXZlbChyb3csIGNvbHVtbiwgbGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUaWxlS2V5KHJvdywgY29sdW1uLCBsZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0aWxlIGtleSBmcm9tIGEgcXVhZCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgcXVhZCBzdHJpbmcgY2FuIGJlIGNyZWF0ZWQgd2l0aCBbW3RvUXVhZEtleV1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRrZXkgVGhlIHF1YWRrZXkgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiBgVGlsZUtleWAuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21RdWFkS2V5KHF1YWRrZXkpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBxdWFka2V5Lmxlbmd0aDtcbiAgICAgICAgbGV0IHJvdyA9IDA7XG4gICAgICAgIGxldCBjb2x1bW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YWRrZXkubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSAxIDw8IGk7XG4gICAgICAgICAgICBjb25zdCBkID0gcGFyc2VJbnQocXVhZGtleS5jaGFyQXQobGV2ZWwgLSBpIC0gMSksIDEwKTtcbiAgICAgICAgICAgIGlmIChkICYgMHgxKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uIHw9IG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZCAmIDB4Mikge1xuICAgICAgICAgICAgICAgIHJvdyB8PSBtYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChyb3csIGNvbHVtbiwgbGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGlsZSBrZXkgZnJvbSBhIG51bWVyaWMgTW9ydG9uIGNvZGUgcmVwcmVzZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGNvbnZlcnQgYSB0aWxlIGtleSBpbnRvIGEgbnVtZXJpYyBNb3J0b24gY29kZSB3aXRoIFtbbW9ydG9uQ29kZV1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRLZXk2NCBUaGUgTW9ydG9uIGNvZGUgdG8gYmUgY29udmVydGVkLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIFtbVGlsZUtleV1dLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tTW9ydG9uQ29kZShxdWFkS2V5NjQpIHtcbiAgICAgICAgbGV0IGxldmVsID0gMDtcbiAgICAgICAgbGV0IHJvdyA9IDA7XG4gICAgICAgIGxldCBjb2x1bW4gPSAwO1xuICAgICAgICBsZXQgcXVhZEtleSA9IHF1YWRLZXk2NDtcbiAgICAgICAgd2hpbGUgKHF1YWRLZXkgPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBtYXNrID0gMSA8PCBsZXZlbDtcbiAgICAgICAgICAgIGlmIChxdWFkS2V5ICYgMHgxKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uIHw9IG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocXVhZEtleSAmIDB4Mikge1xuICAgICAgICAgICAgICAgIHJvdyB8PSBtYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWwrKztcbiAgICAgICAgICAgIHF1YWRLZXkgPSAocXVhZEtleSAtIChxdWFkS2V5ICYgMHgzKSkgLyA0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKHJvdywgY29sdW1uLCBsZXZlbCk7XG4gICAgICAgIHJlc3VsdC5tX21vcnRvbkNvZGUgPSBxdWFkS2V5NjQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0aWxlIGtleSBmcm9tIGEgaGVyZXRpbGUgY29kZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgc3RyaW5nIGNhbiBiZSBjcmVhdGVkIHdpdGggW1t0b0hlcmVUaWxlXV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcXVhZGtleTY0IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEhFUkUgdGlsZSBrZXkuXG4gICAgICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgYFRpbGVLZXlgLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSGVyZVRpbGUocXVhZGtleTY0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFRpbGVLZXkuZnJvbU1vcnRvbkNvZGUocGFyc2VJbnQocXVhZGtleTY0LCAxMCkpO1xuICAgICAgICByZXN1bHQubV9oZXJlVGlsZSA9IHF1YWRrZXk2NDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb2x1bW5zIGF0IGEgZ2l2ZW4gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIDIgdG8gdGhlIHBvd2VyIG9mIHRoZSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZXZlbCBUaGUgbGV2ZWwgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuXG4gICAgICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSBjb2x1bW5zIGF0IHRoZSBnaXZlbiBsZXZlbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgY29sdW1uc0F0TGV2ZWwobGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByb3dzIGF0IGEgZ2l2ZW4gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIDIgdG8gdGhlIHBvd2VyIG9mIHRoZSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZXZlbCBUaGUgbGV2ZWwgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MuXG4gICAgICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSByb3dzIGF0IHRoZSBnaXZlbiBsZXZlbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcm93c0F0TGV2ZWwobGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBtYXRjaGluZyBgVGlsZUtleWAgaW4gYSBjYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWwgVGhlIGxldmVsIGZvciB0aGUgdGlsZSBrZXkuXG4gICAgICogQHBhcmFtIGNvb3JkWCBUaGUgWCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSBjb29yZFkgVGhlIFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0gdG90YWxXaWR0aCBUaGUgbWF4aW11bSBYIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHRvdGFsSGVpZ2h0IFRoZSBtYXhpbXVtIFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB0aWxlIGtleSBhdCB0aGUgZ2l2ZW4gbGV2ZWwgdGhhdCBpbmNsdWRlcyB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgc3RhdGljIGF0Q29vcmRzKGxldmVsLCBjb29yZFgsIGNvb3JkWSwgdG90YWxXaWR0aCwgdG90YWxIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKE1hdGguZmxvb3IoY29vcmRZIC8gKHRvdGFsSGVpZ2h0IC8gVGlsZUtleS5yb3dzQXRMZXZlbChsZXZlbCkpKSwgTWF0aC5mbG9vcihjb29yZFggLyAodG90YWxXaWR0aCAvIFRpbGVLZXkuY29sdW1uc0F0TGV2ZWwobGV2ZWwpKSksIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIE1vcnRvbiBjb2RlIG9mIHRoZSBwYXJlbnQgdGlsZSBrZXkgb2YgdGhlIGdpdmVuIE1vcnRvbiBjb2RlLlxuICAgICAqXG4gICAgICogTm90ZTogVGhlIHBhcmVudCBrZXkgb2YgdGhlIHJvb3Qga2V5IGlzIHRoZSByb290IGtleSBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9ydG9uQ29kZSBBIE1vcnRvbiBjb2RlLCBmb3IgZXhhbXBsZSwgb2J0YWluZWQgZnJvbSBbW21vcnRvbkNvZGVdXS5cbiAgICAgKiBAcmV0dXJucyBUaGUgTW9ydG9uIGNvZGUgb2YgdGhlIHBhcmVudCB0aWxlLlxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJlbnRNb3J0b25Db2RlKG1vcnRvbkNvZGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobW9ydG9uQ29kZSAvIDQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBxdWFka2V5IGlzIHZhbGlkLlxuICAgICAqXG4gICAgICogVGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBpbiB0aGUgZ2l2ZW4gbGV2ZWwuXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4gYSBsZXZlbCBpcyBjb21wdXRlZCBhcyAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAbm90ZSBBcyB0aGUgSmF2YVNjcmlwdCBudW1iZXIgdHlwZSBjYW4gaG9sZCA1MyBiaXRzIGluIGl0cyBtYW50aXNzYSwgb25seSBsZXZlbHMgdXAgdG8gMjYgY2FuIGJlXG4gICAgICogcmVwcmVzZW50ZWQgaW4gdGhlIG51bWJlciByZXByZXNlbnRhdGlvbiByZXR1cm5lZCBieSBbW21vcnRvbkNvZGVGcm9tUXVhZEtleV1dLlxuICAgICAqIEEgbGV2ZWwgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIDI2LlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUgY3VycmVudCBxdWFka2V5LlxuICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcXVhZGtleSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc1ZhbGlkKGtleSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICBpZiAoa2V5LmxldmVsIDwgMCB8fCBrZXkubGV2ZWwgPiAyNikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbkF0TGV2ZWwgPSBNYXRoLnBvdygyLCBrZXkubGV2ZWwpO1xuICAgICAgICBjb25zdCByb3dWYWxpZCA9IGtleS5yb3cgPj0gMCAmJiBrZXkucm93IDwgZGltZW5zaW9uQXRMZXZlbDtcbiAgICAgICAgY29uc3QgY29sdW1uVmFsaWQgPSBrZXkuY29sdW1uID49IDAgJiYga2V5LmNvbHVtbiA8IGRpbWVuc2lvbkF0TGV2ZWw7XG4gICAgICAgIHJldHVybiByb3dWYWxpZCAmJiBjb2x1bW5WYWxpZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHRpbGUga2V5IHJlcHJlc2VudGluZyB0aGUgcGFyZW50IG9mIHRoZSB0aWxlIGFkZHJlc3NlZCBieSB0aGlzIHRpbGUga2V5LlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpcyB0aGlzIHRpbGUgaXMgYWxyZWFkeSB0aGUgcm9vdC5cbiAgICAgKi9cbiAgICBwYXJlbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxldmVsID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZ2V0IHRoZSBwYXJlbnQgb2YgdGhlIHJvb3QgdGlsZSBrZXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKHRoaXMucm93ID4+PiAxLCB0aGlzLmNvbHVtbiA+Pj4gMSwgdGhpcy5sZXZlbCAtIDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHRpbGUga2V5IGF0IGEgbGV2ZWwgdGhhdCBkaWZmZXJzIGZyb20gdGhpcyB0aWxlJ3MgbGV2ZWwgYnkgZGVsdGEuXG4gICAgICpcbiAgICAgKiBFcXVpdmFsZW50IHRvIGBjaGFuZ2VkTGV2ZWxUbyhsZXZlbCgpICsgZGVsdGEpYC5cbiAgICAgKlxuICAgICAqIE5vdGUgLSByb290IGtleSBpcyByZXR1cm5lZCBpZiBgZGVsdGFgIGlzIHNtYWxsZXIgdGhhbiB0aGUgbGV2ZWwgb2YgdGhpcyB0aWxlIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgbnVtZXJpYyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgbGV2ZWwgYW5kIHRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICovXG4gICAgY2hhbmdlZExldmVsQnkoZGVsdGEpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBNYXRoLm1heCgwLCB0aGlzLmxldmVsICsgZGVsdGEpO1xuICAgICAgICBsZXQgcm93ID0gdGhpcy5yb3c7XG4gICAgICAgIGxldCBjb2x1bW4gPSB0aGlzLmNvbHVtbjtcbiAgICAgICAgaWYgKGRlbHRhID49IDApIHtcbiAgICAgICAgICAgIHJvdyA8PD0gZGVsdGE7XG4gICAgICAgICAgICBjb2x1bW4gPDw9IGRlbHRhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcm93ID4+Pj0gLWRlbHRhO1xuICAgICAgICAgICAgY29sdW1uID4+Pj0gLWRlbHRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChyb3csIGNvbHVtbiwgbGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHRpbGUga2V5IGF0IHRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgcmVxdWVzdGVkIGxldmVsIGlzIHNtYWxsZXIgdGhhbiB0aGUgdGlsZSdzIGxldmVsLCB0aGVuIHRoZSBrZXkgb2YgYW4gYW5jZXN0b3Igb2YgdGhpc1xuICAgICAqIHRpbGUgaXMgcmV0dXJuZWQuIElmIHRoZSByZXF1ZXN0ZWQgbGV2ZWwgaXMgbGFyZ2VyIHRoYW4gdGhlIHRpbGUncyBsZXZlbCwgdGhlbiB0aGUga2V5IG9mXG4gICAgICogZmlyc3QgY2hpbGQgb3IgZ3JhbmRjaGlsZCBvZiB0aGlzIHRpbGUgaXMgcmV0dXJuZWQsIGZvciBleGFtcGxlLCB0aGUgY2hpbGQgd2l0aCB0aGUgbG93ZXN0XG4gICAgICogcm93IGFuZCBjb2x1bW4gbnVtYmVyLiBJZiB0aGUgcmVxdWVzdGVkIGxldmVsIGVxdWFscyB0aGlzIHRpbGUncyBsZXZlbCwgdGhlbiB0aGUgdGlsZSBrZXlcbiAgICAgKiBpdHNlbGYgaXMgcmV0dXJuZWQuIElmIHRoZSByZXF1ZXN0ZWQgbGV2ZWwgaXMgbmVnYXRpdmUsIHRoZSByb290IHRpbGUga2V5IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICovXG4gICAgY2hhbmdlZExldmVsVG8obGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlZExldmVsQnkobGV2ZWwgLSB0aGlzLmxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHRpbGUga2V5IHRvIGEgbnVtZXJpYyBjb2RlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqXG4gICAgICogWW91IGNhbiBjcmVhdGUgYSB0aWxlIGtleSBmcm9tIGEgbnVtZXJpYyBNb3J0b24gY29kZSB3aXRoIFtbZnJvbU1vcnRvbkNvZGVdXS5cbiAgICAgKlxuICAgICAqIE5vdGUgLSBvbmx5IGxldmVscyA8PSAyNiBhcmUgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIG1vcnRvbkNvZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm1fbW9ydG9uQ29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgY29sdW1uID0gdGhpcy5jb2x1bW47XG4gICAgICAgICAgICBsZXQgcm93ID0gdGhpcy5yb3c7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcG93ZXJPZlR3b1t0aGlzLmxldmVsIDw8IDFdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxldmVsOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uICYgMHgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBwb3dlck9mVHdvWzIgKiBpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvdyAmIDB4MSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gcG93ZXJPZlR3b1syICogaSArIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4gPj4+PSAxO1xuICAgICAgICAgICAgICAgIHJvdyA+Pj49IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1fbW9ydG9uQ29kZSA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tX21vcnRvbkNvZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSB0aWxlIGtleSBpbnRvIGEgc3RyaW5nIGZvciB1c2luZyBpbiBSRVNUIEFQSSBjYWxscy5cbiAgICAgKlxuICAgICAqIFRoZSBzdHJpbmcgaXMgYSBxdWFka2V5IE1vcnRvbiBjb2RlIHJlcHJlc2VudGF0aW9uIGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogWW91IGNhbiBjb252ZXJ0IGJhY2sgZnJvbSBhIHF1YWRrZXkgc3RyaW5nIHdpdGggW1tmcm9tSGVyZVRpbGVdXS5cbiAgICAgKi9cbiAgICB0b0hlcmVUaWxlKCkge1xuICAgICAgICBpZiAodGhpcy5tX2hlcmVUaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubV9oZXJlVGlsZSA9IHRoaXMubW9ydG9uQ29kZSgpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubV9oZXJlVGlsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHRpbGUga2V5IGludG8gYSBzdHJpbmcgZm9yIHVzaW5nIGluIFJFU1QgQVBJIGNhbGxzLlxuICAgICAqXG4gICAgICogSWYgdGhlIHRpbGUgaXMgdGhlIHJvb3QgdGlsZSwgdGhlIHF1YWRrZXkgaXMgJy0nLiBPdGhlcndpc2UgdGhlIHN0cmluZyBpcyBhIG51bWJlciB0byB0aGVcbiAgICAgKiBiYXNlIG9mIDQsIGJ1dCB3aXRob3V0IHRoZSBsZWFkaW5nIDEsIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAqICAxLiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBlcXVhbHMgdGhlIGxldmVsLlxuICAgICAqICAyLiByZW1vdmluZyB0aGUgbGFzdCBkaWdpdCBnaXZlcyB0aGUgcGFyZW50IHRpbGUncyBxdWFka2V5IHN0cmluZywgaS5lLiBhcHBlbmRpbmcgMCwxLDIsM1xuICAgICAqICAgICB0byBhIHF1YWRrZXkgc3RyaW5nIGdpdmVzIHRoZSB0aWxlcydzIGNoaWxkcmVuLlxuICAgICAqXG4gICAgICogWW91IGNhbiBjb252ZXJ0IGJhY2sgZnJvbSBhIHF1YWRrZXkgc3RyaW5nIHdpdGggW1tmcm9tUXVhZEtleV1dLlxuICAgICAqL1xuICAgIHRvUXVhZEtleSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIi1cIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGV2ZWw7IGkgPiAwOyAtLWkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSAxIDw8IChpIC0gMSk7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSAodGhpcy5jb2x1bW4gJiBtYXNrKSAhPT0gMDtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9ICh0aGlzLnJvdyAmIG1hc2spICE9PSAwO1xuICAgICAgICAgICAgaWYgKGNvbCAmJiByb3cpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIzXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyb3cpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIyXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIxXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXF1YWxpdHkgb3BlcmF0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcW5yIFRoZSB0aWxlIGtleSB0byBjb21wYXJlIHRvLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHRpbGUga2V5IGhhcyBpZGVudGljYWwgcm93LCBjb2x1bW4gYW5kIGxldmVsLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBlcXVhbHMocW5yKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5yb3cgPT09IHFuci5yb3cgJiZcbiAgICAgICAgICAgIHRoaXMuY29sdW1uID09PSBxbnIuY29sdW1uICYmXG4gICAgICAgICAgICB0aGlzLmxldmVsID09PSBxbnIubGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBxdWFka2V5IHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSBpdHMgc3ViIHF1YWRrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3ViIFRoZSBzdWIga2V5LlxuICAgICAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSB0aWxlIGtleSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICovXG4gICAgYWRkZWRTdWJLZXkoc3ViKSB7XG4gICAgICAgIGNvbnN0IHN1YlF1YWQgPSBUaWxlS2V5LmZyb21RdWFkS2V5KHN1Yi5sZW5ndGggPT09IDAgPyBcIi1cIiA6IHN1Yik7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5jaGFuZ2VkTGV2ZWxCeShzdWJRdWFkLmxldmVsKTtcbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKGNoaWxkLnJvdyArIHN1YlF1YWQucm93LCBjaGlsZC5jb2x1bW4gKyBzdWJRdWFkLmNvbHVtbiwgY2hpbGQubGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBxdWFka2V5IHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSBpdHMgc3ViIEhFUkUgdGlsZSBrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3ViIFRoZSBzdWIgSEVSRSBrZXkuXG4gICAgICogQHJldHVybnMgVGhlIGFic29sdXRlIHRpbGUga2V5IGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKi9cbiAgICBhZGRlZFN1YkhlcmVUaWxlKHN1Yikge1xuICAgICAgICBjb25zdCBzdWJRdWFkID0gVGlsZUtleS5mcm9tSGVyZVRpbGUoc3ViKTtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLmNoYW5nZWRMZXZlbEJ5KHN1YlF1YWQubGV2ZWwpO1xuICAgICAgICByZXR1cm4gVGlsZUtleS5mcm9tUm93Q29sdW1uTGV2ZWwoY2hpbGQucm93ICsgc3ViUXVhZC5yb3csIGNoaWxkLmNvbHVtbiArIHN1YlF1YWQuY29sdW1uLCBjaGlsZC5sZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzdWIgcXVhZGtleSB0aGF0IGlzIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHN1YiBrZXlzIHRoYXQgYXJlIHJlbGF0aXZlIHRvIGEgcGFyZW50IHRoYXQgaXMgZGVsdGFcbiAgICAgKiBsZXZlbHMgdXAgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgc2hvcnRlbmVkIGtleXMgZm9yIHF1YWRzIG9uIGxvd2VyIGxldmVscyBpZiB0aGUgcGFyZW50IGlzXG4gICAgICoga25vd24uXG4gICAgICpcbiAgICAgKiBOb3RlIC0gdGhlIHN1YiBxdWFka2V5cyBmaXQgaW4gYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBpZiB0aGUgYGRlbHRhYCBpcyBzbWFsbGVyIHRoYW4gOC4gSWZcbiAgICAgKiBgZGVsdGFgIGlzIHNtYWxsZXIgdGhhbiAxNiwgdGhlIHN1YiBxdWFka2V5IGZpdHMgaW50byBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlci5cbiAgICAgKlxuICAgICAqIERlbHRhcyBsYXJnZXIgdGhhbiAxNiBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgbnVtYmVyIG9mIGxldmVscyByZWxhdGl2ZSB0byBpdHMgcGFyZW50IHF1YWRrZXkuIE11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0b1xuICAgICAqIDAgYW5kIHNtYWxsZXIgdGhhbiAxNi5cbiAgICAgKiBAcmV0dXJucyBUaGUgcXVhZGtleSByZWxhdGl2ZSB0byBpdHMgcGFyZW50IHRoYXQgaXMgYGRlbHRhYCBsZXZlbHMgdXAgdGhlIHRyZWUuXG4gICAgICovXG4gICAgZ2V0U3ViSGVyZVRpbGUoZGVsdGEpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5tb3J0b25Db2RlKCk7XG4gICAgICAgIGNvbnN0IG1zYiA9IDEgPDwgKGRlbHRhICogMik7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBtc2IgLSAxO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoa2V5ICYgbWFzaykgfCBtc2I7XG4gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByb3dzIGluIHRoZSB0aWxlJ3MgW1tsZXZlbF1dLlxuICAgICAqXG4gICAgICogVGhpcyBpcyAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbGV2ZWwuXG4gICAgICovXG4gICAgcm93Q291bnQoKSB7XG4gICAgICAgIHJldHVybiBUaWxlS2V5LnJvd3NBdExldmVsKHRoaXMubGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbHVtbnMgaW4gdGhlIHRpbGUncyBbW2xldmVsXV0uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIDIgdG8gdGhlIHBvd2VyIG9mIHRoZSBsZXZlbC5cbiAgICAgKi9cbiAgICBjb2x1bW5Db3VudCgpIHtcbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuY29sdW1uc0F0TGV2ZWwodGhpcy5sZXZlbCk7XG4gICAgfVxufVxuZXhwb3J0cy5UaWxlS2V5ID0gVGlsZUtleTtcbi8qKiBAaGlkZGVuICovXG5jb25zdCBwb3dlck9mVHdvID0gW1xuICAgIDB4MSxcbiAgICAweDIsXG4gICAgMHg0LFxuICAgIDB4OCxcbiAgICAweDEwLFxuICAgIDB4MjAsXG4gICAgMHg0MCxcbiAgICAweDgwLFxuICAgIDB4MTAwLFxuICAgIDB4MjAwLFxuICAgIDB4NDAwLFxuICAgIDB4ODAwLFxuICAgIDB4MTAwMCxcbiAgICAweDIwMDAsXG4gICAgMHg0MDAwLFxuICAgIDB4ODAwMCxcbiAgICAweDEwMDAwLFxuICAgIDB4MjAwMDAsXG4gICAgMHg0MDAwMCxcbiAgICAweDgwMDAwLFxuICAgIDB4MTAwMDAwLFxuICAgIDB4MjAwMDAwLFxuICAgIDB4NDAwMDAwLFxuICAgIDB4ODAwMDAwLFxuICAgIDB4MTAwMDAwMCxcbiAgICAweDIwMDAwMDAsXG4gICAgMHg0MDAwMDAwLFxuICAgIDB4ODAwMDAwMCxcbiAgICAweDEwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMCxcbiAgICAweDgwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAwLFxuICAgIDB4NDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwMCxcbiAgICAweDIwMDAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwMCxcbiAgICAweDEwMDAwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMDAwMCxcbiAgICAweDgwMDAwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAwMDAwLFxuICAgIDB4NDAwMDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwMDAwMCxcbiAgICAweDIwMDAwMDAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwMDAwMCxcbiAgICAweDEwMDAwMDAwMDAwMDAwIC8vIE1hdGgucG93KDIsIDUyKSwgaGlnaGVzdCBiaXQgdGhhdCBjYW4gYmUgc2V0IGNvcnJlY3RseS5cbl07XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlV1aWQgPSB2b2lkIDA7XG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1iaXR3aXNlXG4vLyB0c2xpbnQ6ZGlzYWJsZTogbm8tbWFnaWMtbnVtYmVyc1xuLyoqXG4gKiBAYnJpZWYgTGV0cyB5b3UgZ2VuZXJhdGUgdXVpZCBjb2RlXG4gKi9cbmNsYXNzIFV1aWQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gVVVJRFxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBVdWlkLmdlbmVyYXRlKDIpLFxuICAgICAgICAgICAgVXVpZC5nZW5lcmF0ZSgxKSxcbiAgICAgICAgICAgIFV1aWQuZ2VuZXJhdGUoMSksXG4gICAgICAgICAgICBVdWlkLmdlbmVyYXRlKDEpLFxuICAgICAgICAgICAgVXVpZC5nZW5lcmF0ZSgzKVxuICAgICAgICBdLmpvaW4oXCItXCIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2VuZXJhdGUoY291bnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICgoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApIHwgMClcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAgICAgICAgICAgLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuVXVpZCA9IFV1aWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldERhdGFTaXplID0gZ2V0RGF0YVNpemU7XG5jb25zdCBCWVRFU19JTl9OVU1CRVIgPSA4O1xuY29uc3QgQllURVNfSU5fQk9PTEVBTiA9IDQ7XG4vKipcbiAqIENhbGN1bGF0ZSBtZW1vcnkgc2l6ZSBvZiBqYXZhc2NyaXB0IG9iamVjdCwgaXQgaXMgbm90IGFuIGFjY3VyYXRlIHZhbHVlXG4gKiBAcGFyYW0gZGF0YS4gVGhlIHN0cmluZyBvciBudW1iZXIgb3IgYm9vbGVhbiBvciBhcnJheSBvciBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgc2l6ZSBvZiB2YWx1ZSBpbiBieXRlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGF0YVNpemUoZGF0YSkge1xuICAgIGxldCBieXRlcyA9IDA7XG4gICAgZnVuY3Rpb24gc2l6ZU9mKG9iaikge1xuICAgICAgICBpZiAob2JqICE9PSBudWxsICYmIG9iaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBvYmopIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzICs9IEJZVEVTX0lOX05VTUJFUjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBieXRlcyArPSBvYmoubGVuZ3RoICogMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gQllURVNfSU5fQk9PTEVBTjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmpDbGFzcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2JqQ2xhc3MgPT09IFwiW29iamVjdCBPYmplY3RdXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iakNsYXNzID09PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVPZihvYmpba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyArPSBvYmoudG9TdHJpbmcoKS5sZW5ndGggKiAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICB9XG4gICAgcmV0dXJuIHNpemVPZihkYXRhKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0RW52TG9va1VwVXJsID0gZ2V0RW52TG9va1VwVXJsO1xuLyoqXG4gKiBHZXRzIHRoZSBVUkwgc3RyaW5nIG9mIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UuXG4gKlxuICogQHBhcmFtIGVudiBUaGUgZW52aXJvbm1lbnQgdGhhdCB5b3UgdXNlIGZvciB3b3JrLiBZb3UgY2FuIGFsc28gcGFzcyB0aGUgVVJMIHN0cmluZyBvZiB5b3VyIGxvY2FsIG9yIGN1c3RvbSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm4gQmFzZWQgb24gdGhlIHNwZWNpZmllZCBlbnZpcm9ubWVudCwgdGhlIFVSTCBzdHJpbmcgb2YgdGhlIEFQSSBMb29rdXAgU2VydmljZSBvciB0aGUgVVJMIHN0cmluZyBvZiB0aGUgY3VzdG9tIHNlcnZpY2UuXG4gKi9cbmZ1bmN0aW9uIGdldEVudkxvb2tVcFVybChlbnYpIHtcbiAgICBmdW5jdGlvbiBpc1VSTChzdHIpIHtcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBgKD86KD86W2Etel0rOik/Ly8pYDtcbiAgICAgICAgY29uc3QgaXAgPSBgKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSl7M31gO1xuICAgICAgICBjb25zdCBob3N0ID0gXCIoPzooPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV1bLV9dKikqW2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKylcIjtcbiAgICAgICAgY29uc3QgZG9tYWluID0gXCIoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XS0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSpcIjtcbiAgICAgICAgY29uc3QgdGxkID0gYCg/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmZdezIsfSkpXFxcXC4/YDtcbiAgICAgICAgY29uc3QgcG9ydCA9IFwiKD86OlxcXFxkezIsNX0pP1wiO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHF1b3RlbWFya1xuICAgICAgICBjb25zdCBwYXRoID0gJyg/OlsvPyNdW15cXFxcc1wiXSopPyc7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgKD86JHtwcm90b2NvbH18d3d3XFxcXC4pKD86bG9jYWxob3N0fCR7aXB9fCR7aG9zdH0ke2RvbWFpbn0ke3RsZH0pJHtwb3J0fSR7cGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3Qoc3RyLnRyaW0oKSk7XG4gICAgfVxuICAgIGlmIChpc1VSTChlbnYpKSB7XG4gICAgICAgIHJldHVybiBlbnY7XG4gICAgfVxuICAgIHN3aXRjaCAoZW52KSB7XG4gICAgICAgIGNhc2UgXCJoZXJlLWRldlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9hcGktbG9va3VwLmRhdGEuYXBpLnBsYXRmb3JtLnNpdC5oZXJlLmNvbS9sb29rdXAvdjFcIjtcbiAgICAgICAgY2FzZSBcImhlcmUtY25cIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vYXBpLWxvb2t1cC5kYXRhLmFwaS5wbGF0Zm9ybS5oZXJlb2xwLmNuL2xvb2t1cC92MVwiO1xuICAgICAgICBjYXNlIFwiaGVyZS1jbi1kZXZcIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vYXBpLWxvb2t1cC5kYXRhLmFwaS5wbGF0Zm9ybS5pbi5oZXJlb2xwLmNuL2xvb2t1cC92MVwiO1xuICAgICAgICBjYXNlIFwibG9jYWxcIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzEwMDUvbG9va3VwL3YxXCI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gXCJodHRwczovL2FwaS1sb29rdXAuZGF0YS5hcGkucGxhdGZvcm0uaGVyZS5jb20vbG9va3VwL3YxXCI7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU1RBVFVTX0NPREVTID0gdm9pZCAwO1xuLyoqXG4gKiBTdGF0dXMgY29kZXMgb2YgSFRUUCByZXNwb25zZXMuXG4gKi9cbnZhciBTVEFUVVNfQ09ERVM7XG4oZnVuY3Rpb24gKFNUQVRVU19DT0RFUykge1xuICAgIFNUQVRVU19DT0RFU1tTVEFUVVNfQ09ERVNbXCJPS1wiXSA9IDIwMF0gPSBcIk9LXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIkNSRUFURURcIl0gPSAyMDFdID0gXCJDUkVBVEVEXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIk5PX0NPTlRFTlRcIl0gPSAyMDRdID0gXCJOT19DT05URU5UXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIkZPVU5EXCJdID0gMzAyXSA9IFwiRk9VTkRcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiQkFEX1JFUVVFU1RcIl0gPSA0MDBdID0gXCJCQURfUkVRVUVTVFwiO1xuICAgIFNUQVRVU19DT0RFU1tTVEFUVVNfQ09ERVNbXCJOT1RfRk9VTkRcIl0gPSA0MDRdID0gXCJOT1RfRk9VTkRcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiVE9fTUFOWV9SRVFVRVNUU1wiXSA9IDQyOV0gPSBcIlRPX01BTllfUkVRVUVTVFNcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCJdID0gNTAwXSA9IFwiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIlNFUlZJQ0VfVU5BVkFJQkxFXCJdID0gNTAzXSA9IFwiU0VSVklDRV9VTkFWQUlCTEVcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiTkVUV09SS19DT05ORUNUX1RJTUVPVVRcIl0gPSA1OTldID0gXCJORVRXT1JLX0NPTk5FQ1RfVElNRU9VVFwiO1xufSkoU1RBVFVTX0NPREVTIHx8IChleHBvcnRzLlNUQVRVU19DT0RFUyA9IFNUQVRVU19DT0RFUyA9IHt9KSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRG93bmxvYWRNYW5hZ2VyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlckZhY3RvcnlcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2dldEVudkxvb2t1cFVybFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vSFJOXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9nZXREYXRhU2l6ZVV0aWxcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0h0dHBFcnJvclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRmV0Y2hPcHRpb25zXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9UaWxlS2V5XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9VdWlkXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi91c2VyQWdlbnRcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TRU5UX1dJVEhfUEFSQU0gPSB2b2lkIDA7XG5leHBvcnRzLmFkZFNlbnRXaXRoUGFyYW0gPSBhZGRTZW50V2l0aFBhcmFtO1xuY29uc3QgbGliX3ZlcnNpb25fMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmUvbGliLnZlcnNpb25cIik7XG4vKipcbiAqIFRoZSBzdHJpbmcgZm9yIGFkZGluZyB0byB0aGUgcmVxdWVzdHMgYXMgcXVlcnkgcGFyYW1ldGVyLlxuICovXG5leHBvcnRzLlNFTlRfV0lUSF9QQVJBTSA9IGBzZW50V2l0aD1PTFAtVFMtU0RLLSR7bGliX3ZlcnNpb25fMS5MSUJfVkVSU0lPTn1gO1xuLyoqXG4gKiBBZGRzIHNlbnRXaXRoIHBhcmFtIHRvIHRoZSB1cmwuXG4gKiBAcGFyYW0gdXJsIHRoZSBzdHJpbmcsIHJlcHJlc2VudGluZyB0aGUgdXJsXG4gKiBAcmV0dXJucyB0aGUgc3RyaW5nLCByZXByZXNlbnRpbmcgdXBkYXRlZCBVUkxcbiAqL1xuZnVuY3Rpb24gYWRkU2VudFdpdGhQYXJhbSh1cmwpIHtcbiAgICByZXR1cm4gdXJsLnNwbGl0KFwiP1wiKS5sZW5ndGggPT09IDFcbiAgICAgICAgPyBgJHt1cmx9PyR7ZXhwb3J0cy5TRU5UX1dJVEhfUEFSQU19YFxuICAgICAgICA6IGAke3VybH0mJHtleHBvcnRzLlNFTlRfV0lUSF9QQVJBTX1gO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSW50ZXJhY3RpdmVBcGkgPSBleHBvcnRzLk9iamVjdFN0b3JlQXBpID0gZXhwb3J0cy5QdWJsaXNoQXBpID0gZXhwb3J0cy5TdHJlYW1BcGkgPSBleHBvcnRzLkluZGV4QXBpID0gZXhwb3J0cy5Wb2xhdGlsZUJsb2JBcGkgPSBleHBvcnRzLkJsb2JBcGkgPSBleHBvcnRzLkNvdmVyYWdlQXBpID0gZXhwb3J0cy5RdWVyeUFwaSA9IGV4cG9ydHMuQXJ0aWZhY3RBcGkgPSBleHBvcnRzLkNvbmZpZ0FwaSA9IGV4cG9ydHMuTWV0YWRhdGFBcGkgPSBleHBvcnRzLkxvb2t1cEFwaSA9IGV4cG9ydHMuQXV0aG9yaXphdGlvbkFQSSA9IHZvaWQgMDtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9saWIvUmVxdWVzdEJ1aWxkZXJcIiksIGV4cG9ydHMpO1xuY29uc3QgQXJ0aWZhY3RBcGkgPSByZXF1aXJlKFwiLi9saWIvYXJ0aWZhY3QtYXBpXCIpO1xuZXhwb3J0cy5BcnRpZmFjdEFwaSA9IEFydGlmYWN0QXBpO1xuY29uc3QgQXV0aG9yaXphdGlvbkFQSSA9IHJlcXVpcmUoXCIuL2xpYi9hdXRob3JpemF0aW9uLWFwaS12MS4xXCIpO1xuZXhwb3J0cy5BdXRob3JpemF0aW9uQVBJID0gQXV0aG9yaXphdGlvbkFQSTtcbmNvbnN0IEJsb2JBcGkgPSByZXF1aXJlKFwiLi9saWIvYmxvYi1hcGlcIik7XG5leHBvcnRzLkJsb2JBcGkgPSBCbG9iQXBpO1xuY29uc3QgQ29uZmlnQXBpID0gcmVxdWlyZShcIi4vbGliL2NvbmZpZy1hcGlcIik7XG5leHBvcnRzLkNvbmZpZ0FwaSA9IENvbmZpZ0FwaTtcbmNvbnN0IENvdmVyYWdlQXBpID0gcmVxdWlyZShcIi4vbGliL2NvdmVyYWdlLWFwaVwiKTtcbmV4cG9ydHMuQ292ZXJhZ2VBcGkgPSBDb3ZlcmFnZUFwaTtcbmNvbnN0IEluZGV4QXBpID0gcmVxdWlyZShcIi4vbGliL2luZGV4LWFwaVwiKTtcbmV4cG9ydHMuSW5kZXhBcGkgPSBJbmRleEFwaTtcbmNvbnN0IExvb2t1cEFwaSA9IHJlcXVpcmUoXCIuL2xpYi9sb29rdXAtYXBpXCIpO1xuZXhwb3J0cy5Mb29rdXBBcGkgPSBMb29rdXBBcGk7XG5jb25zdCBNZXRhZGF0YUFwaSA9IHJlcXVpcmUoXCIuL2xpYi9tZXRhZGF0YS1hcGlcIik7XG5leHBvcnRzLk1ldGFkYXRhQXBpID0gTWV0YWRhdGFBcGk7XG5jb25zdCBQdWJsaXNoQXBpID0gcmVxdWlyZShcIi4vbGliL3B1Ymxpc2gtYXBpLXYyXCIpO1xuZXhwb3J0cy5QdWJsaXNoQXBpID0gUHVibGlzaEFwaTtcbmNvbnN0IFF1ZXJ5QXBpID0gcmVxdWlyZShcIi4vbGliL3F1ZXJ5LWFwaVwiKTtcbmV4cG9ydHMuUXVlcnlBcGkgPSBRdWVyeUFwaTtcbmNvbnN0IFN0cmVhbUFwaSA9IHJlcXVpcmUoXCIuL2xpYi9zdHJlYW0tYXBpXCIpO1xuZXhwb3J0cy5TdHJlYW1BcGkgPSBTdHJlYW1BcGk7XG5jb25zdCBWb2xhdGlsZUJsb2JBcGkgPSByZXF1aXJlKFwiLi9saWIvdm9sYXRpbGUtYmxvYi1hcGlcIik7XG5leHBvcnRzLlZvbGF0aWxlQmxvYkFwaSA9IFZvbGF0aWxlQmxvYkFwaTtcbmNvbnN0IE9iamVjdFN0b3JlQXBpID0gcmVxdWlyZShcIi4vbGliL2Jsb2IudjIuYXBpXCIpO1xuZXhwb3J0cy5PYmplY3RTdG9yZUFwaSA9IE9iamVjdFN0b3JlQXBpO1xuY29uc3QgSW50ZXJhY3RpdmVBcGkgPSByZXF1aXJlKFwiLi9saWIvaW50ZXJhY3RpdmUtYXBpLXYxXCIpO1xuZXhwb3J0cy5JbnRlcmFjdGl2ZUFwaSA9IEludGVyYWN0aXZlQXBpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZXF1ZXN0QnVpbGRlciA9IGV4cG9ydHMuVXJsQnVpbGRlciA9IHZvaWQgMDtcbi8qKlxuICogSGVscGVyIGNsYXNzIHRoYXQgYnVpbGRzIFVSTHMgZnJvbSBhIGJhc2VVcmwgYW5kIGdpdmVuIHF1ZXJ5IHBhcmFtZXRlcnNcbiAqL1xuY2xhc3MgVXJsQnVpbGRlciB7XG4gICAgdXJsO1xuICAgIGhhc1F1ZXJ5O1xuICAgIC8qKlxuICAgICAqIFN0YXRpYyBtZXRob2QgdGhhdCBjcmVhdGVzIGFuIFVSTCBxdWVyeSBzdHJpbmcgZnJvbSBhIGtleSwgdmFsdWUgcGFpciBwcm92aWRlZCBhcyBwYXJhbSAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBudW1iZXIgdG8gYmUgY29udmVydGVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBzdHJpbmdpZnlRdWVyeSh2YWx1ZXMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlcykge1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBVcmxCdWlsZGVyLmFwcGVuZFF1ZXJ5U3RyaW5nKHJlc3VsdCwgXCJcIiwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXRpYyBtZXRob2QgdGhhdCBjb252ZXJ0cyB0aGUgcGFyYW1ldGVyIHRvIGEgc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW0gZWl0aGVyIGEgc3RyaW5nIG9yIGEgbnVtYmVyIHRvIGJlIGNvbnZlcnRlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgdG9TdHJpbmcocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJhbSA9PT0gXCJzdHJpbmdcIiA/IHBhcmFtIDogcGFyYW0udG9TdHJpbmcoKTtcbiAgICB9XG4gICAgc3RhdGljIGFwcGVuZFF1ZXJ5U3RyaW5nKHVybCwgc2VwYXJhdG9yLCBrZXksIHZhbHVlLCBvcGVyYXRvciA9IFwiPVwiKSB7XG4gICAgICAgIHVybCArPSBzZXBhcmF0b3I7XG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIG9wZXJhdG9yO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB1cmwgKz0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB1cmwgKz0gYCR7dmFsdWV9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjb21tYSBpcyBhIHZhbGlkIHN1Yi1kZWxpbWl0ZXIgb2YgYSBxdWVyeSBjb21wb25lbnQgYW5kIGlzXG4gICAgICAgICAgICAvLyB1c2VkIGJ5IHRoZSBEYXRhIEFQSXMgYXMgYSBsaXN0IHNlcGFyYXRvciwgdGhlIHNhbWUgd2F5IGFzIGZvclxuICAgICAgICAgICAgLy8gdGhlIGFycmF5IHZhbHVlcyBiZWxvdy4gS2VlcCBpdCB1bmVzY2FwZWQuXG4gICAgICAgICAgICB1cmwgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKS5yZXBsYWNlKC8lMkMvZywgXCIsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkVmFsdWVzID0gW107XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWVzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1cmwgKz0gZW5jb2RlZFZhbHVlcy5qb2luKFwiLFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVybCBUaGUgYmFzZSBVUkwuXG4gICAgICogQHBhcmFtIGhhc1F1ZXJ5IFdoZXRoZXIgdGhlIGJhc2UgVVJMIGFscmVhZHkgY29udGFpbnMgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIGhhc1F1ZXJ5ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMuaGFzUXVlcnkgPSBoYXNRdWVyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHF1ZXJ5IHBhcmFtZXRlciB0byB0aGUgVVJMLCBlaXRoZXIgdXNpbmcgJyZrZXk9dmFsdWUnIG9yICc/a2V5PXZhbHVlJ1xuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgW1toYXNRdWVyeV1dIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEVzY2FwZXMgYWxsIHN0cmluZ3MgdXNpbmcgYGVuY29kZVVSSUNvbXBvbmVudGAsIGV4Y2VwdCBmb3IgdGhlIGNvbW1hLFxuICAgICAqIHdoaWNoIGlzIGtlcHQgdW5lc2NhcGVkIGFzIGEgbGlzdCBzZXBhcmF0b3IuXG4gICAgICpcbiAgICAgKiBTdHJpbmcgYXJyYXlzIGFyZSBjb25jYXRlbmF0ZWQgdXNpbmcgY29tbWFzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIGFwcGVuZFF1ZXJ5KGtleSwgdmFsdWUsIG9wZXJhdG9yID0gXCI9XCIpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVybCA9IFVybEJ1aWxkZXIuYXBwZW5kUXVlcnlTdHJpbmcodGhpcy51cmwsIHRoaXMuaGFzUXVlcnkgPyBcIiZcIiA6IFwiP1wiLCBrZXksIHZhbHVlLCBvcGVyYXRvcik7XG4gICAgICAgIHRoaXMuaGFzUXVlcnkgPSB0cnVlO1xuICAgIH1cbn1cbmV4cG9ydHMuVXJsQnVpbGRlciA9IFVybEJ1aWxkZXI7XG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIHVzZWQgZm9yIGJ1aWxkaW5nIHJlcXVlc3RzIHRvIGEgUkVTVCBBUEkuXG4gKi9cbmNsYXNzIFJlcXVlc3RCdWlsZGVyIHtcbiAgICBiYXNlVXJsO1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUmVxdWVzdEJ1aWxkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmFzZVVybCBUaGUgYmFzZSBVUkwgb2YgdGhlIHNlcnZpY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYmFzZVVybCkge1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGRvd25sb2FkIHRoZSByZXNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmxPYmogdGhlIFVSTCB0byBmZXRjaC5cbiAgICAgKi9cbiAgICBhc3luYyByZXF1ZXN0KHVybE9iaiwgaW5pdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZCh1cmxPYmoudXJsLCBpbml0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBkb3dubG9hZCB0aGUgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsT2JqIHRoZSBVUkwgdG8gZmV0Y2guXG4gICAgICovXG4gICAgYXN5bmMgcmVxdWVzdEJsb2IodXJsT2JqLCBpbml0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkQmxvYih1cmxPYmoudXJsLCBpbml0KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RCdWlsZGVyID0gUmVxdWVzdEJ1aWxkZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVsZXRlQXJ0aWZhY3RVc2luZ0RFTEVURSA9IGRlbGV0ZUFydGlmYWN0VXNpbmdERUxFVEU7XG5leHBvcnRzLmRlbGV0ZUZpbGVVc2luZ0RFTEVURSA9IGRlbGV0ZUZpbGVVc2luZ0RFTEVURTtcbmV4cG9ydHMuZ2V0QXJ0aWZhY3RGaWxlVXNpbmdHRVQgPSBnZXRBcnRpZmFjdEZpbGVVc2luZ0dFVDtcbmV4cG9ydHMuZ2V0QXJ0aWZhY3RVc2luZ0dFVCA9IGdldEFydGlmYWN0VXNpbmdHRVQ7XG5leHBvcnRzLnB1dEFydGlmYWN0RmlsZVVzaW5nUFVUID0gcHV0QXJ0aWZhY3RGaWxlVXNpbmdQVVQ7XG5leHBvcnRzLnJlZ2lzdGVyQXJ0aWZhY3RVc2luZ1BVVCA9IHJlZ2lzdGVyQXJ0aWZhY3RVc2luZ1BVVDtcbmV4cG9ydHMuZGVsZXRlU2NoZW1hVXNpbmdERUxFVEUgPSBkZWxldGVTY2hlbWFVc2luZ0RFTEVURTtcbmV4cG9ydHMuZ2V0RG9jdW1lbnRVc2luZ0dFVCA9IGdldERvY3VtZW50VXNpbmdHRVQ7XG5leHBvcnRzLmdldFNjaGVtYVVzaW5nR0VUID0gZ2V0U2NoZW1hVXNpbmdHRVQ7XG5leHBvcnRzLmxpc3RVc2luZ0dFVCA9IGxpc3RVc2luZ0dFVDtcbmV4cG9ydHMudXBkYXRlU2NoZW1hUGVybWlzc2lvblVzaW5nUE9TVCA9IHVwZGF0ZVNjaGVtYVBlcm1pc3Npb25Vc2luZ1BPU1Q7XG4vKipcbiAqIEFydGlmYWN0IFNlcnZpY2UgdjFcbiAqIE5vIGRlc2NyaXB0aW9uIHByb3ZpZGVkIChnZW5lcmF0ZWQgYnkgU3dhZ2dlciBDb2RlZ2VuIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4pXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC4xXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBBcnRpZmFjdHNBcGlcbiAqL1xuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdtb2RpZnlSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgYSBzcGVjaWZpYyBhcnRpZmFjdFxuICogQHBhcmFtIGFydGlmYWN0SHJuIFRoZSBIUk4gb2YgdGhlIGFydGlmYWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFydGlmYWN0VXNpbmdERUxFVEUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2FydGlmYWN0L3thcnRpZmFjdEhybn1cIi5yZXBsYWNlKFwie2FydGlmYWN0SHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXJ0aWZhY3RIcm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdtb2RpZnlSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgYSBzcGVjaWZpYyBhcnRpZmFjdCBmaWxlXG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcGF0aCB0byBhcnRpZmFjdCBmaWxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZpbGVVc2luZ0RFTEVURShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvYXJ0aWZhY3Qve2FydGlmYWN0SHJufS97ZmlsZU5hbWV9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7YXJ0aWZhY3RIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhcnRpZmFjdEhyblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2ZpbGVOYW1lfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmlsZU5hbWVcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdyZWFkUmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOXG4gKlxuICogQHN1bW1hcnkgUmV0cmlldmUgYSBzcGVjaWZpYyBhcnRpZmFjdCBmaWxlXG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcGF0aCB0byBhcnRpZmFjdCBmaWxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFydGlmYWN0RmlsZVVzaW5nR0VUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9hcnRpZmFjdC97YXJ0aWZhY3RIcm59L3tmaWxlTmFtZX1cIlxuICAgICAgICAucmVwbGFjZShcInthcnRpZmFjdEhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFydGlmYWN0SHJuXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7ZmlsZU5hbWV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmaWxlTmFtZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEBzdW1tYXJ5IGdldEFydGlmYWN0XG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXJ0aWZhY3RVc2luZ0dFVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIve2FydGlmYWN0SHJufVwiLnJlcGxhY2UoXCJ7YXJ0aWZhY3RIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhcnRpZmFjdEhyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdtb2RpZnlSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBDcmVhdGUgb3IgdXBkYXRlIGEgc3BlY2lmaWMgYXJ0aWZhY3RcbiAqIEBwYXJhbSBhcnRpZmFjdEhybiBUaGUgSFJOIG9mIHRoZSBhcnRpZmFjdFxuICogQHBhcmFtIGZpbGVOYW1lIFRoZSBwYXRoIHRvIGFydGlmYWN0IGZpbGVcbiAqIEBwYXJhbSBmaWxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1dEFydGlmYWN0RmlsZVVzaW5nUFVUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9hcnRpZmFjdC97YXJ0aWZhY3RIcm59L3tmaWxlTmFtZX1cIlxuICAgICAgICAucmVwbGFjZShcInthcnRpZmFjdEhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFydGlmYWN0SHJuXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7ZmlsZU5hbWV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmaWxlTmFtZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiZmlsZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImZpbGVcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAnYXBpQWNjZXNzJ1xuICpcbiAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGEgbmV3IGdyb3VwIGFuZCBhcnRpZmFjdFxuICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwSWQgb2YgdGhlIGFydGlmYWN0LiBSZXZlcnNlZCBpbnRlcm5ldCBkb21haW4gbmFtZSBzdWNoIGFzIGNvbS5oZXJlLnJpYi5zY2hlbWFcbiAqIEBwYXJhbSBhcnRpZmFjdElkIFRoZSBJRCBvZiB0aGUgYXJ0aWZhY3RcbiAqIEBwYXJhbSByZWdpc3RlclJlcXVlc3QgVGhlIHJlZ2lzdGVyIHJlcXVlc3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJBcnRpZmFjdFVzaW5nUFVUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9hcnRpZmFjdC9yZWdpc3Rlci97Z3JvdXBJZH0ve2FydGlmYWN0SWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcInthcnRpZmFjdElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXJ0aWZhY3RJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wicmVnaXN0ZXJSZXF1ZXN0XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wicmVnaXN0ZXJSZXF1ZXN0XCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjaGVtYXNBcGlcbiAqL1xuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdtb2RpZnlSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgc2NoZW1hXG4gKiBAcGFyYW0gc2NoZW1hSHJuIFRoZSBIUk4gb2YgdGhlIHNjaGVtYVxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVTY2hlbWFVc2luZ0RFTEVURShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvc2NoZW1hL3tzY2hlbWFIcm59XCIucmVwbGFjZShcIntzY2hlbWFIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJzY2hlbWFIcm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdyZWFkUmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOXG4gKlxuICogQHN1bW1hcnkgUmVzb2x2ZSBhIHNjaGVtYSBkb2MgdmFyaWFudCBVUkxcbiAqIEBwYXJhbSBzY2hlbWFIcm4gVGhlIEhSTiBvZiB0aGUgc2NoZW1hXG4gKiBAcGFyYW0gZmlsZSBUaGUgcGF0aCB0byBzY2hlbWEgZmlsZVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXREb2N1bWVudFVzaW5nR0VUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9zY2hlbWEve3NjaGVtYUhybn0vZG9jL3tmaWxlfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3NjaGVtYUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInNjaGVtYUhyblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2ZpbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmaWxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAncmVhZFJlc291cmNlJyBmb3IgdGhlIGdpdmVuIEhSTlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIHNjaGVtYSBkZXRhaWxzXG4gKiBAcGFyYW0gc2NoZW1hSHJuIFRoZSBIUk4gb2YgdGhlIHNjaGVtYVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRTY2hlbWFVc2luZ0dFVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvc2NoZW1hL3tzY2hlbWFIcm59XCIucmVwbGFjZShcIntzY2hlbWFIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJzY2hlbWFIcm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdhcGlBY2Nlc3MnXG4gKlxuICogQHN1bW1hcnkgTGlzdCB0aGUgYXZhaWxhYmxlIHNjaGVtYXNcbiAqIEBwYXJhbSBzb3J0XG4gKiBAcGFyYW0gb3JkZXJcbiAqIEBwYXJhbSBmcm9tXG4gKiBAcGFyYW0gbGltaXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdFVzaW5nR0VUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9zY2hlbWFcIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic29ydFwiLCBwYXJhbXNbXCJzb3J0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwib3JkZXJcIiwgcGFyYW1zW1wib3JkZXJcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmcm9tXCIsIHBhcmFtc1tcImZyb21cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUkVBRCBncmFudHMgJ3JlYWRSZXNvdXJjZScsIE1PRElGWSBncmFudHMgJ21vZGlmeVJlc291cmNlJywgU0hBUkUgZ3JhbnRzICdzaGFyZVJlc291cmNlJy5cbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ3NoYXJlUmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOLlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZSBzY2hlbWEgcGVybWlzc2lvbnMgZm9yIHVzZXIgb24gdGhlIHNwZWNpZmllZCBzY2hlbWEgYW5kIGFzc29jaWF0ZWQgYXJ0aWZhY3QuXG4gKiBAcGFyYW0gc2NoZW1hSHJuIFRoZSBIUk4gb2YgdGhlIHNjaGVtYVxuICogQHBhcmFtIHVwZGF0ZVBlcm1pc3Npb25SZXF1ZXN0IFRoZSBwZXJtaXNzaW9uIHJlcXVlc3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NoZW1hUGVybWlzc2lvblVzaW5nUE9TVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvc2NoZW1hL3tzY2hlbWFIcm59L3Blcm1pc3Npb25cIi5yZXBsYWNlKFwie3NjaGVtYUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInNjaGVtYUhyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcInVwZGF0ZVBlcm1pc3Npb25SZXF1ZXN0XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1widXBkYXRlUGVybWlzc2lvblJlcXVlc3RcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi4gYW5kIGl0cyBhZmZpbGlhdGUocykuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBjb250YWluIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uXG4gKiBjb250cm9sbGVkIGJ5IEhFUkUgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGVnaXNsYXRpb24uXG4gKiBBbnkgdXNlIGFuZCB1dGlsaXphdGlvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgYW5kXG4gKiBkaXNjbG9zdXJlIHRvIGFueSB0aGlyZCBwYXJ0aWVzIGlzIGNvbmRpdGlvbmFsIHVwb24gaGF2aW5nIGEgc2VwYXJhdGVcbiAqIGFncmVlbWVudCB3aXRoIEhFUkUgZm9yIHRoZSBhY2Nlc3MsIHVzZSwgdXRpbGl6YXRpb24gb3IgZGlzY2xvc3VyZSBvZiB0aGlzXG4gKiBzb2Z0d2FyZS4gSW4gdGhlIGFic2VuY2Ugb2Ygc3VjaCBhZ3JlZW1lbnQsIHRoZSB1c2Ugb2YgdGhlIHNvZnR3YXJlIGlzIG5vdFxuICogYWxsb3dlZC5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRFbnRpdHlHcm91cE1lbWJlcnNoaXAgPSBnZXRFbnRpdHlHcm91cE1lbWJlcnNoaXA7XG5leHBvcnRzLmdldEVudGl0eU1hbmFnZWRHcm91cHMgPSBnZXRFbnRpdHlNYW5hZ2VkR3JvdXBzO1xuZXhwb3J0cy5nZXRSZWFsbU1lbWJlciA9IGdldFJlYWxtTWVtYmVyO1xuZXhwb3J0cy5nZXRSZWFsbU1lbWJlcnMgPSBnZXRSZWFsbU1lbWJlcnM7XG5leHBvcnRzLmNhbmNlbFJlYWxtTWVtYmVySW52aXRlID0gY2FuY2VsUmVhbG1NZW1iZXJJbnZpdGU7XG5leHBvcnRzLmNyZWF0ZVJlYWxtTWVtYmVySW52aXRlID0gY3JlYXRlUmVhbG1NZW1iZXJJbnZpdGU7XG5leHBvcnRzLnJlc2VuZFJlYWxtTWVtYmVySW52aXRlID0gcmVzZW5kUmVhbG1NZW1iZXJJbnZpdGU7XG5leHBvcnRzLnNlYXJjaFJlYWxtTWVtYmVySW52aXRlcyA9IHNlYXJjaFJlYWxtTWVtYmVySW52aXRlcztcbmV4cG9ydHMuYWRkR3JhbnQgPSBhZGRHcmFudDtcbmV4cG9ydHMuZ2V0R3JhbnQgPSBnZXRHcmFudDtcbmV4cG9ydHMuZ2V0R3JhbnRzID0gZ2V0R3JhbnRzO1xuZXhwb3J0cy5saXN0R3JhbnRzID0gbGlzdEdyYW50cztcbmV4cG9ydHMucmVtb3ZlR3JhbnQgPSByZW1vdmVHcmFudDtcbmV4cG9ydHMuYWRkUm9sZUVudGl0eSA9IGFkZFJvbGVFbnRpdHk7XG5leHBvcnRzLmRlbGV0ZVJvbGVFbnRpdHkgPSBkZWxldGVSb2xlRW50aXR5O1xuZXhwb3J0cy5nZXRNeVJvbGVzID0gZ2V0TXlSb2xlcztcbmV4cG9ydHMuZ2V0Um9sZSA9IGdldFJvbGU7XG5leHBvcnRzLmdldFJvbGVFbnRpdGllcyA9IGdldFJvbGVFbnRpdGllcztcbmV4cG9ydHMuZ2V0Um9sZUVudGl0eSA9IGdldFJvbGVFbnRpdHk7XG5leHBvcnRzLmdldFJvbGVQZXJtaXNzaW9uID0gZ2V0Um9sZVBlcm1pc3Npb247XG5leHBvcnRzLmdldFJvbGVQZXJtaXNzaW9ucyA9IGdldFJvbGVQZXJtaXNzaW9ucztcbmV4cG9ydHMuZ2V0Um9sZXMgPSBnZXRSb2xlcztcbmV4cG9ydHMuYWRkR3JvdXBNZW1iZXIgPSBhZGRHcm91cE1lbWJlcjtcbmV4cG9ydHMuY3JlYXRlR3JvdXAgPSBjcmVhdGVHcm91cDtcbmV4cG9ydHMuZGVsZXRlR3JvdXAgPSBkZWxldGVHcm91cDtcbmV4cG9ydHMuZ2V0R3JvdXAgPSBnZXRHcm91cDtcbmV4cG9ydHMuZ2V0R3JvdXBNZW1iZXIgPSBnZXRHcm91cE1lbWJlcjtcbmV4cG9ydHMuZ2V0R3JvdXBNZW1iZXJzID0gZ2V0R3JvdXBNZW1iZXJzO1xuZXhwb3J0cy5nZXRHcm91cFJvbGVzID0gZ2V0R3JvdXBSb2xlcztcbmV4cG9ydHMuZ2V0R3JvdXBzID0gZ2V0R3JvdXBzO1xuZXhwb3J0cy5nZXRNeUdyb3VwcyA9IGdldE15R3JvdXBzO1xuZXhwb3J0cy5sZWF2ZUdyb3VwID0gbGVhdmVHcm91cDtcbmV4cG9ydHMucmVtb3ZlR3JvdXBNZW1iZXIgPSByZW1vdmVHcm91cE1lbWJlcjtcbmV4cG9ydHMudXBkYXRlR3JvdXAgPSB1cGRhdGVHcm91cDtcbmV4cG9ydHMuYWRkUHJvamVjdE1lbWJlciA9IGFkZFByb2plY3RNZW1iZXI7XG5leHBvcnRzLmFkZFByb2plY3RSZXNvdXJjZVJlbGF0aW9uID0gYWRkUHJvamVjdFJlc291cmNlUmVsYXRpb247XG5leHBvcnRzLmNoZWNrUHJvamVjdEV4aXN0YW5jZSA9IGNoZWNrUHJvamVjdEV4aXN0YW5jZTtcbmV4cG9ydHMuY3JlYXRlUHJvamVjdCA9IGNyZWF0ZVByb2plY3Q7XG5leHBvcnRzLmRlbGV0ZVByb2plY3QgPSBkZWxldGVQcm9qZWN0O1xuZXhwb3J0cy5kZWxldGVQcm9qZWN0TWVtYmVyID0gZGVsZXRlUHJvamVjdE1lbWJlcjtcbmV4cG9ydHMuZGVsZXRlUHJvamVjdFJlc291cmNlUmVmZXJlbmNlID0gZGVsZXRlUHJvamVjdFJlc291cmNlUmVmZXJlbmNlO1xuZXhwb3J0cy5nZXRBbGxQcm9qZWN0TGlzdCA9IGdldEFsbFByb2plY3RMaXN0O1xuZXhwb3J0cy5nZXRQcm9qZWN0ID0gZ2V0UHJvamVjdDtcbmV4cG9ydHMuZ2V0UHJvamVjdExpc3QgPSBnZXRQcm9qZWN0TGlzdDtcbmV4cG9ydHMuZ2V0UHJvamVjdE1lbWJlciA9IGdldFByb2plY3RNZW1iZXI7XG5leHBvcnRzLmdldFByb2plY3RSZXNvdXJjZSA9IGdldFByb2plY3RSZXNvdXJjZTtcbmV4cG9ydHMubGVhdmVQcm9qZWN0ID0gbGVhdmVQcm9qZWN0O1xuZXhwb3J0cy5saXN0UHJvamVjdE1lbWJlcnMgPSBsaXN0UHJvamVjdE1lbWJlcnM7XG5leHBvcnRzLmxpc3RQcm9qZWN0UmVzb3VyY2VzID0gbGlzdFByb2plY3RSZXNvdXJjZXM7XG5leHBvcnRzLnBhdGNoUHJvamVjdCA9IHBhdGNoUHJvamVjdDtcbmV4cG9ydHMuZ2V0TGlzdE9mV2F5c1Jlc291cmNlSXNMaW5rYWJsZSA9IGdldExpc3RPZldheXNSZXNvdXJjZUlzTGlua2FibGU7XG5leHBvcnRzLmdldFJlc291cmNlID0gZ2V0UmVzb3VyY2U7XG5leHBvcnRzLmdldFJlc291cmNlTGlua2FiaWxpdHkgPSBnZXRSZXNvdXJjZUxpbmthYmlsaXR5O1xuZXhwb3J0cy5nZXRSZXNvdXJjZVByb2plY3RzID0gZ2V0UmVzb3VyY2VQcm9qZWN0cztcbmV4cG9ydHMuZ2V0UmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzO1xuZXhwb3J0cy5saXN0UmVhbG1SZXNvdXJjZXMgPSBsaXN0UmVhbG1SZXNvdXJjZXM7XG5leHBvcnRzLm1ha2VSZXNvdXJjZUxpbmthYmxlID0gbWFrZVJlc291cmNlTGlua2FibGU7XG5leHBvcnRzLnJlbW92ZVJlc291cmNlTGlua2FiaWxpdHkgPSByZW1vdmVSZXNvdXJjZUxpbmthYmlsaXR5O1xuZXhwb3J0cy51cGRhdGVSZXNvdXJjZUxpbmthYmlsaXR5ID0gdXBkYXRlUmVzb3VyY2VMaW5rYWJpbGl0eTtcbmV4cG9ydHMuYXR0YWNoUHJvamVjdFBvbGljeVRvTWVtYmVyID0gYXR0YWNoUHJvamVjdFBvbGljeVRvTWVtYmVyO1xuZXhwb3J0cy5jcmVhdGVQcm9qZWN0UG9saWN5ID0gY3JlYXRlUHJvamVjdFBvbGljeTtcbmV4cG9ydHMuZGVsZXRlUHJvamVjdFBvbGljeSA9IGRlbGV0ZVByb2plY3RQb2xpY3k7XG5leHBvcnRzLmRldGFjaFByb2plY3RQb2xpY3lGcm9tTWVtYmVyID0gZGV0YWNoUHJvamVjdFBvbGljeUZyb21NZW1iZXI7XG5leHBvcnRzLmdldEFsbFByb2plY3RNZW1iZXJzV2l0aEF0dGFjaGVkUG9saWN5ID0gZ2V0QWxsUHJvamVjdE1lbWJlcnNXaXRoQXR0YWNoZWRQb2xpY3k7XG5leHBvcnRzLmdldEF0dGFjaGVkUHJvamVjdFBvbGljaWVzRm9yTWVtYmVyID0gZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWNpZXNGb3JNZW1iZXI7XG5leHBvcnRzLmdldEF0dGFjaGVkUHJvamVjdFBvbGljeUZvck1lbWJlciA9IGdldEF0dGFjaGVkUHJvamVjdFBvbGljeUZvck1lbWJlcjtcbmV4cG9ydHMuZ2V0UHJvamVjdFBvbGljeSA9IGdldFByb2plY3RQb2xpY3k7XG5leHBvcnRzLmdldFByb2plY3RQb2xpY3lMaXN0ID0gZ2V0UHJvamVjdFBvbGljeUxpc3Q7XG5leHBvcnRzLnNldEF0dGFjaGVkUHJvamVjdFBvbGljaWVzVG9NZW1iZXIgPSBzZXRBdHRhY2hlZFByb2plY3RQb2xpY2llc1RvTWVtYmVyO1xuZXhwb3J0cy51cGRhdGVQcm9qZWN0UG9saWN5ID0gdXBkYXRlUHJvamVjdFBvbGljeTtcbmV4cG9ydHMuZ2V0UmVzb3VyY2VBY3Rpb25zRm9yUHJvamVjdCA9IGdldFJlc291cmNlQWN0aW9uc0ZvclByb2plY3Q7XG5leHBvcnRzLmdldFJlc291cmNlVHlwZUFjdGlvbkxpc3QgPSBnZXRSZXNvdXJjZVR5cGVBY3Rpb25MaXN0O1xuLyoqXG4gKiBBdXRob3JpemF0aW9uIEFQSSB2MS4xXG4gKiAgIFRoaXMgc3BlY2lmaWNhdGlvbiBpcyBpbnRlbmRlZCB0byBkZXNjcmliZSB0aGUgQXV0aG9yaXphdGlvbiB2MS4xIEFQSXNcbiAqXG4gKiAgIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjEuMFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKipcbiAqIFJldHJpZXZlIHRoZSBncm91cHMgYSBnaXZlbiBlbnRpdHkgaXMgYSBtZW1iZXIgb2YuIFJlc3RyaWN0aW9uczpcbiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkR3JvdXBzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCBlbnRpdHkuXG4gKlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSBncm91cHMgYSB1c2VyLCBIRVJFLTRiYTlhY2EzLWZkZjktNGNhZC1hM2RhLTUzNDQ5NGQ2MTk4ZiwgaXMgYSBtZW1iZXIgb2YsXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogXCJhY3Rpb25cIiA6IFwicmVhZEdyb3Vwc1wiXG4gKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06dXNlci9IRVJFLTRiYTlhY2EzLWZkZjktNGNhZC1hM2RhLTUzNDQ5NGQ2MTk4ZlwiXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0XG4gKlxuICogQHN1bW1hcnkgR2V0IGVudGl0eSBncm91cCBtZW1iZXJzaGlwXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgZ3JvdXAgb3IgcmVhbG0gbWVtYmVyXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RW50aXR5R3JvdXBNZW1iZXJzaGlwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZWFsbXMve3JlYWxtfS9tZW1iZXJzL3ttZW1iZXJ9L2dyb3Vwc1wiXG4gICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBncm91cHMgb3ZlciB3aGljaCB0aGUgcHJvdmlkZWQgZW50aXR5IGhhcyBiZWVuIGdyYW50ZWQgdGhlIHJvbGUgb2YgR3JvdXBBZG1pbi5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRHcm91cHMqKiBhY3Rpb24gYWdhaW5zdFxuICogdGhlIHNwZWNpZmllZCBlbnRpdHkuXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGdyb3VwcyBhIHVzZXIsIEhFUkUtNGJhOWFjYTMtZmRmOS00Y2FkLWEzZGEtNTM0NDk0ZDYxOThmLFxuICogaXMgYW4gYWRtaW4gb2YsIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRHcm91cHNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06dXNlci9IRVJFLTRiYTlhY2EzLWZkZjktNGNhZC1hM2RhLTUzNDQ5NGQ2MTk4ZlwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGVudGl0eSBtYW5hZ2VkIGdyb3VwXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgZ3JvdXAgb3IgcmVhbG0gbWVtYmVyXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RW50aXR5TWFuYWdlZEdyb3VwcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vbWVtYmVycy97bWVtYmVyfS9tYW5hZ2VkR3JvdXBzXCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlIHRoZSB1c2VyIG9yIGFwcGxpY2F0aW9uIGRldGFpbHMgb2YgdGhlIG1lbWJlciBkZWZpbmVkIGJ5IG1lbWJlcklkLiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0XG4gKiB0aGUgc3BlY2lmaWVkIHJlYWxtLlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIHJldHJpZXZlIGEgbWVtYmVyIG9mIHRoZSByZWFsbSwgX015UmVhbG1fLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nXG4gKiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHJlYWxtIG1lbWJlclxuICogQHBhcmFtIHJlYWxtIEhSTiBpZGVudGlmeWluZyB0aGUgcmVhbG1cbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIGdyb3VwIG9yIHJlYWxtIG1lbWJlclxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWFsbU1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBtZW1iZXJzIHdpdGhpbiB0aGUgcmVhbG0uIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRNZW1iZXJzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gbGlzdCB0aGUgbWVtYmVycyBvZiB0aGUgcmVhbG0sIF9NeVJlYWxtXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCByZWFsbSBtZW1iZXJzXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdHlwZSBvZiBtZW1iZXJzIHRvIHJldHVybiBpbiB0aGUgcmVzdWx0LlxuICogT25lIG9mICd1c2VyJyBvciAnYXBwJy4gICBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhbGwgZW50aXR5IHR5cGVzIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gcSBBIGZyZWUgdGV4dCBxdWVyeSBzdHJpbmcgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuXG4gKiBBIHNlYXJjaCBhZ2FpbnN0IG1lbWJlcnMgaW4gdGhlIHJlYWxtIHdpbGwgY29uc2lkZXIgdGhlXG4gKiAndXNlcklkJyxcbiAqICdmaXJzdG5hbWUnLFxuICogJ2xhc3RuYW1lJyxcbiAqICdlbWFpbCcsXG4gKiAnY2xpZW50SWQnLFxuICogJ25hbWUnIGFuZCAncm9sZXMnIGZpZWxkcyBvZiB0aGUgbWVtYmVycy5cbiAqIFRoZSBwcmVjaXNlIHNlYXJjaCBhbGdvcml0aG0gdXNlZCB0byBtYXRjaCBtZW1iZXJzIGlzIG5vdCBzcGVjaWZpZWQsXG4gKiBidXQgZ2VuZXJhbGx5IGFueSBtZW1iZXIgd2hlcmUgb25lIG9mIHRoZSBjb25zaWRlcmVkIGZpZWxkcyBoYXMgYSBmdWxsIG9yIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLlxuICogQHBhcmFtIHN0YXRlIE9ubHkgcmV0dXJuIHVzZXIgbWVtYmVycyB3aXRoIHRoZSBnaXZlbiAnc3RhdGUnIGluIHRoZSByZXN1bHRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWFsbU1lbWJlcnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L21lbWJlcnNcIi5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicVwiLCBwYXJhbXNbXCJxXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhdGVcIiwgcGFyYW1zW1wic3RhdGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENhbmNlbCBhbiBpbnZpdGF0aW9uIHRvIHRoZSByZWFsbS4gUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlSW52aXRlcyoqXG4gKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlYWxtLlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIGRlbGV0ZSBhbiBpbnZpdGF0aW9uIHRvIHRoZSByZWFsbSxcbiAqIF9NeVJlYWxtXywgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlSW52aXRlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBDYW5jZWwgYSB1c2VyIGludml0YXRpb24gdG8gYSByZWFsbVxuICogQHBhcmFtIHJlYWxtIEhSTiBpZGVudGlmeWluZyB0aGUgcmVhbG1cbiAqIEBwYXJhbSBpbnZpdGUgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gaW52aXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBjYW5jZWxSZWFsbU1lbWJlckludml0ZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vaW52aXRlcy97aW52aXRlfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAucmVwbGFjZShcIntpbnZpdGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJpbnZpdGVcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlIGFuZCBzZW5kIGFuIGludml0YXRpb24gdG8gYWRkIGEgbmV3IG1lbWJlciB0byB0aGUgcmVhbG0sXG4gKiBvcHRpb25hbGx5IGFzc2lnbiBtZW1iZXJzaGlwIHRvIG9uZSBvciBtb3JlIGdyb3VwcyBpZiB0aGUgSW52aXRlciBpcyBhbHNvIGEgKipHcm91cEFkbWluKipcbiAqIGZvciB0aGUgZ3JvdXAuIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZVxuICogKiptYW5hZ2VJbnZpdGVzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZWFsbS5cbiAqIEBleGFtcGxlOiBJbiBvcmRlciB0byBpbnZpdGUgYSBuZXcgdXNlciB0byB0aGUgcmVhbG0sIF9NeVJlYWxtXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUludml0ZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gaW52aXRlIGEgbmV3IHVzZXIgdG8gdGhlIHJlYWxtLCBfTXlSZWFsbV8sXG4gKiBhcyBhIG1lbWJlciBvZiB0aGUgZ3JvdXAgR1JPVVAtYTNkZWUyZmUtZmIzOC00MTgzLWI2ODYtMTRmZGVhNTk2NGMwLFxuICogdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9ucyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlSW52aXRlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC1hM2RlZTJmZS1mYjM4LTQxODMtYjY4Ni0xNGZkZWE1OTY0Y1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIGFuZCBzZW5kIGEgdXNlciBpbnZpdGF0aW9uIGZvciBhIHJlYWxtXG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHJlYWxtIEhSTiBpZGVudGlmeWluZyB0aGUgcmVhbG1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVhbG1NZW1iZXJJbnZpdGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L2ludml0ZXNcIi5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJlc2VuZCBhbiBpbnZpdGF0aW9uIHRvIGEgbmV3IG1lbWJlciB0byB0aGUgcmVhbG0uXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VJbnZpdGVzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIHJlc2VuZCBhbiBpbnZpdGUgdG8gYSBuZXcgdXNlciB0byB0aGUgcmVhbG0sIF9NeVJlYWxtXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUludml0ZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVzZW5kIGFuIGludml0YXRpb24gdG8gYSB1c2VyIGluIGEgcmVhbG1cbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKiBAcGFyYW0gaW52aXRlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGludml0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzZW5kUmVhbG1NZW1iZXJJbnZpdGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L2ludml0ZXMve2ludml0ZX1cIlxuICAgICAgICAucmVwbGFjZShcIntyZWFsbX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlYWxtXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7aW52aXRlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiaW52aXRlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBTZWFyY2ggZm9yIGludml0YXRpb25zIGluIHRoZSByZWFsbSwgb3B0aW9uYWxseSBwcm92aWRpbmcgYSBncm91cC5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZUludml0ZXMqKlxuICogYWN0aW9uIGFnYWluc3QgdGhlIHJlYWxtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyBwYXJ0eS5cbiAqXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gbGlzdCB0aGUgaW52aXRhdGlvbnMgd2l0aGluIHRoZSBjYWxsaW5nIHBhcnR5J3MgcmVhbG0gYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlSW52aXRlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGludml0YXRpb25zIGluIGEgcmVhbG1cbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKiBAcGFyYW0gZ3JvdXAgSFJOIGlkZW5pdGlmeWluZyB0aGUgZ3JvdXAgdG8gc2VhcmNoLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKiBAcGFyYW0gcSBBIGZyZWUgdGV4dCBxdWVyeSBzdHJpbmcgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuXG4gKiBBIHNlYXJjaCBhZ2FpbnN0IGludml0ZXMgaW4gdGhlIHJlYWxtIHdpbGwgY29uc2lkZXIgdGhlICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCBhbmQgJ2VtYWlsQWRkcmVzcycgZmllbGRzIG9mIHRoZSBpbnZpdGVzLlxuICogVGhlIHByZWNpc2Ugc2VhcmNoIGFsZ29yaXRobSB1c2VkIHRvIG1hdGNoIGludml0ZXMgaXMgbm90IHNwZWNpZmllZCwgYnV0IGdlbmVyYWxseSBhbnkgaW52aXRlIHdoZXJlIG9uZVxuICogb2YgdGhlIGNvbnNpZGVyZWQgZmllbGRzIGhhcyBhIGZ1bGwgb3IgcGFydGlhbCBtYXRjaCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlYXJjaFJlYWxtTWVtYmVySW52aXRlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vaW52aXRlc1wiLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJncm91cFwiLCBwYXJhbXNbXCJncm91cFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInFcIiwgcGFyYW1zW1wicVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR3JhbnRzQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogR3JhbnQgYWNjZXNzIHRvIGEgcmVzb3VyY2UgdG8gYW4gZW50aXR5LlxuICogVGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgaXMgdGhhdCB0aGUgc3BlY2lmaWVkIGVudGl0eSB3aWxsIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIHJlYWxtIG9mIHRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBtYXRjaCB0aGUgcmVhbG0gb2YgdGhlIHJlcXVlc3RlZCBlbnRpdHkuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiphZGRHcmFudDp7YWN0aW9uSWR9KiogT1IgKipzaGFyZSoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGFkZCBhIGdyYW50IGZvciB0aGUgKipyZWFkUmVzb3VyY2UqKiBhY3Rpb24gYWdhaW5zdCByZXNvdXJjZSAqKmhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZyoqIGEgcGVybWlzc2lvblxuICogd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJhZGRHcmFudDpyZWFkUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiBPUlxuICogKiBcImFjdGlvblwiIDogXCJzaGFyZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHcmFudCBhY2Nlc3MgdG8gYSByZXNvdXJjZSB0byBhbiBlbnRpdHkuXG4gKiBAcGFyYW0gcmVzb3VyY2VIcm4gVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlXG4gKiBAcGFyYW0gZW50aXR5SWQgVGhlIHRhcmdldCBlbnRpdHlJZCB0byBncmFudCBhY2Nlc3MgdG9cbiAqIEBwYXJhbSBhY3Rpb25JZCBUaGUgYWN0aW9uIHRvIGFzc2lnbiBhcyBhbGxvd2VkIGFnYWluc3QgdGhlIHJlc291cmNlXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5IHRvIGdyYW50IGFjY2VzcyB0by4gIE11c3QgYmUgb25lIG9mIHVzZXIsIGFwcCwgb3IgZ3JvdXBcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkR3JhbnQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2dyYW50cy9yZXNvdXJjZXMve3Jlc291cmNlSHJufS9lbnRpdGllcy97ZW50aXR5SWR9L2FjdGlvbnMve2FjdGlvbklkfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VIcm5cIl0pKVxuICAgICAgICAucmVwbGFjZShcIntlbnRpdHlJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eUlkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7YWN0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhY3Rpb25JZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbnRpdHlUeXBlXCIsIHBhcmFtc1tcImVudGl0eVR5cGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgYSBzaW5nbGUgZ3JhbnQgZ2l2ZW4gdG8gYW4gZW50aXR5LlxuICogVGhpcyBjYWxscyByZXR1cm5zIGFueSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlIHNwZWNpZmllZCBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIG9uIHRoZSByZXF1ZXN0ZWQgZW50aXR5LlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgcmVhbG0gb2YgdGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIG1hdGNoIHRoZSByZWFsbSBvZiB0aGUgcmVxdWVzdGVkIGFwcC5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKmxpc3RHcmFudHMqKiBPUiAqKnNoYXJlKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqICogSW4gb3JkZXIgdG8gZ2V0IGEgZ3JhbnQgYWdhaW5zdCByZXNvdXJjZSAqKmhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZyoqXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0R3JhbnRzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogT1JcbiAqICogXCJhY3Rpb25cIiA6IFwic2hhcmVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgc2luZ2xlIGdyYW50IGdpdmVuIHRvIGFuIGVudGl0eVxuICogQHBhcmFtIHJlc291cmNlSHJuIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIGVudGl0eUlkIFRoZSB0YXJnZXQgZW50aXR5SWQgdG8gZ2V0IHRoZSBncmFudCBvZlxuICogQHBhcmFtIGFjdGlvbklkIFRoZSBhY3Rpb24gb2YgdGhlIGdyYW50XG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5IHRvIGdldCB0aGUgZ3JhbnQgb2YuICBNdXN0IGJlIG9uZSBvZiB1c2VyLCBhcHAsIG9yIGdyb3VwXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEdyYW50KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncmFudHMvcmVzb3VyY2VzL3tyZXNvdXJjZUhybn0vZW50aXRpZXMve2VudGl0eUlkfS9hY3Rpb25zL3thY3Rpb25JZH1cIlxuICAgICAgICAucmVwbGFjZShcIntyZXNvdXJjZUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlSHJuXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7ZW50aXR5SWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJlbnRpdHlJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2FjdGlvbklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYWN0aW9uSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgZ3JhbnRzLiBUaGlzIGNhbGwgZGVzY3JpYmVzIHRoZSBwZXJtaXNzaW9ucyBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWVkIGVudGl0eSB0aGF0IGdyYW50IGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIHJlYWxtIG9mIHRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBtYXRjaCB0aGUgcmVhbG0gb2YgdGhlIHJlcXVlc3RlZCBlbnRpdHkuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipsaXN0R3JhbnRzKiogT1IgKipzaGFyZSoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBnZXQgZ3JhbnRzIGFnYWluc3QgcmVzb3VyY2UgKipocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2cqKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0R3JhbnRzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogT1JcbiAqICogXCJhY3Rpb25cIiA6IFwic2hhcmVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGdyYW50cyBnaXZlbiB0byBhIHVzZXIsIGFwcCwgb3IgZ3JvdXBcbiAqIEBwYXJhbSByZXNvdXJjZUhybiBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSBlbnRpdHlJZCBUaGUgZW50aXR5SWQgdG8gZ2V0IHRoZSBncmFudHMgb2ZcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgcmVxdWVzdGVkLiAgTXVzdCBiZSBvbmUgb2YgdXNlciwgYXBwLCBvciBncm91cFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRHcmFudHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2dyYW50cy9yZXNvdXJjZXMve3Jlc291cmNlSHJufS9lbnRpdGllcy97ZW50aXR5SWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2VudGl0eUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZW50aXR5SWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBMaXN0IGdyYW50cyBvbiB1c2VyLCBhcHBzLCBvciBncm91cHMuXG4gKiBUaGlzIGNhbGwgZGVzY3JpYmVzIHRoZSBwZXJtaXNzaW9ucyBhc3NpZ25lZCB0byBhbnkgdXNlciwgYXBwLCBvciBncm91cCAqKmluIHRoZSBzYW1lIHJlYWxtIGFzIHRoZSBjYWxsaW5nIHByaW5jaXBhbCoqXG4gKiB0aGF0IGhhcyBiZWVuIGdyYW50ZWQgYWNjZXNzIHRvIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdGhyb3VnaCBhbiBleGFjdCBtYXRjaGluZyBwZXJtaXNzaW9uLlxuICogUGVybWlzc2lvbnMgZ3JhbnRlZCB0aHJvdWdoIHBvbGljaWVzIGFuZCByb2xlcyBhcmUgbm90IGluY2x1ZGVkLlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbGlzdEdyYW50cyoqIE9SICoqc2hhcmUqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbGlzdCBncmFudHMgYWdhaW5zdCByZXNvdXJjZSAqKmhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZyoqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcImxpc3RHcmFudHNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiBPUlxuICogKiBcImFjdGlvblwiIDogXCJzaGFyZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBMaXN0IGdyYW50cyBvbiB1c2VycywgYXBwcywgb3IgZ3JvdXBzXG4gKiBAcGFyYW0gcmVzb3VyY2VIcm4gVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBSZXN0cmljdCB0byBvbmx5IHRoaXMgdHlwZSBvZiBlbnRpdHkgIGluIHRoZSByZXNwb25zZS4gIE11c3QgYmUgb25lIG9mIHVzZXIsIGFwcCwgb3IgZ3JvdXBcbiAqIEBwYXJhbSBwYWdlVG9rZW4gV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuICdjb3VudCcgdG90YWwgcmVjb3JkcywgdXNlIHRoZSBwYWdlVG9rZW4gZnJvbSB0aGUgcHJldmlvdXMgcGFnZSB0byByZXRyaWV2ZSB0aGUgbmV4dCBwYWdlXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RHcmFudHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2dyYW50cy9yZXNvdXJjZXMve3Jlc291cmNlSHJufS9lbnRpdGllc1wiLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbnRpdHlUeXBlXCIsIHBhcmFtc1tcImVudGl0eVR5cGVcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldm9rZSBhY2Nlc3MgdG8gYSByZXNvdXJjZSBmcm9tIGFuIGVudGl0eS5cbiAqIFRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIGlzIHRoYXQgdGhlIHNwZWNpZmllZCBlbnRpdHkgd2lsbCBoYXZlIGFueSBkaXJlY3RseSBhc3NpZ25lZCBwZXJtaXNzaW9uXG4gKiB0byB0YWtlIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZSByZW1vdmVkLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIHJlYWxtIG9mIHRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBtYXRjaCB0aGUgcmVhbG0gb2YgdGhlIHJlcXVlc3RlZCBhcHAuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZW1vdmVHcmFudDp7YWN0aW9uSWR9KipcbiAqIE9SICoqc2hhcmUqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gcmVtb3ZlIGEgZ3JhbnQgZm9yIHRoZSAqKnJlYWRSZXNvdXJjZSoqIGFjdGlvbiBhZ2FpbnN0IHJlc291cmNlICoqaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nKipcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlbW92ZUdyYW50OnJlYWRSZXNvdXJjZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqIE9SXG4gKiAqIFwiYWN0aW9uXCIgOiBcInNoYXJlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFJldm9rZSBhY2Nlc3MgdG8gYSByZXNvdXJjZSBmcm9tIGFuIGVudGl0eVxuICogQHBhcmFtIHJlc291cmNlSHJuIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIGVudGl0eUlkIFRoZSB0YXJnZXQgZW50aXR5SWQgdG8gcmV2b2tlIGFjY2VzcyBmcm9tXG4gKiBAcGFyYW0gYWN0aW9uSWQgVGhlIGFjdGlvbiBhZ2FpbnN0IHRoZSByZXNvdXJjZSB0byByZXZva2UgYWNjZXNzIGZyb21cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgdG8gcmV2b2tlIGFjY2VzcyBmcm9tLiAgTXVzdCBiZSBvbmUgb2YgdXNlciwgYXBwLCBvciBncm91cFxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHcmFudChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JhbnRzL3Jlc291cmNlcy97cmVzb3VyY2VIcm59L2VudGl0aWVzL3tlbnRpdHlJZH0vYWN0aW9ucy97YWN0aW9uSWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2VudGl0eUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZW50aXR5SWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcInthY3Rpb25JZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFjdGlvbklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImVudGl0eVR5cGVcIiwgcGFyYW1zW1wiZW50aXR5VHlwZVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJvbGVzQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQXNzaWduIHRoZSByb2xlIHByb3ZpZGVkIHRvIHRoZSBnaXZlbiBlbnRpdHkuXG4gKiBJZiB0aGUgcHJvdmlkZWQgcm9sZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBncm91cCwgdGhlIGVudGl0eSBiZWluZyBhc3NpZ25lZCB0aGUgcm9sZSBtdXN0IGJlIGEgbWVtYmVyIG9mIHRoZSBhc3NvY2lhdGVkIGdyb3VwLlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlRW50aXRpZXMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGFzc2lnbiB0aGUgcm9sZSwgX0dyb3VwQWRtaW5fLCB0byBhbiBlbnRpdHkgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZFxuICogYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUVudGl0aWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEFzc2lnbiBhIHJvbGUgdG8gYW4gZW50aXR5XG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gZW50aXR5IEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGVudGl0eVxuICovXG5hc3luYyBmdW5jdGlvbiBhZGRSb2xlRW50aXR5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vZW50aXRpZXMve2VudGl0eX1cIlxuICAgICAgICAucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2VudGl0eX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSByb2xlIHByb3ZpZGVkIHRvIGZyb20gdGhlIGdpdmVuIG1lbWJlci5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZUVudGl0aWVzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByb2xlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byByZXZva2UgdGhlIHJvbGUsIF9Hcm91cEFkbWluXywgZnJvbSBhbiBlbnRpdHkgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlRW50aXRpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cm9sZS9ST0xFLWMxNjYyMTM4LWExNzAtNDI2NC1iYTE4LTdiNTA2YTcwOGMzN1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmV2b2tlIGEgcm9sZSBmcm9tIGFuIGVudGl0eVxuICogQHBhcmFtIHJvbGUgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gcm9sZVxuICogQHBhcmFtIGVudGl0eSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiBlbnRpdHlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlUm9sZUVudGl0eShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXMve3JvbGV9L2VudGl0aWVzL3tlbnRpdHl9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cm9sZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJvbGVcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntlbnRpdHl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJlbnRpdHlcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2Ygcm9sZXMgd2hpY2ggaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIHRoZSBjYWxsaW5nIHBhcnR5LlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgTXkgUm9sZXNcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRNeVJvbGVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy9tZVwiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgdGhlIHJvbGUgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgUm9sZSBIUk4uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZFJvbGVzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZWFsbS5cbiAqXG4gKiAgRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJldHJpZXZlIGEgcm9sZSB3aXRoaW4gdGhlIHJlYWxtLCBfTXlSZWFsbV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkUm9sZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IFJvbGVcbiAqIEBwYXJhbSByb2xlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIHJvbGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Um9sZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXMve3JvbGV9XCIucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGVudGl0aWVzIHdoaWNoIGhhdmUgYmVlbiBhc3NpZ25lZCB0aGUgcm9sZSBhcyBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCByb2xlIEhSTi5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkRW50aXRpZXMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gKlxuICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGxpc3QgdGhlIGVudGl0aWVzIGFzc2lnbmVkIHRoZSByb2xlLCBfXG4gKiBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZEVudGl0aWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCByb2xlIGVudGl0aWVzXG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Um9sZUVudGl0aWVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vZW50aXRpZXNcIi5yZXBsYWNlKFwie3JvbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyb2xlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmUgYSBzaW5nbGUgZW50aXR5IHdoaWNoIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSByb2xlIGFzIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIHJvbGUgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRFbnRpdGllcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gcmV0cmlldmUgYW4gZW50aXR5IGFzc2lnbmVkIHRoZSByb2xlLCBfR3JvdXBBZG1pbl8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkRW50aXRpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cm9sZS9ST0xFLWMxNjYyMTM4LWExNzAtNDI2NC1iYTE4LTdiNTA2YTcwOGMzN1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgc2luZ2xlIHJvbGUgZW50aXR5XG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gZW50aXR5IEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGVudGl0eVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSb2xlRW50aXR5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vZW50aXRpZXMve2VudGl0eX1cIlxuICAgICAgICAucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2VudGl0eX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldCBhIHNpbmdsZSBwZXJtaXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm9sZSBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBSb2xlIEhSTi5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkUGVybWlzc2lvbnMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIHJldHJpZXZlIGEgc2luZ2xlIHJvbGUgcGVybWlzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCByb2xlIGluIHJlYWxtIF9NeVJlYWxtXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRQZXJtaXNzaW9uc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpyb2xlL1JPTEUtYzE2NjIxMzgtYTE3MC00MjY0LWJhMTgtN2I1MDZhNzA4YzM3XCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgUm9sZSBQZXJtaXNzaW9uXG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gcGVybWlzc2lvbiBQZXJtaXNzaW9uIGlkZW50aWZpZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Um9sZVBlcm1pc3Npb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3JvbGVzL3tyb2xlfS9wZXJtaXNzaW9ucy97cGVybWlzc2lvbn1cIlxuICAgICAgICAucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie3Blcm1pc3Npb259XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwZXJtaXNzaW9uXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBwZXJtaXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHJvbGUgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgUm9sZSBIUk4uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZFBlcm1pc3Npb25zKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByb2xlLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBsaXN0IHJvbGUgcGVybWlzc2lvbnMgZm9yIHRoZSBzcGVjaWZpZWQgcm9sZSBpbiByZWFsbSBfTXlSZWFsbV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkUGVybWlzc2lvbnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cm9sZS9ST0xFLWMxNjYyMTM4LWExNzAtNDI2NC1iYTE4LTdiNTA2YTcwOGMzN1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IFJvbGUgUGVybWlzc2lvbnNcbiAqIEBwYXJhbSByb2xlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIHJvbGVcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSb2xlUGVybWlzc2lvbnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3JvbGVzL3tyb2xlfS9wZXJtaXNzaW9uc1wiLnJlcGxhY2UoXCJ7cm9sZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJvbGVcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiByb2xlcyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb3ZpZGVkIHJlYWxtLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRSb2xlcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGxpc3Qgcm9sZXMgd2l0aGluIHRoZSByZWFsbSwgX015UmVhbG1fLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkXG4gKiBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFJvbGVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBSb2xlc1xuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKiBAcGFyYW0gcm9sZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJvbGUgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdCBzZXQuXG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiBvZiB0aGUgcmVzb3VyY2Ugd2hpY2ggdGhlIHJvbGVzIHJldHVybmVkIGluIHRoZSByZXN1bHQgc2V0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFJvbGVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlc1wiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicm9sZU5hbWVcIiwgcGFyYW1zW1wicm9sZU5hbWVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVzb3VyY2VcIiwgcGFyYW1zW1wicmVzb3VyY2VcIl0pO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHcm91cHNBcGlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbWVtYmVyIHRvIGEgZ3JvdXAuXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBncm91cFxuICogaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGFkZCBhIG1lbWJlciB0byB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkXG4gKiBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEFkZCBhIG1lbWJlciB0byBhIGdyb3VwXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIGdyb3VwIG9yIHJlYWxtIG1lbWJlclxuICovXG5hc3luYyBmdW5jdGlvbiBhZGRHcm91cE1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZSBhIGdyb3VwIHdpdGhpbiB0aGUgcmVhbG0gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgcGFydHkuXG4gKiBUaGUgY2FsbGluZyBwYXJ0eSB3aWxsIGJlIG1hZGUgYSBtZW1iZXIgYW5kIGFuIGFkbWluaXN0cmF0b3Igb2YgdGhlIGNyZWF0ZWQgZ3JvdXAuXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqY3JlYXRlR3JvdXAqKiBhY3Rpb25cbiAqIGFnYWluc3QgdGhlIHJlYWxtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyBwYXJ0eS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBjcmVhdGUgYSBncm91cCB3aXRoaW4gdGhlIGNhbGxpbmcgcGFydHkncyByZWFsbSBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJjcmVhdGVHcm91cFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBDcmVhdGUgZ3JvdXBcbiAqIEBwYXJhbSBib2R5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUdyb3VwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHNcIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlbGV0ZSB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlXG4gKiB0aGUgKipkZWxldGVHcm91cCoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZGVsZXRlIHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJkZWxldGVHcm91cFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IGRlbGV0ZSBncm91cFxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUdyb3VwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9XCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRNZW1iZXJzKiogYWN0aW9uXG4gKiBhZ2FpbnN0IHRoZSByZWFsbSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgcGFydHkuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmV0cmlldmUgYSBncm91cCB3aXRoaW4gdGhlIGNhbGxpbmcgcGFydHkncyByZWFsbSBhIHBlcm1pc3Npb25cbiAqIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHNpbmdsZSBncm91cFxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEdyb3VwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9XCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlIGEgc2luZ2xlIGdyb3VwIG1lbWJlci5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0XG4gKiB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJldHJpZXZlIGEgc2luZ2xlIG1lbWJlciBvZiB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgc2luZ2xlIEdyb3VwIG1lbWJlclxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyBncm91cCBvciByZWFsbSBtZW1iZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0R3JvdXBNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwcy97Z3JvdXBJZH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2dyb3VwSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJncm91cElkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgbWVtYmVycyBvZiB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRNZW1iZXJzKiogYWN0aW9uIGFnYWluc3QgdGhlIGdyb3VwXG4gKiBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgbWVtYmVycyBvZiB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgR3JvdXAgbWVtYmVyc1xuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0eXBlIG9mIG1lbWJlcnMgdG8gcmV0dXJuIGluIHRoZSByZXN1bHQuXG4gKiBPbmUgb2YgJ3VzZXInLCAnYXBwJywgb3IgJ2ludml0ZScuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhbGwgZW50aXR5IHR5cGVzIHdpbGwgYmUgcmV0dXJuZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEdyb3VwTWVtYmVycyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzXCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbnRpdHlUeXBlXCIsIHBhcmFtc1tcImVudGl0eVR5cGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIExpc3QgdGhlIHJvbGVzIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGdyb3VwLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRSb2xlcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgZ3JvdXAuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIGxpc3QgdGhlIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFJvbGVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmdyb3VwL0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGdyb3VwIHJvbGVzXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRHcm91cFJvbGVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9L3JvbGVzXCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGdyb3VwcyB3aXRoaW4gdGhlIHJlYWxtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyBwYXJ0eS5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSByZWFsbSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgcGFydHkuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbGlzdCB0aGUgZ3JvdXBzIHdpdGhpbiB0aGUgY2FsbGluZyBwYXJ0eSdzIHJlYWxtIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBncm91cHNcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICogQHBhcmFtIHEgQSBmcmVlIHRleHQgcXVlcnkgc3RyaW5nIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRzLlxuICogQSBzZWFyY2ggYWdhaW5zdCBncm91cHMgaW4gdGhlIHJlYWxtIHdpbGwgY29uc2lkZXIgdGhlICdpZCcsICduYW1lJywgYW5kICdkZXNjcmlwdGlvbicgZmllbGRzIG9mIHRoZSBncm91cHMuXG4gKiBUaGUgcHJlY2lzZSBzZWFyY2ggYWxnb3JpdGhtIHVzZWQgdG8gbWF0Y2ggZ3JvdXBzIGlzIG5vdCBzcGVjaWZpZWQsIGJ1dCBnZW5lcmFsbHkgYW55IG1lbWJlciB3aGVyZVxuICogb25lIG9mIHRoZSBjb25zaWRlcmVkIGZpZWxkcyBoYXMgYSBmdWxsIG9yIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRHcm91cHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwc1wiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicVwiLCBwYXJhbXNbXCJxXCJdKTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmUgYSBsaXN0IG9mIGdyb3VwcyBvZiBhIG1lbWJlclxuICpcbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IE15IEdyb3Vwc1xuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE15R3JvdXBzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMvbWVcIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBjYWxsaW5nIHBhcnR5IGZyb20gdGhlIGdyb3VwLiBUaGlzIG9wZXJhdGlvbiB3aWxsIGFsc28gcmVtb3ZlIGFkbWluaXN0cmF0aXZlIHJvbGVzIGZyb20gdGhpcyBtZW1iZXIuXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFJlbW92ZXMgdGhlIGNhbGxpbmcgcGFydHkgZnJvbSBhIGdyb3VwXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGVhdmVHcm91cChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzL21lXCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZW1vdmUgYSBtZW1iZXIgZnJvbSB0aGUgZ3JvdXAuIFRoaXMgb3BlcmF0aW9uIHdpbGwgYWxzbyByZW1vdmUgYWRtaW5pc3RyYXRpdmUgcm9sZXMgZnJvbSB0aGlzIG1lbWJlci5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVtb3ZlIGEgbWVtYmVyIGZyb20gdGhlIGdyb3VwLCBfR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBSZW1vdmUgYSBtZW1iZXIgZnJvbSB0aGUgZ3JvdXAuXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIGdyb3VwIG9yIHJlYWxtIG1lbWJlclxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHcm91cE1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogVXBkYXRlIHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4gYnkgdXBkYXRpbmcgYWxsIHdyaXRhYmxlIGdyb3VwIGZpZWxkcyBpbmNsdWRpbmcgbmFtZSBhbmQgZGVzY3JpcHRpb24uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICAqKnVwZGF0ZUdyb3VwKiogYWN0aW9uXG4gKiBhZ2FpbnN0IHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbW9kaWZ5IHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJ1cGRhdGVHcm91cFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZSBncm91cFxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSBncm91cElkIEhSTiBpZGVudGlmeWluZyBhIGdyb3VwLlxuICovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVHcm91cChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfVwiLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFByb2plY3RzQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQWRkIHRoZSBtZW1iZXIgdG8gdGhlIHJlcXVlc3RlZCBQcm9qZWN0LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZU1lbWJlcnMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gYWRkIGEgbWVtYmVyIHRvIHRoZSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgbWVtYmVyIHRvIHRoZSByZXF1ZXN0ZWQgUHJvamVjdFxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBhZGRQcm9qZWN0TWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBBZGQgdGhlIHJlc291cmNlIHRvIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBhcyBhIGhvbWUgb3IgYSByZWZlcmVuY2UobGluaykuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlbiAgKipXaGVuIHJlbGF0aW9uPWhvbWUqKlxuICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSB3aWxsIGJlIGFzc2lnbmVkIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCBhcyBpdHMgcmVzb3VyY2UgaG9tZS5cbiAqIFRoZSByZXNvdXJjZSAqKk1VU1QgTk9UKiogYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIHJlc291cmNlIGhvbWUuXG4gKlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUmVzb3VyY2VIb21lKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QgKipBTkQqKlxuICogdGhlICoqc2hhcmUqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBhZGQgcmVzb3VyY2UgXCJocm46aGVyZTpkYXRhOjpteXJlYWxtOm15LWNhdGFsb2ctMDAwMFwiIHRvIHRoZSBwcm9qZWN0XG4gKiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIiwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9ucyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogUGVybWlzc2lvbiAxOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZUhvbWVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICpcbiAqICogUGVybWlzc2lvbiAyOlxuICogKiBcImFjdGlvblwiIDogXCJzaGFyZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6bXlyZWFsbTpteS1jYXRhbG9nLTAwMDBcIiAqKldoZW4gcmVsYXRpb249cmVmZXJlbmNlKipcbiAqIExpbmsgdGhlIHJlc291cmNlIHRvIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBhcyBhIHJlZmVyZW5jZShsaW5rKS5cbiAqIFRoZSByZXF1ZXN0ZWQgcmVzb3VyY2Ugd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgcmVxdWVzdGVkIHByb2plY3QgYXMgcmVmZXJlbmNlKGxpbmspLlxuICpcbiAqIFRoZSByZXNvdXJjZSAqKk1VU1QqKiBiZSBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byBhdHRhY2ggYXMgYSByZXNvdXJjZSByZWZlcmVuY2UobGluaykuXG4gKiBBIHJlc291cmNlIGlzIHJlZmVyZW5jZWFibGUgaWYgaXQgaGFzIGJlZW4gbWFya2VkIGFzIHJlZmVyZW5jZWFibGUgYW5kIHRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb24gdG8gYWxsIHJlZmVyZW5jZSBlbmFibGVkIGFjdGlvbnNcbiAqIGFnYWluc3QgdGhlIHJlc291cmNlIE9SIFRoZSByZXNvdXJjZSBoYXMgYmVlbiBtYWRlIGxpbmthYmxlIHRvIHRoZSBwcm9qZWN0L3JlYWxtIGZvciB0aGUgcHJvamVjdCBsaW5raW5nIGVuYWJsZWQgYWN0aW9uXG4gKiBUaGUgZXhjbHVzaXZlIGxpc3Qgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIGF0dGFjaCBhcyBhIHJlc291cmNlIHJlZmVyZW5jZShsaW5rKSBpcyBhY2Nlc3NpYmxlIHZpYSBhIGNhbGxcbiAqIHRvIC9yZXNvdXJjZXM/cmVmZXJlbmNlYWJsZT10cnVlIG9yIC9yZXNvdXJjZXM/bGlua2FibGU9dHJ1ZVxuICpcbiAqICogVGhlIGF1dGhvcml6YXRpb24gY29udGV4dCAqKm11c3QqKiBzYXRpc2Z5IG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgaGFzIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VSZXNvdXJjZVJlZmVyZW5jZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gYWRkIGEgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiLFxuICogdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZVJlZmVyZW5jZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgaXMgYSAqKm1lbWJlcioqIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byBhdHRhY2ggdGhlIHJlc291cmNlIGFzIGEgcmVmZXJlbmNlYWJsZSByZXNvdXJjZS5cbiAqIEEgcmVzb3VyY2UgaXMgcmVmZXJlbmNlYWJsZSB0byB0aGUgY2FsbGVyIGlmOlxuICogKiBJdCBoYXMgYmVlbiBtYXJrZWQgYXMgcmVmZXJlbmNlYWJsZSBhbmQgVGhlIGNhbGxlciBoYXMgcGVybWlzc2lvbiB0byBhbGwgcmVmZXJlbmNlIGVuYWJsZWQgYWN0aW9ucyBhZ2FpbnN0IHRoZSByZXNvdXJjZS5cbiAqXG4gKiBPUlxuICpcbiAqICogVGhlIHJlc291cmNlIGhhcyBiZWVuIG1hZGUgbGlua2FibGUgdG8gdGhlIHByb2plY3QvcmVhbG0gZm9yIHRoZSBwcm9qZWN0IGxpbmtpbmcgZW5hYmxlZCBhY3Rpb25cbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBBZGQgYSByZXNvdXJjZSB0byB0aGUgcmVxdWVzdGVkIFByb2plY3QgYXMgYSBSZXNvdXJjZSBIb21lIG9yIFJlc291cmNlIFJlZmVyZW5jZShMaW5rKVxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSByZWxhdGlvbiBUaGUgcmVsYXRpb24gb2YgdGhlIHJlc291cmNlLiBNdXN0IGJlIGhvbWUgb3IgcmVmZXJlbmNlKGxpbmspXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkUHJvamVjdFJlc291cmNlUmVsYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXMve3Jlc291cmNlfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWxhdGlvblwiLCBwYXJhbXNbXCJyZWxhdGlvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInR5cGVcIiwgcGFyYW1zW1widHlwZVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHByb2plY3QgZXhpc3RzIHdpdGggcmVxdWVzdGVkIHByb2plY3QgaHJuIGluIGNhbGxlciByZWFsbS5cbiAqXG4gKiBJZiBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBzYW1lIHJlYWxtIGl0IHdpbGwgcmV0dXJuIDQwNC5cbiAqXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ2hlY2tzIHRoZSBleGlzdGFuY2Ugb2YgYSBwcm9qZWN0IGluIGNhbGxlciByZWFsbS5cbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUHJvamVjdEV4aXN0YW5jZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9XCIucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiSEVBRFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBpbiB0aGUgY2FsbGVycyByZWFsbVxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqY3JlYXRlUHJvamVjdCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGNyZWF0ZSBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwiY3JlYXRlUHJvamVjdFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgUHJvamVjdFxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0c1wiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgUHJvamVjdFxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBkZWxldGUgYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlIHRoZSBzcGVjaWZpZWQgUHJvamVjdFxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH1cIi5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgbWVtYmVyIGZyb20gdGhlIHNwZWNpZmllZCBQcm9qZWN0XG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlbW92ZSBhIG1lbWJlciBmcm9tIGEgUHJvamVjdCwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBSZW1vdmUgdGhlIG1lbWJlciBmcm9tIHRoZSBzcGVjaWZpZWQgUHJvamVjdFxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVByb2plY3RNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBwcm9qZWN0LlxuICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBtYXkgb25seSBiZSBsaW5rZWQgYXMgYSByZWZlcmVuY2UsIHJlbW92aW5nIGEgaG9tZSByZXNvdXJjZSByZXF1aXJlcyBkZWxldGluZyB0aGUgcmVzb3VyY2UgZnJvbSB0aGVcbiAqIHJlc291cmNlIHNlcnZpY2UuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUmVzb3VyY2VSZWZlcmVuY2VzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVtb3ZlIGEgcmVzb3VyY2UgcmVmZXJlbmNlKGxpbmspIGZyb20gdGhlIHByb2plY3RcbiAqIFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVJlc291cmNlUmVmZXJlbmNlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVtb3ZlIGEgUmVzb3VyY2UgUmVmZXJlbmNlKExpbmspIGZyb20gYSBwcm9qZWN0XG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHJlbGF0aW9uIFRoZSByZWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UuIE11c3QgYmUgcmVmZXJlbmNlKGxpbmspXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVQcm9qZWN0UmVzb3VyY2VSZWZlcmVuY2UoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXMve3Jlc291cmNlfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWxhdGlvblwiLCBwYXJhbXNbXCJyZWxhdGlvblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgYWxsIFByb2plY3RzIGluIHRoZSBPcmdcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipsaXN0QWxsUHJvamVjdHMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZ2V0IGEgbGlzdCBvZiBwcm9qZWN0cywgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0QWxsUHJvamVjdHNcIlxuICpcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxpc3Qgb2YgYWxsIFByb2plY3RzIGluIHRoZSBPcmdcbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsUHJvamVjdExpc3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSByZXF1ZXN0ZWQgUHJvamVjdFxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZ2V0IGEgcHJvamVjdCwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHJlcXVlc3RlZCBQcm9qZWN0XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFByb2plY3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fVwiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgUHJvamVjdHMgeW91IGFyZSBhICBwcm9qZWN0IGFkbWluIG9yIGEgbWVtYmVyIGJhc2VkIG9uIHRoZSBcImNhbk1hbmFnZVwiIG9yIFwiaXNNZW1iZXJcIiBwYXJhbWV0ZXIncyB2YWx1ZS5cbiAqXG4gKiBAbm90ZSBJZiBuZWl0aGVyIFwiY2FuTWFuYWdlXCIgbm9yIFwiaXNNZW1iZXJcIiBpcyBzcGVjaWZpZWQsIFwiaXNNZW1iZXI9dHJ1ZVwiIHByb2plY3RzIGFyZSByZXR1cm5lZC5cbiAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIFwiY2FuTWFuYWdlXCIgLyBcImlzTWVtYmVyXCIgaXMgOiBbdHJ1ZV1cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIFByb2plY3RzIHRoYXQgeW91IGFyZSBhIHByb2plY3QgYWRtaW4gb3IgYSBtZW1iZXIgYmFzZWQgb24gdGhlIFwiY2FuTWFuYWdlXCIgb3IgXCJpc01lbWJlclwiIHBhcmFtZXRlcidzIHZhbHVlXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY2FuTWFuYWdlIGlmIHRydWUgcmV0dXJucyBhbGwgcHJvamVjdHMgb2Ygd2hpY2ggdGhlIGNhbGxlcih1c2VyL2FwcCkgaXMgYSBwcm9qZWN0IGFkbWluLlxuICogQHBhcmFtIGlzTWVtYmVyIGlmIHRydWUgcmV0dXJucyBhbGwgcHJvamVjdHMgb2Ygd2hpY2ggdGhlIGNhbGxlcih1c2VyL2FwcCkgaXMgYSBtZW1iZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFByb2plY3RMaXN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy9tZVwiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjYW5NYW5hZ2VcIiwgYCR7cGFyYW1zW1wiY2FuTWFuYWdlXCJdfWApO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJpc01lbWJlclwiLCBgJHtwYXJhbXNbXCJpc01lbWJlclwiXX1gKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgdGhlIHJlcXVlc3RlZCBQcm9qZWN0IE1lbWJlclxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGdldCBhIG1lbWJlciBvZiBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBNZW1iZXJcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgbWVtYmVyLiBFaXRoZXIgdXNlciwgYXBwIG9yIGdyb3VwXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQcm9qZWN0TWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSByZXNvdXJjZSB0aGF0IGlzIGxpbmtlZCB0byB0aGUgcmVxdWVzdGVkIFByb2plY3QuXG4gKlxuICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBtYXkgYmUgbGlua2VkIGFzIGVpdGhlciBhIGhvbWUgb3IgYSByZWZlcmVuY2UobGluaykuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0XG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBnZXQgcmVzb3VyY2UgXCJocm46aGVyZTpkYXRhOjpteXJlYWxtOm15LWNhdGFsb2ctMDAwMFwiIGluIHRoZSBwcm9qZWN0XG4gKiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIiwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgcmVzb3VyY2UgdGhhdCBpcyBsaW5rZWQgdG8gYSBQcm9qZWN0IGFzIGVpdGhlciBhIFJlc291cmNlIEhvbWUgb3IgUmVzb3VyY2UgUmVmZXJlbmNlKExpbmspXG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gcmVsYXRpb24gVGhlIHJlbGF0aW9uIG9mIHRoZSByZXNvdXJjZS4gQSByZXNvdXJjZSBpcyBvbmx5IHJldHVybmVkIGluIHRoZSByZXNwb25zZSBpZiBpdCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgcmVsYXRpb24uXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQcm9qZWN0UmVzb3VyY2UoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXMve3Jlc291cmNlfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWxhdGlvblwiLCBwYXJhbXNbXCJyZWxhdGlvblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBjYWxsZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIEF1dGhvcml6YXRpb24gOiBOb25lXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVtb3ZlIHRoZSBjYWxsZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGVhdmVQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy9tZVwiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIG1lbWJlcnMgb2YgdGhlIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGdldCBhIGxpc3Qgb2YgcHJvamVjdCBtZW1iZXJzLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICogKiBpZiAnb25seUluY2x1ZGVJZGVudGl0aWVzJyBxdWVyeSBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsICd0b3RhbCcgaXMgTk9UIHJldHVybmVkIGluIFJlc3BvbnNlXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIG1lbWJlcnMgb2YgdGhlIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG9ubHlJbmNsdWRlSWRlbnRpdGllcyBJZiB0cnVlLCByZXR1cm5zIGFuIGVmZmVjdGl2ZSBwcm9qZWN0IG1lbWJlcnMgbGlzdCBjb250YWluaW5nIG9ubHkgdXNlciBhbmQgYXBwIGlkZW50aXRpZXMsXG4gKiBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGUgcHJvamVjdCBpbmRpcmVjdGx5IHZpYSBhIGdyb3VwLlxuICogSXQgd2lsbCBhbHNvIHJldHVybiB1c2VycyB3aG8gYXJlIHByb2plY3QgYWRtaW5zIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCwgYW5kIFJlc291cmNlIE1hbmFnZXJzIGZvciB0aGUgcmVhbG0uXG4gKiBSZXNwb25zZSB3aWxsIE5PVCBpbmNsdWRlIHRvdGFsIG51bWJlciBvZiBpZGVudGl0aWVzLlxuICogSWYgZmFsc2UsIHJldHVybnMgdXNlcnMsIGFwcHMsIGFuZCBncm91cHMgdGhhdCBhcmUgZGlyZWN0IG1lbWJlcnMgb2YgdGhlIHByb2plY3QsIGV4Y2x1ZGluZyBhbnkgdXNlcnMgYW5kIGFwcHMgdGhhdCBvbmx5IGhhdmVcbiAqIG1lbWJlcnNoaXAgdmlhIGEgZ3JvdXAuIERlZmF1bHRzIHRvIGZhbHNlLiAgU3VwcG9zZSB0aGVyZSBhcmUgYSB1c2VyIFUgYW5kIGEgZ3JvdXAgRyB3aXRoIGFwcCBBIGluIGl0LlxuICogU3VwcG9zZSB1c2VyIFUgYW5kIGdyb3VwIEcgYXJlIHRoZSBtZW1iZXJzIG9mIHRoZSBwcm9qZWN0LCB0aGVuICogb25seUluY2x1ZGVJZGVudGl0aWVzOiB0cnVlIHdpbGwgcmV0dXJuIFUgYW5kIEFcbiAqICogb25seUluY2x1ZGVJZGVudGl0aWVzOmZhbHNlIG9yIGFic2VudCB3aWxsIHJldHVybiBVIGFuZCBHXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RQcm9qZWN0TWVtYmVycyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnNcIi5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm9ubHlJbmNsdWRlSWRlbnRpdGllc1wiLCBgJHtwYXJhbXNbXCJvbmx5SW5jbHVkZUlkZW50aXRpZXNcIl19YCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHJlc291cmNlcyBpbiB0aGUgcmVxdWVzdGVkIFByb2plY3QgJiByZWZlcmVuY2VkIGluKGxpbmtlZCB0bykgdGhlIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGdldCB0aGUgbGlzdCBvZiByZXNvdXJjZXMgaW4gdGhlIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIHJlc291cmNlcyBpbiB0aGUgcmVxdWVzdGVkIFByb2plY3QgJiByZWZlcmVuY2VkIGluKGxpbmtlZCB0bykgdGhlIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHJlbGF0aW9uIFRoZSByZWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UuIEEgcmVzb3VyY2UgaXMgb25seSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgaWYgaXQgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIHJlbGF0aW9uLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0UHJvamVjdFJlc291cmNlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3Jlc291cmNlc1wiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidHlwZVwiLCBwYXJhbXNbXCJ0eXBlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVsYXRpb25cIiwgcGFyYW1zW1wicmVsYXRpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFVwZGF0ZSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKip3cml0ZSoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqICpcbiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byB1cGRhdGUgYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIndyaXRlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNwZWNpZmllZCBQcm9qZWN0XG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBwYXRjaFByb2plY3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fVwiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXNvdXJjZSBJbmZvIEFuZCBNYW5hZ2VtZW50IEFwaVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEdldCBhIGxpc3Qgb2Ygd2F5cyB0aGlzIHJlc291cmNlIGhhcyBiZWVuIG1hZGUgbGlua2FibGVcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIGFsbCB0aGUgXCJyZXF1aXJlZFRvTWFrZUxpbmthYmxlXCIgYWN0aW9ucyBhZ2FpbnN0XG4gKiB0aGUgc2VydmljZSBpbmZlcnJlZCB2aWEgdGhlIHJlc2VydmVkIHJlc291cmNlIHByZWZpeCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHBhdGggaW4gdGhlIHNjb3BlIG9mIHRoZSAgIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbWFrZSBhIGNhdGFsb2cgbGlua2FibGUsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgYSBsaXN0IG9mIHdheXMgdGhlIHJlc291cmNlIGhhcyBiZWVuIG1hZGUgbGlua2FibGVcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRMaXN0T2ZXYXlzUmVzb3VyY2VJc0xpbmthYmxlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfS9saW5rYWJsZVwiLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldCB0aGUgUmVzb3VyY2UgdGhhdCB0aGUgY2FsbGVyIGlzIGFsbG93ZWQgdG8gc2VlIGJhc2VkIG9uIHRoZSBpbnB1dCBxdWVyeSBwYXJhbWV0ZXJzXG4gKlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgYSBzaW5nbGUgcmVzb3VyY2VcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gcmVmZXJlbmNlYWJsZSBHZXQgdGhlIHJlc291cmNlIG9ubHkgaWYgaXQgaXMgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIgdG8gYXR0YWNoIGFzIGEgcmVmZXJlbmNlIHRvIHByb2plY3RzLlxuICogQSByZXNvdXJjZSBpcyByZWZlcmVuY2VhYmxlIGlmIGl0IGlzIG1hcmtlZCBhcyByZWZlcmVuY2VhYmxlIGFuZCB0aGUgY2FsbGVyIGhhcyBwZXJtaXNzaW9uIHRvIGFsbCByZWZlcmVuY2UgZW5hYmxlZCBhY3Rpb25zXG4gKiBhZ2FpbnN0IHRoZSByZXNvdXJjZS4gIE90aGVyd2lzZSA0MDQuICBPbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyB0cnVlLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc291cmNlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfVwiLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZlcmVuY2VhYmxlXCIsIGAke3BhcmFtc1tcInJlZmVyZW5jZWFibGVcIl19YCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBhdmFpbGFiaWxpdHkgZm9yIGxpbmtpbmcgdGhpcyByZXNvdXJjZSB0byBlaXRoZXIgYSBwcm9qZWN0IG9yIHJlYWxtLlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgYWxsIHRoZSBcInJlcXVpcmVkVG9NYWtlTGlua2FibGVcIiBhY3Rpb25zIGFnYWluc3RcbiAqIHRoZSBzZXJ2aWNlIGluZmVycmVkIHZpYSB0aGUgcmVzZXJ2ZWQgcmVzb3VyY2UgcHJlZml4IG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgcGF0aCBpbiB0aGUgc2NvcGUgb2YgdGhlICAgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGdldCB0aGUgY2F0YWxvZyBsaW5rYWJpbGl0eSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6b2xwLWhlcmU6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBzY29wZWQgdG8gdGhlIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaW5rYWJpbGl0eSBvZiBhIHJlc291cmNlXG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIGF2YWlsYWJsZVRvSHJuIFRoZSBocm4gb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbWFkZSBsaW5rYWJsZSBhZ2FpbnN0IG9yXG4gKiBUaGUgaHJuIG9mIHRoZSByZWFsbSB0aGF0IHRoZSByZXNvdXJjZSBpcyBtYWRlIGxpbmthYmxlIGFnYWluc3QuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzb3VyY2VMaW5rYWJpbGl0eShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tyZXNvdXJjZX0vbGlua2FibGUve2F2YWlsYWJsZVRvSHJufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VcIl0pKVxuICAgICAgICAucmVwbGFjZShcInthdmFpbGFibGVUb0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImF2YWlsYWJsZVRvSHJuXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIFByb2plY3RzIHRoYXQgdGhlIHJlc291cmNlIGJlbG9uZ3MgdG8gb3IgaXMgcmVmZXJlbmNlZCBpbihsaW5rZWQgdG8pLlxuICogVGhlIHJldHVybmVkIGxpc3Qgd2lsbCBvbmx5IGluY2x1ZGUgcHJvamVjdHMgdGhhdCBhcmUgaW4gdGhlIGNhbGxlcidzIHJlYWxtLlxuICpcbiAqIEBub3RlXG4gKiBJZiB0aGUgcHJlc2VudGVkIGFjY2VzcyB0b2tlbiBoYXMgYSBwcm9qZWN0IHNjb3BlLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlOlxuICogLSBUaGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZVxuICogLSBUaGUgbGlzdCBvZiBQcm9qZWN0cyB0aGF0IHRoZSByZXNvdXJjZSBoYXMgYmVlbiBtYWRlIGxpbmthYmxlIHRvXG4gKiAtIFRoZSBpbmNsdWRlIHRoZSBsaXN0IG9mIFByb2plY3RzIHRoYXQgdGhlIHJlc291cmNlIGhhcyBiZWVuIGxpbmtlZCB0b1xuICpcbiAqIElmIHRoZSBwcmVzZW50ZWQgYWNjZXNzIHRva2VuIGhhcyBubyBzY29wZSwgdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZTpcbiAqIC0gVGhlIGxpc3Qgb2YgUHJvamVjdHMgZmlsdGVyZWQgb3V0IGJhc2VkIG9uIHRoZSBtZW1iZXJzaGlwIG9mIHRoZSBjYWxsZXIuXG4gKlxuICogQWNjZXNzIENvbnRyb2wgZm9yIHByb2plY3Qgc2NvcGVkIGNhbGw6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSBhbGwgdGhlIFwicmVxdWlyZWRUb01ha2VMaW5rYWJsZVwiIGFjdGlvbnMgYWdhaW5zdFxuICogdGhlIHNlcnZpY2UgaW5mZXJyZWQgdmlhIHRoZSByZXNlcnZlZCByZXNvdXJjZSBwcmVmaXggb2YgdGhlIHJlc291cmNlIGluIHRoZSBwYXRoIGluIHRoZSBzY29wZSBvZiB0aGUgICBob21lIHByb2plY3Qgb2YgdGhlIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gbWFrZSBhIGNhdGFsb2cgbGlua2FibGUsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHJlcXVlc3RlZCBQcm9qZWN0cyB0aGF0IHRoZSByZXNvdXJjZSBiZWxvbmdzIHRvIG9yIGlzIHJlZmVyZW5jZWQgaW4obGlua2VkIHRvKVxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICogQHBhcmFtIHJlbGF0aW9uIFRoZSByZWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UuIEEgcmVzb3VyY2UgaXMgb25seSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgaWYgaXQgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIHJlbGF0aW9uLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFJlc291cmNlUHJvamVjdHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Jlc291cmNlcy97cmVzb3VyY2V9L3Byb2plY3RzXCIucmVwbGFjZShcIntyZXNvdXJjZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlbGF0aW9uXCIsIHBhcmFtc1tcInJlbGF0aW9uXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIFJlc291cmNlcyB0aGF0IHRoZSBjYWxsZXIgaXMgYWxsb3dlZCB0byBzZWUgYmFzZWQgb24gdGhlIGlucHV0IHF1ZXJ5IHBhcmFtZXRlcnMuXG4gKlxuICogQG5vdGVcbiAqIElmIHRoZSBwcmVzZW50ZWQgYWNjZXNzIHRva2VuIGhhcyBhIHByb2plY3Qgc2NvcGU6XG4gKiAtIFRoZSByZXNwb25zZSB3aWxsIG9ubHkgaW5jbHVkZSByZXNvdXJjZXMgZnJvbSB0aGF0IHByb2plY3Qgb3IsXG4gKiAtIElmIHJlZmVyZW5jZWFibGU9dHJ1ZSBvciBsaW5rYWJsZT10cnVlLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlIHRoZSByZXNvdXJjZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIgdG9cbiAqIGxpbmsgdG8gdGhlIHByb2plY3QgaW4gdGhlIHRva2VuJ3MgcHJvamVjdCBzY29wZS5cbiAqXG4gKiAtIElmIHRoZSBwcmVzZW50ZWQgYWNjZXNzIHRva2VuIGhhcyBubyBzY29wZTpcbiAqIC0gVGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSByZXNvdXJjZXMgZnJvbSBhbGwgcHJvamVjdHMgdGhhdCB0aGUgY2FsbGVyIGhhcyBhY2Nlc3MgdG8uXG4gKiAtIEZvciB0eXBlPSdjYXRhbG9nJyB0aGUgcmVzcG9uc2Ugd2lsbCBhbHNvIGluY2x1ZGUgcmVzb3VyY2VzIHRoYXQgZXhpc3Qgb3V0c2lkZSBvZiBhbnkgcHJvamVjdC5cbiAqIC0gRm9yIGFsbCBvdGhlciB0eXBlcywgdGhlIHJlc3BvbnNlIHdpbGwgTk9UIGluY2x1ZGUgcmVzb3VyY2VzIHRoYXQgZXhpc3Qgb3V0c2lkZSBvZiBhbnkgcHJvamVjdC5cbiAqIC0gRm9yIHJlZmVyZW5jZWFibGU9dHJ1ZSBvciBsaW5rYWJsZT10cnVlLCB0aGUgcmVzcG9uc2Ugd2lsbCBPTkxZIGluY2x1ZGUgdGhlIEhFUkUgcHVibGljIHJlc291cmNlcyB0aGF0IGFyZSBhdmFpbGFibGVcbiAqIHRvIHRoZSBjYWxsZXIgdG8gbGluayB0byBBTlkgcHJvamVjdCAqIFRoaXMgQVBJIHdvcmtzIHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCBhbmQgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgbGlzdCBvZiByZXNvdXJjZXNcbiAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGFjY2VzcyBGaWx0ZXIgdGhlIHJlc291cmNlcyBhY2Nlc3NpYmxlIHRvIHRoZSBjYWxsZXIgYmFzZWQgb24gdGhlIGFjY2VzcyB0eXBlcy5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFwiZGVmYXVsdFwiLlxuICogTm90IGFwcGxpY2FibGUgdG8gdXNlIGFsb25nIHdpdGggdGhlIHF1ZXJ5IHBhcmFtZXRlciBcInJlZmVyZW5jZWFibGVcIjogXCJ0cnVlXCIgb3IgXCJsaW5rYWJsZVwiOiBcInRydWVcIlxuICogSWYgXCJkZWZhdWx0XCIgaW5jbHVkZXMgcmVzb3VyY2VzIHdoZXJlOlxuICogLSBUaGUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSByZXNvdXJjZVwicyBob21lIHByb2plY3QgT1JcbiAqIC0gVGhlIHVzZXIgaGFzIGFjY2VzcyB0byBhIHByb2plY3QgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbGlua2VkIHRvIGFzIGEgcmVmZXJlbmNlIE9SXG4gKiAtIFRoZSB0eXBlXCI6IFwiXCJjYXRhbG9nXCIgYW5kIHRoZSByZXNvdXJjZSBpcyBub3QgaW4gYW55IHByb2plY3QgYW5kIHRoZSB1c2VyIGhhcyBcInJlYWRcIiBhY2Nlc3MgdG8gaXQgT1JcbiAqIC0gVGhlIHR5cGVcIjogXCJcImNhdGFsb2dcIiBhbmQgdGhlIHJlc291cmNlIGlzIG5vdCBpbiBhbnkgcHJvamVjdCBhbmQgdGhlIHVzZXIgaGFzIFwid3JpdGVcIiBhY2Nlc3MgdG8gaXQgT1JcbiAqIC0gVGhlIHR5cGVcIjogXCJcImNhdGFsb2dcIiBhbmQgdGhlIHJlc291cmNlIGlzIG5vdCBpbiBhbnkgcHJvamVjdCBhbmQgdGhlIHVzZXIgaGFzIFwibWFuYWdlXCIgYWNjZXNzIHRvIGl0LlxuICpcbiAqIElmIFwibWFuYWdlXCIgaW5jbHVkZXMgcmVzb3VyY2VzIHdoZXJlOlxuICogLSBUaGUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSByZXNvdXJjZVwicyBob21lIHByb2plY3QgT1JcbiAqIC0gVGhlIHR5cGVcIjogXCJcImNhdGFsb2dcIiBhbmQgdGhlIHJlc291cmNlIGlzIG5vdCBpbiBhbnkgcHJvamVjdCBhbmQgdGhlIHVzZXIgaGFzIFwibWFuYWdlXCIgYWNjZXNzIHRvIGl0LlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VhYmxlIEdldCBhbGwgcmVmZXJlbmNlYWJsZShsaW5rYWJsZSkgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIGF0dGFjaCBhcyBhIHJlZmVyZW5jZShsaW5rKSB0byBwcm9qZWN0cy5cbiAqIE9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIHRydWUuIE5vdGUgLSBDYW4gYmUgdXNlZCBhcyBhIHN5bm9ueW0gZm9yIGxpbmthYmxlICBBIHJlc291cmNlIGlzIHJlZmVyZW5jZWFibGUobGlua2FibGUpIGlmIGl0IGlzIG1hcmtlZFxuICogYXMgcmVmZXJlbmNlYWJsZTpcbiAqIC0gYW5kIHRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb24gdG8gYWxsIHJlZmVyZW5jZSBlbmFibGVkIGFjdGlvbnMgYWdhaW5zdCB0aGUgcmVzb3VyY2Ugb3IsXG4gKiAtIGluIGNhc2Ugb2YgYSBwcm9qZWN0IHNjb3BlZCB0b2tlbiwgdGhlIGNhbGxlciBoYXMgZWZmZWN0aXZlIG1lbWJlcnNoaXAgb24gdGhlIHByb2plY3RzIHRvIGF0dGFjaCByZXNvdXJjZXNcbiAqIGFzIGEgcmVmZXJlbmNlKGxpbmspIHRvIHRoZSBQcm9qZWN0LlxuICpcbiAqIEBwYXJhbSBsaW5rYWJsZSBHZXQgYWxsIGxpbmthYmxlIHJlc291cmNlcyBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byBhdHRhY2ggYXMgYSBsaW5rIHRvIHByb2plY3QuXG4gKiBPbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyB0cnVlLiBOb3RlIC0gQ2FuIGJlIHVzZWQgYXMgYSBzeW5vbnltIGZvciByZWZlcmVuY2VhYmxlXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzb3VyY2VzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXNcIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidHlwZVwiLCBwYXJhbXNbXCJ0eXBlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWNjZXNzXCIsIHBhcmFtc1tcImFjY2Vzc1wiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlZmVyZW5jZWFibGVcIiwgYCR7cGFyYW1zW1wicmVmZXJlbmNlYWJsZVwiXX1gKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGlua2FibGVcIiwgYCR7cGFyYW1zW1wibGlua2FibGVcIl19YCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IExpc3Qgb2YgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIHJlYWxtIG9mIHRoZSBjYWxsZXJcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipsaXN0UmVhbG1SZXNvdXJjZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZ2V0IGEgbGlzdCBvZiBwcm9qZWN0cywgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0UmVhbG1SZXNvdXJjZXNcIlxuICpcbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgTGlzdCBvZiBhbGwgdGhlIHJlc291cmNlcyBpbiB0aGUgcmVhbG0gb2YgdGhlIGNhbGxlclxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdFJlYWxtUmVzb3VyY2VzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZWFsbS9yZXNvdXJjZXNcIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidHlwZVwiLCBwYXJhbXNbXCJ0eXBlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBBZGRzIGEgbGlzdGluZyB0byBtYWtlIHRoaXMgcmVzb3VyY2UgbGlua2FibGUgdG8gZWl0aGVyIGEgcHJvamVjdCBvciBlbnRpcmUgcmVhbG0uXG4gKlxuICogVGhlIHJlc291cmNlIG11c3QgYmVsb25nIHRvIGEgcHJvamVjdCB0byBiZSBtYWRlIGxpbmthYmxlLiBFaXRoZXIgcHJvamVjdEhybiBvciByZWFsbUhybiBtdXN0IGJlIHByb3ZpZGVkIHRvIG1ha2UgdGhlIHJlc291cmNlXG4gKiBsaW5rYWJsZSB0by5cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIGFsbCB0aGUgXCJyZXF1aXJlZFRvTWFrZUxpbmthYmxlXCIgYWN0aW9ucyBhZ2FpbnN0XG4gKiB0aGUgc2VydmljZSBpbmZlcnJlZCB2aWEgdGhlIHJlc2VydmVkIHJlc291cmNlIHByZWZpeCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHBhdGggaW4gdGhlIHNjb3BlIG9mIHRoZSAgIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbWFrZSBhIGNhdGFsb2cgbGlua2FibGUsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBNYWtlIGEgcmVzb3VyY2UgTGlua2FibGVcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1ha2VSZXNvdXJjZUxpbmthYmxlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfS9saW5rYWJsZVwiLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBsaW5rYWJpbGl0eSBvZiB0aGlzIHJlc291cmNlIGFnYWluc3QgdGhlIHJlcXVlc3RlZCBwcm9qZWN0IG9yIHJlYWxtLlxuICpcbiAqIEBub3RlIFRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGltcGFjdCBvbiBwcmUtZXhpc3RpbmcgbGlua3MuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSBhbGwgdGhlIFwicmVxdWlyZWRUb01ha2VMaW5rYWJsZVwiIGFjdGlvbnMgYWdhaW5zdFxuICogdGhlIHNlcnZpY2UgaW5mZXJyZWQgdmlhIHRoZSByZXNlcnZlZCByZXNvdXJjZSBwcmVmaXggb2YgdGhlIHJlc291cmNlIGluIHRoZSBwYXRoIGluIHRoZSBzY29wZSBvZiB0aGUgICBob21lIHByb2plY3Qgb2YgdGhlIHJlc291cmNlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byByZW1vdmUgdGhlIGNhdGFsb2cgbGlua2FiaWxpdHksIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBSZW1vdmUgdGhlIGxpbmthYmlsaXR5IG9mIGEgcmVzb3VyY2VcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gYXZhaWxhYmxlVG9Icm4gVGhlIGhybiBvZiB0aGUgcHJvamVjdCB0aGF0IHRoZSByZXNvdXJjZSBpcyBtYWRlIGxpbmthYmxlIGFnYWluc3Qgb3IgVGhlIGhybiBvZiB0aGUgcmVhbG0gdGhhdCB0aGUgcmVzb3VyY2VcbiAqIGlzIG1hZGUgbGlua2FibGUgYWdhaW5zdC5cbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVSZXNvdXJjZUxpbmthYmlsaXR5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfS9saW5rYWJsZS97YXZhaWxhYmxlVG9Icm59XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2F2YWlsYWJsZVRvSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXZhaWxhYmxlVG9Icm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogVXBkYXRlIHRoZSBsaW5rYWJpbGl0eSBvZiB0aGlzIHJlc291cmNlIGFnYWluc3QgdGhlIHJlcXVlc3RlZCBwcm9qZWN0IG9yIHJlYWxtLlxuICpcbiAqIEFjY2VzcyBDb250cm9sOiAgKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgYWxsIHRoZSBcInJlcXVpcmVkVG9NYWtlTGlua2FibGVcIiBhY3Rpb25zIGFnYWluc3RcbiAqIHRoZSBzZXJ2aWNlIGluZmVycmVkIHZpYSB0aGUgcmVzZXJ2ZWQgcmVzb3VyY2UgcHJlZml4IG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgcGF0aCBpbiB0aGUgc2NvcGUgb2YgdGhlICAgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byB1cGRhdGUgdGhlIGNhdGFsb2cgbGlua2FiaWxpdHksIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGxpbmthYmlsaXR5IG9mIGEgcmVzb3VyY2VcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIGF2YWlsYWJsZVRvSHJuIFRoZSBocm4gb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbWFkZSBsaW5rYWJsZSBhZ2FpbnN0IG9yIFRoZSBocm4gb2YgdGhlIHJlYWxtIHRoYXQgdGhlIHJlc291cmNlXG4gKiBpcyBtYWRlIGxpbmthYmxlIGFnYWluc3QuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUmVzb3VyY2VMaW5rYWJpbGl0eShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tyZXNvdXJjZX0vbGlua2FibGUve2F2YWlsYWJsZVRvSHJufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VcIl0pKVxuICAgICAgICAucmVwbGFjZShcInthdmFpbGFibGVUb0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImF2YWlsYWJsZVRvSHJuXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEF0dGFjaGVzIHRoZSBQcm9qZWN0IFBvbGljeSB0byB0aGUgbWVtYmVyIG9mIHRoZSBQcm9qZWN0LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZU1lbWJlcnMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gYXR0YWNoIGEgY3VzdG9tIHBvbGljeSBpbiBhIFByb2plY3QgdG8gYSBtZW1iZXIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnMgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogQU5EXG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEF0dGFjaCBQcm9qZWN0IFBvbGljeSB0byBNZW1iZXJcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgbWVtYmVyLiBFaXRoZXIgdXNlciwgYXBwIG9yIGdyb3VwXG4gKiBAcGFyYW0gcG9saWN5IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBwb2xpY3kuIEZvciBIRVJFIHByb3ZpZGVkIHBvbGljaWVzLFxuICogdGhlIEhSTiBmb3JtYXQgd291bGQgYmUgLSBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmRlZmF1bHQ6cG9saWN5L3JlYWQtb25seS1hY2Nlc3MtdG8tYWxsLWNhdGFsb2dzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGF0dGFjaFByb2plY3RQb2xpY3lUb01lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnMve21lbWJlcn0vcG9saWNpZXMve3BvbGljeX1cIlxuICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie3BvbGljeX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInBvbGljeVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgY3VzdG9tIHBvbGljeSBpbiB0aGUgUHJvamVjdFxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZVBvbGljaWVzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGNyZWF0ZSBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IENyZWF0ZSB0aGUgcmVxdWVzdGVkIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVByb2plY3RQb2xpY3koYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llc1wiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlbGV0ZSB0aGUgY3VzdG9tIHBvbGljeSBpbiB0aGUgUHJvamVjdFxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZVBvbGljaWVzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHVwZGF0ZSBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZSB0aGUgY3VzdG9tIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlUHJvamVjdFBvbGljeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntwb2xpY3l9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwb2xpY3lcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogRGV0YWNoZWQgdGhlIHJlcXVlc3RlZCBjdXN0b20gUHJvamVjdCBQb2xpY3kgZnJvbSBhIE1lbWJiZXJcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGRldGFjaCBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0IGZyb20gYSBtZW1iZXIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnMgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogQU5EXG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IERldGFjaCB0aGUgUHJvamVjdCBQb2xpY3kgZnJvbSBhIE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGV0YWNoUHJvamVjdFBvbGljeUZyb21NZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntwb2xpY3l9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwb2xpY3lcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIGFsbCBQcm9qZWN0IE1lbWJlcnMgd2l0aCB0aGUgYXR0YWNoZWQgUG9saWN5XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byByZWFkIHRoZSBsaXN0IG9mIGFsbCBtZW1iZXJzIGF0dGFjaGVkIHRvIGEgcHJvamVjdCBwb2xpY3ksIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIEluIHRoZSBQcm9qZWN0IHdvcmtmbG93LCB0aGUgYWJvdmUgcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFsbCBQcm9qZWN0IE1lbWJlcnMsIFByb2plY3QgQWRtaW5zLCBPcmcgQWRtaW5zXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIGFsbCBQcm9qZWN0IE1lbWJlcnMgd2l0aCB0aGUgYXR0YWNoZWQgUG9saWN5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCxcbiAqIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbFByb2plY3RNZW1iZXJzV2l0aEF0dGFjaGVkUG9saWN5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vcG9saWNpZXMve3BvbGljeX0vbWVtYmVyc1wiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIEF0dGFjaGVkIFByb2plY3QgUG9saWNpZXMgRm9yIGEgTWVtYmVyXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byByZWFkIHRoZSBsaXN0IG9mIHRoZSBhdHRhY2hlZCBwcm9qZWN0IHBvbGljaWVzLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBNZW1iZXJzLCBQcm9qZWN0IEFkbWlucywgT3JnIEFkbWluc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbGlzdCBvZiBBdHRhY2hlZCBQcm9qZWN0IFBvbGljaWVzIEZvciBhIE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBdHRhY2hlZFByb2plY3RQb2xpY2llc0Zvck1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnMve21lbWJlcn0vcG9saWNpZXNcIlxuICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldCB0aGUgYXR0YWNoZWQgUHJvamVjdCBQb2xpY3kgRm9yIGEgTWVtYmVyXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byByZWFkIHRoZSBhdHRhY2hlZCBwcm9qZWN0IHBvbGljeSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgTWVtYmVycywgUHJvamVjdCBBZG1pbnMsIE9yZyBBZG1pbnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGF0dGFjaGVkIFByb2plY3QgUG9saWN5IGZvciBhIE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWN5Rm9yTWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfS9wb2xpY2llcy97cG9saWN5fVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBQb2xpY3lcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlYWQgYSBwcm9qZWN0IHBvbGljeSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICAqIEluIHRoZSBQcm9qZWN0IHdvcmtmbG93LCB0aGUgYWJvdmUgcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFsbCBQcm9qZWN0IE1lbWJlcnMsIFByb2plY3QgQWRtaW5zLCBPcmcgQWRtaW5zXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBQcm9qZWN0IFBvbGljeVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gcG9saWN5IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBwb2xpY3kuIEZvciBIRVJFIHByb3ZpZGVkIHBvbGljaWVzLFxuICogdGhlIEhSTiBmb3JtYXQgd291bGQgYmUgLSBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmRlZmF1bHQ6cG9saWN5L3JlYWQtb25seS1hY2Nlc3MtdG8tYWxsLWNhdGFsb2dzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFByb2plY3RQb2xpY3koYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llcy97cG9saWN5fVwiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTGlzdCB0aGUgUG9saWNpZXMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gbWVtYmVycyBvZiB0aGUgUHJvamVjdC5cbiAqIFRoaXMgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIHRoZSBIRVJFIHByb3ZpZGVkIHBvbGljaWVzIGFuZCBhbnkgY3VzdG9tIHVzZXIgZGVmaW5lZCBwb2xpY2llcyBjcmVhdGVkIGluIHRoZSBQcm9qZWN0LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVhZCBhIHBvbGljeSBsaXN0IG9mIGEgUHJvamVjdCwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgTWVtYmVycywgUHJvamVjdCBBZG1pbnMsIE9yZyBBZG1pbnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBMaXN0IHRoZSBQb2xpY2llcyBpbiBhIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LFxuICogaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKiBAcGFyYW0gcHJvamVjdFBvbGljeVR5cGUgVGhlIHR5cGUgb2YgdGhlIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdFBvbGljeUxpc3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llc1wiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicHJvamVjdFBvbGljeVR5cGVcIiwgcGFyYW1zW1wicHJvamVjdFBvbGljeVR5cGVcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFNldHMgdGhlIEF0dGFjaGVkIFBvbGljaWVzIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgUHJvamVjdCBNZW1iZXIsIG92ZXJ3cml0aW5nIGFueSBwcmUtZXhpc3RpbmcgQXR0YWNoZWQgUG9saWNpZXMuXG4gKiBUaGUgcmVxdWVzdCBib2R5IHdpbGwgcmVwbGFjZSBhbnkgcHJlLWV4aXN0aW5nIFBvbGljeSBhdHRhY2htZW50KHMpLCBhbmQgcmVwbGFjZSB0aGF0IGxpc3Qgd2l0aCB0aG9zZSBQb2xpY2llc1xuICogaWRlbnRpZmllZCBpbiB0aGUgcmVxdWVzdCBib2R5LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZU1lbWJlcnMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gYXR0YWNoIGEgY3VzdG9tIHBvbGljeSBpbiBhIFByb2plY3QgdG8gYSBtZW1iZXIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnMgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIiAgICAgIEFORCAgICAgICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUG9saWNpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBBZG1pbnMgYW5kIFJlc291cmNlIE1hbmFnZXJzXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgU2V0IEF0dGFjaGVkIFBvbGljaWVzIGZvciBNZW1iZXJcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IG1lbWJlci4gRWl0aGVyIHVzZXIsIGFwcCBvciBncm91cFxuICovXG5hc3luYyBmdW5jdGlvbiBzZXRBdHRhY2hlZFByb2plY3RQb2xpY2llc1RvTWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfS9wb2xpY2llc1wiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBVcGRhdGUgdGhlIHJlcXVlc3RlZCBjdXN0b20gcG9saWN5IGluIHRoZSBQcm9qZWN0XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUG9saWNpZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gdXBkYXRlIGEgY3VzdG9tIHBvbGljeSBpbiBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUG9saWNpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBBZG1pbnMgYW5kIFJlc291cmNlIE1hbmFnZXJzXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgVXBkYXRlIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBQb2xpY3lcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJvamVjdFBvbGljeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntwb2xpY3l9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwb2xpY3lcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0cyB0aGUgYWN0aW9ucyBsaXN0IGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLlxuICpcbiAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhY3Rpb25zIGFyZSBmaWx0ZXJlZCBiYXNlZCBvbiB0aGUgcmVsYXRpb24gb2YgdGhlIHJlc291cmNlLCBlaXRoZXIgaG9tZSBvciByZWZlcmVuY2Ugd2l0aCB0aGUgYWxsb3dlZCBhY3Rpb25zLlxuICogVGhpcyBBUEkgcHJvdmlkZXMgYSBsaXN0IG9mIGF2YWlsYWJsZSBhY3Rpb25zIGR1cmluZyBwcm9qZWN0IHdvcmtmbG93cyBsaWtlIGxpbmtpbmcgb3IgcHJvamVjdCBwb2xpY3kgY3JlYXRpb24uXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0XG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZ2V0IHJlc291cmNlIFwiaHJuOmhlcmU6ZGF0YTo6bXlyZWFsbTpteS1jYXRhbG9nLTAwMDBcIiBpbiB0aGUgcHJvamVjdFxuICogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgbGlzdCBvZiBhY3Rpb25zIHRoYXQgYXJlIGFsbG93ZWQgZm9yIHRoZSBwcm9qZWN0IHJlc291cmNlXG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBhY3Rpb24gZm9yIHRoZSByZXNvdXJjZSB0eXBlLlxuICogLSBsaW5rYWJsZSA6IEFjdGlvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBsaW5rZWRcbiAqIC0gcHJvamVjdEVuYWJsZWQgOiBBY3Rpb25zIHRoYXQgYXJlIGVuYWJsZWQgZm9yIFByb2plY3RzIGFjY2Vzc1xuICogLSByZXF1aXJlZFRvTWFrZUxpbmthYmxlIDogQWN0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB3aGVuIGFuIGlkZW50aXR5IGlzIG1ha2luZyBhIHJlc291cmNlIGxpbmthYmxlIHRvIGEgcmVhbG0gb3Igb3RoZXIgcHJvamVjdHNcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZXNvdXJjZUFjdGlvbnNGb3JQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vcmVzb3VyY2VzL3tyZXNvdXJjZX0vYWN0aW9uc1wiXG4gICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ0eXBlXCIsIHBhcmFtc1tcInR5cGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldHMgdGhlIGFjdGlvbnMgbGlzdCBmb3IgdGhlIHJlc291cmNlIHR5cGUgYmFzZWQgb24gdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgbGlzdCBvZiBhY3Rpb25zIGZvciB0aGUgcmVzb3VyY2UgdHlwZVxuICogQHBhcmFtIHJlc291cmNlVHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBhY3Rpb24gZm9yIHRoZSByZXNvdXJjZSB0eXBlLlxuICogLSBsaW5rYWJsZSA6IEFjdGlvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBsaW5rZWRcbiAqIC0gcHJvamVjdEVuYWJsZWQgOiBBY3Rpb25zIHRoYXQgYXJlIGVuYWJsZWQgZm9yIFByb2plY3RzIGFjY2Vzc1xuICogLSByZXF1aXJlZFRvTWFrZUxpbmthYmxlIDogQWN0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB3aGVuIGFuIGlkZW50aXR5IGlzIG1ha2luZyBhIHJlc291cmNlIGxpbmthYmxlIHRvIGEgcmVhbG0gb3Igb3RoZXIgcHJvamVjdHNcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZXNvdXJjZVR5cGVBY3Rpb25MaXN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZVR5cGVzL3tyZXNvdXJjZVR5cGV9L2FjdGlvbnNcIi5yZXBsYWNlKFwie3Jlc291cmNlVHlwZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlVHlwZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ0eXBlXCIsIHBhcmFtc1tcInR5cGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2FuY2VsTXVsdGlwYXJ0VXBsb2FkID0gY2FuY2VsTXVsdGlwYXJ0VXBsb2FkO1xuZXhwb3J0cy5jaGVja0Jsb2JFeGlzdHNTdGF0dXMgPSBjaGVja0Jsb2JFeGlzdHNTdGF0dXM7XG5leHBvcnRzLmRlbGV0ZUJsb2IgPSBkZWxldGVCbG9iO1xuZXhwb3J0cy5nZXRCbG9iID0gZ2V0QmxvYjtcbmV4cG9ydHMuZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzID0gZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzO1xuZXhwb3J0cy5wdXREYXRhID0gcHV0RGF0YTtcbmV4cG9ydHMuc3RhcnRNdWx0aXBhcnRVcGxvYWQgPSBzdGFydE11bHRpcGFydFVwbG9hZDtcbmV4cG9ydHMuZG9Db21wbGV0ZU11bHRpcGFydFVwbG9hZCA9IGRvQ29tcGxldGVNdWx0aXBhcnRVcGxvYWQ7XG5leHBvcnRzLmRvVXBsb2FkUGFydCA9IGRvVXBsb2FkUGFydDtcbi8qKlxuICogQmxvYiBBUEkgdjFcbiAqIFRoZSBgYmxvYmAgc2VydmljZSBzdXBwb3J0cyB0aGUgdXBsb2FkIGFuZCByZXRyaWV2YWwgb2YgbGFyZ2Ugdm9sdW1lcyBvZiBkYXRhIGZyb20gdGhlIHN0b3JhZ2Ugb2YgYSBjYXRhbG9nLlxuICogRWFjaCBkaXNjcmV0ZSBjaHVuayBvZiBkYXRhIGlzIHN0b3JlZCBhcyBhIGJsb2IgKEJpbmFyeSBMYXJnZSBPYmplY3QpLiBFYWNoIGJsb2IgaGFzIGl0cyBvd24gdW5pcXVlIElEIChkYXRhIGhhbmRsZSkuXG4gKiBUaGUgZGF0YSBoYW5kbGVzIGNhbiBiZSBzdG9yZWQgaW4gIHNlcnZpY2VzIGxpa2UgYG1ldGFkYXRhYCwgYGluZGV4YCBvciBgc3RyZWFtYC5cbiAqIFRvIGdldCBkYXRhLCB5b3UgZmlyc3QgdXNlIHRoZSBhbnkgb2YgdGhvc2Ugc2VydmljZXMgdG8gcmV0cmlldmUgdGhlIGRhdGEgaGFuZGxlIG9mIHRoZSByZWxldmFudCBibG9icy5cbiAqIFlvdSB0aGVuIHVzZSB0aGUgZGF0YSBoYW5kbGUgdG8gcHVsbCB0aGUgZGF0YSB1c2luZyB0aGUgYGJsb2JgIHNlcnZpY2UuXG4gKiBJZiB5b3UgYXJlIHdyaXRpbmcgdG8gYSB2b2xhdGlsZSBsYXllciwgc2VlIHZvbGF0aWxlLWJsb2IgQVBJIGRlZmluaXRpb24uXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC40XG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCbG9iQXBpXG4gKi9cbi8qKlxuICogQ2FuY2VscyBhbiBlbnRpcmUgbXVsdGlwYXJ0IHVwbG9hZCBvcGVyYXRpb24uIFlvdSBjYW4gb25seSBjYW5jZWwgYSBtdWx0aXBhcnQgdXBsb2FkIGJlZm9yZSBpdCBoYXMgYmVlbiBjb21wbGV0ZWQuXG4gKiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGFjdHVhbCBVUkwgZm9yIHRoaXMgb3BlcmF0aW9uIG11c3QgYmUgb2J0YWluZWQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keSBvZiBzdGFydCBtdWx0aXBhcnRcbiAqIG9wZXJhdGlvbiB0aGF0IGlzICdQT1NUIC9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHMnIGZyb20gdGhlICdkZWxldGUnIGVsZW1lbnQgdW5kZXJcbiAqIHRoZSB0b3AgbGV2ZWwgJ2xpbmtzJyBlbGVtZW50IG9mIHRoZSByZXNwb25zZS5cbiAqXG4gKiBAc3VtbWFyeSBDYW5jZWxzIGEgbXVsdGlwYXJ0IHVwbG9hZFxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBkYXRhIGJsb2IgcGFydCBiZWxvbmdzIHRvLiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyXG4gKiBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgbGF5ZXIgYWxyZWFkeSBjb25maWd1cmVkIGluIHRoZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgKElEKSByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIGJsb2Igd2hpY2ggdGhlIHBhcnQgYmVsb25ncyB0by5cbiAqIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgJiMzOTstJiMzOTsgYW5kICYjMzk7LiYjMzk7IGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS5cbiAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBtdWx0aVBhcnRUb2tlbiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbXVsdGkgcGFydCB1cGxvYWQgKHRva2VuKS4gQ29udGVudCBvZiB0aGlzIHBhcmFtZXRlciBtdXN0IHJlZmVyIHRvXG4gKlxuICogYSB2YWxpZCB0b2tlbiByZXRyaWV2ZWQgd2hlbiBzdGFydGluZyB0aGUgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbmNlbE11bHRpcGFydFVwbG9hZChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfS9tdWx0aXBhcnRzL3ttdWx0aVBhcnRUb2tlbn1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlQYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aVBhcnRUb2tlblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBibG9iIGV4aXN0cyBmb3IgdGhlIHJlcXVlc3RlZCBkYXRhIGhhbmRsZS5cbiAqXG4gKiBAc3VtbWFyeSBDaGVja3MgaWYgYSBkYXRhIGhhbmRsZSBleGlzdHNcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJ3MgY29udGVudHMuXG4gKiBUaGUgZGF0YSBoYW5kbGUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsIFwiLVwiIGFuZCBcIi5cIiBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uXG4gKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0Jsb2JFeGlzdHNTdGF0dXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBEZWxldGVzIGEgZGF0YSBibG9iIGZyb20gdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBtZWNoYW5pc20gKHZvbHVtZSkuIFdoZW4geW91IGRlbGV0ZSBhIGJsb2IsIHlvdSBjYW5ub3QgdXBsb2FkXG4gKiBkYXRhIHRvIHRoZSBkZWxldGVkIGJsb2IncyBkYXRhIGhhbmRsZSBmb3IgYXQgbGVhc3QgMyBkYXlzLiBUaGUgREVMRVRFIG1ldGhvZCB3b3JrcyBvbmx5IGZvciBpbmRleCBsYXllcnMuXG4gKiBERUxFVEUgcmVxdWVzdHMgZm9yIGJsb2JzIHN0b3JlZCBmb3Igb3RoZXIga2luZCBvZiBsYXllcnMgd2lsbCBiZSByZWplY3RlZC5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgZGF0YSBibG9iIGZyb20gYW4gaW5kZXggbGF5ZXIuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIGRhdGEgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIG9mIHRoZSBibG9iIHlvdSB3YW50IHRvIGRlbGV0ZS4gVGhlIGRhdGEgaGFuZGxlIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLFxuICogJiMzOTstJiMzOTsgYW5kICYjMzk7LiYjMzk7IGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS4gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlcyBhIGJsb2IgZnJvbSBzdG9yYWdlLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgYSBibG9iXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJiMzOTtzIGNvbnRlbnRzLlxuICogVGhlIGRhdGEgaGFuZGxlIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLCAmIzM5Oy0mIzM5OyBhbmQgJiMzOTsuJiMzOTsgY2hhcmFjdGVycywgWzAtOSwgYS16LCBBLVosIC0sIC5dLlxuICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqIEBwYXJhbSByYW5nZSBVc2UgdGhpcyBwYXJhbWV0ZXIgdG8gcmVzdW1lIGRvd25sb2FkIG9mIGEgbGFyZ2UgcmVzcG9uc2Ugd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gaXNzdWUgYmV0d2VlblxuICogdGhlIGNsaWVudCBhbmQgc2VydmVyLCBvciB0byBmZXRjaCBhIHNwZWNpZmljIHNsaWNlIG9mIHRoZSBibG9iLiBUbyByZXN1bWUgZG93bmxvYWQgYWZ0ZXIgYSBjb25uZWN0aW9uIGlzc3VlLFxuICogc3BlY2lmeSBhIHNpbmdsZSBieXRlIHJhbmdlIG9mZnNldCBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqIFRvIGZldGNoIGEgc3BlY2lmaWMgc2xpY2Ugb2YgdGhlIGJsb2IsIHNwZWNpZnkgYSBzbGljZSBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLTEwMCYjeDYwOy5cbiAqIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudCB3aXRoIFtSRkMgNzIzM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMpLCBidXQgbm90ZSB0aGF0IHRoaXNcbiAqIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGJ5dGUgcmFuZ2UuIFRoZSAmI3g2MDtyYW5nZSYjeDYwOyBwYXJhbWV0ZXIgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGFzXG4gKiBhIHF1ZXJ5IHBhcmFtZXRlciwgaS5lLiAmI3g2MDtyYW5nZSYjeDNEO2J5dGVzJiN4M0Q7MTAtJiN4NjA7LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCbG9iKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJyYW5nZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJSYW5nZVwiXSA9IHBhcmFtc1tcInJhbmdlXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0cyB0aGUgc3RhdHVzIG9mIGEgbXVsdGlwYXJ0IHVwbG9hZC4gVGhlIHN0YXR1cyBjYW4gYmUgcmVjZWl2ZWQgb25seSB3aGVuIHRoZSB1cGxvYWQgaGFzIGJlZW4gY29tcGxldGVkLlxuICogUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBhY3R1YWwgVVJMIGZvciB0aGlzIG9wZXJhdGlvbiBtdXN0IGJlIG9idGFpbmVkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkgb2Ygc3RhcnRcbiAqIG11bHRpcGFydCBvcGVyYXRpb24gdGhhdCBpcyAnUE9TVCAvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfS9tdWx0aXBhcnRzJyBmcm9tIHRoZSAnc3RhdHVzJyBlbGVtZW50XG4gKiB1bmRlciB0aGUgdG9wIGxldmVsICdsaW5rcycgZWxlbWVudCBvZiB0aGUgcmVzcG9uc2UuXG4gKlxuICogQHN1bW1hcnkgR2V0cyB0aGUgc3RhdHVzIG9mIGEgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgZGF0YSBibG9iIHBhcnQgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIGlzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIGJsb2Igd2hpY2ggdGhlIHBhcnQgYmVsb25ncyB0by5cbiAqIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgJiMzOTstJiMzOTsgYW5kICYjMzk7LiYjMzk7IGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS5cbiAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBtdWx0aVBhcnRUb2tlbiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCAodG9rZW4pLiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYVxuICogdmFsaWQgdG9rZW4gd2hpY2ggd2FzIHByb3ZpZGVkIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYXRlZC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHMve211bHRpUGFydFRva2VufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKVxuICAgICAgICAucmVwbGFjZShcInttdWx0aVBhcnRUb2tlbn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm11bHRpUGFydFRva2VuXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUGVyc2lzdHMgdGhlIGRhdGEgYmxvYiBpbiB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSAodm9sdW1lKS5cbiAqIFVzZSB0aGlzIHVwbG9hZCBtZWNoYW5pc20gZm9yIGJsb2JzIHNtYWxsZXIgdGhhbiA1MCBNQi5cbiAqIFRoZSBzaXplIGxpbWl0IGZvciBibG9icyB1cGxvYWRlZCB0aGlzIHdheSBpcyA1IEdCIGJ1dCB3ZSBkbyBub3QgcmVjb21tZW5kIHVwbG9hZGluZyBibG9ic1xuICogdGhpcyBsYXJnZSB3aXRoIHRoaXMgbWV0aG9kLCBzbyB1c2UgbXVsdGlwYXJ0IHVwbG9hZCBpbnN0ZWFkLlxuICogV2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGRhdGEgYmxvYiB3aWxsIGJlXG4gKiBpbW1lZGlhdGVseSBhdmFpbGFibGUgYWx0aG91Z2ggaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlLlxuICogVG8gY2hlY2sgaWYgdGhlIGRhdGEgYmxvYiBpcyBhdmFpbGFibGUgdXNlIHRoZSBIRUFEIG1ldGhvZC5cbiAqXG4gKiBAc3VtbWFyeSBQdWJsaXNoZXMgYSBkYXRhIGJsb2JcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgZGF0YSBibG9iIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgKElEKSByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIGJsb2IuXG4gKiBUaGUgZGF0YSBoYW5kbGUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsIFwiLVwiIGFuZCBcIi5cIiBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uXG4gKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gYm9keSBUaGUgZGF0YSB0byB1cGxvYWQuIENhbiBiZSBCbG9iIG9yIEJ1ZmZlci5cbiAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFNpemUgb2YgdGhlIGVudGl0eS1ib2R5LCBpbiBieXRlcy5cbiAqIEBwYXJhbSBjb250ZW50VHlwZSBBIHN0YW5kYXJkIE1JTUUgdHlwZSBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2IgZGF0YS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1JGQyAyNjE2LCBzZWN0aW9uIDE0LjE3OiBDb250ZW50LVR5cGVdKGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzE0Lmh0bWwjc2VjMTQuMTcpLlxuICogVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIG11c3QgbWF0Y2ggdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnRlbnRUeXBlIGZpZWxkIHdoZW4gdGhlIG11bHRpcGFydFxuICogdXBsb2FkIHdhcyBpbml0aWFsaXplZCwgYW5kIHRoaXMgY29udGVudCB0eXBlIG11c3QgYWxzbyBtYXRjaCB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgbGF5ZXIncyBjb25maWd1cmF0aW9uLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDcyMzAsIHNlY3Rpb24gMy4zLjI6IENvbnRlbnQtTGVuZ3RoXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yKS5cbiAqIEBwYXJhbSBjb250ZW50RW5jb2RpbmcgT3B0aW9uYWwgcGFyYW0sIGNhbiBiZSBgZ3ppcGAgb2YgYHVuZGVmaW5lZGAuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBwdXREYXRhKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IHBhcmFtc1tcImJvZHlcIl07XG4gICAgfVxuICAgIGlmIChwYXJhbXNbXCJjb250ZW50VHlwZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBwYXJhbXNbXCJjb250ZW50VHlwZVwiXTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSBwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdO1xuICAgIH1cbiAgICBpZiAocGFyYW1zW1wiY29udGVudEVuY29kaW5nXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtRW5jb2RpbmdcIl0gPSBwYXJhbXNbXCJjb250ZW50RW5jb2RpbmdcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBQdWJsaXNoZXMgbGFyZ2UgZGF0YSBibG9icyB3aGVyZSB0aGUgZGF0YSBwYXlsb2FkIG5lZWRzIHRvIGJlIHNwbGl0IGludG8gbXVsdGlwbGUgcGFydHMuXG4gKiBUaGUgbXVsdGlwYXJ0IHVwbG9hZCBzdGFydCBpcyB0byBiZSBmb2xsb3dlZCBieSB0aGUgaW5kaXZpZHVhbCBwYXJ0cyB1cGxvYWQgYW5kIGNvbXBsZXRlZCB3aXRoIGFcbiAqIGNhbGwgdG8gY29tcGxldGUgdGhlIHVwbG9hZC4gVGhlIGxpbWl0IG9mIHRoZSBibG9iIHVwbG9hZGVkIHRoaXMgd2F5IGlzIDUwR0IuXG4gKlxuICogQHN1bW1hcnkgU3RhcnRzIGEgbXVsdGlwYXJ0IHVwbG9hZCBvZiBhIGJsb2IgYW5kIHJldHVybnMgVVJMcyBmb3IgdGhlIG5leHQgbXVsdGlwYXJ0IHVwbG9hZCBvcGVyYXRpb25zLlxuICogVGhlIFVSTHMgY29udGFpbiB0aGUgdXBsb2FkIHRva2VuLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBkYXRhIGJsb2IgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgYmxvYiB3aGljaCBjb250ZW50cyB3aWxsIGJlIHBlcnNpc3RlZC5cbiAqIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgJiMzOTstJiMzOTsgYW5kICYjMzk7LiYjMzk7IGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS5cbiAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBib2R5IGJvZHlcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TXVsdGlwYXJ0VXBsb2FkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHNcIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDYWxsIHRoaXMgQVBJIHdoZW4gYWxsIHBhcnRzIGhhdmUgYmVlbiB1cGxvYWRlZC4gUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBhY3R1YWwgVVJMIGZvciB0aGlzIG9wZXJhdGlvblxuICogbXVzdCBiZSBvYnRhaW5lZCBmcm9tIHRoZSByZXNwb25zZSBib2R5IG9mIHN0YXJ0IG11bHRpcGFydCBvcGVyYXRpb24gdGhhdCBpc1xuICogJ1BPU1QgL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX0vbXVsdGlwYXJ0cycgZnJvbSB0aGUgJ2NvbXBsZXRlJyBlbGVtZW50IHVuZGVyIHRoZSB0b3AgbGV2ZWwgJ2xpbmtzJyBlbGVtZW50IG9mIHRoZSByZXNwb25zZS5cbiAqXG4gKiBAc3VtbWFyeSBDb21wbGV0ZXMgYSBtdWx0aXBhcnQgdXBsb2FkXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIGRhdGEgYmxvYiBwYXJ0IGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgKElEKSByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIGJsb2Igd2hpY2ggdGhlIHBhcnRcbiAqIGJlbG9uZ3MgdG8uIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgXCItXCI7IGFuZCBcIi5cIiBjaGFyYWN0ZXJzLFxuICogWzAtOSwgYS16LCBBLVosIC0sIC5dLiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gbXVsdGlQYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpIHBhcnQgdXBsb2FkICh0b2tlbikuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdFxuICogcmVmZXIgdG8gYSB2YWxpZCBuYW5kIHN0YXJ0ZWQgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBwYXJ0cyBUaGUgcGFydCBpZHMgdXBsb2FkZWQgaW4gdGhpcyBtdWx0aXBhcnQgdXBsb2FkIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIHRoZSByZXN1bHRpbmcgYmxvYi5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvQ29tcGxldGVNdWx0aXBhcnRVcGxvYWQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIocGFyYW1zLnVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJwYXJ0c1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcInBhcnRzXCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFVwbG9hZCBhIHNpbmdsZSBwYXJ0IG9mIGEgbXVsdGlwYXJ0IHVwbG9hZCBmb3IgdGhlIGJsb2IuIEV2ZXJ5IHVwbG9hZGVkIHBhcnQgZXhjZXB0IHRoZSBsYXN0IG9uZSBtdXN0IGhhdmUgYVxuICogbWluaW11bSA1IE1CIG9mIGRhdGEgYW5kIG1heGltdW0gb2YgNSBHQiwgYnV0IHdlIGRvIG5vdCByZWNvbW1lbmQgdXBsb2FkaW5nIHBhcnRzIHRoaXMgbGFyZ2UuXG4gKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFydHMgaXMgMTAsMDAwLiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGFjdHVhbCBVUkwgZm9yIHRoaXMgb3BlcmF0aW9uXG4gKiBtdXN0IGJlIG9idGFpbmVkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkgb2Ygc3RhcnQgbXVsdGlwYXJ0IG9wZXJhdGlvbiB0aGF0IGlzICdQT1NUIC9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHMnXG4gKiBmcm9tIHRoZSAndXBsb2FkUGFydCcgZWxlbWVudCB1bmRlciB0aGUgdG9wIGxldmVsICdsaW5rcycgZWxlbWVudCBvZiB0aGUgcmVzcG9uc2UuXG4gKlxuICogQHN1bW1hcnkgVXBsb2FkcyBhIHBhcnRcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgZGF0YSBibG9iIHBhcnQgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgYmxvYiB3aGljaCB0aGUgcGFydCBiZWxvbmdzIHRvLiBUaGUgZGF0YSBoYW5kbGVcbiAqIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLCAnLScgYW5kICcuJyBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uXG4gKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gbXVsdGlQYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpIHBhcnQgdXBsb2FkICh0b2tlbikuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXJcbiAqIG11c3QgcmVmZXIgdG8gYSB2YWxpZCBuYW5kIHN0YXJ0ZWQgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBwYXJ0TnVtYmVyIFRoZSBudW1iZXIgb2YgdGhlIHBhcnQgZm9yIHRoZSBtdWx0aSBwYXJ0IHVwbG9hZC4gVGhlIG51bWJlcnMgb2YgdGhlIHVwbG9hZCBwYXJ0c1xuICogbXVzdCBzdGFydCBmcm9tIDEsIGJlIG5vIGdyZWF0ZXIgdGhhbiAxMCwwMDAgYW5kIGJlIGNvbnNlY3V0aXZlLiBQYXJ0cyB1cGxvYWRlZCB3aXRoIHRoZSBzYW1lICYjeDYwO3BhcnROdW1iZXImI3g2MDtcbiAqIGFyZSBvdmVycmlkZGVuLiBEbyBub3QgcmV1c2UgdGhlIHNhbWUgJ3BhcnRudW1iZXInIHdoZW4gcmV0cnlpbmcgYW4gdXBsb2FkIGluIGFuIGVycm9yIHNpdHVhdGlvblxuICogKG5ldHdvcmsgcHJvYmxlbXMsIDR4eCBvciA1eHggcmVzcG9uc2VzKS4gUmV1c2luZyB0aGUgc2FtZSAmI3g2MDtwYXJ0bnVtYmVyJiN4NjA7IGluIGEgcmV0cnkgbWF5IGNhdXNlIHRoZSBwdWJsaWNhdGlvbiB0byBmYWlsLlxuICogQHBhcmFtIGJvZHkgVGhlIGRhdGEgdG8gdXBsb2FkIGFzIHBhcnQgb2YgdGhlIGJsb2IuXG4gKiBAcGFyYW0gY29udGVudFR5cGUgQSBzdGFuZGFyZCBNSU1FIHR5cGUgZGVzY3JpYmluZyB0aGUgZm9ybWF0IG9mIHRoZSBibG9iIGRhdGEuIEZvciBtb3JlIGluZm9ybWF0aW9uLFxuICogc2VlIFtSRkMgMjYxNiwgc2VjdGlvbiAxNC4xNzogQ29udGVudC1UeXBlXShodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxNC5odG1sI3NlYzE0LjE3KS5cbiAqIFRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlciBtdXN0IG1hdGNoIHRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGluIHRoZSBjb250ZW50VHlwZSBmaWVsZCB3aGVuIHRoZSBtdWx0aXBhcnRcbiAqIHVwbG9hZCB3YXMgaW5pdGlhbGl6ZWQsIGFuZCB0aGlzIGNvbnRlbnQgdHlwZSBtdXN0IGFsc28gbWF0Y2ggdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGxheWVyJ3MgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFNpemUgb2YgdGhlIGVudGl0eS1ib2R5LCBpbiBieXRlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1JGQyA3MjMwLCBzZWN0aW9uIDMuMy4yOiBDb250ZW50LUxlbmd0aF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMikuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb1VwbG9hZFBhcnQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIocGFyYW1zLnVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcnROdW1iZXJcIiwgcGFyYW1zW1wicGFydE51bWJlclwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IHBhcmFtc1tcImJvZHlcIl07XG4gICAgfVxuICAgIGlmIChwYXJhbXNbXCJjb250ZW50VHlwZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBwYXJhbXNbXCJjb250ZW50VHlwZVwiXTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSBwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2FuY2VsTXVsdGlwYXJ0VXBsb2FkQnlLZXkgPSBjYW5jZWxNdWx0aXBhcnRVcGxvYWRCeUtleTtcbmV4cG9ydHMuY2hlY2tLZXlFeGlzdHMgPSBjaGVja0tleUV4aXN0cztcbmV4cG9ydHMuY29tcGxldGVNdWx0aXBhcnRVcGxvYWRCeUtleSA9IGNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkQnlLZXk7XG5leHBvcnRzLmRlbGV0ZUJsb2JCeUtleSA9IGRlbGV0ZUJsb2JCeUtleTtcbmV4cG9ydHMuZ2V0QmxvYkJ5S2V5ID0gZ2V0QmxvYkJ5S2V5O1xuZXhwb3J0cy5nZXRNdWx0aXBhcnRVcGxvYWRTdGF0dXNCeUtleSA9IGdldE11bHRpcGFydFVwbG9hZFN0YXR1c0J5S2V5O1xuZXhwb3J0cy5saXN0S2V5cyA9IGxpc3RLZXlzO1xuZXhwb3J0cy5wdXRCbG9iQnlLZXkgPSBwdXRCbG9iQnlLZXk7XG5leHBvcnRzLnN0YXJ0TXVsdGlwYXJ0VXBsb2FkQnlLZXkgPSBzdGFydE11bHRpcGFydFVwbG9hZEJ5S2V5O1xuZXhwb3J0cy51cGxvYWRQYXJ0QnlLZXkgPSB1cGxvYWRQYXJ0QnlLZXk7XG4vKipcbiAqIEJsb2IgQVBJIHYyXG4gKiBUaGUgYGJsb2JgIHNlcnZpY2Ugc3VwcG9ydHMgdGhlIHVwbG9hZCBhbmQgcmV0cmlldmFsIG9mIGxhcmdlIHZvbHVtZXMgb2YgZGF0YSBmcm9tIHRoZSBzdG9yYWdlIG9mIGEgY2F0YWxvZy5cbiAqIEVhY2ggZGlzY3JldGUgY2h1bmsgb2YgZGF0YSBpcyBzdG9yZWQgYXMgYSBibG9iIChCaW5hcnkgTGFyZ2UgT2JqZWN0KS4gRWFjaCBibG9iIGhhcyBpdHMgb3duIHVuaXF1ZSBJRCAoaGFuZGxlIG9yIGtleSksXG4gKiB3aGljaCBjYW4gYmUgc3RvcmVkIGFzIHBhcnRpdGlvbiBtZXRhZGF0YS5cbiAqIEFjY2Vzc2luZyBibG9icyBjYW4gYmUgZG9uZSBlaXRoZXIgYnkga2V5IG9yIGJ5IGhhbmRsZSwgbm90IGJvdGggZm9yIHRoZSBzYW1lIGxheWVyLlxuICogV2hlbiBhY2Nlc3NpbmcgYnkga2V5IGlzIGVuYWJsZWQsIHlvdSBjYW4gdXNlIGtleXMgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGJsb2JzLCBidXQgbm90IGRhdGEgaGFuZGxlcy5cbiAqIEtleXMgZm9sbG93IGEgdXNlci1kZWZpbmVkIGZvcm1hdCBmb3IgdGhlIGxheWVycyB3aGlsZSBkYXRhIGhhbmRsZXMgYXJlIG9wYXF1ZSBpZGVudGlmaWVycy5cbiAqIFRoZSBhY2Nlc3MtYnkta2V5IEFQSSBoYXMgZGlmZmVyZW50IGNhcGFiaWxpdGllcyBvZiB0aGUgYWNjZXNzLWJ5LWRhdGEtaGFuZGxlIEFQSSBhbmQgZGlmZmVyZW50IGVuZHBvaW50czpcbiAqIGVuYWJsaW5nIGFjY2VzcyBieSBrZXkgaW1wbGllcyB0aGUgY2FwYWJpbGl0eSB0byB1cGRhdGUgYmxvYnMsIHdoaWxlIG9wZXJhdGluZyB2aWEgZGF0YSBoYW5kbGVzIGlzIG1vcmUgZWZmaWNpZW50XG4gKiBhbmQgcHJvdmlkZXMgcm9vbSBmb3Igb3B0aW1pemF0aW9uIG9uIGJvdGggdGhlIGNsaWVudCBzaWRlIGFuZCBpbnNpZGUgdGhlIHNlcnZpY2UuIEluIGNhc2UgdGhlIGFjY2VzcyBwYXR0ZXJuIGlzIGJ5IGtleSxcbiAqIHlvdSBjYW4gZW5hYmxlIHRoZSBvcHRpb25hbCBjYXBhYmlsaXR5IG9mIGxpc3Rpbmcgd2hpY2gga2V5cyBhcmUgc3RvcmVkIGluIHRoZSBsYXllci4gVGhpcyBjYXBhYmlsaXR5IGhhcyBhIG5lZ2F0aXZlIGltcGFjdFxuICogb24gdGhlIGFjY2VzcyB0aW1lcyB3aGVuIGdldHRpbmcgYW5kIHNhdmluZyBibG9icyBhbmQgdGhlcmVmb3JlIG11c3QgYmUgZW5hYmxlZCBleHBsaWNpdGx5LlxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAyLjAuMFxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLypcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJ5S2V5QXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQ2FuY2VscyBhbiBlbnRpcmUgbXVsdGlwYXJ0IHVwbG9hZCBvcGVyYXRpb24uIFlvdSBjYW4gb25seSBjYW5jZWwgYSBtdWx0aXBhcnQgdXBsb2FkIGJlZm9yZSBpdCBoYXMgYmVlbiBjb21wbGV0ZWQuXG4gKlxuICogQHN1bW1hcnkgQ2FuY2VscyBhIG11bHRpcGFydCB1cGxvYWQuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIG11bHRpcGFydFRva2VuIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtdWx0aXBhcnQgdXBsb2FkICh0b2tlbikuXG4gKiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYSB2YWxpZCB0b2tlbiB3aGljaCB3aGVuIHRoZSBtdWx0aXBhcnQgdXBsb2FkIHdhcyBpbml0aWF0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbmNlbE11bHRpcGFydFVwbG9hZEJ5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXNNdWx0aXBhcnQve211bHRpcGFydFRva2VufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlwYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aXBhcnRUb2tlblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBibG9iIGV4aXN0cyBmb3IgdGhlIHJlcXVlc3RlZCBrZXkuXG4gKlxuICogQHN1bW1hcnkgQ2hlY2tzIGlmIGEga2V5IGV4aXN0cy5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2IncyBjb250ZW50cy5cbiAqIEtleSBjYW4gb25seSBjb250YWluIGFsbG93ZWQgY2hhcmFjdGVyczogYS16QS1aMC05LltdKCl7fS9fLSYuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrS2V5RXhpc3RzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXMve2tleX1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2tleX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImtleVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiSEVBRFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ2FsbCB0aGlzIEFQSSB3aGVuIGFsbCBwYXJ0cyBoYXZlIGJlZW4gdXBsb2FkZWQuXG4gKlxuICogQHN1bW1hcnkgQ29tcGxldGVzIGEgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0gbXVsdGlwYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpcGFydCB1cGxvYWQgKHRva2VuKS5cbiAqIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIHRva2VuIHdoaWNoIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYXRlZC5cbiAqIEBwYXJhbSBib2R5IFRoZSBwYXJ0IElEcyB1cGxvYWRlZCBpbiB0aGlzIG11bHRpcGFydCB1cGxvYWQgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHJlc3VsdGluZyBibG9iLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wbGV0ZU11bHRpcGFydFVwbG9hZEJ5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXNNdWx0aXBhcnQve211bHRpcGFydFRva2VufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlwYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aXBhcnRUb2tlblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogRGVsZXRlcyBhIGRhdGEgYmxvYi5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgZGF0YSBibG9iLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYidzIGNvbnRlbnRzLlxuICogS2V5IGNhbiBvbmx5IGNvbnRhaW4gYWxsb3dlZCBjaGFyYWN0ZXJzOiBhLXpBLVowLTkuW10mKCl7fS9fLSYuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJsb2JCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzL3trZXl9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntrZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJrZXlcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmVzIGEgYmxvYiBmcm9tIHN0b3JhZ2UuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBhIGJsb2IuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIGtleSBUaGUga2V5IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJ3MgY29udGVudHMuXG4gKiBLZXkgY2FuIG9ubHkgY29udGFpbiBhbGxvd2VkIGNoYXJhY3RlcnM6IGEtekEtWjAtOS5bXSYoKXt9L187LlxuICogQHBhcmFtIHJhbmdlIFVzZSB0aGlzIHBhcmFtZXRlciB0byByZXN1bWUgZG93bmxvYWQgb2YgYSBsYXJnZSByZXNwb25zZSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbiBpc3N1ZSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlcixcbiAqIG9yIHRvIGZldGNoIGEgc3BlY2lmaWMgc2xpY2Ugb2YgdGhlIGJsb2IuIFRvIHJlc3VtZSBkb3dubG9hZCBhZnRlciBhIGNvbm5lY3Rpb24gaXNzdWUsXG4gKiBzcGVjaWZ5IGEgc2luZ2xlIGJ5dGUgcmFuZ2Ugb2Zmc2V0IGFzIGZvbGxvd3M6IFJhbmdlOiBieXRlcyYxMDsuXG4gKiBUbyBmZXRjaCBhIHNwZWNpZmljIHNsaWNlIG9mIHRoZSBibG9iLCBzcGVjaWZ5IGEgc2xpY2UgYXMgZm9sbG93czpcbiAqIFJhbmdlOiBieXRlcyYxMC0xMDAuIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudCB3aXRoIFtSRkMgNzIzM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMpLFxuICogYnV0IG5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGJ5dGUgcmFuZ2UuXG4gKiBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgcmFuZ2UgcGFyYW1ldGVyIGFzIGEgcXVlcnkgcGFyYW1ldGVyLCBmb3IgZXhhbXBsZSByYW5nZSZieXRlcyYxMDsuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEJsb2JCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzL3trZXl9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntrZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJrZXlcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wicmFuZ2VcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiUmFuZ2VcIl0gPSBwYXJhbXNbXCJyYW5nZVwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldHMgdGhlIHN0YXR1cyBvZiBhIG11bHRpcGFydCB1cGxvYWQuIFRoZSBzdGF0dXMgY2FuIGJlIHJlY2VpdmVkIG9ubHkgd2hlbiB0aGUgdXBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtdWx0aXBhcnQgdXBsb2FkLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBtdWx0aXBhcnRUb2tlbiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCAodG9rZW4pLlxuICogQ29udGVudCBvZiB0aGlzIHBhcmFtZXRlciBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgdG9rZW4gd2hpY2ggd2hlbiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCB3YXMgaW5pdGlhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRNdWx0aXBhcnRVcGxvYWRTdGF0dXNCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzTXVsdGlwYXJ0L3ttdWx0aXBhcnRUb2tlbn1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie211bHRpcGFydFRva2VufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibXVsdGlwYXJ0VG9rZW5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBMaXN0IHZpcnR1YWwgZGlyZWN0b3J5LWxpa2Ugc3RydWN0dXJlIGNyZWF0ZWQgZnJvbSBrZXlzIGluIHRoZSBzdG9yYWdlIHdoZXJlICcvJyBpcyB1c2VkIGFzIGEgc2VwYXJhdG9yLlxuICpcbiAqIEBzdW1tYXJ5IExpc3Qga2V5cy5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0gcGFyZW50IENvbW1vbiBwcmVmaXggdG8gYSBsaXN0LlxuICogQHBhcmFtIHBhZ2VUb2tlbiBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHRoZSBzcGVjaWZpYyBwYWdlIGJhc2VkIG9uIHRoZSB0b2tlbi5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4gcGVyIHBhZ2UuXG4gKiBAcGFyYW0gZGVlcCBVc2UgZGVlcCAocmVjdXJzaXZlKSBsaXN0aW5nIG9mIG9iamVjdHMgaW5zdGVhZCBvZiBoaWVyYXJjaGljYWwgbGlzdGluZy5cbiAqIERlZXAgbGlzdGluZyB3aWxsIG5vdCBwcm9kdWNlIGFueSBjb21tb24gcHJlZml4ZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RLZXlzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcmVudFwiLCBwYXJhbXNbXCJwYXJlbnRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJkZWVwXCIsIHBhcmFtc1tcImRlZXBcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFBlcnNpc3RzIHRoZSBkYXRhIGJsb2IgdXAgdG8gMTkyIE1CLiBXaGVuIHRoZSBvcGVyYXRpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSxcbiAqIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBkYXRhIGJsb2Igd2lsbCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUsIGFsdGhvdWdoIGluIG1vc3QgY2FzZXMsXG4gKiBpdCB3aWxsIGJlLiBUbyBjaGVjayBpZiB0aGUgZGF0YSBibG9iIGlzIGF2YWlsYWJsZSwgdXNlIHRoZSDCtEhFQUTCtCBtZXRob2QuIFRoZSBtYXhpbXVtIGtleSBsZW5ndGggaXMgNDUwIGNoYXJhY3RlcnMuXG4gKlxuICogQHN1bW1hcnkgUHVibGlzaGVzIGEgZGF0YSBibG9iIG9yIGNvcGllcyBhbiBleGlzdGluZyBibG9iLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYidzIGNvbnRlbnRzLlxuICogS2V5IGNhbiBvbmx5IGNvbnRhaW4gYWxsb3dlZCBjaGFyYWN0ZXJzOiBhLXpBLVowLTkuW10mKCl7fS9fOy5cbiAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFNpemUgb2YgdGhlIGVudGl0eS1ib2R5LCBpbiBieXRlcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyA3MjMwLCBzZWN0aW9uIDMuMy4yOiBDb250ZW50LUxlbmd0aF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMikuXG4gKiBAcGFyYW0gYm9keSBSZXF1ZXN0IGJvZHkuIE11c3QgYmUgZW1wdHkgd2hlbiBjb3B5aW5nIGFuIG9iamVjdCB1c2luZyB0aGUgc291cmNlIHBhcmFtZXRlci5cbiAqIEBwYXJhbSBzb3VyY2UgQ29weSBhbiBhbHJlYWR5LWV4aXN0aW5nIG9iamVjdCwgaW5zdGVhZCBvZiB1cGxvYWRpbmcgYSBuZXcgb25lLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBwcmVzZW50LFxuICogdGVoIHJlcXVlc3QgcGF5bG9hZCBtdXN0IGJlIGVtcHR5LlxuICovXG5hc3luYyBmdW5jdGlvbiBwdXRCbG9iQnlLZXkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0va2V5cy97a2V5fVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7a2V5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wia2V5XCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNvdXJjZVwiLCBwYXJhbXNbXCJzb3VyY2VcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICBpZiAocGFyYW1zW1wiY29udGVudExlbmd0aFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LUxlbmd0aFwiXSA9IGAke3BhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl19YDtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFB1Ymxpc2hlcyBsYXJnZSBkYXRhIGJsb2JzIHdoZXJlIHRoZSBkYXRhIHBheWxvYWQgbmVlZHMgdG8gYmUgc3BsaXQgaW50byBtdWx0aXBsZSBwYXJ0cy5cbiAqIFRoZSBtdWx0aXBhcnQgdXBsb2FkIHN0YXJ0IGlzIHRvIGJlIGZvbGxvd2VkIGJ5IHRoZSBpbmRpdmlkdWFsIHBhcnRzIHVwbG9hZCBhbmQgY29tcGxldGVkXG4gKiB3aXRoIGEgY2FsbCB0byBjb21wbGV0ZSB0aGUgdXBsb2FkLiBUaGUgbGltaXQgb2YgdGhlIGJsb2IgdXBsb2FkZWQgdGhpcyB3YXkgaXMgNTBHQi5cbiAqIE1heCBrZXkgbGVuZ3RoIGlzIDQ1MCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBzdW1tYXJ5IFN0YXJ0cyBhIG11bHRpcGFydCB1cGxvYWQuXG4gKiBAcGFyYW0gYm9keSBBbiBvYmplY3QgdGhhdCBjb250YWlucyBtZXRhZGF0YSBvZiB0aGUgdXBsb2FkZWQgb2JqZWN0LlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYidzIGNvbnRlbnRzLlxuICogS2V5IGNhbiBvbmx5IGNvbnRhaW4gYWxsb3dlZCBjaGFyYWN0ZXJzOiBhLXpBLVowLTkuW10mKCl7fS9fOy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhcnRNdWx0aXBhcnRVcGxvYWRCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzL3trZXl9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntrZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJrZXlcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFVwbG9hZCBvciBjb3B5IGEgc2luZ2xlIHBhcnQgb2YgYSBtdWx0aXBhcnQgdXBsb2FkIG9yIG11bHRpcGFydCBjb3B5IGZvciB0aGUgYmxvYi5cbiAqIEV2ZXJ5IHBhcnQgZXhjZXB0IHRoZSBsYXN0IG9uZSBtdXN0IGhhdmUgYSBtaW5pbXVtIDUgTUIgb2YgZGF0YSBhbmQgbWF4aW11bSBvZiA5NiBNQi5cbiAqIFRoZSBsZW5ndGggb2YgZXZlcnkgcGFydCBleGNlcHQgdGhlIGxhc3Qgb25lIG11c3QgYmUgbXVsdGlwbGUgb2YgMU1CICgxMDI0S0IpLlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRzIGlzIDEwLDAwMC5cbiAqXG4gKiBAc3VtbWFyeSBVcGxvYWRzIGEgcGFydCBvciBjcmVhdGVzIGEgbmV3IHBhcnQgZnJvbSBwYXJ0IG9mIGFuIGV4aXN0aW5nIGJsb2IuXG4gKiBAcGFyYW0gYm9keSBUaGUgYm9keSByZWxhdGVzIHRvIHVwbG9hZCBvbmx5LiBUaGUgZGF0YSB0byB1cGxvYWQgYXMgcGFydCBvZiB0aGUgYmxvYi5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0gbXVsdGlwYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpcGFydCB1cGxvYWQgKHRva2VuKS5cbiAqIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIHRva2VuIHdoaWNoIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYXRlZC5cbiAqIEBwYXJhbSBwYXJ0TnVtYmVyIFRoaXMgcGFyYW1ldGVyIHJlbGF0ZXMgdG8gdXBsb2FkIGFuZCBjb3B5LiBUaGUgbnVtYmVyIG9mIHRoZSBwYXJ0IGZvciB0aGUgbXVsdGlwYXJ0IHVwbG9hZCBvciBjb3B5LlxuICogVGhlIG51bWJlcnMgb2YgdGhlIHVwbG9hZCBwYXJ0cyBtdXN0IHN0YXJ0IGZyb20gMSwgYmUgbm8gZ3JlYXRlciB0aGFuIDEwLDAwMCBhbmQgYmUgY29uc2VjdXRpdmUuXG4gKiBQYXJ0cyB1cGxvYWRlZCB3aXRoIHRoZSBzYW1lIHBhcnROdW1iZXIgYXJlIG92ZXJyaWRkZW4uIERvIG5vdCByZXVzZSB0aGUgc2FtZSBwYXJ0TnVtYmVyIHdoZW4gcmV0cnlpbmdcbiAqIGFuIHVwbG9hZCBvciBjb3B5IGluIGFuIGVycm9yIHNpdHVhdGlvbiAobmV0d29yayBwcm9ibGVtcywgNHh4IG9yIDV4eCByZXNwb25zZXMpLlxuICogUmV1c2luZyB0aGUgc2FtZSBwYXJ0TnVtYmVyIGluIGEgcmV0cnkgbWF5IGNhdXNlIHRoZSBwdWJsaWNhdGlvbiB0byBmYWlsLlxuICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhpcyBoZWFkZXIgcmVsYXRlcyB0byB1cGxvYWQgb25seS4gU2l6ZSBvZiB0aGUgZW50aXR5LWJvZHksIGluIGJ5dGVzLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDcyMzAsIHNlY3Rpb24gMy4zLjI6IENvbnRlbnQtTGVuZ3RoXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yKS5cbiAqIEBwYXJhbSBjb250ZW50VHlwZSBUaGlzIGhlYWRlciByZWxhdGVzIHRvIHVwbG9hZCBvbmx5LiBBIHN0YW5kYXJkIE1JTUUgdHlwZSBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2IgZGF0YS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAyNjE2LCBzZWN0aW9uIDE0LjE3OiBDb250ZW50LVR5cGVdKGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzE0Lmh0bWwjc2VjMTQuMTcpLlxuICogVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIG11c3QgbWF0Y2ggdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnRlbnRUeXBlIGZpZWxkIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYWxpemVkLFxuICogYW5kIHRoaXMgY29udGVudCB0eXBlIG11c3QgYWxzbyBtYXRjaCB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgbGF5ZXIncyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHNvdXJjZSBDb3B5IHBhcnQgZnJvbSBhbiBleGlzdGluZyBvYmplY3QsIHVzZSByYW5nZSB0byBzcGVjaWZ5IHdoaWNoIHBhcnRzIG9mIHRoZSBvYmplY3QgdG8gY29weS5cbiAqIEBwYXJhbSByYW5nZSBUaGlzIGhlYWRlci9wYXJhbWV0ZXIgcmVsYXRlcyB0byBvYmplY3QgY29weSB1c2luZyB0aGUgJ3NvdXJjZScgcGFyYW1ldGVyLiBVc2UgdGhpcyBwYXJhbWV0ZXJcbiAqIHRvIGNvcHkgYSBzcGVjaWZpYyBzbGljZSBvZiB0aGUgYmxvYiBsaWtlIHRoaXM6IFJhbmdlOiBieXRlcyYwLTEwNDg1NzUuIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudFxuICogd2l0aCBbUkZDIDcyMzNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMzKSwgYnV0IG5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGFcbiAqIHNpbmdsZSBieXRlIHJhbmdlIGFuZCBib3RoIGJlZ2luIGFuZCBlbmQgdmFsdWVzIG9mIHRoZSByYW5nZSBtdXN0IGJlIHNwZWNpZmllZC5cbiAqIFRoZSByYW5nZSBiZWdpbiB2YWx1ZSBtdXN0IGJlIG11bHRpcGxlIG9mIDFNQiAoMTAyNEtCKS5cbiAqIFRoZSBsZW5ndGggb2YgZXZlcnkgcGFydCBleGNlcHQgdGhlIGxhc3Qgb25lIG11c3QgYmUgbXVsdGlwbGUgb2YgMU1CICgxMDI0S0IpLlxuICogVGhlIHJhbmdlIHBhcmFtZXRlciBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYXMgYSBxdWVyeSBwYXJhbWV0ZXIsIGZvciBleGFtcGxlIHJhbmdlJmJ5dGVzJjAtMTA0ODU3NS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBsb2FkUGFydEJ5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXNNdWx0aXBhcnQve211bHRpcGFydFRva2VufS9wYXJ0c1wiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlwYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aXBhcnRUb2tlblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYXJ0TnVtYmVyXCIsIHBhcmFtc1tcInBhcnROdW1iZXJcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzb3VyY2VcIiwgcGFyYW1zW1wic291cmNlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIG9wdGlvbnMuYm9keSA9IHBhcmFtc1tcImJvZHlcIl07XG4gICAgaWYgKHBhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSBgJHtwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdfWA7XG4gICAgfVxuICAgIGlmIChwYXJhbXNbXCJjb250ZW50VHlwZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBwYXJhbXNbXCJjb250ZW50VHlwZVwiXTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcInJhbmdlXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlJhbmdlXCJdID0gcGFyYW1zW1wicmFuZ2VcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2F0YWxvZ0V4aXN0cyA9IGNhdGFsb2dFeGlzdHM7XG5leHBvcnRzLmNyZWF0ZUNhdGFsb2cgPSBjcmVhdGVDYXRhbG9nO1xuZXhwb3J0cy5kZWxldGVDYXRhbG9nID0gZGVsZXRlQ2F0YWxvZztcbmV4cG9ydHMuZGVsZXRlTGF5ZXIgPSBkZWxldGVMYXllcjtcbmV4cG9ydHMuZGlzYWJsZUF1dG9tYXRpY1ZlcnNpb25EZWxldGlvbiA9IGRpc2FibGVBdXRvbWF0aWNWZXJzaW9uRGVsZXRpb247XG5leHBvcnRzLmdldENhdGFsb2cgPSBnZXRDYXRhbG9nO1xuZXhwb3J0cy5nZXRDYXRhbG9nU3RhdHVzID0gZ2V0Q2F0YWxvZ1N0YXR1cztcbmV4cG9ydHMuZ2V0Q2F0YWxvZ3MgPSBnZXRDYXRhbG9ncztcbmV4cG9ydHMucGF0Y2hDYXRhbG9nID0gcGF0Y2hDYXRhbG9nO1xuZXhwb3J0cy5wYXRjaExheWVyID0gcGF0Y2hMYXllcjtcbmV4cG9ydHMudXBkYXRlQ2F0YWxvZyA9IHVwZGF0ZUNhdGFsb2c7XG4vKipcbiAqIENvbmZpZyBBUEkgdjFcbiAqIFRoZSBgY29uZmlnYCBzZXJ2aWNlIHByb3ZpZGVzIGJhc2ljIGNhdGFsb2cgbWFuYWdlbWVudCBvcGVyYXRpb25zLlxuICogSXQgbWFuYWdlcyBhbGwgcGxhdGZvcm0gcmVzb3VyY2VzIG5lZWRlZCBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIGNhdGFsb2dzIGFuZCBvcGVyYXRpb25zIG9uIHRoZW0uXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMS43XG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uZmlnQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBjYXRhbG9nIHdpdGggdGhlIHNwZWNpZmllZCBIUk4gZXhpc3RzLlxuICpcbiAqIEBzdW1tYXJ5IENoZWNrcyB0aGUgZXhpc3RlbmNlIG9mIGEgY2F0YWxvZ1xuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nXG4gKiByZWNvcmRzIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhdGFsb2dFeGlzdHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzL3tjYXRhbG9nSHJufVwiLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkhFQURcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY2F0YWxvZyB3aXRoIHRoZSBzcGVjaWZpZWQgbGF5ZXJzLiBUaGUgY3JlYXRlIGNhdGFsb2cgb3BlcmF0aW9uIHJ1bnMgYXN5bmNocm9ub3VzbHkuXG4gKiBPbmNlIHlvdSd2ZSBzdWJtaXR0ZWQgdGhlIGNhdGFsb2cgZm9yIGNyZWF0aW9uLCB5b3UnbGwgcmVjZWl2ZSBhIHJhbmRvbWx5IGdlbmVyYXRlZCB0b2tlbiB0aGF0IHlvdSBjYW4gdXNlIHRvIG1vbml0b3JcbiAqIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgY2F0YWxvZ1xuICogQHBhcmFtIGJvZHkgQSBjYXRhbG9nIG9iamVjdCB0aGF0IGNvbnRhaW5zIG1ldGFkYXRhIGFuZCBsYXllciBkZWZpbml0aW9ucy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nXG4gKiByZWNvcmRzIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNhdGFsb2coYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBEZWxldGVzIGEgY2F0YWxvZyBhbmQgYW55IGxheWVycyB3aXRoaW4gdGhhdCBjYXRhbG9nLlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZXMgYSBjYXRhbG9nXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBUaGUgYGJpbGxpbmdUYWdgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgeW91IGNhbiB1c2UgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlbGV0ZXMgYSBsYXllciBvZiB0aGUgY2F0YWxvZyBpZiBpdCdzIG9mIGxheWVyVHlwZSAnaW5kZXgnLCAndm9sYXRpbGUnLCBvciAnc3RyZWFtJy4gT3RoZXIgYGxheWVyVHlwZXNgIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgYSBsYXllclxuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZ1xuICogQHBhcmFtIGxheWVySWQgVGhlIGxheWVyIElEXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxheWVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9jYXRhbG9ncy97Y2F0YWxvZ0hybn0vbGF5ZXJzL3tsYXllcklkfVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2NhdGFsb2dIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJjYXRhbG9nSHJuXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBEaXNhYmxlIGF1dG9tYXRpYyByZXRpcmVkIHZlcnNpb25zIGNsZWFudXAuXG4gKlxuICogQHN1bW1hcnkgRGlzYWJsZSBhdXRvbWF0aWMgdmVyc2lvbiBkZWxldGlvblxuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlzYWJsZUF1dG9tYXRpY1ZlcnNpb25EZWxldGlvbihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59L2F1dG9tYXRpY1ZlcnNpb25EZWxldGlvblwiLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBmdWxsIGNhdGFsb2cgY29uZmlndXJhdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBjYXRhbG9nLiBUaGUgY2F0YWxvZyBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGRlc2NyaXB0aXZlIGFuZFxuICogc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBzdWNoIGFzIGxheWVyIGRlZmluaXRpb25zIGFuZCBsYXllciB0eXBlcy5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBkZXRhaWxzIG9mIGEgY2F0YWxvZ1xuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZ1xuICogQHBhcmFtIGJpbGxpbmdUYWcgVGhlIGBiaWxsaW5nVGFnYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGdyb3VwIGJpbGxpbmdcbiAqIHJlY29yZHMgdG9nZXRoZXIuIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFRha2VzIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgdG9rZW4gdGhhdCB5b3UgcmVjZWl2ZSB3aGVuIHlvdSBzdWJtaXQgYSBjYXRhbG9nIGZvciBjcmVhdGlvbi4gWW91IGNhbiB1c2UgaXQgdG8gbW9uaXRvciB0aGUgc3RhdHVzXG4gKiBvZiB5b3VyIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgR2V0cyB0aGUgc3RhdHVzIG9mIGEgY3JlYXRlLCB1cGRhdGUgb3IgZGVsZXRlIGNhdGFsb2cgcmVxdWVzdC5cbiAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gb2YgY2F0YWxvZyBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIGRlbGV0aW9uIHRhc2tcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nIHJlY29yZHNcbiAqIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENhdGFsb2dTdGF0dXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3N0YXR1cy97dG9rZW59XCIucmVwbGFjZShcInt0b2tlbn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInRva2VuXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTGlzdHMgYWxsIGNhdGFsb2dzIHRoYXQgeW91ciBhY2NvdW50IGhhcyBhY2Nlc3MgdG8uIFRvIGdldCBhY2Nlc3MgdG8gYSBjYXRhbG9nLCB5b3VyIGFkbWluaXN0cmF0b3IgbXVzdCBhc3NvY2lhdGUgdGhpcyBjYXRhbG9nXG4gKiBpbiB5b3VyIEhFUkUgcGxhdGZvcm0gYWNjb3VudC4gQnkgZGVmYXVsdCwgdGhlIGxpc3QgcHJvdmlkZXMgc3VtbWFyeSBkYXRhIGZvciBlYWNoIGNhdGFsb2cgc3VjaCBhcyB0aGUgdGl0bGUsIHRoZSBjb25maWd1cmF0aW9uXG4gKiBVUkwsIGFuZCB0aGUgcmVzb3VyY2UgdHlwZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGEgbGlzdCBvZiBhbGwgY2F0YWxvZ3NcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nIHJlY29yZHNcbiAqIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCAgIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqIEBwYXJhbSB2ZXJib3NlIEluZGljYXRlcyBpZiB0aGUgcmVzcG9uc2Ugc2hvdWxkIGNvbnRhaW4gZnVsbHkgZXhwYW5kZWQgY2F0YWxvZyBjb25maWd1cmF0aW9ucy4gXCJ0cnVlXCIgfCBcImZhbHNlXCIuXG4gKiBAcGFyYW0gcSBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gVGhlIHJlc3VsdCBjb250YWlucyBvbmx5IHRob3NlIGl0ZW1zIHdoaWNoIGhhdmUgdGhlIGdpdmVuIHN0cmluZ1xuICogYXMgYSBwYXJ0IG9mIHRoZSB2YWx1ZSBvZiBvbmUgb3IgbW9yZSBzZWFyY2hhYmxlIGZpZWxkcyAoc3Vic3RyaW5nIGNvbXBhcmUpLiBJdCB3aWxsIHNlYXJjaCB0aGUgZm9sbG93aW5nIGNhdGFsb2cgZGV0YWlsc1xuICogZmllbGRzOiBpZCwgbmFtZSwgc3VtbWFyeSwgZGVzY3JpcHRpb24sIHRhZ3MgYW5kIGxheWVyIGRldGFpbHM6IGlkLCBuYW1lLCBzdW1tYXJ5LCBkZXNjcmlwdGlvbiwgdGFncywgc2NoZW1hLWhyblxuICogQHBhcmFtIG9yZ2FuaXNhdGlvbiBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gRmlsdGVycyBvbmx5IGNhdGFsb2dzIChsYXllcnMpIHRoYXQgYmVsb25nIHRvIGEgc3BlY2lmaWVkXG4gKiBvcmdhbmlzYXRpb24uIFlvdSBjYW4gZmlsdGVyIG9ubHkgYnkgY2F0YWxvZyAobGF5ZXIpIG93bmVyIG9yZ2FuaXNhdGlvbiBJRC4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFuIG9yZ2FuaXNhdGlvbiwgdGhlIHNlYXJjaFxuICogaXMgdW5maWx0ZXJlZC5cbiAqIEBwYXJhbSBvcmdhbmlzYXRpb25UeXBlIFdvcmtzIG9ubHkgd2hlbiB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCB0byB0cnVlLiBGaWx0ZXJzIG9ubHkgY2F0YWxvZ3MgdGhhdCBiZWxvbmcgdG8gYW4gb3JnYW5pc2F0aW9uLlxuICogSWYgc2V0IHRvIGBgbXlPcmdhbmlzYXRpb25gYCwgdGhlIHNlYXJjaCBpcyBmb3IgY2F0YWxvZ3MgKGxheWVycykgd2l0aCB0aGUgc2FtZSBvd25lciBvcmdhbmlzYXRpb24gSUQgbGlrZSB0aGVcbiAqIHJlcXVlc3RlcmBgcy4gSWYgc2V0IHRvIGBgaGVyZWBgLCB0aGUgc2VhcmNoIGlzIGZvciBjYXRhbG9ncyAobGF5ZXJzKSB3aXRoIHRoZSBzYW1lIG93bmVyIG9yZ2FuaXNhdGlvbiBJRFxuICogaXMgZXF1YWwgdG8gdGhlIEhlcmUgb3JnYW5pc2F0aW9uLiBJZiBzZXQgdG8gYGBvdGhlcmBgLCB0aGUgc2VhcmNoIGlzIGZvciBjYXRhbG9ncyAobGF5ZXJzKSB3aXRoIGFuIG93bmVyIG9yZ2FuaXNhdGlvblxuICogIElEIG5vdCBlcXVhbCB0byB0aGUgcmVxdWVzdGVyIG9yZ2FuaXNhdGlvbiBhbmQgbm90IGVxdWFsIHRvIEhFUkUgb3JnYW5pc2F0aW9uLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYW4gb3JnYW5pc2F0aW9uLFxuICogdGhlIHNlYXJjaCBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIGxheWVyVHlwZSBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGF5ZXIgdHlwZXMgKHdpdGggT1Igc2VtYW50aWMpIHRvIGxvb2sgZm9yXG4gKiBpbiB0aGUgbGF5ZXIgdHlwZS4gRmlsdGVycyBvbmx5IGNhdGFsb2dzIHRoYXQgY29udGFpbiBsYXllcnMgd2l0aCBsYXllciB0eXBlIHByZXNlbnRlZCBpbiBhIGdpdmVuIGxpc3QuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIGxheWVyXG4gKiAgdHlwZSwgdGhlIHNlYXJjaCBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIHJlZ2lvbiBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVnaW9ucyAod2l0aCBPUiBzZW1hbnRpYykgdG8gbG9vayBmb3JcbiAqICBpbiB0aGUgY2F0YWxvZyByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uLiBGaWx0ZXJzIG9ubHkgY2F0YWxvZ3MgdGhhdCBjb250YWluIHJlZ2lvbiBwcmVzZW50ZWQgaW4gZ2l2ZW4gbGlzdC5cbiAqIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHJlZ2lvbiwgdGhlIHNlYXJjaCBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIHNjaGVtYUhybiBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gRmlsdGVycyBvbmx5IGNhdGFsb2dzIChsYXllcnMpIGJ5IHRoZSBzcGVjaWZpZWQgbGF5ZXIgc2NoZW1hIEhSTi5cbiAqIFlvdSBjYW4gb25seSBmaWx0ZXIgYnkgbGF5ZXIgc2NoZW1hLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBzY2hlbWEsIHRoZSBzZWFyY2ggaXMgdW5maWx0ZXJlZC5cbiAqIEBwYXJhbSByZXNvdXJjZVR5cGUgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIFNwZWNpZmllcyBvdGhlciBmaWx0ZXJzIGJlaGF2aW9yLiBJZiBzZXQgdG8gYGNhdGFsb2dgLFxuICogdGhpcyBhcHBsaWVzIG90aGVyIGZpbHRlcnMgdG8gc2VhcmNoIGNhdGFsb2dzIChhbmQgbGF5ZXJzIGluc2lkZSkuIElmIHNldCB0byBgbGF5ZXJgLCB0aGlzIGFwcGxpZXMgb3RoZXIgZmlsdGVycyB0byBzZWFyY2ggbGF5ZXJzLlxuICogVGhlIHJldHVybmVkIGpzb24gc3RydWN0dXJlIGlzIHRoZSBzYW1lIGZvciBib3RoIGNhc2VzIChsaXN0IG9mIGNhdGFsb2dzIHdpdGggbGlzdCBvZiBsYXllcnMgaW5zaWRlIGVhY2ggY2F0YWxvZykuXG4gKiBAcGFyYW0gY292ZXJhZ2UgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvdW50cmllcyAod2l0aCBPUiBzZW1hbnRpYykgdG8gbG9vayBmb3JcbiAqIGluIHRoZSBjYXRhbG9nIChsYXllcikgY292ZXJhZ2UuIE9ubHkgY2F0YWxvZ3MgKGxheWVycykgY292ZXJpbmcgc3BlY2lmaWVkIGNvdW50cmllcyB3aWxsIGJlIHJldHVybmVkLiBUaGlzIGZpbGVkIGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgY292ZXJhZ2UsIHRoZSBzZWFyY2ggaW5jbHVkZXMgYWxsIGNvdW50cmllcy5cbiAqIEBwYXJhbSBhY2Nlc3MgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFjY2VzcyB0eXBlcyAod2l0aCBPUiBzZW1hbnRpYylcbiAqIHRvIGZpbHRlciByZXN1bHQuIElmIHNldCB0byBgZGVmYXVsdGAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBjYXRhbG9ncyB0aGUgdXNlciBoYXMgcmVhZCBvciBtYW5hZ2UgYWNjZXNzIHRvLiBJZiBzZXQgdG8gYGNyZWF0ZWAsXG4gKiB0aGUgcmVzcG9uc2UgaW5jbHVkZXMgY2F0YWxvZ3MgdGhlIHVzZXIgaGFzIGNyZWF0ZWQgYW5kIHdoaWNoIG1hdGNoIHRoZSBgb3duZXIuY3JlYXRvcmAgZmllbGQsIGlmIHNldCB0byBgbWFuYWdlYCxcbiAqIHRoZSByZXNwb25zZSBpbmNsdWRlcyBjYXRhbG9ncyB0aGUgdXNlciBoYXMgbWFuYWdlIGFjY2VzcyB0by4gSWYgc2V0IHRvIGBvcmdBZG1pbmAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBjYXRhbG9ncyB0aGUgYE9yZ0FkbWluYFxuICogdXNlciBoYXZlIGFjY2VzcyB0by5cbiAqIEBwYXJhbSBtYXJrZXRwbGFjZVJlYWR5IEluZGljYXRlcyBpZiB0aGUgcmVzcG9uc2Ugc2hvdWxkIGNvbnRhaW4gb25seSBNYXJrZXRwbGFjZS1yZWFkeSBjYXRhbG9ncy4gSWYgdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLFxuICogdGhlIHNlcnZpY2Ugd2lsbCByZXR1cm4gb25seSBjYXRhbG9ncyB3aXRoIHRoZSBgbWFya2V0cGxhY2VSZWFkeWAgZWxlbWVudCBzZXQgdG8gdHJ1ZS5cbiAqIEBwYXJhbSBsaW1pdCBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gV2hlbiBzcGVjaWZpZWQsIHJlc3VsdCBlbGVtZW50IGNvdW50IHdpbGwgYmUgbGltaXRlZCB0byB0aGlzIHZhbHVlLlxuICogTWluaW11bTogMS5cbiAqIEBwYXJhbSBzb3J0QnkgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIFNwZWNpZmllcyBzb3J0IGZpZWxkLiBJZiBzZXQgdG8gYG5hbWVgLCB0aGUgcmVzcG9uc2UgY29udGFpbnMgY2F0YWxvZ3NcbiAqIHNvcnRlZCBieSBjYXRhbG9nIG5hbWUuIElmIHNldCB0byBgY3JlYXRlZGAsIHRoZSB0aGUgcmVzcG9uc2UgY29udGFpbnMgY2F0YWxvZ3Mgc29ydGVkYnkgY2F0YWxvZyBjcmVhdGUgdGltZS4gTGF5ZXJzIGluc2lkZSBhIGNhdGFsb2dcbiAqIGFyZSBhbHdheXMgc29ydGVkIGJ5IGxheWVyIG5hbWUuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIGBzb3J0QnlgLCB0aGUgcmVzcG9uc2UgY29udGFpbnMgY2F0YWxvZ3Mgc29ydGVkIGJ5IGBuYW1lYC5cbiAqIEBwYXJhbSBzb3J0T3JkZXIgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIFNwZWNpZmllcyB0aGUgc29ydCBvcmRlci4gSWYgc2V0IHRvIGBhc2NgLFxuICogdGhlIHNvcnQgb3JkZXIgaXMgYXNjZW5kaW5nLiBJZiBzZXQgdG8gYGRlc2NgLCB0aGUgc29ydCBvcmRlciBpcyBkZXNjZW5kaW5nLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYHNvcnRPcmRlcmAsXG4gKiB0aGUgc29ydCBvcmRlciBpcyBhc2NlbmRpbmcuXG4gKiBAcGFyYW0gbGlua2FibGUgSW5kaWNhdGVzIGlmIHRoZSByZXNwb25zZSBzaG91bGQgb25seSByZXR1cm4gdGhlIGxpc3Qgb2YgbGlua2FibGUgY2F0YWxvZ3MuICBOb3RlOiAtIElmIHNldCB0b1xuICogYHRydWVgIGFuZCB0aGUgYWNjZXNzIHRva2VuIGhhcyBhIHByb2plY3Qgc2NvcGUsIHRoZW4gdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSB0aGUgY2F0YWxvZ3NcbiAqIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIGxpbmsgdG8gdGhlIHByb2plY3QgaW4gdGhlIHRva2VuYHMgcHJvamVjdCBzY29wZSBhbmQgSEVSRSBwdWJsaWMgY2F0YWxvZ3MuXG4gKiAtIElmIHNldCB0byBgdHJ1ZWAgYW5kIHRoZSBhY2Nlc3MgdG9rZW4gaGFzIG5vIHNjb3BlLCB0aGVuIHRoZSByZXNwb25zZSB3aWxsIGluY2x1ZGUgYWxsIEhFUkUgcHVibGljIGNhdGFsb2dzIG9ubHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENhdGFsb2dzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9jYXRhbG9nc1wiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ2ZXJib3NlXCIsIHBhcmFtc1tcInZlcmJvc2VcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJxXCIsIHBhcmFtc1tcInFcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJvcmdhbmlzYXRpb25cIiwgcGFyYW1zW1wib3JnYW5pc2F0aW9uXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwib3JnYW5pc2F0aW9uVHlwZVwiLCBwYXJhbXNbXCJvcmdhbmlzYXRpb25UeXBlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGF5ZXJUeXBlXCIsIHBhcmFtc1tcImxheWVyVHlwZVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlZ2lvblwiLCBwYXJhbXNbXCJyZWdpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzY2hlbWFIcm5cIiwgcGFyYW1zW1wic2NoZW1hSHJuXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVzb3VyY2VUeXBlXCIsIHBhcmFtc1tcInJlc291cmNlVHlwZVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdmVyYWdlXCIsIHBhcmFtc1tcImNvdmVyYWdlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWNjZXNzXCIsIHBhcmFtc1tcImFjY2Vzc1wiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm1hcmtldHBsYWNlUmVhZHlcIiwgcGFyYW1zW1wibWFya2V0cGxhY2VSZWFkeVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic29ydEJ5XCIsIHBhcmFtc1tcInNvcnRCeVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNvcnRPcmRlclwiLCBwYXJhbXNbXCJzb3J0T3JkZXJcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW5rYWJsZVwiLCBwYXJhbXNbXCJsaW5rYWJsZVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTW9kaWZ5IHNvbWUgZmllbGRzIG9mIHRoZSBjYXRhbG9nLiBUaGUgZXhpc3RpbmcgSFRUUCBQVVQgbWV0aG9kIG9ubHkgYWxsb3dzIGEgY29tcGxldGUgcmVwbGFjZW1lbnQgb2YgYSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24sXG4gKiBIVFRQIFBBVENIIG1ldGhvZCBpcyB1c2VkIHRvIG1vZGlmeSBzb21lIGZpZWxkcyBvZiBleGlzdGluZyBjYXRhbG9nIGNvbmZpZ3VyYXRpb24uIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLlxuICogU3BlY2lmeSBmaWVsZCB2YWx1ZSB0byBtb2RpZnkgaXQsIG5vdCBzcGVjaWZpZWQgZmllbGRzIGFyZSBpZ25vcmVkLiBUbyByZW1vdmUgdGhlIGZpZWxkIHZhbHVlIHVzZSB0aGUgbnVsbCB2YWx1ZS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgUkZDIDczOTYgLSBKU09OIE1lcmdlIFBhdGNoLlxuICpcbiAqIEBzdW1tYXJ5IE1vZGlmeSBhIGNhdGFsb2dcbiAqIEBwYXJhbSBib2R5IEEgY2F0YWxvZyBvYmplY3QgdGhhdCBjb250YWlucyBtb2RpZmljYXRpb24gb2YgY2F0YWxvZyBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBhdGNoQ2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIE1vZGlmeSBzb21lIGZpZWxkcyBvZiB0aGUgY2F0YWxvZyBsYXllci4gSFRUUCBQQVRDSCBtZXRob2QgaXMgdXNlZCB0byBtb2RpZnkgc29tZSBmaWVsZHMgb2YgZXhpc3RpbmcgbGF5ZXIgY29uZmlndXJhdGlvbi5cbiAqIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTcGVjaWZ5IGZpZWxkIHZhbHVlIHRvIG1vZGlmeSBpdCwgbm90IHNwZWNpZmllZCBmaWVsZHMgYXJlIGlnbm9yZWQuIFRvIHJlbW92ZSB0aGUgZmllbGQgdmFsdWUgdXNlIHRoZSBudWxsXG4gKiB2YWx1ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIFJGQyA3Mzk2IC0gSlNPTiBNZXJnZSBQYXRjaC5cbiAqXG4gKiBAc3VtbWFyeSBNb2RpZnkgYSBjYXRhbG9nIGxheWVyXG4gKiBAcGFyYW0gYm9keSBBIGxheWVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIG1vZGlmaWNhdGlvbiBvZiBsYXllciBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgbGF5ZXIgSURcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGF0Y2hMYXllcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59L2xheWVycy97bGF5ZXJJZH1cIlxuICAgICAgICAucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogVXBkYXRlcyBhbnkgZGVzY3JpcHRpdmUgYW5kIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gaW4gdGhlIGNhdGFsb2cuIFRvIHVwZGF0ZSBhIGNhdGFsb2csIHNlbmQgYSBuZXcgdmVyc2lvbiBvZiB5b3VyIGNhdGFsb2dcbiAqIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgdXBkYXRlZCBkYXRhIGFuZCBhbnkgcmVxdWlyZWQgZmllbGRzLlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZXMgYSBjYXRhbG9nXG4gKiBAcGFyYW0gYm9keSBBIGNhdGFsb2cgb2JqZWN0IHRoYXQgY29udGFpbnMgbWV0YWRhdGEgYW5kIGxheWVyIGRlZmluaXRpb25zLlxuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZ1xuICogQHBhcmFtIGJpbGxpbmdUYWcgVGhlIGBiaWxsaW5nVGFnYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXREYXRhQ292ZXJhZ2VBZG1pbkFyZWFzID0gZ2V0RGF0YUNvdmVyYWdlQWRtaW5BcmVhcztcbmV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlU2l6ZU1hcCA9IGdldERhdGFDb3ZlcmFnZVNpemVNYXA7XG5leHBvcnRzLmdldERhdGFDb3ZlcmFnZVN1bW1hcnkgPSBnZXREYXRhQ292ZXJhZ2VTdW1tYXJ5O1xuZXhwb3J0cy5nZXREYXRhQ292ZXJhZ2VUaWxlID0gZ2V0RGF0YUNvdmVyYWdlVGlsZTtcbmV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlVGltZU1hcCA9IGdldERhdGFDb3ZlcmFnZVRpbWVNYXA7XG4vKipcbiAqIFN0YXRpc3RpY3MgQVBJXG4gKiBBUEkgdG8gcmV0cmlldmUgc3RhdGlzdGljcyBmb3IgdGhlIGRhdGEgY292ZXJhZ2Ugb2YgdGhlIEhFUkUgcGxhdGZvcm0gY2F0YWxvZ3MuXG4gKiAgSXQgc2hvd3Mgd2hlcmUgZGF0YSBleGlzdHMsIGZyZXNobmVzcyBvZiB0aGUgZGF0YSBhbmQgb3RoZXIgc3RhdGlzdGljc1xuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAyLjAuMFxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRGF0YUNvdmVyYWdlQ29yZUFQSXNBcGlcbiAqL1xuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIEFkbWluIEFyZWFzIHNob3dpbmcgRGF0YUNvdmVyYWdlIGluIHdvcmxkIGZvciBwcm92aWRlZCBsYXllciBJZCBhbmQgdmVyc2lvblxuICogQHBhcmFtIGxheWVySWQgVW5pcXVlIExheWVyIElkZW50aWZpZXJcbiAqIEBwYXJhbSBkYXRhbGV2ZWwgVGlsZSBsZXZlbC4gQ3VycmVudGx5LCBzaG91bGQgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGxldmVsIDExXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldERhdGFDb3ZlcmFnZUFkbWluQXJlYXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vYWRtaW5hcmVhc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZGF0YWxldmVsXCIsIHBhcmFtc1tcImRhdGFsZXZlbFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICpcbiAqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZSBTaXplTWFwIGRhdGEgc2hvd2luZyBEYXRhQ292ZXJhZ2UgaW4gd29ybGQgZm9yIHByb3ZpZGVkXG4gKiBsYXllciBpZCBhbmQgdmVyc2lvbi4gQVBJIHNob3dzIGhlYXRtYXAgYmFzZWQgb24gdGhlIHBhcnRpdGlvbiBzaXplXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgTGF5ZXIgSWRlbnRpZmllclxuICogQHBhcmFtIGRhdGFsZXZlbCBUaWxlIGxldmVsLiBDdXJyZW50bHksIHNob3VsZCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gbGV2ZWwgMTFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RGF0YUNvdmVyYWdlU2l6ZU1hcChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9oZWF0bWFwL3NpemVcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImRhdGFsZXZlbFwiLCBwYXJhbXNbXCJkYXRhbGV2ZWxcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIExheWVyIHNpemUgZGF0YSBmb3IgcHJvdmlkZWQgbGF5ZXIgaWQgYW5kIHZlcnNpb25cbiAqIEBwYXJhbSBsYXllcklkIFVuaXF1ZSBMYXllciBJZGVudGlmaWVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldERhdGFDb3ZlcmFnZVN1bW1hcnkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc3VtbWFyeVwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIEJpdE1hcCBzaG93aW5nIERhdGFDb3ZlcmFnZSBpbiB3b3JsZCBmb3IgcHJvdmlkZWQgbGF5ZXIgaWQgYW5kIHZlcnNpb24uXG4gKiBBUEkgc2hvd3MgZGF0YSBjb3ZlcmFnZSBieSBwYXJ0aXRpb25zLCBzbyB0aGUgdXNlciBjYW4gc2VlIHdoZXJlIG9uIHRoZSB3b3JsZCBtYXAgdGhlcmUgaXMgYSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIGNhdGFsb2cgbGF5ZXJcbiAqIEBwYXJhbSBsYXllcklkIFVuaXF1ZSBMYXllciBJZGVudGlmaWVyXG4gKiBAcGFyYW0gZGF0YWxldmVsIFRpbGUgbGV2ZWwuIEN1cnJlbnRseSwgc2hvdWxkIGJlIGVxdWFsIG9yIGxlc3MgdGhhbiBsZXZlbCAxMVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXREYXRhQ292ZXJhZ2VUaWxlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3RpbGVtYXBcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImRhdGFsZXZlbFwiLCBwYXJhbXNbXCJkYXRhbGV2ZWxcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIFRpbWVNYXAgc2hvd2luZyBEYXRhQ292ZXJhZ2UgaW4gd29ybGQgZm9yIHByb3ZpZGVkIGxheWVyIGlkIGFuZCB2ZXJzaW9uXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgTGF5ZXIgSWRlbnRpZmllclxuICogQHBhcmFtIGRhdGFsZXZlbCBUaWxlIGxldmVsLiBDdXJyZW50bHksIHNob3VsZCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gbGV2ZWwgMTFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RGF0YUNvdmVyYWdlVGltZU1hcChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9oZWF0bWFwL2FnZVwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZGF0YWxldmVsXCIsIHBhcmFtc1tcImRhdGFsZXZlbFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNhdGFsb2dIUk5cIiwgcGFyYW1zW1wiY2F0YWxvZ0hSTlwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaW5zZXJ0SW5kZXhlcyA9IGluc2VydEluZGV4ZXM7XG5leHBvcnRzLnBlcmZvcm1RdWVyeSA9IHBlcmZvcm1RdWVyeTtcbmV4cG9ydHMucGVyZm9ybVVwZGF0ZSA9IHBlcmZvcm1VcGRhdGU7XG4vKipcbiAqIEluZGV4IEFQSSB2MVxuICogVXNlIHRoZSBgaW5kZXhgIHNlcnZpY2UgdG8gZ2V0IHRoZSBkYXRhIGhhbmRsZXMgb2YgdGhlIHBhcnRpdGlvbnMgdGhhdCBtYXRjaCBhIHF1ZXJ5LlxuICogVGhlbiwgdXNlIHRoZSBkYXRhIGhhbmRsZXMgd2l0aCB0aGUgYGJsb2JgIHNlcnZpY2UgdG8gZ2V0IHRoZSBkYXRhIGZyb20gdGhlIHBhcnRpdGlvbnMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbixcbiAqIHNlZSBbR2V0IERhdGEgZnJvbSBhbiBJbmRleCBMYXllcl0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLXN0b3JlL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLWluZGV4Lmh0bWwpLlxuICogWW91IGNhbiBhbHNvIHVzZSB0aGUgYGluZGV4YCBzZXJ2aWNlIHRvIHB1Ymxpc2ggZGF0YSB0byBhbiBpbmRleCBsYXllci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1B1Ymxpc2ggdG8gYW4gSW5kZXggTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1zdG9yZS9kYXRhX2Rldl9ndWlkZS9yZXN0L3B1Ymxpc2hpbmctZGF0YS1pbmRleC5odG1sKS5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluZGV4QXBpXG4gKi9cbi8qKlxuICogQWRkcyBpbmRleCBkYXRhIGZvciBhIGdpdmVuIGRhdGEgYmxvYiB0byBhbiBpbmRleCBsYXllci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1B1Ymxpc2ggdG8gYW4gSW5kZXggTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1zdG9yZS9kYXRhX2Rldl9ndWlkZS9yZXN0L3B1Ymxpc2hpbmctZGF0YS1pbmRleC5odG1sKS5cbiAqXG4gKiBAc3VtbWFyeSBJbnNlcnRzIGluZGV4IGRhdGEgdG8gYW4gaW5kZXggbGF5ZXJcbiAqIEBwYXJhbSBpbmRleGVzIEFuIGFycmF5IG9mIGluZGV4IGF0dHJpYnV0ZXMgYW5kIHZhbHVlcyB0byBiZSBpbnNlcnRlZC5cbiAqIEBwYXJhbSBsYXllcklEIFRoZSBsYXllciBJRCBvZiB0aGUgaW5kZXggbGF5ZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluc2VydEluZGV4ZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJRH1cIi5yZXBsYWNlKFwie2xheWVySUR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklEXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiaW5kZXhlc1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImluZGV4ZXNcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUXVlcmllcyB0aGUgaW5kZXggbGF5ZXIgZm9yIHRoZSBwYXJ0aXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5LlxuICogUmV0dXJucyBlYWNoIHBhcnRpdGlvbiB0aGF0IG1hdGNoZXMgdGhlIHF1ZXJ5LCBpbmNsdWRpbmcgZWFjaCBwYXJ0aXRpb24ncyBkYXRhIGhhbmRsZSxcbiAqIHdoaWNoIHlvdSB1c2Ugd2l0aCB0aGUgYGJsb2JgIEFQSSB0byByZXRyaWV2ZSBkYXRhIGZvciBlYWNoIHBhcnRpdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBwYXJ0aXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5XG4gKiBAcGFyYW0gbGF5ZXJJRCBUaGUgSUQgb2YgdGhlIGluZGV4IGxheWVyIHlvdSB3YW50IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHF1ZXJ5IEFuIFJTUUwgcXVlcnkgdG8gdXNlIHRvIHJldHJpZXZlIHBhcnRpdGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4gKiBbR2V0IERhdGEgZnJvbSBhbiBJbmRleCBMYXllcl0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLXN0b3JlL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLWluZGV4Lmh0bWwpLlxuICogVGhlIHF1ZXJ5IG11c3QgdXNlIHRoZSBpbmRleGluZyBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhlIGluZGV4IGxheWVyLlxuICogQHBhcmFtIGh1Z2UgU2V0IHRvIHRydWUgZm9yIGh1Z2UgcXVlcnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1RdWVyeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklEfVwiLnJlcGxhY2UoXCJ7bGF5ZXJJRH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySURcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiaHVnZVwiLCBwYXJhbXNbXCJodWdlXCJdID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJxdWVyeVwiLCBwYXJhbXNbXCJxdWVyeVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTW9kaWZpZXMgcGFydGl0aW9ucyBpbiBhbiBpbmRleCBsYXllci5cbiAqXG4gKiBAc3VtbWFyeSBVcGRhdGVzIGluZGV4IGxheWVyIHBhcnRpdGlvbnNcbiAqIEBwYXJhbSBsYXllcklEIFRoZSBsYXllciBJRCBvZiB0aGUgaW5kZXggbGF5ZXIuXG4gKiBAcGFyYW0gcmVxdWVzdCBDb250YWlucyB0aGUgZGF0YSB5b3Ugd2FudCB0byBhZGQgb3IgcmVtb3ZlIGZyb20gdGhlIGluZGV4IGxheWVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1VcGRhdGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJRH1cIi5yZXBsYWNlKFwie2xheWVySUR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklEXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJyZXF1ZXN0XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wicmVxdWVzdFwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIxIEhFUkUgRXVyb3BlIEIuVi4gYW5kIGl0cyBhZmZpbGlhdGUocykuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBjb250YWluIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uXG4gKiBjb250cm9sbGVkIGJ5IEhFUkUgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGVnaXNsYXRpb24uXG4gKiBBbnkgdXNlIGFuZCB1dGlsaXphdGlvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgYW5kXG4gKiBkaXNjbG9zdXJlIHRvIGFueSB0aGlyZCBwYXJ0aWVzIGlzIGNvbmRpdGlvbmFsIHVwb24gaGF2aW5nIGEgc2VwYXJhdGVcbiAqIGFncmVlbWVudCB3aXRoIEhFUkUgZm9yIHRoZSBhY2Nlc3MsIHVzZSwgdXRpbGl6YXRpb24gb3IgZGlzY2xvc3VyZSBvZiB0aGlzXG4gKiBzb2Z0d2FyZS4gSW4gdGhlIGFic2VuY2Ugb2Ygc3VjaCBhZ3JlZW1lbnQsIHRoZSB1c2Ugb2YgdGhlIHNvZnR3YXJlIGlzIG5vdFxuICogYWxsb3dlZC5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRBcGlWZXJzaW9uID0gZ2V0QXBpVmVyc2lvbjtcbmV4cG9ydHMuZ2V0SGVhbHRoID0gZ2V0SGVhbHRoO1xuZXhwb3J0cy5nZXRGZWF0dXJlID0gZ2V0RmVhdHVyZTtcbmV4cG9ydHMuZ2V0RmVhdHVyZXMgPSBnZXRGZWF0dXJlcztcbmV4cG9ydHMuZ2V0RmVhdHVyZXNCeUJCb3ggPSBnZXRGZWF0dXJlc0J5QkJveDtcbmV4cG9ydHMuZ2V0RmVhdHVyZXNCeVNwYXRpYWwgPSBnZXRGZWF0dXJlc0J5U3BhdGlhbDtcbmV4cG9ydHMuZ2V0RmVhdHVyZXNCeVNwYXRpYWxQb3N0ID0gZ2V0RmVhdHVyZXNCeVNwYXRpYWxQb3N0O1xuZXhwb3J0cy5nZXRGZWF0dXJlc0J5VGlsZSA9IGdldEZlYXR1cmVzQnlUaWxlO1xuZXhwb3J0cy5nZXRTdGF0aXN0aWNzID0gZ2V0U3RhdGlzdGljcztcbmV4cG9ydHMuaXRlcmF0ZUZlYXR1cmVzID0gaXRlcmF0ZUZlYXR1cmVzO1xuZXhwb3J0cy5zZWFyY2hGZWF0dXJlcyA9IHNlYXJjaEZlYXR1cmVzO1xuZXhwb3J0cy5kZWxldGVGZWF0dXJlID0gZGVsZXRlRmVhdHVyZTtcbmV4cG9ydHMuZGVsZXRlRmVhdHVyZXMgPSBkZWxldGVGZWF0dXJlcztcbmV4cG9ydHMucGF0Y2hGZWF0dXJlID0gcGF0Y2hGZWF0dXJlO1xuZXhwb3J0cy5wb3N0RmVhdHVyZXMgPSBwb3N0RmVhdHVyZXM7XG5leHBvcnRzLnB1dEZlYXR1cmUgPSBwdXRGZWF0dXJlO1xuZXhwb3J0cy5wdXRGZWF0dXJlcyA9IHB1dEZlYXR1cmVzO1xuLyoqXG4gKiBJbnRlcmFjdGl2ZSBBUEkgdjFcbiAqIEludGVyYWN0aXZlIEFQSSB2MSBpcyBhIFJFU1QgQVBJIGZvciBzaW1wbGUgYWNjZXNzIHRvIGdlbyBkYXRhLlxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjAuMFxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZTphcnJheS10eXBlXG4vLyB0c2xpbnQ6ZGlzYWJsZTogdW5pZmllZC1zaWduYXR1cmVzXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKipcbiAqIFJldHJpZXZlcyBBUEkgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGlWZXJzaW9uKGJ1aWxkZXIpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvdmVyc2lvblwiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFRlc3RzIGJhc2ljIGhlYWx0aCBvZiB0aGUgc2VydmljZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0SGVhbHRoKGJ1aWxkZXIpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvaGVhbHRoXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmZWF0dXJlIHdpdGggdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgZmVhdHVyZSBieSBJRC5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIGZlYXR1cmUgaW4gdGhlIGxheWVyLlxuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb24gQSBsaXN0IG9mIHByb3BlcnRpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZlYXR1cmVzIHJlc3VsdCBsaXN0LlxuICogTXVsdGlwbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGNvbW1hKCwpLlxuICogRXhhbXBsZTogYD9zZWxlY3Rpb249cC5uYW1lLHAuY2FwYWNpdHkscC5jb2xvcmAuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIGB0cnVlYCB0aGUgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlIHdpbGwgaGF2ZSBvbmx5IFgncyBhbmQgWSdzIGFzIGNvb3JkaW5hdGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGZWF0dXJlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzL3tmZWF0dXJlSWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntmZWF0dXJlSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmZWF0dXJlSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2VsZWN0aW9uXCIsIHBhcmFtc1tcInNlbGVjdGlvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0dXJucyBhbGwgb2YgdGhlIGZlYXR1cmVzIGZvdW5kIGZvciB0aGUgcHJvdmlkZWQgbGlzdCBvZiBpZHMuXG4gKiBUaGUgcmVzcG9uc2UgaXMgYWx3YXlzIGEgRmVhdHVyZUNvbGxlY3Rpb24sIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGZlYXR1cmVzIHdpdGggdGhlIHByb3ZpZGVkIGlkcy5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZmVhdHVyZXMgYnkgSUQuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGlkIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdW5pcXVlIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gKiBUaGVzZSBhcmUgdGhlIGFjY2VwdGFibGUgZm9ybWF0cyBmb3IgdGhpcyBmaWVsZDpcbiAqIGBgYFxuICogaWQ9dmFsdWUxLHZhbHVlMlxuICogYGBgXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvbiBBIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmVhdHVyZXMgcmVzdWx0IGxpc3QuXG4gKiBNdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgY29tbWEoLCkuXG4gKiBFeGFtcGxlOiBgP3NlbGVjdGlvbj1wLm5hbWUscC5jYXBhY2l0eSxwLmNvbG9yYC5cbiAqXG4gKiBAcGFyYW0gZm9yY2UyRCBJZiBzZXQgdG8gYHRydWVgIHRoZSBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBoYXZlIG9ubHkgWCdzIGFuZCBZJ3MgYXMgY29vcmRpbmF0ZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZlYXR1cmVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJpZFwiLCBwYXJhbXNbXCJpZFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHVybiB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlIGluc2lkZSBhIGJvdW5kaW5nIGJveCBzdGlwdWxhdGVkIGJ5IGJib3ggcGFyYW1ldGVyLlxuICpcbiAqIEBzdW1tYXJ5IEdldCBmZWF0dXJlcyBieSBib3VuZGluZyBib3guXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGJib3ggQm90aCB3ZXN0LCBzb3V0aCwgZWFzdCBhbmQgbm9ydGggY29vcmRpbmF0ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hLlxuICogRXhhbXBsZTogYGJib3g9MTMuMDgyLDUyLjQxNiwxMy42MjgsNTIuNjI2YCAtIEJvdW5kaW5nIGJveCBvZiBCZXJsaW4uXG4gKlxuICogQHBhcmFtIGNsaXAgSWYgc2V0IHRvIHRydWUgdGhlIGZlYXR1cmVzJyBnZW9tZXRyaWVzIGFyZSBjbGlwcGVkIHRvIHRoZSBnZW9tZXRyeSBvZiB0aGVcbiAqIHRpbGUgb3IgYm91bmRpbmcgYm94LiBEZWZhdWx0IGlzIGZhbHNlLlxuICpcbiAqIEBwYXJhbSBsaW1pdCBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlLiBEZWZhdWx0IGlzIDMwMDAwLiBIYXJkIGxpbWl0IGlzIDEwMDAwMC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIEFkZGl0aW9uYWwgZmVhdHVyZSBmaWx0ZXJzIHdoaWNoIGNvbXBhcmVzIHRoZSBmZWF0dXJlJ3MgcHJvcGVydHkncyB2YWx1ZSB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkXG4gKiBpbiB0aGUgcXVlcnksIHJlc3VsdGluZyBpbiBhIHN1YnNldCBvZiBmZWF0dXJlcy5cbiAqIFRoZSB1c2FnZSBvZiBtdWx0aXBsZSBwcm9wZXJ0eSBuYW1lcyByZXByZXNlbnRzIGFuIEFORCBvcGVyYXRpb24uXG4gKiBUaGUgdXNhZ2Ugb2YgYSBjb21tYSAoLCkgc2VwYXJhdGluZyB0aGUgcHJvcGVydGllcyB2YWx1ZXMsIHJlcHJlc2VudHMgYW4gT1Igb3BlcmF0aW9uLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAnZi4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgd2hpY2ggYXJlIGFkZGVkIGJ5IGRlZmF1bHQgaW4gdGhlIHN0b3JlZCBmZWF0dXJlLlxuICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6ICdmLmlkJywgJ2YuY3JlYXRlZEF0JyBhbmQgJ2YudXBkYXRlZEF0Jy5cbiAqIFByb3BlcnRpZXMgaW5pdGlhdGVkIHdpdGggJ3AuJyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIGluIHRoZSBzdG9yZWQgZmVhdHVyZSB3aGljaCBhcmUgdW5kZXIgdGhlICdwcm9wZXJ0aWVzJyBwcm9wZXJ0eS5cbiAqIFVzZSBpdCBhcyBhIHNob3J0aGFuZCBhY2Nlc3NvciBmb3IgJ3Byb3BlcnRpZXMnIHZhbHVlcy5cbiAqIFRoZSBmb3JtYXQgc2hvdWxkIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBiZWxvd1xuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9cHJvcGVydHlfdmFsdWVfMSZmLnNwZWNpYWxfcHJvcGVydHlfbmFtZV8xPXNwZWNpYWxfcHJvcGVydHlfdmFsdWVfMVxuICogYGBgXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBhYm92ZSBxdWVyeSwgdGhlIEZlYXR1cmVzIHdpbGwgYmUgZmlsdGVyZWQgYnkgJ3Byb3BlcnR5JyBBTkQgJ3NwZWNpYWwgcHJvcGVydHknIGVxdWFscyB0byB0aGVpclxuICogcmVzcGVjdGl2ZSB2YWx1ZXMuXG4gKlxuICogV2hpbGUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGBgYD9wLnByb3BlcnR5X25hbWVfMT12YWx1ZV8xLHZhbHVlXzJgYGBcbiAqIFRoZSByZXN1bHRpbmcgRmVhdHVyZXMgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIGVsZW1lbnRzIGhhdmluZyBgdmFsdWVfMWAgT1IgYHZhbHVlXzJgLlxuICpcbiAqIEFkZGl0aW9uYWxseSB0byB0aGUgb3BlcmF0b3JzIHVzZWQgaW4gdGhlIGV4YW1wbGVzIGFib3ZlLCB0aGUgcXVlcnkgY2FuIGJlIHdyaXR0ZW4sIHdpdGggdGhlIHNhbWUgc2VtYW50aWMsXG4gKiBieSB1c2luZyB0aGUgbG9uZyBvcGVyYXRvcnM6IGBcIj1ndGU9XCIsIFwiPWx0ZT1cIiwgXCI9Z3Q9XCIsIFwiPWx0PVwiIGFuZCBcIj1jcz1cImAuXG4gKlxuICogVGhlIGJlbG93IHF1ZXJpZXMgeWllbGQgdGhlIHNhbWUgcmVzdWx0OlxuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE+PTEwXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9Z3RlPTEwXG4gKiBgYGBcbiAqXG4gKiBUaGUgYXZhaWxhYmxlIG9wZXJhdG9ycyBhcmU6XG4gKiBcIj1cIiAtIGVxdWFsc1xuICogXCIhPVwiIC0gbm90IGVxdWFsc1xuICogXCI+PVwiIG9yIFwiPWd0ZT1cIiAtIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHNcbiAqIFwiPD1cIiBvciBcIj1sdGU9XCIgLSBsZXNzIHRoYW4gb3IgZXF1YWxzXG4gKiBcIj5cIiBvciBcIj1ndD1cIiAtIGdyZWF0ZXIgdGhhblxuICogXCI8XCIgb3IgXCI9bHQ9XCIgLSBsZXNzIHRoYW5cbiAqIFwiQD5cIiBvciBcIj1jcz1cIiAtIGNvbnRhaW5zXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvbiBBIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmVhdHVyZXMgcmVzdWx0IGxpc3QuXG4gKiBNdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgY29tbWEoLCkuXG4gKiBFeGFtcGxlOiBgP3NlbGVjdGlvbj1wLm5hbWUscC5jYXBhY2l0eSxwLmNvbG9yYC5cbiAqXG4gKiBAcGFyYW0gc2tpcENhY2hlIElmIHNldCB0byB0cnVlIHRoZSByZXNwb25zZSBpcyBub3QgcmV0dXJuZWQgZnJvbSBjYWNoZS4gRGVmYXVsdCBpcyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gY2x1c3RlcmluZyBUaGUgY2x1c3RlcmluZyBhbGdvcml0aG0gdG8gYXBwbHkgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSByZXN1bHQuXG4gKiBQcm92aWRpbmcgdGhpcyBxdWVyeSBwYXJhbWV0ZXIgdGhlIGRhdGEgd2lsbCBiZSByZXR1cm5lZCBpbiBhIGNsdXN0ZXJlZCB3YXkuXG4gKiBUaGlzIG1lYW5zIHRoZSBkYXRhIHdvbid0IG5lY2Vzc2FyaWx5IGJlIHJldHVybmVkIGluIGl0cyBvcmlnaW5hbCBzaGFwZSBvciB3aXRoIGl0cyBvcmlnaW5hbCBwcm9wZXJ0aWVzLlxuICogRGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gY2x1c3RlcmluZyBhbGdvcml0aG0gdGhlcmUgY291bGQgYmUgZGlmZmVyZW50IG1hbmRhdG9yeSBhbmQvb3Igb3B0aW9uYWwgcGFyYW1ldGVyc1xuICogdG8gc3BlY2lmeSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsZ29yaXRobS5cbiAqIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gKlxuICogYGhleGJpbmAgLSBUaGUgaGV4YmluIGFsZ29yaXRobSBkaXZpZGVzIHRoZSB3b3JsZCBpbiBoZXhhZ29uYWwgXCJiaW5zXCIgb24gYSBzcGVjaWZpZWQgcmVzb2x1dGlvbi5cbiAqIEVhY2ggaGV4YWdvbiBoYXMgYW4gYWRkcmVzcyBiZWluZyBkZXNjcmliZWQgYnkgdGhlIEgzIGFkZHJlc3Npbmcgc2NoZW1lLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhhdCB0b3BpYyBzZWU6IGh0dHBzOi8vZW5nLnViZXIuY29tL2gzLy5cbiAqXG4gKiBgcXVhZGJpbmAgLSBUaGUgcXVhZGJpbiBhbGdvcml0aG0gdGFrZXMgdGhlIGdlb21ldHJ5IGlucHV0IGZyb20gdGhlIHJlcXVlc3QgKGUuZy4gcXVhZGtleSAvIGJib3guLilcbiAqIGFuZCBjb3VudCB0aGUgZmVhdHVyZXMgaW4gaXQuXG4gKiBUaGlzIGNsdXN0ZXJpbmcgbW9kZSB3b3JrcyBhbHNvIGZvciB2ZXJ5IGxhcmdlIGxheWVycyBhbmQgY2FuIGJlIHVzZWQgZm9yIGdldHRpbmcgYW4gb3ZlcnZpZXdcbiAqIHdoZXJlIGRhdGEgaXMgcHJlc2VudCBpbiBhIGdpdmVuIGxheWVyLiBGdXJ0aGVybW9yZSwgYSBwcm9wZXJ0eSBmaWx0ZXIgb24gb25lIHByb3BlcnR5IGlzIGFwcGxpY2FibGUuXG4gKlxuICogQHBhcmFtIGNsdXN0ZXJpbmdQYXJhbXMgU29tZSBwYXJhbWV0ZXJzIGZvciB0aGUgY2hvc2VuIGNsdXN0ZXJpbmcgYWxnb3JpdGhtLlxuICogRGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gY2x1c3RlcmluZyBhbGdvcml0aG0gdGhlcmUgY291bGQgYmUgZGlmZmVyZW50IG1hbmRhdG9yeSBhbmQvb3Igb3B0aW9uYWwgcGFyYW1ldGVycyB0byBzcGVjaWZ5XG4gKiB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsZ29yaXRobS5cbiAqXG4gKiBDbHVzdGVyaW5nLVBhcmFtZXRlciByZWZlcmVuY2UuXG4gKiBOT1RFOiBUaGUgYWN0dWFsIHF1ZXJ5IHBhcmFtZXRlcnMgaW4gdGhlIFVSTCBhcmUgbG9va2luZyBsaWtlOiBgP2NsdXN0ZXJpbmcuYVBhcmFtZXRlck5hbWU9YVZhbHVlYC5cbiAqXG4gKiBDbHVzdGVyaW5nLXR5cGU6IFwiaGV4YmluXCI6XG4gKiBUaGVyZSBhcmUgc2V2ZXJhbCBwYXJhbWV0ZXJzIG5lZWRlZCBieSB0aGUgSDMgYmFzZWQgaGV4YmluIGFsZ29yaXRobS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoYXQgdG9waWMgc2VlOiBodHRwczovL2VuZy51YmVyLmNvbS9oMy8uXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogfCAgICAgIFBhcmFtZXRlciAgICAgICB8ICAgVHlwZSAgIHwgICBNYW5kYXRvcnkgICB8ICAgICAgICAgICAgICAgICAgICAgIE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiB8ICBhYnNvbHV0ZVJlc29sdXRpb24gIHwgIE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgVGhlIEgzIGhleGFnb24gcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgICAgIHJlc29sdXRpb25cdCAgICAgIHwgIE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgZGVwcmVjYXRlZCwgcmVuYW1lZCB0byBhYnNvbHV0ZVJlc29sdXRpb24gICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgcmVsYXRpdmVSZXNvbHV0aW9uICAgfFx0IE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgaW50ZWdlciB2YWx1ZSBbMC00XSB0byBiZSBhZGRlZCB0byBjdXJyZW50IHVzZWQgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICB8IHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB8ICAgICAgIHByb3BlcnR5XHQgICAgICB8ICBTdHJpbmcgIHwgICAgICAgTk9cdCAgICAgfCBBIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBmZWF0dXJlcyBmb3Igd2hpY2ggdG8gICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgY2FsY3VsYXRlIHN0YXRpc3RpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgICAgICAgcG9pbnRtb2RlXHQgIHwgIEJvb2xlYW4gfCAgICAgICBOT1x0ICAgICB8IHJldHVucyB0aGUgY2VudHJvaWQgb2YgaGV4YWdvbnMgYXMgZ2VvanNvbiBmZWF0dXJlIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICpcbiAqIEBwYXJhbSBmb3JjZTJEIElmIHNldCB0byBgdHJ1ZWAgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RmVhdHVyZXNCeUJCb3goYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vYmJveFwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmJveFwiLCBwYXJhbXNbXCJiYm94XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2xpcFwiLCBwYXJhbXNbXCJjbGlwXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHBhcmFtcy5wYXJhbXM7XG4gICAgaWYgKHNlYXJjaFBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHNlYXJjaFBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkocGFyYW0ua2V5LCBwYXJhbS52YWx1ZSwgcGFyYW0ub3BlcmF0b3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJza2lwQ2FjaGVcIiwgcGFyYW1zW1wic2tpcENhY2hlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2x1c3RlcmluZ1wiLCBwYXJhbXNbXCJjbHVzdGVyaW5nXCJdKTtcbiAgICBpZiAocGFyYW1zW1wiY2x1c3RlcmluZ1BhcmFtc1wiXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNsdXN0ZXJpbmdQYXJhbSBpbiBwYXJhbXNbXCJjbHVzdGVyaW5nUGFyYW1zXCJdKSB7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KGBjbHVzdGVyaW5nLiR7Y2x1c3RlcmluZ1BhcmFtfWAsIHBhcmFtc1tcImNsdXN0ZXJpbmdQYXJhbXNcIl1bY2x1c3RlcmluZ1BhcmFtXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTGlzdCB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlIGluc2lkZSB0aGUgc3BlY2lmaWVkIHJhZGl1cy4gVGhlIG9yaWdpbiByYWRpdXMgcG9pbnQgaXMgY2FsY3VsYXRlZFxuICogYmFzZWQgZWl0aGVyIG9uIGxhdGl0dWRlICYgbG9uZ2l0dWRlIG9yIGJ5IHNwZWNpZnlpbmcgYSBmZWF0dXJlJ3MgZ2VvbWV0cnkuXG4gKlxuICogQHN1bW1hcnkgR2V0IGZlYXR1cmVzIHdpdGggcmFkaXVzIHNlYXJjaC5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gbGF0IFRoZSBsYXRpdHVkZSBpbiBXR1MnODQgZGVjaW1hbCBkZWdyZWUgKC05MCB0byArOTApIG9mIHRoZSBjZW50ZXIgUG9pbnQuXG4gKlxuICogQHBhcmFtIGxuZyBUaGUgbG9uZ2l0dWRlIGluIFdHUyc4NCBkZWNpbWFsIGRlZ3JlZSAoLTE4MCB0byArMTgwKSBvZiB0aGUgY2VudGVyIFBvaW50LlxuICpcbiAqIEBwYXJhbSByZWZDYXRhbG9nSHJuIFRoZSBjYXRhbG9nIEhSTiB3aGVyZSB0aGUgbGF5ZXIgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlIGlzIHN0b3JlZC5cbiAqIEFsd2F5cyB0byB1c2UgaW4gY29tYmluYXRpb24gd2l0aCByZWZGZWF0dXJlSWQuXG4gKlxuICogQHBhcmFtIHJlZkxheWVySWQgQXMgYWx0ZXJuYXRpdmUgZm9yIGRlZmluaW5nIGNlbnRlciBjb29yZGluYXRlcyxcbiAqIGl0IGlzIHBvc3NpYmxlIHRvIHJlZmVyZW5jZSBhIGdlb21ldHJ5IGluIGEgbGF5ZXIuXG4gKiBUaGVyZWZvcmUgaXQgaXMgbmVlZGVkIHRvIHByb3ZpZGUgdGhlIGxheWVyIGlkIHdoZXJlIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUgaXMgc3RvcmVkLlxuICogQWx3YXlzIHRvIHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIHJlZkZlYXR1cmVJZC5cbiAqXG4gKiBAcGFyYW0gcmVmRmVhdHVyZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIGZlYXR1cmUgaW4gdGhlIHJlZmVyZW5jZWQgbGF5ZXIuXG4gKiBUaGUgZ2VvbWV0cnkgb2YgdGhhdCBmZWF0dXJlIGdldHMgdXNlZCBmb3IgdGhlIHNwYXRpYWwgcXVlcnkuXG4gKiBBbHdheXMgdG8gdXNlIGluIGNvbWJpbmF0aW9uIHdpdGggcmVmQ2F0YWxvZ0hybiBhbmQgcmVmTGF5ZXJJZC5cbiAqXG4gKiBAcGFyYW0gcmFkaXVzIFJhZGl1cyBpbiBtZXRlciB3aGljaCBkZWZpbmVzIHRoZSBkaWFtZXRlciBvZiB0aGUgc2VhcmNoIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGxpbWl0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2UuIERlZmF1bHQgaXMgMzAwMDAuIEhhcmQgbGltaXQgaXMgMTAwMDAwLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgQWRkaXRpb25hbCBmZWF0dXJlIGZpbHRlcnMgd2hpY2ggY29tcGFyZXMgdGhlIGZlYXR1cmUncyBwcm9wZXJ0eSdzIHZhbHVlIHdpdGggdGhlIG9uZSBzcGVjaWZpZWRcbiAqIGluIHRoZSBxdWVyeSwgcmVzdWx0aW5nIGluIGEgc3Vic2V0IG9mIGZlYXR1cmVzLlxuICogVGhlIHVzYWdlIG9mIG11bHRpcGxlIHByb3BlcnR5IG5hbWVzIHJlcHJlc2VudHMgYW4gQU5EIG9wZXJhdGlvbi5cbiAqIFRoZSB1c2FnZSBvZiBhIGNvbW1hICgsKSBzZXBhcmF0aW5nIHRoZSBwcm9wZXJ0aWVzIHZhbHVlcywgcmVwcmVzZW50cyBhbiBPUiBvcGVyYXRpb24uXG4gKiBQcm9wZXJ0aWVzIGluaXRpYXRlZCB3aXRoICdmLicgYXJlIHVzZWQgdG8gYWNjZXNzIHZhbHVlcyB3aGljaCBhcmUgYWRkZWQgYnkgZGVmYXVsdCBpbiB0aGUgc3RvcmVkIGZlYXR1cmUuXG4gKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTogJ2YuaWQnLCAnZi5jcmVhdGVkQXQnIGFuZCAnZi51cGRhdGVkQXQnLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAncC4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgaW4gdGhlIHN0b3JlZCBmZWF0dXJlIHdoaWNoIGFyZSB1bmRlciB0aGUgJ3Byb3BlcnRpZXMnIHByb3BlcnR5LlxuICogVXNlIGl0IGFzIGEgc2hvcnRoYW5kIGFjY2Vzc29yIGZvciAncHJvcGVydGllcycgdmFsdWVzLlxuICogVGhlIGZvcm1hdCBzaG91bGQgZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uIGJlbG93XG4gKiBgYGBcbiAqID9wLnByb3BlcnR5X25hbWVfMT1wcm9wZXJ0eV92YWx1ZV8xJmYuc3BlY2lhbF9wcm9wZXJ0eV9uYW1lXzE9c3BlY2lhbF9wcm9wZXJ0eV92YWx1ZV8xXG4gKiBgYGBcbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGFib3ZlIHF1ZXJ5LCB0aGUgRmVhdHVyZXMgd2lsbCBiZSBmaWx0ZXJlZCBieSAncHJvcGVydHknIEFORCAnc3BlY2lhbCBwcm9wZXJ0eScgZXF1YWxzIHRvIHRoZWlyXG4gKiByZXNwZWN0aXZlIHZhbHVlcy5cbiAqXG4gKiBXaGlsZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYGBgP3AucHJvcGVydHlfbmFtZV8xPXZhbHVlXzEsdmFsdWVfMmBgYFxuICogVGhlIHJlc3VsdGluZyBGZWF0dXJlcyBsaXN0IHdpbGwgY29udGFpbiBhbGwgZWxlbWVudHMgaGF2aW5nIGB2YWx1ZV8xYCBPUiBgdmFsdWVfMmAuXG4gKlxuICogQWRkaXRpb25hbGx5IHRvIHRoZSBvcGVyYXRvcnMgdXNlZCBpbiB0aGUgZXhhbXBsZXMgYWJvdmUsIHRoZSBxdWVyeSBjYW4gYmUgd3JpdHRlbiwgd2l0aCB0aGUgc2FtZSBzZW1hbnRpYyxcbiAqIGJ5IHVzaW5nIHRoZSBsb25nIG9wZXJhdG9yczogYFwiPWd0ZT1cIiwgXCI9bHRlPVwiLCBcIj1ndD1cIiwgXCI9bHQ9XCIgYW5kIFwiPWNzPVwiYC5cbiAqXG4gKiBUaGUgYmVsb3cgcXVlcmllcyB5aWVsZCB0aGUgc2FtZSByZXN1bHQ6XG4gKiBgYGBcbiAqID9wLnByb3BlcnR5X25hbWVfMT49MTBcbiAqID9wLnByb3BlcnR5X25hbWVfMT1ndGU9MTBcbiAqIGBgYFxuICpcbiAqIFRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGFyZTpcbiAqIFwiPVwiIC0gZXF1YWxzXG4gKiBcIiE9XCIgLSBub3QgZXF1YWxzXG4gKiBcIj49XCIgb3IgXCI9Z3RlPVwiIC0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsc1xuICogXCI8PVwiIG9yIFwiPWx0ZT1cIiAtIGxlc3MgdGhhbiBvciBlcXVhbHNcbiAqIFwiPlwiIG9yIFwiPWd0PVwiIC0gZ3JlYXRlciB0aGFuXG4gKiBcIjxcIiBvciBcIj1sdD1cIiAtIGxlc3MgdGhhblxuICogXCJAPlwiIG9yIFwiPWNzPVwiIC0gY29udGFpbnNcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmZWF0dXJlcyByZXN1bHQgbGlzdC5cbiAqIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBieSB1c2luZyBjb21tYSgsKS5cbiAqIEV4YW1wbGU6IGA/c2VsZWN0aW9uPXAubmFtZSxwLmNhcGFjaXR5LHAuY29sb3JgLlxuICpcbiAqIEBwYXJhbSBza2lwQ2FjaGUgSWYgc2V0IHRvIHRydWUgdGhlIHJlc3BvbnNlIGlzIG5vdCByZXR1cm5lZCBmcm9tIGNhY2hlLiBEZWZhdWx0IGlzIGZhbHNlLlxuICpcbiAqIEBwYXJhbSBmb3JjZTJEIElmIHNldCB0byBgdHJ1ZWAgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RmVhdHVyZXNCeVNwYXRpYWwoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc3BhdGlhbFwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGF0XCIsIHBhcmFtc1tcImxhdFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxuZ1wiLCBwYXJhbXNbXCJsbmdcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZDYXRhbG9nSHJuXCIsIHBhcmFtc1tcInJlZkNhdGFsb2dIcm5cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZMYXllcklkXCIsIHBhcmFtc1tcInJlZkxheWVySWRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZGZWF0dXJlSWRcIiwgcGFyYW1zW1wicmVmRmVhdHVyZUlkXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmFkaXVzXCIsIHBhcmFtc1tcInJhZGl1c1wiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBwYXJhbXMucGFyYW1zO1xuICAgIGlmIChzZWFyY2hQYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBzZWFyY2hQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KHBhcmFtLmtleSwgcGFyYW0udmFsdWUsIHBhcmFtLm9wZXJhdG9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzZWxlY3Rpb25cIiwgcGFyYW1zW1wic2VsZWN0aW9uXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2tpcENhY2hlXCIsIHBhcmFtc1tcInNraXBDYWNoZVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogTGlzdCB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlIGluc2lkZSB0aGUgc3BlY2lmaWVkIHJhZGl1cy4gVGhlIG9yaWdpbiBwb2ludCBpcyBjYWxjdWxhdGVkIGJhc2VkXG4gKiBvbiB0aGUgZ2VvbWV0cnkgcHJvdmlkZWQgYXMgcGF5bG9hZC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZmVhdHVyZXMgd2hpY2ggaW50ZXJzZWN0cyB0aGUgcHJvdmlkZWQgZ2VvbWV0cnkuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGJvZHkgQSBnZW9tZXRyeSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSByYWRpdXMgUmFkaXVzIGluIG1ldGVyIHdoaWNoIGRlZmluZXMgdGhlIGRpYW1ldGVyIG9mIHRoZSBzZWFyY2ggcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS5cbiAqIERlZmF1bHQgaXMgMzAwMDAuIEhhcmQgbGltaXQgaXMgMTAwMDAwLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgQWRkaXRpb25hbCBmZWF0dXJlIGZpbHRlcnMgd2hpY2ggY29tcGFyZXMgdGhlIGZlYXR1cmUncyBwcm9wZXJ0eSdzIHZhbHVlIHdpdGggdGhlIG9uZSBzcGVjaWZpZWRcbiAqIGluIHRoZSBxdWVyeSwgcmVzdWx0aW5nIGluIGEgc3Vic2V0IG9mIGZlYXR1cmVzLlxuICogVGhlIHVzYWdlIG9mIG11bHRpcGxlIHByb3BlcnR5IG5hbWVzIHJlcHJlc2VudHMgYW4gQU5EIG9wZXJhdGlvbi5cbiAqIFRoZSB1c2FnZSBvZiBhIGNvbW1hICgsKSBzZXBhcmF0aW5nIHRoZSBwcm9wZXJ0aWVzIHZhbHVlcywgcmVwcmVzZW50cyBhbiBPUiBvcGVyYXRpb24uXG4gKiBQcm9wZXJ0aWVzIGluaXRpYXRlZCB3aXRoICdmLicgYXJlIHVzZWQgdG8gYWNjZXNzIHZhbHVlcyB3aGljaCBhcmUgYWRkZWQgYnkgZGVmYXVsdCBpbiB0aGUgc3RvcmVkIGZlYXR1cmUuXG4gKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTogJ2YuaWQnLCAnZi5jcmVhdGVkQXQnIGFuZCAnZi51cGRhdGVkQXQnLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAncC4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgaW4gdGhlIHN0b3JlZCBmZWF0dXJlIHdoaWNoIGFyZSB1bmRlciB0aGUgJ3Byb3BlcnRpZXMnIHByb3BlcnR5LlxuICogVXNlIGl0IGFzIGEgc2hvcnRoYW5kIGFjY2Vzc29yIGZvciAncHJvcGVydGllcycgdmFsdWVzLlxuICogVGhlIGZvcm1hdCBzaG91bGQgZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uIGJlbG93XG4gKiBgYGBcbiAqID9wLnByb3BlcnR5X25hbWVfMT1wcm9wZXJ0eV92YWx1ZV8xJmYuc3BlY2lhbF9wcm9wZXJ0eV9uYW1lXzE9c3BlY2lhbF9wcm9wZXJ0eV92YWx1ZV8xXG4gKiBgYGBcbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGFib3ZlIHF1ZXJ5LCB0aGUgRmVhdHVyZXMgd2lsbCBiZSBmaWx0ZXJlZCBieSAncHJvcGVydHknIEFORCAnc3BlY2lhbCBwcm9wZXJ0eScgZXF1YWxzIHRvIHRoZWlyXG4gKiByZXNwZWN0aXZlIHZhbHVlcy5cbiAqXG4gKiBXaGlsZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYGBgP3AucHJvcGVydHlfbmFtZV8xPXZhbHVlXzEsdmFsdWVfMmBgYFxuICogVGhlIHJlc3VsdGluZyBGZWF0dXJlcyBsaXN0IHdpbGwgY29udGFpbiBhbGwgZWxlbWVudHMgaGF2aW5nIGB2YWx1ZV8xYCBPUiBgdmFsdWVfMmAuXG4gKlxuICogQWRkaXRpb25hbGx5IHRvIHRoZSBvcGVyYXRvcnMgdXNlZCBpbiB0aGUgZXhhbXBsZXMgYWJvdmUsIHRoZSBxdWVyeSBjYW4gYmUgd3JpdHRlbiwgd2l0aCB0aGUgc2FtZSBzZW1hbnRpYyxcbiAqIGJ5IHVzaW5nIHRoZSBsb25nIG9wZXJhdG9yczogYFwiPWd0ZT1cIiwgXCI9bHRlPVwiLCBcIj1ndD1cIiwgXCI9bHQ9XCIgYW5kIFwiPWNzPVwiYC5cbiAqXG4gKiBUaGUgYmVsb3cgcXVlcmllcyB5aWVsZCB0aGUgc2FtZSByZXN1bHQ6XG4gKiBgYGBcbiAqID9wLnByb3BlcnR5X25hbWVfMT49MTBcbiAqID9wLnByb3BlcnR5X25hbWVfMT1ndGU9MTBcbiAqIGBgYFxuICpcbiAqIFRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGFyZTpcbiAqIFwiPVwiIC0gZXF1YWxzXG4gKiBcIiE9XCIgLSBub3QgZXF1YWxzXG4gKiBcIj49XCIgb3IgXCI9Z3RlPVwiIC0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsc1xuICogXCI8PVwiIG9yIFwiPWx0ZT1cIiAtIGxlc3MgdGhhbiBvciBlcXVhbHNcbiAqIFwiPlwiIG9yIFwiPWd0PVwiIC0gZ3JlYXRlciB0aGFuXG4gKiBcIjxcIiBvciBcIj1sdD1cIiAtIGxlc3MgdGhhblxuICogXCJAPlwiIG9yIFwiPWNzPVwiIC0gY29udGFpbnNcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmZWF0dXJlcyByZXN1bHQgbGlzdC5cbiAqIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBieSB1c2luZyBjb21tYSgsKS5cbiAqIEV4YW1wbGU6IGA/c2VsZWN0aW9uPXAubmFtZSxwLmNhcGFjaXR5LHAuY29sb3JgLlxuICpcbiAqIEBwYXJhbSBza2lwQ2FjaGUgSWYgc2V0IHRvIHRydWUgdGhlIHJlc3BvbnNlIGlzIG5vdCByZXR1cm5lZCBmcm9tIGNhY2hlLiBEZWZhdWx0IGlzIGZhbHNlLlxuICpcbiAqIEBwYXJhbSBmb3JjZTJEIElmIHNldCB0byBgdHJ1ZWAgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RmVhdHVyZXNCeVNwYXRpYWxQb3N0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3NwYXRpYWxcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJhZGl1c1wiLCBwYXJhbXNbXCJyYWRpdXNcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gcGFyYW1zLnBhcmFtcztcbiAgICBpZiAoc2VhcmNoUGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgc2VhcmNoUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShwYXJhbS5rZXksIHBhcmFtLnZhbHVlLCBwYXJhbS5vcGVyYXRvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2VsZWN0aW9uXCIsIHBhcmFtc1tcInNlbGVjdGlvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNraXBDYWNoZVwiLCBwYXJhbXNbXCJza2lwQ2FjaGVcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0IGZlYXR1cmVzIGluIHRpbGVcbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gdGlsZVR5cGUgVGhlIHR5cGUgb2YgdGlsZSBpZGVudGlmaWVyLlxuICogRGVmYXVsdDogXCJxdWFka2V5XCIuXG4gKiBFbnVtOiBcInF1YWRrZXlcIiBcIndlYlwiIFwidG1zXCIgXCJoZXJlXCIuXG4gKiBcInF1YWRrZXlcIiAtIFZpcnR1YWwgRWFydGgsXG4gKiBcIndlYlwiIC0gV2ViIE1lcmNhdG9yLFxuICogXCJ0bXNcIiAtIE9TR0VPIFRpbGUgTWFwIFNlcnZpY2UsXG4gKiBcImhlcmVcIiAtIEhlcmUgVGlsZSBTY2hlbWEuXG4gKlxuICogQHBhcmFtIHRpbGVJZCBUaGUgdGlsZSBpZGVudGlmaWVyIGNhbiBiZSBwcm92aWRlZCBhcyBxdWFka2V5ICgxKSxcbiAqIFdlYiBNZXJjYXRvciBsZXZlbCx4LHkgY29vcmRpbmF0ZXMgKDFfMV8wKSBvciBPU0dFTyBUaWxlIE1hcCBTZXJ2aWNlIGxldmVsLHgseSAoMV8xXzApLlxuICpcbiAqIEBwYXJhbSBjbGlwIElmIHNldCB0byB0cnVlIHRoZSBmZWF0dXJlcycgZ2VvbWV0cmllcyBhcmUgY2xpcHBlZCB0byB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRpbGUgb3IgYm91bmRpbmcgYm94LlxuICogRGVmYXVsdCBpcyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIEFkZGl0aW9uYWwgZmVhdHVyZSBmaWx0ZXJzIHdoaWNoIGNvbXBhcmVzIHRoZSBmZWF0dXJlJ3MgcHJvcGVydHkncyB2YWx1ZSB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkXG4gKiBpbiB0aGUgcXVlcnksIHJlc3VsdGluZyBpbiBhIHN1YnNldCBvZiBmZWF0dXJlcy5cbiAqIFRoZSB1c2FnZSBvZiBtdWx0aXBsZSBwcm9wZXJ0eSBuYW1lcyByZXByZXNlbnRzIGFuIEFORCBvcGVyYXRpb24uXG4gKiBUaGUgdXNhZ2Ugb2YgYSBjb21tYSAoLCkgc2VwYXJhdGluZyB0aGUgcHJvcGVydGllcyB2YWx1ZXMsIHJlcHJlc2VudHMgYW4gT1Igb3BlcmF0aW9uLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAnZi4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgd2hpY2ggYXJlIGFkZGVkIGJ5IGRlZmF1bHQgaW4gdGhlIHN0b3JlZCBmZWF0dXJlLlxuICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6ICdmLmlkJywgJ2YuY3JlYXRlZEF0JyBhbmQgJ2YudXBkYXRlZEF0Jy5cbiAqIFByb3BlcnRpZXMgaW5pdGlhdGVkIHdpdGggJ3AuJyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIGluIHRoZSBzdG9yZWQgZmVhdHVyZSB3aGljaCBhcmUgdW5kZXIgdGhlICdwcm9wZXJ0aWVzJyBwcm9wZXJ0eS5cbiAqIFVzZSBpdCBhcyBhIHNob3J0aGFuZCBhY2Nlc3NvciBmb3IgJ3Byb3BlcnRpZXMnIHZhbHVlcy5cbiAqIFRoZSBmb3JtYXQgc2hvdWxkIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBiZWxvd1xuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9cHJvcGVydHlfdmFsdWVfMSZmLnNwZWNpYWxfcHJvcGVydHlfbmFtZV8xPXNwZWNpYWxfcHJvcGVydHlfdmFsdWVfMVxuICogYGBgXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBhYm92ZSBxdWVyeSwgdGhlIEZlYXR1cmVzIHdpbGwgYmUgZmlsdGVyZWQgYnkgJ3Byb3BlcnR5JyBBTkQgJ3NwZWNpYWwgcHJvcGVydHknIGVxdWFscyB0byB0aGVpclxuICogcmVzcGVjdGl2ZSB2YWx1ZXMuXG4gKlxuICogV2hpbGUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGBgYD9wLnByb3BlcnR5X25hbWVfMT12YWx1ZV8xLHZhbHVlXzJgYGBcbiAqIFRoZSByZXN1bHRpbmcgRmVhdHVyZXMgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIGVsZW1lbnRzIGhhdmluZyBgdmFsdWVfMWAgT1IgYHZhbHVlXzJgLlxuICpcbiAqIEFkZGl0aW9uYWxseSB0byB0aGUgb3BlcmF0b3JzIHVzZWQgaW4gdGhlIGV4YW1wbGVzIGFib3ZlLCB0aGUgcXVlcnkgY2FuIGJlIHdyaXR0ZW4sIHdpdGggdGhlIHNhbWUgc2VtYW50aWMsXG4gKiBieSB1c2luZyB0aGUgbG9uZyBvcGVyYXRvcnM6IGBcIj1ndGU9XCIsIFwiPWx0ZT1cIiwgXCI9Z3Q9XCIsIFwiPWx0PVwiIGFuZCBcIj1jcz1cImAuXG4gKlxuICogVGhlIGJlbG93IHF1ZXJpZXMgeWllbGQgdGhlIHNhbWUgcmVzdWx0OlxuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE+PTEwXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9Z3RlPTEwXG4gKiBgYGBcbiAqXG4gKiBUaGUgYXZhaWxhYmxlIG9wZXJhdG9ycyBhcmU6XG4gKiBcIj1cIiAtIGVxdWFsc1xuICogXCIhPVwiIC0gbm90IGVxdWFsc1xuICogXCI+PVwiIG9yIFwiPWd0ZT1cIiAtIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHNcbiAqIFwiPD1cIiBvciBcIj1sdGU9XCIgLSBsZXNzIHRoYW4gb3IgZXF1YWxzXG4gKiBcIj5cIiBvciBcIj1ndD1cIiAtIGdyZWF0ZXIgdGhhblxuICogXCI8XCIgb3IgXCI9bHQ9XCIgLSBsZXNzIHRoYW5cbiAqIFwiQD5cIiBvciBcIj1jcz1cIiAtIGNvbnRhaW5zXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvbiBBIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmVhdHVyZXMgcmVzdWx0IGxpc3QuXG4gKiBNdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgY29tbWEoLCkuXG4gKiBFeGFtcGxlOiBgP3NlbGVjdGlvbj1wLm5hbWUscC5jYXBhY2l0eSxwLmNvbG9yYC5cbiAqXG4gKiBAcGFyYW0gc2tpcENhY2hlIElmIHNldCB0byB0cnVlIHRoZSByZXNwb25zZSBpcyBub3QgcmV0dXJuZWQgZnJvbSBjYWNoZS4gRGVmYXVsdCBpcyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gY2x1c3RlcmluZyBUaGUgY2x1c3RlcmluZyBhbGdvcml0aG0gdG8gYXBwbHkgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSByZXN1bHQuXG4gKiBQcm92aWRpbmcgdGhpcyBxdWVyeSBwYXJhbWV0ZXIgdGhlIGRhdGEgd2lsbCBiZSByZXR1cm5lZCBpbiBhIGNsdXN0ZXJlZCB3YXkuXG4gKiBUaGlzIG1lYW5zIHRoZSBkYXRhIHdvbid0IG5lY2Vzc2FyaWx5IGJlIHJldHVybmVkIGluIGl0cyBvcmlnaW5hbCBzaGFwZSBvciB3aXRoIGl0cyBvcmlnaW5hbCBwcm9wZXJ0aWVzLlxuICogRGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gY2x1c3RlcmluZyBhbGdvcml0aG0gdGhlcmUgY291bGQgYmUgZGlmZmVyZW50IG1hbmRhdG9yeSBhbmQvb3Igb3B0aW9uYWwgcGFyYW1ldGVyc1xuICogdG8gc3BlY2lmeSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsZ29yaXRobS5cbiAqIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gKlxuICogYGhleGJpbmAgLSBUaGUgaGV4YmluIGFsZ29yaXRobSBkaXZpZGVzIHRoZSB3b3JsZCBpbiBoZXhhZ29uYWwgXCJiaW5zXCIgb24gYSBzcGVjaWZpZWQgcmVzb2x1dGlvbi5cbiAqIEVhY2ggaGV4YWdvbiBoYXMgYW4gYWRkcmVzcyBiZWluZyBkZXNjcmliZWQgYnkgdGhlIEgzIGFkZHJlc3Npbmcgc2NoZW1lLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhhdCB0b3BpYyBzZWU6IGh0dHBzOi8vZW5nLnViZXIuY29tL2gzLy5cbiAqXG4gKiBgcXVhZGJpbmAgLSBUaGUgcXVhZGJpbiBhbGdvcml0aG0gdGFrZXMgdGhlIGdlb21ldHJ5IGlucHV0IGZyb20gdGhlIHJlcXVlc3QgKGUuZy4gcXVhZGtleSAvIGJib3guLilcbiAqIGFuZCBjb3VudCB0aGUgZmVhdHVyZXMgaW4gaXQuXG4gKiBUaGlzIGNsdXN0ZXJpbmcgbW9kZSB3b3JrcyBhbHNvIGZvciB2ZXJ5IGxhcmdlIGxheWVycyBhbmQgY2FuIGJlIHVzZWQgZm9yIGdldHRpbmcgYW4gb3ZlcnZpZXdcbiAqIHdoZXJlIGRhdGEgaXMgcHJlc2VudCBpbiBhIGdpdmVuIGxheWVyLiBGdXJ0aGVybW9yZSwgYSBwcm9wZXJ0eSBmaWx0ZXIgb24gb25lIHByb3BlcnR5IGlzIGFwcGxpY2FibGUuXG4gKlxuICogQHBhcmFtIGNsdXN0ZXJpbmdQYXJhbXMgU29tZSBwYXJhbWV0ZXJzIGZvciB0aGUgY2hvc2VuIGNsdXN0ZXJpbmcgYWxnb3JpdGhtLlxuICogRGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gY2x1c3RlcmluZyBhbGdvcml0aG0gdGhlcmUgY291bGQgYmUgZGlmZmVyZW50IG1hbmRhdG9yeSBhbmQvb3Igb3B0aW9uYWwgcGFyYW1ldGVycyB0byBzcGVjaWZ5XG4gKiB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsZ29yaXRobS5cbiAqXG4gKiBDbHVzdGVyaW5nLVBhcmFtZXRlciByZWZlcmVuY2UuXG4gKiBOT1RFOiBUaGUgYWN0dWFsIHF1ZXJ5IHBhcmFtZXRlcnMgaW4gdGhlIFVSTCBhcmUgbG9va2luZyBsaWtlOiBgP2NsdXN0ZXJpbmcuYVBhcmFtZXRlck5hbWU9YVZhbHVlYC5cbiAqXG4gKiBDbHVzdGVyaW5nLXR5cGU6IFwiaGV4YmluXCI6XG4gKiBUaGVyZSBhcmUgc2V2ZXJhbCBwYXJhbWV0ZXJzIG5lZWRlZCBieSB0aGUgSDMgYmFzZWQgaGV4YmluIGFsZ29yaXRobS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoYXQgdG9waWMgc2VlOiBodHRwczovL2VuZy51YmVyLmNvbS9oMy8uXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogfCAgICAgIFBhcmFtZXRlciAgICAgICB8ICAgVHlwZSAgIHwgICBNYW5kYXRvcnkgICB8ICAgICAgICAgICAgICAgICAgICAgIE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiB8ICBhYnNvbHV0ZVJlc29sdXRpb24gIHwgIE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgVGhlIEgzIGhleGFnb24gcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgICAgIHJlc29sdXRpb25cdCAgICAgIHwgIE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgZGVwcmVjYXRlZCwgcmVuYW1lZCB0byBhYnNvbHV0ZVJlc29sdXRpb24gICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgcmVsYXRpdmVSZXNvbHV0aW9uICAgfFx0IE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgaW50ZWdlciB2YWx1ZSBbMC00XSB0byBiZSBhZGRlZCB0byBjdXJyZW50IHVzZWQgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICB8IHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB8ICAgICAgIHByb3BlcnR5XHQgICAgICB8ICBTdHJpbmcgIHwgICAgICAgTk9cdCAgICAgfCBBIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBmZWF0dXJlcyBmb3Igd2hpY2ggdG8gICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgY2FsY3VsYXRlIHN0YXRpc3RpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgICAgICAgcG9pbnRtb2RlXHQgIHwgIEJvb2xlYW4gfCAgICAgICBOT1x0ICAgICB8IHJldHVucyB0aGUgY2VudHJvaWQgb2YgaGV4YWdvbnMgYXMgZ2VvanNvbiBmZWF0dXJlIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogQHBhcmFtIG1hcmdpbiBNYXJnaW4gaW4gcGl4ZWxzIG9uIHRoZSByZXNwZWN0aXZlIHByb2plY3RlZCBsZXZlbCBhcm91bmQgdGhlIHRpbGUuIERlZmF1bHQgaXMgMC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS4gRGVmYXVsdCBpcyAzMDAwMC4gSGFyZCBsaW1pdCBpcyAxMDAwMDAuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIGB0cnVlYCB0aGUgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlIHdpbGwgaGF2ZSBvbmx5IFgncyBhbmQgWSdzIGFzIGNvb3JkaW5hdGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGZWF0dXJlc0J5VGlsZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS90aWxlL3t0aWxlVHlwZX0ve3RpbGVJZH1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie3RpbGVUeXBlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widGlsZVR5cGVcIl0pKVxuICAgICAgICAucmVwbGFjZShcInt0aWxlSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJ0aWxlSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2xpcFwiLCBwYXJhbXNbXCJjbGlwXCJdKTtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBwYXJhbXMucGFyYW1zO1xuICAgIGlmIChzZWFyY2hQYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBzZWFyY2hQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KHBhcmFtLmtleSwgcGFyYW0udmFsdWUsIHBhcmFtLm9wZXJhdG9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzZWxlY3Rpb25cIiwgcGFyYW1zW1wic2VsZWN0aW9uXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2tpcENhY2hlXCIsIHBhcmFtc1tcInNraXBDYWNoZVwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNsdXN0ZXJpbmdcIiwgcGFyYW1zW1wiY2x1c3RlcmluZ1wiXSk7XG4gICAgaWYgKHBhcmFtc1tcImNsdXN0ZXJpbmdQYXJhbXNcIl0pIHtcbiAgICAgICAgZm9yIChjb25zdCBjbHVzdGVyaW5nUGFyYW0gaW4gcGFyYW1zW1wiY2x1c3RlcmluZ1BhcmFtc1wiXSkge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShgY2x1c3RlcmluZy4ke2NsdXN0ZXJpbmdQYXJhbX1gLCBwYXJhbXNbXCJjbHVzdGVyaW5nUGFyYW1zXCJdW2NsdXN0ZXJpbmdQYXJhbV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtYXJnaW5cIiwgcGFyYW1zW1wibWFyZ2luXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHVybnMgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBsYXllci5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgc3RhdGlzdGljcy5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gc2tpcENhY2hlIElmIHNldCB0byB0cnVlIHRoZSByZXNwb25zZSBpcyBub3QgcmV0dXJuZWQgZnJvbSBjYWNoZS5cbiAqIERlZmF1bHQgaXMgZmFsc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFN0YXRpc3RpY3MoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc3RhdGlzdGljc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2tpcENhY2hlXCIsIHBhcmFtc1tcInNraXBDYWNoZVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogSXRlcmF0ZXMgYWxsIG9mIHRoZSBmZWF0dXJlcyBpbiB0aGUgbGF5ZXIuIFRoZSBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2UgYXJlIG9yZGVyZWQgc29cbiAqIHRoYXQgbm8gZmVhdHVyZSBpcyByZXR1cm5lZCB0d2ljZS4gSWYgdGhlcmUgYXJlIG1vcmUgZmVhdHVyZXMsIHdoaWNoIGNvdWxkIGJlIGxvYWRlZCxcbiAqIHRoZSByZXNwb25zZSBGZWF0dXJlQ29sbGVjdGlvbiB3aWxsIGNvbnRhaW4gdGhlIHJvb3QgYXR0cmlidXRlIG5leHRQYWdlVG9rZW4uXG4gKiBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHBhc3NlZCBhcyBhIHF1ZXJ5IHBhcmFtZXRlciBmb3IgdGhlIGZvbGxvd2luZyByZXF1ZXN0XG4gKiBpbiBvcmRlciB0byBjb250aW51ZSB0aGUgaXRlcmF0aW9uIGZyb20gdGhlIG1hcmtlZCBwb3NpdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBJdGVyYXRlIGZlYXR1cmVzIGluIHRoZSBsYXllci5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS4gRGVmYXVsdCBpcyAzMDAwMC4gSGFyZCBsaW1pdCBpcyAxMDAwMDAuXG4gKlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgcGFnZSB0b2tlbiB3aGVyZSB0aGUgaXRlcmF0aW9uIHdpbGwgY29udGludWUuXG4gKlxuICogQHBhcmFtIHBhcnQgUmVxdWVzdHMgZGlzanVuY3QgcGFydHMgb2YgaXRlcmF0aW9uIHJlc3VsdHMgKHVzZWQgd2l0aCBzb3J0KS5cbiAqIExpc3Qgb2YgdHdvIGludGVnZXJzIFwicGFydCx0b3RhbFwiLiBwYXJ0PTEsNCByZWFkIGFzIGZpcnN0IHBhcnQgb3V0IG9mIDQsIC4uLiB1bnRpbCBwYXJ0PTQsNCAuXG4gKiBFeGFtcGxlOiA/cGFydD03LDlcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmZWF0dXJlcyByZXN1bHQgbGlzdC5cbiAqIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBieSB1c2luZyBjb21tYSgsKS5cbiAqIEV4YW1wbGU6IGA/c2VsZWN0aW9uPXAubmFtZSxwLmNhcGFjaXR5LHAuY29sb3JgLlxuICpcbiAqIEBwYXJhbSBzb3J0IFNwZWNpZmllcyB0aGUgc29ydCBvcmRlciBieSBhIGxpc3Qgb2YgcHJvcGVydGllcy5cbiAqIEFzY2VuZGluZyBhc3N1bWVkIGlmIG5vIHNvcnQgZGlyZWN0aW9uICg6YXNjLCA6ZGVzYykgaXMgc3BlY2lmaWVkLlxuICogRXhhbXBsZTogc29ydCA9IFtcInAubmFtZTphc2NcIiwgXCJwLmNvbG9yOmRlc2NcIl0gPT4gP3NvcnQ9cC5uYW1lOmFzYyxwLmNvbG9yOmRlc2MuXG4gKlxuICogQHBhcmFtIHNraXBDYWNoZSBJZiBzZXQgdG8gdHJ1ZSB0aGUgcmVzcG9uc2UgaXMgbm90IHJldHVybmVkIGZyb20gY2FjaGUuIERlZmF1bHQgaXMgZmFsc2UuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIHRydWUgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXRlcmF0ZUZlYXR1cmVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2l0ZXJhdGVcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcnRcIiwgcGFyYW1zW1wicGFydFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzb3J0XCIsIHBhcmFtc1tcInNvcnRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJza2lwQ2FjaGVcIiwgcGFyYW1zW1wic2tpcENhY2hlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZm9yY2UyRFwiLCBwYXJhbXNbXCJmb3JjZTJEXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBTZWFyY2hlcyBmb3IgZmVhdHVyZXMgaW4gdGhlIGxheWVyLiBUaGUgcmVzdWx0cyBhcmUgdW5vcmRlcmVkIGFuZCB0aGUgcmVxdWVzdCBkb2VzIG5vdCBhbGxvdyB0byBjb250aW51ZVxuICogdGhlIHNlYXJjaCwgd2hpY2ggaXMgdGhlIG1haW4gZGlmZmVyZW5jZSB3aGVuIGNvbXBhcmVkIHRvIHRoZSBpdGVyYXRlIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgU2VhcmNoIGZvciBmZWF0dXJlcy5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS4gRGVmYXVsdCBpcyAzMDAwMC4gSGFyZCBsaW1pdCBpcyAxMDAwMDAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIGZlYXR1cmUgZmlsdGVycyB3aGljaCBjb21wYXJlcyB0aGUgZmVhdHVyZSdzIHByb3BlcnR5J3MgdmFsdWUgd2l0aCB0aGUgb25lIHNwZWNpZmllZFxuICogaW4gdGhlIHF1ZXJ5LCByZXN1bHRpbmcgaW4gYSBzdWJzZXQgb2YgZmVhdHVyZXMuXG4gKiBUaGUgdXNhZ2Ugb2YgbXVsdGlwbGUgcHJvcGVydHkgbmFtZXMgcmVwcmVzZW50cyBhbiBBTkQgb3BlcmF0aW9uLlxuICogVGhlIHVzYWdlIG9mIGEgY29tbWEgKCwpIHNlcGFyYXRpbmcgdGhlIHByb3BlcnRpZXMgdmFsdWVzLCByZXByZXNlbnRzIGFuIE9SIG9wZXJhdGlvbi5cbiAqIFByb3BlcnRpZXMgaW5pdGlhdGVkIHdpdGggJ2YuJyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIHdoaWNoIGFyZSBhZGRlZCBieSBkZWZhdWx0IGluIHRoZSBzdG9yZWQgZmVhdHVyZS5cbiAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiAnZi5pZCcsICdmLmNyZWF0ZWRBdCcgYW5kICdmLnVwZGF0ZWRBdCcuXG4gKiBQcm9wZXJ0aWVzIGluaXRpYXRlZCB3aXRoICdwLicgYXJlIHVzZWQgdG8gYWNjZXNzIHZhbHVlcyBpbiB0aGUgc3RvcmVkIGZlYXR1cmUgd2hpY2ggYXJlIHVuZGVyIHRoZSAncHJvcGVydGllcycgcHJvcGVydHkuXG4gKiBVc2UgaXQgYXMgYSBzaG9ydGhhbmQgYWNjZXNzb3IgZm9yICdwcm9wZXJ0aWVzJyB2YWx1ZXMuXG4gKiBUaGUgZm9ybWF0IHNob3VsZCBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24gYmVsb3dcbiAqIGBgYFxuICogP3AucHJvcGVydHlfbmFtZV8xPXByb3BlcnR5X3ZhbHVlXzEmZi5zcGVjaWFsX3Byb3BlcnR5X25hbWVfMT1zcGVjaWFsX3Byb3BlcnR5X3ZhbHVlXzFcbiAqIGBgYFxuICpcbiAqIEZvciBleGFtcGxlLCB0aGUgYWJvdmUgcXVlcnksIHRoZSBGZWF0dXJlcyB3aWxsIGJlIGZpbHRlcmVkIGJ5ICdwcm9wZXJ0eScgQU5EICdzcGVjaWFsIHByb3BlcnR5JyBlcXVhbHMgdG8gdGhlaXJcbiAqIHJlc3BlY3RpdmUgdmFsdWVzLlxuICpcbiAqIFdoaWxlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBgYGA/cC5wcm9wZXJ0eV9uYW1lXzE9dmFsdWVfMSx2YWx1ZV8yYGBgXG4gKiBUaGUgcmVzdWx0aW5nIEZlYXR1cmVzIGxpc3Qgd2lsbCBjb250YWluIGFsbCBlbGVtZW50cyBoYXZpbmcgYHZhbHVlXzFgIE9SIGB2YWx1ZV8yYC5cbiAqXG4gKiBBZGRpdGlvbmFsbHkgdG8gdGhlIG9wZXJhdG9ycyB1c2VkIGluIHRoZSBleGFtcGxlcyBhYm92ZSwgdGhlIHF1ZXJ5IGNhbiBiZSB3cml0dGVuLCB3aXRoIHRoZSBzYW1lIHNlbWFudGljLFxuICogYnkgdXNpbmcgdGhlIGxvbmcgb3BlcmF0b3JzOiBgXCI9Z3RlPVwiLCBcIj1sdGU9XCIsIFwiPWd0PVwiLCBcIj1sdD1cIiBhbmQgXCI9Y3M9XCJgLlxuICpcbiAqIFRoZSBiZWxvdyBxdWVyaWVzIHlpZWxkIHRoZSBzYW1lIHJlc3VsdDpcbiAqIGBgYFxuICogP3AucHJvcGVydHlfbmFtZV8xPj0xMFxuICogP3AucHJvcGVydHlfbmFtZV8xPWd0ZT0xMFxuICogYGBgXG4gKlxuICogVGhlIGF2YWlsYWJsZSBvcGVyYXRvcnMgYXJlOlxuICogXCI9XCIgLSBlcXVhbHNcbiAqIFwiIT1cIiAtIG5vdCBlcXVhbHNcbiAqIFwiPj1cIiBvciBcIj1ndGU9XCIgLSBncmVhdGVyIHRoYW4gb3IgZXF1YWxzXG4gKiBcIjw9XCIgb3IgXCI9bHRlPVwiIC0gbGVzcyB0aGFuIG9yIGVxdWFsc1xuICogXCI+XCIgb3IgXCI9Z3Q9XCIgLSBncmVhdGVyIHRoYW5cbiAqIFwiPFwiIG9yIFwiPWx0PVwiIC0gbGVzcyB0aGFuXG4gKiBcIkA+XCIgb3IgXCI9Y3M9XCIgLSBjb250YWluc1xuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb24gQSBsaXN0IG9mIHByb3BlcnRpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZlYXR1cmVzIHJlc3VsdCBsaXN0LlxuICogTXVsdGlwbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGNvbW1hKCwpLlxuICogRXhhbXBsZTogYD9zZWxlY3Rpb249cC5uYW1lLHAuY2FwYWNpdHkscC5jb2xvcmAuXG4gKlxuICogQHBhcmFtIHNraXBDYWNoZSBJZiBzZXQgdG8gdHJ1ZSB0aGUgcmVzcG9uc2UgaXMgbm90IHJldHVybmVkIGZyb20gY2FjaGUuIERlZmF1bHQgaXMgZmFsc2UuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIHRydWUgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VhcmNoRmVhdHVyZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc2VhcmNoXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gcGFyYW1zLnBhcmFtcztcbiAgICBpZiAoc2VhcmNoUGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgc2VhcmNoUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShwYXJhbS5rZXksIHBhcmFtLnZhbHVlLCBwYXJhbS5vcGVyYXRvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2VsZWN0aW9uXCIsIHBhcmFtc1tcInNlbGVjdGlvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNraXBDYWNoZVwiLCBwYXJhbXNbXCJza2lwQ2FjaGVcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlbGV0ZXMgYW4gZXhpc3RpbmcgZmVhdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgZmVhdHVyZS5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIGZlYXR1cmUgaW4gdGhlIGxheWVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGZWF0dXJlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzL3tmZWF0dXJlSWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntmZWF0dXJlSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmZWF0dXJlSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogVGhlIHdpbGRjYXJkIHNpZ24oKikgY291bGQgYmUgdXNlZCB0byBkZWxldGUgYWxsIGZlYXR1cmVzIGluIHRoZSBsYXllci5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgbXVsdGlwbGUgZmVhdHVyZXMgZnJvbSB0aGUgbGF5ZXIuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGlkIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdW5pcXVlIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gKiBUaGVzZSBhcmUgdGhlIGFjY2VwdGFibGUgZm9ybWF0cyBmb3IgdGhpcyBmaWVsZDpcbiAqIGBgYFxuICogaWQ9dmFsdWUxLHZhbHVlMlxuICogaWQ9dmFsdWUxLGlkPXZhbHVlMlxuICogYGBgXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZlYXR1cmVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJpZFwiLCBwYXJhbXNbXCJpZFwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFBhdGNoZXMgYW4gZXhpc3RpbmcgZmVhdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSBQYXRjaCBhIGZlYXR1cmUuXG4gKlxuICogQHBhcmFtIGJvZHkgQSBmZWF0dXJlIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGZlYXR1cmVJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgYSBmZWF0dXJlIGluIHRoZSBsYXllci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGF0Y2hGZWF0dXJlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzL3tmZWF0dXJlSWR9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntmZWF0dXJlSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmZWF0dXJlSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGUgb3IgcGF0Y2ggZmVhdHVyZXMuXG4gKlxuICogQHN1bW1hcnkgTW9kaWZ5IGZlYXR1cmVzLlxuICpcbiAqIEBwYXJhbSBib2R5IEEgRmVhdHVyZUNvbGxlY3Rpb24gb2JqZWN0IG9yIGEgRmVhdHVyZU1vZGlmaWNhdGlvbkxpc3Qgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICovXG5hc3luYyBmdW5jdGlvbiBwb3N0RmVhdHVyZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGVzIG9yIHJlcGxhY2VzIGEgZmVhdHVyZSBpbiB0aGUgbGF5ZXIuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIG9yIHJlcGxhY2UgYSBmZWF0dXJlLlxuICpcbiAqIEBwYXJhbSBib2R5IEEgZmVhdHVyZSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICpcbiAqIEBwYXJhbSBmZWF0dXJlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgZmVhdHVyZSBpbiB0aGUgbGF5ZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1dEZlYXR1cmUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXMve2ZlYXR1cmVJZH1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2ZlYXR1cmVJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImZlYXR1cmVJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGUgb3IgcmVwbGFjZSB0aGUgcHJvdmlkZWQgZmVhdHVyZXMuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIG9yIHJlcGxhY2UgbXVsdGlwbGUgZmVhdHVyZXMuXG4gKlxuICogQHBhcmFtIGJvZHkgQSBmZWF0dXJlIGNvbGxlY3Rpb24gcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHV0RmVhdHVyZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBsYXRmb3JtQVBJID0gcGxhdGZvcm1BUEk7XG5leHBvcnRzLmdldFBsYXRmb3JtQVBJTGlzdCA9IGdldFBsYXRmb3JtQVBJTGlzdDtcbmV4cG9ydHMucmVzb3VyY2VBUEkgPSByZXNvdXJjZUFQSTtcbmV4cG9ydHMuZ2V0UmVzb3VyY2VBUElMaXN0ID0gZ2V0UmVzb3VyY2VBUElMaXN0O1xuLyoqXG4gKiBBUEkgTG9va3VwIFNlcnZpY2UgdjFcbiAqIFRoZSBBUEkgTG9va3VwIFNlcnZpY2UgaXMgYSBwbGF0Zm9ybSBzZXJ2aWNlIHdpdGggZm9sbG93aW5nIGdvYWxzOlxuICogLSBSZWRpcmVjdCB1c2VycyB0byBSRVNUIEFQSXMgcmVsYXRlZCB0byBhIHJlc291cmNlIGlkZW50aWZpZWQgYnkgYW4gSFJOXG4gKiAtIEdpdmVuIGFuIEhSTiwgcHJvdmlkZSBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgaW4gUkVTVCBBUElzIGNhbGxzLiAtIERpc2NvdmVyeSBvZiBvdGhlciBIRVJFIEFQSXMuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC4zXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQbGF0Zm9ybUFwaVxuICovXG4vKipcbiAqIFJldHVybiBkZXRhaWxzIG9mIGEgc2luZ2xlIHBsYXRmb3JtIEFQSS4gVGhpcyByZXNwb25zZSBpcyB2YWxpZCBmb3IgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5ICdDYWNoZS1Db250cm9sJyBoZWFkZXIuXG4gKlxuICogQHN1bW1hcnkgUmV0dXJuIGRldGFpbHMgb2YgYSBzaW5nbGUgcGxhdGZvcm0gQVBJLlxuICogQHBhcmFtIGFwaSBUaGUgaWRlbnRpZmllciBvZiB0aGUgQVBJXG4gKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgQVBJXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBsYXRmb3JtQVBJKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wbGF0Zm9ybS9hcGlzL3thcGl9L3t2ZXJzaW9ufVwiXG4gICAgICAgIC5yZXBsYWNlKFwie2FwaX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFwaVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie3ZlcnNpb259XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJ2ZXJzaW9uXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0IG9mIHRoZSBIRVJFIEFQSXMuIFRoaXMgcmVzcG9uc2UgaXMgdmFsaWQgZm9yIHRoZSB0aW1lIHNwZWNpZmllZCBieSAnQ2FjaGUtQ29udHJvbCcgaGVhZGVyLlxuICpcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgbGlzdCBvZiB0aGUgSEVSRSBBUElzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybUFQSUxpc3QoYnVpbGRlcikge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wbGF0Zm9ybS9hcGlzXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXNvdXJjZXNBcGlcbiAqL1xuLyoqXG4gKiBSZXR1cm4gZGV0YWlscyBvZiBhIHNpbmdsZSBBUEkgZm9yIGEgZ2l2ZW4gcmVzb3VyY2UgaWRlbnRpZmllZCBieSBocm4sIGFwaSBhbmQgdmVyc2lvbi5cbiAqIFRoaXMgcmVzcG9uc2UgaXMgdmFsaWQgZm9yIHRoZSB0aW1lIHNwZWNpZmllZCBieSAnQ2FjaGUtQ29udHJvbCcgaGVhZGVyLlxuICpcbiAqIEBzdW1tYXJ5IFJldHVybiBkZXRhaWxzIG9mIGEgc2luZ2xlIEFQSSBmb3IgYSBnaXZlbiByZXNvdXJjZS5cbiAqIEBwYXJhbSBocm4gVGhlIEhSTiBpZGVudGlmeWluZyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSBhcGkgVGhlIGlkZW50aWZpZXIgb2YgdGhlIEFQSVxuICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIEFQSVxuICogQHBhcmFtIHJlZ2lvbiBJZiB5b3Ugd2FudCB0byBsb29rIHVwIGEgc3BlY2lmaWMgcmVnaW9uIGZvciBhIGdpdmVuIHJlc291cmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvdXJjZUFQSShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tocm59L2FwaXMve2FwaX0ve3ZlcnNpb259XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7aHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiaHJuXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7YXBpfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXBpXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7dmVyc2lvbn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInZlcnNpb25cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVnaW9uXCIsIHBhcmFtc1tcInJlZ2lvblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0IG9mIEFQSXMgZm9yIGEgZ2l2ZW4gcmVzb3VyY2UgaWRlbnRpZmllZCBieSBocm4uIFRoaXMgcmVzcG9uc2UgaXMgdmFsaWQgZm9yIHRoZSB0aW1lIHNwZWNpZmllZCBieSAnQ2FjaGUtQ29udHJvbCcgaGVhZGVyLlxuICpcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgbGlzdCBvZiBBUElzIGZvciBhIGdpdmVuIHJlc291cmNlLlxuICogQHBhcmFtIGhybiBUaGUgSFJOIGlkZW50aWZ5aW5nIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIHJlZ2lvbiBJZiB5b3Ugd2FudCB0byBsb29rIHVwIGEgc3BlY2lmaWMgcmVnaW9uIGZvciBhIGdpdmVuIHJlc291cmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZXNvdXJjZUFQSUxpc3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3Jlc291cmNlcy97aHJufS9hcGlzXCIucmVwbGFjZShcIntocm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJocm5cIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVnaW9uXCIsIHBhcmFtc1tcInJlZ2lvblwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldENoYW5nZXMgPSBnZXRDaGFuZ2VzO1xuZXhwb3J0cy5nZXRMYXllclZlcnNpb25zID0gZ2V0TGF5ZXJWZXJzaW9ucztcbmV4cG9ydHMuZ2V0UGFydGl0aW9ucyA9IGdldFBhcnRpdGlvbnM7XG5leHBvcnRzLmxhdGVzdFZlcnNpb24gPSBsYXRlc3RWZXJzaW9uO1xuZXhwb3J0cy5saXN0VmVyc2lvbnMgPSBsaXN0VmVyc2lvbnM7XG5leHBvcnRzLm1pbmltdW1WZXJzaW9uID0gbWluaW11bVZlcnNpb247XG4vKipcbiAqIE1ldGFkYXRhIEFQSSB2MVxuICogVGhlIGBtZXRhZGF0YWAgc2VydmljZSBwcm92aWRlcyBhIHdheSB0byBnZXQgaW5mb3JtYXRpb24gKG1ldGFkYXRhKSBhYm91dCBsYXllcnMgYW5kIHBhcnRpdGlvbnMgc3RvcmVkIGluIGEgY2F0YWxvZy5cbiAqIFRoaXMgc2VydmljZSBleHBvc2VzIHRoZSBtZXRhZGF0YSBmb3IgYWxsIHRoZSBwYXJ0aXRpb25zIG9yIGFsbCB0aGUgY2hhbmdlZCBwYXJ0aXRpb25zLiBGb3IgYSBjYXRhbG9nIHdpdGggdmVyc2lvbmVkIGxheWVycyxcbiAqIHlvdSBjYW4gcmV0cmlldmUgbWV0YWRhdGEgZm9yIGEgcGFydGljdWxhciB2ZXJzaW9uIG9yIHZlcnNpb24gcmFuZ2Ugb2YgdGhlIGNhdGFsb2cuXG4gKiBZb3UgY2FuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGZvciBhIGNhdGFsb2cgd2l0aCB2ZXJzaW9uZWQgbGF5ZXJzOlxuICogLSBMaXN0IHZlcnNpb25zIG9mIHRoZSBjYXRhbG9nIC0gR2V0IGxhdGVzdCBhbmQgbWluaW11bSB2ZXJzaW9uIG9mIHRoZSBjYXRhbG9nXG4gKiAtIEdldCBtZXRhZGF0YSBvZiB0aGUgc3BlY2lmaWMgbGF5ZXJzICBGb3IgYSB2b2xhdGlsZSBsYXllciwgeW91IGNhbiBnZXQgbWV0YWRhdGEgZm9yIGFsbCBvciBhIHN1YnNldCBvZiBwYXJ0aXRpb25zIG9mIHRoZSBsYXllci5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIE1ldGFkYXRhQXBpXG4gKi9cbi8qKlxuICogR2V0cyB0aGUgbGF0ZXN0IHBhcnRpdGlvbiBtZXRhZGF0YSBpbiBhIHZlcnNpb24gcmFuZ2UgZm9yIGEgdmVyc2lvbmVkIGxheWVyIG9yIGEgdGltZSByYW5nZSBmb3IgYSB2b2xhdGlsZSBsYXllci5cbiAqIEZvciB2ZXJzaW9uZWQgbGF5ZXJzIHRoZSByYW5nZSBpcyBleHByZXNzZWQgYXMgYSBzdGFydCBhbmQgZW5kIHZlcnNpb24gYW5kIG1pZ2h0IG5vdCByZXR1cm4gYWxsIGNoYW5nZXMgZm9yIHRoZSBwYXJ0aXRpb25zXG4gKiB3aGljaCB3ZXJlIGFkZGVkIGFuZCByZW1vdmVkIGluIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdGFydCBhbmQgZW5kIHZlcnNpb25zLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgY2hhbmdlcyBmb3IgdGhlIHZlcnNpb24gcmFuZ2UuXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgbGF5ZXIgSUQuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIGxheWVyIElELlxuICogQHBhcmFtIHN0YXJ0VmVyc2lvbiBNYW5kYXRvcnkgZm9yIHZlcnNpb25lZCBsYXllcnM7IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlIG9mIHZlcnNpb25zIHlvdSB3YW50IHRvIGdldCAoZXhjbHVzaXZlKS5cbiAqIEJ5IGNvbnZlbnRpb24gLTEgaW5kaWNhdGVzIHRoZSBpbml0aWFsIHZlcnNpb24gYmVmb3JlIHRoZSBmaXJzdCBwdWJsaWNhdGlvbi4gQWZ0ZXIgdGhlIGZpcnN0IHB1YmxpY2F0aW9uLCB0aGUgY2F0YWxvZyB2ZXJzaW9uIGlzIDAuXG4gKiBAcGFyYW0gZW5kVmVyc2lvbiBNYW5kYXRvcnkgZm9yIHZlcnNpb25lZCBsYXllcnM7IHRoZSBlbmQgb2YgdGhlIHJhbmdlIG9mIHZlcnNpb25zIHlvdSB3YW50IHRvIGdldCAoaW5jbHVzaXZlKS5cbiAqIFRoaXMgbXVzdCBiZSBhIHZhbGlkIGNhdGFsb2cgdmVyc2lvbiBncmVhdGVyIHRoYW4gdGhlIHN0YXJ0VmVyc2lvbi5cbiAqIEBwYXJhbSBzaW5jZVRpbWUgTWFuZGF0b3J5IGZvciB2b2xhdGlsZSBsYXllcnM7IHdpbGwgcmV0dXJuIHBhcnRpdGlvbnMgd2hvc2UgZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGlzIHRpbWUsXG4gKiBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2gsIGluY2x1c2l2ZS5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFkZGl0aW9uYWwgZmllbGRzIC0gJiN4NjA7ZGF0YVNpemUmI3g2MDssICYjeDYwO2NoZWNrc3VtJiN4NjA7LCAmI3g2MDtjb21wcmVzc2VkRGF0YVNpemUmI3g2MDtcbiAqIEBwYXJhbSByYW5nZSBVc2UgdGhpcyBwYXJhbWV0ZXIgdG8gcmVzdW1lIGRvd25sb2FkIG9mIGEgbGFyZ2UgcmVzcG9uc2UgZm9yIHZlcnNpb25lZCBsYXllcnMgd2hlbiB0aGVyZVxuICogIGlzIGEgY29ubmVjdGlvbiBpc3N1ZSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4gU3BlY2lmeSBhIHNpbmdsZSBieXRlIHJhbmdlIG9mZnNldCBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqICBUaGlzIHBhcmFtZXRlciBpcyBjb21wbGlhbnQgd2l0aCBbUkZDIDcyMzNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMzKSxcbiAqIGJ1dCBub3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgb25seSBzdXBwb3J0cyBhIHNpbmdsZSBieXRlIHJhbmdlLlxuICogVGhlICYjeDYwO3JhbmdlJiN4NjA7IHBhcmFtZXRlciBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYXMgYSBxdWVyeSBwYXJhbWV0ZXIsIGkuZS4gJiN4NjA7cmFuZ2UmI3gzRDtieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqIEZvciB2b2xhdGlsZSBsYXllcnMgdXNlIHRoZSBwYWdpbmF0aW9uIGxpbmtzIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5LlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENoYW5nZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vY2hhbmdlc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhcnRWZXJzaW9uXCIsIHBhcmFtc1tcInN0YXJ0VmVyc2lvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImVuZFZlcnNpb25cIiwgcGFyYW1zW1wiZW5kVmVyc2lvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNpbmNlVGltZVwiLCBwYXJhbXNbXCJzaW5jZVRpbWVcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJhZGRpdGlvbmFsRmllbGRzXCIsIHBhcmFtc1tcImFkZGl0aW9uYWxGaWVsZHNcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJyYW5nZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJSYW5nZVwiXSA9IHBhcmFtc1tcInJhbmdlXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGxheWVyIHZlcnNpb25zIGZvciB0aGUgY2F0YWxvZyB2ZXJzaW9uLlxuICogSXQgd2lsbCByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGNhdGFsb2cgZG9lcyBub3QgaGF2ZSBhbnkgdmVyc2lvbnMgb3IgaWYgdGhlIHZlcnNpb24gcGFzc2VkIGluIHRoZSBxdWVyeSBwYXJhbWV0ZXIgZG9lcyBub3QgZXhpc3QuXG4gKiBJZiBhIGxheWVyIGRvZXMgbm90IGhhdmUgYW55IGRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBpdCBpcyBleGNsdWRlZCBmcm9tIHRoZSByZXNwb25zZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGxheWVyIHZlcnNpb25zIGZvciBjYXRhbG9nIHZlcnNpb25cbiAqIEBwYXJhbSB2ZXJzaW9uIENhdGFsb2cgdmVyc2lvblxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRMYXllclZlcnNpb25zKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllclZlcnNpb25zXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInZlcnNpb25cIiwgcGFyYW1zW1widmVyc2lvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0cyB0aGUgbWV0YWRhdGEgZm9yIGFsbCBwYXJ0aXRpb25zIGluIGEgc3BlY2lmaWMgbGF5ZXIuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgbGF5ZXIgSUQuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIGxheWVyIElELlxuICogQHBhcmFtIHZlcnNpb24gSWYgeW91IGFyZSBnZXR0aW5nIG1ldGFkYXRhIGZyb20gYSB2ZXJzaW9uZWQgbGF5ZXIsIHNwZWNpZnkgdGhlIHZlcnNpb24gb2YgdGhlIGxheWVyIHlvdSB3YW50LlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgZm9yIHZlcnNpb25lZCBsYXllcnMuIElmIHlvdSBhcmUgZ2V0dGluZyBtZXRhZGF0YSBmcm9tIGFub3RoZXIgbGF5ZXIgdHlwZSwgZG8gbm90IHNwZWNpZnkgdGhpcyBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBBZGRpdGlvbmFsIGZpZWxkcyAtICYjeDYwO2RhdGFTaXplJiN4NjA7LCAmI3g2MDtjaGVja3N1bSYjeDYwOywgJiN4NjA7Y29tcHJlc3NlZERhdGFTaXplJiN4NjA7XG4gKiBAcGFyYW0gcmFuZ2UgVXNlIHRoaXMgcGFyYW1ldGVyIHRvIHJlc3VtZSBkb3dubG9hZCBvZiBhIGxhcmdlIHJlc3BvbnNlIGZvciB2ZXJzaW9uZWQgbGF5ZXJzIHdoZW4gdGhlcmUgaXMgYSBjb25uZWN0aW9uXG4gKiBpc3N1ZSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4gU3BlY2lmeSBhIHNpbmdsZSBieXRlIHJhbmdlIG9mZnNldCBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudCB3aXRoIFtSRkMgNzIzM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMpLFxuICogYnV0IG5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGJ5dGUgcmFuZ2UuXG4gKiBUaGUgJiN4NjA7cmFuZ2UmI3g2MDsgcGFyYW1ldGVyIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBhIHF1ZXJ5IHBhcmFtZXRlciwgaS5lLiAmI3g2MDtyYW5nZSYjeDNEO2J5dGVzJiN4M0Q7MTAtJiN4NjA7LlxuICogRm9yIHZvbGF0aWxlIGxheWVycyB1c2UgdGhlIHBhZ2luYXRpb24gbGlua3MgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQYXJ0aXRpb25zKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3BhcnRpdGlvbnNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInZlcnNpb25cIiwgcGFyYW1zW1widmVyc2lvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImFkZGl0aW9uYWxGaWVsZHNcIiwgcGFyYW1zW1wiYWRkaXRpb25hbEZpZWxkc1wiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaWYgKHBhcmFtc1tcInJhbmdlXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlJhbmdlXCJdID0gcGFyYW1zW1wicmFuZ2VcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gY2F0YWxvZy4gSWYgdGhlIGNhdGFsb2cgZG9lc24ndCBjb250YWluIGFueSB2ZXJzaW9ucyBhIDQwNCB3aWxsIGJlIHJldHVybmVkLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uXG4gKiBAcGFyYW0gc3RhcnRWZXJzaW9uIFRoZSBjYXRhbG9nIHZlcnNpb24gcmV0dXJuZWQgZnJvbSBhIHByaW9yIHJlcXVlc3QgdG8gJiN4NjA7L3ZlcnNpb25zL2xhdGVzdCYjeDYwOy5cbiAqIFlvdSBzaG91bGQgc2F2ZSB0aGUgdmVyc2lvbiBmcm9tIGVhY2ggcmVxdWVzdCBzbyB0aGF0IHlvdSBjYW4gdXNlIGl0IGluIHRoZSAmI3g2MDtzdGFydFZlcnNpb24mI3g2MDsgcGFyYW1ldGVyIG9mIHN1YnNlcXVlbnQgcmVxdWVzdHMuXG4gKiBJZiB5b3UgZG9uJiMzOTt0IGhhdmUgdGhlIHZlcnNpb24gZnJvbSBhIHByaW9yIHJlcXVlc3QsIHNldCB0aGUgcGFyYW1ldGVyIHRvIC0xLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxhdGVzdFZlcnNpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25zL2xhdGVzdFwiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdGFydFZlcnNpb25cIiwgcGFyYW1zW1wic3RhcnRWZXJzaW9uXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGNhdGFsb2cgdmVyc2lvbihzKS5cbiAqIElmIHRoZSBjYXRhbG9nIGRvZXNuJ3QgY29udGFpbiBhbnkgdmVyc2lvbnMgNDA0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBNYXhpbXVtIG51bWJlciBvZiB2ZXJzaW9ucyB0byBiZSByZXR1cm5lZCBwZXIgY2FsbCBpcyAxMDAwIHZlcnNpb25zLlxuICogSWYgcmVxdWVzdGVkIHJhbmdlIGlzIGJpZ2dlciB0aGFuIDEwMDAgdmVyc2lvbnMgNDAwIEJhZCBSZXF1ZXN0IHdpbGwgYmUgcmV0dXJuZWRcbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGNhdGFsb2cgdmVyc2lvbnNcbiAqIEBwYXJhbSBzdGFydFZlcnNpb24gVGhlIGJlZ2lubmluZyBvZiB0aGUgcmFuZ2Ugb2YgdmVyc2lvbnMgeW91IHdhbnQgdG8gZ2V0IChleGNsdXNpdmUpLlxuICogQnkgY29udmVudGlvbiAtMSBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uLiBBZnRlciB0aGUgZmlyc3QgcHVibGljYXRpb24sIHRoZSBjYXRhbG9nIHZlcnNpb24gaXMgMC5cbiAqIEBwYXJhbSBlbmRWZXJzaW9uIFRoZSBlbmQgb2YgdGhlIHJhbmdlIG9mIHZlcnNpb25zIHlvdSB3YW50IHRvIGdldCAoaW5jbHVzaXZlKS5cbiAqIFRoaXMgbXVzdCBiZSBhIHZhbGlkIGNhdGFsb2cgdmVyc2lvbiBncmVhdGVyIHRoYW4gdGhlIHN0YXJ0VmVyc2lvbi5cbiAqIFRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyByZXR1cm5lZCBmcm9tIHRoZSAmI3g2MDsvdmVyc2lvbnMvbGF0ZXN0JiN4NjA7IGVuZHBvaW50LlxuICogSWYgdGhpcyB2ZXJzaW9uIGRvZXMgbm90IGV4aXN0LCA0MDAgQmFkIFJlcXVlc3QgaXMgcmV0dXJuZWRcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0VmVyc2lvbnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25zXCI7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN0YXJ0VmVyc2lvblwiLCBwYXJhbXNbXCJzdGFydFZlcnNpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbmRWZXJzaW9uXCIsIHBhcmFtc1tcImVuZFZlcnNpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHVybnMgbWluaW11bSB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gY2F0YWxvZy4gSWYgdGhlIGNhdGFsb2cgZG9lc24ndCBjb250YWluIGFueSB2ZXJzaW9ucyA0MDQgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBlYXJsaWVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWluaW11bVZlcnNpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25zL21pbmltdW1cIjtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi4gYW5kIGl0cyBhZmZpbGlhdGUocykuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBjb250YWluIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uXG4gKiBjb250cm9sbGVkIGJ5IEhFUkUgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGVnaXNsYXRpb24uXG4gKiBBbnkgdXNlIGFuZCB1dGlsaXphdGlvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgYW5kXG4gKiBkaXNjbG9zdXJlIHRvIGFueSB0aGlyZCBwYXJ0aWVzIGlzIGNvbmRpdGlvbmFsIHVwb24gaGF2aW5nIGEgc2VwYXJhdGVcbiAqIGFncmVlbWVudCB3aXRoIEhFUkUgZm9yIHRoZSBhY2Nlc3MsIHVzZSwgdXRpbGl6YXRpb24gb3IgZGlzY2xvc3VyZSBvZiB0aGlzXG4gKiBzb2Z0d2FyZS4gSW4gdGhlIGFic2VuY2Ugb2Ygc3VjaCBhZ3JlZW1lbnQsIHRoZSB1c2Ugb2YgdGhlIHNvZnR3YXJlIGlzIG5vdFxuICogYWxsb3dlZC5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jYW5jZWxQdWJsaWNhdGlvbiA9IGNhbmNlbFB1YmxpY2F0aW9uO1xuZXhwb3J0cy5nZXRQdWJsaWNhdGlvbiA9IGdldFB1YmxpY2F0aW9uO1xuZXhwb3J0cy5pbml0UHVibGljYXRpb24gPSBpbml0UHVibGljYXRpb247XG5leHBvcnRzLnN1Ym1pdFB1YmxpY2F0aW9uID0gc3VibWl0UHVibGljYXRpb247XG5leHBvcnRzLnVwbG9hZFBhcnRpdGlvbnMgPSB1cGxvYWRQYXJ0aXRpb25zO1xuLyoqXG4gKiBQdWJsaXNoIEFQSSB2MlxuICogTm8gZGVzY3JpcHRpb24gcHJvdmlkZWQgKGdlbmVyYXRlZCBieSBTd2FnZ2VyIENvZGVnZW4gaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbilcbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMi4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdWJsaXNoQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQ2FuY2VscyBhIHB1YmxpY2F0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkLlxuICogV2lsbCBmYWlsIGlmIGF0dGVtcHRpbmcgdG8gY2FuY2VsIGEgc3VibWl0dGVkIHB1YmxpY2F0aW9uLlxuICogVGhpcyBhbGxvd3MgdGhlIHNwZWNpZmllZCBwdWJsaWNhdGlvbiB0byBiZSBhYmFuZG9uZWQuXG4gKiBTZWUgRGF0YSBBUEkgRGV2ZWxvcGVy4oCZcyBHdWlkZSBpbiB0aGUgRG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBwdWJsaWNhdGlvbiBzdGF0ZXMgZGlhZ3JhbVxuICogYW5kIGFsbCBwb3NzaWJsZSBwdWJsaWNhdGlvbiBzdGF0ZXMgdHJhbnNpdGlvbnMuXG4gKlxuICogQHN1bW1hcnkgQ2FuY2VscyBhIHB1YmxpY2F0aW9uXG4gKiBAcGFyYW0gcHVibGljYXRpb25JZCBUaGUgSUQgb2YgdGhlIHB1YmxpY2F0aW9uIHRvIGNhbmNlbC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FuY2VsUHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH1cIi5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgZGV0YWlscyBvZiB0aGUgc3BlY2lmaWVkIHB1YmxpY2F0aW9uLlxuICpcbiAqIFB1YmxpY2F0aW9uIGNhbiBiZSBpbiBvbmUgb2YgdGhlc2Ugc3RhdGVzOlxuICogIC0gSW5pdGlhbGl6ZWQsXG4gKiAgLSBTdWJtaXR0ZWQsXG4gKiAgLSBDYW5jZWxsZWQsXG4gKiAgLSBGYWlsZWQsXG4gKiAgLSBTdWNjZWVkZWQsXG4gKiAgLSBFeHBpcmVkLlxuICpcbiAqIFNlZSBEYXRhIEFQSSBEZXZlbG9wZXLigJlzIEd1aWRlIGluIHRoZSBEb2N1bWVudGF0aW9uIHNlY3Rpb24gZm9yIHRoZSBwdWJsaWNhdGlvbiBzdGF0ZSBkaWFncmFtLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgYSBwdWJsaWNhdGlvblxuICogQHBhcmFtIHB1YmxpY2F0aW9uSWQgVGhlIElEIG9mIHRoZSBwdWJsaWNhdGlvbiB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH1cIi5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogSW5pdGlhbGl6ZXMgYSBuZXcgcHVibGljYXRpb24gZm9yIHB1Ymxpc2hpbmcgbWV0YWRhdGEuXG4gKiBEZXRlcm1pbmVzIHRoZSBwdWJsaWNhdGlvbiB0eXBlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBsYXllciBJRHMuXG4gKiBBIHB1YmxpY2F0aW9uIGNhbiBvbmx5IGNvbnNpc3Qgb2YgbGF5ZXIgSURzIHRoYXQgaGF2ZSB0aGUgc2FtZSBsYXllciB0eXBlLlxuICogRm9yIGV4YW1wbGUsIHlvdSBjYW4gaGF2ZSBhIHB1YmxpY2F0aW9uIGZvciBtdWx0aXBsZSBsYXllcnMgb2YgdHlwZSBgdmVyc2lvbmVkYCxcbiAqIGJ1dCB5b3UgY2Fubm90IGhhdmUgYSBzaW5nbGUgcHVibGljYXRpb24gdGhhdCBwdWJsaXNoZXMgdG8gYm90aCBgdmVyc2lvbmVkYCBhbmQgYHN0cmVhbWAgbGF5ZXJzLlxuICogSW4gYWRkaXRpb24sIHlvdSBtYXkgb25seSBoYXZlIG9uZSBgdmVyc2lvbmVkYCBvciBgdm9sYXRpbGVgIHB1YmxpY2F0aW9uIGluIHByb2Nlc3MgYXQgYSB0aW1lLlxuICogWW91IGNhbm5vdCBoYXZlIG11bHRpcGxlIGFjdGl2ZSBwdWJsaWNhdGlvbnMgdG8gdGhlIHNhbWUgY2F0YWxvZyBmb3IgYHZlcnNpb25lZGAgYW5kIGB2b2xhdGlsZWAgbGF5ZXIgdHlwZXMuXG4gKiBUaGUgYm9keSBmaWVsZCBgdmVyc2lvbkRlcGVuZGVuY2llc2AgaXMgb3B0aW9uYWwgYW5kIGlzIHVzZWQgZm9yIGB2ZXJzaW9uZWRgIGxheWVycyB0byBkZWNsYXJlIHZlcnNpb24gZGVwZW5kZW5jaWVzLlxuICpcbiAqIEBzdW1tYXJ5IEluaXRpYWxpemUgYSBuZXcgcHVibGljYXRpb25cbiAqIEBwYXJhbSBib2R5IEZpZWxkcyB0byBpbml0aWFsaXplIGEgcHVibGljYXRpb24uXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0UHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9uc1wiO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogU3VibWl0cyB0aGUgcHVibGljYXRpb24gYW5kIGluaXRpYXRlcyBwb3N0IHByb2Nlc3NpbmcgaWYgbmVjZXNzYXJ5LlxuICogUHVibGljYXRpb24gc3RhdGUgYmVjb21lcyBgU3VibWl0dGVkYCBkaXJlY3RseSBhZnRlciBzdWJtaXNzaW9uIGFuZCBgU3VjY2VlZGVkYCBhZnRlciBzdWNjZXNzZnVsIHByb2Nlc3NpbmcuXG4gKiBTZWUgRGF0YSBBUEkgRGV2ZWxvcGVy4oCZcyBHdWlkZSBpbiB0aGUgRG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBjb21wbGV0ZSBwdWJsaWNhdGlvbiBzdGF0ZXMgZGlhZ3JhbS5cbiAqXG4gKiBAc3VtbWFyeSBTdWJtaXRzIGEgcHVibGljYXRpb25cbiAqIEBwYXJhbSBwdWJsaWNhdGlvbklkIElEIG9mIHB1YmxpY2F0aW9uIHRvIHN1Ym1pdC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VibWl0UHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH1cIi5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFVwbG9hZCBwYXJ0aXRpb25zIHRvIHRoZSBnaXZlbiBsYXllci5cbiAqIERlcGVuZGVuZGluZyBvbiB0aGUgcHVibGljYXRpb24gdHlwZSwgcG9zdCBwcm9jZXNzaW5nIG1heSBiZSByZXF1aXJlZCBiZWZvcmUgdGhlIHBhcnRpdGlvbnMgYXJlIHB1Ymxpc2hlZC5cbiAqIEZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYmF0Y2ggeW91ciBwYXJ0aXRpb25zIChlLmcuIDEwMDAgcGVyIHJlcXVlc3QpLCByYXRoZXIgdGhhbiB1cGxvYWRpbmcgdGhlbSBpbmRpdmlkdWFsbHkuXG4gKlxuICogQHN1bW1hcnkgVXBsb2FkIHBhcnRpdGlvbnNcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gcHVibGlzaCB0by5cbiAqIEBwYXJhbSBwdWJsaWNhdGlvbklkIFRoZSBJRCBvZiBwdWJsaWNhdGlvbiB0byBwdWJsaXNoIHRvLlxuICogQHBhcmFtIGJvZHkgUHVibGljYXRpb24gcGFydGl0aW9ucy4gRGF0YSBhbmQgRGF0YUhhbmRsZSBmaWVsZHMgY2Fubm90IGJlIHBvcHVsYXRlZCBhdCB0aGUgc2FtZSB0aW1lLlxuICogU2VlIFBhcnRpdGlvbiBvYmplY3QgZm9yIG1vcmUgZGV0YWlscyBvbiBib2R5IGZpZWxkc1xuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiB1cGxvYWRQYXJ0aXRpb25zKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH0vcGFydGl0aW9uc1wiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7cHVibGljYXRpb25JZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInB1YmxpY2F0aW9uSWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRDaGFuZ2VzQnlJZCA9IGdldENoYW5nZXNCeUlkO1xuZXhwb3J0cy5nZXRQYXJ0aXRpb25zQnlJZCA9IGdldFBhcnRpdGlvbnNCeUlkO1xuZXhwb3J0cy5xdWFkVHJlZUluZGV4ID0gcXVhZFRyZWVJbmRleDtcbmV4cG9ydHMucXVhZFRyZWVJbmRleFZvbGF0aWxlID0gcXVhZFRyZWVJbmRleFZvbGF0aWxlO1xuLyoqXG4gKiBRdWVyeSBBUEkgdjFcbiAqIFRoZSBgcXVlcnlgIHNlcnZpY2UgcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IGluZm9ybWF0aW9uIChtZXRhZGF0YSkgYWJvdXQgbGF5ZXJzIGFuZCBwYXJ0aXRpb25zIHN0b3JlZCBpbiBhIGNhdGFsb2cuXG4gKiBUaGlzIHNlcnZpY2UgZXhwb3NlcyB0aGUgbWV0YWRhdGEgZm9yIHNpbmdsZSBwYXJ0aXRpb25zIHRoYXQgdXNlcnMgY2FuIHF1ZXJ5IG9uZSBieSBvbmUgb3IgYnkgc3BlY2lmeWluZyBhIHBhcmVudCB0aWxlLlxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjAuMVxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUXVlcnlBcGlcbiAqL1xuLyoqXG4gKiBHZXRzIHRoZSBsYXRlc3QgcGFydGl0aW9uIGNoYW5nZXMgZm9yIGEgdmVyc2lvbiByYW5nZSBpbiBhIHZlcnNpb25lZCBsYXllciBvciBhIHRpbWUgcmFuZ2VcbiAqIGZvciBhIHZvbGF0aWxlIGxheWVyLiBPbmx5IHRoZSBsYXRlc3QgY2hhbmdlIGZvciBlYWNoIGNoYW5nZWQgcGFydGl0aW9uIGlzIHJldHVybmVkLCBub3RcbiAqICBpbnRlcm1lZGlhdGUgY2hhbmdlcy4gSWYgdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGEgcGFydGl0aW9uIHdpdGggYW4gZW1wdHkgJ2RhdGFIYW5kbGUnIHZhbHVlLFxuICogIHRoZSBwYXJ0aXRpb24gd2FzIGRlbGV0ZWQgYXQgdGhlIHZlcnNpb24gaW5kaWNhdGVkIGJ5IHRoZSAndmVyc2lvbicgZmllbGQgb2YgdGhlIHBhcnRpdGlvbiBvYmplY3QuXG4gKiAgSWYgYSBwYXJ0aXRpb24gd2FzIGNyZWF0ZWQgYW5kIGRlbGV0ZWQgYmV0d2VlbiB0aGUgdmVyc2lvbnMgc3BlY2lmaWVkIGluIHRoZSAnc3RhcnRWZXJzaW9uJyBhbmQgJ2VuZFZlcnNpb24nXG4gKiBwYXJhbWV0ZXJzLCB0aGUgcGFydGl0aW9uIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UuIEZvciBleGFtcGxlLCBpZiB5b3UgcmVxdWVzdCB2ZXJzaW9ucyAwIHRvIDEwLCBhbmQgYVxuICogcGFydGl0aW9uIHdhcyBjcmVhdGVkIGluIHZlcnNpb24gMyB0aGVuIGRlbGV0ZWQgaW4gdmVyc2lvbiA3LCBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgY2hhbmdlcyBmb3IgdGhlIHZlcnNpb24gb3IgdGltZSByYW5nZSBmb3IgdGhlIHNwZWNpZmljIHBhcnRpdGlvbihzKS5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBUaGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhXG4gKiAgdmFsaWQgbGF5ZXIgYWxyZWFkeSBjb25maWd1cmVkIGluIHRoZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBsYXllcnMgYXMgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHBhcnRpdGlvbiBUaGUgcGFydGl0aW9ucyB5b3Ugd2FudCB0byBpbmNsdWRlIGluIHRoZSByZXNwb25zZS4gVGhpcyBhbGxvd3MgeW91IHRvIGxpbWl0IHRoZSByZXNwb25zZSB0b1xuICogc3BlY2lmaWMgcGFydGl0aW9ucy4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIHBhcnRpdGlvbnMgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuIFRoZSBtYXhpbXVtXG4gKiAgbnVtYmVyIG9mIHBhcnRpdGlvbnMgcGVyIGNhbGwgaXMgMTAwLlxuICogQHBhcmFtIHN0YXJ0VmVyc2lvbiBTdGFydCB2ZXJzaW9uIGZvciB0aGUgY2F0YWxvZyAoZXhjbHVzaXZlKS4gQnkgY29udmVudGlvbiAtMSBpbmRpY2F0ZXMgdGhlIHZpcnR1YWwgaW5pdGlhbFxuICogIHZlcnNpb24gYmVmb3JlIHRoZSBmaXJzdCBwdWJsaWNhdGlvbiB3aGljaCB3aWxsIGhhdmUgdmVyc2lvbiAwLlxuICogQHBhcmFtIGVuZFZlcnNpb24gRW5kIHZlcnNpb24gKGluY2x1c2l2ZSkuIFRoaXMgaGFzIHRvIGJlIGEgdmFsaWQgY2F0YWxvZyB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiB0aGUgc3RhcnRWZXJzaW9uLlxuICogQHBhcmFtIHNpbmNlVGltZSBXaWxsIHJldHVybiBwYXJ0aXRpb25zIHdob3NlIGRhdGEgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhpcyB0aW1lLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2gsIGluY2x1c2l2ZS5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFkZGl0aW9uYWwgZmllbGRzIC0gJiN4NjA7ZGF0YVNpemUmI3g2MDssICYjeDYwO2NoZWNrc3VtJiN4NjA7LCAmI3g2MDtjb21wcmVzc2VkRGF0YVNpemUmI3g2MDsuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqICBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENoYW5nZXNCeUlkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2NoYW5nZXNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN0YXJ0VmVyc2lvblwiLCBwYXJhbXNbXCJzdGFydFZlcnNpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbmRWZXJzaW9uXCIsIHBhcmFtc1tcImVuZFZlcnNpb25cIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzaW5jZVRpbWVcIiwgcGFyYW1zW1wic2luY2VUaW1lXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFydGl0aW9uXCIsIHBhcmFtc1tcInBhcnRpdGlvblwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogR2V0cyBtZXRhZGF0YSBmb3Igc3BlY2lmaWMgcGFydGl0aW9uIGlkcy4gSWYgdGhlIGxheWVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBleGlzdCwgdGhlIHJlcXVlc3QgcmVzdWx0cyBpbiBhbiBlcnJvci5cbiAqIElmIGEgcGFydGl0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBleGlzdCwgdGhlIHJlc3BvbnNlIGRvZXMgbm90IGluY2x1ZGUgdGhpcyBwYXJ0aXRpb24uXG4gKiAgTWF4aW11biBhbGxvd2VkIG51bWJlciBvZiBwYXJ0aXRpb25zIGlkcyBwZXIgY2FsbCBpcyAxMDAuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBtZXRhZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4gVGhlIGNvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXJcbiAqICBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgbGF5ZXIgYWxyZWFkeSBjb25maWd1cmVkIGluIHRoZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24uXG4gKiAgWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIHBhcnRpdGlvbnMgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuXG4gKiBAcGFyYW0gcGFydGl0aW9uIFBhcnRpdGlvbiBpZHMgdG8gdXNlIGZvciBmaWx0ZXJpbmcuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZVxuICogIHBhcnRpdGlvbnMgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuIE1heGltdW0gYWxsb3dlZCBwYXJ0aXRpb25zIGlkcyBwZXIgY2FsbCBpcyAxMDAuXG4gKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZyBhZ2FpbnN0IHdoaWNoIHRvIHJ1biB0aGUgcXVlcnkuIE11c3QgYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24uXG4gKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBBZGRpdGlvbmFsIGZpZWxkcyAtICYjeDYwO2RhdGFTaXplJiN4NjA7LCAmI3g2MDtjaGVja3N1bSYjeDYwOywgJiN4NjA7Y29tcHJlc3NlZERhdGFTaXplJiN4NjA7XG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmdcbiAqICByZWNvcmRzIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpY1xuICogQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBhcnRpdGlvbnNCeUlkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3BhcnRpdGlvbnNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgcGFyYW1zW1wicGFydGl0aW9uXCJdLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcnRpdGlvblwiLCBpdGVtKTtcbiAgICB9KTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidmVyc2lvblwiLCBwYXJhbXNbXCJ2ZXJzaW9uXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBHZXRzIG1ldGFkYXRhIGZvciB0aGUgcmVxdWVzdGVkIGluZGV4LiBPbmx5IGF2YWlsYWJsZSBmb3IgdmVyc2lvbmVkIGxheWVycyB3aGVyZSB0aGUgcGFydGl0aW9uaW5nIHNjaGVtZSBpcyBgaGVyZXRpbGVgLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgaW5kZXggbWV0YWRhdGEgb2YgdmVyc2lvbmVkXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4gQ29udGVudCBvZiB0aGlzXG4gKiBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIGxheWVyIGFscmVhZHkgY29uZmlndXJlZCBpbiB0aGUgY2F0YWxvZyBjb25maWd1cmF0aW9uLiBFeGFjdGx5IG9uZSBsYXllciBJRCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cgYWdhaW5zdCB3aGljaCB0byBydW4gdGhlIHF1ZXJ5LiBNdXN0IGJlIGEgdmFsaWQgY2F0YWxvZyB2ZXJzaW9uLlxuICogQHBhcmFtIHF1YWRLZXkgVGhlIGdlb21ldHJpYyBhcmVhIHNwZWNpZmllZCBieSBhbiBpbmRleCBpbiB0aGUgcmVxdWVzdCwgcmVwcmVzZW50ZWQgYXMgYSBIRVJFIHRpbGVcbiAqIEBwYXJhbSBkZXB0aCBUaGUgcmVjdXJzaW9uIGRlcHRoIG9mIHRoZSByZXNwb25zZS4gSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlc1xuICogIG9ubHkgZGF0YSBmb3IgdGhlIHF1YWRLZXkgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBJbiB0aGlzIHdheSwgZGVwdGggZGVzY3JpYmVzIHRoZVxuICogbWF4aW11bSBsZW5ndGggb2YgdGhlIHN1YlF1YWRLZXlzIGluIHRoZSByZXNwb25zZS4gVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGRlcHRoIHBhcmFtZXRlciBpcyA0LlxuICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgQWRkaXRpb25hbCBmaWVsZHMgLSAmI3g2MDtkYXRhU2l6ZSYjeDYwOywgJiN4NjA7Y2hlY2tzdW0mI3g2MDssICYjeDYwO2NvbXByZXNzZWREYXRhU2l6ZSYjeDYwO1xuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB1c2VkIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3Jkc1xuICogIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzIGFuZCAgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpY1xuICogIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcXVhZFRyZWVJbmRleChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS92ZXJzaW9ucy97dmVyc2lvbn0vcXVhZGtleXMve3F1YWRLZXl9L2RlcHRocy97ZGVwdGh9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcInt2ZXJzaW9ufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widmVyc2lvblwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie3F1YWRLZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJxdWFkS2V5XCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7ZGVwdGh9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkZXB0aFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJhZGRpdGlvbmFsRmllbGRzXCIsIHBhcmFtc1tcImFkZGl0aW9uYWxGaWVsZHNcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEdldHMgbWV0YWRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgaW5kZXguIE9ubHkgYXZhaWxhYmxlIGZvciB2b2xhdGlsZSBsYXllcnMgd2hlcmUgdGhlIHBhcnRpdGlvbmluZyBzY2hlbWUgaXMgYGhlcmV0aWxlYC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGluZGV4IG1ldGFkYXRhIGZvciB2b2xhdGlsZSBsYXllcnNcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYVxuICogIHZhbGlkIGxheWVyIGFscmVhZHkgY29uZmlndXJlZCBpbiB0aGUgY2F0YWxvZyBjb25maWd1cmF0aW9uLiBFeGFjdGx5IG9uZSBsYXllciBJRCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQHBhcmFtIHF1YWRLZXkgVGhlIGdlb21ldHJpYyBhcmVhIHNwZWNpZmllZCBieSBhbiBpbmRleCBpbiB0aGUgcmVxdWVzdCwgcmVwcmVzZW50ZWQgYXMgYSBIRVJFIHRpbGVcbiAqIEBwYXJhbSBkZXB0aCBUaGUgcmVjdXJzaW9uIGRlcHRoIG9mIHRoZSByZXNwb25zZS4gSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBvbmx5IGRhdGEgZm9yXG4gKiAgdGhlIHF1YWRLZXkgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBJbiB0aGlzIHdheSwgZGVwdGggZGVzY3JpYmVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc3ViUXVhZEtleXNcbiAqICBpbiB0aGUgcmVzcG9uc2UuIFRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgZm9yIHRoZSBkZXB0aCBwYXJhbWV0ZXIgaXMgNC5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFkZGl0aW9uYWwgZmllbGRzIC0gJiN4NjA7ZGF0YVNpemUmI3g2MDssICYjeDYwO2NoZWNrc3VtJiN4NjA7LCAmI3g2MDtjb21wcmVzc2VkRGF0YVNpemUmI3g2MDtcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdXNlZCB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzIGFuZCAgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzXG4gKiAgW0EtWmEtejAtOV0uIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBxdWFkVHJlZUluZGV4Vm9sYXRpbGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vcXVhZGtleXMve3F1YWRLZXl9L2RlcHRocy97ZGVwdGh9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntxdWFkS2V5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicXVhZEtleVwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RlcHRofVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGVwdGhcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBpZiAocGFyYW1zW1wiYWRkaXRpb25hbEZpZWxkc1wiXSkge1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICB9XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuIGFuZCBpdHMgYWZmaWxpYXRlKHMpLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgY29udGFpbiBwcm9wcmlldGFyeSBpbmZvcm1hdGlvblxuICogY29udHJvbGxlZCBieSBIRVJFIGFuZCBhcmUgcHJvdGVjdGVkIGJ5IGFwcGxpY2FibGUgY29weXJpZ2h0IGxlZ2lzbGF0aW9uLlxuICogQW55IHVzZSBhbmQgdXRpbGl6YXRpb24gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgb3RoZXIgbWF0ZXJpYWxzIGFuZFxuICogZGlzY2xvc3VyZSB0byBhbnkgdGhpcmQgcGFydGllcyBpcyBjb25kaXRpb25hbCB1cG9uIGhhdmluZyBhIHNlcGFyYXRlXG4gKiBhZ3JlZW1lbnQgd2l0aCBIRVJFIGZvciB0aGUgYWNjZXNzLCB1c2UsIHV0aWxpemF0aW9uIG9yIGRpc2Nsb3N1cmUgb2YgdGhpc1xuICogc29mdHdhcmUuIEluIHRoZSBhYnNlbmNlIG9mIHN1Y2ggYWdyZWVtZW50LCB0aGUgdXNlIG9mIHRoZSBzb2Z0d2FyZSBpcyBub3RcbiAqIGFsbG93ZWQuXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZG9Db21taXRPZmZzZXRzID0gZG9Db21taXRPZmZzZXRzO1xuZXhwb3J0cy5jb25zdW1lRGF0YSA9IGNvbnN1bWVEYXRhO1xuZXhwb3J0cy5kZWxldGVTdWJzY3JpcHRpb24gPSBkZWxldGVTdWJzY3JpcHRpb247XG5leHBvcnRzLmVuZHBvaW50ID0gZW5kcG9pbnQ7XG5leHBvcnRzLmVuZHBvaW50QnlDb25zdW1lciA9IGVuZHBvaW50QnlDb25zdW1lcjtcbmV4cG9ydHMuc2Vla1RvT2Zmc2V0ID0gc2Vla1RvT2Zmc2V0O1xuZXhwb3J0cy5zdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4vKipcbiAqIFN0cmVhbSBBUEkgdjJcbiAqIFRoZSBgc3RyZWFtYCBzZXJ2aWNlIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGNvbnN1bWUgZGF0YSBmcm9tIGEgc3RyZWFtIGxheWVyLlxuICogV2l0aCB0aGlzIHNlcnZpY2UgeW91IGNhbiBzdWJzY3JpYmUgdG8gYSBzdHJlYW0gbGF5ZXIgYW5kIGNvbnN1bWUgbWVzc2FnZXMuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDIuMC4wXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKipcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQXBpXG4gKi9cbi8qKlxuICogQWZ0ZXIgcmVhZGluZyBkYXRhLCB5b3Ugc2hvdWxkIGNvbW1pdCB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IG1lc3NhZ2UgcmVhZCBmcm9tIGVhY2ggcGFydGl0aW9uIHNvXG4gKiB0aGF0IHlvdXIgYXBwbGljYXRpb24gY2FuIHJlc3VtZSByZWFkaW5nIG5ldyBtZXNzYWdlcyBmcm9tIHRoZSBjb3JyZWN0IHBhcnRpdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCB0aGVyZSBpcyBhXG4gKiBkaXNydXB0aW9uIHRvIHRoZSBzdWJzY3JpcHRpb24sIHN1Y2ggYXMgYW4gYXBwbGljYXRpb24gY3Jhc2guIEFuIG9mZnNldCBjYW4gYWxzbyBiZSB1c2VmdWwgaWYgeW91IGRlbGV0ZSBhIHN1YnNjcmlwdGlvblxuICogdGhlbiByZWNyZWF0ZSBhIHN1YnNjcmlwdGlvbiBmb3IgdGhlIHNhbWUgbGF5ZXIsIGJlY2F1c2UgdGhlIG5ldyBzdWJzY3JpcHRpb24gY2FuIHN0YXJ0IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBvZmZzZXQuXG4gKiBUbyByZWFkIG1lc3NhZ2VzIGFscmVhZHkgY29tbWl0dGVkLCB1c2UgdGhlIC9zZWVrIGVuZHBvaW50LCB0aGVuIHVzZSAvcGFydGl0aW9ucy5cbiAqIFRoZSBiYXNlIHBhdGggdG8gdXNlIGlzIHRoZSB2YWx1ZSBvZiAnbm9kZUJhc2VVUkwnIHJldHVybmVkIGZyb20gL3N1YnNjcmliZSBQT1NUIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgQ29tbWl0cyBvZmZzZXRzIG9mIHRoZSBsYXN0IG1lc3NhZ2UgcmVhZFxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gY29tbWl0T2Zmc2V0cyBUaGUgb2Zmc2V0cyB0byBjb21taXQuIEl0IHNob3VsZCBiZSBzYW1lIGFzIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UgeW91IHdpc2ggdG8gY29tbWl0LlxuICogRG8gbm90IHBhc3Mgb2Zmc2V0ICsgMSBhcyBtZW50aW9uZWQgaW4gS2Fma2EgQ29uc3VtZXIgZG9jdW1lbnRhdGlvbi4gVGhlIHNlcnZpY2UgYWRkcyBvbmUgdG8gdGhlIG9mZnNldCB5b3Ugc3BlY2lmeS5cbiAqIEBwYXJhbSBzdWJzY3JpcHRpb25JZCBUaGUgc3Vic2NyaXB0aW9uSWQgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG9mIHRoZSAvc3Vic2NyaWJlIHJlcXVlc3QgKHJlcXVpcmVkIGlmIG1vZGUmI3gzRDtwYXJhbGxlbCkuXG4gKiBAcGFyYW0gbW9kZSBUaGUgc3Vic2NyaXB0aW9uIG1vZGUgb2YgdGhpcyBzdWJzY3JpcHRpb25JZCAoYXMgcHJvdmlkZWQgaW4gL3N1YnNjcmliZSBQT1NUIEFQSSkuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSWQgVGhlIGNvcnJlbGF0aW9uLWlkICh2YWx1ZSBvZiBSZXNwb25zZSBIZWFkZXIgJiMzOTtYLUNvcnJlbGF0aW9uLUlkJiMzOTspIGZyb20gcHJpb3Igc3RlcCBpbiBwcm9jZXNzLlxuICogIFNlZSB0aGUgW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1hcGkvYXBpLXJlZmVyZW5jZS5odG1sKSBmb3IgdGhlICYjeDYwO3N0cmVhbSYjeDYwOyBBUElcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZG9Db21taXRPZmZzZXRzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L29mZnNldHNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN1YnNjcmlwdGlvbklkXCIsIHBhcmFtc1tcInN1YnNjcmlwdGlvbklkXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibW9kZVwiLCBwYXJhbXNbXCJtb2RlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcImNvbW1pdE9mZnNldHNcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJjb21taXRPZmZzZXRzXCJdKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSWRcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JZFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENvbnN1bWVzIGRhdGEgZnJvbSBhIGxheWVyLiBSZXR1cm5zIG1lc3NhZ2VzIGZyb20gYSBzdHJlYW0gbGF5ZXIgZm9ybWF0dGVkIHNpbWlsYXIgdG8gYVxuICogW1BhcnRpdGlvbiBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1jbGllbnQtbGlicmFyeS9hcGlfcmVmZXJlbmNlX3NjYWxhL2luZGV4Lmh0bWwuUGFydGl0aW9uKS5cbiAqIElmIHRoZSBkYXRhIHNpemUgaXMgbGVzcyB0aGFuIDEgTUIsIHRoZSBgZGF0YWAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQuXG4gKiBJZiB0aGUgZGF0YSBzaXplIGlzIGdyZWF0ZXIgdGhhbiAxIE1CLCBhIGRhdGEgaGFuZGxlIHdpbGwgYmUgcmV0dXJuZWQgcG9pbnRpbmcgdG8gdGhlIG9iamVjdCBzdG9yZWQgaW4gdGhlIEJsb2Igc3RvcmUuXG4gKiBUaGUgYmFzZSBwYXRoIHRvIGJlIHVzZWQgaXMgdGhlIHZhbHVlIG9mICdub2RlQmFzZVVSTCcgcmV0dXJuZWQgZnJvbSAvc3Vic2NyaWJlIFBPU1QgcmVxdWVzdC5cbiAqXG4gKiBAc3VtbWFyeSBDb25zdW1lcyBkYXRhIGZyb20gYSBsYXllclxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uSWQgVGhlIHN1YnNjcmlwdGlvbklkIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBvZiB0aGUgL3N1YnNjcmliZSByZXF1ZXN0IChyZXF1aXJlZCBpZiBtb2RlJiN4M0Q7cGFyYWxsZWwpLlxuICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlIG9mIHRoaXMgc3Vic2NyaXB0aW9uSWQgKGFzIHByb3ZpZGVkIGluIC9zdWJzY3JpYmUgUE9TVCBBUEkpLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklkIFRoZSBjb3JyZWxhdGlvbi1pZCAodmFsdWUgb2YgUmVzcG9uc2UgSGVhZGVyICYjMzk7WC1Db3JyZWxhdGlvbi1JZCYjMzk7KSBmcm9tIHByaW9yIHN0ZXAgaW4gcHJvY2Vzcy5cbiAqIFNlZSB0aGUgW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1hcGkvYXBpLXJlZmVyZW5jZS5odG1sKSBmb3IgdGhlICYjeDYwO3N0cmVhbSYjeDYwOyBBUElcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uc3VtZURhdGEoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vcGFydGl0aW9uc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3Vic2NyaXB0aW9uSWRcIiwgcGFyYW1zW1wic3Vic2NyaXB0aW9uSWRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtb2RlXCIsIHBhcmFtc1tcIm1vZGVcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JZFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlkXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSWRcIl07XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBEZWxldGVzIGEgc3Vic2NyaXB0aW9uIHRvIGEgbGF5ZXIgKHRvcGljKS4gVGhpcyBvcGVyYXRpb24gcmVtb3ZlcyB0aGUgc3Vic2NyaXB0aW9uIGZyb20gdGhlIHNlcnZpY2UuXG4gKiBUaGUgYmFzZSBwYXRoIHRvIHVzZSBpcyB0aGUgdmFsdWUgb2YgJ25vZGVCYXNlVVJMJyByZXR1cm5lZCBmcm9tIC9zdWJzY3JpYmUgUE9TVCByZXF1ZXN0LlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZSBzdWJzY3JpcHRpb24gdG8gYSBsYXllclxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uSWQgVGhlIHN1YnNjcmlwdGlvbklkIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBvZiB0aGUgL3N1YnNjcmliZSByZXF1ZXN0IChyZXF1aXJlZCBpZiBtb2RlJiN4M0Q7cGFyYWxsZWwpLlxuICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlIG9mIHRoaXMgc3Vic2NyaXB0aW9uSWQgKGFzIHByb3ZpZGVkIGluIC9zdWJzY3JpYmUgUE9TVCBBUEkpLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklkIEEgdHJhY2UgSUQgdG8gdXNlIHRvIGFzc29jaWF0ZSB0aGlzIHJlcXVlc3Qgd2l0aCBvdGhlciByZXF1ZXN0cyBpbiB5b3VyIHByb2Nlc3MuXG4gKiBUaGUgY29ycmVsYXRpb24gSUQgaXMgdGhlIHZhbHVlIG9mIHRoZSByZXNwb25zZSBoZWFkZXIgJiN4NjA7WC1Db3JyZWxhdGlvbi1JZCYjeDYwOyBmcm9tIHRoZSBwcmlvciByZXF1ZXN0IGluIHlvdXIgcHJvY2Vzcy5cbiAqIE9uY2UgeW91IHVzZSBhIGNvcnJlbGF0aW9uIElEIGluIGEgJiN4NjA7L2RlbGV0ZSYjeDYwOyByZXF1ZXN0LCBkbyBub3QgdXNlIGl0IGFnYWluIHNpbmNlICYjeDYwOy9kZWxldGUmI3g2MDsgbWFya3MgdGhlIGVuZCBvZiBhIHByb2Nlc3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVN1YnNjcmlwdGlvbihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9zdWJzY3JpYmVcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN1YnNjcmlwdGlvbklkXCIsIHBhcmFtc1tcInN1YnNjcmlwdGlvbklkXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibW9kZVwiLCBwYXJhbXNbXCJtb2RlXCJdKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSWRcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JZFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgS2Fma2EgQnJva2VyIFVSTCdzLCBjbGllbnQgSUQgKHJlcXVpcmVkIHRvIGVuZm9yY2UgcXVvdGFzKSwgYW5kIEdyb3VwIElEIHByZWZpeC4gVHlwZSBpcyBzZXQgdG8gYSBjb25zdW1lci5cbiAqXG4gKiBAc3VtbWFyeSBFeHBvc2UgdGhlIGVuZHBvaW50IHRvIGNvbnN1bWUgdGhlIGRhdGEgb2YgdGhlIGxheWVyIGRpcmVjdGx5XG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5kcG9pbnQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZW5kcG9pbnRcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbi8qKlxuICogRXhwb3NlcyB0aGUgZW5kcG9pbnQgdG8gdXNlIHRvIHByb2R1Y2UgYW5kIGNvbnN1bWUgdGhlIGRhdGEgb2YgdGhlIGxheWVyIGRpcmVjdGx5LCBwZXIgdHlwZSBvZiB1c2VyIC0gY29uc3VtZXIgb3IgcHJvZHVjZXIuXG4gKiBJdCByZXR1cm5zIGEgbGlzdCBvZiBLYWZrYSBCcm9rZXIgVVJMJ3MsIGNsaWVudCBJRCAocmVxdWlyZWQgdG8gZW5mb3JjZSBxdW90YXMpLCBhbmQgR3JvdXAgSUQgcHJlZml4LlxuICpcbiAqIEBzdW1tYXJ5IEV4cG9zZXMgdGhlIGVuZHBvaW50IHRvIHVzZSB0byBwcm9kdWNlIGFuZCBjb25zdW1lIHRoZSBkYXRhIG9mIHRoZSBsYXllciBkaXJlY3RseVxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gdHlwZSBJZGVudGlmaWVzIHdoZXRoZXIgdGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGFyZSBmb3IgYSBwcm9kdWNlciBvciBjb25zdW1lci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5kcG9pbnRCeUNvbnN1bWVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3t0eXBlfS9lbmRwb2ludFwiXG4gICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgLnJlcGxhY2UoXCJ7dHlwZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInR5cGVcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBFbmFibGVzIHlvdSB0byBzdGFydCByZWFkaW5nIGRhdGEgZnJvbSBhIHNwZWNpZmllZCBvZmZzZXQuXG4gKiBZb3UgY2FuIG1vdmUgdGhlIG1lc3NhZ2UgcG9pbnRlciB0byBhbnkgb2Zmc2V0IGluIHRoZSBsYXllciAodG9waWMpLlxuICogTWVzc2FnZSBjb25zdW1wdGlvbiB3aWxsIHN0YXJ0IGZyb20gdGhhdCBvZmZzZXQuXG4gKiBPbmNlIHlvdSBzZWVrIHRvIGFuIG9mZnNldCwgdGhlcmUgaXMgbm8gcmV0dXJuaW5nIHRvIHRoZSBpbml0aWFsIG9mZnNldCwgdW5sZXNzIHRoZSBpbml0aWFsIG9mZnNldCBpcyBzYXZlZC5cbiAqIFRoZSBiYXNlIHBhdGggdG8gdXNlIGlzIHRoZSB2YWx1ZSBvZiAnbm9kZUJhc2VVUkwnIHJldHVybmVkIGZyb20gL3N1YnNjcmliZSBQT1NUIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgU2VlayB0byBwcmVkZWZpbmVkIG9mZnNldC5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgc3RyZWFtIGxheWVyLlxuICogQHBhcmFtIHNlZWtPZmZzZXRzIExpc3Qgb2Ygb2Zmc2V0cyBhbmQgb2Zmc2V0IHBhcnRpdGlvbnNcbiAqIEBwYXJhbSBzdWJzY3JpcHRpb25JZCBUaGUgc3Vic2NyaXB0aW9uSWQgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG9mIHRoZSAvc3Vic2NyaWJlIHJlcXVlc3QgKHJlcXVpcmVkIGlmIG1vZGUmI3gzRDtwYXJhbGxlbCkuXG4gKiBAcGFyYW0gbW9kZSBUaGUgc3Vic2NyaXB0aW9uIG1vZGUgb2YgdGhpcyBzdWJzY3JpcHRpb25JZCAoYXMgcHJvdmlkZWQgaW4gL3N1YnNjcmliZSBQT1NUIEFQSSkuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSWQgVGhlIGNvcnJlbGF0aW9uLWlkICh2YWx1ZSBvZiBSZXNwb25zZSBIZWFkZXIgJiMzOTtYLUNvcnJlbGF0aW9uLUlkJiMzOTspIGZyb20gcHJpb3Igc3RlcCBpbiBwcm9jZXNzLlxuICogU2VlIHRoZSBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLXN0b3JlL2FwaS1yZWZlcmVuY2UuaHRtbCkgZm9yIHRoZSAmI3g2MDtzdHJlYW0mI3g2MDsgQVBJXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlZWtUb09mZnNldChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9zZWVrXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdWJzY3JpcHRpb25JZFwiLCBwYXJhbXNbXCJzdWJzY3JpcHRpb25JZFwiXSk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm1vZGVcIiwgcGFyYW1zW1wibW9kZVwiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGlmIChwYXJhbXNbXCJzZWVrT2Zmc2V0c1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcInNlZWtPZmZzZXRzXCJdKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSWRcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JZFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIEVuYWJsZXMgbWVzc2FnZSBjb25zdW1wdGlvbiBmcm9tIGEgc3BlY2lmaWMgc3RyZWFtIGxheWVyICh0b3BpYykuXG4gKiBVc2UgdGhlIGJhc2UgcGF0aCByZXR1cm5lZCBmcm9tIHRoZSBBUEkgTG9va3VwIHNlcnZpY2UuIE5vdGU6IEZvciAqKm1vZGUgPSBwYXJhbGxlbCoqLFxuICogb25lIHVuaXQgb2YgcGFyYWxsZWxpc20gY3VycmVudGx5IGVxdWFscyAxIE1CcHMgaW5ib3VuZCBvciAyIE1CcHMgb3V0Ym91bmQsIHdoaWNoZXZlciBpcyBncmVhdGVyLCByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXG4gKiBUaGUgbnVtYmVyIG9mIHN1YnNjcmlwdGlvbnMgd2l0aGluIHRoZSBzYW1lIGdyb3VwIGNhbm5vdCBleGNlZWQgdGhlIHBhcmFsbGVsaXNtIGFsbG93ZWQuXG4gKiBGb3IgbW9yZSBkZXRhaWxzIHNlZVxuICogW0dldCBEYXRhIGZyb20gYSBTdHJlYW0gTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1hcGkvZGF0YV9kZXZfZ3VpZGUvcmVzdC9nZXR0aW5nLWRhdGEtc3RyZWFtLmh0bWwpLlxuICpcbiAqIEBzdW1tYXJ5IEVuYWJsZSBtZXNzYWdlIGNvbnN1bXB0aW9uIGZyb20gYSBzcGVjaWZpYyBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSBtb2RlIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBzZXJpYWwgb3IgcGFyYWxsZWwgc3Vic2NyaXB0aW9uIG1vZGUuIEZvciBtb3JlIGRldGFpbHMgc2VlXG4gKiBbR2V0IERhdGEgZnJvbSBhIFN0cmVhbSBMYXllcl0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9kYXRhX2Rldl9ndWlkZS9yZXN0L2dldHRpbmctZGF0YS1zdHJlYW0uaHRtbCkuXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uSWQgSW5jbHVkZSB0aGlzIHBhcmFtZXRlciBpZiB5b3Ugd2FudCB0byBsb29rIHVwIHRoZSAmI3g2MDtub2RlQmFzZVVSTCYjeDYwOyBmb3IgYSBnaXZlbiBzdWJzY3JpcHRpb25JZC5cbiAqIEBwYXJhbSBjb25zdW1lcklkIFRoZSBJRCB0byB1c2UgdG8gaWRlbnRpZnkgdGhpcyBjb25zdW1lci4gSXQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBjb25zdW1lciBncm91cC5cbiAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSBvbmUsIHRoZSBzeXN0ZW0gd2lsbCBnZW5lcmF0ZSBvbmUuXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uUHJvcGVydGllcyBPbmUgb3IgbW9yZSBLYWZrYSBDb25zdW1lciBwcm9wZXJ0aWVzIHRvIHVzZSBmb3IgdGhpcyBzdWJzY3JpcHRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbiAqIFtHZXQgRGF0YSBmcm9tIGEgU3RyZWFtIExheWVyXShodHRwczovL2RldmVsb3Blci5oZXJlLmNvbS9kb2N1bWVudGF0aW9uL2RhdGEtYXBpL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLXN0cmVhbS5odG1sKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3Vic2NyaWJlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3N1YnNjcmliZVwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibW9kZVwiLCBwYXJhbXNbXCJtb2RlXCJdKTtcbiAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3Vic2NyaXB0aW9uSWRcIiwgcGFyYW1zW1wic3Vic2NyaXB0aW9uSWRcIl0pO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb25zdW1lcklkXCIsIHBhcmFtc1tcImNvbnN1bWVySWRcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzXG4gICAgfTtcbiAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgaWYgKHBhcmFtc1tcInN1YnNjcmlwdGlvblByb3BlcnRpZXNcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBrYWZrYUNvbnN1bWVyUHJvcGVydGllczogcGFyYW1zW1wic3Vic2NyaXB0aW9uUHJvcGVydGllc1wiXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2hlY2tIYW5kbGVFeGlzdHMgPSBjaGVja0hhbmRsZUV4aXN0cztcbmV4cG9ydHMuZGVsZXRlVm9sYXRpbGVCbG9iID0gZGVsZXRlVm9sYXRpbGVCbG9iO1xuZXhwb3J0cy5nZXRWb2xhdGlsZUJsb2IgPSBnZXRWb2xhdGlsZUJsb2I7XG5leHBvcnRzLnB1dFZvbGF0aWxlQmxvYiA9IHB1dFZvbGF0aWxlQmxvYjtcbi8qKlxuICogVm9sYXRpbGUgQmxvYiBBUEkgdjFcbiAqIFRoZSBgdm9sYXRpbGUtYmxvYmAgc2VydmljZSBzdXBwb3J0cyB0aGUgdXBsb2FkIGFuZCByZXRyaWV2YWwgb2Ygdm9sYXRpbGUgZGF0YSBmcm9tIHRoZSBzdG9yYWdlIG9mIGEgY2F0YWxvZy5cbiAqIEVhY2ggZGlzY3JldGUgY2h1bmsgb2YgZGF0YSBpcyBzdG9yZWQgYXMgYSBibG9iIChCaW5hcnkgTGFyZ2UgT2JqZWN0KS5cbiAqIEVhY2ggYmxvYiBoYXMgaXRzIG93biB1bmlxdWUgaWQgKGRhdGEgaGFuZGxlKSB3aGljaCBpcyBzdG9yZWQgYXMgcGFydGl0aW9uIG1ldGFkYXRhLlxuICogVG8gZ2V0IGEgcGFydGl0aW9uJ3MgZGF0YSwgeW91IGZpcnN0IHVzZSBgbWV0YWRhdGFgIHNlcnZpY2UgdG8gcmV0cmlldmVcbiAqIHRoZSBwYXJ0aXRpb24ncyBtZXRhZGF0YSAoZGF0YSBoYW5kbGUpIHdpdGggdGhlIGFkZHJlc3NlcyBvZiB0aGUgcmVsZXZhbnQgYmxvYnMuXG4gKiBZb3UgdGhlbiB1c2UgdGhvc2UgYWRkcmVzc2VzIHRvIHB1bGwgdGhlIGRhdGEgdXNpbmcgdGhlIGB2b2xhdGlsZS1ibG9iYCBzZXJ2aWNlLlxuICogVW5saWtlIHRoZSBgYmxvYmAgc2VydmljZSwgZGF0YSBoYW5kbGVzIGNhbiBiZSBvdmVyd3JpdHRlbi4gSGVuY2UgdGhlIHZvbGF0aWxlIGFzcGVjdC5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjFcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFZvbGF0aWxlQmxvYkFwaVxuICovXG4vKipcbiAqIENoZWNrcyBpZiBhIHZvbGF0aWxlIGJsb2IgZXhpc3RzIGZvciB0aGUgcmVxdWVzdGVkIGRhdGEgaGFuZGxlLlxuICpcbiAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhIGRhdGEgaGFuZGxlIGV4aXN0c1xuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSB2b2xhdGlsZSBibG9iIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIHZvbGF0aWxlIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2ImIzM5O3MgY29udGVudHMuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tIYW5kbGVFeGlzdHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlbGV0ZXMgYSB2b2xhdGlsZSBkYXRhIGJsb2IgZnJvbSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSAodm9sdW1lKS5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgdm9sYXRpbGUgZGF0YSBibG9iXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIHZvbGF0aWxlIGRhdGEgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUgdm9sYXRpbGUgZGF0YSBibG9iIHdoaWNoIGNvbnRlbnRzIHdpbGwgYmUgZGVsZXRlZC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVWb2xhdGlsZUJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyc1xuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJldHJpZXZlcyBhIHZvbGF0aWxlIGRhdGEgYmxvYiBmcm9tIHN0b3JhZ2UuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBhIHZvbGF0aWxlIGJsb2JcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIHZvbGF0aWxlIGRhdGEgYmxvYi5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgdm9sYXRpbGUgZGF0YSBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJiMzOTtzIGNvbnRlbnRzLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Vm9sYXRpbGVCbG9iKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBQZXJzaXN0cyB0aGUgdm9sYXRpbGUgZGF0YSBibG9iIGluIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtICh2b2x1bWUpLlxuICpcbiAqIEBzdW1tYXJ5IFB1Ymxpc2hlcyBhIHZvbGF0aWxlIGRhdGEgYmxvYlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSB2b2xhdGlsZSBkYXRhIGJsb2IgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHZvbGF0aWxlIGRhdGEgYmxvYi5cbiAqIEBwYXJhbSBib2R5IFRoZSBkYXRhIHRvIHVwbG9hZCBhcyBwYXJ0IG9mIHRoZSBibG9iLiBTaXplIGxpbWl0OiAyIE1CXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHV0Vm9sYXRpbGVCbG9iKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGhlYWRlcnNcbiAgICB9O1xuICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2xpYlwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5ID0gdm9pZCAwO1xuLyoqXG4gKiBDYWNoZXMgdGhlIHBhcnRpdGlvbnMgbWV0YWRhdGEgdXNpbmcgYSBrZXktdmFsdWUgcGFpci5cbiAqL1xuY2xhc3MgTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkge1xuICAgIGNhY2hlO1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgW1tNZXRhZGF0YUNhY2hlUmVwb3NpdG9yeV1dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhY2hlIFRoZSBbW0tleVZhbHVlQ2FjaGVdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW01ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2FjaGUpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHV0KHJxLCBocm4sIGxheWVySWQsIHBhcnRpdGlvbnMsIHZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgcGFydGl0aW9uc0lkcyA9IHJxLmdldFBhcnRpdGlvbklkcygpO1xuICAgICAgICBsZXQga2V5O1xuICAgICAgICBpZiAocGFydGl0aW9uc0lkcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBtZXRhZGF0YSBvZiBwYXJ0aXRpb25zKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gdGhpcy5jcmVhdGVLZXkoe1xuICAgICAgICAgICAgICAgICAgICBocm4sXG4gICAgICAgICAgICAgICAgICAgIGxheWVySWQsXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbklkOiBtZXRhZGF0YS5wYXJ0aXRpb25cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlLnB1dChrZXksIEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBrZXkgPSB0aGlzLmNyZWF0ZUtleSh7XG4gICAgICAgICAgICBocm4sXG4gICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgdmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUucHV0KGtleSwgSlNPTi5zdHJpbmdpZnkocGFydGl0aW9ucykpO1xuICAgIH1cbiAgICBnZXQocnEsIGhybiwgbGF5ZXJJZCwgdmVyc2lvbikge1xuICAgICAgICBjb25zdCBwYXJ0aXRpb25zSWRzID0gcnEuZ2V0UGFydGl0aW9uSWRzKCk7XG4gICAgICAgIGxldCBrZXk7XG4gICAgICAgIGlmIChwYXJ0aXRpb25zSWRzKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVQYXJ0aXRpb25zID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhcnRpdGlvbklkIG9mIHBhcnRpdGlvbnNJZHMpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLmNyZWF0ZUtleSh7XG4gICAgICAgICAgICAgICAgICAgIGhybixcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uSWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkUGFydGl0aW9uID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplZFBhcnRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVQYXJ0aXRpb25zLnB1c2goSlNPTi5wYXJzZShzZXJpYWxpemVkUGFydGl0aW9uKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnNJZHMubGVuZ3RoICE9PSBhdmFpbGFibGVQYXJ0aXRpb25zLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBZGRpdGlvbmFsRmllbGRzQXZhaWxhYmxlKGF2YWlsYWJsZVBhcnRpdGlvbnMsIHJxLmdldEFkZGl0aW9uYWxGaWVsZHMoKSkpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBJbiB0aGUgY2FzZSB3aGVuIG5vdCBhbGwgcGFydGl0aW9ucyBhcmUgYXZhaWxhYmxlLCBvciBzb21lIG9mIHBhcnRpdGlvbiBoYXMgbm90IHJlcXVlc3RlZCBhIHNvbWUgb2YgYWRkaXRpb25hbCBmaWVsZCxcbiAgICAgICAgICAgICAgICAgKiB3ZSBmYWlsIHRoZSBjYWNoZSBsb29rdXAuXG4gICAgICAgICAgICAgICAgICogVGhpcyBjYW4gYmUgZW5oYW5jZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZVBhcnRpdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAga2V5ID0gdGhpcy5jcmVhdGVLZXkoe1xuICAgICAgICAgICAgaHJuLFxuICAgICAgICAgICAgbGF5ZXJJZCxcbiAgICAgICAgICAgIHZlcnNpb25cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRQYXJ0aXRpb25zID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWRQYXJ0aXRpb25zXG4gICAgICAgICAgICA/IEpTT04ucGFyc2Uoc2VyaWFsaXplZFBhcnRpdGlvbnMpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3JlYXRlS2V5KHBhcmFtcykge1xuICAgICAgICByZXR1cm4gKGAke3BhcmFtcy5ocm59Ojoke3BhcmFtcy5sYXllcklkfTo6YCArXG4gICAgICAgICAgICAocGFyYW1zLnZlcnNpb24gPyBgJHtwYXJhbXMudmVyc2lvbn06OmAgOiBcIlwiKSArXG4gICAgICAgICAgICAocGFyYW1zLnBhcnRpdGlvbklkXG4gICAgICAgICAgICAgICAgPyBgJHtwYXJhbXMucGFydGl0aW9uSWR9OjpwYXJ0aXRpb25gXG4gICAgICAgICAgICAgICAgOiBcInBhcnRpdGlvbnNcIikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgYWxsIGNhY2hlZCBwYXJ0aXRpb25zIHdpdGggYWRkaXRpb25hbCBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FjaGVkUGFydGl0aW9ucyBUaGUgYXJyYXkgb2YgdGhlIGNhY2hlZCBwYXJ0aXRpb25zXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgdGhlIGFycmF5IG9mIHRoZSByZXF1ZXN0ZWQgYWRkaXRpb25hbCBmaWVsZHMuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiBzb21lIG9mIHRoZSBjYWNoZWQgcGFydGl0aW9uIGRvZXMgbm90IGhhdmUgc29tZSBhZGRpdGlvbmFsIGZpZWxkLlxuICAgICAqIEZhbHNlIG90aGVyd2lzZSBvciBpZiBhbnkgYWRkaXRpb25hbEZpZWxkcyBoYXMgbm90IGJlZW4gcmVxdWVzdGVkLlxuICAgICAqL1xuICAgIGNoZWNrQWRkaXRpb25hbEZpZWxkc0F2YWlsYWJsZShjYWNoZWRQYXJ0aXRpb25zLCBhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsRmllbGRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNhY2hlZFBhcnRpdGlvbiBvZiBjYWNoZWRQYXJ0aXRpb25zKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFkZGl0aW9uYWxGaWVsZCBvZiBhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZWRQYXJ0aXRpb24uaGFzT3duUHJvcGVydHkoYWRkaXRpb25hbEZpZWxkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydHMuTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkgPSBNZXRhZGF0YUNhY2hlUmVwb3NpdG9yeTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeSA9IHZvaWQgMDtcbi8qKlxuICogQ2FjaGVzIHRoZSBRdWFkVHJlZUluZGV4IHVzaW5nIGEga2V5LXZhbHVlIHBhaXIuXG4gKi9cbmNsYXNzIFF1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnkge1xuICAgIGNhY2hlO1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgW1tRdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FjaGUgVGhlIFtbS2V5VmFsdWVDYWNoZV1dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gVGhlIFtbUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeV1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhY2hlKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcmVzIGEga2V5LXZhbHVlIHBhaXIgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1dChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUucHV0KHRoaXMuY3JlYXRlS2V5KHBhcmFtcyksIEpTT04uc3RyaW5naWZ5KHBhcmFtcy50cmVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBRdWFkVHJlZUluZGV4IGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBbW1F1YWRUcmVlSW5kZXhDYWNoZVBhcmFtc11dIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIFRoZSBRdWFkVHJlZUluZGV4IGZvciB0aGUgVGlsZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSBRdWFkVHJlZUluZGV4IGRvZXMgbm90IGV4aXN0LlxuICAgICAqL1xuICAgIGdldChwYXJhbXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jcmVhdGVLZXkocGFyYW1zKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFRyZWUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZFRyZWUgPyBKU09OLnBhcnNlKHNlcmlhbGl6ZWRUcmVlKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3JlYXRlS2V5KHBhcmFtcykge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gcGFyYW1zLnZlcnNpb24gIT09IHVuZGVmaW5lZCA/IGA6OiR7cGFyYW1zLnZlcnNpb259YCA6IFwiXCI7XG4gICAgICAgIHJldHVybiBgJHtwYXJhbXMuaHJufTo6JHtwYXJhbXMubGF5ZXJJZH06OiR7cGFyYW1zLnJvb3QudG9IZXJlVGlsZSgpfSR7dmVyc2lvbn06OiR7cGFyYW1zLmRlcHRofTo6cXVhZHRyZWVgO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeSA9IFF1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL01ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5XCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BcnRpZmFjdENsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIEdldHMgc2NoZW1hIG1ldGFkYXRhIGFuZCBkYXRhIGZyb20gdGhlIHBsYXRmb3JtIEFydGlmYWN0IFNlcnZpY2UuXG4gKi9cbmNsYXNzIEFydGlmYWN0Q2xpZW50IHtcbiAgICBzZXR0aW5ncztcbiAgICBhcGlWZXJzaW9uID0gXCJ2MVwiO1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgY2xpZW50IHRvIHdvcmsgd2l0aCBzY2hlbWFzIGRhdGEgaW4gdGhlIHBsYXRmb3JtIEFydGlmYWN0IFNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW0FydGlmYWN0Q2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHNjaGVtYSBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWFEZXRhaWxzUmVxdWVzdCBUaGUgW1tTY2hlbWFEZXRhaWxzUmVxdWVzdF1dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gQW4gb2JqZWN0IHdpdGggdGhlIHNjaGVtYSBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRTY2hlbWFEZXRhaWxzKHNjaGVtYURldGFpbHNSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGhybiA9IHNjaGVtYURldGFpbHNSZXF1ZXN0LmdldFNjaGVtYSgpO1xuICAgICAgICBpZiAoIWhybikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgUGxlYXNlIHByb3ZpZGUgdGhlIHNjaGVtYSBIUk4gYnkgc2NoZW1hRGV0YWlsc1JlcXVlc3Qud2l0aFNjaGVtYSgpYCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhyblN0ciA9IGhybi50b1N0cmluZygpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwiYXJ0aWZhY3RcIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQXJ0aWZhY3RBcGkuZ2V0U2NoZW1hVXNpbmdHRVQocmVxdWVzdCwge1xuICAgICAgICAgICAgc2NoZW1hSHJuOiBocm5TdHJcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgc2NoZW1hIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2NoZW1hUmVxdWVzdCBUaGUgW1tTY2hlbWFSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBBIGJsb2Igd2l0aCB0aGUgc2NoZW1hLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFNjaGVtYShzY2hlbWFSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSBzY2hlbWFSZXF1ZXN0LmdldFZhcmlhbnQoKTtcbiAgICAgICAgaWYgKCF2YXJpYW50KSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBQbGVhc2UgcHJvdmlkZSB0aGUgc2NoZW1hIHZhcmlhbnQgYnkgc2NoZW1hUmVxdWVzdC53aXRoVmFyaWFudCgpYCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJhcnRpZmFjdFwiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQXJ0aWZhY3RBcGkuZ2V0QXJ0aWZhY3RVc2luZ0dFVChyZXF1ZXN0LCB7XG4gICAgICAgICAgICBhcnRpZmFjdEhybjogdmFyaWFudC51cmxcbiAgICAgICAgfSkuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHtcbiAgICAgICAgICAgICAgICA0MDA6IFwiQmFkIHJlcXVlc3RcIixcbiAgICAgICAgICAgICAgICA0MDE6IFwiWW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB2aWV3IHRoZSBzY2hlbWFcIixcbiAgICAgICAgICAgICAgICA0MDM6IFwiQWNjZXNzaW5nIHRoZSBzY2hlbWEgaXMgZm9yYmlkZGVuXCIsXG4gICAgICAgICAgICAgICAgNDA0OiBcIlRoZSBzY2hlbWEgd2FzIG5vdCBmb3VuZFwiLFxuICAgICAgICAgICAgICAgIDUwMDogXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5zdGF0dXNUZXh0IHx8IG1lc3NhZ2VzW2Vycm9yLnN0YXR1c107XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBBcnRpZmFjdCBTZXJ2aWNlIGVycm9yOiBIVFRQICR7ZXJyb3Iuc3RhdHVzfTogJHttZXNzYWdlfWApKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgIH1cbn1cbmV4cG9ydHMuQXJ0aWZhY3RDbGllbnQgPSBBcnRpZmFjdENsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYXRhbG9nQ2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IENhdGFsb2dWZXJzaW9uUmVxdWVzdF8xID0gcmVxdWlyZShcIi4vQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XCIpO1xuLyoqXG4gKiBJbnRlcmFjdHMgd2l0aCB0aGUgYERhdGFTdG9yZWAgY2F0YWxvZy5cbiAqL1xuY2xhc3MgQ2F0YWxvZ0NsaWVudCB7XG4gICAgc2V0dGluZ3M7XG4gICAgYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICBocm47XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyB0aGUgW1tDYXRhbG9nQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nLlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gVGhlIFtbQ2F0YWxvZ0NsaWVudF1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhdGFsb2dIcm4sIHNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5ocm4gPSBjYXRhbG9nSHJuLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWRzIGFuZCBjYWNoZXMgdGhlIGZ1bGwgY2F0YWxvZyBjb25maWd1cmF0aW9uIGZvciB0aGUgcmVxdWVzdGVkIGNhdGFsb2cuXG4gICAgICogVGhlIGNhdGFsb2cgY29uZmlndXJhdGlvbiBjb250YWlucyBkZXNjcmlwdGl2ZSBhbmQgc3RydWN0dXJhbFxuICAgICAqIGluZm9ybWF0aW9uIHN1Y2ggYXMgbGF5ZXIgZGVmaW5pdGlvbnMgYW5kIGxheWVyIHR5cGVzLlxuICAgICAqXG4gICAgICogQHN1bW1hcnkgR2V0cyBkZXRhaWxzIGFib3V0IHRoZSByZXF1ZXN0ZWQgY2F0YWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBbW0NhdGFsb2dSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJlZCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY2F0YWxvZyBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRDYXRhbG9nKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwiY29uZmlnXCIsIHVuZGVmaW5lZCwgYWJvcnRTaWduYWwpO1xuICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5Db25maWdBcGkuZ2V0Q2F0YWxvZyhidWlsZGVyLCB7XG4gICAgICAgICAgICBjYXRhbG9nSHJuOiB0aGlzLmhybixcbiAgICAgICAgICAgIGJpbGxpbmdUYWc6IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG1pbmltdW0gdmVyc2lvbiBmb3IgdGhlIGdpdmVuIGNhdGFsb2cuIElmIHRoZSBjYXRhbG9nIGRvZXNuJ3QgY29udGFpbiBhbnkgdmVyc2lvbnMgZXJyb3Igd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBJcyBbW0NhdGFsb2dWZXJzaW9uUmVxdWVzdF1dIGluc3RhbmNlIGFuZCBoYXMgKChnZXRCaWxsaW5nVGFnKSkgbWV0aG9kLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIGEgRmV0Y2gpXG4gICAgICogYW5kIGFib3J0IGl0IGlmIHJlcXVpcmVkIHZpYSBhbiBBYm9ydENvbnRyb2xsZXIgb2JqZWN0LlxuICAgICAqICBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydFNpZ25hbFxuICAgICAqICBAcmV0dXJucyBBIHByb21pc2Ugb2YgdGhlIGh0dHAgcmVzcG9uc2UgdGhhdCBjb250YWlucyB0aGUgcG1pbmltdW0gdmVyc2lvbiBmb3IgdGhlIGdpdmVuIGNhdGFsb2cuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0RWFybGllc3RWZXJzaW9uKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwibWV0YWRhdGFcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIGNvbnN0IGVhcmxpZXN0VmVyc2lvbiA9IGF3YWl0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubWluaW11bVZlcnNpb24oYnVpbGRlciwge1xuICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZWFybGllc3RWZXJzaW9uLnZlcnNpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGxheWVyIHZlcnNpb25zIGZvciB0aGUgY2F0YWxvZyB2ZXJzaW9uLiBJdCB3aWxsIHJldHVybiBhcnJheSB3aXRoXG4gICAgICogYWxsIGNhdGFsb2cgbGF5ZXJzIGFuZCBsYXRlc3QgdmVyc2lvbiBmb3IgZWFjaCBsYXllciBvciByZXR1cm4gZXJyb3IgaWYgdGhlIGNhdGFsb2cgZG9lcyBub3RcbiAgICAgKiBoYXZlIGFueSB2ZXJzaW9ucyBvciBpZiB0aGUgdmVyc2lvbiBwYXNzZWQgaW4gdGhlIHF1ZXJ5IHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC4gSWYgYSBsYXllclxuICAgICAqIGRvZXMgbm90IGhhdmUgYW55IGRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBpdCBpcyBleGNsdWRlZCBmcm9tIHRoZSByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IElzIFtbTGF5ZXJWZXJzaW9uc1JlcXVlc3RdXSBpbnN0YW5jZSBhbmQgaGFzICgoZ2V0VmVyc2lvbikpIG1ldGhvZC5cbiAgICAgKiBWZXJzaW9uIC0gY2F0YWxvZyB2ZXJzaW9uIHRvIGdldCBhbGwgcmVsYXRlZCBsYXllcnMgdmVyc2lvbnMuIElmIG5vdCBkZWZpbmVkLCB0aGVuIHRoZSB2ZXJzaW9uIHdpbGwgYmUgdGhlIGxhdGVzdCBjYXRhbG9nIHZlcnNpb24uXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgYSBGZXRjaClcbiAgICAgKiBhbmQgYWJvcnQgaXQgaWYgcmVxdWlyZWQgdmlhIGFuIEFib3J0Q29udHJvbGxlciBvYmplY3QuXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIG9mIHRoZSBodHRwIHJlc3BvbnNlIHRoYXQgY29udGFpbnMgYW4gYXJyYXkgd2l0aCBhbGwgY2F0YWxvZyBsYXllcnMgYW5kIGxhdGVzdCB2ZXJzaW9uIGZvciBlYWNoIGxheWVyLlxuICAgICAqL1xuICAgIGFzeW5jIGdldExheWVyVmVyc2lvbnMocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgbGV0IHJlcXVlc3RlZENhdGFsb2dWZXJzaW9uID0gcmVxdWVzdC5nZXRWZXJzaW9uKCk7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWRDYXRhbG9nVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBiaWxsaW5ndGFnID0gcmVxdWVzdC5nZXRCaWxsaW5nVGFnKCk7XG4gICAgICAgICAgICBjb25zdCBjYXRhbG9nVmVyc2lvblJlcXVlc3QgPSBuZXcgQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XzEuQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0KCk7XG4gICAgICAgICAgICBpZiAoYmlsbGluZ3RhZykge1xuICAgICAgICAgICAgICAgIGNhdGFsb2dWZXJzaW9uUmVxdWVzdC53aXRoQmlsbGluZ1RhZyhiaWxsaW5ndGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcXVlc3RlZENhdGFsb2dWZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRMYXRlc3RWZXJzaW9uKGNhdGFsb2dWZXJzaW9uUmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcXVlc3RlZENhdGFsb2dWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJQbGVhc2Ugc2V0IHZlcnNpb24gd2l0aCBMYXllclZlcnNpb25zUmVxdWVzdC53aXRoVmVyc2lvbigpIG1ldGhvZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxheWVyVmVyc2lvbnMgPSBhd2FpdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmdldExheWVyVmVyc2lvbnMoYnVpbGRlciwge1xuICAgICAgICAgICAgdmVyc2lvbjogcmVxdWVzdGVkQ2F0YWxvZ1ZlcnNpb24sXG4gICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICB9KS5jYXRjaChhc3luYyAoZXJyb3IpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihlcnJvcikpKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXllclZlcnNpb25zLmxheWVyVmVyc2lvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhIGNhdGFsb2cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tDYXRhbG9nVmVyc2lvblJlcXVlc3RdXSBpbnN0YW5jZSB3aXRoIHRoZSBgZ2V0U3RhcnRWZXJzaW9uYCBtZXRob2QgdXNlZCB0byBnZXRcbiAgICAgKiB0aGUgY2F0YWxvZyBzdGFydCB2ZXJzaW9uIChleGNsdXNpdmUpLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgLTEuIEJ5IGNvbnZlbnRpb24gLTFcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIHZpcnR1YWwgaW5pdGlhbCB2ZXJzaW9uIGJlZm9yZSB0aGUgZmlyc3QgcHVibGljYXRpb24gdGhhdCBoYXMgdmVyc2lvbiAwLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvZiB0aGUgSFRUUCByZXNwb25zZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXlsb2FkIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldExhdGVzdFZlcnNpb24ocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgbGV0IHN0YXJ0VmVyc2lvbiA9IHJlcXVlc3QuZ2V0U3RhcnRWZXJzaW9uKCk7XG4gICAgICAgIGlmIChzdGFydFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhcnRWZXJzaW9uID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGF3YWl0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubGF0ZXN0VmVyc2lvbihidWlsZGVyLCB7XG4gICAgICAgICAgICBzdGFydFZlcnNpb24sXG4gICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXRlc3RWZXJzaW9uLnZlcnNpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGNhdGFsb2cgdmVyc2lvbnMuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB2ZXJzaW9ucyB0byBiZVxuICAgICAqIHJldHVybmVkIHBlciBjYWxsIGlzIDEwMDAgdmVyc2lvbnMuIElmIHRoZSByYW5nZSBpcyBiaWdnZXIgdGhhbiAxMDAwIHZlcnNpb25zLCB5b3UgZ2V0IHRoZSA0MDAgQmFkIFJlcXVlc3QgZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tDYXRhbG9nVmVyc2lvblJlcXVlc3RdXSBpbnN0YW5jZSB3aXRoIHRoZSBgZ2V0U3RhcnRWZXJzaW9uYCBhbmQgYGdldEVuZFZlcnNpb25gIG1ldGhvZHMuXG4gICAgICogKiBgU3RhcnRWZXJzaW9uYCAtIGEgY2F0YWxvZyBzdGFydCB2ZXJzaW9uIChleGNsdXNpdmUpLiBEZWZhdWx0IGlzIC0xLiBCeSBjb252ZW50aW9uIC0xXG4gICAgICogaW5kaWNhdGVzIHRoZSB2aXJ0dWFsIGluaXRpYWwgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uIHRoYXQgaGFzIHZlcnNpb24gMC5cbiAgICAgKiAqIGBFbmRWZXJzaW9uYCAtIGEgY2F0YWxvZyBlbmQgdmVyc2lvbiAoaW5jbHVzaXZlKS4gSWYgbm90IGRlZmluZWQsIHRoZW4gdGhlIGxhdGVzdCBjYXRhbG9nXG4gICAgICogdmVyc2lvbiBpcyBmZXRoY2VkIGFuZCB1c2VkLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvZiB0aGUgSFRUUCByZXNwb25zZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXlsb2FkIHdpdGggdmVyc2lvbnMgaW4gdGhlIHJlcXVlc3RlZFxuICAgICAqIHJhbmdlLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFZlcnNpb25zKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGxldCBzdGFydFZlcnNpb24gPSByZXF1ZXN0LmdldFN0YXJ0VmVyc2lvbigpO1xuICAgICAgICBpZiAoc3RhcnRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXJ0VmVyc2lvbiA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbmRWZXJzaW9uID0gcmVxdWVzdC5nZXRFbmRWZXJzaW9uKCk7XG4gICAgICAgIGlmIChlbmRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVuZFZlcnNpb24gPSBhd2FpdCB0aGlzLmdldExhdGVzdFZlcnNpb24ocmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubGlzdFZlcnNpb25zKGJ1aWxkZXIsIHtcbiAgICAgICAgICAgIHN0YXJ0VmVyc2lvbixcbiAgICAgICAgICAgIGVuZFZlcnNpb24sXG4gICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBgYmFzZVVybGAgYW5kIGNyZWF0ZXMgYHJlcXVlc3RCdWlsZGVyYCBmb3Igc2VuZGluZyByZXF1ZXN0cyB0byB0aGUgQVBJIExvb2t1cCBTZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBidWlsZGVyVHlwZSBUaGUgZW5kcG9pbnQgbmFtZSB0aGF0IGlzIG5lZWRlZCB0byBjcmVhdGUgYXByb3ByaWF0ZSBgcmVxdWVzdEJ1aWxkZXJgLlxuICAgICAqIEBwYXJhbSBocm4gVGhlIGNhdGFsb2cgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGByZXF1ZXN0QnVpbGRlcmBcbiAgICAgKi9cbiAgICBhc3luYyBnZXRSZXF1ZXN0QnVpbGRlcihidWlsZGVyVHlwZSwgaHJuLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKGJ1aWxkZXJUeXBlLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpLmNhdGNoKChlcnIpID0+IFByb21pc2UucmVqZWN0KGBFcnJvciByZXRyaWV2aW5nIGZyb20gY2FjaGUgYnVpbGRlciBmb3IgcmVzb3VyY2UgXCIke3RoaXMuaHJufVwiIGFuZCBhcGk6IFwiJHtidWlsZGVyVHlwZX0uXFxuJHtlcnJ9XCJgKSk7XG4gICAgfVxufVxuZXhwb3J0cy5DYXRhbG9nQ2xpZW50ID0gQ2F0YWxvZ0NsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYXRhbG9nUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBjYXRhbG9nIG1ldGFkYXRhIGZyb20gdGhlIHBsYXRmb3JtIENvbmZpZyBTZXJ2aWNlLlxuICovXG5jbGFzcyBDYXRhbG9nUmVxdWVzdCB7XG4gICAgYmlsbGluZ1RhZztcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tDYXRhbG9nUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gKDAsIHZhbGlkYXRlQmlsbGluZ1RhZ18xLnZhbGlkYXRlQmlsbGluZ1RhZykodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxufVxuZXhwb3J0cy5DYXRhbG9nUmVxdWVzdCA9IENhdGFsb2dSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNhdGFsb2dWZXJzaW9uUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBBcnRpZmFjdCBTZXJ2aWNlLlxuICovXG5jbGFzcyBDYXRhbG9nVmVyc2lvblJlcXVlc3Qge1xuICAgIHN0YXJ0VmVyc2lvbjtcbiAgICBlbmRWZXJzaW9uO1xuICAgIGJpbGxpbmdUYWc7XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGNhdGFsb2cgc3RhcnQgdmVyc2lvbiAoZXhjbHVzaXZlKSBmb3IgdGhlIHJlcXVlc3QuIERlZmF1bHQgaXMgLTEuIEJ5IGNvbnZlbnRpb24gLTFcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIHZpcnR1YWwgaW5pdGlhbCB2ZXJzaW9uIGJlZm9yZSB0aGUgZmlyc3QgcHVibGljYXRpb24gdGhhdCBoYXMgdmVyc2lvbiAwLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY2F0YWxvZyBzdGFydCB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGdldFN0YXJ0VmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRWZXJzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgY2F0YWxvZyBlbmQgdmVyc2lvbiAoaW5jbHVzaXZlKSBmb3IgdGhlIHJlcXVlc3QuIElmIG5vdCBkZWZpbmVkLCB0aGVuIHRoZSBsYXRlc3QgY2F0YWxvZ1xuICAgICAqIHZlcnNpb24gaXMgZmV0aGNlZCBhbmQgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNhdGFsb2cgZW5kIHZlcnNpb24uXG4gICAgICovXG4gICAgZ2V0RW5kVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kVmVyc2lvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHN0YXJ0VmVyc2lvbmAgdmFsdWUgdGhhdCBpcyB1c2VkIGluIHRoZSBgZ2V0VmVyc2lvbnMgYW5kIGBnZXRMYXRlc3RWZXJzaW9uYCBtZXRob2RzIG9mIFtbQ2F0YWxvZ0NsaWVudF1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXJ0VmVyc2lvbiBTcGVjaWZ5IHRoZSBlbmQgY2F0YWxvZyB2ZXJzaW9uIG9yLCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGxhdGVzdCBjYXRhbG9nIHZlcnNpb24sIHNldCB0byB1bmRlZmluZWQuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tDYXRhbG9nVmVyc2lvblJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFN0YXJ0VmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuc3RhcnRWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBlbmRWZXJzaW9uYCB2YWx1ZSB0aGF0IGlzIHVzZWQgaW4gdGhlIGBnZXRWZXJzaW9uc2AgbWV0aG9kIG9mIFtbQ2F0YWxvZ0NsaWVudF1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcnNpb24gU3BlY2lmeSB0aGUgZW5kIGNhdGFsb2cgdmVyc2lvbiBvciwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgY2F0YWxvZyB2ZXJzaW9uLCBzZXQgdG8gdW5kZWZpbmVkLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhFbmRWZXJzaW9uKHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5lbmRWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNCZuZGFzaDsxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0NhdGFsb2dWZXJzaW9uUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gKDAsIHZhbGlkYXRlQmlsbGluZ1RhZ18xLnZhbGlkYXRlQmlsbGluZ1RhZykodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxufVxuZXhwb3J0cy5DYXRhbG9nVmVyc2lvblJlcXVlc3QgPSBDYXRhbG9nVmVyc2lvblJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ2F0YWxvZ3NSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3QgdmFsaWRhdGVCaWxsaW5nVGFnXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvdmFsaWRhdGVCaWxsaW5nVGFnXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGNhdGFsb2dzIGZyb20gdGhlIHBsYXRmb3JtIENvbmZpZyBTZXJ2aWNlLlxuICovXG5jbGFzcyBDYXRhbG9nc1JlcXVlc3Qge1xuICAgIHNjaGVtYUhybjtcbiAgICBiaWxsaW5nVGFnO1xuICAgIC8qKlxuICAgICAqICBHZXRzIGEgc2NoZW1hIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzY2hlbWEgSFJOLlxuICAgICAqL1xuICAgIGdldFNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hSHJuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgb2YgYSBsYXllciBzY2hlbWEgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIHRoYXQgaXMgdXNlZCBpbiB0aGUgYGdldENhdGFsb2dzYCBtZXRob2Qgb2YgdGhlIFtbQ29uZmlnQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICogSWYgdGhlIHNjaGVtYSBpcyBzZXQsIHRoZSBgZ2V0Q2F0YWxvZ3NgIG1ldGhvZCByZXR1cm5zIGNhdGFsb2dzIHdpdGNoIGhhdmUgYSBsYXllciBvciBsYXllcnMgd2l0aCB0aGUgc3BlY2lmaWMgc2NoZW1hIEhSTi5cbiAgICAgKiBJZiB0aGUgc2NoZW1hIGlzIG5vdCBzZXQsIHRoZSBmaWx0ZXIgcmV0dXJucyBhbGwgb2YgdGhlIGNhdGFsb2dzIHRvIHdoaWNoIHlvdSBoYXZlIGFjY2Vzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWFIcm4gVGhlIGxheWVyIHNjaGVtYSBIUk4uXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0NhdGFsb2dSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hSHJuKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hSHJuID0gc2NoZW1hSHJuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbQ2F0YWxvZ3NSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLkNhdGFsb2dzUmVxdWVzdCA9IENhdGFsb2dzUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db25maWdDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuLyoqXG4gKiBBIGNsaWVudCBmb3IgdGhlIHBsYXRmb3JtIENvbmZpZyBTZXJ2aWNlLlxuICovXG5jbGFzcyBDb25maWdDbGllbnQge1xuICAgIHNldHRpbmdzO1xuICAgIGFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBjbGllbnQgZm9yIHRoZSBkYXRhIHN0b3JlIHRvIHdvcmsgd2l0aCBkYXRhXG4gICAgICogYWJvdXQgY2F0YWxvZ3MgY29uZmlndXJhdGlvbnMgaW4gdGhlIHN0b3JlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tDb25maWdDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzeW5jaHJvbm91c2x5IHJldHJpZXZlcyBhIGxpc3Qgb2YgY2F0YWxvZ3MgdG8gd2hpY2ggeW91IGhhdmUgYWNjZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFtbQ2F0YWxvZ3NSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgbGlzdCBvZiBjYXRhbG9ncyB0byB3aGljaCB5b3UgaGF2ZSBhY2Nlc3MuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc2NoZW1hIGlzIHNldCwgeW91IGdldCB0aGUgY2F0YWxvZ3Mgd2l0aCBsYXllcnMgZmlsdGVyZWQgYnkgdGhlIHNwZWNpZmllZCBsYXllciBzY2hlbWEgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pLlxuICAgICAqIElmIHRoZSBzY2hlbWEgaXMgbm90IHNldCwgdGhlIGZpbHRlciByZXR1cm5zIGFsbCBvZiB0aGUgY2F0YWxvZ3MgdG8gd2hpY2ggeW91IGhhdmUgYWNjZXNzLlxuICAgICAqL1xuICAgIGFzeW5jIGdldENhdGFsb2dzKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSBhd2FpdCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJjb25maWdcIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICBwYXJhbXMuYmlsbGluZ1RhZyA9IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMudmVyYm9zZSA9IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zY2hlbWFIcm4gPSByZXF1ZXN0LmdldFNjaGVtYSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkNvbmZpZ0FwaS5nZXRDYXRhbG9ncyhyZXF1ZXN0QnVpbGRlciwgcGFyYW1zKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbmZpZ0NsaWVudCA9IENvbmZpZ0NsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EYXRhUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKlxuICogIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgZGF0YSBmcm9tIHRoZSBIRVJFIEJsb2IgU2VydmljZS5cbiAqL1xuY2xhc3MgRGF0YVJlcXVlc3Qge1xuICAgIGRhdGFIYW5kbGU7XG4gICAgcGFydGl0aW9uSWQ7XG4gICAgYmlsbGluZ1RhZztcbiAgICBmZXRjaE9wdGlvbiA9IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVJZk5vdEZvdW5kO1xuICAgIC8qKlxuICAgICAqIEdldHMgYSBkYXRhIGhhbmRsZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGUgZGF0YSBoYW5kbGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGUgY29udGVudHMgb2YgdGhhdCBibG9iLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYERhdGFIYW5kbGVgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXREYXRhSGFuZGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSGFuZGxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwcm92aWRlZCBkYXRhIGhhbmRsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBgRGF0YUhhbmRsZXJgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbRGF0YVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aERhdGFIYW5kbGUoZGF0YUhhbmRsZSkge1xuICAgICAgICB0aGlzLmRhdGFIYW5kbGUgPSBkYXRhSGFuZGxlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHBhcnRpdGlvbiBJRCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgcGFydGl0aW9uSURgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRQYXJ0aXRpb25JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGl0aW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHByb3ZpZGVkIHBhcnRpdGlvbiBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJ0aXRpb25JZCBUaGUgYHBhcnRpdGlvbklEYCBzdHJpbmcuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tEYXRhUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoUGFydGl0aW9uSWQocGFydGl0aW9uSWQpIHtcbiAgICAgICAgdGhpcy5wYXJ0aXRpb25JZCA9IHBhcnRpdGlvbklkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDTigJMxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQeKAk1ph4oCTejDigJM5XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0RhdGFSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgeW91IGNhbiB1c2UgdG8gc2V0IHRoZSBzb3VyY2UgZnJvbVxuICAgICAqIHdoaWNoIGRhdGEgc2hvdWxkIGJlIGZldGNoZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIGBnZXRGZXRjaE9wdGlvbigpYCBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIGBGZXRjaE9wdGlvbmAgZW51bS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIHVwZGF0ZWQgYERhdGFSZXF1ZXN0YCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICB3aXRoRmV0Y2hPcHRpb24ob3B0aW9uKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb24gPSBvcHRpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmZXRjaCBvcHRpb24gdGhhdCBjb250cm9scyBob3cgcmVxdWVzdHMgYXJlIGhhbmRsZWQuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBvcHRpb24gaXMgYE9ubGluZUlmTm90Rm91bmRgLiBJdCBxdWVyaWVzIHRoZSBuZXR3b3JrIGlmXG4gICAgICogdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgZmV0Y2ggb3B0aW9uLlxuICAgICAqL1xuICAgIGdldEZldGNoT3B0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaE9wdGlvbjtcbiAgICB9XG59XG5leHBvcnRzLkRhdGFSZXF1ZXN0ID0gRGF0YVJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSW5kZXhMYXllckNsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhIGluZGV4IGxheWVyIGFuZCBwcm92aWRlcyB0aGUgcG9zc2liaWxpdHkgdG8gZ2V0IHBhcnRpdGlvbnMgbWV0YWRhdGEgYW5kIGRhdGEuXG4gKi9cbmNsYXNzIEluZGV4TGF5ZXJDbGllbnQge1xuICAgIGFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgLyoqXG4gICAgICogSFJOIG9mIHRoZSBjYXRhbG9nLlxuICAgICAqL1xuICAgIGhybjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGxheWVyLlxuICAgICAqL1xuICAgIGxheWVySWQ7XG4gICAgLyoqXG4gICAgICogVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzZXR0aW5ncztcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBbW0luZGV4TGF5ZXJDbGllbnRdXSBpbnN0YW5jZSB3aXRoIEluZGV4TGF5ZXJDbGllbnRQYXJhbXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnMgZm9yIHVzZSB0byBpbml0aWFsaXplIEluZGV4TGF5ZXJDbGllbnQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuaHJuID0gcGFyYW1zLmNhdGFsb2dIcm4udG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5sYXllcklkID0gcGFyYW1zLmxheWVySWQ7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgYWxsIHBhcnRpdGlvbnMgbWV0YWRhdGEgZnJvbSBhIGxheWVyIHRoYXQgbWF0Y2ggYSBxdWVyeSBmcm9tIHRoZSBbW0luZGV4UXVlcnlSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gSW5kZXhRdWVyeVJlcXVlc3QgVGhlIFtbSW5kZXhRdWVyeVJlcXVlc3RdXSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgbWV0YWRhdGEgZm9yIGVhY2ggb2YgdGhlIHBhcnRpdGlvbnMgZnJvbSB0aGUgcmVxdWVzdGVkIGxheWVyLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhcnRpdGlvbnMocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7XG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IHF1ZXJ5XCIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJpbmRleFwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgY29uc3QgaW5kZXhNZXRhZGF0YSA9IGF3YWl0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuSW5kZXhBcGkucGVyZm9ybVF1ZXJ5KHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBsYXllcklEOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIGh1Z2U6IHJlcXVlc3QuZ2V0SHVnZVJlc3BvbnNlKClcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbmRleE1ldGFkYXRhLmRhdGFcbiAgICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKGluZGV4TWV0YWRhdGEuZGF0YSlcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZWplY3QoaW5kZXhNZXRhZGF0YS5lcnJvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgcGFydGl0aW9uIGRhdGEgdXNpbmcgZGF0YSBoYW5kbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZWwgVGhlIGRhdGEgbW9kZWwgb2YgcGFydGl0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHBhcnRpdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXREYXRhKG1vZGVsLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICBpZiAoIW1vZGVsLmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gZGF0YSBoYW5kbGUgZm9yIHRoaXMgcGFydGl0aW9uXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWlsZGVyID0gYXdhaXQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihcImJsb2JcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkJsb2JBcGkuZ2V0QmxvYihidWlsZGVyLCB7XG4gICAgICAgICAgICBkYXRhSGFuZGxlOiBtb2RlbC5pZCxcbiAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggYmFzZVVybCBhbmQgY3JlYXRlIHJlcXVlc3RCdWlsZGVyIGZvciBzZW5kaW5nIHJlcXVlc3RzIHRvIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UuXG4gICAgICogQHBhcmFtIGJ1aWxkZXJUeXBlIGVuZHBvaW50IG5hbWUgaXMgbmVlZGVkIHRvIGNyZWF0ZSBwcm9wcmlhdGUgcmVxdWVzdEJ1aWxkZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHJlcXVlc3RCdWlsZGVyXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmVxdWVzdEJ1aWxkZXIoYnVpbGRlclR5cGUsIGhybiwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShidWlsZGVyVHlwZSwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCBocm4sIGFib3J0U2lnbmFsKTtcbiAgICB9XG59XG5leHBvcnRzLkluZGV4TGF5ZXJDbGllbnQgPSBJbmRleExheWVyQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5JbmRleFF1ZXJ5UmVxdWVzdCA9IHZvaWQgMDtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGZyb20gdGhlIHBsYXRmb3JtIEluZGV4IFNlcnZpY2UuXG4gKi9cbmNsYXNzIEluZGV4UXVlcnlSZXF1ZXN0IHtcbiAgICBxdWVyeVN0cmluZztcbiAgICBpc0h1Z2VSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcXVlcnkgQW4gUlNRTCBxdWVyeSB0byB1c2UgdG8gcmV0cmlldmUgcGFydGl0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeS5cbiAgICAgKiBUaGUgcXVlcnkgbXVzdCB1c2UgdGhlIGluZGV4aW5nIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiB0aGUgaW5kZXggbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tJbmRleFF1ZXJ5UmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoUXVlcnlTdHJpbmcocXVlcnkpIHtcbiAgICAgICAgdGhpcy5xdWVyeVN0cmluZyA9IHF1ZXJ5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBpc0h1Z2VSZXNwb25zZSBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXNIdWdlIFRoZSBib29sZWFuIHBhcmFtZXRlciBzaG93cyBpcyB0aGUgcXVlcnkgaHVnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbSW5kZXhRdWVyeVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEh1Z2VSZXNwb25zZShpc0h1Z2UpIHtcbiAgICAgICAgdGhpcy5pc0h1Z2VSZXNwb25zZSA9IGlzSHVnZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBxdWVyeVN0cmluZyBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBxdWVyeVN0cmluZyBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0UXVlcnlTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U3RyaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGlzSHVnZVJlc3BvbnNlIHByb3BlcnR5IGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBpc0h1Z2VSZXNwb25zZWAgYm9vbGVhbi5cbiAgICAgKi9cbiAgICBnZXRIdWdlUmVzcG9uc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSHVnZVJlc3BvbnNlO1xuICAgIH1cbn1cbmV4cG9ydHMuSW5kZXhRdWVyeVJlcXVlc3QgPSBJbmRleFF1ZXJ5UmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MYXllclZlcnNpb25zUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGxheWVyIHZlcnNpb25zIG9mIGEgc3BlY2lmaWMgY2F0YWxvZyB2ZXJzaW9uLiAqL1xuY2xhc3MgTGF5ZXJWZXJzaW9uc1JlcXVlc3Qge1xuICAgIHZlcnNpb247XG4gICAgYmlsbGluZ1RhZztcbiAgICAvKipcbiAgICAgKiBHZXRzIGEgY2F0YWxvZyB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGNhdGFsb2cgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBnZXRWZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjYXRhbG9nIHZlcnNpb24gdmFsdWUgdGhhdCBpcyB1c2VkIGluIHRoZSAnZ2V0TGF5ZXJWZXJzaW9ucycgbWV0aG9kIG9mIFtbQ2F0YWxvZ0NsaWVudF1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcnNpb24gU3BlY2lmeSB0aGUgY2F0YWxvZyB2ZXJzaW9uLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbTGF5ZXJWZXJzaW9uc1JlcXVlc3RdXSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHdpdGhWZXJzaW9uKHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA04oCTMTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0HigJNaYeKAk3ow4oCTOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tMYXllclZlcnNpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNOKAkzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtB4oCTWmHigJN6MOKAkzldLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLkxheWVyVmVyc2lvbnNSZXF1ZXN0ID0gTGF5ZXJWZXJzaW9uc1JlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGFydGl0aW9uc1JlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCB2YWxpZGF0ZUJpbGxpbmdUYWdfMSA9IHJlcXVpcmUoXCIuLi91dGlscy92YWxpZGF0ZUJpbGxpbmdUYWdcIik7XG5jb25zdCB2YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0XzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvdmFsaWRhdGVQYXJ0aXRpb25zSWRzTGlzdFwiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGZyb20gdGhlIE1ldGFkYXRhIFNlcnZpY2UgQVBJLlxuICovXG5jbGFzcyBQYXJ0aXRpb25zUmVxdWVzdCB7XG4gICAgdmVyc2lvbjtcbiAgICBiaWxsaW5nVGFnO1xuICAgIHBhcnRpdGlvbklkcztcbiAgICBhZGRpdGlvbmFsRmllbGRzO1xuICAgIGZldGNoT3B0aW9uID0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZUlmTm90Rm91bmQ7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDTigJMxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQeKAk1ph4oCTejDigJM5XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1BhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcHJvdmlkZWQgcGFydGl0aW9uIElEcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZHMgVGhlIElEcyBvZiBwYXJ0aXRpb25zIGZyb20gd2hpY2ggeW91IHdhbnQgdG8gZ2V0IG1ldGFkYXRhLlxuICAgICAqXG4gICAgICogVGhlIHJlcXVpcmVkIHF1YW50aXR5IGlzIGJldHdlZW4gMSBhbmQgMTAwLlxuICAgICAqIElmIHBhcnRpdGlvbiBJRHMgYXJlIG5vdCBwcm92aWRlZCwgYWxsIHBhcnRpdGlvbnMgYXJlIHJldHJpZXZlZC5cbiAgICAgKiBJZiB0aGUgcXVhbnRpdHkgb2YgcGFydGl0aW9uIElEcyBpcyBsZXNzIHRoYW4gMSAoZW1wdHkgYXJyYXkpIG9yIG1vcmUgdGhhbiAxMDAsIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1BhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhQYXJ0aXRpb25JZHMoaWRzKSB7XG4gICAgICAgIHRoaXMucGFydGl0aW9uSWRzID0gKDAsIHZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3RfMS52YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0KShpZHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBwYXJ0aXRpb24gSURzIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBwYXJ0aXRpb25JZHNgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRQYXJ0aXRpb25JZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnRpdGlvbklkcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcHJvdmlkZWQgYWRkaXRpb25hbCBmaWVsZHM6IGBkYXRhU2l6ZWAsIGBjaGVja3N1bWAsIGBjb21wcmVzc2VkRGF0YVNpemVgLCBhbmQgYGNyY2AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBUaGUgYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICAgKiBUaGUgYXJyYXkgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB2YWx1ZXM6IGBkYXRhU2l6ZWAsIGBjaGVja3N1bWAsIGBjb21wcmVzc2VkRGF0YVNpemVgLCBhbmQgYGNyY2AuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1BhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhBZGRpdGlvbmFsRmllbGRzKGFkZGl0aW9uYWxGaWVsZHMpIHtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFkZGl0aW9uYWxGaWVsZHMgPSBhZGRpdGlvbmFsRmllbGRzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvci4gUGFyYW1ldGVyICdhZGRpdGlvbmFsRmllbGRzJyBjb3VsZCBub3QgY29udGFpbiBlbXB0eSBhcnJheS4gQWRkIHZhbHVlIG9yIGRvIG5vdCB1c2UgdGhpcyBtZXRob2QuXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYWRkaXRpb25hbCBmaWVsZHMgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYHBhcnRpdGlvbklkc2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEFkZGl0aW9uYWxGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxGaWVsZHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZldGNoIG9wdGlvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIHNldCB0aGUgc291cmNlIGZyb21cbiAgICAgKiB3aGljaCBkYXRhIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgICAqXG4gICAgICogQHNlZSBgZ2V0RmV0Y2hPcHRpb24oKWAgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBgRmV0Y2hPcHRpb25gIGVudW0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoZSB1cGRhdGVkIGBQYXJ0aXRpb25zUmVxdWVzdGAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgd2l0aEZldGNoT3B0aW9uKG9wdGlvbikge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9uID0gb3B0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgY29udHJvbHMgaG93IHJlcXVlc3RzIGFyZSBoYW5kbGVkLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgb3B0aW9uIGlzIGBPbmxpbmVJZk5vdEZvdW5kYC4gSXQgcXVlcmllcyB0aGUgbmV0d29yayBpZlxuICAgICAqIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgbm90IGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGZldGNoIG9wdGlvbi5cbiAgICAgKi9cbiAgICBnZXRGZXRjaE9wdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hPcHRpb247XG4gICAgfVxufVxuZXhwb3J0cy5QYXJ0aXRpb25zUmVxdWVzdCA9IFBhcnRpdGlvbnNSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Qb2xsUmVxdWVzdCA9IHZvaWQgMDtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBTdHJlYW0gU2VydmljZS5cbiAqL1xuY2xhc3MgUG9sbFJlcXVlc3Qge1xuICAgIG1vZGU7XG4gICAgc3Vic2NyaXB0aW9uSWQ7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2NyaXB0aW9uIG1vZGUgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIG1vZGUuXG4gICAgICovXG4gICAgZ2V0TW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tQb2xsUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTW9kZShtb2RlKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gaWQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqL1xuICAgIGdldFN1YnNjcmlwdGlvbklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tQb2xsUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoU3Vic2NyaXB0aW9uSWQoaWQpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IGlkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLlBvbGxSZXF1ZXN0ID0gUG9sbFJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3QgdmFsaWRhdGVCaWxsaW5nVGFnXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvdmFsaWRhdGVCaWxsaW5nVGFnXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IHF1YWR0cmVlIG1ldGFkYXRhIGZyb20gdGhlIFF1ZXJ5IFNlcnZpY2UgQVBJLlxuICpcbiAqIFRoaXMgY2xhc3Mgd29ya3Mgb25seSB3aXRoIHZlcnNpb25lZCBhbmQgdm9sYXRpbGUgbGF5ZXJzIHdoZXJlIHRoZSBwYXJ0aXRpb25pbmcgc2NoZW1lIGlzIEhFUkUgVGlsZS5cbiAqL1xuY2xhc3MgUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0IHtcbiAgICBxdWFkS2V5O1xuICAgIGRlcHRoO1xuICAgIGJpbGxpbmdUYWc7XG4gICAgYWRkaXRpb25hbEZpZWxkcztcbiAgICAvKipcbiAgICAgKiBBIGdlb21ldHJpYyBhcmVhIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRLZXkgQWRkcmVzc2VzIGEgdGlsZSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFF1YWRLZXkocXVhZEtleSkge1xuICAgICAgICB0aGlzLnF1YWRLZXkgPSBxdWFkS2V5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlY3Vyc2lvbiBkZXB0aCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGRlcHRoIHBhcmFtZXRlciBpcyA0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlcHRoIFRoZSByZWN1cnNpb24gZGVwdGggb2YgdGhlIHJlc3BvbnNlLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqXG4gICAgICogSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBvbmx5IGRhdGEgZnJvbSB0aGUgcXVhZGtleSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogSW4gdGhpcyB3YXksIHRoZSBkZXB0aCBkZXNjcmliZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdWJRdWFkS2V5cyBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICovXG4gICAgd2l0aERlcHRoKGRlcHRoKSB7XG4gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBhZGRpdGlvbmFsIGZpZWxkc1xuICAgICAqXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgQXJyYXkgb2Ygc3RyaW5ncy4gQXJyYXkgY291bGQgY29udGFpbiBuZXh0IHZhbHVlcyBcImRhdGFTaXplXCIgfCBcImNoZWNrc3VtXCIgfCBcImNvbXByZXNzZWREYXRhU2l6ZSB8IFwiY3JjXCJcIi5cbiAgICAgKiBUaGlzIHZhbHVlcyBjb3VsZCBiZSB1c2VmdWwgZm9yIGdldFBhcnRpdGlvbnMgbWV0aG9kIGZyb20gdmVyc2lvbmVkTGF5ZXJDbGllbnQgYW5kIHZvbGF0aWxlTGF5ZXJDbGllbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQWRkaXRpb25hbEZpZWxkcyhhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgIHRoaXMuYWRkaXRpb25hbEZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIFtbUXVhZEtleV1dIG9iamVjdCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSB0aGUgY29uZmlndXJlZCBbW1F1YWRLZXldXSBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0UXVhZEtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVhZEtleTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBkZXB0aCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGhlIGNvbmZpZ3VyZWQgZGVwdGguXG4gICAgICovXG4gICAgZ2V0RGVwdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlcHRoIHx8IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFkZGl0aW9uYWwgZmllbGRzIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQWRkaXRpb25hbCBmaWVsZHMuXG4gICAgICovXG4gICAgZ2V0QWRkaXRpb25hbEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkaXRpb25hbEZpZWxkcztcbiAgICB9XG59XG5leHBvcnRzLlF1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdCA9IFF1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWFkVHJlZUluZGV4UmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBxdWFkdHJlZSBtZXRhZGF0YSBmcm9tIHRoZSBRdWVyeSBTZXJ2aWNlIEFQSS5cbiAqXG4gKiBUaGlzIGNsYXNzIHdvcmtzIG9ubHkgd2l0aCB2ZXJzaW9uZWQgb3Igdm9sYXRpbGUgbGF5ZXJzIHdoZXJlIHRoZSBwYXJ0aXRpb25pbmcgc2NoZW1lIGlzIEhFUkUgVGlsZS5cbiAqL1xuY2xhc3MgUXVhZFRyZWVJbmRleFJlcXVlc3Qge1xuICAgIGNhdGFsb2dIcm47XG4gICAgbGF5ZXJJZDtcbiAgICBsYXllclR5cGU7XG4gICAgdmVyc2lvbjtcbiAgICBxdWFkS2V5O1xuICAgIGRlcHRoO1xuICAgIGJpbGxpbmdUYWc7XG4gICAgYWRkaXRpb25hbEZpZWxkcztcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBbW1F1YWRUcmVlSW5kZXhSZXF1ZXN0XV0gaW5zdGFuY2UgZm9yIGZldGNoaW5nIHRoZSBxdWFkdHJlZSBpbmRleCBmcm9tIHRoZSBRdWVyeSBTZXJ2aWNlIEFQSVxuICAgICAqIGZvciB2b2xhdGlsZSBvciB2ZXJzaW9uZWQgbGF5ZXJzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUgKFtbSFJOXV0pLlxuICAgICAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIuXG4gICAgICogQHBhcmFtIGxheWVyVHlwZSBUaGUgdHlwZSBvZiBsYXllciB0aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QuIEJ5IGRlZmF1bHQsIGEgbGF5ZXIgb2YgdGhlIHZlcnNpb25lZCB0eXBlIGlzIHVzZWQuXG4gICAgICogQHJldHVybiBUaGUgW1tRdWFkVHJlZUluZGV4UmVxdWVzdF1dIGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2F0YWxvZ0hybiwgbGF5ZXJJZCwgbGF5ZXJUeXBlID0gXCJ2ZXJzaW9uZWRcIikge1xuICAgICAgICB0aGlzLmNhdGFsb2dIcm4gPSBjYXRhbG9nSHJuO1xuICAgICAgICB0aGlzLmxheWVySWQgPSBsYXllcklkO1xuICAgICAgICB0aGlzLmxheWVyVHlwZSA9IGxheWVyVHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cgYWdhaW5zdCB3aGljaCB5b3Ugd2FudCB0byBydW4gdGhlIHF1ZXJ5LlxuICAgICAqIEl0IG11c3QgYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBTcGVjaWZ5IHRoZSBjYXRhbG9nIHZlcnNpb24gb3IsIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgbGF0ZXN0IGNhdGFsb2cgdmVyc2lvbiwgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoVmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGdlb21ldHJpYyBhcmVhIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRLZXkgQWRkcmVzc2VzIGEgdGlsZSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFF1YWRLZXkocXVhZEtleSkge1xuICAgICAgICB0aGlzLnF1YWRLZXkgPSBxdWFkS2V5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlY3Vyc2lvbiBkZXB0aCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGRlcHRoIHBhcmFtZXRlciBpcyA0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlcHRoIFRoZSByZWN1cnNpb24gZGVwdGggb2YgdGhlIHJlc3BvbnNlLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqXG4gICAgICogSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBvbmx5IGRhdGEgZnJvbSB0aGUgcXVhZGtleSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogSW4gdGhpcyB3YXksIHRoZSBkZXB0aCBkZXNjcmliZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdWJRdWFkS2V5cyBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICovXG4gICAgd2l0aERlcHRoKGRlcHRoKSB7XG4gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbUXVhZFRyZWVJbmRleFJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9ICgwLCB2YWxpZGF0ZUJpbGxpbmdUYWdfMS52YWxpZGF0ZUJpbGxpbmdUYWcpKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGFkZGl0aW9uYWwgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgQXJyYXkgb2Ygc3RyaW5ncy4gQXJyYXkgY291bGQgY29udGFpbiBuZXh0IHZhbHVlcyBcImRhdGFTaXplXCIgfCBcImNoZWNrc3VtXCIgfCBcImNvbXByZXNzZWREYXRhU2l6ZSB8IFwiY3JjXCJcIi5cbiAgICAgKiBUaGlzIHZhbHVlcyBjb3VsZCBiZSB1c2VmdWwgZm9yIGdldFBhcnRpdGlvbnMgbWV0aG9kIGZyb20gdmVyc2lvbmVkTGF5ZXJDbGllbnQgYW5kIHZvbGF0aWxlTGF5ZXJDbGllbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRUcmVlSW5kZXhSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhBZGRpdGlvbmFsRmllbGRzKGFkZGl0aW9uYWxGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5hZGRpdGlvbmFsRmllbGRzID0gYWRkaXRpb25hbEZpZWxkcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWd1cmVkIGNhdGFsb2cgdmVyc2lvbiBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjYXRhbG9nIHZlcnNpb24gbnVtYmVyLlxuICAgICAqL1xuICAgIGdldFZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgW1tRdWFkS2V5XV0gb2JqZWN0IGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHRoZSBjb25maWd1cmVkIFtbUXVhZEtleV1dIG9iamVjdC5cbiAgICAgKi9cbiAgICBnZXRRdWFkS2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWFkS2V5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIGRlcHRoIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aGUgY29uZmlndXJlZCBkZXB0aC5cbiAgICAgKi9cbiAgICBnZXREZXB0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVwdGggfHwgMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCB0eXBlIG9mIHRoZSBsYXllciBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICogQnkgZGVmYXVsdCwgYSBsYXllciBvZiB0aGUgdmVyc2lvbmVkIHR5cGUgaXMgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGxheWVyIHR5cGUuXG4gICAgICovXG4gICAgZ2V0TGF5ZXJUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllclR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgW1tIUk5dXSBpbnN0YW5jZSBvZiB0aGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUoSFJOKSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIFtbSFJOXV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgZ2V0Q2F0YWxvZ0hybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ0hybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxheWVyIElEIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGxheWVyIElEIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRMYXllcklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllcklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEFkZGl0aW9uYWwgZmllbGRzLlxuICAgICAqL1xuICAgIGdldEFkZGl0aW9uYWxGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxGaWVsZHM7XG4gICAgfVxufVxuZXhwb3J0cy5RdWFkVHJlZUluZGV4UmVxdWVzdCA9IFF1YWRUcmVlSW5kZXhSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1ZXJ5Q2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IE1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XzEgPSByZXF1aXJlKFwiLi4vY2FjaGUvTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlcIik7XG4vKipcbiAqIEEgY2xpZW50IGZvciB0aGUgUXVlcnkgU2VydmljZSBBUEkgdGhhdCBwcm92aWRlcyBhIHdheSB0byBnZXQgaW5mb3JtYXRpb24gKG1ldGFkYXRhKVxuICogYWJvdXQgbGF5ZXJzIGFuZCBwYXJ0aXRpb25zIHN0b3JlZCBpbiBhIGNhdGFsb2cuXG4gKiBUaGlzIHNlcnZpY2UgZXhwb3NlcyB0aGUgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHBhcnRpdGlvbiB0aGF0IHlvdSBjYW4gcXVlcnkgb25lIGJ5IG9uZSBvciB1c2luZyBhIHBhcmVudCB0aWxlLlxuICovXG5jbGFzcyBRdWVyeUNsaWVudCB7XG4gICAgc2V0dGluZ3M7XG4gICAgYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsaWVudCBmb3IgdGhlIFF1ZXJ5IFNlcnZpY2UgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tRdWVyeUNsaWVudF1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyB0aGUgcXVhZHRyZWUgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgY29uZmlndXJlZCBbW1F1YWRUcmVlSW5kZXhSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgcXVhZHRyZWUgaW5kZXggb2JqZWN0LlxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoUXVhZFRyZWVJbmRleChyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICBjb25zdCBxdWFkS2V5ID0gcmVxdWVzdC5nZXRRdWFkS2V5KCk7XG4gICAgICAgIGNvbnN0IGxheWVySWQgPSByZXF1ZXN0LmdldExheWVySWQoKTtcbiAgICAgICAgaWYgKCFxdWFkS2V5IHx8ICFvbHBfc2RrX2NvcmVfMS5UaWxlS2V5LmlzVmFsaWQocXVhZEtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgUXVhZEtleVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxheWVySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgSWQgb2YgdGhlIExheWVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYXRhbG9nVmVyc2lvbiA9IHJlcXVlc3QuZ2V0VmVyc2lvbigpO1xuICAgICAgICBpZiAocmVxdWVzdC5nZXRMYXllclR5cGUoKSA9PT0gXCJ2ZXJzaW9uZWRcIiAmJlxuICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPSBhd2FpdCB0aGlzLmdldENhdGFsb2dMYXRlc3RWZXJzaW9uKHJlcXVlc3QuZ2V0Q2F0YWxvZ0hybigpLCBhYm9ydFNpZ25hbCwgcmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoYEVycm9yIGdldHRpbmcgdGhlIGxhc3QgY2F0YWxvZyB2ZXJzaW9uOiAke2Vycm9yfWApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC5nZXRMYXllclR5cGUoKSA9PT0gXCJ2ZXJzaW9uZWRcIiAmJlxuICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGNhdGFsb2cgdmVyc2lvbmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCdWlsZGVyID0gYXdhaXQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwicXVlcnlcIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCByZXF1ZXN0LmdldENhdGFsb2dIcm4oKSwgYWJvcnRTaWduYWwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoYEVyb3JyIGNyZWF0aW5nIHJlcXVlc3Qgb2JqZWN0IGZvciBxdWVyeSBzZXJ2aWNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgY29uc3Qgc3ViUXVhZEtleXNNYXhMZW5ndGggPSByZXF1ZXN0LmdldERlcHRoKCk7XG4gICAgICAgIGxldCBmZXRjaGluZ1F1YWRUcmVlSW5kZXhGdW5jdGlvbjtcbiAgICAgICAgbGV0IHBhcmFtc0ZvckZldGNoUXVhZFRyZWVJbmRleCA9IHtcbiAgICAgICAgICAgIHZlcnNpb246IDAsXG4gICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgZGVwdGg6IHN1YlF1YWRLZXlzTWF4TGVuZ3RoLFxuICAgICAgICAgICAgcXVhZEtleTogb2xwX3Nka19jb3JlXzEuVGlsZUtleS5mcm9tUm93Q29sdW1uTGV2ZWwocXVhZEtleS5yb3csIHF1YWRLZXkuY29sdW1uLCBxdWFkS2V5LmxldmVsKVxuICAgICAgICAgICAgICAgIC5tb3J0b25Db2RlKClcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGJpbGxpbmdUYWc6IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpLFxuICAgICAgICAgICAgYWRkaXRpb25hbEZpZWxkczogcmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHJlcXVlc3QuZ2V0TGF5ZXJUeXBlKCkgPT09IFwidm9sYXRpbGVcIikge1xuICAgICAgICAgICAgZmV0Y2hpbmdRdWFkVHJlZUluZGV4RnVuY3Rpb24gPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlF1ZXJ5QXBpLnF1YWRUcmVlSW5kZXhWb2xhdGlsZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZldGNoaW5nUXVhZFRyZWVJbmRleEZ1bmN0aW9uID0gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5RdWVyeUFwaS5xdWFkVHJlZUluZGV4O1xuICAgICAgICAgICAgcGFyYW1zRm9yRmV0Y2hRdWFkVHJlZUluZGV4ID0ge1xuICAgICAgICAgICAgICAgIC4uLnBhcmFtc0ZvckZldGNoUXVhZFRyZWVJbmRleCxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBjYXRhbG9nVmVyc2lvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmV0Y2hpbmdRdWFkVHJlZUluZGV4RnVuY3Rpb24ocmVxdWVzdEJ1aWxkZXIsIHBhcmFtc0ZvckZldGNoUXVhZFRyZWVJbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgcGFydGl0aW9ucyB1c2luZyB0aGVpciBJRHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgYFBhcnRpdGlvbnNSZXF1ZXN0YCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIGZyb20gd2hpY2ggeW91IHdhbnQgdG8gZ2V0IHBhcnRpdGlvbnMuXG4gICAgICogQHBhcmFtIGhybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgcGFydGl0aW9ucy5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYXJ0aXRpb25zQnlJZChyZXF1ZXN0LCBsYXllcklkLCBocm4sIGFib3J0U2lnbmFsLCBjYXRhbG9nVmVyc2lvbikge1xuICAgICAgICBjb25zdCBpZHNMaXN0ID0gcmVxdWVzdC5nZXRQYXJ0aXRpb25JZHMoKTtcbiAgICAgICAgaWYgKCFpZHNMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IHBhcnRpdGlvbklkcyBsaXN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IE1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XzEuTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkodGhpcy5zZXR0aW5ncy5jYWNoZSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5KSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWRQYXJ0aXRpb25zID0gY2FjaGUuZ2V0KHJlcXVlc3QsIGhybi50b1N0cmluZygpLCBsYXllcklkLCBjYXRhbG9nVmVyc2lvbik7XG4gICAgICAgICAgICBpZiAoY2FjaGVkUGFydGl0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25zOiBjYWNoZWRQYXJ0aXRpb25zXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSBhd2FpdCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJxdWVyeVwiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoYEVyb3JyIGNyZWF0aW5nIHJlcXVlc3Qgb2JqZWN0IGZvciBxdWVyeSBzZXJ2aWNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgY29uc3QgbWVkYXRhZGEgPSBhd2FpdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlF1ZXJ5QXBpLmdldFBhcnRpdGlvbnNCeUlkKHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgcGFydGl0aW9uOiBpZHNMaXN0LFxuICAgICAgICAgICAgYWRkaXRpb25hbEZpZWxkczogcmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKCksXG4gICAgICAgICAgICB2ZXJzaW9uOiBjYXRhbG9nVmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gYCR7Y2F0YWxvZ1ZlcnNpb259YCA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSAhPT0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZU9ubHkgJiZcbiAgICAgICAgICAgIG1lZGF0YWRhICYmXG4gICAgICAgICAgICBtZWRhdGFkYS5wYXJ0aXRpb25zICYmXG4gICAgICAgICAgICBtZWRhdGFkYS5wYXJ0aXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcGFydGl0aW9ucyA9IG1lZGF0YWRhLnBhcnRpdGlvbnMubWFwKChwYXJ0aXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgY2hlY2tzdW06IHBhcnRpdGlvbi5jaGVja3N1bSxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2VkRGF0YVNpemU6IHBhcnRpdGlvbi5jb21wcmVzc2VkRGF0YVNpemUsXG4gICAgICAgICAgICAgICAgZGF0YUhhbmRsZTogcGFydGl0aW9uLmRhdGFIYW5kbGUgfHwgXCJcIixcbiAgICAgICAgICAgICAgICBkYXRhU2l6ZTogcGFydGl0aW9uLmRhdGFTaXplLFxuICAgICAgICAgICAgICAgIHBhcnRpdGlvbjogcGFydGl0aW9uLnBhcnRpdGlvbixcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBwYXJ0aXRpb24udmVyc2lvblxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY2FjaGUucHV0KHJlcXVlc3QsIGhybi50b1N0cmluZygpLCBsYXllcklkLCBwYXJ0aXRpb25zLCBjYXRhbG9nVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtZWRhdGFkYSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0Q2F0YWxvZ0xhdGVzdFZlcnNpb24oY2F0YWxvZ0hybiwgYWJvcnRTaWduYWwsIGJpbGxpbmdUYWcpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShcIm1ldGFkYXRhXCIsIHRoaXMuYXBpVmVyc2lvbiwgdGhpcy5zZXR0aW5ncywgY2F0YWxvZ0hybiwgYWJvcnRTaWduYWwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoYEVyb3JyIGNyZWF0aW5nIHJlcXVlc3Qgb2JqZWN0IGZvciBtZXRhZGF0YSBzZXJ2aWNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGF3YWl0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubGF0ZXN0VmVyc2lvbihyZXF1ZXN0LCB7XG4gICAgICAgICAgICBzdGFydFZlcnNpb246IC0xLFxuICAgICAgICAgICAgYmlsbGluZ1RhZ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXRlc3RWZXJzaW9uLnZlcnNpb24pO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVlcnlDbGllbnQgPSBRdWVyeUNsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TY2hlbWFEZXRhaWxzUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlQmlsbGluZ1RhZ18xID0gcmVxdWlyZShcIi4uL3V0aWxzL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBBcnRpZmFjdCBTZXJ2aWNlLlxuICovXG5jbGFzcyBTY2hlbWFEZXRhaWxzUmVxdWVzdCB7XG4gICAgc2NoZW1hSHJuO1xuICAgIGJpbGxpbmdUYWc7XG4gICAgLyoqXG4gICAgICogR2V0cyBzY2hlbWEgbWV0YWRhdGEgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHNjaGVtYURldGFpbHNSZXF1ZXN0IFRoZSBbW1NjaGVtYURldGFpbHNSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNjaGVtYSBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBnZXRTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjaGVtYUhybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIG9mIGEgc2NoZW1hIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSB0aGF0IGlzIHVzZWQgaW5cbiAgICAgKiB0aGUgYGdldFNjaGVtYWAgYW5kIGBnZXRTY2hlbWFEZXRhaWxzYCBtZXRob2RzIG9mIFtbQXJ0aWZhY3RDbGllbnRdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWFIcm4gVGhlIGxheWVyIHNjaGVtYSBIUk4uXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1NjaGVtYURldGFpbHNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hSHJuKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hSHJuID0gc2NoZW1hSHJuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tTY2hlbWFEZXRhaWxzUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gKDAsIHZhbGlkYXRlQmlsbGluZ1RhZ18xLnZhbGlkYXRlQmlsbGluZ1RhZykodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxufVxuZXhwb3J0cy5TY2hlbWFEZXRhaWxzUmVxdWVzdCA9IFNjaGVtYURldGFpbHNSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNjaGVtYVJlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCB2YWxpZGF0ZUJpbGxpbmdUYWdfMSA9IHJlcXVpcmUoXCIuLi91dGlscy92YWxpZGF0ZUJpbGxpbmdUYWdcIik7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byB0aGUgcGxhdGZvcm0gQXJ0aWZhY3QgU2VydmljZS5cbiAqL1xuY2xhc3MgU2NoZW1hUmVxdWVzdCB7XG4gICAgdmFyaWFudDtcbiAgICBiaWxsaW5nVGFnO1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGBWYXJpYW50YCBvYmplY3Qgb2YgdGhlIHNjaGVtYSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgVmFyaWFudGAgb2JqZWN0IG9mIHRoZSBzY2hlbWEuXG4gICAgICovXG4gICAgZ2V0VmFyaWFudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFyaWFudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIG9mIGEgc2NoZW1hIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSB0aGF0IGlzIHVzZWQgaW5cbiAgICAgKiB0aGUgYGdldFNjaGVtYWAgYW5kIGBnZXRTY2hlbWFEZXRhaWxzYCBtZXRob2RzIG9mIFtbQXJ0aWZhY3RDbGllbnRdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YXJpYW50IFRoZSBgVmFyaWFudGAgb2JqZWN0IG9mIHRoZSBzY2hlbWFcbiAgICAgKiBAcmV0dXJuIFRoZSBbW1NjaGVtYVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFZhcmlhbnQodmFyaWFudCkge1xuICAgICAgICB0aGlzLnZhcmlhbnQgPSB2YXJpYW50O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tTY2hlbWFSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLlNjaGVtYVJlcXVlc3QgPSBTY2hlbWFSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TZWVrUmVxdWVzdCA9IHZvaWQgMDtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBTdHJlYW0gU2VydmljZS5cbiAqL1xuY2xhc3MgU2Vla1JlcXVlc3Qge1xuICAgIG1vZGU7XG4gICAgc3Vic2NyaXB0aW9uSWQ7XG4gICAgb2Zmc2V0cztcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKi9cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1NlZWtSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhNb2RlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN1YnNjcmlwdGlvbiBpZCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gaWQuXG4gICAgICovXG4gICAgZ2V0U3Vic2NyaXB0aW9uSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1NlZWtSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTdWJzY3JpcHRpb25JZChpZCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkID0gaWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB3aXRoU2Vla09mZnNldHMob2Zmc2V0cykge1xuICAgICAgICB0aGlzLm9mZnNldHMgPSBvZmZzZXRzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ2V0U2Vla09mZnNldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldHM7XG4gICAgfVxufVxuZXhwb3J0cy5TZWVrUmVxdWVzdCA9IFNlZWtSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlN0YXRpc3RpY3NDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuY29uc3QgU3RhdGlzdGljc1JlcXVlc3RfMSA9IHJlcXVpcmUoXCIuL1N0YXRpc3RpY3NSZXF1ZXN0XCIpO1xuLyoqXG4gKiBBIGNsaWVudCBmb3IgdGhlIHBsYXRmb3JtIFN0YXRpc3RpY3MgU2VydmljZS5cbiAqL1xuY2xhc3MgU3RhdGlzdGljc0NsaWVudCB7XG4gICAgc2V0dGluZ3M7XG4gICAgYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBbW1N0YXRpc3RpY3NDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgW1tTdGF0aXN0aWNzQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIGFuZCByZXR1cm5zIGEgbGF5ZXIgc3VtbWFyeSBmcm9tIHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3VtbWFyeVJlcXVlc3QgUGFyYW1ldGVycyB0aGF0IGFyZSBuZWVkZWQgdG8gZmV0Y2ggdGhlIGxheWVyIHN1bW1hcnkuXG4gICAgICogSW5jbHVkZXMgW1tjYXRhbG9nSHJuXV0gYW5kIFtbbGF5ZXJJZF1dLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggdGhlIGxheWVyIHN1bW1hcnkuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0U3VtbWFyeShzdW1tYXJ5UmVxdWVzdCkge1xuICAgICAgICBjb25zdCBsYXllcklkID0gc3VtbWFyeVJlcXVlc3QuZ2V0TGF5ZXJJZCgpO1xuICAgICAgICBjb25zdCBjYXRhbG9nSHJuID0gc3VtbWFyeVJlcXVlc3QuZ2V0Q2F0YWxvZ0hybigpO1xuICAgICAgICBpZiAoY2F0YWxvZ0hybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBObyBjYXRhbG9nSHJuIHByb3ZpZGVkYCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXllcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGxheWVySWQgcHJvdmlkZWRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY292ZXJhZ2VSZXF1ZXN0QnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoY2F0YWxvZ0hybik7XG4gICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkNvdmVyYWdlQXBpLmdldERhdGFDb3ZlcmFnZVN1bW1hcnkoY292ZXJhZ2VSZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgbGF5ZXJJZFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVwZW5kaW5nIG9uIHRoZSBtYXAgdHlwZSB0aGF0IHlvdSBzcGVjaWZ5IGluIHRoZSBbW1N0YXRpc3RpY3NSZXF1ZXN0XV0gaW5zdGFuY2UsIGdldHMgdGhlIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZVxuICAgICAqIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6XG4gICAgICogKiBCSVRNQVAgJm5kYXNoOyBmZXRjaGVzIGEgYml0bWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGRhdGEgaW4gcGFydGl0aW9ucy5cbiAgICAgKiAqIFNJWkVNQVAgJm5kYXNoOyBmZXRjaGVzIGEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgYSBwYXJ0aXRpb24gc2l6ZS5cbiAgICAgKiAqIFRJTUVNQVAgJm5kYXNoOyBmZXRjaGVzIGEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgcGFydGl0aW9uIHVwZGF0ZSB0aW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXRpc3RpY3NSZXF1ZXN0IFRoZSBbW1N0YXRpc3RpY3NSZXF1ZXN0XV0gaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWVzdGVkIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgW1N0YXRpc3RpY3NSZXF1ZXN0XV0gaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWVzdGVkIHNldHRpbmdzLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFN0YXRpc3RpY3Moc3RhdGlzdGljc1JlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHN0YXRpc3RpY3NSZXF1ZXN0LmdldExheWVySWQoKTtcbiAgICAgICAgY29uc3QgY2F0YWxvZ0hSTiA9IHN0YXRpc3RpY3NSZXF1ZXN0LmdldENhdGFsb2dIcm4oKTtcbiAgICAgICAgY29uc3QgdHlwZW1hcCA9IHN0YXRpc3RpY3NSZXF1ZXN0LmdldFR5cGVtYXAoKTtcbiAgICAgICAgY29uc3QgZGF0YWxldmVsID0gc3RhdGlzdGljc1JlcXVlc3QuZ2V0RGF0YUxldmVsKCk7XG4gICAgICAgIGlmIChjYXRhbG9nSFJOID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGNhdGFsb2dIcm4gcHJvdmlkZWRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxheWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTm8gbGF5ZXJJZCBwcm92aWRlZGApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBObyB0eXBlbWFwIHByb3ZpZGVkYCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdmVyYWdlUmVxdWVzdEJ1aWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKGNhdGFsb2dIUk4pO1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgc3dpdGNoICh0eXBlbWFwKSB7XG4gICAgICAgICAgICBjYXNlIFN0YXRpc3RpY3NSZXF1ZXN0XzEuQ292ZXJhZ2VEYXRhVHlwZS5CSVRNQVA6XG4gICAgICAgICAgICAgICAgcmVxdWVzdCA9IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQ292ZXJhZ2VBcGkuZ2V0RGF0YUNvdmVyYWdlVGlsZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3RhdGlzdGljc1JlcXVlc3RfMS5Db3ZlcmFnZURhdGFUeXBlLlNJWkVNQVA6XG4gICAgICAgICAgICAgICAgcmVxdWVzdCA9IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQ292ZXJhZ2VBcGkuZ2V0RGF0YUNvdmVyYWdlU2l6ZU1hcDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3RhdGlzdGljc1JlcXVlc3RfMS5Db3ZlcmFnZURhdGFUeXBlLlRJTUVNQVA6XG4gICAgICAgICAgICAgICAgcmVxdWVzdCA9IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQ292ZXJhZ2VBcGkuZ2V0RGF0YUNvdmVyYWdlVGltZU1hcDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgSW5jb3JyZWN0IHR5cGVtYXAgcHJvdmlkZWQ6ICR7dHlwZW1hcH1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3QoY292ZXJhZ2VSZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgbGF5ZXJJZCxcbiAgICAgICAgICAgIGRhdGFsZXZlbCxcbiAgICAgICAgICAgIGNhdGFsb2dIUk5cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGdldFJlcXVlc3RCdWlsZGVyKGhybikge1xuICAgICAgICByZXR1cm4gb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwic3RhdGlzdGljc1wiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKGhybikpO1xuICAgIH1cbn1cbmV4cG9ydHMuU3RhdGlzdGljc0NsaWVudCA9IFN0YXRpc3RpY3NDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3RhdGlzdGljc1JlcXVlc3QgPSBleHBvcnRzLkNvdmVyYWdlRGF0YVR5cGUgPSB2b2lkIDA7XG5jb25zdCB2YWxpZGF0ZUJpbGxpbmdUYWdfMSA9IHJlcXVpcmUoXCIuLi91dGlscy92YWxpZGF0ZUJpbGxpbmdUYWdcIik7XG4vKipcbiAqIEEgbWFwIHR5cGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIFN0YXRpc3RpY3MgU2VydmljZS5cbiAqL1xudmFyIENvdmVyYWdlRGF0YVR5cGU7XG4oZnVuY3Rpb24gKENvdmVyYWdlRGF0YVR5cGUpIHtcbiAgICAvKiogUmVwcmVzZW50cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGRhdGEgaW4gcGFydGl0aW9ucy4gKi9cbiAgICBDb3ZlcmFnZURhdGFUeXBlW1wiQklUTUFQXCJdID0gXCJ0aWxlbWFwXCI7XG4gICAgLyoqIEEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgYSBwYXJ0aXRpb24gc2l6ZS4gKi9cbiAgICBDb3ZlcmFnZURhdGFUeXBlW1wiU0laRU1BUFwiXSA9IFwiaGVhdG1hcC9zaXplXCI7XG4gICAgLyoqIEEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgcGFydGl0aW9uIHVwZGF0ZSB0aW1lLiAqL1xuICAgIENvdmVyYWdlRGF0YVR5cGVbXCJUSU1FTUFQXCJdID0gXCJoZWF0bWFwL2FnZVwiO1xufSkoQ292ZXJhZ2VEYXRhVHlwZSB8fCAoZXhwb3J0cy5Db3ZlcmFnZURhdGFUeXBlID0gQ292ZXJhZ2VEYXRhVHlwZSA9IHt9KSk7XG4vKipcbiAqICBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IHN0YXRpc3RpY3MgZnJvbSB0aGUgcGxhdGZvcm0gU3RhdGlzdGljcyBTZXJ2aWNlLlxuICovXG5jbGFzcyBTdGF0aXN0aWNzUmVxdWVzdCB7XG4gICAgY2F0YWxvZ0hybjtcbiAgICBsYXllcklkO1xuICAgIHR5cGVtYXA7XG4gICAgZGF0YUxldmVsO1xuICAgIGJpbGxpbmdUYWc7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBbW0hSTl1dIHN0cmluZyBvZiB0aGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUoSFJOKSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIFtbSFJOXV0gc3RyaW5nLlxuICAgICAqL1xuICAgIGdldENhdGFsb2dIcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGFsb2dIcm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBsYXllciBJRCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBsYXllciBJRCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0TGF5ZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIG1hcCB0eXBlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgbWFwIHR5cGUuXG4gICAgICovXG4gICAgZ2V0VHlwZW1hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZW1hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHRpbGUgbGV2ZWwgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm4gVGhlIHJlcXVlc3RlZCB0aWxlIGxldmVsIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXREYXRhTGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFMZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBjYXRhbG9nIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBocm4gVGhlIGNhdGFsb2cgSFJOLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aENhdGFsb2dIcm4oaHJuKSB7XG4gICAgICAgIHRoaXMuY2F0YWxvZ0hybiA9IGhybi50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSByZXF1ZXN0ZWQgYGxheWVySWRgIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTGF5ZXJJZChsYXllcklkKSB7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IGxheWVySWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGBjb3ZlcmFnZURhdGFUeXBlYCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY292ZXJhZ2VEYXRhVHlwZSBQb2ludHMgYXQgb25lIG9mIHRoZSBmb2xsb3dpbmcgU3RhdGlzdGljIEFQSSBlbmRwb2ludHM6XG4gICAgICogKiBCSVRNQVAgJm5kYXNoOyBmZXRjaGVzIGEgYml0bWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGRhdGEgaW4gcGFydGl0aW9ucy5cbiAgICAgKiAqIFNJWkVNQVAgJm5kYXNoOyBmZXRjaGVzIGEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgYSBwYXJ0aXRpb24gc2l6ZS5cbiAgICAgKiAqIFRJTUVNQVAgJm5kYXNoOyBmZXRjaGVzIGEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgcGFydGl0aW9uIHVwZGF0ZSB0aW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFR5cGVtYXAoY292ZXJhZ2VEYXRhVHlwZSkge1xuICAgICAgICB0aGlzLnR5cGVtYXAgPSBjb3ZlcmFnZURhdGFUeXBlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBgZGF0YUxldmVsYCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YUxldmVsIGRhdGFMZXZlbCBTcGVjaWZ5IHRoZSB0aWxlIGxldmVsIGFib3V0IHdoaWNoIHlvdSB3YW50IHRvIGdldCBzdGF0aXN0aWNhbCBkYXRhLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aERhdGFMZXZlbChkYXRhTGV2ZWwpIHtcbiAgICAgICAgdGhpcy5kYXRhTGV2ZWwgPSBOdW1iZXIoZGF0YUxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9ICgwLCB2YWxpZGF0ZUJpbGxpbmdUYWdfMS52YWxpZGF0ZUJpbGxpbmdUYWcpKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbn1cbmV4cG9ydHMuU3RhdGlzdGljc1JlcXVlc3QgPSBTdGF0aXN0aWNzUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdHJlYW1MYXllckNsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhIHN0cmVhbSBsYXllci5cbiAqL1xuY2xhc3MgU3RyZWFtTGF5ZXJDbGllbnQge1xuICAgIGFwaVZlcnNpb24gPSBcInYyXCI7XG4gICAgeENvcnJlbGF0aW9uSWQ7XG4gICAgc3Vic2NyaWJ0aW9uTm9kZUJhc2VVcmw7XG4gICAgY2F0YWxvZ0hybjtcbiAgICBsYXllcklkO1xuICAgIHNldHRpbmdzO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIFtbU3RyZWFtTGF5ZXJDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXMgVGhlIFtbU3RyZWFtTGF5ZXJDbGllbnRQYXJhbXNdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW1N0cmVhbUxheWVyQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuY2F0YWxvZ0hybiA9IHBhcmFtcy5jYXRhbG9nSHJuO1xuICAgICAgICB0aGlzLmxheWVySWQgPSBwYXJhbXMubGF5ZXJJZDtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHBhcmFtcy5zZXR0aW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtZXNzYWdlIGNvbnN1bXB0aW9uIGZyb20gYSBzcGVjaWZpYyBzdHJlYW0gbGF5ZXIuIFVzZSB0aGUgYmFzZSBwYXRoIHJldHVybmVkIGZyb20gdGhlIEFQSSBMb29rdXAgc2VydmljZS5cbiAgICAgKiBGb3IgbW9kZSA9IHBhcmFsbGVsLCBvbmUgdW5pdCBvZiBwYXJhbGxlbGlzbSBjdXJyZW50bHkgZXF1YWxzIDEgTUJwcyBpbmJvdW5kIG9yIDIgTUJwcyBvdXRib3VuZCxcbiAgICAgKiB3aGljaGV2ZXIgaXMgZ3JlYXRlciwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxuICAgICAqIFRoZSBudW1iZXIgb2Ygc3Vic2NyaXB0aW9ucyB3aXRoaW4gdGhlIHNhbWUgZ3JvdXAgY2Fubm90IGV4Y2VlZCB0aGUgcGFyYWxsZWxpc20gYWxsb3dlZC5cbiAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIHNlZVxuICAgICAqIFtHZXQgRGF0YSBmcm9tIGEgU3RyZWFtIExheWVyXShodHRwczovL2RldmVsb3Blci5oZXJlLmNvbS9kb2N1bWVudGF0aW9uL2RhdGEtYXBpL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLXN0cmVhbS5odG1sKVxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFtbU3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmVkIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTdWJzY3JpcHRpb24gSWRcbiAgICAgKi9cbiAgICBhc3luYyBzdWJzY3JpYmUocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSBhd2FpdCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJzdHJlYW1cIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCB0aGlzLmNhdGFsb2dIcm4sIGFib3J0U2lnbmFsKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJ0aW9uUmVxdWVzdFBhcmFtcyA9IHtcbiAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgIG1vZGU6IHJlcXVlc3QuZ2V0TW9kZSgpLFxuICAgICAgICAgICAgY29uc3VtZXJJZDogcmVxdWVzdC5nZXRDb25zdW1lcklkKCksXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uUHJvcGVydGllczogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25Qcm9wZXJ0aWVzKClcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uUmVzdWx0ID0gYXdhaXQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuc3Vic2NyaWJlKHJlcXVlc3RCdWlsZGVyLCBzdWJzY3JpYnRpb25SZXF1ZXN0UGFyYW1zKS50aGVuKGFzeW5jIChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHhDb3JyZWxhdGlvbklkID0gcmVzLmhlYWRlcnMuZ2V0KFwiWC1Db3JyZWxhdGlvbi1JZFwiKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHhDb3JyZWxhdGlvbklkLCAuLi5yZXNwb25zZURhdGEgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBVcGRhdGUgeENvcnJlbGF0aW9uSWRcbiAgICAgICAgdGhpcy54Q29ycmVsYXRpb25JZCA9IHN1YnNjcmlwdGlvblJlc3VsdC54Q29ycmVsYXRpb25JZDtcbiAgICAgICAgdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCA9IHN1YnNjcmlwdGlvblJlc3VsdC5ub2RlQmFzZVVSTDtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdWJzY3JpcHRpb25SZXN1bHQuc3Vic2NyaXB0aW9uSWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdW1lcyBkYXRhIGZyb20gYSBsYXllci4gUmV0dXJucyBtZXNzYWdlcyBmcm9tIGEgc3RyZWFtIGxheWVyLlxuICAgICAqIElmIHRoZSBkYXRhIHNpemUgaXMgbGVzcyB0aGFuIDEgTUIsIHRoZSBkYXRhIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkLlxuICAgICAqIElmIHRoZSBkYXRhIHNpemUgaXMgZ3JlYXRlciB0aGFuIDEgTUIsIGEgZGF0YSBoYW5kbGUgd2lsbCBiZSByZXR1cm5lZCBwb2ludGluZyB0byB0aGUgb2JqZWN0IHN0b3JlZCBpbiB0aGUgQmxvYiBzdG9yZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBbW1BvbGxSZXF1ZXN0XV0gaW5zdGFuY2Ugb2YgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIE1lc3NhZ2VzIFtbU3RyZWFtQXBpLk1lc3NhZ2VzXV0gZnJvbSBhIHN0cmVhbSBsYXllclxuICAgICAqL1xuICAgIGFzeW5jIHBvbGwocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgaWYgKHJlcXVlc3QuZ2V0TW9kZSgpID09PSBcInBhcmFsbGVsXCIgJiYgIXJlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVycm9yOiBmb3IgJ3BhcmFsbGVsJyBtb2RlICdzdWJzY3JpcHRpb25JZCcgaXMgcmVxdWlyZWQuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3Vic2NyaWJ0aW9uTm9kZUJhc2VVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIHZhbGlkIG5vZGVCYXNldXJsIHByb3ZpZGVkIGZvciB0aGUgc3Vic2NyaWJ0aW9uIGlkPSR7cmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpfSwgcGxlYXNlIGNoZWNrIHlvdXIgc3Vic2NyaWJ0aW9uYCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCdWlsZGVyID0gbmV3IG9scF9zZGtfY29yZV8xLkRhdGFTdG9yZVJlcXVlc3RCdWlsZGVyKHRoaXMuc2V0dGluZ3MuZG93bmxvYWRNYW5hZ2VyLCB0aGlzLnN1YnNjcmlidGlvbk5vZGVCYXNlVXJsLCB0aGlzLnNldHRpbmdzLnRva2VuLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIGNvbnN0IGNvbnN1bWVEYXRhUGFyYW1zID0ge1xuICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgbW9kZTogcmVxdWVzdC5nZXRNb2RlKCksXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpLFxuICAgICAgICAgICAgeENvcnJlbGF0aW9uSWQ6IHRoaXMueENvcnJlbGF0aW9uSWRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY29uc3VtZVJlc3BvbnNlID0gYXdhaXQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuY29uc3VtZURhdGEocmVxdWVzdEJ1aWxkZXIsIGNvbnN1bWVEYXRhUGFyYW1zKS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgIHhDb3JyZWxhdGlvbklkOiByZXNwb25zZS5oZWFkZXJzLmdldChcIlgtQ29ycmVsYXRpb24tSWRcIikgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEgJiYgZGF0YS5tZXNzYWdlcyA/IGRhdGEubWVzc2FnZXMgOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBVcGRhdGUgeENvcnJlbGF0aW9uSWRcbiAgICAgICAgdGhpcy54Q29ycmVsYXRpb25JZCA9IGNvbnN1bWVSZXNwb25zZS54Q29ycmVsYXRpb25JZDtcbiAgICAgICAgaWYgKGNvbnN1bWVSZXNwb25zZS5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIENvbW1pdCBvZmZzZXRzXG4gICAgICAgICAgICBjb25zdCBsYXRlc3RPZmZzZXRzID0gY29uc3VtZVJlc3BvbnNlLmRhdGFcbiAgICAgICAgICAgICAgICAubWFwKChtc2cpID0+IG1zZy5vZmZzZXQpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW2N1cnIucGFydGl0aW9uXSA9XG4gICAgICAgICAgICAgICAgICAgIGFjY1tjdXJyLnBhcnRpdGlvbl0gPiBjdXJyLm9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhY2NbY3Vyci5wYXJ0aXRpb25dXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnIub2Zmc2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICBhd2FpdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlN0cmVhbUFwaS5kb0NvbW1pdE9mZnNldHMocmVxdWVzdEJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBjb21taXRPZmZzZXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldHM6IE9iamVjdC5rZXlzKGxhdGVzdE9mZnNldHMpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uOiAra2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBsYXRlc3RPZmZzZXRzW2tleV1cbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpLFxuICAgICAgICAgICAgICAgIG1vZGU6IHJlcXVlc3QuZ2V0TW9kZSgpLFxuICAgICAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICB4Q29ycmVsYXRpb25JZDogdGhpcy54Q29ycmVsYXRpb25JZFxuICAgICAgICAgICAgfSkuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbW1pdCBvZmZzZXRzIHVuc3VjY2Vzc2Z1bCwgZXJyb3I9JHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25zdW1lUmVzcG9uc2UuZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBkZWxldGVzIGEgc3Vic2NyaXB0aW9uIHRvIGEgbGF5ZXIuIFRoaXMgb3BlcmF0aW9uIHJlbW92ZXMgdGhlIHN1YnNjcmlwdGlvbiBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFtbVW5zdWJzY3JpYmVSZXF1ZXN0XV0gaW5zdGFuY2Ugb2YgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKi9cbiAgICBhc3luYyB1bnN1YnNjcmliZShyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICBpZiAocmVxdWVzdC5nZXRNb2RlKCkgPT09IFwicGFyYWxsZWxcIiAmJiAhcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRXJyb3I6IGZvciAncGFyYWxsZWwnIG1vZGUgJ3N1YnNjcmlwdGlvbklkJyBpcyByZXF1aXJlZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgU3Vic2NyaWJ0aW9uIGVycm9yLiBObyB2YWxpZCBub2RlQmFzZXVybCBwcm92aWRlZCBmb3IgdGhlIHN1YnNjcmlidGlvbiBpZD0ke3JlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKX0sIHBsZWFzZSBjaGVjayB5b3VyIHN1YnNjcmlidGlvbmApKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IG5ldyBvbHBfc2RrX2NvcmVfMS5EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcih0aGlzLnNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCwgdGhpcy5zZXR0aW5ncy50b2tlbiwgYWJvcnRTaWduYWwpO1xuICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuZGVsZXRlU3Vic2NyaXB0aW9uKHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICBtb2RlOiByZXF1ZXN0LmdldE1vZGUoKSxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiByZXF1ZXN0LmdldFN1YnNjcmlwdGlvbklkKCksXG4gICAgICAgICAgICB4Q29ycmVsYXRpb25JZDogdGhpcy54Q29ycmVsYXRpb25JZFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBwYXJ0aXRpb24gZGF0YSB1c2luZyBkYXRhIGhhbmRsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGRhdGEgb2YgcGFydGl0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHBhcnRpdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXREYXRhKG1lc3NhZ2UsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5tZXRhRGF0YSB8fCAhbWVzc2FnZS5tZXRhRGF0YS5kYXRhSGFuZGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gZGF0YSBoYW5kbGUgZm9yIHRoaXMgcGFydGl0aW9uXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IGF3YWl0IG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShcImJsb2JcIiwgXCJ2MVwiLCB0aGlzLnNldHRpbmdzLCB0aGlzLmNhdGFsb2dIcm4sIGFib3J0U2lnbmFsKTtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQmxvYkFwaS5nZXRCbG9iKHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBkYXRhSGFuZGxlOiBtZXNzYWdlLm1ldGFEYXRhLmRhdGFIYW5kbGUsXG4gICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBhbGxvd3MgdG8gc3RhcnQgcmVhZGluZyBkYXRhIGZyb20gYSBzcGVjaWZpZWQgb2Zmc2V0LlxuICAgICAqIFRoZSBtZXNzYWdlIHBvaW50ZXIgY2FuIGJlIG1vdmVkIHRvIGFueSBvZmZzZXQgaW4gdGhlIGxheWVyICh0b3BpYykuXG4gICAgICogTWVzc2FnZSBjb25zdW1wdGlvbiB3aWxsIHN0YXJ0IGZyb20gdGhhdCBvZmZzZXQuIE9uY2UgeW91IHNlZWsgdG8gYW4gb2Zmc2V0LFxuICAgICAqIHRoZXJlIGlzIG5vIHJldHVybmluZyB0byB0aGUgaW5pdGlhbCBvZmZzZXQsIHVubGVzcyB0aGUgaW5pdGlhbCBvZmZzZXQgaXMgc2F2ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tTZWVrUmVxdWVzdF1dIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmVkIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSB3aXRoIHN0YXR1cyAyMDAgaWYgc3VjY2Vzcy5cbiAgICAgKi9cbiAgICBhc3luYyBzZWVrKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldHNPYmplY3QgPSByZXF1ZXN0LmdldFNlZWtPZmZzZXRzKCk7XG4gICAgICAgIGlmICghb2Zmc2V0c09iamVjdCB8fFxuICAgICAgICAgICAgIW9mZnNldHNPYmplY3Qub2Zmc2V0cyB8fFxuICAgICAgICAgICAgIW9mZnNldHNPYmplY3Qub2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFcnJvcjogb2Zmc2V0cyBhcmUgcmVxdWlyZWQuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC5nZXRNb2RlKCkgPT09IFwicGFyYWxsZWxcIiAmJiAhcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRXJyb3I6IGZvciAncGFyYWxsZWwnIG1vZGUgJ3N1YnNjcmlwdGlvbklkJyBpcyByZXF1aXJlZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgU3Vic2NyaWJ0aW9uIGVycm9yLiBObyB2YWxpZCBub2RlQmFzZXVybCBwcm92aWRlZCBmb3IgdGhlIHN1YnNjcmlidGlvbiBpZD0ke3JlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKX0sIHBsZWFzZSBjaGVjayB5b3VyIHN1YnNjcmlidGlvbmApKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IG5ldyBvbHBfc2RrX2NvcmVfMS5EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcih0aGlzLnNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCwgdGhpcy5zZXR0aW5ncy50b2tlbiwgYWJvcnRTaWduYWwpO1xuICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuc2Vla1RvT2Zmc2V0KHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICBzZWVrT2Zmc2V0czogb2Zmc2V0c09iamVjdCxcbiAgICAgICAgICAgIG1vZGU6IHJlcXVlc3QuZ2V0TW9kZSgpLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHJlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKSxcbiAgICAgICAgICAgIHhDb3JyZWxhdGlvbklkOiB0aGlzLnhDb3JyZWxhdGlvbklkXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnhDb3JyZWxhdGlvbklkID1cbiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLmdldChcIlgtQ29ycmVsYXRpb24tSWRcIikgfHwgdGhpcy54Q29ycmVsYXRpb25JZDtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5TdHJlYW1MYXllckNsaWVudCA9IFN0cmVhbUxheWVyQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdWJzY3JpYmVSZXF1ZXN0ID0gdm9pZCAwO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gdGhlIHBsYXRmb3JtIFN0cmVhbSBTZXJ2aWNlLlxuICovXG5jbGFzcyBTdWJzY3JpYmVSZXF1ZXN0IHtcbiAgICBtb2RlO1xuICAgIHN1YnNjcmlwdGlvbklkO1xuICAgIGNvbnN1bWVySWQ7XG4gICAgc3Vic2NyaXB0aW9uUHJvcGVydGllcztcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKi9cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1N1YnNjcmliZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aE1vZGUobW9kZSkge1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2NyaXB0aW9uIGlkIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKi9cbiAgICBnZXRTdWJzY3JpcHRpb25JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIFRoZSBzdWJzY3JpcHRpb24gaWQuXG4gICAgICogQHJldHVybnMgVGhlIFtbU3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoU3Vic2NyaXB0aW9uSWQoaWQpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IGlkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uc3VtZXIgaWQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY29uc3VtZXIgaWQuXG4gICAgICovXG4gICAgZ2V0Q29uc3VtZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3VtZXJJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBjb25zdW1lciBpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgY29uc3VtZXIgaWQuXG4gICAgICogQHJldHVybnMgVGhlIFtbU3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQ29uc3VtZXJJZChpZCkge1xuICAgICAgICB0aGlzLmNvbnN1bWVySWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN1YnNjcmlwdGlvblByb3BlcnRpZXMgZm9yIHRoZSByZXF1ZXN0IC0gY29uc3VtZXIgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uUHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBnZXRTdWJzY3JpcHRpb25Qcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25Qcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzIFRoZSBzdWJzY3JpcHRpb25Qcm9wZXJ0aWVzIC0gY29uc3VtZXIgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtzdWJzY3JpcHRpb24gcHJvcGVydGllc11cbiAgICAgKiAoaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9kYXRhX2Rldl9ndWlkZS9yZXN0L2dldHRpbmctZGF0YS1zdHJlYW0uaHRtbCNzdWJzY3JpcHRpb24tcHJvcGVydGllcylcbiAgICAgKiBAcmV0dXJucyBUaGUgW1tTdWJzY3JpYmVSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTdWJzY3JpcHRpb25Qcm9wZXJ0aWVzKHByb3BzKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uUHJvcGVydGllcyA9IHByb3BzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLlN1YnNjcmliZVJlcXVlc3QgPSBTdWJzY3JpYmVSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlN1bW1hcnlSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3QgdmFsaWRhdGVCaWxsaW5nVGFnXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvdmFsaWRhdGVCaWxsaW5nVGFnXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGEgc3VtbWFyeSBmcm9tIHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFN1bW1hcnlSZXF1ZXN0IHtcbiAgICBjYXRhbG9nSHJuO1xuICAgIGxheWVySWQ7XG4gICAgYmlsbGluZ1RhZztcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIFtbSFJOXV0gc3RyaW5nIG9mIHRoZSBjYXRhbG9nIEhFUkUgUmVzb3VyY2UgTmFtZShIUk4pIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgW1tIUk5dXSBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0Q2F0YWxvZ0hybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ0hybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxheWVyIElEIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGxheWVyIElEIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRMYXllcklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllcklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGNhdGFsb2cgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pLlxuICAgICAqXG4gICAgICogQHBhcmFtIGhybiBUaGUgY2F0YWxvZyBIUk4uXG4gICAgICogQHJldHVybnMgVGhlIFtbU3VtbWFyeVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aENhdGFsb2dIcm4oaHJuKSB7XG4gICAgICAgIHRoaXMuY2F0YWxvZ0hybiA9IGhybi50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBgbGF5ZXJJZGAgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tTdW1tYXJ5UmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTGF5ZXJJZChsYXllcklkKSB7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IGxheWVySWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNCZuZGFzaDsxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1N1bW1hcnlSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSAoMCwgdmFsaWRhdGVCaWxsaW5nVGFnXzEudmFsaWRhdGVCaWxsaW5nVGFnKSh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLlN1bW1hcnlSZXF1ZXN0ID0gU3VtbWFyeVJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVGlsZVJlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCB2YWxpZGF0ZUJpbGxpbmdUYWdfMSA9IHJlcXVpcmUoXCIuLi91dGlscy92YWxpZGF0ZUJpbGxpbmdUYWdcIik7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgdGhlIHRpbGUgYmxvYiBkYXRhIGJ5IHRoZSB0aWxlIGtleS5cbiAqXG4gKiBUaGlzIGNsYXNzIHdvcmtzIG9ubHkgd2l0aCB2ZXJzaW9uZWQgYW5kIHZvbGF0aWxlIGxheWVycyB3aGVyZSB0aGUgcGFydGl0aW9uaW5nIHNjaGVtZSBpcyBIRVJFIFRpbGUuXG4gKlxuICogWW91IGNhbiBpbml0aWFsaXplIHRoZSByZXF1ZXN0IGNsYXNzIG9uY2UgZm9yIGEgc3BlY2lmaWMgY2F0YWxvZywgbGF5ZXIsIGFuZCB2ZXJzaW9uIChAc2VlIFtbVGlsZVJlcXVlc3RQYXJhbXNdXSlcbiAqIGFuZCB1c2UgaXQgbWFueSB0aW1lcyB0byBnZXQgdGhlIGEgdGlsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYFxuICogIGNvbnN0IHBhcmFtczogVGlsZVJlcXVlc3RQYXJhbXMgPSB7XG4gKiAgICAgICBzZXR0aW5nczogXCIlIHlvdXIgYE9scENsaWVudFNldHRpbmdzYCBpbnN0YW5jZSAlIFwiLFxuICogICAgICAgY2F0YWxvZ0hybjogXCIlIHRoZSBIUk4gaW5zdGFuY2Ugb2YgeW91ciBjYXRhbG9nICVcIixcbiAqICAgICAgIGxheWVySWQ6IFwiJSB5b3VyIGxheWVyIElEICVcIixcbiAqICAgICAgIGxheWVyVHlwZTogXCIlIHZlcnNpb25lZCBvciB2b2xhdGlsZSAlXCIsXG4gKiAgICAgICBjYXRhbG9nVmVyc2lvbjogXCIlIHRoZSBjYXRhbG9nIHZlcnNpb247IGZvciB2ZXJzaW9uZWQgbGF5ZXJzLCB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgdXNlZCBieSBkZWZhdWx0ICVcIlxuICogICB9XG4gKlxuICogIGNvbnN0IHJlcXVlc3QgPSBuZXcgVGlsZVJlcXVlc3QocGFyYW1zKTtcbiAqXG4gKiAgY29uc3QgcmVxdWVzdEZvclRpbGUxID0gcmVxdWVzdC53aXRoVGlsZUtleSh5b3VyVGlsZUtleTEpO1xuICogIGNvbnN0IHJlcXVlc3RGb3JUaWxlMiA9IHJlcXVlc3Qud2l0aFRpbGVLZXkoeW91clRpbGVLZXkyKTtcbiAqXG4gKiBgYGBcbiAqL1xuY2xhc3MgVGlsZVJlcXVlc3Qge1xuICAgIHF1YWRLZXk7XG4gICAgYmlsbGluZ1RhZztcbiAgICBmZXRjaE9wdGlvbiA9IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVJZk5vdEZvdW5kO1xuICAgIC8qKlxuICAgICAqIEEgZ2VvbWV0cmljIGFyZWEgcmVwcmVzZW50ZWQgYXMgYSBIRVJFIHRpbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcXVhZEtleSBBZGRyZXNzZXMgYSB0aWxlIGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1RpbGVSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhUaWxlS2V5KHF1YWRLZXkpIHtcbiAgICAgICAgdGhpcy5xdWFkS2V5ID0gcXVhZEtleTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA04oCTMTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0HigJNaYeKAk3ow4oCTOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tUaWxlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gKDAsIHZhbGlkYXRlQmlsbGluZ1RhZ18xLnZhbGlkYXRlQmlsbGluZ1RhZykodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgW1tRdWFkS2V5XV0gb2JqZWN0IGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgW1tRdWFkS2V5XV0gb2JqZWN0LlxuICAgICAqL1xuICAgIGdldFRpbGVLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1YWRLZXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZldGNoIG9wdGlvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIHNldCB0aGUgc291cmNlIGZyb21cbiAgICAgKiB3aGljaCBkYXRhIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgICAqXG4gICAgICogQHNlZSBgZ2V0RmV0Y2hPcHRpb24oKWAgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBgRmV0Y2hPcHRpb25gIGVudW0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoZSB1cGRhdGVkIGBQYXJ0aXRpb25zUmVxdWVzdGAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgd2l0aEZldGNoT3B0aW9uKG9wdGlvbikge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9uID0gb3B0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgY29udHJvbHMgaG93IHJlcXVlc3RzIGFyZSBoYW5kbGVkLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgb3B0aW9uIGlzIGBPbmxpbmVJZk5vdEZvdW5kYC4gSXQgcXVlcmllcyB0aGUgbmV0d29yayBpZlxuICAgICAqIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgbm90IGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGZldGNoIG9wdGlvbi5cbiAgICAgKi9cbiAgICBnZXRGZXRjaE9wdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hPcHRpb247XG4gICAgfVxufVxuZXhwb3J0cy5UaWxlUmVxdWVzdCA9IFRpbGVSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5VbnN1YnNjcmliZVJlcXVlc3QgPSB2b2lkIDA7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byB0aGUgcGxhdGZvcm0gU3RyZWFtIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFVuc3Vic2NyaWJlUmVxdWVzdCB7XG4gICAgbW9kZTtcbiAgICBzdWJzY3JpcHRpb25JZDtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKi9cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1Vuc3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTW9kZShtb2RlKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gaWQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqL1xuICAgIGdldFN1YnNjcmlwdGlvbklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tVbnN1YnNjcmliZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFN1YnNjcmlwdGlvbklkKGlkKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuZXhwb3J0cy5VbnN1YnNjcmliZVJlcXVlc3QgPSBVbnN1YnNjcmliZVJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVmVyc2lvbmVkTGF5ZXJDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuY29uc3QgTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlfMSA9IHJlcXVpcmUoXCIuLi9jYWNoZS9NZXRhZGF0YUNhY2hlUmVwb3NpdG9yeVwiKTtcbmNvbnN0IGdldFRpbGVfMSA9IHJlcXVpcmUoXCIuLi91dGlscy9nZXRUaWxlXCIpO1xuY29uc3QgUGFydGl0aW9uc1JlcXVlc3RfMSA9IHJlcXVpcmUoXCIuL1BhcnRpdGlvbnNSZXF1ZXN0XCIpO1xuY29uc3QgUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XzEgPSByZXF1aXJlKFwiLi9RdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RcIik7XG5jb25zdCBRdWFkVHJlZUluZGV4UmVxdWVzdF8xID0gcmVxdWlyZShcIi4vUXVhZFRyZWVJbmRleFJlcXVlc3RcIik7XG5jb25zdCBRdWVyeUNsaWVudF8xID0gcmVxdWlyZShcIi4vUXVlcnlDbGllbnRcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhIHZlcnNpb25lZCBsYXllciBhbmQgcHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGFuZCBkYXRhLlxuICovXG5jbGFzcyBWZXJzaW9uZWRMYXllckNsaWVudCB7XG4gICAgYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICAvKipcbiAgICAgKiBIUk4gb2YgdGhlIGNhdGFsb2cuXG4gICAgICovXG4gICAgaHJuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgbGF5ZXIuXG4gICAgICovXG4gICAgbGF5ZXJJZDtcbiAgICAvKipcbiAgICAgKiBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHNldHRpbmdzO1xuICAgIC8vIExheWVyIHZlcnNpb24uXG4gICAgdmVyc2lvbjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBbW1ZlcnNpb25lZExheWVyQ2xpZW50XV0gaW5zdGFuY2Ugd2l0aCBWZXJzaW9uZWRMYXllckNsaWVudFBhcmFtcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVycyBmb3IgdXNlIHRvIGluaXRpYWxpemUgVmVyc2lvbkxheWVyQ2xpZW50LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmhybiA9IHBhcmFtcy5jYXRhbG9nSHJuLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IHBhcmFtcy5sYXllcklkO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gcGFyYW1zLnNldHRpbmdzO1xuICAgICAgICBpZiAocGFyYW1zLnZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMudmVyc2lvbiA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnNpb24gPSBwYXJhbXMudmVyc2lvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRBZ2dyZWdhdGVkRGF0YShyZXF1ZXN0LCBhYm9ydFNpZ25hbCwgb3B0aW9ucykge1xuICAgICAgICBsZXQgY2F0YWxvZ1ZlcnNpb24gPSB0aGlzLnZlcnNpb247XG4gICAgICAgIGlmIChjYXRhbG9nVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYXRhbG9nVmVyc2lvbiA9IGF3YWl0IHRoaXMuZ2V0TGF0ZXN0VmVyc2lvbihyZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgY2F0YWxvZ0hybjogb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLFxuICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgbGF5ZXJUeXBlOiBcInZlcnNpb25lZFwiLFxuICAgICAgICAgICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3MsXG4gICAgICAgICAgICBjYXRhbG9nVmVyc2lvblxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0aWxlUmVzcG9uc2UgPSBhd2FpdCAoMCwgZ2V0VGlsZV8xLmdldFRpbGUpKHJlcXVlc3QsIHBhcmFtcywgYWJvcnRTaWduYWwsIHtcbiAgICAgICAgICAgIGluY2x1ZGVUaWxlS2V5OiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb3B0aW9ucz8uaW5jbHVkZVRpbGVLZXkgPyB0aWxlUmVzcG9uc2UgOiB0aWxlUmVzcG9uc2UucmVzcG9uc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgcGFydGl0aW9uIGRhdGEgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kczogSUQsIHF1YWRrZXksIG9yIGRhdGEgaGFuZGxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFSZXF1ZXN0IFRoZSBbW0RhdGFSZXF1ZXN0XV0gaW5zdGFuY2Ugb2YgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHBhcnRpdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXREYXRhKGRhdGFSZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICBjb25zdCBkYXRhSGFuZGxlID0gZGF0YVJlcXVlc3QuZ2V0RGF0YUhhbmRsZSgpO1xuICAgICAgICBpZiAoZGF0YUhhbmRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRQYXJ0aXRpb24oZGF0YUhhbmRsZSwgYWJvcnRTaWduYWwsIGRhdGFSZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFydGl0aW9uSWQgPSBkYXRhUmVxdWVzdC5nZXRQYXJ0aXRpb25JZCgpO1xuICAgICAgICBpZiAodGhpcy52ZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGZldGNoIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgbG9jayBpdCB0byB0aGUgaW5zdGFuY2UuXG4gICAgICAgICAgICB0aGlzLnZlcnNpb24gPSBhd2FpdCB0aGlzLmdldExhdGVzdFZlcnNpb24oZGF0YVJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52ZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBsYXRlc3QgdmVyc2lvbi4gUGxlYXNlIHByb3ZpZGUgdmVyc2lvbiB0byB0aGUgRGF0YVJlcXVlc3Qgb3IgbG9jayB2ZXJzaW9uIGluIHRoZSBjb25zdHJ1Y3RvcmApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGl0aW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbklkRGF0YUhhbmRsZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUhhbmRsZUJ5UGFydGl0aW9uSWQocGFydGl0aW9uSWQsIGRhdGFSZXF1ZXN0LmdldEZldGNoT3B0aW9uKCksIGRhdGFSZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFBhcnRpdGlvbihwYXJ0aXRpb25JZERhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBkYXRhUmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGRhdGEgcHJvdmlkZWQuIEFkZCBkYXRhSGFuZGxlLCBwYXJ0aXRpb25JZCBvciBxdWFkS2V5IHRvIHRoZSBEYXRhUmVxdWVzdCBvYmplY3RgKSk7XG4gICAgfVxuICAgIGFzeW5jIGdldFBhcnRpdGlvbnMocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBmZXRjaCB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kIGxvY2sgaXQgdG8gdGhlIGluc3RhbmNlLlxuICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRMYXRlc3RWZXJzaW9uKHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52ZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBsYXRlc3QgdmVyc2lvbi4gUGxlYXNlIHByb3ZpZGUgdmVyc2lvbiB0byB0aGUgUmVxdWVzdCBvciBsb2NrIHZlcnNpb24gaW4gdGhlIGNvbnN0cnVjdG9yYCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XzEuUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0KSB7XG4gICAgICAgICAgICBjb25zdCBxdWFkS2V5ID0gcmVxdWVzdC5nZXRRdWFkS2V5KCk7XG4gICAgICAgICAgICBpZiAoIXF1YWRLZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBRdWFkS2V5XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IFF1ZXJ5Q2xpZW50XzEuUXVlcnlDbGllbnQodGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICBjb25zdCBxdWFkVHJlZUluZGV4UmVxdWVzdCA9IG5ldyBRdWFkVHJlZUluZGV4UmVxdWVzdF8xLlF1YWRUcmVlSW5kZXhSZXF1ZXN0KG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgdGhpcy5sYXllcklkLCBcInZlcnNpb25lZFwiKVxuICAgICAgICAgICAgICAgIC53aXRoUXVhZEtleShxdWFkS2V5KVxuICAgICAgICAgICAgICAgIC53aXRoVmVyc2lvbih0aGlzLnZlcnNpb24pXG4gICAgICAgICAgICAgICAgLndpdGhEZXB0aChyZXF1ZXN0LmdldERlcHRoKCkpXG4gICAgICAgICAgICAgICAgLndpdGhBZGRpdGlvbmFsRmllbGRzKHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeUNsaWVudC5mZXRjaFF1YWRUcmVlSW5kZXgocXVhZFRyZWVJbmRleFJlcXVlc3QsIGFib3J0U2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC5nZXRQYXJ0aXRpb25JZHMoKSkge1xuICAgICAgICAgICAgY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnRfMS5RdWVyeUNsaWVudCh0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeUNsaWVudC5nZXRQYXJ0aXRpb25zQnlJZChyZXF1ZXN0LCB0aGlzLmxheWVySWQsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgYWJvcnRTaWduYWwsIHRoaXMudmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlfMS5NZXRhZGF0YUNhY2hlUmVwb3NpdG9yeSh0aGlzLnNldHRpbmdzLmNhY2hlKTtcbiAgICAgICAgaWYgKHJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSAhPT0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZU9ubHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnMgPSBjYWNoZS5nZXQocmVxdWVzdCwgdGhpcy5ocm4udG9TdHJpbmcoKSwgdGhpcy5sYXllcklkLCB0aGlzLnZlcnNpb24pO1xuICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsRmllbGRzID0gcmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKCk7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0RmllbGRzO1xuICAgICAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0RmllbGRzID0gYWRkaXRpb25hbEZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9ucy5ldmVyeSgocGFydGl0aW9uKSA9PiBwYXJ0aXRpb25bZmllbGRdICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFhZGRpdGlvbmFsRmllbGRzIHx8XG4gICAgICAgICAgICAgICAgICAgICFleGlzdEZpZWxkcyB8fFxuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmllbGRzLmxlbmd0aCA9PT0gZXhpc3RGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBwYXJ0aXRpb25zIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhUmVxdWVzdEJpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmdldFBhcnRpdGlvbnMobWV0YVJlcXVlc3RCaWxkZXIsIHtcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxGaWVsZHM6IHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpLFxuICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5ICYmXG4gICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FjaGUucHV0KHJlcXVlc3QsIHRoaXMuaHJuLnRvU3RyaW5nKCksIHRoaXMubGF5ZXJJZCwgbWV0YWRhdGEucGFydGl0aW9ucywgdGhpcy52ZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ldGFkYXRhKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW5kIHJldHVybnMgcGFydGl0aW9uIG1ldGFkYXRhXG4gICAgICogQHBhcmFtIHBhcnRpdGlvbklkIFRoZSBuYW1lIG9mIHRoZSBwYXJ0aXRpb24gdG8gZmV0Y2guXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGxheWVyIHRvIGZldGNoXG4gICAgICogQHBhcmFtIGZldGNoT3B0aW9uIFRoZSBvcHRpb24gb2YgY2FjaGluZyAob25saW5lIG9ubHkgb3IgcmV0dXJuIGZyb20gY2FjaGUgaWYgZXhpc3QpXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIG9mIHBhcnRpdGlvbiBtZXRhZGF0YSB3aGljaCB1c2VkIHRvIGdldCBwYXJ0aXRpb24gZGF0YVxuICAgICAqL1xuICAgIGFzeW5jIGdldERhdGFIYW5kbGVCeVBhcnRpdGlvbklkKHBhcnRpdGlvbklkLCBmZXRjaE9wdGlvbiwgYmlsbGluZ1RhZykge1xuICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBRdWVyeUNsaWVudF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBwYXJ0aXRpb25zUmVxdWVzdCA9IG5ldyBQYXJ0aXRpb25zUmVxdWVzdF8xLlBhcnRpdGlvbnNSZXF1ZXN0KClcbiAgICAgICAgICAgIC53aXRoUGFydGl0aW9uSWRzKFtwYXJ0aXRpb25JZF0pXG4gICAgICAgICAgICAud2l0aEZldGNoT3B0aW9uKGZldGNoT3B0aW9uKTtcbiAgICAgICAgaWYgKGJpbGxpbmdUYWcpIHtcbiAgICAgICAgICAgIHBhcnRpdGlvbnNSZXF1ZXN0LndpdGhCaWxsaW5nVGFnKGJpbGxpbmdUYWcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgcXVlcnlDbGllbnQuZ2V0UGFydGl0aW9uc0J5SWQocGFydGl0aW9uc1JlcXVlc3QsIHRoaXMubGF5ZXJJZCwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCB1bmRlZmluZWQsIHRoaXMudmVyc2lvbik7XG4gICAgICAgIHJldHVybiBtZXRhZGF0YS5wYXJ0aXRpb25zICYmXG4gICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdICYmXG4gICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdLmRhdGFIYW5kbGVcbiAgICAgICAgICAgID8gbWV0YWRhdGEucGFydGl0aW9uc1swXS5kYXRhSGFuZGxlXG4gICAgICAgICAgICA6IFByb21pc2UucmVqZWN0KG5ldyBvbHBfc2RrX2NvcmVfMS5IdHRwRXJyb3Iob2xwX3Nka19jb3JlXzEuU1RBVFVTX0NPREVTLk5PVF9GT1VORCwgYE5vIHBhcnRpdGlvbiBkYXRhSGFuZGxlIGZvciBwYXJ0aXRpb24gJHtwYXJ0aXRpb25JZH0uIEhSTjogJHt0aGlzLmhybn1gKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uIHdoYXQgY2FuIGJlIHVzZWQgYXMgbGF0ZXN0IGxheWVyIHZlcnNpb25cbiAgICAgKi9cbiAgICBhc3luYyBnZXRMYXRlc3RWZXJzaW9uKGJpbGxpbmdUYWcpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybikpO1xuICAgICAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gYXdhaXQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5NZXRhZGF0YUFwaS5sYXRlc3RWZXJzaW9uKGJ1aWxkZXIsIHtcbiAgICAgICAgICAgIHN0YXJ0VmVyc2lvbjogLTEsXG4gICAgICAgICAgICBiaWxsaW5nVGFnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxhdGVzdFZlcnNpb24udmVyc2lvbik7XG4gICAgfVxuICAgIGFzeW5jIGRvd25sb2FkUGFydGl0aW9uKGRhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBiaWxsaW5nVGFnKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwiYmxvYlwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQmxvYkFwaS5nZXRCbG9iKGJ1aWxkZXIsIHtcbiAgICAgICAgICAgIGRhdGFIYW5kbGUsXG4gICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICBiaWxsaW5nVGFnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCBiYXNlVXJsIGFuZCBjcmVhdGUgcmVxdWVzdEJ1aWxkZXIgZm9yIHNlbmRpbmcgcmVxdWVzdHMgdG8gdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAgICAgKiBAcGFyYW0gYnVpbGRlclR5cGUgZW5kcG9pbnQgbmFtZSBpcyBuZWVkZWQgdG8gY3JlYXRlIHByb3ByaWF0ZSByZXF1ZXN0QnVpbGRlclxuICAgICAqXG4gICAgICogQHJldHVybnMgcmVxdWVzdEJ1aWxkZXJcbiAgICAgKi9cbiAgICBhc3luYyBnZXRSZXF1ZXN0QnVpbGRlcihidWlsZGVyVHlwZSwgaHJuLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKGJ1aWxkZXJUeXBlLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpO1xuICAgIH1cbn1cbmV4cG9ydHMuVmVyc2lvbmVkTGF5ZXJDbGllbnQgPSBWZXJzaW9uZWRMYXllckNsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Wb2xhdGlsZUxheWVyQ2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IE1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XzEgPSByZXF1aXJlKFwiLi4vY2FjaGUvTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlcIik7XG5jb25zdCBnZXRUaWxlXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvZ2V0VGlsZVwiKTtcbmNvbnN0IFBhcnRpdGlvbnNSZXF1ZXN0XzEgPSByZXF1aXJlKFwiLi9QYXJ0aXRpb25zUmVxdWVzdFwiKTtcbmNvbnN0IFF1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdF8xID0gcmVxdWlyZShcIi4vUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XCIpO1xuY29uc3QgUXVhZFRyZWVJbmRleFJlcXVlc3RfMSA9IHJlcXVpcmUoXCIuL1F1YWRUcmVlSW5kZXhSZXF1ZXN0XCIpO1xuY29uc3QgUXVlcnlDbGllbnRfMSA9IHJlcXVpcmUoXCIuL1F1ZXJ5Q2xpZW50XCIpO1xuLyoqXG4gKiBEZXNjcmliZXMgYSB2b2FsdGlsZSBsYXllciBhbmQgcHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGFuZCBkYXRhLlxuICovXG5jbGFzcyBWb2xhdGlsZUxheWVyQ2xpZW50IHtcbiAgICBhcGlWZXJzaW9uID0gXCJ2MVwiO1xuICAgIC8qKlxuICAgICAqIEhSTiBvZiB0aGUgY2F0YWxvZy5cbiAgICAgKi9cbiAgICBocm47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBsYXllci5cbiAgICAgKi9cbiAgICBsYXllcklkO1xuICAgIC8qKlxuICAgICAqIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgc2V0dGluZ3M7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgW1tWb2xhdGlsZUxheWVyQ2xpZW50XV0gaW5zdGFuY2Ugd2l0aCBWb2xhdGlsZUxheWVyQ2xpZW50UGFyYW1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBwYXJhbWV0ZXJzIGZvciB1c2UgdG8gaW5pdGlhbGl6ZSBWb2xhdGlsZUxheWVyQ2xpZW50LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmhybiA9IHBhcmFtcy5jYXRhbG9nSHJuLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IHBhcmFtcy5sYXllcklkO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gcGFyYW1zLnNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAYnJpZWYgRmV0Y2hlcyBkYXRhIG9mIGEgdGlsZSBvciBpdHMgY2xvc2VzdCBhbmNlc3Rvci5cbiAgICAgKiBVc2UgdGhpcyBBUEkgZm9yIHRpbGUtdHJlZSBzdHJ1Y3R1cmVzIHdoZXJlIGNoaWxkcmVuIHRpbGUgZGF0YSBpcyBhZ2dyZWdhdGVkIGFuZCBzdG9yZWQgaW4gcGFyZW50IHRpbGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGBUaWxlUmVxdWVzdGAgaW5zdGFuY2UgdGhhdCBjb250YWlucyBhIGNvbXBsZXRlIHNldFxuICAgICAqIG9mIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRpbGUgZGF0YSAoaWYgaXQgZXhpc3RzKSBvciB0aGUgbmVhcmVzdCBwYXJlbnQgdGlsZSBkYXRhXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QWdncmVnYXRlZERhdGEocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgY2F0YWxvZ0hybjogb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLFxuICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgbGF5ZXJUeXBlOiBcInZvbGF0aWxlXCIsXG4gICAgICAgICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5nc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gKDAsIGdldFRpbGVfMS5nZXRUaWxlKShyZXF1ZXN0LCBwYXJhbXMsIGFib3J0U2lnbmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBwYXJ0aXRpb24gZGF0YSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOiBJRCwgcXVhZGtleSwgb3IgZGF0YSBoYW5kbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVJlcXVlc3QgVGhlIFtbRGF0YVJlcXVlc3RdXSBpbnN0YW5jZSBvZiB0aGUgY29uZmlndXJlZCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgZGF0YSBmcm9tIHRoZSByZXF1ZXN0ZWQgcGFydGl0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldERhdGEoZGF0YVJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGNvbnN0IGRhdGFIYW5kbGUgPSBkYXRhUmVxdWVzdC5nZXREYXRhSGFuZGxlKCk7XG4gICAgICAgIGNvbnN0IHBhcnRpdGlvbklkID0gZGF0YVJlcXVlc3QuZ2V0UGFydGl0aW9uSWQoKTtcbiAgICAgICAgaWYgKGRhdGFIYW5kbGUgIT09IHVuZGVmaW5lZCB8fCBwYXJ0aXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoZGF0YUhhbmRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkUGFydGl0aW9uKGRhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBkYXRhUmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcnRpdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydGl0aW9uSWREYXRhSGFuZGxlID0gYXdhaXQgdGhpcy5nZXREYXRhSGFuZGxlQnlQYXJ0aXRpb25JZChwYXJ0aXRpb25JZCwgZGF0YVJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSwgZGF0YVJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFBhcnRpdGlvbihwYXJ0aXRpb25JZERhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBkYXRhUmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGRhdGEgcHJvdmlkZWQuIEFkZCBkYXRhSGFuZGxlLCBwYXJ0aXRpb25JZCBvciBxdWFkS2V5IHRvIHRoZSBEYXRhUmVxdWVzdCBvYmplY3RgKSk7XG4gICAgfVxuICAgIGFzeW5jIGdldFBhcnRpdGlvbnMocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RfMS5RdWFkS2V5UGFydGl0aW9uc1JlcXVlc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1YWRLZXkgPSByZXF1ZXN0LmdldFF1YWRLZXkoKTtcbiAgICAgICAgICAgIGlmICghcXVhZEtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IFF1YWRLZXlcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnRfMS5RdWVyeUNsaWVudCh0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHF1YWRUcmVlSW5kZXhSZXF1ZXN0ID0gbmV3IFF1YWRUcmVlSW5kZXhSZXF1ZXN0XzEuUXVhZFRyZWVJbmRleFJlcXVlc3Qob2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCB0aGlzLmxheWVySWQsIFwidm9sYXRpbGVcIilcbiAgICAgICAgICAgICAgICAud2l0aFF1YWRLZXkocXVhZEtleSlcbiAgICAgICAgICAgICAgICAud2l0aERlcHRoKHJlcXVlc3QuZ2V0RGVwdGgoKSlcbiAgICAgICAgICAgICAgICAud2l0aEFkZGl0aW9uYWxGaWVsZHMocmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmZldGNoUXVhZFRyZWVJbmRleChxdWFkVHJlZUluZGV4UmVxdWVzdCwgYWJvcnRTaWduYWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0LmdldFBhcnRpdGlvbklkcygpKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBRdWVyeUNsaWVudF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmdldFBhcnRpdGlvbnNCeUlkKHJlcXVlc3QsIHRoaXMubGF5ZXJJZCwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlfMS5NZXRhZGF0YUNhY2hlUmVwb3NpdG9yeSh0aGlzLnNldHRpbmdzLmNhY2hlKTtcbiAgICAgICAgaWYgKHJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSAhPT0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZU9ubHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnMgPSBjYWNoZS5nZXQocmVxdWVzdCwgdGhpcy5ocm4udG9TdHJpbmcoKSwgdGhpcy5sYXllcklkKTtcbiAgICAgICAgICAgIGlmIChwYXJ0aXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbEZpZWxkcyA9IHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpO1xuICAgICAgICAgICAgICAgIGxldCBleGlzdEZpZWxkcztcbiAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICBleGlzdEZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbnMuZXZlcnkoKHBhcnRpdGlvbikgPT4gcGFydGl0aW9uW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYWRkaXRpb25hbEZpZWxkcyB8fFxuICAgICAgICAgICAgICAgICAgICAhZXhpc3RGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEZpZWxkcy5sZW5ndGggPT09IGV4aXN0RmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgcGFydGl0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YVJlcXVlc3RCaWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwibWV0YWRhdGFcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmdldFBhcnRpdGlvbnMobWV0YVJlcXVlc3RCaWxkZXIsIHtcbiAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxGaWVsZHM6IHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpLFxuICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5ICYmXG4gICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FjaGUucHV0KHJlcXVlc3QsIHRoaXMuaHJuLnRvU3RyaW5nKCksIHRoaXMubGF5ZXJJZCwgbWV0YWRhdGEucGFydGl0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtZXRhZGF0YSk7XG4gICAgfVxuICAgIGFzeW5jIGRvd25sb2FkUGFydGl0aW9uKGRhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBiaWxsaW5nVGFnKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBhd2FpdCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwidm9sYXRpbGUtYmxvYlwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuVm9sYXRpbGVCbG9iQXBpLmdldFZvbGF0aWxlQmxvYihidWlsZGVyLCB7XG4gICAgICAgICAgICBkYXRhSGFuZGxlLFxuICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgYmlsbGluZ1RhZ1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBiYXNlVXJsIGFuZCBjcmVhdGVzIHJlcXVlc3RCdWlsZGVyIGZvciBzZW5kaW5nIHJlcXVlc3RzIHRvIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UuXG4gICAgICogQHBhcmFtIGJ1aWxkZXJUeXBlIGVuZHBvaW50IG5hbWUgaXMgbmVlZGVkIHRvIGNyZWF0ZSBwcm9wcmlhdGUgcmVxdWVzdEJ1aWxkZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHJlcXVlc3RCdWlsZGVyXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmVxdWVzdEJ1aWxkZXIoYnVpbGRlclR5cGUsIGhybiwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShidWlsZGVyVHlwZSwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCBocm4sIGFib3J0U2lnbmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW5kIHJldHVybnMgcGFydGl0aW9uIG1ldGFkYXRhXG4gICAgICogQHBhcmFtIHBhcnRpdGlvbklkIFRoZSBuYW1lIG9mIHRoZSBwYXJ0aXRpb24gdG8gZmV0Y2guXG4gICAgICogQHBhcmFtIGZldGNoT3B0aW9uIFRoZSBvcHRpb24gb2YgY2FjaGluZyAob25saW5lIG9ubHkgb3IgcmV0dXJuIGZyb20gY2FjaGUgaWYgZXhpc3QpXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIG9mIHBhcnRpdGlvbiBtZXRhZGF0YSB3aGljaCB1c2VkIHRvIGdldCBwYXJ0aXRpb24gZGF0YVxuICAgICAqL1xuICAgIGFzeW5jIGdldERhdGFIYW5kbGVCeVBhcnRpdGlvbklkKHBhcnRpdGlvbklkLCBmZXRjaE9wdGlvbiwgYmlsbGluZ1RhZykge1xuICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBRdWVyeUNsaWVudF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBwYXJ0aXRpb25zUmVxdWVzdCA9IG5ldyBQYXJ0aXRpb25zUmVxdWVzdF8xLlBhcnRpdGlvbnNSZXF1ZXN0KClcbiAgICAgICAgICAgIC53aXRoUGFydGl0aW9uSWRzKFtwYXJ0aXRpb25JZF0pXG4gICAgICAgICAgICAud2l0aEZldGNoT3B0aW9uKGZldGNoT3B0aW9uKTtcbiAgICAgICAgaWYgKGJpbGxpbmdUYWcpIHtcbiAgICAgICAgICAgIHBhcnRpdGlvbnNSZXF1ZXN0LndpdGhCaWxsaW5nVGFnKGJpbGxpbmdUYWcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgcXVlcnlDbGllbnQuZ2V0UGFydGl0aW9uc0J5SWQocGFydGl0aW9uc1JlcXVlc3QsIHRoaXMubGF5ZXJJZCwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pKTtcbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnBhcnRpdGlvbnMgJiZcbiAgICAgICAgICAgIG1ldGFkYXRhLnBhcnRpdGlvbnNbMF0gJiZcbiAgICAgICAgICAgIG1ldGFkYXRhLnBhcnRpdGlvbnNbMF0uZGF0YUhhbmRsZVxuICAgICAgICAgICAgPyBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdLmRhdGFIYW5kbGVcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZWplY3QobmV3IG9scF9zZGtfY29yZV8xLkh0dHBFcnJvcihvbHBfc2RrX2NvcmVfMS5TVEFUVVNfQ09ERVMuTk9UX0ZPVU5ELCBgTm8gcGFydGl0aW9uIGRhdGFIYW5kbGUgZm9yIHBhcnRpdGlvbiAke3BhcnRpdGlvbklkfS4gSFJOOiAke3RoaXMuaHJufWApKTtcbiAgICB9XG59XG5leHBvcnRzLlZvbGF0aWxlTGF5ZXJDbGllbnQgPSBWb2xhdGlsZUxheWVyQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9DYXRhbG9nQ2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9DYXRhbG9nUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRGF0YVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0YXRpc3RpY3NDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0YXRpc3RpY3NSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TdW1tYXJ5UmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vVmVyc2lvbmVkTGF5ZXJDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1ZvbGF0aWxlTGF5ZXJDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0NvbmZpZ0NsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQ2F0YWxvZ3NSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TY2hlbWFEZXRhaWxzUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQXJ0aWZhY3RDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1BhcnRpdGlvbnNSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9RdWVyeUNsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vUXVhZFRyZWVJbmRleFJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vU2NoZW1hUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9MYXllclZlcnNpb25zUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vSW5kZXhMYXllckNsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vSW5kZXhRdWVyeVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0cmVhbUxheWVyQ2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TdWJzY3JpYmVSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9Qb2xsUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vVW5zdWJzY3JpYmVSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TZWVrUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vVGlsZVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi91dGlsc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vY2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jYWNoZVwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNiBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0VGlsZSA9IGdldFRpbGU7XG5leHBvcnRzLmZldGNoUXVhZFRyZWVJbmRleCA9IGZldGNoUXVhZFRyZWVJbmRleDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG5jb25zdCBRdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5XzEgPSByZXF1aXJlKFwiLi4vY2FjaGUvUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeVwiKTtcbmNvbnN0IFF1YWRUcmVlSW5kZXhSZXF1ZXN0XzEgPSByZXF1aXJlKFwiLi4vY2xpZW50L1F1YWRUcmVlSW5kZXhSZXF1ZXN0XCIpO1xuY29uc3QgUXVlcnlDbGllbnRfMSA9IHJlcXVpcmUoXCIuLi9jbGllbnQvUXVlcnlDbGllbnRcIik7XG5hc3luYyBmdW5jdGlvbiBnZXRUaWxlKHJlcXVlc3QsIHBhcmFtcywgYWJvcnRTaWduYWwsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB0aWxlUmVzcG9uc2UgPSBhd2FpdCBmZXRjaFRpbGUocmVxdWVzdCwgcGFyYW1zLCBhYm9ydFNpZ25hbCk7XG4gICAgcmV0dXJuIG9wdGlvbnM/LmluY2x1ZGVUaWxlS2V5ID8gdGlsZVJlc3BvbnNlIDogdGlsZVJlc3BvbnNlLnJlc3BvbnNlO1xufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVGlsZShyZXF1ZXN0LCBwYXJhbXMsIGFib3J0U2lnbmFsKSB7XG4gICAgbGV0IGNhdGFsb2dWZXJzaW9uO1xuICAgIGNvbnN0IHF1YWRLZXkgPSByZXF1ZXN0LmdldFRpbGVLZXkoKTtcbiAgICBpZiAoIXF1YWRLZXkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgUXVhZEtleVwiKSk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMubGF5ZXJUeXBlID09PSBcInZlcnNpb25lZFwiKSB7XG4gICAgICAgIGNhdGFsb2dWZXJzaW9uID0gcGFyYW1zLmNhdGFsb2dWZXJzaW9uO1xuICAgIH1cbiAgICBjb25zdCBibG9iVHlwZSA9IHBhcmFtcy5sYXllclR5cGUgPT09IFwidmVyc2lvbmVkXCIgPyBcImJsb2JcIiA6IFwidm9sYXRpbGUtYmxvYlwiO1xuICAgIGNvbnN0IGJsb2JSZXF1ZXN0QnVpbGRlciA9IGF3YWl0IG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShibG9iVHlwZSwgXCJ2MVwiLCBwYXJhbXMuc2V0dGluZ3MsIHBhcmFtcy5jYXRhbG9nSHJuLCBhYm9ydFNpZ25hbCk7XG4gICAgY29uc3QgZGVwdGggPSA0O1xuICAgIGNvbnN0IHJlcXVlc3RlZFRpbGVLZXkgPSBvbHBfc2RrX2NvcmVfMS5UaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChxdWFkS2V5LnJvdywgcXVhZEtleS5jb2x1bW4sIHF1YWRLZXkubGV2ZWwpO1xuICAgIGNvbnN0IHF1YWRUcmVlSW5kZXhSb290ID0gcmVxdWVzdGVkVGlsZUtleS5jaGFuZ2VkTGV2ZWxCeSgtZGVwdGgpO1xuICAgIGxldCBxdWFkVHJlZUluZGV4O1xuICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5KSB7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IFF1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnlfMS5RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5KHBhcmFtcy5zZXR0aW5ncy5jYWNoZSk7XG4gICAgICAgIHF1YWRUcmVlSW5kZXggPSBjYWNoZS5nZXQoe1xuICAgICAgICAgICAgaHJuOiBwYXJhbXMuY2F0YWxvZ0hybi50b1N0cmluZygpLFxuICAgICAgICAgICAgbGF5ZXJJZDogcGFyYW1zLmxheWVySWQsXG4gICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgIHJvb3Q6IHF1YWRUcmVlSW5kZXhSb290LFxuICAgICAgICAgICAgdmVyc2lvbjogY2F0YWxvZ1ZlcnNpb25cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghcXVhZFRyZWVJbmRleCkge1xuICAgICAgICBxdWFkVHJlZUluZGV4ID0gYXdhaXQgZmV0Y2hRdWFkVHJlZUluZGV4KHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIGNhdGFsb2dWZXJzaW9uLFxuICAgICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgICBmZXRjaE9wdGlvbnM6IHJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSxcbiAgICAgICAgICAgIHRpbGVLZXk6IHF1YWRUcmVlSW5kZXhSb290LFxuICAgICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc3ViUXVhZHMgPSBxdWFkVHJlZUluZGV4LnN1YlF1YWRzID8/IFtdO1xuICAgIGNvbnN0IHBhcmVudFF1YWRzID0gcXVhZFRyZWVJbmRleC5wYXJlbnRRdWFkcyA/PyBbXTtcbiAgICBpZiAoIXN1YlF1YWRzLmxlbmd0aCAmJiAhcGFyZW50UXVhZHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgcmVzcG9uc2U6IG5ldyBSZXNwb25zZShudWxsLCB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiAyMDQsXG4gICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogXCJObyBDb250ZW50XCJcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcGFyZW50VGlsZUtleTogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBjbG9zZXN0UGFyZW50ID0gZmluZENsb3Nlc3RQYXJlbnQocmVxdWVzdGVkVGlsZUtleSwgcXVhZFRyZWVJbmRleCwgcXVhZFRyZWVJbmRleFJvb3QpO1xuICAgIGlmICghY2xvc2VzdFBhcmVudCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGJsb2IgZm9yIFRpbGU6ICR7cmVxdWVzdGVkVGlsZUtleS50b0hlcmVUaWxlKCl9YCkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICByZXNwb25zZTogYXdhaXQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5CbG9iQXBpLmdldEJsb2IoYmxvYlJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICBkYXRhSGFuZGxlOiBjbG9zZXN0UGFyZW50LnBhcmVudFF1YWQuZGF0YUhhbmRsZSxcbiAgICAgICAgICAgIGxheWVySWQ6IHBhcmFtcy5sYXllcklkLFxuICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgfSksXG4gICAgICAgIHBhcmVudFRpbGVLZXk6IGNsb3Nlc3RQYXJlbnQudGlsZUtleVxuICAgIH07XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGNsb3Nlc3QgcGFyZW50IHF1YWQgZm9yIGEgZ2l2ZW4gdGlsZSBrZXkuXG4gKiBAaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIGZpbmRDbG9zZXN0UGFyZW50KHRpbGVLZXksIHF1YWRUcmVlSW5kZXgsIHF1YWRUcmVlSW5kZXhSb290KSB7XG4gICAgY29uc3Qgc3ViUXVhZHMgPSBxdWFkVHJlZUluZGV4LnN1YlF1YWRzID8/IFtdO1xuICAgIGNvbnN0IHBhcmVudFF1YWRzID0gcXVhZFRyZWVJbmRleC5wYXJlbnRRdWFkcyA/PyBbXTtcbiAgICAvLyBGaXJzdCwgaXRlcmF0ZSB0aHJvdWdoIHRoZSBzdWIgcXVhZCB0cmVlcywgc3RhcnRpbmcgZnJvbSBsb3dlc3QgbGV2ZWwgdXAgdG8gdGhlIHF1YWQgdHJlZSBpbmRleCByb290XG4gICAgbGV0IGN1cnJlbnRUaWxlS2V5ID0gdGlsZUtleTtcbiAgICB3aGlsZSAoY3VycmVudFRpbGVLZXkubGV2ZWwgPj0gcXVhZFRyZWVJbmRleFJvb3QubGV2ZWwpIHtcbiAgICAgICAgY29uc3QgY3VycmVudERlbHRhID0gY3VycmVudFRpbGVLZXkubGV2ZWwgLSBxdWFkVHJlZUluZGV4Um9vdC5sZXZlbDtcbiAgICAgICAgY29uc3Qgc3ViSGVyZVRpbGUgPSBjdXJyZW50VGlsZUtleS5nZXRTdWJIZXJlVGlsZShjdXJyZW50RGVsdGEpO1xuICAgICAgICBjb25zdCBzdWJRdWFkID0gc3ViUXVhZHMuZmluZCgoaXRlbSkgPT4gaXRlbS5zdWJRdWFkS2V5ID09PSBzdWJIZXJlVGlsZSk7XG4gICAgICAgIGlmIChzdWJRdWFkKSB7XG4gICAgICAgICAgICByZXR1cm4geyBwYXJlbnRRdWFkOiBzdWJRdWFkLCB0aWxlS2V5OiBjdXJyZW50VGlsZUtleSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0b3AgYmVmb3JlIHJlcXVlc3RpbmcgdGhlIHBhcmVudCBvZiB0aGUgcXVhZCB0cmVlIGluZGV4IHJvb3QgLVxuICAgICAgICAvLyB0aGF0IHJvb3QgY2FuIGJlIHRoZSBnbG9iYWwgcm9vdCB0aWxlIChsZXZlbCAwKSwgd2hvc2UgcGFyZW50KClcbiAgICAgICAgLy8gdGhyb3dzIHJhdGhlciB0aGFuIHJldHVybmluZyBhbm90aGVyIHRpbGUuXG4gICAgICAgIGlmIChjdXJyZW50VGlsZUtleS5sZXZlbCA9PT0gcXVhZFRyZWVJbmRleFJvb3QubGV2ZWwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRUaWxlS2V5ID0gY3VycmVudFRpbGVLZXkucGFyZW50KCk7XG4gICAgfVxuICAgIC8vIG5vdCBmb3VuZD8gRmluZCB0aGUgY2xvc2VzdCBwYXJlbnQgcXVhZFxuICAgIHJldHVybiBwYXJlbnRRdWFkcy5yZWR1Y2UoKGNsb3Nlc3QsIHBhcmVudFF1YWQpID0+IHtcbiAgICAgICAgY29uc3QgdGlsZUtleSA9IG9scF9zZGtfY29yZV8xLlRpbGVLZXkuZnJvbUhlcmVUaWxlKHBhcmVudFF1YWQucGFydGl0aW9uKTtcbiAgICAgICAgcmV0dXJuICFjbG9zZXN0IHx8IHRpbGVLZXkubGV2ZWwgPiBjbG9zZXN0LnRpbGVLZXkubGV2ZWxcbiAgICAgICAgICAgID8geyBwYXJlbnRRdWFkLCB0aWxlS2V5IH1cbiAgICAgICAgICAgIDogY2xvc2VzdDtcbiAgICB9LCB1bmRlZmluZWQpO1xufVxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJlcXVlc3QgcXVhZCB0cmVlIGluZGV4IGZvciB0aGUgcGFyZW50IHRpbGUgd2l0aCBkZWx0YSA0XG4gKiBhbmQgY2FjaGUgdGhlIHJlc3BvbnNlcyBpbiBjYWNoZSBmb3IgbGF0ZXIgY2FsbHMuXG4gKiBAaGlkZGVuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUXVhZFRyZWVJbmRleChwYXJhbXMpIHtcbiAgICBjb25zdCBjYWNoZSA9IG5ldyBRdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5XzEuUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeShwYXJhbXMuc2V0dGluZ3MuY2FjaGUpO1xuICAgIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IFF1ZXJ5Q2xpZW50XzEuUXVlcnlDbGllbnQocGFyYW1zLnNldHRpbmdzKTtcbiAgICBjb25zdCBxdWFkVHJlZUluZGV4UmVxdWVzdCA9IG5ldyBRdWFkVHJlZUluZGV4UmVxdWVzdF8xLlF1YWRUcmVlSW5kZXhSZXF1ZXN0KHBhcmFtcy5jYXRhbG9nSHJuLCBwYXJhbXMubGF5ZXJJZCwgcGFyYW1zLmxheWVyVHlwZSlcbiAgICAgICAgLndpdGhRdWFkS2V5KHBhcmFtcy50aWxlS2V5KVxuICAgICAgICAud2l0aERlcHRoKHBhcmFtcy5kZXB0aCk7XG4gICAgaWYgKHBhcmFtcy5sYXllclR5cGUgPT09IFwidmVyc2lvbmVkXCIpIHtcbiAgICAgICAgcXVhZFRyZWVJbmRleFJlcXVlc3Qud2l0aFZlcnNpb24ocGFyYW1zLmNhdGFsb2dWZXJzaW9uKTtcbiAgICB9XG4gICAgY29uc3QgcXVhZFRyZWVJbmRleCA9IGF3YWl0IHF1ZXJ5Q2xpZW50LmZldGNoUXVhZFRyZWVJbmRleChxdWFkVHJlZUluZGV4UmVxdWVzdCwgcGFyYW1zLmFib3J0U2lnbmFsKTtcbiAgICBpZiAocGFyYW1zLmZldGNoT3B0aW9ucyAhPT0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZU9ubHkgJiZcbiAgICAgICAgKHF1YWRUcmVlSW5kZXguc3ViUXVhZHMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgcXVhZFRyZWVJbmRleC5wYXJlbnRRdWFkcyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBjYWNoZS5wdXQoe1xuICAgICAgICAgICAgaHJuOiBwYXJhbXMuY2F0YWxvZ0hybi50b1N0cmluZygpLFxuICAgICAgICAgICAgbGF5ZXJJZDogcGFyYW1zLmxheWVySWQsXG4gICAgICAgICAgICBkZXB0aDogcGFyYW1zLmRlcHRoLFxuICAgICAgICAgICAgcm9vdDogcGFyYW1zLnRpbGVLZXksXG4gICAgICAgICAgICB0cmVlOiBxdWFkVHJlZUluZGV4LFxuICAgICAgICAgICAgdmVyc2lvbjogcGFyYW1zLmNhdGFsb2dWZXJzaW9uXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHF1YWRUcmVlSW5kZXgpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi92YWxpZGF0ZUJpbGxpbmdUYWdcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3ZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2dldFRpbGVcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy52YWxpZGF0ZUJpbGxpbmdUYWcgPSB2YWxpZGF0ZUJpbGxpbmdUYWc7XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgYmlsbGluaWcgdGFnLlxuICpcbiAqIEl0IG11c3QgYmUgNCZuZGFzaDsxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqXG4gKiBAcGFyYW0gdGFnIFRoZSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBiaWxsaW5nIHRhZy5cbiAqIEByZXR1cm4gVGhlIGJpbGxpbmcgdGFnIGlmIGl0J3MgdmFsaWQuIE90aGVyd2lzZSwgdGhyb3dzIGFuIGVycm9yLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJpbGxpbmdUYWcodGFnKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IC9eW0EtWmEtejAtOV8tXXs0LDE2fSQvO1xuICAgIGlmICghcGF0dGVybi50ZXN0KHRhZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGJpbGxpbmcgdGFnIG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZztcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudmFsaWRhdGVQYXJ0aXRpb25zSWRzTGlzdCA9IHZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3Q7XG4vKipcbiAqIFZhbGlkYXRlcyBhIGxpc3Qgb2YgcGFydGl0aW9ucyBJRHMuXG4gKlxuICogSXQgbXVzdCBiZSBiZXR3ZWVuIDEmbmRhc2g7MTAwIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSBsaXN0IFRoZSBsaXN0cyBvZiBzdHJpbmdzIHRoYXQgcmVwcmVzZW50IHRoZSBwYXJ0aXRpb25zIElEcy5cbiAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIHN0cmluZ3MgaWYgaXQncyB2YWxpZC4gT3RoZXJ3aXNlLCB0aHJvd3MgYW4gZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3QobGlzdCkge1xuICAgIGNvbnN0IExJU1RfTUFYX0xFTkdUSCA9IDEwMDtcbiAgICBjb25zdCBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgMSB8fCBsZW5ndGggPiBMSVNUX01BWF9MRU5HVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcnRpdGlvbiBpZHMgcXVhbnRpdHkgbXVzdCBiZSBiZXR3ZWVuIDEgLSAxMDBcIik7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxuY29uc3QgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHRjb25zdCBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0Y29uc3QgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRpZiAoIShtb2R1bGVJZCBpbiBfX3dlYnBhY2tfbW9kdWxlc19fKSkge1xuXHRcdGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRcdGNvbnN0IGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG5sZXQgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oXCIuL2luZGV4LndlYi5qc1wiKTtcbiIsIiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==