@here/olp-sdk-dataservice-read 1.12.0 → 1.12.2

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
@@ -2796,30 +2796,32 @@ class StreamLayerClient {
2796
2796
  .catch(error => Promise.reject(error));
2797
2797
  // Update xCorrelationId
2798
2798
  this.xCorrelationId = consumeResponse.xCorrelationId;
2799
- // Commit offsets
2800
- const latestOffsets = consumeResponse.data
2801
- .map(msg => msg.offset)
2802
- .reduce((acc, curr) => {
2803
- acc[curr.partition] =
2804
- acc[curr.partition] > curr.offset
2805
- ? acc[curr.partition]
2806
- : curr.offset;
2807
- return acc;
2808
- }, {});
2809
- yield olp_sdk_dataservice_api_1.StreamApi.doCommitOffsets(requestBuilder, {
2810
- commitOffsets: {
2811
- offsets: Object.keys(latestOffsets).map(key => ({
2812
- partition: +key,
2813
- offset: latestOffsets[key]
2814
- }))
2815
- },
2816
- subscriptionId: request.getSubscriptionId(),
2817
- mode: request.getMode(),
2818
- layerId: this.layerId,
2819
- xCorrelationId: this.xCorrelationId
2820
- }).catch((error) => __awaiter(this, void 0, void 0, function* () {
2821
- console.log(`Commit offsets unsuccessful, error=${error.message}`);
2822
- }));
2799
+ if (consumeResponse.data.length > 0) {
2800
+ // Commit offsets
2801
+ const latestOffsets = consumeResponse.data
2802
+ .map(msg => msg.offset)
2803
+ .reduce((acc, curr) => {
2804
+ acc[curr.partition] =
2805
+ acc[curr.partition] > curr.offset
2806
+ ? acc[curr.partition]
2807
+ : curr.offset;
2808
+ return acc;
2809
+ }, {});
2810
+ yield olp_sdk_dataservice_api_1.StreamApi.doCommitOffsets(requestBuilder, {
2811
+ commitOffsets: {
2812
+ offsets: Object.keys(latestOffsets).map(key => ({
2813
+ partition: +key,
2814
+ offset: latestOffsets[key]
2815
+ }))
2816
+ },
2817
+ subscriptionId: request.getSubscriptionId(),
2818
+ mode: request.getMode(),
2819
+ layerId: this.layerId,
2820
+ xCorrelationId: this.xCorrelationId
2821
+ }).catch((error) => __awaiter(this, void 0, void 0, function* () {
2822
+ console.log(`Commit offsets unsuccessful, error=${error.message}`);
2823
+ }));
2824
+ }
2823
2825
  return Promise.resolve(consumeResponse.data);
2824
2826
  });
2825
2827
  }
@@ -3992,7 +3994,10 @@ function getTile(request, params, abortSignal) {
3992
3994
  quadTreeIndex = yield fetchQuadTreeIndex(Object.assign(Object.assign({}, params), { catalogVersion, depth: delta, fetchOptions: request.getFetchOption(), tileKey: parentTileKey, abortSignal, billingTag: request.getBillingTag() })).catch(e => Promise.reject(e));
3993
3995
  }
3994
3996
  if (!quadTreeIndex.subQuads || !quadTreeIndex.subQuads.length) {
3995
- return Promise.reject(new Error("Error fetching QuadTreeIndex"));
3997
+ return Promise.resolve(new Response("No Content", {
3998
+ status: 204,
3999
+ statusText: "No Content"
4000
+ }));
3996
4001
  }
3997
4002
  // Return the data for the requested QuadKey or for the closest parent
3998
4003
  const subQuads = quadTreeIndex.subQuads;
@@ -6696,9 +6701,9 @@ class UrlBuilder {
6696
6701
  static toString(param) {
6697
6702
  return typeof param === "string" ? param : param.toString();
6698
6703
  }
6699
- static appendQueryString(url, separator, key, value) {
6704
+ static appendQueryString(url, separator, key, value, operator = "=") {
6700
6705
  url += separator;
6701
- url += encodeURIComponent(key) + "=";
6706
+ url += encodeURIComponent(key) + operator;
6702
6707
  if (typeof value === "number") {
6703
6708
  url += value.toString();
6704
6709
  }
@@ -6708,8 +6713,12 @@ class UrlBuilder {
6708
6713
  else if (typeof value === "string") {
6709
6714
  url += encodeURIComponent(value);
6710
6715
  }
6711
- else {
6712
- url += value.map(val => encodeURIComponent(val)).join(",");
6716
+ else if (Array.isArray(value)) {
6717
+ const encodedValues = [];
6718
+ value.forEach((val) => {
6719
+ encodedValues.push(encodeURIComponent(val));
6720
+ });
6721
+ url += encodedValues.join(",");
6713
6722
  }
6714
6723
  return url;
6715
6724
  }
@@ -6724,11 +6733,20 @@ class UrlBuilder {
6724
6733
  * @param key The key of the query parameter.
6725
6734
  * @param value The value of the query parameter.
6726
6735
  */
6727
- appendQuery(key, value) {
6736
+ appendQuery(key, value, operator = "=") {
6728
6737
  if (value === undefined) {
6729
6738
  return;
6730
6739
  }
6731
- this.url = UrlBuilder.appendQueryString(this.url, this.hasQuery ? "&" : "?", key, value);
6740
+ if (value instanceof Object && !(value instanceof Array)) {
6741
+ let queryString = "";
6742
+ for (const propKey in value) {
6743
+ queryString += UrlBuilder.appendQueryString("", this.hasQuery ? "&" : "?", propKey, value[propKey]);
6744
+ }
6745
+ this.url += queryString;
6746
+ }
6747
+ else {
6748
+ this.url = UrlBuilder.appendQueryString(this.url, this.hasQuery ? "&" : "?", key, value, operator);
6749
+ }
6732
6750
  this.hasQuery = true;
6733
6751
  }
6734
6752
  }
@@ -11314,6 +11332,7 @@ exports.putFeatures = exports.putFeature = exports.postFeatures = exports.patchF
11314
11332
  * https://github.com/swagger-api/swagger-codegen.git
11315
11333
  */
11316
11334
  // tslint:disable:array-type
11335
+ // tslint:disable: unified-signatures
11317
11336
  const RequestBuilder_1 = __webpack_require__(/*! ./RequestBuilder */ "./node_modules/@here/olp-sdk-dataservice-api/lib/RequestBuilder.js");
11318
11337
  /**
11319
11338
  * Retrieves API Specification version information.
@@ -11415,123 +11434,32 @@ function getFeatures(builder, params) {
11415
11434
  });
11416
11435
  }
11417
11436
  exports.getFeatures = getFeatures;
11418
- /**
11419
- * Return the features which are inside a bounding box stipulated by bbox parameter.
11420
- *
11421
- * @summary Get features by bounding box.
11422
- *
11423
- * @param layerId The unique identified for the Layer ID.
11424
- *
11425
- * @param bbox Both west, south, east and north coordinates separated by comma.
11426
- * Example: `bbox=13.082,52.416,13.628,52.626` - Bounding box of Berlin.
11427
- *
11428
- * @param clip If set to true the features' geometries are clipped to the geometry of the
11429
- * tile or bounding box. Default is false.
11430
- *
11431
- * @param limit The maximum number of features in the response. Default is 30000. Hard limit is 100000.
11432
- *
11433
- * @param params Additional feature filters which compares the feature's property's value with the one specified
11434
- * in the query, resulting in a subset of features.
11435
- * The usage of multiple property names represents an AND operation.
11436
- * The usage of a comma (,) separating the properties values, represents an OR operation.
11437
- * Properties initiated with 'f.' are used to access values which are added by default in the stored feature.
11438
- * The possible values are: 'f.id', 'f.createdAt' and 'f.updatedAt'.
11439
- * Properties initiated with 'p.' are used to access values in the stored feature which are under the 'properties' property.
11440
- * Use it as a shorthand accessor for 'properties' values.
11441
- * The format should follow the specification below
11442
- * ```
11443
- * ?p.property_name_1=property_value_1&f.special_property_name_1=special_property_value_1
11444
- * ```
11445
- *
11446
- * For example, the above query, the Features will be filtered by 'property' AND 'special property' equals to their
11447
- * respective values.
11448
- *
11449
- * While in the following example ```?p.property_name_1=value_1,value_2```
11450
- * The resulting Features list will contain all elements having `value_1` OR `value_2`.
11451
- *
11452
- * Additionally to the operators used in the examples above, the query can be written, with the same semantic,
11453
- * by using the long operators: `"=gte=", "=lte=", "=gt=", "=lt=" and "=cs="`.
11454
- *
11455
- * The below queries yield the same result:
11456
- * ```
11457
- * ?p.property_name_1>=10
11458
- * ?p.property_name_1=gte=10
11459
- * ```
11460
- *
11461
- * The available operators are:
11462
- * "=" - equals
11463
- * "!=" - not equals
11464
- * ">=" or "=gte=" - greater than or equals
11465
- * "<=" or "=lte=" - less than or equals
11466
- * ">" or "=gt=" - greater than
11467
- * "<" or "=lt=" - less than
11468
- * "@>" or "=cs=" - contains
11469
- *
11470
- * @param selection A list of properties to be returned in the features result list.
11471
- * Multiple attributes can be specified by using comma(,).
11472
- * Example: `?selection=p.name,p.capacity,p.color`.
11473
- *
11474
- * @param skipCache If set to true the response is not returned from cache. Default is false.
11475
- *
11476
- * @param clustering The clustering algorithm to apply to the data within the result.
11477
- * Providing this query parameter the data will be returned in a clustered way.
11478
- * This means the data won't necessarily be returned in its original shape or with its original properties.
11479
- * Depending on the chosen clustering algorithm there could be different mandatory and/or optional parameters
11480
- * to specify the behavior of the algorithm.
11481
- * Possible values are:
11482
- *
11483
- * `hexbin` - The hexbin algorithm divides the world in hexagonal "bins" on a specified resolution.
11484
- * Each hexagon has an address being described by the H3 addressing scheme.
11485
- * For more information on that topic see: https://eng.uber.com/h3/.
11486
- *
11487
- * `quadbin` - The quadbin algorithm takes the geometry input from the request (e.g. quadkey / bbox..)
11488
- * and count the features in it.
11489
- * This clustering mode works also for very large layers and can be used for getting an overview
11490
- * where data is present in a given layer. Furthermore, a property filter on one property is applicable.
11491
- *
11492
- * @param clusteringParams Some parameters for the chosen clustering algorithm.
11493
- * Depending on the chosen clustering algorithm there could be different mandatory and/or optional parameters to specify
11494
- * the behavior of the algorithm.
11495
- *
11496
- * Clustering-Parameter reference.
11497
- * NOTE: The actual query parameters in the URL are looking like: `?clustering.aParameterName=aValue`.
11498
- *
11499
- * Clustering-type: "hexbin":
11500
- * There are several parameters needed by the H3 based hexbin algorithm.
11501
- * For more information on that topic see: https://eng.uber.com/h3/.
11502
- *
11503
- * =======================================================================================================
11504
- * | Parameter | Type | Mandatory | Meaning |
11505
- * ========================================================================================================
11506
- * | absoluteResolution | Number | NO | The H3 hexagon resolution |
11507
- * --------------------------------------------------------------------------------------------------------
11508
- * | resolution | Number | NO | deprecated, renamed to absoluteResolution |
11509
- * --------------------------------------------------------------------------------------------------------
11510
- * | relativeResolution | Number | NO | integer value [0-4] to be added to current used |
11511
- * | | | | resolution |
11512
- * --------------------------------------------------------------------------------------------------------
11513
- * | property | String | NO | A property of the original features for which to |
11514
- * | | | | calculate statistics |
11515
- * --------------------------------------------------------------------------------------------------------
11516
- * | pointmode | Boolean | NO | retuns the centroid of hexagons as geojson feature |
11517
- * --------------------------------------------------------------------------------------------------------
11518
- *
11519
- *
11520
- * @param force2D If set to `true` the features in the response will have only X's and Y's as coordinates.
11521
- */
11522
11437
  function getFeaturesByBBox(builder, params) {
11523
11438
  return __awaiter(this, void 0, void 0, function* () {
11524
11439
  const baseUrl = "/layers/{layerId}/bbox".replace("{layerId}", RequestBuilder_1.UrlBuilder.toString(params["layerId"]));
11525
11440
  const urlBuilder = new RequestBuilder_1.UrlBuilder(builder.baseUrl + baseUrl);
11526
11441
  urlBuilder.appendQuery("bbox", params["bbox"]);
11527
- urlBuilder.appendQuery("clip", "true");
11442
+ urlBuilder.appendQuery("clip", params["clip"]);
11528
11443
  urlBuilder.appendQuery("limit", params["limit"]);
11529
- urlBuilder.appendQuery("params", params["params"]);
11444
+ const searchParams = params.params;
11445
+ if (searchParams instanceof Array) {
11446
+ searchParams.forEach(param => {
11447
+ urlBuilder.appendQuery(param.key, param.value, param.operator);
11448
+ });
11449
+ }
11450
+ else {
11451
+ // will be removed 06.2022
11452
+ urlBuilder.appendQuery("params", params["params"]);
11453
+ }
11530
11454
  urlBuilder.appendQuery("selection", params["selection"]);
11531
- urlBuilder.appendQuery("skipCache", "true");
11455
+ urlBuilder.appendQuery("skipCache", params["skipCache"]);
11532
11456
  urlBuilder.appendQuery("clustering", params["clustering"]);
11533
- urlBuilder.appendQuery("clusteringParams", params["clusteringParams"]);
11534
- urlBuilder.appendQuery("force2D", "true");
11457
+ if (params["clusteringParams"]) {
11458
+ for (const clusteringParam in params["clusteringParams"]) {
11459
+ urlBuilder.appendQuery(`clustering.${clusteringParam}`, params["clusteringParams"][clusteringParam]);
11460
+ }
11461
+ }
11462
+ urlBuilder.appendQuery("force2D", params["force2D"]);
11535
11463
  const headers = {};
11536
11464
  const options = {
11537
11465
  method: "GET",
@@ -11541,79 +11469,6 @@ function getFeaturesByBBox(builder, params) {
11541
11469
  });
11542
11470
  }
11543
11471
  exports.getFeaturesByBBox = getFeaturesByBBox;
11544
- /**
11545
- * List the features which are inside the specified radius. The origin radius point is calculated
11546
- * based either on latitude & longitude or by specifying a feature's geometry.
11547
- *
11548
- * @summary Get features with radius search.
11549
- *
11550
- * @param layerId The unique identified for the Layer ID.
11551
- *
11552
- * @param lat The latitude in WGS'84 decimal degree (-90 to +90) of the center Point.
11553
- *
11554
- * @param lng The longitude in WGS'84 decimal degree (-180 to +180) of the center Point.
11555
- *
11556
- * @param refCatalogHrn The catalog HRN where the layer containing the referenced feature is stored.
11557
- * Always to use in combination with refFeatureId.
11558
- *
11559
- * @param refLayerId As alternative for defining center coordinates,
11560
- * it is possible to reference a geometry in a layer.
11561
- * Therefore it is needed to provide the layer id where the referenced feature is stored.
11562
- * Always to use in combination with refFeatureId.
11563
- *
11564
- * @param refFeatureId The unique identifier of a feature in the referenced layer.
11565
- * The geometry of that feature gets used for the spatial query.
11566
- * Always to use in combination with refCatalogHrn and refLayerId.
11567
- *
11568
- * @param radius Radius in meter which defines the diameter of the search request.
11569
- *
11570
- * @param limit The maximum number of features in the response. Default is 30000. Hard limit is 100000.
11571
- *
11572
- * @param params Additional feature filters which compares the feature's property's value with the one specified
11573
- * in the query, resulting in a subset of features.
11574
- * The usage of multiple property names represents an AND operation.
11575
- * The usage of a comma (,) separating the properties values, represents an OR operation.
11576
- * Properties initiated with 'f.' are used to access values which are added by default in the stored feature.
11577
- * The possible values are: 'f.id', 'f.createdAt' and 'f.updatedAt'.
11578
- * Properties initiated with 'p.' are used to access values in the stored feature which are under the 'properties' property.
11579
- * Use it as a shorthand accessor for 'properties' values.
11580
- * The format should follow the specification below
11581
- * ```
11582
- * ?p.property_name_1=property_value_1&f.special_property_name_1=special_property_value_1
11583
- * ```
11584
- *
11585
- * For example, the above query, the Features will be filtered by 'property' AND 'special property' equals to their
11586
- * respective values.
11587
- *
11588
- * While in the following example ```?p.property_name_1=value_1,value_2```
11589
- * The resulting Features list will contain all elements having `value_1` OR `value_2`.
11590
- *
11591
- * Additionally to the operators used in the examples above, the query can be written, with the same semantic,
11592
- * by using the long operators: `"=gte=", "=lte=", "=gt=", "=lt=" and "=cs="`.
11593
- *
11594
- * The below queries yield the same result:
11595
- * ```
11596
- * ?p.property_name_1>=10
11597
- * ?p.property_name_1=gte=10
11598
- * ```
11599
- *
11600
- * The available operators are:
11601
- * "=" - equals
11602
- * "!=" - not equals
11603
- * ">=" or "=gte=" - greater than or equals
11604
- * "<=" or "=lte=" - less than or equals
11605
- * ">" or "=gt=" - greater than
11606
- * "<" or "=lt=" - less than
11607
- * "@>" or "=cs=" - contains
11608
- *
11609
- * @param selection A list of properties to be returned in the features result list.
11610
- * Multiple attributes can be specified by using comma(,).
11611
- * Example: `?selection=p.name,p.capacity,p.color`.
11612
- *
11613
- * @param skipCache If set to true the response is not returned from cache. Default is false.
11614
- *
11615
- * @param force2D If set to `true` the features in the response will have only X's and Y's as coordinates.
11616
- */
11617
11472
  function getFeaturesBySpatial(builder, params) {
11618
11473
  return __awaiter(this, void 0, void 0, function* () {
11619
11474
  const baseUrl = "/layers/{layerId}/spatial".replace("{layerId}", RequestBuilder_1.UrlBuilder.toString(params["layerId"]));
@@ -11625,7 +11480,16 @@ function getFeaturesBySpatial(builder, params) {
11625
11480
  urlBuilder.appendQuery("refFeatureId", params["refFeatureId"]);
11626
11481
  urlBuilder.appendQuery("radius", params["radius"]);
11627
11482
  urlBuilder.appendQuery("limit", params["limit"]);
11628
- urlBuilder.appendQuery("params", params["params"]);
11483
+ const searchParams = params.params;
11484
+ if (searchParams instanceof Array) {
11485
+ searchParams.forEach(param => {
11486
+ urlBuilder.appendQuery(param.key, param.value, param.operator);
11487
+ });
11488
+ }
11489
+ else {
11490
+ // will be removed 06.2022
11491
+ urlBuilder.appendQuery("params", params["params"]);
11492
+ }
11629
11493
  urlBuilder.appendQuery("selection", params["selection"]);
11630
11494
  urlBuilder.appendQuery("skipCache", params["skipCache"]);
11631
11495
  urlBuilder.appendQuery("force2D", params["force2D"]);
@@ -11638,73 +11502,22 @@ function getFeaturesBySpatial(builder, params) {
11638
11502
  });
11639
11503
  }
11640
11504
  exports.getFeaturesBySpatial = getFeaturesBySpatial;
11641
- /**
11642
- * List the features which are inside the specified radius. The origin point is calculated based
11643
- * on the geometry provided as payload.
11644
- *
11645
- * @summary Get features which intersects the provided geometry.
11646
- *
11647
- * @param layerId The unique identified for the Layer ID.
11648
- *
11649
- * @param body A geometry request.
11650
- *
11651
- * @param radius Radius in meter which defines the diameter of the search request.
11652
- *
11653
- * @param limit The maximum number of features in the response.
11654
- * Default is 30000. Hard limit is 100000.
11655
- *
11656
- * @param params Additional feature filters which compares the feature's property's value with the one specified
11657
- * in the query, resulting in a subset of features.
11658
- * The usage of multiple property names represents an AND operation.
11659
- * The usage of a comma (,) separating the properties values, represents an OR operation.
11660
- * Properties initiated with 'f.' are used to access values which are added by default in the stored feature.
11661
- * The possible values are: 'f.id', 'f.createdAt' and 'f.updatedAt'.
11662
- * Properties initiated with 'p.' are used to access values in the stored feature which are under the 'properties' property.
11663
- * Use it as a shorthand accessor for 'properties' values.
11664
- * The format should follow the specification below
11665
- * ```
11666
- * ?p.property_name_1=property_value_1&f.special_property_name_1=special_property_value_1
11667
- * ```
11668
- *
11669
- * For example, the above query, the Features will be filtered by 'property' AND 'special property' equals to their
11670
- * respective values.
11671
- *
11672
- * While in the following example ```?p.property_name_1=value_1,value_2```
11673
- * The resulting Features list will contain all elements having `value_1` OR `value_2`.
11674
- *
11675
- * Additionally to the operators used in the examples above, the query can be written, with the same semantic,
11676
- * by using the long operators: `"=gte=", "=lte=", "=gt=", "=lt=" and "=cs="`.
11677
- *
11678
- * The below queries yield the same result:
11679
- * ```
11680
- * ?p.property_name_1>=10
11681
- * ?p.property_name_1=gte=10
11682
- * ```
11683
- *
11684
- * The available operators are:
11685
- * "=" - equals
11686
- * "!=" - not equals
11687
- * ">=" or "=gte=" - greater than or equals
11688
- * "<=" or "=lte=" - less than or equals
11689
- * ">" or "=gt=" - greater than
11690
- * "<" or "=lt=" - less than
11691
- * "@>" or "=cs=" - contains
11692
- *
11693
- * @param selection A list of properties to be returned in the features result list.
11694
- * Multiple attributes can be specified by using comma(,).
11695
- * Example: `?selection=p.name,p.capacity,p.color`.
11696
- *
11697
- * @param skipCache If set to true the response is not returned from cache. Default is false.
11698
- *
11699
- * @param force2D If set to `true` the features in the response will have only X's and Y's as coordinates.
11700
- */
11701
11505
  function getFeaturesBySpatialPost(builder, params) {
11702
11506
  return __awaiter(this, void 0, void 0, function* () {
11703
11507
  const baseUrl = "/layers/{layerId}/spatial".replace("{layerId}", RequestBuilder_1.UrlBuilder.toString(params["layerId"]));
11704
11508
  const urlBuilder = new RequestBuilder_1.UrlBuilder(builder.baseUrl + baseUrl);
11705
11509
  urlBuilder.appendQuery("radius", params["radius"]);
11706
11510
  urlBuilder.appendQuery("limit", params["limit"]);
11707
- urlBuilder.appendQuery("params", params["params"]);
11511
+ const searchParams = params.params;
11512
+ if (searchParams instanceof Array) {
11513
+ searchParams.forEach(param => {
11514
+ urlBuilder.appendQuery(param.key, param.value, param.operator);
11515
+ });
11516
+ }
11517
+ else {
11518
+ // will be removed 06.2022
11519
+ urlBuilder.appendQuery("params", params["params"]);
11520
+ }
11708
11521
  urlBuilder.appendQuery("selection", params["selection"]);
11709
11522
  urlBuilder.appendQuery("skipCache", params["skipCache"]);
11710
11523
  urlBuilder.appendQuery("force2D", params["force2D"]);
@@ -11721,117 +11534,6 @@ function getFeaturesBySpatialPost(builder, params) {
11721
11534
  });
11722
11535
  }
11723
11536
  exports.getFeaturesBySpatialPost = getFeaturesBySpatialPost;
11724
- /**
11725
- * Get features in tile
11726
- *
11727
- * @param layerId The unique identified for the Layer ID.
11728
- *
11729
- * @param tileType The type of tile identifier.
11730
- * Default: "quadkey".
11731
- * Enum: "quadkey" "web" "tms" "here".
11732
- * "quadkey" - Virtual Earth,
11733
- * "web" - Web Mercator,
11734
- * "tms" - OSGEO Tile Map Service,
11735
- * "here" - Here Tile Schema.
11736
- *
11737
- * @param tileId The tile identifier can be provided as quadkey (1),
11738
- * Web Mercator level,x,y coordinates (1_1_0) or OSGEO Tile Map Service level,x,y (1_1_0).
11739
- *
11740
- * @param clip If set to true the features' geometries are clipped to the geometry of the tile or bounding box.
11741
- * Default is false.
11742
- *
11743
- * @param params Additional feature filters which compares the feature's property's value with the one specified
11744
- * in the query, resulting in a subset of features.
11745
- * The usage of multiple property names represents an AND operation.
11746
- * The usage of a comma (,) separating the properties values, represents an OR operation.
11747
- * Properties initiated with 'f.' are used to access values which are added by default in the stored feature.
11748
- * The possible values are: 'f.id', 'f.createdAt' and 'f.updatedAt'.
11749
- * Properties initiated with 'p.' are used to access values in the stored feature which are under the 'properties' property.
11750
- * Use it as a shorthand accessor for 'properties' values.
11751
- * The format should follow the specification below
11752
- * ```
11753
- * ?p.property_name_1=property_value_1&f.special_property_name_1=special_property_value_1
11754
- * ```
11755
- *
11756
- * For example, the above query, the Features will be filtered by 'property' AND 'special property' equals to their
11757
- * respective values.
11758
- *
11759
- * While in the following example ```?p.property_name_1=value_1,value_2```
11760
- * The resulting Features list will contain all elements having `value_1` OR `value_2`.
11761
- *
11762
- * Additionally to the operators used in the examples above, the query can be written, with the same semantic,
11763
- * by using the long operators: `"=gte=", "=lte=", "=gt=", "=lt=" and "=cs="`.
11764
- *
11765
- * The below queries yield the same result:
11766
- * ```
11767
- * ?p.property_name_1>=10
11768
- * ?p.property_name_1=gte=10
11769
- * ```
11770
- *
11771
- * The available operators are:
11772
- * "=" - equals
11773
- * "!=" - not equals
11774
- * ">=" or "=gte=" - greater than or equals
11775
- * "<=" or "=lte=" - less than or equals
11776
- * ">" or "=gt=" - greater than
11777
- * "<" or "=lt=" - less than
11778
- * "@>" or "=cs=" - contains
11779
- *
11780
- * @param selection A list of properties to be returned in the features result list.
11781
- * Multiple attributes can be specified by using comma(,).
11782
- * Example: `?selection=p.name,p.capacity,p.color`.
11783
- *
11784
- * @param skipCache If set to true the response is not returned from cache. Default is false.
11785
- *
11786
- * @param clustering The clustering algorithm to apply to the data within the result.
11787
- * Providing this query parameter the data will be returned in a clustered way.
11788
- * This means the data won't necessarily be returned in its original shape or with its original properties.
11789
- * Depending on the chosen clustering algorithm there could be different mandatory and/or optional parameters
11790
- * to specify the behavior of the algorithm.
11791
- * Possible values are:
11792
- *
11793
- * `hexbin` - The hexbin algorithm divides the world in hexagonal "bins" on a specified resolution.
11794
- * Each hexagon has an address being described by the H3 addressing scheme.
11795
- * For more information on that topic see: https://eng.uber.com/h3/.
11796
- *
11797
- * `quadbin` - The quadbin algorithm takes the geometry input from the request (e.g. quadkey / bbox..)
11798
- * and count the features in it.
11799
- * This clustering mode works also for very large layers and can be used for getting an overview
11800
- * where data is present in a given layer. Furthermore, a property filter on one property is applicable.
11801
- *
11802
- * @param clusteringParams Some parameters for the chosen clustering algorithm.
11803
- * Depending on the chosen clustering algorithm there could be different mandatory and/or optional parameters to specify
11804
- * the behavior of the algorithm.
11805
- *
11806
- * Clustering-Parameter reference.
11807
- * NOTE: The actual query parameters in the URL are looking like: `?clustering.aParameterName=aValue`.
11808
- *
11809
- * Clustering-type: "hexbin":
11810
- * There are several parameters needed by the H3 based hexbin algorithm.
11811
- * For more information on that topic see: https://eng.uber.com/h3/.
11812
- *
11813
- * =======================================================================================================
11814
- * | Parameter | Type | Mandatory | Meaning |
11815
- * ========================================================================================================
11816
- * | absoluteResolution | Number | NO | The H3 hexagon resolution |
11817
- * --------------------------------------------------------------------------------------------------------
11818
- * | resolution | Number | NO | deprecated, renamed to absoluteResolution |
11819
- * --------------------------------------------------------------------------------------------------------
11820
- * | relativeResolution | Number | NO | integer value [0-4] to be added to current used |
11821
- * | | | | resolution |
11822
- * --------------------------------------------------------------------------------------------------------
11823
- * | property | String | NO | A property of the original features for which to |
11824
- * | | | | calculate statistics |
11825
- * --------------------------------------------------------------------------------------------------------
11826
- * | pointmode | Boolean | NO | retuns the centroid of hexagons as geojson feature |
11827
- * --------------------------------------------------------------------------------------------------------
11828
- *
11829
- * @param margin Margin in pixels on the respective projected level around the tile. Default is 0.
11830
- *
11831
- * @param limit The maximum number of features in the response. Default is 30000. Hard limit is 100000.
11832
- *
11833
- * @param force2D If set to `true` the features in the response will have only X's and Y's as coordinates.
11834
- */
11835
11537
  function getFeaturesByTile(builder, params) {
11836
11538
  return __awaiter(this, void 0, void 0, function* () {
11837
11539
  const baseUrl = "/layers/{layerId}/tile/{tileType}/{tileId}"
@@ -11840,11 +11542,24 @@ function getFeaturesByTile(builder, params) {
11840
11542
  .replace("{tileId}", RequestBuilder_1.UrlBuilder.toString(params["tileId"]));
11841
11543
  const urlBuilder = new RequestBuilder_1.UrlBuilder(builder.baseUrl + baseUrl);
11842
11544
  urlBuilder.appendQuery("clip", params["clip"]);
11843
- urlBuilder.appendQuery("params", params["params"]);
11545
+ const searchParams = params.params;
11546
+ if (searchParams instanceof Array) {
11547
+ searchParams.forEach(param => {
11548
+ urlBuilder.appendQuery(param.key, param.value, param.operator);
11549
+ });
11550
+ }
11551
+ else {
11552
+ // will be removed 06.2022
11553
+ urlBuilder.appendQuery("params", params["params"]);
11554
+ }
11844
11555
  urlBuilder.appendQuery("selection", params["selection"]);
11845
11556
  urlBuilder.appendQuery("skipCache", params["skipCache"]);
11846
11557
  urlBuilder.appendQuery("clustering", params["clustering"]);
11847
- urlBuilder.appendQuery("clusteringParams", params["clusteringParams"]);
11558
+ if (params["clusteringParams"]) {
11559
+ for (const clusteringParam in params["clusteringParams"]) {
11560
+ urlBuilder.appendQuery(`clustering.${clusteringParam}`, params["clusteringParams"][clusteringParam]);
11561
+ }
11562
+ }
11848
11563
  urlBuilder.appendQuery("margin", params["margin"]);
11849
11564
  urlBuilder.appendQuery("limit", params["limit"]);
11850
11565
  urlBuilder.appendQuery("force2D", params["force2D"]);
@@ -11896,10 +11611,18 @@ exports.getStatistics = getStatistics;
11896
11611
  *
11897
11612
  * @param pageToken The page token where the iteration will continue.
11898
11613
  *
11614
+ * @param part Requests disjunct parts of iteration results (used with sort).
11615
+ * List of two integers "part,total". part=1,4 read as first part out of 4, ... until part=4,4 .
11616
+ * Example: ?part=7,9
11617
+ *
11899
11618
  * @param selection A list of properties to be returned in the features result list.
11900
11619
  * Multiple attributes can be specified by using comma(,).
11901
11620
  * Example: `?selection=p.name,p.capacity,p.color`.
11902
11621
  *
11622
+ * @param sort Specifies the sort order by a list of properties.
11623
+ * Ascending assumed if no sort direction (:asc, :desc) is specified.
11624
+ * Example: sort = ["p.name:asc", "p.color:desc"] => ?sort=p.name:asc,p.color:desc.
11625
+ *
11903
11626
  * @param skipCache If set to true the response is not returned from cache. Default is false.
11904
11627
  *
11905
11628
  * @param force2D If set to true the features in the response will have only X's and Y's as coordinates.
@@ -11910,7 +11633,9 @@ function iterateFeatures(builder, params) {
11910
11633
  const urlBuilder = new RequestBuilder_1.UrlBuilder(builder.baseUrl + baseUrl);
11911
11634
  urlBuilder.appendQuery("limit", params["limit"]);
11912
11635
  urlBuilder.appendQuery("pageToken", params["pageToken"]);
11636
+ urlBuilder.appendQuery("part", params["part"]);
11913
11637
  urlBuilder.appendQuery("selection", params["selection"]);
11638
+ urlBuilder.appendQuery("sort", params["sort"]);
11914
11639
  urlBuilder.appendQuery("skipCache", params["skipCache"]);
11915
11640
  urlBuilder.appendQuery("force2D", params["force2D"]);
11916
11641
  const headers = {};
@@ -11922,70 +11647,24 @@ function iterateFeatures(builder, params) {
11922
11647
  });
11923
11648
  }
11924
11649
  exports.iterateFeatures = iterateFeatures;
11925
- /**
11926
- * Searches for features in the layer. The results are unordered and the request does not allow to continue
11927
- * the search, which is the main difference when compared to the iterate request.
11928
- *
11929
- * @summary Search for features.
11930
- *
11931
- * @param layerId The unique identified for the Layer ID.
11932
- *
11933
- * @param limit The maximum number of features in the response. Default is 30000. Hard limit is 100000.
11934
- *
11935
- * @param params Additional feature filters which compares the feature's property's value with the one specified
11936
- * in the query, resulting in a subset of features.
11937
- * The usage of multiple property names represents an AND operation.
11938
- * The usage of a comma (,) separating the properties values, represents an OR operation.
11939
- * Properties initiated with 'f.' are used to access values which are added by default in the stored feature.
11940
- * The possible values are: 'f.id', 'f.createdAt' and 'f.updatedAt'.
11941
- * Properties initiated with 'p.' are used to access values in the stored feature which are under the 'properties' property.
11942
- * Use it as a shorthand accessor for 'properties' values.
11943
- * The format should follow the specification below
11944
- * ```
11945
- * ?p.property_name_1=property_value_1&f.special_property_name_1=special_property_value_1
11946
- * ```
11947
- *
11948
- * For example, the above query, the Features will be filtered by 'property' AND 'special property' equals to their
11949
- * respective values.
11950
- *
11951
- * While in the following example ```?p.property_name_1=value_1,value_2```
11952
- * The resulting Features list will contain all elements having `value_1` OR `value_2`.
11953
- *
11954
- * Additionally to the operators used in the examples above, the query can be written, with the same semantic,
11955
- * by using the long operators: `"=gte=", "=lte=", "=gt=", "=lt=" and "=cs="`.
11956
- *
11957
- * The below queries yield the same result:
11958
- * ```
11959
- * ?p.property_name_1>=10
11960
- * ?p.property_name_1=gte=10
11961
- * ```
11962
- *
11963
- * The available operators are:
11964
- * "=" - equals
11965
- * "!=" - not equals
11966
- * ">=" or "=gte=" - greater than or equals
11967
- * "<=" or "=lte=" - less than or equals
11968
- * ">" or "=gt=" - greater than
11969
- * "<" or "=lt=" - less than
11970
- * "@>" or "=cs=" - contains
11971
- *
11972
- * @param selection A list of properties to be returned in the features result list.
11973
- * Multiple attributes can be specified by using comma(,).
11974
- * Example: `?selection=p.name,p.capacity,p.color`.
11975
- *
11976
- * @param skipCache If set to true the response is not returned from cache. Default is false.
11977
- *
11978
- * @param force2D If set to true the features in the response will have only X's and Y's as coordinates.
11979
- */
11980
11650
  function searchFeatures(builder, params) {
11981
11651
  return __awaiter(this, void 0, void 0, function* () {
11982
11652
  const baseUrl = "/layers/{layerId}/search".replace("{layerId}", RequestBuilder_1.UrlBuilder.toString(params["layerId"]));
11983
11653
  const urlBuilder = new RequestBuilder_1.UrlBuilder(builder.baseUrl + baseUrl);
11984
11654
  urlBuilder.appendQuery("limit", params["limit"]);
11985
- urlBuilder.appendQuery("params", params["params"]);
11655
+ const searchParams = params.params;
11656
+ if (searchParams instanceof Array) {
11657
+ searchParams.forEach(param => {
11658
+ urlBuilder.appendQuery(param.key, param.value, param.operator);
11659
+ });
11660
+ }
11661
+ else {
11662
+ // will be removed 06.2022
11663
+ urlBuilder.appendQuery("params", params["params"]);
11664
+ }
11986
11665
  urlBuilder.appendQuery("selection", params["selection"]);
11987
- urlBuilder.appendQuery("skipCache", "true");
11988
- urlBuilder.appendQuery("force2D", "true");
11666
+ urlBuilder.appendQuery("skipCache", params["skipCache"]);
11667
+ urlBuilder.appendQuery("force2D", params["force2D"]);
11989
11668
  const headers = {};
11990
11669
  const options = {
11991
11670
  method: "GET",
@@ -13430,4 +13109,4 @@ exports.putVolatileBlob = putVolatileBlob;
13430
13109
 
13431
13110
  /******/ });
13432
13111
  });
13433
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vLi9pbmRleC53ZWIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NhY2hlL01ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5LmpzIiwid2VicGFjazovLy8uL2xpYi9jYWNoZS9RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5LmpzIiwid2VicGFjazovLy8uL2xpYi9jYWNoZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L0FydGlmYWN0Q2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvQ2F0YWxvZ0NsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L0NhdGFsb2dSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvQ2F0YWxvZ3NSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvQ29uZmlnQ2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvRGF0YVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9JbmRleExheWVyQ2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvSW5kZXhRdWVyeVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9MYXllclZlcnNpb25zUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L1BhcnRpdGlvbnNSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvUG9sbFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9RdWFkS2V5UGFydGl0aW9uc1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9RdWFkVHJlZUluZGV4UmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L1F1ZXJ5Q2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvU2NoZW1hRGV0YWlsc1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9TY2hlbWFSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvU2Vla1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9TdGF0aXN0aWNzQ2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvU3RhdGlzdGljc1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9TdHJlYW1MYXllckNsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L1N1YnNjcmliZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9TdW1tYXJ5UmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L1RpbGVSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvVW5zdWJzY3JpYmVSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvVmVyc2lvbmVkTGF5ZXJDbGllbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9Wb2xhdGlsZUxheWVyQ2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlscy9nZXRUaWxlLmpzIiwid2VicGFjazovLy8uL2xpYi91dGlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbHMvdmFsaWRhdGVCaWxsaW5nVGFnLmpzIiwid2VicGFjazovLy8uL2xpYi91dGlscy92YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvaW5kZXgud2ViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliLnZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvY2FjaGUvQXBpQ2FjaGVSZXBvc2l0b3J5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL2NhY2hlL0tleVZhbHVlQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvY2FjaGUvTFJVQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvY2FjaGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvY2xpZW50L09scENsaWVudFNldHRpbmdzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL2NsaWVudC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi91dGlscy9EYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvdXRpbHMvRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvdXRpbHMvRG93bmxvYWRNYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL0ZldGNoT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi91dGlscy9IUk4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvdXRpbHMvSHR0cEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL1JlcXVlc3RCdWlsZGVyRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi91dGlscy9UaWxlS2V5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL1V1aWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvdXRpbHMvZ2V0RGF0YVNpemVVdGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL2dldEVudkxvb2t1cFVybC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi91dGlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi91dGlscy91c2VyQWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvUmVxdWVzdEJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9hcnRpZmFjdC1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9hdXRob3JpemF0aW9uLWFwaS12MS4xLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvYmxvYi1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9ibG9iLnYyLmFwaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL2NvbmZpZy1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9jb3ZlcmFnZS1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9pbmRleC1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9pbnRlcmFjdGl2ZS1hcGktdjEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9sb29rdXAtYXBpLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvbWV0YWRhdGEtYXBpLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvcHVibGlzaC1hcGktdjIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9xdWVyeS1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9zdHJlYW0tYXBpLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvdm9sYXRpbGUtYmxvYi1hcGkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNsRmE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLG9DQUFvQyxhQUFhLEVBQUUsRUFBRTtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RCxhQUFhLG1CQUFPLENBQUMsNkJBQU87Ozs7Ozs7Ozs7Ozs7QUM5QmY7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsV0FBVyxJQUFJLGVBQWU7QUFDakQsaUNBQWlDLGVBQWU7QUFDaEQ7QUFDQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDaElhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsaUVBQWlFLHlDQUF5QyxFQUFFO0FBQ3pIO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsME1BQTBNLFNBQVMsY0FBYyxZQUFZLEtBQUssSUFBSTtBQUN0UCxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDN01hO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzlHYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDOURhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxtQ0FBbUMsbUJBQU8sQ0FBQyxzREFBZ0M7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDL0RhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSx1QkFBdUIsbUJBQU8sQ0FBQywwRUFBb0I7QUFDbkQsbUNBQW1DLG1CQUFPLENBQUMsc0RBQWdDO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMzSGE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzlEYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0EsbUNBQW1DLG1CQUFPLENBQUMsc0RBQWdDO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUM3R2E7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLG1DQUFtQyxtQkFBTyxDQUFDLHNEQUFnQztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkhBQTZILDRCQUE0QjtBQUN6SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDelBhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDcEdhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxtQ0FBbUMsbUJBQU8sQ0FBQyxzREFBZ0M7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDakVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSx1QkFBdUIsbUJBQU8sQ0FBQywwRUFBb0I7QUFDbkQsbUNBQW1DLG1CQUFPLENBQUMsc0RBQWdDO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3JIYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDOURhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsK0RBQStELGdCQUFnQixFQUFFLEVBQUU7QUFDOUc7QUFDQSxtQ0FBbUMsTUFBTSw2QkFBNkIsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNqRyxrQ0FBa0MsTUFBTSxpQ0FBaUMsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNwRywrQkFBK0IscUZBQXFGO0FBQ3BIO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSx1QkFBdUIsbUJBQU8sQ0FBQywwRUFBb0I7QUFDbkQsa0NBQWtDLG1CQUFPLENBQUMsNEZBQStCO0FBQ3pFLG1DQUFtQyxtQkFBTyxDQUFDLHNEQUFnQztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4SUFBOEksWUFBWSxTQUFTLFNBQVM7QUFDNUssU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxVQUFVLDRCQUE0QixpQkFBaUI7QUFDN0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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S0FBSztBQUNMO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSx1QkFBdUIsbUJBQU8sQ0FBQywwRUFBb0I7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDekxhO0FBQ2I7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsb0JBQW9CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdCQUFnQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsT0FBTztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNqZGE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDakRhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQy9EYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFlBQVksV0FBVyxTQUFTLFVBQVUsU0FBUztBQUMvRix1QkFBdUIsWUFBWTtBQUNuQyx1QkFBdUIsU0FBUztBQUNoQyx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFlBQVksV0FBVyxTQUFTLFVBQVUsU0FBUztBQUMvRix1QkFBdUIsWUFBWTtBQUNuQyx1QkFBdUIsU0FBUztBQUNoQyx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxZQUFZLFdBQVcsU0FBUztBQUM1RSx1QkFBdUIsWUFBWTtBQUNuQyx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsWUFBWSxxQkFBcUIsWUFBWTtBQUN6RjtBQUNBO0FBQ0E7QUFD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QUssd0JBQXdCLEtBQUs7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsVUFBVSxPQUFPO0FBQzNELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxZQUFZLFFBQVE7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsWUFBWSxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsVUFBVSxPQUFPO0FBQzNELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLG9CQUFvQixRQUFRO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxrQkFBa0IsUUFBUTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLHVCQUF1QixRQUFRO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsVUFBVSxPQUFPO0FBQzNELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsWUFBWSxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUSxVQUFVLE9BQU87QUFDN0QsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUSxZQUFZLFNBQVM7QUFDakUsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUSxZQUFZLFFBQVE7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FB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QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELHdCQUF3QjtBQUMzRSw4Q0FBOEMsbUJBQW1CO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxTQUFTLHFCQUFxQixTQUFTO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsU0FBUyxXQUFXLGVBQWU7QUFDeEUsdUJBQXVCLFNBQVM7QUFDaEMsdUJBQXVCLGVBQWU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsU0FBUyxXQUFXLGVBQWU7QUFDeEUsdUJBQXVCLFNBQVM7QUFDaEMsdUJBQXVCLGVBQWU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUSxVQUFVLE9BQU8sV0FBVyxPQUFPO0FBQy9FLHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFFBQVEscUJBQXFCLFFBQVE7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFFBQVEsV0FBVyxPQUFPO0FBQzlELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxRQUFRLFVBQVUsT0FBTyxXQUFXLE9BQU87QUFDL0UsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLE9BQU87QUFDOUIsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFFBQVEsV0FBVyxPQUFPO0FBQzlELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxxQkFBcUIsUUFBUTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxpQkFBaUIsUUFBUTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsb0JBQW9CLFFBQVE7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsb0JBQW9CLFFBQVE7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLE9BQU8sU0FBUyxFQUFFLE9BQU87QUFDbkUsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEMsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLHVCQUF1QixRQUFRO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsb0JBQW9CLFFBQVE7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxtQkFBbUIsUUFBUTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxXQUFXLFVBQVU7QUFDL0QsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLFVBQVU7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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a0NBQWtDLFFBQVEsT0FBTyxXQUFXO0FBQzVELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnSEFBZ0g7QUFDaEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsT0FBTyxXQUFXO0FBQzVELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsT0FBTyxXQUFXO0FBQzVELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBIiwiZmlsZSI6ImJ1bmRsZS51bWQuZGV2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIHtcblx0XHR2YXIgYSA9IGZhY3RvcnkoKTtcblx0XHRmb3IodmFyIGkgaW4gYSkgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyA/IGV4cG9ydHMgOiByb290KVtpXSA9IGFbaV07XG5cdH1cbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vaW5kZXgud2ViLmpzXCIpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbGliXCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkgPSB2b2lkIDA7XG4vKipcbiAqIENhY2hlcyB0aGUgcGFydGl0aW9ucyBtZXRhZGF0YSB1c2luZyBhIGtleS12YWx1ZSBwYWlyLlxuICovXG5jbGFzcyBNZXRhZGF0YUNhY2hlUmVwb3NpdG9yeSB7XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBbW01ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FjaGUgVGhlIFtbS2V5VmFsdWVDYWNoZV1dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gVGhlIFtbTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnldXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYWNoZSkge1xuICAgICAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3JlcyBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdXQocnEsIGhybiwgbGF5ZXJJZCwgcGFydGl0aW9ucywgdmVyc2lvbikge1xuICAgICAgICBjb25zdCBwYXJ0aXRpb25zSWRzID0gcnEuZ2V0UGFydGl0aW9uSWRzKCk7XG4gICAgICAgIGxldCBrZXk7XG4gICAgICAgIGlmIChwYXJ0aXRpb25zSWRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1ldGFkYXRhIG9mIHBhcnRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLmNyZWF0ZUtleSh7XG4gICAgICAgICAgICAgICAgICAgIGhybixcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uSWQ6IG1ldGFkYXRhLnBhcnRpdGlvblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUucHV0KGtleSwgSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGtleSA9IHRoaXMuY3JlYXRlS2V5KHtcbiAgICAgICAgICAgIGhybixcbiAgICAgICAgICAgIGxheWVySWQsXG4gICAgICAgICAgICB2ZXJzaW9uXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5wdXQoa2V5LCBKU09OLnN0cmluZ2lmeShwYXJ0aXRpb25zKSk7XG4gICAgfVxuICAgIGdldChycSwgaHJuLCBsYXllcklkLCB2ZXJzaW9uKSB7XG4gICAgICAgIGNvbnN0IHBhcnRpdGlvbnNJZHMgPSBycS5nZXRQYXJ0aXRpb25JZHMoKTtcbiAgICAgICAgbGV0IGtleTtcbiAgICAgICAgaWYgKHBhcnRpdGlvbnNJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVBhcnRpdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFydGl0aW9uSWQgb2YgcGFydGl0aW9uc0lkcykge1xuICAgICAgICAgICAgICAgIGtleSA9IHRoaXMuY3JlYXRlS2V5KHtcbiAgICAgICAgICAgICAgICAgICAgaHJuLFxuICAgICAgICAgICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25JZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRQYXJ0aXRpb24gPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkUGFydGl0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVBhcnRpdGlvbnMucHVzaChKU09OLnBhcnNlKHNlcmlhbGl6ZWRQYXJ0aXRpb24pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFydGl0aW9uc0lkcy5sZW5ndGggIT09IGF2YWlsYWJsZVBhcnRpdGlvbnMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0FkZGl0aW9uYWxGaWVsZHNBdmFpbGFibGUoYXZhaWxhYmxlUGFydGl0aW9ucywgcnEuZ2V0QWRkaXRpb25hbEZpZWxkcygpKSkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEluIHRoZSBjYXNlIHdoZW4gbm90IGFsbCBwYXJ0aXRpb25zIGFyZSBhdmFpbGFibGUsIG9yIHNvbWUgb2YgcGFydGl0aW9uIGhhcyBub3QgcmVxdWVzdGVkIGEgc29tZSBvZiBhZGRpdGlvbmFsIGZpZWxkLFxuICAgICAgICAgICAgICAgICAqIHdlIGZhaWwgdGhlIGNhY2hlIGxvb2t1cC5cbiAgICAgICAgICAgICAgICAgKiBUaGlzIGNhbiBiZSBlbmhhbmNlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlUGFydGl0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBrZXkgPSB0aGlzLmNyZWF0ZUtleSh7XG4gICAgICAgICAgICBocm4sXG4gICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgdmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFBhcnRpdGlvbnMgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZFBhcnRpdGlvbnNcbiAgICAgICAgICAgID8gSlNPTi5wYXJzZShzZXJpYWxpemVkUGFydGl0aW9ucylcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjcmVhdGVLZXkocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiAoYCR7cGFyYW1zLmhybn06OiR7cGFyYW1zLmxheWVySWR9OjpgICtcbiAgICAgICAgICAgIChwYXJhbXMudmVyc2lvbiA/IGAke3BhcmFtcy52ZXJzaW9ufTo6YCA6IFwiXCIpICtcbiAgICAgICAgICAgIChwYXJhbXMucGFydGl0aW9uSWRcbiAgICAgICAgICAgICAgICA/IGAke3BhcmFtcy5wYXJ0aXRpb25JZH06OnBhcnRpdGlvbmBcbiAgICAgICAgICAgICAgICA6IFwicGFydGl0aW9uc1wiKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBhbGwgY2FjaGVkIHBhcnRpdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYWNoZWRQYXJ0aXRpb25zIFRoZSBhcnJheSBvZiB0aGUgY2FjaGVkIHBhcnRpdGlvbnNcbiAgICAgKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyB0aGUgYXJyYXkgb2YgdGhlIHJlcXVlc3RlZCBhZGRpdGlvbmFsIGZpZWxkcy5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHNvbWUgb2YgdGhlIGNhY2hlZCBwYXJ0aXRpb24gZG9lcyBub3QgaGF2ZSBzb21lIGFkZGl0aW9uYWwgZmllbGQuXG4gICAgICogRmFsc2Ugb3RoZXJ3aXNlIG9yIGlmIGFueSBhZGRpdGlvbmFsRmllbGRzIGhhcyBub3QgYmVlbiByZXF1ZXN0ZWQuXG4gICAgICovXG4gICAgY2hlY2tBZGRpdGlvbmFsRmllbGRzQXZhaWxhYmxlKGNhY2hlZFBhcnRpdGlvbnMsIGFkZGl0aW9uYWxGaWVsZHMpIHtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxGaWVsZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2FjaGVkUGFydGl0aW9uIG9mIGNhY2hlZFBhcnRpdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYWRkaXRpb25hbEZpZWxkIG9mIGFkZGl0aW9uYWxGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhY2hlZFBhcnRpdGlvbi5oYXNPd25Qcm9wZXJ0eShhZGRpdGlvbmFsRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0cy5NZXRhZGF0YUNhY2hlUmVwb3NpdG9yeSA9IE1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5ID0gdm9pZCAwO1xuLyoqXG4gKiBDYWNoZXMgdGhlIFF1YWRUcmVlSW5kZXggdXNpbmcgYSBrZXktdmFsdWUgcGFpci5cbiAqL1xuY2xhc3MgUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeSB7XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBbW1F1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnldXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYWNoZSBUaGUgW1tLZXlWYWx1ZUNhY2hlXV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tRdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2FjaGUpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHV0KHBhcmFtcykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5wdXQodGhpcy5jcmVhdGVLZXkocGFyYW1zKSwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLnRyZWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIFF1YWRUcmVlSW5kZXggZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zIFtbUXVhZFRyZWVJbmRleENhY2hlUGFyYW1zXV0gb2JqZWN0LlxuICAgICAqIEByZXR1cm4gVGhlIFF1YWRUcmVlSW5kZXggZm9yIHRoZSBUaWxlLCBvciB1bmRlZmluZWQgaWYgdGhlIFF1YWRUcmVlSW5kZXggZG9lcyBub3QgZXhpc3QuXG4gICAgICovXG4gICAgZ2V0KHBhcmFtcykge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZUtleShwYXJhbXMpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkVHJlZSA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkVHJlZSA/IEpTT04ucGFyc2Uoc2VyaWFsaXplZFRyZWUpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjcmVhdGVLZXkocGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBwYXJhbXMudmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gYDo6JHtwYXJhbXMudmVyc2lvbn1gIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIGAke3BhcmFtcy5ocm59Ojoke3BhcmFtcy5sYXllcklkfTo6JHtwYXJhbXMucm9vdC50b0hlcmVUaWxlKCl9JHt2ZXJzaW9ufTo6JHtwYXJhbXMuZGVwdGh9OjpxdWFkdHJlZWA7XG4gICAgfVxufVxuZXhwb3J0cy5RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5ID0gUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnlcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1F1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnlcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQXJ0aWZhY3RDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuLyoqXG4gKiBHZXRzIHNjaGVtYSBtZXRhZGF0YSBhbmQgZGF0YSBmcm9tIHRoZSBwbGF0Zm9ybSBBcnRpZmFjdCBTZXJ2aWNlLlxuICovXG5jbGFzcyBBcnRpZmFjdENsaWVudCB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBjbGllbnQgdG8gd29yayB3aXRoIHNjaGVtYXMgZGF0YSBpbiB0aGUgcGxhdGZvcm0gQXJ0aWZhY3QgU2VydmljZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gVGhlIFtbQXJ0aWZhY3RDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBzY2hlbWEgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2NoZW1hRGV0YWlsc1JlcXVlc3QgVGhlIFtbU2NoZW1hRGV0YWlsc1JlcXVlc3RdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIEFuIG9iamVjdCB3aXRoIHRoZSBzY2hlbWEgbWV0YWRhdGEuXG4gICAgICovXG4gICAgZ2V0U2NoZW1hRGV0YWlscyhzY2hlbWFEZXRhaWxzUmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaHJuID0gc2NoZW1hRGV0YWlsc1JlcXVlc3QuZ2V0U2NoZW1hKCk7XG4gICAgICAgICAgICBpZiAoIWhybikge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFBsZWFzZSBwcm92aWRlIHRoZSBzY2hlbWEgSFJOIGJ5IHNjaGVtYURldGFpbHNSZXF1ZXN0LndpdGhTY2hlbWEoKWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhyblN0ciA9IGhybi50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHlpZWxkIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShcImFydGlmYWN0XCIsIHRoaXMuYXBpVmVyc2lvbiwgdGhpcy5zZXR0aW5ncykuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkFydGlmYWN0QXBpLmdldFNjaGVtYVVzaW5nR0VUKHJlcXVlc3QsIHtcbiAgICAgICAgICAgICAgICBzY2hlbWFIcm46IGhyblN0clxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IFByb21pc2UucmVqZWN0KGVycikpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBzY2hlbWEgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWFSZXF1ZXN0IFRoZSBbW1NjaGVtYVJlcXVlc3RdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIEEgYmxvYiB3aXRoIHRoZSBzY2hlbWEuXG4gICAgICovXG4gICAgZ2V0U2NoZW1hKHNjaGVtYVJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBzY2hlbWFSZXF1ZXN0LmdldFZhcmlhbnQoKTtcbiAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFBsZWFzZSBwcm92aWRlIHRoZSBzY2hlbWEgdmFyaWFudCBieSBzY2hlbWFSZXF1ZXN0LndpdGhWYXJpYW50KClgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0geWllbGQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwiYXJ0aWZhY3RcIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkFydGlmYWN0QXBpLmdldEFydGlmYWN0VXNpbmdHRVQocmVxdWVzdCwge1xuICAgICAgICAgICAgICAgIGFydGlmYWN0SHJuOiB2YXJpYW50LnVybFxuICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIDQwMDogXCJCYWQgcmVxdWVzdFwiLFxuICAgICAgICAgICAgICAgICAgICA0MDE6IFwiWW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB2aWV3IHRoZSBzY2hlbWFcIixcbiAgICAgICAgICAgICAgICAgICAgNDAzOiBcIkFjY2Vzc2luZyB0aGUgc2NoZW1hIGlzIGZvcmJpZGRlblwiLFxuICAgICAgICAgICAgICAgICAgICA0MDQ6IFwiVGhlIHNjaGVtYSB3YXMgbm90IGZvdW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIDUwMDogXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIlxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yLnN0YXR1c1RleHQgfHwgbWVzc2FnZXNbZXJyb3Iuc3RhdHVzXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBBcnRpZmFjdCBTZXJ2aWNlIGVycm9yOiBIVFRQICR7ZXJyb3Iuc3RhdHVzfTogJHttZXNzYWdlfWApKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkFydGlmYWN0Q2xpZW50ID0gQXJ0aWZhY3RDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYXRhbG9nQ2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogSW50ZXJhY3RzIHdpdGggdGhlIGBEYXRhU3RvcmVgIGNhdGFsb2cuXG4gKi9cbmNsYXNzIENhdGFsb2dDbGllbnQge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhlIFtbQ2F0YWxvZ0NsaWVudF1dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZy5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW0NhdGFsb2dDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYXRhbG9nSHJuLCBzZXR0aW5ncykge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICAgICAgdGhpcy5ocm4gPSBjYXRhbG9nSHJuLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWRzIGFuZCBjYWNoZXMgdGhlIGZ1bGwgY2F0YWxvZyBjb25maWd1cmF0aW9uIGZvciB0aGUgcmVxdWVzdGVkIGNhdGFsb2cuXG4gICAgICogVGhlIGNhdGFsb2cgY29uZmlndXJhdGlvbiBjb250YWlucyBkZXNjcmlwdGl2ZSBhbmQgc3RydWN0dXJhbFxuICAgICAqIGluZm9ybWF0aW9uIHN1Y2ggYXMgbGF5ZXIgZGVmaW5pdGlvbnMgYW5kIGxheWVyIHR5cGVzLlxuICAgICAqXG4gICAgICogQHN1bW1hcnkgR2V0cyBkZXRhaWxzIGFib3V0IHRoZSByZXF1ZXN0ZWQgY2F0YWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBbW0NhdGFsb2dSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJlZCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY2F0YWxvZyBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBnZXRDYXRhbG9nKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyID0geWllbGQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihcImNvbmZpZ1wiLCB1bmRlZmluZWQsIGFib3J0U2lnbmFsKTtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkNvbmZpZ0FwaS5nZXRDYXRhbG9nKGJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBjYXRhbG9nSHJuOiB0aGlzLmhybixcbiAgICAgICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IFByb21pc2UucmVqZWN0KGVycikpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBtaW5pbXVtIHZlcnNpb24gZm9yIHRoZSBnaXZlbiBjYXRhbG9nLiBJZiB0aGUgY2F0YWxvZyBkb2Vzbid0IGNvbnRhaW4gYW55IHZlcnNpb25zIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHBhcmFtIHJlcXVlc3QgSXMgW1tDYXRhbG9nVmVyc2lvblJlcXVlc3RdXSBpbnN0YW5jZSBhbmQgaGFzICgoZ2V0QmlsbGluZ1RhZykpIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyBhIEZldGNoKVxuICAgICAqIGFuZCBhYm9ydCBpdCBpZiByZXF1aXJlZCB2aWEgYW4gQWJvcnRDb250cm9sbGVyIG9iamVjdC5cbiAgICAgKiAgQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRTaWduYWxcbiAgICAgKiAgQHJldHVybnMgQSBwcm9taXNlIG9mIHRoZSBodHRwIHJlc3BvbnNlIHRoYXQgY29udGFpbnMgdGhlIHBtaW5pbXVtIHZlcnNpb24gZm9yIHRoZSBnaXZlbiBjYXRhbG9nLlxuICAgICAqL1xuICAgIGdldEVhcmxpZXN0VmVyc2lvbihyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IHlpZWxkIHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgY29uc3QgZWFybGllc3RWZXJzaW9uID0geWllbGQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5NZXRhZGF0YUFwaS5taW5pbXVtVmVyc2lvbihidWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZWFybGllc3RWZXJzaW9uLnZlcnNpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBsYXllciB2ZXJzaW9ucyBmb3IgdGhlIGNhdGFsb2cgdmVyc2lvbi4gSXQgd2lsbCByZXR1cm4gYXJyYXkgd2l0aFxuICAgICAqIGFsbCBjYXRhbG9nIGxheWVycyBhbmQgbGF0ZXN0IHZlcnNpb24gZm9yIGVhY2ggbGF5ZXIgb3IgcmV0dXJuIGVycm9yIGlmIHRoZSBjYXRhbG9nIGRvZXMgbm90XG4gICAgICogaGF2ZSBhbnkgdmVyc2lvbnMgb3IgaWYgdGhlIHZlcnNpb24gcGFzc2VkIGluIHRoZSBxdWVyeSBwYXJhbWV0ZXIgZG9lcyBub3QgZXhpc3QuIElmIGEgbGF5ZXJcbiAgICAgKiBkb2VzIG5vdCBoYXZlIGFueSBkYXRhIGZvciB0aGUgcmVxdWVzdGVkIHZlcnNpb24gaXQgaXMgZXhjbHVkZWQgZnJvbSB0aGUgcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBJcyBbW0xheWVyVmVyc2lvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgYW5kIGhhcyAoKGdldFZlcnNpb24pKSBtZXRob2QuXG4gICAgICogVmVyc2lvbiAtIGNhdGFsb2cgdmVyc2lvbiB0byBnZXQgYWxsIHJlbGF0ZWQgbGF5ZXJzIHZlcnNpb25zLiBJZiBub3QgZGVmaW5lZCwgdGhlbiB0aGUgdmVyc2lvbiB3aWxsIGJlIHRoZSBsYXRlc3QgY2F0YWxvZyB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIGEgRmV0Y2gpXG4gICAgICogYW5kIGFib3J0IGl0IGlmIHJlcXVpcmVkIHZpYSBhbiBBYm9ydENvbnRyb2xsZXIgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvZiB0aGUgaHR0cCByZXNwb25zZSB0aGF0IGNvbnRhaW5zIGFuIGFycmF5IHdpdGggYWxsIGNhdGFsb2cgbGF5ZXJzIGFuZCBsYXRlc3QgdmVyc2lvbiBmb3IgZWFjaCBsYXllci5cbiAgICAgKi9cbiAgICBnZXRMYXllclZlcnNpb25zKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyID0geWllbGQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihcIm1ldGFkYXRhXCIsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgYWJvcnRTaWduYWwpLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICBsZXQgcmVxdWVzdGVkQ2F0YWxvZ1ZlcnNpb24gPSByZXF1ZXN0LmdldFZlcnNpb24oKTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRDYXRhbG9nVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmlsbGluZ3RhZyA9IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhdGFsb2dWZXJzaW9uUmVxdWVzdCA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5DYXRhbG9nVmVyc2lvblJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmlsbGluZ3RhZykge1xuICAgICAgICAgICAgICAgICAgICBjYXRhbG9nVmVyc2lvblJlcXVlc3Qud2l0aEJpbGxpbmdUYWcoYmlsbGluZ3RhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhdGFsb2dWZXJzaW9uID0geWllbGQgdGhpcy5nZXRMYXRlc3RWZXJzaW9uKGNhdGFsb2dWZXJzaW9uUmVxdWVzdCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRDYXRhbG9nVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlBsZWFzZSBzZXQgdmVyc2lvbiB3aXRoIExheWVyVmVyc2lvbnNSZXF1ZXN0LndpdGhWZXJzaW9uKCkgbWV0aG9kLlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsYXllclZlcnNpb25zID0geWllbGQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5NZXRhZGF0YUFwaS5nZXRMYXllclZlcnNpb25zKGJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiByZXF1ZXN0ZWRDYXRhbG9nVmVyc2lvbixcbiAgICAgICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTsgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXllclZlcnNpb25zLmxheWVyVmVyc2lvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYSBjYXRhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFtbQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XV0gaW5zdGFuY2Ugd2l0aCB0aGUgYGdldFN0YXJ0VmVyc2lvbmAgbWV0aG9kIHVzZWQgdG8gZ2V0XG4gICAgICogdGhlIGNhdGFsb2cgc3RhcnQgdmVyc2lvbiAoZXhjbHVzaXZlKS5cbiAgICAgKlxuICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC0xLiBCeSBjb252ZW50aW9uIC0xXG4gICAgICogaW5kaWNhdGVzIHRoZSB2aXJ0dWFsIGluaXRpYWwgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uIHRoYXQgaGFzIHZlcnNpb24gMC5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb2YgdGhlIEhUVFAgcmVzcG9uc2UgdGhhdCBjb250YWlucyB0aGUgcGF5bG9hZCB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBnZXRMYXRlc3RWZXJzaW9uKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRWZXJzaW9uID0gcmVxdWVzdC5nZXRTdGFydFZlcnNpb24oKTtcbiAgICAgICAgICAgIGlmIChzdGFydFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0VmVyc2lvbiA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IHlpZWxkIHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHlpZWxkIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubGF0ZXN0VmVyc2lvbihidWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgc3RhcnRWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGJpbGxpbmdUYWc6IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpXG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4gUHJvbWlzZS5yZWplY3QoZXJyKSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxhdGVzdFZlcnNpb24udmVyc2lvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGNhdGFsb2cgdmVyc2lvbnMuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB2ZXJzaW9ucyB0byBiZVxuICAgICAqIHJldHVybmVkIHBlciBjYWxsIGlzIDEwMDAgdmVyc2lvbnMuIElmIHRoZSByYW5nZSBpcyBiaWdnZXIgdGhhbiAxMDAwIHZlcnNpb25zLCB5b3UgZ2V0IHRoZSA0MDAgQmFkIFJlcXVlc3QgZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tDYXRhbG9nVmVyc2lvblJlcXVlc3RdXSBpbnN0YW5jZSB3aXRoIHRoZSBgZ2V0U3RhcnRWZXJzaW9uYCBhbmQgYGdldEVuZFZlcnNpb25gIG1ldGhvZHMuXG4gICAgICogKiBgU3RhcnRWZXJzaW9uYCAtIGEgY2F0YWxvZyBzdGFydCB2ZXJzaW9uIChleGNsdXNpdmUpLiBEZWZhdWx0IGlzIC0xLiBCeSBjb252ZW50aW9uIC0xXG4gICAgICogaW5kaWNhdGVzIHRoZSB2aXJ0dWFsIGluaXRpYWwgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uIHRoYXQgaGFzIHZlcnNpb24gMC5cbiAgICAgKiAqIGBFbmRWZXJzaW9uYCAtIGEgY2F0YWxvZyBlbmQgdmVyc2lvbiAoaW5jbHVzaXZlKS4gSWYgbm90IGRlZmluZWQsIHRoZW4gdGhlIGxhdGVzdCBjYXRhbG9nXG4gICAgICogdmVyc2lvbiBpcyBmZXRoY2VkIGFuZCB1c2VkLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvZiB0aGUgSFRUUCByZXNwb25zZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXlsb2FkIHdpdGggdmVyc2lvbnMgaW4gdGhlIHJlcXVlc3RlZFxuICAgICAqIHJhbmdlLlxuICAgICAqL1xuICAgIGdldFZlcnNpb25zKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRWZXJzaW9uID0gcmVxdWVzdC5nZXRTdGFydFZlcnNpb24oKTtcbiAgICAgICAgICAgIGlmIChzdGFydFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0VmVyc2lvbiA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVuZFZlcnNpb24gPSByZXF1ZXN0LmdldEVuZFZlcnNpb24oKTtcbiAgICAgICAgICAgIGlmIChlbmRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbmRWZXJzaW9uID0geWllbGQgdGhpcy5nZXRMYXRlc3RWZXJzaW9uKHJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IHlpZWxkIHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubGlzdFZlcnNpb25zKGJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBzdGFydFZlcnNpb24sXG4gICAgICAgICAgICAgICAgZW5kVmVyc2lvbixcbiAgICAgICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIGBiYXNlVXJsYCBhbmQgY3JlYXRlcyBgcmVxdWVzdEJ1aWxkZXJgIGZvciBzZW5kaW5nIHJlcXVlc3RzIHRvIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UuXG4gICAgICogQHBhcmFtIGJ1aWxkZXJUeXBlIFRoZSBlbmRwb2ludCBuYW1lIHRoYXQgaXMgbmVlZGVkIHRvIGNyZWF0ZSBhcHJvcHJpYXRlIGByZXF1ZXN0QnVpbGRlcmAuXG4gICAgICogQHBhcmFtIGhybiBUaGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHJlcXVlc3RCdWlsZGVyYFxuICAgICAqL1xuICAgIGdldFJlcXVlc3RCdWlsZGVyKGJ1aWxkZXJUeXBlLCBocm4sIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKGJ1aWxkZXJUeXBlLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpLmNhdGNoKChlcnIpID0+IFByb21pc2UucmVqZWN0KGBFcnJvciByZXRyaWV2aW5nIGZyb20gY2FjaGUgYnVpbGRlciBmb3IgcmVzb3VyY2UgXCIke3RoaXMuaHJufVwiIGFuZCBhcGk6IFwiJHtidWlsZGVyVHlwZX0uXFxuJHtlcnJ9XCJgKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuQ2F0YWxvZ0NsaWVudCA9IENhdGFsb2dDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNhdGFsb2dSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGNhdGFsb2cgbWV0YWRhdGEgZnJvbSB0aGUgcGxhdGZvcm0gQ29uZmlnIFNlcnZpY2UuXG4gKi9cbmNsYXNzIENhdGFsb2dSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tDYXRhbG9nUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEudmFsaWRhdGVCaWxsaW5nVGFnKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbn1cbmV4cG9ydHMuQ2F0YWxvZ1JlcXVlc3QgPSBDYXRhbG9nUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gdGhlIHBsYXRmb3JtIEFydGlmYWN0IFNlcnZpY2UuXG4gKi9cbmNsYXNzIENhdGFsb2dWZXJzaW9uUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGNhdGFsb2cgc3RhcnQgdmVyc2lvbiAoZXhjbHVzaXZlKSBmb3IgdGhlIHJlcXVlc3QuIERlZmF1bHQgaXMgLTEuIEJ5IGNvbnZlbnRpb24gLTFcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIHZpcnR1YWwgaW5pdGlhbCB2ZXJzaW9uIGJlZm9yZSB0aGUgZmlyc3QgcHVibGljYXRpb24gdGhhdCBoYXMgdmVyc2lvbiAwLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY2F0YWxvZyBzdGFydCB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGdldFN0YXJ0VmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRWZXJzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgY2F0YWxvZyBlbmQgdmVyc2lvbiAoaW5jbHVzaXZlKSBmb3IgdGhlIHJlcXVlc3QuIElmIG5vdCBkZWZpbmVkLCB0aGVuIHRoZSBsYXRlc3QgY2F0YWxvZ1xuICAgICAqIHZlcnNpb24gaXMgZmV0aGNlZCBhbmQgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNhdGFsb2cgZW5kIHZlcnNpb24uXG4gICAgICovXG4gICAgZ2V0RW5kVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kVmVyc2lvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHN0YXJ0VmVyc2lvbmAgdmFsdWUgdGhhdCBpcyB1c2VkIGluIHRoZSBgZ2V0VmVyc2lvbnMgYW5kIGBnZXRMYXRlc3RWZXJzaW9uYCBtZXRob2RzIG9mIFtbQ2F0YWxvZ0NsaWVudF1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXJ0VmVyc2lvbiBTcGVjaWZ5IHRoZSBlbmQgY2F0YWxvZyB2ZXJzaW9uIG9yLCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGxhdGVzdCBjYXRhbG9nIHZlcnNpb24sIHNldCB0byB1bmRlZmluZWQuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tDYXRhbG9nVmVyc2lvblJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFN0YXJ0VmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuc3RhcnRWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBlbmRWZXJzaW9uYCB2YWx1ZSB0aGF0IGlzIHVzZWQgaW4gdGhlIGBnZXRWZXJzaW9uc2AgbWV0aG9kIG9mIFtbQ2F0YWxvZ0NsaWVudF1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcnNpb24gU3BlY2lmeSB0aGUgZW5kIGNhdGFsb2cgdmVyc2lvbiBvciwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgY2F0YWxvZyB2ZXJzaW9uLCBzZXQgdG8gdW5kZWZpbmVkLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhFbmRWZXJzaW9uKHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5lbmRWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNCZuZGFzaDsxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0NhdGFsb2dWZXJzaW9uUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEudmFsaWRhdGVCaWxsaW5nVGFnKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbn1cbmV4cG9ydHMuQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0ID0gQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYXRhbG9nc1JlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgY2F0YWxvZ3MgZnJvbSB0aGUgcGxhdGZvcm0gQ29uZmlnIFNlcnZpY2UuXG4gKi9cbmNsYXNzIENhdGFsb2dzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogIEdldHMgYSBzY2hlbWEgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHNjaGVtYSBIUk4uXG4gICAgICovXG4gICAgZ2V0U2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFIcm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBvZiBhIGxheWVyIHNjaGVtYSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgdGhhdCBpcyB1c2VkIGluIHRoZSBgZ2V0Q2F0YWxvZ3NgIG1ldGhvZCBvZiB0aGUgW1tDb25maWdDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKiBJZiB0aGUgc2NoZW1hIGlzIHNldCwgdGhlIGBnZXRDYXRhbG9nc2AgbWV0aG9kIHJldHVybnMgY2F0YWxvZ3Mgd2l0Y2ggaGF2ZSBhIGxheWVyIG9yIGxheWVycyB3aXRoIHRoZSBzcGVjaWZpYyBzY2hlbWEgSFJOLlxuICAgICAqIElmIHRoZSBzY2hlbWEgaXMgbm90IHNldCwgdGhlIGZpbHRlciByZXR1cm5zIGFsbCBvZiB0aGUgY2F0YWxvZ3MgdG8gd2hpY2ggeW91IGhhdmUgYWNjZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNjaGVtYUhybiBUaGUgbGF5ZXIgc2NoZW1hIEhSTi5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbQ2F0YWxvZ1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFNjaGVtYShzY2hlbWFIcm4pIHtcbiAgICAgICAgdGhpcy5zY2hlbWFIcm4gPSBzY2hlbWFIcm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tDYXRhbG9nc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLkNhdGFsb2dzUmVxdWVzdCA9IENhdGFsb2dzUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNvbmZpZ0NsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIEEgY2xpZW50IGZvciB0aGUgcGxhdGZvcm0gQ29uZmlnIFNlcnZpY2UuXG4gKi9cbmNsYXNzIENvbmZpZ0NsaWVudCB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBjbGllbnQgZm9yIHRoZSBkYXRhIHN0b3JlIHRvIHdvcmsgd2l0aCBkYXRhXG4gICAgICogYWJvdXQgY2F0YWxvZ3MgY29uZmlndXJhdGlvbnMgaW4gdGhlIHN0b3JlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tDb25maWdDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXN5bmNocm9ub3VzbHkgcmV0cmlldmVzIGEgbGlzdCBvZiBjYXRhbG9ncyB0byB3aGljaCB5b3UgaGF2ZSBhY2Nlc3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tDYXRhbG9nc1JlcXVlc3RdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGNhdGFsb2dzIHRvIHdoaWNoIHlvdSBoYXZlIGFjY2Vzcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBzY2hlbWEgaXMgc2V0LCB5b3UgZ2V0IHRoZSBjYXRhbG9ncyB3aXRoIGxheWVycyBmaWx0ZXJlZCBieSB0aGUgc3BlY2lmaWVkIGxheWVyIHNjaGVtYSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikuXG4gICAgICogSWYgdGhlIHNjaGVtYSBpcyBub3Qgc2V0LCB0aGUgZmlsdGVyIHJldHVybnMgYWxsIG9mIHRoZSBjYXRhbG9ncyB0byB3aGljaCB5b3UgaGF2ZSBhY2Nlc3MuXG4gICAgICovXG4gICAgZ2V0Q2F0YWxvZ3MocmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSB5aWVsZCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJjb25maWdcIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5iaWxsaW5nVGFnID0gcmVxdWVzdC5nZXRCaWxsaW5nVGFnKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnZlcmJvc2UgPSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNjaGVtYUhybiA9IHJlcXVlc3QuZ2V0U2NoZW1hKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQ29uZmlnQXBpLmdldENhdGFsb2dzKHJlcXVlc3RCdWlsZGVyLCBwYXJhbXMpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkNvbmZpZ0NsaWVudCA9IENvbmZpZ0NsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EYXRhUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgZGF0YSBmcm9tIHRoZSBIRVJFIEJsb2IgU2VydmljZS5cbiAqL1xuY2xhc3MgRGF0YVJlcXVlc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9uID0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZUlmTm90Rm91bmQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBkYXRhIGhhbmRsZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGUgZGF0YSBoYW5kbGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGUgY29udGVudHMgb2YgdGhhdCBibG9iLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYERhdGFIYW5kbGVgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXREYXRhSGFuZGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSGFuZGxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwcm92aWRlZCBkYXRhIGhhbmRsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBgRGF0YUhhbmRsZXJgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbRGF0YVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aERhdGFIYW5kbGUoZGF0YUhhbmRsZSkge1xuICAgICAgICB0aGlzLmRhdGFIYW5kbGUgPSBkYXRhSGFuZGxlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHBhcnRpdGlvbiBJRCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgcGFydGl0aW9uSURgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRQYXJ0aXRpb25JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGl0aW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHByb3ZpZGVkIHBhcnRpdGlvbiBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJ0aXRpb25JZCBUaGUgYHBhcnRpdGlvbklEYCBzdHJpbmcuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tEYXRhUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoUGFydGl0aW9uSWQocGFydGl0aW9uSWQpIHtcbiAgICAgICAgdGhpcy5wYXJ0aXRpb25JZCA9IHBhcnRpdGlvbklkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDTigJMxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQeKAk1ph4oCTejDigJM5XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0RhdGFSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS52YWxpZGF0ZUJpbGxpbmdUYWcodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZldGNoIG9wdGlvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIHNldCB0aGUgc291cmNlIGZyb21cbiAgICAgKiB3aGljaCBkYXRhIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgICAqXG4gICAgICogQHNlZSBgZ2V0RmV0Y2hPcHRpb24oKWAgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBgRmV0Y2hPcHRpb25gIGVudW0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoZSB1cGRhdGVkIGBEYXRhUmVxdWVzdGAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgd2l0aEZldGNoT3B0aW9uKG9wdGlvbikge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9uID0gb3B0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgY29udHJvbHMgaG93IHJlcXVlc3RzIGFyZSBoYW5kbGVkLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgb3B0aW9uIGlzIGBPbmxpbmVJZk5vdEZvdW5kYC4gSXQgcXVlcmllcyB0aGUgbmV0d29yayBpZlxuICAgICAqIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgbm90IGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGZldGNoIG9wdGlvbi5cbiAgICAgKi9cbiAgICBnZXRGZXRjaE9wdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hPcHRpb247XG4gICAgfVxufVxuZXhwb3J0cy5EYXRhUmVxdWVzdCA9IERhdGFSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkluZGV4TGF5ZXJDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuLyoqXG4gKiBEZXNjcmliZXMgYSBpbmRleCBsYXllciBhbmQgcHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGFuZCBkYXRhLlxuICovXG5jbGFzcyBJbmRleExheWVyQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBbW0luZGV4TGF5ZXJDbGllbnRdXSBpbnN0YW5jZSB3aXRoIEluZGV4TGF5ZXJDbGllbnRQYXJhbXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnMgZm9yIHVzZSB0byBpbml0aWFsaXplIEluZGV4TGF5ZXJDbGllbnQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICAgICAgdGhpcy5ocm4gPSBwYXJhbXMuY2F0YWxvZ0hybi50b1N0cmluZygpO1xuICAgICAgICB0aGlzLmxheWVySWQgPSBwYXJhbXMubGF5ZXJJZDtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHBhcmFtcy5zZXR0aW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBhbGwgcGFydGl0aW9ucyBtZXRhZGF0YSBmcm9tIGEgbGF5ZXIgdGhhdCBtYXRjaCBhIHF1ZXJ5IGZyb20gdGhlIFtbSW5kZXhRdWVyeVJlcXVlc3RdXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBJbmRleFF1ZXJ5UmVxdWVzdCBUaGUgW1tJbmRleFF1ZXJ5UmVxdWVzdF1dIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgbGlzdCBvZiBtZXRhZGF0YSBmb3IgZWFjaCBvZiB0aGUgcGFydGl0aW9ucyBmcm9tIHRoZSByZXF1ZXN0ZWQgbGF5ZXIuXG4gICAgICovXG4gICAgZ2V0UGFydGl0aW9ucyhyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgcXVlcnlcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwiaW5kZXhcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyID0+IFByb21pc2UucmVqZWN0KGVycikpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXhNZXRhZGF0YSA9IHlpZWxkIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuSW5kZXhBcGkucGVyZm9ybVF1ZXJ5KHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgbGF5ZXJJRDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgIGh1Z2U6IHJlcXVlc3QuZ2V0SHVnZVJlc3BvbnNlKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgICAgIHJldHVybiBpbmRleE1ldGFkYXRhLmRhdGFcbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShpbmRleE1ldGFkYXRhLmRhdGEpXG4gICAgICAgICAgICAgICAgOiBQcm9taXNlLnJlamVjdChpbmRleE1ldGFkYXRhLmVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgcGFydGl0aW9uIGRhdGEgdXNpbmcgZGF0YSBoYW5kbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZWwgVGhlIGRhdGEgbW9kZWwgb2YgcGFydGl0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHBhcnRpdGlvbi5cbiAgICAgKi9cbiAgICBnZXREYXRhKG1vZGVsLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKCFtb2RlbC5pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBkYXRhIGhhbmRsZSBmb3IgdGhpcyBwYXJ0aXRpb25cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IHlpZWxkIHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJibG9iXCIsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgYWJvcnRTaWduYWwpLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkJsb2JBcGkuZ2V0QmxvYihidWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgZGF0YUhhbmRsZTogbW9kZWwuaWQsXG4gICAgICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIGJhc2VVcmwgYW5kIGNyZWF0ZSByZXF1ZXN0QnVpbGRlciBmb3Igc2VuZGluZyByZXF1ZXN0cyB0byB0aGUgQVBJIExvb2t1cCBTZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBidWlsZGVyVHlwZSBlbmRwb2ludCBuYW1lIGlzIG5lZWRlZCB0byBjcmVhdGUgcHJvcHJpYXRlIHJlcXVlc3RCdWlsZGVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyByZXF1ZXN0QnVpbGRlclxuICAgICAqL1xuICAgIGdldFJlcXVlc3RCdWlsZGVyKGJ1aWxkZXJUeXBlLCBocm4sIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKGJ1aWxkZXJUeXBlLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5JbmRleExheWVyQ2xpZW50ID0gSW5kZXhMYXllckNsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSW5kZXhRdWVyeVJlcXVlc3QgPSB2b2lkIDA7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgcGFydGl0aW9ucyBtZXRhZGF0YSBmcm9tIHRoZSBwbGF0Zm9ybSBJbmRleCBTZXJ2aWNlLlxuICovXG5jbGFzcyBJbmRleFF1ZXJ5UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHF1ZXJ5IEFuIFJTUUwgcXVlcnkgdG8gdXNlIHRvIHJldHJpZXZlIHBhcnRpdGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkuXG4gICAgICogVGhlIHF1ZXJ5IG11c3QgdXNlIHRoZSBpbmRleGluZyBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhlIGluZGV4IGxheWVyLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbSW5kZXhRdWVyeVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFF1ZXJ5U3RyaW5nKHF1ZXJ5KSB7XG4gICAgICAgIHRoaXMucXVlcnlTdHJpbmcgPSBxdWVyeTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgaXNIdWdlUmVzcG9uc2UgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlzSHVnZSBUaGUgYm9vbGVhbiBwYXJhbWV0ZXIgc2hvd3MgaXMgdGhlIHF1ZXJ5IGh1Z2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW0luZGV4UXVlcnlSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhIdWdlUmVzcG9uc2UoaXNIdWdlKSB7XG4gICAgICAgIHRoaXMuaXNIdWdlUmVzcG9uc2UgPSBpc0h1Z2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcXVlcnlTdHJpbmcgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgcXVlcnlTdHJpbmcgc3RyaW5nLlxuICAgICAqL1xuICAgIGdldFF1ZXJ5U3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVN0cmluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBpc0h1Z2VSZXNwb25zZSBwcm9wZXJ0eSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgaXNIdWdlUmVzcG9uc2VgIGJvb2xlYW4uXG4gICAgICovXG4gICAgZ2V0SHVnZVJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0h1Z2VSZXNwb25zZTtcbiAgICB9XG59XG5leHBvcnRzLkluZGV4UXVlcnlSZXF1ZXN0ID0gSW5kZXhRdWVyeVJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxheWVyVmVyc2lvbnNSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgbGF5ZXIgdmVyc2lvbnMgb2YgYSBzcGVjaWZpYyBjYXRhbG9nIHZlcnNpb24uICovXG5jbGFzcyBMYXllclZlcnNpb25zUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGNhdGFsb2cgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjYXRhbG9nIHZlcnNpb24uXG4gICAgICovXG4gICAgZ2V0VmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY2F0YWxvZyB2ZXJzaW9uIHZhbHVlIHRoYXQgaXMgdXNlZCBpbiB0aGUgJ2dldExheWVyVmVyc2lvbnMnIG1ldGhvZCBvZiBbW0NhdGFsb2dDbGllbnRdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFNwZWNpZnkgdGhlIGNhdGFsb2cgdmVyc2lvbi5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW0xheWVyVmVyc2lvbnNSZXF1ZXN0XV0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICB3aXRoVmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNOKAkzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtB4oCTWmHigJN6MOKAkzldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbTGF5ZXJWZXJzaW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDTigJMxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQeKAk1ph4oCTejDigJM5XS5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEudmFsaWRhdGVCaWxsaW5nVGFnKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmV4cG9ydHMuTGF5ZXJWZXJzaW9uc1JlcXVlc3QgPSBMYXllclZlcnNpb25zUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QYXJ0aXRpb25zUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGZyb20gdGhlIE1ldGFkYXRhIFNlcnZpY2UgQVBJLlxuICovXG5jbGFzcyBQYXJ0aXRpb25zUmVxdWVzdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb24gPSBvbHBfc2RrX2NvcmVfMS5GZXRjaE9wdGlvbnMuT25saW5lSWZOb3RGb3VuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDTigJMxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQeKAk1ph4oCTejDigJM5XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1BhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS52YWxpZGF0ZUJpbGxpbmdUYWcodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHByb3ZpZGVkIHBhcnRpdGlvbiBJRHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWRzIFRoZSBJRHMgb2YgcGFydGl0aW9ucyBmcm9tIHdoaWNoIHlvdSB3YW50IHRvIGdldCBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIFRoZSByZXF1aXJlZCBxdWFudGl0eSBpcyBiZXR3ZWVuIDEgYW5kIDEwMC5cbiAgICAgKiBJZiBwYXJ0aXRpb24gSURzIGFyZSBub3QgcHJvdmlkZWQsIGFsbCBwYXJ0aXRpb25zIGFyZSByZXRyaWV2ZWQuXG4gICAgICogSWYgdGhlIHF1YW50aXR5IG9mIHBhcnRpdGlvbiBJRHMgaXMgbGVzcyB0aGFuIDEgKGVtcHR5IGFycmF5KSBvciBtb3JlIHRoYW4gMTAwLCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoUGFydGl0aW9uSWRzKGlkcykge1xuICAgICAgICB0aGlzLnBhcnRpdGlvbklkcyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3QoaWRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgcGFydGl0aW9uIElEcyBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgcGFydGl0aW9uSWRzYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0UGFydGl0aW9uSWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJ0aXRpb25JZHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHByb3ZpZGVkIGFkZGl0aW9uYWwgZmllbGRzOiBgZGF0YVNpemVgLCBgY2hlY2tzdW1gLCBgY29tcHJlc3NlZERhdGFTaXplYCwgYW5kIGBjcmNgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgVGhlIGFycmF5IG9mIHN0cmluZ3MuXG4gICAgICogVGhlIGFycmF5IGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBgZGF0YVNpemVgLCBgY2hlY2tzdW1gLCBgY29tcHJlc3NlZERhdGFTaXplYCwgYW5kIGBjcmNgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQWRkaXRpb25hbEZpZWxkcyhhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsRmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hZGRpdGlvbmFsRmllbGRzID0gYWRkaXRpb25hbEZpZWxkcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IuIFBhcmFtZXRlciAnYWRkaXRpb25hbEZpZWxkcycgY291bGQgbm90IGNvbnRhaW4gZW1wdHkgYXJyYXkuIEFkZCB2YWx1ZSBvciBkbyBub3QgdXNlIHRoaXMgbWV0aG9kLlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGFkZGl0aW9uYWwgZmllbGRzIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBwYXJ0aXRpb25JZHNgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRBZGRpdGlvbmFsRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRpdGlvbmFsRmllbGRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBmZXRjaCBvcHRpb24gdGhhdCB5b3UgY2FuIHVzZSB0byBzZXQgdGhlIHNvdXJjZSBmcm9tXG4gICAgICogd2hpY2ggZGF0YSBzaG91bGQgYmUgZmV0Y2hlZC5cbiAgICAgKlxuICAgICAqIEBzZWUgYGdldEZldGNoT3B0aW9uKClgIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgZm9ybWF0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbiBUaGUgYEZldGNoT3B0aW9uYCBlbnVtLlxuICAgICAqXG4gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGUgdXBkYXRlZCBgUGFydGl0aW9uc1JlcXVlc3RgIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHdpdGhGZXRjaE9wdGlvbihvcHRpb24pIHtcbiAgICAgICAgdGhpcy5mZXRjaE9wdGlvbiA9IG9wdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZldGNoIG9wdGlvbiB0aGF0IGNvbnRyb2xzIGhvdyByZXF1ZXN0cyBhcmUgaGFuZGxlZC5cbiAgICAgKlxuICAgICAqIFRoZSBkZWZhdWx0IG9wdGlvbiBpcyBgT25saW5lSWZOb3RGb3VuZGAuIEl0IHF1ZXJpZXMgdGhlIG5ldHdvcmsgaWZcbiAgICAgKiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIG5vdCBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBmZXRjaCBvcHRpb24uXG4gICAgICovXG4gICAgZ2V0RmV0Y2hPcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoT3B0aW9uO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFydGl0aW9uc1JlcXVlc3QgPSBQYXJ0aXRpb25zUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUG9sbFJlcXVlc3QgPSB2b2lkIDA7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byB0aGUgcGxhdGZvcm0gU3RyZWFtIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFBvbGxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKi9cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1BvbGxSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhNb2RlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN1YnNjcmlwdGlvbiBpZCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gaWQuXG4gICAgICovXG4gICAgZ2V0U3Vic2NyaXB0aW9uSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1BvbGxSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTdWJzY3JpcHRpb25JZChpZCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkID0gaWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmV4cG9ydHMuUG9sbFJlcXVlc3QgPSBQb2xsUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWFkS2V5UGFydGl0aW9uc1JlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgcXVhZHRyZWUgbWV0YWRhdGEgZnJvbSB0aGUgUXVlcnkgU2VydmljZSBBUEkuXG4gKlxuICogVGhpcyBjbGFzcyB3b3JrcyBvbmx5IHdpdGggdmVyc2lvbmVkIGFuZCB2b2xhdGlsZSBsYXllcnMgd2hlcmUgdGhlIHBhcnRpdGlvbmluZyBzY2hlbWUgaXMgSEVSRSBUaWxlLlxuICovXG5jbGFzcyBRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgZ2VvbWV0cmljIGFyZWEgcmVwcmVzZW50ZWQgYXMgYSBIRVJFIHRpbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcXVhZEtleSBBZGRyZXNzZXMgYSB0aWxlIGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoUXVhZEtleShxdWFkS2V5KSB7XG4gICAgICAgIHRoaXMucXVhZEtleSA9IHF1YWRLZXk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVjdXJzaW9uIGRlcHRoIG9mIHRoZSByZXNwb25zZS5cbiAgICAgKiBUaGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlIGZvciB0aGUgZGVwdGggcGFyYW1ldGVyIGlzIDQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVwdGggVGhlIHJlY3Vyc2lvbiBkZXB0aCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBJZiBzZXQgdG8gMCwgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIG9ubHkgZGF0YSBmcm9tIHRoZSBxdWFka2V5IHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC5cbiAgICAgKiBJbiB0aGlzIHdheSwgdGhlIGRlcHRoIGRlc2NyaWJlcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHN1YlF1YWRLZXlzIGluIHRoZSByZXNwb25zZS5cbiAgICAgKi9cbiAgICB3aXRoRGVwdGgoZGVwdGgpIHtcbiAgICAgICAgdGhpcy5kZXB0aCA9IGRlcHRoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBhZGRpdGlvbmFsIGZpZWxkc1xuICAgICAqXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgQXJyYXkgb2Ygc3RyaW5ncy4gQXJyYXkgY291bGQgY29udGFpbiBuZXh0IHZhbHVlcyBcImRhdGFTaXplXCIgfCBcImNoZWNrc3VtXCIgfCBcImNvbXByZXNzZWREYXRhU2l6ZSB8IFwiY3JjXCJcIi5cbiAgICAgKiBUaGlzIHZhbHVlcyBjb3VsZCBiZSB1c2VmdWwgZm9yIGdldFBhcnRpdGlvbnMgbWV0aG9kIGZyb20gdmVyc2lvbmVkTGF5ZXJDbGllbnQgYW5kIHZvbGF0aWxlTGF5ZXJDbGllbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQWRkaXRpb25hbEZpZWxkcyhhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgIHRoaXMuYWRkaXRpb25hbEZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIFtbUXVhZEtleV1dIG9iamVjdCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSB0aGUgY29uZmlndXJlZCBbW1F1YWRLZXldXSBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0UXVhZEtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVhZEtleTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBkZXB0aCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGhlIGNvbmZpZ3VyZWQgZGVwdGguXG4gICAgICovXG4gICAgZ2V0RGVwdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlcHRoIHx8IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFkZGl0aW9uYWwgZmllbGRzIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQWRkaXRpb25hbCBmaWVsZHMuXG4gICAgICovXG4gICAgZ2V0QWRkaXRpb25hbEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkaXRpb25hbEZpZWxkcztcbiAgICB9XG59XG5leHBvcnRzLlF1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdCA9IFF1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWFkVHJlZUluZGV4UmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBxdWFkdHJlZSBtZXRhZGF0YSBmcm9tIHRoZSBRdWVyeSBTZXJ2aWNlIEFQSS5cbiAqXG4gKiBUaGlzIGNsYXNzIHdvcmtzIG9ubHkgd2l0aCB2ZXJzaW9uZWQgb3Igdm9sYXRpbGUgbGF5ZXJzIHdoZXJlIHRoZSBwYXJ0aXRpb25pbmcgc2NoZW1lIGlzIEhFUkUgVGlsZS5cbiAqL1xuY2xhc3MgUXVhZFRyZWVJbmRleFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhlIFtbUXVhZFRyZWVJbmRleFJlcXVlc3RdXSBpbnN0YW5jZSBmb3IgZmV0Y2hpbmcgdGhlIHF1YWR0cmVlIGluZGV4IGZyb20gdGhlIFF1ZXJ5IFNlcnZpY2UgQVBJXG4gICAgICogZm9yIHZvbGF0aWxlIG9yIHZlcnNpb25lZCBsYXllcnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRhbG9nSHJuIFRoZSBjYXRhbG9nIEhFUkUgUmVzb3VyY2UgTmFtZSAoW1tIUk5dXSkuXG4gICAgICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0gbGF5ZXJUeXBlIFRoZSB0eXBlIG9mIGxheWVyIHRoYXQgeW91IHdhbnQgdG8gdXNlIGZvciB0aGUgcmVxdWVzdC4gQnkgZGVmYXVsdCwgYSBsYXllciBvZiB0aGUgdmVyc2lvbmVkIHR5cGUgaXMgdXNlZC5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW1F1YWRUcmVlSW5kZXhSZXF1ZXN0XV0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYXRhbG9nSHJuLCBsYXllcklkLCBsYXllclR5cGUgPSBcInZlcnNpb25lZFwiKSB7XG4gICAgICAgIHRoaXMuY2F0YWxvZ0hybiA9IGNhdGFsb2dIcm47XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IGxheWVySWQ7XG4gICAgICAgIHRoaXMubGF5ZXJUeXBlID0gbGF5ZXJUeXBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZyBhZ2FpbnN0IHdoaWNoIHlvdSB3YW50IHRvIHJ1biB0aGUgcXVlcnkuXG4gICAgICogSXQgbXVzdCBiZSBhIHZhbGlkIGNhdGFsb2cgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFNwZWNpZnkgdGhlIGNhdGFsb2cgdmVyc2lvbiBvciwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgY2F0YWxvZyB2ZXJzaW9uLCBzZXQgdG8gdW5kZWZpbmVkLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhWZXJzaW9uKHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZ2VvbWV0cmljIGFyZWEgcmVwcmVzZW50ZWQgYXMgYSBIRVJFIHRpbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcXVhZEtleSBBZGRyZXNzZXMgYSB0aWxlIGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoUXVhZEtleShxdWFkS2V5KSB7XG4gICAgICAgIHRoaXMucXVhZEtleSA9IHF1YWRLZXk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVjdXJzaW9uIGRlcHRoIG9mIHRoZSByZXNwb25zZS5cbiAgICAgKiBUaGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlIGZvciB0aGUgZGVwdGggcGFyYW1ldGVyIGlzIDQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVwdGggVGhlIHJlY3Vyc2lvbiBkZXB0aCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBJZiBzZXQgdG8gMCwgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIG9ubHkgZGF0YSBmcm9tIHRoZSBxdWFka2V5IHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC5cbiAgICAgKiBJbiB0aGlzIHdheSwgdGhlIGRlcHRoIGRlc2NyaWJlcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHN1YlF1YWRLZXlzIGluIHRoZSByZXNwb25zZS5cbiAgICAgKi9cbiAgICB3aXRoRGVwdGgoZGVwdGgpIHtcbiAgICAgICAgdGhpcy5kZXB0aCA9IGRlcHRoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tRdWFkVHJlZUluZGV4UmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEudmFsaWRhdGVCaWxsaW5nVGFnKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGFkZGl0aW9uYWwgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgQXJyYXkgb2Ygc3RyaW5ncy4gQXJyYXkgY291bGQgY29udGFpbiBuZXh0IHZhbHVlcyBcImRhdGFTaXplXCIgfCBcImNoZWNrc3VtXCIgfCBcImNvbXByZXNzZWREYXRhU2l6ZSB8IFwiY3JjXCJcIi5cbiAgICAgKiBUaGlzIHZhbHVlcyBjb3VsZCBiZSB1c2VmdWwgZm9yIGdldFBhcnRpdGlvbnMgbWV0aG9kIGZyb20gdmVyc2lvbmVkTGF5ZXJDbGllbnQgYW5kIHZvbGF0aWxlTGF5ZXJDbGllbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRUcmVlSW5kZXhSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhBZGRpdGlvbmFsRmllbGRzKGFkZGl0aW9uYWxGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5hZGRpdGlvbmFsRmllbGRzID0gYWRkaXRpb25hbEZpZWxkcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWd1cmVkIGNhdGFsb2cgdmVyc2lvbiBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjYXRhbG9nIHZlcnNpb24gbnVtYmVyLlxuICAgICAqL1xuICAgIGdldFZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgW1tRdWFkS2V5XV0gb2JqZWN0IGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHRoZSBjb25maWd1cmVkIFtbUXVhZEtleV1dIG9iamVjdC5cbiAgICAgKi9cbiAgICBnZXRRdWFkS2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWFkS2V5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIGRlcHRoIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aGUgY29uZmlndXJlZCBkZXB0aC5cbiAgICAgKi9cbiAgICBnZXREZXB0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVwdGggfHwgMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCB0eXBlIG9mIHRoZSBsYXllciBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICogQnkgZGVmYXVsdCwgYSBsYXllciBvZiB0aGUgdmVyc2lvbmVkIHR5cGUgaXMgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGxheWVyIHR5cGUuXG4gICAgICovXG4gICAgZ2V0TGF5ZXJUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllclR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgW1tIUk5dXSBpbnN0YW5jZSBvZiB0aGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUoSFJOKSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIFtbSFJOXV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgZ2V0Q2F0YWxvZ0hybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ0hybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxheWVyIElEIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGxheWVyIElEIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRMYXllcklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllcklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEFkZGl0aW9uYWwgZmllbGRzLlxuICAgICAqL1xuICAgIGdldEFkZGl0aW9uYWxGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxGaWVsZHM7XG4gICAgfVxufVxuZXhwb3J0cy5RdWFkVHJlZUluZGV4UmVxdWVzdCA9IFF1YWRUcmVlSW5kZXhSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVlcnlDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBBIGNsaWVudCBmb3IgdGhlIFF1ZXJ5IFNlcnZpY2UgQVBJIHRoYXQgcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IGluZm9ybWF0aW9uIChtZXRhZGF0YSlcbiAqIGFib3V0IGxheWVycyBhbmQgcGFydGl0aW9ucyBzdG9yZWQgaW4gYSBjYXRhbG9nLlxuICogVGhpcyBzZXJ2aWNlIGV4cG9zZXMgdGhlIG1ldGFkYXRhIGZvciBhIHNpbmdsZSBwYXJ0aXRpb24gdGhhdCB5b3UgY2FuIHF1ZXJ5IG9uZSBieSBvbmUgb3IgdXNpbmcgYSBwYXJlbnQgdGlsZS5cbiAqL1xuY2xhc3MgUXVlcnlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgY2xpZW50IGZvciB0aGUgUXVlcnkgU2VydmljZSBBUEkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW1F1ZXJ5Q2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB0aGlzLmFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgdGhlIHF1YWR0cmVlIGluZGV4LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGNvbmZpZ3VyZWQgW1tRdWFkVHJlZUluZGV4UmVxdWVzdF1dIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHF1YWR0cmVlIGluZGV4IG9iamVjdC5cbiAgICAgKi9cbiAgICBmZXRjaFF1YWRUcmVlSW5kZXgocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1YWRLZXkgPSByZXF1ZXN0LmdldFF1YWRLZXkoKTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVySWQgPSByZXF1ZXN0LmdldExheWVySWQoKTtcbiAgICAgICAgICAgIGlmICghcXVhZEtleSB8fCAhb2xwX3Nka19jb3JlXzEuVGlsZUtleS5pc1ZhbGlkKHF1YWRLZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBRdWFkS2V5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFsYXllcklkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBJZCBvZiB0aGUgTGF5ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2F0YWxvZ1ZlcnNpb24gPSByZXF1ZXN0LmdldFZlcnNpb24oKTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldExheWVyVHlwZSgpID09PSBcInZlcnNpb25lZFwiICYmXG4gICAgICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNhdGFsb2dWZXJzaW9uID0geWllbGQgdGhpcy5nZXRDYXRhbG9nTGF0ZXN0VmVyc2lvbihyZXF1ZXN0LmdldENhdGFsb2dIcm4oKSwgYWJvcnRTaWduYWwsIHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChgRXJyb3IgZ2V0dGluZyB0aGUgbGFzdCBjYXRhbG9nIHZlcnNpb246ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0TGF5ZXJUeXBlKCkgPT09IFwidmVyc2lvbmVkXCIgJiZcbiAgICAgICAgICAgICAgICBjYXRhbG9nVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGNhdGFsb2cgdmVyc2lvbmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSB5aWVsZCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJxdWVyeVwiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIHJlcXVlc3QuZ2V0Q2F0YWxvZ0hybigpLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoYEVyb3JyIGNyZWF0aW5nIHJlcXVlc3Qgb2JqZWN0IGZvciBxdWVyeSBzZXJ2aWNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgIGNvbnN0IHN1YlF1YWRLZXlzTWF4TGVuZ3RoID0gcmVxdWVzdC5nZXREZXB0aCgpO1xuICAgICAgICAgICAgbGV0IGZldGNoaW5nUXVhZFRyZWVJbmRleEZ1bmN0aW9uO1xuICAgICAgICAgICAgbGV0IHBhcmFtc0ZvckZldGNoUXVhZFRyZWVJbmRleCA9IHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiAwLFxuICAgICAgICAgICAgICAgIGxheWVySWQsXG4gICAgICAgICAgICAgICAgZGVwdGg6IHN1YlF1YWRLZXlzTWF4TGVuZ3RoLFxuICAgICAgICAgICAgICAgIHF1YWRLZXk6IG9scF9zZGtfY29yZV8xLlRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKHF1YWRLZXkucm93LCBxdWFkS2V5LmNvbHVtbiwgcXVhZEtleS5sZXZlbClcbiAgICAgICAgICAgICAgICAgICAgLm1vcnRvbkNvZGUoKVxuICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSxcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmllbGRzOiByZXF1ZXN0LmdldEFkZGl0aW9uYWxGaWVsZHMoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldExheWVyVHlwZSgpID09PSBcInZvbGF0aWxlXCIpIHtcbiAgICAgICAgICAgICAgICBmZXRjaGluZ1F1YWRUcmVlSW5kZXhGdW5jdGlvbiA9IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuUXVlcnlBcGkucXVhZFRyZWVJbmRleFZvbGF0aWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZmV0Y2hpbmdRdWFkVHJlZUluZGV4RnVuY3Rpb24gPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlF1ZXJ5QXBpLnF1YWRUcmVlSW5kZXg7XG4gICAgICAgICAgICAgICAgcGFyYW1zRm9yRmV0Y2hRdWFkVHJlZUluZGV4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwYXJhbXNGb3JGZXRjaFF1YWRUcmVlSW5kZXgpLCB7IHZlcnNpb246IGNhdGFsb2dWZXJzaW9uIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZldGNoaW5nUXVhZFRyZWVJbmRleEZ1bmN0aW9uKHJlcXVlc3RCdWlsZGVyLCBwYXJhbXNGb3JGZXRjaFF1YWRUcmVlSW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBwYXJ0aXRpb25zIHVzaW5nIHRoZWlyIElEcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBgUGFydGl0aW9uc1JlcXVlc3RgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgZnJvbSB3aGljaCB5b3Ugd2FudCB0byBnZXQgcGFydGl0aW9ucy5cbiAgICAgKiBAcGFyYW0gaHJuIFRoZSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgb2YgdGhlIGxheWVyLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHJlcXVlc3RlZCBwYXJ0aXRpb25zLlxuICAgICAqL1xuICAgIGdldFBhcnRpdGlvbnNCeUlkKHJlcXVlc3QsIGxheWVySWQsIGhybiwgYWJvcnRTaWduYWwsIGNhdGFsb2dWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBpZHNMaXN0ID0gcmVxdWVzdC5nZXRQYXJ0aXRpb25JZHMoKTtcbiAgICAgICAgICAgIGlmICghaWRzTGlzdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgcGFydGl0aW9uSWRzIGxpc3RcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5NZXRhZGF0YUNhY2hlUmVwb3NpdG9yeSh0aGlzLnNldHRpbmdzLmNhY2hlKTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkUGFydGl0aW9ucyA9IGNhY2hlLmdldChyZXF1ZXN0LCBocm4udG9TdHJpbmcoKSwgbGF5ZXJJZCwgY2F0YWxvZ1ZlcnNpb24pO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZWRQYXJ0aXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uczogY2FjaGVkUGFydGl0aW9uc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IHlpZWxkIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShcInF1ZXJ5XCIsIHRoaXMuYXBpVmVyc2lvbiwgdGhpcy5zZXR0aW5ncywgaHJuLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoYEVyb3JyIGNyZWF0aW5nIHJlcXVlc3Qgb2JqZWN0IGZvciBxdWVyeSBzZXJ2aWNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgIGNvbnN0IG1lZGF0YWRhID0geWllbGQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5RdWVyeUFwaS5nZXRQYXJ0aXRpb25zQnlJZChyZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgICAgIGxheWVySWQsXG4gICAgICAgICAgICAgICAgcGFydGl0aW9uOiBpZHNMaXN0LFxuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxGaWVsZHM6IHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IGNhdGFsb2dWZXJzaW9uICE9PSB1bmRlZmluZWQgPyBgJHtjYXRhbG9nVmVyc2lvbn1gIDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4gUHJvbWlzZS5yZWplY3QoZXJyKSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRGZXRjaE9wdGlvbigpICE9PSBvbHBfc2RrX2NvcmVfMS5GZXRjaE9wdGlvbnMuT25saW5lT25seSAmJlxuICAgICAgICAgICAgICAgIG1lZGF0YWRhICYmXG4gICAgICAgICAgICAgICAgbWVkYXRhZGEucGFydGl0aW9ucyAmJlxuICAgICAgICAgICAgICAgIG1lZGF0YWRhLnBhcnRpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydGl0aW9ucyA9IG1lZGF0YWRhLnBhcnRpdGlvbnMubWFwKHBhcnRpdGlvbiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBjaGVja3N1bTogcGFydGl0aW9uLmNoZWNrc3VtLFxuICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkRGF0YVNpemU6IHBhcnRpdGlvbi5jb21wcmVzc2VkRGF0YVNpemUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGFIYW5kbGU6IHBhcnRpdGlvbi5kYXRhSGFuZGxlIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIGRhdGFTaXplOiBwYXJ0aXRpb24uZGF0YVNpemUsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbjogcGFydGl0aW9uLnBhcnRpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogcGFydGl0aW9uLnZlcnNpb25cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgY2FjaGUucHV0KHJlcXVlc3QsIGhybi50b1N0cmluZygpLCBsYXllcklkLCBwYXJ0aXRpb25zLCBjYXRhbG9nVmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1lZGF0YWRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uXG4gICAgICovXG4gICAgZ2V0Q2F0YWxvZ0xhdGVzdFZlcnNpb24oY2F0YWxvZ0hybiwgYWJvcnRTaWduYWwsIGJpbGxpbmdUYWcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB5aWVsZCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJtZXRhZGF0YVwiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGNhdGFsb2dIcm4sIGFib3J0U2lnbmFsKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChgRXJvcnIgY3JlYXRpbmcgcmVxdWVzdCBvYmplY3QgZm9yIG1ldGFkYXRhIHNlcnZpY2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHlpZWxkIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubGF0ZXN0VmVyc2lvbihyZXF1ZXN0LCB7XG4gICAgICAgICAgICAgICAgc3RhcnRWZXJzaW9uOiAtMSxcbiAgICAgICAgICAgICAgICBiaWxsaW5nVGFnXG4gICAgICAgICAgICB9KS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXRlc3RWZXJzaW9uLnZlcnNpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlF1ZXJ5Q2xpZW50ID0gUXVlcnlDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2NoZW1hRGV0YWlsc1JlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byB0aGUgcGxhdGZvcm0gQXJ0aWZhY3QgU2VydmljZS5cbiAqL1xuY2xhc3MgU2NoZW1hRGV0YWlsc1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEdldHMgc2NoZW1hIG1ldGFkYXRhIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWFEZXRhaWxzUmVxdWVzdCBUaGUgW1tTY2hlbWFEZXRhaWxzUmVxdWVzdF1dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzY2hlbWEgbWV0YWRhdGEuXG4gICAgICovXG4gICAgZ2V0U2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFIcm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBvZiBhIHNjaGVtYSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgdGhhdCBpcyB1c2VkIGluXG4gICAgICogdGhlIGBnZXRTY2hlbWFgIGFuZCBgZ2V0U2NoZW1hRGV0YWlsc2AgbWV0aG9kcyBvZiBbW0FydGlmYWN0Q2xpZW50XV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2NoZW1hSHJuIFRoZSBsYXllciBzY2hlbWEgSFJOLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tTY2hlbWFEZXRhaWxzUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoU2NoZW1hKHNjaGVtYUhybikge1xuICAgICAgICB0aGlzLnNjaGVtYUhybiA9IHNjaGVtYUhybjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbU2NoZW1hRGV0YWlsc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLlNjaGVtYURldGFpbHNSZXF1ZXN0ID0gU2NoZW1hRGV0YWlsc1JlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNjaGVtYVJlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byB0aGUgcGxhdGZvcm0gQXJ0aWZhY3QgU2VydmljZS5cbiAqL1xuY2xhc3MgU2NoZW1hUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYFZhcmlhbnRgIG9iamVjdCBvZiB0aGUgc2NoZW1hIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBWYXJpYW50YCBvYmplY3Qgb2YgdGhlIHNjaGVtYS5cbiAgICAgKi9cbiAgICBnZXRWYXJpYW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YXJpYW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgb2YgYSBzY2hlbWEgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIHRoYXQgaXMgdXNlZCBpblxuICAgICAqIHRoZSBgZ2V0U2NoZW1hYCBhbmQgYGdldFNjaGVtYURldGFpbHNgIG1ldGhvZHMgb2YgW1tBcnRpZmFjdENsaWVudF1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhcmlhbnQgVGhlIGBWYXJpYW50YCBvYmplY3Qgb2YgdGhlIHNjaGVtYVxuICAgICAqIEByZXR1cm4gVGhlIFtbU2NoZW1hUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoVmFyaWFudCh2YXJpYW50KSB7XG4gICAgICAgIHRoaXMudmFyaWFudCA9IHZhcmlhbnQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNCZuZGFzaDsxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1NjaGVtYVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLlNjaGVtYVJlcXVlc3QgPSBTY2hlbWFSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TZWVrUmVxdWVzdCA9IHZvaWQgMDtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBTdHJlYW0gU2VydmljZS5cbiAqL1xuY2xhc3MgU2Vla1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN1YnNjcmlwdGlvbiBtb2RlIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqL1xuICAgIGdldE1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgc3Vic2NyaXB0aW9uIG1vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgc3Vic2NyaXB0aW9uIG1vZGUuXG4gICAgICogQHJldHVybnMgVGhlIFtbU2Vla1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aE1vZGUobW9kZSkge1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2NyaXB0aW9uIGlkIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKi9cbiAgICBnZXRTdWJzY3JpcHRpb25JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIFRoZSBzdWJzY3JpcHRpb24gaWQuXG4gICAgICogQHJldHVybnMgVGhlIFtbU2Vla1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFN1YnNjcmlwdGlvbklkKGlkKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHdpdGhTZWVrT2Zmc2V0cyhvZmZzZXRzKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0cyA9IG9mZnNldHM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnZXRTZWVrT2Zmc2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0cztcbiAgICB9XG59XG5leHBvcnRzLlNlZWtSZXF1ZXN0ID0gU2Vla1JlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdGF0aXN0aWNzQ2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogQSBjbGllbnQgZm9yIHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFN0YXRpc3RpY3NDbGllbnQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIFtbU3RhdGlzdGljc0NsaWVudF1dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBbW1N0YXRpc3RpY3NDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBhbmQgcmV0dXJucyBhIGxheWVyIHN1bW1hcnkgZnJvbSB0aGUgcGxhdGZvcm0gU3RhdGlzdGljcyBTZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN1bW1hcnlSZXF1ZXN0IFBhcmFtZXRlcnMgdGhhdCBhcmUgbmVlZGVkIHRvIGZldGNoIHRoZSBsYXllciBzdW1tYXJ5LlxuICAgICAqIEluY2x1ZGVzIFtbY2F0YWxvZ0hybl1dIGFuZCBbW2xheWVySWRdXS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aXRoIHRoZSBsYXllciBzdW1tYXJ5LlxuICAgICAqL1xuICAgIGdldFN1bW1hcnkoc3VtbWFyeVJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVySWQgPSBzdW1tYXJ5UmVxdWVzdC5nZXRMYXllcklkKCk7XG4gICAgICAgICAgICBjb25zdCBjYXRhbG9nSHJuID0gc3VtbWFyeVJlcXVlc3QuZ2V0Q2F0YWxvZ0hybigpO1xuICAgICAgICAgICAgaWYgKGNhdGFsb2dIcm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGNhdGFsb2dIcm4gcHJvdmlkZWRgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGF5ZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTm8gbGF5ZXJJZCBwcm92aWRlZGApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvdmVyYWdlUmVxdWVzdEJ1aWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKGNhdGFsb2dIcm4pLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5Db3ZlcmFnZUFwaS5nZXREYXRhQ292ZXJhZ2VTdW1tYXJ5KGNvdmVyYWdlUmVxdWVzdEJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBsYXllcklkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlcGVuZGluZyBvbiB0aGUgbWFwIHR5cGUgdGhhdCB5b3Ugc3BlY2lmeSBpbiB0aGUgW1tTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlLCBnZXRzIHRoZSBbW1N0YXRpc3RpY3NSZXF1ZXN0XV0gaW5zdGFuY2VcbiAgICAgKiB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHNldHRpbmdzOlxuICAgICAqICogQklUTUFQICZuZGFzaDsgZmV0Y2hlcyBhIGJpdG1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIGF2YWlsYWJpbGl0eSBvZiBkYXRhIGluIHBhcnRpdGlvbnMuXG4gICAgICogKiBTSVpFTUFQICZuZGFzaDsgZmV0Y2hlcyBhIGhlYXRtYXAgdGhhdCByZXByZXNlbnRzIGEgcGFydGl0aW9uIHNpemUuXG4gICAgICogKiBUSU1FTUFQICZuZGFzaDsgZmV0Y2hlcyBhIGhlYXRtYXAgdGhhdCByZXByZXNlbnRzIHBhcnRpdGlvbiB1cGRhdGUgdGltZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0aXN0aWNzUmVxdWVzdCBUaGUgW1tTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlIHdpdGggdGhlIHJlcXVlc3RlZCBzZXR0aW5ncy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIFtTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlIHdpdGggdGhlIHJlcXVlc3RlZCBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBnZXRTdGF0aXN0aWNzKHN0YXRpc3RpY3NSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcklkID0gc3RhdGlzdGljc1JlcXVlc3QuZ2V0TGF5ZXJJZCgpO1xuICAgICAgICAgICAgY29uc3QgY2F0YWxvZ0hSTiA9IHN0YXRpc3RpY3NSZXF1ZXN0LmdldENhdGFsb2dIcm4oKTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVtYXAgPSBzdGF0aXN0aWNzUmVxdWVzdC5nZXRUeXBlbWFwKCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhbGV2ZWwgPSBzdGF0aXN0aWNzUmVxdWVzdC5nZXREYXRhTGV2ZWwoKTtcbiAgICAgICAgICAgIGlmIChjYXRhbG9nSFJOID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBObyBjYXRhbG9nSHJuIHByb3ZpZGVkYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxheWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGxheWVySWQgcHJvdmlkZWRgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTm8gdHlwZW1hcCBwcm92aWRlZGApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvdmVyYWdlUmVxdWVzdEJ1aWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKGNhdGFsb2dIUk4pLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW1hcCkge1xuICAgICAgICAgICAgICAgIGNhc2Ugb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuQ292ZXJhZ2VEYXRhVHlwZS5CSVRNQVA6XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkNvdmVyYWdlQXBpLmdldERhdGFDb3ZlcmFnZVRpbGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2Ugb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuQ292ZXJhZ2VEYXRhVHlwZS5TSVpFTUFQOlxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5Db3ZlcmFnZUFwaS5nZXREYXRhQ292ZXJhZ2VTaXplTWFwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLkNvdmVyYWdlRGF0YVR5cGUuVElNRU1BUDpcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQ292ZXJhZ2VBcGkuZ2V0RGF0YUNvdmVyYWdlVGltZU1hcDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgSW5jb3JyZWN0IHR5cGVtYXAgcHJvdmlkZWQ6ICR7dHlwZW1hcH1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdChjb3ZlcmFnZVJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgbGF5ZXJJZCxcbiAgICAgICAgICAgICAgICBkYXRhbGV2ZWwsXG4gICAgICAgICAgICAgICAgY2F0YWxvZ0hSTlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRSZXF1ZXN0QnVpbGRlcihocm4pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJzdGF0aXN0aWNzXCIsIHRoaXMuYXBpVmVyc2lvbiwgdGhpcy5zZXR0aW5ncywgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcoaHJuKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuU3RhdGlzdGljc0NsaWVudCA9IFN0YXRpc3RpY3NDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3RhdGlzdGljc1JlcXVlc3QgPSBleHBvcnRzLkNvdmVyYWdlRGF0YVR5cGUgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIEEgbWFwIHR5cGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIFN0YXRpc3RpY3MgU2VydmljZS5cbiAqL1xudmFyIENvdmVyYWdlRGF0YVR5cGU7XG4oZnVuY3Rpb24gKENvdmVyYWdlRGF0YVR5cGUpIHtcbiAgICAvKiogUmVwcmVzZW50cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGRhdGEgaW4gcGFydGl0aW9ucy4gKi9cbiAgICBDb3ZlcmFnZURhdGFUeXBlW1wiQklUTUFQXCJdID0gXCJ0aWxlbWFwXCI7XG4gICAgLyoqIEEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgYSBwYXJ0aXRpb24gc2l6ZS4gKi9cbiAgICBDb3ZlcmFnZURhdGFUeXBlW1wiU0laRU1BUFwiXSA9IFwiaGVhdG1hcC9zaXplXCI7XG4gICAgLyoqIEEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgcGFydGl0aW9uIHVwZGF0ZSB0aW1lLiAqL1xuICAgIENvdmVyYWdlRGF0YVR5cGVbXCJUSU1FTUFQXCJdID0gXCJoZWF0bWFwL2FnZVwiO1xufSkoQ292ZXJhZ2VEYXRhVHlwZSA9IGV4cG9ydHMuQ292ZXJhZ2VEYXRhVHlwZSB8fCAoZXhwb3J0cy5Db3ZlcmFnZURhdGFUeXBlID0ge30pKTtcbi8qKlxuICogIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgc3RhdGlzdGljcyBmcm9tIHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFN0YXRpc3RpY3NSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIFtbSFJOXV0gc3RyaW5nIG9mIHRoZSBjYXRhbG9nIEhFUkUgUmVzb3VyY2UgTmFtZShIUk4pIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgW1tIUk5dXSBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0Q2F0YWxvZ0hybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ0hybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxheWVyIElEIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGxheWVyIElEIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRMYXllcklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllcklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgbWFwIHR5cGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIFN0YXRpc3RpY3MgU2VydmljZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHJlcXVlc3RlZCBtYXAgdHlwZS5cbiAgICAgKi9cbiAgICBnZXRUeXBlbWFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgdGlsZSBsZXZlbCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICogQHJldHVybiBUaGUgcmVxdWVzdGVkIHRpbGUgbGV2ZWwgc3RyaW5nLlxuICAgICAqL1xuICAgIGdldERhdGFMZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUxldmVsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGNhdGFsb2cgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pLlxuICAgICAqXG4gICAgICogQHBhcmFtIGhybiBUaGUgY2F0YWxvZyBIUk4uXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQ2F0YWxvZ0hybihocm4pIHtcbiAgICAgICAgdGhpcy5jYXRhbG9nSHJuID0gaHJuLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHJlcXVlc3RlZCBgbGF5ZXJJZGAgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1N0YXRpc3RpY3NSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhMYXllcklkKGxheWVySWQpIHtcbiAgICAgICAgdGhpcy5sYXllcklkID0gbGF5ZXJJZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgYGNvdmVyYWdlRGF0YVR5cGVgIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb3ZlcmFnZURhdGFUeXBlIFBvaW50cyBhdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBTdGF0aXN0aWMgQVBJIGVuZHBvaW50czpcbiAgICAgKiAqIEJJVE1BUCAmbmRhc2g7IGZldGNoZXMgYSBiaXRtYXAgdGhhdCByZXByZXNlbnRzIHRoZSBhdmFpbGFiaWxpdHkgb2YgZGF0YSBpbiBwYXJ0aXRpb25zLlxuICAgICAqICogU0laRU1BUCAmbmRhc2g7IGZldGNoZXMgYSBoZWF0bWFwIHRoYXQgcmVwcmVzZW50cyBhIHBhcnRpdGlvbiBzaXplLlxuICAgICAqICogVElNRU1BUCAmbmRhc2g7IGZldGNoZXMgYSBoZWF0bWFwIHRoYXQgcmVwcmVzZW50cyBwYXJ0aXRpb24gdXBkYXRlIHRpbWUuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoVHlwZW1hcChjb3ZlcmFnZURhdGFUeXBlKSB7XG4gICAgICAgIHRoaXMudHlwZW1hcCA9IGNvdmVyYWdlRGF0YVR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGBkYXRhTGV2ZWxgIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhTGV2ZWwgZGF0YUxldmVsIFNwZWNpZnkgdGhlIHRpbGUgbGV2ZWwgYWJvdXQgd2hpY2ggeW91IHdhbnQgdG8gZ2V0IHN0YXRpc3RpY2FsIGRhdGEuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoRGF0YUxldmVsKGRhdGFMZXZlbCkge1xuICAgICAgICB0aGlzLmRhdGFMZXZlbCA9IE51bWJlcihkYXRhTGV2ZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEudmFsaWRhdGVCaWxsaW5nVGFnKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbn1cbmV4cG9ydHMuU3RhdGlzdGljc1JlcXVlc3QgPSBTdGF0aXN0aWNzUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdHJlYW1MYXllckNsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhIHN0cmVhbSBsYXllci5cbiAqL1xuY2xhc3MgU3RyZWFtTGF5ZXJDbGllbnQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIFtbU3RyZWFtTGF5ZXJDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXMgVGhlIFtbU3RyZWFtTGF5ZXJDbGllbnRQYXJhbXNdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW1N0cmVhbUxheWVyQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuYXBpVmVyc2lvbiA9IFwidjJcIjtcbiAgICAgICAgdGhpcy5jYXRhbG9nSHJuID0gcGFyYW1zLmNhdGFsb2dIcm47XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IHBhcmFtcy5sYXllcklkO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gcGFyYW1zLnNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIG1lc3NhZ2UgY29uc3VtcHRpb24gZnJvbSBhIHNwZWNpZmljIHN0cmVhbSBsYXllci4gVXNlIHRoZSBiYXNlIHBhdGggcmV0dXJuZWQgZnJvbSB0aGUgQVBJIExvb2t1cCBzZXJ2aWNlLlxuICAgICAqIEZvciBtb2RlID0gcGFyYWxsZWwsIG9uZSB1bml0IG9mIHBhcmFsbGVsaXNtIGN1cnJlbnRseSBlcXVhbHMgMSBNQnBzIGluYm91bmQgb3IgMiBNQnBzIG91dGJvdW5kLFxuICAgICAqIHdoaWNoZXZlciBpcyBncmVhdGVyLCByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXG4gICAgICogVGhlIG51bWJlciBvZiBzdWJzY3JpcHRpb25zIHdpdGhpbiB0aGUgc2FtZSBncm91cCBjYW5ub3QgZXhjZWVkIHRoZSBwYXJhbGxlbGlzbSBhbGxvd2VkLlxuICAgICAqIEZvciBtb3JlIGRldGFpbHMgc2VlXG4gICAgICogW0dldCBEYXRhIGZyb20gYSBTdHJlYW0gTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1hcGkvZGF0YV9kZXZfZ3VpZGUvcmVzdC9nZXR0aW5nLWRhdGEtc3RyZWFtLmh0bWwpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tTdWJzY3JpYmVSZXF1ZXN0XV0gaW5zdGFuY2Ugb2YgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFN1YnNjcmlwdGlvbiBJZFxuICAgICAqL1xuICAgIHN1YnNjcmliZShyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSB5aWVsZCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJzdHJlYW1cIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCB0aGlzLmNhdGFsb2dIcm4sIGFib3J0U2lnbmFsKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgY29uc3Qgc3Vic2NyaWJ0aW9uUmVxdWVzdFBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICAgICAgbW9kZTogcmVxdWVzdC5nZXRNb2RlKCksXG4gICAgICAgICAgICAgICAgY29uc3VtZXJJZDogcmVxdWVzdC5nZXRDb25zdW1lcklkKCksXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHJlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKSxcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25Qcm9wZXJ0aWVzOiByZXF1ZXN0LmdldFN1YnNjcmlwdGlvblByb3BlcnRpZXMoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvblJlc3VsdCA9IHlpZWxkIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuU3RyZWFtQXBpLnN1YnNjcmliZShyZXF1ZXN0QnVpbGRlciwgc3Vic2NyaWJ0aW9uUmVxdWVzdFBhcmFtcylcbiAgICAgICAgICAgICAgICAudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeENvcnJlbGF0aW9uSWQgPSByZXMuaGVhZGVycy5nZXQoXCJYLUNvcnJlbGF0aW9uLUlkXCIpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSB5aWVsZCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoT2JqZWN0LmFzc2lnbih7IHhDb3JyZWxhdGlvbklkIH0sIHJlc3BvbnNlRGF0YSkpO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB4Q29ycmVsYXRpb25JZFxuICAgICAgICAgICAgdGhpcy54Q29ycmVsYXRpb25JZCA9IHN1YnNjcmlwdGlvblJlc3VsdC54Q29ycmVsYXRpb25JZDtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJ0aW9uTm9kZUJhc2VVcmwgPSBzdWJzY3JpcHRpb25SZXN1bHQubm9kZUJhc2VVUkw7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN1YnNjcmlwdGlvblJlc3VsdC5zdWJzY3JpcHRpb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdW1lcyBkYXRhIGZyb20gYSBsYXllci4gUmV0dXJucyBtZXNzYWdlcyBmcm9tIGEgc3RyZWFtIGxheWVyLlxuICAgICAqIElmIHRoZSBkYXRhIHNpemUgaXMgbGVzcyB0aGFuIDEgTUIsIHRoZSBkYXRhIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkLlxuICAgICAqIElmIHRoZSBkYXRhIHNpemUgaXMgZ3JlYXRlciB0aGFuIDEgTUIsIGEgZGF0YSBoYW5kbGUgd2lsbCBiZSByZXR1cm5lZCBwb2ludGluZyB0byB0aGUgb2JqZWN0IHN0b3JlZCBpbiB0aGUgQmxvYiBzdG9yZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBbW1BvbGxSZXF1ZXN0XV0gaW5zdGFuY2Ugb2YgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIE1lc3NhZ2VzIFtbU3RyZWFtQXBpLk1lc3NhZ2VzXV0gZnJvbSBhIHN0cmVhbSBsYXllclxuICAgICAqL1xuICAgIHBvbGwocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldE1vZGUoKSA9PT0gXCJwYXJhbGxlbFwiICYmICFyZXF1ZXN0LmdldFN1YnNjcmlwdGlvbklkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRXJyb3I6IGZvciAncGFyYWxsZWwnIG1vZGUgJ3N1YnNjcmlwdGlvbklkJyBpcyByZXF1aXJlZC5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnN1YnNjcmlidGlvbk5vZGVCYXNlVXJsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTm8gdmFsaWQgbm9kZUJhc2V1cmwgcHJvdmlkZWQgZm9yIHRoZSBzdWJzY3JpYnRpb24gaWQ9JHtyZXF1ZXN0LmdldFN1YnNjcmlwdGlvbklkKCl9LCBwbGVhc2UgY2hlY2sgeW91ciBzdWJzY3JpYnRpb25gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IG5ldyBvbHBfc2RrX2NvcmVfMS5EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcih0aGlzLnNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCwgdGhpcy5zZXR0aW5ncy50b2tlbiwgYWJvcnRTaWduYWwpO1xuICAgICAgICAgICAgY29uc3QgY29uc3VtZURhdGFQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgICAgIG1vZGU6IHJlcXVlc3QuZ2V0TW9kZSgpLFxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiByZXF1ZXN0LmdldFN1YnNjcmlwdGlvbklkKCksXG4gICAgICAgICAgICAgICAgeENvcnJlbGF0aW9uSWQ6IHRoaXMueENvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBjb25zdW1lUmVzcG9uc2UgPSB5aWVsZCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlN0cmVhbUFwaS5jb25zdW1lRGF0YShyZXF1ZXN0QnVpbGRlciwgY29uc3VtZURhdGFQYXJhbXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgeENvcnJlbGF0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiWC1Db3JyZWxhdGlvbi1JZFwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhICYmIGRhdGEubWVzc2FnZXMgPyBkYXRhLm1lc3NhZ2VzIDogW11cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgLy8gVXBkYXRlIHhDb3JyZWxhdGlvbklkXG4gICAgICAgICAgICB0aGlzLnhDb3JyZWxhdGlvbklkID0gY29uc3VtZVJlc3BvbnNlLnhDb3JyZWxhdGlvbklkO1xuICAgICAgICAgICAgLy8gQ29tbWl0IG9mZnNldHNcbiAgICAgICAgICAgIGNvbnN0IGxhdGVzdE9mZnNldHMgPSBjb25zdW1lUmVzcG9uc2UuZGF0YVxuICAgICAgICAgICAgICAgIC5tYXAobXNnID0+IG1zZy5vZmZzZXQpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW2N1cnIucGFydGl0aW9uXSA9XG4gICAgICAgICAgICAgICAgICAgIGFjY1tjdXJyLnBhcnRpdGlvbl0gPiBjdXJyLm9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhY2NbY3Vyci5wYXJ0aXRpb25dXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnIub2Zmc2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICB5aWVsZCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlN0cmVhbUFwaS5kb0NvbW1pdE9mZnNldHMocmVxdWVzdEJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBjb21taXRPZmZzZXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldHM6IE9iamVjdC5rZXlzKGxhdGVzdE9mZnNldHMpLm1hcChrZXkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbjogK2tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogbGF0ZXN0T2Zmc2V0c1trZXldXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHJlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKSxcbiAgICAgICAgICAgICAgICBtb2RlOiByZXF1ZXN0LmdldE1vZGUoKSxcbiAgICAgICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICAgICAgeENvcnJlbGF0aW9uSWQ6IHRoaXMueENvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb21taXQgb2Zmc2V0cyB1bnN1Y2Nlc3NmdWwsIGVycm9yPSR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29uc3VtZVJlc3BvbnNlLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWV0aG9kIGRlbGV0ZXMgYSBzdWJzY3JpcHRpb24gdG8gYSBsYXllci4gVGhpcyBvcGVyYXRpb24gcmVtb3ZlcyB0aGUgc3Vic2NyaXB0aW9uIGZyb20gdGhlIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tVbnN1YnNjcmliZVJlcXVlc3RdXSBpbnN0YW5jZSBvZiB0aGUgY29uZmlndXJlZCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqL1xuICAgIHVuc3Vic2NyaWJlKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRNb2RlKCkgPT09IFwicGFyYWxsZWxcIiAmJiAhcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVycm9yOiBmb3IgJ3BhcmFsbGVsJyBtb2RlICdzdWJzY3JpcHRpb25JZCcgaXMgcmVxdWlyZWQuXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFN1YnNjcmlidGlvbiBlcnJvci4gTm8gdmFsaWQgbm9kZUJhc2V1cmwgcHJvdmlkZWQgZm9yIHRoZSBzdWJzY3JpYnRpb24gaWQ9JHtyZXF1ZXN0LmdldFN1YnNjcmlwdGlvbklkKCl9LCBwbGVhc2UgY2hlY2sgeW91ciBzdWJzY3JpYnRpb25gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IG5ldyBvbHBfc2RrX2NvcmVfMS5EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcih0aGlzLnNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCwgdGhpcy5zZXR0aW5ncy50b2tlbiwgYWJvcnRTaWduYWwpO1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuU3RyZWFtQXBpLmRlbGV0ZVN1YnNjcmlwdGlvbihyZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICBtb2RlOiByZXF1ZXN0LmdldE1vZGUoKSxcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpLFxuICAgICAgICAgICAgICAgIHhDb3JyZWxhdGlvbklkOiB0aGlzLnhDb3JyZWxhdGlvbklkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgcGFydGl0aW9uIGRhdGEgdXNpbmcgZGF0YSBoYW5kbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBkYXRhIG9mIHBhcnRpdGlvbiBtZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIGZyb20gdGhlIHJlcXVlc3RlZCBwYXJ0aXRpb24uXG4gICAgICovXG4gICAgZ2V0RGF0YShtZXNzYWdlLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKCFtZXNzYWdlLm1ldGFEYXRhIHx8ICFtZXNzYWdlLm1ldGFEYXRhLmRhdGFIYW5kbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gZGF0YSBoYW5kbGUgZm9yIHRoaXMgcGFydGl0aW9uXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCdWlsZGVyID0geWllbGQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwiYmxvYlwiLCBcInYxXCIsIHRoaXMuc2V0dGluZ3MsIHRoaXMuY2F0YWxvZ0hybiwgYWJvcnRTaWduYWwpLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5CbG9iQXBpLmdldEJsb2IocmVxdWVzdEJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBkYXRhSGFuZGxlOiBtZXNzYWdlLm1ldGFEYXRhLmRhdGFIYW5kbGUsXG4gICAgICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBhbGxvd3MgdG8gc3RhcnQgcmVhZGluZyBkYXRhIGZyb20gYSBzcGVjaWZpZWQgb2Zmc2V0LlxuICAgICAqIFRoZSBtZXNzYWdlIHBvaW50ZXIgY2FuIGJlIG1vdmVkIHRvIGFueSBvZmZzZXQgaW4gdGhlIGxheWVyICh0b3BpYykuXG4gICAgICogTWVzc2FnZSBjb25zdW1wdGlvbiB3aWxsIHN0YXJ0IGZyb20gdGhhdCBvZmZzZXQuIE9uY2UgeW91IHNlZWsgdG8gYW4gb2Zmc2V0LFxuICAgICAqIHRoZXJlIGlzIG5vIHJldHVybmluZyB0byB0aGUgaW5pdGlhbCBvZmZzZXQsIHVubGVzcyB0aGUgaW5pdGlhbCBvZmZzZXQgaXMgc2F2ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tTZWVrUmVxdWVzdF1dIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmVkIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSB3aXRoIHN0YXR1cyAyMDAgaWYgc3VjY2Vzcy5cbiAgICAgKi9cbiAgICBzZWVrKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRzT2JqZWN0ID0gcmVxdWVzdC5nZXRTZWVrT2Zmc2V0cygpO1xuICAgICAgICAgICAgaWYgKCFvZmZzZXRzT2JqZWN0IHx8XG4gICAgICAgICAgICAgICAgIW9mZnNldHNPYmplY3Qub2Zmc2V0cyB8fFxuICAgICAgICAgICAgICAgICFvZmZzZXRzT2JqZWN0Lm9mZnNldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVycm9yOiBvZmZzZXRzIGFyZSByZXF1aXJlZC5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0TW9kZSgpID09PSBcInBhcmFsbGVsXCIgJiYgIXJlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFcnJvcjogZm9yICdwYXJhbGxlbCcgbW9kZSAnc3Vic2NyaXB0aW9uSWQnIGlzIHJlcXVpcmVkLlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3Vic2NyaWJ0aW9uTm9kZUJhc2VVcmwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBTdWJzY3JpYnRpb24gZXJyb3IuIE5vIHZhbGlkIG5vZGVCYXNldXJsIHByb3ZpZGVkIGZvciB0aGUgc3Vic2NyaWJ0aW9uIGlkPSR7cmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpfSwgcGxlYXNlIGNoZWNrIHlvdXIgc3Vic2NyaWJ0aW9uYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSBuZXcgb2xwX3Nka19jb3JlXzEuRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIodGhpcy5zZXR0aW5ncy5kb3dubG9hZE1hbmFnZXIsIHRoaXMuc3Vic2NyaWJ0aW9uTm9kZUJhc2VVcmwsIHRoaXMuc2V0dGluZ3MudG9rZW4sIGFib3J0U2lnbmFsKTtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlN0cmVhbUFwaS5zZWVrVG9PZmZzZXQocmVxdWVzdEJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICAgICAgc2Vla09mZnNldHM6IG9mZnNldHNPYmplY3QsXG4gICAgICAgICAgICAgICAgbW9kZTogcmVxdWVzdC5nZXRNb2RlKCksXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHJlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKSxcbiAgICAgICAgICAgICAgICB4Q29ycmVsYXRpb25JZDogdGhpcy54Q29ycmVsYXRpb25JZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnhDb3JyZWxhdGlvbklkID1cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJYLUNvcnJlbGF0aW9uLUlkXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhDb3JyZWxhdGlvbklkO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gUHJvbWlzZS5yZWplY3QoZXJyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuU3RyZWFtTGF5ZXJDbGllbnQgPSBTdHJlYW1MYXllckNsaWVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3Vic2NyaWJlUmVxdWVzdCA9IHZvaWQgMDtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBTdHJlYW0gU2VydmljZS5cbiAqL1xuY2xhc3MgU3Vic2NyaWJlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2NyaXB0aW9uIG1vZGUgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIG1vZGUuXG4gICAgICovXG4gICAgZ2V0TW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tTdWJzY3JpYmVSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhNb2RlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN1YnNjcmlwdGlvbiBpZCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gaWQuXG4gICAgICovXG4gICAgZ2V0U3Vic2NyaXB0aW9uSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1N1YnNjcmliZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFN1YnNjcmlwdGlvbklkKGlkKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbnN1bWVyIGlkIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNvbnN1bWVyIGlkLlxuICAgICAqL1xuICAgIGdldENvbnN1bWVySWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN1bWVySWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgY29uc3VtZXIgaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN1bWVyIGlkLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1N1YnNjcmliZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aENvbnN1bWVySWQoaWQpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lcklkID0gaWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb25Qcm9wZXJ0aWVzIGZvciB0aGUgcmVxdWVzdCAtIGNvbnN1bWVyIHByb3BlcnRpZXMgdG8gdXNlIGZvciB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHN1YnNjcmlwdGlvblByb3BlcnRpZXMuXG4gICAgICovXG4gICAgZ2V0U3Vic2NyaXB0aW9uUHJvcGVydGllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uUHJvcGVydGllcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wcyBUaGUgc3Vic2NyaXB0aW9uUHJvcGVydGllcyAtIGNvbnN1bWVyIHByb3BlcnRpZXMgdG8gdXNlIGZvciB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbc3Vic2NyaXB0aW9uIHByb3BlcnRpZXNdXG4gICAgICogKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1hcGkvZGF0YV9kZXZfZ3VpZGUvcmVzdC9nZXR0aW5nLWRhdGEtc3RyZWFtLmh0bWwjc3Vic2NyaXB0aW9uLXByb3BlcnRpZXMpXG4gICAgICogQHJldHVybnMgVGhlIFtbU3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoU3Vic2NyaXB0aW9uUHJvcGVydGllcyhwcm9wcykge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblByb3BlcnRpZXMgPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuZXhwb3J0cy5TdWJzY3JpYmVSZXF1ZXN0ID0gU3Vic2NyaWJlUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdW1tYXJ5UmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBhIHN1bW1hcnkgZnJvbSB0aGUgcGxhdGZvcm0gU3RhdGlzdGljcyBTZXJ2aWNlLlxuICovXG5jbGFzcyBTdW1tYXJ5UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBbW0hSTl1dIHN0cmluZyBvZiB0aGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUoSFJOKSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIFtbSFJOXV0gc3RyaW5nLlxuICAgICAqL1xuICAgIGdldENhdGFsb2dIcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGFsb2dIcm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBsYXllciBJRCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBsYXllciBJRCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0TGF5ZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBjYXRhbG9nIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBocm4gVGhlIGNhdGFsb2cgSFJOLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1N1bW1hcnlSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhDYXRhbG9nSHJuKGhybikge1xuICAgICAgICB0aGlzLmNhdGFsb2dIcm4gPSBocm4udG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgYGxheWVySWRgIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIFtbU3VtbWFyeVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aExheWVySWQobGF5ZXJJZCkge1xuICAgICAgICB0aGlzLmxheWVySWQgPSBsYXllcklkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tTdW1tYXJ5UmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEudmFsaWRhdGVCaWxsaW5nVGFnKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbn1cbmV4cG9ydHMuU3VtbWFyeVJlcXVlc3QgPSBTdW1tYXJ5UmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UaWxlUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCB0aGUgdGlsZSBibG9iIGRhdGEgYnkgdGhlIHRpbGUga2V5LlxuICpcbiAqIFRoaXMgY2xhc3Mgd29ya3Mgb25seSB3aXRoIHZlcnNpb25lZCBhbmQgdm9sYXRpbGUgbGF5ZXJzIHdoZXJlIHRoZSBwYXJ0aXRpb25pbmcgc2NoZW1lIGlzIEhFUkUgVGlsZS5cbiAqXG4gKiBZb3UgY2FuIGluaXRpYWxpemUgdGhlIHJlcXVlc3QgY2xhc3Mgb25jZSBmb3IgYSBzcGVjaWZpYyBjYXRhbG9nLCBsYXllciwgYW5kIHZlcnNpb24gKEBzZWUgW1tUaWxlUmVxdWVzdFBhcmFtc11dKVxuICogYW5kIHVzZSBpdCBtYW55IHRpbWVzIHRvIGdldCB0aGUgYSB0aWxlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgXG4gKiAgY29uc3QgcGFyYW1zOiBUaWxlUmVxdWVzdFBhcmFtcyA9IHtcbiAqICAgICAgIHNldHRpbmdzOiBcIiUgeW91ciBgT2xwQ2xpZW50U2V0dGluZ3NgIGluc3RhbmNlICUgXCIsXG4gKiAgICAgICBjYXRhbG9nSHJuOiBcIiUgdGhlIEhSTiBpbnN0YW5jZSBvZiB5b3VyIGNhdGFsb2cgJVwiLFxuICogICAgICAgbGF5ZXJJZDogXCIlIHlvdXIgbGF5ZXIgSUQgJVwiLFxuICogICAgICAgbGF5ZXJUeXBlOiBcIiUgdmVyc2lvbmVkIG9yIHZvbGF0aWxlICVcIixcbiAqICAgICAgIGNhdGFsb2dWZXJzaW9uOiBcIiUgdGhlIGNhdGFsb2cgdmVyc2lvbjsgZm9yIHZlcnNpb25lZCBsYXllcnMsIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyB1c2VkIGJ5IGRlZmF1bHQgJVwiXG4gKiAgIH1cbiAqXG4gKiAgY29uc3QgcmVxdWVzdCA9IG5ldyBUaWxlUmVxdWVzdChwYXJhbXMpO1xuICpcbiAqICBjb25zdCByZXF1ZXN0Rm9yVGlsZTEgPSByZXF1ZXN0LndpdGhUaWxlS2V5KHlvdXJUaWxlS2V5MSk7XG4gKiAgY29uc3QgcmVxdWVzdEZvclRpbGUyID0gcmVxdWVzdC53aXRoVGlsZUtleSh5b3VyVGlsZUtleTIpO1xuICpcbiAqIGBgYFxuICovXG5jbGFzcyBUaWxlUmVxdWVzdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb24gPSBvbHBfc2RrX2NvcmVfMS5GZXRjaE9wdGlvbnMuT25saW5lSWZOb3RGb3VuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBnZW9tZXRyaWMgYXJlYSByZXByZXNlbnRlZCBhcyBhIEhFUkUgdGlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBxdWFkS2V5IEFkZHJlc3NlcyBhIHRpbGUgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbVGlsZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFRpbGVLZXkocXVhZEtleSkge1xuICAgICAgICB0aGlzLnF1YWRLZXkgPSBxdWFkS2V5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDTigJMxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQeKAk1ph4oCTejDigJM5XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1RpbGVSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS52YWxpZGF0ZUJpbGxpbmdUYWcodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgW1tRdWFkS2V5XV0gb2JqZWN0IGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgW1tRdWFkS2V5XV0gb2JqZWN0LlxuICAgICAqL1xuICAgIGdldFRpbGVLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1YWRLZXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZldGNoIG9wdGlvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIHNldCB0aGUgc291cmNlIGZyb21cbiAgICAgKiB3aGljaCBkYXRhIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgICAqXG4gICAgICogQHNlZSBgZ2V0RmV0Y2hPcHRpb24oKWAgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBgRmV0Y2hPcHRpb25gIGVudW0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoZSB1cGRhdGVkIGBQYXJ0aXRpb25zUmVxdWVzdGAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgd2l0aEZldGNoT3B0aW9uKG9wdGlvbikge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9uID0gb3B0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgY29udHJvbHMgaG93IHJlcXVlc3RzIGFyZSBoYW5kbGVkLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgb3B0aW9uIGlzIGBPbmxpbmVJZk5vdEZvdW5kYC4gSXQgcXVlcmllcyB0aGUgbmV0d29yayBpZlxuICAgICAqIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgbm90IGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGZldGNoIG9wdGlvbi5cbiAgICAgKi9cbiAgICBnZXRGZXRjaE9wdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hPcHRpb247XG4gICAgfVxufVxuZXhwb3J0cy5UaWxlUmVxdWVzdCA9IFRpbGVSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5VbnN1YnNjcmliZVJlcXVlc3QgPSB2b2lkIDA7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byB0aGUgcGxhdGZvcm0gU3RyZWFtIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFVuc3Vic2NyaWJlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2NyaXB0aW9uIG1vZGUgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIG1vZGUuXG4gICAgICovXG4gICAgZ2V0TW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tVbnN1YnNjcmliZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aE1vZGUobW9kZSkge1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2NyaXB0aW9uIGlkIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKi9cbiAgICBnZXRTdWJzY3JpcHRpb25JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIFRoZSBzdWJzY3JpcHRpb24gaWQuXG4gICAgICogQHJldHVybnMgVGhlIFtbVW5zdWJzY3JpYmVSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTdWJzY3JpcHRpb25JZChpZCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkID0gaWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmV4cG9ydHMuVW5zdWJzY3JpYmVSZXF1ZXN0ID0gVW5zdWJzY3JpYmVSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVmVyc2lvbmVkTGF5ZXJDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBEZXNjcmliZXMgYSB2ZXJzaW9uZWQgbGF5ZXIgYW5kIHByb3ZpZGVzIHRoZSBwb3NzaWJpbGl0eSB0byBnZXQgcGFydGl0aW9ucyBtZXRhZGF0YSBhbmQgZGF0YS5cbiAqL1xuY2xhc3MgVmVyc2lvbmVkTGF5ZXJDbGllbnQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIFtbVmVyc2lvbmVkTGF5ZXJDbGllbnRdXSBpbnN0YW5jZSB3aXRoIFZlcnNpb25lZExheWVyQ2xpZW50UGFyYW1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBwYXJhbWV0ZXJzIGZvciB1c2UgdG8gaW5pdGlhbGl6ZSBWZXJzaW9uTGF5ZXJDbGllbnQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuYXBpVmVyc2lvbiA9IFwidjFcIjtcbiAgICAgICAgdGhpcy5ocm4gPSBwYXJhbXMuY2F0YWxvZ0hybi50b1N0cmluZygpO1xuICAgICAgICB0aGlzLmxheWVySWQgPSBwYXJhbXMubGF5ZXJJZDtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHBhcmFtcy5zZXR0aW5ncztcbiAgICAgICAgaWYgKHBhcmFtcy52ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnZlcnNpb24gPj0gMCkge1xuICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gcGFyYW1zLnZlcnNpb247XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGJyaWVmIEZldGNoZXMgZGF0YSBvZiBhIHRpbGUgb3IgaXRzIGNsb3Nlc3QgYW5jZXN0b3IuXG4gICAgICogVXNlIHRoaXMgQVBJIGZvciB0aWxlLXRyZWUgc3RydWN0dXJlcyB3aGVyZSBjaGlsZHJlbiB0aWxlIGRhdGEgaXMgYWdncmVnYXRlZCBhbmQgc3RvcmVkIGluIHBhcmVudCB0aWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBgVGlsZVJlcXVlc3RgIGluc3RhbmNlIHRoYXQgY29udGFpbnMgYSBjb21wbGV0ZSBzZXRcbiAgICAgKiBvZiByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaWxlIGRhdGEgKGlmIGl0IGV4aXN0cykgb3IgdGhlIG5lYXJlc3QgcGFyZW50IHRpbGUgZGF0YVxuICAgICAqL1xuICAgIGdldEFnZ3JlZ2F0ZWREYXRhKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgY2F0YWxvZ1ZlcnNpb24gPSB0aGlzLnZlcnNpb247XG4gICAgICAgICAgICBpZiAoY2F0YWxvZ1ZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNhdGFsb2dWZXJzaW9uID0geWllbGQgdGhpcy5nZXRMYXRlc3RWZXJzaW9uKHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBjYXRhbG9nSHJuOiBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksXG4gICAgICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgICAgIGxheWVyVHlwZTogXCJ2ZXJzaW9uZWRcIixcbiAgICAgICAgICAgICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5ncyxcbiAgICAgICAgICAgICAgICBjYXRhbG9nVmVyc2lvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5nZXRUaWxlKHJlcXVlc3QsIHBhcmFtcywgYWJvcnRTaWduYWwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBwYXJ0aXRpb24gZGF0YSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOiBJRCwgcXVhZGtleSwgb3IgZGF0YSBoYW5kbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVJlcXVlc3QgVGhlIFtbRGF0YVJlcXVlc3RdXSBpbnN0YW5jZSBvZiB0aGUgY29uZmlndXJlZCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgZGF0YSBmcm9tIHRoZSByZXF1ZXN0ZWQgcGFydGl0aW9uLlxuICAgICAqL1xuICAgIGdldERhdGEoZGF0YVJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhSGFuZGxlID0gZGF0YVJlcXVlc3QuZ2V0RGF0YUhhbmRsZSgpO1xuICAgICAgICAgICAgaWYgKGRhdGFIYW5kbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFBhcnRpdGlvbihkYXRhSGFuZGxlLCBhYm9ydFNpZ25hbCwgZGF0YVJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbklkID0gZGF0YVJlcXVlc3QuZ2V0UGFydGl0aW9uSWQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGZldGNoIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgbG9jayBpdCB0byB0aGUgaW5zdGFuY2UuXG4gICAgICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0geWllbGQgdGhpcy5nZXRMYXRlc3RWZXJzaW9uKGRhdGFSZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBsYXRlc3QgdmVyc2lvbi4gUGxlYXNlIHByb3ZpZGUgdmVyc2lvbiB0byB0aGUgRGF0YVJlcXVlc3Qgb3IgbG9jayB2ZXJzaW9uIGluIHRoZSBjb25zdHJ1Y3RvcmApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJ0aXRpb25JZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbklkRGF0YUhhbmRsZSA9IHlpZWxkIHRoaXMuZ2V0RGF0YUhhbmRsZUJ5UGFydGl0aW9uSWQocGFydGl0aW9uSWQsIGRhdGFSZXF1ZXN0LmdldEZldGNoT3B0aW9uKCksIGRhdGFSZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFBhcnRpdGlvbihwYXJ0aXRpb25JZERhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBkYXRhUmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTm8gZGF0YSBwcm92aWRlZC4gQWRkIGRhdGFIYW5kbGUsIHBhcnRpdGlvbklkIG9yIHF1YWRLZXkgdG8gdGhlIERhdGFSZXF1ZXN0IG9iamVjdGApKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldFBhcnRpdGlvbnMocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGZldGNoIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgbG9jayBpdCB0byB0aGUgaW5zdGFuY2UuXG4gICAgICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0geWllbGQgdGhpcy5nZXRMYXRlc3RWZXJzaW9uKHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIHJldHJpZXZlIGxhdGVzdCB2ZXJzaW9uLiBQbGVhc2UgcHJvdmlkZSB2ZXJzaW9uIHRvIHRoZSBSZXF1ZXN0IG9yIGxvY2sgdmVyc2lvbiBpbiB0aGUgY29uc3RydWN0b3JgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1YWRLZXkgPSByZXF1ZXN0LmdldFF1YWRLZXkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXF1YWRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgUXVhZEtleVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1YWRUcmVlSW5kZXhSZXF1ZXN0ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1YWRUcmVlSW5kZXhSZXF1ZXN0KG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgdGhpcy5sYXllcklkLCBcInZlcnNpb25lZFwiKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFF1YWRLZXkocXVhZEtleSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhWZXJzaW9uKHRoaXMudmVyc2lvbilcbiAgICAgICAgICAgICAgICAgICAgLndpdGhEZXB0aChyZXF1ZXN0LmdldERlcHRoKCkpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoQWRkaXRpb25hbEZpZWxkcyhyZXF1ZXN0LmdldEFkZGl0aW9uYWxGaWVsZHMoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmZldGNoUXVhZFRyZWVJbmRleChxdWFkVHJlZUluZGV4UmVxdWVzdCwgYWJvcnRTaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0UGFydGl0aW9uSWRzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWVyeUNsaWVudCh0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnlDbGllbnQuZ2V0UGFydGl0aW9uc0J5SWQocmVxdWVzdCwgdGhpcy5sYXllcklkLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsLCB0aGlzLnZlcnNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkodGhpcy5zZXR0aW5ncy5jYWNoZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRGZXRjaE9wdGlvbigpICE9PSBvbHBfc2RrX2NvcmVfMS5GZXRjaE9wdGlvbnMuT25saW5lT25seSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnMgPSBjYWNoZS5nZXQocmVxdWVzdCwgdGhpcy5ocm4udG9TdHJpbmcoKSwgdGhpcy5sYXllcklkLCB0aGlzLnZlcnNpb24pO1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0aXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWVsZHMgPSByZXF1ZXN0LmdldEFkZGl0aW9uYWxGaWVsZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4aXN0RmllbGRzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RGaWVsZHMgPSBhZGRpdGlvbmFsRmllbGRzLmZpbHRlcigoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9ucy5ldmVyeShwYXJ0aXRpb24gPT4gcGFydGl0aW9uW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWRkaXRpb25hbEZpZWxkcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIWV4aXN0RmllbGRzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmllbGRzLmxlbmd0aCA9PT0gZXhpc3RGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgcGFydGl0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1ldGFSZXF1ZXN0QmlsZGVyID0geWllbGQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihcIm1ldGFkYXRhXCIsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgYWJvcnRTaWduYWwpLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHlpZWxkIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkuZ2V0UGFydGl0aW9ucyhtZXRhUmVxdWVzdEJpbGRlciwge1xuICAgICAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbEZpZWxkczogcmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKCksXG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRGZXRjaE9wdGlvbigpICE9PSBvbHBfc2RrX2NvcmVfMS5GZXRjaE9wdGlvbnMuT25saW5lT25seSAmJlxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcnRpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2FjaGUucHV0KHJlcXVlc3QsIHRoaXMuaHJuLnRvU3RyaW5nKCksIHRoaXMubGF5ZXJJZCwgbWV0YWRhdGEucGFydGl0aW9ucywgdGhpcy52ZXJzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWV0YWRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW5kIHJldHVybnMgcGFydGl0aW9uIG1ldGFkYXRhXG4gICAgICogQHBhcmFtIHBhcnRpdGlvbklkIFRoZSBuYW1lIG9mIHRoZSBwYXJ0aXRpb24gdG8gZmV0Y2guXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGxheWVyIHRvIGZldGNoXG4gICAgICogQHBhcmFtIGZldGNoT3B0aW9uIFRoZSBvcHRpb24gb2YgY2FjaGluZyAob25saW5lIG9ubHkgb3IgcmV0dXJuIGZyb20gY2FjaGUgaWYgZXhpc3QpXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIG9mIHBhcnRpdGlvbiBtZXRhZGF0YSB3aGljaCB1c2VkIHRvIGdldCBwYXJ0aXRpb24gZGF0YVxuICAgICAqL1xuICAgIGdldERhdGFIYW5kbGVCeVBhcnRpdGlvbklkKHBhcnRpdGlvbklkLCBmZXRjaE9wdGlvbiwgYmlsbGluZ1RhZykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuUXVlcnlDbGllbnQodGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICBjb25zdCBwYXJ0aXRpb25zUmVxdWVzdCA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5QYXJ0aXRpb25zUmVxdWVzdCgpXG4gICAgICAgICAgICAgICAgLndpdGhQYXJ0aXRpb25JZHMoW3BhcnRpdGlvbklkXSlcbiAgICAgICAgICAgICAgICAud2l0aEZldGNoT3B0aW9uKGZldGNoT3B0aW9uKTtcbiAgICAgICAgICAgIGlmIChiaWxsaW5nVGFnKSB7XG4gICAgICAgICAgICAgICAgcGFydGl0aW9uc1JlcXVlc3Qud2l0aEJpbGxpbmdUYWcoYmlsbGluZ1RhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHlpZWxkIHF1ZXJ5Q2xpZW50LmdldFBhcnRpdGlvbnNCeUlkKHBhcnRpdGlvbnNSZXF1ZXN0LCB0aGlzLmxheWVySWQsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgdW5kZWZpbmVkLCB0aGlzLnZlcnNpb24pO1xuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnBhcnRpdGlvbnMgJiZcbiAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdICYmXG4gICAgICAgICAgICAgICAgbWV0YWRhdGEucGFydGl0aW9uc1swXS5kYXRhSGFuZGxlXG4gICAgICAgICAgICAgICAgPyBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdLmRhdGFIYW5kbGVcbiAgICAgICAgICAgICAgICA6IFByb21pc2UucmVqZWN0KG5ldyBvbHBfc2RrX2NvcmVfMS5IdHRwRXJyb3Iob2xwX3Nka19jb3JlXzEuU1RBVFVTX0NPREVTLk5PVF9GT1VORCwgYE5vIHBhcnRpdGlvbiBkYXRhSGFuZGxlIGZvciBwYXJ0aXRpb24gJHtwYXJ0aXRpb25JZH0uIEhSTjogJHt0aGlzLmhybn1gKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGNhdGFsb2cgdmVyc2lvbiB3aGF0IGNhbiBiZSB1c2VkIGFzIGxhdGVzdCBsYXllciB2ZXJzaW9uXG4gICAgICovXG4gICAgZ2V0TGF0ZXN0VmVyc2lvbihiaWxsaW5nVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyID0geWllbGQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihcIm1ldGFkYXRhXCIsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSB5aWVsZCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmxhdGVzdFZlcnNpb24oYnVpbGRlciwge1xuICAgICAgICAgICAgICAgIHN0YXJ0VmVyc2lvbjogLTEsXG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZ1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobGF0ZXN0VmVyc2lvbi52ZXJzaW9uKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRvd25sb2FkUGFydGl0aW9uKGRhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBiaWxsaW5nVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyID0geWllbGQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihcImJsb2JcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkJsb2JBcGkuZ2V0QmxvYihidWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgZGF0YUhhbmRsZSxcbiAgICAgICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCBiYXNlVXJsIGFuZCBjcmVhdGUgcmVxdWVzdEJ1aWxkZXIgZm9yIHNlbmRpbmcgcmVxdWVzdHMgdG8gdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAgICAgKiBAcGFyYW0gYnVpbGRlclR5cGUgZW5kcG9pbnQgbmFtZSBpcyBuZWVkZWQgdG8gY3JlYXRlIHByb3ByaWF0ZSByZXF1ZXN0QnVpbGRlclxuICAgICAqXG4gICAgICogQHJldHVybnMgcmVxdWVzdEJ1aWxkZXJcbiAgICAgKi9cbiAgICBnZXRSZXF1ZXN0QnVpbGRlcihidWlsZGVyVHlwZSwgaHJuLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShidWlsZGVyVHlwZSwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCBocm4sIGFib3J0U2lnbmFsKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5WZXJzaW9uZWRMYXllckNsaWVudCA9IFZlcnNpb25lZExheWVyQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVm9sYXRpbGVMYXllckNsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhIHZvYWx0aWxlIGxheWVyIGFuZCBwcm92aWRlcyB0aGUgcG9zc2liaWxpdHkgdG8gZ2V0IHBhcnRpdGlvbnMgbWV0YWRhdGEgYW5kIGRhdGEuXG4gKi9cbmNsYXNzIFZvbGF0aWxlTGF5ZXJDbGllbnQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIFtbVm9sYXRpbGVMYXllckNsaWVudF1dIGluc3RhbmNlIHdpdGggVm9sYXRpbGVMYXllckNsaWVudFBhcmFtcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVycyBmb3IgdXNlIHRvIGluaXRpYWxpemUgVm9sYXRpbGVMYXllckNsaWVudC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5hcGlWZXJzaW9uID0gXCJ2MVwiO1xuICAgICAgICB0aGlzLmhybiA9IHBhcmFtcy5jYXRhbG9nSHJuLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IHBhcmFtcy5sYXllcklkO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gcGFyYW1zLnNldHRpbmdzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAYnJpZWYgRmV0Y2hlcyBkYXRhIG9mIGEgdGlsZSBvciBpdHMgY2xvc2VzdCBhbmNlc3Rvci5cbiAgICAgKiBVc2UgdGhpcyBBUEkgZm9yIHRpbGUtdHJlZSBzdHJ1Y3R1cmVzIHdoZXJlIGNoaWxkcmVuIHRpbGUgZGF0YSBpcyBhZ2dyZWdhdGVkIGFuZCBzdG9yZWQgaW4gcGFyZW50IHRpbGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGBUaWxlUmVxdWVzdGAgaW5zdGFuY2UgdGhhdCBjb250YWlucyBhIGNvbXBsZXRlIHNldFxuICAgICAqIG9mIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRpbGUgZGF0YSAoaWYgaXQgZXhpc3RzKSBvciB0aGUgbmVhcmVzdCBwYXJlbnQgdGlsZSBkYXRhXG4gICAgICovXG4gICAgZ2V0QWdncmVnYXRlZERhdGEocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBjYXRhbG9nSHJuOiBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksXG4gICAgICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgICAgIGxheWVyVHlwZTogXCJ2b2xhdGlsZVwiLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzOiB0aGlzLnNldHRpbmdzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLmdldFRpbGUocmVxdWVzdCwgcGFyYW1zLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIHBhcnRpdGlvbiBkYXRhIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6IElELCBxdWFka2V5LCBvciBkYXRhIGhhbmRsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhUmVxdWVzdCBUaGUgW1tEYXRhUmVxdWVzdF1dIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmVkIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIGZyb20gdGhlIHJlcXVlc3RlZCBwYXJ0aXRpb24uXG4gICAgICovXG4gICAgZ2V0RGF0YShkYXRhUmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFIYW5kbGUgPSBkYXRhUmVxdWVzdC5nZXREYXRhSGFuZGxlKCk7XG4gICAgICAgICAgICBjb25zdCBwYXJ0aXRpb25JZCA9IGRhdGFSZXF1ZXN0LmdldFBhcnRpdGlvbklkKCk7XG4gICAgICAgICAgICBpZiAoZGF0YUhhbmRsZSAhPT0gdW5kZWZpbmVkIHx8IHBhcnRpdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YUhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFBhcnRpdGlvbihkYXRhSGFuZGxlLCBhYm9ydFNpZ25hbCwgZGF0YVJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbklkRGF0YUhhbmRsZSA9IHlpZWxkIHRoaXMuZ2V0RGF0YUhhbmRsZUJ5UGFydGl0aW9uSWQocGFydGl0aW9uSWQsIGRhdGFSZXF1ZXN0LmdldEZldGNoT3B0aW9uKCksIGRhdGFSZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRQYXJ0aXRpb24ocGFydGl0aW9uSWREYXRhSGFuZGxlLCBhYm9ydFNpZ25hbCwgZGF0YVJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBObyBkYXRhIHByb3ZpZGVkLiBBZGQgZGF0YUhhbmRsZSwgcGFydGl0aW9uSWQgb3IgcXVhZEtleSB0byB0aGUgRGF0YVJlcXVlc3Qgb2JqZWN0YCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0UGFydGl0aW9ucyhyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWFkS2V5UGFydGl0aW9uc1JlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWFkS2V5ID0gcmVxdWVzdC5nZXRRdWFkS2V5KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFxdWFkS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IFF1YWRLZXlcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWVyeUNsaWVudCh0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWFkVHJlZUluZGV4UmVxdWVzdCA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWFkVHJlZUluZGV4UmVxdWVzdChvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIHRoaXMubGF5ZXJJZCwgXCJ2b2xhdGlsZVwiKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFF1YWRLZXkocXVhZEtleSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhEZXB0aChyZXF1ZXN0LmdldERlcHRoKCkpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoQWRkaXRpb25hbEZpZWxkcyhyZXF1ZXN0LmdldEFkZGl0aW9uYWxGaWVsZHMoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5Q2xpZW50LmZldGNoUXVhZFRyZWVJbmRleChxdWFkVHJlZUluZGV4UmVxdWVzdCwgYWJvcnRTaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0UGFydGl0aW9uSWRzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWVyeUNsaWVudCh0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnlDbGllbnQuZ2V0UGFydGl0aW9uc0J5SWQocmVxdWVzdCwgdGhpcy5sYXllcklkLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLk1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5KHRoaXMuc2V0dGluZ3MuY2FjaGUpO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSAhPT0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZU9ubHkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0aXRpb25zID0gY2FjaGUuZ2V0KHJlcXVlc3QsIHRoaXMuaHJuLnRvU3RyaW5nKCksIHRoaXMubGF5ZXJJZCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbEZpZWxkcyA9IHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RGaWVsZHM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdEZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb25zLmV2ZXJ5KHBhcnRpdGlvbiA9PiBwYXJ0aXRpb25bZmllbGRdICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhZGRpdGlvbmFsRmllbGRzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhZXhpc3RGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxGaWVsZHMubGVuZ3RoID09PSBleGlzdEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBwYXJ0aXRpb25zIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWV0YVJlcXVlc3RCaWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwibWV0YWRhdGFcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB5aWVsZCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmdldFBhcnRpdGlvbnMobWV0YVJlcXVlc3RCaWxkZXIsIHtcbiAgICAgICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbEZpZWxkczogcmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKCksXG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRGZXRjaE9wdGlvbigpICE9PSBvbHBfc2RrX2NvcmVfMS5GZXRjaE9wdGlvbnMuT25saW5lT25seSAmJlxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcnRpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2FjaGUucHV0KHJlcXVlc3QsIHRoaXMuaHJuLnRvU3RyaW5nKCksIHRoaXMubGF5ZXJJZCwgbWV0YWRhdGEucGFydGl0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ldGFkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRvd25sb2FkUGFydGl0aW9uKGRhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBiaWxsaW5nVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyID0geWllbGQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihcInZvbGF0aWxlLWJsb2JcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlZvbGF0aWxlQmxvYkFwaS5nZXRWb2xhdGlsZUJsb2IoYnVpbGRlciwge1xuICAgICAgICAgICAgICAgIGRhdGFIYW5kbGUsXG4gICAgICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgICAgIGJpbGxpbmdUYWdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBiYXNlVXJsIGFuZCBjcmVhdGVzIHJlcXVlc3RCdWlsZGVyIGZvciBzZW5kaW5nIHJlcXVlc3RzIHRvIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UuXG4gICAgICogQHBhcmFtIGJ1aWxkZXJUeXBlIGVuZHBvaW50IG5hbWUgaXMgbmVlZGVkIHRvIGNyZWF0ZSBwcm9wcmlhdGUgcmVxdWVzdEJ1aWxkZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHJlcXVlc3RCdWlsZGVyXG4gICAgICovXG4gICAgZ2V0UmVxdWVzdEJ1aWxkZXIoYnVpbGRlclR5cGUsIGhybiwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoYnVpbGRlclR5cGUsIHRoaXMuYXBpVmVyc2lvbiwgdGhpcy5zZXR0aW5ncywgaHJuLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhbmQgcmV0dXJucyBwYXJ0aXRpb24gbWV0YWRhdGFcbiAgICAgKiBAcGFyYW0gcGFydGl0aW9uSWQgVGhlIG5hbWUgb2YgdGhlIHBhcnRpdGlvbiB0byBmZXRjaC5cbiAgICAgKiBAcGFyYW0gZmV0Y2hPcHRpb24gVGhlIG9wdGlvbiBvZiBjYWNoaW5nIChvbmxpbmUgb25seSBvciByZXR1cm4gZnJvbSBjYWNoZSBpZiBleGlzdClcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb2YgcGFydGl0aW9uIG1ldGFkYXRhIHdoaWNoIHVzZWQgdG8gZ2V0IHBhcnRpdGlvbiBkYXRhXG4gICAgICovXG4gICAgZ2V0RGF0YUhhbmRsZUJ5UGFydGl0aW9uSWQocGFydGl0aW9uSWQsIGZldGNoT3B0aW9uLCBiaWxsaW5nVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWVyeUNsaWVudCh0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnNSZXF1ZXN0ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlBhcnRpdGlvbnNSZXF1ZXN0KClcbiAgICAgICAgICAgICAgICAud2l0aFBhcnRpdGlvbklkcyhbcGFydGl0aW9uSWRdKVxuICAgICAgICAgICAgICAgIC53aXRoRmV0Y2hPcHRpb24oZmV0Y2hPcHRpb24pO1xuICAgICAgICAgICAgaWYgKGJpbGxpbmdUYWcpIHtcbiAgICAgICAgICAgICAgICBwYXJ0aXRpb25zUmVxdWVzdC53aXRoQmlsbGluZ1RhZyhiaWxsaW5nVGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0geWllbGQgcXVlcnlDbGllbnQuZ2V0UGFydGl0aW9uc0J5SWQocGFydGl0aW9uc1JlcXVlc3QsIHRoaXMubGF5ZXJJZCwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pKTtcbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5wYXJ0aXRpb25zICYmXG4gICAgICAgICAgICAgICAgbWV0YWRhdGEucGFydGl0aW9uc1swXSAmJlxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcnRpdGlvbnNbMF0uZGF0YUhhbmRsZVxuICAgICAgICAgICAgICAgID8gbWV0YWRhdGEucGFydGl0aW9uc1swXS5kYXRhSGFuZGxlXG4gICAgICAgICAgICAgICAgOiBQcm9taXNlLnJlamVjdChuZXcgb2xwX3Nka19jb3JlXzEuSHR0cEVycm9yKG9scF9zZGtfY29yZV8xLlNUQVRVU19DT0RFUy5OT1RfRk9VTkQsIGBObyBwYXJ0aXRpb24gZGF0YUhhbmRsZSBmb3IgcGFydGl0aW9uICR7cGFydGl0aW9uSWR9LiBIUk46ICR7dGhpcy5ocm59YCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlZvbGF0aWxlTGF5ZXJDbGllbnQgPSBWb2xhdGlsZUxheWVyQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9DYXRhbG9nQ2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9DYXRhbG9nUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRGF0YVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0YXRpc3RpY3NDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0YXRpc3RpY3NSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TdW1tYXJ5UmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vVmVyc2lvbmVkTGF5ZXJDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1ZvbGF0aWxlTGF5ZXJDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0NvbmZpZ0NsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQ2F0YWxvZ3NSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TY2hlbWFEZXRhaWxzUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQXJ0aWZhY3RDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1BhcnRpdGlvbnNSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9RdWVyeUNsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vUXVhZFRyZWVJbmRleFJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vU2NoZW1hUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9MYXllclZlcnNpb25zUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vSW5kZXhMYXllckNsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vSW5kZXhRdWVyeVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0cmVhbUxheWVyQ2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TdWJzY3JpYmVSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9Qb2xsUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vVW5zdWJzY3JpYmVSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TZWVrUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vVGlsZVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi91dGlsc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vY2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jYWNoZVwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5mZXRjaFF1YWRUcmVlSW5kZXggPSBleHBvcnRzLmdldFRpbGUgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBGZXRjaGVzIGFzeW5jaHJvbm91c2x5IGRhdGEgZnJvbSBhIHRpbGUgb3IgZnJvbSBpdHMgbmVhcmVzdCBhbmNlc3RvciBpZiBub3QgZm91bmQuXG4gKlxuICogVGhlIHRpbGUgaXMgYSBnZW9tZXRyaWMgYXJlYSByZXByZXNlbnRlZCBhcyBhIEhFUkUgdGlsZS5cbiAqIFRoZSBxdWFkIHRyZWUgbWV0YWRhdGEgZmV0Y2hlcyB0aGUgYmxvYiBvZiBuZWVkZWQgdGlsZSBmcm9tIHRoZSBIRVJFIFF1ZXJ5IFNlcnZpY2UsXG4gKiB0aGVuIGNhY2hlcyBpdCwgYW5kIHJldHVybnMgdG8gdGhlIHVzZXIuXG4gKiBUbyBkaXNhYmxlIGNhY2hpbmcgb2YgbWV0YWRhdGEgdXNlIGByZXF1ZXN0LndpdGhGZXRjaE9wdGlvbihGZXRjaE9wdGlvbnMuT25saW5lT25seSlgLlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3RzIHRoZSBbW1RpbGVSZXF1ZXN0XV0gaW5zdGFuY2Ugd2l0aCB0aGUgY29uZmlndXJlZCBwYXJhbWV0ZXJzLlxuICogQHNlZSBbW1RpbGVSZXF1ZXN0XV1cbiAqXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgVGhlIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICogQHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgXG4gKiAgY29uc3QgcGFyYW1zOiBHZXRUaWxlUGFyYW1zID0ge1xuICogICAgICAgc2V0dGluZ3M6IFwiJSB5b3VyIGBPbHBDbGllbnRTZXR0aW5nc2AgaW5zdGFuY2UgJSBcIixcbiAqICAgICAgIGNhdGFsb2dIcm46IFwiJSB0aGUgSFJOIGluc3RhbmNlIG9mIHlvdXIgY2F0YWxvZyAlXCIsXG4gKiAgICAgICBsYXllcklkOiBcIiUgeW91ciBsYXllciBJRCAlXCIsXG4gKiAgICAgICBsYXllclR5cGU6IFwiJSB2ZXJzaW9uZWQgb3Igdm9sYXRpbGUgJVwiLFxuICogICB9XG4gKlxuICogIGNvbnN0IHJlcXVlc3QgPSBuZXcgVGlsZVJlcXVlc3QoKTtcbiAqXG4gKiAgY29uc3QgdGlsZTEgPSBhd2FpdCBnZXRUaWxlKHJlcXVlc3Qud2l0aFRpbGVLZXkoeW91clRpbGVLZXkxKSwgcGFyYW1zKTtcbiAqICBjb25zdCB0aWxlMiA9IGF3YWl0IGdldFRpbGUocmVxdWVzdC53aXRoVGlsZUtleSh5b3VyVGlsZUtleTIpLCBwYXJhbXMpO1xuICpcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIFRoZSBibG9iIG9mIHRoZSByZXF1ZXN0ZWQgdGlsZSBvciB0aGUgYmxvYiBvZiB0aGUgY2xvc2VzdCBwYXJlbnQgVGlsZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VGlsZShyZXF1ZXN0LCBwYXJhbXMsIGFib3J0U2lnbmFsKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNhdGFsb2dWZXJzaW9uO1xuICAgICAgICBjb25zdCBxdWFkS2V5ID0gcmVxdWVzdC5nZXRUaWxlS2V5KCk7XG4gICAgICAgIGlmICghcXVhZEtleSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgUXVhZEtleVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5sYXllclR5cGUgPT09IFwidmVyc2lvbmVkXCIpIHtcbiAgICAgICAgICAgIGNhdGFsb2dWZXJzaW9uID0gcGFyYW1zLmNhdGFsb2dWZXJzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJsb2JUeXBlID0gcGFyYW1zLmxheWVyVHlwZSA9PT0gXCJ2ZXJzaW9uZWRcIiA/IFwiYmxvYlwiIDogXCJ2b2xhdGlsZS1ibG9iXCI7XG4gICAgICAgIGNvbnN0IGJsb2JSZXF1ZXN0QnVpbGRlciA9IHlpZWxkIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShibG9iVHlwZSwgXCJ2MVwiLCBwYXJhbXMuc2V0dGluZ3MsIHBhcmFtcy5jYXRhbG9nSHJuLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgY29uc3QgZGVsdGEgPSA0O1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRUaWxlS2V5ID0gb2xwX3Nka19jb3JlXzEuVGlsZUtleS5mcm9tUm93Q29sdW1uTGV2ZWwocXVhZEtleS5yb3csIHF1YWRLZXkuY29sdW1uLCBxdWFkS2V5LmxldmVsKTtcbiAgICAgICAgbGV0IHF1YWRUcmVlSW5kZXggPSBudWxsO1xuICAgICAgICBpZiAocmVxdWVzdC5nZXRGZXRjaE9wdGlvbigpICE9PSBvbHBfc2RrX2NvcmVfMS5GZXRjaE9wdGlvbnMuT25saW5lT25seSkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeShwYXJhbXMuc2V0dGluZ3MuY2FjaGUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZGVsdGE7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEluQ2FjaGUgPSByZXF1ZXN0ZWRUaWxlS2V5LmNoYW5nZWRMZXZlbEJ5KC1pKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWRUcmVlID0gY2FjaGUuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgaHJuOiBwYXJhbXMuY2F0YWxvZ0hybi50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBsYXllcklkOiBwYXJhbXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlbHRhLFxuICAgICAgICAgICAgICAgICAgICByb290OiBwYXJlbnRJbkNhY2hlLFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBjYXRhbG9nVmVyc2lvblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZWRUcmVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1YWRUcmVlSW5kZXggPSBjYWNoZWRUcmVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnRUaWxlS2V5ID0gcmVxdWVzdGVkVGlsZUtleS5jaGFuZ2VkTGV2ZWxCeSgtZGVsdGEpO1xuICAgICAgICBpZiAoIXF1YWRUcmVlSW5kZXgpIHtcbiAgICAgICAgICAgIHF1YWRUcmVlSW5kZXggPSB5aWVsZCBmZXRjaFF1YWRUcmVlSW5kZXgoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMpLCB7IGNhdGFsb2dWZXJzaW9uLCBkZXB0aDogZGVsdGEsIGZldGNoT3B0aW9uczogcmVxdWVzdC5nZXRGZXRjaE9wdGlvbigpLCB0aWxlS2V5OiBwYXJlbnRUaWxlS2V5LCBhYm9ydFNpZ25hbCwgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkgfSkpLmNhdGNoKGUgPT4gUHJvbWlzZS5yZWplY3QoZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcXVhZFRyZWVJbmRleC5zdWJRdWFkcyB8fCAhcXVhZFRyZWVJbmRleC5zdWJRdWFkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFcnJvciBmZXRjaGluZyBRdWFkVHJlZUluZGV4XCIpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgUXVhZEtleSBvciBmb3IgdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIGNvbnN0IHN1YlF1YWRzID0gcXVhZFRyZWVJbmRleC5zdWJRdWFkcztcbiAgICAgICAgbGV0IGN1cnJlbnRUaWxlS2V5ID0gcmVxdWVzdGVkVGlsZUtleTtcbiAgICAgICAgbGV0IGN1cnJlbnREZWx0YSA9IGRlbHRhO1xuICAgICAgICBmb3IgKGxldCBsZXZlbCA9IGN1cnJlbnRUaWxlS2V5LmxldmVsOyBsZXZlbCA+PSBwYXJlbnRUaWxlS2V5LmxldmVsOyAtLWxldmVsKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHN1YlF1YWRzLmZpbmQoaXRlbSA9PiBpdGVtLnN1YlF1YWRLZXkgPT09IGN1cnJlbnRUaWxlS2V5LmdldFN1YkhlcmVUaWxlKGN1cnJlbnREZWx0YSkpO1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQmxvYkFwaS5nZXRCbG9iKGJsb2JSZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgICAgICAgICBkYXRhSGFuZGxlOiBtZXRhZGF0YS5kYXRhSGFuZGxlLFxuICAgICAgICAgICAgICAgICAgICBsYXllcklkOiBwYXJhbXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFRpbGVLZXkgPSBjdXJyZW50VGlsZUtleS5wYXJlbnQoKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGVsdGEgPSBwYXJlbnRUaWxlS2V5LmxldmVsIC0gY3VycmVudFRpbGVLZXkubGV2ZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGJsb2IgZm9yIFRpbGU6ICR7SlNPTi5zdHJpbmdpZnkocXVhZEtleSl9YCkpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRUaWxlID0gZ2V0VGlsZTtcbi8qKlxuICogVGhlIGZ1bmN0aW9uIHNob3VsZCByZXF1ZXN0IHF1YWQgdHJlZSBpbmRleCBmb3IgdGhlIHBhcmVudCB0aWxlIHdpdGggZGVsdGEgNFxuICogYW5kIGNhY2hlIHRoZSByZXNwb25zZXMgaW4gY2FjaGUgZm9yIGxhdGVyIGNhbGxzLlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBmZXRjaFF1YWRUcmVlSW5kZXgocGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeShwYXJhbXMuc2V0dGluZ3MuY2FjaGUpO1xuICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWVyeUNsaWVudChwYXJhbXMuc2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBxdWFkVHJlZUluZGV4UmVxdWVzdCA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWFkVHJlZUluZGV4UmVxdWVzdChwYXJhbXMuY2F0YWxvZ0hybiwgcGFyYW1zLmxheWVySWQsIHBhcmFtcy5sYXllclR5cGUpXG4gICAgICAgICAgICAud2l0aFF1YWRLZXkocGFyYW1zLnRpbGVLZXkpXG4gICAgICAgICAgICAud2l0aERlcHRoKHBhcmFtcy5kZXB0aCk7XG4gICAgICAgIGlmIChwYXJhbXMubGF5ZXJUeXBlID09PSBcInZlcnNpb25lZFwiKSB7XG4gICAgICAgICAgICBxdWFkVHJlZUluZGV4UmVxdWVzdC53aXRoVmVyc2lvbihwYXJhbXMuY2F0YWxvZ1ZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHF1YWRUcmVlSW5kZXggPSB5aWVsZCBxdWVyeUNsaWVudFxuICAgICAgICAgICAgLmZldGNoUXVhZFRyZWVJbmRleChxdWFkVHJlZUluZGV4UmVxdWVzdCwgcGFyYW1zLmFib3J0U2lnbmFsKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgaWYgKHBhcmFtcy5mZXRjaE9wdGlvbnMgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5ICYmXG4gICAgICAgICAgICBxdWFkVHJlZUluZGV4LnN1YlF1YWRzKSB7XG4gICAgICAgICAgICBjYWNoZS5wdXQoe1xuICAgICAgICAgICAgICAgIGhybjogcGFyYW1zLmNhdGFsb2dIcm4udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBsYXllcklkOiBwYXJhbXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICBkZXB0aDogcGFyYW1zLmRlcHRoLFxuICAgICAgICAgICAgICAgIHJvb3Q6IHBhcmFtcy50aWxlS2V5LFxuICAgICAgICAgICAgICAgIHRyZWU6IHF1YWRUcmVlSW5kZXgsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogcGFyYW1zLmNhdGFsb2dWZXJzaW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHF1YWRUcmVlSW5kZXgpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5mZXRjaFF1YWRUcmVlSW5kZXggPSBmZXRjaFF1YWRUcmVlSW5kZXg7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3ZhbGlkYXRlQmlsbGluZ1RhZ1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdmFsaWRhdGVQYXJ0aXRpb25zSWRzTGlzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZ2V0VGlsZVwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnZhbGlkYXRlQmlsbGluZ1RhZyA9IHZvaWQgMDtcbi8qKlxuICogVmFsaWRhdGVzIHRoZSBiaWxsaW5pZyB0YWcuXG4gKlxuICogSXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICpcbiAqIEBwYXJhbSB0YWcgVGhlIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGJpbGxpbmcgdGFnLlxuICogQHJldHVybiBUaGUgYmlsbGluZyB0YWcgaWYgaXQncyB2YWxpZC4gT3RoZXJ3aXNlLCB0aHJvd3MgYW4gZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gL15bQS1aYS16MC05Xy1dezQsMTZ9JC87XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QodGFnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYmlsbGluZyB0YWcgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGFnO1xufVxuZXhwb3J0cy52YWxpZGF0ZUJpbGxpbmdUYWcgPSB2YWxpZGF0ZUJpbGxpbmdUYWc7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3QgPSB2b2lkIDA7XG4vKipcbiAqIFZhbGlkYXRlcyBhIGxpc3Qgb2YgcGFydGl0aW9ucyBJRHMuXG4gKlxuICogSXQgbXVzdCBiZSBiZXR3ZWVuIDEmbmRhc2g7MTAwIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSBsaXN0IFRoZSBsaXN0cyBvZiBzdHJpbmdzIHRoYXQgcmVwcmVzZW50IHRoZSBwYXJ0aXRpb25zIElEcy5cbiAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIHN0cmluZ3MgaWYgaXQncyB2YWxpZC4gT3RoZXJ3aXNlLCB0aHJvd3MgYW4gZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3QobGlzdCkge1xuICAgIGNvbnN0IExJU1RfTUFYX0xFTkdUSCA9IDEwMDtcbiAgICBjb25zdCBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgMSB8fCBsZW5ndGggPiBMSVNUX01BWF9MRU5HVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcnRpdGlvbiBpZHMgcXVhbnRpdHkgbXVzdCBiZSBiZXR3ZWVuIDEgLSAxMDBcIik7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xufVxuZXhwb3J0cy52YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0ID0gdmFsaWRhdGVQYXJ0aXRpb25zSWRzTGlzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2xpYlwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbGliLnZlcnNpb25cIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxJQl9WRVJTSU9OID0gdm9pZCAwO1xuZXhwb3J0cy5MSUJfVkVSU0lPTiA9IFwiMS4xMi4wXCI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFwaUNhY2hlUmVwb3NpdG9yeSA9IHZvaWQgMDtcbi8qKlxuICogQ2FjaGVzIHRoZSBiYXNlIFVSTHMgb2YgdGhlIEFQSSB1c2luZyBhIGtleS12YWx1ZSBwYWlyLlxuICogVGhlIGtleSBmb3JtYXQgaXMgYDxocm4+Ojo8c2VydmljZV9uYW1lPjo6PHNlcnZpY2VWZXJzaW9uPjo6YXBpYC5cbiAqL1xuY2xhc3MgQXBpQ2FjaGVSZXBvc2l0b3J5IHtcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIFtbQXBpQ2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FjaGUgVGhlIFtbS2V5VmFsdWVDYWNoZV1dIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBocm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gdXNlIHRoZSBbW0FwaUNhY2hlUmVwb3NpdG9yeV1dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gVGhlIFtbQXBpQ2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2FjaGUsIGhybikge1xuICAgICAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG4gICAgICAgIHRoaXMuaHJuID0gaHJuID8gaHJuLnRvU3RyaW5nKCkgOiBcInBsYXRmb3JtLWFwaVwiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgbmFtZSBvZiB0aGUgQVBJIHNlcnZpY2UgZm9yIHdoaWNoIHlvdSBuZWVkIHRoZSBrZXktdmFsdWUgcGFpci5cbiAgICAgKiBAcGFyYW0gc2VydmljZVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIHNlcnZpY2VVcmwgVGhlIGJhc2UgVVJMIG9mIHRoZSBzZXJ2aWNlLlxuICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdXQoc2VydmljZSwgc2VydmljZVZlcnNpb24sIHNlcnZpY2VVcmwsIHR5cGUpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jcmVhdGVLZXkodGhpcy5ocm4sIHNlcnZpY2UsIHNlcnZpY2VWZXJzaW9uLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUucHV0KGtleSwgc2VydmljZVVybCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiYXNlIFVSTCBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBuYW1lIG9mIHRoZSBBUEkgc2VydmljZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gZ2V0IHRoZSBiYXNlIFVSTC5cbiAgICAgKiBAcGFyYW0gc2VydmljZVZlcnNpb24gVGhlIHNlcnZpY2UgdmVyc2lvbi5cbiAgICAgKiBAcmV0dXJuIFRoZSBiYXNlIFVSTCBvZiB0aGUgc2VydmljZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSBiYXNlIFVSTCBkb2VzIG5vdCBleGlzdC5cbiAgICAgKi9cbiAgICBnZXQoc2VydmljZSwgc2VydmljZVZlcnNpb24sIHR5cGUpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jcmVhdGVLZXkodGhpcy5ocm4sIHNlcnZpY2UsIHNlcnZpY2VWZXJzaW9uLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIGNyZWF0ZUtleShocm4sIHNlcnZpY2UsIHNlcnZpY2VWZXJzaW9uLCB0eXBlKSB7XG4gICAgICAgIHJldHVybiBgJHtocm59Ojoke3NlcnZpY2V9Ojoke3NlcnZpY2VWZXJzaW9ufTo6JHt0eXBlfWA7XG4gICAgfVxufVxuZXhwb3J0cy5BcGlDYWNoZVJlcG9zaXRvcnkgPSBBcGlDYWNoZVJlcG9zaXRvcnk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLktleVZhbHVlQ2FjaGUgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBCWVRFU19JTl9NQiA9IDEwMjQ7XG4vKipcbiAqIEFuIGluLW1lbW9yeSBjYWNoaW5nIGluc3RhbmNlLlxuICpcbiAqIEFsbCB0aGUgcmVwb3NpdG9yeSBpbnN0YW5jZXMgdXNlIGl0IGZvciByZWFkaW5nIG9yIGNhY2hpbmcgaW5mb3JtYXRpb24uXG4gKi9cbmNsYXNzIEtleVZhbHVlQ2FjaGUge1xuICAgIC8qKlxuICAgICAqIENlcmF0ZXMgdGhlIGBLZXlWYWx1ZUNhY2hlYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBLZXlWYWx1ZUNhY2hlYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBvbHBfc2RrX2NvcmVfMS5MUlVDYWNoZShCWVRFU19JTl9NQiAqIEJZVEVTX0lOX01CICogMiwgb2xwX3Nka19jb3JlXzEuZ2V0RGF0YVNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoaXMgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIHR5cGUuXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bDsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1dChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSB2YWx1ZSB0aGF0IHlvdSB3YW50IHRvIHJlbW92ZSBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsOyBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVtb3ZlKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBjYWNoZSBhbmQgcmVtb3ZlcyBhbGwgc3RvcmVkIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgY2FjaGUuXG4gICAgICpcbiAgICAgKiBJZiBgbmV3Q2FwYWNpdHlgIGlzIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBjYWNoZSBzaXplLFxuICAgICAqIGFsbCBpdGVtcyBhcmUgZXZpY3RlZCB1bnRpbCB0aGUgY2FjaGUgc2hyaW5rcyB0byBgbmV3Q2FwYWNpdHlgLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5ld0NhcGFjaXR5IFRoZSBuZXcgY2FwYWNpdHkgb2YgdGhpcyBjYWNoZSBpbiBNQi5cbiAgICAgKi9cbiAgICBzZXRDYXBhY2l0eShuZXdDYXBhY2l0eSkge1xuICAgICAgICB0aGlzLmNhY2hlLnNldENhcGFjaXR5KG5ld0NhcGFjaXR5ICogQllURVNfSU5fTUIgKiBCWVRFU19JTl9NQik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5IG9mIHRoZSBjYWNoZVxuICAgICAqIHRoYXQgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgdGhlIGNhY2hlIGluIE1CLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGNhcGFjaXR5IG9mIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXRDYXBhY2l0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0Q2FwYWNpdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlXG4gICAgICogdGhhdCBpcyB0aGUgc3VtIG9mIGFsbCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBzaXplIG9mIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRTaXplKCk7XG4gICAgfVxufVxuZXhwb3J0cy5LZXlWYWx1ZUNhY2hlID0gS2V5VmFsdWVDYWNoZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTFJVQ2FjaGUgPSBleHBvcnRzLkVudHJ5ID0gdm9pZCAwO1xuLyoqIEBoaWRkZW4gKi9cbmNsYXNzIEVudHJ5IHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBzaXplLCBuZXdlciwgb2xkZXIpIHtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5uZXdlciA9IG5ld2VyO1xuICAgICAgICB0aGlzLm9sZGVyID0gb2xkZXI7XG4gICAgfVxufVxuZXhwb3J0cy5FbnRyeSA9IEVudHJ5O1xuLyoqXG4gKiBGaXhlZCBzaXplIGNhY2hlIHRoYXQgZXZpY3RzIGl0cyBlbnRyaWVzIGluIGxlYXN0LXJlY2VudGx5LXVzZWQgb3JkZXIgd2hlbiBpdCBvdmVyZmxvd3MuXG4gKiBNb2RlbGVkIGFmdGVyIHN0YW5kYXJkIEphdmFTY3JpcHQgYE1hcGAgb3RoZXJ3aXNlLlxuICovXG5jbGFzcyBMUlVDYWNoZSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBgTFJVQ2FjaGVgLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIFtbc2l6ZUZ1bmN0aW9uXV0gY2FuIGJlIHVzZWQgdG8gZmluZSB0dW5lIHRoZSBtZW1vcnkgY29uc3VtcHRpb24gb2YgYWxsIGNhY2hlZFxuICAgICAqIGVsZW1lbnRzLCB0aHVzIFtbY2FjaGVDYXBhY2l0eV1dIG1lYW5zIHRoZW4gbWVtb3J5IHVzZWQuIE90aGVyd2lzZSwgaWZcbiAgICAgKiBbW3NpemVGdW5jdGlvbl1dIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBbW2NhY2hlQ2FwYWNpdHldXSBhY2NvdW50cyBmb3IgdGhlIG1heGltdW1cbiAgICAgKiBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhY2hlQ2FwYWNpdHkgTnVtYmVyIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtYXhpbXVtIGNhY2hlIHNpemUsIG1heSBleHByZXNzXG4gICAgICogbnVtYmVyIG9mIGVudHJpZXMgb3IgbWVtb3J5IGNvbnN1bWVkIGluIGJ5dGVzL21lZ2FieXRlcyBkZXBlbmRpbmcgb24gW1tzaXplRnVuY3Rpb25dXS5cbiAgICAgKiBAcGFyYW0gc2l6ZUZ1bmN0aW9uIEEgZnVuY3Rpb24gZGV0ZXJtaW5pbmcgdGhlIHNpemUgcGVyIGVsZW1lbnQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWF4Q2FwYWNpdHksIHNpemVGdW5jdGlvbiA9ICgpID0+IDEpIHtcbiAgICAgICAgdGhpcy5tYXhDYXBhY2l0eSA9IG1heENhcGFjaXR5O1xuICAgICAgICB0aGlzLnNpemVGdW5jdGlvbiA9IHNpemVGdW5jdGlvbjtcbiAgICAgICAgdGhpcy5jYWNoZVNpemUgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGludGVybmFsIG1hcCBvYmplY3QgdGhhdCBrZWVwcyB0aGUga2V5LXZhbHVlIHBhaXJzIGFuZCB0aGVpciBvcmRlci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG5ld2VzdCBlbnRyeSwgaS5lLiB0aGUgbW9zdCByZWNlbnRseSB1c2VkIGl0ZW0uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5ld2VzdEVudHJ5ID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBvbGRlc3QgZW50cnksIGkuZS4gdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgaXRlbS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub2xkZXN0RW50cnkgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUsIGkuZS4gdGhlIHN1bSBvZiBhbGwgdGhlIHNpemVzIG9mIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgZ2V0U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGNhcGFjaXR5IG9mIHRoZSBjYWNoZSwgaS5lLlxuICAgICAqIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHRoYXQgbWF5IGJlIGNvbnN1bWVkIGJ5IGNhY2hlIGluIE1CXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY2FwYWNpdHkgb2YgdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIGdldENhcGFjaXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhDYXBhY2l0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmV3ZXN0IGVudHJ5IGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIE5ld2VzdCBlbnRyeSBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgZ2V0TmV3ZXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdlc3RFbnRyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb2xkZXN0IGVudHJ5IGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IERvZXMgbm90IHByb21vdGUgdGhlIG9sZGVzdCBpdGVtIGFzIG1vc3QgcmVjZW50bHkgdXNlZCBpdGVtLlxuICAgICAqXG4gICAgICogQHJldHVybnMgT2xkZXN0IGVudHJ5IGluIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXRPbGRlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9sZGVzdEVudHJ5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgY2FjaGUuIElmIGBuZXdDYXBhY2l0eWAgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IGNhY2hlIHNpemUsXG4gICAgICogYWxsIGl0ZW1zIHdpbGwgYmUgZXZpY3RlZCB1bnRpbCB0aGUgY2FjaGUgc2hyaW5rcyB0byBgbmV3Q2FwYWNpdHlgLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5ld0NhcGFjaXR5IFRoZSBuZXcgY2FwYWNpdHkgb2YgdGhpcyBjYWNoZS5cbiAgICAgKi9cbiAgICBzZXRDYXBhY2l0eShuZXdDYXBhY2l0eSkge1xuICAgICAgICB0aGlzLm1heENhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7XG4gICAgICAgIHRoaXMuZXZpY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBvciB1cGRhdGVzIGEga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogSWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0ZWQgaW4gdGhlIGNhY2hlLCBpdCB3aWxsIGJlIHVwZGF0ZWQgYW5kIHByb21vdGVkIHRvIHRoZSBtb3N0IHJlY2VudGx5XG4gICAgICogdXNlZCBpdGVtLlxuICAgICAqXG4gICAgICogSWYgdGhlIGtleSBkaWRuJ3QgZXhpc3QgaW4gdGhlIGNhY2hlLCBpdCB3aWxsIGJlIGluc2VydGVkIGFzIG1vc3QgcmVjZW50bHkgdXNlZCBpdGVtLiBBblxuICAgICAqIGV2aWN0aW9uIG9mIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW0gdGFrZXMgcGxhY2UgaWYgdGhlIGNhY2hlIGV4Y2VlZGVkIGl0cyBjYXBhY2l0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIGtleS12YWx1ZSBwYWlyIHRvIGluc2VydCBvciB1cGRhdGUuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBmb3IgdGhlIGtleS12YWx1ZSBwYWlyIHRvIGluc2VydCBvciB1cGRhdGUuXG4gICAgICogQHRocm93cyBBbiBlcnJvciBpZiB2YWx1ZSBzaXplIGlzIGJpZ2dlciB0aGFuIGNhY2hlIHNpemUuXG4gICAgICovXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWVTaXplID0gdGhpcy5zaXplRnVuY3Rpb24odmFsdWUpO1xuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLm1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVTaXplID0gdGhpcy5jYWNoZVNpemUgLSBlbnRyeS5zaXplICsgdmFsdWVTaXplO1xuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGVudHJ5LnNpemUgPSB2YWx1ZVNpemU7XG4gICAgICAgICAgICB0aGlzLnByb21vdGVFbnRyeShlbnRyeSk7XG4gICAgICAgICAgICB0aGlzLmV2aWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWVTaXplID4gdGhpcy5tYXhDYXBhY2l0eSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IuIFZhbHVlIHNpemUgKCR7dmFsdWVTaXplfSkgaXMgdG8gYmlnIGZvciBjYWNoZSBpdCAoJHt0aGlzLm1heENhcGFjaXR5fSkuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeSA9IG5ldyBFbnRyeShrZXksIHZhbHVlLCB2YWx1ZVNpemUsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5ld2VzdEVudHJ5ID0gdGhpcy5vbGRlc3RFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmV3ZXN0RW50cnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3ZXN0ID0gdGhpcy5uZXdlc3RFbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgZW50cnkub2xkZXIgPSB0aGlzLm5ld2VzdEVudHJ5O1xuICAgICAgICAgICAgICAgICAgICBuZXdlc3QubmV3ZXIgPSBlbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXdlc3RFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWFwLnNldChrZXksIGVudHJ5KTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVTaXplICs9IHZhbHVlU2l6ZTtcbiAgICAgICAgICAgIHRoaXMuZXZpY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIGEga2V5L3ZhbHVlIHBhaXIgaXMgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvb2sgdXAuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBrZXktdmFsdWUgcGFpciBpcyBpbiB0aGUgY2FjaGUsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmhhcyhrZXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rcyB1cCBrZXkgaW4gdGhlIGNhY2hlIGFuZCByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvb2sgdXAuXG4gICAgICogQHJldHVybnMgVGhlIGFzc29jaWF0ZWQgdmFsdWUsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBrZXktdmFsdWUgcGFpciBpcyBub3QgaW4gdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIGdldChrZXkpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLm1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9tb3RlRW50cnkoZW50cnkpO1xuICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgY2FjaGUgYW5kIHJlbW92ZXMgYWxsIHN0b3JlZCBrZXktdmFsdWUgcGFpcnMuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMubmV3ZXN0RW50cnkgPSB0aGlzLm9sZGVzdEVudHJ5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWNoZVNpemUgPSAwO1xuICAgICAgICB0aGlzLm1hcC5jbGVhcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHBsaWNpdGx5IHJlbW92ZXMgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBub3RlOiBUaGlzIGlzIGFuIGV4cGxpY2l0IHJlbW92YWwsIHRodXMsIHRoZSBldmljdGlvbiBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGtleS12YWx1ZSBwYWlyIHRvIGRlbGV0ZS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGtleS12YWx1ZSBwYWlyIGV4aXN0ZWQgYW5kIHdhcyBkZWxldGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWxldGVFbnRyeShlbnRyeSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgZXZpY3QoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLm9sZGVzdEVudHJ5ICE9PSBudWxsICYmIHRoaXMuY2FjaGVTaXplID4gdGhpcy5tYXhDYXBhY2l0eSkge1xuICAgICAgICAgICAgY29uc3QgZXZpY3RlZCA9IHRoaXMuZXZpY3RPbGRlc3QoKTtcbiAgICAgICAgICAgIGlmIChldmljdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXZpY3RPbGRlc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLm9sZGVzdEVudHJ5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtVG9SZW1vdmUgPSB0aGlzLm9sZGVzdEVudHJ5O1xuICAgICAgICAgICAgdGhpcy5vbGRlc3RFbnRyeSA9IGl0ZW1Ub1JlbW92ZS5uZXdlcjtcbiAgICAgICAgICAgIGlmIChpdGVtVG9SZW1vdmUubmV3ZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpdGVtVG9SZW1vdmUubmV3ZXIub2xkZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tYXAuZGVsZXRlKGl0ZW1Ub1JlbW92ZS5rZXkpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZVNpemUgLT0gaXRlbVRvUmVtb3ZlLnNpemU7XG4gICAgICAgICAgICByZXR1cm4gaXRlbVRvUmVtb3ZlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb21vdGVFbnRyeShlbnRyeSkge1xuICAgICAgICBpZiAoZW50cnkgPT09IHRoaXMubmV3ZXN0RW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBhbHJlYWR5IG5ld2VzdCwgbm90aGluZyB0byBkb1xuICAgICAgICAvLyByZS1saW5rIG5ld2VyIGFuZCBvbGRlciBpdGVtc1xuICAgICAgICBpZiAoZW50cnkubmV3ZXIpIHtcbiAgICAgICAgICAgIGVudHJ5Lm5ld2VyLm9sZGVyID0gZW50cnkub2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5Lm9sZGVyKSB7XG4gICAgICAgICAgICBlbnRyeS5vbGRlci5uZXdlciA9IGVudHJ5Lm5ld2VyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeSA9PT0gdGhpcy5vbGRlc3RFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5vbGRlc3RFbnRyeSA9IGVudHJ5Lm5ld2VyO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlLWxpbmsgb3Vyc2VsdmVzXG4gICAgICAgIGVudHJ5Lm5ld2VyID0gbnVsbDtcbiAgICAgICAgZW50cnkub2xkZXIgPSB0aGlzLm5ld2VzdEVudHJ5O1xuICAgICAgICAvLyBmaW5hbGx5LCBzZXQgb3Vyc2VsdmVzIGFzIHRoZSBuZXdlc3QgZW50cnlcbiAgICAgICAgaWYgKHRoaXMubmV3ZXN0RW50cnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld2VzdCA9IHRoaXMubmV3ZXN0RW50cnk7XG4gICAgICAgICAgICBuZXdlc3QubmV3ZXIgPSBlbnRyeTtcbiAgICAgICAgICAgIHRoaXMubmV3ZXN0RW50cnkgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGVFbnRyeShlbnRyeSkge1xuICAgICAgICBpZiAoZW50cnkgPT09IHRoaXMubmV3ZXN0RW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMubmV3ZXN0RW50cnkgPSBlbnRyeS5vbGRlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlbnRyeS5uZXdlcikge1xuICAgICAgICAgICAgZW50cnkubmV3ZXIub2xkZXIgPSBlbnRyeS5vbGRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkgPT09IHRoaXMub2xkZXN0RW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMub2xkZXN0RW50cnkgPSBlbnRyeS5uZXdlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlbnRyeS5vbGRlcikge1xuICAgICAgICAgICAgZW50cnkub2xkZXIubmV3ZXIgPSBlbnRyeS5uZXdlcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlU2l6ZSAtPSBlbnRyeS5zaXplO1xuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0xSVUNhY2hlXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9BcGlDYWNoZVJlcG9zaXRvcnlcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0tleVZhbHVlQ2FjaGVcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5PbHBDbGllbnRTZXR0aW5ncyA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbi8qKlxuICog0KFvbmZpZ3VyZXMgdGhlIGJlaGF2aW91ciBvZiB0aGUgcGxhdGZvcm0gY2xpZW50cyAoZm9yIGV4YW1wbGUsIFtbQ2F0YWxvZ0NsaWVudF1dIG9yIFtbVmVyc2lvbmVkTGF5ZXJDbGllbnRdXSkuXG4gKi9cbmNsYXNzIE9scENsaWVudFNldHRpbmdzIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBjbGFzcy5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZ2V0VmFsaWRUb2tlbiA9IHBhcmFtcy5nZXRUb2tlbjtcbiAgICAgICAgdGhpcy5lbnYgPSBwYXJhbXMuZW52aXJvbm1lbnQ7XG4gICAgICAgIHRoaXMuZG0gPSBwYXJhbXMuZG0gfHwgbmV3IG9scF9zZGtfY29yZV8xLkRhdGFTdG9yZURvd25sb2FkTWFuYWdlcigpO1xuICAgICAgICB0aGlzLmtleVZhbHVlQ2FjaGUgPSBuZXcgb2xwX3Nka19jb3JlXzEuS2V5VmFsdWVDYWNoZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGRvd25sb2FkIG1hbmFnZXIgZm9yIHJlcXVlc3RzLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgW1tEb3dubG9hZE1hbmFnZXJdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXQgZG93bmxvYWRNYW5hZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIHVzZWQgdG8gcmV0dXJuIGEgYFByb21pc2VgIHdpdGggdGhlIGFjY2VzcyB0b2tlbiBmb3IgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBgUHJvbWlzZWAgd2l0aCB0aGUgYWNjZXNzIHRva2VuIHN0cmluZyBmb3IgcmVxdWVzdHMuXG4gICAgICovXG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWxpZFRva2VuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBlbnZpcm9ubWVudCB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGdldCB0aGUgVVJMIG9mIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UuXG4gICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBVUkwgb2YgeW91ciBjdXN0b20gc2VydmljZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyB3aXRoIHRoZSBlbnZpcm9ubWVudCBuYW1lIG9yIHRoZSBVUkwgb2YgeW91ciBsb2NhbCBlbnZpcm9ubWVudC5cbiAgICAgKi9cbiAgICBnZXQgZW52aXJvbm1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FjaGVzIHVzaW5nIGEga2V5LXZhbHVlIHBhaXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgW1tLZXlWYWx1ZUNhY2hlXV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgZ2V0IGNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlWYWx1ZUNhY2hlO1xuICAgIH1cbn1cbmV4cG9ydHMuT2xwQ2xpZW50U2V0dGluZ3MgPSBPbHBDbGllbnRTZXR0aW5ncztcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL09scENsaWVudFNldHRpbmdzXCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2NhY2hlXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi91dGlsc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vY2xpZW50XCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRhdGFTdG9yZURvd25sb2FkTWFuYWdlciA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbi8qKiBAaW50ZXJuYWxcbiAqICdEZWZlcnJlZFByb21pc2UnIHRha2VzIGFuIGV4ZWN1dG9yIGZ1bmN0aW9uIGZvciBleGVjdXRpbmcgaXQgbGF0ZXIsIHdoZW4gW1tleGVjXV0gaXMgY2FsbGVkLlxuICogVGhpcyBjbGFzcyBhbGxvd3Mgd3JhcHBpbmcgb3RoZXIgcHJvbWlzZXMgb3IgbG9uZyBydW5uaW5nIGZ1bmN0aW9ucyBmb3IgbGF0ZXIgZXhlY3V0aW9uLlxuICovXG5jbGFzcyBEZWZlcnJlZFByb21pc2Uge1xuICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlRnVuYyA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLnJlamVjdEZ1bmMgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIGBleGVjYCBpcyBjYWxsZWQgdGhlIGRlZmVycmVkIGV4ZWN1dG9yIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuICAgICAqL1xuICAgIGV4ZWMoKSB7XG4gICAgICAgIHRoaXMuZXhlY3V0b3IoKVxuICAgICAgICAgICAgLnRoZW4odGhpcy5yZXNvbHZlRnVuYylcbiAgICAgICAgICAgIC5jYXRjaCh0aGlzLnJlamVjdEZ1bmMpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFtbRG93bmxvYWRNYW5hZ2VyXV0gaW50ZXJmYWNlIHJlcXVlc3RlZCBieSB0aGUgYGRhdGFzdG9yZS1hcGlgIG1vZHVsZVxuICogZm9yIGZldGNoaW5nIGRhdGEgZnJvbSB0aGUgYmFja2VuZCBvciBzZW5kaW5nIHJlcXVlc3RzIHRvIHRoZSBiYWNrZW5kLlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgeW91IHRvIGZldGNoIGJsb2Igb3IgSlNPTiBkYXRhIHdpdGggYWJvcnRpbmcgb3IgcmUtc2VuZGluZyAob24gdGltZW91dHMpIG1lY2hhbmlzbXNcbiAqIHRoYXQgbGltaXQgbWF4aW11bSBwYXJhbGxlbCByZXF1ZXN0cy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqXG4gKiAqIExpbWl0cyB0aGUgbnVtYmVyIG9mIHBhcmFsbGVsIGRvd25sb2Fkcy4gSXQgaXMgdXNlZnVsIHdoZW4gcmVxdWVzdGluZyBhIGxhcmdlIG51bWJlciBvZiBVUkxzIHRoYXRcbiAqICAgd291bGQgb3RoZXJ3aXNlIHN0YWxsIHRoZSBicm93c2VyLlxuICogKiBSZXRyaWVzIHRoZSBkb3dubG9hZHMgd2l0aCBhbiBpbmNyZWFzaW5nIHRpbWVvdXQgb24gSFRUUCA1MDMgcmVwbGllcy5cbiAqL1xuY2xhc3MgRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBbW0RhdGFTdG9yZURvd25sb2FkTWFuYWdlcl1dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZldGNoRnVuY3Rpb24gVGhlIGRlZmF1bHQgZmV0Y2ggZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIG1heFJldHJpZXMgVGhlIG1heGltdW0gYW1vdW50IG9mIHRyaWVzIHRvIHJlLWZldGNoIGEgcmVzb3VyY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXJdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihmZXRjaEZ1bmN0aW9uID0gZmV0Y2gsIG1heFJldHJpZXMgPSA1KSB7XG4gICAgICAgIHRoaXMuZmV0Y2hGdW5jdGlvbiA9IGZldGNoRnVuY3Rpb247XG4gICAgICAgIHRoaXMubWF4UmV0cmllcyA9IG1heFJldHJpZXM7XG4gICAgICAgIHRoaXMuYWN0aXZlRG93bmxvYWRDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuZG93bmxvYWRRdWV1ZSA9IG5ldyBBcnJheSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWVzIHRoZSBkb3dubG9hZHMgd2l0aCBhbiBpbmNyZWFzaW5nIHRpbWVvdXQgb24gSFRUUCA1MDMgcmVwbGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmZXRjaEZ1bmN0aW9uIFRoZSB0eXBlIG9mIGZldGNoLlxuICAgICAqIEBwYXJhbSByZXRyeUNvdW50IGludCwgVGhlIGNvdW50ZXIgb2YgdHJpZXMgdG8gcmUtZmV0Y2ggcmVzcG9uc2UgYWZ0ZXIgdGhlIDUwMyByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gbWF4UmV0cmllcyBpbnQsIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0cmllcyB0byByZS1mZXRjaCBhZnRlciB0aGUgNTAzIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSB1cmwgc3RyaW5nLCBUaGUgVVJMIG9mIHRoZSBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0gaW5pdCBSZXF1ZXN0SW5pdCwgVGhlIGV4dHJhIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgZmV0Y2hSZXBlYXRlZGx5KGZldGNoRnVuY3Rpb24sIHJldHJ5Q291bnQsIG1heFJldHJpZXMsIHVybCwgaW5pdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgbWF4U3VjY2Vzc1Jlc3BvbnNlQ29kZSA9IDI5OTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaEZ1bmN0aW9uKG9scF9zZGtfY29yZV8xLmFkZFNlbnRXaXRoUGFyYW0odXJsKSwgaW5pdCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlcXVlc3RTaG91bGRSZXRyeU9uRXJyb3IocmVzcG9uc2Uuc3RhdHVzKSB8fFxuICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50ID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8PSBtYXhTdWNjZXNzUmVzcG9uc2VDb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPT09IG9scF9zZGtfY29yZV8xLlNUQVRVU19DT0RFUy5GT1VORCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVRleHQgPSB5aWVsZCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gXCIgfCBJbmZvOiBcIiArIHJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgb2xwX3Nka19jb3JlXzEuSHR0cEVycm9yKHJlc3BvbnNlLnN0YXR1cywgZXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVyci5oYXNPd25Qcm9wZXJ0eShcImlzQ2FuY2VsbGVkXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgIChlcnIuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpICYmIGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCA+IG1heFJldHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIERhdGFTdG9yZURvd25sb2FkTWFuYWdlci53YWl0Rm9yKERhdGFTdG9yZURvd25sb2FkTWFuYWdlci5yZXRyeVRpbWVvdXQgKiByZXRyeUNvdW50KS50aGVuKCgpID0+IERhdGFTdG9yZURvd25sb2FkTWFuYWdlci5mZXRjaFJlcGVhdGVkbHkoZmV0Y2hGdW5jdGlvbiwgcmV0cnlDb3VudCArIDEsIG1heFJldHJpZXMsIHVybCwgaW5pdCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlcXVlc3RTaG91bGRSZXRyeU9uRXJyb3IoY29kZSkge1xuICAgICAgICByZXR1cm4gKChjb2RlID49IG9scF9zZGtfY29yZV8xLlNUQVRVU19DT0RFUy5JTlRFUk5BTF9TRVJWRVJfRVJST1IgJiZcbiAgICAgICAgICAgIGNvZGUgPD0gb2xwX3Nka19jb3JlXzEuU1RBVFVTX0NPREVTLk5FVFdPUktfQ09OTkVDVF9USU1FT1VUKSB8fFxuICAgICAgICAgICAgY29kZSA9PT0gb2xwX3Nka19jb3JlXzEuU1RBVFVTX0NPREVTLlRPX01BTllfUkVRVUVTVFMpO1xuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvcihtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEb3dubG9hZHMgYSBVUkwgYW5kIHJldHVybnMgdGhlIGBSZXNwb25zZWAuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBtZXJnZSBtdWx0aXBsZSByZXF1ZXN0cyB0byB0aGUgc2FtZSBVUkwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgdGhhdCB5b3Ugd2FudCB0byBkb3dubG9hZC5cbiAgICAgKiBAcGFyYW0gaW5pdCBFeHRyYSBwYXJhbWV0ZXJzIGZvciB0aGUgZG93bmxvYWQuXG4gICAgICogQHJldHVybiBUaGUgVVJMIHRoYXQgaXMgdXNlZCB0byBkb3dubG9hZCBkYXRhLlxuICAgICAqL1xuICAgIGRvd25sb2FkKHVybCwgaW5pdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG93bmxvYWRDb3VudCA+PVxuICAgICAgICAgICAgICAgIERhdGFTdG9yZURvd25sb2FkTWFuYWdlci5tYXhQYXJhbGxlbERvd25sb2Fkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gbmV3IERlZmVycmVkUHJvbWlzZSgoKSA9PiB0aGlzLmRvRG93bmxvYWQodXJsLCBpbml0KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZFF1ZXVlLnB1c2goZGVmZXJyZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9Eb3dubG9hZCh1cmwsIGluaXQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZG9Eb3dubG9hZCh1cmwsIGluaXQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICsrdGhpcy5hY3RpdmVEb3dubG9hZENvdW50O1xuICAgICAgICAgICAgcmV0dXJuIERhdGFTdG9yZURvd25sb2FkTWFuYWdlci5mZXRjaFJlcGVhdGVkbHkodGhpcy5mZXRjaEZ1bmN0aW9uLCAwLCB0aGlzLm1heFJldHJpZXMsIHVybCwgaW5pdClcbiAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRvd25sb2FkRG9uZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRG93bmxvYWREb25lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvbkRvd25sb2FkRG9uZSgpIHtcbiAgICAgICAgLS10aGlzLmFjdGl2ZURvd25sb2FkQ291bnQ7XG4gICAgICAgIHRoaXMuZXhlY0RlZmVycmVkRG93bmxvYWQoKTtcbiAgICB9XG4gICAgZXhlY0RlZmVycmVkRG93bmxvYWQoKSB7XG4gICAgICAgIGNvbnN0IGZ1dHVyZSA9IHRoaXMuZG93bmxvYWRRdWV1ZS5wb3AoKTtcbiAgICAgICAgaWYgKGZ1dHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZnV0dXJlLmV4ZWMoKTtcbiAgICB9XG59XG5leHBvcnRzLkRhdGFTdG9yZURvd25sb2FkTWFuYWdlciA9IERhdGFTdG9yZURvd25sb2FkTWFuYWdlcjtcbi8qKlxuICogVGhlIHRpbWVvdXQgKGluIG1pbGxpc2Vjb25kcykgdG8gd2FpdCBiZXR3ZWVuIHJldHJpZXMuIFRoaXMgdGltZW91dCBpcyBtdWx0aXBsaWVkIHdpdGggdGhlXG4gKiBudW1iZXIgb2YgcmV0cmllcy4gRmlyc3QgcmV0cnkgd2FpdHMgZm9yIDAgbXMsIHNlY29uZCByZXRyeSBmb3IgNTAwIG1zLCB0aGlyZCBmb3IgMTAwMCBtcywgYW5kXG4gKiBzbyBvbi5cbiAqL1xuRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyLnJldHJ5VGltZW91dCA9IDUwMDtcbi8qKiBUaGUgbnVtYmVyIG9mIG1heGltdW0gcGFyYWxsZWwgZG93bmxvYWRzLiAqL1xuRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyLm1heFBhcmFsbGVsRG93bmxvYWRzID0gMTY7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuLyoqXG4gKiBBZGRzIGJlYXJlciB0b2tlbiB0byB0aGUgcmVxdWVzdCBoZWFkZXJzXG4gKiBAcGFyYW0gZ2V0QmVhcmVyVG9rZW4gYXN5bmMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRva2VuIHN0cmluZy5cbiAqIEBwYXJhbSBpbml0IHBhcmFtcyB0byB0aGUgcmVxdWVzdC4gQHNlZSBSZXF1ZXN0SW5pdCBpbnRlcmZhY2UuXG4gKlxuICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHVwZGF0ZWQgcmVxdWVzdCBwYXJhbXMgKHdpdGggYWRkZWQgdG9rZW4gdG8gdGhlIGhlYWRlcnMpLlxuICovXG5mdW5jdGlvbiBhZGRCZWFyZXJUb2tlbihnZXRCZWFyZXJUb2tlbiwgaW5pdCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0geWllbGQgZ2V0QmVhcmVyVG9rZW4oKTtcbiAgICAgICAgaWYgKGluaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gaWYgZW1wdHkgUmVxdWVzdEluaXQsIGp1c3QgY3JlYXRlIG5ldyBvbmUgYW5kIGFkZCBCZWFyZXIgcm9rZW4gdG8gdGhlIGhlYWRlcnNcbiAgICAgICAgICAgIGluaXQgPSB7fTtcbiAgICAgICAgICAgIGluaXQuaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgICAgICBpbml0LmhlYWRlcnMuYXBwZW5kKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIiArIHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgaW5pdC5oZWFkZXJzIHRvIHRoZSBIZWFkZXJzIGlmIHJlY2VpdmVkIGEgcGxhaW4gb2JqZWN0XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzKTtcbiAgICAgICAgICAgIC8vIGFkZGluZyB0b2tlbiB0byB0aGUgaGVhZGVyc1xuICAgICAgICAgICAgaGVhZGVycy5hcHBlbmQoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgdG9rZW4pO1xuICAgICAgICAgICAgaW5pdC5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGluaXQpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBBZGRzIHVzZXItYWdlbnQgdG8gdGhlIHJlcXVlc3QgaGVhZGVyc1xuICogQHBhcmFtIGluaXQgcGFyYW1zIHRvIHRoZSByZXF1ZXN0LiBAc2VlIFJlcXVlc3RJbml0IGludGVyZmFjZS5cbiAqXG4gKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdXBkYXRlZCByZXF1ZXN0IHBhcmFtcyAod2l0aCBhZGRlZCB1c2VyLWFnZW50IHRvIHRoZSBoZWFkZXJzKS5cbiAqL1xuZnVuY3Rpb24gYWRkVXNlckFnZW50KGluaXQpIHtcbiAgICBjb25zdCBVU0VSX0FHRU5UID0gYE9MUC1UUy1TREsvJHtvbHBfc2RrX2NvcmVfMS5MSUJfVkVSU0lPTn1gO1xuICAgIGlmIChpbml0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gaWYgZW1wdHkgUmVxdWVzdEluaXQsIGp1c3QgY3JlYXRlIG5ldyBvbmUgYW5kIGFkZCB1c2VyLWFnZW50IHRvIHRoZSBoZWFkZXJzXG4gICAgICAgIGluaXQgPSB7fTtcbiAgICAgICAgaW5pdC5oZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIGNvbnZlcnQgaW5pdC5oZWFkZXJzIHRvIHRoZSBIZWFkZXJzIGlmIHJlY2VpdmVkIGEgcGxhaW4gb2JqZWN0XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIH1cbiAgICByZXR1cm4gaW5pdDtcbn1cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgW1tSZXF1ZXN0QnVpbGRlcl1dIGFuZCB0aGUgYGRvd25sb2FkQmxvYmAgYW5kIGBkb3dubG9hZGAgbWV0aG9kcy5cbiAqIEl0IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBbW1JlcXVlc3RCdWlsZGVyXV0gaW5zdGFuY2Ugd2l0aCBhIGJhc2UgVVJMIG9mIGEgc2VydmljZS5cbiAqL1xuY2xhc3MgRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIgZXh0ZW5kcyBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlJlcXVlc3RCdWlsZGVyIHtcbiAgICAvKipcbiAgICAgKiBDZXJhdGVzIHRoZSBbW0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG93bmxvYWRNYW5hZ2VyIFRoZSBjb25maWd1cmVkIGluc3RhbmNlIG9mIHRoZSBbW0Rvd25sb2FkTWFuYWdlcl1dIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBZb3UgY2FuIHVzZSBvdXIgZGVmYXVsdCBgRGF0YXN0b3JlRG93bmxvYWRNYW5hZ2VyYCBvciBjcmVhdGUgeW91ciBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0gYmFzZVVybCBUaGUgVVJMIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZ2V0QmVhcmVyVG9rZW4gUmV0cmlldmVzIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgW1tEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcl1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRvd25sb2FkTWFuYWdlciwgYmFzZVVybCwgZ2V0QmVhcmVyVG9rZW4sIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIC8qKiBUaGUgVVJMIHN0cmluZy4gKi9cbiAgICAgICAgc3VwZXIoYmFzZVVybCk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyID0gZG93bmxvYWRNYW5hZ2VyO1xuICAgICAgICB0aGlzLmdldEJlYXJlclRva2VuID0gZ2V0QmVhcmVyVG9rZW47XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwgPSBhYm9ydFNpZ25hbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWRzIGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgVVJMLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhIHRoYXQgeW91IHdhbnQgdG8gZG93bmxvYWQuXG4gICAgICogQHBhcmFtIGluaXQgVGhlIGhlbHBlciBvYmplY3QgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBnZW5lcmljcy5cbiAgICAgKi9cbiAgICBkb3dubG9hZCh1cmwsIGluaXQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0geWllbGQgdGhpcy5hZGRCZWFyZXJUb2tlbihpbml0KTtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLmFkZFVzZXJBZ2VudChvcHRpb25zKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHRoaXMuYWRkQWJvcnRTaWduYWwoaW5pdCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRNYW5hZ2VyXG4gICAgICAgICAgICAgICAgLmRvd25sb2FkKHVybCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gcmVzdWx0Lmpzb24oKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IFByb21pc2UucmVqZWN0KGVycikpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWRzIHRoZSBibG9iIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgYmxvYiBkYXRhIHRoYXQgeW91IHdhbnQgdG8gZG93bmxvYWQuXG4gICAgICogQHBhcmFtIGluaXQgVGhlIGhlbHBlciBvYmplY3QgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm4gVGhlIGJsb2IgZGF0YS5cbiAgICAgKi9cbiAgICBkb3dubG9hZEJsb2IodXJsLCBpbml0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHlpZWxkIHRoaXMuYWRkQmVhcmVyVG9rZW4oaW5pdCk7XG4gICAgICAgICAgICBvcHRpb25zID0gdGhpcy5hZGRVc2VyQWdlbnQob3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAodGhpcy5hYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB0aGlzLmFkZEFib3J0U2lnbmFsKGluaXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWFuYWdlclxuICAgICAgICAgICAgICAgIC5kb3dubG9hZCh1cmwsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZEJlYXJlclRva2VuKGluaXQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGRCZWFyZXJUb2tlbih0aGlzLmdldEJlYXJlclRva2VuLCBpbml0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZFVzZXJBZ2VudChpbml0KSB7XG4gICAgICAgIHJldHVybiBhZGRVc2VyQWdlbnQoaW5pdCk7XG4gICAgfVxuICAgIGFkZEFib3J0U2lnbmFsKGluaXQpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGluaXQgfHwge307XG4gICAgICAgIG9wdGlvbnMuc2lnbmFsID0gdGhpcy5hYm9ydFNpZ25hbDtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxufVxuZXhwb3J0cy5EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlciA9IERhdGFTdG9yZVJlcXVlc3RCdWlsZGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5GZXRjaE9wdGlvbnMgPSB2b2lkIDA7XG4vKipcbiAqIEVudW1lcmF0ZXMgdGhlIGZldGNoIG9wdGlvbiB0aGF0IGNvbnRyb2xzIGhvdyByZXF1ZXN0cyBhcmUgaGFuZGxlZC5cbiAqL1xudmFyIEZldGNoT3B0aW9ucztcbihmdW5jdGlvbiAoRmV0Y2hPcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQSBkZWZhdWx0IG9wdGlvbi4gUXVlcmllcyB0aGUgbmV0d29yayBpZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIG5vdFxuICAgICAqIGZvdW5kIGluIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBGZXRjaE9wdGlvbnNbRmV0Y2hPcHRpb25zW1wiT25saW5lSWZOb3RGb3VuZFwiXSA9IDBdID0gXCJPbmxpbmVJZk5vdEZvdW5kXCI7XG4gICAgLyoqXG4gICAgICogU2tpcHMgY2FjaGUgbG9va3VwcyBhbmQgcXVlcmllcyB0aGUgbmV0d29yayByaWdodCBhd2F5LlxuICAgICAqL1xuICAgIEZldGNoT3B0aW9uc1tGZXRjaE9wdGlvbnNbXCJPbmxpbmVPbmx5XCJdID0gMV0gPSBcIk9ubGluZU9ubHlcIjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGltbWVkaWF0ZWx5IGlmIGEgY2FjaGUgbG9va3VwIGZhaWxzLlxuICAgICAqL1xuICAgIEZldGNoT3B0aW9uc1tGZXRjaE9wdGlvbnNbXCJDYWNoZU9ubHlcIl0gPSAyXSA9IFwiQ2FjaGVPbmx5XCI7XG59KShGZXRjaE9wdGlvbnMgPSBleHBvcnRzLkZldGNoT3B0aW9ucyB8fCAoZXhwb3J0cy5GZXRjaE9wdGlvbnMgPSB7fSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IUk4gPSB2b2lkIDA7XG4vKipcbiAqIENvbnRhaW5zIGEgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pICZuZGFzaDsgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgcmVzb3VyY2VzIHN1Y2ggYXMgY2F0YWxvZ3MsIHNjaGVtYXMsIGFuZCBwaXBlbGluZXMuXG4gKi9cbmNsYXNzIEhSTiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBIUk4gYmFzZWQgb24gdGhlIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gW1tIUk5EYXRhXV0uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFR5cGVTY3JpcHRcbiAgICAgKiBjb25zdCBteUhybiA9IG5ldyBIUk4oe1xuICAgICAqICAgICBwYXJ0aXRpb246ICdoZXJlLWRldicsXG4gICAgICogICAgIHNlcnZpY2U6ICdkYXRhJyxcbiAgICAgKiAgICAgcmVzb3VyY2U6ICdleGFtcGxlLWNhdGFsb2cnXG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBVc2VzIFtbZnJvbVN0cmluZ11dIHRvIGNyZWF0ZSBhbiBIUk4gZnJvbSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgZnJvbSB0aGlzIEhSTi5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW0hSTl1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBIUk4gZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBIUk4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBgaHJuOmhlcmU6ZGF0YTo6OmV4YW1wbGUtY2F0YWxvZ2BcbiAgICAgKlxuICAgICAqIEBwYXJhbSBocm4gVGhlIEhSTiBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgbmV3IEhSTi5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhocm4pIHtcbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIC0gYWxzbyBhbGxvdyBodHRwIGFuZCBodHRwcyBhcyAnY2F0YWxvZy11cmwnIGxvY2FsIFVSTHNcbiAgICAgICAgaWYgKGhybi5zdGFydHNXaXRoKFwiaHR0cDpcIikgfHwgaHJuLnN0YXJ0c1dpdGgoXCJodHRwczpcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSFJOKHtcbiAgICAgICAgICAgICAgICBwYXJ0aXRpb246IFwiY2F0YWxvZy11cmxcIixcbiAgICAgICAgICAgICAgICBzZXJ2aWNlOiBcImRhdGFzdG9yZVwiLFxuICAgICAgICAgICAgICAgIHJlZ2lvbjogXCJcIixcbiAgICAgICAgICAgICAgICBhY2NvdW50OiBcIlwiLFxuICAgICAgICAgICAgICAgIHJlc291cmNlOiBlbmNvZGVVUklDb21wb25lbnQoaHJuKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGhybi5zcGxpdChcIjpcIik7XG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA8IHRoaXMuRU5UUklFU19DT1VOVCB8fCBlbnRyaWVzWzBdICE9PSBcImhyblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEhSTlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhSTih7XG4gICAgICAgICAgICBwYXJ0aXRpb246IGVudHJpZXNbdGhpcy5QQVJUSVRJT05fUE9TXSxcbiAgICAgICAgICAgIHNlcnZpY2U6IGVudHJpZXNbdGhpcy5TRVJWSUNFX1BPU10sXG4gICAgICAgICAgICByZWdpb246IGVudHJpZXNbdGhpcy5SRUdJT05fUE9TXSxcbiAgICAgICAgICAgIGFjY291bnQ6IGVudHJpZXNbdGhpcy5BQ0NPVU5UX1BPU10sXG4gICAgICAgICAgICByZXNvdXJjZTogZW50cmllcy5zbGljZSh0aGlzLlJFU09VUkNFX1BPUykuam9pbihcIjpcIilcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgSFJOIHRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBocm46cGFydGl0aW9uOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBIUk4uXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiAoXCJocm46XCIgK1xuICAgICAgICAgICAgdGhpcy5kYXRhLnBhcnRpdGlvbiArXG4gICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICB0aGlzLmRhdGEuc2VydmljZSArXG4gICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICAodGhpcy5kYXRhLnJlZ2lvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHRoaXMuZGF0YS5yZWdpb24pICtcbiAgICAgICAgICAgIFwiOlwiICtcbiAgICAgICAgICAgICh0aGlzLmRhdGEuYWNjb3VudCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHRoaXMuZGF0YS5hY2NvdW50KSArXG4gICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICB0aGlzLmRhdGEucmVzb3VyY2UpO1xuICAgIH1cbn1cbmV4cG9ydHMuSFJOID0gSFJOO1xuSFJOLlBBUlRJVElPTl9QT1MgPSAxO1xuSFJOLlNFUlZJQ0VfUE9TID0gMjtcbkhSTi5SRUdJT05fUE9TID0gMztcbkhSTi5BQ0NPVU5UX1BPUyA9IDQ7XG5IUk4uUkVTT1VSQ0VfUE9TID0gNTtcbkhSTi5FTlRSSUVTX0NPVU5UID0gSFJOLlJFU09VUkNFX1BPUyArIDE7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkh0dHBFcnJvciA9IHZvaWQgMDtcbi8qKlxuICogUHJvdmlkZXMgbW9yZSB1c2FibGUgZXJyb3JzIGZyb20gdGhlIEhFUkUgcGxhdGZvcm0gU2VydmljZXMuXG4gKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIGluIHRoZSBtZXRob2RzXG4gKiB0byBwcm9wYWdhdGUgZXJyb3JzIHdpdGggYW4gSFRUUCBzdGF0dXMgY29kZSBhbmQgd2l0aCBhIG1lc3NhZ2VcbiAqIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIGR1cmluZyB0aGUgcmVxdWVzdC5cbiAqIFRoZSBgSHR0cEVycm9yYCBjbGFzcyBleHRlbmRzIGdlbmVyaWMgYEVycm9yYCBjbGFzcyBmcm9tIFY4IGFuZFxuICogYWRkcyBwcm9wZXJ0eSBjb2RlIHRvIHRoZSBIVFRQIHN0YXR1c2VzLlxuICovXG5jbGFzcyBIdHRwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyB0aGUgYEh0dHBFcnJvcmAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBlcnJvciBzdGF0dXMgbnVtYmVyLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHN0YXR1cywgbWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiSHR0cEVycm9yXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZXJyb3IgaXMgYW4gSFRUUCBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgYEVycm9yYCBvYmplY3QgdGhhdCBpcyBjaGVja2VkLlxuICAgICAqIEByZXR1cm5zIFRydWUgaXMgdGhlIGdpdmVuIGVycm9yIGlzIGFuIEhUVFAgZXJyb3I7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNIdHRwRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yLm5hbWUgPT09IFwiSHR0cEVycm9yXCI7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwRXJyb3IgPSBIdHRwRXJyb3I7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVxdWVzdEZhY3RvcnkgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuY29uc3QgTUlMTElTRUNPTkRTX0lOX1NFQ09ORCA9IDEwMDA7XG4vKipcbiAqIEEgaGVscGVyIHV0aWxzIHRoYXQgbWFrZXMgdGhlIGBSZXF1ZXN0YCBvYmplY3Qgd2l0aCB0aGUgYmFzZSBVUkxzIG9mIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UsIHRva2VuIGNhbGxiYWNrLCBhbmQgZG93bmxvYWQgbWFuYWdlci5cbiAqXG4gKiBBbHNvLCB5b3UgY2FuIHVzZSBpdCB0byBnZXQgdGhlIGJhc2UgVVJMcyBvZiB0aGUgQVBJIExvb2t1cCBTZXJ2aWNlLlxuICovXG5jbGFzcyBSZXF1ZXN0RmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICogRmFjdG9yeSBtZXRob2QgZm9yIGJ1aWxkaW5nIFtbRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXJdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBpbiB0aGUgQVBJLlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgc2VydmljZS5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gaHJuIEEgSEVSRSBSZXNvdXJjZSBOYW1lIChbW0hSTl1dKSBvZiB0aGUgY2F0YWxvZy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgUHJvbWlzZSB3aXRoIGNvbnN0cnVjdGVkIFtbRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXJdXS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBSZXF1ZXN0RmFjdG9yeS5nZXRCYXNlVXJsKHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgc2V0dGluZ3MsIGhybikudGhlbigoYmFzZVVybCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlVXJsXG4gICAgICAgICAgICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKG5ldyBvbHBfc2RrX2NvcmVfMS5EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcihzZXR0aW5ncy5kb3dubG9hZE1hbmFnZXIsIGJhc2VVcmwsIHNldHRpbmdzLnRva2VuLCBhYm9ydFNpZ25hbCkpXG4gICAgICAgICAgICAgICAgICAgIDogUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGJhc2UgdXJsIHRvIHRoZSBzZXJ2aWNlOiAke3NlcnZpY2VOYW1lfWApKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiYXNlIFVSTCBvZiB0aGUgQVBJIHNlcnZpY2UgdGhhdCBzdXBwb3J0cyBjYWNoaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBBUEkgc2VydmljZS5cbiAgICAgKiBAcGFyYW0gc2VydmljZVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGhybiBUaGUgW1tIUk5dXSBvZiB0aGUgY2F0YWxvZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIFByb21pc2Ugd2l0aCB0aGUgYmFzZSBVUkwgb2YgdGhlIHNlcnZpY2UuXG4gICAgICovXG4gICAgc3RhdGljIGdldEJhc2VVcmwoc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uLCBzZXR0aW5ncywgaHJuKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBOT1RfRk9VTkRfQ09ERSA9IDQwNDtcbiAgICAgICAgICAgIGNvbnN0IE5PX0NPTlRFTlRfQ09ERSA9IDIwNDtcbiAgICAgICAgICAgIGNvbnN0IGFwaUNhY2hlID0gbmV3IG9scF9zZGtfY29yZV8xLkFwaUNhY2hlUmVwb3NpdG9yeShzZXR0aW5ncy5jYWNoZSwgaHJuKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSBhcGlDYWNoZS5nZXQoc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uLCBcImFwaVwiKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlTWF4QWdlID0gYXBpQ2FjaGUuZ2V0KHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgXCJhZ2VcIik7XG4gICAgICAgICAgICBjb25zdCBjYWNoZU9ubHlWZXJzaW9uID0gXCJ2MVwiO1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBpZiAoYmFzZVVybCAmJiBjYWNoZU1heEFnZSAmJiBub3cgPCBwYXJzZUludChjYWNoZU1heEFnZSwgMTApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShiYXNlVXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxvb2tVcFVybCA9IG9scF9zZGtfY29yZV8xLmdldEVudkxvb2tVcFVybChzZXR0aW5ncy5lbnZpcm9ubWVudCk7XG4gICAgICAgICAgICBjb25zdCBsb29rVXBBcGlSZXF1ZXN0ID0gbmV3IG9scF9zZGtfY29yZV8xLkRhdGFTdG9yZVJlcXVlc3RCdWlsZGVyKHNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgbG9va1VwVXJsLCBzZXR0aW5ncy50b2tlbik7XG4gICAgICAgICAgICBjb25zdCBsb29rdXBQcm9taXNlID0gaHJuXG4gICAgICAgICAgICAgICAgPyBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkxvb2t1cEFwaS5nZXRSZXNvdXJjZUFQSUxpc3QobG9va1VwQXBpUmVxdWVzdCwge1xuICAgICAgICAgICAgICAgICAgICBocm46IGhybi50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTG9va3VwQXBpLmdldFBsYXRmb3JtQVBJTGlzdChsb29rVXBBcGlSZXF1ZXN0KTtcbiAgICAgICAgICAgIHJldHVybiBsb29rdXBQcm9taXNlXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3ApID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWF4QWdlO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVDb250cm9sID0gcmVzcC5oZWFkZXJzLmdldChcImNhY2hlLWNvbnRyb2xcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSBjYWNoZUNvbnRyb2wubWF0Y2goL21heC1hZ2U9KFxcZCspLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhBZ2UgPSBtYXhTaXplID8gcGFyc2VJbnQobWF4U2l6ZVsxXSwgMTApIDogMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCByZXNwLmpzb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb2xwX3Nka19jb3JlXzEuSHR0cEVycm9yKHJlcy5zdGF0dXMgfHwgTk9fQ09OVEVOVF9DT0RFLCByZXMudGl0bGUgfHwgXCJObyBjb250ZW50XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udmVyc2lvbiA9PT0gY2FjaGVPbmx5VmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBpQ2FjaGUucHV0KGl0ZW0uYXBpLCBpdGVtLnZlcnNpb24sIGl0ZW0uYmFzZVVSTCwgXCJhcGlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4QWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QWdlICogTUlMTElTRUNPTkRTX0lOX1NFQ09ORDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlDYWNoZS5wdXQoaXRlbS5hcGksIGl0ZW0udmVyc2lvbiwgdGltZS50b1N0cmluZygpLCBcImFnZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VVcmxJbmRleCA9IHJlcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmFwaSA9PT0gc2VydmljZU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgaXRlbS52ZXJzaW9uID09PSBzZXJ2aWNlVmVyc2lvbik7XG4gICAgICAgICAgICAgICAgaWYgKGJhc2VVcmxJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9scF9zZGtfY29yZV8xLkh0dHBFcnJvcihOT1RfRk9VTkRfQ09ERSwgYE5vIEJhc2VVcmwgZm91bmQgZm9yICR7c2VydmljZU5hbWV9LCAke3NlcnZpY2VWZXJzaW9ufSAke2hybiA/IGhybi50b1N0cmluZygpIDogXCJcIn1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc1tiYXNlVXJsSW5kZXhdLmJhc2VVUkw7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IFByb21pc2UucmVqZWN0KGVycikpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RGYWN0b3J5ID0gUmVxdWVzdEZhY3Rvcnk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVGlsZUtleSA9IHZvaWQgMDtcbi8qKlxuICogVGhlIGBUaWxlS2V5YCBpbnN0YW5jZXMgYXJlIHVzZWQgdG8gYWRkcmVzcyBhIHRpbGUgaW4gYSBxdWFkdHJlZS5cbiAqXG4gKiBBIHRpbGUga2V5IGlzIGRlZmluZWQgYnkgYSByb3csIGEgY29sdW1uLCBhbmQgYSBsZXZlbC4gVGhlIHRyZWUgaGFzIGEgcm9vdCBhdCBsZXZlbCAwLCB3aXRoIG9uZVxuICogc2luZ2xlIHRpbGUuIE9uIGV2ZXJ5IGxldmVsLCBlYWNoIHRpbGUgaXMgZGl2aWRlZCBpbnRvIGZvdXIgY2hpbGRyZW4gKHRoZXJlZm9yZSB0aGUgbmFtZVxuICogcXVhZHRyZWUpLlxuICpcbiAqIFdpdGhpbiBlYWNoIFtbbGV2ZWxdXSwgYW55IHBhcnRpY3VsYXIgdGlsZSBpcyBhZGRyZXNzZWQgd2l0aCBbW3Jvd11dIGFuZCBbW2NvbHVtbl1dLiBUaGUgbnVtYmVyXG4gKiBvZiByb3dzIGFuZCBjb2x1bW5zIGluIGVhY2ggbGV2ZWwgaXMgMiB0byB0aGUgcG93ZXIgb2YgdGhlIGxldmVsLiBUaGlzIG1lYW5zOiBPbiBsZXZlbCAwLCBvbmx5XG4gKiBvbmUgdGlsZSBleGlzdHMsIFtbY29sdW1uc0F0TGV2ZWxdXSgpIGFuZCBbW3Jvd3NBdExldmVsXV0oKSBhcmUgYm90aCAxLiBPbiBsZXZlbCAxLCA0IHRpbGVzXG4gKiBleGlzdCwgaW4gMiByb3dzIGFuZCAyIGNvbHVtbnMuIE9uIGxldmVsIDIgd2UgaGF2ZSAxNiB0aWxlcywgaW4gNCByb3dzIGFuZCA0IGNvbHVtbnMuIEFuZCBzbyBvbi5cbiAqXG4gKiBBIHRpbGUga2V5IGlzIHVzdWFsbHkgY3JlYXRlZCB1c2luZyBbW2Zyb21Sb3dDb2x1bW5MZXZlbF1dKCkgbWV0aG9kLlxuICpcbiAqIGBUaWxlS2V5YCBpbnN0YW5jZXMgYXJlIGltbXV0YWJsZSwgYWxsIG1lbWJlcnMgcmV0dXJuIG5ldyBpbnN0YW5jZXMgb2YgYFRpbGVLZXlgIGFuZCBkbyBub3RcbiAqIG1vZGlmeSB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICpcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGxpa2UgW1twYXJlbnRdXSgpLCBbW2NoYW5nZWRMZXZlbEJ5XV0oKSwgYW5kIFtbY2hhbmdlZExldmVsVG9dXSgpIGFsbG93IGZvclxuICogZWFzeSB2ZXJ0aWNhbCBuYXZpZ2F0aW9uIG9mIHRoZSB0cmVlLiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByb3dzIGFuZCBjb2x1bW5zIGluIHRoZSB0aWxlJ3NcbiAqIGxldmVsIGlzIGdpdmVuIHdpdGggW1tyb3dDb3VudF1dKCkgYW5kIFtbY29sdW1uQ291bnRdXSgpLlxuICpcbiAqIFRpbGUga2V5cyBjYW4gYmUgY3JlYXRlZCBmcm9tIGFuZCBjb252ZXJ0ZWQgaW50byB2YXJpb3VzIGFsdGVybmF0aXZlIGZvcm1hdHM6XG4gKlxuICogIC0gW1t0b1F1YWRLZXldXSgpIC8gW1tmcm9tUXVhZEtleV1dKCkgLSBzdHJpbmcgcmVwcmVzZW50YXRpb24gNC1iYXNlZFxuICogIC0gW1t0b0hlcmVUaWxlXV0oKSAvIFtbZnJvbUhlcmVUaWxlXV0oKSAtIHN0cmluZyByZXByZXNlbnRhdGlvbiAxMC1iYXNlZFxuICogIC0gW1ttb3J0b25Db2RlXV0oKSAvIFtbZnJvbU1vcnRvbkNvZGVdXSgpIC0gbnVtYmVyIHJlcHJlc2VudGF0aW9uXG4gKlxuICogTm90ZSAtIGFzIEphdmFTY3JpcHQncyBudW1iZXIgdHlwZSBjYW4gaG9sZCA1MyBiaXRzIGluIGl0cyBtYW50aXNzYSwgb25seSBsZXZlbHMgdXAgdG8gMjYgY2FuIGJlXG4gKiByZXByZXNlbnRlZCBpbiB0aGUgbnVtYmVyIHJlcHJlc2VudGF0aW9uIHJldHVybmVkIGJ5IFtbbW9ydG9uQ29kZV1dKCkuXG4gKi9cbmNsYXNzIFRpbGVLZXkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW1tdXRhYmxlIGluc3RhbmNlIG9mIGEgYFRpbGVLZXlgLlxuICAgICAqXG4gICAgICogRm9yIHRoZSBiZXR0ZXIgcmVhZGFiaWxpdHksIFtbVGlsZUtleS5mcm9tUm93Q29sdW1uTGV2ZWxdXSBzaG91bGQgYmUgcHJlZmVycmVkLlxuICAgICAqXG4gICAgICogTm90ZSAtIHJvdyBhbmQgY29sdW1uIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSByb3dzL2NvbHVtbnMgZm9yIHRoZSBnaXZlbiBsZXZlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByb3cgUmVwcmVzZW50cyB0aGUgcm93IGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKiBAcGFyYW0gY29sdW1uIFJlcHJlc2VudHMgdGhlIGNvbHVtbiBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICogQHBhcmFtIGxldmVsIFJlcHJlc2VudHMgdGhlIGxldmVsIGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihyb3csIGNvbHVtbiwgbGV2ZWwpIHtcbiAgICAgICAgdGhpcy5yb3cgPSByb3c7XG4gICAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uO1xuICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0aWxlIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByb3cgVGhlIHJlcXVlc3RlZCByb3cuIE11c3QgYmUgbGVzcyB0aGFuIDIgdG8gdGhlIHBvd2VyIG9mIGxldmVsLlxuICAgICAqIEBwYXJhbSBjb2x1bW4gVGhlIHJlcXVlc3RlZCBjb2x1bW4uIE11c3QgYmUgbGVzcyB0aGFuIDIgdG8gdGhlIHBvd2VyIG9mIGxldmVsLlxuICAgICAqIEBwYXJhbSBsZXZlbCBUaGUgcmVxdWVzdGVkIGxldmVsLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tUm93Q29sdW1uTGV2ZWwocm93LCBjb2x1bW4sIGxldmVsKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZUtleShyb3csIGNvbHVtbiwgbGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGlsZSBrZXkgZnJvbSBhIHF1YWQgc3RyaW5nLlxuICAgICAqXG4gICAgICogVGhlIHF1YWQgc3RyaW5nIGNhbiBiZSBjcmVhdGVkIHdpdGggW1t0b1F1YWRLZXldXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBxdWFka2V5IFRoZSBxdWFka2V5IHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgYFRpbGVLZXlgLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tUXVhZEtleShxdWFka2V5KSB7XG4gICAgICAgIGNvbnN0IGxldmVsID0gcXVhZGtleS5sZW5ndGg7XG4gICAgICAgIGxldCByb3cgPSAwO1xuICAgICAgICBsZXQgY29sdW1uID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFka2V5Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXNrID0gMSA8PCBpO1xuICAgICAgICAgICAgY29uc3QgZCA9IHBhcnNlSW50KHF1YWRrZXkuY2hhckF0KGxldmVsIC0gaSAtIDEpLCAxMCk7XG4gICAgICAgICAgICBpZiAoZCAmIDB4MSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiB8PSBtYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGQgJiAweDIpIHtcbiAgICAgICAgICAgICAgICByb3cgfD0gbWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVGlsZUtleS5mcm9tUm93Q29sdW1uTGV2ZWwocm93LCBjb2x1bW4sIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRpbGUga2V5IGZyb20gYSBudW1lcmljIE1vcnRvbiBjb2RlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqXG4gICAgICogWW91IGNhbiBjb252ZXJ0IGEgdGlsZSBrZXkgaW50byBhIG51bWVyaWMgTW9ydG9uIGNvZGUgd2l0aCBbW21vcnRvbkNvZGVdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBxdWFkS2V5NjQgVGhlIE1vcnRvbiBjb2RlIHRvIGJlIGNvbnZlcnRlZC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiBbW1RpbGVLZXldXS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbU1vcnRvbkNvZGUocXVhZEtleTY0KSB7XG4gICAgICAgIGxldCBsZXZlbCA9IDA7XG4gICAgICAgIGxldCByb3cgPSAwO1xuICAgICAgICBsZXQgY29sdW1uID0gMDtcbiAgICAgICAgbGV0IHF1YWRLZXkgPSBxdWFkS2V5NjQ7XG4gICAgICAgIHdoaWxlIChxdWFkS2V5ID4gMSkge1xuICAgICAgICAgICAgY29uc3QgbWFzayA9IDEgPDwgbGV2ZWw7XG4gICAgICAgICAgICBpZiAocXVhZEtleSAmIDB4MSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiB8PSBtYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHF1YWRLZXkgJiAweDIpIHtcbiAgICAgICAgICAgICAgICByb3cgfD0gbWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldmVsKys7XG4gICAgICAgICAgICBxdWFkS2V5ID0gKHF1YWRLZXkgLSAocXVhZEtleSAmIDB4MykpIC8gNDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChyb3csIGNvbHVtbiwgbGV2ZWwpO1xuICAgICAgICByZXN1bHQubV9tb3J0b25Db2RlID0gcXVhZEtleTY0O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGlsZSBrZXkgZnJvbSBhIGhlcmV0aWxlIGNvZGUgc3RyaW5nLlxuICAgICAqXG4gICAgICogVGhlIHN0cmluZyBjYW4gYmUgY3JlYXRlZCB3aXRoIFtbdG9IZXJlVGlsZV1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRrZXk2NCBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBIRVJFIHRpbGUga2V5LlxuICAgICAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIGBUaWxlS2V5YC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUhlcmVUaWxlKHF1YWRrZXk2NCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBUaWxlS2V5LmZyb21Nb3J0b25Db2RlKHBhcnNlSW50KHF1YWRrZXk2NCwgMTApKTtcbiAgICAgICAgcmVzdWx0Lm1faGVyZVRpbGUgPSBxdWFka2V5NjQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29sdW1ucyBhdCBhIGdpdmVuIGxldmVsLlxuICAgICAqXG4gICAgICogVGhpcyBpcyAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWwgVGhlIGxldmVsIGZvciB3aGljaCB0byByZXR1cm4gdGhlIG51bWJlciBvZiBjb2x1bW5zLlxuICAgICAqIEByZXR1cm5zIFRoZSBhdmFpbGFibGUgY29sdW1ucyBhdCB0aGUgZ2l2ZW4gbGV2ZWwuXG4gICAgICovXG4gICAgc3RhdGljIGNvbHVtbnNBdExldmVsKGxldmVsKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdygyLCBsZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgcm93cyBhdCBhIGdpdmVuIGxldmVsLlxuICAgICAqXG4gICAgICogVGhpcyBpcyAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWwgVGhlIGxldmVsIGZvciB3aGljaCB0byByZXR1cm4gdGhlIG51bWJlciBvZiByb3dzLlxuICAgICAqIEByZXR1cm5zIFRoZSBhdmFpbGFibGUgcm93cyBhdCB0aGUgZ2l2ZW4gbGV2ZWwuXG4gICAgICovXG4gICAgc3RhdGljIHJvd3NBdExldmVsKGxldmVsKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdygyLCBsZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgYFRpbGVLZXlgIGluIGEgY2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSBsZXZlbCBmb3IgdGhlIHRpbGUga2V5LlxuICAgICAqIEBwYXJhbSBjb29yZFggVGhlIFggY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0gY29vcmRZIFRoZSBZIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHRvdGFsV2lkdGggVGhlIG1heGltdW0gWCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB0b3RhbEhlaWdodCBUaGUgbWF4aW11bSBZIGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMgQSBuZXcgdGlsZSBrZXkgYXQgdGhlIGdpdmVuIGxldmVsIHRoYXQgaW5jbHVkZXMgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLlxuICAgICAqL1xuICAgIHN0YXRpYyBhdENvb3JkcyhsZXZlbCwgY29vcmRYLCBjb29yZFksIHRvdGFsV2lkdGgsIHRvdGFsSGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChNYXRoLmZsb29yKGNvb3JkWSAvICh0b3RhbEhlaWdodCAvIFRpbGVLZXkucm93c0F0TGV2ZWwobGV2ZWwpKSksIE1hdGguZmxvb3IoY29vcmRYIC8gKHRvdGFsV2lkdGggLyBUaWxlS2V5LmNvbHVtbnNBdExldmVsKGxldmVsKSkpLCBsZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBNb3J0b24gY29kZSBvZiB0aGUgcGFyZW50IHRpbGUga2V5IG9mIHRoZSBnaXZlbiBNb3J0b24gY29kZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoZSBwYXJlbnQga2V5IG9mIHRoZSByb290IGtleSBpcyB0aGUgcm9vdCBrZXkgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vcnRvbkNvZGUgQSBNb3J0b24gY29kZSwgZm9yIGV4YW1wbGUsIG9idGFpbmVkIGZyb20gW1ttb3J0b25Db2RlXV0uXG4gICAgICogQHJldHVybnMgVGhlIE1vcnRvbiBjb2RlIG9mIHRoZSBwYXJlbnQgdGlsZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyZW50TW9ydG9uQ29kZShtb3J0b25Db2RlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKG1vcnRvbkNvZGUgLyA0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgcXVhZGtleSBpcyB2YWxpZC5cbiAgICAgKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4gdGhlIGdpdmVuIGxldmVsLlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIGluIGEgbGV2ZWwgaXMgY29tcHV0ZWQgYXMgMiB0byB0aGUgcG93ZXIgb2YgdGhlIGxldmVsLlxuICAgICAqXG4gICAgICogQG5vdGUgQXMgdGhlIEphdmFTY3JpcHQgbnVtYmVyIHR5cGUgY2FuIGhvbGQgNTMgYml0cyBpbiBpdHMgbWFudGlzc2EsIG9ubHkgbGV2ZWxzIHVwIHRvIDI2IGNhbiBiZVxuICAgICAqIHJlcHJlc2VudGVkIGluIHRoZSBudW1iZXIgcmVwcmVzZW50YXRpb24gcmV0dXJuZWQgYnkgW1ttb3J0b25Db2RlRnJvbVF1YWRLZXldXS5cbiAgICAgKiBBIGxldmVsIG11c3QgYmUgcG9zaXRpdmUgYW5kIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiAyNi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGN1cnJlbnQgcXVhZGtleS5cbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHF1YWRrZXkgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNWYWxpZChrZXkpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgaWYgKGtleS5sZXZlbCA8IDAgfHwga2V5LmxldmVsID4gMjYpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaW1lbnNpb25BdExldmVsID0gTWF0aC5wb3coMiwga2V5LmxldmVsKTtcbiAgICAgICAgY29uc3Qgcm93VmFsaWQgPSBrZXkucm93ID49IDAgJiYga2V5LnJvdyA8IGRpbWVuc2lvbkF0TGV2ZWw7XG4gICAgICAgIGNvbnN0IGNvbHVtblZhbGlkID0ga2V5LmNvbHVtbiA+PSAwICYmIGtleS5jb2x1bW4gPCBkaW1lbnNpb25BdExldmVsO1xuICAgICAgICByZXR1cm4gcm93VmFsaWQgJiYgY29sdW1uVmFsaWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB0aWxlIGtleSByZXByZXNlbnRpbmcgdGhlIHBhcmVudCBvZiB0aGUgdGlsZSBhZGRyZXNzZWQgYnkgdGhpcyB0aWxlIGtleS5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaXMgdGhpcyB0aWxlIGlzIGFscmVhZHkgdGhlIHJvb3QuXG4gICAgICovXG4gICAgcGFyZW50KCkge1xuICAgICAgICBpZiAodGhpcy5sZXZlbCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGdldCB0aGUgcGFyZW50IG9mIHRoZSByb290IHRpbGUga2V5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbCh0aGlzLnJvdyA+Pj4gMSwgdGhpcy5jb2x1bW4gPj4+IDEsIHRoaXMubGV2ZWwgLSAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyB0aWxlIGtleSBhdCBhIGxldmVsIHRoYXQgZGlmZmVycyBmcm9tIHRoaXMgdGlsZSdzIGxldmVsIGJ5IGRlbHRhLlxuICAgICAqXG4gICAgICogRXF1aXZhbGVudCB0byBgY2hhbmdlZExldmVsVG8obGV2ZWwoKSArIGRlbHRhKWAuXG4gICAgICpcbiAgICAgKiBOb3RlIC0gcm9vdCBrZXkgaXMgcmV0dXJuZWQgaWYgYGRlbHRhYCBpcyBzbWFsbGVyIHRoYW4gdGhlIGxldmVsIG9mIHRoaXMgdGlsZSBrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVsdGEgVGhlIG51bWVyaWMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGxldmVsIGFuZCB0aGUgcmVxdWVzdGVkIGxldmVsLlxuICAgICAqL1xuICAgIGNoYW5nZWRMZXZlbEJ5KGRlbHRhKSB7XG4gICAgICAgIGNvbnN0IGxldmVsID0gTWF0aC5tYXgoMCwgdGhpcy5sZXZlbCArIGRlbHRhKTtcbiAgICAgICAgbGV0IHJvdyA9IHRoaXMucm93O1xuICAgICAgICBsZXQgY29sdW1uID0gdGhpcy5jb2x1bW47XG4gICAgICAgIGlmIChkZWx0YSA+PSAwKSB7XG4gICAgICAgICAgICByb3cgPDw9IGRlbHRhO1xuICAgICAgICAgICAgY29sdW1uIDw8PSBkZWx0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJvdyA+Pj49IC1kZWx0YTtcbiAgICAgICAgICAgIGNvbHVtbiA+Pj49IC1kZWx0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVGlsZUtleS5mcm9tUm93Q29sdW1uTGV2ZWwocm93LCBjb2x1bW4sIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyB0aWxlIGtleSBhdCB0aGUgcmVxdWVzdGVkIGxldmVsLlxuICAgICAqXG4gICAgICogSWYgdGhlIHJlcXVlc3RlZCBsZXZlbCBpcyBzbWFsbGVyIHRoYW4gdGhlIHRpbGUncyBsZXZlbCwgdGhlbiB0aGUga2V5IG9mIGFuIGFuY2VzdG9yIG9mIHRoaXNcbiAgICAgKiB0aWxlIGlzIHJldHVybmVkLiBJZiB0aGUgcmVxdWVzdGVkIGxldmVsIGlzIGxhcmdlciB0aGFuIHRoZSB0aWxlJ3MgbGV2ZWwsIHRoZW4gdGhlIGtleSBvZlxuICAgICAqIGZpcnN0IGNoaWxkIG9yIGdyYW5kY2hpbGQgb2YgdGhpcyB0aWxlIGlzIHJldHVybmVkLCBmb3IgZXhhbXBsZSwgdGhlIGNoaWxkIHdpdGggdGhlIGxvd2VzdFxuICAgICAqIHJvdyBhbmQgY29sdW1uIG51bWJlci4gSWYgdGhlIHJlcXVlc3RlZCBsZXZlbCBlcXVhbHMgdGhpcyB0aWxlJ3MgbGV2ZWwsIHRoZW4gdGhlIHRpbGUga2V5XG4gICAgICogaXRzZWxmIGlzIHJldHVybmVkLiBJZiB0aGUgcmVxdWVzdGVkIGxldmVsIGlzIG5lZ2F0aXZlLCB0aGUgcm9vdCB0aWxlIGtleSBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZXZlbCBUaGUgcmVxdWVzdGVkIGxldmVsLlxuICAgICAqL1xuICAgIGNoYW5nZWRMZXZlbFRvKGxldmVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZWRMZXZlbEJ5KGxldmVsIC0gdGhpcy5sZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSB0aWxlIGtleSB0byBhIG51bWVyaWMgY29kZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gY3JlYXRlIGEgdGlsZSBrZXkgZnJvbSBhIG51bWVyaWMgTW9ydG9uIGNvZGUgd2l0aCBbW2Zyb21Nb3J0b25Db2RlXV0uXG4gICAgICpcbiAgICAgKiBOb3RlIC0gb25seSBsZXZlbHMgPD0gMjYgYXJlIHN1cHBvcnRlZC5cbiAgICAgKi9cbiAgICBtb3J0b25Db2RlKCkge1xuICAgICAgICBpZiAodGhpcy5tX21vcnRvbkNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGNvbHVtbiA9IHRoaXMuY29sdW1uO1xuICAgICAgICAgICAgbGV0IHJvdyA9IHRoaXMucm93O1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHBvd2VyT2ZUd29bdGhpcy5sZXZlbCA8PCAxXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sZXZlbDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbiAmIDB4MSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gcG93ZXJPZlR3b1syICogaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyb3cgJiAweDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHBvd2VyT2ZUd29bMiAqIGkgKyAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sdW1uID4+Pj0gMTtcbiAgICAgICAgICAgICAgICByb3cgPj4+PSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tX21vcnRvbkNvZGUgPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubV9tb3J0b25Db2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgdGlsZSBrZXkgaW50byBhIHN0cmluZyBmb3IgdXNpbmcgaW4gUkVTVCBBUEkgY2FsbHMuXG4gICAgICpcbiAgICAgKiBUaGUgc3RyaW5nIGlzIGEgcXVhZGtleSBNb3J0b24gY29kZSByZXByZXNlbnRhdGlvbiBhcyBhIHN0cmluZy5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gY29udmVydCBiYWNrIGZyb20gYSBxdWFka2V5IHN0cmluZyB3aXRoIFtbZnJvbUhlcmVUaWxlXV0uXG4gICAgICovXG4gICAgdG9IZXJlVGlsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubV9oZXJlVGlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLm1faGVyZVRpbGUgPSB0aGlzLm1vcnRvbkNvZGUoKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm1faGVyZVRpbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSB0aWxlIGtleSBpbnRvIGEgc3RyaW5nIGZvciB1c2luZyBpbiBSRVNUIEFQSSBjYWxscy5cbiAgICAgKlxuICAgICAqIElmIHRoZSB0aWxlIGlzIHRoZSByb290IHRpbGUsIHRoZSBxdWFka2V5IGlzICctJy4gT3RoZXJ3aXNlIHRoZSBzdHJpbmcgaXMgYSBudW1iZXIgdG8gdGhlXG4gICAgICogYmFzZSBvZiA0LCBidXQgd2l0aG91dCB0aGUgbGVhZGluZyAxLCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgKiAgMS4gdGhlIG51bWJlciBvZiBkaWdpdHMgZXF1YWxzIHRoZSBsZXZlbC5cbiAgICAgKiAgMi4gcmVtb3ZpbmcgdGhlIGxhc3QgZGlnaXQgZ2l2ZXMgdGhlIHBhcmVudCB0aWxlJ3MgcXVhZGtleSBzdHJpbmcsIGkuZS4gYXBwZW5kaW5nIDAsMSwyLDNcbiAgICAgKiAgICAgdG8gYSBxdWFka2V5IHN0cmluZyBnaXZlcyB0aGUgdGlsZXMncyBjaGlsZHJlbi5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gY29udmVydCBiYWNrIGZyb20gYSBxdWFka2V5IHN0cmluZyB3aXRoIFtbZnJvbVF1YWRLZXldXS5cbiAgICAgKi9cbiAgICB0b1F1YWRLZXkoKSB7XG4gICAgICAgIGlmICh0aGlzLmxldmVsID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCItXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmxldmVsOyBpID4gMDsgLS1pKSB7XG4gICAgICAgICAgICBjb25zdCBtYXNrID0gMSA8PCAoaSAtIDEpO1xuICAgICAgICAgICAgY29uc3QgY29sID0gKHRoaXMuY29sdW1uICYgbWFzaykgIT09IDA7XG4gICAgICAgICAgICBjb25zdCByb3cgPSAodGhpcy5yb3cgJiBtYXNrKSAhPT0gMDtcbiAgICAgICAgICAgIGlmIChjb2wgJiYgcm93KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiM1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocm93KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiMlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29sKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiMVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiMFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVxdWFsaXR5IG9wZXJhdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHFuciBUaGUgdGlsZSBrZXkgdG8gY29tcGFyZSB0by5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyB0aWxlIGtleSBoYXMgaWRlbnRpY2FsIHJvdywgY29sdW1uIGFuZCBsZXZlbCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZXF1YWxzKHFucikge1xuICAgICAgICByZXR1cm4gKHRoaXMucm93ID09PSBxbnIucm93ICYmXG4gICAgICAgICAgICB0aGlzLmNvbHVtbiA9PT0gcW5yLmNvbHVtbiAmJlxuICAgICAgICAgICAgdGhpcy5sZXZlbCA9PT0gcW5yLmxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcXVhZGtleSB0aGF0IGlzIGNvbnN0cnVjdGVkIGZyb20gaXRzIHN1YiBxdWFka2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHN1YiBUaGUgc3ViIGtleS5cbiAgICAgKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgdGlsZSBrZXkgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqL1xuICAgIGFkZGVkU3ViS2V5KHN1Yikge1xuICAgICAgICBjb25zdCBzdWJRdWFkID0gVGlsZUtleS5mcm9tUXVhZEtleShzdWIubGVuZ3RoID09PSAwID8gXCItXCIgOiBzdWIpO1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuY2hhbmdlZExldmVsQnkoc3ViUXVhZC5sZXZlbCk7XG4gICAgICAgIHJldHVybiBUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChjaGlsZC5yb3cgKyBzdWJRdWFkLnJvdywgY2hpbGQuY29sdW1uICsgc3ViUXVhZC5jb2x1bW4sIGNoaWxkLmxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcXVhZGtleSB0aGF0IGlzIGNvbnN0cnVjdGVkIGZyb20gaXRzIHN1YiBIRVJFIHRpbGUga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHN1YiBUaGUgc3ViIEhFUkUga2V5LlxuICAgICAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSB0aWxlIGtleSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICovXG4gICAgYWRkZWRTdWJIZXJlVGlsZShzdWIpIHtcbiAgICAgICAgY29uc3Qgc3ViUXVhZCA9IFRpbGVLZXkuZnJvbUhlcmVUaWxlKHN1Yik7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5jaGFuZ2VkTGV2ZWxCeShzdWJRdWFkLmxldmVsKTtcbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKGNoaWxkLnJvdyArIHN1YlF1YWQucm93LCBjaGlsZC5jb2x1bW4gKyBzdWJRdWFkLmNvbHVtbiwgY2hpbGQubGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3ViIHF1YWRrZXkgdGhhdCBpcyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBzdWIga2V5cyB0aGF0IGFyZSByZWxhdGl2ZSB0byBhIHBhcmVudCB0aGF0IGlzIGRlbHRhXG4gICAgICogbGV2ZWxzIHVwIGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHNob3J0ZW5lZCBrZXlzIGZvciBxdWFkcyBvbiBsb3dlciBsZXZlbHMgaWYgdGhlIHBhcmVudCBpc1xuICAgICAqIGtub3duLlxuICAgICAqXG4gICAgICogTm90ZSAtIHRoZSBzdWIgcXVhZGtleXMgZml0IGluIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIgaWYgdGhlIGBkZWx0YWAgaXMgc21hbGxlciB0aGFuIDguIElmXG4gICAgICogYGRlbHRhYCBpcyBzbWFsbGVyIHRoYW4gMTYsIHRoZSBzdWIgcXVhZGtleSBmaXRzIGludG8gYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIuXG4gICAgICpcbiAgICAgKiBEZWx0YXMgbGFyZ2VyIHRoYW4gMTYgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVsdGEgVGhlIG51bWJlciBvZiBsZXZlbHMgcmVsYXRpdmUgdG8gaXRzIHBhcmVudCBxdWFka2V5LiBNdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG9cbiAgICAgKiAwIGFuZCBzbWFsbGVyIHRoYW4gMTYuXG4gICAgICogQHJldHVybnMgVGhlIHF1YWRrZXkgcmVsYXRpdmUgdG8gaXRzIHBhcmVudCB0aGF0IGlzIGBkZWx0YWAgbGV2ZWxzIHVwIHRoZSB0cmVlLlxuICAgICAqL1xuICAgIGdldFN1YkhlcmVUaWxlKGRlbHRhKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMubW9ydG9uQ29kZSgpO1xuICAgICAgICBjb25zdCBtc2IgPSAxIDw8IChkZWx0YSAqIDIpO1xuICAgICAgICBjb25zdCBtYXNrID0gbXNiIC0gMTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGtleSAmIG1hc2spIHwgbXNiO1xuICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgcm93cyBpbiB0aGUgdGlsZSdzIFtbbGV2ZWxdXS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgMiB0byB0aGUgcG93ZXIgb2YgdGhlIGxldmVsLlxuICAgICAqL1xuICAgIHJvd0NvdW50KCkge1xuICAgICAgICByZXR1cm4gVGlsZUtleS5yb3dzQXRMZXZlbCh0aGlzLmxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb2x1bW5zIGluIHRoZSB0aWxlJ3MgW1tsZXZlbF1dLlxuICAgICAqXG4gICAgICogVGhpcyBpcyAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbGV2ZWwuXG4gICAgICovXG4gICAgY29sdW1uQ291bnQoKSB7XG4gICAgICAgIHJldHVybiBUaWxlS2V5LmNvbHVtbnNBdExldmVsKHRoaXMubGV2ZWwpO1xuICAgIH1cbn1cbmV4cG9ydHMuVGlsZUtleSA9IFRpbGVLZXk7XG4vKiogQGhpZGRlbiAqL1xuY29uc3QgcG93ZXJPZlR3byA9IFtcbiAgICAweDEsXG4gICAgMHgyLFxuICAgIDB4NCxcbiAgICAweDgsXG4gICAgMHgxMCxcbiAgICAweDIwLFxuICAgIDB4NDAsXG4gICAgMHg4MCxcbiAgICAweDEwMCxcbiAgICAweDIwMCxcbiAgICAweDQwMCxcbiAgICAweDgwMCxcbiAgICAweDEwMDAsXG4gICAgMHgyMDAwLFxuICAgIDB4NDAwMCxcbiAgICAweDgwMDAsXG4gICAgMHgxMDAwMCxcbiAgICAweDIwMDAwLFxuICAgIDB4NDAwMDAsXG4gICAgMHg4MDAwMCxcbiAgICAweDEwMDAwMCxcbiAgICAweDIwMDAwMCxcbiAgICAweDQwMDAwMCxcbiAgICAweDgwMDAwMCxcbiAgICAweDEwMDAwMDAsXG4gICAgMHgyMDAwMDAwLFxuICAgIDB4NDAwMDAwMCxcbiAgICAweDgwMDAwMDAsXG4gICAgMHgxMDAwMDAwMCxcbiAgICAweDIwMDAwMDAwLFxuICAgIDB4NDAwMDAwMDAsXG4gICAgMHg4MDAwMDAwMCxcbiAgICAweDEwMDAwMDAwMCxcbiAgICAweDIwMDAwMDAwMCxcbiAgICAweDQwMDAwMDAwMCxcbiAgICAweDgwMDAwMDAwMCxcbiAgICAweDEwMDAwMDAwMDAsXG4gICAgMHgyMDAwMDAwMDAwLFxuICAgIDB4NDAwMDAwMDAwMCxcbiAgICAweDgwMDAwMDAwMDAsXG4gICAgMHgxMDAwMDAwMDAwMCxcbiAgICAweDIwMDAwMDAwMDAwLFxuICAgIDB4NDAwMDAwMDAwMDAsXG4gICAgMHg4MDAwMDAwMDAwMCxcbiAgICAweDEwMDAwMDAwMDAwMCxcbiAgICAweDIwMDAwMDAwMDAwMCxcbiAgICAweDQwMDAwMDAwMDAwMCxcbiAgICAweDgwMDAwMDAwMDAwMCxcbiAgICAweDEwMDAwMDAwMDAwMDAsXG4gICAgMHgyMDAwMDAwMDAwMDAwLFxuICAgIDB4NDAwMDAwMDAwMDAwMCxcbiAgICAweDgwMDAwMDAwMDAwMDAsXG4gICAgMHgxMDAwMDAwMDAwMDAwMCAvLyBNYXRoLnBvdygyLCA1MiksIGhpZ2hlc3QgYml0IHRoYXQgY2FuIGJlIHNldCBjb3JyZWN0bHkuXG5dO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5VdWlkID0gdm9pZCAwO1xuLy8gdHNsaW50OmRpc2FibGU6bm8tYml0d2lzZVxuLy8gdHNsaW50OmRpc2FibGU6IG5vLW1hZ2ljLW51bWJlcnNcbi8qKlxuICogQGJyaWVmIExldHMgeW91IGdlbmVyYXRlIHV1aWQgY29kZVxuICovXG5jbGFzcyBVdWlkIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIFVVSURcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgVXVpZC5nZW5lcmF0ZSgyKSxcbiAgICAgICAgICAgIFV1aWQuZ2VuZXJhdGUoMSksXG4gICAgICAgICAgICBVdWlkLmdlbmVyYXRlKDEpLFxuICAgICAgICAgICAgVXVpZC5nZW5lcmF0ZSgxKSxcbiAgICAgICAgICAgIFV1aWQuZ2VuZXJhdGUoMylcbiAgICAgICAgXS5qb2luKFwiLVwiKTtcbiAgICB9XG4gICAgc3RhdGljIGdlbmVyYXRlKGNvdW50KSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAoKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKSB8IDApXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlV1aWQgPSBVdWlkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXREYXRhU2l6ZSA9IHZvaWQgMDtcbmNvbnN0IEJZVEVTX0lOX05VTUJFUiA9IDg7XG5jb25zdCBCWVRFU19JTl9CT09MRUFOID0gNDtcbi8qKlxuICogQ2FsY3VsYXRlIG1lbW9yeSBzaXplIG9mIGphdmFzY3JpcHQgb2JqZWN0LCBpdCBpcyBub3QgYW4gYWNjdXJhdGUgdmFsdWVcbiAqIEBwYXJhbSBkYXRhLiBUaGUgc3RyaW5nIG9yIG51bWJlciBvciBib29sZWFuIG9yIGFycmF5IG9yIG9iamVjdC5cbiAqIEByZXR1cm5zIFRoZSBzaXplIG9mIHZhbHVlIGluIGJ5dGVzLlxuICovXG5mdW5jdGlvbiBnZXREYXRhU2l6ZShkYXRhKSB7XG4gICAgbGV0IGJ5dGVzID0gMDtcbiAgICBmdW5jdGlvbiBzaXplT2Yob2JqKSB7XG4gICAgICAgIGlmIChvYmogIT09IG51bGwgJiYgb2JqICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIG9iaikge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gQllURVNfSU5fTlVNQkVSO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzICs9IG9iai5sZW5ndGggKiAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgICAgICAgICBieXRlcyArPSBCWVRFU19JTl9CT09MRUFOO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iakNsYXNzID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmpDbGFzcyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqQ2xhc3MgPT09IFwiW29iamVjdCBBcnJheV1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZU9mKG9ialtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzICs9IG9iai50b1N0cmluZygpLmxlbmd0aCAqIDI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZU9mKGRhdGEpO1xufVxuZXhwb3J0cy5nZXREYXRhU2l6ZSA9IGdldERhdGFTaXplO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRFbnZMb29rVXBVcmwgPSB2b2lkIDA7XG4vKipcbiAqIEdldHMgdGhlIFVSTCBzdHJpbmcgb2YgdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBlbnZpcm9ubWVudCB0aGF0IHlvdSB1c2UgZm9yIHdvcmsuIFlvdSBjYW4gYWxzbyBwYXNzIHRoZSBVUkwgc3RyaW5nIG9mIHlvdXIgbG9jYWwgb3IgY3VzdG9tIGVudmlyb25tZW50LlxuICogQHJldHVybiBCYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50LCB0aGUgVVJMIHN0cmluZyBvZiB0aGUgQVBJIExvb2t1cCBTZXJ2aWNlIG9yIHRoZSBVUkwgc3RyaW5nIG9mIHRoZSBjdXN0b20gc2VydmljZS5cbiAqL1xuZnVuY3Rpb24gZ2V0RW52TG9va1VwVXJsKGVudikge1xuICAgIGZ1bmN0aW9uIGlzVVJMKHN0cikge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IGAoPzooPzpbYS16XSs6KT8vLylgO1xuICAgICAgICBjb25zdCBpcCA9IGAoPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKD86XFxcXC4oPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKXszfWA7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBcIig/Oig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XVstX10qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKVwiO1xuICAgICAgICBjb25zdCBkb21haW4gPSBcIig/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKlwiO1xuICAgICAgICBjb25zdCB0bGQgPSBgKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZl17Mix9KSlcXFxcLj9gO1xuICAgICAgICBjb25zdCBwb3J0ID0gXCIoPzo6XFxcXGR7Miw1fSk/XCI7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcXVvdGVtYXJrXG4gICAgICAgIGNvbnN0IHBhdGggPSAnKD86Wy8/I11bXlxcXFxzXCJdKik/JztcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAoPzoke3Byb3RvY29sfXx3d3dcXFxcLikoPzpsb2NhbGhvc3R8JHtpcH18JHtob3N0fSR7ZG9tYWlufSR7dGxkfSkke3BvcnR9JHtwYXRofWApO1xuICAgICAgICByZXR1cm4gcmVnZXgudGVzdChzdHIudHJpbSgpKTtcbiAgICB9XG4gICAgaWYgKGlzVVJMKGVudikpIHtcbiAgICAgICAgcmV0dXJuIGVudjtcbiAgICB9XG4gICAgc3dpdGNoIChlbnYpIHtcbiAgICAgICAgY2FzZSBcImhlcmUtZGV2XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJodHRwczovL2FwaS1sb29rdXAuZGF0YS5hcGkucGxhdGZvcm0uc2l0LmhlcmUuY29tL2xvb2t1cC92MVwiO1xuICAgICAgICBjYXNlIFwiaGVyZS1jblwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9hcGktbG9va3VwLmRhdGEuYXBpLnBsYXRmb3JtLmhlcmVvbHAuY24vbG9va3VwL3YxXCI7XG4gICAgICAgIGNhc2UgXCJoZXJlLWNuLWRldlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9hcGktbG9va3VwLmRhdGEuYXBpLnBsYXRmb3JtLmluLmhlcmVvbHAuY24vbG9va3VwL3YxXCI7XG4gICAgICAgIGNhc2UgXCJsb2NhbFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaHR0cDovL2xvY2FsaG9zdDozMTAwNS9sb29rdXAvdjFcIjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vYXBpLWxvb2t1cC5kYXRhLmFwaS5wbGF0Zm9ybS5oZXJlLmNvbS9sb29rdXAvdjFcIjtcbiAgICB9XG59XG5leHBvcnRzLmdldEVudkxvb2tVcFVybCA9IGdldEVudkxvb2tVcFVybDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNUQVRVU19DT0RFUyA9IHZvaWQgMDtcbi8qKlxuICogU3RhdHVzIGNvZGVzIG9mIEhUVFAgcmVzcG9uc2VzLlxuICovXG52YXIgU1RBVFVTX0NPREVTO1xuKGZ1bmN0aW9uIChTVEFUVVNfQ09ERVMpIHtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiT0tcIl0gPSAyMDBdID0gXCJPS1wiO1xuICAgIFNUQVRVU19DT0RFU1tTVEFUVVNfQ09ERVNbXCJDUkVBVEVEXCJdID0gMjAxXSA9IFwiQ1JFQVRFRFwiO1xuICAgIFNUQVRVU19DT0RFU1tTVEFUVVNfQ09ERVNbXCJOT19DT05URU5UXCJdID0gMjA0XSA9IFwiTk9fQ09OVEVOVFwiO1xuICAgIFNUQVRVU19DT0RFU1tTVEFUVVNfQ09ERVNbXCJGT1VORFwiXSA9IDMwMl0gPSBcIkZPVU5EXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIkJBRF9SRVFVRVNUXCJdID0gNDAwXSA9IFwiQkFEX1JFUVVFU1RcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiTk9UX0ZPVU5EXCJdID0gNDA0XSA9IFwiTk9UX0ZPVU5EXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIlRPX01BTllfUkVRVUVTVFNcIl0gPSA0MjldID0gXCJUT19NQU5ZX1JFUVVFU1RTXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIklOVEVSTkFMX1NFUlZFUl9FUlJPUlwiXSA9IDUwMF0gPSBcIklOVEVSTkFMX1NFUlZFUl9FUlJPUlwiO1xuICAgIFNUQVRVU19DT0RFU1tTVEFUVVNfQ09ERVNbXCJTRVJWSUNFX1VOQVZBSUJMRVwiXSA9IDUwM10gPSBcIlNFUlZJQ0VfVU5BVkFJQkxFXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIk5FVFdPUktfQ09OTkVDVF9USU1FT1VUXCJdID0gNTk5XSA9IFwiTkVUV09SS19DT05ORUNUX1RJTUVPVVRcIjtcbn0pKFNUQVRVU19DT0RFUyA9IGV4cG9ydHMuU1RBVFVTX0NPREVTIHx8IChleHBvcnRzLlNUQVRVU19DT0RFUyA9IHt9KSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRG93bmxvYWRNYW5hZ2VyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlckZhY3RvcnlcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2dldEVudkxvb2t1cFVybFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vSFJOXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9nZXREYXRhU2l6ZVV0aWxcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0h0dHBFcnJvclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRmV0Y2hPcHRpb25zXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9UaWxlS2V5XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9VdWlkXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi91c2VyQWdlbnRcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hZGRTZW50V2l0aFBhcmFtID0gZXhwb3J0cy5TRU5UX1dJVEhfUEFSQU0gPSB2b2lkIDA7XG5jb25zdCBsaWJfdmVyc2lvbl8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZS9saWIudmVyc2lvblwiKTtcbi8qKlxuICogVGhlIHN0cmluZyBmb3IgYWRkaW5nIHRvIHRoZSByZXF1ZXN0cyBhcyBxdWVyeSBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuU0VOVF9XSVRIX1BBUkFNID0gYHNlbnRXaXRoPU9MUC1UUy1TREstJHtsaWJfdmVyc2lvbl8xLkxJQl9WRVJTSU9OfWA7XG4vKipcbiAqIEFkZHMgc2VudFdpdGggcGFyYW0gdG8gdGhlIHVybC5cbiAqIEBwYXJhbSB1cmwgdGhlIHN0cmluZywgcmVwcmVzZW50aW5nIHRoZSB1cmxcbiAqIEByZXR1cm5zIHRoZSBzdHJpbmcsIHJlcHJlc2VudGluZyB1cGRhdGVkIFVSTFxuICovXG5mdW5jdGlvbiBhZGRTZW50V2l0aFBhcmFtKHVybCkge1xuICAgIHJldHVybiB1cmwuc3BsaXQoXCI/XCIpLmxlbmd0aCA9PT0gMVxuICAgICAgICA/IGAke3VybH0/JHtleHBvcnRzLlNFTlRfV0lUSF9QQVJBTX1gXG4gICAgICAgIDogYCR7dXJsfSYke2V4cG9ydHMuU0VOVF9XSVRIX1BBUkFNfWA7XG59XG5leHBvcnRzLmFkZFNlbnRXaXRoUGFyYW0gPSBhZGRTZW50V2l0aFBhcmFtO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSW50ZXJhY3RpdmVBcGkgPSBleHBvcnRzLk9iamVjdFN0b3JlQXBpID0gZXhwb3J0cy5QdWJsaXNoQXBpID0gZXhwb3J0cy5TdHJlYW1BcGkgPSBleHBvcnRzLkluZGV4QXBpID0gZXhwb3J0cy5Wb2xhdGlsZUJsb2JBcGkgPSBleHBvcnRzLkJsb2JBcGkgPSBleHBvcnRzLkNvdmVyYWdlQXBpID0gZXhwb3J0cy5RdWVyeUFwaSA9IGV4cG9ydHMuQXJ0aWZhY3RBcGkgPSBleHBvcnRzLkNvbmZpZ0FwaSA9IGV4cG9ydHMuTWV0YWRhdGFBcGkgPSBleHBvcnRzLkxvb2t1cEFwaSA9IGV4cG9ydHMuQXV0aG9yaXphdGlvbkFQSSA9IHZvaWQgMDtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9saWIvUmVxdWVzdEJ1aWxkZXJcIiksIGV4cG9ydHMpO1xuY29uc3QgQXJ0aWZhY3RBcGkgPSByZXF1aXJlKFwiLi9saWIvYXJ0aWZhY3QtYXBpXCIpO1xuZXhwb3J0cy5BcnRpZmFjdEFwaSA9IEFydGlmYWN0QXBpO1xuY29uc3QgQXV0aG9yaXphdGlvbkFQSSA9IHJlcXVpcmUoXCIuL2xpYi9hdXRob3JpemF0aW9uLWFwaS12MS4xXCIpO1xuZXhwb3J0cy5BdXRob3JpemF0aW9uQVBJID0gQXV0aG9yaXphdGlvbkFQSTtcbmNvbnN0IEJsb2JBcGkgPSByZXF1aXJlKFwiLi9saWIvYmxvYi1hcGlcIik7XG5leHBvcnRzLkJsb2JBcGkgPSBCbG9iQXBpO1xuY29uc3QgQ29uZmlnQXBpID0gcmVxdWlyZShcIi4vbGliL2NvbmZpZy1hcGlcIik7XG5leHBvcnRzLkNvbmZpZ0FwaSA9IENvbmZpZ0FwaTtcbmNvbnN0IENvdmVyYWdlQXBpID0gcmVxdWlyZShcIi4vbGliL2NvdmVyYWdlLWFwaVwiKTtcbmV4cG9ydHMuQ292ZXJhZ2VBcGkgPSBDb3ZlcmFnZUFwaTtcbmNvbnN0IEluZGV4QXBpID0gcmVxdWlyZShcIi4vbGliL2luZGV4LWFwaVwiKTtcbmV4cG9ydHMuSW5kZXhBcGkgPSBJbmRleEFwaTtcbmNvbnN0IExvb2t1cEFwaSA9IHJlcXVpcmUoXCIuL2xpYi9sb29rdXAtYXBpXCIpO1xuZXhwb3J0cy5Mb29rdXBBcGkgPSBMb29rdXBBcGk7XG5jb25zdCBNZXRhZGF0YUFwaSA9IHJlcXVpcmUoXCIuL2xpYi9tZXRhZGF0YS1hcGlcIik7XG5leHBvcnRzLk1ldGFkYXRhQXBpID0gTWV0YWRhdGFBcGk7XG5jb25zdCBQdWJsaXNoQXBpID0gcmVxdWlyZShcIi4vbGliL3B1Ymxpc2gtYXBpLXYyXCIpO1xuZXhwb3J0cy5QdWJsaXNoQXBpID0gUHVibGlzaEFwaTtcbmNvbnN0IFF1ZXJ5QXBpID0gcmVxdWlyZShcIi4vbGliL3F1ZXJ5LWFwaVwiKTtcbmV4cG9ydHMuUXVlcnlBcGkgPSBRdWVyeUFwaTtcbmNvbnN0IFN0cmVhbUFwaSA9IHJlcXVpcmUoXCIuL2xpYi9zdHJlYW0tYXBpXCIpO1xuZXhwb3J0cy5TdHJlYW1BcGkgPSBTdHJlYW1BcGk7XG5jb25zdCBWb2xhdGlsZUJsb2JBcGkgPSByZXF1aXJlKFwiLi9saWIvdm9sYXRpbGUtYmxvYi1hcGlcIik7XG5leHBvcnRzLlZvbGF0aWxlQmxvYkFwaSA9IFZvbGF0aWxlQmxvYkFwaTtcbmNvbnN0IE9iamVjdFN0b3JlQXBpID0gcmVxdWlyZShcIi4vbGliL2Jsb2IudjIuYXBpXCIpO1xuZXhwb3J0cy5PYmplY3RTdG9yZUFwaSA9IE9iamVjdFN0b3JlQXBpO1xuY29uc3QgSW50ZXJhY3RpdmVBcGkgPSByZXF1aXJlKFwiLi9saWIvaW50ZXJhY3RpdmUtYXBpLXYxXCIpO1xuZXhwb3J0cy5JbnRlcmFjdGl2ZUFwaSA9IEludGVyYWN0aXZlQXBpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJlcXVlc3RCdWlsZGVyID0gZXhwb3J0cy5VcmxCdWlsZGVyID0gdm9pZCAwO1xuLyoqXG4gKiBIZWxwZXIgY2xhc3MgdGhhdCBidWlsZHMgVVJMcyBmcm9tIGEgYmFzZVVybCBhbmQgZ2l2ZW4gcXVlcnkgcGFyYW1ldGVyc1xuICovXG5jbGFzcyBVcmxCdWlsZGVyIHtcbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVybCBUaGUgYmFzZSBVUkwuXG4gICAgICogQHBhcmFtIGhhc1F1ZXJ5IFdoZXRoZXIgdGhlIGJhc2UgVVJMIGFscmVhZHkgY29udGFpbnMgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIGhhc1F1ZXJ5ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMuaGFzUXVlcnkgPSBoYXNRdWVyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhdGljIG1ldGhvZCB0aGF0IGNyZWF0ZXMgYW4gVVJMIHF1ZXJ5IHN0cmluZyBmcm9tIGEga2V5LCB2YWx1ZSBwYWlyIHByb3ZpZGVkIGFzIHBhcmFtICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtIGVpdGhlciBhIHN0cmluZyBvciBhIG51bWJlciB0byBiZSBjb252ZXJ0ZWQuXG4gICAgICovXG4gICAgc3RhdGljIHN0cmluZ2lmeVF1ZXJ5KHZhbHVlcykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1trZXldO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFVybEJ1aWxkZXIuYXBwZW5kUXVlcnlTdHJpbmcocmVzdWx0LCBcIlwiLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhdGljIG1ldGhvZCB0aGF0IGNvbnZlcnRzIHRoZSBwYXJhbWV0ZXIgdG8gYSBzdHJpbmdcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBudW1iZXIgdG8gYmUgY29udmVydGVkLlxuICAgICAqL1xuICAgIHN0YXRpYyB0b1N0cmluZyhwYXJhbSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhcmFtID09PSBcInN0cmluZ1wiID8gcGFyYW0gOiBwYXJhbS50b1N0cmluZygpO1xuICAgIH1cbiAgICBzdGF0aWMgYXBwZW5kUXVlcnlTdHJpbmcodXJsLCBzZXBhcmF0b3IsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgdXJsICs9IHNlcGFyYXRvcjtcbiAgICAgICAgdXJsICs9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgXCI9XCI7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHVybCArPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHVybCArPSBgJHt2YWx1ZX1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdXJsICs9IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1cmwgKz0gdmFsdWUubWFwKHZhbCA9PiBlbmNvZGVVUklDb21wb25lbnQodmFsKSkuam9pbihcIixcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHF1ZXJ5IHBhcmFtZXRlciB0byB0aGUgVVJMLCBlaXRoZXIgdXNpbmcgJyZrZXk9dmFsdWUnIG9yICc/a2V5PXZhbHVlJ1xuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgW1toYXNRdWVyeV1dIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEVzY2FwZXMgYWxsIHN0cmluZ3MgdXNpbmcgYGVuY29kZVVSSUNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBTdHJpbmcgYXJyYXlzIGFyZSBjb25jYXRlbmF0ZWQgdXNpbmcgY29tbWFzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIGFwcGVuZFF1ZXJ5KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVybCA9IFVybEJ1aWxkZXIuYXBwZW5kUXVlcnlTdHJpbmcodGhpcy51cmwsIHRoaXMuaGFzUXVlcnkgPyBcIiZcIiA6IFwiP1wiLCBrZXksIHZhbHVlKTtcbiAgICAgICAgdGhpcy5oYXNRdWVyeSA9IHRydWU7XG4gICAgfVxufVxuZXhwb3J0cy5VcmxCdWlsZGVyID0gVXJsQnVpbGRlcjtcbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgdXNlZCBmb3IgYnVpbGRpbmcgcmVxdWVzdHMgdG8gYSBSRVNUIEFQSS5cbiAqL1xuY2xhc3MgUmVxdWVzdEJ1aWxkZXIge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUmVxdWVzdEJ1aWxkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmFzZVVybCBUaGUgYmFzZSBVUkwgb2YgdGhlIHNlcnZpY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYmFzZVVybCkge1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGRvd25sb2FkIHRoZSByZXNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmxPYmogdGhlIFVSTCB0byBmZXRjaC5cbiAgICAgKi9cbiAgICByZXF1ZXN0KHVybE9iaiwgaW5pdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWQodXJsT2JqLnVybCwgaW5pdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGRvd25sb2FkIHRoZSByZXNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmxPYmogdGhlIFVSTCB0byBmZXRjaC5cbiAgICAgKi9cbiAgICByZXF1ZXN0QmxvYih1cmxPYmosIGluaXQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkQmxvYih1cmxPYmoudXJsLCBpbml0KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0QnVpbGRlciA9IFJlcXVlc3RCdWlsZGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVwZGF0ZVNjaGVtYVBlcm1pc3Npb25Vc2luZ1BPU1QgPSBleHBvcnRzLmxpc3RVc2luZ0dFVCA9IGV4cG9ydHMuZ2V0U2NoZW1hVXNpbmdHRVQgPSBleHBvcnRzLmdldERvY3VtZW50VXNpbmdHRVQgPSBleHBvcnRzLmRlbGV0ZVNjaGVtYVVzaW5nREVMRVRFID0gZXhwb3J0cy5yZWdpc3RlckFydGlmYWN0VXNpbmdQVVQgPSBleHBvcnRzLnB1dEFydGlmYWN0RmlsZVVzaW5nUFVUID0gZXhwb3J0cy5nZXRBcnRpZmFjdFVzaW5nR0VUID0gZXhwb3J0cy5nZXRBcnRpZmFjdEZpbGVVc2luZ0dFVCA9IGV4cG9ydHMuZGVsZXRlRmlsZVVzaW5nREVMRVRFID0gZXhwb3J0cy5kZWxldGVBcnRpZmFjdFVzaW5nREVMRVRFID0gdm9pZCAwO1xuLyoqXG4gKiBBcnRpZmFjdCBTZXJ2aWNlIHYxXG4gKiBObyBkZXNjcmlwdGlvbiBwcm92aWRlZCAoZ2VuZXJhdGVkIGJ5IFN3YWdnZXIgQ29kZWdlbiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuKVxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjAuMVxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQXJ0aWZhY3RzQXBpXG4gKi9cbi8qKlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAnbW9kaWZ5UmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlIGEgc3BlY2lmaWMgYXJ0aWZhY3RcbiAqIEBwYXJhbSBhcnRpZmFjdEhybiBUaGUgSFJOIG9mIHRoZSBhcnRpZmFjdFxuICovXG5mdW5jdGlvbiBkZWxldGVBcnRpZmFjdFVzaW5nREVMRVRFKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9hcnRpZmFjdC97YXJ0aWZhY3RIcm59XCIucmVwbGFjZShcInthcnRpZmFjdEhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFydGlmYWN0SHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRlbGV0ZUFydGlmYWN0VXNpbmdERUxFVEUgPSBkZWxldGVBcnRpZmFjdFVzaW5nREVMRVRFO1xuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdtb2RpZnlSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgYSBzcGVjaWZpYyBhcnRpZmFjdCBmaWxlXG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcGF0aCB0byBhcnRpZmFjdCBmaWxlXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZpbGVVc2luZ0RFTEVURShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvYXJ0aWZhY3Qve2FydGlmYWN0SHJufS97ZmlsZU5hbWV9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2FydGlmYWN0SHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXJ0aWZhY3RIcm5cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZmlsZU5hbWV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmaWxlTmFtZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVGaWxlVXNpbmdERUxFVEUgPSBkZWxldGVGaWxlVXNpbmdERUxFVEU7XG4vKipcbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ3JlYWRSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNwZWNpZmljIGFydGlmYWN0IGZpbGVcbiAqIEBwYXJhbSBhcnRpZmFjdEhybiBUaGUgSFJOIG9mIHRoZSBhcnRpZmFjdFxuICogQHBhcmFtIGZpbGVOYW1lIFRoZSBwYXRoIHRvIGFydGlmYWN0IGZpbGVcbiAqL1xuZnVuY3Rpb24gZ2V0QXJ0aWZhY3RGaWxlVXNpbmdHRVQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2FydGlmYWN0L3thcnRpZmFjdEhybn0ve2ZpbGVOYW1lfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcInthcnRpZmFjdEhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFydGlmYWN0SHJuXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2ZpbGVOYW1lfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmlsZU5hbWVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0QXJ0aWZhY3RGaWxlVXNpbmdHRVQgPSBnZXRBcnRpZmFjdEZpbGVVc2luZ0dFVDtcbi8qKlxuICogQHN1bW1hcnkgZ2V0QXJ0aWZhY3RcbiAqIEBwYXJhbSBhcnRpZmFjdEhybiBUaGUgSFJOIG9mIHRoZSBhcnRpZmFjdFxuICovXG5mdW5jdGlvbiBnZXRBcnRpZmFjdFVzaW5nR0VUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi97YXJ0aWZhY3RIcm59XCIucmVwbGFjZShcInthcnRpZmFjdEhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFydGlmYWN0SHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRBcnRpZmFjdFVzaW5nR0VUID0gZ2V0QXJ0aWZhY3RVc2luZ0dFVDtcbi8qKlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAnbW9kaWZ5UmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIG9yIHVwZGF0ZSBhIHNwZWNpZmljIGFydGlmYWN0XG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcGF0aCB0byBhcnRpZmFjdCBmaWxlXG4gKiBAcGFyYW0gZmlsZVxuICovXG5mdW5jdGlvbiBwdXRBcnRpZmFjdEZpbGVVc2luZ1BVVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvYXJ0aWZhY3Qve2FydGlmYWN0SHJufS97ZmlsZU5hbWV9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2FydGlmYWN0SHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXJ0aWZhY3RIcm5cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZmlsZU5hbWV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmaWxlTmFtZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJmaWxlXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImZpbGVcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnB1dEFydGlmYWN0RmlsZVVzaW5nUFVUID0gcHV0QXJ0aWZhY3RGaWxlVXNpbmdQVVQ7XG4vKipcbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ2FwaUFjY2VzcydcbiAqXG4gKiBAc3VtbWFyeSBSZWdpc3RlciBhIG5ldyBncm91cCBhbmQgYXJ0aWZhY3RcbiAqIEBwYXJhbSBncm91cElkIFRoZSBncm91cElkIG9mIHRoZSBhcnRpZmFjdC4gUmV2ZXJzZWQgaW50ZXJuZXQgZG9tYWluIG5hbWUgc3VjaCBhcyBjb20uaGVyZS5yaWIuc2NoZW1hXG4gKiBAcGFyYW0gYXJ0aWZhY3RJZCBUaGUgSUQgb2YgdGhlIGFydGlmYWN0XG4gKiBAcGFyYW0gcmVnaXN0ZXJSZXF1ZXN0IFRoZSByZWdpc3RlciByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQXJ0aWZhY3RVc2luZ1BVVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvYXJ0aWZhY3QvcmVnaXN0ZXIve2dyb3VwSWR9L3thcnRpZmFjdElkfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInthcnRpZmFjdElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXJ0aWZhY3RJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJyZWdpc3RlclJlcXVlc3RcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wicmVnaXN0ZXJSZXF1ZXN0XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWdpc3RlckFydGlmYWN0VXNpbmdQVVQgPSByZWdpc3RlckFydGlmYWN0VXNpbmdQVVQ7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2hlbWFzQXBpXG4gKi9cbi8qKlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAnbW9kaWZ5UmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlIHNjaGVtYVxuICogQHBhcmFtIHNjaGVtYUhybiBUaGUgSFJOIG9mIHRoZSBzY2hlbWFcbiAqL1xuZnVuY3Rpb24gZGVsZXRlU2NoZW1hVXNpbmdERUxFVEUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3NjaGVtYS97c2NoZW1hSHJufVwiLnJlcGxhY2UoXCJ7c2NoZW1hSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wic2NoZW1hSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRlbGV0ZVNjaGVtYVVzaW5nREVMRVRFID0gZGVsZXRlU2NoZW1hVXNpbmdERUxFVEU7XG4vKipcbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ3JlYWRSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBSZXNvbHZlIGEgc2NoZW1hIGRvYyB2YXJpYW50IFVSTFxuICogQHBhcmFtIHNjaGVtYUhybiBUaGUgSFJOIG9mIHRoZSBzY2hlbWFcbiAqIEBwYXJhbSBmaWxlIFRoZSBwYXRoIHRvIHNjaGVtYSBmaWxlXG4gKi9cbmZ1bmN0aW9uIGdldERvY3VtZW50VXNpbmdHRVQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3NjaGVtYS97c2NoZW1hSHJufS9kb2Mve2ZpbGV9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3NjaGVtYUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInNjaGVtYUhyblwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntmaWxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmlsZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXREb2N1bWVudFVzaW5nR0VUID0gZ2V0RG9jdW1lbnRVc2luZ0dFVDtcbi8qKlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAncmVhZFJlc291cmNlJyBmb3IgdGhlIGdpdmVuIEhSTlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIHNjaGVtYSBkZXRhaWxzXG4gKiBAcGFyYW0gc2NoZW1hSHJuIFRoZSBIUk4gb2YgdGhlIHNjaGVtYVxuICovXG5mdW5jdGlvbiBnZXRTY2hlbWFVc2luZ0dFVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvc2NoZW1hL3tzY2hlbWFIcm59XCIucmVwbGFjZShcIntzY2hlbWFIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJzY2hlbWFIcm5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0U2NoZW1hVXNpbmdHRVQgPSBnZXRTY2hlbWFVc2luZ0dFVDtcbi8qKlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAnYXBpQWNjZXNzJ1xuICpcbiAqIEBzdW1tYXJ5IExpc3QgdGhlIGF2YWlsYWJsZSBzY2hlbWFzXG4gKiBAcGFyYW0gc29ydFxuICogQHBhcmFtIG9yZGVyXG4gKiBAcGFyYW0gZnJvbVxuICogQHBhcmFtIGxpbWl0XG4gKi9cbmZ1bmN0aW9uIGxpc3RVc2luZ0dFVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvc2NoZW1hXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic29ydFwiLCBwYXJhbXNbXCJzb3J0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm9yZGVyXCIsIHBhcmFtc1tcIm9yZGVyXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZyb21cIiwgcGFyYW1zW1wiZnJvbVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMubGlzdFVzaW5nR0VUID0gbGlzdFVzaW5nR0VUO1xuLyoqXG4gKiBSRUFEIGdyYW50cyAncmVhZFJlc291cmNlJywgTU9ESUZZIGdyYW50cyAnbW9kaWZ5UmVzb3VyY2UnLCBTSEFSRSBncmFudHMgJ3NoYXJlUmVzb3VyY2UnLlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAnc2hhcmVSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk4uXG4gKlxuICogQHN1bW1hcnkgVXBkYXRlIHNjaGVtYSBwZXJtaXNzaW9ucyBmb3IgdXNlciBvbiB0aGUgc3BlY2lmaWVkIHNjaGVtYSBhbmQgYXNzb2NpYXRlZCBhcnRpZmFjdC5cbiAqIEBwYXJhbSBzY2hlbWFIcm4gVGhlIEhSTiBvZiB0aGUgc2NoZW1hXG4gKiBAcGFyYW0gdXBkYXRlUGVybWlzc2lvblJlcXVlc3QgVGhlIHBlcm1pc3Npb24gcmVxdWVzdFxuICovXG5mdW5jdGlvbiB1cGRhdGVTY2hlbWFQZXJtaXNzaW9uVXNpbmdQT1NUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9zY2hlbWEve3NjaGVtYUhybn0vcGVybWlzc2lvblwiLnJlcGxhY2UoXCJ7c2NoZW1hSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wic2NoZW1hSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJ1cGRhdGVQZXJtaXNzaW9uUmVxdWVzdFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJ1cGRhdGVQZXJtaXNzaW9uUmVxdWVzdFwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBkYXRlU2NoZW1hUGVybWlzc2lvblVzaW5nUE9TVCA9IHVwZGF0ZVNjaGVtYVBlcm1pc3Npb25Vc2luZ1BPU1Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLiBhbmQgaXRzIGFmZmlsaWF0ZShzKS5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBhbmQgb3RoZXIgbWF0ZXJpYWxzIGNvbnRhaW4gcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25cbiAqIGNvbnRyb2xsZWQgYnkgSEVSRSBhbmQgYXJlIHByb3RlY3RlZCBieSBhcHBsaWNhYmxlIGNvcHlyaWdodCBsZWdpc2xhdGlvbi5cbiAqIEFueSB1c2UgYW5kIHV0aWxpemF0aW9uIG9mIHRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBhbmRcbiAqIGRpc2Nsb3N1cmUgdG8gYW55IHRoaXJkIHBhcnRpZXMgaXMgY29uZGl0aW9uYWwgdXBvbiBoYXZpbmcgYSBzZXBhcmF0ZVxuICogYWdyZWVtZW50IHdpdGggSEVSRSBmb3IgdGhlIGFjY2VzcywgdXNlLCB1dGlsaXphdGlvbiBvciBkaXNjbG9zdXJlIG9mIHRoaXNcbiAqIHNvZnR3YXJlLiBJbiB0aGUgYWJzZW5jZSBvZiBzdWNoIGFncmVlbWVudCwgdGhlIHVzZSBvZiB0aGUgc29mdHdhcmUgaXMgbm90XG4gKiBhbGxvd2VkLlxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0UmVzb3VyY2VUeXBlQWN0aW9uTGlzdCA9IGV4cG9ydHMuZ2V0UmVzb3VyY2VBY3Rpb25zRm9yUHJvamVjdCA9IGV4cG9ydHMudXBkYXRlUHJvamVjdFBvbGljeSA9IGV4cG9ydHMuc2V0QXR0YWNoZWRQcm9qZWN0UG9saWNpZXNUb01lbWJlciA9IGV4cG9ydHMuZ2V0UHJvamVjdFBvbGljeUxpc3QgPSBleHBvcnRzLmdldFByb2plY3RQb2xpY3kgPSBleHBvcnRzLmdldEF0dGFjaGVkUHJvamVjdFBvbGljeUZvck1lbWJlciA9IGV4cG9ydHMuZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWNpZXNGb3JNZW1iZXIgPSBleHBvcnRzLmdldEFsbFByb2plY3RNZW1iZXJzV2l0aEF0dGFjaGVkUG9saWN5ID0gZXhwb3J0cy5kZXRhY2hQcm9qZWN0UG9saWN5RnJvbU1lbWJlciA9IGV4cG9ydHMuZGVsZXRlUHJvamVjdFBvbGljeSA9IGV4cG9ydHMuY3JlYXRlUHJvamVjdFBvbGljeSA9IGV4cG9ydHMuYXR0YWNoUHJvamVjdFBvbGljeVRvTWVtYmVyID0gZXhwb3J0cy51cGRhdGVSZXNvdXJjZUxpbmthYmlsaXR5ID0gZXhwb3J0cy5yZW1vdmVSZXNvdXJjZUxpbmthYmlsaXR5ID0gZXhwb3J0cy5tYWtlUmVzb3VyY2VMaW5rYWJsZSA9IGV4cG9ydHMubGlzdFJlYWxtUmVzb3VyY2VzID0gZXhwb3J0cy5nZXRSZXNvdXJjZXMgPSBleHBvcnRzLmdldFJlc291cmNlUHJvamVjdHMgPSBleHBvcnRzLmdldFJlc291cmNlTGlua2FiaWxpdHkgPSBleHBvcnRzLmdldFJlc291cmNlID0gZXhwb3J0cy5nZXRMaXN0T2ZXYXlzUmVzb3VyY2VJc0xpbmthYmxlID0gZXhwb3J0cy5wYXRjaFByb2plY3QgPSBleHBvcnRzLmxpc3RQcm9qZWN0UmVzb3VyY2VzID0gZXhwb3J0cy5saXN0UHJvamVjdE1lbWJlcnMgPSBleHBvcnRzLmxlYXZlUHJvamVjdCA9IGV4cG9ydHMuZ2V0UHJvamVjdFJlc291cmNlID0gZXhwb3J0cy5nZXRQcm9qZWN0TWVtYmVyID0gZXhwb3J0cy5nZXRQcm9qZWN0TGlzdCA9IGV4cG9ydHMuZ2V0UHJvamVjdCA9IGV4cG9ydHMuZ2V0QWxsUHJvamVjdExpc3QgPSBleHBvcnRzLmRlbGV0ZVByb2plY3RSZXNvdXJjZVJlZmVyZW5jZSA9IGV4cG9ydHMuZGVsZXRlUHJvamVjdE1lbWJlciA9IGV4cG9ydHMuZGVsZXRlUHJvamVjdCA9IGV4cG9ydHMuY3JlYXRlUHJvamVjdCA9IGV4cG9ydHMuY2hlY2tQcm9qZWN0RXhpc3RhbmNlID0gZXhwb3J0cy5hZGRQcm9qZWN0UmVzb3VyY2VSZWxhdGlvbiA9IGV4cG9ydHMuYWRkUHJvamVjdE1lbWJlciA9IGV4cG9ydHMudXBkYXRlR3JvdXAgPSBleHBvcnRzLnJlbW92ZUdyb3VwTWVtYmVyID0gZXhwb3J0cy5sZWF2ZUdyb3VwID0gZXhwb3J0cy5nZXRNeUdyb3VwcyA9IGV4cG9ydHMuZ2V0R3JvdXBzID0gZXhwb3J0cy5nZXRHcm91cFJvbGVzID0gZXhwb3J0cy5nZXRHcm91cE1lbWJlcnMgPSBleHBvcnRzLmdldEdyb3VwTWVtYmVyID0gZXhwb3J0cy5nZXRHcm91cCA9IGV4cG9ydHMuZGVsZXRlR3JvdXAgPSBleHBvcnRzLmNyZWF0ZUdyb3VwID0gZXhwb3J0cy5hZGRHcm91cE1lbWJlciA9IGV4cG9ydHMuZ2V0Um9sZXMgPSBleHBvcnRzLmdldFJvbGVQZXJtaXNzaW9ucyA9IGV4cG9ydHMuZ2V0Um9sZVBlcm1pc3Npb24gPSBleHBvcnRzLmdldFJvbGVFbnRpdHkgPSBleHBvcnRzLmdldFJvbGVFbnRpdGllcyA9IGV4cG9ydHMuZ2V0Um9sZSA9IGV4cG9ydHMuZ2V0TXlSb2xlcyA9IGV4cG9ydHMuZGVsZXRlUm9sZUVudGl0eSA9IGV4cG9ydHMuYWRkUm9sZUVudGl0eSA9IGV4cG9ydHMucmVtb3ZlR3JhbnQgPSBleHBvcnRzLmxpc3RHcmFudHMgPSBleHBvcnRzLmdldEdyYW50cyA9IGV4cG9ydHMuZ2V0R3JhbnQgPSBleHBvcnRzLmFkZEdyYW50ID0gZXhwb3J0cy5zZWFyY2hSZWFsbU1lbWJlckludml0ZXMgPSBleHBvcnRzLnJlc2VuZFJlYWxtTWVtYmVySW52aXRlID0gZXhwb3J0cy5jcmVhdGVSZWFsbU1lbWJlckludml0ZSA9IGV4cG9ydHMuY2FuY2VsUmVhbG1NZW1iZXJJbnZpdGUgPSBleHBvcnRzLmdldFJlYWxtTWVtYmVycyA9IGV4cG9ydHMuZ2V0UmVhbG1NZW1iZXIgPSBleHBvcnRzLmdldEVudGl0eU1hbmFnZWRHcm91cHMgPSBleHBvcnRzLmdldEVudGl0eUdyb3VwTWVtYmVyc2hpcCA9IHZvaWQgMDtcbi8qKlxuICogQXV0aG9yaXphdGlvbiBBUEkgdjEuMVxuICogICBUaGlzIHNwZWNpZmljYXRpb24gaXMgaW50ZW5kZWQgdG8gZGVzY3JpYmUgdGhlIEF1dGhvcml6YXRpb24gdjEuMSBBUElzXG4gKlxuICogICBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4xLjBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgZ3JvdXBzIGEgZ2l2ZW4gZW50aXR5IGlzIGEgbWVtYmVyIG9mLiBSZXN0cmljdGlvbnM6XG4gKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZEdyb3VwcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgZW50aXR5LlxuICpcbiAqIEBleGFtcGxlOiBJbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgZ3JvdXBzIGEgdXNlciwgSEVSRS00YmE5YWNhMy1mZGY5LTRjYWQtYTNkYS01MzQ0OTRkNjE5OGYsIGlzIGEgbWVtYmVyIG9mLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqIFwiYWN0aW9uXCIgOiBcInJlYWRHcm91cHNcIlxuICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnVzZXIvSEVSRS00YmE5YWNhMy1mZGY5LTRjYWQtYTNkYS01MzQ0OTRkNjE5OGZcIlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdFxuICpcbiAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgZ3JvdXAgbWVtYmVyc2hpcFxuICogQHBhcmFtIHJlYWxtIEhSTiBpZGVudGlmeWluZyB0aGUgcmVhbG1cbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIGdyb3VwIG9yIHJlYWxtIG1lbWJlclxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKi9cbmZ1bmN0aW9uIGdldEVudGl0eUdyb3VwTWVtYmVyc2hpcChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vbWVtYmVycy97bWVtYmVyfS9ncm91cHNcIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRFbnRpdHlHcm91cE1lbWJlcnNoaXAgPSBnZXRFbnRpdHlHcm91cE1lbWJlcnNoaXA7XG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGdyb3VwcyBvdmVyIHdoaWNoIHRoZSBwcm92aWRlZCBlbnRpdHkgaGFzIGJlZW4gZ3JhbnRlZCB0aGUgcm9sZSBvZiBHcm91cEFkbWluLlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZEdyb3VwcyoqIGFjdGlvbiBhZ2FpbnN0XG4gKiB0aGUgc3BlY2lmaWVkIGVudGl0eS5cbiAqIEBleGFtcGxlOiBJbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgZ3JvdXBzIGEgdXNlciwgSEVSRS00YmE5YWNhMy1mZGY5LTRjYWQtYTNkYS01MzQ0OTRkNjE5OGYsXG4gKiBpcyBhbiBhZG1pbiBvZiwgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZEdyb3Vwc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTp1c2VyL0hFUkUtNGJhOWFjYTMtZmRmOS00Y2FkLWEzZGEtNTM0NDk0ZDYxOThmXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZW50aXR5IG1hbmFnZWQgZ3JvdXBcbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyBncm91cCBvciByZWFsbSBtZW1iZXJcbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICovXG5mdW5jdGlvbiBnZXRFbnRpdHlNYW5hZ2VkR3JvdXBzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZWFsbXMve3JlYWxtfS9tZW1iZXJzL3ttZW1iZXJ9L21hbmFnZWRHcm91cHNcIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRFbnRpdHlNYW5hZ2VkR3JvdXBzID0gZ2V0RW50aXR5TWFuYWdlZEdyb3Vwcztcbi8qKlxuICogUmV0cmlldmUgdGhlIHVzZXIgb3IgYXBwbGljYXRpb24gZGV0YWlscyBvZiB0aGUgbWVtYmVyIGRlZmluZWQgYnkgbWVtYmVySWQuIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRNZW1iZXJzKiogYWN0aW9uIGFnYWluc3RcbiAqIHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gcmV0cmlldmUgYSBtZW1iZXIgb2YgdGhlIHJlYWxtLCBfTXlSZWFsbV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgcmVhbG0gbWVtYmVyXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgZ3JvdXAgb3IgcmVhbG0gbWVtYmVyXG4gKi9cbmZ1bmN0aW9uIGdldFJlYWxtTWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZWFsbXMve3JlYWxtfS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlYWxtTWVtYmVyID0gZ2V0UmVhbG1NZW1iZXI7XG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIG1lbWJlcnMgd2l0aGluIHRoZSByZWFsbS4gUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZE1lbWJlcnMqKlxuICogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZWFsbS5cbiAqIEBleGFtcGxlOiBJbiBvcmRlciB0byBsaXN0IHRoZSBtZW1iZXJzIG9mIHRoZSByZWFsbSwgX015UmVhbG1fLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHJlYWxtIG1lbWJlcnNcbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0eXBlIG9mIG1lbWJlcnMgdG8gcmV0dXJuIGluIHRoZSByZXN1bHQuXG4gKiBPbmUgb2YgJ3VzZXInIG9yICdhcHAnLiAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIGFsbCBlbnRpdHkgdHlwZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBxIEEgZnJlZSB0ZXh0IHF1ZXJ5IHN0cmluZyB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0cy5cbiAqIEEgc2VhcmNoIGFnYWluc3QgbWVtYmVycyBpbiB0aGUgcmVhbG0gd2lsbCBjb25zaWRlciB0aGVcbiAqICd1c2VySWQnLFxuICogJ2ZpcnN0bmFtZScsXG4gKiAnbGFzdG5hbWUnLFxuICogJ2VtYWlsJyxcbiAqICdjbGllbnRJZCcsXG4gKiAnbmFtZScgYW5kICdyb2xlcycgZmllbGRzIG9mIHRoZSBtZW1iZXJzLlxuICogVGhlIHByZWNpc2Ugc2VhcmNoIGFsZ29yaXRobSB1c2VkIHRvIG1hdGNoIG1lbWJlcnMgaXMgbm90IHNwZWNpZmllZCxcbiAqIGJ1dCBnZW5lcmFsbHkgYW55IG1lbWJlciB3aGVyZSBvbmUgb2YgdGhlIGNvbnNpZGVyZWQgZmllbGRzIGhhcyBhIGZ1bGwgb3IgcGFydGlhbCBtYXRjaCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuXG4gKiBAcGFyYW0gc3RhdGUgT25seSByZXR1cm4gdXNlciBtZW1iZXJzIHdpdGggdGhlIGdpdmVuICdzdGF0ZScgaW4gdGhlIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGdldFJlYWxtTWVtYmVycyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vbWVtYmVyc1wiLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInFcIiwgcGFyYW1zW1wicVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdGF0ZVwiLCBwYXJhbXNbXCJzdGF0ZVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0UmVhbG1NZW1iZXJzID0gZ2V0UmVhbG1NZW1iZXJzO1xuLyoqXG4gKiBDYW5jZWwgYW4gaW52aXRhdGlvbiB0byB0aGUgcmVhbG0uIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZUludml0ZXMqKlxuICogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZWFsbS5cbiAqIEBleGFtcGxlOiBJbiBvcmRlciB0byBkZWxldGUgYW4gaW52aXRhdGlvbiB0byB0aGUgcmVhbG0sXG4gKiBfTXlSZWFsbV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUludml0ZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ2FuY2VsIGEgdXNlciBpbnZpdGF0aW9uIHRvIGEgcmVhbG1cbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKiBAcGFyYW0gaW52aXRlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGludml0ZS5cbiAqL1xuZnVuY3Rpb24gY2FuY2VsUmVhbG1NZW1iZXJJbnZpdGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L2ludml0ZXMve2ludml0ZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntpbnZpdGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJpbnZpdGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNhbmNlbFJlYWxtTWVtYmVySW52aXRlID0gY2FuY2VsUmVhbG1NZW1iZXJJbnZpdGU7XG4vKipcbiAqIENyZWF0ZSBhbmQgc2VuZCBhbiBpbnZpdGF0aW9uIHRvIGFkZCBhIG5ldyBtZW1iZXIgdG8gdGhlIHJlYWxtLFxuICogb3B0aW9uYWxseSBhc3NpZ24gbWVtYmVyc2hpcCB0byBvbmUgb3IgbW9yZSBncm91cHMgaWYgdGhlIEludml0ZXIgaXMgYWxzbyBhICoqR3JvdXBBZG1pbioqXG4gKiBmb3IgdGhlIGdyb3VwLiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGVcbiAqICoqbWFuYWdlSW52aXRlcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gaW52aXRlIGEgbmV3IHVzZXIgdG8gdGhlIHJlYWxtLCBfTXlSZWFsbV8sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VJbnZpdGVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIGludml0ZSBhIG5ldyB1c2VyIHRvIHRoZSByZWFsbSwgX015UmVhbG1fLFxuICogYXMgYSBtZW1iZXIgb2YgdGhlIGdyb3VwIEdST1VQLWEzZGVlMmZlLWZiMzgtNDE4My1iNjg2LTE0ZmRlYTU5NjRjMCxcbiAqIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnMgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUludml0ZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtYTNkZWUyZmUtZmIzOC00MTgzLWI2ODYtMTRmZGVhNTk2NGNcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IENyZWF0ZSBhbmQgc2VuZCBhIHVzZXIgaW52aXRhdGlvbiBmb3IgYSByZWFsbVxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlYWxtTWVtYmVySW52aXRlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZWFsbXMve3JlYWxtfS9pbnZpdGVzXCIucmVwbGFjZShcIntyZWFsbX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlYWxtXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNyZWF0ZVJlYWxtTWVtYmVySW52aXRlID0gY3JlYXRlUmVhbG1NZW1iZXJJbnZpdGU7XG4vKipcbiAqIFJlc2VuZCBhbiBpbnZpdGF0aW9uIHRvIGEgbmV3IG1lbWJlciB0byB0aGUgcmVhbG0uXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VJbnZpdGVzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIHJlc2VuZCBhbiBpbnZpdGUgdG8gYSBuZXcgdXNlciB0byB0aGUgcmVhbG0sIF9NeVJlYWxtXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUludml0ZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVzZW5kIGFuIGludml0YXRpb24gdG8gYSB1c2VyIGluIGEgcmVhbG1cbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKiBAcGFyYW0gaW52aXRlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGludml0ZS5cbiAqL1xuZnVuY3Rpb24gcmVzZW5kUmVhbG1NZW1iZXJJbnZpdGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L2ludml0ZXMve2ludml0ZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntpbnZpdGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJpbnZpdGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZXNlbmRSZWFsbU1lbWJlckludml0ZSA9IHJlc2VuZFJlYWxtTWVtYmVySW52aXRlO1xuLyoqXG4gKiBTZWFyY2ggZm9yIGludml0YXRpb25zIGluIHRoZSByZWFsbSwgb3B0aW9uYWxseSBwcm92aWRpbmcgYSBncm91cC5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZUludml0ZXMqKlxuICogYWN0aW9uIGFnYWluc3QgdGhlIHJlYWxtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyBwYXJ0eS5cbiAqXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gbGlzdCB0aGUgaW52aXRhdGlvbnMgd2l0aGluIHRoZSBjYWxsaW5nIHBhcnR5J3MgcmVhbG0gYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlSW52aXRlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGludml0YXRpb25zIGluIGEgcmVhbG1cbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKiBAcGFyYW0gZ3JvdXAgSFJOIGlkZW5pdGlmeWluZyB0aGUgZ3JvdXAgdG8gc2VhcmNoLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKiBAcGFyYW0gcSBBIGZyZWUgdGV4dCBxdWVyeSBzdHJpbmcgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuXG4gKiBBIHNlYXJjaCBhZ2FpbnN0IGludml0ZXMgaW4gdGhlIHJlYWxtIHdpbGwgY29uc2lkZXIgdGhlICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCBhbmQgJ2VtYWlsQWRkcmVzcycgZmllbGRzIG9mIHRoZSBpbnZpdGVzLlxuICogVGhlIHByZWNpc2Ugc2VhcmNoIGFsZ29yaXRobSB1c2VkIHRvIG1hdGNoIGludml0ZXMgaXMgbm90IHNwZWNpZmllZCwgYnV0IGdlbmVyYWxseSBhbnkgaW52aXRlIHdoZXJlIG9uZVxuICogb2YgdGhlIGNvbnNpZGVyZWQgZmllbGRzIGhhcyBhIGZ1bGwgb3IgcGFydGlhbCBtYXRjaCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIHNlYXJjaFJlYWxtTWVtYmVySW52aXRlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vaW52aXRlc1wiLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImdyb3VwXCIsIHBhcmFtc1tcImdyb3VwXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicVwiLCBwYXJhbXNbXCJxXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5zZWFyY2hSZWFsbU1lbWJlckludml0ZXMgPSBzZWFyY2hSZWFsbU1lbWJlckludml0ZXM7XG4vKipcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEdyYW50c0FwaVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEdyYW50IGFjY2VzcyB0byBhIHJlc291cmNlIHRvIGFuIGVudGl0eS5cbiAqIFRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIGlzIHRoYXQgdGhlIHNwZWNpZmllZCBlbnRpdHkgd2lsbCBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgc3BlY2lmaWVkIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSByZWFsbSBvZiB0aGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogbWF0Y2ggdGhlIHJlYWxtIG9mIHRoZSByZXF1ZXN0ZWQgZW50aXR5LlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqYWRkR3JhbnQ6e2FjdGlvbklkfSoqIE9SICoqc2hhcmUqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBhZGQgYSBncmFudCBmb3IgdGhlICoqcmVhZFJlc291cmNlKiogYWN0aW9uIGFnYWluc3QgcmVzb3VyY2UgKipocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2cqKiBhIHBlcm1pc3Npb25cbiAqIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwiYWRkR3JhbnQ6cmVhZFJlc291cmNlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogT1JcbiAqICogXCJhY3Rpb25cIiA6IFwic2hhcmVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR3JhbnQgYWNjZXNzIHRvIGEgcmVzb3VyY2UgdG8gYW4gZW50aXR5LlxuICogQHBhcmFtIHJlc291cmNlSHJuIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIGVudGl0eUlkIFRoZSB0YXJnZXQgZW50aXR5SWQgdG8gZ3JhbnQgYWNjZXNzIHRvXG4gKiBAcGFyYW0gYWN0aW9uSWQgVGhlIGFjdGlvbiB0byBhc3NpZ24gYXMgYWxsb3dlZCBhZ2FpbnN0IHRoZSByZXNvdXJjZVxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHR5cGUgb2YgdGhlIGVudGl0eSB0byBncmFudCBhY2Nlc3MgdG8uICBNdXN0IGJlIG9uZSBvZiB1c2VyLCBhcHAsIG9yIGdyb3VwXG4gKi9cbmZ1bmN0aW9uIGFkZEdyYW50KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncmFudHMvcmVzb3VyY2VzL3tyZXNvdXJjZUhybn0vZW50aXRpZXMve2VudGl0eUlkfS9hY3Rpb25zL3thY3Rpb25JZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntlbnRpdHlJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eUlkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2FjdGlvbklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYWN0aW9uSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbnRpdHlUeXBlXCIsIHBhcmFtc1tcImVudGl0eVR5cGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5hZGRHcmFudCA9IGFkZEdyYW50O1xuLyoqXG4gKiBHZXQgYSBzaW5nbGUgZ3JhbnQgZ2l2ZW4gdG8gYW4gZW50aXR5LlxuICogVGhpcyBjYWxscyByZXR1cm5zIGFueSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlIHNwZWNpZmllZCBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIG9uIHRoZSByZXF1ZXN0ZWQgZW50aXR5LlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgcmVhbG0gb2YgdGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIG1hdGNoIHRoZSByZWFsbSBvZiB0aGUgcmVxdWVzdGVkIGFwcC5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKmxpc3RHcmFudHMqKiBPUiAqKnNoYXJlKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqICogSW4gb3JkZXIgdG8gZ2V0IGEgZ3JhbnQgYWdhaW5zdCByZXNvdXJjZSAqKmhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZyoqXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0R3JhbnRzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogT1JcbiAqICogXCJhY3Rpb25cIiA6IFwic2hhcmVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgc2luZ2xlIGdyYW50IGdpdmVuIHRvIGFuIGVudGl0eVxuICogQHBhcmFtIHJlc291cmNlSHJuIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIGVudGl0eUlkIFRoZSB0YXJnZXQgZW50aXR5SWQgdG8gZ2V0IHRoZSBncmFudCBvZlxuICogQHBhcmFtIGFjdGlvbklkIFRoZSBhY3Rpb24gb2YgdGhlIGdyYW50XG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5IHRvIGdldCB0aGUgZ3JhbnQgb2YuICBNdXN0IGJlIG9uZSBvZiB1c2VyLCBhcHAsIG9yIGdyb3VwXG4gKi9cbmZ1bmN0aW9uIGdldEdyYW50KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncmFudHMvcmVzb3VyY2VzL3tyZXNvdXJjZUhybn0vZW50aXRpZXMve2VudGl0eUlkfS9hY3Rpb25zL3thY3Rpb25JZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntlbnRpdHlJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eUlkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2FjdGlvbklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYWN0aW9uSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbnRpdHlUeXBlXCIsIHBhcmFtc1tcImVudGl0eVR5cGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEdyYW50ID0gZ2V0R3JhbnQ7XG4vKipcbiAqIEdldCBncmFudHMuIFRoaXMgY2FsbCBkZXNjcmliZXMgdGhlIHBlcm1pc3Npb25zIGFzc2lnbmVkIHRvIHRoZSBzcGVjaWZpZWQgZW50aXR5IHRoYXQgZ3JhbnQgYWNjZXNzIHRvIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgcmVhbG0gb2YgdGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIG1hdGNoIHRoZSByZWFsbSBvZiB0aGUgcmVxdWVzdGVkIGVudGl0eS5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKmxpc3RHcmFudHMqKiBPUiAqKnNoYXJlKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGdldCBncmFudHMgYWdhaW5zdCByZXNvdXJjZSAqKmhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZyoqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcImxpc3RHcmFudHNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiBPUlxuICogKiBcImFjdGlvblwiIDogXCJzaGFyZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZ3JhbnRzIGdpdmVuIHRvIGEgdXNlciwgYXBwLCBvciBncm91cFxuICogQHBhcmFtIHJlc291cmNlSHJuIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIGVudGl0eUlkIFRoZSBlbnRpdHlJZCB0byBnZXQgdGhlIGdyYW50cyBvZlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHR5cGUgb2YgdGhlIGVudGl0eSByZXF1ZXN0ZWQuICBNdXN0IGJlIG9uZSBvZiB1c2VyLCBhcHAsIG9yIGdyb3VwXG4gKi9cbmZ1bmN0aW9uIGdldEdyYW50cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JhbnRzL3Jlc291cmNlcy97cmVzb3VyY2VIcm59L2VudGl0aWVzL3tlbnRpdHlJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntlbnRpdHlJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eUlkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRHcmFudHMgPSBnZXRHcmFudHM7XG4vKipcbiAqIExpc3QgZ3JhbnRzIG9uIHVzZXIsIGFwcHMsIG9yIGdyb3Vwcy5cbiAqIFRoaXMgY2FsbCBkZXNjcmliZXMgdGhlIHBlcm1pc3Npb25zIGFzc2lnbmVkIHRvIGFueSB1c2VyLCBhcHAsIG9yIGdyb3VwICoqaW4gdGhlIHNhbWUgcmVhbG0gYXMgdGhlIGNhbGxpbmcgcHJpbmNpcGFsKipcbiAqIHRoYXQgaGFzIGJlZW4gZ3JhbnRlZCBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0aHJvdWdoIGFuIGV4YWN0IG1hdGNoaW5nIHBlcm1pc3Npb24uXG4gKiBQZXJtaXNzaW9ucyBncmFudGVkIHRocm91Z2ggcG9saWNpZXMgYW5kIHJvbGVzIGFyZSBub3QgaW5jbHVkZWQuXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipsaXN0R3JhbnRzKiogT1IgKipzaGFyZSoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBsaXN0IGdyYW50cyBhZ2FpbnN0IHJlc291cmNlICoqaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nKiogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibGlzdEdyYW50c1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqIE9SXG4gKiAqIFwiYWN0aW9uXCIgOiBcInNoYXJlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IExpc3QgZ3JhbnRzIG9uIHVzZXJzLCBhcHBzLCBvciBncm91cHNcbiAqIEBwYXJhbSByZXNvdXJjZUhybiBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFJlc3RyaWN0IHRvIG9ubHkgdGhpcyB0eXBlIG9mIGVudGl0eSAgaW4gdGhlIHJlc3BvbnNlLiAgTXVzdCBiZSBvbmUgb2YgdXNlciwgYXBwLCBvciBncm91cFxuICogQHBhcmFtIHBhZ2VUb2tlbiBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gJ2NvdW50JyB0b3RhbCByZWNvcmRzLCB1c2UgdGhlIHBhZ2VUb2tlbiBmcm9tIHRoZSBwcmV2aW91cyBwYWdlIHRvIHJldHJpZXZlIHRoZSBuZXh0IHBhZ2VcbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm5cbiAqL1xuZnVuY3Rpb24gbGlzdEdyYW50cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JhbnRzL3Jlc291cmNlcy97cmVzb3VyY2VIcm59L2VudGl0aWVzXCIucmVwbGFjZShcIntyZXNvdXJjZUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxpc3RHcmFudHMgPSBsaXN0R3JhbnRzO1xuLyoqXG4gKiBSZXZva2UgYWNjZXNzIHRvIGEgcmVzb3VyY2UgZnJvbSBhbiBlbnRpdHkuXG4gKiBUaGUgcmVzdWx0IG9mIHRoaXMgY2FsbCBpcyB0aGF0IHRoZSBzcGVjaWZpZWQgZW50aXR5IHdpbGwgaGF2ZSBhbnkgZGlyZWN0bHkgYXNzaWduZWQgcGVybWlzc2lvblxuICogdG8gdGFrZSB0aGUgc3BlY2lmaWVkIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgcmVtb3ZlZC5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSByZWFsbSBvZiB0aGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogbWF0Y2ggdGhlIHJlYWxtIG9mIHRoZSByZXF1ZXN0ZWQgYXBwLlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVtb3ZlR3JhbnQ6e2FjdGlvbklkfSoqXG4gKiBPUiAqKnNoYXJlKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIHJlbW92ZSBhIGdyYW50IGZvciB0aGUgKipyZWFkUmVzb3VyY2UqKiBhY3Rpb24gYWdhaW5zdCByZXNvdXJjZSAqKmhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZyoqXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZW1vdmVHcmFudDpyZWFkUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiBPUlxuICogKiBcImFjdGlvblwiIDogXCJzaGFyZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBSZXZva2UgYWNjZXNzIHRvIGEgcmVzb3VyY2UgZnJvbSBhbiBlbnRpdHlcbiAqIEBwYXJhbSByZXNvdXJjZUhybiBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSBlbnRpdHlJZCBUaGUgdGFyZ2V0IGVudGl0eUlkIHRvIHJldm9rZSBhY2Nlc3MgZnJvbVxuICogQHBhcmFtIGFjdGlvbklkIFRoZSBhY3Rpb24gYWdhaW5zdCB0aGUgcmVzb3VyY2UgdG8gcmV2b2tlIGFjY2VzcyBmcm9tXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5IHRvIHJldm9rZSBhY2Nlc3MgZnJvbS4gIE11c3QgYmUgb25lIG9mIHVzZXIsIGFwcCwgb3IgZ3JvdXBcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlR3JhbnQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyYW50cy9yZXNvdXJjZXMve3Jlc291cmNlSHJufS9lbnRpdGllcy97ZW50aXR5SWR9L2FjdGlvbnMve2FjdGlvbklkfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntyZXNvdXJjZUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlSHJuXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2VudGl0eUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZW50aXR5SWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7YWN0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhY3Rpb25JZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImVudGl0eVR5cGVcIiwgcGFyYW1zW1wiZW50aXR5VHlwZVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlbW92ZUdyYW50ID0gcmVtb3ZlR3JhbnQ7XG4vKipcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJvbGVzQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQXNzaWduIHRoZSByb2xlIHByb3ZpZGVkIHRvIHRoZSBnaXZlbiBlbnRpdHkuXG4gKiBJZiB0aGUgcHJvdmlkZWQgcm9sZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBncm91cCwgdGhlIGVudGl0eSBiZWluZyBhc3NpZ25lZCB0aGUgcm9sZSBtdXN0IGJlIGEgbWVtYmVyIG9mIHRoZSBhc3NvY2lhdGVkIGdyb3VwLlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlRW50aXRpZXMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGFzc2lnbiB0aGUgcm9sZSwgX0dyb3VwQWRtaW5fLCB0byBhbiBlbnRpdHkgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZFxuICogYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUVudGl0aWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEFzc2lnbiBhIHJvbGUgdG8gYW4gZW50aXR5XG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gZW50aXR5IEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGVudGl0eVxuICovXG5mdW5jdGlvbiBhZGRSb2xlRW50aXR5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vZW50aXRpZXMve2VudGl0eX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cm9sZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJvbGVcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZW50aXR5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZW50aXR5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuYWRkUm9sZUVudGl0eSA9IGFkZFJvbGVFbnRpdHk7XG4vKipcbiAqIFJlbW92ZSB0aGUgcm9sZSBwcm92aWRlZCB0byBmcm9tIHRoZSBnaXZlbiBtZW1iZXIuXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VFbnRpdGllcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gcmV2b2tlIHRoZSByb2xlLCBfR3JvdXBBZG1pbl8sIGZyb20gYW4gZW50aXR5IGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUVudGl0aWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFJldm9rZSBhIHJvbGUgZnJvbSBhbiBlbnRpdHlcbiAqIEBwYXJhbSByb2xlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIHJvbGVcbiAqIEBwYXJhbSBlbnRpdHkgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gZW50aXR5XG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVJvbGVFbnRpdHkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3JvbGVzL3tyb2xlfS9lbnRpdGllcy97ZW50aXR5fVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntlbnRpdHl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJlbnRpdHlcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRlbGV0ZVJvbGVFbnRpdHkgPSBkZWxldGVSb2xlRW50aXR5O1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiByb2xlcyB3aGljaCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gdGhlIGNhbGxpbmcgcGFydHkuXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBNeSBSb2xlc1xuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKi9cbmZ1bmN0aW9uIGdldE15Um9sZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3JvbGVzL21lXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0TXlSb2xlcyA9IGdldE15Um9sZXM7XG4vKipcbiAqIEdldCB0aGUgcm9sZSBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBSb2xlIEhSTi5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkUm9sZXMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlYWxtLlxuICpcbiAqICBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmV0cmlldmUgYSByb2xlIHdpdGhpbiB0aGUgcmVhbG0sIF9NeVJlYWxtXywgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZ1xuICogd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRSb2xlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgUm9sZVxuICogQHBhcmFtIHJvbGUgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gcm9sZVxuICovXG5mdW5jdGlvbiBnZXRSb2xlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX1cIi5yZXBsYWNlKFwie3JvbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyb2xlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJvbGUgPSBnZXRSb2xlO1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBlbnRpdGllcyB3aGljaCBoYXZlIGJlZW4gYXNzaWduZWQgdGhlIHJvbGUgYXMgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgcm9sZSBIUk4uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZEVudGl0aWVzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByb2xlLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBsaXN0IHRoZSBlbnRpdGllcyBhc3NpZ25lZCB0aGUgcm9sZSwgX1xuICogaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpyb2xlL1JPTEUtYzE2NjIxMzgtYTE3MC00MjY0LWJhMTgtN2I1MDZhNzA4YzM3XyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRFbnRpdGllc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpyb2xlL1JPTEUtYzE2NjIxMzgtYTE3MC00MjY0LWJhMTgtN2I1MDZhNzA4YzM3XCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgcm9sZSBlbnRpdGllc1xuICogQHBhcmFtIHJvbGUgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gcm9sZVxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKi9cbmZ1bmN0aW9uIGdldFJvbGVFbnRpdGllcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXMve3JvbGV9L2VudGl0aWVzXCIucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJvbGVFbnRpdGllcyA9IGdldFJvbGVFbnRpdGllcztcbi8qKlxuICogUmV0cmlldmUgYSBzaW5nbGUgZW50aXR5IHdoaWNoIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSByb2xlIGFzIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIHJvbGUgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRFbnRpdGllcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gcmV0cmlldmUgYW4gZW50aXR5IGFzc2lnbmVkIHRoZSByb2xlLCBfR3JvdXBBZG1pbl8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkRW50aXRpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cm9sZS9ST0xFLWMxNjYyMTM4LWExNzAtNDI2NC1iYTE4LTdiNTA2YTcwOGMzN1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgc2luZ2xlIHJvbGUgZW50aXR5XG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gZW50aXR5IEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGVudGl0eVxuICovXG5mdW5jdGlvbiBnZXRSb2xlRW50aXR5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vZW50aXRpZXMve2VudGl0eX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cm9sZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJvbGVcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZW50aXR5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZW50aXR5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJvbGVFbnRpdHkgPSBnZXRSb2xlRW50aXR5O1xuLyoqXG4gKiBHZXQgYSBzaW5nbGUgcGVybWlzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJvbGUgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgUm9sZSBIUk4uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZFBlcm1pc3Npb25zKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByb2xlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byByZXRyaWV2ZSBhIHNpbmdsZSByb2xlIHBlcm1pc3Npb24gZm9yIHRoZSBzcGVjaWZpZWQgcm9sZSBpbiByZWFsbSBfTXlSZWFsbV8sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkUGVybWlzc2lvbnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cm9sZS9ST0xFLWMxNjYyMTM4LWExNzAtNDI2NC1iYTE4LTdiNTA2YTcwOGMzN1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IFJvbGUgUGVybWlzc2lvblxuICogQHBhcmFtIHJvbGUgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gcm9sZVxuICogQHBhcmFtIHBlcm1pc3Npb24gUGVybWlzc2lvbiBpZGVudGlmaWVyXG4gKi9cbmZ1bmN0aW9uIGdldFJvbGVQZXJtaXNzaW9uKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vcGVybWlzc2lvbnMve3Blcm1pc3Npb259XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3JvbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyb2xlXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Blcm1pc3Npb259XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwZXJtaXNzaW9uXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJvbGVQZXJtaXNzaW9uID0gZ2V0Um9sZVBlcm1pc3Npb247XG4vKipcbiAqIEdldCB0aGUgcGVybWlzc2lvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSByb2xlIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIFJvbGUgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRQZXJtaXNzaW9ucyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAqXG4gKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbGlzdCByb2xlIHBlcm1pc3Npb25zIGZvciB0aGUgc3BlY2lmaWVkIHJvbGUgaW4gcmVhbG0gX015UmVhbG1fLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nXG4gKiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFBlcm1pc3Npb25zXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBSb2xlIFBlcm1pc3Npb25zXG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqL1xuZnVuY3Rpb24gZ2V0Um9sZVBlcm1pc3Npb25zKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vcGVybWlzc2lvbnNcIi5yZXBsYWNlKFwie3JvbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyb2xlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0Um9sZVBlcm1pc3Npb25zID0gZ2V0Um9sZVBlcm1pc3Npb25zO1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiByb2xlcyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb3ZpZGVkIHJlYWxtLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRSb2xlcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGxpc3Qgcm9sZXMgd2l0aGluIHRoZSByZWFsbSwgX015UmVhbG1fLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkXG4gKiBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFJvbGVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBSb2xlc1xuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKiBAcGFyYW0gcm9sZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJvbGUgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdCBzZXQuXG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiBvZiB0aGUgcmVzb3VyY2Ugd2hpY2ggdGhlIHJvbGVzIHJldHVybmVkIGluIHRoZSByZXN1bHQgc2V0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguXG4gKi9cbmZ1bmN0aW9uIGdldFJvbGVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlc1wiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyb2xlTmFtZVwiLCBwYXJhbXNbXCJyb2xlTmFtZVwiXSk7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVzb3VyY2VcIiwgcGFyYW1zW1wicmVzb3VyY2VcIl0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0Um9sZXMgPSBnZXRSb2xlcztcbi8qKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR3JvdXBzQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1lbWJlciB0byBhIGdyb3VwLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZU1lbWJlcnMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgZ3JvdXBcbiAqIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIGdyb3VwIEhSTi5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBhZGQgYSBtZW1iZXIgdG8gdGhlIGdyb3VwLCBfR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXywgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZFxuICogYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBBZGQgYSBtZW1iZXIgdG8gYSBncm91cFxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyBncm91cCBvciByZWFsbSBtZW1iZXJcbiAqL1xuZnVuY3Rpb24gYWRkR3JvdXBNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwcy97Z3JvdXBJZH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5hZGRHcm91cE1lbWJlciA9IGFkZEdyb3VwTWVtYmVyO1xuLyoqXG4gKiBDcmVhdGUgYSBncm91cCB3aXRoaW4gdGhlIHJlYWxtIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHBhcnR5LlxuICogVGhlIGNhbGxpbmcgcGFydHkgd2lsbCBiZSBtYWRlIGEgbWVtYmVyIGFuZCBhbiBhZG1pbmlzdHJhdG9yIG9mIHRoZSBjcmVhdGVkIGdyb3VwLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKmNyZWF0ZUdyb3VwKiogYWN0aW9uXG4gKiBhZ2FpbnN0IHRoZSByZWFsbSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgcGFydHkuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gY3JlYXRlIGEgZ3JvdXAgd2l0aGluIHRoZSBjYWxsaW5nIHBhcnR5J3MgcmVhbG0gYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwiY3JlYXRlR3JvdXBcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIGdyb3VwXG4gKiBAcGFyYW0gYm9keVxuICovXG5mdW5jdGlvbiBjcmVhdGVHcm91cChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNyZWF0ZUdyb3VwID0gY3JlYXRlR3JvdXA7XG4vKipcbiAqIERlbGV0ZSB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlXG4gKiB0aGUgKipkZWxldGVHcm91cCoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZGVsZXRlIHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJkZWxldGVHcm91cFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IGRlbGV0ZSBncm91cFxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUdyb3VwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9XCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlR3JvdXAgPSBkZWxldGVHcm91cDtcbi8qKlxuICogUmV0cmlldmUgdGhlIGdyb3VwIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIGdyb3VwIEhSTi5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkTWVtYmVycyoqIGFjdGlvblxuICogYWdhaW5zdCB0aGUgcmVhbG0gYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHBhcnR5LlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJldHJpZXZlIGEgZ3JvdXAgd2l0aGluIHRoZSBjYWxsaW5nIHBhcnR5J3MgcmVhbG0gYSBwZXJtaXNzaW9uXG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBzaW5nbGUgZ3JvdXBcbiAqIEBwYXJhbSBncm91cElkIEhSTiBpZGVudGlmeWluZyBhIGdyb3VwLlxuICovXG5mdW5jdGlvbiBnZXRHcm91cChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfVwiLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0R3JvdXAgPSBnZXRHcm91cDtcbi8qKlxuICogUmV0cmlldmUgYSBzaW5nbGUgZ3JvdXAgbWVtYmVyLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRNZW1iZXJzKiogYWN0aW9uIGFnYWluc3RcbiAqIHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmV0cmlldmUgYSBzaW5nbGUgbWVtYmVyIG9mIHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBzaW5nbGUgR3JvdXAgbWVtYmVyXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIGdyb3VwIG9yIHJlYWxtIG1lbWJlclxuICovXG5mdW5jdGlvbiBnZXRHcm91cE1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2dyb3VwSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJncm91cElkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRHcm91cE1lbWJlciA9IGdldEdyb3VwTWVtYmVyO1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBtZW1iZXJzIG9mIHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZE1lbWJlcnMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgZ3JvdXBcbiAqIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIGdyb3VwIEhSTi5cbiAqXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSBtZW1iZXJzIG9mIHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBHcm91cCBtZW1iZXJzXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHR5cGUgb2YgbWVtYmVycyB0byByZXR1cm4gaW4gdGhlIHJlc3VsdC5cbiAqIE9uZSBvZiAndXNlcicsICdhcHAnLCBvciAnaW52aXRlJy4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIGFsbCBlbnRpdHkgdHlwZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAqL1xuZnVuY3Rpb24gZ2V0R3JvdXBNZW1iZXJzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9L21lbWJlcnNcIi5yZXBsYWNlKFwie2dyb3VwSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJncm91cElkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbnRpdHlUeXBlXCIsIHBhcmFtc1tcImVudGl0eVR5cGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEdyb3VwTWVtYmVycyA9IGdldEdyb3VwTWVtYmVycztcbi8qKlxuICogTGlzdCB0aGUgcm9sZXMgd2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgZ3JvdXAuXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZFJvbGVzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCBncm91cC5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgbGlzdCB0aGUgcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkUm9sZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZ3JvdXAgcm9sZXNcbiAqIEBwYXJhbSBncm91cElkIEhSTiBpZGVudGlmeWluZyBhIGdyb3VwLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKi9cbmZ1bmN0aW9uIGdldEdyb3VwUm9sZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwcy97Z3JvdXBJZH0vcm9sZXNcIi5yZXBsYWNlKFwie2dyb3VwSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJncm91cElkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0R3JvdXBSb2xlcyA9IGdldEdyb3VwUm9sZXM7XG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGdyb3VwcyB3aXRoaW4gdGhlIHJlYWxtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyBwYXJ0eS5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSByZWFsbSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgcGFydHkuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbGlzdCB0aGUgZ3JvdXBzIHdpdGhpbiB0aGUgY2FsbGluZyBwYXJ0eSdzIHJlYWxtIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBncm91cHNcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICogQHBhcmFtIHEgQSBmcmVlIHRleHQgcXVlcnkgc3RyaW5nIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRzLlxuICogQSBzZWFyY2ggYWdhaW5zdCBncm91cHMgaW4gdGhlIHJlYWxtIHdpbGwgY29uc2lkZXIgdGhlICdpZCcsICduYW1lJywgYW5kICdkZXNjcmlwdGlvbicgZmllbGRzIG9mIHRoZSBncm91cHMuXG4gKiBUaGUgcHJlY2lzZSBzZWFyY2ggYWxnb3JpdGhtIHVzZWQgdG8gbWF0Y2ggZ3JvdXBzIGlzIG5vdCBzcGVjaWZpZWQsIGJ1dCBnZW5lcmFsbHkgYW55IG1lbWJlciB3aGVyZVxuICogb25lIG9mIHRoZSBjb25zaWRlcmVkIGZpZWxkcyBoYXMgYSBmdWxsIG9yIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBnZXRHcm91cHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwc1wiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJxXCIsIHBhcmFtc1tcInFcIl0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0R3JvdXBzID0gZ2V0R3JvdXBzO1xuLyoqXG4gKiBSZXRyaWV2ZSBhIGxpc3Qgb2YgZ3JvdXBzIG9mIGEgbWVtYmVyXG4gKlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgTXkgR3JvdXBzXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqL1xuZnVuY3Rpb24gZ2V0TXlHcm91cHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwcy9tZVwiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldE15R3JvdXBzID0gZ2V0TXlHcm91cHM7XG4vKipcbiAqIFJlbW92ZSB0aGUgY2FsbGluZyBwYXJ0eSBmcm9tIHRoZSBncm91cC4gVGhpcyBvcGVyYXRpb24gd2lsbCBhbHNvIHJlbW92ZSBhZG1pbmlzdHJhdGl2ZSByb2xlcyBmcm9tIHRoaXMgbWVtYmVyLlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBSZW1vdmVzIHRoZSBjYWxsaW5nIHBhcnR5IGZyb20gYSBncm91cFxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKi9cbmZ1bmN0aW9uIGxlYXZlR3JvdXAoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwcy97Z3JvdXBJZH0vbWVtYmVycy9tZVwiLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxlYXZlR3JvdXAgPSBsZWF2ZUdyb3VwO1xuLyoqXG4gKiBSZW1vdmUgYSBtZW1iZXIgZnJvbSB0aGUgZ3JvdXAuIFRoaXMgb3BlcmF0aW9uIHdpbGwgYWxzbyByZW1vdmUgYWRtaW5pc3RyYXRpdmUgcm9sZXMgZnJvbSB0aGlzIG1lbWJlci5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVtb3ZlIGEgbWVtYmVyIGZyb20gdGhlIGdyb3VwLCBfR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBSZW1vdmUgYSBtZW1iZXIgZnJvbSB0aGUgZ3JvdXAuXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIGdyb3VwIG9yIHJlYWxtIG1lbWJlclxuICovXG5mdW5jdGlvbiByZW1vdmVHcm91cE1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2dyb3VwSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJncm91cElkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVtb3ZlR3JvdXBNZW1iZXIgPSByZW1vdmVHcm91cE1lbWJlcjtcbi8qKlxuICogVXBkYXRlIHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4gYnkgdXBkYXRpbmcgYWxsIHdyaXRhYmxlIGdyb3VwIGZpZWxkcyBpbmNsdWRpbmcgbmFtZSBhbmQgZGVzY3JpcHRpb24uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICAqKnVwZGF0ZUdyb3VwKiogYWN0aW9uXG4gKiBhZ2FpbnN0IHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbW9kaWZ5IHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJ1cGRhdGVHcm91cFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpncm91cC9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZSBncm91cFxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSBncm91cElkIEhSTiBpZGVudGlmeWluZyBhIGdyb3VwLlxuICovXG5mdW5jdGlvbiB1cGRhdGVHcm91cChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfVwiLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBkYXRlR3JvdXAgPSB1cGRhdGVHcm91cDtcbi8qKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUHJvamVjdHNBcGlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBBZGQgdGhlIG1lbWJlciB0byB0aGUgcmVxdWVzdGVkIFByb2plY3QuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlTWVtYmVycyoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBhZGQgYSBtZW1iZXIgdG8gdGhlIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQWRkIHRoZSBtZW1iZXIgdG8gdGhlIHJlcXVlc3RlZCBQcm9qZWN0XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IG1lbWJlci4gRWl0aGVyIHVzZXIsIGFwcCBvciBncm91cFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGFkZFByb2plY3RNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmFkZFByb2plY3RNZW1iZXIgPSBhZGRQcm9qZWN0TWVtYmVyO1xuLyoqXG4gKiBBZGQgdGhlIHJlc291cmNlIHRvIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBhcyBhIGhvbWUgb3IgYSByZWZlcmVuY2UobGluaykuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlbiAgKipXaGVuIHJlbGF0aW9uPWhvbWUqKlxuICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSB3aWxsIGJlIGFzc2lnbmVkIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCBhcyBpdHMgcmVzb3VyY2UgaG9tZS5cbiAqIFRoZSByZXNvdXJjZSAqKk1VU1QgTk9UKiogYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIHJlc291cmNlIGhvbWUuXG4gKlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUmVzb3VyY2VIb21lKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QgKipBTkQqKlxuICogdGhlICoqc2hhcmUqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBhZGQgcmVzb3VyY2UgXCJocm46aGVyZTpkYXRhOjpteXJlYWxtOm15LWNhdGFsb2ctMDAwMFwiIHRvIHRoZSBwcm9qZWN0XG4gKiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIiwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9ucyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogUGVybWlzc2lvbiAxOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZUhvbWVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICpcbiAqICogUGVybWlzc2lvbiAyOlxuICogKiBcImFjdGlvblwiIDogXCJzaGFyZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6bXlyZWFsbTpteS1jYXRhbG9nLTAwMDBcIiAqKldoZW4gcmVsYXRpb249cmVmZXJlbmNlKipcbiAqIExpbmsgdGhlIHJlc291cmNlIHRvIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBhcyBhIHJlZmVyZW5jZShsaW5rKS5cbiAqIFRoZSByZXF1ZXN0ZWQgcmVzb3VyY2Ugd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgcmVxdWVzdGVkIHByb2plY3QgYXMgcmVmZXJlbmNlKGxpbmspLlxuICpcbiAqIFRoZSByZXNvdXJjZSAqKk1VU1QqKiBiZSBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byBhdHRhY2ggYXMgYSByZXNvdXJjZSByZWZlcmVuY2UobGluaykuXG4gKiBBIHJlc291cmNlIGlzIHJlZmVyZW5jZWFibGUgaWYgaXQgaGFzIGJlZW4gbWFya2VkIGFzIHJlZmVyZW5jZWFibGUgYW5kIHRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb24gdG8gYWxsIHJlZmVyZW5jZSBlbmFibGVkIGFjdGlvbnNcbiAqIGFnYWluc3QgdGhlIHJlc291cmNlIE9SIFRoZSByZXNvdXJjZSBoYXMgYmVlbiBtYWRlIGxpbmthYmxlIHRvIHRoZSBwcm9qZWN0L3JlYWxtIGZvciB0aGUgcHJvamVjdCBsaW5raW5nIGVuYWJsZWQgYWN0aW9uXG4gKiBUaGUgZXhjbHVzaXZlIGxpc3Qgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIGF0dGFjaCBhcyBhIHJlc291cmNlIHJlZmVyZW5jZShsaW5rKSBpcyBhY2Nlc3NpYmxlIHZpYSBhIGNhbGxcbiAqIHRvIC9yZXNvdXJjZXM/cmVmZXJlbmNlYWJsZT10cnVlIG9yIC9yZXNvdXJjZXM/bGlua2FibGU9dHJ1ZVxuICpcbiAqICogVGhlIGF1dGhvcml6YXRpb24gY29udGV4dCAqKm11c3QqKiBzYXRpc2Z5IG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgaGFzIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VSZXNvdXJjZVJlZmVyZW5jZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gYWRkIGEgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiLFxuICogdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZVJlZmVyZW5jZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgaXMgYSAqKm1lbWJlcioqIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byBhdHRhY2ggdGhlIHJlc291cmNlIGFzIGEgcmVmZXJlbmNlYWJsZSByZXNvdXJjZS5cbiAqIEEgcmVzb3VyY2UgaXMgcmVmZXJlbmNlYWJsZSB0byB0aGUgY2FsbGVyIGlmOlxuICogKiBJdCBoYXMgYmVlbiBtYXJrZWQgYXMgcmVmZXJlbmNlYWJsZSBhbmQgVGhlIGNhbGxlciBoYXMgcGVybWlzc2lvbiB0byBhbGwgcmVmZXJlbmNlIGVuYWJsZWQgYWN0aW9ucyBhZ2FpbnN0IHRoZSByZXNvdXJjZS5cbiAqXG4gKiBPUlxuICpcbiAqICogVGhlIHJlc291cmNlIGhhcyBiZWVuIG1hZGUgbGlua2FibGUgdG8gdGhlIHByb2plY3QvcmVhbG0gZm9yIHRoZSBwcm9qZWN0IGxpbmtpbmcgZW5hYmxlZCBhY3Rpb25cbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBBZGQgYSByZXNvdXJjZSB0byB0aGUgcmVxdWVzdGVkIFByb2plY3QgYXMgYSBSZXNvdXJjZSBIb21lIG9yIFJlc291cmNlIFJlZmVyZW5jZShMaW5rKVxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSByZWxhdGlvbiBUaGUgcmVsYXRpb24gb2YgdGhlIHJlc291cmNlLiBNdXN0IGJlIGhvbWUgb3IgcmVmZXJlbmNlKGxpbmspXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gYWRkUHJvamVjdFJlc291cmNlUmVsYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXMve3Jlc291cmNlfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntyZXNvdXJjZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVsYXRpb25cIiwgcGFyYW1zW1wicmVsYXRpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidHlwZVwiLCBwYXJhbXNbXCJ0eXBlXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5hZGRQcm9qZWN0UmVzb3VyY2VSZWxhdGlvbiA9IGFkZFByb2plY3RSZXNvdXJjZVJlbGF0aW9uO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHByb2plY3QgZXhpc3RzIHdpdGggcmVxdWVzdGVkIHByb2plY3QgaHJuIGluIGNhbGxlciByZWFsbS5cbiAqXG4gKiBJZiBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBzYW1lIHJlYWxtIGl0IHdpbGwgcmV0dXJuIDQwNC5cbiAqXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ2hlY2tzIHRoZSBleGlzdGFuY2Ugb2YgYSBwcm9qZWN0IGluIGNhbGxlciByZWFsbS5cbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUHJvamVjdEV4aXN0YW5jZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9XCIucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkhFQURcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNoZWNrUHJvamVjdEV4aXN0YW5jZSA9IGNoZWNrUHJvamVjdEV4aXN0YW5jZTtcbi8qKlxuICogQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBpbiB0aGUgY2FsbGVycyByZWFsbVxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqY3JlYXRlUHJvamVjdCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGNyZWF0ZSBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwiY3JlYXRlUHJvamVjdFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgUHJvamVjdFxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0c1wiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVQcm9qZWN0ID0gY3JlYXRlUHJvamVjdDtcbi8qKlxuICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgUHJvamVjdFxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBkZWxldGUgYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlIHRoZSBzcGVjaWZpZWQgUHJvamVjdFxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBkZWxldGVQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH1cIi5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVQcm9qZWN0ID0gZGVsZXRlUHJvamVjdDtcbi8qKlxuICogUmVtb3ZlIHRoZSBtZW1iZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZU1lbWJlcnMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVtb3ZlIGEgbWVtYmVyIGZyb20gYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFJlbW92ZSB0aGUgbWVtYmVyIGZyb20gdGhlIHNwZWNpZmllZCBQcm9qZWN0XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IG1lbWJlci4gRWl0aGVyIHVzZXIsIGFwcCBvciBncm91cFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlUHJvamVjdE1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnMve21lbWJlcn1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVQcm9qZWN0TWVtYmVyID0gZGVsZXRlUHJvamVjdE1lbWJlcjtcbi8qKlxuICogUmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBwcm9qZWN0LlxuICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBtYXkgb25seSBiZSBsaW5rZWQgYXMgYSByZWZlcmVuY2UsIHJlbW92aW5nIGEgaG9tZSByZXNvdXJjZSByZXF1aXJlcyBkZWxldGluZyB0aGUgcmVzb3VyY2UgZnJvbSB0aGVcbiAqIHJlc291cmNlIHNlcnZpY2UuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUmVzb3VyY2VSZWZlcmVuY2VzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVtb3ZlIGEgcmVzb3VyY2UgcmVmZXJlbmNlKGxpbmspIGZyb20gdGhlIHByb2plY3RcbiAqIFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVJlc291cmNlUmVmZXJlbmNlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVtb3ZlIGEgUmVzb3VyY2UgUmVmZXJlbmNlKExpbmspIGZyb20gYSBwcm9qZWN0XG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHJlbGF0aW9uIFRoZSByZWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UuIE11c3QgYmUgcmVmZXJlbmNlKGxpbmspXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBkZWxldGVQcm9qZWN0UmVzb3VyY2VSZWZlcmVuY2UoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXMve3Jlc291cmNlfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntyZXNvdXJjZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVsYXRpb25cIiwgcGFyYW1zW1wicmVsYXRpb25cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRlbGV0ZVByb2plY3RSZXNvdXJjZVJlZmVyZW5jZSA9IGRlbGV0ZVByb2plY3RSZXNvdXJjZVJlZmVyZW5jZTtcbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIGFsbCBQcm9qZWN0cyBpbiB0aGUgT3JnXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbGlzdEFsbFByb2plY3RzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGdldCBhIGxpc3Qgb2YgcHJvamVjdHMsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibGlzdEFsbFByb2plY3RzXCJcbiAqXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIGFsbCBQcm9qZWN0cyBpbiB0aGUgT3JnXG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbFByb2plY3RMaXN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0c1wiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEFsbFByb2plY3RMaXN0ID0gZ2V0QWxsUHJvamVjdExpc3Q7XG4vKipcbiAqIEdldCB0aGUgcmVxdWVzdGVkIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGdldCBhIHByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSByZXF1ZXN0ZWQgUHJvamVjdFxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH1cIi5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFByb2plY3QgPSBnZXRQcm9qZWN0O1xuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgUHJvamVjdHMgeW91IGFyZSBhICBwcm9qZWN0IGFkbWluIG9yIGEgbWVtYmVyIGJhc2VkIG9uIHRoZSBcImNhbk1hbmFnZVwiIG9yIFwiaXNNZW1iZXJcIiBwYXJhbWV0ZXIncyB2YWx1ZS5cbiAqXG4gKiBAbm90ZSBJZiBuZWl0aGVyIFwiY2FuTWFuYWdlXCIgbm9yIFwiaXNNZW1iZXJcIiBpcyBzcGVjaWZpZWQsIFwiaXNNZW1iZXI9dHJ1ZVwiIHByb2plY3RzIGFyZSByZXR1cm5lZC5cbiAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIFwiY2FuTWFuYWdlXCIgLyBcImlzTWVtYmVyXCIgaXMgOiBbdHJ1ZV1cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIFByb2plY3RzIHRoYXQgeW91IGFyZSBhIHByb2plY3QgYWRtaW4gb3IgYSBtZW1iZXIgYmFzZWQgb24gdGhlIFwiY2FuTWFuYWdlXCIgb3IgXCJpc01lbWJlclwiIHBhcmFtZXRlcidzIHZhbHVlXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY2FuTWFuYWdlIGlmIHRydWUgcmV0dXJucyBhbGwgcHJvamVjdHMgb2Ygd2hpY2ggdGhlIGNhbGxlcih1c2VyL2FwcCkgaXMgYSBwcm9qZWN0IGFkbWluLlxuICogQHBhcmFtIGlzTWVtYmVyIGlmIHRydWUgcmV0dXJucyBhbGwgcHJvamVjdHMgb2Ygd2hpY2ggdGhlIGNhbGxlcih1c2VyL2FwcCkgaXMgYSBtZW1iZXIuXG4gKi9cbmZ1bmN0aW9uIGdldFByb2plY3RMaXN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy9tZVwiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2FuTWFuYWdlXCIsIGAke3BhcmFtc1tcImNhbk1hbmFnZVwiXX1gKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImlzTWVtYmVyXCIsIGAke3BhcmFtc1tcImlzTWVtYmVyXCJdfWApO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFByb2plY3RMaXN0ID0gZ2V0UHJvamVjdExpc3Q7XG4vKipcbiAqIEdldCB0aGUgcmVxdWVzdGVkIFByb2plY3QgTWVtYmVyXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gZ2V0IGEgbWVtYmVyIG9mIGEgUHJvamVjdCwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHJlcXVlc3RlZCBQcm9qZWN0IE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFByb2plY3RNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRQcm9qZWN0TWVtYmVyID0gZ2V0UHJvamVjdE1lbWJlcjtcbi8qKlxuICogR2V0IHRoZSByZXNvdXJjZSB0aGF0IGlzIGxpbmtlZCB0byB0aGUgcmVxdWVzdGVkIFByb2plY3QuXG4gKlxuICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBtYXkgYmUgbGlua2VkIGFzIGVpdGhlciBhIGhvbWUgb3IgYSByZWZlcmVuY2UobGluaykuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0XG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBnZXQgcmVzb3VyY2UgXCJocm46aGVyZTpkYXRhOjpteXJlYWxtOm15LWNhdGFsb2ctMDAwMFwiIGluIHRoZSBwcm9qZWN0XG4gKiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIiwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgcmVzb3VyY2UgdGhhdCBpcyBsaW5rZWQgdG8gYSBQcm9qZWN0IGFzIGVpdGhlciBhIFJlc291cmNlIEhvbWUgb3IgUmVzb3VyY2UgUmVmZXJlbmNlKExpbmspXG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gcmVsYXRpb24gVGhlIHJlbGF0aW9uIG9mIHRoZSByZXNvdXJjZS4gQSByZXNvdXJjZSBpcyBvbmx5IHJldHVybmVkIGluIHRoZSByZXNwb25zZSBpZiBpdCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgcmVsYXRpb24uXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0UmVzb3VyY2UoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXMve3Jlc291cmNlfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntyZXNvdXJjZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVsYXRpb25cIiwgcGFyYW1zW1wicmVsYXRpb25cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFByb2plY3RSZXNvdXJjZSA9IGdldFByb2plY3RSZXNvdXJjZTtcbi8qKlxuICogUmVtb3ZlIHRoZSBjYWxsZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIEF1dGhvcml6YXRpb24gOiBOb25lXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVtb3ZlIHRoZSBjYWxsZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gbGVhdmVQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy9tZVwiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxlYXZlUHJvamVjdCA9IGxlYXZlUHJvamVjdDtcbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIG1lbWJlcnMgb2YgdGhlIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGdldCBhIGxpc3Qgb2YgcHJvamVjdCBtZW1iZXJzLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICogKiBpZiAnb25seUluY2x1ZGVJZGVudGl0aWVzJyBxdWVyeSBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsICd0b3RhbCcgaXMgTk9UIHJldHVybmVkIGluIFJlc3BvbnNlXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIG1lbWJlcnMgb2YgdGhlIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG9ubHlJbmNsdWRlSWRlbnRpdGllcyBJZiB0cnVlLCByZXR1cm5zIGFuIGVmZmVjdGl2ZSBwcm9qZWN0IG1lbWJlcnMgbGlzdCBjb250YWluaW5nIG9ubHkgdXNlciBhbmQgYXBwIGlkZW50aXRpZXMsXG4gKiBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGUgcHJvamVjdCBpbmRpcmVjdGx5IHZpYSBhIGdyb3VwLlxuICogSXQgd2lsbCBhbHNvIHJldHVybiB1c2VycyB3aG8gYXJlIHByb2plY3QgYWRtaW5zIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCwgYW5kIFJlc291cmNlIE1hbmFnZXJzIGZvciB0aGUgcmVhbG0uXG4gKiBSZXNwb25zZSB3aWxsIE5PVCBpbmNsdWRlIHRvdGFsIG51bWJlciBvZiBpZGVudGl0aWVzLlxuICogSWYgZmFsc2UsIHJldHVybnMgdXNlcnMsIGFwcHMsIGFuZCBncm91cHMgdGhhdCBhcmUgZGlyZWN0IG1lbWJlcnMgb2YgdGhlIHByb2plY3QsIGV4Y2x1ZGluZyBhbnkgdXNlcnMgYW5kIGFwcHMgdGhhdCBvbmx5IGhhdmVcbiAqIG1lbWJlcnNoaXAgdmlhIGEgZ3JvdXAuIERlZmF1bHRzIHRvIGZhbHNlLiAgU3VwcG9zZSB0aGVyZSBhcmUgYSB1c2VyIFUgYW5kIGEgZ3JvdXAgRyB3aXRoIGFwcCBBIGluIGl0LlxuICogU3VwcG9zZSB1c2VyIFUgYW5kIGdyb3VwIEcgYXJlIHRoZSBtZW1iZXJzIG9mIHRoZSBwcm9qZWN0LCB0aGVuICogb25seUluY2x1ZGVJZGVudGl0aWVzOiB0cnVlIHdpbGwgcmV0dXJuIFUgYW5kIEFcbiAqICogb25seUluY2x1ZGVJZGVudGl0aWVzOmZhbHNlIG9yIGFic2VudCB3aWxsIHJldHVybiBVIGFuZCBHXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKi9cbmZ1bmN0aW9uIGxpc3RQcm9qZWN0TWVtYmVycyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnNcIi5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwib25seUluY2x1ZGVJZGVudGl0aWVzXCIsIGAke3BhcmFtc1tcIm9ubHlJbmNsdWRlSWRlbnRpdGllc1wiXX1gKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxpc3RQcm9qZWN0TWVtYmVycyA9IGxpc3RQcm9qZWN0TWVtYmVycztcbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHJlc291cmNlcyBpbiB0aGUgcmVxdWVzdGVkIFByb2plY3QgJiByZWZlcmVuY2VkIGluKGxpbmtlZCB0bykgdGhlIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGdldCB0aGUgbGlzdCBvZiByZXNvdXJjZXMgaW4gdGhlIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaXN0IG9mIHJlc291cmNlcyBpbiB0aGUgcmVxdWVzdGVkIFByb2plY3QgJiByZWZlcmVuY2VkIGluKGxpbmtlZCB0bykgdGhlIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHJlbGF0aW9uIFRoZSByZWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UuIEEgcmVzb3VyY2UgaXMgb25seSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgaWYgaXQgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIHJlbGF0aW9uLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBsaXN0UHJvamVjdFJlc291cmNlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3Jlc291cmNlc1wiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ0eXBlXCIsIHBhcmFtc1tcInR5cGVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVsYXRpb25cIiwgcGFyYW1zW1wicmVsYXRpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMubGlzdFByb2plY3RSZXNvdXJjZXMgPSBsaXN0UHJvamVjdFJlc291cmNlcztcbi8qKlxuICogVXBkYXRlIHRoZSBzcGVjaWZpZWQgUHJvamVjdFxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKndyaXRlKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICogKlxuICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHVwZGF0ZSBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwid3JpdGVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIHBhdGNoUHJvamVjdChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9XCIucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucGF0Y2hQcm9qZWN0ID0gcGF0Y2hQcm9qZWN0O1xuLyoqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXNvdXJjZSBJbmZvIEFuZCBNYW5hZ2VtZW50IEFwaVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEdldCBhIGxpc3Qgb2Ygd2F5cyB0aGlzIHJlc291cmNlIGhhcyBiZWVuIG1hZGUgbGlua2FibGVcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIGFsbCB0aGUgXCJyZXF1aXJlZFRvTWFrZUxpbmthYmxlXCIgYWN0aW9ucyBhZ2FpbnN0XG4gKiB0aGUgc2VydmljZSBpbmZlcnJlZCB2aWEgdGhlIHJlc2VydmVkIHJlc291cmNlIHByZWZpeCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHBhdGggaW4gdGhlIHNjb3BlIG9mIHRoZSAgIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbWFrZSBhIGNhdGFsb2cgbGlua2FibGUsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgYSBsaXN0IG9mIHdheXMgdGhlIHJlc291cmNlIGhhcyBiZWVuIG1hZGUgbGlua2FibGVcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICovXG5mdW5jdGlvbiBnZXRMaXN0T2ZXYXlzUmVzb3VyY2VJc0xpbmthYmxlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfS9saW5rYWJsZVwiLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldExpc3RPZldheXNSZXNvdXJjZUlzTGlua2FibGUgPSBnZXRMaXN0T2ZXYXlzUmVzb3VyY2VJc0xpbmthYmxlO1xuLyoqXG4gKiBHZXQgdGhlIFJlc291cmNlIHRoYXQgdGhlIGNhbGxlciBpcyBhbGxvd2VkIHRvIHNlZSBiYXNlZCBvbiB0aGUgaW5wdXQgcXVlcnkgcGFyYW1ldGVyc1xuICpcbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgc2luZ2xlIHJlc291cmNlXG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHJlZmVyZW5jZWFibGUgR2V0IHRoZSByZXNvdXJjZSBvbmx5IGlmIGl0IGlzIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIGF0dGFjaCBhcyBhIHJlZmVyZW5jZSB0byBwcm9qZWN0cy5cbiAqIEEgcmVzb3VyY2UgaXMgcmVmZXJlbmNlYWJsZSBpZiBpdCBpcyBtYXJrZWQgYXMgcmVmZXJlbmNlYWJsZSBhbmQgdGhlIGNhbGxlciBoYXMgcGVybWlzc2lvbiB0byBhbGwgcmVmZXJlbmNlIGVuYWJsZWQgYWN0aW9uc1xuICogYWdhaW5zdCB0aGUgcmVzb3VyY2UuICBPdGhlcndpc2UgNDA0LiAgT25seSBzdXBwb3J0ZWQgdmFsdWUgaXMgdHJ1ZS5cbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBnZXRSZXNvdXJjZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tyZXNvdXJjZX1cIi5yZXBsYWNlKFwie3Jlc291cmNlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZlcmVuY2VhYmxlXCIsIGAke3BhcmFtc1tcInJlZmVyZW5jZWFibGVcIl19YCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0UmVzb3VyY2UgPSBnZXRSZXNvdXJjZTtcbi8qKlxuICogR2V0IHRoZSBhdmFpbGFiaWxpdHkgZm9yIGxpbmtpbmcgdGhpcyByZXNvdXJjZSB0byBlaXRoZXIgYSBwcm9qZWN0IG9yIHJlYWxtLlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgYWxsIHRoZSBcInJlcXVpcmVkVG9NYWtlTGlua2FibGVcIiBhY3Rpb25zIGFnYWluc3RcbiAqIHRoZSBzZXJ2aWNlIGluZmVycmVkIHZpYSB0aGUgcmVzZXJ2ZWQgcmVzb3VyY2UgcHJlZml4IG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgcGF0aCBpbiB0aGUgc2NvcGUgb2YgdGhlICAgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGdldCB0aGUgY2F0YWxvZyBsaW5rYWJpbGl0eSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6b2xwLWhlcmU6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBzY29wZWQgdG8gdGhlIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBsaW5rYWJpbGl0eSBvZiBhIHJlc291cmNlXG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIGF2YWlsYWJsZVRvSHJuIFRoZSBocm4gb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbWFkZSBsaW5rYWJsZSBhZ2FpbnN0IG9yXG4gKiBUaGUgaHJuIG9mIHRoZSByZWFsbSB0aGF0IHRoZSByZXNvdXJjZSBpcyBtYWRlIGxpbmthYmxlIGFnYWluc3QuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzb3VyY2VMaW5rYWJpbGl0eShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tyZXNvdXJjZX0vbGlua2FibGUve2F2YWlsYWJsZVRvSHJufVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntyZXNvdXJjZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2F2YWlsYWJsZVRvSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXZhaWxhYmxlVG9Icm5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0UmVzb3VyY2VMaW5rYWJpbGl0eSA9IGdldFJlc291cmNlTGlua2FiaWxpdHk7XG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBQcm9qZWN0cyB0aGF0IHRoZSByZXNvdXJjZSBiZWxvbmdzIHRvIG9yIGlzIHJlZmVyZW5jZWQgaW4obGlua2VkIHRvKS5cbiAqIFRoZSByZXR1cm5lZCBsaXN0IHdpbGwgb25seSBpbmNsdWRlIHByb2plY3RzIHRoYXQgYXJlIGluIHRoZSBjYWxsZXIncyByZWFsbS5cbiAqXG4gKiBAbm90ZVxuICogSWYgdGhlIHByZXNlbnRlZCBhY2Nlc3MgdG9rZW4gaGFzIGEgcHJvamVjdCBzY29wZSwgdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZTpcbiAqIC0gVGhlIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2VcbiAqIC0gVGhlIGxpc3Qgb2YgUHJvamVjdHMgdGhhdCB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gbWFkZSBsaW5rYWJsZSB0b1xuICogLSBUaGUgaW5jbHVkZSB0aGUgbGlzdCBvZiBQcm9qZWN0cyB0aGF0IHRoZSByZXNvdXJjZSBoYXMgYmVlbiBsaW5rZWQgdG9cbiAqXG4gKiBJZiB0aGUgcHJlc2VudGVkIGFjY2VzcyB0b2tlbiBoYXMgbm8gc2NvcGUsIHRoZSByZXNwb25zZSB3aWxsIGluY2x1ZGU6XG4gKiAtIFRoZSBsaXN0IG9mIFByb2plY3RzIGZpbHRlcmVkIG91dCBiYXNlZCBvbiB0aGUgbWVtYmVyc2hpcCBvZiB0aGUgY2FsbGVyLlxuICpcbiAqIEFjY2VzcyBDb250cm9sIGZvciBwcm9qZWN0IHNjb3BlZCBjYWxsOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgYWxsIHRoZSBcInJlcXVpcmVkVG9NYWtlTGlua2FibGVcIiBhY3Rpb25zIGFnYWluc3RcbiAqIHRoZSBzZXJ2aWNlIGluZmVycmVkIHZpYSB0aGUgcmVzZXJ2ZWQgcmVzb3VyY2UgcHJlZml4IG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgcGF0aCBpbiB0aGUgc2NvcGUgb2YgdGhlICAgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIG1ha2UgYSBjYXRhbG9nIGxpbmthYmxlLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVJlc291cmNlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjpvbHAtaGVyZTpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSByZXF1ZXN0ZWQgUHJvamVjdHMgdGhhdCB0aGUgcmVzb3VyY2UgYmVsb25ncyB0byBvciBpcyByZWZlcmVuY2VkIGluKGxpbmtlZCB0bylcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSByZWxhdGlvbiBUaGUgcmVsYXRpb24gb2YgdGhlIHJlc291cmNlLiBBIHJlc291cmNlIGlzIG9ubHkgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGlmIGl0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCByZWxhdGlvbi5cbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBnZXRSZXNvdXJjZVByb2plY3RzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfS9wcm9qZWN0c1wiLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVsYXRpb25cIiwgcGFyYW1zW1wicmVsYXRpb25cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlc291cmNlUHJvamVjdHMgPSBnZXRSZXNvdXJjZVByb2plY3RzO1xuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIFJlc291cmNlcyB0aGF0IHRoZSBjYWxsZXIgaXMgYWxsb3dlZCB0byBzZWUgYmFzZWQgb24gdGhlIGlucHV0IHF1ZXJ5IHBhcmFtZXRlcnMuXG4gKlxuICogQG5vdGVcbiAqIElmIHRoZSBwcmVzZW50ZWQgYWNjZXNzIHRva2VuIGhhcyBhIHByb2plY3Qgc2NvcGU6XG4gKiAtIFRoZSByZXNwb25zZSB3aWxsIG9ubHkgaW5jbHVkZSByZXNvdXJjZXMgZnJvbSB0aGF0IHByb2plY3Qgb3IsXG4gKiAtIElmIHJlZmVyZW5jZWFibGU9dHJ1ZSBvciBsaW5rYWJsZT10cnVlLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlIHRoZSByZXNvdXJjZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIgdG9cbiAqIGxpbmsgdG8gdGhlIHByb2plY3QgaW4gdGhlIHRva2VuJ3MgcHJvamVjdCBzY29wZS5cbiAqXG4gKiAtIElmIHRoZSBwcmVzZW50ZWQgYWNjZXNzIHRva2VuIGhhcyBubyBzY29wZTpcbiAqIC0gVGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSByZXNvdXJjZXMgZnJvbSBhbGwgcHJvamVjdHMgdGhhdCB0aGUgY2FsbGVyIGhhcyBhY2Nlc3MgdG8uXG4gKiAtIEZvciB0eXBlPSdjYXRhbG9nJyB0aGUgcmVzcG9uc2Ugd2lsbCBhbHNvIGluY2x1ZGUgcmVzb3VyY2VzIHRoYXQgZXhpc3Qgb3V0c2lkZSBvZiBhbnkgcHJvamVjdC5cbiAqIC0gRm9yIGFsbCBvdGhlciB0eXBlcywgdGhlIHJlc3BvbnNlIHdpbGwgTk9UIGluY2x1ZGUgcmVzb3VyY2VzIHRoYXQgZXhpc3Qgb3V0c2lkZSBvZiBhbnkgcHJvamVjdC5cbiAqIC0gRm9yIHJlZmVyZW5jZWFibGU9dHJ1ZSBvciBsaW5rYWJsZT10cnVlLCB0aGUgcmVzcG9uc2Ugd2lsbCBPTkxZIGluY2x1ZGUgdGhlIEhFUkUgcHVibGljIHJlc291cmNlcyB0aGF0IGFyZSBhdmFpbGFibGVcbiAqIHRvIHRoZSBjYWxsZXIgdG8gbGluayB0byBBTlkgcHJvamVjdCAqIFRoaXMgQVBJIHdvcmtzIHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCBhbmQgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgbGlzdCBvZiByZXNvdXJjZXNcbiAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGFjY2VzcyBGaWx0ZXIgdGhlIHJlc291cmNlcyBhY2Nlc3NpYmxlIHRvIHRoZSBjYWxsZXIgYmFzZWQgb24gdGhlIGFjY2VzcyB0eXBlcy5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFwiZGVmYXVsdFwiLlxuICogTm90IGFwcGxpY2FibGUgdG8gdXNlIGFsb25nIHdpdGggdGhlIHF1ZXJ5IHBhcmFtZXRlciBcInJlZmVyZW5jZWFibGVcIjogXCJ0cnVlXCIgb3IgXCJsaW5rYWJsZVwiOiBcInRydWVcIlxuICogSWYgXCJkZWZhdWx0XCIgaW5jbHVkZXMgcmVzb3VyY2VzIHdoZXJlOlxuICogLSBUaGUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSByZXNvdXJjZVwicyBob21lIHByb2plY3QgT1JcbiAqIC0gVGhlIHVzZXIgaGFzIGFjY2VzcyB0byBhIHByb2plY3QgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbGlua2VkIHRvIGFzIGEgcmVmZXJlbmNlIE9SXG4gKiAtIFRoZSB0eXBlXCI6IFwiXCJjYXRhbG9nXCIgYW5kIHRoZSByZXNvdXJjZSBpcyBub3QgaW4gYW55IHByb2plY3QgYW5kIHRoZSB1c2VyIGhhcyBcInJlYWRcIiBhY2Nlc3MgdG8gaXQgT1JcbiAqIC0gVGhlIHR5cGVcIjogXCJcImNhdGFsb2dcIiBhbmQgdGhlIHJlc291cmNlIGlzIG5vdCBpbiBhbnkgcHJvamVjdCBhbmQgdGhlIHVzZXIgaGFzIFwid3JpdGVcIiBhY2Nlc3MgdG8gaXQgT1JcbiAqIC0gVGhlIHR5cGVcIjogXCJcImNhdGFsb2dcIiBhbmQgdGhlIHJlc291cmNlIGlzIG5vdCBpbiBhbnkgcHJvamVjdCBhbmQgdGhlIHVzZXIgaGFzIFwibWFuYWdlXCIgYWNjZXNzIHRvIGl0LlxuICpcbiAqIElmIFwibWFuYWdlXCIgaW5jbHVkZXMgcmVzb3VyY2VzIHdoZXJlOlxuICogLSBUaGUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSByZXNvdXJjZVwicyBob21lIHByb2plY3QgT1JcbiAqIC0gVGhlIHR5cGVcIjogXCJcImNhdGFsb2dcIiBhbmQgdGhlIHJlc291cmNlIGlzIG5vdCBpbiBhbnkgcHJvamVjdCBhbmQgdGhlIHVzZXIgaGFzIFwibWFuYWdlXCIgYWNjZXNzIHRvIGl0LlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VhYmxlIEdldCBhbGwgcmVmZXJlbmNlYWJsZShsaW5rYWJsZSkgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIGF0dGFjaCBhcyBhIHJlZmVyZW5jZShsaW5rKSB0byBwcm9qZWN0cy5cbiAqIE9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIHRydWUuIE5vdGUgLSBDYW4gYmUgdXNlZCBhcyBhIHN5bm9ueW0gZm9yIGxpbmthYmxlICBBIHJlc291cmNlIGlzIHJlZmVyZW5jZWFibGUobGlua2FibGUpIGlmIGl0IGlzIG1hcmtlZFxuICogYXMgcmVmZXJlbmNlYWJsZTpcbiAqIC0gYW5kIHRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb24gdG8gYWxsIHJlZmVyZW5jZSBlbmFibGVkIGFjdGlvbnMgYWdhaW5zdCB0aGUgcmVzb3VyY2Ugb3IsXG4gKiAtIGluIGNhc2Ugb2YgYSBwcm9qZWN0IHNjb3BlZCB0b2tlbiwgdGhlIGNhbGxlciBoYXMgZWZmZWN0aXZlIG1lbWJlcnNoaXAgb24gdGhlIHByb2plY3RzIHRvIGF0dGFjaCByZXNvdXJjZXNcbiAqIGFzIGEgcmVmZXJlbmNlKGxpbmspIHRvIHRoZSBQcm9qZWN0LlxuICpcbiAqIEBwYXJhbSBsaW5rYWJsZSBHZXQgYWxsIGxpbmthYmxlIHJlc291cmNlcyBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byBhdHRhY2ggYXMgYSBsaW5rIHRvIHByb2plY3QuXG4gKiBPbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyB0cnVlLiBOb3RlIC0gQ2FuIGJlIHVzZWQgYXMgYSBzeW5vbnltIGZvciByZWZlcmVuY2VhYmxlXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzb3VyY2VzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInR5cGVcIiwgcGFyYW1zW1widHlwZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJhY2Nlc3NcIiwgcGFyYW1zW1wiYWNjZXNzXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlZmVyZW5jZWFibGVcIiwgYCR7cGFyYW1zW1wicmVmZXJlbmNlYWJsZVwiXX1gKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbmthYmxlXCIsIGAke3BhcmFtc1tcImxpbmthYmxlXCJdfWApO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlc291cmNlcyA9IGdldFJlc291cmNlcztcbi8qKlxuICogR2V0IExpc3Qgb2YgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIHJlYWxtIG9mIHRoZSBjYWxsZXJcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipsaXN0UmVhbG1SZXNvdXJjZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZ2V0IGEgbGlzdCBvZiBwcm9qZWN0cywgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0UmVhbG1SZXNvdXJjZXNcIlxuICpcbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgTGlzdCBvZiBhbGwgdGhlIHJlc291cmNlcyBpbiB0aGUgcmVhbG0gb2YgdGhlIGNhbGxlclxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gbGlzdFJlYWxtUmVzb3VyY2VzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZWFsbS9yZXNvdXJjZXNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInR5cGVcIiwgcGFyYW1zW1widHlwZVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMubGlzdFJlYWxtUmVzb3VyY2VzID0gbGlzdFJlYWxtUmVzb3VyY2VzO1xuLyoqXG4gKiBBZGRzIGEgbGlzdGluZyB0byBtYWtlIHRoaXMgcmVzb3VyY2UgbGlua2FibGUgdG8gZWl0aGVyIGEgcHJvamVjdCBvciBlbnRpcmUgcmVhbG0uXG4gKlxuICogVGhlIHJlc291cmNlIG11c3QgYmVsb25nIHRvIGEgcHJvamVjdCB0byBiZSBtYWRlIGxpbmthYmxlLiBFaXRoZXIgcHJvamVjdEhybiBvciByZWFsbUhybiBtdXN0IGJlIHByb3ZpZGVkIHRvIG1ha2UgdGhlIHJlc291cmNlXG4gKiBsaW5rYWJsZSB0by5cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIGFsbCB0aGUgXCJyZXF1aXJlZFRvTWFrZUxpbmthYmxlXCIgYWN0aW9ucyBhZ2FpbnN0XG4gKiB0aGUgc2VydmljZSBpbmZlcnJlZCB2aWEgdGhlIHJlc2VydmVkIHJlc291cmNlIHByZWZpeCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHBhdGggaW4gdGhlIHNjb3BlIG9mIHRoZSAgIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbWFrZSBhIGNhdGFsb2cgbGlua2FibGUsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBNYWtlIGEgcmVzb3VyY2UgTGlua2FibGVcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VSZXNvdXJjZUxpbmthYmxlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfS9saW5rYWJsZVwiLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5tYWtlUmVzb3VyY2VMaW5rYWJsZSA9IG1ha2VSZXNvdXJjZUxpbmthYmxlO1xuLyoqXG4gKiBSZW1vdmUgdGhlIGxpbmthYmlsaXR5IG9mIHRoaXMgcmVzb3VyY2UgYWdhaW5zdCB0aGUgcmVxdWVzdGVkIHByb2plY3Qgb3IgcmVhbG0uXG4gKlxuICogQG5vdGUgVGhpcyBhY3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgaW1wYWN0IG9uIHByZS1leGlzdGluZyBsaW5rcy5cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIGFsbCB0aGUgXCJyZXF1aXJlZFRvTWFrZUxpbmthYmxlXCIgYWN0aW9ucyBhZ2FpbnN0XG4gKiB0aGUgc2VydmljZSBpbmZlcnJlZCB2aWEgdGhlIHJlc2VydmVkIHJlc291cmNlIHByZWZpeCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHBhdGggaW4gdGhlIHNjb3BlIG9mIHRoZSAgIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIHJlbW92ZSB0aGUgY2F0YWxvZyBsaW5rYWJpbGl0eSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6b2xwLWhlcmU6bXktc2hhcmVkLWNhdGFsb2dcIlxuICpcbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgc2NvcGVkIHRvIHRoZSBob21lIHByb2plY3Qgb2YgdGhlIHJlc291cmNlLlxuICpcbiAqIEBzdW1tYXJ5IFJlbW92ZSB0aGUgbGlua2FiaWxpdHkgb2YgYSByZXNvdXJjZVxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSBhdmFpbGFibGVUb0hybiBUaGUgaHJuIG9mIHRoZSBwcm9qZWN0IHRoYXQgdGhlIHJlc291cmNlIGlzIG1hZGUgbGlua2FibGUgYWdhaW5zdCBvciBUaGUgaHJuIG9mIHRoZSByZWFsbSB0aGF0IHRoZSByZXNvdXJjZVxuICogaXMgbWFkZSBsaW5rYWJsZSBhZ2FpbnN0LlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVJlc291cmNlTGlua2FiaWxpdHkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Jlc291cmNlcy97cmVzb3VyY2V9L2xpbmthYmxlL3thdmFpbGFibGVUb0hybn1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInthdmFpbGFibGVUb0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImF2YWlsYWJsZVRvSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZW1vdmVSZXNvdXJjZUxpbmthYmlsaXR5ID0gcmVtb3ZlUmVzb3VyY2VMaW5rYWJpbGl0eTtcbi8qKlxuICogVXBkYXRlIHRoZSBsaW5rYWJpbGl0eSBvZiB0aGlzIHJlc291cmNlIGFnYWluc3QgdGhlIHJlcXVlc3RlZCBwcm9qZWN0IG9yIHJlYWxtLlxuICpcbiAqIEFjY2VzcyBDb250cm9sOiAgKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgYWxsIHRoZSBcInJlcXVpcmVkVG9NYWtlTGlua2FibGVcIiBhY3Rpb25zIGFnYWluc3RcbiAqIHRoZSBzZXJ2aWNlIGluZmVycmVkIHZpYSB0aGUgcmVzZXJ2ZWQgcmVzb3VyY2UgcHJlZml4IG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgcGF0aCBpbiB0aGUgc2NvcGUgb2YgdGhlICAgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byB1cGRhdGUgdGhlIGNhdGFsb2cgbGlua2FiaWxpdHksIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGxpbmthYmlsaXR5IG9mIGEgcmVzb3VyY2VcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIGF2YWlsYWJsZVRvSHJuIFRoZSBocm4gb2YgdGhlIHByb2plY3QgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbWFkZSBsaW5rYWJsZSBhZ2FpbnN0IG9yIFRoZSBocm4gb2YgdGhlIHJlYWxtIHRoYXQgdGhlIHJlc291cmNlXG4gKiBpcyBtYWRlIGxpbmthYmxlIGFnYWluc3QuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlUmVzb3VyY2VMaW5rYWJpbGl0eShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tyZXNvdXJjZX0vbGlua2FibGUve2F2YWlsYWJsZVRvSHJufVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntyZXNvdXJjZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2F2YWlsYWJsZVRvSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYXZhaWxhYmxlVG9Icm5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy51cGRhdGVSZXNvdXJjZUxpbmthYmlsaXR5ID0gdXBkYXRlUmVzb3VyY2VMaW5rYWJpbGl0eTtcbi8qKlxuICogQXR0YWNoZXMgdGhlIFByb2plY3QgUG9saWN5IHRvIHRoZSBtZW1iZXIgb2YgdGhlIFByb2plY3QuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlTWVtYmVycyoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBhdHRhY2ggYSBjdXN0b20gcG9saWN5IGluIGEgUHJvamVjdCB0byBhIG1lbWJlciwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9ucyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiBBTkRcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUG9saWNpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBBZG1pbnMgYW5kIFJlc291cmNlIE1hbmFnZXJzXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQXR0YWNoIFByb2plY3QgUG9saWN5IHRvIE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuZnVuY3Rpb24gYXR0YWNoUHJvamVjdFBvbGljeVRvTWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfS9wb2xpY2llcy97cG9saWN5fVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuYXR0YWNoUHJvamVjdFBvbGljeVRvTWVtYmVyID0gYXR0YWNoUHJvamVjdFBvbGljeVRvTWVtYmVyO1xuLyoqXG4gKiBDcmVhdGUgdGhlIHJlcXVlc3RlZCBjdXN0b20gcG9saWN5IGluIHRoZSBQcm9qZWN0XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUG9saWNpZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gY3JlYXRlIGEgY3VzdG9tIHBvbGljeSBpbiBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUG9saWNpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBBZG1pbnMgYW5kIFJlc291cmNlIE1hbmFnZXJzXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBQb2xpY3lcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqL1xuZnVuY3Rpb24gY3JlYXRlUHJvamVjdFBvbGljeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3BvbGljaWVzXCIucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVQcm9qZWN0UG9saWN5ID0gY3JlYXRlUHJvamVjdFBvbGljeTtcbi8qKlxuICogRGVsZXRlIHRoZSBjdXN0b20gcG9saWN5IGluIHRoZSBQcm9qZWN0XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUG9saWNpZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gdXBkYXRlIGEgY3VzdG9tIHBvbGljeSBpbiBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUG9saWNpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBBZG1pbnMgYW5kIFJlc291cmNlIE1hbmFnZXJzXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlIHRoZSBjdXN0b20gUHJvamVjdCBQb2xpY3lcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHBvbGljeSBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgcG9saWN5LiBGb3IgSEVSRSBwcm92aWRlZCBwb2xpY2llcyxcbiAqIHRoZSBIUk4gZm9ybWF0IHdvdWxkIGJlIC0gaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpkZWZhdWx0OnBvbGljeS9yZWFkLW9ubHktYWNjZXNzLXRvLWFsbC1jYXRhbG9nc1xuICovXG5mdW5jdGlvbiBkZWxldGVQcm9qZWN0UG9saWN5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vcG9saWNpZXMve3BvbGljeX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVQcm9qZWN0UG9saWN5ID0gZGVsZXRlUHJvamVjdFBvbGljeTtcbi8qKlxuICogRGV0YWNoZWQgdGhlIHJlcXVlc3RlZCBjdXN0b20gUHJvamVjdCBQb2xpY3kgZnJvbSBhIE1lbWJiZXJcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGRldGFjaCBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0IGZyb20gYSBtZW1iZXIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnMgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogQU5EXG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IERldGFjaCB0aGUgUHJvamVjdCBQb2xpY3kgZnJvbSBhIE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuZnVuY3Rpb24gZGV0YWNoUHJvamVjdFBvbGljeUZyb21NZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntwb2xpY3l9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwb2xpY3lcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRldGFjaFByb2plY3RQb2xpY3lGcm9tTWVtYmVyID0gZGV0YWNoUHJvamVjdFBvbGljeUZyb21NZW1iZXI7XG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBhbGwgUHJvamVjdCBNZW1iZXJzIHdpdGggdGhlIGF0dGFjaGVkIFBvbGljeVxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVhZCB0aGUgbGlzdCBvZiBhbGwgbWVtYmVycyBhdHRhY2hlZCB0byBhIHByb2plY3QgcG9saWN5LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBNZW1iZXJzLCBQcm9qZWN0IEFkbWlucywgT3JnIEFkbWluc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbGlzdCBvZiBhbGwgUHJvamVjdCBNZW1iZXJzIHdpdGggdGhlIGF0dGFjaGVkIFBvbGljeVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gcG9saWN5IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBwb2xpY3kuIEZvciBIRVJFIHByb3ZpZGVkIHBvbGljaWVzLFxuICogdGhlIEhSTiBmb3JtYXQgd291bGQgYmUgLSBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmRlZmF1bHQ6cG9saWN5L3JlYWQtb25seS1hY2Nlc3MtdG8tYWxsLWNhdGFsb2dzXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsXG4gKiBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICovXG5mdW5jdGlvbiBnZXRBbGxQcm9qZWN0TWVtYmVyc1dpdGhBdHRhY2hlZFBvbGljeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3BvbGljaWVzL3twb2xpY3l9L21lbWJlcnNcIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0QWxsUHJvamVjdE1lbWJlcnNXaXRoQXR0YWNoZWRQb2xpY3kgPSBnZXRBbGxQcm9qZWN0TWVtYmVyc1dpdGhBdHRhY2hlZFBvbGljeTtcbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIEF0dGFjaGVkIFByb2plY3QgUG9saWNpZXMgRm9yIGEgTWVtYmVyXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byByZWFkIHRoZSBsaXN0IG9mIHRoZSBhdHRhY2hlZCBwcm9qZWN0IHBvbGljaWVzLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBNZW1iZXJzLCBQcm9qZWN0IEFkbWlucywgT3JnIEFkbWluc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbGlzdCBvZiBBdHRhY2hlZCBQcm9qZWN0IFBvbGljaWVzIEZvciBhIE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICovXG5mdW5jdGlvbiBnZXRBdHRhY2hlZFByb2plY3RQb2xpY2llc0Zvck1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnMve21lbWJlcn0vcG9saWNpZXNcIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWNpZXNGb3JNZW1iZXIgPSBnZXRBdHRhY2hlZFByb2plY3RQb2xpY2llc0Zvck1lbWJlcjtcbi8qKlxuICogR2V0IHRoZSBhdHRhY2hlZCBQcm9qZWN0IFBvbGljeSBGb3IgYSBNZW1iZXJcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlYWQgdGhlIGF0dGFjaGVkIHByb2plY3QgcG9saWN5LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBNZW1iZXJzLCBQcm9qZWN0IEFkbWlucywgT3JnIEFkbWluc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgYXR0YWNoZWQgUHJvamVjdCBQb2xpY3kgZm9yIGEgTWVtYmVyXG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IG1lbWJlci4gRWl0aGVyIHVzZXIsIGFwcCBvciBncm91cFxuICogQHBhcmFtIHBvbGljeSBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgcG9saWN5LiBGb3IgSEVSRSBwcm92aWRlZCBwb2xpY2llcyxcbiAqIHRoZSBIUk4gZm9ybWF0IHdvdWxkIGJlIC0gaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpkZWZhdWx0OnBvbGljeS9yZWFkLW9ubHktYWNjZXNzLXRvLWFsbC1jYXRhbG9nc1xuICovXG5mdW5jdGlvbiBnZXRBdHRhY2hlZFByb2plY3RQb2xpY3lGb3JNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntwb2xpY3l9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwb2xpY3lcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWN5Rm9yTWVtYmVyID0gZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWN5Rm9yTWVtYmVyO1xuLyoqXG4gKiBHZXQgdGhlIHJlcXVlc3RlZCBQcm9qZWN0IFBvbGljeVxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVhZCBhIHByb2plY3QgcG9saWN5LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgTWVtYmVycywgUHJvamVjdCBBZG1pbnMsIE9yZyBBZG1pbnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdFBvbGljeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3BvbGljeX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInBvbGljeVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRQcm9qZWN0UG9saWN5ID0gZ2V0UHJvamVjdFBvbGljeTtcbi8qKlxuICogTGlzdCB0aGUgUG9saWNpZXMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gbWVtYmVycyBvZiB0aGUgUHJvamVjdC5cbiAqIFRoaXMgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIHRoZSBIRVJFIHByb3ZpZGVkIHBvbGljaWVzIGFuZCBhbnkgY3VzdG9tIHVzZXIgZGVmaW5lZCBwb2xpY2llcyBjcmVhdGVkIGluIHRoZSBQcm9qZWN0LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVhZCBhIHBvbGljeSBsaXN0IG9mIGEgUHJvamVjdCwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgTWVtYmVycywgUHJvamVjdCBBZG1pbnMsIE9yZyBBZG1pbnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBMaXN0IHRoZSBQb2xpY2llcyBpbiBhIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LFxuICogaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKiBAcGFyYW0gcHJvamVjdFBvbGljeVR5cGUgVGhlIHR5cGUgb2YgdGhlIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdFBvbGljeUxpc3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llc1wiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwcm9qZWN0UG9saWN5VHlwZVwiLCBwYXJhbXNbXCJwcm9qZWN0UG9saWN5VHlwZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRQcm9qZWN0UG9saWN5TGlzdCA9IGdldFByb2plY3RQb2xpY3lMaXN0O1xuLyoqXG4gKiBTZXRzIHRoZSBBdHRhY2hlZCBQb2xpY2llcyBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIFByb2plY3QgTWVtYmVyLCBvdmVyd3JpdGluZyBhbnkgcHJlLWV4aXN0aW5nIEF0dGFjaGVkIFBvbGljaWVzLlxuICogVGhlIHJlcXVlc3QgYm9keSB3aWxsIHJlcGxhY2UgYW55IHByZS1leGlzdGluZyBQb2xpY3kgYXR0YWNobWVudChzKSwgYW5kIHJlcGxhY2UgdGhhdCBsaXN0IHdpdGggdGhvc2UgUG9saWNpZXNcbiAqIGlkZW50aWZpZWQgaW4gdGhlIHJlcXVlc3QgYm9keS5cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGF0dGFjaCBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0IHRvIGEgbWVtYmVyLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb25zIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCIgICAgICBBTkQgICAgICAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFNldCBBdHRhY2hlZCBQb2xpY2llcyBmb3IgTWVtYmVyXG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqL1xuZnVuY3Rpb24gc2V0QXR0YWNoZWRQcm9qZWN0UG9saWNpZXNUb01lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnMve21lbWJlcn0vcG9saWNpZXNcIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnNldEF0dGFjaGVkUHJvamVjdFBvbGljaWVzVG9NZW1iZXIgPSBzZXRBdHRhY2hlZFByb2plY3RQb2xpY2llc1RvTWVtYmVyO1xuLyoqXG4gKiBVcGRhdGUgdGhlIHJlcXVlc3RlZCBjdXN0b20gcG9saWN5IGluIHRoZSBQcm9qZWN0XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUG9saWNpZXMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gdXBkYXRlIGEgY3VzdG9tIHBvbGljeSBpbiBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUG9saWNpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBJbiB0aGUgUHJvamVjdCB3b3JrZmxvdywgdGhlIGFib3ZlIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbGwgUHJvamVjdCBBZG1pbnMgYW5kIFJlc291cmNlIE1hbmFnZXJzXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgVXBkYXRlIHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBQb2xpY3lcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuZnVuY3Rpb24gdXBkYXRlUHJvamVjdFBvbGljeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3BvbGljeX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInBvbGljeVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnVwZGF0ZVByb2plY3RQb2xpY3kgPSB1cGRhdGVQcm9qZWN0UG9saWN5O1xuLyoqXG4gKiBHZXRzIHRoZSBhY3Rpb25zIGxpc3QgZm9yIHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgYmFzZWQgb24gdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gKlxuICogVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGFjdGlvbnMgYXJlIGZpbHRlcmVkIGJhc2VkIG9uIHRoZSByZWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UsIGVpdGhlciBob21lIG9yIHJlZmVyZW5jZSB3aXRoIHRoZSBhbGxvd2VkIGFjdGlvbnMuXG4gKiBUaGlzIEFQSSBwcm92aWRlcyBhIGxpc3Qgb2YgYXZhaWxhYmxlIGFjdGlvbnMgZHVyaW5nIHByb2plY3Qgd29ya2Zsb3dzIGxpa2UgbGlua2luZyBvciBwcm9qZWN0IHBvbGljeSBjcmVhdGlvbi5cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3RcbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBnZXQgcmVzb3VyY2UgXCJocm46aGVyZTpkYXRhOjpteXJlYWxtOm15LWNhdGFsb2ctMDAwMFwiIGluIHRoZSBwcm9qZWN0XG4gKiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIiwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgYSBsaXN0IG9mIGFjdGlvbnMgdGhhdCBhcmUgYWxsb3dlZCBmb3IgdGhlIHByb2plY3QgcmVzb3VyY2VcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIGFjdGlvbiBmb3IgdGhlIHJlc291cmNlIHR5cGUuXG4gKiAtIGxpbmthYmxlIDogQWN0aW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIGxpbmtlZFxuICogLSBwcm9qZWN0RW5hYmxlZCA6IEFjdGlvbnMgdGhhdCBhcmUgZW5hYmxlZCBmb3IgUHJvamVjdHMgYWNjZXNzXG4gKiAtIHJlcXVpcmVkVG9NYWtlTGlua2FibGUgOiBBY3Rpb25zIHRoYXQgYXJlIHJlcXVpcmVkIHdoZW4gYW4gaWRlbnRpdHkgaXMgbWFraW5nIGEgcmVzb3VyY2UgbGlua2FibGUgdG8gYSByZWFsbSBvciBvdGhlciBwcm9qZWN0c1xuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFJlc291cmNlQWN0aW9uc0ZvclByb2plY3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXMve3Jlc291cmNlfS9hY3Rpb25zXCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ0eXBlXCIsIHBhcmFtc1tcInR5cGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlc291cmNlQWN0aW9uc0ZvclByb2plY3QgPSBnZXRSZXNvdXJjZUFjdGlvbnNGb3JQcm9qZWN0O1xuLyoqXG4gKiBHZXRzIHRoZSBhY3Rpb25zIGxpc3QgZm9yIHRoZSByZXNvdXJjZSB0eXBlIGJhc2VkIG9uIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLlxuICpcbiAqIEBzdW1tYXJ5IEdldCBhIGxpc3Qgb2YgYWN0aW9ucyBmb3IgdGhlIHJlc291cmNlIHR5cGVcbiAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgYWN0aW9uIGZvciB0aGUgcmVzb3VyY2UgdHlwZS5cbiAqIC0gbGlua2FibGUgOiBBY3Rpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgbGlua2VkXG4gKiAtIHByb2plY3RFbmFibGVkIDogQWN0aW9ucyB0aGF0IGFyZSBlbmFibGVkIGZvciBQcm9qZWN0cyBhY2Nlc3NcbiAqIC0gcmVxdWlyZWRUb01ha2VMaW5rYWJsZSA6IEFjdGlvbnMgdGhhdCBhcmUgcmVxdWlyZWQgd2hlbiBhbiBpZGVudGl0eSBpcyBtYWtpbmcgYSByZXNvdXJjZSBsaW5rYWJsZSB0byBhIHJlYWxtIG9yIG90aGVyIHByb2plY3RzXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzb3VyY2VUeXBlQWN0aW9uTGlzdChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VUeXBlcy97cmVzb3VyY2VUeXBlfS9hY3Rpb25zXCIucmVwbGFjZShcIntyZXNvdXJjZVR5cGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVR5cGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ0eXBlXCIsIHBhcmFtc1tcInR5cGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlc291cmNlVHlwZUFjdGlvbkxpc3QgPSBnZXRSZXNvdXJjZVR5cGVBY3Rpb25MaXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRvVXBsb2FkUGFydCA9IGV4cG9ydHMuZG9Db21wbGV0ZU11bHRpcGFydFVwbG9hZCA9IGV4cG9ydHMuc3RhcnRNdWx0aXBhcnRVcGxvYWQgPSBleHBvcnRzLnB1dERhdGEgPSBleHBvcnRzLmdldE11bHRpcGFydFVwbG9hZFN0YXR1cyA9IGV4cG9ydHMuZ2V0QmxvYiA9IGV4cG9ydHMuZGVsZXRlQmxvYiA9IGV4cG9ydHMuY2hlY2tCbG9iRXhpc3RzU3RhdHVzID0gZXhwb3J0cy5jYW5jZWxNdWx0aXBhcnRVcGxvYWQgPSB2b2lkIDA7XG4vKipcbiAqIEJsb2IgQVBJIHYxXG4gKiBUaGUgYGJsb2JgIHNlcnZpY2Ugc3VwcG9ydHMgdGhlIHVwbG9hZCBhbmQgcmV0cmlldmFsIG9mIGxhcmdlIHZvbHVtZXMgb2YgZGF0YSBmcm9tIHRoZSBzdG9yYWdlIG9mIGEgY2F0YWxvZy5cbiAqIEVhY2ggZGlzY3JldGUgY2h1bmsgb2YgZGF0YSBpcyBzdG9yZWQgYXMgYSBibG9iIChCaW5hcnkgTGFyZ2UgT2JqZWN0KS4gRWFjaCBibG9iIGhhcyBpdHMgb3duIHVuaXF1ZSBJRCAoZGF0YSBoYW5kbGUpLlxuICogVGhlIGRhdGEgaGFuZGxlcyBjYW4gYmUgc3RvcmVkIGluICBzZXJ2aWNlcyBsaWtlIGBtZXRhZGF0YWAsIGBpbmRleGAgb3IgYHN0cmVhbWAuXG4gKiBUbyBnZXQgZGF0YSwgeW91IGZpcnN0IHVzZSB0aGUgYW55IG9mIHRob3NlIHNlcnZpY2VzIHRvIHJldHJpZXZlIHRoZSBkYXRhIGhhbmRsZSBvZiB0aGUgcmVsZXZhbnQgYmxvYnMuXG4gKiBZb3UgdGhlbiB1c2UgdGhlIGRhdGEgaGFuZGxlIHRvIHB1bGwgdGhlIGRhdGEgdXNpbmcgdGhlIGBibG9iYCBzZXJ2aWNlLlxuICogSWYgeW91IGFyZSB3cml0aW5nIHRvIGEgdm9sYXRpbGUgbGF5ZXIsIHNlZSB2b2xhdGlsZS1ibG9iIEFQSSBkZWZpbml0aW9uLlxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjAuNFxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQmxvYkFwaVxuICovXG4vKipcbiAqIENhbmNlbHMgYW4gZW50aXJlIG11bHRpcGFydCB1cGxvYWQgb3BlcmF0aW9uLiBZb3UgY2FuIG9ubHkgY2FuY2VsIGEgbXVsdGlwYXJ0IHVwbG9hZCBiZWZvcmUgaXQgaGFzIGJlZW4gY29tcGxldGVkLlxuICogUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBhY3R1YWwgVVJMIGZvciB0aGlzIG9wZXJhdGlvbiBtdXN0IGJlIG9idGFpbmVkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkgb2Ygc3RhcnQgbXVsdGlwYXJ0XG4gKiBvcGVyYXRpb24gdGhhdCBpcyAnUE9TVCAvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfS9tdWx0aXBhcnRzJyBmcm9tIHRoZSAnZGVsZXRlJyBlbGVtZW50IHVuZGVyXG4gKiB0aGUgdG9wIGxldmVsICdsaW5rcycgZWxlbWVudCBvZiB0aGUgcmVzcG9uc2UuXG4gKlxuICogQHN1bW1hcnkgQ2FuY2VscyBhIG11bHRpcGFydCB1cGxvYWRcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgZGF0YSBibG9iIHBhcnQgYmVsb25ncyB0by4gQ29udGVudCBvZiB0aGlzIHBhcmFtZXRlclxuICogbXVzdCByZWZlciB0byBhIHZhbGlkIGxheWVyIGFscmVhZHkgY29uZmlndXJlZCBpbiB0aGUgY2F0YWxvZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUgZGF0YSBibG9iIHdoaWNoIHRoZSBwYXJ0IGJlbG9uZ3MgdG8uXG4gKiBUaGUgZGF0YSBoYW5kbGUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsICYjMzk7LSYjMzk7IGFuZCAmIzM5Oy4mIzM5OyBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uXG4gKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gbXVsdGlQYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpIHBhcnQgdXBsb2FkICh0b2tlbikuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0b1xuICpcbiAqIGEgdmFsaWQgdG9rZW4gcmV0cmlldmVkIHdoZW4gc3RhcnRpbmcgdGhlIG11bHRpcGFydCB1cGxvYWQuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBjYW5jZWxNdWx0aXBhcnRVcGxvYWQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX0vbXVsdGlwYXJ0cy97bXVsdGlQYXJ0VG9rZW59XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie211bHRpUGFydFRva2VufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibXVsdGlQYXJ0VG9rZW5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNhbmNlbE11bHRpcGFydFVwbG9hZCA9IGNhbmNlbE11bHRpcGFydFVwbG9hZDtcbi8qKlxuICogQ2hlY2tzIGlmIGEgYmxvYiBleGlzdHMgZm9yIHRoZSByZXF1ZXN0ZWQgZGF0YSBoYW5kbGUuXG4gKlxuICogQHN1bW1hcnkgQ2hlY2tzIGlmIGEgZGF0YSBoYW5kbGUgZXhpc3RzXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIGJsb2IgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYidzIGNvbnRlbnRzLlxuICogVGhlIGRhdGEgaGFuZGxlIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLCBcIi1cIiBhbmQgXCIuXCIgY2hhcmFjdGVycywgWzAtOSwgYS16LCBBLVosIC0sIC5dLlxuICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tCbG9iRXhpc3RzU3RhdHVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkhFQURcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNoZWNrQmxvYkV4aXN0c1N0YXR1cyA9IGNoZWNrQmxvYkV4aXN0c1N0YXR1cztcbi8qKlxuICogRGVsZXRlcyBhIGRhdGEgYmxvYiBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtICh2b2x1bWUpLiBXaGVuIHlvdSBkZWxldGUgYSBibG9iLCB5b3UgY2Fubm90IHVwbG9hZFxuICogZGF0YSB0byB0aGUgZGVsZXRlZCBibG9iJ3MgZGF0YSBoYW5kbGUgZm9yIGF0IGxlYXN0IDMgZGF5cy4gVGhlIERFTEVURSBtZXRob2Qgd29ya3Mgb25seSBmb3IgaW5kZXggbGF5ZXJzLlxuICogREVMRVRFIHJlcXVlc3RzIGZvciBibG9icyBzdG9yZWQgZm9yIG90aGVyIGtpbmQgb2YgbGF5ZXJzIHdpbGwgYmUgcmVqZWN0ZWQuXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlcyBhIGRhdGEgYmxvYiBmcm9tIGFuIGluZGV4IGxheWVyLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBkYXRhIGJsb2IgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSBvZiB0aGUgYmxvYiB5b3Ugd2FudCB0byBkZWxldGUuIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYyxcbiAqICYjMzk7LSYjMzk7IGFuZCAmIzM5Oy4mIzM5OyBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBkZWxldGVCbG9iKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVCbG9iID0gZGVsZXRlQmxvYjtcbi8qKlxuICogUmV0cmlldmVzIGEgYmxvYiBmcm9tIHN0b3JhZ2UuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBhIGJsb2JcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2ImIzM5O3MgY29udGVudHMuXG4gKiBUaGUgZGF0YSBoYW5kbGUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsICYjMzk7LSYjMzk7IGFuZCAmIzM5Oy4mIzM5OyBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uXG4gKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICogQHBhcmFtIHJhbmdlIFVzZSB0aGlzIHBhcmFtZXRlciB0byByZXN1bWUgZG93bmxvYWQgb2YgYSBsYXJnZSByZXNwb25zZSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbiBpc3N1ZSBiZXR3ZWVuXG4gKiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIsIG9yIHRvIGZldGNoIGEgc3BlY2lmaWMgc2xpY2Ugb2YgdGhlIGJsb2IuIFRvIHJlc3VtZSBkb3dubG9hZCBhZnRlciBhIGNvbm5lY3Rpb24gaXNzdWUsXG4gKiBzcGVjaWZ5IGEgc2luZ2xlIGJ5dGUgcmFuZ2Ugb2Zmc2V0IGxpa2UgdGhpczogJiN4NjA7UmFuZ2U6IGJ5dGVzJiN4M0Q7MTAtJiN4NjA7LlxuICogVG8gZmV0Y2ggYSBzcGVjaWZpYyBzbGljZSBvZiB0aGUgYmxvYiwgc3BlY2lmeSBhIHNsaWNlIGxpa2UgdGhpczogJiN4NjA7UmFuZ2U6IGJ5dGVzJiN4M0Q7MTAtMTAwJiN4NjA7LlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgY29tcGxpYW50IHdpdGggW1JGQyA3MjMzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMyksIGJ1dCBub3RlIHRoYXQgdGhpc1xuICogcGFyYW1ldGVyIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgYnl0ZSByYW5nZS4gVGhlICYjeDYwO3JhbmdlJiN4NjA7IHBhcmFtZXRlciBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYXNcbiAqIGEgcXVlcnkgcGFyYW1ldGVyLCBpLmUuICYjeDYwO3JhbmdlJiN4M0Q7Ynl0ZXMmI3gzRDsxMC0mI3g2MDsuXG4gKi9cbmZ1bmN0aW9uIGdldEJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJyYW5nZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiUmFuZ2VcIl0gPSBwYXJhbXNbXCJyYW5nZVwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0QmxvYiA9IGdldEJsb2I7XG4vKipcbiAqIEdldHMgdGhlIHN0YXR1cyBvZiBhIG11bHRpcGFydCB1cGxvYWQuIFRoZSBzdGF0dXMgY2FuIGJlIHJlY2VpdmVkIG9ubHkgd2hlbiB0aGUgdXBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAqIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgYWN0dWFsIFVSTCBmb3IgdGhpcyBvcGVyYXRpb24gbXVzdCBiZSBvYnRhaW5lZCBmcm9tIHRoZSByZXNwb25zZSBib2R5IG9mIHN0YXJ0XG4gKiBtdWx0aXBhcnQgb3BlcmF0aW9uIHRoYXQgaXMgJ1BPU1QgL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX0vbXVsdGlwYXJ0cycgZnJvbSB0aGUgJ3N0YXR1cycgZWxlbWVudFxuICogdW5kZXIgdGhlIHRvcCBsZXZlbCAnbGlua3MnIGVsZW1lbnQgb2YgdGhlIHJlc3BvbnNlLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgdGhlIHN0YXR1cyBvZiBhIG11bHRpcGFydCB1cGxvYWQuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIGRhdGEgYmxvYiBwYXJ0IGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgKElEKSBpcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgZGF0YSBibG9iIHdoaWNoIHRoZSBwYXJ0IGJlbG9uZ3MgdG8uXG4gKiBUaGUgZGF0YSBoYW5kbGUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsICYjMzk7LSYjMzk7IGFuZCAmIzM5Oy4mIzM5OyBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uXG4gKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gbXVsdGlQYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpcGFydCB1cGxvYWQgKHRva2VuKS4gQ29udGVudCBvZiB0aGlzIHBhcmFtZXRlciBtdXN0IHJlZmVyIHRvIGFcbiAqIHZhbGlkIHRva2VuIHdoaWNoIHdhcyBwcm92aWRlZCB3aGVuIHRoZSBtdWx0aXBhcnQgdXBsb2FkIHdhcyBpbml0aWF0ZWQuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGdldE11bHRpcGFydFVwbG9hZFN0YXR1cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfS9tdWx0aXBhcnRzL3ttdWx0aVBhcnRUb2tlbn1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlQYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aVBhcnRUb2tlblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzID0gZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzO1xuLyoqXG4gKiBQZXJzaXN0cyB0aGUgZGF0YSBibG9iIGluIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWVjaGFuaXNtICh2b2x1bWUpLlxuICogVXNlIHRoaXMgdXBsb2FkIG1lY2hhbmlzbSBmb3IgYmxvYnMgc21hbGxlciB0aGFuIDUwIE1CLlxuICogVGhlIHNpemUgbGltaXQgZm9yIGJsb2JzIHVwbG9hZGVkIHRoaXMgd2F5IGlzIDUgR0IgYnV0IHdlIGRvIG5vdCByZWNvbW1lbmQgdXBsb2FkaW5nIGJsb2JzXG4gKiB0aGlzIGxhcmdlIHdpdGggdGhpcyBtZXRob2QsIHNvIHVzZSBtdWx0aXBhcnQgdXBsb2FkIGluc3RlYWQuXG4gKiBXaGVuIHRoZSBvcGVyYXRpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgZGF0YSBibG9iIHdpbGwgYmVcbiAqIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBhbHRob3VnaCBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUuXG4gKiBUbyBjaGVjayBpZiB0aGUgZGF0YSBibG9iIGlzIGF2YWlsYWJsZSB1c2UgdGhlIEhFQUQgbWV0aG9kLlxuICpcbiAqIEBzdW1tYXJ5IFB1Ymxpc2hlcyBhIGRhdGEgYmxvYlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBkYXRhIGJsb2IgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgYmxvYi5cbiAqIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgXCItXCIgYW5kIFwiLlwiIGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS5cbiAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBib2R5IFRoZSBkYXRhIHRvIHVwbG9hZC4gQ2FuIGJlIEJsb2Igb3IgQnVmZmVyLlxuICogQHBhcmFtIGNvbnRlbnRMZW5ndGggU2l6ZSBvZiB0aGUgZW50aXR5LWJvZHksIGluIGJ5dGVzLlxuICogQHBhcmFtIGNvbnRlbnRUeXBlIEEgc3RhbmRhcmQgTUlNRSB0eXBlIGRlc2NyaWJpbmcgdGhlIGZvcm1hdCBvZiB0aGUgYmxvYiBkYXRhLiBGb3IgbW9yZSBpbmZvcm1hdGlvbixcbiAqIHNlZSBbUkZDIDI2MTYsIHNlY3Rpb24gMTQuMTc6IENvbnRlbnQtVHlwZV0oaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTQuaHRtbCNzZWMxNC4xNykuXG4gKiBUaGUgdmFsdWUgb2YgdGhpcyBoZWFkZXIgbXVzdCBtYXRjaCB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgY29udGVudFR5cGUgZmllbGQgd2hlbiB0aGUgbXVsdGlwYXJ0XG4gKiB1cGxvYWQgd2FzIGluaXRpYWxpemVkLCBhbmQgdGhpcyBjb250ZW50IHR5cGUgbXVzdCBhbHNvIG1hdGNoIHRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGluIHRoZSBsYXllcidzIGNvbmZpZ3VyYXRpb24uXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgNzIzMCwgc2VjdGlvbiAzLjMuMjogQ29udGVudC1MZW5ndGhdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4zLjIpLlxuICogQHBhcmFtIGNvbnRlbnRFbmNvZGluZyBPcHRpb25hbCBwYXJhbSwgY2FuIGJlIGBnemlwYCBvZiBgdW5kZWZpbmVkYC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIHB1dERhdGEoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gcGFyYW1zW1wiYm9keVwiXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wiY29udGVudFR5cGVcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IHBhcmFtc1tcImNvbnRlbnRUeXBlXCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LUxlbmd0aFwiXSA9IHBhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcImNvbnRlbnRFbmNvZGluZ1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1FbmNvZGluZ1wiXSA9IHBhcmFtc1tcImNvbnRlbnRFbmNvZGluZ1wiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucHV0RGF0YSA9IHB1dERhdGE7XG4vKipcbiAqIFB1Ymxpc2hlcyBsYXJnZSBkYXRhIGJsb2JzIHdoZXJlIHRoZSBkYXRhIHBheWxvYWQgbmVlZHMgdG8gYmUgc3BsaXQgaW50byBtdWx0aXBsZSBwYXJ0cy5cbiAqIFRoZSBtdWx0aXBhcnQgdXBsb2FkIHN0YXJ0IGlzIHRvIGJlIGZvbGxvd2VkIGJ5IHRoZSBpbmRpdmlkdWFsIHBhcnRzIHVwbG9hZCBhbmQgY29tcGxldGVkIHdpdGggYVxuICogY2FsbCB0byBjb21wbGV0ZSB0aGUgdXBsb2FkLiBUaGUgbGltaXQgb2YgdGhlIGJsb2IgdXBsb2FkZWQgdGhpcyB3YXkgaXMgNTBHQi5cbiAqXG4gKiBAc3VtbWFyeSBTdGFydHMgYSBtdWx0aXBhcnQgdXBsb2FkIG9mIGEgYmxvYiBhbmQgcmV0dXJucyBVUkxzIGZvciB0aGUgbmV4dCBtdWx0aXBhcnQgdXBsb2FkIG9wZXJhdGlvbnMuXG4gKiBUaGUgVVJMcyBjb250YWluIHRoZSB1cGxvYWQgdG9rZW4uXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIGRhdGEgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUgZGF0YSBibG9iIHdoaWNoIGNvbnRlbnRzIHdpbGwgYmUgcGVyc2lzdGVkLlxuICogVGhlIGRhdGEgaGFuZGxlIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLCAmIzM5Oy0mIzM5OyBhbmQgJiMzOTsuJiMzOTsgY2hhcmFjdGVycywgWzAtOSwgYS16LCBBLVosIC0sIC5dLlxuICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIGJvZHkgYm9keVxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRNdWx0aXBhcnRVcGxvYWQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX0vbXVsdGlwYXJ0c1wiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc3RhcnRNdWx0aXBhcnRVcGxvYWQgPSBzdGFydE11bHRpcGFydFVwbG9hZDtcbi8qKlxuICogQ2FsbCB0aGlzIEFQSSB3aGVuIGFsbCBwYXJ0cyBoYXZlIGJlZW4gdXBsb2FkZWQuIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgYWN0dWFsIFVSTCBmb3IgdGhpcyBvcGVyYXRpb25cbiAqIG11c3QgYmUgb2J0YWluZWQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keSBvZiBzdGFydCBtdWx0aXBhcnQgb3BlcmF0aW9uIHRoYXQgaXNcbiAqICdQT1NUIC9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHMnIGZyb20gdGhlICdjb21wbGV0ZScgZWxlbWVudCB1bmRlciB0aGUgdG9wIGxldmVsICdsaW5rcycgZWxlbWVudCBvZiB0aGUgcmVzcG9uc2UuXG4gKlxuICogQHN1bW1hcnkgQ29tcGxldGVzIGEgbXVsdGlwYXJ0IHVwbG9hZFxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBkYXRhIGJsb2IgcGFydCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUgZGF0YSBibG9iIHdoaWNoIHRoZSBwYXJ0XG4gKiBiZWxvbmdzIHRvLiBUaGUgZGF0YSBoYW5kbGUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsIFwiLVwiOyBhbmQgXCIuXCIgY2hhcmFjdGVycyxcbiAqIFswLTksIGEteiwgQS1aLCAtLCAuXS4gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIG11bHRpUGFydFRva2VuIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtdWx0aSBwYXJ0IHVwbG9hZCAodG9rZW4pLiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3RcbiAqIHJlZmVyIHRvIGEgdmFsaWQgbmFuZCBzdGFydGVkIG11bHRpcGFydCB1cGxvYWQuXG4gKiBAcGFyYW0gcGFydHMgVGhlIHBhcnQgaWRzIHVwbG9hZGVkIGluIHRoaXMgbXVsdGlwYXJ0IHVwbG9hZCB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcmVzdWx0aW5nIGJsb2IuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBkb0NvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKHBhcmFtcy51cmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJwYXJ0c1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJwYXJ0c1wiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRvQ29tcGxldGVNdWx0aXBhcnRVcGxvYWQgPSBkb0NvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkO1xuLyoqXG4gKiBVcGxvYWQgYSBzaW5nbGUgcGFydCBvZiBhIG11bHRpcGFydCB1cGxvYWQgZm9yIHRoZSBibG9iLiBFdmVyeSB1cGxvYWRlZCBwYXJ0IGV4Y2VwdCB0aGUgbGFzdCBvbmUgbXVzdCBoYXZlIGFcbiAqIG1pbmltdW0gNSBNQiBvZiBkYXRhIGFuZCBtYXhpbXVtIG9mIDUgR0IsIGJ1dCB3ZSBkbyBub3QgcmVjb21tZW5kIHVwbG9hZGluZyBwYXJ0cyB0aGlzIGxhcmdlLlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRzIGlzIDEwLDAwMC4gUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBhY3R1YWwgVVJMIGZvciB0aGlzIG9wZXJhdGlvblxuICogbXVzdCBiZSBvYnRhaW5lZCBmcm9tIHRoZSByZXNwb25zZSBib2R5IG9mIHN0YXJ0IG11bHRpcGFydCBvcGVyYXRpb24gdGhhdCBpcyAnUE9TVCAvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfS9tdWx0aXBhcnRzJ1xuICogZnJvbSB0aGUgJ3VwbG9hZFBhcnQnIGVsZW1lbnQgdW5kZXIgdGhlIHRvcCBsZXZlbCAnbGlua3MnIGVsZW1lbnQgb2YgdGhlIHJlc3BvbnNlLlxuICpcbiAqIEBzdW1tYXJ5IFVwbG9hZHMgYSBwYXJ0XG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIGRhdGEgYmxvYiBwYXJ0IGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgKElEKSByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIGJsb2Igd2hpY2ggdGhlIHBhcnQgYmVsb25ncyB0by4gVGhlIGRhdGEgaGFuZGxlXG4gKiBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgJy0nIGFuZCAnLicgY2hhcmFjdGVycywgWzAtOSwgYS16LCBBLVosIC0sIC5dLlxuICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIG11bHRpUGFydFRva2VuIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtdWx0aSBwYXJ0IHVwbG9hZCAodG9rZW4pLiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyXG4gKiBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgbmFuZCBzdGFydGVkIG11bHRpcGFydCB1cGxvYWQuXG4gKiBAcGFyYW0gcGFydE51bWJlciBUaGUgbnVtYmVyIG9mIHRoZSBwYXJ0IGZvciB0aGUgbXVsdGkgcGFydCB1cGxvYWQuIFRoZSBudW1iZXJzIG9mIHRoZSB1cGxvYWQgcGFydHNcbiAqIG11c3Qgc3RhcnQgZnJvbSAxLCBiZSBubyBncmVhdGVyIHRoYW4gMTAsMDAwIGFuZCBiZSBjb25zZWN1dGl2ZS4gUGFydHMgdXBsb2FkZWQgd2l0aCB0aGUgc2FtZSAmI3g2MDtwYXJ0TnVtYmVyJiN4NjA7XG4gKiBhcmUgb3ZlcnJpZGRlbi4gRG8gbm90IHJldXNlIHRoZSBzYW1lICdwYXJ0bnVtYmVyJyB3aGVuIHJldHJ5aW5nIGFuIHVwbG9hZCBpbiBhbiBlcnJvciBzaXR1YXRpb25cbiAqIChuZXR3b3JrIHByb2JsZW1zLCA0eHggb3IgNXh4IHJlc3BvbnNlcykuIFJldXNpbmcgdGhlIHNhbWUgJiN4NjA7cGFydG51bWJlciYjeDYwOyBpbiBhIHJldHJ5IG1heSBjYXVzZSB0aGUgcHVibGljYXRpb24gdG8gZmFpbC5cbiAqIEBwYXJhbSBib2R5IFRoZSBkYXRhIHRvIHVwbG9hZCBhcyBwYXJ0IG9mIHRoZSBibG9iLlxuICogQHBhcmFtIGNvbnRlbnRUeXBlIEEgc3RhbmRhcmQgTUlNRSB0eXBlIGRlc2NyaWJpbmcgdGhlIGZvcm1hdCBvZiB0aGUgYmxvYiBkYXRhLiBGb3IgbW9yZSBpbmZvcm1hdGlvbixcbiAqIHNlZSBbUkZDIDI2MTYsIHNlY3Rpb24gMTQuMTc6IENvbnRlbnQtVHlwZV0oaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTQuaHRtbCNzZWMxNC4xNykuXG4gKiBUaGUgdmFsdWUgb2YgdGhpcyBoZWFkZXIgbXVzdCBtYXRjaCB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgY29udGVudFR5cGUgZmllbGQgd2hlbiB0aGUgbXVsdGlwYXJ0XG4gKiB1cGxvYWQgd2FzIGluaXRpYWxpemVkLCBhbmQgdGhpcyBjb250ZW50IHR5cGUgbXVzdCBhbHNvIG1hdGNoIHRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGluIHRoZSBsYXllcidzIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0gY29udGVudExlbmd0aCBTaXplIG9mIHRoZSBlbnRpdHktYm9keSwgaW4gYnl0ZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLFxuICogc2VlIFtSRkMgNzIzMCwgc2VjdGlvbiAzLjMuMjogQ29udGVudC1MZW5ndGhdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4zLjIpLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gZG9VcGxvYWRQYXJ0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKHBhcmFtcy51cmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFydE51bWJlclwiLCBwYXJhbXNbXCJwYXJ0TnVtYmVyXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gcGFyYW1zW1wiYm9keVwiXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wiY29udGVudFR5cGVcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IHBhcmFtc1tcImNvbnRlbnRUeXBlXCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LUxlbmd0aFwiXSA9IHBhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRvVXBsb2FkUGFydCA9IGRvVXBsb2FkUGFydDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51cGxvYWRQYXJ0QnlLZXkgPSBleHBvcnRzLnN0YXJ0TXVsdGlwYXJ0VXBsb2FkQnlLZXkgPSBleHBvcnRzLnB1dEJsb2JCeUtleSA9IGV4cG9ydHMubGlzdEtleXMgPSBleHBvcnRzLmdldE11bHRpcGFydFVwbG9hZFN0YXR1c0J5S2V5ID0gZXhwb3J0cy5nZXRCbG9iQnlLZXkgPSBleHBvcnRzLmRlbGV0ZUJsb2JCeUtleSA9IGV4cG9ydHMuY29tcGxldGVNdWx0aXBhcnRVcGxvYWRCeUtleSA9IGV4cG9ydHMuY2hlY2tLZXlFeGlzdHMgPSBleHBvcnRzLmNhbmNlbE11bHRpcGFydFVwbG9hZEJ5S2V5ID0gdm9pZCAwO1xuLyoqXG4gKiBCbG9iIEFQSSB2MlxuICogVGhlIGBibG9iYCBzZXJ2aWNlIHN1cHBvcnRzIHRoZSB1cGxvYWQgYW5kIHJldHJpZXZhbCBvZiBsYXJnZSB2b2x1bWVzIG9mIGRhdGEgZnJvbSB0aGUgc3RvcmFnZSBvZiBhIGNhdGFsb2cuXG4gKiBFYWNoIGRpc2NyZXRlIGNodW5rIG9mIGRhdGEgaXMgc3RvcmVkIGFzIGEgYmxvYiAoQmluYXJ5IExhcmdlIE9iamVjdCkuIEVhY2ggYmxvYiBoYXMgaXRzIG93biB1bmlxdWUgSUQgKGhhbmRsZSBvciBrZXkpLFxuICogd2hpY2ggY2FuIGJlIHN0b3JlZCBhcyBwYXJ0aXRpb24gbWV0YWRhdGEuXG4gKiBBY2Nlc3NpbmcgYmxvYnMgY2FuIGJlIGRvbmUgZWl0aGVyIGJ5IGtleSBvciBieSBoYW5kbGUsIG5vdCBib3RoIGZvciB0aGUgc2FtZSBsYXllci5cbiAqIFdoZW4gYWNjZXNzaW5nIGJ5IGtleSBpcyBlbmFibGVkLCB5b3UgY2FuIHVzZSBrZXlzIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBibG9icywgYnV0IG5vdCBkYXRhIGhhbmRsZXMuXG4gKiBLZXlzIGZvbGxvdyBhIHVzZXItZGVmaW5lZCBmb3JtYXQgZm9yIHRoZSBsYXllcnMgd2hpbGUgZGF0YSBoYW5kbGVzIGFyZSBvcGFxdWUgaWRlbnRpZmllcnMuXG4gKiBUaGUgYWNjZXNzLWJ5LWtleSBBUEkgaGFzIGRpZmZlcmVudCBjYXBhYmlsaXRpZXMgb2YgdGhlIGFjY2Vzcy1ieS1kYXRhLWhhbmRsZSBBUEkgYW5kIGRpZmZlcmVudCBlbmRwb2ludHM6XG4gKiBlbmFibGluZyBhY2Nlc3MgYnkga2V5IGltcGxpZXMgdGhlIGNhcGFiaWxpdHkgdG8gdXBkYXRlIGJsb2JzLCB3aGlsZSBvcGVyYXRpbmcgdmlhIGRhdGEgaGFuZGxlcyBpcyBtb3JlIGVmZmljaWVudFxuICogYW5kIHByb3ZpZGVzIHJvb20gZm9yIG9wdGltaXphdGlvbiBvbiBib3RoIHRoZSBjbGllbnQgc2lkZSBhbmQgaW5zaWRlIHRoZSBzZXJ2aWNlLiBJbiBjYXNlIHRoZSBhY2Nlc3MgcGF0dGVybiBpcyBieSBrZXksXG4gKiB5b3UgY2FuIGVuYWJsZSB0aGUgb3B0aW9uYWwgY2FwYWJpbGl0eSBvZiBsaXN0aW5nIHdoaWNoIGtleXMgYXJlIHN0b3JlZCBpbiB0aGUgbGF5ZXIuIFRoaXMgY2FwYWJpbGl0eSBoYXMgYSBuZWdhdGl2ZSBpbXBhY3RcbiAqIG9uIHRoZSBhY2Nlc3MgdGltZXMgd2hlbiBnZXR0aW5nIGFuZCBzYXZpbmcgYmxvYnMgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIGVuYWJsZWQgZXhwbGljaXRseS5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMi4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCeUtleUFwaVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIENhbmNlbHMgYW4gZW50aXJlIG11bHRpcGFydCB1cGxvYWQgb3BlcmF0aW9uLiBZb3UgY2FuIG9ubHkgY2FuY2VsIGEgbXVsdGlwYXJ0IHVwbG9hZCBiZWZvcmUgaXQgaGFzIGJlZW4gY29tcGxldGVkLlxuICpcbiAqIEBzdW1tYXJ5IENhbmNlbHMgYSBtdWx0aXBhcnQgdXBsb2FkLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBtdWx0aXBhcnRUb2tlbiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCAodG9rZW4pLlxuICogQ29udGVudCBvZiB0aGlzIHBhcmFtZXRlciBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgdG9rZW4gd2hpY2ggd2hlbiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCB3YXMgaW5pdGlhdGVkLlxuICovXG5mdW5jdGlvbiBjYW5jZWxNdWx0aXBhcnRVcGxvYWRCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzTXVsdGlwYXJ0L3ttdWx0aXBhcnRUb2tlbn1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlwYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aXBhcnRUb2tlblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuY2FuY2VsTXVsdGlwYXJ0VXBsb2FkQnlLZXkgPSBjYW5jZWxNdWx0aXBhcnRVcGxvYWRCeUtleTtcbi8qKlxuICogQ2hlY2tzIGlmIGEgYmxvYiBleGlzdHMgZm9yIHRoZSByZXF1ZXN0ZWQga2V5LlxuICpcbiAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhIGtleSBleGlzdHMuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIGtleSBUaGUga2V5IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJ3MgY29udGVudHMuXG4gKiBLZXkgY2FuIG9ubHkgY29udGFpbiBhbGxvd2VkIGNoYXJhY3RlcnM6IGEtekEtWjAtOS5bXSgpe30vXy0mLlxuICovXG5mdW5jdGlvbiBjaGVja0tleUV4aXN0cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzL3trZXl9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2tleX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImtleVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkhFQURcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNoZWNrS2V5RXhpc3RzID0gY2hlY2tLZXlFeGlzdHM7XG4vKipcbiAqIENhbGwgdGhpcyBBUEkgd2hlbiBhbGwgcGFydHMgaGF2ZSBiZWVuIHVwbG9hZGVkLlxuICpcbiAqIEBzdW1tYXJ5IENvbXBsZXRlcyBhIG11bHRpcGFydCB1cGxvYWQuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIG11bHRpcGFydFRva2VuIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtdWx0aXBhcnQgdXBsb2FkICh0b2tlbikuXG4gKiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYSB2YWxpZCB0b2tlbiB3aGljaCB3aGVuIHRoZSBtdWx0aXBhcnQgdXBsb2FkIHdhcyBpbml0aWF0ZWQuXG4gKiBAcGFyYW0gYm9keSBUaGUgcGFydCBJRHMgdXBsb2FkZWQgaW4gdGhpcyBtdWx0aXBhcnQgdXBsb2FkIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIHRoZSByZXN1bHRpbmcgYmxvYi5cbiAqL1xuZnVuY3Rpb24gY29tcGxldGVNdWx0aXBhcnRVcGxvYWRCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzTXVsdGlwYXJ0L3ttdWx0aXBhcnRUb2tlbn1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlwYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aXBhcnRUb2tlblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jb21wbGV0ZU11bHRpcGFydFVwbG9hZEJ5S2V5ID0gY29tcGxldGVNdWx0aXBhcnRVcGxvYWRCeUtleTtcbi8qKlxuICogRGVsZXRlcyBhIGRhdGEgYmxvYi5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgZGF0YSBibG9iLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYidzIGNvbnRlbnRzLlxuICogS2V5IGNhbiBvbmx5IGNvbnRhaW4gYWxsb3dlZCBjaGFyYWN0ZXJzOiBhLXpBLVowLTkuW10mKCl7fS9fLSYuXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUJsb2JCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzL3trZXl9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2tleX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImtleVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlQmxvYkJ5S2V5ID0gZGVsZXRlQmxvYkJ5S2V5O1xuLyoqXG4gKiBSZXRyaWV2ZXMgYSBibG9iIGZyb20gc3RvcmFnZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGEgYmxvYi5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2IncyBjb250ZW50cy5cbiAqIEtleSBjYW4gb25seSBjb250YWluIGFsbG93ZWQgY2hhcmFjdGVyczogYS16QS1aMC05LltdJigpe30vXzsuXG4gKiBAcGFyYW0gcmFuZ2UgVXNlIHRoaXMgcGFyYW1ldGVyIHRvIHJlc3VtZSBkb3dubG9hZCBvZiBhIGxhcmdlIHJlc3BvbnNlIHdoZW4gdGhlcmUgaXMgYSBjb25uZWN0aW9uIGlzc3VlIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyLFxuICogb3IgdG8gZmV0Y2ggYSBzcGVjaWZpYyBzbGljZSBvZiB0aGUgYmxvYi4gVG8gcmVzdW1lIGRvd25sb2FkIGFmdGVyIGEgY29ubmVjdGlvbiBpc3N1ZSxcbiAqIHNwZWNpZnkgYSBzaW5nbGUgYnl0ZSByYW5nZSBvZmZzZXQgYXMgZm9sbG93czogUmFuZ2U6IGJ5dGVzJjEwOy5cbiAqIFRvIGZldGNoIGEgc3BlY2lmaWMgc2xpY2Ugb2YgdGhlIGJsb2IsIHNwZWNpZnkgYSBzbGljZSBhcyBmb2xsb3dzOlxuICogUmFuZ2U6IGJ5dGVzJjEwLTEwMC4gVGhpcyBwYXJhbWV0ZXIgaXMgY29tcGxpYW50IHdpdGggW1JGQyA3MjMzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMyksXG4gKiBidXQgbm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgYnl0ZSByYW5nZS5cbiAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSByYW5nZSBwYXJhbWV0ZXIgYXMgYSBxdWVyeSBwYXJhbWV0ZXIsIGZvciBleGFtcGxlIHJhbmdlJmJ5dGVzJjEwOy5cbiAqL1xuZnVuY3Rpb24gZ2V0QmxvYkJ5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXMve2tleX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7a2V5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wia2V5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJyYW5nZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiUmFuZ2VcIl0gPSBwYXJhbXNbXCJyYW5nZVwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0QmxvYkJ5S2V5ID0gZ2V0QmxvYkJ5S2V5O1xuLyoqXG4gKiBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtdWx0aXBhcnQgdXBsb2FkLiBUaGUgc3RhdHVzIGNhbiBiZSByZWNlaXZlZCBvbmx5IHdoZW4gdGhlIHVwbG9hZCBoYXMgYmVlbiBjb21wbGV0ZWQuXG4gKlxuICogQHN1bW1hcnkgR2V0cyB0aGUgc3RhdHVzIG9mIGEgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0gbXVsdGlwYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpcGFydCB1cGxvYWQgKHRva2VuKS5cbiAqIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIHRva2VuIHdoaWNoIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYXRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzQnlLZXkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0va2V5c011bHRpcGFydC97bXVsdGlwYXJ0VG9rZW59XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie211bHRpcGFydFRva2VufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibXVsdGlwYXJ0VG9rZW5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzQnlLZXkgPSBnZXRNdWx0aXBhcnRVcGxvYWRTdGF0dXNCeUtleTtcbi8qKlxuICogTGlzdCB2aXJ0dWFsIGRpcmVjdG9yeS1saWtlIHN0cnVjdHVyZSBjcmVhdGVkIGZyb20ga2V5cyBpbiB0aGUgc3RvcmFnZSB3aGVyZSAnLycgaXMgdXNlZCBhcyBhIHNlcGFyYXRvci5cbiAqXG4gKiBAc3VtbWFyeSBMaXN0IGtleXMuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIHBhcmVudCBDb21tb24gcHJlZml4IHRvIGEgbGlzdC5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gSWYgc3BlY2lmaWVkLCB3aWxsIHJldHVybiB0aGUgc3BlY2lmaWMgcGFnZSBiYXNlZCBvbiB0aGUgdG9rZW4uXG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuIHBlciBwYWdlLlxuICogQHBhcmFtIGRlZXAgVXNlIGRlZXAgKHJlY3Vyc2l2ZSkgbGlzdGluZyBvZiBvYmplY3RzIGluc3RlYWQgb2YgaGllcmFyY2hpY2FsIGxpc3RpbmcuXG4gKiBEZWVwIGxpc3Rpbmcgd2lsbCBub3QgcHJvZHVjZSBhbnkgY29tbW9uIHByZWZpeGVzLlxuICovXG5mdW5jdGlvbiBsaXN0S2V5cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcmVudFwiLCBwYXJhbXNbXCJwYXJlbnRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJkZWVwXCIsIHBhcmFtc1tcImRlZXBcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxpc3RLZXlzID0gbGlzdEtleXM7XG4vKipcbiAqIFBlcnNpc3RzIHRoZSBkYXRhIGJsb2IgdXAgdG8gMTkyIE1CLiBXaGVuIHRoZSBvcGVyYXRpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSxcbiAqIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBkYXRhIGJsb2Igd2lsbCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUsIGFsdGhvdWdoIGluIG1vc3QgY2FzZXMsXG4gKiBpdCB3aWxsIGJlLiBUbyBjaGVjayBpZiB0aGUgZGF0YSBibG9iIGlzIGF2YWlsYWJsZSwgdXNlIHRoZSDCtEhFQUTCtCBtZXRob2QuIFRoZSBtYXhpbXVtIGtleSBsZW5ndGggaXMgNDUwIGNoYXJhY3RlcnMuXG4gKlxuICogQHN1bW1hcnkgUHVibGlzaGVzIGEgZGF0YSBibG9iIG9yIGNvcGllcyBhbiBleGlzdGluZyBibG9iLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYidzIGNvbnRlbnRzLlxuICogS2V5IGNhbiBvbmx5IGNvbnRhaW4gYWxsb3dlZCBjaGFyYWN0ZXJzOiBhLXpBLVowLTkuW10mKCl7fS9fOy5cbiAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFNpemUgb2YgdGhlIGVudGl0eS1ib2R5LCBpbiBieXRlcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyA3MjMwLCBzZWN0aW9uIDMuMy4yOiBDb250ZW50LUxlbmd0aF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMikuXG4gKiBAcGFyYW0gYm9keSBSZXF1ZXN0IGJvZHkuIE11c3QgYmUgZW1wdHkgd2hlbiBjb3B5aW5nIGFuIG9iamVjdCB1c2luZyB0aGUgc291cmNlIHBhcmFtZXRlci5cbiAqIEBwYXJhbSBzb3VyY2UgQ29weSBhbiBhbHJlYWR5LWV4aXN0aW5nIG9iamVjdCwgaW5zdGVhZCBvZiB1cGxvYWRpbmcgYSBuZXcgb25lLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBwcmVzZW50LFxuICogdGVoIHJlcXVlc3QgcGF5bG9hZCBtdXN0IGJlIGVtcHR5LlxuICovXG5mdW5jdGlvbiBwdXRCbG9iQnlLZXkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0va2V5cy97a2V5fVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntrZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJrZXlcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzb3VyY2VcIiwgcGFyYW1zW1wic291cmNlXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LUxlbmd0aFwiXSA9IGAke3BhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl19YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucHV0QmxvYkJ5S2V5ID0gcHV0QmxvYkJ5S2V5O1xuLyoqXG4gKiBQdWJsaXNoZXMgbGFyZ2UgZGF0YSBibG9icyB3aGVyZSB0aGUgZGF0YSBwYXlsb2FkIG5lZWRzIHRvIGJlIHNwbGl0IGludG8gbXVsdGlwbGUgcGFydHMuXG4gKiBUaGUgbXVsdGlwYXJ0IHVwbG9hZCBzdGFydCBpcyB0byBiZSBmb2xsb3dlZCBieSB0aGUgaW5kaXZpZHVhbCBwYXJ0cyB1cGxvYWQgYW5kIGNvbXBsZXRlZFxuICogd2l0aCBhIGNhbGwgdG8gY29tcGxldGUgdGhlIHVwbG9hZC4gVGhlIGxpbWl0IG9mIHRoZSBibG9iIHVwbG9hZGVkIHRoaXMgd2F5IGlzIDUwR0IuXG4gKiBNYXgga2V5IGxlbmd0aCBpcyA0NTAgY2hhcmFjdGVycy5cbiAqXG4gKiBAc3VtbWFyeSBTdGFydHMgYSBtdWx0aXBhcnQgdXBsb2FkLlxuICogQHBhcmFtIGJvZHkgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgbWV0YWRhdGEgb2YgdGhlIHVwbG9hZGVkIG9iamVjdC5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2IncyBjb250ZW50cy5cbiAqIEtleSBjYW4gb25seSBjb250YWluIGFsbG93ZWQgY2hhcmFjdGVyczogYS16QS1aMC05LltdJigpe30vXzsuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0TXVsdGlwYXJ0VXBsb2FkQnlLZXkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0va2V5cy97a2V5fVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntrZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJrZXlcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc3RhcnRNdWx0aXBhcnRVcGxvYWRCeUtleSA9IHN0YXJ0TXVsdGlwYXJ0VXBsb2FkQnlLZXk7XG4vKipcbiAqIFVwbG9hZCBvciBjb3B5IGEgc2luZ2xlIHBhcnQgb2YgYSBtdWx0aXBhcnQgdXBsb2FkIG9yIG11bHRpcGFydCBjb3B5IGZvciB0aGUgYmxvYi5cbiAqIEV2ZXJ5IHBhcnQgZXhjZXB0IHRoZSBsYXN0IG9uZSBtdXN0IGhhdmUgYSBtaW5pbXVtIDUgTUIgb2YgZGF0YSBhbmQgbWF4aW11bSBvZiA5NiBNQi5cbiAqIFRoZSBsZW5ndGggb2YgZXZlcnkgcGFydCBleGNlcHQgdGhlIGxhc3Qgb25lIG11c3QgYmUgbXVsdGlwbGUgb2YgMU1CICgxMDI0S0IpLlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRzIGlzIDEwLDAwMC5cbiAqXG4gKiBAc3VtbWFyeSBVcGxvYWRzIGEgcGFydCBvciBjcmVhdGVzIGEgbmV3IHBhcnQgZnJvbSBwYXJ0IG9mIGFuIGV4aXN0aW5nIGJsb2IuXG4gKiBAcGFyYW0gYm9keSBUaGUgYm9keSByZWxhdGVzIHRvIHVwbG9hZCBvbmx5LiBUaGUgZGF0YSB0byB1cGxvYWQgYXMgcGFydCBvZiB0aGUgYmxvYi5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0gbXVsdGlwYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpcGFydCB1cGxvYWQgKHRva2VuKS5cbiAqIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIHRva2VuIHdoaWNoIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYXRlZC5cbiAqIEBwYXJhbSBwYXJ0TnVtYmVyIFRoaXMgcGFyYW1ldGVyIHJlbGF0ZXMgdG8gdXBsb2FkIGFuZCBjb3B5LiBUaGUgbnVtYmVyIG9mIHRoZSBwYXJ0IGZvciB0aGUgbXVsdGlwYXJ0IHVwbG9hZCBvciBjb3B5LlxuICogVGhlIG51bWJlcnMgb2YgdGhlIHVwbG9hZCBwYXJ0cyBtdXN0IHN0YXJ0IGZyb20gMSwgYmUgbm8gZ3JlYXRlciB0aGFuIDEwLDAwMCBhbmQgYmUgY29uc2VjdXRpdmUuXG4gKiBQYXJ0cyB1cGxvYWRlZCB3aXRoIHRoZSBzYW1lIHBhcnROdW1iZXIgYXJlIG92ZXJyaWRkZW4uIERvIG5vdCByZXVzZSB0aGUgc2FtZSBwYXJ0TnVtYmVyIHdoZW4gcmV0cnlpbmdcbiAqIGFuIHVwbG9hZCBvciBjb3B5IGluIGFuIGVycm9yIHNpdHVhdGlvbiAobmV0d29yayBwcm9ibGVtcywgNHh4IG9yIDV4eCByZXNwb25zZXMpLlxuICogUmV1c2luZyB0aGUgc2FtZSBwYXJ0TnVtYmVyIGluIGEgcmV0cnkgbWF5IGNhdXNlIHRoZSBwdWJsaWNhdGlvbiB0byBmYWlsLlxuICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhpcyBoZWFkZXIgcmVsYXRlcyB0byB1cGxvYWQgb25seS4gU2l6ZSBvZiB0aGUgZW50aXR5LWJvZHksIGluIGJ5dGVzLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDcyMzAsIHNlY3Rpb24gMy4zLjI6IENvbnRlbnQtTGVuZ3RoXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yKS5cbiAqIEBwYXJhbSBjb250ZW50VHlwZSBUaGlzIGhlYWRlciByZWxhdGVzIHRvIHVwbG9hZCBvbmx5LiBBIHN0YW5kYXJkIE1JTUUgdHlwZSBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2IgZGF0YS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAyNjE2LCBzZWN0aW9uIDE0LjE3OiBDb250ZW50LVR5cGVdKGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzE0Lmh0bWwjc2VjMTQuMTcpLlxuICogVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIG11c3QgbWF0Y2ggdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnRlbnRUeXBlIGZpZWxkIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYWxpemVkLFxuICogYW5kIHRoaXMgY29udGVudCB0eXBlIG11c3QgYWxzbyBtYXRjaCB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgbGF5ZXIncyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHNvdXJjZSBDb3B5IHBhcnQgZnJvbSBhbiBleGlzdGluZyBvYmplY3QsIHVzZSByYW5nZSB0byBzcGVjaWZ5IHdoaWNoIHBhcnRzIG9mIHRoZSBvYmplY3QgdG8gY29weS5cbiAqIEBwYXJhbSByYW5nZSBUaGlzIGhlYWRlci9wYXJhbWV0ZXIgcmVsYXRlcyB0byBvYmplY3QgY29weSB1c2luZyB0aGUgJ3NvdXJjZScgcGFyYW1ldGVyLiBVc2UgdGhpcyBwYXJhbWV0ZXJcbiAqIHRvIGNvcHkgYSBzcGVjaWZpYyBzbGljZSBvZiB0aGUgYmxvYiBsaWtlIHRoaXM6IFJhbmdlOiBieXRlcyYwLTEwNDg1NzUuIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudFxuICogd2l0aCBbUkZDIDcyMzNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMzKSwgYnV0IG5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGFcbiAqIHNpbmdsZSBieXRlIHJhbmdlIGFuZCBib3RoIGJlZ2luIGFuZCBlbmQgdmFsdWVzIG9mIHRoZSByYW5nZSBtdXN0IGJlIHNwZWNpZmllZC5cbiAqIFRoZSByYW5nZSBiZWdpbiB2YWx1ZSBtdXN0IGJlIG11bHRpcGxlIG9mIDFNQiAoMTAyNEtCKS5cbiAqIFRoZSBsZW5ndGggb2YgZXZlcnkgcGFydCBleGNlcHQgdGhlIGxhc3Qgb25lIG11c3QgYmUgbXVsdGlwbGUgb2YgMU1CICgxMDI0S0IpLlxuICogVGhlIHJhbmdlIHBhcmFtZXRlciBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYXMgYSBxdWVyeSBwYXJhbWV0ZXIsIGZvciBleGFtcGxlIHJhbmdlJmJ5dGVzJjAtMTA0ODU3NS5cbiAqL1xuZnVuY3Rpb24gdXBsb2FkUGFydEJ5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXNNdWx0aXBhcnQve211bHRpcGFydFRva2VufS9wYXJ0c1wiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttdWx0aXBhcnRUb2tlbn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm11bHRpcGFydFRva2VuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFydE51bWJlclwiLCBwYXJhbXNbXCJwYXJ0TnVtYmVyXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNvdXJjZVwiLCBwYXJhbXNbXCJzb3VyY2VcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IHBhcmFtc1tcImJvZHlcIl07XG4gICAgICAgIGlmIChwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LUxlbmd0aFwiXSA9IGAke3BhcmFtc1tcImNvbnRlbnRMZW5ndGhcIl19YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wiY29udGVudFR5cGVcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IHBhcmFtc1tcImNvbnRlbnRUeXBlXCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXNbXCJyYW5nZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiUmFuZ2VcIl0gPSBwYXJhbXNbXCJyYW5nZVwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy51cGxvYWRQYXJ0QnlLZXkgPSB1cGxvYWRQYXJ0QnlLZXk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51cGRhdGVDYXRhbG9nID0gZXhwb3J0cy5wYXRjaExheWVyID0gZXhwb3J0cy5wYXRjaENhdGFsb2cgPSBleHBvcnRzLmdldENhdGFsb2dzID0gZXhwb3J0cy5nZXRDYXRhbG9nU3RhdHVzID0gZXhwb3J0cy5nZXRDYXRhbG9nID0gZXhwb3J0cy5kaXNhYmxlQXV0b21hdGljVmVyc2lvbkRlbGV0aW9uID0gZXhwb3J0cy5kZWxldGVMYXllciA9IGV4cG9ydHMuZGVsZXRlQ2F0YWxvZyA9IGV4cG9ydHMuY3JlYXRlQ2F0YWxvZyA9IGV4cG9ydHMuY2F0YWxvZ0V4aXN0cyA9IHZvaWQgMDtcbi8qKlxuICogQ29uZmlnIEFQSSB2MVxuICogVGhlIGBjb25maWdgIHNlcnZpY2UgcHJvdmlkZXMgYmFzaWMgY2F0YWxvZyBtYW5hZ2VtZW50IG9wZXJhdGlvbnMuXG4gKiBJdCBtYW5hZ2VzIGFsbCBwbGF0Zm9ybSByZXNvdXJjZXMgbmVlZGVkIGZvciBkaWZmZXJlbnQga2luZHMgb2YgY2F0YWxvZ3MgYW5kIG9wZXJhdGlvbnMgb24gdGhlbS5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4xLjdcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25maWdBcGlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGNhdGFsb2cgd2l0aCB0aGUgc3BlY2lmaWVkIEhSTiBleGlzdHMuXG4gKlxuICogQHN1bW1hcnkgQ2hlY2tzIHRoZSBleGlzdGVuY2Ugb2YgYSBjYXRhbG9nXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgVGhlIGBiaWxsaW5nVGFnYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGdyb3VwIGJpbGxpbmdcbiAqIHJlY29yZHMgdG9nZXRoZXIuIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gY2F0YWxvZ0V4aXN0cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jYXRhbG9nRXhpc3RzID0gY2F0YWxvZ0V4aXN0cztcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBjYXRhbG9nIHdpdGggdGhlIHNwZWNpZmllZCBsYXllcnMuIFRoZSBjcmVhdGUgY2F0YWxvZyBvcGVyYXRpb24gcnVucyBhc3luY2hyb25vdXNseS5cbiAqIE9uY2UgeW91J3ZlIHN1Ym1pdHRlZCB0aGUgY2F0YWxvZyBmb3IgY3JlYXRpb24sIHlvdSdsbCByZWNlaXZlIGEgcmFuZG9tbHkgZ2VuZXJhdGVkIHRva2VuIHRoYXQgeW91IGNhbiB1c2UgdG8gbW9uaXRvclxuICogdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uLlxuICpcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBjYXRhbG9nXG4gKiBAcGFyYW0gYm9keSBBIGNhdGFsb2cgb2JqZWN0IHRoYXQgY29udGFpbnMgbWV0YWRhdGEgYW5kIGxheWVyIGRlZmluaXRpb25zLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgVGhlIGBiaWxsaW5nVGFnYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGdyb3VwIGJpbGxpbmdcbiAqIHJlY29yZHMgdG9nZXRoZXIuIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3NcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNyZWF0ZUNhdGFsb2cgPSBjcmVhdGVDYXRhbG9nO1xuLyoqXG4gKiBEZWxldGVzIGEgY2F0YWxvZyBhbmQgYW55IGxheWVycyB3aXRoaW4gdGhhdCBjYXRhbG9nLlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZXMgYSBjYXRhbG9nXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBUaGUgYGJpbGxpbmdUYWdgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgeW91IGNhbiB1c2UgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlQ2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlQ2F0YWxvZyA9IGRlbGV0ZUNhdGFsb2c7XG4vKipcbiAqIERlbGV0ZXMgYSBsYXllciBvZiB0aGUgY2F0YWxvZyBpZiBpdCdzIG9mIGxheWVyVHlwZSAnaW5kZXgnLCAndm9sYXRpbGUnLCBvciAnc3RyZWFtJy4gT3RoZXIgYGxheWVyVHlwZXNgIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgYSBsYXllclxuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZ1xuICogQHBhcmFtIGxheWVySWQgVGhlIGxheWVyIElEXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUxheWVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9jYXRhbG9ncy97Y2F0YWxvZ0hybn0vbGF5ZXJzL3tsYXllcklkfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVMYXllciA9IGRlbGV0ZUxheWVyO1xuLyoqXG4gKiBEaXNhYmxlIGF1dG9tYXRpYyByZXRpcmVkIHZlcnNpb25zIGNsZWFudXAuXG4gKlxuICogQHN1bW1hcnkgRGlzYWJsZSBhdXRvbWF0aWMgdmVyc2lvbiBkZWxldGlvblxuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZy5cbiAqL1xuZnVuY3Rpb24gZGlzYWJsZUF1dG9tYXRpY1ZlcnNpb25EZWxldGlvbihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59L2F1dG9tYXRpY1ZlcnNpb25EZWxldGlvblwiLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGlzYWJsZUF1dG9tYXRpY1ZlcnNpb25EZWxldGlvbiA9IGRpc2FibGVBdXRvbWF0aWNWZXJzaW9uRGVsZXRpb247XG4vKipcbiAqIEdldHMgdGhlIGZ1bGwgY2F0YWxvZyBjb25maWd1cmF0aW9uIGZvciB0aGUgcmVxdWVzdGVkIGNhdGFsb2cuIFRoZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgZGVzY3JpcHRpdmUgYW5kXG4gKiBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgbGF5ZXIgZGVmaW5pdGlvbnMgYW5kIGxheWVyIHR5cGVzLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgdGhlIGRldGFpbHMgb2YgYSBjYXRhbG9nXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBUaGUgYGJpbGxpbmdUYWdgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgeW91IGNhbiB1c2UgdG8gZ3JvdXAgYmlsbGluZ1xuICogcmVjb3JkcyB0b2dldGhlci4gSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBnZXRDYXRhbG9nKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9jYXRhbG9ncy97Y2F0YWxvZ0hybn1cIi5yZXBsYWNlKFwie2NhdGFsb2dIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJjYXRhbG9nSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRDYXRhbG9nID0gZ2V0Q2F0YWxvZztcbi8qKlxuICogVGFrZXMgdGhlIHJhbmRvbWx5IGdlbmVyYXRlZCB0b2tlbiB0aGF0IHlvdSByZWNlaXZlIHdoZW4geW91IHN1Ym1pdCBhIGNhdGFsb2cgZm9yIGNyZWF0aW9uLiBZb3UgY2FuIHVzZSBpdCB0byBtb25pdG9yIHRoZSBzdGF0dXNcbiAqIG9mIHlvdXIgcmVxdWVzdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBzdGF0dXMgb2YgYSBjcmVhdGUsIHVwZGF0ZSBvciBkZWxldGUgY2F0YWxvZyByZXF1ZXN0LlxuICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiBvZiBjYXRhbG9nIGNyZWF0aW9uLCBtb2RpZmljYXRpb24gb3IgZGVsZXRpb24gdGFza1xuICogQHBhcmFtIGJpbGxpbmdUYWcgVGhlIGBiaWxsaW5nVGFnYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3Jkc1xuICogdG9nZXRoZXIuIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2F0YWxvZ1N0YXR1cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvc3RhdHVzL3t0b2tlbn1cIi5yZXBsYWNlKFwie3Rva2VufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widG9rZW5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldENhdGFsb2dTdGF0dXMgPSBnZXRDYXRhbG9nU3RhdHVzO1xuLyoqXG4gKiBMaXN0cyBhbGwgY2F0YWxvZ3MgdGhhdCB5b3VyIGFjY291bnQgaGFzIGFjY2VzcyB0by4gVG8gZ2V0IGFjY2VzcyB0byBhIGNhdGFsb2csIHlvdXIgYWRtaW5pc3RyYXRvciBtdXN0IGFzc29jaWF0ZSB0aGlzIGNhdGFsb2dcbiAqIGluIHlvdXIgSEVSRSBwbGF0Zm9ybSBhY2NvdW50LiBCeSBkZWZhdWx0LCB0aGUgbGlzdCBwcm92aWRlcyBzdW1tYXJ5IGRhdGEgZm9yIGVhY2ggY2F0YWxvZyBzdWNoIGFzIHRoZSB0aXRsZSwgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIFVSTCwgYW5kIHRoZSByZXNvdXJjZSB0eXBlLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgYSBsaXN0IG9mIGFsbCBjYXRhbG9nc1xuICogQHBhcmFtIGJpbGxpbmdUYWcgVGhlIGBiaWxsaW5nVGFnYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3Jkc1xuICogdG9nZXRoZXIuIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsICAgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICogQHBhcmFtIHZlcmJvc2UgSW5kaWNhdGVzIGlmIHRoZSByZXNwb25zZSBzaG91bGQgY29udGFpbiBmdWxseSBleHBhbmRlZCBjYXRhbG9nIGNvbmZpZ3VyYXRpb25zLiBcInRydWVcIiB8IFwiZmFsc2VcIi5cbiAqIEBwYXJhbSBxIFdvcmtzIG9ubHkgd2hlbiB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCB0byB0cnVlLiBUaGUgcmVzdWx0IGNvbnRhaW5zIG9ubHkgdGhvc2UgaXRlbXMgd2hpY2ggaGF2ZSB0aGUgZ2l2ZW4gc3RyaW5nXG4gKiBhcyBhIHBhcnQgb2YgdGhlIHZhbHVlIG9mIG9uZSBvciBtb3JlIHNlYXJjaGFibGUgZmllbGRzIChzdWJzdHJpbmcgY29tcGFyZSkuIEl0IHdpbGwgc2VhcmNoIHRoZSBmb2xsb3dpbmcgY2F0YWxvZyBkZXRhaWxzXG4gKiBmaWVsZHM6IGlkLCBuYW1lLCBzdW1tYXJ5LCBkZXNjcmlwdGlvbiwgdGFncyBhbmQgbGF5ZXIgZGV0YWlsczogaWQsIG5hbWUsIHN1bW1hcnksIGRlc2NyaXB0aW9uLCB0YWdzLCBzY2hlbWEtaHJuXG4gKiBAcGFyYW0gb3JnYW5pc2F0aW9uIFdvcmtzIG9ubHkgd2hlbiB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCB0byB0cnVlLiBGaWx0ZXJzIG9ubHkgY2F0YWxvZ3MgKGxheWVycykgdGhhdCBiZWxvbmcgdG8gYSBzcGVjaWZpZWRcbiAqIG9yZ2FuaXNhdGlvbi4gWW91IGNhbiBmaWx0ZXIgb25seSBieSBjYXRhbG9nIChsYXllcikgb3duZXIgb3JnYW5pc2F0aW9uIElELiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYW4gb3JnYW5pc2F0aW9uLCB0aGUgc2VhcmNoXG4gKiBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIG9yZ2FuaXNhdGlvblR5cGUgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIEZpbHRlcnMgb25seSBjYXRhbG9ncyB0aGF0IGJlbG9uZyB0byBhbiBvcmdhbmlzYXRpb24uXG4gKiBJZiBzZXQgdG8gYGBteU9yZ2FuaXNhdGlvbmBgLCB0aGUgc2VhcmNoIGlzIGZvciBjYXRhbG9ncyAobGF5ZXJzKSB3aXRoIHRoZSBzYW1lIG93bmVyIG9yZ2FuaXNhdGlvbiBJRCBsaWtlIHRoZVxuICogcmVxdWVzdGVyYGBzLiBJZiBzZXQgdG8gYGBoZXJlYGAsIHRoZSBzZWFyY2ggaXMgZm9yIGNhdGFsb2dzIChsYXllcnMpIHdpdGggdGhlIHNhbWUgb3duZXIgb3JnYW5pc2F0aW9uIElEXG4gKiBpcyBlcXVhbCB0byB0aGUgSGVyZSBvcmdhbmlzYXRpb24uIElmIHNldCB0byBgYG90aGVyYGAsIHRoZSBzZWFyY2ggaXMgZm9yIGNhdGFsb2dzIChsYXllcnMpIHdpdGggYW4gb3duZXIgb3JnYW5pc2F0aW9uXG4gKiAgSUQgbm90IGVxdWFsIHRvIHRoZSByZXF1ZXN0ZXIgb3JnYW5pc2F0aW9uIGFuZCBub3QgZXF1YWwgdG8gSEVSRSBvcmdhbmlzYXRpb24uIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbiBvcmdhbmlzYXRpb24sXG4gKiB0aGUgc2VhcmNoIGlzIHVuZmlsdGVyZWQuXG4gKiBAcGFyYW0gbGF5ZXJUeXBlIFdvcmtzIG9ubHkgd2hlbiB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCB0byB0cnVlLiBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsYXllciB0eXBlcyAod2l0aCBPUiBzZW1hbnRpYykgdG8gbG9vayBmb3JcbiAqIGluIHRoZSBsYXllciB0eXBlLiBGaWx0ZXJzIG9ubHkgY2F0YWxvZ3MgdGhhdCBjb250YWluIGxheWVycyB3aXRoIGxheWVyIHR5cGUgcHJlc2VudGVkIGluIGEgZ2l2ZW4gbGlzdC4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgbGF5ZXJcbiAqICB0eXBlLCB0aGUgc2VhcmNoIGlzIHVuZmlsdGVyZWQuXG4gKiBAcGFyYW0gcmVnaW9uIFdvcmtzIG9ubHkgd2hlbiB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCB0byB0cnVlLiBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWdpb25zICh3aXRoIE9SIHNlbWFudGljKSB0byBsb29rIGZvclxuICogIGluIHRoZSBjYXRhbG9nIHJlcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uIEZpbHRlcnMgb25seSBjYXRhbG9ncyB0aGF0IGNvbnRhaW4gcmVnaW9uIHByZXNlbnRlZCBpbiBnaXZlbiBsaXN0LlxuICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgcmVnaW9uLCB0aGUgc2VhcmNoIGlzIHVuZmlsdGVyZWQuXG4gKiBAcGFyYW0gc2NoZW1hSHJuIFdvcmtzIG9ubHkgd2hlbiB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCB0byB0cnVlLiBGaWx0ZXJzIG9ubHkgY2F0YWxvZ3MgKGxheWVycykgYnkgdGhlIHNwZWNpZmllZCBsYXllciBzY2hlbWEgSFJOLlxuICogWW91IGNhbiBvbmx5IGZpbHRlciBieSBsYXllciBzY2hlbWEuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHNjaGVtYSwgdGhlIHNlYXJjaCBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIHJlc291cmNlVHlwZSBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gU3BlY2lmaWVzIG90aGVyIGZpbHRlcnMgYmVoYXZpb3IuIElmIHNldCB0byBgY2F0YWxvZ2AsXG4gKiB0aGlzIGFwcGxpZXMgb3RoZXIgZmlsdGVycyB0byBzZWFyY2ggY2F0YWxvZ3MgKGFuZCBsYXllcnMgaW5zaWRlKS4gSWYgc2V0IHRvIGBsYXllcmAsIHRoaXMgYXBwbGllcyBvdGhlciBmaWx0ZXJzIHRvIHNlYXJjaCBsYXllcnMuXG4gKiBUaGUgcmV0dXJuZWQganNvbiBzdHJ1Y3R1cmUgaXMgdGhlIHNhbWUgZm9yIGJvdGggY2FzZXMgKGxpc3Qgb2YgY2F0YWxvZ3Mgd2l0aCBsaXN0IG9mIGxheWVycyBpbnNpZGUgZWFjaCBjYXRhbG9nKS5cbiAqIEBwYXJhbSBjb3ZlcmFnZSBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY291bnRyaWVzICh3aXRoIE9SIHNlbWFudGljKSB0byBsb29rIGZvclxuICogaW4gdGhlIGNhdGFsb2cgKGxheWVyKSBjb3ZlcmFnZS4gT25seSBjYXRhbG9ncyAobGF5ZXJzKSBjb3ZlcmluZyBzcGVjaWZpZWQgY291bnRyaWVzIHdpbGwgYmUgcmV0dXJuZWQuIFRoaXMgZmlsZWQgaXMgY2FzZS1pbnNlbnNpdGl2ZS5cbiAqIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBjb3ZlcmFnZSwgdGhlIHNlYXJjaCBpbmNsdWRlcyBhbGwgY291bnRyaWVzLlxuICogQHBhcmFtIGFjY2VzcyBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYWNjZXNzIHR5cGVzICh3aXRoIE9SIHNlbWFudGljKVxuICogdG8gZmlsdGVyIHJlc3VsdC4gSWYgc2V0IHRvIGBkZWZhdWx0YCwgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGNhdGFsb2dzIHRoZSB1c2VyIGhhcyByZWFkIG9yIG1hbmFnZSBhY2Nlc3MgdG8uIElmIHNldCB0byBgY3JlYXRlYCxcbiAqIHRoZSByZXNwb25zZSBpbmNsdWRlcyBjYXRhbG9ncyB0aGUgdXNlciBoYXMgY3JlYXRlZCBhbmQgd2hpY2ggbWF0Y2ggdGhlIGBvd25lci5jcmVhdG9yYCBmaWVsZCwgaWYgc2V0IHRvIGBtYW5hZ2VgLFxuICogdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGNhdGFsb2dzIHRoZSB1c2VyIGhhcyBtYW5hZ2UgYWNjZXNzIHRvLiBJZiBzZXQgdG8gYG9yZ0FkbWluYCwgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGNhdGFsb2dzIHRoZSBgT3JnQWRtaW5gXG4gKiB1c2VyIGhhdmUgYWNjZXNzIHRvLlxuICogQHBhcmFtIG1hcmtldHBsYWNlUmVhZHkgSW5kaWNhdGVzIGlmIHRoZSByZXNwb25zZSBzaG91bGQgY29udGFpbiBvbmx5IE1hcmtldHBsYWNlLXJlYWR5IGNhdGFsb2dzLiBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIHRydWUsXG4gKiB0aGUgc2VydmljZSB3aWxsIHJldHVybiBvbmx5IGNhdGFsb2dzIHdpdGggdGhlIGBtYXJrZXRwbGFjZVJlYWR5YCBlbGVtZW50IHNldCB0byB0cnVlLlxuICogQHBhcmFtIGxpbWl0IFdvcmtzIG9ubHkgd2hlbiB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCB0byB0cnVlLiBXaGVuIHNwZWNpZmllZCwgcmVzdWx0IGVsZW1lbnQgY291bnQgd2lsbCBiZSBsaW1pdGVkIHRvIHRoaXMgdmFsdWUuXG4gKiBNaW5pbXVtOiAxLlxuICogQHBhcmFtIHNvcnRCeSBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gU3BlY2lmaWVzIHNvcnQgZmllbGQuIElmIHNldCB0byBgbmFtZWAsIHRoZSByZXNwb25zZSBjb250YWlucyBjYXRhbG9nc1xuICogc29ydGVkIGJ5IGNhdGFsb2cgbmFtZS4gSWYgc2V0IHRvIGBjcmVhdGVkYCwgdGhlIHRoZSByZXNwb25zZSBjb250YWlucyBjYXRhbG9ncyBzb3J0ZWRieSBjYXRhbG9nIGNyZWF0ZSB0aW1lLiBMYXllcnMgaW5zaWRlIGEgY2F0YWxvZ1xuICogYXJlIGFsd2F5cyBzb3J0ZWQgYnkgbGF5ZXIgbmFtZS4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgYHNvcnRCeWAsIHRoZSByZXNwb25zZSBjb250YWlucyBjYXRhbG9ncyBzb3J0ZWQgYnkgYG5hbWVgLlxuICogQHBhcmFtIHNvcnRPcmRlciBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gU3BlY2lmaWVzIHRoZSBzb3J0IG9yZGVyLiBJZiBzZXQgdG8gYGFzY2AsXG4gKiB0aGUgc29ydCBvcmRlciBpcyBhc2NlbmRpbmcuIElmIHNldCB0byBgZGVzY2AsIHRoZSBzb3J0IG9yZGVyIGlzIGRlc2NlbmRpbmcuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBgc29ydE9yZGVyYCxcbiAqIHRoZSBzb3J0IG9yZGVyIGlzIGFzY2VuZGluZy5cbiAqIEBwYXJhbSBsaW5rYWJsZSBJbmRpY2F0ZXMgaWYgdGhlIHJlc3BvbnNlIHNob3VsZCBvbmx5IHJldHVybiB0aGUgbGlzdCBvZiBsaW5rYWJsZSBjYXRhbG9ncy4gIE5vdGU6IC0gSWYgc2V0IHRvXG4gKiBgdHJ1ZWAgYW5kIHRoZSBhY2Nlc3MgdG9rZW4gaGFzIGEgcHJvamVjdCBzY29wZSwgdGhlbiB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlIHRoZSBjYXRhbG9nc1xuICogdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIgdG8gbGluayB0byB0aGUgcHJvamVjdCBpbiB0aGUgdG9rZW5gcyBwcm9qZWN0IHNjb3BlIGFuZCBIRVJFIHB1YmxpYyBjYXRhbG9ncy5cbiAqIC0gSWYgc2V0IHRvIGB0cnVlYCBhbmQgdGhlIGFjY2VzcyB0b2tlbiBoYXMgbm8gc2NvcGUsIHRoZW4gdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSBhbGwgSEVSRSBwdWJsaWMgY2F0YWxvZ3Mgb25seS5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2F0YWxvZ3MoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInZlcmJvc2VcIiwgcGFyYW1zW1widmVyYm9zZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJxXCIsIHBhcmFtc1tcInFcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwib3JnYW5pc2F0aW9uXCIsIHBhcmFtc1tcIm9yZ2FuaXNhdGlvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJvcmdhbmlzYXRpb25UeXBlXCIsIHBhcmFtc1tcIm9yZ2FuaXNhdGlvblR5cGVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGF5ZXJUeXBlXCIsIHBhcmFtc1tcImxheWVyVHlwZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWdpb25cIiwgcGFyYW1zW1wicmVnaW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNjaGVtYUhyblwiLCBwYXJhbXNbXCJzY2hlbWFIcm5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVzb3VyY2VUeXBlXCIsIHBhcmFtc1tcInJlc291cmNlVHlwZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3ZlcmFnZVwiLCBwYXJhbXNbXCJjb3ZlcmFnZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJhY2Nlc3NcIiwgcGFyYW1zW1wiYWNjZXNzXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm1hcmtldHBsYWNlUmVhZHlcIiwgcGFyYW1zW1wibWFya2V0cGxhY2VSZWFkeVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzb3J0QnlcIiwgcGFyYW1zW1wic29ydEJ5XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNvcnRPcmRlclwiLCBwYXJhbXNbXCJzb3J0T3JkZXJcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGlua2FibGVcIiwgcGFyYW1zW1wibGlua2FibGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldENhdGFsb2dzID0gZ2V0Q2F0YWxvZ3M7XG4vKipcbiAqIE1vZGlmeSBzb21lIGZpZWxkcyBvZiB0aGUgY2F0YWxvZy4gVGhlIGV4aXN0aW5nIEhUVFAgUFVUIG1ldGhvZCBvbmx5IGFsbG93cyBhIGNvbXBsZXRlIHJlcGxhY2VtZW50IG9mIGEgY2F0YWxvZyBjb25maWd1cmF0aW9uLFxuICogSFRUUCBQQVRDSCBtZXRob2QgaXMgdXNlZCB0byBtb2RpZnkgc29tZSBmaWVsZHMgb2YgZXhpc3RpbmcgY2F0YWxvZyBjb25maWd1cmF0aW9uLiBBbGwgZmllbGRzIGFyZSBvcHRpb25hbC5cbiAqIFNwZWNpZnkgZmllbGQgdmFsdWUgdG8gbW9kaWZ5IGl0LCBub3Qgc3BlY2lmaWVkIGZpZWxkcyBhcmUgaWdub3JlZC4gVG8gcmVtb3ZlIHRoZSBmaWVsZCB2YWx1ZSB1c2UgdGhlIG51bGwgdmFsdWUuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFJGQyA3Mzk2IC0gSlNPTiBNZXJnZSBQYXRjaC5cbiAqXG4gKiBAc3VtbWFyeSBNb2RpZnkgYSBjYXRhbG9nXG4gKiBAcGFyYW0gYm9keSBBIGNhdGFsb2cgb2JqZWN0IHRoYXQgY29udGFpbnMgbW9kaWZpY2F0aW9uIG9mIGNhdGFsb2cgY29uZmlndXJhdGlvblxuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZ1xuICovXG5mdW5jdGlvbiBwYXRjaENhdGFsb2coYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzL3tjYXRhbG9nSHJufVwiLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnBhdGNoQ2F0YWxvZyA9IHBhdGNoQ2F0YWxvZztcbi8qKlxuICogTW9kaWZ5IHNvbWUgZmllbGRzIG9mIHRoZSBjYXRhbG9nIGxheWVyLiBIVFRQIFBBVENIIG1ldGhvZCBpcyB1c2VkIHRvIG1vZGlmeSBzb21lIGZpZWxkcyBvZiBleGlzdGluZyBsYXllciBjb25maWd1cmF0aW9uLlxuICogQWxsIGZpZWxkcyBhcmUgb3B0aW9uYWwuIFNwZWNpZnkgZmllbGQgdmFsdWUgdG8gbW9kaWZ5IGl0LCBub3Qgc3BlY2lmaWVkIGZpZWxkcyBhcmUgaWdub3JlZC4gVG8gcmVtb3ZlIHRoZSBmaWVsZCB2YWx1ZSB1c2UgdGhlIG51bGxcbiAqIHZhbHVlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgUkZDIDczOTYgLSBKU09OIE1lcmdlIFBhdGNoLlxuICpcbiAqIEBzdW1tYXJ5IE1vZGlmeSBhIGNhdGFsb2cgbGF5ZXJcbiAqIEBwYXJhbSBib2R5IEEgbGF5ZXIgb2JqZWN0IHRoYXQgY29udGFpbnMgbW9kaWZpY2F0aW9uIG9mIGxheWVyIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSBjYXRhbG9nSHJuIFRoZSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgb2YgdGhlIGNhdGFsb2dcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBsYXllciBJRFxuICovXG5mdW5jdGlvbiBwYXRjaExheWVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9jYXRhbG9ncy97Y2F0YWxvZ0hybn0vbGF5ZXJzL3tsYXllcklkfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucGF0Y2hMYXllciA9IHBhdGNoTGF5ZXI7XG4vKipcbiAqIFVwZGF0ZXMgYW55IGRlc2NyaXB0aXZlIGFuZCBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGluIHRoZSBjYXRhbG9nLiBUbyB1cGRhdGUgYSBjYXRhbG9nLCBzZW5kIGEgbmV3IHZlcnNpb24gb2YgeW91ciBjYXRhbG9nXG4gKiBjb25maWd1cmF0aW9uIHdpdGggdGhlIHVwZGF0ZWQgZGF0YSBhbmQgYW55IHJlcXVpcmVkIGZpZWxkcy5cbiAqXG4gKiBAc3VtbWFyeSBVcGRhdGVzIGEgY2F0YWxvZ1xuICogQHBhcmFtIGJvZHkgQSBjYXRhbG9nIG9iamVjdCB0aGF0IGNvbnRhaW5zIG1ldGFkYXRhIGFuZCBsYXllciBkZWZpbml0aW9ucy5cbiAqIEBwYXJhbSBjYXRhbG9nSHJuIFRoZSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgb2YgdGhlIGNhdGFsb2dcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUNhdGFsb2coYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzL3tjYXRhbG9nSHJufVwiLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBkYXRlQ2F0YWxvZyA9IHVwZGF0ZUNhdGFsb2c7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlVGltZU1hcCA9IGV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlVGlsZSA9IGV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlU3VtbWFyeSA9IGV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlU2l6ZU1hcCA9IGV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlQWRtaW5BcmVhcyA9IHZvaWQgMDtcbi8qKlxuICogU3RhdGlzdGljcyBBUElcbiAqIEFQSSB0byByZXRyaWV2ZSBzdGF0aXN0aWNzIGZvciB0aGUgZGF0YSBjb3ZlcmFnZSBvZiB0aGUgSEVSRSBwbGF0Zm9ybSBjYXRhbG9ncy5cbiAqICBJdCBzaG93cyB3aGVyZSBkYXRhIGV4aXN0cywgZnJlc2huZXNzIG9mIHRoZSBkYXRhIGFuZCBvdGhlciBzdGF0aXN0aWNzXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDIuMC4wXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEYXRhQ292ZXJhZ2VDb3JlQVBJc0FwaVxuICovXG4vKipcbiAqXG4gKlxuICogQHN1bW1hcnkgUmV0cmlldmUgQWRtaW4gQXJlYXMgc2hvd2luZyBEYXRhQ292ZXJhZ2UgaW4gd29ybGQgZm9yIHByb3ZpZGVkIGxheWVyIElkIGFuZCB2ZXJzaW9uXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgTGF5ZXIgSWRlbnRpZmllclxuICogQHBhcmFtIGRhdGFsZXZlbCBUaWxlIGxldmVsLiBDdXJyZW50bHksIHNob3VsZCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gbGV2ZWwgMTFcbiAqL1xuZnVuY3Rpb24gZ2V0RGF0YUNvdmVyYWdlQWRtaW5BcmVhcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9hZG1pbmFyZWFzXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImRhdGFsZXZlbFwiLCBwYXJhbXNbXCJkYXRhbGV2ZWxcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldERhdGFDb3ZlcmFnZUFkbWluQXJlYXMgPSBnZXREYXRhQ292ZXJhZ2VBZG1pbkFyZWFzO1xuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIFNpemVNYXAgZGF0YSBzaG93aW5nIERhdGFDb3ZlcmFnZSBpbiB3b3JsZCBmb3IgcHJvdmlkZWRcbiAqIGxheWVyIGlkIGFuZCB2ZXJzaW9uLiBBUEkgc2hvd3MgaGVhdG1hcCBiYXNlZCBvbiB0aGUgcGFydGl0aW9uIHNpemVcbiAqIEBwYXJhbSBsYXllcklkIFVuaXF1ZSBMYXllciBJZGVudGlmaWVyXG4gKiBAcGFyYW0gZGF0YWxldmVsIFRpbGUgbGV2ZWwuIEN1cnJlbnRseSwgc2hvdWxkIGJlIGVxdWFsIG9yIGxlc3MgdGhhbiBsZXZlbCAxMVxuICovXG5mdW5jdGlvbiBnZXREYXRhQ292ZXJhZ2VTaXplTWFwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2hlYXRtYXAvc2l6ZVwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJkYXRhbGV2ZWxcIiwgcGFyYW1zW1wiZGF0YWxldmVsXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlU2l6ZU1hcCA9IGdldERhdGFDb3ZlcmFnZVNpemVNYXA7XG4vKipcbiAqXG4gKlxuICogQHN1bW1hcnkgUmV0cmlldmUgTGF5ZXIgc2l6ZSBkYXRhIGZvciBwcm92aWRlZCBsYXllciBpZCBhbmQgdmVyc2lvblxuICogQHBhcmFtIGxheWVySWQgVW5pcXVlIExheWVyIElkZW50aWZpZXJcbiAqL1xuZnVuY3Rpb24gZ2V0RGF0YUNvdmVyYWdlU3VtbWFyeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9zdW1tYXJ5XCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXREYXRhQ292ZXJhZ2VTdW1tYXJ5ID0gZ2V0RGF0YUNvdmVyYWdlU3VtbWFyeTtcbi8qKlxuICpcbiAqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZSBCaXRNYXAgc2hvd2luZyBEYXRhQ292ZXJhZ2UgaW4gd29ybGQgZm9yIHByb3ZpZGVkIGxheWVyIGlkIGFuZCB2ZXJzaW9uLlxuICogQVBJIHNob3dzIGRhdGEgY292ZXJhZ2UgYnkgcGFydGl0aW9ucywgc28gdGhlIHVzZXIgY2FuIHNlZSB3aGVyZSBvbiB0aGUgd29ybGQgbWFwIHRoZXJlIGlzIGEgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBjYXRhbG9nIGxheWVyXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgTGF5ZXIgSWRlbnRpZmllclxuICogQHBhcmFtIGRhdGFsZXZlbCBUaWxlIGxldmVsLiBDdXJyZW50bHksIHNob3VsZCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gbGV2ZWwgMTFcbiAqL1xuZnVuY3Rpb24gZ2V0RGF0YUNvdmVyYWdlVGlsZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS90aWxlbWFwXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImRhdGFsZXZlbFwiLCBwYXJhbXNbXCJkYXRhbGV2ZWxcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXREYXRhQ292ZXJhZ2VUaWxlID0gZ2V0RGF0YUNvdmVyYWdlVGlsZTtcbi8qKlxuICpcbiAqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZSBUaW1lTWFwIHNob3dpbmcgRGF0YUNvdmVyYWdlIGluIHdvcmxkIGZvciBwcm92aWRlZCBsYXllciBpZCBhbmQgdmVyc2lvblxuICogQHBhcmFtIGxheWVySWQgVW5pcXVlIExheWVyIElkZW50aWZpZXJcbiAqIEBwYXJhbSBkYXRhbGV2ZWwgVGlsZSBsZXZlbC4gQ3VycmVudGx5LCBzaG91bGQgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGxldmVsIDExXG4gKi9cbmZ1bmN0aW9uIGdldERhdGFDb3ZlcmFnZVRpbWVNYXAoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vaGVhdG1hcC9hZ2VcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZGF0YWxldmVsXCIsIHBhcmFtc1tcImRhdGFsZXZlbFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjYXRhbG9nSFJOXCIsIHBhcmFtc1tcImNhdGFsb2dIUk5cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXREYXRhQ292ZXJhZ2VUaW1lTWFwID0gZ2V0RGF0YUNvdmVyYWdlVGltZU1hcDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wZXJmb3JtVXBkYXRlID0gZXhwb3J0cy5wZXJmb3JtUXVlcnkgPSBleHBvcnRzLmluc2VydEluZGV4ZXMgPSB2b2lkIDA7XG4vKipcbiAqIEluZGV4IEFQSSB2MVxuICogVXNlIHRoZSBgaW5kZXhgIHNlcnZpY2UgdG8gZ2V0IHRoZSBkYXRhIGhhbmRsZXMgb2YgdGhlIHBhcnRpdGlvbnMgdGhhdCBtYXRjaCBhIHF1ZXJ5LlxuICogVGhlbiwgdXNlIHRoZSBkYXRhIGhhbmRsZXMgd2l0aCB0aGUgYGJsb2JgIHNlcnZpY2UgdG8gZ2V0IHRoZSBkYXRhIGZyb20gdGhlIHBhcnRpdGlvbnMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbixcbiAqIHNlZSBbR2V0IERhdGEgZnJvbSBhbiBJbmRleCBMYXllcl0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLXN0b3JlL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLWluZGV4Lmh0bWwpLlxuICogWW91IGNhbiBhbHNvIHVzZSB0aGUgYGluZGV4YCBzZXJ2aWNlIHRvIHB1Ymxpc2ggZGF0YSB0byBhbiBpbmRleCBsYXllci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1B1Ymxpc2ggdG8gYW4gSW5kZXggTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1zdG9yZS9kYXRhX2Rldl9ndWlkZS9yZXN0L3B1Ymxpc2hpbmctZGF0YS1pbmRleC5odG1sKS5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluZGV4QXBpXG4gKi9cbi8qKlxuICogQWRkcyBpbmRleCBkYXRhIGZvciBhIGdpdmVuIGRhdGEgYmxvYiB0byBhbiBpbmRleCBsYXllci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1B1Ymxpc2ggdG8gYW4gSW5kZXggTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1zdG9yZS9kYXRhX2Rldl9ndWlkZS9yZXN0L3B1Ymxpc2hpbmctZGF0YS1pbmRleC5odG1sKS5cbiAqXG4gKiBAc3VtbWFyeSBJbnNlcnRzIGluZGV4IGRhdGEgdG8gYW4gaW5kZXggbGF5ZXJcbiAqIEBwYXJhbSBpbmRleGVzIEFuIGFycmF5IG9mIGluZGV4IGF0dHJpYnV0ZXMgYW5kIHZhbHVlcyB0byBiZSBpbnNlcnRlZC5cbiAqIEBwYXJhbSBsYXllcklEIFRoZSBsYXllciBJRCBvZiB0aGUgaW5kZXggbGF5ZXIuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEluZGV4ZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJRH1cIi5yZXBsYWNlKFwie2xheWVySUR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklEXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJpbmRleGVzXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImluZGV4ZXNcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmluc2VydEluZGV4ZXMgPSBpbnNlcnRJbmRleGVzO1xuLyoqXG4gKiBRdWVyaWVzIHRoZSBpbmRleCBsYXllciBmb3IgdGhlIHBhcnRpdGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkuXG4gKiBSZXR1cm5zIGVhY2ggcGFydGl0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgcXVlcnksIGluY2x1ZGluZyBlYWNoIHBhcnRpdGlvbidzIGRhdGEgaGFuZGxlLFxuICogd2hpY2ggeW91IHVzZSB3aXRoIHRoZSBgYmxvYmAgQVBJIHRvIHJldHJpZXZlIGRhdGEgZm9yIGVhY2ggcGFydGl0aW9uLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgdGhlIHBhcnRpdGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnlcbiAqIEBwYXJhbSBsYXllcklEIFRoZSBJRCBvZiB0aGUgaW5kZXggbGF5ZXIgeW91IHdhbnQgdG8gcXVlcnkuXG4gKiBAcGFyYW0gcXVlcnkgQW4gUlNRTCBxdWVyeSB0byB1c2UgdG8gcmV0cmlldmUgcGFydGl0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbiAqIFtHZXQgRGF0YSBmcm9tIGFuIEluZGV4IExheWVyXShodHRwczovL2RldmVsb3Blci5oZXJlLmNvbS9kb2N1bWVudGF0aW9uL2RhdGEtc3RvcmUvZGF0YV9kZXZfZ3VpZGUvcmVzdC9nZXR0aW5nLWRhdGEtaW5kZXguaHRtbCkuXG4gKiBUaGUgcXVlcnkgbXVzdCB1c2UgdGhlIGluZGV4aW5nIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiB0aGUgaW5kZXggbGF5ZXIuXG4gKiBAcGFyYW0gaHVnZSBTZXQgdG8gdHJ1ZSBmb3IgaHVnZSBxdWVyeS5cbiAqL1xuZnVuY3Rpb24gcGVyZm9ybVF1ZXJ5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySUR9XCIucmVwbGFjZShcIntsYXllcklEfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJRFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImh1Z2VcIiwgcGFyYW1zW1wiaHVnZVwiXSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInF1ZXJ5XCIsIHBhcmFtc1tcInF1ZXJ5XCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wZXJmb3JtUXVlcnkgPSBwZXJmb3JtUXVlcnk7XG4vKipcbiAqIE1vZGlmaWVzIHBhcnRpdGlvbnMgaW4gYW4gaW5kZXggbGF5ZXIuXG4gKlxuICogQHN1bW1hcnkgVXBkYXRlcyBpbmRleCBsYXllciBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gbGF5ZXJJRCBUaGUgbGF5ZXIgSUQgb2YgdGhlIGluZGV4IGxheWVyLlxuICogQHBhcmFtIHJlcXVlc3QgQ29udGFpbnMgdGhlIGRhdGEgeW91IHdhbnQgdG8gYWRkIG9yIHJlbW92ZSBmcm9tIHRoZSBpbmRleCBsYXllclxuICovXG5mdW5jdGlvbiBwZXJmb3JtVXBkYXRlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySUR9XCIucmVwbGFjZShcIntsYXllcklEfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJRFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJyZXF1ZXN0XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcInJlcXVlc3RcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnBlcmZvcm1VcGRhdGUgPSBwZXJmb3JtVXBkYXRlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIxIEhFUkUgRXVyb3BlIEIuVi4gYW5kIGl0cyBhZmZpbGlhdGUocykuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBjb250YWluIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uXG4gKiBjb250cm9sbGVkIGJ5IEhFUkUgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGVnaXNsYXRpb24uXG4gKiBBbnkgdXNlIGFuZCB1dGlsaXphdGlvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgYW5kXG4gKiBkaXNjbG9zdXJlIHRvIGFueSB0aGlyZCBwYXJ0aWVzIGlzIGNvbmRpdGlvbmFsIHVwb24gaGF2aW5nIGEgc2VwYXJhdGVcbiAqIGFncmVlbWVudCB3aXRoIEhFUkUgZm9yIHRoZSBhY2Nlc3MsIHVzZSwgdXRpbGl6YXRpb24gb3IgZGlzY2xvc3VyZSBvZiB0aGlzXG4gKiBzb2Z0d2FyZS4gSW4gdGhlIGFic2VuY2Ugb2Ygc3VjaCBhZ3JlZW1lbnQsIHRoZSB1c2Ugb2YgdGhlIHNvZnR3YXJlIGlzIG5vdFxuICogYWxsb3dlZC5cbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnB1dEZlYXR1cmVzID0gZXhwb3J0cy5wdXRGZWF0dXJlID0gZXhwb3J0cy5wb3N0RmVhdHVyZXMgPSBleHBvcnRzLnBhdGNoRmVhdHVyZSA9IGV4cG9ydHMuZGVsZXRlRmVhdHVyZXMgPSBleHBvcnRzLmRlbGV0ZUZlYXR1cmUgPSBleHBvcnRzLnNlYXJjaEZlYXR1cmVzID0gZXhwb3J0cy5pdGVyYXRlRmVhdHVyZXMgPSBleHBvcnRzLmdldFN0YXRpc3RpY3MgPSBleHBvcnRzLmdldEZlYXR1cmVzQnlUaWxlID0gZXhwb3J0cy5nZXRGZWF0dXJlc0J5U3BhdGlhbFBvc3QgPSBleHBvcnRzLmdldEZlYXR1cmVzQnlTcGF0aWFsID0gZXhwb3J0cy5nZXRGZWF0dXJlc0J5QkJveCA9IGV4cG9ydHMuZ2V0RmVhdHVyZXMgPSBleHBvcnRzLmdldEZlYXR1cmUgPSBleHBvcnRzLmdldEhlYWx0aCA9IGV4cG9ydHMuZ2V0QXBpVmVyc2lvbiA9IHZvaWQgMDtcbi8qKlxuICogSW50ZXJhY3RpdmUgQVBJIHYxXG4gKiBJbnRlcmFjdGl2ZSBBUEkgdjEgaXMgYSBSRVNUIEFQSSBmb3Igc2ltcGxlIGFjY2VzcyB0byBnZW8gZGF0YS5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqL1xuLy8gdHNsaW50OmRpc2FibGU6YXJyYXktdHlwZVxuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyoqXG4gKiBSZXRyaWV2ZXMgQVBJIFNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbi5cbiAqL1xuZnVuY3Rpb24gZ2V0QXBpVmVyc2lvbihidWlsZGVyKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25cIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0QXBpVmVyc2lvbiA9IGdldEFwaVZlcnNpb247XG4vKipcbiAqIFRlc3RzIGJhc2ljIGhlYWx0aCBvZiB0aGUgc2VydmljZS5cbiAqL1xuZnVuY3Rpb24gZ2V0SGVhbHRoKGJ1aWxkZXIpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvaGVhbHRoXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEhlYWx0aCA9IGdldEhlYWx0aDtcbi8qKlxuICogUmV0cmlldmVzIHRoZSBmZWF0dXJlIHdpdGggdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgZmVhdHVyZSBieSBJRC5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIGZlYXR1cmUgaW4gdGhlIGxheWVyLlxuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb24gQSBsaXN0IG9mIHByb3BlcnRpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZlYXR1cmVzIHJlc3VsdCBsaXN0LlxuICogTXVsdGlwbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGNvbW1hKCwpLlxuICogRXhhbXBsZTogYD9zZWxlY3Rpb249cC5uYW1lLHAuY2FwYWNpdHkscC5jb2xvcmAuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIGB0cnVlYCB0aGUgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlIHdpbGwgaGF2ZSBvbmx5IFgncyBhbmQgWSdzIGFzIGNvb3JkaW5hdGVzLlxuICovXG5mdW5jdGlvbiBnZXRGZWF0dXJlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzL3tmZWF0dXJlSWR9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2ZlYXR1cmVJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImZlYXR1cmVJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZm9yY2UyRFwiLCBwYXJhbXNbXCJmb3JjZTJEXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRGZWF0dXJlID0gZ2V0RmVhdHVyZTtcbi8qKlxuICogUmV0dXJucyBhbGwgb2YgdGhlIGZlYXR1cmVzIGZvdW5kIGZvciB0aGUgcHJvdmlkZWQgbGlzdCBvZiBpZHMuXG4gKiBUaGUgcmVzcG9uc2UgaXMgYWx3YXlzIGEgRmVhdHVyZUNvbGxlY3Rpb24sIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGZlYXR1cmVzIHdpdGggdGhlIHByb3ZpZGVkIGlkcy5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZmVhdHVyZXMgYnkgSUQuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGlkIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdW5pcXVlIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gKiBUaGVzZSBhcmUgdGhlIGFjY2VwdGFibGUgZm9ybWF0cyBmb3IgdGhpcyBmaWVsZDpcbiAqIGBgYFxuICogaWQ9dmFsdWUxLHZhbHVlMlxuICogYGBgXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvbiBBIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmVhdHVyZXMgcmVzdWx0IGxpc3QuXG4gKiBNdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgY29tbWEoLCkuXG4gKiBFeGFtcGxlOiBgP3NlbGVjdGlvbj1wLm5hbWUscC5jYXBhY2l0eSxwLmNvbG9yYC5cbiAqXG4gKiBAcGFyYW0gZm9yY2UyRCBJZiBzZXQgdG8gYHRydWVgIHRoZSBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBoYXZlIG9ubHkgWCdzIGFuZCBZJ3MgYXMgY29vcmRpbmF0ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldEZlYXR1cmVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImlkXCIsIHBhcmFtc1tcImlkXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZm9yY2UyRFwiLCBwYXJhbXNbXCJmb3JjZTJEXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRGZWF0dXJlcyA9IGdldEZlYXR1cmVzO1xuLyoqXG4gKiBSZXR1cm4gdGhlIGZlYXR1cmVzIHdoaWNoIGFyZSBpbnNpZGUgYSBib3VuZGluZyBib3ggc3RpcHVsYXRlZCBieSBiYm94IHBhcmFtZXRlci5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZmVhdHVyZXMgYnkgYm91bmRpbmcgYm94LlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICpcbiAqIEBwYXJhbSBiYm94IEJvdGggd2VzdCwgc291dGgsIGVhc3QgYW5kIG5vcnRoIGNvb3JkaW5hdGVzIHNlcGFyYXRlZCBieSBjb21tYS5cbiAqIEV4YW1wbGU6IGBiYm94PTEzLjA4Miw1Mi40MTYsMTMuNjI4LDUyLjYyNmAgLSBCb3VuZGluZyBib3ggb2YgQmVybGluLlxuICpcbiAqIEBwYXJhbSBjbGlwIElmIHNldCB0byB0cnVlIHRoZSBmZWF0dXJlcycgZ2VvbWV0cmllcyBhcmUgY2xpcHBlZCB0byB0aGUgZ2VvbWV0cnkgb2YgdGhlXG4gKiB0aWxlIG9yIGJvdW5kaW5nIGJveC4gRGVmYXVsdCBpcyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS4gRGVmYXVsdCBpcyAzMDAwMC4gSGFyZCBsaW1pdCBpcyAxMDAwMDAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIGZlYXR1cmUgZmlsdGVycyB3aGljaCBjb21wYXJlcyB0aGUgZmVhdHVyZSdzIHByb3BlcnR5J3MgdmFsdWUgd2l0aCB0aGUgb25lIHNwZWNpZmllZFxuICogaW4gdGhlIHF1ZXJ5LCByZXN1bHRpbmcgaW4gYSBzdWJzZXQgb2YgZmVhdHVyZXMuXG4gKiBUaGUgdXNhZ2Ugb2YgbXVsdGlwbGUgcHJvcGVydHkgbmFtZXMgcmVwcmVzZW50cyBhbiBBTkQgb3BlcmF0aW9uLlxuICogVGhlIHVzYWdlIG9mIGEgY29tbWEgKCwpIHNlcGFyYXRpbmcgdGhlIHByb3BlcnRpZXMgdmFsdWVzLCByZXByZXNlbnRzIGFuIE9SIG9wZXJhdGlvbi5cbiAqIFByb3BlcnRpZXMgaW5pdGlhdGVkIHdpdGggJ2YuJyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIHdoaWNoIGFyZSBhZGRlZCBieSBkZWZhdWx0IGluIHRoZSBzdG9yZWQgZmVhdHVyZS5cbiAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiAnZi5pZCcsICdmLmNyZWF0ZWRBdCcgYW5kICdmLnVwZGF0ZWRBdCcuXG4gKiBQcm9wZXJ0aWVzIGluaXRpYXRlZCB3aXRoICdwLicgYXJlIHVzZWQgdG8gYWNjZXNzIHZhbHVlcyBpbiB0aGUgc3RvcmVkIGZlYXR1cmUgd2hpY2ggYXJlIHVuZGVyIHRoZSAncHJvcGVydGllcycgcHJvcGVydHkuXG4gKiBVc2UgaXQgYXMgYSBzaG9ydGhhbmQgYWNjZXNzb3IgZm9yICdwcm9wZXJ0aWVzJyB2YWx1ZXMuXG4gKiBUaGUgZm9ybWF0IHNob3VsZCBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24gYmVsb3dcbiAqIGBgYFxuICogP3AucHJvcGVydHlfbmFtZV8xPXByb3BlcnR5X3ZhbHVlXzEmZi5zcGVjaWFsX3Byb3BlcnR5X25hbWVfMT1zcGVjaWFsX3Byb3BlcnR5X3ZhbHVlXzFcbiAqIGBgYFxuICpcbiAqIEZvciBleGFtcGxlLCB0aGUgYWJvdmUgcXVlcnksIHRoZSBGZWF0dXJlcyB3aWxsIGJlIGZpbHRlcmVkIGJ5ICdwcm9wZXJ0eScgQU5EICdzcGVjaWFsIHByb3BlcnR5JyBlcXVhbHMgdG8gdGhlaXJcbiAqIHJlc3BlY3RpdmUgdmFsdWVzLlxuICpcbiAqIFdoaWxlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBgYGA/cC5wcm9wZXJ0eV9uYW1lXzE9dmFsdWVfMSx2YWx1ZV8yYGBgXG4gKiBUaGUgcmVzdWx0aW5nIEZlYXR1cmVzIGxpc3Qgd2lsbCBjb250YWluIGFsbCBlbGVtZW50cyBoYXZpbmcgYHZhbHVlXzFgIE9SIGB2YWx1ZV8yYC5cbiAqXG4gKiBBZGRpdGlvbmFsbHkgdG8gdGhlIG9wZXJhdG9ycyB1c2VkIGluIHRoZSBleGFtcGxlcyBhYm92ZSwgdGhlIHF1ZXJ5IGNhbiBiZSB3cml0dGVuLCB3aXRoIHRoZSBzYW1lIHNlbWFudGljLFxuICogYnkgdXNpbmcgdGhlIGxvbmcgb3BlcmF0b3JzOiBgXCI9Z3RlPVwiLCBcIj1sdGU9XCIsIFwiPWd0PVwiLCBcIj1sdD1cIiBhbmQgXCI9Y3M9XCJgLlxuICpcbiAqIFRoZSBiZWxvdyBxdWVyaWVzIHlpZWxkIHRoZSBzYW1lIHJlc3VsdDpcbiAqIGBgYFxuICogP3AucHJvcGVydHlfbmFtZV8xPj0xMFxuICogP3AucHJvcGVydHlfbmFtZV8xPWd0ZT0xMFxuICogYGBgXG4gKlxuICogVGhlIGF2YWlsYWJsZSBvcGVyYXRvcnMgYXJlOlxuICogXCI9XCIgLSBlcXVhbHNcbiAqIFwiIT1cIiAtIG5vdCBlcXVhbHNcbiAqIFwiPj1cIiBvciBcIj1ndGU9XCIgLSBncmVhdGVyIHRoYW4gb3IgZXF1YWxzXG4gKiBcIjw9XCIgb3IgXCI9bHRlPVwiIC0gbGVzcyB0aGFuIG9yIGVxdWFsc1xuICogXCI+XCIgb3IgXCI9Z3Q9XCIgLSBncmVhdGVyIHRoYW5cbiAqIFwiPFwiIG9yIFwiPWx0PVwiIC0gbGVzcyB0aGFuXG4gKiBcIkA+XCIgb3IgXCI9Y3M9XCIgLSBjb250YWluc1xuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb24gQSBsaXN0IG9mIHByb3BlcnRpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZlYXR1cmVzIHJlc3VsdCBsaXN0LlxuICogTXVsdGlwbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGNvbW1hKCwpLlxuICogRXhhbXBsZTogYD9zZWxlY3Rpb249cC5uYW1lLHAuY2FwYWNpdHkscC5jb2xvcmAuXG4gKlxuICogQHBhcmFtIHNraXBDYWNoZSBJZiBzZXQgdG8gdHJ1ZSB0aGUgcmVzcG9uc2UgaXMgbm90IHJldHVybmVkIGZyb20gY2FjaGUuIERlZmF1bHQgaXMgZmFsc2UuXG4gKlxuICogQHBhcmFtIGNsdXN0ZXJpbmcgVGhlIGNsdXN0ZXJpbmcgYWxnb3JpdGhtIHRvIGFwcGx5IHRvIHRoZSBkYXRhIHdpdGhpbiB0aGUgcmVzdWx0LlxuICogUHJvdmlkaW5nIHRoaXMgcXVlcnkgcGFyYW1ldGVyIHRoZSBkYXRhIHdpbGwgYmUgcmV0dXJuZWQgaW4gYSBjbHVzdGVyZWQgd2F5LlxuICogVGhpcyBtZWFucyB0aGUgZGF0YSB3b24ndCBuZWNlc3NhcmlseSBiZSByZXR1cm5lZCBpbiBpdHMgb3JpZ2luYWwgc2hhcGUgb3Igd2l0aCBpdHMgb3JpZ2luYWwgcHJvcGVydGllcy5cbiAqIERlcGVuZGluZyBvbiB0aGUgY2hvc2VuIGNsdXN0ZXJpbmcgYWxnb3JpdGhtIHRoZXJlIGNvdWxkIGJlIGRpZmZlcmVudCBtYW5kYXRvcnkgYW5kL29yIG9wdGlvbmFsIHBhcmFtZXRlcnNcbiAqIHRvIHNwZWNpZnkgdGhlIGJlaGF2aW9yIG9mIHRoZSBhbGdvcml0aG0uXG4gKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICpcbiAqIGBoZXhiaW5gIC0gVGhlIGhleGJpbiBhbGdvcml0aG0gZGl2aWRlcyB0aGUgd29ybGQgaW4gaGV4YWdvbmFsIFwiYmluc1wiIG9uIGEgc3BlY2lmaWVkIHJlc29sdXRpb24uXG4gKiBFYWNoIGhleGFnb24gaGFzIGFuIGFkZHJlc3MgYmVpbmcgZGVzY3JpYmVkIGJ5IHRoZSBIMyBhZGRyZXNzaW5nIHNjaGVtZS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoYXQgdG9waWMgc2VlOiBodHRwczovL2VuZy51YmVyLmNvbS9oMy8uXG4gKlxuICogYHF1YWRiaW5gIC0gVGhlIHF1YWRiaW4gYWxnb3JpdGhtIHRha2VzIHRoZSBnZW9tZXRyeSBpbnB1dCBmcm9tIHRoZSByZXF1ZXN0IChlLmcuIHF1YWRrZXkgLyBiYm94Li4pXG4gKiBhbmQgY291bnQgdGhlIGZlYXR1cmVzIGluIGl0LlxuICogVGhpcyBjbHVzdGVyaW5nIG1vZGUgd29ya3MgYWxzbyBmb3IgdmVyeSBsYXJnZSBsYXllcnMgYW5kIGNhbiBiZSB1c2VkIGZvciBnZXR0aW5nIGFuIG92ZXJ2aWV3XG4gKiB3aGVyZSBkYXRhIGlzIHByZXNlbnQgaW4gYSBnaXZlbiBsYXllci4gRnVydGhlcm1vcmUsIGEgcHJvcGVydHkgZmlsdGVyIG9uIG9uZSBwcm9wZXJ0eSBpcyBhcHBsaWNhYmxlLlxuICpcbiAqIEBwYXJhbSBjbHVzdGVyaW5nUGFyYW1zIFNvbWUgcGFyYW1ldGVycyBmb3IgdGhlIGNob3NlbiBjbHVzdGVyaW5nIGFsZ29yaXRobS5cbiAqIERlcGVuZGluZyBvbiB0aGUgY2hvc2VuIGNsdXN0ZXJpbmcgYWxnb3JpdGhtIHRoZXJlIGNvdWxkIGJlIGRpZmZlcmVudCBtYW5kYXRvcnkgYW5kL29yIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gc3BlY2lmeVxuICogdGhlIGJlaGF2aW9yIG9mIHRoZSBhbGdvcml0aG0uXG4gKlxuICogQ2x1c3RlcmluZy1QYXJhbWV0ZXIgcmVmZXJlbmNlLlxuICogTk9URTogVGhlIGFjdHVhbCBxdWVyeSBwYXJhbWV0ZXJzIGluIHRoZSBVUkwgYXJlIGxvb2tpbmcgbGlrZTogYD9jbHVzdGVyaW5nLmFQYXJhbWV0ZXJOYW1lPWFWYWx1ZWAuXG4gKlxuICogQ2x1c3RlcmluZy10eXBlOiBcImhleGJpblwiOlxuICogVGhlcmUgYXJlIHNldmVyYWwgcGFyYW1ldGVycyBuZWVkZWQgYnkgdGhlIEgzIGJhc2VkIGhleGJpbiBhbGdvcml0aG0uXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGF0IHRvcGljIHNlZTogaHR0cHM6Ly9lbmcudWJlci5jb20vaDMvLlxuICpcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIHwgICAgICBQYXJhbWV0ZXIgICAgICAgfCAgIFR5cGUgICB8ICAgTWFuZGF0b3J5ICAgfCAgICAgICAgICAgICAgICAgICAgICBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogfCAgYWJzb2x1dGVSZXNvbHV0aW9uICB8ICBOdW1iZXIgIHwgICAgICAgTk8gICAgICB8IFRoZSBIMyBoZXhhZ29uIHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB8ICAgICByZXNvbHV0aW9uXHQgICAgICB8ICBOdW1iZXIgIHwgICAgICAgTk8gICAgICB8IGRlcHJlY2F0ZWQsIHJlbmFtZWQgdG8gYWJzb2x1dGVSZXNvbHV0aW9uICAgICAgICAgIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB8IHJlbGF0aXZlUmVzb2x1dGlvbiAgIHxcdCBOdW1iZXIgIHwgICAgICAgTk8gICAgICB8IGludGVnZXIgdmFsdWUgWzAtNF0gdG8gYmUgYWRkZWQgdG8gY3VycmVudCB1c2VkICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgfCByZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogfCAgICAgICBwcm9wZXJ0eVx0ICAgICAgfCAgU3RyaW5nICB8ICAgICAgIE5PXHQgICAgIHwgQSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZmVhdHVyZXMgZm9yIHdoaWNoIHRvICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICB8IGNhbGN1bGF0ZSBzdGF0aXN0aWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB8ICAgICAgIHBvaW50bW9kZVx0ICB8ICBCb29sZWFuIHwgICAgICAgTk9cdCAgICAgfCByZXR1bnMgdGhlIGNlbnRyb2lkIG9mIGhleGFnb25zIGFzIGdlb2pzb24gZmVhdHVyZSB8XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqXG4gKiBAcGFyYW0gZm9yY2UyRCBJZiBzZXQgdG8gYHRydWVgIHRoZSBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBoYXZlIG9ubHkgWCdzIGFuZCBZJ3MgYXMgY29vcmRpbmF0ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldEZlYXR1cmVzQnlCQm94KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2Jib3hcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmJveFwiLCBwYXJhbXNbXCJiYm94XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNsaXBcIiwgXCJ0cnVlXCIpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFyYW1zXCIsIHBhcmFtc1tcInBhcmFtc1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzZWxlY3Rpb25cIiwgcGFyYW1zW1wic2VsZWN0aW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNraXBDYWNoZVwiLCBcInRydWVcIik7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjbHVzdGVyaW5nXCIsIHBhcmFtc1tcImNsdXN0ZXJpbmdcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2x1c3RlcmluZ1BhcmFtc1wiLCBwYXJhbXNbXCJjbHVzdGVyaW5nUGFyYW1zXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgXCJ0cnVlXCIpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEZlYXR1cmVzQnlCQm94ID0gZ2V0RmVhdHVyZXNCeUJCb3g7XG4vKipcbiAqIExpc3QgdGhlIGZlYXR1cmVzIHdoaWNoIGFyZSBpbnNpZGUgdGhlIHNwZWNpZmllZCByYWRpdXMuIFRoZSBvcmlnaW4gcmFkaXVzIHBvaW50IGlzIGNhbGN1bGF0ZWRcbiAqIGJhc2VkIGVpdGhlciBvbiBsYXRpdHVkZSAmIGxvbmdpdHVkZSBvciBieSBzcGVjaWZ5aW5nIGEgZmVhdHVyZSdzIGdlb21ldHJ5LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBmZWF0dXJlcyB3aXRoIHJhZGl1cyBzZWFyY2guXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGxhdCBUaGUgbGF0aXR1ZGUgaW4gV0dTJzg0IGRlY2ltYWwgZGVncmVlICgtOTAgdG8gKzkwKSBvZiB0aGUgY2VudGVyIFBvaW50LlxuICpcbiAqIEBwYXJhbSBsbmcgVGhlIGxvbmdpdHVkZSBpbiBXR1MnODQgZGVjaW1hbCBkZWdyZWUgKC0xODAgdG8gKzE4MCkgb2YgdGhlIGNlbnRlciBQb2ludC5cbiAqXG4gKiBAcGFyYW0gcmVmQ2F0YWxvZ0hybiBUaGUgY2F0YWxvZyBIUk4gd2hlcmUgdGhlIGxheWVyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZSBpcyBzdG9yZWQuXG4gKiBBbHdheXMgdG8gdXNlIGluIGNvbWJpbmF0aW9uIHdpdGggcmVmRmVhdHVyZUlkLlxuICpcbiAqIEBwYXJhbSByZWZMYXllcklkIEFzIGFsdGVybmF0aXZlIGZvciBkZWZpbmluZyBjZW50ZXIgY29vcmRpbmF0ZXMsXG4gKiBpdCBpcyBwb3NzaWJsZSB0byByZWZlcmVuY2UgYSBnZW9tZXRyeSBpbiBhIGxheWVyLlxuICogVGhlcmVmb3JlIGl0IGlzIG5lZWRlZCB0byBwcm92aWRlIHRoZSBsYXllciBpZCB3aGVyZSB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlIGlzIHN0b3JlZC5cbiAqIEFsd2F5cyB0byB1c2UgaW4gY29tYmluYXRpb24gd2l0aCByZWZGZWF0dXJlSWQuXG4gKlxuICogQHBhcmFtIHJlZkZlYXR1cmVJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgYSBmZWF0dXJlIGluIHRoZSByZWZlcmVuY2VkIGxheWVyLlxuICogVGhlIGdlb21ldHJ5IG9mIHRoYXQgZmVhdHVyZSBnZXRzIHVzZWQgZm9yIHRoZSBzcGF0aWFsIHF1ZXJ5LlxuICogQWx3YXlzIHRvIHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIHJlZkNhdGFsb2dIcm4gYW5kIHJlZkxheWVySWQuXG4gKlxuICogQHBhcmFtIHJhZGl1cyBSYWRpdXMgaW4gbWV0ZXIgd2hpY2ggZGVmaW5lcyB0aGUgZGlhbWV0ZXIgb2YgdGhlIHNlYXJjaCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBsaW1pdCBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlLiBEZWZhdWx0IGlzIDMwMDAwLiBIYXJkIGxpbWl0IGlzIDEwMDAwMC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIEFkZGl0aW9uYWwgZmVhdHVyZSBmaWx0ZXJzIHdoaWNoIGNvbXBhcmVzIHRoZSBmZWF0dXJlJ3MgcHJvcGVydHkncyB2YWx1ZSB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkXG4gKiBpbiB0aGUgcXVlcnksIHJlc3VsdGluZyBpbiBhIHN1YnNldCBvZiBmZWF0dXJlcy5cbiAqIFRoZSB1c2FnZSBvZiBtdWx0aXBsZSBwcm9wZXJ0eSBuYW1lcyByZXByZXNlbnRzIGFuIEFORCBvcGVyYXRpb24uXG4gKiBUaGUgdXNhZ2Ugb2YgYSBjb21tYSAoLCkgc2VwYXJhdGluZyB0aGUgcHJvcGVydGllcyB2YWx1ZXMsIHJlcHJlc2VudHMgYW4gT1Igb3BlcmF0aW9uLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAnZi4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgd2hpY2ggYXJlIGFkZGVkIGJ5IGRlZmF1bHQgaW4gdGhlIHN0b3JlZCBmZWF0dXJlLlxuICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6ICdmLmlkJywgJ2YuY3JlYXRlZEF0JyBhbmQgJ2YudXBkYXRlZEF0Jy5cbiAqIFByb3BlcnRpZXMgaW5pdGlhdGVkIHdpdGggJ3AuJyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIGluIHRoZSBzdG9yZWQgZmVhdHVyZSB3aGljaCBhcmUgdW5kZXIgdGhlICdwcm9wZXJ0aWVzJyBwcm9wZXJ0eS5cbiAqIFVzZSBpdCBhcyBhIHNob3J0aGFuZCBhY2Nlc3NvciBmb3IgJ3Byb3BlcnRpZXMnIHZhbHVlcy5cbiAqIFRoZSBmb3JtYXQgc2hvdWxkIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBiZWxvd1xuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9cHJvcGVydHlfdmFsdWVfMSZmLnNwZWNpYWxfcHJvcGVydHlfbmFtZV8xPXNwZWNpYWxfcHJvcGVydHlfdmFsdWVfMVxuICogYGBgXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBhYm92ZSBxdWVyeSwgdGhlIEZlYXR1cmVzIHdpbGwgYmUgZmlsdGVyZWQgYnkgJ3Byb3BlcnR5JyBBTkQgJ3NwZWNpYWwgcHJvcGVydHknIGVxdWFscyB0byB0aGVpclxuICogcmVzcGVjdGl2ZSB2YWx1ZXMuXG4gKlxuICogV2hpbGUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGBgYD9wLnByb3BlcnR5X25hbWVfMT12YWx1ZV8xLHZhbHVlXzJgYGBcbiAqIFRoZSByZXN1bHRpbmcgRmVhdHVyZXMgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIGVsZW1lbnRzIGhhdmluZyBgdmFsdWVfMWAgT1IgYHZhbHVlXzJgLlxuICpcbiAqIEFkZGl0aW9uYWxseSB0byB0aGUgb3BlcmF0b3JzIHVzZWQgaW4gdGhlIGV4YW1wbGVzIGFib3ZlLCB0aGUgcXVlcnkgY2FuIGJlIHdyaXR0ZW4sIHdpdGggdGhlIHNhbWUgc2VtYW50aWMsXG4gKiBieSB1c2luZyB0aGUgbG9uZyBvcGVyYXRvcnM6IGBcIj1ndGU9XCIsIFwiPWx0ZT1cIiwgXCI9Z3Q9XCIsIFwiPWx0PVwiIGFuZCBcIj1jcz1cImAuXG4gKlxuICogVGhlIGJlbG93IHF1ZXJpZXMgeWllbGQgdGhlIHNhbWUgcmVzdWx0OlxuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE+PTEwXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9Z3RlPTEwXG4gKiBgYGBcbiAqXG4gKiBUaGUgYXZhaWxhYmxlIG9wZXJhdG9ycyBhcmU6XG4gKiBcIj1cIiAtIGVxdWFsc1xuICogXCIhPVwiIC0gbm90IGVxdWFsc1xuICogXCI+PVwiIG9yIFwiPWd0ZT1cIiAtIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHNcbiAqIFwiPD1cIiBvciBcIj1sdGU9XCIgLSBsZXNzIHRoYW4gb3IgZXF1YWxzXG4gKiBcIj5cIiBvciBcIj1ndD1cIiAtIGdyZWF0ZXIgdGhhblxuICogXCI8XCIgb3IgXCI9bHQ9XCIgLSBsZXNzIHRoYW5cbiAqIFwiQD5cIiBvciBcIj1jcz1cIiAtIGNvbnRhaW5zXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvbiBBIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmVhdHVyZXMgcmVzdWx0IGxpc3QuXG4gKiBNdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgY29tbWEoLCkuXG4gKiBFeGFtcGxlOiBgP3NlbGVjdGlvbj1wLm5hbWUscC5jYXBhY2l0eSxwLmNvbG9yYC5cbiAqXG4gKiBAcGFyYW0gc2tpcENhY2hlIElmIHNldCB0byB0cnVlIHRoZSByZXNwb25zZSBpcyBub3QgcmV0dXJuZWQgZnJvbSBjYWNoZS4gRGVmYXVsdCBpcyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gZm9yY2UyRCBJZiBzZXQgdG8gYHRydWVgIHRoZSBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBoYXZlIG9ubHkgWCdzIGFuZCBZJ3MgYXMgY29vcmRpbmF0ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldEZlYXR1cmVzQnlTcGF0aWFsKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3NwYXRpYWxcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGF0XCIsIHBhcmFtc1tcImxhdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsbmdcIiwgcGFyYW1zW1wibG5nXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlZkNhdGFsb2dIcm5cIiwgcGFyYW1zW1wicmVmQ2F0YWxvZ0hyblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZMYXllcklkXCIsIHBhcmFtc1tcInJlZkxheWVySWRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVmRmVhdHVyZUlkXCIsIHBhcmFtc1tcInJlZkZlYXR1cmVJZFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyYWRpdXNcIiwgcGFyYW1zW1wicmFkaXVzXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcmFtc1wiLCBwYXJhbXNbXCJwYXJhbXNcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2VsZWN0aW9uXCIsIHBhcmFtc1tcInNlbGVjdGlvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJza2lwQ2FjaGVcIiwgcGFyYW1zW1wic2tpcENhY2hlXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RmVhdHVyZXNCeVNwYXRpYWwgPSBnZXRGZWF0dXJlc0J5U3BhdGlhbDtcbi8qKlxuICogTGlzdCB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlIGluc2lkZSB0aGUgc3BlY2lmaWVkIHJhZGl1cy4gVGhlIG9yaWdpbiBwb2ludCBpcyBjYWxjdWxhdGVkIGJhc2VkXG4gKiBvbiB0aGUgZ2VvbWV0cnkgcHJvdmlkZWQgYXMgcGF5bG9hZC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZmVhdHVyZXMgd2hpY2ggaW50ZXJzZWN0cyB0aGUgcHJvdmlkZWQgZ2VvbWV0cnkuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGJvZHkgQSBnZW9tZXRyeSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSByYWRpdXMgUmFkaXVzIGluIG1ldGVyIHdoaWNoIGRlZmluZXMgdGhlIGRpYW1ldGVyIG9mIHRoZSBzZWFyY2ggcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS5cbiAqIERlZmF1bHQgaXMgMzAwMDAuIEhhcmQgbGltaXQgaXMgMTAwMDAwLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgQWRkaXRpb25hbCBmZWF0dXJlIGZpbHRlcnMgd2hpY2ggY29tcGFyZXMgdGhlIGZlYXR1cmUncyBwcm9wZXJ0eSdzIHZhbHVlIHdpdGggdGhlIG9uZSBzcGVjaWZpZWRcbiAqIGluIHRoZSBxdWVyeSwgcmVzdWx0aW5nIGluIGEgc3Vic2V0IG9mIGZlYXR1cmVzLlxuICogVGhlIHVzYWdlIG9mIG11bHRpcGxlIHByb3BlcnR5IG5hbWVzIHJlcHJlc2VudHMgYW4gQU5EIG9wZXJhdGlvbi5cbiAqIFRoZSB1c2FnZSBvZiBhIGNvbW1hICgsKSBzZXBhcmF0aW5nIHRoZSBwcm9wZXJ0aWVzIHZhbHVlcywgcmVwcmVzZW50cyBhbiBPUiBvcGVyYXRpb24uXG4gKiBQcm9wZXJ0aWVzIGluaXRpYXRlZCB3aXRoICdmLicgYXJlIHVzZWQgdG8gYWNjZXNzIHZhbHVlcyB3aGljaCBhcmUgYWRkZWQgYnkgZGVmYXVsdCBpbiB0aGUgc3RvcmVkIGZlYXR1cmUuXG4gKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTogJ2YuaWQnLCAnZi5jcmVhdGVkQXQnIGFuZCAnZi51cGRhdGVkQXQnLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAncC4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgaW4gdGhlIHN0b3JlZCBmZWF0dXJlIHdoaWNoIGFyZSB1bmRlciB0aGUgJ3Byb3BlcnRpZXMnIHByb3BlcnR5LlxuICogVXNlIGl0IGFzIGEgc2hvcnRoYW5kIGFjY2Vzc29yIGZvciAncHJvcGVydGllcycgdmFsdWVzLlxuICogVGhlIGZvcm1hdCBzaG91bGQgZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uIGJlbG93XG4gKiBgYGBcbiAqID9wLnByb3BlcnR5X25hbWVfMT1wcm9wZXJ0eV92YWx1ZV8xJmYuc3BlY2lhbF9wcm9wZXJ0eV9uYW1lXzE9c3BlY2lhbF9wcm9wZXJ0eV92YWx1ZV8xXG4gKiBgYGBcbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGFib3ZlIHF1ZXJ5LCB0aGUgRmVhdHVyZXMgd2lsbCBiZSBmaWx0ZXJlZCBieSAncHJvcGVydHknIEFORCAnc3BlY2lhbCBwcm9wZXJ0eScgZXF1YWxzIHRvIHRoZWlyXG4gKiByZXNwZWN0aXZlIHZhbHVlcy5cbiAqXG4gKiBXaGlsZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYGBgP3AucHJvcGVydHlfbmFtZV8xPXZhbHVlXzEsdmFsdWVfMmBgYFxuICogVGhlIHJlc3VsdGluZyBGZWF0dXJlcyBsaXN0IHdpbGwgY29udGFpbiBhbGwgZWxlbWVudHMgaGF2aW5nIGB2YWx1ZV8xYCBPUiBgdmFsdWVfMmAuXG4gKlxuICogQWRkaXRpb25hbGx5IHRvIHRoZSBvcGVyYXRvcnMgdXNlZCBpbiB0aGUgZXhhbXBsZXMgYWJvdmUsIHRoZSBxdWVyeSBjYW4gYmUgd3JpdHRlbiwgd2l0aCB0aGUgc2FtZSBzZW1hbnRpYyxcbiAqIGJ5IHVzaW5nIHRoZSBsb25nIG9wZXJhdG9yczogYFwiPWd0ZT1cIiwgXCI9bHRlPVwiLCBcIj1ndD1cIiwgXCI9bHQ9XCIgYW5kIFwiPWNzPVwiYC5cbiAqXG4gKiBUaGUgYmVsb3cgcXVlcmllcyB5aWVsZCB0aGUgc2FtZSByZXN1bHQ6XG4gKiBgYGBcbiAqID9wLnByb3BlcnR5X25hbWVfMT49MTBcbiAqID9wLnByb3BlcnR5X25hbWVfMT1ndGU9MTBcbiAqIGBgYFxuICpcbiAqIFRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGFyZTpcbiAqIFwiPVwiIC0gZXF1YWxzXG4gKiBcIiE9XCIgLSBub3QgZXF1YWxzXG4gKiBcIj49XCIgb3IgXCI9Z3RlPVwiIC0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsc1xuICogXCI8PVwiIG9yIFwiPWx0ZT1cIiAtIGxlc3MgdGhhbiBvciBlcXVhbHNcbiAqIFwiPlwiIG9yIFwiPWd0PVwiIC0gZ3JlYXRlciB0aGFuXG4gKiBcIjxcIiBvciBcIj1sdD1cIiAtIGxlc3MgdGhhblxuICogXCJAPlwiIG9yIFwiPWNzPVwiIC0gY29udGFpbnNcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmZWF0dXJlcyByZXN1bHQgbGlzdC5cbiAqIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBieSB1c2luZyBjb21tYSgsKS5cbiAqIEV4YW1wbGU6IGA/c2VsZWN0aW9uPXAubmFtZSxwLmNhcGFjaXR5LHAuY29sb3JgLlxuICpcbiAqIEBwYXJhbSBza2lwQ2FjaGUgSWYgc2V0IHRvIHRydWUgdGhlIHJlc3BvbnNlIGlzIG5vdCByZXR1cm5lZCBmcm9tIGNhY2hlLiBEZWZhdWx0IGlzIGZhbHNlLlxuICpcbiAqIEBwYXJhbSBmb3JjZTJEIElmIHNldCB0byBgdHJ1ZWAgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RmVhdHVyZXNCeVNwYXRpYWxQb3N0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3NwYXRpYWxcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmFkaXVzXCIsIHBhcmFtc1tcInJhZGl1c1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYXJhbXNcIiwgcGFyYW1zW1wicGFyYW1zXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2tpcENhY2hlXCIsIHBhcmFtc1tcInNraXBDYWNoZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEZlYXR1cmVzQnlTcGF0aWFsUG9zdCA9IGdldEZlYXR1cmVzQnlTcGF0aWFsUG9zdDtcbi8qKlxuICogR2V0IGZlYXR1cmVzIGluIHRpbGVcbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gdGlsZVR5cGUgVGhlIHR5cGUgb2YgdGlsZSBpZGVudGlmaWVyLlxuICogRGVmYXVsdDogXCJxdWFka2V5XCIuXG4gKiBFbnVtOiBcInF1YWRrZXlcIiBcIndlYlwiIFwidG1zXCIgXCJoZXJlXCIuXG4gKiBcInF1YWRrZXlcIiAtIFZpcnR1YWwgRWFydGgsXG4gKiBcIndlYlwiIC0gV2ViIE1lcmNhdG9yLFxuICogXCJ0bXNcIiAtIE9TR0VPIFRpbGUgTWFwIFNlcnZpY2UsXG4gKiBcImhlcmVcIiAtIEhlcmUgVGlsZSBTY2hlbWEuXG4gKlxuICogQHBhcmFtIHRpbGVJZCBUaGUgdGlsZSBpZGVudGlmaWVyIGNhbiBiZSBwcm92aWRlZCBhcyBxdWFka2V5ICgxKSxcbiAqIFdlYiBNZXJjYXRvciBsZXZlbCx4LHkgY29vcmRpbmF0ZXMgKDFfMV8wKSBvciBPU0dFTyBUaWxlIE1hcCBTZXJ2aWNlIGxldmVsLHgseSAoMV8xXzApLlxuICpcbiAqIEBwYXJhbSBjbGlwIElmIHNldCB0byB0cnVlIHRoZSBmZWF0dXJlcycgZ2VvbWV0cmllcyBhcmUgY2xpcHBlZCB0byB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRpbGUgb3IgYm91bmRpbmcgYm94LlxuICogRGVmYXVsdCBpcyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIEFkZGl0aW9uYWwgZmVhdHVyZSBmaWx0ZXJzIHdoaWNoIGNvbXBhcmVzIHRoZSBmZWF0dXJlJ3MgcHJvcGVydHkncyB2YWx1ZSB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkXG4gKiBpbiB0aGUgcXVlcnksIHJlc3VsdGluZyBpbiBhIHN1YnNldCBvZiBmZWF0dXJlcy5cbiAqIFRoZSB1c2FnZSBvZiBtdWx0aXBsZSBwcm9wZXJ0eSBuYW1lcyByZXByZXNlbnRzIGFuIEFORCBvcGVyYXRpb24uXG4gKiBUaGUgdXNhZ2Ugb2YgYSBjb21tYSAoLCkgc2VwYXJhdGluZyB0aGUgcHJvcGVydGllcyB2YWx1ZXMsIHJlcHJlc2VudHMgYW4gT1Igb3BlcmF0aW9uLlxuICogUHJvcGVydGllcyBpbml0aWF0ZWQgd2l0aCAnZi4nIGFyZSB1c2VkIHRvIGFjY2VzcyB2YWx1ZXMgd2hpY2ggYXJlIGFkZGVkIGJ5IGRlZmF1bHQgaW4gdGhlIHN0b3JlZCBmZWF0dXJlLlxuICogVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6ICdmLmlkJywgJ2YuY3JlYXRlZEF0JyBhbmQgJ2YudXBkYXRlZEF0Jy5cbiAqIFByb3BlcnRpZXMgaW5pdGlhdGVkIHdpdGggJ3AuJyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIGluIHRoZSBzdG9yZWQgZmVhdHVyZSB3aGljaCBhcmUgdW5kZXIgdGhlICdwcm9wZXJ0aWVzJyBwcm9wZXJ0eS5cbiAqIFVzZSBpdCBhcyBhIHNob3J0aGFuZCBhY2Nlc3NvciBmb3IgJ3Byb3BlcnRpZXMnIHZhbHVlcy5cbiAqIFRoZSBmb3JtYXQgc2hvdWxkIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBiZWxvd1xuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9cHJvcGVydHlfdmFsdWVfMSZmLnNwZWNpYWxfcHJvcGVydHlfbmFtZV8xPXNwZWNpYWxfcHJvcGVydHlfdmFsdWVfMVxuICogYGBgXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBhYm92ZSBxdWVyeSwgdGhlIEZlYXR1cmVzIHdpbGwgYmUgZmlsdGVyZWQgYnkgJ3Byb3BlcnR5JyBBTkQgJ3NwZWNpYWwgcHJvcGVydHknIGVxdWFscyB0byB0aGVpclxuICogcmVzcGVjdGl2ZSB2YWx1ZXMuXG4gKlxuICogV2hpbGUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGBgYD9wLnByb3BlcnR5X25hbWVfMT12YWx1ZV8xLHZhbHVlXzJgYGBcbiAqIFRoZSByZXN1bHRpbmcgRmVhdHVyZXMgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIGVsZW1lbnRzIGhhdmluZyBgdmFsdWVfMWAgT1IgYHZhbHVlXzJgLlxuICpcbiAqIEFkZGl0aW9uYWxseSB0byB0aGUgb3BlcmF0b3JzIHVzZWQgaW4gdGhlIGV4YW1wbGVzIGFib3ZlLCB0aGUgcXVlcnkgY2FuIGJlIHdyaXR0ZW4sIHdpdGggdGhlIHNhbWUgc2VtYW50aWMsXG4gKiBieSB1c2luZyB0aGUgbG9uZyBvcGVyYXRvcnM6IGBcIj1ndGU9XCIsIFwiPWx0ZT1cIiwgXCI9Z3Q9XCIsIFwiPWx0PVwiIGFuZCBcIj1jcz1cImAuXG4gKlxuICogVGhlIGJlbG93IHF1ZXJpZXMgeWllbGQgdGhlIHNhbWUgcmVzdWx0OlxuICogYGBgXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE+PTEwXG4gKiA/cC5wcm9wZXJ0eV9uYW1lXzE9Z3RlPTEwXG4gKiBgYGBcbiAqXG4gKiBUaGUgYXZhaWxhYmxlIG9wZXJhdG9ycyBhcmU6XG4gKiBcIj1cIiAtIGVxdWFsc1xuICogXCIhPVwiIC0gbm90IGVxdWFsc1xuICogXCI+PVwiIG9yIFwiPWd0ZT1cIiAtIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHNcbiAqIFwiPD1cIiBvciBcIj1sdGU9XCIgLSBsZXNzIHRoYW4gb3IgZXF1YWxzXG4gKiBcIj5cIiBvciBcIj1ndD1cIiAtIGdyZWF0ZXIgdGhhblxuICogXCI8XCIgb3IgXCI9bHQ9XCIgLSBsZXNzIHRoYW5cbiAqIFwiQD5cIiBvciBcIj1jcz1cIiAtIGNvbnRhaW5zXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvbiBBIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmVhdHVyZXMgcmVzdWx0IGxpc3QuXG4gKiBNdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgY29tbWEoLCkuXG4gKiBFeGFtcGxlOiBgP3NlbGVjdGlvbj1wLm5hbWUscC5jYXBhY2l0eSxwLmNvbG9yYC5cbiAqXG4gKiBAcGFyYW0gc2tpcENhY2hlIElmIHNldCB0byB0cnVlIHRoZSByZXNwb25zZSBpcyBub3QgcmV0dXJuZWQgZnJvbSBjYWNoZS4gRGVmYXVsdCBpcyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gY2x1c3RlcmluZyBUaGUgY2x1c3RlcmluZyBhbGdvcml0aG0gdG8gYXBwbHkgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSByZXN1bHQuXG4gKiBQcm92aWRpbmcgdGhpcyBxdWVyeSBwYXJhbWV0ZXIgdGhlIGRhdGEgd2lsbCBiZSByZXR1cm5lZCBpbiBhIGNsdXN0ZXJlZCB3YXkuXG4gKiBUaGlzIG1lYW5zIHRoZSBkYXRhIHdvbid0IG5lY2Vzc2FyaWx5IGJlIHJldHVybmVkIGluIGl0cyBvcmlnaW5hbCBzaGFwZSBvciB3aXRoIGl0cyBvcmlnaW5hbCBwcm9wZXJ0aWVzLlxuICogRGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gY2x1c3RlcmluZyBhbGdvcml0aG0gdGhlcmUgY291bGQgYmUgZGlmZmVyZW50IG1hbmRhdG9yeSBhbmQvb3Igb3B0aW9uYWwgcGFyYW1ldGVyc1xuICogdG8gc3BlY2lmeSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsZ29yaXRobS5cbiAqIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gKlxuICogYGhleGJpbmAgLSBUaGUgaGV4YmluIGFsZ29yaXRobSBkaXZpZGVzIHRoZSB3b3JsZCBpbiBoZXhhZ29uYWwgXCJiaW5zXCIgb24gYSBzcGVjaWZpZWQgcmVzb2x1dGlvbi5cbiAqIEVhY2ggaGV4YWdvbiBoYXMgYW4gYWRkcmVzcyBiZWluZyBkZXNjcmliZWQgYnkgdGhlIEgzIGFkZHJlc3Npbmcgc2NoZW1lLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhhdCB0b3BpYyBzZWU6IGh0dHBzOi8vZW5nLnViZXIuY29tL2gzLy5cbiAqXG4gKiBgcXVhZGJpbmAgLSBUaGUgcXVhZGJpbiBhbGdvcml0aG0gdGFrZXMgdGhlIGdlb21ldHJ5IGlucHV0IGZyb20gdGhlIHJlcXVlc3QgKGUuZy4gcXVhZGtleSAvIGJib3guLilcbiAqIGFuZCBjb3VudCB0aGUgZmVhdHVyZXMgaW4gaXQuXG4gKiBUaGlzIGNsdXN0ZXJpbmcgbW9kZSB3b3JrcyBhbHNvIGZvciB2ZXJ5IGxhcmdlIGxheWVycyBhbmQgY2FuIGJlIHVzZWQgZm9yIGdldHRpbmcgYW4gb3ZlcnZpZXdcbiAqIHdoZXJlIGRhdGEgaXMgcHJlc2VudCBpbiBhIGdpdmVuIGxheWVyLiBGdXJ0aGVybW9yZSwgYSBwcm9wZXJ0eSBmaWx0ZXIgb24gb25lIHByb3BlcnR5IGlzIGFwcGxpY2FibGUuXG4gKlxuICogQHBhcmFtIGNsdXN0ZXJpbmdQYXJhbXMgU29tZSBwYXJhbWV0ZXJzIGZvciB0aGUgY2hvc2VuIGNsdXN0ZXJpbmcgYWxnb3JpdGhtLlxuICogRGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gY2x1c3RlcmluZyBhbGdvcml0aG0gdGhlcmUgY291bGQgYmUgZGlmZmVyZW50IG1hbmRhdG9yeSBhbmQvb3Igb3B0aW9uYWwgcGFyYW1ldGVycyB0byBzcGVjaWZ5XG4gKiB0aGUgYmVoYXZpb3Igb2YgdGhlIGFsZ29yaXRobS5cbiAqXG4gKiBDbHVzdGVyaW5nLVBhcmFtZXRlciByZWZlcmVuY2UuXG4gKiBOT1RFOiBUaGUgYWN0dWFsIHF1ZXJ5IHBhcmFtZXRlcnMgaW4gdGhlIFVSTCBhcmUgbG9va2luZyBsaWtlOiBgP2NsdXN0ZXJpbmcuYVBhcmFtZXRlck5hbWU9YVZhbHVlYC5cbiAqXG4gKiBDbHVzdGVyaW5nLXR5cGU6IFwiaGV4YmluXCI6XG4gKiBUaGVyZSBhcmUgc2V2ZXJhbCBwYXJhbWV0ZXJzIG5lZWRlZCBieSB0aGUgSDMgYmFzZWQgaGV4YmluIGFsZ29yaXRobS5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoYXQgdG9waWMgc2VlOiBodHRwczovL2VuZy51YmVyLmNvbS9oMy8uXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogfCAgICAgIFBhcmFtZXRlciAgICAgICB8ICAgVHlwZSAgIHwgICBNYW5kYXRvcnkgICB8ICAgICAgICAgICAgICAgICAgICAgIE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiB8ICBhYnNvbHV0ZVJlc29sdXRpb24gIHwgIE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgVGhlIEgzIGhleGFnb24gcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgICAgIHJlc29sdXRpb25cdCAgICAgIHwgIE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgZGVwcmVjYXRlZCwgcmVuYW1lZCB0byBhYnNvbHV0ZVJlc29sdXRpb24gICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgcmVsYXRpdmVSZXNvbHV0aW9uICAgfFx0IE51bWJlciAgfCAgICAgICBOTyAgICAgIHwgaW50ZWdlciB2YWx1ZSBbMC00XSB0byBiZSBhZGRlZCB0byBjdXJyZW50IHVzZWQgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICB8IHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB8ICAgICAgIHByb3BlcnR5XHQgICAgICB8ICBTdHJpbmcgIHwgICAgICAgTk9cdCAgICAgfCBBIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBmZWF0dXJlcyBmb3Igd2hpY2ggdG8gICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgY2FsY3VsYXRlIHN0YXRpc3RpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgICAgICAgcG9pbnRtb2RlXHQgIHwgIEJvb2xlYW4gfCAgICAgICBOT1x0ICAgICB8IHJldHVucyB0aGUgY2VudHJvaWQgb2YgaGV4YWdvbnMgYXMgZ2VvanNvbiBmZWF0dXJlIHxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogQHBhcmFtIG1hcmdpbiBNYXJnaW4gaW4gcGl4ZWxzIG9uIHRoZSByZXNwZWN0aXZlIHByb2plY3RlZCBsZXZlbCBhcm91bmQgdGhlIHRpbGUuIERlZmF1bHQgaXMgMC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS4gRGVmYXVsdCBpcyAzMDAwMC4gSGFyZCBsaW1pdCBpcyAxMDAwMDAuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIGB0cnVlYCB0aGUgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlIHdpbGwgaGF2ZSBvbmx5IFgncyBhbmQgWSdzIGFzIGNvb3JkaW5hdGVzLlxuICovXG5mdW5jdGlvbiBnZXRGZWF0dXJlc0J5VGlsZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS90aWxlL3t0aWxlVHlwZX0ve3RpbGVJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7dGlsZVR5cGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJ0aWxlVHlwZVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInt0aWxlSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJ0aWxlSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjbGlwXCIsIHBhcmFtc1tcImNsaXBcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFyYW1zXCIsIHBhcmFtc1tcInBhcmFtc1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzZWxlY3Rpb25cIiwgcGFyYW1zW1wic2VsZWN0aW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNraXBDYWNoZVwiLCBwYXJhbXNbXCJza2lwQ2FjaGVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2x1c3RlcmluZ1wiLCBwYXJhbXNbXCJjbHVzdGVyaW5nXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNsdXN0ZXJpbmdQYXJhbXNcIiwgcGFyYW1zW1wiY2x1c3RlcmluZ1BhcmFtc1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtYXJnaW5cIiwgcGFyYW1zW1wibWFyZ2luXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RmVhdHVyZXNCeVRpbGUgPSBnZXRGZWF0dXJlc0J5VGlsZTtcbi8qKlxuICogUmV0dXJucyBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGxheWVyLlxuICpcbiAqIEBzdW1tYXJ5IEdldCBzdGF0aXN0aWNzLlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICpcbiAqIEBwYXJhbSBza2lwQ2FjaGUgSWYgc2V0IHRvIHRydWUgdGhlIHJlc3BvbnNlIGlzIG5vdCByZXR1cm5lZCBmcm9tIGNhY2hlLlxuICogRGVmYXVsdCBpcyBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gZ2V0U3RhdGlzdGljcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9zdGF0aXN0aWNzXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNraXBDYWNoZVwiLCBwYXJhbXNbXCJza2lwQ2FjaGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFN0YXRpc3RpY3MgPSBnZXRTdGF0aXN0aWNzO1xuLyoqXG4gKiBJdGVyYXRlcyBhbGwgb2YgdGhlIGZlYXR1cmVzIGluIHRoZSBsYXllci4gVGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSBhcmUgb3JkZXJlZCBzb1xuICogdGhhdCBubyBmZWF0dXJlIGlzIHJldHVybmVkIHR3aWNlLiBJZiB0aGVyZSBhcmUgbW9yZSBmZWF0dXJlcywgd2hpY2ggY291bGQgYmUgbG9hZGVkLFxuICogdGhlIHJlc3BvbnNlIEZlYXR1cmVDb2xsZWN0aW9uIHdpbGwgY29udGFpbiB0aGUgcm9vdCBhdHRyaWJ1dGUgbmV4dFBhZ2VUb2tlbi5cbiAqIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgcGFzc2VkIGFzIGEgcXVlcnkgcGFyYW1ldGVyIGZvciB0aGUgZm9sbG93aW5nIHJlcXVlc3RcbiAqIGluIG9yZGVyIHRvIGNvbnRpbnVlIHRoZSBpdGVyYXRpb24gZnJvbSB0aGUgbWFya2VkIHBvc2l0aW9uLlxuICpcbiAqIEBzdW1tYXJ5IEl0ZXJhdGUgZmVhdHVyZXMgaW4gdGhlIGxheWVyLlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICpcbiAqIEBwYXJhbSBsaW1pdCBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlLiBEZWZhdWx0IGlzIDMwMDAwLiBIYXJkIGxpbWl0IGlzIDEwMDAwMC5cbiAqXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBwYWdlIHRva2VuIHdoZXJlIHRoZSBpdGVyYXRpb24gd2lsbCBjb250aW51ZS5cbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmZWF0dXJlcyByZXN1bHQgbGlzdC5cbiAqIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBieSB1c2luZyBjb21tYSgsKS5cbiAqIEV4YW1wbGU6IGA/c2VsZWN0aW9uPXAubmFtZSxwLmNhcGFjaXR5LHAuY29sb3JgLlxuICpcbiAqIEBwYXJhbSBza2lwQ2FjaGUgSWYgc2V0IHRvIHRydWUgdGhlIHJlc3BvbnNlIGlzIG5vdCByZXR1cm5lZCBmcm9tIGNhY2hlLiBEZWZhdWx0IGlzIGZhbHNlLlxuICpcbiAqIEBwYXJhbSBmb3JjZTJEIElmIHNldCB0byB0cnVlIHRoZSBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBoYXZlIG9ubHkgWCdzIGFuZCBZJ3MgYXMgY29vcmRpbmF0ZXMuXG4gKi9cbmZ1bmN0aW9uIGl0ZXJhdGVGZWF0dXJlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9pdGVyYXRlXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2VsZWN0aW9uXCIsIHBhcmFtc1tcInNlbGVjdGlvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJza2lwQ2FjaGVcIiwgcGFyYW1zW1wic2tpcENhY2hlXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuaXRlcmF0ZUZlYXR1cmVzID0gaXRlcmF0ZUZlYXR1cmVzO1xuLyoqXG4gKiBTZWFyY2hlcyBmb3IgZmVhdHVyZXMgaW4gdGhlIGxheWVyLiBUaGUgcmVzdWx0cyBhcmUgdW5vcmRlcmVkIGFuZCB0aGUgcmVxdWVzdCBkb2VzIG5vdCBhbGxvdyB0byBjb250aW51ZVxuICogdGhlIHNlYXJjaCwgd2hpY2ggaXMgdGhlIG1haW4gZGlmZmVyZW5jZSB3aGVuIGNvbXBhcmVkIHRvIHRoZSBpdGVyYXRlIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgU2VhcmNoIGZvciBmZWF0dXJlcy5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gbGltaXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZS4gRGVmYXVsdCBpcyAzMDAwMC4gSGFyZCBsaW1pdCBpcyAxMDAwMDAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyBBZGRpdGlvbmFsIGZlYXR1cmUgZmlsdGVycyB3aGljaCBjb21wYXJlcyB0aGUgZmVhdHVyZSdzIHByb3BlcnR5J3MgdmFsdWUgd2l0aCB0aGUgb25lIHNwZWNpZmllZFxuICogaW4gdGhlIHF1ZXJ5LCByZXN1bHRpbmcgaW4gYSBzdWJzZXQgb2YgZmVhdHVyZXMuXG4gKiBUaGUgdXNhZ2Ugb2YgbXVsdGlwbGUgcHJvcGVydHkgbmFtZXMgcmVwcmVzZW50cyBhbiBBTkQgb3BlcmF0aW9uLlxuICogVGhlIHVzYWdlIG9mIGEgY29tbWEgKCwpIHNlcGFyYXRpbmcgdGhlIHByb3BlcnRpZXMgdmFsdWVzLCByZXByZXNlbnRzIGFuIE9SIG9wZXJhdGlvbi5cbiAqIFByb3BlcnRpZXMgaW5pdGlhdGVkIHdpdGggJ2YuJyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIHdoaWNoIGFyZSBhZGRlZCBieSBkZWZhdWx0IGluIHRoZSBzdG9yZWQgZmVhdHVyZS5cbiAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiAnZi5pZCcsICdmLmNyZWF0ZWRBdCcgYW5kICdmLnVwZGF0ZWRBdCcuXG4gKiBQcm9wZXJ0aWVzIGluaXRpYXRlZCB3aXRoICdwLicgYXJlIHVzZWQgdG8gYWNjZXNzIHZhbHVlcyBpbiB0aGUgc3RvcmVkIGZlYXR1cmUgd2hpY2ggYXJlIHVuZGVyIHRoZSAncHJvcGVydGllcycgcHJvcGVydHkuXG4gKiBVc2UgaXQgYXMgYSBzaG9ydGhhbmQgYWNjZXNzb3IgZm9yICdwcm9wZXJ0aWVzJyB2YWx1ZXMuXG4gKiBUaGUgZm9ybWF0IHNob3VsZCBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24gYmVsb3dcbiAqIGBgYFxuICogP3AucHJvcGVydHlfbmFtZV8xPXByb3BlcnR5X3ZhbHVlXzEmZi5zcGVjaWFsX3Byb3BlcnR5X25hbWVfMT1zcGVjaWFsX3Byb3BlcnR5X3ZhbHVlXzFcbiAqIGBgYFxuICpcbiAqIEZvciBleGFtcGxlLCB0aGUgYWJvdmUgcXVlcnksIHRoZSBGZWF0dXJlcyB3aWxsIGJlIGZpbHRlcmVkIGJ5ICdwcm9wZXJ0eScgQU5EICdzcGVjaWFsIHByb3BlcnR5JyBlcXVhbHMgdG8gdGhlaXJcbiAqIHJlc3BlY3RpdmUgdmFsdWVzLlxuICpcbiAqIFdoaWxlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBgYGA/cC5wcm9wZXJ0eV9uYW1lXzE9dmFsdWVfMSx2YWx1ZV8yYGBgXG4gKiBUaGUgcmVzdWx0aW5nIEZlYXR1cmVzIGxpc3Qgd2lsbCBjb250YWluIGFsbCBlbGVtZW50cyBoYXZpbmcgYHZhbHVlXzFgIE9SIGB2YWx1ZV8yYC5cbiAqXG4gKiBBZGRpdGlvbmFsbHkgdG8gdGhlIG9wZXJhdG9ycyB1c2VkIGluIHRoZSBleGFtcGxlcyBhYm92ZSwgdGhlIHF1ZXJ5IGNhbiBiZSB3cml0dGVuLCB3aXRoIHRoZSBzYW1lIHNlbWFudGljLFxuICogYnkgdXNpbmcgdGhlIGxvbmcgb3BlcmF0b3JzOiBgXCI9Z3RlPVwiLCBcIj1sdGU9XCIsIFwiPWd0PVwiLCBcIj1sdD1cIiBhbmQgXCI9Y3M9XCJgLlxuICpcbiAqIFRoZSBiZWxvdyBxdWVyaWVzIHlpZWxkIHRoZSBzYW1lIHJlc3VsdDpcbiAqIGBgYFxuICogP3AucHJvcGVydHlfbmFtZV8xPj0xMFxuICogP3AucHJvcGVydHlfbmFtZV8xPWd0ZT0xMFxuICogYGBgXG4gKlxuICogVGhlIGF2YWlsYWJsZSBvcGVyYXRvcnMgYXJlOlxuICogXCI9XCIgLSBlcXVhbHNcbiAqIFwiIT1cIiAtIG5vdCBlcXVhbHNcbiAqIFwiPj1cIiBvciBcIj1ndGU9XCIgLSBncmVhdGVyIHRoYW4gb3IgZXF1YWxzXG4gKiBcIjw9XCIgb3IgXCI9bHRlPVwiIC0gbGVzcyB0aGFuIG9yIGVxdWFsc1xuICogXCI+XCIgb3IgXCI9Z3Q9XCIgLSBncmVhdGVyIHRoYW5cbiAqIFwiPFwiIG9yIFwiPWx0PVwiIC0gbGVzcyB0aGFuXG4gKiBcIkA+XCIgb3IgXCI9Y3M9XCIgLSBjb250YWluc1xuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb24gQSBsaXN0IG9mIHByb3BlcnRpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZlYXR1cmVzIHJlc3VsdCBsaXN0LlxuICogTXVsdGlwbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGNvbW1hKCwpLlxuICogRXhhbXBsZTogYD9zZWxlY3Rpb249cC5uYW1lLHAuY2FwYWNpdHkscC5jb2xvcmAuXG4gKlxuICogQHBhcmFtIHNraXBDYWNoZSBJZiBzZXQgdG8gdHJ1ZSB0aGUgcmVzcG9uc2UgaXMgbm90IHJldHVybmVkIGZyb20gY2FjaGUuIERlZmF1bHQgaXMgZmFsc2UuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIHRydWUgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuZnVuY3Rpb24gc2VhcmNoRmVhdHVyZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc2VhcmNoXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcmFtc1wiLCBwYXJhbXNbXCJwYXJhbXNcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2VsZWN0aW9uXCIsIHBhcmFtc1tcInNlbGVjdGlvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJza2lwQ2FjaGVcIiwgXCJ0cnVlXCIpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZm9yY2UyRFwiLCBcInRydWVcIik7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc2VhcmNoRmVhdHVyZXMgPSBzZWFyY2hGZWF0dXJlcztcbi8qKlxuICogRGVsZXRlcyBhbiBleGlzdGluZyBmZWF0dXJlLlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZXMgYSBmZWF0dXJlLlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICpcbiAqIEBwYXJhbSBmZWF0dXJlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgZmVhdHVyZSBpbiB0aGUgbGF5ZXIuXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZlYXR1cmUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXMve2ZlYXR1cmVJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZmVhdHVyZUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmVhdHVyZUlkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVGZWF0dXJlID0gZGVsZXRlRmVhdHVyZTtcbi8qKlxuICogVGhlIHdpbGRjYXJkIHNpZ24oKikgY291bGQgYmUgdXNlZCB0byBkZWxldGUgYWxsIGZlYXR1cmVzIGluIHRoZSBsYXllci5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgbXVsdGlwbGUgZmVhdHVyZXMgZnJvbSB0aGUgbGF5ZXIuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGlkIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdW5pcXVlIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gKiBUaGVzZSBhcmUgdGhlIGFjY2VwdGFibGUgZm9ybWF0cyBmb3IgdGhpcyBmaWVsZDpcbiAqIGBgYFxuICogaWQ9dmFsdWUxLHZhbHVlMlxuICogaWQ9dmFsdWUxLGlkPXZhbHVlMlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZlYXR1cmVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImlkXCIsIHBhcmFtc1tcImlkXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlRmVhdHVyZXMgPSBkZWxldGVGZWF0dXJlcztcbi8qKlxuICogUGF0Y2hlcyBhbiBleGlzdGluZyBmZWF0dXJlLlxuICpcbiAqIEBzdW1tYXJ5IFBhdGNoIGEgZmVhdHVyZS5cbiAqXG4gKiBAcGFyYW0gYm9keSBBIGZlYXR1cmUgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIGZlYXR1cmUgaW4gdGhlIGxheWVyLlxuICovXG5mdW5jdGlvbiBwYXRjaEZlYXR1cmUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXMve2ZlYXR1cmVJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZmVhdHVyZUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmVhdHVyZUlkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wYXRjaEZlYXR1cmUgPSBwYXRjaEZlYXR1cmU7XG4vKipcbiAqIENyZWF0ZSBvciBwYXRjaCBmZWF0dXJlcy5cbiAqXG4gKiBAc3VtbWFyeSBNb2RpZnkgZmVhdHVyZXMuXG4gKlxuICogQHBhcmFtIGJvZHkgQSBGZWF0dXJlQ29sbGVjdGlvbiBvYmplY3Qgb3IgYSBGZWF0dXJlTW9kaWZpY2F0aW9uTGlzdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKi9cbmZ1bmN0aW9uIHBvc3RGZWF0dXJlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9mZWF0dXJlc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucG9zdEZlYXR1cmVzID0gcG9zdEZlYXR1cmVzO1xuLyoqXG4gKiBDcmVhdGVzIG9yIHJlcGxhY2VzIGEgZmVhdHVyZSBpbiB0aGUgbGF5ZXIuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIG9yIHJlcGxhY2UgYSBmZWF0dXJlLlxuICpcbiAqIEBwYXJhbSBib2R5IEEgZmVhdHVyZSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICpcbiAqIEBwYXJhbSBmZWF0dXJlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgZmVhdHVyZSBpbiB0aGUgbGF5ZXIuXG4gKi9cbmZ1bmN0aW9uIHB1dEZlYXR1cmUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXMve2ZlYXR1cmVJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZmVhdHVyZUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmVhdHVyZUlkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucHV0RmVhdHVyZSA9IHB1dEZlYXR1cmU7XG4vKipcbiAqIENyZWF0ZSBvciByZXBsYWNlIHRoZSBwcm92aWRlZCBmZWF0dXJlcy5cbiAqXG4gKiBAc3VtbWFyeSBDcmVhdGUgb3IgcmVwbGFjZSBtdWx0aXBsZSBmZWF0dXJlcy5cbiAqXG4gKiBAcGFyYW0gYm9keSBBIGZlYXR1cmUgY29sbGVjdGlvbiByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICovXG5mdW5jdGlvbiBwdXRGZWF0dXJlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9mZWF0dXJlc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wdXRGZWF0dXJlcyA9IHB1dEZlYXR1cmVzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFJlc291cmNlQVBJTGlzdCA9IGV4cG9ydHMucmVzb3VyY2VBUEkgPSBleHBvcnRzLmdldFBsYXRmb3JtQVBJTGlzdCA9IGV4cG9ydHMucGxhdGZvcm1BUEkgPSB2b2lkIDA7XG4vKipcbiAqIEFQSSBMb29rdXAgU2VydmljZSB2MVxuICogVGhlIEFQSSBMb29rdXAgU2VydmljZSBpcyBhIHBsYXRmb3JtIHNlcnZpY2Ugd2l0aCBmb2xsb3dpbmcgZ29hbHM6XG4gKiAtIFJlZGlyZWN0IHVzZXJzIHRvIFJFU1QgQVBJcyByZWxhdGVkIHRvIGEgcmVzb3VyY2UgaWRlbnRpZmllZCBieSBhbiBIUk5cbiAqIC0gR2l2ZW4gYW4gSFJOLCBwcm92aWRlIHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBpbiBSRVNUIEFQSXMgY2FsbHMuIC0gRGlzY292ZXJ5IG9mIG90aGVyIEhFUkUgQVBJcy5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjNcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFBsYXRmb3JtQXBpXG4gKi9cbi8qKlxuICogUmV0dXJuIGRldGFpbHMgb2YgYSBzaW5nbGUgcGxhdGZvcm0gQVBJLiBUaGlzIHJlc3BvbnNlIGlzIHZhbGlkIGZvciB0aGUgdGltZSBzcGVjaWZpZWQgYnkgJ0NhY2hlLUNvbnRyb2wnIGhlYWRlci5cbiAqXG4gKiBAc3VtbWFyeSBSZXR1cm4gZGV0YWlscyBvZiBhIHNpbmdsZSBwbGF0Zm9ybSBBUEkuXG4gKiBAcGFyYW0gYXBpIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBBUElcbiAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBBUElcbiAqL1xuZnVuY3Rpb24gcGxhdGZvcm1BUEkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3BsYXRmb3JtL2FwaXMve2FwaX0ve3ZlcnNpb259XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2FwaX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFwaVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInt2ZXJzaW9ufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widmVyc2lvblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wbGF0Zm9ybUFQSSA9IHBsYXRmb3JtQVBJO1xuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3Qgb2YgdGhlIEhFUkUgQVBJcy4gVGhpcyByZXNwb25zZSBpcyB2YWxpZCBmb3IgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5ICdDYWNoZS1Db250cm9sJyBoZWFkZXIuXG4gKlxuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBsaXN0IG9mIHRoZSBIRVJFIEFQSXMuXG4gKi9cbmZ1bmN0aW9uIGdldFBsYXRmb3JtQVBJTGlzdChidWlsZGVyKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3BsYXRmb3JtL2FwaXNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFBsYXRmb3JtQVBJTGlzdCA9IGdldFBsYXRmb3JtQVBJTGlzdDtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc291cmNlc0FwaVxuICovXG4vKipcbiAqIFJldHVybiBkZXRhaWxzIG9mIGEgc2luZ2xlIEFQSSBmb3IgYSBnaXZlbiByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IGhybiwgYXBpIGFuZCB2ZXJzaW9uLlxuICogVGhpcyByZXNwb25zZSBpcyB2YWxpZCBmb3IgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5ICdDYWNoZS1Db250cm9sJyBoZWFkZXIuXG4gKlxuICogQHN1bW1hcnkgUmV0dXJuIGRldGFpbHMgb2YgYSBzaW5nbGUgQVBJIGZvciBhIGdpdmVuIHJlc291cmNlLlxuICogQHBhcmFtIGhybiBUaGUgSFJOIGlkZW50aWZ5aW5nIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIGFwaSBUaGUgaWRlbnRpZmllciBvZiB0aGUgQVBJXG4gKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgQVBJXG4gKiBAcGFyYW0gcmVnaW9uIElmIHlvdSB3YW50IHRvIGxvb2sgdXAgYSBzcGVjaWZpYyByZWdpb24gZm9yIGEgZ2l2ZW4gcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIHJlc291cmNlQVBJKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve2hybn0vYXBpcy97YXBpfS97dmVyc2lvbn1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7aHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiaHJuXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2FwaX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFwaVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInt2ZXJzaW9ufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widmVyc2lvblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlZ2lvblwiLCBwYXJhbXNbXCJyZWdpb25cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlc291cmNlQVBJID0gcmVzb3VyY2VBUEk7XG4vKipcbiAqIFJldHVybiB0aGUgbGlzdCBvZiBBUElzIGZvciBhIGdpdmVuIHJlc291cmNlIGlkZW50aWZpZWQgYnkgaHJuLiBUaGlzIHJlc3BvbnNlIGlzIHZhbGlkIGZvciB0aGUgdGltZSBzcGVjaWZpZWQgYnkgJ0NhY2hlLUNvbnRyb2wnIGhlYWRlci5cbiAqXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGxpc3Qgb2YgQVBJcyBmb3IgYSBnaXZlbiByZXNvdXJjZS5cbiAqIEBwYXJhbSBocm4gVGhlIEhSTiBpZGVudGlmeWluZyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSByZWdpb24gSWYgeW91IHdhbnQgdG8gbG9vayB1cCBhIHNwZWNpZmljIHJlZ2lvbiBmb3IgYSBnaXZlbiByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzb3VyY2VBUElMaXN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve2hybn0vYXBpc1wiLnJlcGxhY2UoXCJ7aHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiaHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVnaW9uXCIsIHBhcmFtc1tcInJlZ2lvblwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlc291cmNlQVBJTGlzdCA9IGdldFJlc291cmNlQVBJTGlzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5taW5pbXVtVmVyc2lvbiA9IGV4cG9ydHMubGlzdFZlcnNpb25zID0gZXhwb3J0cy5sYXRlc3RWZXJzaW9uID0gZXhwb3J0cy5nZXRQYXJ0aXRpb25zID0gZXhwb3J0cy5nZXRMYXllclZlcnNpb25zID0gZXhwb3J0cy5nZXRDaGFuZ2VzID0gdm9pZCAwO1xuLyoqXG4gKiBNZXRhZGF0YSBBUEkgdjFcbiAqIFRoZSBgbWV0YWRhdGFgIHNlcnZpY2UgcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IGluZm9ybWF0aW9uIChtZXRhZGF0YSkgYWJvdXQgbGF5ZXJzIGFuZCBwYXJ0aXRpb25zIHN0b3JlZCBpbiBhIGNhdGFsb2cuXG4gKiBUaGlzIHNlcnZpY2UgZXhwb3NlcyB0aGUgbWV0YWRhdGEgZm9yIGFsbCB0aGUgcGFydGl0aW9ucyBvciBhbGwgdGhlIGNoYW5nZWQgcGFydGl0aW9ucy4gRm9yIGEgY2F0YWxvZyB3aXRoIHZlcnNpb25lZCBsYXllcnMsXG4gKiB5b3UgY2FuIHJldHJpZXZlIG1ldGFkYXRhIGZvciBhIHBhcnRpY3VsYXIgdmVyc2lvbiBvciB2ZXJzaW9uIHJhbmdlIG9mIHRoZSBjYXRhbG9nLlxuICogWW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBmb3IgYSBjYXRhbG9nIHdpdGggdmVyc2lvbmVkIGxheWVyczpcbiAqIC0gTGlzdCB2ZXJzaW9ucyBvZiB0aGUgY2F0YWxvZyAtIEdldCBsYXRlc3QgYW5kIG1pbmltdW0gdmVyc2lvbiBvZiB0aGUgY2F0YWxvZ1xuICogLSBHZXQgbWV0YWRhdGEgb2YgdGhlIHNwZWNpZmljIGxheWVycyAgRm9yIGEgdm9sYXRpbGUgbGF5ZXIsIHlvdSBjYW4gZ2V0IG1ldGFkYXRhIGZvciBhbGwgb3IgYSBzdWJzZXQgb2YgcGFydGl0aW9ucyBvZiB0aGUgbGF5ZXIuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC4wXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBNZXRhZGF0YUFwaVxuICovXG4vKipcbiAqIEdldHMgdGhlIGxhdGVzdCBwYXJ0aXRpb24gbWV0YWRhdGEgaW4gYSB2ZXJzaW9uIHJhbmdlIGZvciBhIHZlcnNpb25lZCBsYXllciBvciBhIHRpbWUgcmFuZ2UgZm9yIGEgdm9sYXRpbGUgbGF5ZXIuXG4gKiBGb3IgdmVyc2lvbmVkIGxheWVycyB0aGUgcmFuZ2UgaXMgZXhwcmVzc2VkIGFzIGEgc3RhcnQgYW5kIGVuZCB2ZXJzaW9uIGFuZCBtaWdodCBub3QgcmV0dXJuIGFsbCBjaGFuZ2VzIGZvciB0aGUgcGFydGl0aW9uc1xuICogd2hpY2ggd2VyZSBhZGRlZCBhbmQgcmVtb3ZlZCBpbiBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RhcnQgYW5kIGVuZCB2ZXJzaW9ucy5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGNoYW5nZXMgZm9yIHRoZSB2ZXJzaW9uIHJhbmdlLlxuICogQHBhcmFtIGxheWVySWQgVW5pcXVlIGxheWVyIElELiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYSB2YWxpZCBsYXllciBJRC5cbiAqIEBwYXJhbSBzdGFydFZlcnNpb24gTWFuZGF0b3J5IGZvciB2ZXJzaW9uZWQgbGF5ZXJzOyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYW5nZSBvZiB2ZXJzaW9ucyB5b3Ugd2FudCB0byBnZXQgKGV4Y2x1c2l2ZSkuXG4gKiBCeSBjb252ZW50aW9uIC0xIGluZGljYXRlcyB0aGUgaW5pdGlhbCB2ZXJzaW9uIGJlZm9yZSB0aGUgZmlyc3QgcHVibGljYXRpb24uIEFmdGVyIHRoZSBmaXJzdCBwdWJsaWNhdGlvbiwgdGhlIGNhdGFsb2cgdmVyc2lvbiBpcyAwLlxuICogQHBhcmFtIGVuZFZlcnNpb24gTWFuZGF0b3J5IGZvciB2ZXJzaW9uZWQgbGF5ZXJzOyB0aGUgZW5kIG9mIHRoZSByYW5nZSBvZiB2ZXJzaW9ucyB5b3Ugd2FudCB0byBnZXQgKGluY2x1c2l2ZSkuXG4gKiBUaGlzIG11c3QgYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24gZ3JlYXRlciB0aGFuIHRoZSBzdGFydFZlcnNpb24uXG4gKiBAcGFyYW0gc2luY2VUaW1lIE1hbmRhdG9yeSBmb3Igdm9sYXRpbGUgbGF5ZXJzOyB3aWxsIHJldHVybiBwYXJ0aXRpb25zIHdob3NlIGRhdGEgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhpcyB0aW1lLFxuICogaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoLCBpbmNsdXNpdmUuXG4gKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBBZGRpdGlvbmFsIGZpZWxkcyAtICYjeDYwO2RhdGFTaXplJiN4NjA7LCAmI3g2MDtjaGVja3N1bSYjeDYwOywgJiN4NjA7Y29tcHJlc3NlZERhdGFTaXplJiN4NjA7XG4gKiBAcGFyYW0gcmFuZ2UgVXNlIHRoaXMgcGFyYW1ldGVyIHRvIHJlc3VtZSBkb3dubG9hZCBvZiBhIGxhcmdlIHJlc3BvbnNlIGZvciB2ZXJzaW9uZWQgbGF5ZXJzIHdoZW4gdGhlcmVcbiAqICBpcyBhIGNvbm5lY3Rpb24gaXNzdWUgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIuIFNwZWNpZnkgYSBzaW5nbGUgYnl0ZSByYW5nZSBvZmZzZXQgbGlrZSB0aGlzOiAmI3g2MDtSYW5nZTogYnl0ZXMmI3gzRDsxMC0mI3g2MDsuXG4gKiAgVGhpcyBwYXJhbWV0ZXIgaXMgY29tcGxpYW50IHdpdGggW1JGQyA3MjMzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMyksXG4gKiBidXQgbm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgYnl0ZSByYW5nZS5cbiAqIFRoZSAmI3g2MDtyYW5nZSYjeDYwOyBwYXJhbWV0ZXIgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGFzIGEgcXVlcnkgcGFyYW1ldGVyLCBpLmUuICYjeDYwO3JhbmdlJiN4M0Q7Ynl0ZXMmI3gzRDsxMC0mI3g2MDsuXG4gKiBGb3Igdm9sYXRpbGUgbGF5ZXJzIHVzZSB0aGUgcGFnaW5hdGlvbiBsaW5rcyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keS5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBnZXRDaGFuZ2VzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2NoYW5nZXNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhcnRWZXJzaW9uXCIsIHBhcmFtc1tcInN0YXJ0VmVyc2lvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbmRWZXJzaW9uXCIsIHBhcmFtc1tcImVuZFZlcnNpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2luY2VUaW1lXCIsIHBhcmFtc1tcInNpbmNlVGltZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJhZGRpdGlvbmFsRmllbGRzXCIsIHBhcmFtc1tcImFkZGl0aW9uYWxGaWVsZHNcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wicmFuZ2VcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlJhbmdlXCJdID0gcGFyYW1zW1wicmFuZ2VcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0Q2hhbmdlcyA9IGdldENoYW5nZXM7XG4vKipcbiAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgbGF5ZXIgdmVyc2lvbnMgZm9yIHRoZSBjYXRhbG9nIHZlcnNpb24uXG4gKiBJdCB3aWxsIHJldHVybiBhbiBlcnJvciBpZiB0aGUgY2F0YWxvZyBkb2VzIG5vdCBoYXZlIGFueSB2ZXJzaW9ucyBvciBpZiB0aGUgdmVyc2lvbiBwYXNzZWQgaW4gdGhlIHF1ZXJ5IHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC5cbiAqIElmIGEgbGF5ZXIgZG9lcyBub3QgaGF2ZSBhbnkgZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGl0IGlzIGV4Y2x1ZGVkIGZyb20gdGhlIHJlc3BvbnNlLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgbGF5ZXIgdmVyc2lvbnMgZm9yIGNhdGFsb2cgdmVyc2lvblxuICogQHBhcmFtIHZlcnNpb24gQ2F0YWxvZyB2ZXJzaW9uXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGdldExheWVyVmVyc2lvbnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVyVmVyc2lvbnNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ2ZXJzaW9uXCIsIHBhcmFtc1tcInZlcnNpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRMYXllclZlcnNpb25zID0gZ2V0TGF5ZXJWZXJzaW9ucztcbi8qKlxuICogR2V0cyB0aGUgbWV0YWRhdGEgZm9yIGFsbCBwYXJ0aXRpb25zIGluIGEgc3BlY2lmaWMgbGF5ZXIuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgbGF5ZXIgSUQuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIGxheWVyIElELlxuICogQHBhcmFtIHZlcnNpb24gSWYgeW91IGFyZSBnZXR0aW5nIG1ldGFkYXRhIGZyb20gYSB2ZXJzaW9uZWQgbGF5ZXIsIHNwZWNpZnkgdGhlIHZlcnNpb24gb2YgdGhlIGxheWVyIHlvdSB3YW50LlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgZm9yIHZlcnNpb25lZCBsYXllcnMuIElmIHlvdSBhcmUgZ2V0dGluZyBtZXRhZGF0YSBmcm9tIGFub3RoZXIgbGF5ZXIgdHlwZSwgZG8gbm90IHNwZWNpZnkgdGhpcyBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBBZGRpdGlvbmFsIGZpZWxkcyAtICYjeDYwO2RhdGFTaXplJiN4NjA7LCAmI3g2MDtjaGVja3N1bSYjeDYwOywgJiN4NjA7Y29tcHJlc3NlZERhdGFTaXplJiN4NjA7XG4gKiBAcGFyYW0gcmFuZ2UgVXNlIHRoaXMgcGFyYW1ldGVyIHRvIHJlc3VtZSBkb3dubG9hZCBvZiBhIGxhcmdlIHJlc3BvbnNlIGZvciB2ZXJzaW9uZWQgbGF5ZXJzIHdoZW4gdGhlcmUgaXMgYSBjb25uZWN0aW9uXG4gKiBpc3N1ZSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4gU3BlY2lmeSBhIHNpbmdsZSBieXRlIHJhbmdlIG9mZnNldCBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudCB3aXRoIFtSRkMgNzIzM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMpLFxuICogYnV0IG5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGJ5dGUgcmFuZ2UuXG4gKiBUaGUgJiN4NjA7cmFuZ2UmI3g2MDsgcGFyYW1ldGVyIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBhIHF1ZXJ5IHBhcmFtZXRlciwgaS5lLiAmI3g2MDtyYW5nZSYjeDNEO2J5dGVzJiN4M0Q7MTAtJiN4NjA7LlxuICogRm9yIHZvbGF0aWxlIGxheWVycyB1c2UgdGhlIHBhZ2luYXRpb24gbGlua3MgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBnZXRQYXJ0aXRpb25zKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3BhcnRpdGlvbnNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidmVyc2lvblwiLCBwYXJhbXNbXCJ2ZXJzaW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImFkZGl0aW9uYWxGaWVsZHNcIiwgcGFyYW1zW1wiYWRkaXRpb25hbEZpZWxkc1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJyYW5nZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiUmFuZ2VcIl0gPSBwYXJhbXNbXCJyYW5nZVwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRQYXJ0aXRpb25zID0gZ2V0UGFydGl0aW9ucztcbi8qKlxuICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGF0ZXN0IHZlcnNpb24gZm9yIHRoZSBnaXZlbiBjYXRhbG9nLiBJZiB0aGUgY2F0YWxvZyBkb2Vzbid0IGNvbnRhaW4gYW55IHZlcnNpb25zIGEgNDA0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKlxuICogQHN1bW1hcnkgR2V0cyB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBjYXRhbG9nIHZlcnNpb25cbiAqIEBwYXJhbSBzdGFydFZlcnNpb24gVGhlIGNhdGFsb2cgdmVyc2lvbiByZXR1cm5lZCBmcm9tIGEgcHJpb3IgcmVxdWVzdCB0byAmI3g2MDsvdmVyc2lvbnMvbGF0ZXN0JiN4NjA7LlxuICogWW91IHNob3VsZCBzYXZlIHRoZSB2ZXJzaW9uIGZyb20gZWFjaCByZXF1ZXN0IHNvIHRoYXQgeW91IGNhbiB1c2UgaXQgaW4gdGhlICYjeDYwO3N0YXJ0VmVyc2lvbiYjeDYwOyBwYXJhbWV0ZXIgb2Ygc3Vic2VxdWVudCByZXF1ZXN0cy5cbiAqIElmIHlvdSBkb24mIzM5O3QgaGF2ZSB0aGUgdmVyc2lvbiBmcm9tIGEgcHJpb3IgcmVxdWVzdCwgc2V0IHRoZSBwYXJhbWV0ZXIgdG8gLTEuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gbGF0ZXN0VmVyc2lvbihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvdmVyc2lvbnMvbGF0ZXN0XCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhcnRWZXJzaW9uXCIsIHBhcmFtc1tcInN0YXJ0VmVyc2lvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxhdGVzdFZlcnNpb24gPSBsYXRlc3RWZXJzaW9uO1xuLyoqXG4gKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGNhdGFsb2cgdmVyc2lvbihzKS5cbiAqIElmIHRoZSBjYXRhbG9nIGRvZXNuJ3QgY29udGFpbiBhbnkgdmVyc2lvbnMgNDA0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBNYXhpbXVtIG51bWJlciBvZiB2ZXJzaW9ucyB0byBiZSByZXR1cm5lZCBwZXIgY2FsbCBpcyAxMDAwIHZlcnNpb25zLlxuICogSWYgcmVxdWVzdGVkIHJhbmdlIGlzIGJpZ2dlciB0aGFuIDEwMDAgdmVyc2lvbnMgNDAwIEJhZCBSZXF1ZXN0IHdpbGwgYmUgcmV0dXJuZWRcbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGNhdGFsb2cgdmVyc2lvbnNcbiAqIEBwYXJhbSBzdGFydFZlcnNpb24gVGhlIGJlZ2lubmluZyBvZiB0aGUgcmFuZ2Ugb2YgdmVyc2lvbnMgeW91IHdhbnQgdG8gZ2V0IChleGNsdXNpdmUpLlxuICogQnkgY29udmVudGlvbiAtMSBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uLiBBZnRlciB0aGUgZmlyc3QgcHVibGljYXRpb24sIHRoZSBjYXRhbG9nIHZlcnNpb24gaXMgMC5cbiAqIEBwYXJhbSBlbmRWZXJzaW9uIFRoZSBlbmQgb2YgdGhlIHJhbmdlIG9mIHZlcnNpb25zIHlvdSB3YW50IHRvIGdldCAoaW5jbHVzaXZlKS5cbiAqIFRoaXMgbXVzdCBiZSBhIHZhbGlkIGNhdGFsb2cgdmVyc2lvbiBncmVhdGVyIHRoYW4gdGhlIHN0YXJ0VmVyc2lvbi5cbiAqIFRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyByZXR1cm5lZCBmcm9tIHRoZSAmI3g2MDsvdmVyc2lvbnMvbGF0ZXN0JiN4NjA7IGVuZHBvaW50LlxuICogSWYgdGhpcyB2ZXJzaW9uIGRvZXMgbm90IGV4aXN0LCA0MDAgQmFkIFJlcXVlc3QgaXMgcmV0dXJuZWRcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBsaXN0VmVyc2lvbnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25zXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhcnRWZXJzaW9uXCIsIHBhcmFtc1tcInN0YXJ0VmVyc2lvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbmRWZXJzaW9uXCIsIHBhcmFtc1tcImVuZFZlcnNpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5saXN0VmVyc2lvbnMgPSBsaXN0VmVyc2lvbnM7XG4vKipcbiAqIFJldHVybnMgbWluaW11bSB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gY2F0YWxvZy4gSWYgdGhlIGNhdGFsb2cgZG9lc24ndCBjb250YWluIGFueSB2ZXJzaW9ucyA0MDQgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBlYXJsaWVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gbWluaW11bVZlcnNpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25zL21pbmltdW1cIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLm1pbmltdW1WZXJzaW9uID0gbWluaW11bVZlcnNpb247XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLiBhbmQgaXRzIGFmZmlsaWF0ZShzKS5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBhbmQgb3RoZXIgbWF0ZXJpYWxzIGNvbnRhaW4gcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25cbiAqIGNvbnRyb2xsZWQgYnkgSEVSRSBhbmQgYXJlIHByb3RlY3RlZCBieSBhcHBsaWNhYmxlIGNvcHlyaWdodCBsZWdpc2xhdGlvbi5cbiAqIEFueSB1c2UgYW5kIHV0aWxpemF0aW9uIG9mIHRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBhbmRcbiAqIGRpc2Nsb3N1cmUgdG8gYW55IHRoaXJkIHBhcnRpZXMgaXMgY29uZGl0aW9uYWwgdXBvbiBoYXZpbmcgYSBzZXBhcmF0ZVxuICogYWdyZWVtZW50IHdpdGggSEVSRSBmb3IgdGhlIGFjY2VzcywgdXNlLCB1dGlsaXphdGlvbiBvciBkaXNjbG9zdXJlIG9mIHRoaXNcbiAqIHNvZnR3YXJlLiBJbiB0aGUgYWJzZW5jZSBvZiBzdWNoIGFncmVlbWVudCwgdGhlIHVzZSBvZiB0aGUgc29mdHdhcmUgaXMgbm90XG4gKiBhbGxvd2VkLlxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudXBsb2FkUGFydGl0aW9ucyA9IGV4cG9ydHMuc3VibWl0UHVibGljYXRpb24gPSBleHBvcnRzLmluaXRQdWJsaWNhdGlvbiA9IGV4cG9ydHMuZ2V0UHVibGljYXRpb24gPSBleHBvcnRzLmNhbmNlbFB1YmxpY2F0aW9uID0gdm9pZCAwO1xuLyoqXG4gKiBQdWJsaXNoIEFQSSB2MlxuICogTm8gZGVzY3JpcHRpb24gcHJvdmlkZWQgKGdlbmVyYXRlZCBieSBTd2FnZ2VyIENvZGVnZW4gaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbilcbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMi4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdWJsaXNoQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQ2FuY2VscyBhIHB1YmxpY2F0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkLlxuICogV2lsbCBmYWlsIGlmIGF0dGVtcHRpbmcgdG8gY2FuY2VsIGEgc3VibWl0dGVkIHB1YmxpY2F0aW9uLlxuICogVGhpcyBhbGxvd3MgdGhlIHNwZWNpZmllZCBwdWJsaWNhdGlvbiB0byBiZSBhYmFuZG9uZWQuXG4gKiBTZWUgRGF0YSBBUEkgRGV2ZWxvcGVy4oCZcyBHdWlkZSBpbiB0aGUgRG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBwdWJsaWNhdGlvbiBzdGF0ZXMgZGlhZ3JhbVxuICogYW5kIGFsbCBwb3NzaWJsZSBwdWJsaWNhdGlvbiBzdGF0ZXMgdHJhbnNpdGlvbnMuXG4gKlxuICogQHN1bW1hcnkgQ2FuY2VscyBhIHB1YmxpY2F0aW9uXG4gKiBAcGFyYW0gcHVibGljYXRpb25JZCBUaGUgSUQgb2YgdGhlIHB1YmxpY2F0aW9uIHRvIGNhbmNlbC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gY2FuY2VsUHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH1cIi5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jYW5jZWxQdWJsaWNhdGlvbiA9IGNhbmNlbFB1YmxpY2F0aW9uO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBkZXRhaWxzIG9mIHRoZSBzcGVjaWZpZWQgcHVibGljYXRpb24uXG4gKlxuICogUHVibGljYXRpb24gY2FuIGJlIGluIG9uZSBvZiB0aGVzZSBzdGF0ZXM6XG4gKiAgLSBJbml0aWFsaXplZCxcbiAqICAtIFN1Ym1pdHRlZCxcbiAqICAtIENhbmNlbGxlZCxcbiAqICAtIEZhaWxlZCxcbiAqICAtIFN1Y2NlZWRlZCxcbiAqICAtIEV4cGlyZWQuXG4gKlxuICogU2VlIERhdGEgQVBJIERldmVsb3BlcuKAmXMgR3VpZGUgaW4gdGhlIERvY3VtZW50YXRpb24gc2VjdGlvbiBmb3IgdGhlIHB1YmxpY2F0aW9uIHN0YXRlIGRpYWdyYW0uXG4gKlxuICogQHN1bW1hcnkgR2V0cyBhIHB1YmxpY2F0aW9uXG4gKiBAcGFyYW0gcHVibGljYXRpb25JZCBUaGUgSUQgb2YgdGhlIHB1YmxpY2F0aW9uIHRvIHJldHJpZXZlLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBnZXRQdWJsaWNhdGlvbihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHVibGljYXRpb25zL3twdWJsaWNhdGlvbklkfVwiLnJlcGxhY2UoXCJ7cHVibGljYXRpb25JZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInB1YmxpY2F0aW9uSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFB1YmxpY2F0aW9uID0gZ2V0UHVibGljYXRpb247XG4vKipcbiAqIEluaXRpYWxpemVzIGEgbmV3IHB1YmxpY2F0aW9uIGZvciBwdWJsaXNoaW5nIG1ldGFkYXRhLlxuICogRGV0ZXJtaW5lcyB0aGUgcHVibGljYXRpb24gdHlwZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbGF5ZXIgSURzLlxuICogQSBwdWJsaWNhdGlvbiBjYW4gb25seSBjb25zaXN0IG9mIGxheWVyIElEcyB0aGF0IGhhdmUgdGhlIHNhbWUgbGF5ZXIgdHlwZS5cbiAqIEZvciBleGFtcGxlLCB5b3UgY2FuIGhhdmUgYSBwdWJsaWNhdGlvbiBmb3IgbXVsdGlwbGUgbGF5ZXJzIG9mIHR5cGUgYHZlcnNpb25lZGAsXG4gKiBidXQgeW91IGNhbm5vdCBoYXZlIGEgc2luZ2xlIHB1YmxpY2F0aW9uIHRoYXQgcHVibGlzaGVzIHRvIGJvdGggYHZlcnNpb25lZGAgYW5kIGBzdHJlYW1gIGxheWVycy5cbiAqIEluIGFkZGl0aW9uLCB5b3UgbWF5IG9ubHkgaGF2ZSBvbmUgYHZlcnNpb25lZGAgb3IgYHZvbGF0aWxlYCBwdWJsaWNhdGlvbiBpbiBwcm9jZXNzIGF0IGEgdGltZS5cbiAqIFlvdSBjYW5ub3QgaGF2ZSBtdWx0aXBsZSBhY3RpdmUgcHVibGljYXRpb25zIHRvIHRoZSBzYW1lIGNhdGFsb2cgZm9yIGB2ZXJzaW9uZWRgIGFuZCBgdm9sYXRpbGVgIGxheWVyIHR5cGVzLlxuICogVGhlIGJvZHkgZmllbGQgYHZlcnNpb25EZXBlbmRlbmNpZXNgIGlzIG9wdGlvbmFsIGFuZCBpcyB1c2VkIGZvciBgdmVyc2lvbmVkYCBsYXllcnMgdG8gZGVjbGFyZSB2ZXJzaW9uIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAc3VtbWFyeSBJbml0aWFsaXplIGEgbmV3IHB1YmxpY2F0aW9uXG4gKiBAcGFyYW0gYm9keSBGaWVsZHMgdG8gaW5pdGlhbGl6ZSBhIHB1YmxpY2F0aW9uLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdFB1YmxpY2F0aW9uKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wdWJsaWNhdGlvbnNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmluaXRQdWJsaWNhdGlvbiA9IGluaXRQdWJsaWNhdGlvbjtcbi8qKlxuICogU3VibWl0cyB0aGUgcHVibGljYXRpb24gYW5kIGluaXRpYXRlcyBwb3N0IHByb2Nlc3NpbmcgaWYgbmVjZXNzYXJ5LlxuICogUHVibGljYXRpb24gc3RhdGUgYmVjb21lcyBgU3VibWl0dGVkYCBkaXJlY3RseSBhZnRlciBzdWJtaXNzaW9uIGFuZCBgU3VjY2VlZGVkYCBhZnRlciBzdWNjZXNzZnVsIHByb2Nlc3NpbmcuXG4gKiBTZWUgRGF0YSBBUEkgRGV2ZWxvcGVy4oCZcyBHdWlkZSBpbiB0aGUgRG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBjb21wbGV0ZSBwdWJsaWNhdGlvbiBzdGF0ZXMgZGlhZ3JhbS5cbiAqXG4gKiBAc3VtbWFyeSBTdWJtaXRzIGEgcHVibGljYXRpb25cbiAqIEBwYXJhbSBwdWJsaWNhdGlvbklkIElEIG9mIHB1YmxpY2F0aW9uIHRvIHN1Ym1pdC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gc3VibWl0UHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH1cIi5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc3VibWl0UHVibGljYXRpb24gPSBzdWJtaXRQdWJsaWNhdGlvbjtcbi8qKlxuICogVXBsb2FkIHBhcnRpdGlvbnMgdG8gdGhlIGdpdmVuIGxheWVyLlxuICogRGVwZW5kZW5kaW5nIG9uIHRoZSBwdWJsaWNhdGlvbiB0eXBlLCBwb3N0IHByb2Nlc3NpbmcgbWF5IGJlIHJlcXVpcmVkIGJlZm9yZSB0aGUgcGFydGl0aW9ucyBhcmUgcHVibGlzaGVkLlxuICogRm9yIGJldHRlciBwZXJmb3JtYW5jZSBiYXRjaCB5b3VyIHBhcnRpdGlvbnMgKGUuZy4gMTAwMCBwZXIgcmVxdWVzdCksIHJhdGhlciB0aGFuIHVwbG9hZGluZyB0aGVtIGluZGl2aWR1YWxseS5cbiAqXG4gKiBAc3VtbWFyeSBVcGxvYWQgcGFydGl0aW9uc1xuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBwdWJsaXNoIHRvLlxuICogQHBhcmFtIHB1YmxpY2F0aW9uSWQgVGhlIElEIG9mIHB1YmxpY2F0aW9uIHRvIHB1Ymxpc2ggdG8uXG4gKiBAcGFyYW0gYm9keSBQdWJsaWNhdGlvbiBwYXJ0aXRpb25zLiBEYXRhIGFuZCBEYXRhSGFuZGxlIGZpZWxkcyBjYW5ub3QgYmUgcG9wdWxhdGVkIGF0IHRoZSBzYW1lIHRpbWUuXG4gKiBTZWUgUGFydGl0aW9uIG9iamVjdCBmb3IgbW9yZSBkZXRhaWxzIG9uIGJvZHkgZmllbGRzXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIHVwbG9hZFBhcnRpdGlvbnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vcHVibGljYXRpb25zL3twdWJsaWNhdGlvbklkfS9wYXJ0aXRpb25zXCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBsb2FkUGFydGl0aW9ucyA9IHVwbG9hZFBhcnRpdGlvbnM7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucXVhZFRyZWVJbmRleFZvbGF0aWxlID0gZXhwb3J0cy5xdWFkVHJlZUluZGV4ID0gZXhwb3J0cy5nZXRQYXJ0aXRpb25zQnlJZCA9IGV4cG9ydHMuZ2V0Q2hhbmdlc0J5SWQgPSB2b2lkIDA7XG4vKipcbiAqIFF1ZXJ5IEFQSSB2MVxuICogVGhlIGBxdWVyeWAgc2VydmljZSBwcm92aWRlcyBhIHdheSB0byBnZXQgaW5mb3JtYXRpb24gKG1ldGFkYXRhKSBhYm91dCBsYXllcnMgYW5kIHBhcnRpdGlvbnMgc3RvcmVkIGluIGEgY2F0YWxvZy5cbiAqIFRoaXMgc2VydmljZSBleHBvc2VzIHRoZSBtZXRhZGF0YSBmb3Igc2luZ2xlIHBhcnRpdGlvbnMgdGhhdCB1c2VycyBjYW4gcXVlcnkgb25lIGJ5IG9uZSBvciBieSBzcGVjaWZ5aW5nIGEgcGFyZW50IHRpbGUuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC4xXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBRdWVyeUFwaVxuICovXG4vKipcbiAqIEdldHMgdGhlIGxhdGVzdCBwYXJ0aXRpb24gY2hhbmdlcyBmb3IgYSB2ZXJzaW9uIHJhbmdlIGluIGEgdmVyc2lvbmVkIGxheWVyIG9yIGEgdGltZSByYW5nZVxuICogZm9yIGEgdm9sYXRpbGUgbGF5ZXIuIE9ubHkgdGhlIGxhdGVzdCBjaGFuZ2UgZm9yIGVhY2ggY2hhbmdlZCBwYXJ0aXRpb24gaXMgcmV0dXJuZWQsIG5vdFxuICogIGludGVybWVkaWF0ZSBjaGFuZ2VzLiBJZiB0aGUgcmVzcG9uc2UgY29udGFpbnMgYSBwYXJ0aXRpb24gd2l0aCBhbiBlbXB0eSAnZGF0YUhhbmRsZScgdmFsdWUsXG4gKiAgdGhlIHBhcnRpdGlvbiB3YXMgZGVsZXRlZCBhdCB0aGUgdmVyc2lvbiBpbmRpY2F0ZWQgYnkgdGhlICd2ZXJzaW9uJyBmaWVsZCBvZiB0aGUgcGFydGl0aW9uIG9iamVjdC5cbiAqICBJZiBhIHBhcnRpdGlvbiB3YXMgY3JlYXRlZCBhbmQgZGVsZXRlZCBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyBzcGVjaWZpZWQgaW4gdGhlICdzdGFydFZlcnNpb24nIGFuZCAnZW5kVmVyc2lvbidcbiAqIHBhcmFtZXRlcnMsIHRoZSBwYXJ0aXRpb24gaXMgbm90IGluY2x1ZGVkIGluIHRoZSByZXNwb25zZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSByZXF1ZXN0IHZlcnNpb25zIDAgdG8gMTAsIGFuZCBhXG4gKiBwYXJ0aXRpb24gd2FzIGNyZWF0ZWQgaW4gdmVyc2lvbiAzIHRoZW4gZGVsZXRlZCBpbiB2ZXJzaW9uIDcsIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBjaGFuZ2VzIGZvciB0aGUgdmVyc2lvbiBvciB0aW1lIHJhbmdlIGZvciB0aGUgc3BlY2lmaWMgcGFydGl0aW9uKHMpLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuIFRoZSB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBtdXN0IHJlZmVyIHRvIGFcbiAqICB2YWxpZCBsYXllciBhbHJlYWR5IGNvbmZpZ3VyZWQgaW4gdGhlIGNhdGFsb2cgY29uZmlndXJhdGlvbi4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGxheWVycyBhcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0gcGFydGl0aW9uIFRoZSBwYXJ0aXRpb25zIHlvdSB3YW50IHRvIGluY2x1ZGUgaW4gdGhlIHJlc3BvbnNlLiBUaGlzIGFsbG93cyB5b3UgdG8gbGltaXQgdGhlIHJlc3BvbnNlIHRvXG4gKiBzcGVjaWZpYyBwYXJ0aXRpb25zLiBZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgcGFydGl0aW9ucyBieSB1c2luZyB0aGlzIHBhcmFtZXRlciBtdWx0aXBsZSB0aW1lcy4gVGhlIG1heGltdW1cbiAqICBudW1iZXIgb2YgcGFydGl0aW9ucyBwZXIgY2FsbCBpcyAxMDAuXG4gKiBAcGFyYW0gc3RhcnRWZXJzaW9uIFN0YXJ0IHZlcnNpb24gZm9yIHRoZSBjYXRhbG9nIChleGNsdXNpdmUpLiBCeSBjb252ZW50aW9uIC0xIGluZGljYXRlcyB0aGUgdmlydHVhbCBpbml0aWFsXG4gKiAgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uIHdoaWNoIHdpbGwgaGF2ZSB2ZXJzaW9uIDAuXG4gKiBAcGFyYW0gZW5kVmVyc2lvbiBFbmQgdmVyc2lvbiAoaW5jbHVzaXZlKS4gVGhpcyBoYXMgdG8gYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24gZ3JlYXRlciB0aGFuIHRoZSBzdGFydFZlcnNpb24uXG4gKiBAcGFyYW0gc2luY2VUaW1lIFdpbGwgcmV0dXJuIHBhcnRpdGlvbnMgd2hvc2UgZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGlzIHRpbWUsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCwgaW5jbHVzaXZlLlxuICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgQWRkaXRpb25hbCBmaWVsZHMgLSAmI3g2MDtkYXRhU2l6ZSYjeDYwOywgJiN4NjA7Y2hlY2tzdW0mI3g2MDssICYjeDYwO2NvbXByZXNzZWREYXRhU2l6ZSYjeDYwOy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2hhbmdlc0J5SWQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vY2hhbmdlc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdGFydFZlcnNpb25cIiwgcGFyYW1zW1wic3RhcnRWZXJzaW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImVuZFZlcnNpb25cIiwgcGFyYW1zW1wiZW5kVmVyc2lvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzaW5jZVRpbWVcIiwgcGFyYW1zW1wic2luY2VUaW1lXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImFkZGl0aW9uYWxGaWVsZHNcIiwgcGFyYW1zW1wiYWRkaXRpb25hbEZpZWxkc1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYXJ0aXRpb25cIiwgcGFyYW1zW1wicGFydGl0aW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0Q2hhbmdlc0J5SWQgPSBnZXRDaGFuZ2VzQnlJZDtcbi8qKlxuICogR2V0cyBtZXRhZGF0YSBmb3Igc3BlY2lmaWMgcGFydGl0aW9uIGlkcy4gSWYgdGhlIGxheWVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBleGlzdCwgdGhlIHJlcXVlc3QgcmVzdWx0cyBpbiBhbiBlcnJvci5cbiAqIElmIGEgcGFydGl0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBleGlzdCwgdGhlIHJlc3BvbnNlIGRvZXMgbm90IGluY2x1ZGUgdGhpcyBwYXJ0aXRpb24uXG4gKiAgTWF4aW11biBhbGxvd2VkIG51bWJlciBvZiBwYXJ0aXRpb25zIGlkcyBwZXIgY2FsbCBpcyAxMDAuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBtZXRhZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4gVGhlIGNvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXJcbiAqICBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgbGF5ZXIgYWxyZWFkeSBjb25maWd1cmVkIGluIHRoZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24uXG4gKiAgWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIHBhcnRpdGlvbnMgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuXG4gKiBAcGFyYW0gcGFydGl0aW9uIFBhcnRpdGlvbiBpZHMgdG8gdXNlIGZvciBmaWx0ZXJpbmcuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZVxuICogIHBhcnRpdGlvbnMgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuIE1heGltdW0gYWxsb3dlZCBwYXJ0aXRpb25zIGlkcyBwZXIgY2FsbCBpcyAxMDAuXG4gKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZyBhZ2FpbnN0IHdoaWNoIHRvIHJ1biB0aGUgcXVlcnkuIE11c3QgYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24uXG4gKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBBZGRpdGlvbmFsIGZpZWxkcyAtICYjeDYwO2RhdGFTaXplJiN4NjA7LCAmI3g2MDtjaGVja3N1bSYjeDYwOywgJiN4NjA7Y29tcHJlc3NlZERhdGFTaXplJiN4NjA7XG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmdcbiAqICByZWNvcmRzIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpY1xuICogQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFBhcnRpdGlvbnNCeUlkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3BhcnRpdGlvbnNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBwYXJhbXNbXCJwYXJ0aXRpb25cIl0uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcnRpdGlvblwiLCBpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ2ZXJzaW9uXCIsIHBhcmFtc1tcInZlcnNpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0UGFydGl0aW9uc0J5SWQgPSBnZXRQYXJ0aXRpb25zQnlJZDtcbi8qKlxuICogR2V0cyBtZXRhZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCBpbmRleC4gT25seSBhdmFpbGFibGUgZm9yIHZlcnNpb25lZCBsYXllcnMgd2hlcmUgdGhlIHBhcnRpdGlvbmluZyBzY2hlbWUgaXMgYGhlcmV0aWxlYC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGluZGV4IG1ldGFkYXRhIG9mIHZlcnNpb25lZFxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuIENvbnRlbnQgb2YgdGhpc1xuICogcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYSB2YWxpZCBsYXllciBhbHJlYWR5IGNvbmZpZ3VyZWQgaW4gdGhlIGNhdGFsb2cgY29uZmlndXJhdGlvbi4gRXhhY3RseSBvbmUgbGF5ZXIgSUQgbXVzdCBiZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBjYXRhbG9nIGFnYWluc3Qgd2hpY2ggdG8gcnVuIHRoZSBxdWVyeS4gTXVzdCBiZSBhIHZhbGlkIGNhdGFsb2cgdmVyc2lvbi5cbiAqIEBwYXJhbSBxdWFkS2V5IFRoZSBnZW9tZXRyaWMgYXJlYSBzcGVjaWZpZWQgYnkgYW4gaW5kZXggaW4gdGhlIHJlcXVlc3QsIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlXG4gKiBAcGFyYW0gZGVwdGggVGhlIHJlY3Vyc2lvbiBkZXB0aCBvZiB0aGUgcmVzcG9uc2UuIElmIHNldCB0byAwLCB0aGUgcmVzcG9uc2UgaW5jbHVkZXNcbiAqICBvbmx5IGRhdGEgZm9yIHRoZSBxdWFkS2V5IHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4gSW4gdGhpcyB3YXksIGRlcHRoIGRlc2NyaWJlcyB0aGVcbiAqIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdWJRdWFkS2V5cyBpbiB0aGUgcmVzcG9uc2UuIFRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgZm9yIHRoZSBkZXB0aCBwYXJhbWV0ZXIgaXMgNC5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFkZGl0aW9uYWwgZmllbGRzIC0gJiN4NjA7ZGF0YVNpemUmI3g2MDssICYjeDYwO2NoZWNrc3VtJiN4NjA7LCAmI3g2MDtjb21wcmVzc2VkRGF0YVNpemUmI3g2MDtcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdXNlZCB0byBncm91cCBiaWxsaW5nIHJlY29yZHNcbiAqICB0b2dldGhlci4gSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWNcbiAqICBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS4gR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKi9cbmZ1bmN0aW9uIHF1YWRUcmVlSW5kZXgoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vdmVyc2lvbnMve3ZlcnNpb259L3F1YWRrZXlzL3txdWFkS2V5fS9kZXB0aHMve2RlcHRofVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInt2ZXJzaW9ufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widmVyc2lvblwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntxdWFkS2V5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicXVhZEtleVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntkZXB0aH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRlcHRoXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucXVhZFRyZWVJbmRleCA9IHF1YWRUcmVlSW5kZXg7XG4vKipcbiAqIEdldHMgbWV0YWRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgaW5kZXguIE9ubHkgYXZhaWxhYmxlIGZvciB2b2xhdGlsZSBsYXllcnMgd2hlcmUgdGhlIHBhcnRpdGlvbmluZyBzY2hlbWUgaXMgYGhlcmV0aWxlYC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGluZGV4IG1ldGFkYXRhIGZvciB2b2xhdGlsZSBsYXllcnNcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYVxuICogIHZhbGlkIGxheWVyIGFscmVhZHkgY29uZmlndXJlZCBpbiB0aGUgY2F0YWxvZyBjb25maWd1cmF0aW9uLiBFeGFjdGx5IG9uZSBsYXllciBJRCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQHBhcmFtIHF1YWRLZXkgVGhlIGdlb21ldHJpYyBhcmVhIHNwZWNpZmllZCBieSBhbiBpbmRleCBpbiB0aGUgcmVxdWVzdCwgcmVwcmVzZW50ZWQgYXMgYSBIRVJFIHRpbGVcbiAqIEBwYXJhbSBkZXB0aCBUaGUgcmVjdXJzaW9uIGRlcHRoIG9mIHRoZSByZXNwb25zZS4gSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBvbmx5IGRhdGEgZm9yXG4gKiAgdGhlIHF1YWRLZXkgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBJbiB0aGlzIHdheSwgZGVwdGggZGVzY3JpYmVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc3ViUXVhZEtleXNcbiAqICBpbiB0aGUgcmVzcG9uc2UuIFRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgZm9yIHRoZSBkZXB0aCBwYXJhbWV0ZXIgaXMgNC5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFkZGl0aW9uYWwgZmllbGRzIC0gJiN4NjA7ZGF0YVNpemUmI3g2MDssICYjeDYwO2NoZWNrc3VtJiN4NjA7LCAmI3g2MDtjb21wcmVzc2VkRGF0YVNpemUmI3g2MDtcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdXNlZCB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzIGFuZCAgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzXG4gKiAgW0EtWmEtejAtOV0uIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICovXG5mdW5jdGlvbiBxdWFkVHJlZUluZGV4Vm9sYXRpbGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vcXVhZGtleXMve3F1YWRLZXl9L2RlcHRocy97ZGVwdGh9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3F1YWRLZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJxdWFkS2V5XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2RlcHRofVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGVwdGhcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGlmIChwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKSB7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICAgICAgfVxuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5xdWFkVHJlZUluZGV4Vm9sYXRpbGUgPSBxdWFkVHJlZUluZGV4Vm9sYXRpbGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLiBhbmQgaXRzIGFmZmlsaWF0ZShzKS5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBhbmQgb3RoZXIgbWF0ZXJpYWxzIGNvbnRhaW4gcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25cbiAqIGNvbnRyb2xsZWQgYnkgSEVSRSBhbmQgYXJlIHByb3RlY3RlZCBieSBhcHBsaWNhYmxlIGNvcHlyaWdodCBsZWdpc2xhdGlvbi5cbiAqIEFueSB1c2UgYW5kIHV0aWxpemF0aW9uIG9mIHRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBhbmRcbiAqIGRpc2Nsb3N1cmUgdG8gYW55IHRoaXJkIHBhcnRpZXMgaXMgY29uZGl0aW9uYWwgdXBvbiBoYXZpbmcgYSBzZXBhcmF0ZVxuICogYWdyZWVtZW50IHdpdGggSEVSRSBmb3IgdGhlIGFjY2VzcywgdXNlLCB1dGlsaXphdGlvbiBvciBkaXNjbG9zdXJlIG9mIHRoaXNcbiAqIHNvZnR3YXJlLiBJbiB0aGUgYWJzZW5jZSBvZiBzdWNoIGFncmVlbWVudCwgdGhlIHVzZSBvZiB0aGUgc29mdHdhcmUgaXMgbm90XG4gKiBhbGxvd2VkLlxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3Vic2NyaWJlID0gZXhwb3J0cy5zZWVrVG9PZmZzZXQgPSBleHBvcnRzLmVuZHBvaW50QnlDb25zdW1lciA9IGV4cG9ydHMuZW5kcG9pbnQgPSBleHBvcnRzLmRlbGV0ZVN1YnNjcmlwdGlvbiA9IGV4cG9ydHMuY29uc3VtZURhdGEgPSBleHBvcnRzLmRvQ29tbWl0T2Zmc2V0cyA9IHZvaWQgMDtcbi8qKlxuICogU3RyZWFtIEFQSSB2MlxuICogVGhlIGBzdHJlYW1gIHNlcnZpY2UgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gY29uc3VtZSBkYXRhIGZyb20gYSBzdHJlYW0gbGF5ZXIuXG4gKiBXaXRoIHRoaXMgc2VydmljZSB5b3UgY2FuIHN1YnNjcmliZSB0byBhIHN0cmVhbSBsYXllciBhbmQgY29uc3VtZSBtZXNzYWdlcy5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMi4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1BcGlcbiAqL1xuLyoqXG4gKiBBZnRlciByZWFkaW5nIGRhdGEsIHlvdSBzaG91bGQgY29tbWl0IHRoZSBvZmZzZXQgb2YgdGhlIGxhc3QgbWVzc2FnZSByZWFkIGZyb20gZWFjaCBwYXJ0aXRpb24gc29cbiAqIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBjYW4gcmVzdW1lIHJlYWRpbmcgbmV3IG1lc3NhZ2VzIGZyb20gdGhlIGNvcnJlY3QgcGFydGl0aW9uIGluIHRoZSBldmVudCB0aGF0IHRoZXJlIGlzIGFcbiAqIGRpc3J1cHRpb24gdG8gdGhlIHN1YnNjcmlwdGlvbiwgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiBjcmFzaC4gQW4gb2Zmc2V0IGNhbiBhbHNvIGJlIHVzZWZ1bCBpZiB5b3UgZGVsZXRlIGEgc3Vic2NyaXB0aW9uXG4gKiB0aGVuIHJlY3JlYXRlIGEgc3Vic2NyaXB0aW9uIGZvciB0aGUgc2FtZSBsYXllciwgYmVjYXVzZSB0aGUgbmV3IHN1YnNjcmlwdGlvbiBjYW4gc3RhcnQgcmVhZGluZyBkYXRhIGZyb20gdGhlIG9mZnNldC5cbiAqIFRvIHJlYWQgbWVzc2FnZXMgYWxyZWFkeSBjb21taXR0ZWQsIHVzZSB0aGUgL3NlZWsgZW5kcG9pbnQsIHRoZW4gdXNlIC9wYXJ0aXRpb25zLlxuICogVGhlIGJhc2UgcGF0aCB0byB1c2UgaXMgdGhlIHZhbHVlIG9mICdub2RlQmFzZVVSTCcgcmV0dXJuZWQgZnJvbSAvc3Vic2NyaWJlIFBPU1QgcmVxdWVzdC5cbiAqXG4gKiBAc3VtbWFyeSBDb21taXRzIG9mZnNldHMgb2YgdGhlIGxhc3QgbWVzc2FnZSByZWFkXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSBjb21taXRPZmZzZXRzIFRoZSBvZmZzZXRzIHRvIGNvbW1pdC4gSXQgc2hvdWxkIGJlIHNhbWUgYXMgdGhlIG9mZnNldCBvZiB0aGUgbWVzc2FnZSB5b3Ugd2lzaCB0byBjb21taXQuXG4gKiBEbyBub3QgcGFzcyBvZmZzZXQgKyAxIGFzIG1lbnRpb25lZCBpbiBLYWZrYSBDb25zdW1lciBkb2N1bWVudGF0aW9uLiBUaGUgc2VydmljZSBhZGRzIG9uZSB0byB0aGUgb2Zmc2V0IHlvdSBzcGVjaWZ5LlxuICogQHBhcmFtIHN1YnNjcmlwdGlvbklkIFRoZSBzdWJzY3JpcHRpb25JZCByZWNlaXZlZCBpbiB0aGUgcmVzcG9uc2Ugb2YgdGhlIC9zdWJzY3JpYmUgcmVxdWVzdCAocmVxdWlyZWQgaWYgbW9kZSYjeDNEO3BhcmFsbGVsKS5cbiAqIEBwYXJhbSBtb2RlIFRoZSBzdWJzY3JpcHRpb24gbW9kZSBvZiB0aGlzIHN1YnNjcmlwdGlvbklkIChhcyBwcm92aWRlZCBpbiAvc3Vic2NyaWJlIFBPU1QgQVBJKS5cbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JZCBUaGUgY29ycmVsYXRpb24taWQgKHZhbHVlIG9mIFJlc3BvbnNlIEhlYWRlciAmIzM5O1gtQ29ycmVsYXRpb24tSWQmIzM5OykgZnJvbSBwcmlvciBzdGVwIGluIHByb2Nlc3MuXG4gKiAgU2VlIHRoZSBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9hcGktcmVmZXJlbmNlLmh0bWwpIGZvciB0aGUgJiN4NjA7c3RyZWFtJiN4NjA7IEFQSVxuICovXG5mdW5jdGlvbiBkb0NvbW1pdE9mZnNldHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vb2Zmc2V0c1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdWJzY3JpcHRpb25JZFwiLCBwYXJhbXNbXCJzdWJzY3JpcHRpb25JZFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtb2RlXCIsIHBhcmFtc1tcIm1vZGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImNvbW1pdE9mZnNldHNcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiY29tbWl0T2Zmc2V0c1wiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlkXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSWRcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRvQ29tbWl0T2Zmc2V0cyA9IGRvQ29tbWl0T2Zmc2V0cztcbi8qKlxuICogQ29uc3VtZXMgZGF0YSBmcm9tIGEgbGF5ZXIuIFJldHVybnMgbWVzc2FnZXMgZnJvbSBhIHN0cmVhbSBsYXllciBmb3JtYXR0ZWQgc2ltaWxhciB0byBhXG4gKiBbUGFydGl0aW9uIG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWNsaWVudC1saWJyYXJ5L2FwaV9yZWZlcmVuY2Vfc2NhbGEvaW5kZXguaHRtbC5QYXJ0aXRpb24pLlxuICogSWYgdGhlIGRhdGEgc2l6ZSBpcyBsZXNzIHRoYW4gMSBNQiwgdGhlIGBkYXRhYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZC5cbiAqIElmIHRoZSBkYXRhIHNpemUgaXMgZ3JlYXRlciB0aGFuIDEgTUIsIGEgZGF0YSBoYW5kbGUgd2lsbCBiZSByZXR1cm5lZCBwb2ludGluZyB0byB0aGUgb2JqZWN0IHN0b3JlZCBpbiB0aGUgQmxvYiBzdG9yZS5cbiAqIFRoZSBiYXNlIHBhdGggdG8gYmUgdXNlZCBpcyB0aGUgdmFsdWUgb2YgJ25vZGVCYXNlVVJMJyByZXR1cm5lZCBmcm9tIC9zdWJzY3JpYmUgUE9TVCByZXF1ZXN0LlxuICpcbiAqIEBzdW1tYXJ5IENvbnN1bWVzIGRhdGEgZnJvbSBhIGxheWVyXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSBzdWJzY3JpcHRpb25JZCBUaGUgc3Vic2NyaXB0aW9uSWQgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG9mIHRoZSAvc3Vic2NyaWJlIHJlcXVlc3QgKHJlcXVpcmVkIGlmIG1vZGUmI3gzRDtwYXJhbGxlbCkuXG4gKiBAcGFyYW0gbW9kZSBUaGUgc3Vic2NyaXB0aW9uIG1vZGUgb2YgdGhpcyBzdWJzY3JpcHRpb25JZCAoYXMgcHJvdmlkZWQgaW4gL3N1YnNjcmliZSBQT1NUIEFQSSkuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSWQgVGhlIGNvcnJlbGF0aW9uLWlkICh2YWx1ZSBvZiBSZXNwb25zZSBIZWFkZXIgJiMzOTtYLUNvcnJlbGF0aW9uLUlkJiMzOTspIGZyb20gcHJpb3Igc3RlcCBpbiBwcm9jZXNzLlxuICogU2VlIHRoZSBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9hcGktcmVmZXJlbmNlLmh0bWwpIGZvciB0aGUgJiN4NjA7c3RyZWFtJiN4NjA7IEFQSVxuICovXG5mdW5jdGlvbiBjb25zdW1lRGF0YShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9wYXJ0aXRpb25zXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN1YnNjcmlwdGlvbklkXCIsIHBhcmFtc1tcInN1YnNjcmlwdGlvbklkXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm1vZGVcIiwgcGFyYW1zW1wibW9kZVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlkXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSWRcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNvbnN1bWVEYXRhID0gY29uc3VtZURhdGE7XG4vKipcbiAqIERlbGV0ZXMgYSBzdWJzY3JpcHRpb24gdG8gYSBsYXllciAodG9waWMpLiBUaGlzIG9wZXJhdGlvbiByZW1vdmVzIHRoZSBzdWJzY3JpcHRpb24gZnJvbSB0aGUgc2VydmljZS5cbiAqIFRoZSBiYXNlIHBhdGggdG8gdXNlIGlzIHRoZSB2YWx1ZSBvZiAnbm9kZUJhc2VVUkwnIHJldHVybmVkIGZyb20gL3N1YnNjcmliZSBQT1NUIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlIHN1YnNjcmlwdGlvbiB0byBhIGxheWVyXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSBzdWJzY3JpcHRpb25JZCBUaGUgc3Vic2NyaXB0aW9uSWQgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG9mIHRoZSAvc3Vic2NyaWJlIHJlcXVlc3QgKHJlcXVpcmVkIGlmIG1vZGUmI3gzRDtwYXJhbGxlbCkuXG4gKiBAcGFyYW0gbW9kZSBUaGUgc3Vic2NyaXB0aW9uIG1vZGUgb2YgdGhpcyBzdWJzY3JpcHRpb25JZCAoYXMgcHJvdmlkZWQgaW4gL3N1YnNjcmliZSBQT1NUIEFQSSkuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSWQgQSB0cmFjZSBJRCB0byB1c2UgdG8gYXNzb2NpYXRlIHRoaXMgcmVxdWVzdCB3aXRoIG90aGVyIHJlcXVlc3RzIGluIHlvdXIgcHJvY2Vzcy5cbiAqIFRoZSBjb3JyZWxhdGlvbiBJRCBpcyB0aGUgdmFsdWUgb2YgdGhlIHJlc3BvbnNlIGhlYWRlciAmI3g2MDtYLUNvcnJlbGF0aW9uLUlkJiN4NjA7IGZyb20gdGhlIHByaW9yIHJlcXVlc3QgaW4geW91ciBwcm9jZXNzLlxuICogT25jZSB5b3UgdXNlIGEgY29ycmVsYXRpb24gSUQgaW4gYSAmI3g2MDsvZGVsZXRlJiN4NjA7IHJlcXVlc3QsIGRvIG5vdCB1c2UgaXQgYWdhaW4gc2luY2UgJiN4NjA7L2RlbGV0ZSYjeDYwOyBtYXJrcyB0aGUgZW5kIG9mIGEgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlU3Vic2NyaXB0aW9uKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3N1YnNjcmliZVwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdWJzY3JpcHRpb25JZFwiLCBwYXJhbXNbXCJzdWJzY3JpcHRpb25JZFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtb2RlXCIsIHBhcmFtc1tcIm1vZGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JZFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JZFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVTdWJzY3JpcHRpb24gPSBkZWxldGVTdWJzY3JpcHRpb247XG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIEthZmthIEJyb2tlciBVUkwncywgY2xpZW50IElEIChyZXF1aXJlZCB0byBlbmZvcmNlIHF1b3RhcyksIGFuZCBHcm91cCBJRCBwcmVmaXguIFR5cGUgaXMgc2V0IHRvIGEgY29uc3VtZXIuXG4gKlxuICogQHN1bW1hcnkgRXhwb3NlIHRoZSBlbmRwb2ludCB0byBjb25zdW1lIHRoZSBkYXRhIG9mIHRoZSBsYXllciBkaXJlY3RseVxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKi9cbmZ1bmN0aW9uIGVuZHBvaW50KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2VuZHBvaW50XCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5lbmRwb2ludCA9IGVuZHBvaW50O1xuLyoqXG4gKiBFeHBvc2VzIHRoZSBlbmRwb2ludCB0byB1c2UgdG8gcHJvZHVjZSBhbmQgY29uc3VtZSB0aGUgZGF0YSBvZiB0aGUgbGF5ZXIgZGlyZWN0bHksIHBlciB0eXBlIG9mIHVzZXIgLSBjb25zdW1lciBvciBwcm9kdWNlci5cbiAqIEl0IHJldHVybnMgYSBsaXN0IG9mIEthZmthIEJyb2tlciBVUkwncywgY2xpZW50IElEIChyZXF1aXJlZCB0byBlbmZvcmNlIHF1b3RhcyksIGFuZCBHcm91cCBJRCBwcmVmaXguXG4gKlxuICogQHN1bW1hcnkgRXhwb3NlcyB0aGUgZW5kcG9pbnQgdG8gdXNlIHRvIHByb2R1Y2UgYW5kIGNvbnN1bWUgdGhlIGRhdGEgb2YgdGhlIGxheWVyIGRpcmVjdGx5XG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSB0eXBlIElkZW50aWZpZXMgd2hldGhlciB0aGUgcHJvcGVydGllcyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYXJlIGZvciBhIHByb2R1Y2VyIG9yIGNvbnN1bWVyLlxuICovXG5mdW5jdGlvbiBlbmRwb2ludEJ5Q29uc3VtZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0ve3R5cGV9L2VuZHBvaW50XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3R5cGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJ0eXBlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmVuZHBvaW50QnlDb25zdW1lciA9IGVuZHBvaW50QnlDb25zdW1lcjtcbi8qKlxuICogRW5hYmxlcyB5b3UgdG8gc3RhcnQgcmVhZGluZyBkYXRhIGZyb20gYSBzcGVjaWZpZWQgb2Zmc2V0LlxuICogWW91IGNhbiBtb3ZlIHRoZSBtZXNzYWdlIHBvaW50ZXIgdG8gYW55IG9mZnNldCBpbiB0aGUgbGF5ZXIgKHRvcGljKS5cbiAqIE1lc3NhZ2UgY29uc3VtcHRpb24gd2lsbCBzdGFydCBmcm9tIHRoYXQgb2Zmc2V0LlxuICogT25jZSB5b3Ugc2VlayB0byBhbiBvZmZzZXQsIHRoZXJlIGlzIG5vIHJldHVybmluZyB0byB0aGUgaW5pdGlhbCBvZmZzZXQsIHVubGVzcyB0aGUgaW5pdGlhbCBvZmZzZXQgaXMgc2F2ZWQuXG4gKiBUaGUgYmFzZSBwYXRoIHRvIHVzZSBpcyB0aGUgdmFsdWUgb2YgJ25vZGVCYXNlVVJMJyByZXR1cm5lZCBmcm9tIC9zdWJzY3JpYmUgUE9TVCByZXF1ZXN0LlxuICpcbiAqIEBzdW1tYXJ5IFNlZWsgdG8gcHJlZGVmaW5lZCBvZmZzZXQuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSBzZWVrT2Zmc2V0cyBMaXN0IG9mIG9mZnNldHMgYW5kIG9mZnNldCBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uSWQgVGhlIHN1YnNjcmlwdGlvbklkIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBvZiB0aGUgL3N1YnNjcmliZSByZXF1ZXN0IChyZXF1aXJlZCBpZiBtb2RlJiN4M0Q7cGFyYWxsZWwpLlxuICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlIG9mIHRoaXMgc3Vic2NyaXB0aW9uSWQgKGFzIHByb3ZpZGVkIGluIC9zdWJzY3JpYmUgUE9TVCBBUEkpLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklkIFRoZSBjb3JyZWxhdGlvbi1pZCAodmFsdWUgb2YgUmVzcG9uc2UgSGVhZGVyICYjMzk7WC1Db3JyZWxhdGlvbi1JZCYjMzk7KSBmcm9tIHByaW9yIHN0ZXAgaW4gcHJvY2Vzcy5cbiAqIFNlZSB0aGUgW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1zdG9yZS9hcGktcmVmZXJlbmNlLmh0bWwpIGZvciB0aGUgJiN4NjA7c3RyZWFtJiN4NjA7IEFQSVxuICovXG5mdW5jdGlvbiBzZWVrVG9PZmZzZXQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc2Vla1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdWJzY3JpcHRpb25JZFwiLCBwYXJhbXNbXCJzdWJzY3JpcHRpb25JZFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtb2RlXCIsIHBhcmFtc1tcIm1vZGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcInNlZWtPZmZzZXRzXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcInNlZWtPZmZzZXRzXCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSWRcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSWRcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JZFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc2Vla1RvT2Zmc2V0ID0gc2Vla1RvT2Zmc2V0O1xuLyoqXG4gKiBFbmFibGVzIG1lc3NhZ2UgY29uc3VtcHRpb24gZnJvbSBhIHNwZWNpZmljIHN0cmVhbSBsYXllciAodG9waWMpLlxuICogVXNlIHRoZSBiYXNlIHBhdGggcmV0dXJuZWQgZnJvbSB0aGUgQVBJIExvb2t1cCBzZXJ2aWNlLiBOb3RlOiBGb3IgKiptb2RlID0gcGFyYWxsZWwqKixcbiAqIG9uZSB1bml0IG9mIHBhcmFsbGVsaXNtIGN1cnJlbnRseSBlcXVhbHMgMSBNQnBzIGluYm91bmQgb3IgMiBNQnBzIG91dGJvdW5kLCB3aGljaGV2ZXIgaXMgZ3JlYXRlciwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxuICogVGhlIG51bWJlciBvZiBzdWJzY3JpcHRpb25zIHdpdGhpbiB0aGUgc2FtZSBncm91cCBjYW5ub3QgZXhjZWVkIHRoZSBwYXJhbGxlbGlzbSBhbGxvd2VkLlxuICogRm9yIG1vcmUgZGV0YWlscyBzZWVcbiAqIFtHZXQgRGF0YSBmcm9tIGEgU3RyZWFtIExheWVyXShodHRwczovL2RldmVsb3Blci5oZXJlLmNvbS9kb2N1bWVudGF0aW9uL2RhdGEtYXBpL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLXN0cmVhbS5odG1sKS5cbiAqXG4gKiBAc3VtbWFyeSBFbmFibGUgbWVzc2FnZSBjb25zdW1wdGlvbiBmcm9tIGEgc3BlY2lmaWMgc3RyZWFtIGxheWVyLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gbW9kZSBTcGVjaWZpZXMgd2hldGhlciB0byB1c2Ugc2VyaWFsIG9yIHBhcmFsbGVsIHN1YnNjcmlwdGlvbiBtb2RlLiBGb3IgbW9yZSBkZXRhaWxzIHNlZVxuICogW0dldCBEYXRhIGZyb20gYSBTdHJlYW0gTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1hcGkvZGF0YV9kZXZfZ3VpZGUvcmVzdC9nZXR0aW5nLWRhdGEtc3RyZWFtLmh0bWwpLlxuICogQHBhcmFtIHN1YnNjcmlwdGlvbklkIEluY2x1ZGUgdGhpcyBwYXJhbWV0ZXIgaWYgeW91IHdhbnQgdG8gbG9vayB1cCB0aGUgJiN4NjA7bm9kZUJhc2VVUkwmI3g2MDsgZm9yIGEgZ2l2ZW4gc3Vic2NyaXB0aW9uSWQuXG4gKiBAcGFyYW0gY29uc3VtZXJJZCBUaGUgSUQgdG8gdXNlIHRvIGlkZW50aWZ5IHRoaXMgY29uc3VtZXIuIEl0IG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgY29uc3VtZXIgZ3JvdXAuXG4gKiBJZiB5b3UgZG8gbm90IHByb3ZpZGUgb25lLCB0aGUgc3lzdGVtIHdpbGwgZ2VuZXJhdGUgb25lLlxuICogQHBhcmFtIHN1YnNjcmlwdGlvblByb3BlcnRpZXMgT25lIG9yIG1vcmUgS2Fma2EgQ29uc3VtZXIgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4gKiBbR2V0IERhdGEgZnJvbSBhIFN0cmVhbSBMYXllcl0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9kYXRhX2Rldl9ndWlkZS9yZXN0L2dldHRpbmctZGF0YS1zdHJlYW0uaHRtbCkuXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9zdWJzY3JpYmVcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibW9kZVwiLCBwYXJhbXNbXCJtb2RlXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN1YnNjcmlwdGlvbklkXCIsIHBhcmFtc1tcInN1YnNjcmlwdGlvbklkXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvbnN1bWVySWRcIiwgcGFyYW1zW1wiY29uc3VtZXJJZFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcInN1YnNjcmlwdGlvblByb3BlcnRpZXNcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGthZmthQ29uc3VtZXJQcm9wZXJ0aWVzOiBwYXJhbXNbXCJzdWJzY3JpcHRpb25Qcm9wZXJ0aWVzXCJdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnB1dFZvbGF0aWxlQmxvYiA9IGV4cG9ydHMuZ2V0Vm9sYXRpbGVCbG9iID0gZXhwb3J0cy5kZWxldGVWb2xhdGlsZUJsb2IgPSBleHBvcnRzLmNoZWNrSGFuZGxlRXhpc3RzID0gdm9pZCAwO1xuLyoqXG4gKiBWb2xhdGlsZSBCbG9iIEFQSSB2MVxuICogVGhlIGB2b2xhdGlsZS1ibG9iYCBzZXJ2aWNlIHN1cHBvcnRzIHRoZSB1cGxvYWQgYW5kIHJldHJpZXZhbCBvZiB2b2xhdGlsZSBkYXRhIGZyb20gdGhlIHN0b3JhZ2Ugb2YgYSBjYXRhbG9nLlxuICogRWFjaCBkaXNjcmV0ZSBjaHVuayBvZiBkYXRhIGlzIHN0b3JlZCBhcyBhIGJsb2IgKEJpbmFyeSBMYXJnZSBPYmplY3QpLlxuICogRWFjaCBibG9iIGhhcyBpdHMgb3duIHVuaXF1ZSBpZCAoZGF0YSBoYW5kbGUpIHdoaWNoIGlzIHN0b3JlZCBhcyBwYXJ0aXRpb24gbWV0YWRhdGEuXG4gKiBUbyBnZXQgYSBwYXJ0aXRpb24ncyBkYXRhLCB5b3UgZmlyc3QgdXNlIGBtZXRhZGF0YWAgc2VydmljZSB0byByZXRyaWV2ZVxuICogdGhlIHBhcnRpdGlvbidzIG1ldGFkYXRhIChkYXRhIGhhbmRsZSkgd2l0aCB0aGUgYWRkcmVzc2VzIG9mIHRoZSByZWxldmFudCBibG9icy5cbiAqIFlvdSB0aGVuIHVzZSB0aG9zZSBhZGRyZXNzZXMgdG8gcHVsbCB0aGUgZGF0YSB1c2luZyB0aGUgYHZvbGF0aWxlLWJsb2JgIHNlcnZpY2UuXG4gKiBVbmxpa2UgdGhlIGBibG9iYCBzZXJ2aWNlLCBkYXRhIGhhbmRsZXMgY2FuIGJlIG92ZXJ3cml0dGVuLiBIZW5jZSB0aGUgdm9sYXRpbGUgYXNwZWN0LlxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjAuMVxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogVm9sYXRpbGVCbG9iQXBpXG4gKi9cbi8qKlxuICogQ2hlY2tzIGlmIGEgdm9sYXRpbGUgYmxvYiBleGlzdHMgZm9yIHRoZSByZXF1ZXN0ZWQgZGF0YSBoYW5kbGUuXG4gKlxuICogQHN1bW1hcnkgQ2hlY2tzIGlmIGEgZGF0YSBoYW5kbGUgZXhpc3RzXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIHZvbGF0aWxlIGJsb2IgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgdm9sYXRpbGUgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYiYjMzk7cyBjb250ZW50cy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBjaGVja0hhbmRsZUV4aXN0cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNoZWNrSGFuZGxlRXhpc3RzID0gY2hlY2tIYW5kbGVFeGlzdHM7XG4vKipcbiAqIERlbGV0ZXMgYSB2b2xhdGlsZSBkYXRhIGJsb2IgZnJvbSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSAodm9sdW1lKS5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgdm9sYXRpbGUgZGF0YSBibG9iXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIHZvbGF0aWxlIGRhdGEgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUgdm9sYXRpbGUgZGF0YSBibG9iIHdoaWNoIGNvbnRlbnRzIHdpbGwgYmUgZGVsZXRlZC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBkZWxldGVWb2xhdGlsZUJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRlbGV0ZVZvbGF0aWxlQmxvYiA9IGRlbGV0ZVZvbGF0aWxlQmxvYjtcbi8qKlxuICogUmV0cmlldmVzIGEgdm9sYXRpbGUgZGF0YSBibG9iIGZyb20gc3RvcmFnZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGEgdm9sYXRpbGUgYmxvYlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgdm9sYXRpbGUgZGF0YSBibG9iLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyB2b2xhdGlsZSBkYXRhIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2ImIzM5O3MgY29udGVudHMuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBnZXRWb2xhdGlsZUJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRWb2xhdGlsZUJsb2IgPSBnZXRWb2xhdGlsZUJsb2I7XG4vKipcbiAqIFBlcnNpc3RzIHRoZSB2b2xhdGlsZSBkYXRhIGJsb2IgaW4gdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBtZWNoYW5pc20gKHZvbHVtZSkuXG4gKlxuICogQHN1bW1hcnkgUHVibGlzaGVzIGEgdm9sYXRpbGUgZGF0YSBibG9iXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIHZvbGF0aWxlIGRhdGEgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUgdm9sYXRpbGUgZGF0YSBibG9iLlxuICogQHBhcmFtIGJvZHkgVGhlIGRhdGEgdG8gdXBsb2FkIGFzIHBhcnQgb2YgdGhlIGJsb2IuIFNpemUgbGltaXQ6IDIgTUJcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBwdXRWb2xhdGlsZUJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucHV0Vm9sYXRpbGVCbG9iID0gcHV0Vm9sYXRpbGVCbG9iO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
13112
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vLi9pbmRleC53ZWIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NhY2hlL01ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5LmpzIiwid2VicGFjazovLy8uL2xpYi9jYWNoZS9RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5LmpzIiwid2VicGFjazovLy8uL2xpYi9jYWNoZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L0FydGlmYWN0Q2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvQ2F0YWxvZ0NsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L0NhdGFsb2dSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvQ2F0YWxvZ3NSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvQ29uZmlnQ2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvRGF0YVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9JbmRleExheWVyQ2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvSW5kZXhRdWVyeVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9MYXllclZlcnNpb25zUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L1BhcnRpdGlvbnNSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvUG9sbFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9RdWFkS2V5UGFydGl0aW9uc1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9RdWFkVHJlZUluZGV4UmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L1F1ZXJ5Q2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvU2NoZW1hRGV0YWlsc1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9TY2hlbWFSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvU2Vla1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9TdGF0aXN0aWNzQ2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvU3RhdGlzdGljc1JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9TdHJlYW1MYXllckNsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L1N1YnNjcmliZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9TdW1tYXJ5UmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY2xpZW50L1RpbGVSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvVW5zdWJzY3JpYmVSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvVmVyc2lvbmVkTGF5ZXJDbGllbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NsaWVudC9Wb2xhdGlsZUxheWVyQ2xpZW50LmpzIiwid2VicGFjazovLy8uL2xpYi9jbGllbnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlscy9nZXRUaWxlLmpzIiwid2VicGFjazovLy8uL2xpYi91dGlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbHMvdmFsaWRhdGVCaWxsaW5nVGFnLmpzIiwid2VicGFjazovLy8uL2xpYi91dGlscy92YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvaW5kZXgud2ViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliLnZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvY2FjaGUvQXBpQ2FjaGVSZXBvc2l0b3J5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL2NhY2hlL0tleVZhbHVlQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvY2FjaGUvTFJVQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvY2FjaGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvY2xpZW50L09scENsaWVudFNldHRpbmdzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL2NsaWVudC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi91dGlscy9EYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvdXRpbHMvRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvdXRpbHMvRG93bmxvYWRNYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL0ZldGNoT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi91dGlscy9IUk4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvdXRpbHMvSHR0cEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL1JlcXVlc3RCdWlsZGVyRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi91dGlscy9UaWxlS2V5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL1V1aWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstY29yZS9saWIvdXRpbHMvZ2V0RGF0YVNpemVVdGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWNvcmUvbGliL3V0aWxzL2dldEVudkxvb2t1cFVybC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi91dGlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1jb3JlL2xpYi91dGlscy91c2VyQWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvUmVxdWVzdEJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9hcnRpZmFjdC1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9hdXRob3JpemF0aW9uLWFwaS12MS4xLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvYmxvYi1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9ibG9iLnYyLmFwaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGkvbGliL2NvbmZpZy1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9jb3ZlcmFnZS1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9pbmRleC1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9pbnRlcmFjdGl2ZS1hcGktdjEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9sb29rdXAtYXBpLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvbWV0YWRhdGEtYXBpLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvcHVibGlzaC1hcGktdjIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9xdWVyeS1hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpL2xpYi9zdHJlYW0tYXBpLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaS9saWIvdm9sYXRpbGUtYmxvYi1hcGkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNsRmE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLG9DQUFvQyxhQUFhLEVBQUUsRUFBRTtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RCxhQUFhLG1CQUFPLENBQUMsNkJBQU87Ozs7Ozs7Ozs7Ozs7QUM5QmY7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsV0FBVyxJQUFJLGVBQWU7QUFDakQsaUNBQWlDLGVBQWU7QUFDaEQ7QUFDQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDaElhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsaUVBQWlFLHlDQUF5QyxFQUFFO0FBQ3pIO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsME1BQTBNLFNBQVMsY0FBYyxZQUFZLEtBQUssSUFBSTtBQUN0UCxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDN01hO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzlHYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDOURhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxtQ0FBbUMsbUJBQU8sQ0FBQyxzREFBZ0M7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDL0RhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSx1QkFBdUIsbUJBQU8sQ0FBQywwRUFBb0I7QUFDbkQsbUNBQW1DLG1CQUFPLENBQUMsc0RBQWdDO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMzSGE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzlEYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0EsbUNBQW1DLG1CQUFPLENBQUMsc0RBQWdDO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUM3R2E7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLG1DQUFtQyxtQkFBTyxDQUFDLHNEQUFnQztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkhBQTZILDRCQUE0QjtBQUN6SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDM1BhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDcEdhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxtQ0FBbUMsbUJBQU8sQ0FBQyxzREFBZ0M7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDakVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSx1QkFBdUIsbUJBQU8sQ0FBQywwRUFBb0I7QUFDbkQsbUNBQW1DLG1CQUFPLENBQUMsc0RBQWdDO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3JIYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDOURhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsK0RBQStELGdCQUFnQixFQUFFLEVBQUU7QUFDOUc7QUFDQSxtQ0FBbUMsTUFBTSw2QkFBNkIsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNqRyxrQ0FBa0MsTUFBTSxpQ0FBaUMsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNwRywrQkFBK0IscUZBQXFGO0FBQ3BIO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSx1QkFBdUIsbUJBQU8sQ0FBQywwRUFBb0I7QUFDbkQsa0NBQWtDLG1CQUFPLENBQUMsNEZBQStCO0FBQ3pFLG1DQUFtQyxtQkFBTyxDQUFDLHNEQUFnQztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4SUFBOEksWUFBWSxTQUFTLFNBQVM7QUFDNUssU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3JPYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLCtEQUErRCxnQkFBZ0IsRUFBRSxFQUFFO0FBQzlHO0FBQ0EsbUNBQW1DLE1BQU0sNkJBQTZCLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDakcsa0NBQWtDLE1BQU0saUNBQWlDLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDcEcsK0JBQStCLHFGQUFxRjtBQUNwSDtBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0EsdUJBQXVCLG1CQUFPLENBQUMsMEVBQW9CO0FBQ25ELGtDQUFrQyxtQkFBTyxDQUFDLDRGQUErQjtBQUN6RSxtQ0FBbUMsbUJBQU8sQ0FBQyxzREFBZ0M7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4SUFBOEksWUFBWSxTQUFTLFNBQVM7QUFDNUssU0FBUztBQUNUO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2pNYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msb0NBQW9DLGFBQWEsRUFBRSxFQUFFO0FBQ3ZGLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVELGFBQWEsbUJBQU8sQ0FBQyxzREFBaUI7QUFDdEMsYUFBYSxtQkFBTyxDQUFDLHdEQUFrQjtBQUN2QyxhQUFhLG1CQUFPLENBQUMsa0RBQWU7QUFDcEMsYUFBYSxtQkFBTyxDQUFDLDREQUFvQjtBQUN6QyxhQUFhLG1CQUFPLENBQUMsOERBQXFCO0FBQzFDLGFBQWEsbUJBQU8sQ0FBQyx3REFBa0I7QUFDdkMsYUFBYSxtQkFBTyxDQUFDLG9FQUF3QjtBQUM3QyxhQUFhLG1CQUFPLENBQUMsa0VBQXVCO0FBQzVDLGFBQWEsbUJBQU8sQ0FBQyxvREFBZ0I7QUFDckMsYUFBYSxtQkFBTyxDQUFDLDBEQUFtQjtBQUN4QyxhQUFhLG1CQUFPLENBQUMsb0VBQXdCO0FBQzdDLGFBQWEsbUJBQU8sQ0FBQyx3REFBa0I7QUFDdkMsYUFBYSxtQkFBTyxDQUFDLDhEQUFxQjtBQUMxQyxhQUFhLG1CQUFPLENBQUMsa0RBQWU7QUFDcEMsYUFBYSxtQkFBTyxDQUFDLG9FQUF3QjtBQUM3QyxhQUFhLG1CQUFPLENBQUMsNEVBQTRCO0FBQ2pELGFBQWEsbUJBQU8sQ0FBQyxzREFBaUI7QUFDdEMsYUFBYSxtQkFBTyxDQUFDLHNFQUF5QjtBQUM5QyxhQUFhLG1CQUFPLENBQUMsb0VBQXdCO0FBQzdDLGFBQWEsbUJBQU8sQ0FBQyw0REFBb0I7QUFDekMsYUFBYSxtQkFBTyxDQUFDLDhEQUFxQjtBQUMxQyxhQUFhLG1CQUFPLENBQUMsOERBQXFCO0FBQzFDLGFBQWEsbUJBQU8sQ0FBQyw0REFBb0I7QUFDekMsYUFBYSxtQkFBTyxDQUFDLGtEQUFlO0FBQ3BDLGFBQWEsbUJBQU8sQ0FBQyxnRUFBc0I7QUFDM0MsYUFBYSxtQkFBTyxDQUFDLGtEQUFlO0FBQ3BDLGFBQWEsbUJBQU8sQ0FBQyxrREFBZTs7Ozs7Ozs7Ozs7OztBQ3hEdkI7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLG9DQUFvQyxhQUFhLEVBQUUsRUFBRTtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RCxhQUFhLG1CQUFPLENBQUMscUNBQVM7QUFDOUIsYUFBYSxtQkFBTyxDQUFDLHVDQUFVO0FBQy9CLGFBQWEsbUJBQU8sQ0FBQyxxQ0FBUzs7Ozs7Ozs7Ozs7OztBQ2hDakI7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwrREFBK0QsZ0JBQWdCLEVBQUUsRUFBRTtBQUM5RztBQUNBLG1DQUFtQyxNQUFNLDZCQUE2QixFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ2pHLGtDQUFrQyxNQUFNLGlDQUFpQyxFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ3BHLCtCQUErQixxRkFBcUY7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLHVCQUF1QixtQkFBTyxDQUFDLDBFQUFvQjtBQUNuRCxrQ0FBa0MsbUJBQU8sQ0FBQyw0RkFBK0I7QUFDekUsbUNBQW1DLG1CQUFPLENBQUMsc0RBQWdDO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixZQUFZO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUZBQW1GLFlBQVksaUpBQWlKO0FBQ2hQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qyw4QkFBOEI7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSx3QkFBd0I7QUFDaEcsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOzs7Ozs7Ozs7Ozs7O0FDckthO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxvQ0FBb0MsYUFBYSxFQUFFLEVBQUU7QUFDdkYsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQsYUFBYSxtQkFBTyxDQUFDLCtEQUFzQjtBQUMzQyxhQUFhLG1CQUFPLENBQUMsNkVBQTZCO0FBQ2xELGFBQWEsbUJBQU8sQ0FBQyx5Q0FBVzs7Ozs7Ozs7Ozs7OztBQ2hDbkI7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLEtBQUs7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDcENhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNyQ2E7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLG9DQUFvQyxhQUFhLEVBQUUsRUFBRTtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RCxhQUFhLG1CQUFPLENBQUMsNkRBQU87QUFDNUIsYUFBYSxtQkFBTyxDQUFDLHVFQUFlOzs7Ozs7Ozs7Ozs7O0FDL0J2QjtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNyQmE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLElBQUksSUFBSSxRQUFRLElBQUksZUFBZSxJQUFJLEtBQUs7QUFDOUQ7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDaEVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSx1QkFBdUIsbUJBQU8sQ0FBQywwRUFBb0I7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMzR2E7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELFVBQVUsNEJBQTRCLGlCQUFpQjtBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3pRYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msb0NBQW9DLGFBQWEsRUFBRSxFQUFFO0FBQ3ZGLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVELGFBQWEsbUJBQU8sQ0FBQywyRUFBWTtBQUNqQyxhQUFhLG1CQUFPLENBQUMsK0ZBQXNCO0FBQzNDLGFBQWEsbUJBQU8sQ0FBQyxxRkFBaUI7Ozs7Ozs7Ozs7Ozs7QUNoQ3pCO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSx1QkFBdUIsbUJBQU8sQ0FBQywwRUFBb0I7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDeEVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxvQ0FBb0MsYUFBYSxFQUFFLEVBQUU7QUFDdkYsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQsYUFBYSxtQkFBTyxDQUFDLDhGQUFxQjs7Ozs7Ozs7Ozs7OztBQzlCN0I7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLG9DQUFvQyxhQUFhLEVBQUUsRUFBRTtBQUN2RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RCxhQUFhLG1CQUFPLENBQUMscUVBQVM7QUFDOUIsYUFBYSxtQkFBTyxDQUFDLHFFQUFTO0FBQzlCLGFBQWEsbUJBQU8sQ0FBQyx1RUFBVTs7Ozs7Ozs7Ozs7OztBQ2hDbEI7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwrREFBK0QsZ0JBQWdCLEVBQUUsRUFBRTtBQUM5RztBQUNBLG1DQUFtQyxNQUFNLDZCQUE2QixFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ2pHLGtDQUFrQyxNQUFNLGlDQUFpQyxFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ3BHLCtCQUErQixxRkFBcUY7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLHVCQUF1QixtQkFBTyxDQUFDLDBFQUFvQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN6TGE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwrREFBK0QsZ0JBQWdCLEVBQUUsRUFBRTtBQUM5RztBQUNBLG1DQUFtQyxNQUFNLDZCQUE2QixFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ2pHLGtDQUFrQyxNQUFNLGlDQUFpQyxFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ3BHLCtCQUErQixxRkFBcUY7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLHVCQUF1QixtQkFBTyxDQUFDLDBFQUFvQjtBQUNuRCxrQ0FBa0MsbUJBQU8sQ0FBQyw0RkFBK0I7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsMkJBQTJCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDN0phO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7Ozs7Ozs7Ozs7Ozs7QUNuQi9DO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLG1FQUFtRTs7Ozs7Ozs7Ozs7OztBQ3ZDdkQ7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3ZHYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDcERhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsK0RBQStELGdCQUFnQixFQUFFLEVBQUU7QUFDOUc7QUFDQSxtQ0FBbUMsTUFBTSw2QkFBNkIsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNqRyxrQ0FBa0MsTUFBTSxpQ0FBaUMsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNwRywrQkFBK0IscUZBQXFGO0FBQ3BIO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSx1QkFBdUIsbUJBQU8sQ0FBQywwRUFBb0I7QUFDbkQsa0NBQWtDLG1CQUFPLENBQUMsNEZBQStCO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RkFBeUYsWUFBWTtBQUNyRyxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSwrRkFBK0YsWUFBWSxJQUFJLGVBQWUsR0FBRywwQkFBMEI7QUFDM0o7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUM5SGE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixvQkFBb0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsZ0JBQWdCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxPQUFPO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2pkYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNqRGE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDL0RhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsU0FBUztBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFlBQVksV0FBVyxTQUFTLFVBQVUsU0FBUztBQUMvRix1QkFBdUIsWUFBWTtBQUNuQyx1QkFBdUIsU0FBUztBQUNoQyx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFlBQVksV0FBVyxTQUFTLFVBQVUsU0FBUztBQUMvRix1QkFBdUIsWUFBWTtBQUNuQyx1QkFBdUIsU0FBUztBQUNoQyx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxZQUFZLFdBQVcsU0FBUztBQUM1RSx1QkFBdUIsWUFBWTtBQUNuQyx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLEtBQUssd0JBQXdCLEtBQUs7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsVUFBVSxPQUFPO0FBQzNELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxZQUFZLFFBQVE7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsWUFBWSxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsVUFBVSxPQUFPO0FBQzNELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLG9CQUFvQixRQUFRO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxrQkFBa0IsUUFBUTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLHVCQUF1QixRQUFRO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsVUFBVSxPQUFPO0FBQzNELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsWUFBWSxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUSxVQUFVLE9BQU87QUFDN0QsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUSxZQUFZLFNBQVM7QUFDakUsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUSxZQUFZLFFBQVE7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsU0FBUyxxQkFBcUIsU0FBUztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELHdCQUF3QjtBQUMzRSw4Q0FBOEMsbUJBQW1CO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxTQUFTLHFCQUFxQixTQUFTO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsU0FBUyxXQUFXLGVBQWU7QUFDeEUsdUJBQXVCLFNBQVM7QUFDaEMsdUJBQXVCLGVBQWU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsU0FBUyxXQUFXLGVBQWU7QUFDeEUsdUJBQXVCLFNBQVM7QUFDaEMsdUJBQXVCLGVBQWU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUSxVQUFVLE9BQU8sV0FBVyxPQUFPO0FBQy9FLHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFFBQVEscUJBQXFCLFFBQVE7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFFBQVEsV0FBVyxPQUFPO0FBQzlELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxRQUFRLFVBQVUsT0FBTyxXQUFXLE9BQU87QUFDL0UsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLE9BQU87QUFDOUIsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFFBQVEsV0FBVyxPQUFPO0FBQzlELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFFBQVEsVUFBVSxPQUFPO0FBQzdELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUSxVQUFVLE9BQU8sV0FBVyxPQUFPO0FBQy9FLHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixPQUFPO0FBQzlCLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUSxXQUFXLE9BQU87QUFDOUQsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFFBQVEs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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxXQUFXLFlBQVksV0FBVztBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsV0FBVyxTQUFTLFFBQVE7QUFDaEUsdUJBQXVCLFdBQVc7QUFDbEMsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsV0FBVyxZQUFZLFdBQVc7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUM5WGE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwrREFBK0QsZ0JBQWdCLEVBQUUsRUFBRTtBQUM5RztBQUNBLG1DQUFtQyxNQUFNLDZCQUE2QixFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ2pHLGtDQUFrQyxNQUFNLGlDQUFpQyxFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ3BHLCtCQUErQixxRkFBcUY7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFPLENBQUMsNEZBQWtCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLHVCQUF1QixRQUFRO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEseUJBQXlCLFFBQVE7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLG9CQUFvQixRQUFRO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLG9CQUFvQixRQUFRO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLHdCQUF3QixRQUFRO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOzs7Ozs7Ozs7Ozs7O0FDeEphO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsK0RBQStELGdCQUFnQixFQUFFLEVBQUU7QUFDOUc7QUFDQSxtQ0FBbUMsTUFBTSw2QkFBNkIsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNqRyxrQ0FBa0MsTUFBTSxpQ0FBaUMsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNwRywrQkFBK0IscUZBQXFGO0FBQ3BIO0FBQ0EsS0FBSztBQUNMO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFPLENBQUMsNEZBQWtCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsWUFBWSxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLFlBQVksUUFBUTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLFlBQVksUUFBUTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMvSGE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwrREFBK0QsZ0JBQWdCLEVBQUUsRUFBRTtBQUM5RztBQUNBLG1DQUFtQyxNQUFNLDZCQUE2QixFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ2pHLGtDQUFrQyxNQUFNLGlDQUFpQyxFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ3BHLCtCQUErQixxRkFBcUY7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBTyxDQUFDLDRGQUFrQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxXQUFXLFVBQVU7QUFDL0QsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLFVBQVU7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLHFCQUFxQixRQUFRO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsaUJBQWlCLFFBQVE7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxnQkFBZ0I7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsb0JBQW9CLFFBQVE7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxvQkFBb0IsUUFBUTtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxPQUFPLFNBQVMsRUFBRSxPQUFPO0FBQ25FLHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxnQkFBZ0I7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsdUJBQXVCLFFBQVE7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsb0JBQW9CLFFBQVE7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLG1CQUFtQixRQUFRO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsV0FBVyxVQUFVO0FBQy9ELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixVQUFVO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLHFCQUFxQixRQUFRO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsV0FBVyxVQUFVO0FBQy9ELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixVQUFVO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxxQkFBcUIsUUFBUTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLFdBQVcsVUFBVTtBQUMvRCx1QkFBdUIsUUFBUTtBQUMvQix1QkFBdUIsVUFBVTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEscUJBQXFCLFFBQVE7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOzs7Ozs7Ozs7Ozs7O0FDNWhCYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLCtEQUErRCxnQkFBZ0IsRUFBRSxFQUFFO0FBQzlHO0FBQ0EsbUNBQW1DLE1BQU0sNkJBQTZCLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDakcsa0NBQWtDLE1BQU0saUNBQWlDLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDcEcsK0JBQStCLHFGQUFxRjtBQUNwSDtBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBTyxDQUFDLDRGQUFrQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsSUFBSSxFQUFFLFFBQVE7QUFDdkQsdUJBQXVCLElBQUk7QUFDM0IsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLElBQUksT0FBTyxJQUFJLEVBQUUsUUFBUTtBQUM5RCx1QkFBdUIsSUFBSTtBQUMzQix1QkFBdUIsSUFBSTtBQUMzQix1QkFBdUIsUUFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsSUFBSSxpQkFBaUIsSUFBSTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMxSWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwrREFBK0QsZ0JBQWdCLEVBQUUsRUFBRTtBQUM5RztBQUNBLG1DQUFtQyxNQUFNLDZCQUE2QixFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ2pHLGtDQUFrQyxNQUFNLGlDQUFpQyxFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ3BHLCtCQUErQixxRkFBcUY7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsbUJBQU8sQ0FBQyw0RkFBa0I7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQSxxREFBcUQsY0FBYyxRQUFRLGNBQWMsUUFBUTtBQUNqRztBQUNBLDZHQUE2RyxrQkFBa0IsU0FBUztBQUN4STtBQUNBO0FBQ0EsYUFBYSxXQUFXLGtFQUFrRSxXQUFXLFdBQVcsU0FBUztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLG9CQUFvQixRQUFRO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsY0FBYyxRQUFRLGNBQWMsUUFBUTtBQUNqRztBQUNBLDRGQUE0RixrQkFBa0IsU0FBUztBQUN2SDtBQUNBO0FBQ0EsYUFBYSxXQUFXLGtFQUFrRSxXQUFXLFdBQVcsU0FBUztBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLHVCQUF1QixRQUFRO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtGQUFrRixzQkFBc0I7QUFDeEcscUZBQXFGLGtCQUFrQjtBQUN2RyxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUUsc0JBQXNCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7Ozs7Ozs7Ozs7OztBQy9PYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLCtEQUErRCxnQkFBZ0IsRUFBRSxFQUFFO0FBQzlHO0FBQ0EsbUNBQW1DLE1BQU0sNkJBQTZCLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDakcsa0NBQWtDLE1BQU0saUNBQWlDLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDcEcsK0JBQStCLHFGQUFxRjtBQUNwSDtBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFPLENBQUMsNEZBQWtCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsY0FBYyxZQUFZLGNBQWM7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLGNBQWMsWUFBWSxjQUFjO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxjQUFjLFlBQVksY0FBYztBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLGVBQWUsY0FBYztBQUN2RSx1QkFBdUIsUUFBUTtBQUMvQix1QkFBdUIsY0FBYztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2xNYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLCtEQUErRCxnQkFBZ0IsRUFBRSxFQUFFO0FBQzlHO0FBQ0EsbUNBQW1DLE1BQU0sNkJBQTZCLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDakcsa0NBQWtDLE1BQU0saUNBQWlDLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDcEcsK0JBQStCLHFGQUFxRjtBQUNwSDtBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsbUJBQU8sQ0FBQyw0RkFBa0I7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsY0FBYyxRQUFRLGNBQWMsUUFBUSx3QkFBd0I7QUFDekg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsb0JBQW9CLFFBQVE7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxjQUFjLFFBQVEsY0FBYyxRQUFRO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLHVCQUF1QixRQUFRO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsY0FBYyxRQUFRLGNBQWMsUUFBUTtBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLFNBQVMsTUFBTTtBQUMvRix1QkFBdUIsUUFBUTtBQUMvQix1QkFBdUIsUUFBUTtBQUMvQix1QkFBdUIsUUFBUTtBQUMvQix1QkFBdUIsTUFBTTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELGNBQWMsUUFBUSxjQUFjLFFBQVE7QUFDakc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsV0FBVyxRQUFRLFNBQVMsTUFBTTtBQUM1RSx1QkFBdUIsUUFBUTtBQUMvQix1QkFBdUIsUUFBUTtBQUMvQix1QkFBdUIsTUFBTTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNuTWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwrREFBK0QsZ0JBQWdCLEVBQUUsRUFBRTtBQUM5RztBQUNBLG1DQUFtQyxNQUFNLDZCQUE2QixFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ2pHLGtDQUFrQyxNQUFNLGlDQUFpQyxFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ3BHLCtCQUErQixxRkFBcUY7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFPLENBQUMsNEZBQWtCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0hBQXNIO0FBQ3RIO0FBQ0EsMkVBQTJFLHFCQUFxQjtBQUNoRyxnSEFBZ0gsWUFBWTtBQUM1SDtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxvQkFBb0IsUUFBUTtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0hBQXNIO0FBQ3RIO0FBQ0EsMkVBQTJFLHFCQUFxQjtBQUNoRywrR0FBK0csWUFBWTtBQUMzSDtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSx1QkFBdUIsUUFBUTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNIQUFzSDtBQUN0SDtBQUNBO0FBQ0EsZ0VBQWdFLHNCQUFzQjtBQUN0Riw0Q0FBNEMsYUFBYSwwQ0FBMEMsYUFBYTtBQUNoSDtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxzQkFBc0IsUUFBUTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxxQkFBcUIsUUFBUTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxFQUFFLEtBQUs7QUFDakQsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLEtBQUs7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0hBQXNIO0FBQ3RIO0FBQ0EsMkVBQTJFLHFCQUFxQjtBQUNoRyxpSEFBaUgsWUFBWTtBQUM3SDtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUSxpQkFBaUIsUUFBUTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUZBQWlGLGlCQUFpQjtBQUNsRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLHNCQUFzQixRQUFRO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3JRYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLCtEQUErRCxnQkFBZ0IsRUFBRSxFQUFFO0FBQzlHO0FBQ0EsbUNBQW1DLE1BQU0sNkJBQTZCLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDakcsa0NBQWtDLE1BQU0saUNBQWlDLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDcEcsK0JBQStCLHFGQUFxRjtBQUNwSDtBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFPLENBQUMsNEZBQWtCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyR0FBMkc7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVEsT0FBTyxXQUFXO0FBQzVELHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLE9BQU8sV0FBVztBQUM1RCx1QkFBdUIsUUFBUTtBQUMvQix1QkFBdUIsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0hBQWdIO0FBQ2hIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLE9BQU8sV0FBVztBQUM1RCx1QkFBdUIsUUFBUTtBQUMvQix1QkFBdUIsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRLE9BQU8sV0FBVztBQUM1RCx1QkFBdUIsUUFBUTtBQUMvQix1QkFBdUIsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSIsImZpbGUiOiJidW5kbGUudW1kLmRldi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSB7XG5cdFx0dmFyIGEgPSBmYWN0b3J5KCk7XG5cdFx0Zm9yKHZhciBpIGluIGEpICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBleHBvcnRzIDogcm9vdClbaV0gPSBhW2ldO1xuXHR9XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL2luZGV4LndlYi5qc1wiKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2xpYlwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5ID0gdm9pZCAwO1xuLyoqXG4gKiBDYWNoZXMgdGhlIHBhcnRpdGlvbnMgbWV0YWRhdGEgdXNpbmcgYSBrZXktdmFsdWUgcGFpci5cbiAqL1xuY2xhc3MgTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkge1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgW1tNZXRhZGF0YUNhY2hlUmVwb3NpdG9yeV1dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhY2hlIFRoZSBbW0tleVZhbHVlQ2FjaGVdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW01ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2FjaGUpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHV0KHJxLCBocm4sIGxheWVySWQsIHBhcnRpdGlvbnMsIHZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgcGFydGl0aW9uc0lkcyA9IHJxLmdldFBhcnRpdGlvbklkcygpO1xuICAgICAgICBsZXQga2V5O1xuICAgICAgICBpZiAocGFydGl0aW9uc0lkcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBtZXRhZGF0YSBvZiBwYXJ0aXRpb25zKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gdGhpcy5jcmVhdGVLZXkoe1xuICAgICAgICAgICAgICAgICAgICBocm4sXG4gICAgICAgICAgICAgICAgICAgIGxheWVySWQsXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbklkOiBtZXRhZGF0YS5wYXJ0aXRpb25cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlLnB1dChrZXksIEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBrZXkgPSB0aGlzLmNyZWF0ZUtleSh7XG4gICAgICAgICAgICBocm4sXG4gICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgdmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUucHV0KGtleSwgSlNPTi5zdHJpbmdpZnkocGFydGl0aW9ucykpO1xuICAgIH1cbiAgICBnZXQocnEsIGhybiwgbGF5ZXJJZCwgdmVyc2lvbikge1xuICAgICAgICBjb25zdCBwYXJ0aXRpb25zSWRzID0gcnEuZ2V0UGFydGl0aW9uSWRzKCk7XG4gICAgICAgIGxldCBrZXk7XG4gICAgICAgIGlmIChwYXJ0aXRpb25zSWRzKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVQYXJ0aXRpb25zID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhcnRpdGlvbklkIG9mIHBhcnRpdGlvbnNJZHMpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLmNyZWF0ZUtleSh7XG4gICAgICAgICAgICAgICAgICAgIGhybixcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uSWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkUGFydGl0aW9uID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplZFBhcnRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVQYXJ0aXRpb25zLnB1c2goSlNPTi5wYXJzZShzZXJpYWxpemVkUGFydGl0aW9uKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnNJZHMubGVuZ3RoICE9PSBhdmFpbGFibGVQYXJ0aXRpb25zLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBZGRpdGlvbmFsRmllbGRzQXZhaWxhYmxlKGF2YWlsYWJsZVBhcnRpdGlvbnMsIHJxLmdldEFkZGl0aW9uYWxGaWVsZHMoKSkpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBJbiB0aGUgY2FzZSB3aGVuIG5vdCBhbGwgcGFydGl0aW9ucyBhcmUgYXZhaWxhYmxlLCBvciBzb21lIG9mIHBhcnRpdGlvbiBoYXMgbm90IHJlcXVlc3RlZCBhIHNvbWUgb2YgYWRkaXRpb25hbCBmaWVsZCxcbiAgICAgICAgICAgICAgICAgKiB3ZSBmYWlsIHRoZSBjYWNoZSBsb29rdXAuXG4gICAgICAgICAgICAgICAgICogVGhpcyBjYW4gYmUgZW5oYW5jZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZVBhcnRpdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAga2V5ID0gdGhpcy5jcmVhdGVLZXkoe1xuICAgICAgICAgICAgaHJuLFxuICAgICAgICAgICAgbGF5ZXJJZCxcbiAgICAgICAgICAgIHZlcnNpb25cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRQYXJ0aXRpb25zID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWRQYXJ0aXRpb25zXG4gICAgICAgICAgICA/IEpTT04ucGFyc2Uoc2VyaWFsaXplZFBhcnRpdGlvbnMpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3JlYXRlS2V5KHBhcmFtcykge1xuICAgICAgICByZXR1cm4gKGAke3BhcmFtcy5ocm59Ojoke3BhcmFtcy5sYXllcklkfTo6YCArXG4gICAgICAgICAgICAocGFyYW1zLnZlcnNpb24gPyBgJHtwYXJhbXMudmVyc2lvbn06OmAgOiBcIlwiKSArXG4gICAgICAgICAgICAocGFyYW1zLnBhcnRpdGlvbklkXG4gICAgICAgICAgICAgICAgPyBgJHtwYXJhbXMucGFydGl0aW9uSWR9OjpwYXJ0aXRpb25gXG4gICAgICAgICAgICAgICAgOiBcInBhcnRpdGlvbnNcIikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgYWxsIGNhY2hlZCBwYXJ0aXRpb25zIHdpdGggYWRkaXRpb25hbCBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FjaGVkUGFydGl0aW9ucyBUaGUgYXJyYXkgb2YgdGhlIGNhY2hlZCBwYXJ0aXRpb25zXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgdGhlIGFycmF5IG9mIHRoZSByZXF1ZXN0ZWQgYWRkaXRpb25hbCBmaWVsZHMuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiBzb21lIG9mIHRoZSBjYWNoZWQgcGFydGl0aW9uIGRvZXMgbm90IGhhdmUgc29tZSBhZGRpdGlvbmFsIGZpZWxkLlxuICAgICAqIEZhbHNlIG90aGVyd2lzZSBvciBpZiBhbnkgYWRkaXRpb25hbEZpZWxkcyBoYXMgbm90IGJlZW4gcmVxdWVzdGVkLlxuICAgICAqL1xuICAgIGNoZWNrQWRkaXRpb25hbEZpZWxkc0F2YWlsYWJsZShjYWNoZWRQYXJ0aXRpb25zLCBhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsRmllbGRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNhY2hlZFBhcnRpdGlvbiBvZiBjYWNoZWRQYXJ0aXRpb25zKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFkZGl0aW9uYWxGaWVsZCBvZiBhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZWRQYXJ0aXRpb24uaGFzT3duUHJvcGVydHkoYWRkaXRpb25hbEZpZWxkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydHMuTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkgPSBNZXRhZGF0YUNhY2hlUmVwb3NpdG9yeTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeSA9IHZvaWQgMDtcbi8qKlxuICogQ2FjaGVzIHRoZSBRdWFkVHJlZUluZGV4IHVzaW5nIGEga2V5LXZhbHVlIHBhaXIuXG4gKi9cbmNsYXNzIFF1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnkge1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgW1tRdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FjaGUgVGhlIFtbS2V5VmFsdWVDYWNoZV1dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gVGhlIFtbUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeV1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhY2hlKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcmVzIGEga2V5LXZhbHVlIHBhaXIgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1dChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUucHV0KHRoaXMuY3JlYXRlS2V5KHBhcmFtcyksIEpTT04uc3RyaW5naWZ5KHBhcmFtcy50cmVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBRdWFkVHJlZUluZGV4IGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBbW1F1YWRUcmVlSW5kZXhDYWNoZVBhcmFtc11dIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIFRoZSBRdWFkVHJlZUluZGV4IGZvciB0aGUgVGlsZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSBRdWFkVHJlZUluZGV4IGRvZXMgbm90IGV4aXN0LlxuICAgICAqL1xuICAgIGdldChwYXJhbXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jcmVhdGVLZXkocGFyYW1zKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFRyZWUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZFRyZWUgPyBKU09OLnBhcnNlKHNlcmlhbGl6ZWRUcmVlKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3JlYXRlS2V5KHBhcmFtcykge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gcGFyYW1zLnZlcnNpb24gIT09IHVuZGVmaW5lZCA/IGA6OiR7cGFyYW1zLnZlcnNpb259YCA6IFwiXCI7XG4gICAgICAgIHJldHVybiBgJHtwYXJhbXMuaHJufTo6JHtwYXJhbXMubGF5ZXJJZH06OiR7cGFyYW1zLnJvb3QudG9IZXJlVGlsZSgpfSR7dmVyc2lvbn06OiR7cGFyYW1zLmRlcHRofTo6cXVhZHRyZWVgO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVhZFRyZWVJbmRleENhY2hlUmVwb3NpdG9yeSA9IFF1YWRUcmVlSW5kZXhDYWNoZVJlcG9zaXRvcnk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL01ldGFkYXRhQ2FjaGVSZXBvc2l0b3J5XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5XCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFydGlmYWN0Q2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbi8qKlxuICogR2V0cyBzY2hlbWEgbWV0YWRhdGEgYW5kIGRhdGEgZnJvbSB0aGUgcGxhdGZvcm0gQXJ0aWZhY3QgU2VydmljZS5cbiAqL1xuY2xhc3MgQXJ0aWZhY3RDbGllbnQge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgY2xpZW50IHRvIHdvcmsgd2l0aCBzY2hlbWFzIGRhdGEgaW4gdGhlIHBsYXRmb3JtIEFydGlmYWN0IFNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW0FydGlmYWN0Q2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB0aGlzLmFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgc2NoZW1hIG1ldGFkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNjaGVtYURldGFpbHNSZXF1ZXN0IFRoZSBbW1NjaGVtYURldGFpbHNSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBBbiBvYmplY3Qgd2l0aCB0aGUgc2NoZW1hIG1ldGFkYXRhLlxuICAgICAqL1xuICAgIGdldFNjaGVtYURldGFpbHMoc2NoZW1hRGV0YWlsc1JlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGhybiA9IHNjaGVtYURldGFpbHNSZXF1ZXN0LmdldFNjaGVtYSgpO1xuICAgICAgICAgICAgaWYgKCFocm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBQbGVhc2UgcHJvdmlkZSB0aGUgc2NoZW1hIEhSTiBieSBzY2hlbWFEZXRhaWxzUmVxdWVzdC53aXRoU2NoZW1hKClgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBocm5TdHIgPSBocm4udG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB5aWVsZCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJhcnRpZmFjdFwiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MpLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5BcnRpZmFjdEFwaS5nZXRTY2hlbWFVc2luZ0dFVChyZXF1ZXN0LCB7XG4gICAgICAgICAgICAgICAgc2NoZW1hSHJuOiBocm5TdHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgc2NoZW1hIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2NoZW1hUmVxdWVzdCBUaGUgW1tTY2hlbWFSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBBIGJsb2Igd2l0aCB0aGUgc2NoZW1hLlxuICAgICAqL1xuICAgIGdldFNjaGVtYShzY2hlbWFSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYW50ID0gc2NoZW1hUmVxdWVzdC5nZXRWYXJpYW50KCk7XG4gICAgICAgICAgICBpZiAoIXZhcmlhbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBQbGVhc2UgcHJvdmlkZSB0aGUgc2NoZW1hIHZhcmlhbnQgYnkgc2NoZW1hUmVxdWVzdC53aXRoVmFyaWFudCgpYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHlpZWxkIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShcImFydGlmYWN0XCIsIHRoaXMuYXBpVmVyc2lvbiwgdGhpcy5zZXR0aW5ncykuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5BcnRpZmFjdEFwaS5nZXRBcnRpZmFjdFVzaW5nR0VUKHJlcXVlc3QsIHtcbiAgICAgICAgICAgICAgICBhcnRpZmFjdEhybjogdmFyaWFudC51cmxcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICA0MDA6IFwiQmFkIHJlcXVlc3RcIixcbiAgICAgICAgICAgICAgICAgICAgNDAxOiBcIllvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdmlldyB0aGUgc2NoZW1hXCIsXG4gICAgICAgICAgICAgICAgICAgIDQwMzogXCJBY2Nlc3NpbmcgdGhlIHNjaGVtYSBpcyBmb3JiaWRkZW5cIixcbiAgICAgICAgICAgICAgICAgICAgNDA0OiBcIlRoZSBzY2hlbWEgd2FzIG5vdCBmb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICA1MDA6IFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5zdGF0dXNUZXh0IHx8IG1lc3NhZ2VzW2Vycm9yLnN0YXR1c107XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgQXJ0aWZhY3QgU2VydmljZSBlcnJvcjogSFRUUCAke2Vycm9yLnN0YXR1c306ICR7bWVzc2FnZX1gKSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5BcnRpZmFjdENsaWVudCA9IEFydGlmYWN0Q2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ2F0YWxvZ0NsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIEludGVyYWN0cyB3aXRoIHRoZSBgRGF0YVN0b3JlYCBjYXRhbG9nLlxuICovXG5jbGFzcyBDYXRhbG9nQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBbW0NhdGFsb2dDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRhbG9nSHJuIFRoZSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgb2YgdGhlIGNhdGFsb2cuXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tDYXRhbG9nQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2F0YWxvZ0hybiwgc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB0aGlzLmFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgICAgIHRoaXMuaHJuID0gY2F0YWxvZ0hybi50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkcyBhbmQgY2FjaGVzIHRoZSBmdWxsIGNhdGFsb2cgY29uZmlndXJhdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBjYXRhbG9nLlxuICAgICAqIFRoZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgZGVzY3JpcHRpdmUgYW5kIHN0cnVjdHVyYWxcbiAgICAgKiBpbmZvcm1hdGlvbiBzdWNoIGFzIGxheWVyIGRlZmluaXRpb25zIGFuZCBsYXllciB0eXBlcy5cbiAgICAgKlxuICAgICAqIEBzdW1tYXJ5IEdldHMgZGV0YWlscyBhYm91dCB0aGUgcmVxdWVzdGVkIGNhdGFsb2cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tDYXRhbG9nUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNhdGFsb2cgbWV0YWRhdGEuXG4gICAgICovXG4gICAgZ2V0Q2F0YWxvZyhyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IHlpZWxkIHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJjb25maWdcIiwgdW5kZWZpbmVkLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5Db25maWdBcGkuZ2V0Q2F0YWxvZyhidWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgY2F0YWxvZ0hybjogdGhpcy5ocm4sXG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbWluaW11bSB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gY2F0YWxvZy4gSWYgdGhlIGNhdGFsb2cgZG9lc24ndCBjb250YWluIGFueSB2ZXJzaW9ucyBlcnJvciB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IElzIFtbQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XV0gaW5zdGFuY2UgYW5kIGhhcyAoKGdldEJpbGxpbmdUYWcpKSBtZXRob2QuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgYSBGZXRjaClcbiAgICAgKiBhbmQgYWJvcnQgaXQgaWYgcmVxdWlyZWQgdmlhIGFuIEFib3J0Q29udHJvbGxlciBvYmplY3QuXG4gICAgICogIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0U2lnbmFsXG4gICAgICogIEByZXR1cm5zIEEgcHJvbWlzZSBvZiB0aGUgaHR0cCByZXNwb25zZSB0aGF0IGNvbnRhaW5zIHRoZSBwbWluaW11bSB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gY2F0YWxvZy5cbiAgICAgKi9cbiAgICBnZXRFYXJsaWVzdFZlcnNpb24ocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwibWV0YWRhdGFcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIGNvbnN0IGVhcmxpZXN0VmVyc2lvbiA9IHlpZWxkIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubWluaW11bVZlcnNpb24oYnVpbGRlciwge1xuICAgICAgICAgICAgICAgIGJpbGxpbmdUYWc6IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpXG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4gUHJvbWlzZS5yZWplY3QoZXJyKSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVhcmxpZXN0VmVyc2lvbi52ZXJzaW9uKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgbGF5ZXIgdmVyc2lvbnMgZm9yIHRoZSBjYXRhbG9nIHZlcnNpb24uIEl0IHdpbGwgcmV0dXJuIGFycmF5IHdpdGhcbiAgICAgKiBhbGwgY2F0YWxvZyBsYXllcnMgYW5kIGxhdGVzdCB2ZXJzaW9uIGZvciBlYWNoIGxheWVyIG9yIHJldHVybiBlcnJvciBpZiB0aGUgY2F0YWxvZyBkb2VzIG5vdFxuICAgICAqIGhhdmUgYW55IHZlcnNpb25zIG9yIGlmIHRoZSB2ZXJzaW9uIHBhc3NlZCBpbiB0aGUgcXVlcnkgcGFyYW1ldGVyIGRvZXMgbm90IGV4aXN0LiBJZiBhIGxheWVyXG4gICAgICogZG9lcyBub3QgaGF2ZSBhbnkgZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGl0IGlzIGV4Y2x1ZGVkIGZyb20gdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgSXMgW1tMYXllclZlcnNpb25zUmVxdWVzdF1dIGluc3RhbmNlIGFuZCBoYXMgKChnZXRWZXJzaW9uKSkgbWV0aG9kLlxuICAgICAqIFZlcnNpb24gLSBjYXRhbG9nIHZlcnNpb24gdG8gZ2V0IGFsbCByZWxhdGVkIGxheWVycyB2ZXJzaW9ucy4gSWYgbm90IGRlZmluZWQsIHRoZW4gdGhlIHZlcnNpb24gd2lsbCBiZSB0aGUgbGF0ZXN0IGNhdGFsb2cgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyBhIEZldGNoKVxuICAgICAqIGFuZCBhYm9ydCBpdCBpZiByZXF1aXJlZCB2aWEgYW4gQWJvcnRDb250cm9sbGVyIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb2YgdGhlIGh0dHAgcmVzcG9uc2UgdGhhdCBjb250YWlucyBhbiBhcnJheSB3aXRoIGFsbCBjYXRhbG9nIGxheWVycyBhbmQgbGF0ZXN0IHZlcnNpb24gZm9yIGVhY2ggbGF5ZXIuXG4gICAgICovXG4gICAgZ2V0TGF5ZXJWZXJzaW9ucyhyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IHlpZWxkIHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgbGV0IHJlcXVlc3RlZENhdGFsb2dWZXJzaW9uID0gcmVxdWVzdC5nZXRWZXJzaW9uKCk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdGVkQ2F0YWxvZ1ZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpbGxpbmd0YWcgPSByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXRhbG9nVmVyc2lvblJlcXVlc3QgPSBuZXcgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGJpbGxpbmd0YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb25SZXF1ZXN0LndpdGhCaWxsaW5nVGFnKGJpbGxpbmd0YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYXRhbG9nVmVyc2lvbiA9IHlpZWxkIHRoaXMuZ2V0TGF0ZXN0VmVyc2lvbihjYXRhbG9nVmVyc2lvblJlcXVlc3QpLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdGVkQ2F0YWxvZ1ZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJQbGVhc2Ugc2V0IHZlcnNpb24gd2l0aCBMYXllclZlcnNpb25zUmVxdWVzdC53aXRoVmVyc2lvbigpIG1ldGhvZC5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGF5ZXJWZXJzaW9ucyA9IHlpZWxkIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkuZ2V0TGF5ZXJWZXJzaW9ucyhidWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogcmVxdWVzdGVkQ2F0YWxvZ1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGVycm9yKSk7IH0pKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobGF5ZXJWZXJzaW9ucy5sYXllclZlcnNpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGEgY2F0YWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBbW0NhdGFsb2dWZXJzaW9uUmVxdWVzdF1dIGluc3RhbmNlIHdpdGggdGhlIGBnZXRTdGFydFZlcnNpb25gIG1ldGhvZCB1c2VkIHRvIGdldFxuICAgICAqIHRoZSBjYXRhbG9nIHN0YXJ0IHZlcnNpb24gKGV4Y2x1c2l2ZSkuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAtMS4gQnkgY29udmVudGlvbiAtMVxuICAgICAqIGluZGljYXRlcyB0aGUgdmlydHVhbCBpbml0aWFsIHZlcnNpb24gYmVmb3JlIHRoZSBmaXJzdCBwdWJsaWNhdGlvbiB0aGF0IGhhcyB2ZXJzaW9uIDAuXG4gICAgICogQHBhcmFtIGFib3J0U2lnbmFsIEEgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAgICAgKiBhbmQsIGlmIHJlcXVpcmVkLCBhYm9ydCBpdCB1c2luZyB0aGUgYEFib3J0Q29udHJvbGxlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2BBYm9ydENvbnRyb2xsZXJgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIG9mIHRoZSBIVFRQIHJlc3BvbnNlIHRoYXQgY29udGFpbnMgdGhlIHBheWxvYWQgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24uXG4gICAgICovXG4gICAgZ2V0TGF0ZXN0VmVyc2lvbihyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0VmVyc2lvbiA9IHJlcXVlc3QuZ2V0U3RhcnRWZXJzaW9uKCk7XG4gICAgICAgICAgICBpZiAoc3RhcnRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzdGFydFZlcnNpb24gPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwibWV0YWRhdGFcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSB5aWVsZCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmxhdGVzdFZlcnNpb24oYnVpbGRlciwge1xuICAgICAgICAgICAgICAgIHN0YXJ0VmVyc2lvbixcbiAgICAgICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IFByb21pc2UucmVqZWN0KGVycikpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXRlc3RWZXJzaW9uLnZlcnNpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBzcGVjaWZpYyBjYXRhbG9nIHZlcnNpb25zLiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmVyc2lvbnMgdG8gYmVcbiAgICAgKiByZXR1cm5lZCBwZXIgY2FsbCBpcyAxMDAwIHZlcnNpb25zLiBJZiB0aGUgcmFuZ2UgaXMgYmlnZ2VyIHRoYW4gMTAwMCB2ZXJzaW9ucywgeW91IGdldCB0aGUgNDAwIEJhZCBSZXF1ZXN0IGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFtbQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XV0gaW5zdGFuY2Ugd2l0aCB0aGUgYGdldFN0YXJ0VmVyc2lvbmAgYW5kIGBnZXRFbmRWZXJzaW9uYCBtZXRob2RzLlxuICAgICAqICogYFN0YXJ0VmVyc2lvbmAgLSBhIGNhdGFsb2cgc3RhcnQgdmVyc2lvbiAoZXhjbHVzaXZlKS4gRGVmYXVsdCBpcyAtMS4gQnkgY29udmVudGlvbiAtMVxuICAgICAqIGluZGljYXRlcyB0aGUgdmlydHVhbCBpbml0aWFsIHZlcnNpb24gYmVmb3JlIHRoZSBmaXJzdCBwdWJsaWNhdGlvbiB0aGF0IGhhcyB2ZXJzaW9uIDAuXG4gICAgICogKiBgRW5kVmVyc2lvbmAgLSBhIGNhdGFsb2cgZW5kIHZlcnNpb24gKGluY2x1c2l2ZSkuIElmIG5vdCBkZWZpbmVkLCB0aGVuIHRoZSBsYXRlc3QgY2F0YWxvZ1xuICAgICAqIHZlcnNpb24gaXMgZmV0aGNlZCBhbmQgdXNlZC5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb2YgdGhlIEhUVFAgcmVzcG9uc2UgdGhhdCBjb250YWlucyB0aGUgcGF5bG9hZCB3aXRoIHZlcnNpb25zIGluIHRoZSByZXF1ZXN0ZWRcbiAgICAgKiByYW5nZS5cbiAgICAgKi9cbiAgICBnZXRWZXJzaW9ucyhyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0VmVyc2lvbiA9IHJlcXVlc3QuZ2V0U3RhcnRWZXJzaW9uKCk7XG4gICAgICAgICAgICBpZiAoc3RhcnRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzdGFydFZlcnNpb24gPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBlbmRWZXJzaW9uID0gcmVxdWVzdC5nZXRFbmRWZXJzaW9uKCk7XG4gICAgICAgICAgICBpZiAoZW5kVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZW5kVmVyc2lvbiA9IHlpZWxkIHRoaXMuZ2V0TGF0ZXN0VmVyc2lvbihyZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwibWV0YWRhdGFcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmxpc3RWZXJzaW9ucyhidWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgc3RhcnRWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGVuZFZlcnNpb24sXG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBgYmFzZVVybGAgYW5kIGNyZWF0ZXMgYHJlcXVlc3RCdWlsZGVyYCBmb3Igc2VuZGluZyByZXF1ZXN0cyB0byB0aGUgQVBJIExvb2t1cCBTZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBidWlsZGVyVHlwZSBUaGUgZW5kcG9pbnQgbmFtZSB0aGF0IGlzIG5lZWRlZCB0byBjcmVhdGUgYXByb3ByaWF0ZSBgcmVxdWVzdEJ1aWxkZXJgLlxuICAgICAqIEBwYXJhbSBocm4gVGhlIGNhdGFsb2cgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGByZXF1ZXN0QnVpbGRlcmBcbiAgICAgKi9cbiAgICBnZXRSZXF1ZXN0QnVpbGRlcihidWlsZGVyVHlwZSwgaHJuLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShidWlsZGVyVHlwZSwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCBocm4sIGFib3J0U2lnbmFsKS5jYXRjaCgoZXJyKSA9PiBQcm9taXNlLnJlamVjdChgRXJyb3IgcmV0cmlldmluZyBmcm9tIGNhY2hlIGJ1aWxkZXIgZm9yIHJlc291cmNlIFwiJHt0aGlzLmhybn1cIiBhbmQgYXBpOiBcIiR7YnVpbGRlclR5cGV9LlxcbiR7ZXJyfVwiYCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkNhdGFsb2dDbGllbnQgPSBDYXRhbG9nQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYXRhbG9nUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIGdldCBjYXRhbG9nIG1ldGFkYXRhIGZyb20gdGhlIHBsYXRmb3JtIENvbmZpZyBTZXJ2aWNlLlxuICovXG5jbGFzcyBDYXRhbG9nUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbQ2F0YWxvZ1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLkNhdGFsb2dSZXF1ZXN0ID0gQ2F0YWxvZ1JlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNhdGFsb2dWZXJzaW9uUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBBcnRpZmFjdCBTZXJ2aWNlLlxuICovXG5jbGFzcyBDYXRhbG9nVmVyc2lvblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEdldHMgYSBjYXRhbG9nIHN0YXJ0IHZlcnNpb24gKGV4Y2x1c2l2ZSkgZm9yIHRoZSByZXF1ZXN0LiBEZWZhdWx0IGlzIC0xLiBCeSBjb252ZW50aW9uIC0xXG4gICAgICogaW5kaWNhdGVzIHRoZSB2aXJ0dWFsIGluaXRpYWwgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uIHRoYXQgaGFzIHZlcnNpb24gMC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNhdGFsb2cgc3RhcnQgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBnZXRTdGFydFZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VmVyc2lvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGNhdGFsb2cgZW5kIHZlcnNpb24gKGluY2x1c2l2ZSkgZm9yIHRoZSByZXF1ZXN0LiBJZiBub3QgZGVmaW5lZCwgdGhlbiB0aGUgbGF0ZXN0IGNhdGFsb2dcbiAgICAgKiB2ZXJzaW9uIGlzIGZldGhjZWQgYW5kIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjYXRhbG9nIGVuZCB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGdldEVuZFZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZFZlcnNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBzdGFydFZlcnNpb25gIHZhbHVlIHRoYXQgaXMgdXNlZCBpbiB0aGUgYGdldFZlcnNpb25zIGFuZCBgZ2V0TGF0ZXN0VmVyc2lvbmAgbWV0aG9kcyBvZiBbW0NhdGFsb2dDbGllbnRdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGFydFZlcnNpb24gU3BlY2lmeSB0aGUgZW5kIGNhdGFsb2cgdmVyc2lvbiBvciwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgY2F0YWxvZyB2ZXJzaW9uLCBzZXQgdG8gdW5kZWZpbmVkLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbQ2F0YWxvZ1ZlcnNpb25SZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTdGFydFZlcnNpb24odmVyc2lvbikge1xuICAgICAgICB0aGlzLnN0YXJ0VmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgZW5kVmVyc2lvbmAgdmFsdWUgdGhhdCBpcyB1c2VkIGluIHRoZSBgZ2V0VmVyc2lvbnNgIG1ldGhvZCBvZiBbW0NhdGFsb2dDbGllbnRdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFNwZWNpZnkgdGhlIGVuZCBjYXRhbG9nIHZlcnNpb24gb3IsIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgbGF0ZXN0IGNhdGFsb2cgdmVyc2lvbiwgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW0NhdGFsb2dWZXJzaW9uUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoRW5kVmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuZW5kVmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tDYXRhbG9nVmVyc2lvblJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLkNhdGFsb2dWZXJzaW9uUmVxdWVzdCA9IENhdGFsb2dWZXJzaW9uUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ2F0YWxvZ3NSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGNhdGFsb2dzIGZyb20gdGhlIHBsYXRmb3JtIENvbmZpZyBTZXJ2aWNlLlxuICovXG5jbGFzcyBDYXRhbG9nc1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqICBHZXRzIGEgc2NoZW1hIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzY2hlbWEgSFJOLlxuICAgICAqL1xuICAgIGdldFNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hSHJuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgb2YgYSBsYXllciBzY2hlbWEgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIHRoYXQgaXMgdXNlZCBpbiB0aGUgYGdldENhdGFsb2dzYCBtZXRob2Qgb2YgdGhlIFtbQ29uZmlnQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICogSWYgdGhlIHNjaGVtYSBpcyBzZXQsIHRoZSBgZ2V0Q2F0YWxvZ3NgIG1ldGhvZCByZXR1cm5zIGNhdGFsb2dzIHdpdGNoIGhhdmUgYSBsYXllciBvciBsYXllcnMgd2l0aCB0aGUgc3BlY2lmaWMgc2NoZW1hIEhSTi5cbiAgICAgKiBJZiB0aGUgc2NoZW1hIGlzIG5vdCBzZXQsIHRoZSBmaWx0ZXIgcmV0dXJucyBhbGwgb2YgdGhlIGNhdGFsb2dzIHRvIHdoaWNoIHlvdSBoYXZlIGFjY2Vzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWFIcm4gVGhlIGxheWVyIHNjaGVtYSBIUk4uXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0NhdGFsb2dSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hSHJuKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hSHJuID0gc2NoZW1hSHJuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbQ2F0YWxvZ3NSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS52YWxpZGF0ZUJpbGxpbmdUYWcodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxufVxuZXhwb3J0cy5DYXRhbG9nc1JlcXVlc3QgPSBDYXRhbG9nc1JlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db25maWdDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuLyoqXG4gKiBBIGNsaWVudCBmb3IgdGhlIHBsYXRmb3JtIENvbmZpZyBTZXJ2aWNlLlxuICovXG5jbGFzcyBDb25maWdDbGllbnQge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgY2xpZW50IGZvciB0aGUgZGF0YSBzdG9yZSB0byB3b3JrIHdpdGggZGF0YVxuICAgICAqIGFib3V0IGNhdGFsb2dzIGNvbmZpZ3VyYXRpb25zIGluIHRoZSBzdG9yZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4gVGhlIFtbQ29uZmlnQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB0aGlzLmFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzeW5jaHJvbm91c2x5IHJldHJpZXZlcyBhIGxpc3Qgb2YgY2F0YWxvZ3MgdG8gd2hpY2ggeW91IGhhdmUgYWNjZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFtbQ2F0YWxvZ3NSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgbGlzdCBvZiBjYXRhbG9ncyB0byB3aGljaCB5b3UgaGF2ZSBhY2Nlc3MuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc2NoZW1hIGlzIHNldCwgeW91IGdldCB0aGUgY2F0YWxvZ3Mgd2l0aCBsYXllcnMgZmlsdGVyZWQgYnkgdGhlIHNwZWNpZmllZCBsYXllciBzY2hlbWEgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pLlxuICAgICAqIElmIHRoZSBzY2hlbWEgaXMgbm90IHNldCwgdGhlIGZpbHRlciByZXR1cm5zIGFsbCBvZiB0aGUgY2F0YWxvZ3MgdG8gd2hpY2ggeW91IGhhdmUgYWNjZXNzLlxuICAgICAqL1xuICAgIGdldENhdGFsb2dzKHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCdWlsZGVyID0geWllbGQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwiY29uZmlnXCIsIHRoaXMuYXBpVmVyc2lvbiwgdGhpcy5zZXR0aW5ncykuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMuYmlsbGluZ1RhZyA9IHJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpO1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy52ZXJib3NlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zY2hlbWFIcm4gPSByZXF1ZXN0LmdldFNjaGVtYSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkNvbmZpZ0FwaS5nZXRDYXRhbG9ncyhyZXF1ZXN0QnVpbGRlciwgcGFyYW1zKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5Db25maWdDbGllbnQgPSBDb25maWdDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRGF0YVJlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqICBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgSEVSRSBCbG9iIFNlcnZpY2UuXG4gKi9cbmNsYXNzIERhdGFSZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5mZXRjaE9wdGlvbiA9IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVJZk5vdEZvdW5kO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgZGF0YSBoYW5kbGUgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhlIGRhdGEgaGFuZGxlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhlIGNvbnRlbnRzIG9mIHRoYXQgYmxvYi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBEYXRhSGFuZGxlYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0RGF0YUhhbmRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUhhbmRsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcHJvdmlkZWQgZGF0YSBoYW5kbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgYERhdGFIYW5kbGVyYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0RhdGFSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhEYXRhSGFuZGxlKGRhdGFIYW5kbGUpIHtcbiAgICAgICAgdGhpcy5kYXRhSGFuZGxlID0gZGF0YUhhbmRsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBwYXJ0aXRpb24gSUQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYHBhcnRpdGlvbklEYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0UGFydGl0aW9uSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnRpdGlvbklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwcm92aWRlZCBwYXJ0aXRpb24gSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFydGl0aW9uSWQgVGhlIGBwYXJ0aXRpb25JRGAgc3RyaW5nLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbRGF0YVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFBhcnRpdGlvbklkKHBhcnRpdGlvbklkKSB7XG4gICAgICAgIHRoaXMucGFydGl0aW9uSWQgPSBwYXJ0aXRpb25JZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA04oCTMTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0HigJNaYeKAk3ow4oCTOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tEYXRhUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEudmFsaWRhdGVCaWxsaW5nVGFnKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBmZXRjaCBvcHRpb24gdGhhdCB5b3UgY2FuIHVzZSB0byBzZXQgdGhlIHNvdXJjZSBmcm9tXG4gICAgICogd2hpY2ggZGF0YSBzaG91bGQgYmUgZmV0Y2hlZC5cbiAgICAgKlxuICAgICAqIEBzZWUgYGdldEZldGNoT3B0aW9uKClgIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgZm9ybWF0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbiBUaGUgYEZldGNoT3B0aW9uYCBlbnVtLlxuICAgICAqXG4gICAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGUgdXBkYXRlZCBgRGF0YVJlcXVlc3RgIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHdpdGhGZXRjaE9wdGlvbihvcHRpb24pIHtcbiAgICAgICAgdGhpcy5mZXRjaE9wdGlvbiA9IG9wdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZldGNoIG9wdGlvbiB0aGF0IGNvbnRyb2xzIGhvdyByZXF1ZXN0cyBhcmUgaGFuZGxlZC5cbiAgICAgKlxuICAgICAqIFRoZSBkZWZhdWx0IG9wdGlvbiBpcyBgT25saW5lSWZOb3RGb3VuZGAuIEl0IHF1ZXJpZXMgdGhlIG5ldHdvcmsgaWZcbiAgICAgKiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIG5vdCBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBmZXRjaCBvcHRpb24uXG4gICAgICovXG4gICAgZ2V0RmV0Y2hPcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoT3B0aW9uO1xuICAgIH1cbn1cbmV4cG9ydHMuRGF0YVJlcXVlc3QgPSBEYXRhUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5JbmRleExheWVyQ2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbi8qKlxuICogRGVzY3JpYmVzIGEgaW5kZXggbGF5ZXIgYW5kIHByb3ZpZGVzIHRoZSBwb3NzaWJpbGl0eSB0byBnZXQgcGFydGl0aW9ucyBtZXRhZGF0YSBhbmQgZGF0YS5cbiAqL1xuY2xhc3MgSW5kZXhMYXllckNsaWVudCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgW1tJbmRleExheWVyQ2xpZW50XV0gaW5zdGFuY2Ugd2l0aCBJbmRleExheWVyQ2xpZW50UGFyYW1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBwYXJhbWV0ZXJzIGZvciB1c2UgdG8gaW5pdGlhbGl6ZSBJbmRleExheWVyQ2xpZW50LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgICAgIHRoaXMuaHJuID0gcGFyYW1zLmNhdGFsb2dIcm4udG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5sYXllcklkID0gcGFyYW1zLmxheWVySWQ7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgYWxsIHBhcnRpdGlvbnMgbWV0YWRhdGEgZnJvbSBhIGxheWVyIHRoYXQgbWF0Y2ggYSBxdWVyeSBmcm9tIHRoZSBbW0luZGV4UXVlcnlSZXF1ZXN0XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gSW5kZXhRdWVyeVJlcXVlc3QgVGhlIFtbSW5kZXhRdWVyeVJlcXVlc3RdXSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgbWV0YWRhdGEgZm9yIGVhY2ggb2YgdGhlIHBhcnRpdGlvbnMgZnJvbSB0aGUgcmVxdWVzdGVkIGxheWVyLlxuICAgICAqL1xuICAgIGdldFBhcnRpdGlvbnMocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpO1xuICAgICAgICAgICAgaWYgKCFxdWVyeSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IHF1ZXJ5XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCdWlsZGVyID0geWllbGQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihcImluZGV4XCIsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgYWJvcnRTaWduYWwpLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4TWV0YWRhdGEgPSB5aWVsZCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkluZGV4QXBpLnBlcmZvcm1RdWVyeShyZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgICAgIGxheWVySUQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBodWdlOiByZXF1ZXN0LmdldEh1Z2VSZXNwb25zZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4gUHJvbWlzZS5yZWplY3QoZXJyKSk7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhNZXRhZGF0YS5kYXRhXG4gICAgICAgICAgICAgICAgPyBQcm9taXNlLnJlc29sdmUoaW5kZXhNZXRhZGF0YS5kYXRhKVxuICAgICAgICAgICAgICAgIDogUHJvbWlzZS5yZWplY3QoaW5kZXhNZXRhZGF0YS5lcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIHBhcnRpdGlvbiBkYXRhIHVzaW5nIGRhdGEgaGFuZGxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGVsIFRoZSBkYXRhIG1vZGVsIG9mIHBhcnRpdGlvbiBtZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIGZyb20gdGhlIHJlcXVlc3RlZCBwYXJ0aXRpb24uXG4gICAgICovXG4gICAgZ2V0RGF0YShtb2RlbCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICghbW9kZWwuaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gZGF0YSBoYW5kbGUgZm9yIHRoaXMgcGFydGl0aW9uXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwiYmxvYlwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKS5jYXRjaChlcnIgPT4gUHJvbWlzZS5yZWplY3QoZXJyKSk7XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5CbG9iQXBpLmdldEJsb2IoYnVpbGRlciwge1xuICAgICAgICAgICAgICAgIGRhdGFIYW5kbGU6IG1vZGVsLmlkLFxuICAgICAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCBiYXNlVXJsIGFuZCBjcmVhdGUgcmVxdWVzdEJ1aWxkZXIgZm9yIHNlbmRpbmcgcmVxdWVzdHMgdG8gdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAgICAgKiBAcGFyYW0gYnVpbGRlclR5cGUgZW5kcG9pbnQgbmFtZSBpcyBuZWVkZWQgdG8gY3JlYXRlIHByb3ByaWF0ZSByZXF1ZXN0QnVpbGRlclxuICAgICAqXG4gICAgICogQHJldHVybnMgcmVxdWVzdEJ1aWxkZXJcbiAgICAgKi9cbiAgICBnZXRSZXF1ZXN0QnVpbGRlcihidWlsZGVyVHlwZSwgaHJuLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShidWlsZGVyVHlwZSwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCBocm4sIGFib3J0U2lnbmFsKS5jYXRjaChlcnIgPT4gUHJvbWlzZS5yZWplY3QoZXJyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuSW5kZXhMYXllckNsaWVudCA9IEluZGV4TGF5ZXJDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkluZGV4UXVlcnlSZXF1ZXN0ID0gdm9pZCAwO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IHBhcnRpdGlvbnMgbWV0YWRhdGEgZnJvbSB0aGUgcGxhdGZvcm0gSW5kZXggU2VydmljZS5cbiAqL1xuY2xhc3MgSW5kZXhRdWVyeVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBxdWVyeSBBbiBSU1FMIHF1ZXJ5IHRvIHVzZSB0byByZXRyaWV2ZSBwYXJ0aXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5LlxuICAgICAqIFRoZSBxdWVyeSBtdXN0IHVzZSB0aGUgaW5kZXhpbmcgYXR0cmlidXRlcyBkZWZpbmVkIGluIHRoZSBpbmRleCBsYXllci5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW0luZGV4UXVlcnlSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhRdWVyeVN0cmluZyhxdWVyeSkge1xuICAgICAgICB0aGlzLnF1ZXJ5U3RyaW5nID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGlzSHVnZVJlc3BvbnNlIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpc0h1Z2UgVGhlIGJvb2xlYW4gcGFyYW1ldGVyIHNob3dzIGlzIHRoZSBxdWVyeSBodWdlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tJbmRleFF1ZXJ5UmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoSHVnZVJlc3BvbnNlKGlzSHVnZSkge1xuICAgICAgICB0aGlzLmlzSHVnZVJlc3BvbnNlID0gaXNIdWdlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHF1ZXJ5U3RyaW5nIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHF1ZXJ5U3RyaW5nIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRRdWVyeVN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlTdHJpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgaXNIdWdlUmVzcG9uc2UgcHJvcGVydHkgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYGlzSHVnZVJlc3BvbnNlYCBib29sZWFuLlxuICAgICAqL1xuICAgIGdldEh1Z2VSZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIdWdlUmVzcG9uc2U7XG4gICAgfVxufVxuZXhwb3J0cy5JbmRleFF1ZXJ5UmVxdWVzdCA9IEluZGV4UXVlcnlSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MYXllclZlcnNpb25zUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGxheWVyIHZlcnNpb25zIG9mIGEgc3BlY2lmaWMgY2F0YWxvZyB2ZXJzaW9uLiAqL1xuY2xhc3MgTGF5ZXJWZXJzaW9uc1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEdldHMgYSBjYXRhbG9nIHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY2F0YWxvZyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGdldFZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNhdGFsb2cgdmVyc2lvbiB2YWx1ZSB0aGF0IGlzIHVzZWQgaW4gdGhlICdnZXRMYXllclZlcnNpb25zJyBtZXRob2Qgb2YgW1tDYXRhbG9nQ2xpZW50XV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBTcGVjaWZ5IHRoZSBjYXRhbG9nIHZlcnNpb24uXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tMYXllclZlcnNpb25zUmVxdWVzdF1dIGluc3RhbmNlXG4gICAgICovXG4gICAgd2l0aFZlcnNpb24odmVyc2lvbikge1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDTigJMxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQeKAk1ph4oCTejDigJM5XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW0xheWVyVmVyc2lvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA04oCTMTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0HigJNaYeKAk3ow4oCTOV0uXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLkxheWVyVmVyc2lvbnNSZXF1ZXN0ID0gTGF5ZXJWZXJzaW9uc1JlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGFydGl0aW9uc1JlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgcGFydGl0aW9ucyBtZXRhZGF0YSBmcm9tIHRoZSBNZXRhZGF0YSBTZXJ2aWNlIEFQSS5cbiAqL1xuY2xhc3MgUGFydGl0aW9uc1JlcXVlc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmZldGNoT3B0aW9uID0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZUlmTm90Rm91bmQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA04oCTMTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0HigJNaYeKAk3ow4oCTOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQmlsbGluZ1RhZyh0YWcpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nVGFnID0gb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEudmFsaWRhdGVCaWxsaW5nVGFnKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwcm92aWRlZCBwYXJ0aXRpb24gSURzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkcyBUaGUgSURzIG9mIHBhcnRpdGlvbnMgZnJvbSB3aGljaCB5b3Ugd2FudCB0byBnZXQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBUaGUgcmVxdWlyZWQgcXVhbnRpdHkgaXMgYmV0d2VlbiAxIGFuZCAxMDAuXG4gICAgICogSWYgcGFydGl0aW9uIElEcyBhcmUgbm90IHByb3ZpZGVkLCBhbGwgcGFydGl0aW9ucyBhcmUgcmV0cmlldmVkLlxuICAgICAqIElmIHRoZSBxdWFudGl0eSBvZiBwYXJ0aXRpb24gSURzIGlzIGxlc3MgdGhhbiAxIChlbXB0eSBhcnJheSkgb3IgbW9yZSB0aGFuIDEwMCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbUGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFBhcnRpdGlvbklkcyhpZHMpIHtcbiAgICAgICAgdGhpcy5wYXJ0aXRpb25JZHMgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS52YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0KGlkcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHBhcnRpdGlvbiBJRHMgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYHBhcnRpdGlvbklkc2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldFBhcnRpdGlvbklkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGl0aW9uSWRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwcm92aWRlZCBhZGRpdGlvbmFsIGZpZWxkczogYGRhdGFTaXplYCwgYGNoZWNrc3VtYCwgYGNvbXByZXNzZWREYXRhU2l6ZWAsIGFuZCBgY3JjYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIFRoZSBhcnJheSBvZiBzdHJpbmdzLlxuICAgICAqIFRoZSBhcnJheSBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHZhbHVlczogYGRhdGFTaXplYCwgYGNoZWNrc3VtYCwgYGNvbXByZXNzZWREYXRhU2l6ZWAsIGFuZCBgY3JjYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbUGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEFkZGl0aW9uYWxGaWVsZHMoYWRkaXRpb25hbEZpZWxkcykge1xuICAgICAgICBpZiAoYWRkaXRpb25hbEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkaXRpb25hbEZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yLiBQYXJhbWV0ZXIgJ2FkZGl0aW9uYWxGaWVsZHMnIGNvdWxkIG5vdCBjb250YWluIGVtcHR5IGFycmF5LiBBZGQgdmFsdWUgb3IgZG8gbm90IHVzZSB0aGlzIG1ldGhvZC5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgcGFydGl0aW9uSWRzYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QWRkaXRpb25hbEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkaXRpb25hbEZpZWxkcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgeW91IGNhbiB1c2UgdG8gc2V0IHRoZSBzb3VyY2UgZnJvbVxuICAgICAqIHdoaWNoIGRhdGEgc2hvdWxkIGJlIGZldGNoZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIGBnZXRGZXRjaE9wdGlvbigpYCBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIGBGZXRjaE9wdGlvbmAgZW51bS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIHVwZGF0ZWQgYFBhcnRpdGlvbnNSZXF1ZXN0YCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICB3aXRoRmV0Y2hPcHRpb24ob3B0aW9uKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb24gPSBvcHRpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmZXRjaCBvcHRpb24gdGhhdCBjb250cm9scyBob3cgcmVxdWVzdHMgYXJlIGhhbmRsZWQuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBvcHRpb24gaXMgYE9ubGluZUlmTm90Rm91bmRgLiBJdCBxdWVyaWVzIHRoZSBuZXR3b3JrIGlmXG4gICAgICogdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgZmV0Y2ggb3B0aW9uLlxuICAgICAqL1xuICAgIGdldEZldGNoT3B0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaE9wdGlvbjtcbiAgICB9XG59XG5leHBvcnRzLlBhcnRpdGlvbnNSZXF1ZXN0ID0gUGFydGl0aW9uc1JlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlBvbGxSZXF1ZXN0ID0gdm9pZCAwO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gdGhlIHBsYXRmb3JtIFN0cmVhbSBTZXJ2aWNlLlxuICovXG5jbGFzcyBQb2xsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2NyaXB0aW9uIG1vZGUgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIG1vZGUuXG4gICAgICovXG4gICAgZ2V0TW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tQb2xsUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTW9kZShtb2RlKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gaWQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqL1xuICAgIGdldFN1YnNjcmlwdGlvbklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tQb2xsUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoU3Vic2NyaXB0aW9uSWQoaWQpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IGlkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLlBvbGxSZXF1ZXN0ID0gUG9sbFJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IHF1YWR0cmVlIG1ldGFkYXRhIGZyb20gdGhlIFF1ZXJ5IFNlcnZpY2UgQVBJLlxuICpcbiAqIFRoaXMgY2xhc3Mgd29ya3Mgb25seSB3aXRoIHZlcnNpb25lZCBhbmQgdm9sYXRpbGUgbGF5ZXJzIHdoZXJlIHRoZSBwYXJ0aXRpb25pbmcgc2NoZW1lIGlzIEhFUkUgVGlsZS5cbiAqL1xuY2xhc3MgUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIGdlb21ldHJpYyBhcmVhIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRLZXkgQWRkcmVzc2VzIGEgdGlsZSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFF1YWRLZXkocXVhZEtleSkge1xuICAgICAgICB0aGlzLnF1YWRLZXkgPSBxdWFkS2V5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlY3Vyc2lvbiBkZXB0aCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGRlcHRoIHBhcmFtZXRlciBpcyA0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlcHRoIFRoZSByZWN1cnNpb24gZGVwdGggb2YgdGhlIHJlc3BvbnNlLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqXG4gICAgICogSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBvbmx5IGRhdGEgZnJvbSB0aGUgcXVhZGtleSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogSW4gdGhpcyB3YXksIHRoZSBkZXB0aCBkZXNjcmliZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdWJRdWFkS2V5cyBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICovXG4gICAgd2l0aERlcHRoKGRlcHRoKSB7XG4gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS52YWxpZGF0ZUJpbGxpbmdUYWcodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgYWRkaXRpb25hbCBmaWVsZHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFycmF5IG9mIHN0cmluZ3MuIEFycmF5IGNvdWxkIGNvbnRhaW4gbmV4dCB2YWx1ZXMgXCJkYXRhU2l6ZVwiIHwgXCJjaGVja3N1bVwiIHwgXCJjb21wcmVzc2VkRGF0YVNpemUgfCBcImNyY1wiXCIuXG4gICAgICogVGhpcyB2YWx1ZXMgY291bGQgYmUgdXNlZnVsIGZvciBnZXRQYXJ0aXRpb25zIG1ldGhvZCBmcm9tIHZlcnNpb25lZExheWVyQ2xpZW50IGFuZCB2b2xhdGlsZUxheWVyQ2xpZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEFkZGl0aW9uYWxGaWVsZHMoYWRkaXRpb25hbEZpZWxkcykge1xuICAgICAgICB0aGlzLmFkZGl0aW9uYWxGaWVsZHMgPSBhZGRpdGlvbmFsRmllbGRzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBbW1F1YWRLZXldXSBvYmplY3QgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgdGhlIGNvbmZpZ3VyZWQgW1tRdWFkS2V5XV0gb2JqZWN0LlxuICAgICAqL1xuICAgIGdldFF1YWRLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1YWRLZXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgZGVwdGggZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHRoZSBjb25maWd1cmVkIGRlcHRoLlxuICAgICAqL1xuICAgIGdldERlcHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZXB0aCB8fCAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYmlsbGluZyB0YWcgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRCaWxsaW5nVGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nVGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEFkZGl0aW9uYWwgZmllbGRzLlxuICAgICAqL1xuICAgIGdldEFkZGl0aW9uYWxGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxGaWVsZHM7XG4gICAgfVxufVxuZXhwb3J0cy5RdWFkS2V5UGFydGl0aW9uc1JlcXVlc3QgPSBRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVhZFRyZWVJbmRleFJlcXVlc3QgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byBnZXQgcXVhZHRyZWUgbWV0YWRhdGEgZnJvbSB0aGUgUXVlcnkgU2VydmljZSBBUEkuXG4gKlxuICogVGhpcyBjbGFzcyB3b3JrcyBvbmx5IHdpdGggdmVyc2lvbmVkIG9yIHZvbGF0aWxlIGxheWVycyB3aGVyZSB0aGUgcGFydGl0aW9uaW5nIHNjaGVtZSBpcyBIRVJFIFRpbGUuXG4gKi9cbmNsYXNzIFF1YWRUcmVlSW5kZXhSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBbW1F1YWRUcmVlSW5kZXhSZXF1ZXN0XV0gaW5zdGFuY2UgZm9yIGZldGNoaW5nIHRoZSBxdWFkdHJlZSBpbmRleCBmcm9tIHRoZSBRdWVyeSBTZXJ2aWNlIEFQSVxuICAgICAqIGZvciB2b2xhdGlsZSBvciB2ZXJzaW9uZWQgbGF5ZXJzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUgKFtbSFJOXV0pLlxuICAgICAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIuXG4gICAgICogQHBhcmFtIGxheWVyVHlwZSBUaGUgdHlwZSBvZiBsYXllciB0aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QuIEJ5IGRlZmF1bHQsIGEgbGF5ZXIgb2YgdGhlIHZlcnNpb25lZCB0eXBlIGlzIHVzZWQuXG4gICAgICogQHJldHVybiBUaGUgW1tRdWFkVHJlZUluZGV4UmVxdWVzdF1dIGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2F0YWxvZ0hybiwgbGF5ZXJJZCwgbGF5ZXJUeXBlID0gXCJ2ZXJzaW9uZWRcIikge1xuICAgICAgICB0aGlzLmNhdGFsb2dIcm4gPSBjYXRhbG9nSHJuO1xuICAgICAgICB0aGlzLmxheWVySWQgPSBsYXllcklkO1xuICAgICAgICB0aGlzLmxheWVyVHlwZSA9IGxheWVyVHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cgYWdhaW5zdCB3aGljaCB5b3Ugd2FudCB0byBydW4gdGhlIHF1ZXJ5LlxuICAgICAqIEl0IG11c3QgYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBTcGVjaWZ5IHRoZSBjYXRhbG9nIHZlcnNpb24gb3IsIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgbGF0ZXN0IGNhdGFsb2cgdmVyc2lvbiwgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBbW1F1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoVmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGdlb21ldHJpYyBhcmVhIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRLZXkgQWRkcmVzc2VzIGEgdGlsZSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tRdWFkS2V5UGFydGl0aW9uc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFF1YWRLZXkocXVhZEtleSkge1xuICAgICAgICB0aGlzLnF1YWRLZXkgPSBxdWFkS2V5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlY3Vyc2lvbiBkZXB0aCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGRlcHRoIHBhcmFtZXRlciBpcyA0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlcHRoIFRoZSByZWN1cnNpb24gZGVwdGggb2YgdGhlIHJlc3BvbnNlLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqXG4gICAgICogSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBvbmx5IGRhdGEgZnJvbSB0aGUgcXVhZGtleSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogSW4gdGhpcyB3YXksIHRoZSBkZXB0aCBkZXNjcmliZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdWJRdWFkS2V5cyBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICovXG4gICAgd2l0aERlcHRoKGRlcHRoKSB7XG4gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbUXVhZFRyZWVJbmRleFJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBhZGRpdGlvbmFsIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFycmF5IG9mIHN0cmluZ3MuIEFycmF5IGNvdWxkIGNvbnRhaW4gbmV4dCB2YWx1ZXMgXCJkYXRhU2l6ZVwiIHwgXCJjaGVja3N1bVwiIHwgXCJjb21wcmVzc2VkRGF0YVNpemUgfCBcImNyY1wiXCIuXG4gICAgICogVGhpcyB2YWx1ZXMgY291bGQgYmUgdXNlZnVsIGZvciBnZXRQYXJ0aXRpb25zIG1ldGhvZCBmcm9tIHZlcnNpb25lZExheWVyQ2xpZW50IGFuZCB2b2xhdGlsZUxheWVyQ2xpZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tRdWFkVHJlZUluZGV4UmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQWRkaXRpb25hbEZpZWxkcyhhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgIHRoaXMuYWRkaXRpb25hbEZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlndXJlZCBjYXRhbG9nIHZlcnNpb24gZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY2F0YWxvZyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKi9cbiAgICBnZXRWZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIFtbUXVhZEtleV1dIG9iamVjdCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSB0aGUgY29uZmlndXJlZCBbW1F1YWRLZXldXSBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0UXVhZEtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVhZEtleTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBkZXB0aCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGhlIGNvbmZpZ3VyZWQgZGVwdGguXG4gICAgICovXG4gICAgZ2V0RGVwdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlcHRoIHx8IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgdHlwZSBvZiB0aGUgbGF5ZXIgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqIEJ5IGRlZmF1bHQsIGEgbGF5ZXIgb2YgdGhlIHZlcnNpb25lZCB0eXBlIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBsYXllciB0eXBlLlxuICAgICAqL1xuICAgIGdldExheWVyVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJUeXBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIFtbSFJOXV0gaW5zdGFuY2Ugb2YgdGhlIGNhdGFsb2cgSEVSRSBSZXNvdXJjZSBOYW1lKEhSTikgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY29uZmlndXJlZCBbW0hSTl1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGdldENhdGFsb2dIcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGFsb2dIcm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBsYXllciBJRCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBsYXllciBJRCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0TGF5ZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYWRkaXRpb25hbCBmaWVsZHMgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBBZGRpdGlvbmFsIGZpZWxkcy5cbiAgICAgKi9cbiAgICBnZXRBZGRpdGlvbmFsRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRpdGlvbmFsRmllbGRzO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVhZFRyZWVJbmRleFJlcXVlc3QgPSBRdWFkVHJlZUluZGV4UmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1ZXJ5Q2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogQSBjbGllbnQgZm9yIHRoZSBRdWVyeSBTZXJ2aWNlIEFQSSB0aGF0IHByb3ZpZGVzIGEgd2F5IHRvIGdldCBpbmZvcm1hdGlvbiAobWV0YWRhdGEpXG4gKiBhYm91dCBsYXllcnMgYW5kIHBhcnRpdGlvbnMgc3RvcmVkIGluIGEgY2F0YWxvZy5cbiAqIFRoaXMgc2VydmljZSBleHBvc2VzIHRoZSBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgcGFydGl0aW9uIHRoYXQgeW91IGNhbiBxdWVyeSBvbmUgYnkgb25lIG9yIHVzaW5nIGEgcGFyZW50IHRpbGUuXG4gKi9cbmNsYXNzIFF1ZXJ5Q2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsaWVudCBmb3IgdGhlIFF1ZXJ5IFNlcnZpY2UgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBbW09scENsaWVudFNldHRpbmdzXV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tRdWVyeUNsaWVudF1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5hcGlWZXJzaW9uID0gXCJ2MVwiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIHRoZSBxdWFkdHJlZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBjb25maWd1cmVkIFtbUXVhZFRyZWVJbmRleFJlcXVlc3RdXSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBxdWFkdHJlZSBpbmRleCBvYmplY3QuXG4gICAgICovXG4gICAgZmV0Y2hRdWFkVHJlZUluZGV4KHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBxdWFkS2V5ID0gcmVxdWVzdC5nZXRRdWFkS2V5KCk7XG4gICAgICAgICAgICBjb25zdCBsYXllcklkID0gcmVxdWVzdC5nZXRMYXllcklkKCk7XG4gICAgICAgICAgICBpZiAoIXF1YWRLZXkgfHwgIW9scF9zZGtfY29yZV8xLlRpbGVLZXkuaXNWYWxpZChxdWFkS2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgUXVhZEtleVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbGF5ZXJJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgSWQgb2YgdGhlIExheWVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNhdGFsb2dWZXJzaW9uID0gcmVxdWVzdC5nZXRWZXJzaW9uKCk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRMYXllclR5cGUoKSA9PT0gXCJ2ZXJzaW9uZWRcIiAmJlxuICAgICAgICAgICAgICAgIGNhdGFsb2dWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjYXRhbG9nVmVyc2lvbiA9IHlpZWxkIHRoaXMuZ2V0Q2F0YWxvZ0xhdGVzdFZlcnNpb24ocmVxdWVzdC5nZXRDYXRhbG9nSHJuKCksIGFib3J0U2lnbmFsLCByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoYEVycm9yIGdldHRpbmcgdGhlIGxhc3QgY2F0YWxvZyB2ZXJzaW9uOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldExheWVyVHlwZSgpID09PSBcInZlcnNpb25lZFwiICYmXG4gICAgICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChgUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBjYXRhbG9nIHZlcnNpb25gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCdWlsZGVyID0geWllbGQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwicXVlcnlcIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCByZXF1ZXN0LmdldENhdGFsb2dIcm4oKSwgYWJvcnRTaWduYWwpLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGBFcm9yciBjcmVhdGluZyByZXF1ZXN0IG9iamVjdCBmb3IgcXVlcnkgc2VydmljZTogJHtlcnJvcn1gKSk7XG4gICAgICAgICAgICBjb25zdCBzdWJRdWFkS2V5c01heExlbmd0aCA9IHJlcXVlc3QuZ2V0RGVwdGgoKTtcbiAgICAgICAgICAgIGxldCBmZXRjaGluZ1F1YWRUcmVlSW5kZXhGdW5jdGlvbjtcbiAgICAgICAgICAgIGxldCBwYXJhbXNGb3JGZXRjaFF1YWRUcmVlSW5kZXggPSB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgICAgIGRlcHRoOiBzdWJRdWFkS2V5c01heExlbmd0aCxcbiAgICAgICAgICAgICAgICBxdWFkS2V5OiBvbHBfc2RrX2NvcmVfMS5UaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChxdWFkS2V5LnJvdywgcXVhZEtleS5jb2x1bW4sIHF1YWRLZXkubGV2ZWwpXG4gICAgICAgICAgICAgICAgICAgIC5tb3J0b25Db2RlKClcbiAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZzogcmVxdWVzdC5nZXRCaWxsaW5nVGFnKCksXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbEZpZWxkczogcmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRMYXllclR5cGUoKSA9PT0gXCJ2b2xhdGlsZVwiKSB7XG4gICAgICAgICAgICAgICAgZmV0Y2hpbmdRdWFkVHJlZUluZGV4RnVuY3Rpb24gPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlF1ZXJ5QXBpLnF1YWRUcmVlSW5kZXhWb2xhdGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZldGNoaW5nUXVhZFRyZWVJbmRleEZ1bmN0aW9uID0gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5RdWVyeUFwaS5xdWFkVHJlZUluZGV4O1xuICAgICAgICAgICAgICAgIHBhcmFtc0ZvckZldGNoUXVhZFRyZWVJbmRleCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zRm9yRmV0Y2hRdWFkVHJlZUluZGV4KSwgeyB2ZXJzaW9uOiBjYXRhbG9nVmVyc2lvbiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmZXRjaGluZ1F1YWRUcmVlSW5kZXhGdW5jdGlvbihyZXF1ZXN0QnVpbGRlciwgcGFyYW1zRm9yRmV0Y2hRdWFkVHJlZUluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgcGFydGl0aW9ucyB1c2luZyB0aGVpciBJRHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgYFBhcnRpdGlvbnNSZXF1ZXN0YCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIGZyb20gd2hpY2ggeW91IHdhbnQgdG8gZ2V0IHBhcnRpdGlvbnMuXG4gICAgICogQHBhcmFtIGhybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgcGFydGl0aW9ucy5cbiAgICAgKi9cbiAgICBnZXRQYXJ0aXRpb25zQnlJZChyZXF1ZXN0LCBsYXllcklkLCBocm4sIGFib3J0U2lnbmFsLCBjYXRhbG9nVmVyc2lvbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaWRzTGlzdCA9IHJlcXVlc3QuZ2V0UGFydGl0aW9uSWRzKCk7XG4gICAgICAgICAgICBpZiAoIWlkc0xpc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IHBhcnRpdGlvbklkcyBsaXN0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkodGhpcy5zZXR0aW5ncy5jYWNoZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRGZXRjaE9wdGlvbigpICE9PSBvbHBfc2RrX2NvcmVfMS5GZXRjaE9wdGlvbnMuT25saW5lT25seSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZFBhcnRpdGlvbnMgPSBjYWNoZS5nZXQocmVxdWVzdCwgaHJuLnRvU3RyaW5nKCksIGxheWVySWQsIGNhdGFsb2dWZXJzaW9uKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkUGFydGl0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbnM6IGNhY2hlZFBhcnRpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSB5aWVsZCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJxdWVyeVwiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGBFcm9yciBjcmVhdGluZyByZXF1ZXN0IG9iamVjdCBmb3IgcXVlcnkgc2VydmljZTogJHtlcnJvcn1gKSk7XG4gICAgICAgICAgICBjb25zdCBtZWRhdGFkYSA9IHlpZWxkIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuUXVlcnlBcGkuZ2V0UGFydGl0aW9uc0J5SWQocmVxdWVzdEJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBsYXllcklkLFxuICAgICAgICAgICAgICAgIHBhcnRpdGlvbjogaWRzTGlzdCxcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmllbGRzOiByZXF1ZXN0LmdldEFkZGl0aW9uYWxGaWVsZHMoKSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBjYXRhbG9nVmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gYCR7Y2F0YWxvZ1ZlcnNpb259YCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IFByb21pc2UucmVqZWN0KGVycikpO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSAhPT0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZU9ubHkgJiZcbiAgICAgICAgICAgICAgICBtZWRhdGFkYSAmJlxuICAgICAgICAgICAgICAgIG1lZGF0YWRhLnBhcnRpdGlvbnMgJiZcbiAgICAgICAgICAgICAgICBtZWRhdGFkYS5wYXJ0aXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnMgPSBtZWRhdGFkYS5wYXJ0aXRpb25zLm1hcChwYXJ0aXRpb24gPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW06IHBhcnRpdGlvbi5jaGVja3N1bSxcbiAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZERhdGFTaXplOiBwYXJ0aXRpb24uY29tcHJlc3NlZERhdGFTaXplLFxuICAgICAgICAgICAgICAgICAgICBkYXRhSGFuZGxlOiBwYXJ0aXRpb24uZGF0YUhhbmRsZSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZTogcGFydGl0aW9uLmRhdGFTaXplLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb246IHBhcnRpdGlvbi5wYXJ0aXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHBhcnRpdGlvbi52ZXJzaW9uXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGNhY2hlLnB1dChyZXF1ZXN0LCBocm4udG9TdHJpbmcoKSwgbGF5ZXJJZCwgcGFydGl0aW9ucywgY2F0YWxvZ1ZlcnNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtZWRhdGFkYSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGNhdGFsb2cgdmVyc2lvblxuICAgICAqL1xuICAgIGdldENhdGFsb2dMYXRlc3RWZXJzaW9uKGNhdGFsb2dIcm4sIGFib3J0U2lnbmFsLCBiaWxsaW5nVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0geWllbGQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwibWV0YWRhdGFcIiwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCBjYXRhbG9nSHJuLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoYEVyb3JyIGNyZWF0aW5nIHJlcXVlc3Qgb2JqZWN0IGZvciBtZXRhZGF0YSBzZXJ2aWNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSB5aWVsZCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLk1ldGFkYXRhQXBpLmxhdGVzdFZlcnNpb24ocmVxdWVzdCwge1xuICAgICAgICAgICAgICAgIHN0YXJ0VmVyc2lvbjogLTEsXG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZ1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobGF0ZXN0VmVyc2lvbi52ZXJzaW9uKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5RdWVyeUNsaWVudCA9IFF1ZXJ5Q2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNjaGVtYURldGFpbHNSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gdGhlIHBsYXRmb3JtIEFydGlmYWN0IFNlcnZpY2UuXG4gKi9cbmNsYXNzIFNjaGVtYURldGFpbHNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHNjaGVtYSBtZXRhZGF0YSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2NoZW1hRGV0YWlsc1JlcXVlc3QgVGhlIFtbU2NoZW1hRGV0YWlsc1JlcXVlc3RdXSBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2NoZW1hIG1ldGFkYXRhLlxuICAgICAqL1xuICAgIGdldFNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hSHJuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgb2YgYSBzY2hlbWEgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIHRoYXQgaXMgdXNlZCBpblxuICAgICAqIHRoZSBgZ2V0U2NoZW1hYCBhbmQgYGdldFNjaGVtYURldGFpbHNgIG1ldGhvZHMgb2YgW1tBcnRpZmFjdENsaWVudF1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNjaGVtYUhybiBUaGUgbGF5ZXIgc2NoZW1hIEhSTi5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbU2NoZW1hRGV0YWlsc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFNjaGVtYShzY2hlbWFIcm4pIHtcbiAgICAgICAgdGhpcy5zY2hlbWFIcm4gPSBzY2hlbWFIcm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNCZuZGFzaDsxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1NjaGVtYURldGFpbHNSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS52YWxpZGF0ZUJpbGxpbmdUYWcodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxufVxuZXhwb3J0cy5TY2hlbWFEZXRhaWxzUmVxdWVzdCA9IFNjaGVtYURldGFpbHNSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TY2hlbWFSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gdGhlIHBsYXRmb3JtIEFydGlmYWN0IFNlcnZpY2UuXG4gKi9cbmNsYXNzIFNjaGVtYVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGBWYXJpYW50YCBvYmplY3Qgb2YgdGhlIHNjaGVtYSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgVmFyaWFudGAgb2JqZWN0IG9mIHRoZSBzY2hlbWEuXG4gICAgICovXG4gICAgZ2V0VmFyaWFudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFyaWFudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIG9mIGEgc2NoZW1hIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSB0aGF0IGlzIHVzZWQgaW5cbiAgICAgKiB0aGUgYGdldFNjaGVtYWAgYW5kIGBnZXRTY2hlbWFEZXRhaWxzYCBtZXRob2RzIG9mIFtbQXJ0aWZhY3RDbGllbnRdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YXJpYW50IFRoZSBgVmFyaWFudGAgb2JqZWN0IG9mIHRoZSBzY2hlbWFcbiAgICAgKiBAcmV0dXJuIFRoZSBbW1NjaGVtYVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFZhcmlhbnQodmFyaWFudCkge1xuICAgICAgICB0aGlzLnZhcmlhbnQgPSB2YXJpYW50O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqIEByZXR1cm4gVGhlIHVwZGF0ZWQgW1tTY2hlbWFSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS52YWxpZGF0ZUJpbGxpbmdUYWcodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxufVxuZXhwb3J0cy5TY2hlbWFSZXF1ZXN0ID0gU2NoZW1hUmVxdWVzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2Vla1JlcXVlc3QgPSB2b2lkIDA7XG4vKipcbiAqIFByZXBhcmVzIGluZm9ybWF0aW9uIGZvciBjYWxscyB0byB0aGUgcGxhdGZvcm0gU3RyZWFtIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFNlZWtSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKi9cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1NlZWtSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhNb2RlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN1YnNjcmlwdGlvbiBpZCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gaWQuXG4gICAgICovXG4gICAgZ2V0U3Vic2NyaXB0aW9uSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1NlZWtSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTdWJzY3JpcHRpb25JZChpZCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkID0gaWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB3aXRoU2Vla09mZnNldHMob2Zmc2V0cykge1xuICAgICAgICB0aGlzLm9mZnNldHMgPSBvZmZzZXRzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ2V0U2Vla09mZnNldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldHM7XG4gICAgfVxufVxuZXhwb3J0cy5TZWVrUmVxdWVzdCA9IFNlZWtSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3RhdGlzdGljc0NsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIEEgY2xpZW50IGZvciB0aGUgcGxhdGZvcm0gU3RhdGlzdGljcyBTZXJ2aWNlLlxuICovXG5jbGFzcyBTdGF0aXN0aWNzQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBbW1N0YXRpc3RpY3NDbGllbnRdXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgW1tTdGF0aXN0aWNzQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB0aGlzLmFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgYW5kIHJldHVybnMgYSBsYXllciBzdW1tYXJ5IGZyb20gdGhlIHBsYXRmb3JtIFN0YXRpc3RpY3MgU2VydmljZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdW1tYXJ5UmVxdWVzdCBQYXJhbWV0ZXJzIHRoYXQgYXJlIG5lZWRlZCB0byBmZXRjaCB0aGUgbGF5ZXIgc3VtbWFyeS5cbiAgICAgKiBJbmNsdWRlcyBbW2NhdGFsb2dIcm5dXSBhbmQgW1tsYXllcklkXV0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2l0aCB0aGUgbGF5ZXIgc3VtbWFyeS5cbiAgICAgKi9cbiAgICBnZXRTdW1tYXJ5KHN1bW1hcnlSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcklkID0gc3VtbWFyeVJlcXVlc3QuZ2V0TGF5ZXJJZCgpO1xuICAgICAgICAgICAgY29uc3QgY2F0YWxvZ0hybiA9IHN1bW1hcnlSZXF1ZXN0LmdldENhdGFsb2dIcm4oKTtcbiAgICAgICAgICAgIGlmIChjYXRhbG9nSHJuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBObyBjYXRhbG9nSHJuIHByb3ZpZGVkYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxheWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGxheWVySWQgcHJvdmlkZWRgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb3ZlcmFnZVJlcXVlc3RCdWlsZGVyID0geWllbGQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihjYXRhbG9nSHJuKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQ292ZXJhZ2VBcGkuZ2V0RGF0YUNvdmVyYWdlU3VtbWFyeShjb3ZlcmFnZVJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgbGF5ZXJJZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXBlbmRpbmcgb24gdGhlIG1hcCB0eXBlIHRoYXQgeW91IHNwZWNpZnkgaW4gdGhlIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSwgZ2V0cyB0aGUgW1tTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlXG4gICAgICogd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBzZXR0aW5nczpcbiAgICAgKiAqIEJJVE1BUCAmbmRhc2g7IGZldGNoZXMgYSBiaXRtYXAgdGhhdCByZXByZXNlbnRzIHRoZSBhdmFpbGFiaWxpdHkgb2YgZGF0YSBpbiBwYXJ0aXRpb25zLlxuICAgICAqICogU0laRU1BUCAmbmRhc2g7IGZldGNoZXMgYSBoZWF0bWFwIHRoYXQgcmVwcmVzZW50cyBhIHBhcnRpdGlvbiBzaXplLlxuICAgICAqICogVElNRU1BUCAmbmRhc2g7IGZldGNoZXMgYSBoZWF0bWFwIHRoYXQgcmVwcmVzZW50cyBwYXJ0aXRpb24gdXBkYXRlIHRpbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhdGlzdGljc1JlcXVlc3QgVGhlIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB3aXRoIHRoZSByZXF1ZXN0ZWQgc2V0dGluZ3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB3aXRoIHRoZSByZXF1ZXN0ZWQgc2V0dGluZ3MuXG4gICAgICovXG4gICAgZ2V0U3RhdGlzdGljcyhzdGF0aXN0aWNzUmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHN0YXRpc3RpY3NSZXF1ZXN0LmdldExheWVySWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNhdGFsb2dIUk4gPSBzdGF0aXN0aWNzUmVxdWVzdC5nZXRDYXRhbG9nSHJuKCk7XG4gICAgICAgICAgICBjb25zdCB0eXBlbWFwID0gc3RhdGlzdGljc1JlcXVlc3QuZ2V0VHlwZW1hcCgpO1xuICAgICAgICAgICAgY29uc3QgZGF0YWxldmVsID0gc3RhdGlzdGljc1JlcXVlc3QuZ2V0RGF0YUxldmVsKCk7XG4gICAgICAgICAgICBpZiAoY2F0YWxvZ0hSTiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTm8gY2F0YWxvZ0hybiBwcm92aWRlZGApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYXllcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBObyBsYXllcklkIHByb3ZpZGVkYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVtYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIHR5cGVtYXAgcHJvdmlkZWRgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb3ZlcmFnZVJlcXVlc3RCdWlsZGVyID0geWllbGQgdGhpcy5nZXRSZXF1ZXN0QnVpbGRlcihjYXRhbG9nSFJOKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVtYXApIHtcbiAgICAgICAgICAgICAgICBjYXNlIG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLkNvdmVyYWdlRGF0YVR5cGUuQklUTUFQOlxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5Db3ZlcmFnZUFwaS5nZXREYXRhQ292ZXJhZ2VUaWxlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLkNvdmVyYWdlRGF0YVR5cGUuU0laRU1BUDpcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQ292ZXJhZ2VBcGkuZ2V0RGF0YUNvdmVyYWdlU2l6ZU1hcDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5Db3ZlcmFnZURhdGFUeXBlLlRJTUVNQVA6XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkNvdmVyYWdlQXBpLmdldERhdGFDb3ZlcmFnZVRpbWVNYXA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEluY29ycmVjdCB0eXBlbWFwIHByb3ZpZGVkOiAke3R5cGVtYXB9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QoY292ZXJhZ2VSZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgICAgIGxheWVySWQsXG4gICAgICAgICAgICAgICAgZGF0YWxldmVsLFxuICAgICAgICAgICAgICAgIGNhdGFsb2dIUk5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0UmVxdWVzdEJ1aWxkZXIoaHJuKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwic3RhdGlzdGljc1wiLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKGhybikpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlN0YXRpc3RpY3NDbGllbnQgPSBTdGF0aXN0aWNzQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlN0YXRpc3RpY3NSZXF1ZXN0ID0gZXhwb3J0cy5Db3ZlcmFnZURhdGFUeXBlID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBBIG1hcCB0eXBlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gKi9cbnZhciBDb3ZlcmFnZURhdGFUeXBlO1xuKGZ1bmN0aW9uIChDb3ZlcmFnZURhdGFUeXBlKSB7XG4gICAgLyoqIFJlcHJlc2VudHMgdGhlIGF2YWlsYWJpbGl0eSBvZiBkYXRhIGluIHBhcnRpdGlvbnMuICovXG4gICAgQ292ZXJhZ2VEYXRhVHlwZVtcIkJJVE1BUFwiXSA9IFwidGlsZW1hcFwiO1xuICAgIC8qKiBBIGhlYXRtYXAgdGhhdCByZXByZXNlbnRzIGEgcGFydGl0aW9uIHNpemUuICovXG4gICAgQ292ZXJhZ2VEYXRhVHlwZVtcIlNJWkVNQVBcIl0gPSBcImhlYXRtYXAvc2l6ZVwiO1xuICAgIC8qKiBBIGhlYXRtYXAgdGhhdCByZXByZXNlbnRzIHBhcnRpdGlvbiB1cGRhdGUgdGltZS4gKi9cbiAgICBDb3ZlcmFnZURhdGFUeXBlW1wiVElNRU1BUFwiXSA9IFwiaGVhdG1hcC9hZ2VcIjtcbn0pKENvdmVyYWdlRGF0YVR5cGUgPSBleHBvcnRzLkNvdmVyYWdlRGF0YVR5cGUgfHwgKGV4cG9ydHMuQ292ZXJhZ2VEYXRhVHlwZSA9IHt9KSk7XG4vKipcbiAqICBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IHN0YXRpc3RpY3MgZnJvbSB0aGUgcGxhdGZvcm0gU3RhdGlzdGljcyBTZXJ2aWNlLlxuICovXG5jbGFzcyBTdGF0aXN0aWNzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBbW0hSTl1dIHN0cmluZyBvZiB0aGUgY2F0YWxvZyBIRVJFIFJlc291cmNlIE5hbWUoSFJOKSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIFtbSFJOXV0gc3RyaW5nLlxuICAgICAqL1xuICAgIGdldENhdGFsb2dIcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGFsb2dIcm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBsYXllciBJRCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBsYXllciBJRCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0TGF5ZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIG1hcCB0eXBlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgbWFwIHR5cGUuXG4gICAgICovXG4gICAgZ2V0VHlwZW1hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZW1hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHRpbGUgbGV2ZWwgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm4gVGhlIHJlcXVlc3RlZCB0aWxlIGxldmVsIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXREYXRhTGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFMZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBjYXRhbG9nIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBocm4gVGhlIGNhdGFsb2cgSFJOLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aENhdGFsb2dIcm4oaHJuKSB7XG4gICAgICAgIHRoaXMuY2F0YWxvZ0hybiA9IGhybi50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSByZXF1ZXN0ZWQgYGxheWVySWRgIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tTdGF0aXN0aWNzUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTGF5ZXJJZChsYXllcklkKSB7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IGxheWVySWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGBjb3ZlcmFnZURhdGFUeXBlYCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY292ZXJhZ2VEYXRhVHlwZSBQb2ludHMgYXQgb25lIG9mIHRoZSBmb2xsb3dpbmcgU3RhdGlzdGljIEFQSSBlbmRwb2ludHM6XG4gICAgICogKiBCSVRNQVAgJm5kYXNoOyBmZXRjaGVzIGEgYml0bWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGRhdGEgaW4gcGFydGl0aW9ucy5cbiAgICAgKiAqIFNJWkVNQVAgJm5kYXNoOyBmZXRjaGVzIGEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgYSBwYXJ0aXRpb24gc2l6ZS5cbiAgICAgKiAqIFRJTUVNQVAgJm5kYXNoOyBmZXRjaGVzIGEgaGVhdG1hcCB0aGF0IHJlcHJlc2VudHMgcGFydGl0aW9uIHVwZGF0ZSB0aW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFR5cGVtYXAoY292ZXJhZ2VEYXRhVHlwZSkge1xuICAgICAgICB0aGlzLnR5cGVtYXAgPSBjb3ZlcmFnZURhdGFUeXBlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBgZGF0YUxldmVsYCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YUxldmVsIGRhdGFMZXZlbCBTcGVjaWZ5IHRoZSB0aWxlIGxldmVsIGFib3V0IHdoaWNoIHlvdSB3YW50IHRvIGdldCBzdGF0aXN0aWNhbCBkYXRhLlxuICAgICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aERhdGFMZXZlbChkYXRhTGV2ZWwpIHtcbiAgICAgICAgdGhpcy5kYXRhTGV2ZWwgPSBOdW1iZXIoZGF0YUxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSA0Jm5kYXNoOzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbU3RhdGlzdGljc1JlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG59XG5leHBvcnRzLlN0YXRpc3RpY3NSZXF1ZXN0ID0gU3RhdGlzdGljc1JlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3RyZWFtTGF5ZXJDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBvbHBfc2RrX2NvcmVfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWNvcmVcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtYXBpXCIpO1xuLyoqXG4gKiBEZXNjcmliZXMgYSBzdHJlYW0gbGF5ZXIuXG4gKi9cbmNsYXNzIFN0cmVhbUxheWVyQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBbW1N0cmVhbUxheWVyQ2xpZW50XV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBbW1N0cmVhbUxheWVyQ2xpZW50UGFyYW1zXV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tTdHJlYW1MYXllckNsaWVudF1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmFwaVZlcnNpb24gPSBcInYyXCI7XG4gICAgICAgIHRoaXMuY2F0YWxvZ0hybiA9IHBhcmFtcy5jYXRhbG9nSHJuO1xuICAgICAgICB0aGlzLmxheWVySWQgPSBwYXJhbXMubGF5ZXJJZDtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHBhcmFtcy5zZXR0aW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtZXNzYWdlIGNvbnN1bXB0aW9uIGZyb20gYSBzcGVjaWZpYyBzdHJlYW0gbGF5ZXIuIFVzZSB0aGUgYmFzZSBwYXRoIHJldHVybmVkIGZyb20gdGhlIEFQSSBMb29rdXAgc2VydmljZS5cbiAgICAgKiBGb3IgbW9kZSA9IHBhcmFsbGVsLCBvbmUgdW5pdCBvZiBwYXJhbGxlbGlzbSBjdXJyZW50bHkgZXF1YWxzIDEgTUJwcyBpbmJvdW5kIG9yIDIgTUJwcyBvdXRib3VuZCxcbiAgICAgKiB3aGljaGV2ZXIgaXMgZ3JlYXRlciwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxuICAgICAqIFRoZSBudW1iZXIgb2Ygc3Vic2NyaXB0aW9ucyB3aXRoaW4gdGhlIHNhbWUgZ3JvdXAgY2Fubm90IGV4Y2VlZCB0aGUgcGFyYWxsZWxpc20gYWxsb3dlZC5cbiAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIHNlZVxuICAgICAqIFtHZXQgRGF0YSBmcm9tIGEgU3RyZWFtIExheWVyXShodHRwczovL2RldmVsb3Blci5oZXJlLmNvbS9kb2N1bWVudGF0aW9uL2RhdGEtYXBpL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLXN0cmVhbS5odG1sKVxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFtbU3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmVkIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTdWJzY3JpcHRpb24gSWRcbiAgICAgKi9cbiAgICBzdWJzY3JpYmUocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCdWlsZGVyID0geWllbGQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKFwic3RyZWFtXCIsIHRoaXMuYXBpVmVyc2lvbiwgdGhpcy5zZXR0aW5ncywgdGhpcy5jYXRhbG9nSHJuLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlidGlvblJlcXVlc3RQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgICAgIG1vZGU6IHJlcXVlc3QuZ2V0TW9kZSgpLFxuICAgICAgICAgICAgICAgIGNvbnN1bWVySWQ6IHJlcXVlc3QuZ2V0Q29uc3VtZXJJZCgpLFxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiByZXF1ZXN0LmdldFN1YnNjcmlwdGlvbklkKCksXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uUHJvcGVydGllczogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25Qcm9wZXJ0aWVzKClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25SZXN1bHQgPSB5aWVsZCBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLlN0cmVhbUFwaS5zdWJzY3JpYmUocmVxdWVzdEJ1aWxkZXIsIHN1YnNjcmlidGlvblJlcXVlc3RQYXJhbXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhDb3JyZWxhdGlvbklkID0gcmVzLmhlYWRlcnMuZ2V0KFwiWC1Db3JyZWxhdGlvbi1JZFwiKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0geWllbGQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKE9iamVjdC5hc3NpZ24oeyB4Q29ycmVsYXRpb25JZCB9LCByZXNwb25zZURhdGEpKTtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gUHJvbWlzZS5yZWplY3QoZXJyKSk7XG4gICAgICAgICAgICAvLyBVcGRhdGUgeENvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgIHRoaXMueENvcnJlbGF0aW9uSWQgPSBzdWJzY3JpcHRpb25SZXN1bHQueENvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlidGlvbk5vZGVCYXNlVXJsID0gc3Vic2NyaXB0aW9uUmVzdWx0Lm5vZGVCYXNlVVJMO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdWJzY3JpcHRpb25SZXN1bHQuc3Vic2NyaXB0aW9uSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3VtZXMgZGF0YSBmcm9tIGEgbGF5ZXIuIFJldHVybnMgbWVzc2FnZXMgZnJvbSBhIHN0cmVhbSBsYXllci5cbiAgICAgKiBJZiB0aGUgZGF0YSBzaXplIGlzIGxlc3MgdGhhbiAxIE1CLCB0aGUgZGF0YSBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZC5cbiAgICAgKiBJZiB0aGUgZGF0YSBzaXplIGlzIGdyZWF0ZXIgdGhhbiAxIE1CLCBhIGRhdGEgaGFuZGxlIHdpbGwgYmUgcmV0dXJuZWQgcG9pbnRpbmcgdG8gdGhlIG9iamVjdCBzdG9yZWQgaW4gdGhlIEJsb2Igc3RvcmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgW1tQb2xsUmVxdWVzdF1dIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmVkIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBNZXNzYWdlcyBbW1N0cmVhbUFwaS5NZXNzYWdlc11dIGZyb20gYSBzdHJlYW0gbGF5ZXJcbiAgICAgKi9cbiAgICBwb2xsKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRNb2RlKCkgPT09IFwicGFyYWxsZWxcIiAmJiAhcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVycm9yOiBmb3IgJ3BhcmFsbGVsJyBtb2RlICdzdWJzY3JpcHRpb25JZCcgaXMgcmVxdWlyZWQuXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIHZhbGlkIG5vZGVCYXNldXJsIHByb3ZpZGVkIGZvciB0aGUgc3Vic2NyaWJ0aW9uIGlkPSR7cmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpfSwgcGxlYXNlIGNoZWNrIHlvdXIgc3Vic2NyaWJ0aW9uYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSBuZXcgb2xwX3Nka19jb3JlXzEuRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIodGhpcy5zZXR0aW5ncy5kb3dubG9hZE1hbmFnZXIsIHRoaXMuc3Vic2NyaWJ0aW9uTm9kZUJhc2VVcmwsIHRoaXMuc2V0dGluZ3MudG9rZW4sIGFib3J0U2lnbmFsKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN1bWVEYXRhUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICBtb2RlOiByZXF1ZXN0LmdldE1vZGUoKSxcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpLFxuICAgICAgICAgICAgICAgIHhDb3JyZWxhdGlvbklkOiB0aGlzLnhDb3JyZWxhdGlvbklkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY29uc3VtZVJlc3BvbnNlID0geWllbGQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuY29uc3VtZURhdGEocmVxdWVzdEJ1aWxkZXIsIGNvbnN1bWVEYXRhUGFyYW1zKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHhDb3JyZWxhdGlvbklkOiByZXNwb25zZS5oZWFkZXJzLmdldChcIlgtQ29ycmVsYXRpb24tSWRcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSAmJiBkYXRhLm1lc3NhZ2VzID8gZGF0YS5tZXNzYWdlcyA6IFtdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB4Q29ycmVsYXRpb25JZFxuICAgICAgICAgICAgdGhpcy54Q29ycmVsYXRpb25JZCA9IGNvbnN1bWVSZXNwb25zZS54Q29ycmVsYXRpb25JZDtcbiAgICAgICAgICAgIGlmIChjb25zdW1lUmVzcG9uc2UuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQ29tbWl0IG9mZnNldHNcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3RPZmZzZXRzID0gY29uc3VtZVJlc3BvbnNlLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgLm1hcChtc2cgPT4gbXNnLm9mZnNldClcbiAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFjY1tjdXJyLnBhcnRpdGlvbl0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjW2N1cnIucGFydGl0aW9uXSA+IGN1cnIub2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhY2NbY3Vyci5wYXJ0aXRpb25dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyLm9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAgICAgeWllbGQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuZG9Db21taXRPZmZzZXRzKHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdE9mZnNldHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHM6IE9iamVjdC5rZXlzKGxhdGVzdE9mZnNldHMpLm1hcChrZXkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb246ICtrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBsYXRlc3RPZmZzZXRzW2tleV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiByZXF1ZXN0LmdldE1vZGUoKSxcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgICAgICAgICB4Q29ycmVsYXRpb25JZDogdGhpcy54Q29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29tbWl0IG9mZnNldHMgdW5zdWNjZXNzZnVsLCBlcnJvcj0ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25zdW1lUmVzcG9uc2UuZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZXRob2QgZGVsZXRlcyBhIHN1YnNjcmlwdGlvbiB0byBhIGxheWVyLiBUaGlzIG9wZXJhdGlvbiByZW1vdmVzIHRoZSBzdWJzY3JpcHRpb24gZnJvbSB0aGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBbW1Vuc3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmVkIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICovXG4gICAgdW5zdWJzY3JpYmUocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldE1vZGUoKSA9PT0gXCJwYXJhbGxlbFwiICYmICFyZXF1ZXN0LmdldFN1YnNjcmlwdGlvbklkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRXJyb3I6IGZvciAncGFyYWxsZWwnIG1vZGUgJ3N1YnNjcmlwdGlvbklkJyBpcyByZXF1aXJlZC5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnN1YnNjcmlidGlvbk5vZGVCYXNlVXJsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgU3Vic2NyaWJ0aW9uIGVycm9yLiBObyB2YWxpZCBub2RlQmFzZXVybCBwcm92aWRlZCBmb3IgdGhlIHN1YnNjcmlidGlvbiBpZD0ke3JlcXVlc3QuZ2V0U3Vic2NyaXB0aW9uSWQoKX0sIHBsZWFzZSBjaGVjayB5b3VyIHN1YnNjcmlidGlvbmApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCdWlsZGVyID0gbmV3IG9scF9zZGtfY29yZV8xLkRhdGFTdG9yZVJlcXVlc3RCdWlsZGVyKHRoaXMuc2V0dGluZ3MuZG93bmxvYWRNYW5hZ2VyLCB0aGlzLnN1YnNjcmlidGlvbk5vZGVCYXNlVXJsLCB0aGlzLnNldHRpbmdzLnRva2VuLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5TdHJlYW1BcGkuZGVsZXRlU3Vic2NyaXB0aW9uKHJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgbGF5ZXJJZDogdGhpcy5sYXllcklkLFxuICAgICAgICAgICAgICAgIG1vZGU6IHJlcXVlc3QuZ2V0TW9kZSgpLFxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiByZXF1ZXN0LmdldFN1YnNjcmlwdGlvbklkKCksXG4gICAgICAgICAgICAgICAgeENvcnJlbGF0aW9uSWQ6IHRoaXMueENvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBwYXJ0aXRpb24gZGF0YSB1c2luZyBkYXRhIGhhbmRsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGRhdGEgb2YgcGFydGl0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHBhcnRpdGlvbi5cbiAgICAgKi9cbiAgICBnZXREYXRhKG1lc3NhZ2UsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2UubWV0YURhdGEgfHwgIW1lc3NhZ2UubWV0YURhdGEuZGF0YUhhbmRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBkYXRhIGhhbmRsZSBmb3IgdGhpcyBwYXJ0aXRpb25cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSB5aWVsZCBvbHBfc2RrX2NvcmVfMS5SZXF1ZXN0RmFjdG9yeS5jcmVhdGUoXCJibG9iXCIsIFwidjFcIiwgdGhpcy5zZXR0aW5ncywgdGhpcy5jYXRhbG9nSHJuLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIHJldHVybiBvbHBfc2RrX2RhdGFzZXJ2aWNlX2FwaV8xLkJsb2JBcGkuZ2V0QmxvYihyZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgICAgIGRhdGFIYW5kbGU6IG1lc3NhZ2UubWV0YURhdGEuZGF0YUhhbmRsZSxcbiAgICAgICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWV0aG9kIGFsbG93cyB0byBzdGFydCByZWFkaW5nIGRhdGEgZnJvbSBhIHNwZWNpZmllZCBvZmZzZXQuXG4gICAgICogVGhlIG1lc3NhZ2UgcG9pbnRlciBjYW4gYmUgbW92ZWQgdG8gYW55IG9mZnNldCBpbiB0aGUgbGF5ZXIgKHRvcGljKS5cbiAgICAgKiBNZXNzYWdlIGNvbnN1bXB0aW9uIHdpbGwgc3RhcnQgZnJvbSB0aGF0IG9mZnNldC4gT25jZSB5b3Ugc2VlayB0byBhbiBvZmZzZXQsXG4gICAgICogdGhlcmUgaXMgbm8gcmV0dXJuaW5nIHRvIHRoZSBpbml0aWFsIG9mZnNldCwgdW5sZXNzIHRoZSBpbml0aWFsIG9mZnNldCBpcyBzYXZlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBbW1NlZWtSZXF1ZXN0XV0gaW5zdGFuY2Ugb2YgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIHdpdGggc3RhdHVzIDIwMCBpZiBzdWNjZXNzLlxuICAgICAqL1xuICAgIHNlZWsocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldHNPYmplY3QgPSByZXF1ZXN0LmdldFNlZWtPZmZzZXRzKCk7XG4gICAgICAgICAgICBpZiAoIW9mZnNldHNPYmplY3QgfHxcbiAgICAgICAgICAgICAgICAhb2Zmc2V0c09iamVjdC5vZmZzZXRzIHx8XG4gICAgICAgICAgICAgICAgIW9mZnNldHNPYmplY3Qub2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRXJyb3I6IG9mZnNldHMgYXJlIHJlcXVpcmVkLlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRNb2RlKCkgPT09IFwicGFyYWxsZWxcIiAmJiAhcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVycm9yOiBmb3IgJ3BhcmFsbGVsJyBtb2RlICdzdWJzY3JpcHRpb25JZCcgaXMgcmVxdWlyZWQuXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFN1YnNjcmlidGlvbiBlcnJvci4gTm8gdmFsaWQgbm9kZUJhc2V1cmwgcHJvdmlkZWQgZm9yIHRoZSBzdWJzY3JpYnRpb24gaWQ9JHtyZXF1ZXN0LmdldFN1YnNjcmlwdGlvbklkKCl9LCBwbGVhc2UgY2hlY2sgeW91ciBzdWJzY3JpYnRpb25gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0QnVpbGRlciA9IG5ldyBvbHBfc2RrX2NvcmVfMS5EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcih0aGlzLnNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgdGhpcy5zdWJzY3JpYnRpb25Ob2RlQmFzZVVybCwgdGhpcy5zZXR0aW5ncy50b2tlbiwgYWJvcnRTaWduYWwpO1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuU3RyZWFtQXBpLnNlZWtUb09mZnNldChyZXF1ZXN0QnVpbGRlciwge1xuICAgICAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICBzZWVrT2Zmc2V0czogb2Zmc2V0c09iamVjdCxcbiAgICAgICAgICAgICAgICBtb2RlOiByZXF1ZXN0LmdldE1vZGUoKSxcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVxdWVzdC5nZXRTdWJzY3JpcHRpb25JZCgpLFxuICAgICAgICAgICAgICAgIHhDb3JyZWxhdGlvbklkOiB0aGlzLnhDb3JyZWxhdGlvbklkXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIHRoaXMueENvcnJlbGF0aW9uSWQgPVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLmdldChcIlgtQ29ycmVsYXRpb24tSWRcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueENvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdChlcnIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5TdHJlYW1MYXllckNsaWVudCA9IFN0cmVhbUxheWVyQ2xpZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdWJzY3JpYmVSZXF1ZXN0ID0gdm9pZCAwO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gdGhlIHBsYXRmb3JtIFN0cmVhbSBTZXJ2aWNlLlxuICovXG5jbGFzcyBTdWJzY3JpYmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKi9cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1N1YnNjcmliZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aE1vZGUobW9kZSkge1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2NyaXB0aW9uIGlkIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKi9cbiAgICBnZXRTdWJzY3JpcHRpb25JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgcHJvdmlkZWQgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIFRoZSBzdWJzY3JpcHRpb24gaWQuXG4gICAgICogQHJldHVybnMgVGhlIFtbU3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoU3Vic2NyaXB0aW9uSWQoaWQpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IGlkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uc3VtZXIgaWQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY29uc3VtZXIgaWQuXG4gICAgICovXG4gICAgZ2V0Q29uc3VtZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3VtZXJJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBjb25zdW1lciBpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgY29uc3VtZXIgaWQuXG4gICAgICogQHJldHVybnMgVGhlIFtbU3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoQ29uc3VtZXJJZChpZCkge1xuICAgICAgICB0aGlzLmNvbnN1bWVySWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN1YnNjcmlwdGlvblByb3BlcnRpZXMgZm9yIHRoZSByZXF1ZXN0IC0gY29uc3VtZXIgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uUHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBnZXRTdWJzY3JpcHRpb25Qcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25Qcm9wZXJ0aWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzIFRoZSBzdWJzY3JpcHRpb25Qcm9wZXJ0aWVzIC0gY29uc3VtZXIgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtzdWJzY3JpcHRpb24gcHJvcGVydGllc11cbiAgICAgKiAoaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9kYXRhX2Rldl9ndWlkZS9yZXN0L2dldHRpbmctZGF0YS1zdHJlYW0uaHRtbCNzdWJzY3JpcHRpb24tcHJvcGVydGllcylcbiAgICAgKiBAcmV0dXJucyBUaGUgW1tTdWJzY3JpYmVSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhTdWJzY3JpcHRpb25Qcm9wZXJ0aWVzKHByb3BzKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uUHJvcGVydGllcyA9IHByb3BzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLlN1YnNjcmliZVJlcXVlc3QgPSBTdWJzY3JpYmVSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlN1bW1hcnlSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IGEgc3VtbWFyeSBmcm9tIHRoZSBwbGF0Zm9ybSBTdGF0aXN0aWNzIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFN1bW1hcnlSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb25maWd1cmVkIFtbSFJOXV0gc3RyaW5nIG9mIHRoZSBjYXRhbG9nIEhFUkUgUmVzb3VyY2UgTmFtZShIUk4pIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNvbmZpZ3VyZWQgW1tIUk5dXSBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0Q2F0YWxvZ0hybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ0hybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxheWVyIElEIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGxheWVyIElEIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRMYXllcklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllcklkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIGNhdGFsb2cgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pLlxuICAgICAqXG4gICAgICogQHBhcmFtIGhybiBUaGUgY2F0YWxvZyBIUk4uXG4gICAgICogQHJldHVybnMgVGhlIFtbU3VtbWFyeVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aENhdGFsb2dIcm4oaHJuKSB7XG4gICAgICAgIHRoaXMuY2F0YWxvZ0hybiA9IGhybi50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBgbGF5ZXJJZGAgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tTdW1tYXJ5UmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTGF5ZXJJZChsYXllcklkKSB7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IGxheWVySWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNCZuZGFzaDsxNiBjaGFyYWN0ZXJzIGxvbmcgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWcgVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICogQHJldHVybiBUaGUgdXBkYXRlZCBbW1N1bW1hcnlSZXF1ZXN0XV0gaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBjaGFpbiBtZXRob2RzLlxuICAgICAqL1xuICAgIHdpdGhCaWxsaW5nVGFnKHRhZykge1xuICAgICAgICB0aGlzLmJpbGxpbmdUYWcgPSBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS52YWxpZGF0ZUJpbGxpbmdUYWcodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaWxsaW5nIHRhZyB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBgQmlsbGluZ1RhZ2Agc3RyaW5nLlxuICAgICAqL1xuICAgIGdldEJpbGxpbmdUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdUYWc7XG4gICAgfVxufVxuZXhwb3J0cy5TdW1tYXJ5UmVxdWVzdCA9IFN1bW1hcnlSZXF1ZXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRpbGVSZXF1ZXN0ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1yZWFkXCIpO1xuLyoqXG4gKiBQcmVwYXJlcyBpbmZvcm1hdGlvbiBmb3IgY2FsbHMgdG8gZ2V0IHRoZSB0aWxlIGJsb2IgZGF0YSBieSB0aGUgdGlsZSBrZXkuXG4gKlxuICogVGhpcyBjbGFzcyB3b3JrcyBvbmx5IHdpdGggdmVyc2lvbmVkIGFuZCB2b2xhdGlsZSBsYXllcnMgd2hlcmUgdGhlIHBhcnRpdGlvbmluZyBzY2hlbWUgaXMgSEVSRSBUaWxlLlxuICpcbiAqIFlvdSBjYW4gaW5pdGlhbGl6ZSB0aGUgcmVxdWVzdCBjbGFzcyBvbmNlIGZvciBhIHNwZWNpZmljIGNhdGFsb2csIGxheWVyLCBhbmQgdmVyc2lvbiAoQHNlZSBbW1RpbGVSZXF1ZXN0UGFyYW1zXV0pXG4gKiBhbmQgdXNlIGl0IG1hbnkgdGltZXMgdG8gZ2V0IHRoZSBhIHRpbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqICBjb25zdCBwYXJhbXM6IFRpbGVSZXF1ZXN0UGFyYW1zID0ge1xuICogICAgICAgc2V0dGluZ3M6IFwiJSB5b3VyIGBPbHBDbGllbnRTZXR0aW5nc2AgaW5zdGFuY2UgJSBcIixcbiAqICAgICAgIGNhdGFsb2dIcm46IFwiJSB0aGUgSFJOIGluc3RhbmNlIG9mIHlvdXIgY2F0YWxvZyAlXCIsXG4gKiAgICAgICBsYXllcklkOiBcIiUgeW91ciBsYXllciBJRCAlXCIsXG4gKiAgICAgICBsYXllclR5cGU6IFwiJSB2ZXJzaW9uZWQgb3Igdm9sYXRpbGUgJVwiLFxuICogICAgICAgY2F0YWxvZ1ZlcnNpb246IFwiJSB0aGUgY2F0YWxvZyB2ZXJzaW9uOyBmb3IgdmVyc2lvbmVkIGxheWVycywgdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIHVzZWQgYnkgZGVmYXVsdCAlXCJcbiAqICAgfVxuICpcbiAqICBjb25zdCByZXF1ZXN0ID0gbmV3IFRpbGVSZXF1ZXN0KHBhcmFtcyk7XG4gKlxuICogIGNvbnN0IHJlcXVlc3RGb3JUaWxlMSA9IHJlcXVlc3Qud2l0aFRpbGVLZXkoeW91clRpbGVLZXkxKTtcbiAqICBjb25zdCByZXF1ZXN0Rm9yVGlsZTIgPSByZXF1ZXN0LndpdGhUaWxlS2V5KHlvdXJUaWxlS2V5Mik7XG4gKlxuICogYGBgXG4gKi9cbmNsYXNzIFRpbGVSZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5mZXRjaE9wdGlvbiA9IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVJZk5vdEZvdW5kO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGdlb21ldHJpYyBhcmVhIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRLZXkgQWRkcmVzc2VzIGEgdGlsZSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICogQHJldHVybnMgVGhlIHVwZGF0ZWQgW1tUaWxlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoVGlsZUtleShxdWFkS2V5KSB7XG4gICAgICAgIHRoaXMucXVhZEtleSA9IHF1YWRLZXk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgNOKAkzE2IGNoYXJhY3RlcnMgbG9uZyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtB4oCTWmHigJN6MOKAkzldLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZyBUaGUgYEJpbGxpbmdUYWdgIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSB1cGRhdGVkIFtbVGlsZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aEJpbGxpbmdUYWcodGFnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1RhZyA9IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLnZhbGlkYXRlQmlsbGluZ1RhZyh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29uZmlndXJlZCBbW1F1YWRLZXldXSBvYmplY3QgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY29uZmlndXJlZCBbW1F1YWRLZXldXSBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0VGlsZUtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVhZEtleTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpbGxpbmcgdGFnIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGBCaWxsaW5nVGFnYCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0QmlsbGluZ1RhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1RhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgeW91IGNhbiB1c2UgdG8gc2V0IHRoZSBzb3VyY2UgZnJvbVxuICAgICAqIHdoaWNoIGRhdGEgc2hvdWxkIGJlIGZldGNoZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIGBnZXRGZXRjaE9wdGlvbigpYCBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIGBGZXRjaE9wdGlvbmAgZW51bS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIHVwZGF0ZWQgYFBhcnRpdGlvbnNSZXF1ZXN0YCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICB3aXRoRmV0Y2hPcHRpb24ob3B0aW9uKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hPcHRpb24gPSBvcHRpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmZXRjaCBvcHRpb24gdGhhdCBjb250cm9scyBob3cgcmVxdWVzdHMgYXJlIGhhbmRsZWQuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBvcHRpb24gaXMgYE9ubGluZUlmTm90Rm91bmRgLiBJdCBxdWVyaWVzIHRoZSBuZXR3b3JrIGlmXG4gICAgICogdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgZmV0Y2ggb3B0aW9uLlxuICAgICAqL1xuICAgIGdldEZldGNoT3B0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaE9wdGlvbjtcbiAgICB9XG59XG5leHBvcnRzLlRpbGVSZXF1ZXN0ID0gVGlsZVJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlVuc3Vic2NyaWJlUmVxdWVzdCA9IHZvaWQgMDtcbi8qKlxuICogUHJlcGFyZXMgaW5mb3JtYXRpb24gZm9yIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBTdHJlYW0gU2VydmljZS5cbiAqL1xuY2xhc3MgVW5zdWJzY3JpYmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdWJzY3JpcHRpb24gbW9kZS5cbiAgICAgKi9cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIHByb3ZpZGVkIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBbW1Vuc3Vic2NyaWJlUmVxdWVzdF1dIGluc3RhbmNlIHRoYXQgeW91IGNhbiB1c2UgdG8gY2hhaW4gbWV0aG9kcy5cbiAgICAgKi9cbiAgICB3aXRoTW9kZShtb2RlKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzY3JpcHRpb24gaWQgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3Vic2NyaXB0aW9uIGlkLlxuICAgICAqL1xuICAgIGdldFN1YnNjcmlwdGlvbklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBwcm92aWRlZCBzdWJzY3JpcHRpb24gaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIHN1YnNjcmlwdGlvbiBpZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgW1tVbnN1YnNjcmliZVJlcXVlc3RdXSBpbnN0YW5jZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoYWluIG1ldGhvZHMuXG4gICAgICovXG4gICAgd2l0aFN1YnNjcmlwdGlvbklkKGlkKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuZXhwb3J0cy5VbnN1YnNjcmliZVJlcXVlc3QgPSBVbnN1YnNjcmliZVJlcXVlc3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5WZXJzaW9uZWRMYXllckNsaWVudCA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhIHZlcnNpb25lZCBsYXllciBhbmQgcHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGdldCBwYXJ0aXRpb25zIG1ldGFkYXRhIGFuZCBkYXRhLlxuICovXG5jbGFzcyBWZXJzaW9uZWRMYXllckNsaWVudCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgW1tWZXJzaW9uZWRMYXllckNsaWVudF1dIGluc3RhbmNlIHdpdGggVmVyc2lvbmVkTGF5ZXJDbGllbnRQYXJhbXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnMgZm9yIHVzZSB0byBpbml0aWFsaXplIFZlcnNpb25MYXllckNsaWVudC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5hcGlWZXJzaW9uID0gXCJ2MVwiO1xuICAgICAgICB0aGlzLmhybiA9IHBhcmFtcy5jYXRhbG9nSHJuLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMubGF5ZXJJZCA9IHBhcmFtcy5sYXllcklkO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gcGFyYW1zLnNldHRpbmdzO1xuICAgICAgICBpZiAocGFyYW1zLnZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMudmVyc2lvbiA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnNpb24gPSBwYXJhbXMudmVyc2lvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAYnJpZWYgRmV0Y2hlcyBkYXRhIG9mIGEgdGlsZSBvciBpdHMgY2xvc2VzdCBhbmNlc3Rvci5cbiAgICAgKiBVc2UgdGhpcyBBUEkgZm9yIHRpbGUtdHJlZSBzdHJ1Y3R1cmVzIHdoZXJlIGNoaWxkcmVuIHRpbGUgZGF0YSBpcyBhZ2dyZWdhdGVkIGFuZCBzdG9yZWQgaW4gcGFyZW50IHRpbGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGBUaWxlUmVxdWVzdGAgaW5zdGFuY2UgdGhhdCBjb250YWlucyBhIGNvbXBsZXRlIHNldFxuICAgICAqIG9mIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRpbGUgZGF0YSAoaWYgaXQgZXhpc3RzKSBvciB0aGUgbmVhcmVzdCBwYXJlbnQgdGlsZSBkYXRhXG4gICAgICovXG4gICAgZ2V0QWdncmVnYXRlZERhdGEocmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxldCBjYXRhbG9nVmVyc2lvbiA9IHRoaXMudmVyc2lvbjtcbiAgICAgICAgICAgIGlmIChjYXRhbG9nVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPSB5aWVsZCB0aGlzLmdldExhdGVzdFZlcnNpb24ocmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGNhdGFsb2dIcm46IG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSxcbiAgICAgICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICAgICAgbGF5ZXJUeXBlOiBcInZlcnNpb25lZFwiLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzOiB0aGlzLnNldHRpbmdzLFxuICAgICAgICAgICAgICAgIGNhdGFsb2dWZXJzaW9uXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLmdldFRpbGUocmVxdWVzdCwgcGFyYW1zLCBhYm9ydFNpZ25hbCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIHBhcnRpdGlvbiBkYXRhIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6IElELCBxdWFka2V5LCBvciBkYXRhIGhhbmRsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhUmVxdWVzdCBUaGUgW1tEYXRhUmVxdWVzdF1dIGluc3RhbmNlIG9mIHRoZSBjb25maWd1cmVkIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIGZyb20gdGhlIHJlcXVlc3RlZCBwYXJ0aXRpb24uXG4gICAgICovXG4gICAgZ2V0RGF0YShkYXRhUmVxdWVzdCwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFIYW5kbGUgPSBkYXRhUmVxdWVzdC5nZXREYXRhSGFuZGxlKCk7XG4gICAgICAgICAgICBpZiAoZGF0YUhhbmRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkUGFydGl0aW9uKGRhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBkYXRhUmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFydGl0aW9uSWQgPSBkYXRhUmVxdWVzdC5nZXRQYXJ0aXRpb25JZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gZmV0Y2ggdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCBsb2NrIGl0IHRvIHRoZSBpbnN0YW5jZS5cbiAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB5aWVsZCB0aGlzLmdldExhdGVzdFZlcnNpb24oZGF0YVJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIHJldHJpZXZlIGxhdGVzdCB2ZXJzaW9uLiBQbGVhc2UgcHJvdmlkZSB2ZXJzaW9uIHRvIHRoZSBEYXRhUmVxdWVzdCBvciBsb2NrIHZlcnNpb24gaW4gdGhlIGNvbnN0cnVjdG9yYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcnRpdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydGl0aW9uSWREYXRhSGFuZGxlID0geWllbGQgdGhpcy5nZXREYXRhSGFuZGxlQnlQYXJ0aXRpb25JZChwYXJ0aXRpb25JZCwgZGF0YVJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSwgZGF0YVJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkUGFydGl0aW9uKHBhcnRpdGlvbklkRGF0YUhhbmRsZSwgYWJvcnRTaWduYWwsIGRhdGFSZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBObyBkYXRhIHByb3ZpZGVkLiBBZGQgZGF0YUhhbmRsZSwgcGFydGl0aW9uSWQgb3IgcXVhZEtleSB0byB0aGUgRGF0YVJlcXVlc3Qgb2JqZWN0YCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0UGFydGl0aW9ucyhyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gZmV0Y2ggdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCBsb2NrIGl0IHRvIHRoZSBpbnN0YW5jZS5cbiAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB5aWVsZCB0aGlzLmdldExhdGVzdFZlcnNpb24ocmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52ZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbmFibGUgdG8gcmV0cmlldmUgbGF0ZXN0IHZlcnNpb24uIFBsZWFzZSBwcm92aWRlIHZlcnNpb24gdG8gdGhlIFJlcXVlc3Qgb3IgbG9jayB2ZXJzaW9uIGluIHRoZSBjb25zdHJ1Y3RvcmApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2Ygb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVhZEtleSA9IHJlcXVlc3QuZ2V0UXVhZEtleSgpO1xuICAgICAgICAgICAgICAgIGlmICghcXVhZEtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBRdWFkS2V5XCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuUXVlcnlDbGllbnQodGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVhZFRyZWVJbmRleFJlcXVlc3QgPSBuZXcgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuUXVhZFRyZWVJbmRleFJlcXVlc3Qob2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCB0aGlzLmxheWVySWQsIFwidmVyc2lvbmVkXCIpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoUXVhZEtleShxdWFkS2V5KVxuICAgICAgICAgICAgICAgICAgICAud2l0aFZlcnNpb24odGhpcy52ZXJzaW9uKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERlcHRoKHJlcXVlc3QuZ2V0RGVwdGgoKSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhBZGRpdGlvbmFsRmllbGRzKHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnlDbGllbnQuZmV0Y2hRdWFkVHJlZUluZGV4KHF1YWRUcmVlSW5kZXhSZXF1ZXN0LCBhYm9ydFNpZ25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRQYXJ0aXRpb25JZHMoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeUNsaWVudC5nZXRQYXJ0aXRpb25zQnlJZChyZXF1ZXN0LCB0aGlzLmxheWVySWQsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgYWJvcnRTaWduYWwsIHRoaXMudmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5NZXRhZGF0YUNhY2hlUmVwb3NpdG9yeSh0aGlzLnNldHRpbmdzLmNhY2hlKTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydGl0aW9ucyA9IGNhY2hlLmdldChyZXF1ZXN0LCB0aGlzLmhybi50b1N0cmluZygpLCB0aGlzLmxheWVySWQsIHRoaXMudmVyc2lvbik7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbEZpZWxkcyA9IHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RGaWVsZHM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdEZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb25zLmV2ZXJ5KHBhcnRpdGlvbiA9PiBwYXJ0aXRpb25bZmllbGRdICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhZGRpdGlvbmFsRmllbGRzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhZXhpc3RGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxGaWVsZHMubGVuZ3RoID09PSBleGlzdEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBwYXJ0aXRpb25zIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWV0YVJlcXVlc3RCaWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwibWV0YWRhdGFcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCBhYm9ydFNpZ25hbCkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0geWllbGQgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5NZXRhZGF0YUFwaS5nZXRQYXJ0aXRpb25zKG1ldGFSZXF1ZXN0QmlsZGVyLCB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmllbGRzOiByZXF1ZXN0LmdldEFkZGl0aW9uYWxGaWVsZHMoKSxcbiAgICAgICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5ICYmXG4gICAgICAgICAgICAgICAgbWV0YWRhdGEucGFydGl0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjYWNoZS5wdXQocmVxdWVzdCwgdGhpcy5ocm4udG9TdHJpbmcoKSwgdGhpcy5sYXllcklkLCBtZXRhZGF0YS5wYXJ0aXRpb25zLCB0aGlzLnZlcnNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtZXRhZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhbmQgcmV0dXJucyBwYXJ0aXRpb24gbWV0YWRhdGFcbiAgICAgKiBAcGFyYW0gcGFydGl0aW9uSWQgVGhlIG5hbWUgb2YgdGhlIHBhcnRpdGlvbiB0byBmZXRjaC5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgbGF5ZXIgdG8gZmV0Y2hcbiAgICAgKiBAcGFyYW0gZmV0Y2hPcHRpb24gVGhlIG9wdGlvbiBvZiBjYWNoaW5nIChvbmxpbmUgb25seSBvciByZXR1cm4gZnJvbSBjYWNoZSBpZiBleGlzdClcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb2YgcGFydGl0aW9uIG1ldGFkYXRhIHdoaWNoIHVzZWQgdG8gZ2V0IHBhcnRpdGlvbiBkYXRhXG4gICAgICovXG4gICAgZ2V0RGF0YUhhbmRsZUJ5UGFydGl0aW9uSWQocGFydGl0aW9uSWQsIGZldGNoT3B0aW9uLCBiaWxsaW5nVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWVyeUNsaWVudCh0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnNSZXF1ZXN0ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlBhcnRpdGlvbnNSZXF1ZXN0KClcbiAgICAgICAgICAgICAgICAud2l0aFBhcnRpdGlvbklkcyhbcGFydGl0aW9uSWRdKVxuICAgICAgICAgICAgICAgIC53aXRoRmV0Y2hPcHRpb24oZmV0Y2hPcHRpb24pO1xuICAgICAgICAgICAgaWYgKGJpbGxpbmdUYWcpIHtcbiAgICAgICAgICAgICAgICBwYXJ0aXRpb25zUmVxdWVzdC53aXRoQmlsbGluZ1RhZyhiaWxsaW5nVGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0geWllbGQgcXVlcnlDbGllbnQuZ2V0UGFydGl0aW9uc0J5SWQocGFydGl0aW9uc1JlcXVlc3QsIHRoaXMubGF5ZXJJZCwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pLCB1bmRlZmluZWQsIHRoaXMudmVyc2lvbik7XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEucGFydGl0aW9ucyAmJlxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcnRpdGlvbnNbMF0gJiZcbiAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdLmRhdGFIYW5kbGVcbiAgICAgICAgICAgICAgICA/IG1ldGFkYXRhLnBhcnRpdGlvbnNbMF0uZGF0YUhhbmRsZVxuICAgICAgICAgICAgICAgIDogUHJvbWlzZS5yZWplY3QobmV3IG9scF9zZGtfY29yZV8xLkh0dHBFcnJvcihvbHBfc2RrX2NvcmVfMS5TVEFUVVNfQ09ERVMuTk9UX0ZPVU5ELCBgTm8gcGFydGl0aW9uIGRhdGFIYW5kbGUgZm9yIHBhcnRpdGlvbiAke3BhcnRpdGlvbklkfS4gSFJOOiAke3RoaXMuaHJufWApKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uIHdoYXQgY2FuIGJlIHVzZWQgYXMgbGF0ZXN0IGxheWVyIHZlcnNpb25cbiAgICAgKi9cbiAgICBnZXRMYXRlc3RWZXJzaW9uKGJpbGxpbmdUYWcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwibWV0YWRhdGFcIiwgb2xwX3Nka19jb3JlXzEuSFJOLmZyb21TdHJpbmcodGhpcy5ocm4pKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHlpZWxkIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkubGF0ZXN0VmVyc2lvbihidWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgc3RhcnRWZXJzaW9uOiAtMSxcbiAgICAgICAgICAgICAgICBiaWxsaW5nVGFnXG4gICAgICAgICAgICB9KS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXRlc3RWZXJzaW9uLnZlcnNpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZG93bmxvYWRQYXJ0aXRpb24oZGF0YUhhbmRsZSwgYWJvcnRTaWduYWwsIGJpbGxpbmdUYWcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwiYmxvYlwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuQmxvYkFwaS5nZXRCbG9iKGJ1aWxkZXIsIHtcbiAgICAgICAgICAgICAgICBkYXRhSGFuZGxlLFxuICAgICAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICBiaWxsaW5nVGFnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIGJhc2VVcmwgYW5kIGNyZWF0ZSByZXF1ZXN0QnVpbGRlciBmb3Igc2VuZGluZyByZXF1ZXN0cyB0byB0aGUgQVBJIExvb2t1cCBTZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBidWlsZGVyVHlwZSBlbmRwb2ludCBuYW1lIGlzIG5lZWRlZCB0byBjcmVhdGUgcHJvcHJpYXRlIHJlcXVlc3RCdWlsZGVyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyByZXF1ZXN0QnVpbGRlclxuICAgICAqL1xuICAgIGdldFJlcXVlc3RCdWlsZGVyKGJ1aWxkZXJUeXBlLCBocm4sIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKGJ1aWxkZXJUeXBlLCB0aGlzLmFwaVZlcnNpb24sIHRoaXMuc2V0dGluZ3MsIGhybiwgYWJvcnRTaWduYWwpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlZlcnNpb25lZExheWVyQ2xpZW50ID0gVmVyc2lvbmVkTGF5ZXJDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Wb2xhdGlsZUxheWVyQ2xpZW50ID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuY29uc3Qgb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLWFwaVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstZGF0YXNlcnZpY2UtcmVhZFwiKTtcbi8qKlxuICogRGVzY3JpYmVzIGEgdm9hbHRpbGUgbGF5ZXIgYW5kIHByb3ZpZGVzIHRoZSBwb3NzaWJpbGl0eSB0byBnZXQgcGFydGl0aW9ucyBtZXRhZGF0YSBhbmQgZGF0YS5cbiAqL1xuY2xhc3MgVm9sYXRpbGVMYXllckNsaWVudCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgW1tWb2xhdGlsZUxheWVyQ2xpZW50XV0gaW5zdGFuY2Ugd2l0aCBWb2xhdGlsZUxheWVyQ2xpZW50UGFyYW1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBwYXJhbWV0ZXJzIGZvciB1c2UgdG8gaW5pdGlhbGl6ZSBWb2xhdGlsZUxheWVyQ2xpZW50LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmFwaVZlcnNpb24gPSBcInYxXCI7XG4gICAgICAgIHRoaXMuaHJuID0gcGFyYW1zLmNhdGFsb2dIcm4udG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5sYXllcklkID0gcGFyYW1zLmxheWVySWQ7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBicmllZiBGZXRjaGVzIGRhdGEgb2YgYSB0aWxlIG9yIGl0cyBjbG9zZXN0IGFuY2VzdG9yLlxuICAgICAqIFVzZSB0aGlzIEFQSSBmb3IgdGlsZS10cmVlIHN0cnVjdHVyZXMgd2hlcmUgY2hpbGRyZW4gdGlsZSBkYXRhIGlzIGFnZ3JlZ2F0ZWQgYW5kIHN0b3JlZCBpbiBwYXJlbnQgdGlsZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgYFRpbGVSZXF1ZXN0YCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIGEgY29tcGxldGUgc2V0XG4gICAgICogb2YgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGlsZSBkYXRhIChpZiBpdCBleGlzdHMpIG9yIHRoZSBuZWFyZXN0IHBhcmVudCB0aWxlIGRhdGFcbiAgICAgKi9cbiAgICBnZXRBZ2dyZWdhdGVkRGF0YShyZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGNhdGFsb2dIcm46IG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSxcbiAgICAgICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICAgICAgbGF5ZXJUeXBlOiBcInZvbGF0aWxlXCIsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3NcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuZ2V0VGlsZShyZXF1ZXN0LCBwYXJhbXMsIGFib3J0U2lnbmFsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgcGFydGl0aW9uIGRhdGEgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kczogSUQsIHF1YWRrZXksIG9yIGRhdGEgaGFuZGxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFSZXF1ZXN0IFRoZSBbW0RhdGFSZXF1ZXN0XV0gaW5zdGFuY2Ugb2YgdGhlIGNvbmZpZ3VyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGRhdGEgZnJvbSB0aGUgcmVxdWVzdGVkIHBhcnRpdGlvbi5cbiAgICAgKi9cbiAgICBnZXREYXRhKGRhdGFSZXF1ZXN0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YUhhbmRsZSA9IGRhdGFSZXF1ZXN0LmdldERhdGFIYW5kbGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbklkID0gZGF0YVJlcXVlc3QuZ2V0UGFydGl0aW9uSWQoKTtcbiAgICAgICAgICAgIGlmIChkYXRhSGFuZGxlICE9PSB1bmRlZmluZWQgfHwgcGFydGl0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkUGFydGl0aW9uKGRhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBkYXRhUmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFydGl0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydGl0aW9uSWREYXRhSGFuZGxlID0geWllbGQgdGhpcy5nZXREYXRhSGFuZGxlQnlQYXJ0aXRpb25JZChwYXJ0aXRpb25JZCwgZGF0YVJlcXVlc3QuZ2V0RmV0Y2hPcHRpb24oKSwgZGF0YVJlcXVlc3QuZ2V0QmlsbGluZ1RhZygpKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFBhcnRpdGlvbihwYXJ0aXRpb25JZERhdGFIYW5kbGUsIGFib3J0U2lnbmFsLCBkYXRhUmVxdWVzdC5nZXRCaWxsaW5nVGFnKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE5vIGRhdGEgcHJvdmlkZWQuIEFkZCBkYXRhSGFuZGxlLCBwYXJ0aXRpb25JZCBvciBxdWFkS2V5IHRvIHRoZSBEYXRhUmVxdWVzdCBvYmplY3RgKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRQYXJ0aXRpb25zKHJlcXVlc3QsIGFib3J0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1YWRLZXlQYXJ0aXRpb25zUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1YWRLZXkgPSByZXF1ZXN0LmdldFF1YWRLZXkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXF1YWRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgUXVhZEtleVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1YWRUcmVlSW5kZXhSZXF1ZXN0ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1YWRUcmVlSW5kZXhSZXF1ZXN0KG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgdGhpcy5sYXllcklkLCBcInZvbGF0aWxlXCIpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoUXVhZEtleShxdWFkS2V5KVxuICAgICAgICAgICAgICAgICAgICAud2l0aERlcHRoKHJlcXVlc3QuZ2V0RGVwdGgoKSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhBZGRpdGlvbmFsRmllbGRzKHJlcXVlc3QuZ2V0QWRkaXRpb25hbEZpZWxkcygpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnlDbGllbnQuZmV0Y2hRdWFkVHJlZUluZGV4KHF1YWRUcmVlSW5kZXhSZXF1ZXN0LCBhYm9ydFNpZ25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRQYXJ0aXRpb25JZHMoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeUNsaWVudC5nZXRQYXJ0aXRpb25zQnlJZChyZXF1ZXN0LCB0aGlzLmxheWVySWQsIG9scF9zZGtfY29yZV8xLkhSTi5mcm9tU3RyaW5nKHRoaXMuaHJuKSwgYWJvcnRTaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuTWV0YWRhdGFDYWNoZVJlcG9zaXRvcnkodGhpcy5zZXR0aW5ncy5jYWNoZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRGZXRjaE9wdGlvbigpICE9PSBvbHBfc2RrX2NvcmVfMS5GZXRjaE9wdGlvbnMuT25saW5lT25seSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnMgPSBjYWNoZS5nZXQocmVxdWVzdCwgdGhpcy5ocm4udG9TdHJpbmcoKSwgdGhpcy5sYXllcklkKTtcbiAgICAgICAgICAgICAgICBpZiAocGFydGl0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsRmllbGRzID0gcmVxdWVzdC5nZXRBZGRpdGlvbmFsRmllbGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdEZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0RmllbGRzID0gYWRkaXRpb25hbEZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbnMuZXZlcnkocGFydGl0aW9uID0+IHBhcnRpdGlvbltmaWVsZF0gIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZGl0aW9uYWxGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFleGlzdEZpZWxkcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEZpZWxkcy5sZW5ndGggPT09IGV4aXN0RmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHBhcnRpdGlvbnMgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZXRhUmVxdWVzdEJpbGRlciA9IHlpZWxkIHRoaXMuZ2V0UmVxdWVzdEJ1aWxkZXIoXCJtZXRhZGF0YVwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybikpLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHlpZWxkIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTWV0YWRhdGFBcGkuZ2V0UGFydGl0aW9ucyhtZXRhUmVxdWVzdEJpbGRlciwge1xuICAgICAgICAgICAgICAgIGxheWVySWQ6IHRoaXMubGF5ZXJJZCxcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmllbGRzOiByZXF1ZXN0LmdldEFkZGl0aW9uYWxGaWVsZHMoKSxcbiAgICAgICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5ICYmXG4gICAgICAgICAgICAgICAgbWV0YWRhdGEucGFydGl0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjYWNoZS5wdXQocmVxdWVzdCwgdGhpcy5ocm4udG9TdHJpbmcoKSwgdGhpcy5sYXllcklkLCBtZXRhZGF0YS5wYXJ0aXRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWV0YWRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZG93bmxvYWRQYXJ0aXRpb24oZGF0YUhhbmRsZSwgYWJvcnRTaWduYWwsIGJpbGxpbmdUYWcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB5aWVsZCB0aGlzLmdldFJlcXVlc3RCdWlsZGVyKFwidm9sYXRpbGUtYmxvYlwiLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybiksIGFib3J0U2lnbmFsKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuVm9sYXRpbGVCbG9iQXBpLmdldFZvbGF0aWxlQmxvYihidWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgZGF0YUhhbmRsZSxcbiAgICAgICAgICAgICAgICBsYXllcklkOiB0aGlzLmxheWVySWQsXG4gICAgICAgICAgICAgICAgYmlsbGluZ1RhZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIGJhc2VVcmwgYW5kIGNyZWF0ZXMgcmVxdWVzdEJ1aWxkZXIgZm9yIHNlbmRpbmcgcmVxdWVzdHMgdG8gdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAgICAgKiBAcGFyYW0gYnVpbGRlclR5cGUgZW5kcG9pbnQgbmFtZSBpcyBuZWVkZWQgdG8gY3JlYXRlIHByb3ByaWF0ZSByZXF1ZXN0QnVpbGRlclxuICAgICAqXG4gICAgICogQHJldHVybnMgcmVxdWVzdEJ1aWxkZXJcbiAgICAgKi9cbiAgICBnZXRSZXF1ZXN0QnVpbGRlcihidWlsZGVyVHlwZSwgaHJuLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG9scF9zZGtfY29yZV8xLlJlcXVlc3RGYWN0b3J5LmNyZWF0ZShidWlsZGVyVHlwZSwgdGhpcy5hcGlWZXJzaW9uLCB0aGlzLnNldHRpbmdzLCBocm4sIGFib3J0U2lnbmFsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIGFuZCByZXR1cm5zIHBhcnRpdGlvbiBtZXRhZGF0YVxuICAgICAqIEBwYXJhbSBwYXJ0aXRpb25JZCBUaGUgbmFtZSBvZiB0aGUgcGFydGl0aW9uIHRvIGZldGNoLlxuICAgICAqIEBwYXJhbSBmZXRjaE9wdGlvbiBUaGUgb3B0aW9uIG9mIGNhY2hpbmcgKG9ubGluZSBvbmx5IG9yIHJldHVybiBmcm9tIGNhY2hlIGlmIGV4aXN0KVxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvZiBwYXJ0aXRpb24gbWV0YWRhdGEgd2hpY2ggdXNlZCB0byBnZXQgcGFydGl0aW9uIGRhdGFcbiAgICAgKi9cbiAgICBnZXREYXRhSGFuZGxlQnlQYXJ0aXRpb25JZChwYXJ0aXRpb25JZCwgZmV0Y2hPcHRpb24sIGJpbGxpbmdUYWcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1ZXJ5Q2xpZW50KHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgY29uc3QgcGFydGl0aW9uc1JlcXVlc3QgPSBuZXcgb2xwX3Nka19kYXRhc2VydmljZV9yZWFkXzEuUGFydGl0aW9uc1JlcXVlc3QoKVxuICAgICAgICAgICAgICAgIC53aXRoUGFydGl0aW9uSWRzKFtwYXJ0aXRpb25JZF0pXG4gICAgICAgICAgICAgICAgLndpdGhGZXRjaE9wdGlvbihmZXRjaE9wdGlvbik7XG4gICAgICAgICAgICBpZiAoYmlsbGluZ1RhZykge1xuICAgICAgICAgICAgICAgIHBhcnRpdGlvbnNSZXF1ZXN0LndpdGhCaWxsaW5nVGFnKGJpbGxpbmdUYWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB5aWVsZCBxdWVyeUNsaWVudC5nZXRQYXJ0aXRpb25zQnlJZChwYXJ0aXRpb25zUmVxdWVzdCwgdGhpcy5sYXllcklkLCBvbHBfc2RrX2NvcmVfMS5IUk4uZnJvbVN0cmluZyh0aGlzLmhybikpO1xuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnBhcnRpdGlvbnMgJiZcbiAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdICYmXG4gICAgICAgICAgICAgICAgbWV0YWRhdGEucGFydGl0aW9uc1swXS5kYXRhSGFuZGxlXG4gICAgICAgICAgICAgICAgPyBtZXRhZGF0YS5wYXJ0aXRpb25zWzBdLmRhdGFIYW5kbGVcbiAgICAgICAgICAgICAgICA6IFByb21pc2UucmVqZWN0KG5ldyBvbHBfc2RrX2NvcmVfMS5IdHRwRXJyb3Iob2xwX3Nka19jb3JlXzEuU1RBVFVTX0NPREVTLk5PVF9GT1VORCwgYE5vIHBhcnRpdGlvbiBkYXRhSGFuZGxlIGZvciBwYXJ0aXRpb24gJHtwYXJ0aXRpb25JZH0uIEhSTjogJHt0aGlzLmhybn1gKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuVm9sYXRpbGVMYXllckNsaWVudCA9IFZvbGF0aWxlTGF5ZXJDbGllbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0NhdGFsb2dDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0NhdGFsb2dSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9EYXRhUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vU3RhdGlzdGljc0NsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vU3RhdGlzdGljc1JlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N1bW1hcnlSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9WZXJzaW9uZWRMYXllckNsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vVm9sYXRpbGVMYXllckNsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vQ29uZmlnQ2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9DYXRhbG9nc1JlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1NjaGVtYURldGFpbHNSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9BcnRpZmFjdENsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vUGFydGl0aW9uc1JlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1F1ZXJ5Q2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9RdWFkVHJlZUluZGV4UmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vUXVhZEtleVBhcnRpdGlvbnNSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9TY2hlbWFSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9DYXRhbG9nVmVyc2lvblJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0xheWVyVmVyc2lvbnNSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9JbmRleExheWVyQ2xpZW50XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9JbmRleFF1ZXJ5UmVxdWVzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vU3RyZWFtTGF5ZXJDbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N1YnNjcmliZVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1BvbGxSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9VbnN1YnNjcmliZVJlcXVlc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1NlZWtSZXF1ZXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9UaWxlUmVxdWVzdFwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3V0aWxzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2NhY2hlXCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmZldGNoUXVhZFRyZWVJbmRleCA9IGV4cG9ydHMuZ2V0VGlsZSA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG5jb25zdCBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMSA9IHJlcXVpcmUoXCJAaGVyZS9vbHAtc2RrLWRhdGFzZXJ2aWNlLXJlYWRcIik7XG4vKipcbiAqIEZldGNoZXMgYXN5bmNocm9ub3VzbHkgZGF0YSBmcm9tIGEgdGlsZSBvciBmcm9tIGl0cyBuZWFyZXN0IGFuY2VzdG9yIGlmIG5vdCBmb3VuZC5cbiAqXG4gKiBUaGUgdGlsZSBpcyBhIGdlb21ldHJpYyBhcmVhIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlLlxuICogVGhlIHF1YWQgdHJlZSBtZXRhZGF0YSBmZXRjaGVzIHRoZSBibG9iIG9mIG5lZWRlZCB0aWxlIGZyb20gdGhlIEhFUkUgUXVlcnkgU2VydmljZSxcbiAqIHRoZW4gY2FjaGVzIGl0LCBhbmQgcmV0dXJucyB0byB0aGUgdXNlci5cbiAqIFRvIGRpc2FibGUgY2FjaGluZyBvZiBtZXRhZGF0YSB1c2UgYHJlcXVlc3Qud2l0aEZldGNoT3B0aW9uKEZldGNoT3B0aW9ucy5PbmxpbmVPbmx5KWAuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdHMgdGhlIFtbVGlsZVJlcXVlc3RdXSBpbnN0YW5jZSB3aXRoIHRoZSBjb25maWd1cmVkIHBhcmFtZXRlcnMuXG4gKiBAc2VlIFtbVGlsZVJlcXVlc3RdXVxuICpcbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCBUaGUgc2lnbmFsIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIGBmZXRjaGAgcmVxdWVzdClcbiAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gKiBAc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqICBjb25zdCBwYXJhbXM6IEdldFRpbGVQYXJhbXMgPSB7XG4gKiAgICAgICBzZXR0aW5nczogXCIlIHlvdXIgYE9scENsaWVudFNldHRpbmdzYCBpbnN0YW5jZSAlIFwiLFxuICogICAgICAgY2F0YWxvZ0hybjogXCIlIHRoZSBIUk4gaW5zdGFuY2Ugb2YgeW91ciBjYXRhbG9nICVcIixcbiAqICAgICAgIGxheWVySWQ6IFwiJSB5b3VyIGxheWVyIElEICVcIixcbiAqICAgICAgIGxheWVyVHlwZTogXCIlIHZlcnNpb25lZCBvciB2b2xhdGlsZSAlXCIsXG4gKiAgIH1cbiAqXG4gKiAgY29uc3QgcmVxdWVzdCA9IG5ldyBUaWxlUmVxdWVzdCgpO1xuICpcbiAqICBjb25zdCB0aWxlMSA9IGF3YWl0IGdldFRpbGUocmVxdWVzdC53aXRoVGlsZUtleSh5b3VyVGlsZUtleTEpLCBwYXJhbXMpO1xuICogIGNvbnN0IHRpbGUyID0gYXdhaXQgZ2V0VGlsZShyZXF1ZXN0LndpdGhUaWxlS2V5KHlvdXJUaWxlS2V5MiksIHBhcmFtcyk7XG4gKlxuICogYGBgXG4gKlxuICogQHJldHVybnMgVGhlIGJsb2Igb2YgdGhlIHJlcXVlc3RlZCB0aWxlIG9yIHRoZSBibG9iIG9mIHRoZSBjbG9zZXN0IHBhcmVudCBUaWxlLlxuICovXG5mdW5jdGlvbiBnZXRUaWxlKHJlcXVlc3QsIHBhcmFtcywgYWJvcnRTaWduYWwpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY2F0YWxvZ1ZlcnNpb247XG4gICAgICAgIGNvbnN0IHF1YWRLZXkgPSByZXF1ZXN0LmdldFRpbGVLZXkoKTtcbiAgICAgICAgaWYgKCFxdWFkS2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBRdWFkS2V5XCIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLmxheWVyVHlwZSA9PT0gXCJ2ZXJzaW9uZWRcIikge1xuICAgICAgICAgICAgY2F0YWxvZ1ZlcnNpb24gPSBwYXJhbXMuY2F0YWxvZ1ZlcnNpb247XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmxvYlR5cGUgPSBwYXJhbXMubGF5ZXJUeXBlID09PSBcInZlcnNpb25lZFwiID8gXCJibG9iXCIgOiBcInZvbGF0aWxlLWJsb2JcIjtcbiAgICAgICAgY29uc3QgYmxvYlJlcXVlc3RCdWlsZGVyID0geWllbGQgb2xwX3Nka19jb3JlXzEuUmVxdWVzdEZhY3RvcnkuY3JlYXRlKGJsb2JUeXBlLCBcInYxXCIsIHBhcmFtcy5zZXR0aW5ncywgcGFyYW1zLmNhdGFsb2dIcm4sIGFib3J0U2lnbmFsKS5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgICAgICBjb25zdCBkZWx0YSA9IDQ7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZFRpbGVLZXkgPSBvbHBfc2RrX2NvcmVfMS5UaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChxdWFkS2V5LnJvdywgcXVhZEtleS5jb2x1bW4sIHF1YWRLZXkubGV2ZWwpO1xuICAgICAgICBsZXQgcXVhZFRyZWVJbmRleCA9IG51bGw7XG4gICAgICAgIGlmIChyZXF1ZXN0LmdldEZldGNoT3B0aW9uKCkgIT09IG9scF9zZGtfY29yZV8xLkZldGNoT3B0aW9ucy5PbmxpbmVPbmx5KSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5KHBhcmFtcy5zZXR0aW5ncy5jYWNoZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkZWx0YTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SW5DYWNoZSA9IHJlcXVlc3RlZFRpbGVLZXkuY2hhbmdlZExldmVsQnkoLWkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZFRyZWUgPSBjYWNoZS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBocm46IHBhcmFtcy5jYXRhbG9nSHJuLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIGxheWVySWQ6IHBhcmFtcy5sYXllcklkLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogZGVsdGEsXG4gICAgICAgICAgICAgICAgICAgIHJvb3Q6IHBhcmVudEluQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246IGNhdGFsb2dWZXJzaW9uXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZFRyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVhZFRyZWVJbmRleCA9IGNhY2hlZFRyZWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudFRpbGVLZXkgPSByZXF1ZXN0ZWRUaWxlS2V5LmNoYW5nZWRMZXZlbEJ5KC1kZWx0YSk7XG4gICAgICAgIGlmICghcXVhZFRyZWVJbmRleCkge1xuICAgICAgICAgICAgcXVhZFRyZWVJbmRleCA9IHlpZWxkIGZldGNoUXVhZFRyZWVJbmRleChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyksIHsgY2F0YWxvZ1ZlcnNpb24sIGRlcHRoOiBkZWx0YSwgZmV0Y2hPcHRpb25zOiByZXF1ZXN0LmdldEZldGNoT3B0aW9uKCksIHRpbGVLZXk6IHBhcmVudFRpbGVLZXksIGFib3J0U2lnbmFsLCBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKSB9KSkuY2F0Y2goZSA9PiBQcm9taXNlLnJlamVjdChlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFxdWFkVHJlZUluZGV4LnN1YlF1YWRzIHx8ICFxdWFkVHJlZUluZGV4LnN1YlF1YWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgUmVzcG9uc2UoXCJObyBDb250ZW50XCIsIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IDIwNCxcbiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiBcIk5vIENvbnRlbnRcIlxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiB0aGUgZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCBRdWFkS2V5IG9yIGZvciB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgY29uc3Qgc3ViUXVhZHMgPSBxdWFkVHJlZUluZGV4LnN1YlF1YWRzO1xuICAgICAgICBsZXQgY3VycmVudFRpbGVLZXkgPSByZXF1ZXN0ZWRUaWxlS2V5O1xuICAgICAgICBsZXQgY3VycmVudERlbHRhID0gZGVsdGE7XG4gICAgICAgIGZvciAobGV0IGxldmVsID0gY3VycmVudFRpbGVLZXkubGV2ZWw7IGxldmVsID49IHBhcmVudFRpbGVLZXkubGV2ZWw7IC0tbGV2ZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gc3ViUXVhZHMuZmluZChpdGVtID0+IGl0ZW0uc3ViUXVhZEtleSA9PT0gY3VycmVudFRpbGVLZXkuZ2V0U3ViSGVyZVRpbGUoY3VycmVudERlbHRhKSk7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5CbG9iQXBpLmdldEJsb2IoYmxvYlJlcXVlc3RCdWlsZGVyLCB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFIYW5kbGU6IG1ldGFkYXRhLmRhdGFIYW5kbGUsXG4gICAgICAgICAgICAgICAgICAgIGxheWVySWQ6IHBhcmFtcy5sYXllcklkLFxuICAgICAgICAgICAgICAgICAgICBiaWxsaW5nVGFnOiByZXF1ZXN0LmdldEJpbGxpbmdUYWcoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjdXJyZW50VGlsZUtleSA9IGN1cnJlbnRUaWxlS2V5LnBhcmVudCgpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnREZWx0YSA9IHBhcmVudFRpbGVLZXkubGV2ZWwgLSBjdXJyZW50VGlsZUtleS5sZXZlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYmxvYiBmb3IgVGlsZTogJHtKU09OLnN0cmluZ2lmeShxdWFkS2V5KX1gKSk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFRpbGUgPSBnZXRUaWxlO1xuLyoqXG4gKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJlcXVlc3QgcXVhZCB0cmVlIGluZGV4IGZvciB0aGUgcGFyZW50IHRpbGUgd2l0aCBkZWx0YSA0XG4gKiBhbmQgY2FjaGUgdGhlIHJlc3BvbnNlcyBpbiBjYWNoZSBmb3IgbGF0ZXIgY2FsbHMuXG4gKiBAaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIGZldGNoUXVhZFRyZWVJbmRleChwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBvbHBfc2RrX2RhdGFzZXJ2aWNlX3JlYWRfMS5RdWFkVHJlZUluZGV4Q2FjaGVSZXBvc2l0b3J5KHBhcmFtcy5zZXR0aW5ncy5jYWNoZSk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1ZXJ5Q2xpZW50KHBhcmFtcy5zZXR0aW5ncyk7XG4gICAgICAgIGNvbnN0IHF1YWRUcmVlSW5kZXhSZXF1ZXN0ID0gbmV3IG9scF9zZGtfZGF0YXNlcnZpY2VfcmVhZF8xLlF1YWRUcmVlSW5kZXhSZXF1ZXN0KHBhcmFtcy5jYXRhbG9nSHJuLCBwYXJhbXMubGF5ZXJJZCwgcGFyYW1zLmxheWVyVHlwZSlcbiAgICAgICAgICAgIC53aXRoUXVhZEtleShwYXJhbXMudGlsZUtleSlcbiAgICAgICAgICAgIC53aXRoRGVwdGgocGFyYW1zLmRlcHRoKTtcbiAgICAgICAgaWYgKHBhcmFtcy5sYXllclR5cGUgPT09IFwidmVyc2lvbmVkXCIpIHtcbiAgICAgICAgICAgIHF1YWRUcmVlSW5kZXhSZXF1ZXN0LndpdGhWZXJzaW9uKHBhcmFtcy5jYXRhbG9nVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXVhZFRyZWVJbmRleCA9IHlpZWxkIHF1ZXJ5Q2xpZW50XG4gICAgICAgICAgICAuZmV0Y2hRdWFkVHJlZUluZGV4KHF1YWRUcmVlSW5kZXhSZXF1ZXN0LCBwYXJhbXMuYWJvcnRTaWduYWwpXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IFByb21pc2UucmVqZWN0KGVycikpO1xuICAgICAgICBpZiAocGFyYW1zLmZldGNoT3B0aW9ucyAhPT0gb2xwX3Nka19jb3JlXzEuRmV0Y2hPcHRpb25zLk9ubGluZU9ubHkgJiZcbiAgICAgICAgICAgIHF1YWRUcmVlSW5kZXguc3ViUXVhZHMpIHtcbiAgICAgICAgICAgIGNhY2hlLnB1dCh7XG4gICAgICAgICAgICAgICAgaHJuOiBwYXJhbXMuY2F0YWxvZ0hybi50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIGxheWVySWQ6IHBhcmFtcy5sYXllcklkLFxuICAgICAgICAgICAgICAgIGRlcHRoOiBwYXJhbXMuZGVwdGgsXG4gICAgICAgICAgICAgICAgcm9vdDogcGFyYW1zLnRpbGVLZXksXG4gICAgICAgICAgICAgICAgdHJlZTogcXVhZFRyZWVJbmRleCxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBwYXJhbXMuY2F0YWxvZ1ZlcnNpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocXVhZFRyZWVJbmRleCk7XG4gICAgfSk7XG59XG5leHBvcnRzLmZldGNoUXVhZFRyZWVJbmRleCA9IGZldGNoUXVhZFRyZWVJbmRleDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdmFsaWRhdGVCaWxsaW5nVGFnXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi92YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9nZXRUaWxlXCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudmFsaWRhdGVCaWxsaW5nVGFnID0gdm9pZCAwO1xuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGJpbGxpbmlnIHRhZy5cbiAqXG4gKiBJdCBtdXN0IGJlIDQmbmRhc2g7MTYgY2hhcmFjdGVycyBsb25nIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKlxuICogQHBhcmFtIHRhZyBUaGUgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgYmlsbGluZyB0YWcuXG4gKiBAcmV0dXJuIFRoZSBiaWxsaW5nIHRhZyBpZiBpdCdzIHZhbGlkLiBPdGhlcndpc2UsIHRocm93cyBhbiBlcnJvci5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCaWxsaW5nVGFnKHRhZykge1xuICAgIGNvbnN0IHBhdHRlcm4gPSAvXltBLVphLXowLTlfLV17NCwxNn0kLztcbiAgICBpZiAoIXBhdHRlcm4udGVzdCh0YWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBiaWxsaW5nIHRhZyBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV1cIik7XG4gICAgfVxuICAgIHJldHVybiB0YWc7XG59XG5leHBvcnRzLnZhbGlkYXRlQmlsbGluZ1RhZyA9IHZhbGlkYXRlQmlsbGluZ1RhZztcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudmFsaWRhdGVQYXJ0aXRpb25zSWRzTGlzdCA9IHZvaWQgMDtcbi8qKlxuICogVmFsaWRhdGVzIGEgbGlzdCBvZiBwYXJ0aXRpb25zIElEcy5cbiAqXG4gKiBJdCBtdXN0IGJlIGJldHdlZW4gMSZuZGFzaDsxMDAgaXRlbXMuXG4gKlxuICogQHBhcmFtIGxpc3QgVGhlIGxpc3RzIG9mIHN0cmluZ3MgdGhhdCByZXByZXNlbnQgdGhlIHBhcnRpdGlvbnMgSURzLlxuICogQHJldHVybnMgVGhlIGxpc3Qgb2Ygc3RyaW5ncyBpZiBpdCdzIHZhbGlkLiBPdGhlcndpc2UsIHRocm93cyBhbiBlcnJvci5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXJ0aXRpb25zSWRzTGlzdChsaXN0KSB7XG4gICAgY29uc3QgTElTVF9NQVhfTEVOR1RIID0gMTAwO1xuICAgIGNvbnN0IGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPCAxIHx8IGxlbmd0aCA+IExJU1RfTUFYX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFydGl0aW9uIGlkcyBxdWFudGl0eSBtdXN0IGJlIGJldHdlZW4gMSAtIDEwMFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG59XG5leHBvcnRzLnZhbGlkYXRlUGFydGl0aW9uc0lkc0xpc3QgPSB2YWxpZGF0ZVBhcnRpdGlvbnNJZHNMaXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbGliXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9saWIudmVyc2lvblwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTElCX1ZFUlNJT04gPSB2b2lkIDA7XG5leHBvcnRzLkxJQl9WRVJTSU9OID0gXCIxLjEyLjBcIjtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQXBpQ2FjaGVSZXBvc2l0b3J5ID0gdm9pZCAwO1xuLyoqXG4gKiBDYWNoZXMgdGhlIGJhc2UgVVJMcyBvZiB0aGUgQVBJIHVzaW5nIGEga2V5LXZhbHVlIHBhaXIuXG4gKiBUaGUga2V5IGZvcm1hdCBpcyBgPGhybj46OjxzZXJ2aWNlX25hbWU+Ojo8c2VydmljZVZlcnNpb24+OjphcGlgLlxuICovXG5jbGFzcyBBcGlDYWNoZVJlcG9zaXRvcnkge1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgW1tBcGlDYWNoZVJlcG9zaXRvcnldXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYWNoZSBUaGUgW1tLZXlWYWx1ZUNhY2hlXV0gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGhybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIGZvciB3aGljaCB5b3Ugd2FudCB0byB1c2UgdGhlIFtbQXBpQ2FjaGVSZXBvc2l0b3J5XV0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBUaGUgW1tBcGlDYWNoZVJlcG9zaXRvcnldXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYWNoZSwgaHJuKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgICAgICAgdGhpcy5ocm4gPSBocm4gPyBocm4udG9TdHJpbmcoKSA6IFwicGxhdGZvcm0tYXBpXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3JlcyBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBuYW1lIG9mIHRoZSBBUEkgc2VydmljZSBmb3Igd2hpY2ggeW91IG5lZWQgdGhlIGtleS12YWx1ZSBwYWlyLlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgc2VydmljZS5cbiAgICAgKiBAcGFyYW0gc2VydmljZVVybCBUaGUgYmFzZSBVUkwgb2YgdGhlIHNlcnZpY2UuXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1dChzZXJ2aWNlLCBzZXJ2aWNlVmVyc2lvbiwgc2VydmljZVVybCwgdHlwZSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZUtleSh0aGlzLmhybiwgc2VydmljZSwgc2VydmljZVZlcnNpb24sIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5wdXQoa2V5LCBzZXJ2aWNlVXJsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJhc2UgVVJMIGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIG5hbWUgb2YgdGhlIEFQSSBzZXJ2aWNlIGZvciB3aGljaCB5b3Ugd2FudCB0byBnZXQgdGhlIGJhc2UgVVJMLlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlVmVyc2lvbiBUaGUgc2VydmljZSB2ZXJzaW9uLlxuICAgICAqIEByZXR1cm4gVGhlIGJhc2UgVVJMIG9mIHRoZSBzZXJ2aWNlLCBvciB1bmRlZmluZWQgaWYgdGhlIGJhc2UgVVJMIGRvZXMgbm90IGV4aXN0LlxuICAgICAqL1xuICAgIGdldChzZXJ2aWNlLCBzZXJ2aWNlVmVyc2lvbiwgdHlwZSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNyZWF0ZUtleSh0aGlzLmhybiwgc2VydmljZSwgc2VydmljZVZlcnNpb24sIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgY3JlYXRlS2V5KGhybiwgc2VydmljZSwgc2VydmljZVZlcnNpb24sIHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGAke2hybn06OiR7c2VydmljZX06OiR7c2VydmljZVZlcnNpb259Ojoke3R5cGV9YDtcbiAgICB9XG59XG5leHBvcnRzLkFwaUNhY2hlUmVwb3NpdG9yeSA9IEFwaUNhY2hlUmVwb3NpdG9yeTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2V5VmFsdWVDYWNoZSA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IEJZVEVTX0lOX01CID0gMTAyNDtcbi8qKlxuICogQW4gaW4tbWVtb3J5IGNhY2hpbmcgaW5zdGFuY2UuXG4gKlxuICogQWxsIHRoZSByZXBvc2l0b3J5IGluc3RhbmNlcyB1c2UgaXQgZm9yIHJlYWRpbmcgb3IgY2FjaGluZyBpbmZvcm1hdGlvbi5cbiAqL1xuY2xhc3MgS2V5VmFsdWVDYWNoZSB7XG4gICAgLyoqXG4gICAgICogQ2VyYXRlcyB0aGUgYEtleVZhbHVlQ2FjaGVgIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgYEtleVZhbHVlQ2FjaGVgIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IG9scF9zZGtfY29yZV8xLkxSVUNhY2hlKEJZVEVTX0lOX01CICogQllURVNfSU5fTUIgKiAyLCBvbHBfc2RrX2NvcmVfMS5nZXREYXRhU2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3JlcyBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhpcyB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgdHlwZS5cbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsOyBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHV0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgcmVxdWVzdGVkIHZhbHVlLlxuICAgICAqIEByZXR1cm4gVGhlIHZhbHVlLlxuICAgICAqL1xuICAgIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIHZhbHVlIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlIGZyb20gdGhlIGNhY2hlLlxuICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWw7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGNhY2hlIGFuZCByZW1vdmVzIGFsbCBzdG9yZWQga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgY2FwYWNpdHkgb2YgdGhpcyBjYWNoZS5cbiAgICAgKlxuICAgICAqIElmIGBuZXdDYXBhY2l0eWAgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IGNhY2hlIHNpemUsXG4gICAgICogYWxsIGl0ZW1zIGFyZSBldmljdGVkIHVudGlsIHRoZSBjYWNoZSBzaHJpbmtzIHRvIGBuZXdDYXBhY2l0eWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV3Q2FwYWNpdHkgVGhlIG5ldyBjYXBhY2l0eSBvZiB0aGlzIGNhY2hlIGluIE1CLlxuICAgICAqL1xuICAgIHNldENhcGFjaXR5KG5ld0NhcGFjaXR5KSB7XG4gICAgICAgIHRoaXMuY2FjaGUuc2V0Q2FwYWNpdHkobmV3Q2FwYWNpdHkgKiBCWVRFU19JTl9NQiAqIEJZVEVTX0lOX01CKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gY2FwYWNpdHkgb2YgdGhlIGNhY2hlXG4gICAgICogdGhhdCBpcyB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSB0aGUgY2FjaGUgaW4gTUIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY2FwYWNpdHkgb2YgdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIGdldENhcGFjaXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRDYXBhY2l0eSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGVcbiAgICAgKiB0aGF0IGlzIHRoZSBzdW0gb2YgYWxsIHRoZSBzaXplcyBvZiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHNpemUgb2YgdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldFNpemUoKTtcbiAgICB9XG59XG5leHBvcnRzLktleVZhbHVlQ2FjaGUgPSBLZXlWYWx1ZUNhY2hlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuRW50cnkgPSB2b2lkIDA7XG4vKiogQGhpZGRlbiAqL1xuY2xhc3MgRW50cnkge1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUsIHNpemUsIG5ld2VyLCBvbGRlcikge1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLm5ld2VyID0gbmV3ZXI7XG4gICAgICAgIHRoaXMub2xkZXIgPSBvbGRlcjtcbiAgICB9XG59XG5leHBvcnRzLkVudHJ5ID0gRW50cnk7XG4vKipcbiAqIEZpeGVkIHNpemUgY2FjaGUgdGhhdCBldmljdHMgaXRzIGVudHJpZXMgaW4gbGVhc3QtcmVjZW50bHktdXNlZCBvcmRlciB3aGVuIGl0IG92ZXJmbG93cy5cbiAqIE1vZGVsZWQgYWZ0ZXIgc3RhbmRhcmQgSmF2YVNjcmlwdCBgTWFwYCBvdGhlcndpc2UuXG4gKi9cbmNsYXNzIExSVUNhY2hlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGBMUlVDYWNoZWAuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgW1tzaXplRnVuY3Rpb25dXSBjYW4gYmUgdXNlZCB0byBmaW5lIHR1bmUgdGhlIG1lbW9yeSBjb25zdW1wdGlvbiBvZiBhbGwgY2FjaGVkXG4gICAgICogZWxlbWVudHMsIHRodXMgW1tjYWNoZUNhcGFjaXR5XV0gbWVhbnMgdGhlbiBtZW1vcnkgdXNlZC4gT3RoZXJ3aXNlLCBpZlxuICAgICAqIFtbc2l6ZUZ1bmN0aW9uXV0gaXMgbm90IHNwZWNpZmllZCwgdGhlIFtbY2FjaGVDYXBhY2l0eV1dIGFjY291bnRzIGZvciB0aGUgbWF4aW11bVxuICAgICAqIG51bWJlciBvZiBlbGVtZW50cyBzdG9yZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FjaGVDYXBhY2l0eSBOdW1iZXIgdXNlZCB0byBjb25maWd1cmUgdGhlIG1heGltdW0gY2FjaGUgc2l6ZSwgbWF5IGV4cHJlc3NcbiAgICAgKiBudW1iZXIgb2YgZW50cmllcyBvciBtZW1vcnkgY29uc3VtZWQgaW4gYnl0ZXMvbWVnYWJ5dGVzIGRlcGVuZGluZyBvbiBbW3NpemVGdW5jdGlvbl1dLlxuICAgICAqIEBwYXJhbSBzaXplRnVuY3Rpb24gQSBmdW5jdGlvbiBkZXRlcm1pbmluZyB0aGUgc2l6ZSBwZXIgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXhDYXBhY2l0eSwgc2l6ZUZ1bmN0aW9uID0gKCkgPT4gMSkge1xuICAgICAgICB0aGlzLm1heENhcGFjaXR5ID0gbWF4Q2FwYWNpdHk7XG4gICAgICAgIHRoaXMuc2l6ZUZ1bmN0aW9uID0gc2l6ZUZ1bmN0aW9uO1xuICAgICAgICB0aGlzLmNhY2hlU2l6ZSA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgaW50ZXJuYWwgbWFwIG9iamVjdCB0aGF0IGtlZXBzIHRoZSBrZXktdmFsdWUgcGFpcnMgYW5kIHRoZWlyIG9yZGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbmV3ZXN0IGVudHJ5LCBpLmUuIHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgaXRlbS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmV3ZXN0RW50cnkgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG9sZGVzdCBlbnRyeSwgaS5lLiB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbGRlc3RFbnRyeSA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzaXplIG9mIHRoZSBjYWNoZSwgaS5lLiB0aGUgc3VtIG9mIGFsbCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBzaXplIG9mIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gY2FwYWNpdHkgb2YgdGhlIGNhY2hlLCBpLmUuXG4gICAgICogdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBtYXkgYmUgY29uc3VtZWQgYnkgY2FjaGUgaW4gTUJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjYXBhY2l0eSBvZiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgZ2V0Q2FwYWNpdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heENhcGFjaXR5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBuZXdlc3QgZW50cnkgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgTmV3ZXN0IGVudHJ5IGluIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBnZXROZXdlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld2VzdEVudHJ5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBvbGRlc3QgZW50cnkgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogTm90ZTogRG9lcyBub3QgcHJvbW90ZSB0aGUgb2xkZXN0IGl0ZW0gYXMgbW9zdCByZWNlbnRseSB1c2VkIGl0ZW0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBPbGRlc3QgZW50cnkgaW4gdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIGdldE9sZGVzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2xkZXN0RW50cnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgY2FwYWNpdHkgb2YgdGhpcyBjYWNoZS4gSWYgYG5ld0NhcGFjaXR5YCBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgY2FjaGUgc2l6ZSxcbiAgICAgKiBhbGwgaXRlbXMgd2lsbCBiZSBldmljdGVkIHVudGlsIHRoZSBjYWNoZSBzaHJpbmtzIHRvIGBuZXdDYXBhY2l0eWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV3Q2FwYWNpdHkgVGhlIG5ldyBjYXBhY2l0eSBvZiB0aGlzIGNhY2hlLlxuICAgICAqL1xuICAgIHNldENhcGFjaXR5KG5ld0NhcGFjaXR5KSB7XG4gICAgICAgIHRoaXMubWF4Q2FwYWNpdHkgPSBuZXdDYXBhY2l0eTtcbiAgICAgICAgdGhpcy5ldmljdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIG9yIHVwZGF0ZXMgYSBrZXkvdmFsdWUgcGFpciBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBJZiB0aGUga2V5IGFscmVhZHkgZXhpc3RlZCBpbiB0aGUgY2FjaGUsIGl0IHdpbGwgYmUgdXBkYXRlZCBhbmQgcHJvbW90ZWQgdG8gdGhlIG1vc3QgcmVjZW50bHlcbiAgICAgKiB1c2VkIGl0ZW0uXG4gICAgICpcbiAgICAgKiBJZiB0aGUga2V5IGRpZG4ndCBleGlzdCBpbiB0aGUgY2FjaGUsIGl0IHdpbGwgYmUgaW5zZXJ0ZWQgYXMgbW9zdCByZWNlbnRseSB1c2VkIGl0ZW0uIEFuXG4gICAgICogZXZpY3Rpb24gb2YgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgaXRlbSB0YWtlcyBwbGFjZSBpZiB0aGUgY2FjaGUgZXhjZWVkZWQgaXRzIGNhcGFjaXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUga2V5LXZhbHVlIHBhaXIgdG8gaW5zZXJ0IG9yIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGUga2V5LXZhbHVlIHBhaXIgdG8gaW5zZXJ0IG9yIHVwZGF0ZS5cbiAgICAgKiBAdGhyb3dzIEFuIGVycm9yIGlmIHZhbHVlIHNpemUgaXMgYmlnZ2VyIHRoYW4gY2FjaGUgc2l6ZS5cbiAgICAgKi9cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCB2YWx1ZVNpemUgPSB0aGlzLnNpemVGdW5jdGlvbih2YWx1ZSk7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMubWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVNpemUgPSB0aGlzLmNhY2hlU2l6ZSAtIGVudHJ5LnNpemUgKyB2YWx1ZVNpemU7XG4gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgZW50cnkuc2l6ZSA9IHZhbHVlU2l6ZTtcbiAgICAgICAgICAgIHRoaXMucHJvbW90ZUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIHRoaXMuZXZpY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZVNpemUgPiB0aGlzLm1heENhcGFjaXR5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvci4gVmFsdWUgc2l6ZSAoJHt2YWx1ZVNpemV9KSBpcyB0byBiaWcgZm9yIGNhY2hlIGl0ICgke3RoaXMubWF4Q2FwYWNpdHl9KS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVudHJ5ID0gbmV3IEVudHJ5KGtleSwgdmFsdWUsIHZhbHVlU2l6ZSwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmV3ZXN0RW50cnkgPSB0aGlzLm9sZGVzdEVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXdlc3RFbnRyeSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdlc3QgPSB0aGlzLm5ld2VzdEVudHJ5O1xuICAgICAgICAgICAgICAgICAgICBlbnRyeS5vbGRlciA9IHRoaXMubmV3ZXN0RW50cnk7XG4gICAgICAgICAgICAgICAgICAgIG5ld2VzdC5uZXdlciA9IGVudHJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld2VzdEVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGtleSwgZW50cnkpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZVNpemUgKz0gdmFsdWVTaXplO1xuICAgICAgICAgICAgdGhpcy5ldmljdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3QgaWYgYSBrZXkvdmFsdWUgcGFpciBpcyBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGtleS12YWx1ZSBwYWlyIGlzIGluIHRoZSBjYWNoZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvb2tzIHVwIGtleSBpbiB0aGUgY2FjaGUgYW5kIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGtleS12YWx1ZSBwYWlyIGlzIG5vdCBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgZ2V0KGtleSkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMubWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb21vdGVFbnRyeShlbnRyeSk7XG4gICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBjYWNoZSBhbmQgcmVtb3ZlcyBhbGwgc3RvcmVkIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5uZXdlc3RFbnRyeSA9IHRoaXMub2xkZXN0RW50cnkgPSBudWxsO1xuICAgICAgICB0aGlzLmNhY2hlU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMubWFwLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4cGxpY2l0bHkgcmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQG5vdGU6IFRoaXMgaXMgYW4gZXhwbGljaXQgcmVtb3ZhbCwgdGh1cywgdGhlIGV2aWN0aW9uIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUga2V5LXZhbHVlIHBhaXIgdG8gZGVsZXRlLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUga2V5LXZhbHVlIHBhaXIgZXhpc3RlZCBhbmQgd2FzIGRlbGV0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLm1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlbGV0ZUVudHJ5KGVudHJ5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICBldmljdCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMub2xkZXN0RW50cnkgIT09IG51bGwgJiYgdGhpcy5jYWNoZVNpemUgPiB0aGlzLm1heENhcGFjaXR5KSB7XG4gICAgICAgICAgICBjb25zdCBldmljdGVkID0gdGhpcy5ldmljdE9sZGVzdCgpO1xuICAgICAgICAgICAgaWYgKGV2aWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBldmljdE9sZGVzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMub2xkZXN0RW50cnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Ub1JlbW92ZSA9IHRoaXMub2xkZXN0RW50cnk7XG4gICAgICAgICAgICB0aGlzLm9sZGVzdEVudHJ5ID0gaXRlbVRvUmVtb3ZlLm5ld2VyO1xuICAgICAgICAgICAgaWYgKGl0ZW1Ub1JlbW92ZS5uZXdlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGl0ZW1Ub1JlbW92ZS5uZXdlci5vbGRlciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hcC5kZWxldGUoaXRlbVRvUmVtb3ZlLmtleSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlU2l6ZSAtPSBpdGVtVG9SZW1vdmUuc2l6ZTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtVG9SZW1vdmU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvbW90ZUVudHJ5KGVudHJ5KSB7XG4gICAgICAgIGlmIChlbnRyeSA9PT0gdGhpcy5uZXdlc3RFbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIGFscmVhZHkgbmV3ZXN0LCBub3RoaW5nIHRvIGRvXG4gICAgICAgIC8vIHJlLWxpbmsgbmV3ZXIgYW5kIG9sZGVyIGl0ZW1zXG4gICAgICAgIGlmIChlbnRyeS5uZXdlcikge1xuICAgICAgICAgICAgZW50cnkubmV3ZXIub2xkZXIgPSBlbnRyeS5vbGRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkub2xkZXIpIHtcbiAgICAgICAgICAgIGVudHJ5Lm9sZGVyLm5ld2VyID0gZW50cnkubmV3ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5ID09PSB0aGlzLm9sZGVzdEVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLm9sZGVzdEVudHJ5ID0gZW50cnkubmV3ZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmUtbGluayBvdXJzZWx2ZXNcbiAgICAgICAgZW50cnkubmV3ZXIgPSBudWxsO1xuICAgICAgICBlbnRyeS5vbGRlciA9IHRoaXMubmV3ZXN0RW50cnk7XG4gICAgICAgIC8vIGZpbmFsbHksIHNldCBvdXJzZWx2ZXMgYXMgdGhlIG5ld2VzdCBlbnRyeVxuICAgICAgICBpZiAodGhpcy5uZXdlc3RFbnRyeSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbmV3ZXN0ID0gdGhpcy5uZXdlc3RFbnRyeTtcbiAgICAgICAgICAgIG5ld2VzdC5uZXdlciA9IGVudHJ5O1xuICAgICAgICAgICAgdGhpcy5uZXdlc3RFbnRyeSA9IGVudHJ5O1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZUVudHJ5KGVudHJ5KSB7XG4gICAgICAgIGlmIChlbnRyeSA9PT0gdGhpcy5uZXdlc3RFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5uZXdlc3RFbnRyeSA9IGVudHJ5Lm9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVudHJ5Lm5ld2VyKSB7XG4gICAgICAgICAgICBlbnRyeS5uZXdlci5vbGRlciA9IGVudHJ5Lm9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeSA9PT0gdGhpcy5vbGRlc3RFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5vbGRlc3RFbnRyeSA9IGVudHJ5Lm5ld2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVudHJ5Lm9sZGVyKSB7XG4gICAgICAgICAgICBlbnRyeS5vbGRlci5uZXdlciA9IGVudHJ5Lm5ld2VyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FjaGVTaXplIC09IGVudHJ5LnNpemU7XG4gICAgfVxufVxuZXhwb3J0cy5MUlVDYWNoZSA9IExSVUNhY2hlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vTFJVQ2FjaGVcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0FwaUNhY2hlUmVwb3NpdG9yeVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vS2V5VmFsdWVDYWNoZVwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk9scENsaWVudFNldHRpbmdzID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuLyoqXG4gKiDQoW9uZmlndXJlcyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBwbGF0Zm9ybSBjbGllbnRzIChmb3IgZXhhbXBsZSwgW1tDYXRhbG9nQ2xpZW50XV0gb3IgW1tWZXJzaW9uZWRMYXllckNsaWVudF1dKS5cbiAqL1xuY2xhc3MgT2xwQ2xpZW50U2V0dGluZ3Mge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGNsYXNzLlxuICAgICAqIEByZXR1cm4gVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5nZXRWYWxpZFRva2VuID0gcGFyYW1zLmdldFRva2VuO1xuICAgICAgICB0aGlzLmVudiA9IHBhcmFtcy5lbnZpcm9ubWVudDtcbiAgICAgICAgdGhpcy5kbSA9IHBhcmFtcy5kbSB8fCBuZXcgb2xwX3Nka19jb3JlXzEuRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyKCk7XG4gICAgICAgIHRoaXMua2V5VmFsdWVDYWNoZSA9IG5ldyBvbHBfc2RrX2NvcmVfMS5LZXlWYWx1ZUNhY2hlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZG93bmxvYWQgbWFuYWdlciBmb3IgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBbW0Rvd25sb2FkTWFuYWdlcl1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGdldCBkb3dubG9hZE1hbmFnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhc3luY2hyb25vdXMgY2FsbGJhY2sgdXNlZCB0byByZXR1cm4gYSBgUHJvbWlzZWAgd2l0aCB0aGUgYWNjZXNzIHRva2VuIGZvciByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGBQcm9taXNlYCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4gc3RyaW5nIGZvciByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBnZXQgdG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkVG9rZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGVudmlyb25tZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IHRoZSBVUkwgb2YgdGhlIEFQSSBMb29rdXAgU2VydmljZS5cbiAgICAgKiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhIFVSTCBvZiB5b3VyIGN1c3RvbSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgc3RyaW5nIHdpdGggdGhlIGVudmlyb25tZW50IG5hbWUgb3IgdGhlIFVSTCBvZiB5b3VyIGxvY2FsIGVudmlyb25tZW50LlxuICAgICAqL1xuICAgIGdldCBlbnZpcm9ubWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW52O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWNoZXMgdXNpbmcgYSBrZXktdmFsdWUgcGFpci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBbW0tleVZhbHVlQ2FjaGVdXSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleVZhbHVlQ2FjaGU7XG4gICAgfVxufVxuZXhwb3J0cy5PbHBDbGllbnRTZXR0aW5ncyA9IE9scENsaWVudFNldHRpbmdzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vT2xwQ2xpZW50U2V0dGluZ3NcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vY2FjaGVcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3V0aWxzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jbGllbnRcIiksIGV4cG9ydHMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyID0gdm9pZCAwO1xuY29uc3Qgb2xwX3Nka19jb3JlXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlXCIpO1xuLyoqIEBpbnRlcm5hbFxuICogJ0RlZmVycmVkUHJvbWlzZScgdGFrZXMgYW4gZXhlY3V0b3IgZnVuY3Rpb24gZm9yIGV4ZWN1dGluZyBpdCBsYXRlciwgd2hlbiBbW2V4ZWNdXSBpcyBjYWxsZWQuXG4gKiBUaGlzIGNsYXNzIGFsbG93cyB3cmFwcGluZyBvdGhlciBwcm9taXNlcyBvciBsb25nIHJ1bm5pbmcgZnVuY3Rpb25zIGZvciBsYXRlciBleGVjdXRpb24uXG4gKi9cbmNsYXNzIERlZmVycmVkUHJvbWlzZSB7XG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yO1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVGdW5jID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0RnVuYyA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gYGV4ZWNgIGlzIGNhbGxlZCB0aGUgZGVmZXJyZWQgZXhlY3V0b3IgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG4gICAgICovXG4gICAgZXhlYygpIHtcbiAgICAgICAgdGhpcy5leGVjdXRvcigpXG4gICAgICAgICAgICAudGhlbih0aGlzLnJlc29sdmVGdW5jKVxuICAgICAgICAgICAgLmNhdGNoKHRoaXMucmVqZWN0RnVuYyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW1tEb3dubG9hZE1hbmFnZXJdXSBpbnRlcmZhY2UgcmVxdWVzdGVkIGJ5IHRoZSBgZGF0YXN0b3JlLWFwaWAgbW9kdWxlXG4gKiBmb3IgZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBiYWNrZW5kIG9yIHNlbmRpbmcgcmVxdWVzdHMgdG8gdGhlIGJhY2tlbmQuXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsbG93cyB5b3UgdG8gZmV0Y2ggYmxvYiBvciBKU09OIGRhdGEgd2l0aCBhYm9ydGluZyBvciByZS1zZW5kaW5nIChvbiB0aW1lb3V0cykgbWVjaGFuaXNtc1xuICogdGhhdCBsaW1pdCBtYXhpbXVtIHBhcmFsbGVsIHJlcXVlc3RzLlxuICpcbiAqIEZlYXR1cmVzOlxuICpcbiAqICogTGltaXRzIHRoZSBudW1iZXIgb2YgcGFyYWxsZWwgZG93bmxvYWRzLiBJdCBpcyB1c2VmdWwgd2hlbiByZXF1ZXN0aW5nIGEgbGFyZ2UgbnVtYmVyIG9mIFVSTHMgdGhhdFxuICogICB3b3VsZCBvdGhlcndpc2Ugc3RhbGwgdGhlIGJyb3dzZXIuXG4gKiAqIFJldHJpZXMgdGhlIGRvd25sb2FkcyB3aXRoIGFuIGluY3JlYXNpbmcgdGltZW91dCBvbiBIVFRQIDUwMyByZXBsaWVzLlxuICovXG5jbGFzcyBEYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhlIFtbRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyXV0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmV0Y2hGdW5jdGlvbiBUaGUgZGVmYXVsdCBmZXRjaCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gbWF4UmV0cmllcyBUaGUgbWF4aW11bSBhbW91bnQgb2YgdHJpZXMgdG8gcmUtZmV0Y2ggYSByZXNvdXJjZS5cbiAgICAgKiBAcmV0dXJuIFRoZSBbW0RhdGFTdG9yZURvd25sb2FkTWFuYWdlcl1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGZldGNoRnVuY3Rpb24gPSBmZXRjaCwgbWF4UmV0cmllcyA9IDUpIHtcbiAgICAgICAgdGhpcy5mZXRjaEZ1bmN0aW9uID0gZmV0Y2hGdW5jdGlvbjtcbiAgICAgICAgdGhpcy5tYXhSZXRyaWVzID0gbWF4UmV0cmllcztcbiAgICAgICAgdGhpcy5hY3RpdmVEb3dubG9hZENvdW50ID0gMDtcbiAgICAgICAgdGhpcy5kb3dubG9hZFF1ZXVlID0gbmV3IEFycmF5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXMgdGhlIGRvd25sb2FkcyB3aXRoIGFuIGluY3JlYXNpbmcgdGltZW91dCBvbiBIVFRQIDUwMyByZXBsaWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZldGNoRnVuY3Rpb24gVGhlIHR5cGUgb2YgZmV0Y2guXG4gICAgICogQHBhcmFtIHJldHJ5Q291bnQgaW50LCBUaGUgY291bnRlciBvZiB0cmllcyB0byByZS1mZXRjaCByZXNwb25zZSBhZnRlciB0aGUgNTAzIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSBtYXhSZXRyaWVzIGludCwgVGhlIG1heGltdW0gYW1vdW50IG9mIHRyaWVzIHRvIHJlLWZldGNoIGFmdGVyIHRoZSA1MDMgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIHVybCBzdHJpbmcsIFRoZSBVUkwgb2YgdGhlIGVuZHBvaW50LlxuICAgICAqIEBwYXJhbSBpbml0IFJlcXVlc3RJbml0LCBUaGUgZXh0cmEgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHN0YXRpYyBmZXRjaFJlcGVhdGVkbHkoZmV0Y2hGdW5jdGlvbiwgcmV0cnlDb3VudCwgbWF4UmV0cmllcywgdXJsLCBpbml0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXhTdWNjZXNzUmVzcG9uc2VDb2RlID0gMjk5O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoRnVuY3Rpb24ob2xwX3Nka19jb3JlXzEuYWRkU2VudFdpdGhQYXJhbSh1cmwpLCBpbml0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVxdWVzdFNob3VsZFJldHJ5T25FcnJvcihyZXNwb25zZS5zdGF0dXMpIHx8XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQgPj0gbWF4UmV0cmllcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDw9IG1heFN1Y2Nlc3NSZXNwb25zZUNvZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gb2xwX3Nka19jb3JlXzEuU1RBVFVTX0NPREVTLkZPVU5EKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZVRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVGV4dCA9IHlpZWxkIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBcIiB8IEluZm86IFwiICsgcmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBvbHBfc2RrX2NvcmVfMS5IdHRwRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCBlcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmhhc093blByb3BlcnR5KFwiaXNDYW5jZWxsZWRcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgKGVyci5oYXNPd25Qcm9wZXJ0eShcIm5hbWVcIikgJiYgZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB8fFxuICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50ID4gbWF4UmV0cmllcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyLndhaXRGb3IoRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyLnJldHJ5VGltZW91dCAqIHJldHJ5Q291bnQpLnRoZW4oKCkgPT4gRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyLmZldGNoUmVwZWF0ZWRseShmZXRjaEZ1bmN0aW9uLCByZXRyeUNvdW50ICsgMSwgbWF4UmV0cmllcywgdXJsLCBpbml0KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgcmVxdWVzdFNob3VsZFJldHJ5T25FcnJvcihjb2RlKSB7XG4gICAgICAgIHJldHVybiAoKGNvZGUgPj0gb2xwX3Nka19jb3JlXzEuU1RBVFVTX0NPREVTLklOVEVSTkFMX1NFUlZFUl9FUlJPUiAmJlxuICAgICAgICAgICAgY29kZSA8PSBvbHBfc2RrX2NvcmVfMS5TVEFUVVNfQ09ERVMuTkVUV09SS19DT05ORUNUX1RJTUVPVVQpIHx8XG4gICAgICAgICAgICBjb2RlID09PSBvbHBfc2RrX2NvcmVfMS5TVEFUVVNfQ09ERVMuVE9fTUFOWV9SRVFVRVNUUyk7XG4gICAgfVxuICAgIHN0YXRpYyB3YWl0Rm9yKG1pbGxpc2Vjb25kcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERvd25sb2FkcyBhIFVSTCBhbmQgcmV0dXJucyB0aGUgYFJlc3BvbnNlYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IG1lcmdlIG11bHRpcGxlIHJlcXVlc3RzIHRvIHRoZSBzYW1lIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0aGF0IHlvdSB3YW50IHRvIGRvd25sb2FkLlxuICAgICAqIEBwYXJhbSBpbml0IEV4dHJhIHBhcmFtZXRlcnMgZm9yIHRoZSBkb3dubG9hZC5cbiAgICAgKiBAcmV0dXJuIFRoZSBVUkwgdGhhdCBpcyB1c2VkIHRvIGRvd25sb2FkIGRhdGEuXG4gICAgICovXG4gICAgZG93bmxvYWQodXJsLCBpbml0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVEb3dubG9hZENvdW50ID49XG4gICAgICAgICAgICAgICAgRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyLm1heFBhcmFsbGVsRG93bmxvYWRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWRQcm9taXNlKCgpID0+IHRoaXMuZG9Eb3dubG9hZCh1cmwsIGluaXQpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkUXVldWUucHVzaChkZWZlcnJlZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb0Rvd25sb2FkKHVybCwgaW5pdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkb0Rvd25sb2FkKHVybCwgaW5pdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgKyt0aGlzLmFjdGl2ZURvd25sb2FkQ291bnQ7XG4gICAgICAgICAgICByZXR1cm4gRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyLmZldGNoUmVwZWF0ZWRseSh0aGlzLmZldGNoRnVuY3Rpb24sIDAsIHRoaXMubWF4UmV0cmllcywgdXJsLCBpbml0KVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRG93bmxvYWREb25lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25Eb3dubG9hZERvbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uRG93bmxvYWREb25lKCkge1xuICAgICAgICAtLXRoaXMuYWN0aXZlRG93bmxvYWRDb3VudDtcbiAgICAgICAgdGhpcy5leGVjRGVmZXJyZWREb3dubG9hZCgpO1xuICAgIH1cbiAgICBleGVjRGVmZXJyZWREb3dubG9hZCgpIHtcbiAgICAgICAgY29uc3QgZnV0dXJlID0gdGhpcy5kb3dubG9hZFF1ZXVlLnBvcCgpO1xuICAgICAgICBpZiAoZnV0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmdXR1cmUuZXhlYygpO1xuICAgIH1cbn1cbmV4cG9ydHMuRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyID0gRGF0YVN0b3JlRG93bmxvYWRNYW5hZ2VyO1xuLyoqXG4gKiBUaGUgdGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKSB0byB3YWl0IGJldHdlZW4gcmV0cmllcy4gVGhpcyB0aW1lb3V0IGlzIG11bHRpcGxpZWQgd2l0aCB0aGVcbiAqIG51bWJlciBvZiByZXRyaWVzLiBGaXJzdCByZXRyeSB3YWl0cyBmb3IgMCBtcywgc2Vjb25kIHJldHJ5IGZvciA1MDAgbXMsIHRoaXJkIGZvciAxMDAwIG1zLCBhbmRcbiAqIHNvIG9uLlxuICovXG5EYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIucmV0cnlUaW1lb3V0ID0gNTAwO1xuLyoqIFRoZSBudW1iZXIgb2YgbWF4aW11bSBwYXJhbGxlbCBkb3dubG9hZHMuICovXG5EYXRhU3RvcmVEb3dubG9hZE1hbmFnZXIubWF4UGFyYWxsZWxEb3dubG9hZHMgPSAxNjtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EYXRhU3RvcmVSZXF1ZXN0QnVpbGRlciA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG4vKipcbiAqIEFkZHMgYmVhcmVyIHRva2VuIHRvIHRoZSByZXF1ZXN0IGhlYWRlcnNcbiAqIEBwYXJhbSBnZXRCZWFyZXJUb2tlbiBhc3luYyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdG9rZW4gc3RyaW5nLlxuICogQHBhcmFtIGluaXQgcGFyYW1zIHRvIHRoZSByZXF1ZXN0LiBAc2VlIFJlcXVlc3RJbml0IGludGVyZmFjZS5cbiAqXG4gKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdXBkYXRlZCByZXF1ZXN0IHBhcmFtcyAod2l0aCBhZGRlZCB0b2tlbiB0byB0aGUgaGVhZGVycykuXG4gKi9cbmZ1bmN0aW9uIGFkZEJlYXJlclRva2VuKGdldEJlYXJlclRva2VuLCBpbml0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB5aWVsZCBnZXRCZWFyZXJUb2tlbigpO1xuICAgICAgICBpZiAoaW5pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBpZiBlbXB0eSBSZXF1ZXN0SW5pdCwganVzdCBjcmVhdGUgbmV3IG9uZSBhbmQgYWRkIEJlYXJlciByb2tlbiB0byB0aGUgaGVhZGVyc1xuICAgICAgICAgICAgaW5pdCA9IHt9O1xuICAgICAgICAgICAgaW5pdC5oZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgICAgIGluaXQuaGVhZGVycy5hcHBlbmQoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgdG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gY29udmVydCBpbml0LmhlYWRlcnMgdG8gdGhlIEhlYWRlcnMgaWYgcmVjZWl2ZWQgYSBwbGFpbiBvYmplY3RcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgICAgICAgICAgLy8gYWRkaW5nIHRva2VuIHRvIHRoZSBoZWFkZXJzXG4gICAgICAgICAgICBoZWFkZXJzLmFwcGVuZChcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyB0b2tlbik7XG4gICAgICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaW5pdCk7XG4gICAgfSk7XG59XG4vKipcbiAqIEFkZHMgdXNlci1hZ2VudCB0byB0aGUgcmVxdWVzdCBoZWFkZXJzXG4gKiBAcGFyYW0gaW5pdCBwYXJhbXMgdG8gdGhlIHJlcXVlc3QuIEBzZWUgUmVxdWVzdEluaXQgaW50ZXJmYWNlLlxuICpcbiAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB1cGRhdGVkIHJlcXVlc3QgcGFyYW1zICh3aXRoIGFkZGVkIHVzZXItYWdlbnQgdG8gdGhlIGhlYWRlcnMpLlxuICovXG5mdW5jdGlvbiBhZGRVc2VyQWdlbnQoaW5pdCkge1xuICAgIGNvbnN0IFVTRVJfQUdFTlQgPSBgT0xQLVRTLVNESy8ke29scF9zZGtfY29yZV8xLkxJQl9WRVJTSU9OfWA7XG4gICAgaWYgKGluaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBpZiBlbXB0eSBSZXF1ZXN0SW5pdCwganVzdCBjcmVhdGUgbmV3IG9uZSBhbmQgYWRkIHVzZXItYWdlbnQgdG8gdGhlIGhlYWRlcnNcbiAgICAgICAgaW5pdCA9IHt9O1xuICAgICAgICBpbml0LmhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gY29udmVydCBpbml0LmhlYWRlcnMgdG8gdGhlIEhlYWRlcnMgaWYgcmVjZWl2ZWQgYSBwbGFpbiBvYmplY3RcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycyk7XG4gICAgICAgIGluaXQuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgfVxuICAgIHJldHVybiBpbml0O1xufVxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBbW1JlcXVlc3RCdWlsZGVyXV0gYW5kIHRoZSBgZG93bmxvYWRCbG9iYCBhbmQgYGRvd25sb2FkYCBtZXRob2RzLlxuICogSXQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIFtbUmVxdWVzdEJ1aWxkZXJdXSBpbnN0YW5jZSB3aXRoIGEgYmFzZSBVUkwgb2YgYSBzZXJ2aWNlLlxuICovXG5jbGFzcyBEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlciBleHRlbmRzIG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuUmVxdWVzdEJ1aWxkZXIge1xuICAgIC8qKlxuICAgICAqIENlcmF0ZXMgdGhlIFtbRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXJdXSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb3dubG9hZE1hbmFnZXIgVGhlIGNvbmZpZ3VyZWQgaW5zdGFuY2Ugb2YgdGhlIFtbRG93bmxvYWRNYW5hZ2VyXV0gaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLlxuICAgICAqIFlvdSBjYW4gdXNlIG91ciBkZWZhdWx0IGBEYXRhc3RvcmVEb3dubG9hZE1hbmFnZXJgIG9yIGNyZWF0ZSB5b3VyIGltcGxlbWVudGF0aW9uLlxuICAgICAqIEBwYXJhbSBiYXNlVXJsIFRoZSBVUkwgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBnZXRCZWFyZXJUb2tlbiBSZXRyaWV2ZXMgdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21tdW5pY2F0ZSB3aXRoIGEgcmVxdWVzdCAoc3VjaCBhcyB0aGUgYGZldGNoYCByZXF1ZXN0KVxuICAgICAqIGFuZCwgaWYgcmVxdWlyZWQsIGFib3J0IGl0IHVzaW5nIHRoZSBgQWJvcnRDb250cm9sbGVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbYEFib3J0Q29udHJvbGxlcmAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBbW0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZG93bmxvYWRNYW5hZ2VyLCBiYXNlVXJsLCBnZXRCZWFyZXJUb2tlbiwgYWJvcnRTaWduYWwpIHtcbiAgICAgICAgLyoqIFRoZSBVUkwgc3RyaW5nLiAqL1xuICAgICAgICBzdXBlcihiYXNlVXJsKTtcbiAgICAgICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBkb3dubG9hZE1hbmFnZXI7XG4gICAgICAgIHRoaXMuZ2V0QmVhcmVyVG9rZW4gPSBnZXRCZWFyZXJUb2tlbjtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbCA9IGFib3J0U2lnbmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEb3dubG9hZHMgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBVUkwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGEgdGhhdCB5b3Ugd2FudCB0byBkb3dubG9hZC5cbiAgICAgKiBAcGFyYW0gaW5pdCBUaGUgaGVscGVyIG9iamVjdCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICogQHJldHVybiBUaGUgZGF0YSBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGdlbmVyaWNzLlxuICAgICAqL1xuICAgIGRvd25sb2FkKHVybCwgaW5pdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB5aWVsZCB0aGlzLmFkZEJlYXJlclRva2VuKGluaXQpO1xuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMuYWRkVXNlckFnZW50KG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWJvcnRTaWduYWwpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgdGhpcy5hZGRBYm9ydFNpZ25hbChpbml0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZE1hbmFnZXJcbiAgICAgICAgICAgICAgICAuZG93bmxvYWQodXJsLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiByZXN1bHQuanNvbigpKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gUHJvbWlzZS5yZWplY3QoZXJyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEb3dubG9hZHMgdGhlIGJsb2IgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBibG9iIGRhdGEgdGhhdCB5b3Ugd2FudCB0byBkb3dubG9hZC5cbiAgICAgKiBAcGFyYW0gaW5pdCBUaGUgaGVscGVyIG9iamVjdCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICogQHJldHVybiBUaGUgYmxvYiBkYXRhLlxuICAgICAqL1xuICAgIGRvd25sb2FkQmxvYih1cmwsIGluaXQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0geWllbGQgdGhpcy5hZGRCZWFyZXJUb2tlbihpbml0KTtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLmFkZFVzZXJBZ2VudChvcHRpb25zKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHRoaXMuYWRkQWJvcnRTaWduYWwoaW5pdCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRNYW5hZ2VyXG4gICAgICAgICAgICAgICAgLmRvd25sb2FkKHVybCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IFByb21pc2UucmVqZWN0KGVycikpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQmVhcmVyVG9rZW4oaW5pdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIGFkZEJlYXJlclRva2VuKHRoaXMuZ2V0QmVhcmVyVG9rZW4sIGluaXQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkVXNlckFnZW50KGluaXQpIHtcbiAgICAgICAgcmV0dXJuIGFkZFVzZXJBZ2VudChpbml0KTtcbiAgICB9XG4gICAgYWRkQWJvcnRTaWduYWwoaW5pdCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gaW5pdCB8fCB7fTtcbiAgICAgICAgb3B0aW9ucy5zaWduYWwgPSB0aGlzLmFib3J0U2lnbmFsO1xuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG59XG5leHBvcnRzLkRhdGFTdG9yZVJlcXVlc3RCdWlsZGVyID0gRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkZldGNoT3B0aW9ucyA9IHZvaWQgMDtcbi8qKlxuICogRW51bWVyYXRlcyB0aGUgZmV0Y2ggb3B0aW9uIHRoYXQgY29udHJvbHMgaG93IHJlcXVlc3RzIGFyZSBoYW5kbGVkLlxuICovXG52YXIgRmV0Y2hPcHRpb25zO1xuKGZ1bmN0aW9uIChGZXRjaE9wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBBIGRlZmF1bHQgb3B0aW9uLiBRdWVyaWVzIHRoZSBuZXR3b3JrIGlmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgbm90XG4gICAgICogZm91bmQgaW4gdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIEZldGNoT3B0aW9uc1tGZXRjaE9wdGlvbnNbXCJPbmxpbmVJZk5vdEZvdW5kXCJdID0gMF0gPSBcIk9ubGluZUlmTm90Rm91bmRcIjtcbiAgICAvKipcbiAgICAgKiBTa2lwcyBjYWNoZSBsb29rdXBzIGFuZCBxdWVyaWVzIHRoZSBuZXR3b3JrIHJpZ2h0IGF3YXkuXG4gICAgICovXG4gICAgRmV0Y2hPcHRpb25zW0ZldGNoT3B0aW9uc1tcIk9ubGluZU9ubHlcIl0gPSAxXSA9IFwiT25saW5lT25seVwiO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgaW1tZWRpYXRlbHkgaWYgYSBjYWNoZSBsb29rdXAgZmFpbHMuXG4gICAgICovXG4gICAgRmV0Y2hPcHRpb25zW0ZldGNoT3B0aW9uc1tcIkNhY2hlT25seVwiXSA9IDJdID0gXCJDYWNoZU9ubHlcIjtcbn0pKEZldGNoT3B0aW9ucyA9IGV4cG9ydHMuRmV0Y2hPcHRpb25zIHx8IChleHBvcnRzLkZldGNoT3B0aW9ucyA9IHt9KSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkhSTiA9IHZvaWQgMDtcbi8qKlxuICogQ29udGFpbnMgYSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgJm5kYXNoOyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciByZXNvdXJjZXMgc3VjaCBhcyBjYXRhbG9ncywgc2NoZW1hcywgYW5kIHBpcGVsaW5lcy5cbiAqL1xuY2xhc3MgSFJOIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEhSTiBiYXNlZCBvbiB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBbW0hSTkRhdGFdXS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgVHlwZVNjcmlwdFxuICAgICAqIGNvbnN0IG15SHJuID0gbmV3IEhSTih7XG4gICAgICogICAgIHBhcnRpdGlvbjogJ2hlcmUtZGV2JyxcbiAgICAgKiAgICAgc2VydmljZTogJ2RhdGEnLFxuICAgICAqICAgICByZXNvdXJjZTogJ2V4YW1wbGUtY2F0YWxvZydcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFVzZXMgW1tmcm9tU3RyaW5nXV0gdG8gY3JlYXRlIGFuIEhSTiBmcm9tIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBmcm9tIHRoaXMgSFJOLlxuICAgICAqIEByZXR1cm4gVGhlIFtbSFJOXV0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IEhSTiBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIEhSTi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIGBocm46aGVyZTpkYXRhOjo6ZXhhbXBsZS1jYXRhbG9nYFxuICAgICAqXG4gICAgICogQHBhcmFtIGhybiBUaGUgSFJOIHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIFRoZSBuZXcgSFJOLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tU3RyaW5nKGhybikge1xuICAgICAgICAvLyBzcGVjaWFsIGNhc2UgLSBhbHNvIGFsbG93IGh0dHAgYW5kIGh0dHBzIGFzICdjYXRhbG9nLXVybCcgbG9jYWwgVVJMc1xuICAgICAgICBpZiAoaHJuLnN0YXJ0c1dpdGgoXCJodHRwOlwiKSB8fCBocm4uc3RhcnRzV2l0aChcImh0dHBzOlwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBIUk4oe1xuICAgICAgICAgICAgICAgIHBhcnRpdGlvbjogXCJjYXRhbG9nLXVybFwiLFxuICAgICAgICAgICAgICAgIHNlcnZpY2U6IFwiZGF0YXN0b3JlXCIsXG4gICAgICAgICAgICAgICAgcmVnaW9uOiBcIlwiLFxuICAgICAgICAgICAgICAgIGFjY291bnQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgcmVzb3VyY2U6IGVuY29kZVVSSUNvbXBvbmVudChocm4pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyaWVzID0gaHJuLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoIDwgdGhpcy5FTlRSSUVTX0NPVU5UIHx8IGVudHJpZXNbMF0gIT09IFwiaHJuXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgSFJOXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSFJOKHtcbiAgICAgICAgICAgIHBhcnRpdGlvbjogZW50cmllc1t0aGlzLlBBUlRJVElPTl9QT1NdLFxuICAgICAgICAgICAgc2VydmljZTogZW50cmllc1t0aGlzLlNFUlZJQ0VfUE9TXSxcbiAgICAgICAgICAgIHJlZ2lvbjogZW50cmllc1t0aGlzLlJFR0lPTl9QT1NdLFxuICAgICAgICAgICAgYWNjb3VudDogZW50cmllc1t0aGlzLkFDQ09VTlRfUE9TXSxcbiAgICAgICAgICAgIHJlc291cmNlOiBlbnRyaWVzLnNsaWNlKHRoaXMuUkVTT1VSQ0VfUE9TKS5qb2luKFwiOlwiKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBIUk4gdG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGhybjpwYXJ0aXRpb246c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEhSTi5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIChcImhybjpcIiArXG4gICAgICAgICAgICB0aGlzLmRhdGEucGFydGl0aW9uICtcbiAgICAgICAgICAgIFwiOlwiICtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXJ2aWNlICtcbiAgICAgICAgICAgIFwiOlwiICtcbiAgICAgICAgICAgICh0aGlzLmRhdGEucmVnaW9uID09PSB1bmRlZmluZWQgPyBcIlwiIDogdGhpcy5kYXRhLnJlZ2lvbikgK1xuICAgICAgICAgICAgXCI6XCIgK1xuICAgICAgICAgICAgKHRoaXMuZGF0YS5hY2NvdW50ID09PSB1bmRlZmluZWQgPyBcIlwiIDogdGhpcy5kYXRhLmFjY291bnQpICtcbiAgICAgICAgICAgIFwiOlwiICtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5yZXNvdXJjZSk7XG4gICAgfVxufVxuZXhwb3J0cy5IUk4gPSBIUk47XG5IUk4uUEFSVElUSU9OX1BPUyA9IDE7XG5IUk4uU0VSVklDRV9QT1MgPSAyO1xuSFJOLlJFR0lPTl9QT1MgPSAzO1xuSFJOLkFDQ09VTlRfUE9TID0gNDtcbkhSTi5SRVNPVVJDRV9QT1MgPSA1O1xuSFJOLkVOVFJJRVNfQ09VTlQgPSBIUk4uUkVTT1VSQ0VfUE9TICsgMTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cEVycm9yID0gdm9pZCAwO1xuLyoqXG4gKiBQcm92aWRlcyBtb3JlIHVzYWJsZSBlcnJvcnMgZnJvbSB0aGUgSEVSRSBwbGF0Zm9ybSBTZXJ2aWNlcy5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW4gdGhlIG1ldGhvZHNcbiAqIHRvIHByb3BhZ2F0ZSBlcnJvcnMgd2l0aCBhbiBIVFRQIHN0YXR1cyBjb2RlIGFuZCB3aXRoIGEgbWVzc2FnZVxuICogaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIHRoZSByZXF1ZXN0LlxuICogVGhlIGBIdHRwRXJyb3JgIGNsYXNzIGV4dGVuZHMgZ2VuZXJpYyBgRXJyb3JgIGNsYXNzIGZyb20gVjggYW5kXG4gKiBhZGRzIHByb3BlcnR5IGNvZGUgdG8gdGhlIEhUVFAgc3RhdHVzZXMuXG4gKi9cbmNsYXNzIEh0dHBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBgSHR0cEVycm9yYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0dXMgVGhlIGVycm9yIHN0YXR1cyBudW1iZXIuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc3RhdHVzLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgdGhpcy5uYW1lID0gXCJIdHRwRXJyb3JcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBlcnJvciBpcyBhbiBIVFRQIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yIFRoZSBgRXJyb3JgIG9iamVjdCB0aGF0IGlzIGNoZWNrZWQuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpcyB0aGUgZ2l2ZW4gZXJyb3IgaXMgYW4gSFRUUCBlcnJvcjsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc0h0dHBFcnJvcihlcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3IubmFtZSA9PT0gXCJIdHRwRXJyb3JcIjtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBFcnJvciA9IEh0dHBFcnJvcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMCBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZXF1ZXN0RmFjdG9yeSA9IHZvaWQgMDtcbmNvbnN0IG9scF9zZGtfY29yZV8xID0gcmVxdWlyZShcIkBoZXJlL29scC1zZGstY29yZVwiKTtcbmNvbnN0IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1kYXRhc2VydmljZS1hcGlcIik7XG5jb25zdCBNSUxMSVNFQ09ORFNfSU5fU0VDT05EID0gMTAwMDtcbi8qKlxuICogQSBoZWxwZXIgdXRpbHMgdGhhdCBtYWtlcyB0aGUgYFJlcXVlc3RgIG9iamVjdCB3aXRoIHRoZSBiYXNlIFVSTHMgb2YgdGhlIEFQSSBMb29rdXAgU2VydmljZSwgdG9rZW4gY2FsbGJhY2ssIGFuZCBkb3dubG9hZCBtYW5hZ2VyLlxuICpcbiAqIEFsc28sIHlvdSBjYW4gdXNlIGl0IHRvIGdldCB0aGUgYmFzZSBVUkxzIG9mIHRoZSBBUEkgTG9va3VwIFNlcnZpY2UuXG4gKi9cbmNsYXNzIFJlcXVlc3RGYWN0b3J5IHtcbiAgICAvKipcbiAgICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgYnVpbGRpbmcgW1tEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcl1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGluIHRoZSBBUEkuXG4gICAgICogQHBhcmFtIHNlcnZpY2VWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgW1tPbHBDbGllbnRTZXR0aW5nc11dIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBocm4gQSBIRVJFIFJlc291cmNlIE5hbWUgKFtbSFJOXV0pIG9mIHRoZSBjYXRhbG9nLlxuICAgICAqIEBwYXJhbSBhYm9ydFNpZ25hbCBBIHNpZ25hbCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGNvbW11bmljYXRlIHdpdGggYSByZXF1ZXN0IChzdWNoIGFzIHRoZSBgZmV0Y2hgIHJlcXVlc3QpXG4gICAgICogYW5kLCBpZiByZXF1aXJlZCwgYWJvcnQgaXQgdXNpbmcgdGhlIGBBYm9ydENvbnRyb2xsZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtgQWJvcnRDb250cm9sbGVyYCBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBQcm9taXNlIHdpdGggY29uc3RydWN0ZWQgW1tEYXRhU3RvcmVSZXF1ZXN0QnVpbGRlcl1dLlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uLCBzZXR0aW5ncywgaHJuLCBhYm9ydFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3RGYWN0b3J5LmdldEJhc2VVcmwoc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uLCBzZXR0aW5ncywgaHJuKS50aGVuKChiYXNlVXJsKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VVcmxcbiAgICAgICAgICAgICAgICAgICAgPyBQcm9taXNlLnJlc29sdmUobmV3IG9scF9zZGtfY29yZV8xLkRhdGFTdG9yZVJlcXVlc3RCdWlsZGVyKHNldHRpbmdzLmRvd25sb2FkTWFuYWdlciwgYmFzZVVybCwgc2V0dGluZ3MudG9rZW4sIGFib3J0U2lnbmFsKSlcbiAgICAgICAgICAgICAgICAgICAgOiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYmFzZSB1cmwgdG8gdGhlIHNlcnZpY2U6ICR7c2VydmljZU5hbWV9YCkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJhc2UgVVJMIG9mIHRoZSBBUEkgc2VydmljZSB0aGF0IHN1cHBvcnRzIGNhY2hpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIEFQSSBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBzZXJ2aWNlVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgc2VydmljZS5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIFtbT2xwQ2xpZW50U2V0dGluZ3NdXSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gaHJuIFRoZSBbW0hSTl1dIG9mIHRoZSBjYXRhbG9nLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgUHJvbWlzZSB3aXRoIHRoZSBiYXNlIFVSTCBvZiB0aGUgc2VydmljZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0QmFzZVVybChzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIHNldHRpbmdzLCBocm4pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IE5PVF9GT1VORF9DT0RFID0gNDA0O1xuICAgICAgICAgICAgY29uc3QgTk9fQ09OVEVOVF9DT0RFID0gMjA0O1xuICAgICAgICAgICAgY29uc3QgYXBpQ2FjaGUgPSBuZXcgb2xwX3Nka19jb3JlXzEuQXBpQ2FjaGVSZXBvc2l0b3J5KHNldHRpbmdzLmNhY2hlLCBocm4pO1xuICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IGFwaUNhY2hlLmdldChzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIFwiYXBpXCIpO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVNYXhBZ2UgPSBhcGlDYWNoZS5nZXQoc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uLCBcImFnZVwiKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlT25seVZlcnNpb24gPSBcInYxXCI7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIGlmIChiYXNlVXJsICYmIGNhY2hlTWF4QWdlICYmIG5vdyA8IHBhcnNlSW50KGNhY2hlTWF4QWdlLCAxMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJhc2VVcmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbG9va1VwVXJsID0gb2xwX3Nka19jb3JlXzEuZ2V0RW52TG9va1VwVXJsKHNldHRpbmdzLmVudmlyb25tZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGxvb2tVcEFwaVJlcXVlc3QgPSBuZXcgb2xwX3Nka19jb3JlXzEuRGF0YVN0b3JlUmVxdWVzdEJ1aWxkZXIoc2V0dGluZ3MuZG93bmxvYWRNYW5hZ2VyLCBsb29rVXBVcmwsIHNldHRpbmdzLnRva2VuKTtcbiAgICAgICAgICAgIGNvbnN0IGxvb2t1cFByb21pc2UgPSBocm5cbiAgICAgICAgICAgICAgICA/IG9scF9zZGtfZGF0YXNlcnZpY2VfYXBpXzEuTG9va3VwQXBpLmdldFJlc291cmNlQVBJTGlzdChsb29rVXBBcGlSZXF1ZXN0LCB7XG4gICAgICAgICAgICAgICAgICAgIGhybjogaHJuLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogb2xwX3Nka19kYXRhc2VydmljZV9hcGlfMS5Mb29rdXBBcGkuZ2V0UGxhdGZvcm1BUElMaXN0KGxvb2tVcEFwaVJlcXVlc3QpO1xuICAgICAgICAgICAgcmV0dXJuIGxvb2t1cFByb21pc2VcbiAgICAgICAgICAgICAgICAudGhlbigocmVzcCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGxldCBtYXhBZ2U7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3AuaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZUNvbnRyb2wgPSByZXNwLmhlYWRlcnMuZ2V0KFwiY2FjaGUtY29udHJvbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlQ29udHJvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IGNhY2hlQ29udHJvbC5tYXRjaCgvbWF4LWFnZT0oXFxkKykvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEFnZSA9IG1heFNpemUgPyBwYXJzZUludChtYXhTaXplWzFdLCAxMCkgOiAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIHJlc3AuanNvbigpO1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvbHBfc2RrX2NvcmVfMS5IdHRwRXJyb3IocmVzLnN0YXR1cyB8fCBOT19DT05URU5UX0NPREUsIHJlcy50aXRsZSB8fCBcIk5vIGNvbnRlbnRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS52ZXJzaW9uID09PSBjYWNoZU9ubHlWZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcGlDYWNoZS5wdXQoaXRlbS5hcGksIGl0ZW0udmVyc2lvbiwgaXRlbS5iYXNlVVJMLCBcImFwaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhBZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhBZ2UgKiBNSUxMSVNFQ09ORFNfSU5fU0VDT05EO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaUNhY2hlLnB1dChpdGVtLmFwaSwgaXRlbS52ZXJzaW9uLCB0aW1lLnRvU3RyaW5nKCksIFwiYWdlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZVVybEluZGV4ID0gcmVzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uYXBpID09PSBzZXJ2aWNlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtLnZlcnNpb24gPT09IHNlcnZpY2VWZXJzaW9uKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZVVybEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb2xwX3Nka19jb3JlXzEuSHR0cEVycm9yKE5PVF9GT1VORF9DT0RFLCBgTm8gQmFzZVVybCBmb3VuZCBmb3IgJHtzZXJ2aWNlTmFtZX0sICR7c2VydmljZVZlcnNpb259ICR7aHJuID8gaHJuLnRvU3RyaW5nKCkgOiBcIlwifWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzW2Jhc2VVcmxJbmRleF0uYmFzZVVSTDtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gUHJvbWlzZS5yZWplY3QoZXJyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdEZhY3RvcnkgPSBSZXF1ZXN0RmFjdG9yeTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMC0yMDIxIEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UaWxlS2V5ID0gdm9pZCAwO1xuLyoqXG4gKiBUaGUgYFRpbGVLZXlgIGluc3RhbmNlcyBhcmUgdXNlZCB0byBhZGRyZXNzIGEgdGlsZSBpbiBhIHF1YWR0cmVlLlxuICpcbiAqIEEgdGlsZSBrZXkgaXMgZGVmaW5lZCBieSBhIHJvdywgYSBjb2x1bW4sIGFuZCBhIGxldmVsLiBUaGUgdHJlZSBoYXMgYSByb290IGF0IGxldmVsIDAsIHdpdGggb25lXG4gKiBzaW5nbGUgdGlsZS4gT24gZXZlcnkgbGV2ZWwsIGVhY2ggdGlsZSBpcyBkaXZpZGVkIGludG8gZm91ciBjaGlsZHJlbiAodGhlcmVmb3JlIHRoZSBuYW1lXG4gKiBxdWFkdHJlZSkuXG4gKlxuICogV2l0aGluIGVhY2ggW1tsZXZlbF1dLCBhbnkgcGFydGljdWxhciB0aWxlIGlzIGFkZHJlc3NlZCB3aXRoIFtbcm93XV0gYW5kIFtbY29sdW1uXV0uIFRoZSBudW1iZXJcbiAqIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4gZWFjaCBsZXZlbCBpcyAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbGV2ZWwuIFRoaXMgbWVhbnM6IE9uIGxldmVsIDAsIG9ubHlcbiAqIG9uZSB0aWxlIGV4aXN0cywgW1tjb2x1bW5zQXRMZXZlbF1dKCkgYW5kIFtbcm93c0F0TGV2ZWxdXSgpIGFyZSBib3RoIDEuIE9uIGxldmVsIDEsIDQgdGlsZXNcbiAqIGV4aXN0LCBpbiAyIHJvd3MgYW5kIDIgY29sdW1ucy4gT24gbGV2ZWwgMiB3ZSBoYXZlIDE2IHRpbGVzLCBpbiA0IHJvd3MgYW5kIDQgY29sdW1ucy4gQW5kIHNvIG9uLlxuICpcbiAqIEEgdGlsZSBrZXkgaXMgdXN1YWxseSBjcmVhdGVkIHVzaW5nIFtbZnJvbVJvd0NvbHVtbkxldmVsXV0oKSBtZXRob2QuXG4gKlxuICogYFRpbGVLZXlgIGluc3RhbmNlcyBhcmUgaW1tdXRhYmxlLCBhbGwgbWVtYmVycyByZXR1cm4gbmV3IGluc3RhbmNlcyBvZiBgVGlsZUtleWAgYW5kIGRvIG5vdFxuICogbW9kaWZ5IHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gKlxuICogVXRpbGl0eSBmdW5jdGlvbnMgbGlrZSBbW3BhcmVudF1dKCksIFtbY2hhbmdlZExldmVsQnldXSgpLCBhbmQgW1tjaGFuZ2VkTGV2ZWxUb11dKCkgYWxsb3cgZm9yXG4gKiBlYXN5IHZlcnRpY2FsIG5hdmlnYXRpb24gb2YgdGhlIHRyZWUuIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHJvd3MgYW5kIGNvbHVtbnMgaW4gdGhlIHRpbGUnc1xuICogbGV2ZWwgaXMgZ2l2ZW4gd2l0aCBbW3Jvd0NvdW50XV0oKSBhbmQgW1tjb2x1bW5Db3VudF1dKCkuXG4gKlxuICogVGlsZSBrZXlzIGNhbiBiZSBjcmVhdGVkIGZyb20gYW5kIGNvbnZlcnRlZCBpbnRvIHZhcmlvdXMgYWx0ZXJuYXRpdmUgZm9ybWF0czpcbiAqXG4gKiAgLSBbW3RvUXVhZEtleV1dKCkgLyBbW2Zyb21RdWFkS2V5XV0oKSAtIHN0cmluZyByZXByZXNlbnRhdGlvbiA0LWJhc2VkXG4gKiAgLSBbW3RvSGVyZVRpbGVdXSgpIC8gW1tmcm9tSGVyZVRpbGVdXSgpIC0gc3RyaW5nIHJlcHJlc2VudGF0aW9uIDEwLWJhc2VkXG4gKiAgLSBbW21vcnRvbkNvZGVdXSgpIC8gW1tmcm9tTW9ydG9uQ29kZV1dKCkgLSBudW1iZXIgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBOb3RlIC0gYXMgSmF2YVNjcmlwdCdzIG51bWJlciB0eXBlIGNhbiBob2xkIDUzIGJpdHMgaW4gaXRzIG1hbnRpc3NhLCBvbmx5IGxldmVscyB1cCB0byAyNiBjYW4gYmVcbiAqIHJlcHJlc2VudGVkIGluIHRoZSBudW1iZXIgcmVwcmVzZW50YXRpb24gcmV0dXJuZWQgYnkgW1ttb3J0b25Db2RlXV0oKS5cbiAqL1xuY2xhc3MgVGlsZUtleSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBpbW11dGFibGUgaW5zdGFuY2Ugb2YgYSBgVGlsZUtleWAuXG4gICAgICpcbiAgICAgKiBGb3IgdGhlIGJldHRlciByZWFkYWJpbGl0eSwgW1tUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbF1dIHNob3VsZCBiZSBwcmVmZXJyZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIC0gcm93IGFuZCBjb2x1bW4gbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJvd3MvY29sdW1ucyBmb3IgdGhlIGdpdmVuIGxldmVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvdyBSZXByZXNlbnRzIHRoZSByb3cgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqIEBwYXJhbSBjb2x1bW4gUmVwcmVzZW50cyB0aGUgY29sdW1uIGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKiBAcGFyYW0gbGV2ZWwgUmVwcmVzZW50cyB0aGUgbGV2ZWwgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvdywgY29sdW1uLCBsZXZlbCkge1xuICAgICAgICB0aGlzLnJvdyA9IHJvdztcbiAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRpbGUga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvdyBUaGUgcmVxdWVzdGVkIHJvdy4gTXVzdCBiZSBsZXNzIHRoYW4gMiB0byB0aGUgcG93ZXIgb2YgbGV2ZWwuXG4gICAgICogQHBhcmFtIGNvbHVtbiBUaGUgcmVxdWVzdGVkIGNvbHVtbi4gTXVzdCBiZSBsZXNzIHRoYW4gMiB0byB0aGUgcG93ZXIgb2YgbGV2ZWwuXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21Sb3dDb2x1bW5MZXZlbChyb3csIGNvbHVtbiwgbGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUaWxlS2V5KHJvdywgY29sdW1uLCBsZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0aWxlIGtleSBmcm9tIGEgcXVhZCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgcXVhZCBzdHJpbmcgY2FuIGJlIGNyZWF0ZWQgd2l0aCBbW3RvUXVhZEtleV1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRrZXkgVGhlIHF1YWRrZXkgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiBgVGlsZUtleWAuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21RdWFkS2V5KHF1YWRrZXkpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBxdWFka2V5Lmxlbmd0aDtcbiAgICAgICAgbGV0IHJvdyA9IDA7XG4gICAgICAgIGxldCBjb2x1bW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YWRrZXkubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSAxIDw8IGk7XG4gICAgICAgICAgICBjb25zdCBkID0gcGFyc2VJbnQocXVhZGtleS5jaGFyQXQobGV2ZWwgLSBpIC0gMSksIDEwKTtcbiAgICAgICAgICAgIGlmIChkICYgMHgxKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uIHw9IG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZCAmIDB4Mikge1xuICAgICAgICAgICAgICAgIHJvdyB8PSBtYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChyb3csIGNvbHVtbiwgbGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGlsZSBrZXkgZnJvbSBhIG51bWVyaWMgTW9ydG9uIGNvZGUgcmVwcmVzZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGNvbnZlcnQgYSB0aWxlIGtleSBpbnRvIGEgbnVtZXJpYyBNb3J0b24gY29kZSB3aXRoIFtbbW9ydG9uQ29kZV1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1YWRLZXk2NCBUaGUgTW9ydG9uIGNvZGUgdG8gYmUgY29udmVydGVkLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIFtbVGlsZUtleV1dLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tTW9ydG9uQ29kZShxdWFkS2V5NjQpIHtcbiAgICAgICAgbGV0IGxldmVsID0gMDtcbiAgICAgICAgbGV0IHJvdyA9IDA7XG4gICAgICAgIGxldCBjb2x1bW4gPSAwO1xuICAgICAgICBsZXQgcXVhZEtleSA9IHF1YWRLZXk2NDtcbiAgICAgICAgd2hpbGUgKHF1YWRLZXkgPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBtYXNrID0gMSA8PCBsZXZlbDtcbiAgICAgICAgICAgIGlmIChxdWFkS2V5ICYgMHgxKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uIHw9IG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocXVhZEtleSAmIDB4Mikge1xuICAgICAgICAgICAgICAgIHJvdyB8PSBtYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWwrKztcbiAgICAgICAgICAgIHF1YWRLZXkgPSAocXVhZEtleSAtIChxdWFkS2V5ICYgMHgzKSkgLyA0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKHJvdywgY29sdW1uLCBsZXZlbCk7XG4gICAgICAgIHJlc3VsdC5tX21vcnRvbkNvZGUgPSBxdWFkS2V5NjQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0aWxlIGtleSBmcm9tIGEgaGVyZXRpbGUgY29kZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgc3RyaW5nIGNhbiBiZSBjcmVhdGVkIHdpdGggW1t0b0hlcmVUaWxlXV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcXVhZGtleTY0IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEhFUkUgdGlsZSBrZXkuXG4gICAgICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgYFRpbGVLZXlgLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSGVyZVRpbGUocXVhZGtleTY0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFRpbGVLZXkuZnJvbU1vcnRvbkNvZGUocGFyc2VJbnQocXVhZGtleTY0LCAxMCkpO1xuICAgICAgICByZXN1bHQubV9oZXJlVGlsZSA9IHF1YWRrZXk2NDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb2x1bW5zIGF0IGEgZ2l2ZW4gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIDIgdG8gdGhlIHBvd2VyIG9mIHRoZSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZXZlbCBUaGUgbGV2ZWwgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuXG4gICAgICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSBjb2x1bW5zIGF0IHRoZSBnaXZlbiBsZXZlbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgY29sdW1uc0F0TGV2ZWwobGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByb3dzIGF0IGEgZ2l2ZW4gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIDIgdG8gdGhlIHBvd2VyIG9mIHRoZSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZXZlbCBUaGUgbGV2ZWwgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MuXG4gICAgICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSByb3dzIGF0IHRoZSBnaXZlbiBsZXZlbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcm93c0F0TGV2ZWwobGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCBtYXRjaGluZyBgVGlsZUtleWAgaW4gYSBjYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWwgVGhlIGxldmVsIGZvciB0aGUgdGlsZSBrZXkuXG4gICAgICogQHBhcmFtIGNvb3JkWCBUaGUgWCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSBjb29yZFkgVGhlIFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0gdG90YWxXaWR0aCBUaGUgbWF4aW11bSBYIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHRvdGFsSGVpZ2h0IFRoZSBtYXhpbXVtIFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB0aWxlIGtleSBhdCB0aGUgZ2l2ZW4gbGV2ZWwgdGhhdCBpbmNsdWRlcyB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgc3RhdGljIGF0Q29vcmRzKGxldmVsLCBjb29yZFgsIGNvb3JkWSwgdG90YWxXaWR0aCwgdG90YWxIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKE1hdGguZmxvb3IoY29vcmRZIC8gKHRvdGFsSGVpZ2h0IC8gVGlsZUtleS5yb3dzQXRMZXZlbChsZXZlbCkpKSwgTWF0aC5mbG9vcihjb29yZFggLyAodG90YWxXaWR0aCAvIFRpbGVLZXkuY29sdW1uc0F0TGV2ZWwobGV2ZWwpKSksIGxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIE1vcnRvbiBjb2RlIG9mIHRoZSBwYXJlbnQgdGlsZSBrZXkgb2YgdGhlIGdpdmVuIE1vcnRvbiBjb2RlLlxuICAgICAqXG4gICAgICogTm90ZTogVGhlIHBhcmVudCBrZXkgb2YgdGhlIHJvb3Qga2V5IGlzIHRoZSByb290IGtleSBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9ydG9uQ29kZSBBIE1vcnRvbiBjb2RlLCBmb3IgZXhhbXBsZSwgb2J0YWluZWQgZnJvbSBbW21vcnRvbkNvZGVdXS5cbiAgICAgKiBAcmV0dXJucyBUaGUgTW9ydG9uIGNvZGUgb2YgdGhlIHBhcmVudCB0aWxlLlxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJlbnRNb3J0b25Db2RlKG1vcnRvbkNvZGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobW9ydG9uQ29kZSAvIDQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBxdWFka2V5IGlzIHZhbGlkLlxuICAgICAqXG4gICAgICogVGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBpbiB0aGUgZ2l2ZW4gbGV2ZWwuXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4gYSBsZXZlbCBpcyBjb21wdXRlZCBhcyAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAbm90ZSBBcyB0aGUgSmF2YVNjcmlwdCBudW1iZXIgdHlwZSBjYW4gaG9sZCA1MyBiaXRzIGluIGl0cyBtYW50aXNzYSwgb25seSBsZXZlbHMgdXAgdG8gMjYgY2FuIGJlXG4gICAgICogcmVwcmVzZW50ZWQgaW4gdGhlIG51bWJlciByZXByZXNlbnRhdGlvbiByZXR1cm5lZCBieSBbW21vcnRvbkNvZGVGcm9tUXVhZEtleV1dLlxuICAgICAqIEEgbGV2ZWwgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIDI2LlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUgY3VycmVudCBxdWFka2V5LlxuICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcXVhZGtleSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc1ZhbGlkKGtleSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICBpZiAoa2V5LmxldmVsIDwgMCB8fCBrZXkubGV2ZWwgPiAyNikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbkF0TGV2ZWwgPSBNYXRoLnBvdygyLCBrZXkubGV2ZWwpO1xuICAgICAgICBjb25zdCByb3dWYWxpZCA9IGtleS5yb3cgPj0gMCAmJiBrZXkucm93IDwgZGltZW5zaW9uQXRMZXZlbDtcbiAgICAgICAgY29uc3QgY29sdW1uVmFsaWQgPSBrZXkuY29sdW1uID49IDAgJiYga2V5LmNvbHVtbiA8IGRpbWVuc2lvbkF0TGV2ZWw7XG4gICAgICAgIHJldHVybiByb3dWYWxpZCAmJiBjb2x1bW5WYWxpZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHRpbGUga2V5IHJlcHJlc2VudGluZyB0aGUgcGFyZW50IG9mIHRoZSB0aWxlIGFkZHJlc3NlZCBieSB0aGlzIHRpbGUga2V5LlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpcyB0aGlzIHRpbGUgaXMgYWxyZWFkeSB0aGUgcm9vdC5cbiAgICAgKi9cbiAgICBwYXJlbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxldmVsID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZ2V0IHRoZSBwYXJlbnQgb2YgdGhlIHJvb3QgdGlsZSBrZXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKHRoaXMucm93ID4+PiAxLCB0aGlzLmNvbHVtbiA+Pj4gMSwgdGhpcy5sZXZlbCAtIDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHRpbGUga2V5IGF0IGEgbGV2ZWwgdGhhdCBkaWZmZXJzIGZyb20gdGhpcyB0aWxlJ3MgbGV2ZWwgYnkgZGVsdGEuXG4gICAgICpcbiAgICAgKiBFcXVpdmFsZW50IHRvIGBjaGFuZ2VkTGV2ZWxUbyhsZXZlbCgpICsgZGVsdGEpYC5cbiAgICAgKlxuICAgICAqIE5vdGUgLSByb290IGtleSBpcyByZXR1cm5lZCBpZiBgZGVsdGFgIGlzIHNtYWxsZXIgdGhhbiB0aGUgbGV2ZWwgb2YgdGhpcyB0aWxlIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgbnVtZXJpYyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgbGV2ZWwgYW5kIHRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICovXG4gICAgY2hhbmdlZExldmVsQnkoZGVsdGEpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBNYXRoLm1heCgwLCB0aGlzLmxldmVsICsgZGVsdGEpO1xuICAgICAgICBsZXQgcm93ID0gdGhpcy5yb3c7XG4gICAgICAgIGxldCBjb2x1bW4gPSB0aGlzLmNvbHVtbjtcbiAgICAgICAgaWYgKGRlbHRhID49IDApIHtcbiAgICAgICAgICAgIHJvdyA8PD0gZGVsdGE7XG4gICAgICAgICAgICBjb2x1bW4gPDw9IGRlbHRhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcm93ID4+Pj0gLWRlbHRhO1xuICAgICAgICAgICAgY29sdW1uID4+Pj0gLWRlbHRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlS2V5LmZyb21Sb3dDb2x1bW5MZXZlbChyb3csIGNvbHVtbiwgbGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHRpbGUga2V5IGF0IHRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgcmVxdWVzdGVkIGxldmVsIGlzIHNtYWxsZXIgdGhhbiB0aGUgdGlsZSdzIGxldmVsLCB0aGVuIHRoZSBrZXkgb2YgYW4gYW5jZXN0b3Igb2YgdGhpc1xuICAgICAqIHRpbGUgaXMgcmV0dXJuZWQuIElmIHRoZSByZXF1ZXN0ZWQgbGV2ZWwgaXMgbGFyZ2VyIHRoYW4gdGhlIHRpbGUncyBsZXZlbCwgdGhlbiB0aGUga2V5IG9mXG4gICAgICogZmlyc3QgY2hpbGQgb3IgZ3JhbmRjaGlsZCBvZiB0aGlzIHRpbGUgaXMgcmV0dXJuZWQsIGZvciBleGFtcGxlLCB0aGUgY2hpbGQgd2l0aCB0aGUgbG93ZXN0XG4gICAgICogcm93IGFuZCBjb2x1bW4gbnVtYmVyLiBJZiB0aGUgcmVxdWVzdGVkIGxldmVsIGVxdWFscyB0aGlzIHRpbGUncyBsZXZlbCwgdGhlbiB0aGUgdGlsZSBrZXlcbiAgICAgKiBpdHNlbGYgaXMgcmV0dXJuZWQuIElmIHRoZSByZXF1ZXN0ZWQgbGV2ZWwgaXMgbmVnYXRpdmUsIHRoZSByb290IHRpbGUga2V5IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSByZXF1ZXN0ZWQgbGV2ZWwuXG4gICAgICovXG4gICAgY2hhbmdlZExldmVsVG8obGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlZExldmVsQnkobGV2ZWwgLSB0aGlzLmxldmVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHRpbGUga2V5IHRvIGEgbnVtZXJpYyBjb2RlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqXG4gICAgICogWW91IGNhbiBjcmVhdGUgYSB0aWxlIGtleSBmcm9tIGEgbnVtZXJpYyBNb3J0b24gY29kZSB3aXRoIFtbZnJvbU1vcnRvbkNvZGVdXS5cbiAgICAgKlxuICAgICAqIE5vdGUgLSBvbmx5IGxldmVscyA8PSAyNiBhcmUgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIG1vcnRvbkNvZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm1fbW9ydG9uQ29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgY29sdW1uID0gdGhpcy5jb2x1bW47XG4gICAgICAgICAgICBsZXQgcm93ID0gdGhpcy5yb3c7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcG93ZXJPZlR3b1t0aGlzLmxldmVsIDw8IDFdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxldmVsOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uICYgMHgxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBwb3dlck9mVHdvWzIgKiBpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvdyAmIDB4MSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gcG93ZXJPZlR3b1syICogaSArIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4gPj4+PSAxO1xuICAgICAgICAgICAgICAgIHJvdyA+Pj49IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1fbW9ydG9uQ29kZSA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tX21vcnRvbkNvZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSB0aWxlIGtleSBpbnRvIGEgc3RyaW5nIGZvciB1c2luZyBpbiBSRVNUIEFQSSBjYWxscy5cbiAgICAgKlxuICAgICAqIFRoZSBzdHJpbmcgaXMgYSBxdWFka2V5IE1vcnRvbiBjb2RlIHJlcHJlc2VudGF0aW9uIGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogWW91IGNhbiBjb252ZXJ0IGJhY2sgZnJvbSBhIHF1YWRrZXkgc3RyaW5nIHdpdGggW1tmcm9tSGVyZVRpbGVdXS5cbiAgICAgKi9cbiAgICB0b0hlcmVUaWxlKCkge1xuICAgICAgICBpZiAodGhpcy5tX2hlcmVUaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubV9oZXJlVGlsZSA9IHRoaXMubW9ydG9uQ29kZSgpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubV9oZXJlVGlsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHRpbGUga2V5IGludG8gYSBzdHJpbmcgZm9yIHVzaW5nIGluIFJFU1QgQVBJIGNhbGxzLlxuICAgICAqXG4gICAgICogSWYgdGhlIHRpbGUgaXMgdGhlIHJvb3QgdGlsZSwgdGhlIHF1YWRrZXkgaXMgJy0nLiBPdGhlcndpc2UgdGhlIHN0cmluZyBpcyBhIG51bWJlciB0byB0aGVcbiAgICAgKiBiYXNlIG9mIDQsIGJ1dCB3aXRob3V0IHRoZSBsZWFkaW5nIDEsIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAqICAxLiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBlcXVhbHMgdGhlIGxldmVsLlxuICAgICAqICAyLiByZW1vdmluZyB0aGUgbGFzdCBkaWdpdCBnaXZlcyB0aGUgcGFyZW50IHRpbGUncyBxdWFka2V5IHN0cmluZywgaS5lLiBhcHBlbmRpbmcgMCwxLDIsM1xuICAgICAqICAgICB0byBhIHF1YWRrZXkgc3RyaW5nIGdpdmVzIHRoZSB0aWxlcydzIGNoaWxkcmVuLlxuICAgICAqXG4gICAgICogWW91IGNhbiBjb252ZXJ0IGJhY2sgZnJvbSBhIHF1YWRrZXkgc3RyaW5nIHdpdGggW1tmcm9tUXVhZEtleV1dLlxuICAgICAqL1xuICAgIHRvUXVhZEtleSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIi1cIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGV2ZWw7IGkgPiAwOyAtLWkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSAxIDw8IChpIC0gMSk7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSAodGhpcy5jb2x1bW4gJiBtYXNrKSAhPT0gMDtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9ICh0aGlzLnJvdyAmIG1hc2spICE9PSAwO1xuICAgICAgICAgICAgaWYgKGNvbCAmJiByb3cpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIzXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyb3cpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIyXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIxXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXF1YWxpdHkgb3BlcmF0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcW5yIFRoZSB0aWxlIGtleSB0byBjb21wYXJlIHRvLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHRpbGUga2V5IGhhcyBpZGVudGljYWwgcm93LCBjb2x1bW4gYW5kIGxldmVsLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBlcXVhbHMocW5yKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5yb3cgPT09IHFuci5yb3cgJiZcbiAgICAgICAgICAgIHRoaXMuY29sdW1uID09PSBxbnIuY29sdW1uICYmXG4gICAgICAgICAgICB0aGlzLmxldmVsID09PSBxbnIubGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBxdWFka2V5IHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSBpdHMgc3ViIHF1YWRrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3ViIFRoZSBzdWIga2V5LlxuICAgICAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSB0aWxlIGtleSBpbiB0aGUgcXVhZHRyZWUuXG4gICAgICovXG4gICAgYWRkZWRTdWJLZXkoc3ViKSB7XG4gICAgICAgIGNvbnN0IHN1YlF1YWQgPSBUaWxlS2V5LmZyb21RdWFkS2V5KHN1Yi5sZW5ndGggPT09IDAgPyBcIi1cIiA6IHN1Yik7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5jaGFuZ2VkTGV2ZWxCeShzdWJRdWFkLmxldmVsKTtcbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuZnJvbVJvd0NvbHVtbkxldmVsKGNoaWxkLnJvdyArIHN1YlF1YWQucm93LCBjaGlsZC5jb2x1bW4gKyBzdWJRdWFkLmNvbHVtbiwgY2hpbGQubGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBxdWFka2V5IHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSBpdHMgc3ViIEhFUkUgdGlsZSBrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3ViIFRoZSBzdWIgSEVSRSBrZXkuXG4gICAgICogQHJldHVybnMgVGhlIGFic29sdXRlIHRpbGUga2V5IGluIHRoZSBxdWFkdHJlZS5cbiAgICAgKi9cbiAgICBhZGRlZFN1YkhlcmVUaWxlKHN1Yikge1xuICAgICAgICBjb25zdCBzdWJRdWFkID0gVGlsZUtleS5mcm9tSGVyZVRpbGUoc3ViKTtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLmNoYW5nZWRMZXZlbEJ5KHN1YlF1YWQubGV2ZWwpO1xuICAgICAgICByZXR1cm4gVGlsZUtleS5mcm9tUm93Q29sdW1uTGV2ZWwoY2hpbGQucm93ICsgc3ViUXVhZC5yb3csIGNoaWxkLmNvbHVtbiArIHN1YlF1YWQuY29sdW1uLCBjaGlsZC5sZXZlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzdWIgcXVhZGtleSB0aGF0IGlzIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHN1YiBrZXlzIHRoYXQgYXJlIHJlbGF0aXZlIHRvIGEgcGFyZW50IHRoYXQgaXMgZGVsdGFcbiAgICAgKiBsZXZlbHMgdXAgaW4gdGhlIHF1YWR0cmVlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgc2hvcnRlbmVkIGtleXMgZm9yIHF1YWRzIG9uIGxvd2VyIGxldmVscyBpZiB0aGUgcGFyZW50IGlzXG4gICAgICoga25vd24uXG4gICAgICpcbiAgICAgKiBOb3RlIC0gdGhlIHN1YiBxdWFka2V5cyBmaXQgaW4gYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBpZiB0aGUgYGRlbHRhYCBpcyBzbWFsbGVyIHRoYW4gOC4gSWZcbiAgICAgKiBgZGVsdGFgIGlzIHNtYWxsZXIgdGhhbiAxNiwgdGhlIHN1YiBxdWFka2V5IGZpdHMgaW50byBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlci5cbiAgICAgKlxuICAgICAqIERlbHRhcyBsYXJnZXIgdGhhbiAxNiBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgbnVtYmVyIG9mIGxldmVscyByZWxhdGl2ZSB0byBpdHMgcGFyZW50IHF1YWRrZXkuIE11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0b1xuICAgICAqIDAgYW5kIHNtYWxsZXIgdGhhbiAxNi5cbiAgICAgKiBAcmV0dXJucyBUaGUgcXVhZGtleSByZWxhdGl2ZSB0byBpdHMgcGFyZW50IHRoYXQgaXMgYGRlbHRhYCBsZXZlbHMgdXAgdGhlIHRyZWUuXG4gICAgICovXG4gICAgZ2V0U3ViSGVyZVRpbGUoZGVsdGEpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5tb3J0b25Db2RlKCk7XG4gICAgICAgIGNvbnN0IG1zYiA9IDEgPDwgKGRlbHRhICogMik7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBtc2IgLSAxO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoa2V5ICYgbWFzaykgfCBtc2I7XG4gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByb3dzIGluIHRoZSB0aWxlJ3MgW1tsZXZlbF1dLlxuICAgICAqXG4gICAgICogVGhpcyBpcyAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbGV2ZWwuXG4gICAgICovXG4gICAgcm93Q291bnQoKSB7XG4gICAgICAgIHJldHVybiBUaWxlS2V5LnJvd3NBdExldmVsKHRoaXMubGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbHVtbnMgaW4gdGhlIHRpbGUncyBbW2xldmVsXV0uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIDIgdG8gdGhlIHBvd2VyIG9mIHRoZSBsZXZlbC5cbiAgICAgKi9cbiAgICBjb2x1bW5Db3VudCgpIHtcbiAgICAgICAgcmV0dXJuIFRpbGVLZXkuY29sdW1uc0F0TGV2ZWwodGhpcy5sZXZlbCk7XG4gICAgfVxufVxuZXhwb3J0cy5UaWxlS2V5ID0gVGlsZUtleTtcbi8qKiBAaGlkZGVuICovXG5jb25zdCBwb3dlck9mVHdvID0gW1xuICAgIDB4MSxcbiAgICAweDIsXG4gICAgMHg0LFxuICAgIDB4OCxcbiAgICAweDEwLFxuICAgIDB4MjAsXG4gICAgMHg0MCxcbiAgICAweDgwLFxuICAgIDB4MTAwLFxuICAgIDB4MjAwLFxuICAgIDB4NDAwLFxuICAgIDB4ODAwLFxuICAgIDB4MTAwMCxcbiAgICAweDIwMDAsXG4gICAgMHg0MDAwLFxuICAgIDB4ODAwMCxcbiAgICAweDEwMDAwLFxuICAgIDB4MjAwMDAsXG4gICAgMHg0MDAwMCxcbiAgICAweDgwMDAwLFxuICAgIDB4MTAwMDAwLFxuICAgIDB4MjAwMDAwLFxuICAgIDB4NDAwMDAwLFxuICAgIDB4ODAwMDAwLFxuICAgIDB4MTAwMDAwMCxcbiAgICAweDIwMDAwMDAsXG4gICAgMHg0MDAwMDAwLFxuICAgIDB4ODAwMDAwMCxcbiAgICAweDEwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMCxcbiAgICAweDgwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAwLFxuICAgIDB4NDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwMCxcbiAgICAweDIwMDAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwMCxcbiAgICAweDEwMDAwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMDAwMCxcbiAgICAweDgwMDAwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwMDAwLFxuICAgIDB4MjAwMDAwMDAwMDAwLFxuICAgIDB4NDAwMDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwMDAwLFxuICAgIDB4MTAwMDAwMDAwMDAwMCxcbiAgICAweDIwMDAwMDAwMDAwMDAsXG4gICAgMHg0MDAwMDAwMDAwMDAwLFxuICAgIDB4ODAwMDAwMDAwMDAwMCxcbiAgICAweDEwMDAwMDAwMDAwMDAwIC8vIE1hdGgucG93KDIsIDUyKSwgaGlnaGVzdCBiaXQgdGhhdCBjYW4gYmUgc2V0IGNvcnJlY3RseS5cbl07XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlV1aWQgPSB2b2lkIDA7XG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1iaXR3aXNlXG4vLyB0c2xpbnQ6ZGlzYWJsZTogbm8tbWFnaWMtbnVtYmVyc1xuLyoqXG4gKiBAYnJpZWYgTGV0cyB5b3UgZ2VuZXJhdGUgdXVpZCBjb2RlXG4gKi9cbmNsYXNzIFV1aWQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gVVVJRFxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBVdWlkLmdlbmVyYXRlKDIpLFxuICAgICAgICAgICAgVXVpZC5nZW5lcmF0ZSgxKSxcbiAgICAgICAgICAgIFV1aWQuZ2VuZXJhdGUoMSksXG4gICAgICAgICAgICBVdWlkLmdlbmVyYXRlKDEpLFxuICAgICAgICAgICAgVXVpZC5nZW5lcmF0ZSgzKVxuICAgICAgICBdLmpvaW4oXCItXCIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2VuZXJhdGUoY291bnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICgoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApIHwgMClcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAgICAgICAgICAgLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuVXVpZCA9IFV1aWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldERhdGFTaXplID0gdm9pZCAwO1xuY29uc3QgQllURVNfSU5fTlVNQkVSID0gODtcbmNvbnN0IEJZVEVTX0lOX0JPT0xFQU4gPSA0O1xuLyoqXG4gKiBDYWxjdWxhdGUgbWVtb3J5IHNpemUgb2YgamF2YXNjcmlwdCBvYmplY3QsIGl0IGlzIG5vdCBhbiBhY2N1cmF0ZSB2YWx1ZVxuICogQHBhcmFtIGRhdGEuIFRoZSBzdHJpbmcgb3IgbnVtYmVyIG9yIGJvb2xlYW4gb3IgYXJyYXkgb3Igb2JqZWN0LlxuICogQHJldHVybnMgVGhlIHNpemUgb2YgdmFsdWUgaW4gYnl0ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldERhdGFTaXplKGRhdGEpIHtcbiAgICBsZXQgYnl0ZXMgPSAwO1xuICAgIGZ1bmN0aW9uIHNpemVPZihvYmopIHtcbiAgICAgICAgaWYgKG9iaiAhPT0gbnVsbCAmJiBvYmogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2Ygb2JqKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgICBieXRlcyArPSBCWVRFU19JTl9OVU1CRVI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gb2JqLmxlbmd0aCAqIDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzICs9IEJZVEVTX0lOX0JPT0xFQU47XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqQ2xhc3MgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iakNsYXNzID09PSBcIltvYmplY3QgT2JqZWN0XVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpDbGFzcyA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplT2Yob2JqW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gb2JqLnRvU3RyaW5nKCkubGVuZ3RoICogMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuICAgIHJldHVybiBzaXplT2YoZGF0YSk7XG59XG5leHBvcnRzLmdldERhdGFTaXplID0gZ2V0RGF0YVNpemU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEVudkxvb2tVcFVybCA9IHZvaWQgMDtcbi8qKlxuICogR2V0cyB0aGUgVVJMIHN0cmluZyBvZiB0aGUgQVBJIExvb2t1cCBTZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSBlbnYgVGhlIGVudmlyb25tZW50IHRoYXQgeW91IHVzZSBmb3Igd29yay4gWW91IGNhbiBhbHNvIHBhc3MgdGhlIFVSTCBzdHJpbmcgb2YgeW91ciBsb2NhbCBvciBjdXN0b20gZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJuIEJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQsIHRoZSBVUkwgc3RyaW5nIG9mIHRoZSBBUEkgTG9va3VwIFNlcnZpY2Ugb3IgdGhlIFVSTCBzdHJpbmcgb2YgdGhlIGN1c3RvbSBzZXJ2aWNlLlxuICovXG5mdW5jdGlvbiBnZXRFbnZMb29rVXBVcmwoZW52KSB7XG4gICAgZnVuY3Rpb24gaXNVUkwoc3RyKSB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gYCg/Oig/OlthLXpdKzopPy8vKWA7XG4gICAgICAgIGNvbnN0IGlwID0gYCg/OjI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV1cXFxcZHxcXFxcZCkoPzpcXFxcLig/OjI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV1cXFxcZHxcXFxcZCkpezN9YDtcbiAgICAgICAgY29uc3QgaG9zdCA9IFwiKD86KD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldWy1fXSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspXCI7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IFwiKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0tKikqW2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKykqXCI7XG4gICAgICAgIGNvbnN0IHRsZCA9IGAoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH0pKVxcXFwuP2A7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBcIig/OjpcXFxcZHsyLDV9KT9cIjtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBxdW90ZW1hcmtcbiAgICAgICAgY29uc3QgcGF0aCA9ICcoPzpbLz8jXVteXFxcXHNcIl0qKT8nO1xuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYCg/OiR7cHJvdG9jb2x9fHd3d1xcXFwuKSg/OmxvY2FsaG9zdHwke2lwfXwke2hvc3R9JHtkb21haW59JHt0bGR9KSR7cG9ydH0ke3BhdGh9YCk7XG4gICAgICAgIHJldHVybiByZWdleC50ZXN0KHN0ci50cmltKCkpO1xuICAgIH1cbiAgICBpZiAoaXNVUkwoZW52KSkge1xuICAgICAgICByZXR1cm4gZW52O1xuICAgIH1cbiAgICBzd2l0Y2ggKGVudikge1xuICAgICAgICBjYXNlIFwiaGVyZS1kZXZcIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vYXBpLWxvb2t1cC5kYXRhLmFwaS5wbGF0Zm9ybS5zaXQuaGVyZS5jb20vbG9va3VwL3YxXCI7XG4gICAgICAgIGNhc2UgXCJoZXJlLWNuXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJodHRwczovL2FwaS1sb29rdXAuZGF0YS5hcGkucGxhdGZvcm0uaGVyZW9scC5jbi9sb29rdXAvdjFcIjtcbiAgICAgICAgY2FzZSBcImhlcmUtY24tZGV2XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJodHRwczovL2FwaS1sb29rdXAuZGF0YS5hcGkucGxhdGZvcm0uaW4uaGVyZW9scC5jbi9sb29rdXAvdjFcIjtcbiAgICAgICAgY2FzZSBcImxvY2FsXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJodHRwOi8vbG9jYWxob3N0OjMxMDA1L2xvb2t1cC92MVwiO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9hcGktbG9va3VwLmRhdGEuYXBpLnBsYXRmb3JtLmhlcmUuY29tL2xvb2t1cC92MVwiO1xuICAgIH1cbn1cbmV4cG9ydHMuZ2V0RW52TG9va1VwVXJsID0gZ2V0RW52TG9va1VwVXJsO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU1RBVFVTX0NPREVTID0gdm9pZCAwO1xuLyoqXG4gKiBTdGF0dXMgY29kZXMgb2YgSFRUUCByZXNwb25zZXMuXG4gKi9cbnZhciBTVEFUVVNfQ09ERVM7XG4oZnVuY3Rpb24gKFNUQVRVU19DT0RFUykge1xuICAgIFNUQVRVU19DT0RFU1tTVEFUVVNfQ09ERVNbXCJPS1wiXSA9IDIwMF0gPSBcIk9LXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIkNSRUFURURcIl0gPSAyMDFdID0gXCJDUkVBVEVEXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIk5PX0NPTlRFTlRcIl0gPSAyMDRdID0gXCJOT19DT05URU5UXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIkZPVU5EXCJdID0gMzAyXSA9IFwiRk9VTkRcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiQkFEX1JFUVVFU1RcIl0gPSA0MDBdID0gXCJCQURfUkVRVUVTVFwiO1xuICAgIFNUQVRVU19DT0RFU1tTVEFUVVNfQ09ERVNbXCJOT1RfRk9VTkRcIl0gPSA0MDRdID0gXCJOT1RfRk9VTkRcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiVE9fTUFOWV9SRVFVRVNUU1wiXSA9IDQyOV0gPSBcIlRPX01BTllfUkVRVUVTVFNcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCJdID0gNTAwXSA9IFwiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCI7XG4gICAgU1RBVFVTX0NPREVTW1NUQVRVU19DT0RFU1tcIlNFUlZJQ0VfVU5BVkFJQkxFXCJdID0gNTAzXSA9IFwiU0VSVklDRV9VTkFWQUlCTEVcIjtcbiAgICBTVEFUVVNfQ09ERVNbU1RBVFVTX0NPREVTW1wiTkVUV09SS19DT05ORUNUX1RJTUVPVVRcIl0gPSA1OTldID0gXCJORVRXT1JLX0NPTk5FQ1RfVElNRU9VVFwiO1xufSkoU1RBVFVTX0NPREVTID0gZXhwb3J0cy5TVEFUVVNfQ09ERVMgfHwgKGV4cG9ydHMuU1RBVFVTX0NPREVTID0ge30pKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9EYXRhU3RvcmVEb3dubG9hZE1hbmFnZXJcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0RhdGFTdG9yZVJlcXVlc3RCdWlsZGVyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9Eb3dubG9hZE1hbmFnZXJcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyRmFjdG9yeVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZ2V0RW52TG9va3VwVXJsXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9IUk5cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2dldERhdGFTaXplVXRpbFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vSHR0cEVycm9yXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9GZXRjaE9wdGlvbnNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1RpbGVLZXlcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1V1aWRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3VzZXJBZ2VudFwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFkZFNlbnRXaXRoUGFyYW0gPSBleHBvcnRzLlNFTlRfV0lUSF9QQVJBTSA9IHZvaWQgMDtcbmNvbnN0IGxpYl92ZXJzaW9uXzEgPSByZXF1aXJlKFwiQGhlcmUvb2xwLXNkay1jb3JlL2xpYi52ZXJzaW9uXCIpO1xuLyoqXG4gKiBUaGUgc3RyaW5nIGZvciBhZGRpbmcgdG8gdGhlIHJlcXVlc3RzIGFzIHF1ZXJ5IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0cy5TRU5UX1dJVEhfUEFSQU0gPSBgc2VudFdpdGg9T0xQLVRTLVNESy0ke2xpYl92ZXJzaW9uXzEuTElCX1ZFUlNJT059YDtcbi8qKlxuICogQWRkcyBzZW50V2l0aCBwYXJhbSB0byB0aGUgdXJsLlxuICogQHBhcmFtIHVybCB0aGUgc3RyaW5nLCByZXByZXNlbnRpbmcgdGhlIHVybFxuICogQHJldHVybnMgdGhlIHN0cmluZywgcmVwcmVzZW50aW5nIHVwZGF0ZWQgVVJMXG4gKi9cbmZ1bmN0aW9uIGFkZFNlbnRXaXRoUGFyYW0odXJsKSB7XG4gICAgcmV0dXJuIHVybC5zcGxpdChcIj9cIikubGVuZ3RoID09PSAxXG4gICAgICAgID8gYCR7dXJsfT8ke2V4cG9ydHMuU0VOVF9XSVRIX1BBUkFNfWBcbiAgICAgICAgOiBgJHt1cmx9JiR7ZXhwb3J0cy5TRU5UX1dJVEhfUEFSQU19YDtcbn1cbmV4cG9ydHMuYWRkU2VudFdpdGhQYXJhbSA9IGFkZFNlbnRXaXRoUGFyYW07XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5JbnRlcmFjdGl2ZUFwaSA9IGV4cG9ydHMuT2JqZWN0U3RvcmVBcGkgPSBleHBvcnRzLlB1Ymxpc2hBcGkgPSBleHBvcnRzLlN0cmVhbUFwaSA9IGV4cG9ydHMuSW5kZXhBcGkgPSBleHBvcnRzLlZvbGF0aWxlQmxvYkFwaSA9IGV4cG9ydHMuQmxvYkFwaSA9IGV4cG9ydHMuQ292ZXJhZ2VBcGkgPSBleHBvcnRzLlF1ZXJ5QXBpID0gZXhwb3J0cy5BcnRpZmFjdEFwaSA9IGV4cG9ydHMuQ29uZmlnQXBpID0gZXhwb3J0cy5NZXRhZGF0YUFwaSA9IGV4cG9ydHMuTG9va3VwQXBpID0gZXhwb3J0cy5BdXRob3JpemF0aW9uQVBJID0gdm9pZCAwO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2xpYi9SZXF1ZXN0QnVpbGRlclwiKSwgZXhwb3J0cyk7XG5jb25zdCBBcnRpZmFjdEFwaSA9IHJlcXVpcmUoXCIuL2xpYi9hcnRpZmFjdC1hcGlcIik7XG5leHBvcnRzLkFydGlmYWN0QXBpID0gQXJ0aWZhY3RBcGk7XG5jb25zdCBBdXRob3JpemF0aW9uQVBJID0gcmVxdWlyZShcIi4vbGliL2F1dGhvcml6YXRpb24tYXBpLXYxLjFcIik7XG5leHBvcnRzLkF1dGhvcml6YXRpb25BUEkgPSBBdXRob3JpemF0aW9uQVBJO1xuY29uc3QgQmxvYkFwaSA9IHJlcXVpcmUoXCIuL2xpYi9ibG9iLWFwaVwiKTtcbmV4cG9ydHMuQmxvYkFwaSA9IEJsb2JBcGk7XG5jb25zdCBDb25maWdBcGkgPSByZXF1aXJlKFwiLi9saWIvY29uZmlnLWFwaVwiKTtcbmV4cG9ydHMuQ29uZmlnQXBpID0gQ29uZmlnQXBpO1xuY29uc3QgQ292ZXJhZ2VBcGkgPSByZXF1aXJlKFwiLi9saWIvY292ZXJhZ2UtYXBpXCIpO1xuZXhwb3J0cy5Db3ZlcmFnZUFwaSA9IENvdmVyYWdlQXBpO1xuY29uc3QgSW5kZXhBcGkgPSByZXF1aXJlKFwiLi9saWIvaW5kZXgtYXBpXCIpO1xuZXhwb3J0cy5JbmRleEFwaSA9IEluZGV4QXBpO1xuY29uc3QgTG9va3VwQXBpID0gcmVxdWlyZShcIi4vbGliL2xvb2t1cC1hcGlcIik7XG5leHBvcnRzLkxvb2t1cEFwaSA9IExvb2t1cEFwaTtcbmNvbnN0IE1ldGFkYXRhQXBpID0gcmVxdWlyZShcIi4vbGliL21ldGFkYXRhLWFwaVwiKTtcbmV4cG9ydHMuTWV0YWRhdGFBcGkgPSBNZXRhZGF0YUFwaTtcbmNvbnN0IFB1Ymxpc2hBcGkgPSByZXF1aXJlKFwiLi9saWIvcHVibGlzaC1hcGktdjJcIik7XG5leHBvcnRzLlB1Ymxpc2hBcGkgPSBQdWJsaXNoQXBpO1xuY29uc3QgUXVlcnlBcGkgPSByZXF1aXJlKFwiLi9saWIvcXVlcnktYXBpXCIpO1xuZXhwb3J0cy5RdWVyeUFwaSA9IFF1ZXJ5QXBpO1xuY29uc3QgU3RyZWFtQXBpID0gcmVxdWlyZShcIi4vbGliL3N0cmVhbS1hcGlcIik7XG5leHBvcnRzLlN0cmVhbUFwaSA9IFN0cmVhbUFwaTtcbmNvbnN0IFZvbGF0aWxlQmxvYkFwaSA9IHJlcXVpcmUoXCIuL2xpYi92b2xhdGlsZS1ibG9iLWFwaVwiKTtcbmV4cG9ydHMuVm9sYXRpbGVCbG9iQXBpID0gVm9sYXRpbGVCbG9iQXBpO1xuY29uc3QgT2JqZWN0U3RvcmVBcGkgPSByZXF1aXJlKFwiLi9saWIvYmxvYi52Mi5hcGlcIik7XG5leHBvcnRzLk9iamVjdFN0b3JlQXBpID0gT2JqZWN0U3RvcmVBcGk7XG5jb25zdCBJbnRlcmFjdGl2ZUFwaSA9IHJlcXVpcmUoXCIuL2xpYi9pbnRlcmFjdGl2ZS1hcGktdjFcIik7XG5leHBvcnRzLkludGVyYWN0aXZlQXBpID0gSW50ZXJhY3RpdmVBcGk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVxdWVzdEJ1aWxkZXIgPSBleHBvcnRzLlVybEJ1aWxkZXIgPSB2b2lkIDA7XG4vKipcbiAqIEhlbHBlciBjbGFzcyB0aGF0IGJ1aWxkcyBVUkxzIGZyb20gYSBiYXNlVXJsIGFuZCBnaXZlbiBxdWVyeSBwYXJhbWV0ZXJzXG4gKi9cbmNsYXNzIFVybEJ1aWxkZXIge1xuICAgIC8qKlxuICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsIFRoZSBiYXNlIFVSTC5cbiAgICAgKiBAcGFyYW0gaGFzUXVlcnkgV2hldGhlciB0aGUgYmFzZSBVUkwgYWxyZWFkeSBjb250YWlucyBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVybCwgaGFzUXVlcnkgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICAgICAgdGhpcy5oYXNRdWVyeSA9IGhhc1F1ZXJ5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgbWV0aG9kIHRoYXQgY3JlYXRlcyBhbiBVUkwgcXVlcnkgc3RyaW5nIGZyb20gYSBrZXksIHZhbHVlIHBhaXIgcHJvdmlkZWQgYXMgcGFyYW0gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW0gZWl0aGVyIGEgc3RyaW5nIG9yIGEgbnVtYmVyIHRvIGJlIGNvbnZlcnRlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgc3RyaW5naWZ5UXVlcnkodmFsdWVzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVXJsQnVpbGRlci5hcHBlbmRRdWVyeVN0cmluZyhyZXN1bHQsIFwiXCIsIGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgbWV0aG9kIHRoYXQgY29udmVydHMgdGhlIHBhcmFtZXRlciB0byBhIHN0cmluZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtIGVpdGhlciBhIHN0cmluZyBvciBhIG51bWJlciB0byBiZSBjb252ZXJ0ZWQuXG4gICAgICovXG4gICAgc3RhdGljIHRvU3RyaW5nKHBhcmFtKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGFyYW0gPT09IFwic3RyaW5nXCIgPyBwYXJhbSA6IHBhcmFtLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHN0YXRpYyBhcHBlbmRRdWVyeVN0cmluZyh1cmwsIHNlcGFyYXRvciwga2V5LCB2YWx1ZSwgb3BlcmF0b3IgPSBcIj1cIikge1xuICAgICAgICB1cmwgKz0gc2VwYXJhdG9yO1xuICAgICAgICB1cmwgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyBvcGVyYXRvcjtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdXJsICs9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgdXJsICs9IGAke3ZhbHVlfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB1cmwgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlZFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlcy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudCh2YWwpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdXJsICs9IGVuY29kZWRWYWx1ZXMuam9pbihcIixcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHF1ZXJ5IHBhcmFtZXRlciB0byB0aGUgVVJMLCBlaXRoZXIgdXNpbmcgJyZrZXk9dmFsdWUnIG9yICc/a2V5PXZhbHVlJ1xuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgW1toYXNRdWVyeV1dIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEVzY2FwZXMgYWxsIHN0cmluZ3MgdXNpbmcgYGVuY29kZVVSSUNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBTdHJpbmcgYXJyYXlzIGFyZSBjb25jYXRlbmF0ZWQgdXNpbmcgY29tbWFzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIGFwcGVuZFF1ZXJ5KGtleSwgdmFsdWUsIG9wZXJhdG9yID0gXCI9XCIpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgbGV0IHF1ZXJ5U3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcEtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9IFVybEJ1aWxkZXIuYXBwZW5kUXVlcnlTdHJpbmcoXCJcIiwgdGhpcy5oYXNRdWVyeSA/IFwiJlwiIDogXCI/XCIsIHByb3BLZXksIHZhbHVlW3Byb3BLZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXJsICs9IHF1ZXJ5U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cmwgPSBVcmxCdWlsZGVyLmFwcGVuZFF1ZXJ5U3RyaW5nKHRoaXMudXJsLCB0aGlzLmhhc1F1ZXJ5ID8gXCImXCIgOiBcIj9cIiwga2V5LCB2YWx1ZSwgb3BlcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzUXVlcnkgPSB0cnVlO1xuICAgIH1cbn1cbmV4cG9ydHMuVXJsQnVpbGRlciA9IFVybEJ1aWxkZXI7XG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIHVzZWQgZm9yIGJ1aWxkaW5nIHJlcXVlc3RzIHRvIGEgUkVTVCBBUEkuXG4gKi9cbmNsYXNzIFJlcXVlc3RCdWlsZGVyIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFJlcXVlc3RCdWlsZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJhc2VVcmwgVGhlIGJhc2UgVVJMIG9mIHRoZSBzZXJ2aWNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGJhc2VVcmwpIHtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBkb3dubG9hZCB0aGUgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsT2JqIHRoZSBVUkwgdG8gZmV0Y2guXG4gICAgICovXG4gICAgcmVxdWVzdCh1cmxPYmosIGluaXQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkKHVybE9iai51cmwsIGluaXQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBkb3dubG9hZCB0aGUgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsT2JqIHRoZSBVUkwgdG8gZmV0Y2guXG4gICAgICovXG4gICAgcmVxdWVzdEJsb2IodXJsT2JqLCBpbml0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZEJsb2IodXJsT2JqLnVybCwgaW5pdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdEJ1aWxkZXIgPSBSZXF1ZXN0QnVpbGRlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51cGRhdGVTY2hlbWFQZXJtaXNzaW9uVXNpbmdQT1NUID0gZXhwb3J0cy5saXN0VXNpbmdHRVQgPSBleHBvcnRzLmdldFNjaGVtYVVzaW5nR0VUID0gZXhwb3J0cy5nZXREb2N1bWVudFVzaW5nR0VUID0gZXhwb3J0cy5kZWxldGVTY2hlbWFVc2luZ0RFTEVURSA9IGV4cG9ydHMucmVnaXN0ZXJBcnRpZmFjdFVzaW5nUFVUID0gZXhwb3J0cy5wdXRBcnRpZmFjdEZpbGVVc2luZ1BVVCA9IGV4cG9ydHMuZ2V0QXJ0aWZhY3RVc2luZ0dFVCA9IGV4cG9ydHMuZ2V0QXJ0aWZhY3RGaWxlVXNpbmdHRVQgPSBleHBvcnRzLmRlbGV0ZUZpbGVVc2luZ0RFTEVURSA9IGV4cG9ydHMuZGVsZXRlQXJ0aWZhY3RVc2luZ0RFTEVURSA9IHZvaWQgMDtcbi8qKlxuICogQXJ0aWZhY3QgU2VydmljZSB2MVxuICogTm8gZGVzY3JpcHRpb24gcHJvdmlkZWQgKGdlbmVyYXRlZCBieSBTd2FnZ2VyIENvZGVnZW4gaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbilcbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjFcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEFydGlmYWN0c0FwaVxuICovXG4vKipcbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ21vZGlmeVJlc291cmNlJyBmb3IgdGhlIGdpdmVuIEhSTlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZSBhIHNwZWNpZmljIGFydGlmYWN0XG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqL1xuZnVuY3Rpb24gZGVsZXRlQXJ0aWZhY3RVc2luZ0RFTEVURShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvYXJ0aWZhY3Qve2FydGlmYWN0SHJufVwiLnJlcGxhY2UoXCJ7YXJ0aWZhY3RIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhcnRpZmFjdEhyblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVBcnRpZmFjdFVzaW5nREVMRVRFID0gZGVsZXRlQXJ0aWZhY3RVc2luZ0RFTEVURTtcbi8qKlxuICogUmVxdWlyZXMgcGVybWlzc2lvbiB0byAnbW9kaWZ5UmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlIGEgc3BlY2lmaWMgYXJ0aWZhY3QgZmlsZVxuICogQHBhcmFtIGFydGlmYWN0SHJuIFRoZSBIUk4gb2YgdGhlIGFydGlmYWN0XG4gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIHBhdGggdG8gYXJ0aWZhY3QgZmlsZVxuICovXG5mdW5jdGlvbiBkZWxldGVGaWxlVXNpbmdERUxFVEUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2FydGlmYWN0L3thcnRpZmFjdEhybn0ve2ZpbGVOYW1lfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcInthcnRpZmFjdEhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFydGlmYWN0SHJuXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2ZpbGVOYW1lfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmlsZU5hbWVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlRmlsZVVzaW5nREVMRVRFID0gZGVsZXRlRmlsZVVzaW5nREVMRVRFO1xuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdyZWFkUmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOXG4gKlxuICogQHN1bW1hcnkgUmV0cmlldmUgYSBzcGVjaWZpYyBhcnRpZmFjdCBmaWxlXG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcGF0aCB0byBhcnRpZmFjdCBmaWxlXG4gKi9cbmZ1bmN0aW9uIGdldEFydGlmYWN0RmlsZVVzaW5nR0VUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9hcnRpZmFjdC97YXJ0aWZhY3RIcm59L3tmaWxlTmFtZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7YXJ0aWZhY3RIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhcnRpZmFjdEhyblwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntmaWxlTmFtZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImZpbGVOYW1lXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEFydGlmYWN0RmlsZVVzaW5nR0VUID0gZ2V0QXJ0aWZhY3RGaWxlVXNpbmdHRVQ7XG4vKipcbiAqIEBzdW1tYXJ5IGdldEFydGlmYWN0XG4gKiBAcGFyYW0gYXJ0aWZhY3RIcm4gVGhlIEhSTiBvZiB0aGUgYXJ0aWZhY3RcbiAqL1xuZnVuY3Rpb24gZ2V0QXJ0aWZhY3RVc2luZ0dFVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIve2FydGlmYWN0SHJufVwiLnJlcGxhY2UoXCJ7YXJ0aWZhY3RIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhcnRpZmFjdEhyblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0QXJ0aWZhY3RVc2luZ0dFVCA9IGdldEFydGlmYWN0VXNpbmdHRVQ7XG4vKipcbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ21vZGlmeVJlc291cmNlJyBmb3IgdGhlIGdpdmVuIEhSTlxuICpcbiAqIEBzdW1tYXJ5IENyZWF0ZSBvciB1cGRhdGUgYSBzcGVjaWZpYyBhcnRpZmFjdFxuICogQHBhcmFtIGFydGlmYWN0SHJuIFRoZSBIUk4gb2YgdGhlIGFydGlmYWN0XG4gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIHBhdGggdG8gYXJ0aWZhY3QgZmlsZVxuICogQHBhcmFtIGZpbGVcbiAqL1xuZnVuY3Rpb24gcHV0QXJ0aWZhY3RGaWxlVXNpbmdQVVQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2FydGlmYWN0L3thcnRpZmFjdEhybn0ve2ZpbGVOYW1lfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcInthcnRpZmFjdEhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFydGlmYWN0SHJuXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2ZpbGVOYW1lfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmlsZU5hbWVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiZmlsZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJmaWxlXCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wdXRBcnRpZmFjdEZpbGVVc2luZ1BVVCA9IHB1dEFydGlmYWN0RmlsZVVzaW5nUFVUO1xuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdhcGlBY2Nlc3MnXG4gKlxuICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBuZXcgZ3JvdXAgYW5kIGFydGlmYWN0XG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXBJZCBvZiB0aGUgYXJ0aWZhY3QuIFJldmVyc2VkIGludGVybmV0IGRvbWFpbiBuYW1lIHN1Y2ggYXMgY29tLmhlcmUucmliLnNjaGVtYVxuICogQHBhcmFtIGFydGlmYWN0SWQgVGhlIElEIG9mIHRoZSBhcnRpZmFjdFxuICogQHBhcmFtIHJlZ2lzdGVyUmVxdWVzdCBUaGUgcmVnaXN0ZXIgcmVxdWVzdFxuICovXG5mdW5jdGlvbiByZWdpc3RlckFydGlmYWN0VXNpbmdQVVQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2FydGlmYWN0L3JlZ2lzdGVyL3tncm91cElkfS97YXJ0aWZhY3RJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7YXJ0aWZhY3RJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFydGlmYWN0SWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wicmVnaXN0ZXJSZXF1ZXN0XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcInJlZ2lzdGVyUmVxdWVzdFwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVnaXN0ZXJBcnRpZmFjdFVzaW5nUFVUID0gcmVnaXN0ZXJBcnRpZmFjdFVzaW5nUFVUO1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2NoZW1hc0FwaVxuICovXG4vKipcbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ21vZGlmeVJlc291cmNlJyBmb3IgdGhlIGdpdmVuIEhSTlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZSBzY2hlbWFcbiAqIEBwYXJhbSBzY2hlbWFIcm4gVGhlIEhSTiBvZiB0aGUgc2NoZW1hXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVNjaGVtYVVzaW5nREVMRVRFKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9zY2hlbWEve3NjaGVtYUhybn1cIi5yZXBsYWNlKFwie3NjaGVtYUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInNjaGVtYUhyblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVTY2hlbWFVc2luZ0RFTEVURSA9IGRlbGV0ZVNjaGVtYVVzaW5nREVMRVRFO1xuLyoqXG4gKiBSZXF1aXJlcyBwZXJtaXNzaW9uIHRvICdyZWFkUmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOXG4gKlxuICogQHN1bW1hcnkgUmVzb2x2ZSBhIHNjaGVtYSBkb2MgdmFyaWFudCBVUkxcbiAqIEBwYXJhbSBzY2hlbWFIcm4gVGhlIEhSTiBvZiB0aGUgc2NoZW1hXG4gKiBAcGFyYW0gZmlsZSBUaGUgcGF0aCB0byBzY2hlbWEgZmlsZVxuICovXG5mdW5jdGlvbiBnZXREb2N1bWVudFVzaW5nR0VUKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9zY2hlbWEve3NjaGVtYUhybn0vZG9jL3tmaWxlfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntzY2hlbWFIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJzY2hlbWFIcm5cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZmlsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImZpbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RG9jdW1lbnRVc2luZ0dFVCA9IGdldERvY3VtZW50VXNpbmdHRVQ7XG4vKipcbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ3JlYWRSZXNvdXJjZScgZm9yIHRoZSBnaXZlbiBIUk5cbiAqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZSBzY2hlbWEgZGV0YWlsc1xuICogQHBhcmFtIHNjaGVtYUhybiBUaGUgSFJOIG9mIHRoZSBzY2hlbWFcbiAqL1xuZnVuY3Rpb24gZ2V0U2NoZW1hVXNpbmdHRVQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3NjaGVtYS97c2NoZW1hSHJufVwiLnJlcGxhY2UoXCJ7c2NoZW1hSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wic2NoZW1hSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFNjaGVtYVVzaW5nR0VUID0gZ2V0U2NoZW1hVXNpbmdHRVQ7XG4vKipcbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ2FwaUFjY2VzcydcbiAqXG4gKiBAc3VtbWFyeSBMaXN0IHRoZSBhdmFpbGFibGUgc2NoZW1hc1xuICogQHBhcmFtIHNvcnRcbiAqIEBwYXJhbSBvcmRlclxuICogQHBhcmFtIGZyb21cbiAqIEBwYXJhbSBsaW1pdFxuICovXG5mdW5jdGlvbiBsaXN0VXNpbmdHRVQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3NjaGVtYVwiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNvcnRcIiwgcGFyYW1zW1wic29ydFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJvcmRlclwiLCBwYXJhbXNbXCJvcmRlclwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmcm9tXCIsIHBhcmFtc1tcImZyb21cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxpc3RVc2luZ0dFVCA9IGxpc3RVc2luZ0dFVDtcbi8qKlxuICogUkVBRCBncmFudHMgJ3JlYWRSZXNvdXJjZScsIE1PRElGWSBncmFudHMgJ21vZGlmeVJlc291cmNlJywgU0hBUkUgZ3JhbnRzICdzaGFyZVJlc291cmNlJy5cbiAqIFJlcXVpcmVzIHBlcm1pc3Npb24gdG8gJ3NoYXJlUmVzb3VyY2UnIGZvciB0aGUgZ2l2ZW4gSFJOLlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZSBzY2hlbWEgcGVybWlzc2lvbnMgZm9yIHVzZXIgb24gdGhlIHNwZWNpZmllZCBzY2hlbWEgYW5kIGFzc29jaWF0ZWQgYXJ0aWZhY3QuXG4gKiBAcGFyYW0gc2NoZW1hSHJuIFRoZSBIUk4gb2YgdGhlIHNjaGVtYVxuICogQHBhcmFtIHVwZGF0ZVBlcm1pc3Npb25SZXF1ZXN0IFRoZSBwZXJtaXNzaW9uIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gdXBkYXRlU2NoZW1hUGVybWlzc2lvblVzaW5nUE9TVChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvc2NoZW1hL3tzY2hlbWFIcm59L3Blcm1pc3Npb25cIi5yZXBsYWNlKFwie3NjaGVtYUhybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInNjaGVtYUhyblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1widXBkYXRlUGVybWlzc2lvblJlcXVlc3RcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1widXBkYXRlUGVybWlzc2lvblJlcXVlc3RcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnVwZGF0ZVNjaGVtYVBlcm1pc3Npb25Vc2luZ1BPU1QgPSB1cGRhdGVTY2hlbWFQZXJtaXNzaW9uVXNpbmdQT1NUO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDIwIEhFUkUgRXVyb3BlIEIuVi4gYW5kIGl0cyBhZmZpbGlhdGUocykuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBjb250YWluIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uXG4gKiBjb250cm9sbGVkIGJ5IEhFUkUgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGVnaXNsYXRpb24uXG4gKiBBbnkgdXNlIGFuZCB1dGlsaXphdGlvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgYW5kXG4gKiBkaXNjbG9zdXJlIHRvIGFueSB0aGlyZCBwYXJ0aWVzIGlzIGNvbmRpdGlvbmFsIHVwb24gaGF2aW5nIGEgc2VwYXJhdGVcbiAqIGFncmVlbWVudCB3aXRoIEhFUkUgZm9yIHRoZSBhY2Nlc3MsIHVzZSwgdXRpbGl6YXRpb24gb3IgZGlzY2xvc3VyZSBvZiB0aGlzXG4gKiBzb2Z0d2FyZS4gSW4gdGhlIGFic2VuY2Ugb2Ygc3VjaCBhZ3JlZW1lbnQsIHRoZSB1c2Ugb2YgdGhlIHNvZnR3YXJlIGlzIG5vdFxuICogYWxsb3dlZC5cbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFJlc291cmNlVHlwZUFjdGlvbkxpc3QgPSBleHBvcnRzLmdldFJlc291cmNlQWN0aW9uc0ZvclByb2plY3QgPSBleHBvcnRzLnVwZGF0ZVByb2plY3RQb2xpY3kgPSBleHBvcnRzLnNldEF0dGFjaGVkUHJvamVjdFBvbGljaWVzVG9NZW1iZXIgPSBleHBvcnRzLmdldFByb2plY3RQb2xpY3lMaXN0ID0gZXhwb3J0cy5nZXRQcm9qZWN0UG9saWN5ID0gZXhwb3J0cy5nZXRBdHRhY2hlZFByb2plY3RQb2xpY3lGb3JNZW1iZXIgPSBleHBvcnRzLmdldEF0dGFjaGVkUHJvamVjdFBvbGljaWVzRm9yTWVtYmVyID0gZXhwb3J0cy5nZXRBbGxQcm9qZWN0TWVtYmVyc1dpdGhBdHRhY2hlZFBvbGljeSA9IGV4cG9ydHMuZGV0YWNoUHJvamVjdFBvbGljeUZyb21NZW1iZXIgPSBleHBvcnRzLmRlbGV0ZVByb2plY3RQb2xpY3kgPSBleHBvcnRzLmNyZWF0ZVByb2plY3RQb2xpY3kgPSBleHBvcnRzLmF0dGFjaFByb2plY3RQb2xpY3lUb01lbWJlciA9IGV4cG9ydHMudXBkYXRlUmVzb3VyY2VMaW5rYWJpbGl0eSA9IGV4cG9ydHMucmVtb3ZlUmVzb3VyY2VMaW5rYWJpbGl0eSA9IGV4cG9ydHMubWFrZVJlc291cmNlTGlua2FibGUgPSBleHBvcnRzLmxpc3RSZWFsbVJlc291cmNlcyA9IGV4cG9ydHMuZ2V0UmVzb3VyY2VzID0gZXhwb3J0cy5nZXRSZXNvdXJjZVByb2plY3RzID0gZXhwb3J0cy5nZXRSZXNvdXJjZUxpbmthYmlsaXR5ID0gZXhwb3J0cy5nZXRSZXNvdXJjZSA9IGV4cG9ydHMuZ2V0TGlzdE9mV2F5c1Jlc291cmNlSXNMaW5rYWJsZSA9IGV4cG9ydHMucGF0Y2hQcm9qZWN0ID0gZXhwb3J0cy5saXN0UHJvamVjdFJlc291cmNlcyA9IGV4cG9ydHMubGlzdFByb2plY3RNZW1iZXJzID0gZXhwb3J0cy5sZWF2ZVByb2plY3QgPSBleHBvcnRzLmdldFByb2plY3RSZXNvdXJjZSA9IGV4cG9ydHMuZ2V0UHJvamVjdE1lbWJlciA9IGV4cG9ydHMuZ2V0UHJvamVjdExpc3QgPSBleHBvcnRzLmdldFByb2plY3QgPSBleHBvcnRzLmdldEFsbFByb2plY3RMaXN0ID0gZXhwb3J0cy5kZWxldGVQcm9qZWN0UmVzb3VyY2VSZWZlcmVuY2UgPSBleHBvcnRzLmRlbGV0ZVByb2plY3RNZW1iZXIgPSBleHBvcnRzLmRlbGV0ZVByb2plY3QgPSBleHBvcnRzLmNyZWF0ZVByb2plY3QgPSBleHBvcnRzLmNoZWNrUHJvamVjdEV4aXN0YW5jZSA9IGV4cG9ydHMuYWRkUHJvamVjdFJlc291cmNlUmVsYXRpb24gPSBleHBvcnRzLmFkZFByb2plY3RNZW1iZXIgPSBleHBvcnRzLnVwZGF0ZUdyb3VwID0gZXhwb3J0cy5yZW1vdmVHcm91cE1lbWJlciA9IGV4cG9ydHMubGVhdmVHcm91cCA9IGV4cG9ydHMuZ2V0TXlHcm91cHMgPSBleHBvcnRzLmdldEdyb3VwcyA9IGV4cG9ydHMuZ2V0R3JvdXBSb2xlcyA9IGV4cG9ydHMuZ2V0R3JvdXBNZW1iZXJzID0gZXhwb3J0cy5nZXRHcm91cE1lbWJlciA9IGV4cG9ydHMuZ2V0R3JvdXAgPSBleHBvcnRzLmRlbGV0ZUdyb3VwID0gZXhwb3J0cy5jcmVhdGVHcm91cCA9IGV4cG9ydHMuYWRkR3JvdXBNZW1iZXIgPSBleHBvcnRzLmdldFJvbGVzID0gZXhwb3J0cy5nZXRSb2xlUGVybWlzc2lvbnMgPSBleHBvcnRzLmdldFJvbGVQZXJtaXNzaW9uID0gZXhwb3J0cy5nZXRSb2xlRW50aXR5ID0gZXhwb3J0cy5nZXRSb2xlRW50aXRpZXMgPSBleHBvcnRzLmdldFJvbGUgPSBleHBvcnRzLmdldE15Um9sZXMgPSBleHBvcnRzLmRlbGV0ZVJvbGVFbnRpdHkgPSBleHBvcnRzLmFkZFJvbGVFbnRpdHkgPSBleHBvcnRzLnJlbW92ZUdyYW50ID0gZXhwb3J0cy5saXN0R3JhbnRzID0gZXhwb3J0cy5nZXRHcmFudHMgPSBleHBvcnRzLmdldEdyYW50ID0gZXhwb3J0cy5hZGRHcmFudCA9IGV4cG9ydHMuc2VhcmNoUmVhbG1NZW1iZXJJbnZpdGVzID0gZXhwb3J0cy5yZXNlbmRSZWFsbU1lbWJlckludml0ZSA9IGV4cG9ydHMuY3JlYXRlUmVhbG1NZW1iZXJJbnZpdGUgPSBleHBvcnRzLmNhbmNlbFJlYWxtTWVtYmVySW52aXRlID0gZXhwb3J0cy5nZXRSZWFsbU1lbWJlcnMgPSBleHBvcnRzLmdldFJlYWxtTWVtYmVyID0gZXhwb3J0cy5nZXRFbnRpdHlNYW5hZ2VkR3JvdXBzID0gZXhwb3J0cy5nZXRFbnRpdHlHcm91cE1lbWJlcnNoaXAgPSB2b2lkIDA7XG4vKipcbiAqIEF1dGhvcml6YXRpb24gQVBJIHYxLjFcbiAqICAgVGhpcyBzcGVjaWZpY2F0aW9uIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHRoZSBBdXRob3JpemF0aW9uIHYxLjEgQVBJc1xuICpcbiAqICAgT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMS4wXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qKlxuICogUmV0cmlldmUgdGhlIGdyb3VwcyBhIGdpdmVuIGVudGl0eSBpcyBhIG1lbWJlciBvZi4gUmVzdHJpY3Rpb25zOlxuICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRHcm91cHMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGVudGl0eS5cbiAqXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGdyb3VwcyBhIHVzZXIsIEhFUkUtNGJhOWFjYTMtZmRmOS00Y2FkLWEzZGEtNTM0NDk0ZDYxOThmLCBpcyBhIG1lbWJlciBvZixcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiBcImFjdGlvblwiIDogXCJyZWFkR3JvdXBzXCJcbiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTp1c2VyL0hFUkUtNGJhOWFjYTMtZmRmOS00Y2FkLWEzZGEtNTM0NDk0ZDYxOThmXCJcbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3RcbiAqXG4gKiBAc3VtbWFyeSBHZXQgZW50aXR5IGdyb3VwIG1lbWJlcnNoaXBcbiAqIEBwYXJhbSByZWFsbSBIUk4gaWRlbnRpZnlpbmcgdGhlIHJlYWxtXG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyBncm91cCBvciByZWFsbSBtZW1iZXJcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRFbnRpdHlHcm91cE1lbWJlcnNoaXAoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L21lbWJlcnMve21lbWJlcn0vZ3JvdXBzXCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RW50aXR5R3JvdXBNZW1iZXJzaGlwID0gZ2V0RW50aXR5R3JvdXBNZW1iZXJzaGlwO1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBncm91cHMgb3ZlciB3aGljaCB0aGUgcHJvdmlkZWQgZW50aXR5IGhhcyBiZWVuIGdyYW50ZWQgdGhlIHJvbGUgb2YgR3JvdXBBZG1pbi5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRHcm91cHMqKiBhY3Rpb24gYWdhaW5zdFxuICogdGhlIHNwZWNpZmllZCBlbnRpdHkuXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGdyb3VwcyBhIHVzZXIsIEhFUkUtNGJhOWFjYTMtZmRmOS00Y2FkLWEzZGEtNTM0NDk0ZDYxOThmLFxuICogaXMgYW4gYWRtaW4gb2YsIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRHcm91cHNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06dXNlci9IRVJFLTRiYTlhY2EzLWZkZjktNGNhZC1hM2RhLTUzNDQ5NGQ2MTk4ZlwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGVudGl0eSBtYW5hZ2VkIGdyb3VwXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgZ3JvdXAgb3IgcmVhbG0gbWVtYmVyXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqL1xuZnVuY3Rpb24gZ2V0RW50aXR5TWFuYWdlZEdyb3VwcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vbWVtYmVycy97bWVtYmVyfS9tYW5hZ2VkR3JvdXBzXCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RW50aXR5TWFuYWdlZEdyb3VwcyA9IGdldEVudGl0eU1hbmFnZWRHcm91cHM7XG4vKipcbiAqIFJldHJpZXZlIHRoZSB1c2VyIG9yIGFwcGxpY2F0aW9uIGRldGFpbHMgb2YgdGhlIG1lbWJlciBkZWZpbmVkIGJ5IG1lbWJlcklkLiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0XG4gKiB0aGUgc3BlY2lmaWVkIHJlYWxtLlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIHJldHJpZXZlIGEgbWVtYmVyIG9mIHRoZSByZWFsbSwgX015UmVhbG1fLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nXG4gKiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHJlYWxtIG1lbWJlclxuICogQHBhcmFtIHJlYWxtIEhSTiBpZGVudGlmeWluZyB0aGUgcmVhbG1cbiAqIEBwYXJhbSBtZW1iZXIgSFJOIGlkZW50aWZ5aW5nIGdyb3VwIG9yIHJlYWxtIG1lbWJlclxuICovXG5mdW5jdGlvbiBnZXRSZWFsbU1lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntyZWFsbX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlYWxtXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRSZWFsbU1lbWJlciA9IGdldFJlYWxtTWVtYmVyO1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBtZW1iZXJzIHdpdGhpbiB0aGUgcmVhbG0uIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRNZW1iZXJzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gbGlzdCB0aGUgbWVtYmVycyBvZiB0aGUgcmVhbG0sIF9NeVJlYWxtXyxcbiAqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCByZWFsbSBtZW1iZXJzXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdHlwZSBvZiBtZW1iZXJzIHRvIHJldHVybiBpbiB0aGUgcmVzdWx0LlxuICogT25lIG9mICd1c2VyJyBvciAnYXBwJy4gICBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhbGwgZW50aXR5IHR5cGVzIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gcSBBIGZyZWUgdGV4dCBxdWVyeSBzdHJpbmcgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuXG4gKiBBIHNlYXJjaCBhZ2FpbnN0IG1lbWJlcnMgaW4gdGhlIHJlYWxtIHdpbGwgY29uc2lkZXIgdGhlXG4gKiAndXNlcklkJyxcbiAqICdmaXJzdG5hbWUnLFxuICogJ2xhc3RuYW1lJyxcbiAqICdlbWFpbCcsXG4gKiAnY2xpZW50SWQnLFxuICogJ25hbWUnIGFuZCAncm9sZXMnIGZpZWxkcyBvZiB0aGUgbWVtYmVycy5cbiAqIFRoZSBwcmVjaXNlIHNlYXJjaCBhbGdvcml0aG0gdXNlZCB0byBtYXRjaCBtZW1iZXJzIGlzIG5vdCBzcGVjaWZpZWQsXG4gKiBidXQgZ2VuZXJhbGx5IGFueSBtZW1iZXIgd2hlcmUgb25lIG9mIHRoZSBjb25zaWRlcmVkIGZpZWxkcyBoYXMgYSBmdWxsIG9yIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLlxuICogQHBhcmFtIHN0YXRlIE9ubHkgcmV0dXJuIHVzZXIgbWVtYmVycyB3aXRoIHRoZSBnaXZlbiAnc3RhdGUnIGluIHRoZSByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBnZXRSZWFsbU1lbWJlcnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L21lbWJlcnNcIi5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImVudGl0eVR5cGVcIiwgcGFyYW1zW1wiZW50aXR5VHlwZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJxXCIsIHBhcmFtc1tcInFcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhdGVcIiwgcGFyYW1zW1wic3RhdGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlYWxtTWVtYmVycyA9IGdldFJlYWxtTWVtYmVycztcbi8qKlxuICogQ2FuY2VsIGFuIGludml0YXRpb24gdG8gdGhlIHJlYWxtLiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VJbnZpdGVzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVhbG0uXG4gKiBAZXhhbXBsZTogSW4gb3JkZXIgdG8gZGVsZXRlIGFuIGludml0YXRpb24gdG8gdGhlIHJlYWxtLFxuICogX015UmVhbG1fLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VJbnZpdGVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IENhbmNlbCBhIHVzZXIgaW52aXRhdGlvbiB0byBhIHJlYWxtXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIGludml0ZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiBpbnZpdGUuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbFJlYWxtTWVtYmVySW52aXRlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZWFsbXMve3JlYWxtfS9pbnZpdGVzL3tpbnZpdGV9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7aW52aXRlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiaW52aXRlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jYW5jZWxSZWFsbU1lbWJlckludml0ZSA9IGNhbmNlbFJlYWxtTWVtYmVySW52aXRlO1xuLyoqXG4gKiBDcmVhdGUgYW5kIHNlbmQgYW4gaW52aXRhdGlvbiB0byBhZGQgYSBuZXcgbWVtYmVyIHRvIHRoZSByZWFsbSxcbiAqIG9wdGlvbmFsbHkgYXNzaWduIG1lbWJlcnNoaXAgdG8gb25lIG9yIG1vcmUgZ3JvdXBzIGlmIHRoZSBJbnZpdGVyIGlzIGFsc28gYSAqKkdyb3VwQWRtaW4qKlxuICogZm9yIHRoZSBncm91cC4gUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlXG4gKiAqKm1hbmFnZUludml0ZXMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlYWxtLlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIGludml0ZSBhIG5ldyB1c2VyIHRvIHRoZSByZWFsbSwgX015UmVhbG1fLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlSW52aXRlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqIEBleGFtcGxlOiBJbiBvcmRlciB0byBpbnZpdGUgYSBuZXcgdXNlciB0byB0aGUgcmVhbG0sIF9NeVJlYWxtXyxcbiAqIGFzIGEgbWVtYmVyIG9mIHRoZSBncm91cCBHUk9VUC1hM2RlZTJmZS1mYjM4LTQxODMtYjY4Ni0xNGZkZWE1OTY0YzAsXG4gKiB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb25zIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VJbnZpdGVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmdyb3VwL0dST1VQLWEzZGVlMmZlLWZiMzgtNDE4My1iNjg2LTE0ZmRlYTU5NjRjXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBDcmVhdGUgYW5kIHNlbmQgYSB1c2VyIGludml0YXRpb24gZm9yIGEgcmVhbG1cbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICovXG5mdW5jdGlvbiBjcmVhdGVSZWFsbU1lbWJlckludml0ZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG1zL3tyZWFsbX0vaW52aXRlc1wiLnJlcGxhY2UoXCJ7cmVhbG19XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZWFsbVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVSZWFsbU1lbWJlckludml0ZSA9IGNyZWF0ZVJlYWxtTWVtYmVySW52aXRlO1xuLyoqXG4gKiBSZXNlbmQgYW4gaW52aXRhdGlvbiB0byBhIG5ldyBtZW1iZXIgdG8gdGhlIHJlYWxtLlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlSW52aXRlcyoqXG4gKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlYWxtLlxuICpcbiAqIEBleGFtcGxlOiBJbiBvcmRlciB0byByZXNlbmQgYW4gaW52aXRlIHRvIGEgbmV3IHVzZXIgdG8gdGhlIHJlYWxtLCBfTXlSZWFsbV8sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VJbnZpdGVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFJlc2VuZCBhbiBpbnZpdGF0aW9uIHRvIGEgdXNlciBpbiBhIHJlYWxtXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIGludml0ZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiBpbnZpdGUuXG4gKi9cbmZ1bmN0aW9uIHJlc2VuZFJlYWxtTWVtYmVySW52aXRlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZWFsbXMve3JlYWxtfS9pbnZpdGVzL3tpbnZpdGV9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7aW52aXRlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiaW52aXRlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVzZW5kUmVhbG1NZW1iZXJJbnZpdGUgPSByZXNlbmRSZWFsbU1lbWJlckludml0ZTtcbi8qKlxuICogU2VhcmNoIGZvciBpbnZpdGF0aW9ucyBpbiB0aGUgcmVhbG0sIG9wdGlvbmFsbHkgcHJvdmlkaW5nIGEgZ3JvdXAuXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VJbnZpdGVzKipcbiAqIGFjdGlvbiBhZ2FpbnN0IHRoZSByZWFsbSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgcGFydHkuXG4gKlxuICogQGV4YW1wbGU6IEluIG9yZGVyIHRvIGxpc3QgdGhlIGludml0YXRpb25zIHdpdGhpbiB0aGUgY2FsbGluZyBwYXJ0eSdzIHJlYWxtIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZUludml0ZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgU2VhcmNoIGZvciBpbnZpdGF0aW9ucyBpbiBhIHJlYWxtXG4gKiBAcGFyYW0gcmVhbG0gSFJOIGlkZW50aWZ5aW5nIHRoZSByZWFsbVxuICogQHBhcmFtIGdyb3VwIEhSTiBpZGVuaXRpZnlpbmcgdGhlIGdyb3VwIHRvIHNlYXJjaC5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICogQHBhcmFtIHEgQSBmcmVlIHRleHQgcXVlcnkgc3RyaW5nIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRzLlxuICogQSBzZWFyY2ggYWdhaW5zdCBpbnZpdGVzIGluIHRoZSByZWFsbSB3aWxsIGNvbnNpZGVyIHRoZSAnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgYW5kICdlbWFpbEFkZHJlc3MnIGZpZWxkcyBvZiB0aGUgaW52aXRlcy5cbiAqIFRoZSBwcmVjaXNlIHNlYXJjaCBhbGdvcml0aG0gdXNlZCB0byBtYXRjaCBpbnZpdGVzIGlzIG5vdCBzcGVjaWZpZWQsIGJ1dCBnZW5lcmFsbHkgYW55IGludml0ZSB3aGVyZSBvbmVcbiAqIG9mIHRoZSBjb25zaWRlcmVkIGZpZWxkcyBoYXMgYSBmdWxsIG9yIHBhcnRpYWwgbWF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBzZWFyY2hSZWFsbU1lbWJlckludml0ZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3JlYWxtcy97cmVhbG19L2ludml0ZXNcIi5yZXBsYWNlKFwie3JlYWxtfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVhbG1cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJncm91cFwiLCBwYXJhbXNbXCJncm91cFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInFcIiwgcGFyYW1zW1wicVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc2VhcmNoUmVhbG1NZW1iZXJJbnZpdGVzID0gc2VhcmNoUmVhbG1NZW1iZXJJbnZpdGVzO1xuLyoqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHcmFudHNBcGlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBHcmFudCBhY2Nlc3MgdG8gYSByZXNvdXJjZSB0byBhbiBlbnRpdHkuXG4gKiBUaGUgcmVzdWx0IG9mIHRoaXMgY2FsbCBpcyB0aGF0IHRoZSBzcGVjaWZpZWQgZW50aXR5IHdpbGwgaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlIHNwZWNpZmllZCBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgcmVhbG0gb2YgdGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIG1hdGNoIHRoZSByZWFsbSBvZiB0aGUgcmVxdWVzdGVkIGVudGl0eS5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKmFkZEdyYW50OnthY3Rpb25JZH0qKiBPUiAqKnNoYXJlKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gYWRkIGEgZ3JhbnQgZm9yIHRoZSAqKnJlYWRSZXNvdXJjZSoqIGFjdGlvbiBhZ2FpbnN0IHJlc291cmNlICoqaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nKiogYSBwZXJtaXNzaW9uXG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcImFkZEdyYW50OnJlYWRSZXNvdXJjZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqIE9SXG4gKiAqIFwiYWN0aW9uXCIgOiBcInNoYXJlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdyYW50IGFjY2VzcyB0byBhIHJlc291cmNlIHRvIGFuIGVudGl0eS5cbiAqIEBwYXJhbSByZXNvdXJjZUhybiBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSBlbnRpdHlJZCBUaGUgdGFyZ2V0IGVudGl0eUlkIHRvIGdyYW50IGFjY2VzcyB0b1xuICogQHBhcmFtIGFjdGlvbklkIFRoZSBhY3Rpb24gdG8gYXNzaWduIGFzIGFsbG93ZWQgYWdhaW5zdCB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgdG8gZ3JhbnQgYWNjZXNzIHRvLiAgTXVzdCBiZSBvbmUgb2YgdXNlciwgYXBwLCBvciBncm91cFxuICovXG5mdW5jdGlvbiBhZGRHcmFudChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JhbnRzL3Jlc291cmNlcy97cmVzb3VyY2VIcm59L2VudGl0aWVzL3tlbnRpdHlJZH0vYWN0aW9ucy97YWN0aW9uSWR9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VIcm5cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZW50aXR5SWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJlbnRpdHlJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInthY3Rpb25JZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFjdGlvbklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuYWRkR3JhbnQgPSBhZGRHcmFudDtcbi8qKlxuICogR2V0IGEgc2luZ2xlIGdyYW50IGdpdmVuIHRvIGFuIGVudGl0eS5cbiAqIFRoaXMgY2FsbHMgcmV0dXJucyBhbnkgcGVybWlzc2lvbiB0byB0YWtlIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBvbiB0aGUgcmVxdWVzdGVkIGVudGl0eS5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIHJlYWxtIG9mIHRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBtYXRjaCB0aGUgcmVhbG0gb2YgdGhlIHJlcXVlc3RlZCBhcHAuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipsaXN0R3JhbnRzKiogT1IgKipzaGFyZSoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiAqIEluIG9yZGVyIHRvIGdldCBhIGdyYW50IGFnYWluc3QgcmVzb3VyY2UgKipocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2cqKlxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibGlzdEdyYW50c1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqIE9SXG4gKiAqIFwiYWN0aW9uXCIgOiBcInNoYXJlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBhIHNpbmdsZSBncmFudCBnaXZlbiB0byBhbiBlbnRpdHlcbiAqIEBwYXJhbSByZXNvdXJjZUhybiBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSBlbnRpdHlJZCBUaGUgdGFyZ2V0IGVudGl0eUlkIHRvIGdldCB0aGUgZ3JhbnQgb2ZcbiAqIEBwYXJhbSBhY3Rpb25JZCBUaGUgYWN0aW9uIG9mIHRoZSBncmFudFxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHR5cGUgb2YgdGhlIGVudGl0eSB0byBnZXQgdGhlIGdyYW50IG9mLiAgTXVzdCBiZSBvbmUgb2YgdXNlciwgYXBwLCBvciBncm91cFxuICovXG5mdW5jdGlvbiBnZXRHcmFudChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JhbnRzL3Jlc291cmNlcy97cmVzb3VyY2VIcm59L2VudGl0aWVzL3tlbnRpdHlJZH0vYWN0aW9ucy97YWN0aW9uSWR9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VIcm5cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZW50aXR5SWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJlbnRpdHlJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInthY3Rpb25JZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFjdGlvbklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRHcmFudCA9IGdldEdyYW50O1xuLyoqXG4gKiBHZXQgZ3JhbnRzLiBUaGlzIGNhbGwgZGVzY3JpYmVzIHRoZSBwZXJtaXNzaW9ucyBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWVkIGVudGl0eSB0aGF0IGdyYW50IGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIHJlYWxtIG9mIHRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBtYXRjaCB0aGUgcmVhbG0gb2YgdGhlIHJlcXVlc3RlZCBlbnRpdHkuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipsaXN0R3JhbnRzKiogT1IgKipzaGFyZSoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBnZXQgZ3JhbnRzIGFnYWluc3QgcmVzb3VyY2UgKipocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2cqKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJsaXN0R3JhbnRzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogT1JcbiAqICogXCJhY3Rpb25cIiA6IFwic2hhcmVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGdyYW50cyBnaXZlbiB0byBhIHVzZXIsIGFwcCwgb3IgZ3JvdXBcbiAqIEBwYXJhbSByZXNvdXJjZUhybiBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSBlbnRpdHlJZCBUaGUgZW50aXR5SWQgdG8gZ2V0IHRoZSBncmFudHMgb2ZcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgcmVxdWVzdGVkLiAgTXVzdCBiZSBvbmUgb2YgdXNlciwgYXBwLCBvciBncm91cFxuICovXG5mdW5jdGlvbiBnZXRHcmFudHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyYW50cy9yZXNvdXJjZXMve3Jlc291cmNlSHJufS9lbnRpdGllcy97ZW50aXR5SWR9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VIcm5cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZW50aXR5SWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJlbnRpdHlJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImVudGl0eVR5cGVcIiwgcGFyYW1zW1wiZW50aXR5VHlwZVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0R3JhbnRzID0gZ2V0R3JhbnRzO1xuLyoqXG4gKiBMaXN0IGdyYW50cyBvbiB1c2VyLCBhcHBzLCBvciBncm91cHMuXG4gKiBUaGlzIGNhbGwgZGVzY3JpYmVzIHRoZSBwZXJtaXNzaW9ucyBhc3NpZ25lZCB0byBhbnkgdXNlciwgYXBwLCBvciBncm91cCAqKmluIHRoZSBzYW1lIHJlYWxtIGFzIHRoZSBjYWxsaW5nIHByaW5jaXBhbCoqXG4gKiB0aGF0IGhhcyBiZWVuIGdyYW50ZWQgYWNjZXNzIHRvIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdGhyb3VnaCBhbiBleGFjdCBtYXRjaGluZyBwZXJtaXNzaW9uLlxuICogUGVybWlzc2lvbnMgZ3JhbnRlZCB0aHJvdWdoIHBvbGljaWVzIGFuZCByb2xlcyBhcmUgbm90IGluY2x1ZGVkLlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbGlzdEdyYW50cyoqIE9SICoqc2hhcmUqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbGlzdCBncmFudHMgYWdhaW5zdCByZXNvdXJjZSAqKmhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZyoqIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcImxpc3RHcmFudHNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiBPUlxuICogKiBcImFjdGlvblwiIDogXCJzaGFyZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6Om15LXNoYXJlZC1jYXRhbG9nXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBMaXN0IGdyYW50cyBvbiB1c2VycywgYXBwcywgb3IgZ3JvdXBzXG4gKiBAcGFyYW0gcmVzb3VyY2VIcm4gVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBSZXN0cmljdCB0byBvbmx5IHRoaXMgdHlwZSBvZiBlbnRpdHkgIGluIHRoZSByZXNwb25zZS4gIE11c3QgYmUgb25lIG9mIHVzZXIsIGFwcCwgb3IgZ3JvdXBcbiAqIEBwYXJhbSBwYWdlVG9rZW4gV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuICdjb3VudCcgdG90YWwgcmVjb3JkcywgdXNlIHRoZSBwYWdlVG9rZW4gZnJvbSB0aGUgcHJldmlvdXMgcGFnZSB0byByZXRyaWV2ZSB0aGUgbmV4dCBwYWdlXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuXG4gKi9cbmZ1bmN0aW9uIGxpc3RHcmFudHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyYW50cy9yZXNvdXJjZXMve3Jlc291cmNlSHJufS9lbnRpdGllc1wiLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImVudGl0eVR5cGVcIiwgcGFyYW1zW1wiZW50aXR5VHlwZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5saXN0R3JhbnRzID0gbGlzdEdyYW50cztcbi8qKlxuICogUmV2b2tlIGFjY2VzcyB0byBhIHJlc291cmNlIGZyb20gYW4gZW50aXR5LlxuICogVGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgaXMgdGhhdCB0aGUgc3BlY2lmaWVkIGVudGl0eSB3aWxsIGhhdmUgYW55IGRpcmVjdGx5IGFzc2lnbmVkIHBlcm1pc3Npb25cbiAqIHRvIHRha2UgdGhlIHNwZWNpZmllZCBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHJlbW92ZWQuXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgcmVhbG0gb2YgdGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIG1hdGNoIHRoZSByZWFsbSBvZiB0aGUgcmVxdWVzdGVkIGFwcC5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlbW92ZUdyYW50OnthY3Rpb25JZH0qKlxuICogT1IgKipzaGFyZSoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byByZW1vdmUgYSBncmFudCBmb3IgdGhlICoqcmVhZFJlc291cmNlKiogYWN0aW9uIGFnYWluc3QgcmVzb3VyY2UgKipocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2cqKlxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVtb3ZlR3JhbnQ6cmVhZFJlc291cmNlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjo6bXktc2hhcmVkLWNhdGFsb2dcIlxuICogT1JcbiAqICogXCJhY3Rpb25cIiA6IFwic2hhcmVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6OjpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmV2b2tlIGFjY2VzcyB0byBhIHJlc291cmNlIGZyb20gYW4gZW50aXR5XG4gKiBAcGFyYW0gcmVzb3VyY2VIcm4gVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlXG4gKiBAcGFyYW0gZW50aXR5SWQgVGhlIHRhcmdldCBlbnRpdHlJZCB0byByZXZva2UgYWNjZXNzIGZyb21cbiAqIEBwYXJhbSBhY3Rpb25JZCBUaGUgYWN0aW9uIGFnYWluc3QgdGhlIHJlc291cmNlIHRvIHJldm9rZSBhY2Nlc3MgZnJvbVxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHR5cGUgb2YgdGhlIGVudGl0eSB0byByZXZva2UgYWNjZXNzIGZyb20uICBNdXN0IGJlIG9uZSBvZiB1c2VyLCBhcHAsIG9yIGdyb3VwXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUdyYW50KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncmFudHMvcmVzb3VyY2VzL3tyZXNvdXJjZUhybn0vZW50aXRpZXMve2VudGl0eUlkfS9hY3Rpb25zL3thY3Rpb25JZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2VIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZUhyblwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntlbnRpdHlJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eUlkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2FjdGlvbklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiYWN0aW9uSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbnRpdHlUeXBlXCIsIHBhcmFtc1tcImVudGl0eVR5cGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZW1vdmVHcmFudCA9IHJlbW92ZUdyYW50O1xuLyoqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSb2xlc0FwaVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEFzc2lnbiB0aGUgcm9sZSBwcm92aWRlZCB0byB0aGUgZ2l2ZW4gZW50aXR5LlxuICogSWYgdGhlIHByb3ZpZGVkIHJvbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZ3JvdXAsIHRoZSBlbnRpdHkgYmVpbmcgYXNzaWduZWQgdGhlIHJvbGUgbXVzdCBiZSBhIG1lbWJlciBvZiB0aGUgYXNzb2NpYXRlZCBncm91cC5cbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZUVudGl0aWVzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByb2xlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBhc3NpZ24gdGhlIHJvbGUsIF9Hcm91cEFkbWluXywgdG8gYW4gZW50aXR5IGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGRcbiAqIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VFbnRpdGllc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpyb2xlL1JPTEUtYzE2NjIxMzgtYTE3MC00MjY0LWJhMTgtN2I1MDZhNzA4YzM3XCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBBc3NpZ24gYSByb2xlIHRvIGFuIGVudGl0eVxuICogQHBhcmFtIHJvbGUgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gcm9sZVxuICogQHBhcmFtIGVudGl0eSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiBlbnRpdHlcbiAqL1xuZnVuY3Rpb24gYWRkUm9sZUVudGl0eShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXMve3JvbGV9L2VudGl0aWVzL3tlbnRpdHl9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3JvbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyb2xlXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2VudGl0eX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmFkZFJvbGVFbnRpdHkgPSBhZGRSb2xlRW50aXR5O1xuLyoqXG4gKiBSZW1vdmUgdGhlIHJvbGUgcHJvdmlkZWQgdG8gZnJvbSB0aGUgZ2l2ZW4gbWVtYmVyLlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlRW50aXRpZXMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIHJldm9rZSB0aGUgcm9sZSwgX0dyb3VwQWRtaW5fLCBmcm9tIGFuIGVudGl0eSBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VFbnRpdGllc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpyb2xlL1JPTEUtYzE2NjIxMzgtYTE3MC00MjY0LWJhMTgtN2I1MDZhNzA4YzM3XCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBSZXZva2UgYSByb2xlIGZyb20gYW4gZW50aXR5XG4gKiBAcGFyYW0gcm9sZSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiByb2xlXG4gKiBAcGFyYW0gZW50aXR5IEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIGVudGl0eVxuICovXG5mdW5jdGlvbiBkZWxldGVSb2xlRW50aXR5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy97cm9sZX0vZW50aXRpZXMve2VudGl0eX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cm9sZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJvbGVcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZW50aXR5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZW50aXR5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVSb2xlRW50aXR5ID0gZGVsZXRlUm9sZUVudGl0eTtcbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2Ygcm9sZXMgd2hpY2ggaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIHRoZSBjYWxsaW5nIHBhcnR5LlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgTXkgUm9sZXNcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRNeVJvbGVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yb2xlcy9tZVwiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldE15Um9sZXMgPSBnZXRNeVJvbGVzO1xuLyoqXG4gKiBHZXQgdGhlIHJvbGUgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgUm9sZSBIUk4uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZFJvbGVzKiogYWN0aW9uIGFnYWluc3QgdGhlIHNwZWNpZmllZCByZWFsbS5cbiAqXG4gKiAgRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJldHJpZXZlIGEgcm9sZSB3aXRoaW4gdGhlIHJlYWxtLCBfTXlSZWFsbV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkUm9sZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmFjY291bnQ6Om15cmVhbG06cmVhbG0vbXlyZWFsbVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IFJvbGVcbiAqIEBwYXJhbSByb2xlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIHJvbGVcbiAqL1xuZnVuY3Rpb24gZ2V0Um9sZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXMve3JvbGV9XCIucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRSb2xlID0gZ2V0Um9sZTtcbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZW50aXRpZXMgd2hpY2ggaGF2ZSBiZWVuIGFzc2lnbmVkIHRoZSByb2xlIGFzIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIHJvbGUgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRFbnRpdGllcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAqXG4gKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gbGlzdCB0aGUgZW50aXRpZXMgYXNzaWduZWQgdGhlIHJvbGUsIF9cbiAqIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cm9sZS9ST0xFLWMxNjYyMTM4LWExNzAtNDI2NC1iYTE4LTdiNTA2YTcwOGMzN18sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkRW50aXRpZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cm9sZS9ST0xFLWMxNjYyMTM4LWExNzAtNDI2NC1iYTE4LTdiNTA2YTcwOGMzN1wiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHJvbGUgZW50aXRpZXNcbiAqIEBwYXJhbSByb2xlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIHJvbGVcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRSb2xlRW50aXRpZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3JvbGVzL3tyb2xlfS9lbnRpdGllc1wiLnJlcGxhY2UoXCJ7cm9sZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJvbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvdW50XCIsIHBhcmFtc1tcImNvdW50XCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRSb2xlRW50aXRpZXMgPSBnZXRSb2xlRW50aXRpZXM7XG4vKipcbiAqIFJldHJpZXZlIGEgc2luZ2xlIGVudGl0eSB3aGljaCBoYXMgYmVlbiBhc3NpZ25lZCB0aGUgcm9sZSBhcyBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCByb2xlIEhSTi5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkRW50aXRpZXMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIHJldHJpZXZlIGFuIGVudGl0eSBhc3NpZ25lZCB0aGUgcm9sZSwgX0dyb3VwQWRtaW5fLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nXG4gKiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZEVudGl0aWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBhIHNpbmdsZSByb2xlIGVudGl0eVxuICogQHBhcmFtIHJvbGUgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gcm9sZVxuICogQHBhcmFtIGVudGl0eSBIUk4gaWRlbnRpZnlpbmcgYSBnaXZlbiBlbnRpdHlcbiAqL1xuZnVuY3Rpb24gZ2V0Um9sZUVudGl0eShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXMve3JvbGV9L2VudGl0aWVzL3tlbnRpdHl9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3JvbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyb2xlXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2VudGl0eX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImVudGl0eVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRSb2xlRW50aXR5ID0gZ2V0Um9sZUVudGl0eTtcbi8qKlxuICogR2V0IGEgc2luZ2xlIHBlcm1pc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSByb2xlIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIFJvbGUgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRQZXJtaXNzaW9ucyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gcmV0cmlldmUgYSBzaW5nbGUgcm9sZSBwZXJtaXNzaW9uIGZvciB0aGUgc3BlY2lmaWVkIHJvbGUgaW4gcmVhbG0gX015UmVhbG1fLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFBlcm1pc3Npb25zXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnJvbGUvUk9MRS1jMTY2MjEzOC1hMTcwLTQyNjQtYmExOC03YjUwNmE3MDhjMzdcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBSb2xlIFBlcm1pc3Npb25cbiAqIEBwYXJhbSByb2xlIEhSTiBpZGVudGlmeWluZyBhIGdpdmVuIHJvbGVcbiAqIEBwYXJhbSBwZXJtaXNzaW9uIFBlcm1pc3Npb24gaWRlbnRpZmllclxuICovXG5mdW5jdGlvbiBnZXRSb2xlUGVybWlzc2lvbihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXMve3JvbGV9L3Blcm1pc3Npb25zL3twZXJtaXNzaW9ufVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntwZXJtaXNzaW9ufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicGVybWlzc2lvblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRSb2xlUGVybWlzc2lvbiA9IGdldFJvbGVQZXJtaXNzaW9uO1xuLyoqXG4gKiBHZXQgdGhlIHBlcm1pc3Npb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm9sZSBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBSb2xlIEhSTi5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkUGVybWlzc2lvbnMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gKlxuICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGxpc3Qgcm9sZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHNwZWNpZmllZCByb2xlIGluIHJlYWxtIF9NeVJlYWxtXywgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZ1xuICogd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRQZXJtaXNzaW9uc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpyb2xlL1JPTEUtYzE2NjIxMzgtYTE3MC00MjY0LWJhMTgtN2I1MDZhNzA4YzM3XCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgUm9sZSBQZXJtaXNzaW9uc1xuICogQHBhcmFtIHJvbGUgSFJOIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gcm9sZVxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKi9cbmZ1bmN0aW9uIGdldFJvbGVQZXJtaXNzaW9ucyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXMve3JvbGV9L3Blcm1pc3Npb25zXCIucmVwbGFjZShcIntyb2xlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicm9sZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJvbGVQZXJtaXNzaW9ucyA9IGdldFJvbGVQZXJtaXNzaW9ucztcbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2Ygcm9sZXMgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm92aWRlZCByZWFsbS5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkUm9sZXMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHJlYWxtLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBsaXN0IHJvbGVzIHdpdGhpbiB0aGUgcmVhbG0sIF9NeVJlYWxtXywgYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZFxuICogYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRSb2xlc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgUm9sZXNcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICogQHBhcmFtIHJvbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSByb2xlIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHQgc2V0LlxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gb2YgdGhlIHJlc291cmNlIHdoaWNoIHRoZSByb2xlcyByZXR1cm5lZCBpbiB0aGUgcmVzdWx0IHNldCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoLlxuICovXG5mdW5jdGlvbiBnZXRSb2xlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcm9sZXNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicm9sZU5hbWVcIiwgcGFyYW1zW1wicm9sZU5hbWVcIl0pO1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlc291cmNlXCIsIHBhcmFtc1tcInJlc291cmNlXCJdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJvbGVzID0gZ2V0Um9sZXM7XG4vKipcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEdyb3Vwc0FwaVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIEFkZCBhIHNpbmdsZSBtZW1iZXIgdG8gYSBncm91cC5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKiogYWN0aW9uIGFnYWluc3QgdGhlIGdyb3VwXG4gKiBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gYWRkIGEgbWVtYmVyIHRvIHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGRcbiAqIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmdyb3VwL0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQWRkIGEgbWVtYmVyIHRvIGEgZ3JvdXBcbiAqIEBwYXJhbSBncm91cElkIEhSTiBpZGVudGlmeWluZyBhIGdyb3VwLlxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgZ3JvdXAgb3IgcmVhbG0gbWVtYmVyXG4gKi9cbmZ1bmN0aW9uIGFkZEdyb3VwTWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9L21lbWJlcnMve21lbWJlcn1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuYWRkR3JvdXBNZW1iZXIgPSBhZGRHcm91cE1lbWJlcjtcbi8qKlxuICogQ3JlYXRlIGEgZ3JvdXAgd2l0aGluIHRoZSByZWFsbSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyBwYXJ0eS5cbiAqIFRoZSBjYWxsaW5nIHBhcnR5IHdpbGwgYmUgbWFkZSBhIG1lbWJlciBhbmQgYW4gYWRtaW5pc3RyYXRvciBvZiB0aGUgY3JlYXRlZCBncm91cC5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipjcmVhdGVHcm91cCoqIGFjdGlvblxuICogYWdhaW5zdCB0aGUgcmVhbG0gYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHBhcnR5LlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGNyZWF0ZSBhIGdyb3VwIHdpdGhpbiB0aGUgY2FsbGluZyBwYXJ0eSdzIHJlYWxtIGEgcGVybWlzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcImNyZWF0ZUdyb3VwXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphY2NvdW50OjpteXJlYWxtOnJlYWxtL215cmVhbG1cIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IENyZWF0ZSBncm91cFxuICogQHBhcmFtIGJvZHlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlR3JvdXAoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwc1wiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVHcm91cCA9IGNyZWF0ZUdyb3VwO1xuLyoqXG4gKiBEZWxldGUgdGhlIGdyb3VwIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIGdyb3VwIEhSTi5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZVxuICogdGhlICoqZGVsZXRlR3JvdXAqKiBhY3Rpb24gYWdhaW5zdCB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGRlbGV0ZSB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwiZGVsZXRlR3JvdXBcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBkZWxldGUgZ3JvdXBcbiAqIEBwYXJhbSBncm91cElkIEhSTiBpZGVudGlmeWluZyBhIGdyb3VwLlxuICovXG5mdW5jdGlvbiBkZWxldGVHcm91cChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfVwiLnJlcGxhY2UoXCJ7Z3JvdXBJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImdyb3VwSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRlbGV0ZUdyb3VwID0gZGVsZXRlR3JvdXA7XG4vKipcbiAqIFJldHJpZXZlIHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZE1lbWJlcnMqKiBhY3Rpb25cbiAqIGFnYWluc3QgdGhlIHJlYWxtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyBwYXJ0eS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byByZXRyaWV2ZSBhIGdyb3VwIHdpdGhpbiB0aGUgY2FsbGluZyBwYXJ0eSdzIHJlYWxtIGEgcGVybWlzc2lvblxuICogd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgc2luZ2xlIGdyb3VwXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqL1xuZnVuY3Rpb24gZ2V0R3JvdXAoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwcy97Z3JvdXBJZH1cIi5yZXBsYWNlKFwie2dyb3VwSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJncm91cElkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEdyb3VwID0gZ2V0R3JvdXA7XG4vKipcbiAqIFJldHJpZXZlIGEgc2luZ2xlIGdyb3VwIG1lbWJlci5cbiAqXG4gKiBSZXN0cmljdGlvbnM6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkTWVtYmVycyoqIGFjdGlvbiBhZ2FpbnN0XG4gKiB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJldHJpZXZlIGEgc2luZ2xlIG1lbWJlciBvZiB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgc2luZ2xlIEdyb3VwIG1lbWJlclxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyBncm91cCBvciByZWFsbSBtZW1iZXJcbiAqL1xuZnVuY3Rpb24gZ2V0R3JvdXBNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwcy97Z3JvdXBJZH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0R3JvdXBNZW1iZXIgPSBnZXRHcm91cE1lbWJlcjtcbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgbWVtYmVycyBvZiB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRNZW1iZXJzKiogYWN0aW9uIGFnYWluc3QgdGhlIGdyb3VwXG4gKiBpZGVudGlmaWVkIGJ5IHRoZSBwcm92aWRlZCBncm91cCBIUk4uXG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgbWVtYmVycyBvZiB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZE1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgR3JvdXAgbWVtYmVyc1xuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0eXBlIG9mIG1lbWJlcnMgdG8gcmV0dXJuIGluIHRoZSByZXN1bHQuXG4gKiBPbmUgb2YgJ3VzZXInLCAnYXBwJywgb3IgJ2ludml0ZScuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhbGwgZW50aXR5IHR5cGVzIHdpbGwgYmUgcmV0dXJuZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEdyb3VwTWVtYmVycyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvZ3JvdXBzL3tncm91cElkfS9tZW1iZXJzXCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZW50aXR5VHlwZVwiLCBwYXJhbXNbXCJlbnRpdHlUeXBlXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRHcm91cE1lbWJlcnMgPSBnZXRHcm91cE1lbWJlcnM7XG4vKipcbiAqIExpc3QgdGhlIHJvbGVzIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGdyb3VwLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWRSb2xlcyoqIGFjdGlvbiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgZ3JvdXAuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIGxpc3QgdGhlIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLFxuICogYSBwZXJtaXNzaW9uIHdpdGggdGhlIGZvbGxvd2luZyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFJvbGVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmdyb3VwL0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGdyb3VwIHJvbGVzXG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLiBEZWZhdWx0IGlzIDEwMCByZWNvcmRzLiBNYXhpbXVtIGlzIDEwMCByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRHcm91cFJvbGVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9L3JvbGVzXCIucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY291bnRcIiwgcGFyYW1zW1wiY291bnRcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEdyb3VwUm9sZXMgPSBnZXRHcm91cFJvbGVzO1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBncm91cHMgd2l0aGluIHRoZSByZWFsbSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgcGFydHkuXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZE1lbWJlcnMqKiBhY3Rpb24gYWdhaW5zdCB0aGUgcmVhbG0gYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHBhcnR5LlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGxpc3QgdGhlIGdyb3VwcyB3aXRoaW4gdGhlIGNhbGxpbmcgcGFydHkncyByZWFsbSBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YWNjb3VudDo6bXlyZWFsbTpyZWFsbS9teXJlYWxtXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgZ3JvdXBzXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNvdW50IE51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybi4gRGVmYXVsdCBpcyAxMDAgcmVjb3Jkcy4gTWF4aW11bSBpcyAxMDAgcmVjb3Jkcy5cbiAqIEBwYXJhbSBxIEEgZnJlZSB0ZXh0IHF1ZXJ5IHN0cmluZyB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0cy5cbiAqIEEgc2VhcmNoIGFnYWluc3QgZ3JvdXBzIGluIHRoZSByZWFsbSB3aWxsIGNvbnNpZGVyIHRoZSAnaWQnLCAnbmFtZScsIGFuZCAnZGVzY3JpcHRpb24nIGZpZWxkcyBvZiB0aGUgZ3JvdXBzLlxuICogVGhlIHByZWNpc2Ugc2VhcmNoIGFsZ29yaXRobSB1c2VkIHRvIG1hdGNoIGdyb3VwcyBpcyBub3Qgc3BlY2lmaWVkLCBidXQgZ2VuZXJhbGx5IGFueSBtZW1iZXIgd2hlcmVcbiAqIG9uZSBvZiB0aGUgY29uc2lkZXJlZCBmaWVsZHMgaGFzIGEgZnVsbCBvciBwYXJ0aWFsIG1hdGNoIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gZ2V0R3JvdXBzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicVwiLCBwYXJhbXNbXCJxXCJdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEdyb3VwcyA9IGdldEdyb3Vwcztcbi8qKlxuICogUmV0cmlldmUgYSBsaXN0IG9mIGdyb3VwcyBvZiBhIG1lbWJlclxuICpcbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IE15IEdyb3Vwc1xuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4uIERlZmF1bHQgaXMgMTAwIHJlY29yZHMuIE1heGltdW0gaXMgMTAwIHJlY29yZHMuXG4gKi9cbmZ1bmN0aW9uIGdldE15R3JvdXBzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMvbWVcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJjb3VudFwiLCBwYXJhbXNbXCJjb3VudFwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRNeUdyb3VwcyA9IGdldE15R3JvdXBzO1xuLyoqXG4gKiBSZW1vdmUgdGhlIGNhbGxpbmcgcGFydHkgZnJvbSB0aGUgZ3JvdXAuIFRoaXMgb3BlcmF0aW9uIHdpbGwgYWxzbyByZW1vdmUgYWRtaW5pc3RyYXRpdmUgcm9sZXMgZnJvbSB0aGlzIG1lbWJlci5cbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVtb3ZlcyB0aGUgY2FsbGluZyBwYXJ0eSBmcm9tIGEgZ3JvdXBcbiAqIEBwYXJhbSBncm91cElkIEhSTiBpZGVudGlmeWluZyBhIGdyb3VwLlxuICovXG5mdW5jdGlvbiBsZWF2ZUdyb3VwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9ncm91cHMve2dyb3VwSWR9L21lbWJlcnMvbWVcIi5yZXBsYWNlKFwie2dyb3VwSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJncm91cElkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5sZWF2ZUdyb3VwID0gbGVhdmVHcm91cDtcbi8qKlxuICogUmVtb3ZlIGEgbWVtYmVyIGZyb20gdGhlIGdyb3VwLiBUaGlzIG9wZXJhdGlvbiB3aWxsIGFsc28gcmVtb3ZlIGFkbWluaXN0cmF0aXZlIHJvbGVzIGZyb20gdGhpcyBtZW1iZXIuXG4gKlxuICogUmVzdHJpY3Rpb25zOlxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlTWVtYmVycyoqXG4gKiBhY3Rpb24gYWdhaW5zdCB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlbW92ZSBhIG1lbWJlciBmcm9tIHRoZSBncm91cCwgX0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YV8sXG4gKiBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmdyb3VwL0dST1VQLThlMjcwNjUzLWY1OTItNDVhOC04OGQ3LTQ2ZDQwOWNjZmE4YVwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgUmVtb3ZlIGEgbWVtYmVyIGZyb20gdGhlIGdyb3VwLlxuICogQHBhcmFtIGdyb3VwSWQgSFJOIGlkZW50aWZ5aW5nIGEgZ3JvdXAuXG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyBncm91cCBvciByZWFsbSBtZW1iZXJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlR3JvdXBNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwcy97Z3JvdXBJZH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntncm91cElkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZ3JvdXBJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlbW92ZUdyb3VwTWVtYmVyID0gcmVtb3ZlR3JvdXBNZW1iZXI7XG4vKipcbiAqIFVwZGF0ZSB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOIGJ5IHVwZGF0aW5nIGFsbCB3cml0YWJsZSBncm91cCBmaWVsZHMgaW5jbHVkaW5nIG5hbWUgYW5kIGRlc2NyaXB0aW9uLlxuICpcbiAqIFJlc3RyaWN0aW9uczpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAgKip1cGRhdGVHcm91cCoqIGFjdGlvblxuICogYWdhaW5zdCB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgZ3JvdXAgSFJOLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIG1vZGlmeSB0aGUgZ3JvdXAsIF9HUk9VUC04ZTI3MDY1My1mNTkyLTQ1YTgtODhkNy00NmQ0MDljY2ZhOGFfLCBhIHBlcm1pc3Npb24gd2l0aCB0aGUgZm9sbG93aW5nXG4gKiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwidXBkYXRlR3JvdXBcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06Z3JvdXAvR1JPVVAtOGUyNzA2NTMtZjU5Mi00NWE4LTg4ZDctNDZkNDA5Y2NmYThhXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBVcGRhdGUgZ3JvdXBcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gZ3JvdXBJZCBIUk4gaWRlbnRpZnlpbmcgYSBncm91cC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlR3JvdXAoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2dyb3Vwcy97Z3JvdXBJZH1cIi5yZXBsYWNlKFwie2dyb3VwSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJncm91cElkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnVwZGF0ZUdyb3VwID0gdXBkYXRlR3JvdXA7XG4vKipcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFByb2plY3RzQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQWRkIHRoZSBtZW1iZXIgdG8gdGhlIHJlcXVlc3RlZCBQcm9qZWN0LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZU1lbWJlcnMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gYWRkIGEgbWVtYmVyIHRvIHRoZSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgbWVtYmVyIHRvIHRoZSByZXF1ZXN0ZWQgUHJvamVjdFxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBhZGRQcm9qZWN0TWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5hZGRQcm9qZWN0TWVtYmVyID0gYWRkUHJvamVjdE1lbWJlcjtcbi8qKlxuICogQWRkIHRoZSByZXNvdXJjZSB0byB0aGUgcmVxdWVzdGVkIFByb2plY3QgYXMgYSBob21lIG9yIGEgcmVmZXJlbmNlKGxpbmspLlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW4gICoqV2hlbiByZWxhdGlvbj1ob21lKipcbiAqIFRoZSByZXF1ZXN0ZWQgcmVzb3VyY2Ugd2lsbCBiZSBhc3NpZ25lZCB0aGUgcmVxdWVzdGVkIHByb2plY3QgYXMgaXRzIHJlc291cmNlIGhvbWUuXG4gKiBUaGUgcmVzb3VyY2UgKipNVVNUIE5PVCoqIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyByZXNvdXJjZSBob21lLlxuICpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZVJlc291cmNlSG9tZSoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0ICoqQU5EKipcbiAqIHRoZSAqKnNoYXJlKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gYWRkIHJlc291cmNlIFwiaHJuOmhlcmU6ZGF0YTo6bXlyZWFsbTpteS1jYXRhbG9nLTAwMDBcIiB0byB0aGUgcHJvamVjdFxuICogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnMgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFBlcm1pc3Npb24gMTpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VIb21lXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqXG4gKiAqIFBlcm1pc3Npb24gMjpcbiAqICogXCJhY3Rpb25cIiA6IFwic2hhcmVcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om15cmVhbG06bXktY2F0YWxvZy0wMDAwXCIgKipXaGVuIHJlbGF0aW9uPXJlZmVyZW5jZSoqXG4gKiBMaW5rIHRoZSByZXNvdXJjZSB0byB0aGUgcmVxdWVzdGVkIFByb2plY3QgYXMgYSByZWZlcmVuY2UobGluaykuXG4gKiBUaGUgcmVxdWVzdGVkIHJlc291cmNlIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIHJlcXVlc3RlZCBwcm9qZWN0IGFzIHJlZmVyZW5jZShsaW5rKS5cbiAqXG4gKiBUaGUgcmVzb3VyY2UgKipNVVNUKiogYmUgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIgdG8gYXR0YWNoIGFzIGEgcmVzb3VyY2UgcmVmZXJlbmNlKGxpbmspLlxuICogQSByZXNvdXJjZSBpcyByZWZlcmVuY2VhYmxlIGlmIGl0IGhhcyBiZWVuIG1hcmtlZCBhcyByZWZlcmVuY2VhYmxlIGFuZCB0aGUgY2FsbGVyIGhhcyBwZXJtaXNzaW9uIHRvIGFsbCByZWZlcmVuY2UgZW5hYmxlZCBhY3Rpb25zXG4gKiBhZ2FpbnN0IHRoZSByZXNvdXJjZSBPUiBUaGUgcmVzb3VyY2UgaGFzIGJlZW4gbWFkZSBsaW5rYWJsZSB0byB0aGUgcHJvamVjdC9yZWFsbSBmb3IgdGhlIHByb2plY3QgbGlua2luZyBlbmFibGVkIGFjdGlvblxuICogVGhlIGV4Y2x1c2l2ZSBsaXN0IG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byBhdHRhY2ggYXMgYSByZXNvdXJjZSByZWZlcmVuY2UobGluaykgaXMgYWNjZXNzaWJsZSB2aWEgYSBjYWxsXG4gKiB0byAvcmVzb3VyY2VzP3JlZmVyZW5jZWFibGU9dHJ1ZSBvciAvcmVzb3VyY2VzP2xpbmthYmxlPXRydWVcbiAqXG4gKiAqIFRoZSBhdXRob3JpemF0aW9uIGNvbnRleHQgKiptdXN0Kiogc2F0aXNmeSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsIGhhcyBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlUmVzb3VyY2VSZWZlcmVuY2VzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGFkZCBhIHJlc291cmNlIHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIixcbiAqIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VSZWZlcmVuY2VzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsIGlzIGEgKiptZW1iZXIqKiBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gYXR0YWNoIHRoZSByZXNvdXJjZSBhcyBhIHJlZmVyZW5jZWFibGUgcmVzb3VyY2UuXG4gKiBBIHJlc291cmNlIGlzIHJlZmVyZW5jZWFibGUgdG8gdGhlIGNhbGxlciBpZjpcbiAqICogSXQgaGFzIGJlZW4gbWFya2VkIGFzIHJlZmVyZW5jZWFibGUgYW5kIFRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb24gdG8gYWxsIHJlZmVyZW5jZSBlbmFibGVkIGFjdGlvbnMgYWdhaW5zdCB0aGUgcmVzb3VyY2UuXG4gKlxuICogT1JcbiAqXG4gKiAqIFRoZSByZXNvdXJjZSBoYXMgYmVlbiBtYWRlIGxpbmthYmxlIHRvIHRoZSBwcm9qZWN0L3JlYWxtIGZvciB0aGUgcHJvamVjdCBsaW5raW5nIGVuYWJsZWQgYWN0aW9uXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgQWRkIGEgcmVzb3VyY2UgdG8gdGhlIHJlcXVlc3RlZCBQcm9qZWN0IGFzIGEgUmVzb3VyY2UgSG9tZSBvciBSZXNvdXJjZSBSZWZlcmVuY2UoTGluaylcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gcmVsYXRpb24gVGhlIHJlbGF0aW9uIG9mIHRoZSByZXNvdXJjZS4gTXVzdCBiZSBob21lIG9yIHJlZmVyZW5jZShsaW5rKVxuICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGFkZFByb2plY3RSZXNvdXJjZVJlbGF0aW9uKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vcmVzb3VyY2VzL3tyZXNvdXJjZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlbGF0aW9uXCIsIHBhcmFtc1tcInJlbGF0aW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInR5cGVcIiwgcGFyYW1zW1widHlwZVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuYWRkUHJvamVjdFJlc291cmNlUmVsYXRpb24gPSBhZGRQcm9qZWN0UmVzb3VyY2VSZWxhdGlvbjtcbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBwcm9qZWN0IGV4aXN0cyB3aXRoIHJlcXVlc3RlZCBwcm9qZWN0IGhybiBpbiBjYWxsZXIgcmVhbG0uXG4gKlxuICogSWYgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc2FtZSByZWFsbSBpdCB3aWxsIHJldHVybiA0MDQuXG4gKlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IENoZWNrcyB0aGUgZXhpc3RhbmNlIG9mIGEgcHJvamVjdCBpbiBjYWxsZXIgcmVhbG0uXG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBjaGVja1Byb2plY3RFeGlzdGFuY2UoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fVwiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jaGVja1Byb2plY3RFeGlzdGFuY2UgPSBjaGVja1Byb2plY3RFeGlzdGFuY2U7XG4vKipcbiAqIENyZWF0ZSB0aGUgcmVxdWVzdGVkIFByb2plY3QgaW4gdGhlIGNhbGxlcnMgcmVhbG1cbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKmNyZWF0ZVByb2plY3QqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBjcmVhdGUgYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcImNyZWF0ZVByb2plY3RcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IENyZWF0ZSB0aGUgcmVxdWVzdGVkIFByb2plY3RcbiAqIEBwYXJhbSBib2R5XG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUHJvamVjdChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuY3JlYXRlUHJvamVjdCA9IGNyZWF0ZVByb2plY3Q7XG4vKipcbiAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZSoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gZGVsZXRlIGEgUHJvamVjdCwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlUHJvamVjdChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9XCIucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlUHJvamVjdCA9IGRlbGV0ZVByb2plY3Q7XG4vKipcbiAqIFJlbW92ZSB0aGUgbWVtYmVyIGZyb20gdGhlIHNwZWNpZmllZCBQcm9qZWN0XG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKiptYW5hZ2VNZW1iZXJzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlbW92ZSBhIG1lbWJlciBmcm9tIGEgUHJvamVjdCwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBSZW1vdmUgdGhlIG1lbWJlciBmcm9tIHRoZSBzcGVjaWZpZWQgUHJvamVjdFxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVByb2plY3RNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlUHJvamVjdE1lbWJlciA9IGRlbGV0ZVByb2plY3RNZW1iZXI7XG4vKipcbiAqIFJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgcHJvamVjdC5cbiAqIFRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgbWF5IG9ubHkgYmUgbGlua2VkIGFzIGEgcmVmZXJlbmNlLCByZW1vdmluZyBhIGhvbWUgcmVzb3VyY2UgcmVxdWlyZXMgZGVsZXRpbmcgdGhlIHJlc291cmNlIGZyb20gdGhlXG4gKiByZXNvdXJjZSBzZXJ2aWNlLlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZVJlc291cmNlUmVmZXJlbmNlcyoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlbW92ZSBhIHJlc291cmNlIHJlZmVyZW5jZShsaW5rKSBmcm9tIHRoZSBwcm9qZWN0XG4gKiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIiwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZVJlZmVyZW5jZXNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFJlbW92ZSBhIFJlc291cmNlIFJlZmVyZW5jZShMaW5rKSBmcm9tIGEgcHJvamVjdFxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSByZWxhdGlvbiBUaGUgcmVsYXRpb24gb2YgdGhlIHJlc291cmNlLiBNdXN0IGJlIHJlZmVyZW5jZShsaW5rKVxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlUHJvamVjdFJlc291cmNlUmVmZXJlbmNlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vcmVzb3VyY2VzL3tyZXNvdXJjZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlbGF0aW9uXCIsIHBhcmFtc1tcInJlbGF0aW9uXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVQcm9qZWN0UmVzb3VyY2VSZWZlcmVuY2UgPSBkZWxldGVQcm9qZWN0UmVzb3VyY2VSZWZlcmVuY2U7XG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBhbGwgUHJvamVjdHMgaW4gdGhlIE9yZ1xuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKmxpc3RBbGxQcm9qZWN0cyoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBnZXQgYSBsaXN0IG9mIHByb2plY3RzLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcImxpc3RBbGxQcm9qZWN0c1wiXG4gKlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbGlzdCBvZiBhbGwgUHJvamVjdHMgaW4gdGhlIE9yZ1xuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBnZXRBbGxQcm9qZWN0TGlzdChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRBbGxQcm9qZWN0TGlzdCA9IGdldEFsbFByb2plY3RMaXN0O1xuLyoqXG4gKiBHZXQgdGhlIHJlcXVlc3RlZCBQcm9qZWN0XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBnZXQgYSBwcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgcmVxdWVzdGVkIFByb2plY3RcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9XCIucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRQcm9qZWN0ID0gZ2V0UHJvamVjdDtcbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIFByb2plY3RzIHlvdSBhcmUgYSAgcHJvamVjdCBhZG1pbiBvciBhIG1lbWJlciBiYXNlZCBvbiB0aGUgXCJjYW5NYW5hZ2VcIiBvciBcImlzTWVtYmVyXCIgcGFyYW1ldGVyJ3MgdmFsdWUuXG4gKlxuICogQG5vdGUgSWYgbmVpdGhlciBcImNhbk1hbmFnZVwiIG5vciBcImlzTWVtYmVyXCIgaXMgc3BlY2lmaWVkLCBcImlzTWVtYmVyPXRydWVcIiBwcm9qZWN0cyBhcmUgcmV0dXJuZWQuXG4gKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBcImNhbk1hbmFnZVwiIC8gXCJpc01lbWJlclwiIGlzIDogW3RydWVdXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbGlzdCBvZiBQcm9qZWN0cyB0aGF0IHlvdSBhcmUgYSBwcm9qZWN0IGFkbWluIG9yIGEgbWVtYmVyIGJhc2VkIG9uIHRoZSBcImNhbk1hbmFnZVwiIG9yIFwiaXNNZW1iZXJcIiBwYXJhbWV0ZXIncyB2YWx1ZVxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIGNhbk1hbmFnZSBpZiB0cnVlIHJldHVybnMgYWxsIHByb2plY3RzIG9mIHdoaWNoIHRoZSBjYWxsZXIodXNlci9hcHApIGlzIGEgcHJvamVjdCBhZG1pbi5cbiAqIEBwYXJhbSBpc01lbWJlciBpZiB0cnVlIHJldHVybnMgYWxsIHByb2plY3RzIG9mIHdoaWNoIHRoZSBjYWxsZXIodXNlci9hcHApIGlzIGEgbWVtYmVyLlxuICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0TGlzdChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMvbWVcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNhbk1hbmFnZVwiLCBgJHtwYXJhbXNbXCJjYW5NYW5hZ2VcIl19YCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJpc01lbWJlclwiLCBgJHtwYXJhbXNbXCJpc01lbWJlclwiXX1gKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRQcm9qZWN0TGlzdCA9IGdldFByb2plY3RMaXN0O1xuLyoqXG4gKiBHZXQgdGhlIHJlcXVlc3RlZCBQcm9qZWN0IE1lbWJlclxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKiAqIEV4YW1wbGU6IEluIG9yZGVyIHRvIGdldCBhIG1lbWJlciBvZiBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBNZW1iZXJcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgbWVtYmVyLiBFaXRoZXIgdXNlciwgYXBwIG9yIGdyb3VwXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0TWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0UHJvamVjdE1lbWJlciA9IGdldFByb2plY3RNZW1iZXI7XG4vKipcbiAqIEdldCB0aGUgcmVzb3VyY2UgdGhhdCBpcyBsaW5rZWQgdG8gdGhlIHJlcXVlc3RlZCBQcm9qZWN0LlxuICpcbiAqIFRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgbWF5IGJlIGxpbmtlZCBhcyBlaXRoZXIgYSBob21lIG9yIGEgcmVmZXJlbmNlKGxpbmspLlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdFxuICpcbiAqICogRXhhbXBsZTogSW4gb3JkZXIgdG8gZ2V0IHJlc291cmNlIFwiaHJuOmhlcmU6ZGF0YTo6bXlyZWFsbTpteS1jYXRhbG9nLTAwMDBcIiBpbiB0aGUgcHJvamVjdFxuICogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqXG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBhIHJlc291cmNlIHRoYXQgaXMgbGlua2VkIHRvIGEgUHJvamVjdCBhcyBlaXRoZXIgYSBSZXNvdXJjZSBIb21lIG9yIFJlc291cmNlIFJlZmVyZW5jZShMaW5rKVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHJlbGF0aW9uIFRoZSByZWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UuIEEgcmVzb3VyY2UgaXMgb25seSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgaWYgaXQgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIHJlbGF0aW9uLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdFJlc291cmNlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vcmVzb3VyY2VzL3tyZXNvdXJjZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlbGF0aW9uXCIsIHBhcmFtc1tcInJlbGF0aW9uXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRQcm9qZWN0UmVzb3VyY2UgPSBnZXRQcm9qZWN0UmVzb3VyY2U7XG4vKipcbiAqIFJlbW92ZSB0aGUgY2FsbGVyIGZyb20gdGhlIHNwZWNpZmllZCBQcm9qZWN0XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBBdXRob3JpemF0aW9uIDogTm9uZVxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFJlbW92ZSB0aGUgY2FsbGVyIGZyb20gdGhlIHNwZWNpZmllZCBQcm9qZWN0XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGxlYXZlUHJvamVjdChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnMvbWVcIi5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5sZWF2ZVByb2plY3QgPSBsZWF2ZVByb2plY3Q7XG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBtZW1iZXJzIG9mIHRoZSBQcm9qZWN0XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBnZXQgYSBsaXN0IG9mIHByb2plY3QgbWVtYmVycywgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqICogaWYgJ29ubHlJbmNsdWRlSWRlbnRpdGllcycgcXVlcnkgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCAndG90YWwnIGlzIE5PVCByZXR1cm5lZCBpbiBSZXNwb25zZVxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbGlzdCBvZiBtZW1iZXJzIG9mIHRoZSBQcm9qZWN0XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBvbmx5SW5jbHVkZUlkZW50aXRpZXMgSWYgdHJ1ZSwgcmV0dXJucyBhbiBlZmZlY3RpdmUgcHJvamVjdCBtZW1iZXJzIGxpc3QgY29udGFpbmluZyBvbmx5IHVzZXIgYW5kIGFwcCBpZGVudGl0aWVzLFxuICogaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhlIHByb2plY3QgaW5kaXJlY3RseSB2aWEgYSBncm91cC5cbiAqIEl0IHdpbGwgYWxzbyByZXR1cm4gdXNlcnMgd2hvIGFyZSBwcm9qZWN0IGFkbWlucyBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QsIGFuZCBSZXNvdXJjZSBNYW5hZ2VycyBmb3IgdGhlIHJlYWxtLlxuICogUmVzcG9uc2Ugd2lsbCBOT1QgaW5jbHVkZSB0b3RhbCBudW1iZXIgb2YgaWRlbnRpdGllcy5cbiAqIElmIGZhbHNlLCByZXR1cm5zIHVzZXJzLCBhcHBzLCBhbmQgZ3JvdXBzIHRoYXQgYXJlIGRpcmVjdCBtZW1iZXJzIG9mIHRoZSBwcm9qZWN0LCBleGNsdWRpbmcgYW55IHVzZXJzIGFuZCBhcHBzIHRoYXQgb25seSBoYXZlXG4gKiBtZW1iZXJzaGlwIHZpYSBhIGdyb3VwLiBEZWZhdWx0cyB0byBmYWxzZS4gIFN1cHBvc2UgdGhlcmUgYXJlIGEgdXNlciBVIGFuZCBhIGdyb3VwIEcgd2l0aCBhcHAgQSBpbiBpdC5cbiAqIFN1cHBvc2UgdXNlciBVIGFuZCBncm91cCBHIGFyZSB0aGUgbWVtYmVycyBvZiB0aGUgcHJvamVjdCwgdGhlbiAqIG9ubHlJbmNsdWRlSWRlbnRpdGllczogdHJ1ZSB3aWxsIHJldHVybiBVIGFuZCBBXG4gKiAqIG9ubHlJbmNsdWRlSWRlbnRpdGllczpmYWxzZSBvciBhYnNlbnQgd2lsbCByZXR1cm4gVSBhbmQgR1xuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICovXG5mdW5jdGlvbiBsaXN0UHJvamVjdE1lbWJlcnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzXCIucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm9ubHlJbmNsdWRlSWRlbnRpdGllc1wiLCBgJHtwYXJhbXNbXCJvbmx5SW5jbHVkZUlkZW50aXRpZXNcIl19YCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5saXN0UHJvamVjdE1lbWJlcnMgPSBsaXN0UHJvamVjdE1lbWJlcnM7XG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiByZXNvdXJjZXMgaW4gdGhlIHJlcXVlc3RlZCBQcm9qZWN0ICYgcmVmZXJlbmNlZCBpbihsaW5rZWQgdG8pIHRoZSBQcm9qZWN0XG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBnZXQgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIGluIHRoZSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcInJlYWRcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbGlzdCBvZiByZXNvdXJjZXMgaW4gdGhlIHJlcXVlc3RlZCBQcm9qZWN0ICYgcmVmZXJlbmNlZCBpbihsaW5rZWQgdG8pIHRoZSBQcm9qZWN0XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSByZWxhdGlvbiBUaGUgcmVsYXRpb24gb2YgdGhlIHJlc291cmNlLiBBIHJlc291cmNlIGlzIG9ubHkgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGlmIGl0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCByZWxhdGlvbi5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gbGlzdFByb2plY3RSZXNvdXJjZXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9yZXNvdXJjZXNcIi5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidHlwZVwiLCBwYXJhbXNbXCJ0eXBlXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlbGF0aW9uXCIsIHBhcmFtc1tcInJlbGF0aW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxpc3RQcm9qZWN0UmVzb3VyY2VzID0gbGlzdFByb2plY3RSZXNvdXJjZXM7XG4vKipcbiAqIFVwZGF0ZSB0aGUgc3BlY2lmaWVkIFByb2plY3RcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKip3cml0ZSoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqICpcbiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byB1cGRhdGUgYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIndyaXRlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNwZWNpZmllZCBQcm9qZWN0XG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBwYXRjaFByb2plY3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fVwiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnBhdGNoUHJvamVjdCA9IHBhdGNoUHJvamVjdDtcbi8qKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVzb3VyY2UgSW5mbyBBbmQgTWFuYWdlbWVudCBBcGlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIHdheXMgdGhpcyByZXNvdXJjZSBoYXMgYmVlbiBtYWRlIGxpbmthYmxlXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSBhbGwgdGhlIFwicmVxdWlyZWRUb01ha2VMaW5rYWJsZVwiIGFjdGlvbnMgYWdhaW5zdFxuICogdGhlIHNlcnZpY2UgaW5mZXJyZWQgdmlhIHRoZSByZXNlcnZlZCByZXNvdXJjZSBwcmVmaXggb2YgdGhlIHJlc291cmNlIGluIHRoZSBwYXRoIGluIHRoZSBzY29wZSBvZiB0aGUgICBob21lIHByb2plY3Qgb2YgdGhlIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIG1ha2UgYSBjYXRhbG9nIGxpbmthYmxlLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVJlc291cmNlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjpvbHAtaGVyZTpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBzY29wZWQgdG8gdGhlIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgbGlzdCBvZiB3YXlzIHRoZSByZXNvdXJjZSBoYXMgYmVlbiBtYWRlIGxpbmthYmxlXG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqL1xuZnVuY3Rpb24gZ2V0TGlzdE9mV2F5c1Jlc291cmNlSXNMaW5rYWJsZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tyZXNvdXJjZX0vbGlua2FibGVcIi5yZXBsYWNlKFwie3Jlc291cmNlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRMaXN0T2ZXYXlzUmVzb3VyY2VJc0xpbmthYmxlID0gZ2V0TGlzdE9mV2F5c1Jlc291cmNlSXNMaW5rYWJsZTtcbi8qKlxuICogR2V0IHRoZSBSZXNvdXJjZSB0aGF0IHRoZSBjYWxsZXIgaXMgYWxsb3dlZCB0byBzZWUgYmFzZWQgb24gdGhlIGlucHV0IHF1ZXJ5IHBhcmFtZXRlcnNcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBhIHNpbmdsZSByZXNvdXJjZVxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSByZWZlcmVuY2VhYmxlIEdldCB0aGUgcmVzb3VyY2Ugb25seSBpZiBpdCBpcyBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byBhdHRhY2ggYXMgYSByZWZlcmVuY2UgdG8gcHJvamVjdHMuXG4gKiBBIHJlc291cmNlIGlzIHJlZmVyZW5jZWFibGUgaWYgaXQgaXMgbWFya2VkIGFzIHJlZmVyZW5jZWFibGUgYW5kIHRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb24gdG8gYWxsIHJlZmVyZW5jZSBlbmFibGVkIGFjdGlvbnNcbiAqIGFnYWluc3QgdGhlIHJlc291cmNlLiAgT3RoZXJ3aXNlIDQwNC4gIE9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIHRydWUuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzb3VyY2UoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Jlc291cmNlcy97cmVzb3VyY2V9XCIucmVwbGFjZShcIntyZXNvdXJjZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVmZXJlbmNlYWJsZVwiLCBgJHtwYXJhbXNbXCJyZWZlcmVuY2VhYmxlXCJdfWApO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlc291cmNlID0gZ2V0UmVzb3VyY2U7XG4vKipcbiAqIEdldCB0aGUgYXZhaWxhYmlsaXR5IGZvciBsaW5raW5nIHRoaXMgcmVzb3VyY2UgdG8gZWl0aGVyIGEgcHJvamVjdCBvciByZWFsbS5cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIGFsbCB0aGUgXCJyZXF1aXJlZFRvTWFrZUxpbmthYmxlXCIgYWN0aW9ucyBhZ2FpbnN0XG4gKiB0aGUgc2VydmljZSBpbmZlcnJlZCB2aWEgdGhlIHJlc2VydmVkIHJlc291cmNlIHByZWZpeCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHBhdGggaW4gdGhlIHNjb3BlIG9mIHRoZSAgIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBnZXQgdGhlIGNhdGFsb2cgbGlua2FiaWxpdHksIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgc2NvcGVkIHRvIHRoZSBob21lIHByb2plY3Qgb2YgdGhlIHJlc291cmNlLlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbGlua2FiaWxpdHkgb2YgYSByZXNvdXJjZVxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSBhdmFpbGFibGVUb0hybiBUaGUgaHJuIG9mIHRoZSBwcm9qZWN0IHRoYXQgdGhlIHJlc291cmNlIGlzIG1hZGUgbGlua2FibGUgYWdhaW5zdCBvclxuICogVGhlIGhybiBvZiB0aGUgcmVhbG0gdGhhdCB0aGUgcmVzb3VyY2UgaXMgbWFkZSBsaW5rYWJsZSBhZ2FpbnN0LlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFJlc291cmNlTGlua2FiaWxpdHkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Jlc291cmNlcy97cmVzb3VyY2V9L2xpbmthYmxlL3thdmFpbGFibGVUb0hybn1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInthdmFpbGFibGVUb0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImF2YWlsYWJsZVRvSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlc291cmNlTGlua2FiaWxpdHkgPSBnZXRSZXNvdXJjZUxpbmthYmlsaXR5O1xuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgUHJvamVjdHMgdGhhdCB0aGUgcmVzb3VyY2UgYmVsb25ncyB0byBvciBpcyByZWZlcmVuY2VkIGluKGxpbmtlZCB0bykuXG4gKiBUaGUgcmV0dXJuZWQgbGlzdCB3aWxsIG9ubHkgaW5jbHVkZSBwcm9qZWN0cyB0aGF0IGFyZSBpbiB0aGUgY2FsbGVyJ3MgcmVhbG0uXG4gKlxuICogQG5vdGVcbiAqIElmIHRoZSBwcmVzZW50ZWQgYWNjZXNzIHRva2VuIGhhcyBhIHByb2plY3Qgc2NvcGUsIHRoZSByZXNwb25zZSB3aWxsIGluY2x1ZGU6XG4gKiAtIFRoZSBob21lIHByb2plY3Qgb2YgdGhlIHJlc291cmNlXG4gKiAtIFRoZSBsaXN0IG9mIFByb2plY3RzIHRoYXQgdGhlIHJlc291cmNlIGhhcyBiZWVuIG1hZGUgbGlua2FibGUgdG9cbiAqIC0gVGhlIGluY2x1ZGUgdGhlIGxpc3Qgb2YgUHJvamVjdHMgdGhhdCB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gbGlua2VkIHRvXG4gKlxuICogSWYgdGhlIHByZXNlbnRlZCBhY2Nlc3MgdG9rZW4gaGFzIG5vIHNjb3BlLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlOlxuICogLSBUaGUgbGlzdCBvZiBQcm9qZWN0cyBmaWx0ZXJlZCBvdXQgYmFzZWQgb24gdGhlIG1lbWJlcnNoaXAgb2YgdGhlIGNhbGxlci5cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbCBmb3IgcHJvamVjdCBzY29wZWQgY2FsbDpcbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIGFsbCB0aGUgXCJyZXF1aXJlZFRvTWFrZUxpbmthYmxlXCIgYWN0aW9ucyBhZ2FpbnN0XG4gKiB0aGUgc2VydmljZSBpbmZlcnJlZCB2aWEgdGhlIHJlc2VydmVkIHJlc291cmNlIHByZWZpeCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHBhdGggaW4gdGhlIHNjb3BlIG9mIHRoZSAgIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byBtYWtlIGEgY2F0YWxvZyBsaW5rYWJsZSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VSZXNvdXJjZVwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6ZGF0YTo6b2xwLWhlcmU6bXktc2hhcmVkLWNhdGFsb2dcIlxuICpcbiAqIEBzdW1tYXJ5IEdldCB0aGUgcmVxdWVzdGVkIFByb2plY3RzIHRoYXQgdGhlIHJlc291cmNlIGJlbG9uZ3MgdG8gb3IgaXMgcmVmZXJlbmNlZCBpbihsaW5rZWQgdG8pXG4gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGhybiB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcmVsYXRpb24gVGhlIHJlbGF0aW9uIG9mIHRoZSByZXNvdXJjZS4gQSByZXNvdXJjZSBpcyBvbmx5IHJldHVybmVkIGluIHRoZSByZXNwb25zZSBpZiBpdCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgcmVsYXRpb24uXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBpdCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzb3VyY2VQcm9qZWN0cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tyZXNvdXJjZX0vcHJvamVjdHNcIi5yZXBsYWNlKFwie3Jlc291cmNlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYWdlVG9rZW5cIiwgcGFyYW1zW1wicGFnZVRva2VuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlbGF0aW9uXCIsIHBhcmFtc1tcInJlbGF0aW9uXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRSZXNvdXJjZVByb2plY3RzID0gZ2V0UmVzb3VyY2VQcm9qZWN0cztcbi8qKlxuICogR2V0IGEgbGlzdCBvZiBSZXNvdXJjZXMgdGhhdCB0aGUgY2FsbGVyIGlzIGFsbG93ZWQgdG8gc2VlIGJhc2VkIG9uIHRoZSBpbnB1dCBxdWVyeSBwYXJhbWV0ZXJzLlxuICpcbiAqIEBub3RlXG4gKiBJZiB0aGUgcHJlc2VudGVkIGFjY2VzcyB0b2tlbiBoYXMgYSBwcm9qZWN0IHNjb3BlOlxuICogLSBUaGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGluY2x1ZGUgcmVzb3VyY2VzIGZyb20gdGhhdCBwcm9qZWN0IG9yLFxuICogLSBJZiByZWZlcmVuY2VhYmxlPXRydWUgb3IgbGlua2FibGU9dHJ1ZSwgdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvXG4gKiBsaW5rIHRvIHRoZSBwcm9qZWN0IGluIHRoZSB0b2tlbidzIHByb2plY3Qgc2NvcGUuXG4gKlxuICogLSBJZiB0aGUgcHJlc2VudGVkIGFjY2VzcyB0b2tlbiBoYXMgbm8gc2NvcGU6XG4gKiAtIFRoZSByZXNwb25zZSB3aWxsIGluY2x1ZGUgcmVzb3VyY2VzIGZyb20gYWxsIHByb2plY3RzIHRoYXQgdGhlIGNhbGxlciBoYXMgYWNjZXNzIHRvLlxuICogLSBGb3IgdHlwZT0nY2F0YWxvZycgdGhlIHJlc3BvbnNlIHdpbGwgYWxzbyBpbmNsdWRlIHJlc291cmNlcyB0aGF0IGV4aXN0IG91dHNpZGUgb2YgYW55IHByb2plY3QuXG4gKiAtIEZvciBhbGwgb3RoZXIgdHlwZXMsIHRoZSByZXNwb25zZSB3aWxsIE5PVCBpbmNsdWRlIHJlc291cmNlcyB0aGF0IGV4aXN0IG91dHNpZGUgb2YgYW55IHByb2plY3QuXG4gKiAtIEZvciByZWZlcmVuY2VhYmxlPXRydWUgb3IgbGlua2FibGU9dHJ1ZSwgdGhlIHJlc3BvbnNlIHdpbGwgT05MWSBpbmNsdWRlIHRoZSBIRVJFIHB1YmxpYyByZXNvdXJjZXMgdGhhdCBhcmUgYXZhaWxhYmxlXG4gKiB0byB0aGUgY2FsbGVyIHRvIGxpbmsgdG8gQU5ZIHByb2plY3QgKiBUaGlzIEFQSSB3b3JrcyB3aXRoIHRva2VucyB0aGF0IGFyZSBzY29wZWQgYW5kIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEdldCBhIGxpc3Qgb2YgcmVzb3VyY2VzXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqIEBwYXJhbSBhY2Nlc3MgRmlsdGVyIHRoZSByZXNvdXJjZXMgYWNjZXNzaWJsZSB0byB0aGUgY2FsbGVyIGJhc2VkIG9uIHRoZSBhY2Nlc3MgdHlwZXMuXG4gKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcImRlZmF1bHRcIi5cbiAqIE5vdCBhcHBsaWNhYmxlIHRvIHVzZSBhbG9uZyB3aXRoIHRoZSBxdWVyeSBwYXJhbWV0ZXIgXCJyZWZlcmVuY2VhYmxlXCI6IFwidHJ1ZVwiIG9yIFwibGlua2FibGVcIjogXCJ0cnVlXCJcbiAqIElmIFwiZGVmYXVsdFwiIGluY2x1ZGVzIHJlc291cmNlcyB3aGVyZTpcbiAqIC0gVGhlIHVzZXIgaGFzIGFjY2VzcyB0byB0aGUgcmVzb3VyY2VcInMgaG9tZSBwcm9qZWN0IE9SXG4gKiAtIFRoZSB1c2VyIGhhcyBhY2Nlc3MgdG8gYSBwcm9qZWN0IHRoYXQgdGhlIHJlc291cmNlIGlzIGxpbmtlZCB0byBhcyBhIHJlZmVyZW5jZSBPUlxuICogLSBUaGUgdHlwZVwiOiBcIlwiY2F0YWxvZ1wiIGFuZCB0aGUgcmVzb3VyY2UgaXMgbm90IGluIGFueSBwcm9qZWN0IGFuZCB0aGUgdXNlciBoYXMgXCJyZWFkXCIgYWNjZXNzIHRvIGl0IE9SXG4gKiAtIFRoZSB0eXBlXCI6IFwiXCJjYXRhbG9nXCIgYW5kIHRoZSByZXNvdXJjZSBpcyBub3QgaW4gYW55IHByb2plY3QgYW5kIHRoZSB1c2VyIGhhcyBcIndyaXRlXCIgYWNjZXNzIHRvIGl0IE9SXG4gKiAtIFRoZSB0eXBlXCI6IFwiXCJjYXRhbG9nXCIgYW5kIHRoZSByZXNvdXJjZSBpcyBub3QgaW4gYW55IHByb2plY3QgYW5kIHRoZSB1c2VyIGhhcyBcIm1hbmFnZVwiIGFjY2VzcyB0byBpdC5cbiAqXG4gKiBJZiBcIm1hbmFnZVwiIGluY2x1ZGVzIHJlc291cmNlcyB3aGVyZTpcbiAqIC0gVGhlIHVzZXIgaGFzIGFjY2VzcyB0byB0aGUgcmVzb3VyY2VcInMgaG9tZSBwcm9qZWN0IE9SXG4gKiAtIFRoZSB0eXBlXCI6IFwiXCJjYXRhbG9nXCIgYW5kIHRoZSByZXNvdXJjZSBpcyBub3QgaW4gYW55IHByb2plY3QgYW5kIHRoZSB1c2VyIGhhcyBcIm1hbmFnZVwiIGFjY2VzcyB0byBpdC5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlYWJsZSBHZXQgYWxsIHJlZmVyZW5jZWFibGUobGlua2FibGUpIHJlc291cmNlcyBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byBhdHRhY2ggYXMgYSByZWZlcmVuY2UobGluaykgdG8gcHJvamVjdHMuXG4gKiBPbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyB0cnVlLiBOb3RlIC0gQ2FuIGJlIHVzZWQgYXMgYSBzeW5vbnltIGZvciBsaW5rYWJsZSAgQSByZXNvdXJjZSBpcyByZWZlcmVuY2VhYmxlKGxpbmthYmxlKSBpZiBpdCBpcyBtYXJrZWRcbiAqIGFzIHJlZmVyZW5jZWFibGU6XG4gKiAtIGFuZCB0aGUgY2FsbGVyIGhhcyBwZXJtaXNzaW9uIHRvIGFsbCByZWZlcmVuY2UgZW5hYmxlZCBhY3Rpb25zIGFnYWluc3QgdGhlIHJlc291cmNlIG9yLFxuICogLSBpbiBjYXNlIG9mIGEgcHJvamVjdCBzY29wZWQgdG9rZW4sIHRoZSBjYWxsZXIgaGFzIGVmZmVjdGl2ZSBtZW1iZXJzaGlwIG9uIHRoZSBwcm9qZWN0cyB0byBhdHRhY2ggcmVzb3VyY2VzXG4gKiBhcyBhIHJlZmVyZW5jZShsaW5rKSB0byB0aGUgUHJvamVjdC5cbiAqXG4gKiBAcGFyYW0gbGlua2FibGUgR2V0IGFsbCBsaW5rYWJsZSByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIgdG8gYXR0YWNoIGFzIGEgbGluayB0byBwcm9qZWN0LlxuICogT25seSBzdXBwb3J0ZWQgdmFsdWUgaXMgdHJ1ZS4gTm90ZSAtIENhbiBiZSB1c2VkIGFzIGEgc3lub255bSBmb3IgcmVmZXJlbmNlYWJsZVxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFJlc291cmNlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ0eXBlXCIsIHBhcmFtc1tcInR5cGVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWNjZXNzXCIsIHBhcmFtc1tcImFjY2Vzc1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZlcmVuY2VhYmxlXCIsIGAke3BhcmFtc1tcInJlZmVyZW5jZWFibGVcIl19YCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW5rYWJsZVwiLCBgJHtwYXJhbXNbXCJsaW5rYWJsZVwiXX1gKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRSZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXM7XG4vKipcbiAqIEdldCBMaXN0IG9mIGFsbCB0aGUgcmVzb3VyY2VzIGluIHRoZSByZWFsbSBvZiB0aGUgY2FsbGVyXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbGlzdFJlYWxtUmVzb3VyY2VzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGdldCBhIGxpc3Qgb2YgcHJvamVjdHMsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibGlzdFJlYWxtUmVzb3VyY2VzXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IExpc3Qgb2YgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIHJlYWxtIG9mIHRoZSBjYWxsZXJcbiAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgZW50cmllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0gcGFnZVRva2VuIFRoZSBjdXJzb3IgZm9yIHBhZ2luYXRpb24uIFByZXNlbnQgb25seSBpZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhZ2Ugb2YgZGF0YSB0byB2aWV3LlxuICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGxpc3RSZWFsbVJlc291cmNlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVhbG0vcmVzb3VyY2VzXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ0eXBlXCIsIHBhcmFtc1tcInR5cGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxpc3RSZWFsbVJlc291cmNlcyA9IGxpc3RSZWFsbVJlc291cmNlcztcbi8qKlxuICogQWRkcyBhIGxpc3RpbmcgdG8gbWFrZSB0aGlzIHJlc291cmNlIGxpbmthYmxlIHRvIGVpdGhlciBhIHByb2plY3Qgb3IgZW50aXJlIHJlYWxtLlxuICpcbiAqIFRoZSByZXNvdXJjZSBtdXN0IGJlbG9uZyB0byBhIHByb2plY3QgdG8gYmUgbWFkZSBsaW5rYWJsZS4gRWl0aGVyIHByb2plY3RIcm4gb3IgcmVhbG1Icm4gbXVzdCBiZSBwcm92aWRlZCB0byBtYWtlIHRoZSByZXNvdXJjZVxuICogbGlua2FibGUgdG8uXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSBhbGwgdGhlIFwicmVxdWlyZWRUb01ha2VMaW5rYWJsZVwiIGFjdGlvbnMgYWdhaW5zdFxuICogdGhlIHNlcnZpY2UgaW5mZXJyZWQgdmlhIHRoZSByZXNlcnZlZCByZXNvdXJjZSBwcmVmaXggb2YgdGhlIHJlc291cmNlIGluIHRoZSBwYXRoIGluIHRoZSBzY29wZSBvZiB0aGUgICBob21lIHByb2plY3Qgb2YgdGhlIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIG1ha2UgYSBjYXRhbG9nIGxpbmthYmxlLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVJlc291cmNlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjpvbHAtaGVyZTpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBzY29wZWQgdG8gdGhlIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogQHN1bW1hcnkgTWFrZSBhIHJlc291cmNlIExpbmthYmxlXG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBtYWtlUmVzb3VyY2VMaW5rYWJsZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcmVzb3VyY2VzL3tyZXNvdXJjZX0vbGlua2FibGVcIi5yZXBsYWNlKFwie3Jlc291cmNlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMubWFrZVJlc291cmNlTGlua2FibGUgPSBtYWtlUmVzb3VyY2VMaW5rYWJsZTtcbi8qKlxuICogUmVtb3ZlIHRoZSBsaW5rYWJpbGl0eSBvZiB0aGlzIHJlc291cmNlIGFnYWluc3QgdGhlIHJlcXVlc3RlZCBwcm9qZWN0IG9yIHJlYWxtLlxuICpcbiAqIEBub3RlIFRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGltcGFjdCBvbiBwcmUtZXhpc3RpbmcgbGlua3MuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSBhbGwgdGhlIFwicmVxdWlyZWRUb01ha2VMaW5rYWJsZVwiIGFjdGlvbnMgYWdhaW5zdFxuICogdGhlIHNlcnZpY2UgaW5mZXJyZWQgdmlhIHRoZSByZXNlcnZlZCByZXNvdXJjZSBwcmVmaXggb2YgdGhlIHJlc291cmNlIGluIHRoZSBwYXRoIGluIHRoZSBzY29wZSBvZiB0aGUgICBob21lIHByb2plY3Qgb2YgdGhlIHJlc291cmNlLlxuICogKiBFeGFtcGxlOiBJbiBvcmRlciB0byByZW1vdmUgdGhlIGNhdGFsb2cgbGlua2FiaWxpdHksIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlUmVzb3VyY2VcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmRhdGE6Om9scC1oZXJlOm15LXNoYXJlZC1jYXRhbG9nXCJcbiAqXG4gKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgaG9tZSBwcm9qZWN0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAc3VtbWFyeSBSZW1vdmUgdGhlIGxpbmthYmlsaXR5IG9mIGEgcmVzb3VyY2VcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gYXZhaWxhYmxlVG9Icm4gVGhlIGhybiBvZiB0aGUgcHJvamVjdCB0aGF0IHRoZSByZXNvdXJjZSBpcyBtYWRlIGxpbmthYmxlIGFnYWluc3Qgb3IgVGhlIGhybiBvZiB0aGUgcmVhbG0gdGhhdCB0aGUgcmVzb3VyY2VcbiAqIGlzIG1hZGUgbGlua2FibGUgYWdhaW5zdC5cbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiByZW1vdmVSZXNvdXJjZUxpbmthYmlsaXR5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve3Jlc291cmNlfS9saW5rYWJsZS97YXZhaWxhYmxlVG9Icm59XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Jlc291cmNlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7YXZhaWxhYmxlVG9Icm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJhdmFpbGFibGVUb0hyblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVtb3ZlUmVzb3VyY2VMaW5rYWJpbGl0eSA9IHJlbW92ZVJlc291cmNlTGlua2FiaWxpdHk7XG4vKipcbiAqIFVwZGF0ZSB0aGUgbGlua2FiaWxpdHkgb2YgdGhpcyByZXNvdXJjZSBhZ2FpbnN0IHRoZSByZXF1ZXN0ZWQgcHJvamVjdCBvciByZWFsbS5cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDogICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIGFsbCB0aGUgXCJyZXF1aXJlZFRvTWFrZUxpbmthYmxlXCIgYWN0aW9ucyBhZ2FpbnN0XG4gKiB0aGUgc2VydmljZSBpbmZlcnJlZCB2aWEgdGhlIHJlc2VydmVkIHJlc291cmNlIHByZWZpeCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHBhdGggaW4gdGhlIHNjb3BlIG9mIHRoZSAgIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBjYXRhbG9nIGxpbmthYmlsaXR5LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVJlc291cmNlXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTpkYXRhOjpvbHAtaGVyZTpteS1zaGFyZWQtY2F0YWxvZ1wiXG4gKlxuICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBzY29wZWQgdG8gdGhlIGhvbWUgcHJvamVjdCBvZiB0aGUgcmVzb3VyY2UuXG4gKlxuICogQHN1bW1hcnkgVXBkYXRlIHRoZSBsaW5rYWJpbGl0eSBvZiBhIHJlc291cmNlXG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHJlc291cmNlIFRoZSBocm4gdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSBhdmFpbGFibGVUb0hybiBUaGUgaHJuIG9mIHRoZSBwcm9qZWN0IHRoYXQgdGhlIHJlc291cmNlIGlzIG1hZGUgbGlua2FibGUgYWdhaW5zdCBvciBUaGUgaHJuIG9mIHRoZSByZWFsbSB0aGF0IHRoZSByZXNvdXJjZVxuICogaXMgbWFkZSBsaW5rYWJsZSBhZ2FpbnN0LlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVJlc291cmNlTGlua2FiaWxpdHkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Jlc291cmNlcy97cmVzb3VyY2V9L2xpbmthYmxlL3thdmFpbGFibGVUb0hybn1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cmVzb3VyY2V9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJyZXNvdXJjZVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInthdmFpbGFibGVUb0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImF2YWlsYWJsZVRvSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBkYXRlUmVzb3VyY2VMaW5rYWJpbGl0eSA9IHVwZGF0ZVJlc291cmNlTGlua2FiaWxpdHk7XG4vKipcbiAqIEF0dGFjaGVzIHRoZSBQcm9qZWN0IFBvbGljeSB0byB0aGUgbWVtYmVyIG9mIHRoZSBQcm9qZWN0LlxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZU1lbWJlcnMqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gYXR0YWNoIGEgY3VzdG9tIHBvbGljeSBpbiBhIFByb2plY3QgdG8gYSBtZW1iZXIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnMgd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZU1lbWJlcnNcIlxuICogKiBcInJlc291cmNlXCIgOiBcImhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06cHJvamVjdC9teS1wcm9qZWN0LTAwMDBcIlxuICogQU5EXG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IEF0dGFjaCBQcm9qZWN0IFBvbGljeSB0byBNZW1iZXJcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgbWVtYmVyLiBFaXRoZXIgdXNlciwgYXBwIG9yIGdyb3VwXG4gKiBAcGFyYW0gcG9saWN5IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBwb2xpY3kuIEZvciBIRVJFIHByb3ZpZGVkIHBvbGljaWVzLFxuICogdGhlIEhSTiBmb3JtYXQgd291bGQgYmUgLSBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmRlZmF1bHQ6cG9saWN5L3JlYWQtb25seS1hY2Nlc3MtdG8tYWxsLWNhdGFsb2dzXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaFByb2plY3RQb2xpY3lUb01lbWJlcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L21lbWJlcnMve21lbWJlcn0vcG9saWNpZXMve3BvbGljeX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bWVtYmVyfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibWVtYmVyXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3BvbGljeX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInBvbGljeVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmF0dGFjaFByb2plY3RQb2xpY3lUb01lbWJlciA9IGF0dGFjaFByb2plY3RQb2xpY3lUb01lbWJlcjtcbi8qKlxuICogQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgY3VzdG9tIHBvbGljeSBpbiB0aGUgUHJvamVjdFxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZVBvbGljaWVzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIGNyZWF0ZSBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IENyZWF0ZSB0aGUgcmVxdWVzdGVkIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb2plY3RQb2xpY3koYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llc1wiLnJlcGxhY2UoXCJ7cHJvamVjdH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInByb2plY3RcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuY3JlYXRlUHJvamVjdFBvbGljeSA9IGNyZWF0ZVByb2plY3RQb2xpY3k7XG4vKipcbiAqIERlbGV0ZSB0aGUgY3VzdG9tIHBvbGljeSBpbiB0aGUgUHJvamVjdFxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZVBvbGljaWVzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHVwZGF0ZSBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZSB0aGUgY3VzdG9tIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuZnVuY3Rpb24gZGVsZXRlUHJvamVjdFBvbGljeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHJvamVjdHMve3Byb2plY3R9L3BvbGljaWVzL3twb2xpY3l9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3BvbGljeX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInBvbGljeVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlUHJvamVjdFBvbGljeSA9IGRlbGV0ZVByb2plY3RQb2xpY3k7XG4vKipcbiAqIERldGFjaGVkIHRoZSByZXF1ZXN0ZWQgY3VzdG9tIFByb2plY3QgUG9saWN5IGZyb20gYSBNZW1iYmVyXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlTWVtYmVycyoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBkZXRhY2ggYSBjdXN0b20gcG9saWN5IGluIGEgUHJvamVjdCBmcm9tIGEgbWVtYmVyLCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb25zIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VNZW1iZXJzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqIEFORFxuICogKiBcImFjdGlvblwiIDogXCJtYW5hZ2VQb2xpY2llc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIEluIHRoZSBQcm9qZWN0IHdvcmtmbG93LCB0aGUgYWJvdmUgcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFsbCBQcm9qZWN0IEFkbWlucyBhbmQgUmVzb3VyY2UgTWFuYWdlcnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBEZXRhY2ggdGhlIFByb2plY3QgUG9saWN5IGZyb20gYSBNZW1iZXJcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgbWVtYmVyLiBFaXRoZXIgdXNlciwgYXBwIG9yIGdyb3VwXG4gKiBAcGFyYW0gcG9saWN5IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBwb2xpY3kuIEZvciBIRVJFIHByb3ZpZGVkIHBvbGljaWVzLFxuICogdGhlIEhSTiBmb3JtYXQgd291bGQgYmUgLSBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmRlZmF1bHQ6cG9saWN5L3JlYWQtb25seS1hY2Nlc3MtdG8tYWxsLWNhdGFsb2dzXG4gKi9cbmZ1bmN0aW9uIGRldGFjaFByb2plY3RQb2xpY3lGcm9tTWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfS9wb2xpY2llcy97cG9saWN5fVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZXRhY2hQcm9qZWN0UG9saWN5RnJvbU1lbWJlciA9IGRldGFjaFByb2plY3RQb2xpY3lGcm9tTWVtYmVyO1xuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgYWxsIFByb2plY3QgTWVtYmVycyB3aXRoIHRoZSBhdHRhY2hlZCBQb2xpY3lcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlYWQgdGhlIGxpc3Qgb2YgYWxsIG1lbWJlcnMgYXR0YWNoZWQgdG8gYSBwcm9qZWN0IHBvbGljeSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgTWVtYmVycywgUHJvamVjdCBBZG1pbnMsIE9yZyBBZG1pbnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxpc3Qgb2YgYWxsIFByb2plY3QgTWVtYmVycyB3aXRoIHRoZSBhdHRhY2hlZCBQb2xpY3lcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIHBvbGljeSBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgcG9saWN5LiBGb3IgSEVSRSBwcm92aWRlZCBwb2xpY2llcyxcbiAqIHRoZSBIUk4gZm9ybWF0IHdvdWxkIGJlIC0gaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpkZWZhdWx0OnBvbGljeS9yZWFkLW9ubHktYWNjZXNzLXRvLWFsbC1jYXRhbG9nc1xuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuIElmIG5vdCBwcmVzZW50IGluIHRoZSBpbmNvbWluZyByZXF1ZXN0LFxuICogaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsUHJvamVjdE1lbWJlcnNXaXRoQXR0YWNoZWRQb2xpY3koYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llcy97cG9saWN5fS9tZW1iZXJzXCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3BvbGljeX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInBvbGljeVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEFsbFByb2plY3RNZW1iZXJzV2l0aEF0dGFjaGVkUG9saWN5ID0gZ2V0QWxsUHJvamVjdE1lbWJlcnNXaXRoQXR0YWNoZWRQb2xpY3k7XG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBBdHRhY2hlZCBQcm9qZWN0IFBvbGljaWVzIEZvciBhIE1lbWJlclxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKnJlYWQqKiBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuXG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gcmVhZCB0aGUgbGlzdCBvZiB0aGUgYXR0YWNoZWQgcHJvamVjdCBwb2xpY2llcywgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgTWVtYmVycywgUHJvamVjdCBBZG1pbnMsIE9yZyBBZG1pbnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxpc3Qgb2YgQXR0YWNoZWQgUHJvamVjdCBQb2xpY2llcyBGb3IgYSBNZW1iZXJcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgbWVtYmVyLiBFaXRoZXIgdXNlciwgYXBwIG9yIGdyb3VwXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSUQgQ29ycmVsYXRlcyBIVFRQIHJlcXVlc3RzIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci5cbiAqICBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLlxuICogQHBhcmFtIHBhZ2VUb2tlbiBUaGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uLiBQcmVzZW50IG9ubHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYWdlIG9mIGRhdGEgdG8gdmlldy5cbiAqL1xuZnVuY3Rpb24gZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWNpZXNGb3JNZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9L3BvbGljaWVzXCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JRFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEF0dGFjaGVkUHJvamVjdFBvbGljaWVzRm9yTWVtYmVyID0gZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWNpZXNGb3JNZW1iZXI7XG4vKipcbiAqIEdldCB0aGUgYXR0YWNoZWQgUHJvamVjdCBQb2xpY3kgRm9yIGEgTWVtYmVyXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byByZWFkIHRoZSBhdHRhY2hlZCBwcm9qZWN0IHBvbGljeSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgTWVtYmVycywgUHJvamVjdCBBZG1pbnMsIE9yZyBBZG1pbnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGF0dGFjaGVkIFByb2plY3QgUG9saWN5IGZvciBhIE1lbWJlclxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gbWVtYmVyIEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBtZW1iZXIuIEVpdGhlciB1c2VyLCBhcHAgb3IgZ3JvdXBcbiAqIEBwYXJhbSBwb2xpY3kgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0IHBvbGljeS4gRm9yIEhFUkUgcHJvdmlkZWQgcG9saWNpZXMsXG4gKiB0aGUgSFJOIGZvcm1hdCB3b3VsZCBiZSAtIGhybjpoZXJlOmF1dGhvcml6YXRpb246Om15cmVhbG06ZGVmYXVsdDpwb2xpY3kvcmVhZC1vbmx5LWFjY2Vzcy10by1hbGwtY2F0YWxvZ3NcbiAqL1xuZnVuY3Rpb24gZ2V0QXR0YWNoZWRQcm9qZWN0UG9saWN5Rm9yTWVtYmVyKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vbWVtYmVycy97bWVtYmVyfS9wb2xpY2llcy97cG9saWN5fVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttZW1iZXJ9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtZW1iZXJcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7cG9saWN5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicG9saWN5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEF0dGFjaGVkUHJvamVjdFBvbGljeUZvck1lbWJlciA9IGdldEF0dGFjaGVkUHJvamVjdFBvbGljeUZvck1lbWJlcjtcbi8qKlxuICogR2V0IHRoZSByZXF1ZXN0ZWQgUHJvamVjdCBQb2xpY3lcbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlYWQgYSBwcm9qZWN0IHBvbGljeSwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uIHdvdWxkIGJlIHJlcXVpcmVkOlxuICogKiBcImFjdGlvblwiIDogXCJyZWFkXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICAqIEluIHRoZSBQcm9qZWN0IHdvcmtmbG93LCB0aGUgYWJvdmUgcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFsbCBQcm9qZWN0IE1lbWJlcnMsIFByb2plY3QgQWRtaW5zLCBPcmcgQWRtaW5zXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IHRoZSBQcm9qZWN0IFBvbGljeVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gcG9saWN5IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBwb2xpY3kuIEZvciBIRVJFIHByb3ZpZGVkIHBvbGljaWVzLFxuICogdGhlIEhSTiBmb3JtYXQgd291bGQgYmUgLSBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmRlZmF1bHQ6cG9saWN5L3JlYWQtb25seS1hY2Nlc3MtdG8tYWxsLWNhdGFsb2dzXG4gKi9cbmZ1bmN0aW9uIGdldFByb2plY3RQb2xpY3koYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llcy97cG9saWN5fVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntwb2xpY3l9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwb2xpY3lcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0UHJvamVjdFBvbGljeSA9IGdldFByb2plY3RQb2xpY3k7XG4vKipcbiAqIExpc3QgdGhlIFBvbGljaWVzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIG1lbWJlcnMgb2YgdGhlIFByb2plY3QuXG4gKiBUaGlzIGxpc3Qgd2lsbCBjb250YWluIGFsbCB0aGUgSEVSRSBwcm92aWRlZCBwb2xpY2llcyBhbmQgYW55IGN1c3RvbSB1c2VyIGRlZmluZWQgcG9saWNpZXMgY3JlYXRlZCBpbiB0aGUgUHJvamVjdC5cbiAqXG4gKiBBY2Nlc3MgQ29udHJvbDpcbiAqICogVXNlciBBY2Nlc3MgVG9rZW4gJiBDbGllbnQgQWNjZXNzIFRva2VuXG4gKiAqIFRoZSBjYWxsaW5nIHByaW5jaXBhbCAqKm11c3QqKiBoYXZlIHBlcm1pc3Npb24gdG8gdGFrZSB0aGUgKipyZWFkKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHJlYWQgYSBwb2xpY3kgbGlzdCBvZiBhIFByb2plY3QsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIEluIHRoZSBQcm9qZWN0IHdvcmtmbG93LCB0aGUgYWJvdmUgcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFsbCBQcm9qZWN0IE1lbWJlcnMsIFByb2plY3QgQWRtaW5zLCBPcmcgQWRtaW5zXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgTGlzdCB0aGUgUG9saWNpZXMgaW4gYSBQcm9qZWN0XG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCxcbiAqIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICogQHBhcmFtIHByb2plY3RQb2xpY3lUeXBlIFRoZSB0eXBlIG9mIHRoZSBQcm9qZWN0IFBvbGljeVxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIGN1cnNvciBmb3IgcGFnaW5hdGlvbi4gUHJlc2VudCBvbmx5IGlmIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiBkYXRhIHRvIHZpZXcuXG4gKi9cbmZ1bmN0aW9uIGdldFByb2plY3RQb2xpY3lMaXN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vcG9saWNpZXNcIi5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicHJvamVjdFBvbGljeVR5cGVcIiwgcGFyYW1zW1wicHJvamVjdFBvbGljeVR5cGVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFnZVRva2VuXCIsIHBhcmFtc1tcInBhZ2VUb2tlblwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklEXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlEXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0UHJvamVjdFBvbGljeUxpc3QgPSBnZXRQcm9qZWN0UG9saWN5TGlzdDtcbi8qKlxuICogU2V0cyB0aGUgQXR0YWNoZWQgUG9saWNpZXMgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBQcm9qZWN0IE1lbWJlciwgb3ZlcndyaXRpbmcgYW55IHByZS1leGlzdGluZyBBdHRhY2hlZCBQb2xpY2llcy5cbiAqIFRoZSByZXF1ZXN0IGJvZHkgd2lsbCByZXBsYWNlIGFueSBwcmUtZXhpc3RpbmcgUG9saWN5IGF0dGFjaG1lbnQocyksIGFuZCByZXBsYWNlIHRoYXQgbGlzdCB3aXRoIHRob3NlIFBvbGljaWVzXG4gKiBpZGVudGlmaWVkIGluIHRoZSByZXF1ZXN0IGJvZHkuXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqbWFuYWdlTWVtYmVycyoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAqXG4gKiAqIEV4YW1wbGU6XG4gKiBJbiBvcmRlciB0byBhdHRhY2ggYSBjdXN0b20gcG9saWN5IGluIGEgUHJvamVjdCB0byBhIG1lbWJlciwgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9ucyB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwibWFuYWdlTWVtYmVyc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiICAgICAgQU5EICAgICAgKiBcImFjdGlvblwiIDogXCJtYW5hZ2VQb2xpY2llc1wiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIEluIHRoZSBQcm9qZWN0IHdvcmtmbG93LCB0aGUgYWJvdmUgcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFsbCBQcm9qZWN0IEFkbWlucyBhbmQgUmVzb3VyY2UgTWFuYWdlcnNcbiAqICogVGhpcyBBUEkgd29ya3Mgb25seSB3aXRoIHRva2VucyB0aGF0IGFyZSBub3Qgc2NvcGVkIHRvIGEgcHJvamVjdC5cbiAqXG4gKiBAc3VtbWFyeSBTZXQgQXR0YWNoZWQgUG9saWNpZXMgZm9yIE1lbWJlclxuICogQHBhcmFtIGJvZHlcbiAqIEBwYXJhbSBwcm9qZWN0IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdFxuICogQHBhcmFtIG1lbWJlciBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3QgbWVtYmVyLiBFaXRoZXIgdXNlciwgYXBwIG9yIGdyb3VwXG4gKi9cbmZ1bmN0aW9uIHNldEF0dGFjaGVkUHJvamVjdFBvbGljaWVzVG9NZW1iZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9tZW1iZXJzL3ttZW1iZXJ9L3BvbGljaWVzXCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3Byb2plY3R9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwcm9qZWN0XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie21lbWJlcn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm1lbWJlclwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5zZXRBdHRhY2hlZFByb2plY3RQb2xpY2llc1RvTWVtYmVyID0gc2V0QXR0YWNoZWRQcm9qZWN0UG9saWNpZXNUb01lbWJlcjtcbi8qKlxuICogVXBkYXRlIHRoZSByZXF1ZXN0ZWQgY3VzdG9tIHBvbGljeSBpbiB0aGUgUHJvamVjdFxuICpcbiAqIEFjY2VzcyBDb250cm9sOlxuICogKiBVc2VyIEFjY2VzcyBUb2tlbiAmIENsaWVudCBBY2Nlc3MgVG9rZW5cbiAqICogVGhlIGNhbGxpbmcgcHJpbmNpcGFsICoqbXVzdCoqIGhhdmUgcGVybWlzc2lvbiB0byB0YWtlIHRoZSAqKm1hbmFnZVBvbGljaWVzKiogYWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICpcbiAqICogRXhhbXBsZTpcbiAqIEluIG9yZGVyIHRvIHVwZGF0ZSBhIGN1c3RvbSBwb2xpY3kgaW4gYSBQcm9qZWN0LCB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb24gd291bGQgYmUgcmVxdWlyZWQ6XG4gKiAqIFwiYWN0aW9uXCIgOiBcIm1hbmFnZVBvbGljaWVzXCJcbiAqICogXCJyZXNvdXJjZVwiIDogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCJcbiAqICogSW4gdGhlIFByb2plY3Qgd29ya2Zsb3csIHRoZSBhYm92ZSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYWxsIFByb2plY3QgQWRtaW5zIGFuZCBSZXNvdXJjZSBNYW5hZ2Vyc1xuICogKiBUaGlzIEFQSSB3b3JrcyBvbmx5IHdpdGggdG9rZW5zIHRoYXQgYXJlIG5vdCBzY29wZWQgdG8gYSBwcm9qZWN0LlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcmVxdWVzdGVkIFByb2plY3QgUG9saWN5XG4gKiBAcGFyYW0gYm9keVxuICogQHBhcmFtIHByb2plY3QgSFJOIGlkZW50aWZ5aW5nIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gcG9saWN5IEhSTiBpZGVudGlmeWluZyB0aGUgcHJvamVjdCBwb2xpY3kuIEZvciBIRVJFIHByb3ZpZGVkIHBvbGljaWVzLFxuICogdGhlIEhSTiBmb3JtYXQgd291bGQgYmUgLSBocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOmRlZmF1bHQ6cG9saWN5L3JlYWQtb25seS1hY2Nlc3MtdG8tYWxsLWNhdGFsb2dzXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVByb2plY3RQb2xpY3koYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Byb2plY3RzL3twcm9qZWN0fS9wb2xpY2llcy97cG9saWN5fVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntwb2xpY3l9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwb2xpY3lcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy51cGRhdGVQcm9qZWN0UG9saWN5ID0gdXBkYXRlUHJvamVjdFBvbGljeTtcbi8qKlxuICogR2V0cyB0aGUgYWN0aW9ucyBsaXN0IGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLlxuICpcbiAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhY3Rpb25zIGFyZSBmaWx0ZXJlZCBiYXNlZCBvbiB0aGUgcmVsYXRpb24gb2YgdGhlIHJlc291cmNlLCBlaXRoZXIgaG9tZSBvciByZWZlcmVuY2Ugd2l0aCB0aGUgYWxsb3dlZCBhY3Rpb25zLlxuICogVGhpcyBBUEkgcHJvdmlkZXMgYSBsaXN0IG9mIGF2YWlsYWJsZSBhY3Rpb25zIGR1cmluZyBwcm9qZWN0IHdvcmtmbG93cyBsaWtlIGxpbmtpbmcgb3IgcHJvamVjdCBwb2xpY3kgY3JlYXRpb24uXG4gKlxuICogQWNjZXNzIENvbnRyb2w6XG4gKiAqIFVzZXIgQWNjZXNzIFRva2VuICYgQ2xpZW50IEFjY2VzcyBUb2tlblxuICogKiBUaGUgY2FsbGluZyBwcmluY2lwYWwgKiptdXN0KiogaGF2ZSBwZXJtaXNzaW9uIHRvIHRha2UgdGhlICoqcmVhZCoqIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0XG4gKlxuICogKiBFeGFtcGxlOlxuICogSW4gb3JkZXIgdG8gZ2V0IHJlc291cmNlIFwiaHJuOmhlcmU6ZGF0YTo6bXlyZWFsbTpteS1jYXRhbG9nLTAwMDBcIiBpbiB0aGUgcHJvamVjdFxuICogXCJocm46aGVyZTphdXRob3JpemF0aW9uOjpteXJlYWxtOnByb2plY3QvbXktcHJvamVjdC0wMDAwXCIsIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbiB3b3VsZCBiZSByZXF1aXJlZDpcbiAqICogXCJhY3Rpb25cIiA6IFwicmVhZFwiXG4gKiAqIFwicmVzb3VyY2VcIiA6IFwiaHJuOmhlcmU6YXV0aG9yaXphdGlvbjo6bXlyZWFsbTpwcm9qZWN0L215LXByb2plY3QtMDAwMFwiXG4gKiAqIFRoaXMgQVBJIHdvcmtzIG9ubHkgd2l0aCB0b2tlbnMgdGhhdCBhcmUgbm90IHNjb3BlZCB0byBhIHByb2plY3QuXG4gKlxuICogQHN1bW1hcnkgR2V0IGEgbGlzdCBvZiBhY3Rpb25zIHRoYXQgYXJlIGFsbG93ZWQgZm9yIHRoZSBwcm9qZWN0IHJlc291cmNlXG4gKiBAcGFyYW0gcHJvamVjdCBIUk4gaWRlbnRpZnlpbmcgdGhlIHByb2plY3RcbiAqIEBwYXJhbSByZXNvdXJjZSBUaGUgaHJuIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBhY3Rpb24gZm9yIHRoZSByZXNvdXJjZSB0eXBlLlxuICogLSBsaW5rYWJsZSA6IEFjdGlvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBsaW5rZWRcbiAqIC0gcHJvamVjdEVuYWJsZWQgOiBBY3Rpb25zIHRoYXQgYXJlIGVuYWJsZWQgZm9yIFByb2plY3RzIGFjY2Vzc1xuICogLSByZXF1aXJlZFRvTWFrZUxpbmthYmxlIDogQWN0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB3aGVuIGFuIGlkZW50aXR5IGlzIG1ha2luZyBhIHJlc291cmNlIGxpbmthYmxlIHRvIGEgcmVhbG0gb3Igb3RoZXIgcHJvamVjdHNcbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JRCBDb3JyZWxhdGVzIEhUVFAgcmVxdWVzdHMgYmV0d2VlbiBhIGNsaWVudCBhbmQgc2VydmVyLlxuICogSWYgbm90IHByZXNlbnQgaW4gdGhlIGluY29taW5nIHJlcXVlc3QsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLlxuICovXG5mdW5jdGlvbiBnZXRSZXNvdXJjZUFjdGlvbnNGb3JQcm9qZWN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wcm9qZWN0cy97cHJvamVjdH0vcmVzb3VyY2VzL3tyZXNvdXJjZX0vYWN0aW9uc1wiXG4gICAgICAgICAgICAucmVwbGFjZShcIntwcm9qZWN0fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicHJvamVjdFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntyZXNvdXJjZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInJlc291cmNlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidHlwZVwiLCBwYXJhbXNbXCJ0eXBlXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRSZXNvdXJjZUFjdGlvbnNGb3JQcm9qZWN0ID0gZ2V0UmVzb3VyY2VBY3Rpb25zRm9yUHJvamVjdDtcbi8qKlxuICogR2V0cyB0aGUgYWN0aW9ucyBsaXN0IGZvciB0aGUgcmVzb3VyY2UgdHlwZSBiYXNlZCBvbiB0aGUgcXVlcnkgcGFyYW1ldGVycy5cbiAqXG4gKiBAc3VtbWFyeSBHZXQgYSBsaXN0IG9mIGFjdGlvbnMgZm9yIHRoZSByZXNvdXJjZSB0eXBlXG4gKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIGFjdGlvbiBmb3IgdGhlIHJlc291cmNlIHR5cGUuXG4gKiAtIGxpbmthYmxlIDogQWN0aW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIGxpbmtlZFxuICogLSBwcm9qZWN0RW5hYmxlZCA6IEFjdGlvbnMgdGhhdCBhcmUgZW5hYmxlZCBmb3IgUHJvamVjdHMgYWNjZXNzXG4gKiAtIHJlcXVpcmVkVG9NYWtlTGlua2FibGUgOiBBY3Rpb25zIHRoYXQgYXJlIHJlcXVpcmVkIHdoZW4gYW4gaWRlbnRpdHkgaXMgbWFraW5nIGEgcmVzb3VyY2UgbGlua2FibGUgdG8gYSByZWFsbSBvciBvdGhlciBwcm9qZWN0c1xuICogQHBhcmFtIHhDb3JyZWxhdGlvbklEIENvcnJlbGF0ZXMgSFRUUCByZXF1ZXN0cyBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuXG4gKiBJZiBub3QgcHJlc2VudCBpbiB0aGUgaW5jb21pbmcgcmVxdWVzdCwgaXQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFJlc291cmNlVHlwZUFjdGlvbkxpc3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3Jlc291cmNlVHlwZXMve3Jlc291cmNlVHlwZX0vYWN0aW9uc1wiLnJlcGxhY2UoXCJ7cmVzb3VyY2VUeXBlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicmVzb3VyY2VUeXBlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidHlwZVwiLCBwYXJhbXNbXCJ0eXBlXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSURcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSURcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JRFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRSZXNvdXJjZVR5cGVBY3Rpb25MaXN0ID0gZ2V0UmVzb3VyY2VUeXBlQWN0aW9uTGlzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kb1VwbG9hZFBhcnQgPSBleHBvcnRzLmRvQ29tcGxldGVNdWx0aXBhcnRVcGxvYWQgPSBleHBvcnRzLnN0YXJ0TXVsdGlwYXJ0VXBsb2FkID0gZXhwb3J0cy5wdXREYXRhID0gZXhwb3J0cy5nZXRNdWx0aXBhcnRVcGxvYWRTdGF0dXMgPSBleHBvcnRzLmdldEJsb2IgPSBleHBvcnRzLmRlbGV0ZUJsb2IgPSBleHBvcnRzLmNoZWNrQmxvYkV4aXN0c1N0YXR1cyA9IGV4cG9ydHMuY2FuY2VsTXVsdGlwYXJ0VXBsb2FkID0gdm9pZCAwO1xuLyoqXG4gKiBCbG9iIEFQSSB2MVxuICogVGhlIGBibG9iYCBzZXJ2aWNlIHN1cHBvcnRzIHRoZSB1cGxvYWQgYW5kIHJldHJpZXZhbCBvZiBsYXJnZSB2b2x1bWVzIG9mIGRhdGEgZnJvbSB0aGUgc3RvcmFnZSBvZiBhIGNhdGFsb2cuXG4gKiBFYWNoIGRpc2NyZXRlIGNodW5rIG9mIGRhdGEgaXMgc3RvcmVkIGFzIGEgYmxvYiAoQmluYXJ5IExhcmdlIE9iamVjdCkuIEVhY2ggYmxvYiBoYXMgaXRzIG93biB1bmlxdWUgSUQgKGRhdGEgaGFuZGxlKS5cbiAqIFRoZSBkYXRhIGhhbmRsZXMgY2FuIGJlIHN0b3JlZCBpbiAgc2VydmljZXMgbGlrZSBgbWV0YWRhdGFgLCBgaW5kZXhgIG9yIGBzdHJlYW1gLlxuICogVG8gZ2V0IGRhdGEsIHlvdSBmaXJzdCB1c2UgdGhlIGFueSBvZiB0aG9zZSBzZXJ2aWNlcyB0byByZXRyaWV2ZSB0aGUgZGF0YSBoYW5kbGUgb2YgdGhlIHJlbGV2YW50IGJsb2JzLlxuICogWW91IHRoZW4gdXNlIHRoZSBkYXRhIGhhbmRsZSB0byBwdWxsIHRoZSBkYXRhIHVzaW5nIHRoZSBgYmxvYmAgc2VydmljZS5cbiAqIElmIHlvdSBhcmUgd3JpdGluZyB0byBhIHZvbGF0aWxlIGxheWVyLCBzZWUgdm9sYXRpbGUtYmxvYiBBUEkgZGVmaW5pdGlvbi5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjRcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJsb2JBcGlcbiAqL1xuLyoqXG4gKiBDYW5jZWxzIGFuIGVudGlyZSBtdWx0aXBhcnQgdXBsb2FkIG9wZXJhdGlvbi4gWW91IGNhbiBvbmx5IGNhbmNlbCBhIG11bHRpcGFydCB1cGxvYWQgYmVmb3JlIGl0IGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAqIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgYWN0dWFsIFVSTCBmb3IgdGhpcyBvcGVyYXRpb24gbXVzdCBiZSBvYnRhaW5lZCBmcm9tIHRoZSByZXNwb25zZSBib2R5IG9mIHN0YXJ0IG11bHRpcGFydFxuICogb3BlcmF0aW9uIHRoYXQgaXMgJ1BPU1QgL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX0vbXVsdGlwYXJ0cycgZnJvbSB0aGUgJ2RlbGV0ZScgZWxlbWVudCB1bmRlclxuICogdGhlIHRvcCBsZXZlbCAnbGlua3MnIGVsZW1lbnQgb2YgdGhlIHJlc3BvbnNlLlxuICpcbiAqIEBzdW1tYXJ5IENhbmNlbHMgYSBtdWx0aXBhcnQgdXBsb2FkXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIGRhdGEgYmxvYiBwYXJ0IGJlbG9uZ3MgdG8uIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXJcbiAqIG11c3QgcmVmZXIgdG8gYSB2YWxpZCBsYXllciBhbHJlYWR5IGNvbmZpZ3VyZWQgaW4gdGhlIGNhdGFsb2cgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgYmxvYiB3aGljaCB0aGUgcGFydCBiZWxvbmdzIHRvLlxuICogVGhlIGRhdGEgaGFuZGxlIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLCAmIzM5Oy0mIzM5OyBhbmQgJiMzOTsuJiMzOTsgY2hhcmFjdGVycywgWzAtOSwgYS16LCBBLVosIC0sIC5dLlxuICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIG11bHRpUGFydFRva2VuIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtdWx0aSBwYXJ0IHVwbG9hZCAodG9rZW4pLiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG9cbiAqXG4gKiBhIHZhbGlkIHRva2VuIHJldHJpZXZlZCB3aGVuIHN0YXJ0aW5nIHRoZSBtdWx0aXBhcnQgdXBsb2FkLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gY2FuY2VsTXVsdGlwYXJ0VXBsb2FkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHMve211bHRpUGFydFRva2VufVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttdWx0aVBhcnRUb2tlbn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm11bHRpUGFydFRva2VuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jYW5jZWxNdWx0aXBhcnRVcGxvYWQgPSBjYW5jZWxNdWx0aXBhcnRVcGxvYWQ7XG4vKipcbiAqIENoZWNrcyBpZiBhIGJsb2IgZXhpc3RzIGZvciB0aGUgcmVxdWVzdGVkIGRhdGEgaGFuZGxlLlxuICpcbiAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhIGRhdGEgaGFuZGxlIGV4aXN0c1xuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBibG9iIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2IncyBjb250ZW50cy5cbiAqIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgXCItXCIgYW5kIFwiLlwiIGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS5cbiAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQmxvYkV4aXN0c1N0YXR1cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jaGVja0Jsb2JFeGlzdHNTdGF0dXMgPSBjaGVja0Jsb2JFeGlzdHNTdGF0dXM7XG4vKipcbiAqIERlbGV0ZXMgYSBkYXRhIGJsb2IgZnJvbSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSAodm9sdW1lKS4gV2hlbiB5b3UgZGVsZXRlIGEgYmxvYiwgeW91IGNhbm5vdCB1cGxvYWRcbiAqIGRhdGEgdG8gdGhlIGRlbGV0ZWQgYmxvYidzIGRhdGEgaGFuZGxlIGZvciBhdCBsZWFzdCAzIGRheXMuIFRoZSBERUxFVEUgbWV0aG9kIHdvcmtzIG9ubHkgZm9yIGluZGV4IGxheWVycy5cbiAqIERFTEVURSByZXF1ZXN0cyBmb3IgYmxvYnMgc3RvcmVkIGZvciBvdGhlciBraW5kIG9mIGxheWVycyB3aWxsIGJlIHJlamVjdGVkLlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZXMgYSBkYXRhIGJsb2IgZnJvbSBhbiBpbmRleCBsYXllci5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgZGF0YSBibG9iIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgb2YgdGhlIGJsb2IgeW91IHdhbnQgdG8gZGVsZXRlLiBUaGUgZGF0YSBoYW5kbGUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsXG4gKiAmIzM5Oy0mIzM5OyBhbmQgJiMzOTsuJiMzOTsgY2hhcmFjdGVycywgWzAtOSwgYS16LCBBLVosIC0sIC5dLiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlQmxvYihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlQmxvYiA9IGRlbGV0ZUJsb2I7XG4vKipcbiAqIFJldHJpZXZlcyBhIGJsb2IgZnJvbSBzdG9yYWdlLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgYSBibG9iXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJiMzOTtzIGNvbnRlbnRzLlxuICogVGhlIGRhdGEgaGFuZGxlIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLCAmIzM5Oy0mIzM5OyBhbmQgJiMzOTsuJiMzOTsgY2hhcmFjdGVycywgWzAtOSwgYS16LCBBLVosIC0sIC5dLlxuICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqIEBwYXJhbSByYW5nZSBVc2UgdGhpcyBwYXJhbWV0ZXIgdG8gcmVzdW1lIGRvd25sb2FkIG9mIGEgbGFyZ2UgcmVzcG9uc2Ugd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gaXNzdWUgYmV0d2VlblxuICogdGhlIGNsaWVudCBhbmQgc2VydmVyLCBvciB0byBmZXRjaCBhIHNwZWNpZmljIHNsaWNlIG9mIHRoZSBibG9iLiBUbyByZXN1bWUgZG93bmxvYWQgYWZ0ZXIgYSBjb25uZWN0aW9uIGlzc3VlLFxuICogc3BlY2lmeSBhIHNpbmdsZSBieXRlIHJhbmdlIG9mZnNldCBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqIFRvIGZldGNoIGEgc3BlY2lmaWMgc2xpY2Ugb2YgdGhlIGJsb2IsIHNwZWNpZnkgYSBzbGljZSBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLTEwMCYjeDYwOy5cbiAqIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudCB3aXRoIFtSRkMgNzIzM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMpLCBidXQgbm90ZSB0aGF0IHRoaXNcbiAqIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGJ5dGUgcmFuZ2UuIFRoZSAmI3g2MDtyYW5nZSYjeDYwOyBwYXJhbWV0ZXIgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGFzXG4gKiBhIHF1ZXJ5IHBhcmFtZXRlciwgaS5lLiAmI3g2MDtyYW5nZSYjeDNEO2J5dGVzJiN4M0Q7MTAtJiN4NjA7LlxuICovXG5mdW5jdGlvbiBnZXRCbG9iKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wicmFuZ2VcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlJhbmdlXCJdID0gcGFyYW1zW1wicmFuZ2VcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEJsb2IgPSBnZXRCbG9iO1xuLyoqXG4gKiBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtdWx0aXBhcnQgdXBsb2FkLiBUaGUgc3RhdHVzIGNhbiBiZSByZWNlaXZlZCBvbmx5IHdoZW4gdGhlIHVwbG9hZCBoYXMgYmVlbiBjb21wbGV0ZWQuXG4gKiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGFjdHVhbCBVUkwgZm9yIHRoaXMgb3BlcmF0aW9uIG11c3QgYmUgb2J0YWluZWQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keSBvZiBzdGFydFxuICogbXVsdGlwYXJ0IG9wZXJhdGlvbiB0aGF0IGlzICdQT1NUIC9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHMnIGZyb20gdGhlICdzdGF0dXMnIGVsZW1lbnRcbiAqIHVuZGVyIHRoZSB0b3AgbGV2ZWwgJ2xpbmtzJyBlbGVtZW50IG9mIHRoZSByZXNwb25zZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtdWx0aXBhcnQgdXBsb2FkLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBkYXRhIGJsb2IgcGFydCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgaXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgYmxvYiB3aGljaCB0aGUgcGFydCBiZWxvbmdzIHRvLlxuICogVGhlIGRhdGEgaGFuZGxlIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLCAmIzM5Oy0mIzM5OyBhbmQgJiMzOTsuJiMzOTsgY2hhcmFjdGVycywgWzAtOSwgYS16LCBBLVosIC0sIC5dLlxuICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQgaXMgMTAyNCBjaGFyYWN0ZXJzLlxuICogQHBhcmFtIG11bHRpUGFydFRva2VuIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtdWx0aXBhcnQgdXBsb2FkICh0b2tlbikuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhXG4gKiB2YWxpZCB0b2tlbiB3aGljaCB3YXMgcHJvdmlkZWQgd2hlbiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCB3YXMgaW5pdGlhdGVkLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBnZXRNdWx0aXBhcnRVcGxvYWRTdGF0dXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX0vbXVsdGlwYXJ0cy97bXVsdGlQYXJ0VG9rZW59XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie211bHRpUGFydFRva2VufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibXVsdGlQYXJ0VG9rZW5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldE11bHRpcGFydFVwbG9hZFN0YXR1cyA9IGdldE11bHRpcGFydFVwbG9hZFN0YXR1cztcbi8qKlxuICogUGVyc2lzdHMgdGhlIGRhdGEgYmxvYiBpbiB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSAodm9sdW1lKS5cbiAqIFVzZSB0aGlzIHVwbG9hZCBtZWNoYW5pc20gZm9yIGJsb2JzIHNtYWxsZXIgdGhhbiA1MCBNQi5cbiAqIFRoZSBzaXplIGxpbWl0IGZvciBibG9icyB1cGxvYWRlZCB0aGlzIHdheSBpcyA1IEdCIGJ1dCB3ZSBkbyBub3QgcmVjb21tZW5kIHVwbG9hZGluZyBibG9ic1xuICogdGhpcyBsYXJnZSB3aXRoIHRoaXMgbWV0aG9kLCBzbyB1c2UgbXVsdGlwYXJ0IHVwbG9hZCBpbnN0ZWFkLlxuICogV2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGRhdGEgYmxvYiB3aWxsIGJlXG4gKiBpbW1lZGlhdGVseSBhdmFpbGFibGUgYWx0aG91Z2ggaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlLlxuICogVG8gY2hlY2sgaWYgdGhlIGRhdGEgYmxvYiBpcyBhdmFpbGFibGUgdXNlIHRoZSBIRUFEIG1ldGhvZC5cbiAqXG4gKiBAc3VtbWFyeSBQdWJsaXNoZXMgYSBkYXRhIGJsb2JcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgZGF0YSBibG9iIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZGF0YUhhbmRsZSBUaGUgZGF0YSBoYW5kbGUgKElEKSByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBkYXRhIGJsb2IuXG4gKiBUaGUgZGF0YSBoYW5kbGUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsIFwiLVwiIGFuZCBcIi5cIiBjaGFyYWN0ZXJzLCBbMC05LCBhLXosIEEtWiwgLSwgLl0uXG4gKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZCBpcyAxMDI0IGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0gYm9keSBUaGUgZGF0YSB0byB1cGxvYWQuIENhbiBiZSBCbG9iIG9yIEJ1ZmZlci5cbiAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFNpemUgb2YgdGhlIGVudGl0eS1ib2R5LCBpbiBieXRlcy5cbiAqIEBwYXJhbSBjb250ZW50VHlwZSBBIHN0YW5kYXJkIE1JTUUgdHlwZSBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2IgZGF0YS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1JGQyAyNjE2LCBzZWN0aW9uIDE0LjE3OiBDb250ZW50LVR5cGVdKGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzE0Lmh0bWwjc2VjMTQuMTcpLlxuICogVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIG11c3QgbWF0Y2ggdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnRlbnRUeXBlIGZpZWxkIHdoZW4gdGhlIG11bHRpcGFydFxuICogdXBsb2FkIHdhcyBpbml0aWFsaXplZCwgYW5kIHRoaXMgY29udGVudCB0eXBlIG11c3QgYWxzbyBtYXRjaCB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgbGF5ZXIncyBjb25maWd1cmF0aW9uLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDcyMzAsIHNlY3Rpb24gMy4zLjI6IENvbnRlbnQtTGVuZ3RoXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yKS5cbiAqIEBwYXJhbSBjb250ZW50RW5jb2RpbmcgT3B0aW9uYWwgcGFyYW0sIGNhbiBiZSBgZ3ppcGAgb2YgYHVuZGVmaW5lZGAuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBwdXREYXRhKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2RhdGFIYW5kbGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJkYXRhSGFuZGxlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IHBhcmFtc1tcImJvZHlcIl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcImNvbnRlbnRUeXBlXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBwYXJhbXNbXCJjb250ZW50VHlwZVwiXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wiY29udGVudExlbmd0aFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSBwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXNbXCJjb250ZW50RW5jb2RpbmdcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtRW5jb2RpbmdcIl0gPSBwYXJhbXNbXCJjb250ZW50RW5jb2RpbmdcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnB1dERhdGEgPSBwdXREYXRhO1xuLyoqXG4gKiBQdWJsaXNoZXMgbGFyZ2UgZGF0YSBibG9icyB3aGVyZSB0aGUgZGF0YSBwYXlsb2FkIG5lZWRzIHRvIGJlIHNwbGl0IGludG8gbXVsdGlwbGUgcGFydHMuXG4gKiBUaGUgbXVsdGlwYXJ0IHVwbG9hZCBzdGFydCBpcyB0byBiZSBmb2xsb3dlZCBieSB0aGUgaW5kaXZpZHVhbCBwYXJ0cyB1cGxvYWQgYW5kIGNvbXBsZXRlZCB3aXRoIGFcbiAqIGNhbGwgdG8gY29tcGxldGUgdGhlIHVwbG9hZC4gVGhlIGxpbWl0IG9mIHRoZSBibG9iIHVwbG9hZGVkIHRoaXMgd2F5IGlzIDUwR0IuXG4gKlxuICogQHN1bW1hcnkgU3RhcnRzIGEgbXVsdGlwYXJ0IHVwbG9hZCBvZiBhIGJsb2IgYW5kIHJldHVybnMgVVJMcyBmb3IgdGhlIG5leHQgbXVsdGlwYXJ0IHVwbG9hZCBvcGVyYXRpb25zLlxuICogVGhlIFVSTHMgY29udGFpbiB0aGUgdXBsb2FkIHRva2VuLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBkYXRhIGJsb2IgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgYmxvYiB3aGljaCBjb250ZW50cyB3aWxsIGJlIHBlcnNpc3RlZC5cbiAqIFRoZSBkYXRhIGhhbmRsZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYywgJiMzOTstJiMzOTsgYW5kICYjMzk7LiYjMzk7IGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS5cbiAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBib2R5IGJvZHlcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0TXVsdGlwYXJ0VXBsb2FkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2RhdGEve2RhdGFIYW5kbGV9L211bHRpcGFydHNcIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnN0YXJ0TXVsdGlwYXJ0VXBsb2FkID0gc3RhcnRNdWx0aXBhcnRVcGxvYWQ7XG4vKipcbiAqIENhbGwgdGhpcyBBUEkgd2hlbiBhbGwgcGFydHMgaGF2ZSBiZWVuIHVwbG9hZGVkLiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGFjdHVhbCBVUkwgZm9yIHRoaXMgb3BlcmF0aW9uXG4gKiBtdXN0IGJlIG9idGFpbmVkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkgb2Ygc3RhcnQgbXVsdGlwYXJ0IG9wZXJhdGlvbiB0aGF0IGlzXG4gKiAnUE9TVCAvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfS9tdWx0aXBhcnRzJyBmcm9tIHRoZSAnY29tcGxldGUnIGVsZW1lbnQgdW5kZXIgdGhlIHRvcCBsZXZlbCAnbGlua3MnIGVsZW1lbnQgb2YgdGhlIHJlc3BvbnNlLlxuICpcbiAqIEBzdW1tYXJ5IENvbXBsZXRlcyBhIG11bHRpcGFydCB1cGxvYWRcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdGhhdCB0aGUgZGF0YSBibG9iIHBhcnQgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSAoSUQpIHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgYmxvYiB3aGljaCB0aGUgcGFydFxuICogYmVsb25ncyB0by4gVGhlIGRhdGEgaGFuZGxlIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljLCBcIi1cIjsgYW5kIFwiLlwiIGNoYXJhY3RlcnMsXG4gKiBbMC05LCBhLXosIEEtWiwgLSwgLl0uIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBtdWx0aVBhcnRUb2tlbiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbXVsdGkgcGFydCB1cGxvYWQgKHRva2VuKS4gQ29udGVudCBvZiB0aGlzIHBhcmFtZXRlciBtdXN0XG4gKiByZWZlciB0byBhIHZhbGlkIG5hbmQgc3RhcnRlZCBtdWx0aXBhcnQgdXBsb2FkLlxuICogQHBhcmFtIHBhcnRzIFRoZSBwYXJ0IGlkcyB1cGxvYWRlZCBpbiB0aGlzIG11bHRpcGFydCB1cGxvYWQgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHJlc3VsdGluZyBibG9iLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gZG9Db21wbGV0ZU11bHRpcGFydFVwbG9hZChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihwYXJhbXMudXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wicGFydHNcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wicGFydHNcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kb0NvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkID0gZG9Db21wbGV0ZU11bHRpcGFydFVwbG9hZDtcbi8qKlxuICogVXBsb2FkIGEgc2luZ2xlIHBhcnQgb2YgYSBtdWx0aXBhcnQgdXBsb2FkIGZvciB0aGUgYmxvYi4gRXZlcnkgdXBsb2FkZWQgcGFydCBleGNlcHQgdGhlIGxhc3Qgb25lIG11c3QgaGF2ZSBhXG4gKiBtaW5pbXVtIDUgTUIgb2YgZGF0YSBhbmQgbWF4aW11bSBvZiA1IEdCLCBidXQgd2UgZG8gbm90IHJlY29tbWVuZCB1cGxvYWRpbmcgcGFydHMgdGhpcyBsYXJnZS5cbiAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXJ0cyBpcyAxMCwwMDAuIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgYWN0dWFsIFVSTCBmb3IgdGhpcyBvcGVyYXRpb25cbiAqIG11c3QgYmUgb2J0YWluZWQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keSBvZiBzdGFydCBtdWx0aXBhcnQgb3BlcmF0aW9uIHRoYXQgaXMgJ1BPU1QgL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX0vbXVsdGlwYXJ0cydcbiAqIGZyb20gdGhlICd1cGxvYWRQYXJ0JyBlbGVtZW50IHVuZGVyIHRoZSB0b3AgbGV2ZWwgJ2xpbmtzJyBlbGVtZW50IG9mIHRoZSByZXNwb25zZS5cbiAqXG4gKiBAc3VtbWFyeSBVcGxvYWRzIGEgcGFydFxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0aGF0IHRoZSBkYXRhIGJsb2IgcGFydCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUgZGF0YSBibG9iIHdoaWNoIHRoZSBwYXJ0IGJlbG9uZ3MgdG8uIFRoZSBkYXRhIGhhbmRsZVxuICogY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMsICctJyBhbmQgJy4nIGNoYXJhY3RlcnMsIFswLTksIGEteiwgQS1aLCAtLCAuXS5cbiAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkIGlzIDEwMjQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSBtdWx0aVBhcnRUb2tlbiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbXVsdGkgcGFydCB1cGxvYWQgKHRva2VuKS4gQ29udGVudCBvZiB0aGlzIHBhcmFtZXRlclxuICogbXVzdCByZWZlciB0byBhIHZhbGlkIG5hbmQgc3RhcnRlZCBtdWx0aXBhcnQgdXBsb2FkLlxuICogQHBhcmFtIHBhcnROdW1iZXIgVGhlIG51bWJlciBvZiB0aGUgcGFydCBmb3IgdGhlIG11bHRpIHBhcnQgdXBsb2FkLiBUaGUgbnVtYmVycyBvZiB0aGUgdXBsb2FkIHBhcnRzXG4gKiBtdXN0IHN0YXJ0IGZyb20gMSwgYmUgbm8gZ3JlYXRlciB0aGFuIDEwLDAwMCBhbmQgYmUgY29uc2VjdXRpdmUuIFBhcnRzIHVwbG9hZGVkIHdpdGggdGhlIHNhbWUgJiN4NjA7cGFydE51bWJlciYjeDYwO1xuICogYXJlIG92ZXJyaWRkZW4uIERvIG5vdCByZXVzZSB0aGUgc2FtZSAncGFydG51bWJlcicgd2hlbiByZXRyeWluZyBhbiB1cGxvYWQgaW4gYW4gZXJyb3Igc2l0dWF0aW9uXG4gKiAobmV0d29yayBwcm9ibGVtcywgNHh4IG9yIDV4eCByZXNwb25zZXMpLiBSZXVzaW5nIHRoZSBzYW1lICYjeDYwO3BhcnRudW1iZXImI3g2MDsgaW4gYSByZXRyeSBtYXkgY2F1c2UgdGhlIHB1YmxpY2F0aW9uIHRvIGZhaWwuXG4gKiBAcGFyYW0gYm9keSBUaGUgZGF0YSB0byB1cGxvYWQgYXMgcGFydCBvZiB0aGUgYmxvYi5cbiAqIEBwYXJhbSBjb250ZW50VHlwZSBBIHN0YW5kYXJkIE1JTUUgdHlwZSBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2IgZGF0YS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW1JGQyAyNjE2LCBzZWN0aW9uIDE0LjE3OiBDb250ZW50LVR5cGVdKGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzE0Lmh0bWwjc2VjMTQuMTcpLlxuICogVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIG11c3QgbWF0Y2ggdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnRlbnRUeXBlIGZpZWxkIHdoZW4gdGhlIG11bHRpcGFydFxuICogdXBsb2FkIHdhcyBpbml0aWFsaXplZCwgYW5kIHRoaXMgY29udGVudCB0eXBlIG11c3QgYWxzbyBtYXRjaCB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgbGF5ZXIncyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIGNvbnRlbnRMZW5ndGggU2l6ZSBvZiB0aGUgZW50aXR5LWJvZHksIGluIGJ5dGVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbixcbiAqIHNlZSBbUkZDIDcyMzAsIHNlY3Rpb24gMy4zLjI6IENvbnRlbnQtTGVuZ3RoXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yKS5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGRvVXBsb2FkUGFydChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihwYXJhbXMudXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcnROdW1iZXJcIiwgcGFyYW1zW1wicGFydE51bWJlclwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IHBhcmFtc1tcImJvZHlcIl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcImNvbnRlbnRUeXBlXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBwYXJhbXNbXCJjb250ZW50VHlwZVwiXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wiY29udGVudExlbmd0aFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSBwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kb1VwbG9hZFBhcnQgPSBkb1VwbG9hZFBhcnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudXBsb2FkUGFydEJ5S2V5ID0gZXhwb3J0cy5zdGFydE11bHRpcGFydFVwbG9hZEJ5S2V5ID0gZXhwb3J0cy5wdXRCbG9iQnlLZXkgPSBleHBvcnRzLmxpc3RLZXlzID0gZXhwb3J0cy5nZXRNdWx0aXBhcnRVcGxvYWRTdGF0dXNCeUtleSA9IGV4cG9ydHMuZ2V0QmxvYkJ5S2V5ID0gZXhwb3J0cy5kZWxldGVCbG9iQnlLZXkgPSBleHBvcnRzLmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkQnlLZXkgPSBleHBvcnRzLmNoZWNrS2V5RXhpc3RzID0gZXhwb3J0cy5jYW5jZWxNdWx0aXBhcnRVcGxvYWRCeUtleSA9IHZvaWQgMDtcbi8qKlxuICogQmxvYiBBUEkgdjJcbiAqIFRoZSBgYmxvYmAgc2VydmljZSBzdXBwb3J0cyB0aGUgdXBsb2FkIGFuZCByZXRyaWV2YWwgb2YgbGFyZ2Ugdm9sdW1lcyBvZiBkYXRhIGZyb20gdGhlIHN0b3JhZ2Ugb2YgYSBjYXRhbG9nLlxuICogRWFjaCBkaXNjcmV0ZSBjaHVuayBvZiBkYXRhIGlzIHN0b3JlZCBhcyBhIGJsb2IgKEJpbmFyeSBMYXJnZSBPYmplY3QpLiBFYWNoIGJsb2IgaGFzIGl0cyBvd24gdW5pcXVlIElEIChoYW5kbGUgb3Iga2V5KSxcbiAqIHdoaWNoIGNhbiBiZSBzdG9yZWQgYXMgcGFydGl0aW9uIG1ldGFkYXRhLlxuICogQWNjZXNzaW5nIGJsb2JzIGNhbiBiZSBkb25lIGVpdGhlciBieSBrZXkgb3IgYnkgaGFuZGxlLCBub3QgYm90aCBmb3IgdGhlIHNhbWUgbGF5ZXIuXG4gKiBXaGVuIGFjY2Vzc2luZyBieSBrZXkgaXMgZW5hYmxlZCwgeW91IGNhbiB1c2Uga2V5cyB0byBzdG9yZSBhbmQgcmV0cmlldmUgYmxvYnMsIGJ1dCBub3QgZGF0YSBoYW5kbGVzLlxuICogS2V5cyBmb2xsb3cgYSB1c2VyLWRlZmluZWQgZm9ybWF0IGZvciB0aGUgbGF5ZXJzIHdoaWxlIGRhdGEgaGFuZGxlcyBhcmUgb3BhcXVlIGlkZW50aWZpZXJzLlxuICogVGhlIGFjY2Vzcy1ieS1rZXkgQVBJIGhhcyBkaWZmZXJlbnQgY2FwYWJpbGl0aWVzIG9mIHRoZSBhY2Nlc3MtYnktZGF0YS1oYW5kbGUgQVBJIGFuZCBkaWZmZXJlbnQgZW5kcG9pbnRzOlxuICogZW5hYmxpbmcgYWNjZXNzIGJ5IGtleSBpbXBsaWVzIHRoZSBjYXBhYmlsaXR5IHRvIHVwZGF0ZSBibG9icywgd2hpbGUgb3BlcmF0aW5nIHZpYSBkYXRhIGhhbmRsZXMgaXMgbW9yZSBlZmZpY2llbnRcbiAqIGFuZCBwcm92aWRlcyByb29tIGZvciBvcHRpbWl6YXRpb24gb24gYm90aCB0aGUgY2xpZW50IHNpZGUgYW5kIGluc2lkZSB0aGUgc2VydmljZS4gSW4gY2FzZSB0aGUgYWNjZXNzIHBhdHRlcm4gaXMgYnkga2V5LFxuICogeW91IGNhbiBlbmFibGUgdGhlIG9wdGlvbmFsIGNhcGFiaWxpdHkgb2YgbGlzdGluZyB3aGljaCBrZXlzIGFyZSBzdG9yZWQgaW4gdGhlIGxheWVyLiBUaGlzIGNhcGFiaWxpdHkgaGFzIGEgbmVnYXRpdmUgaW1wYWN0XG4gKiBvbiB0aGUgYWNjZXNzIHRpbWVzIHdoZW4gZ2V0dGluZyBhbmQgc2F2aW5nIGJsb2JzIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBlbmFibGVkIGV4cGxpY2l0bHkuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDIuMC4wXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQnlLZXlBcGlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLyoqXG4gKiBDYW5jZWxzIGFuIGVudGlyZSBtdWx0aXBhcnQgdXBsb2FkIG9wZXJhdGlvbi4gWW91IGNhbiBvbmx5IGNhbmNlbCBhIG11bHRpcGFydCB1cGxvYWQgYmVmb3JlIGl0IGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAqXG4gKiBAc3VtbWFyeSBDYW5jZWxzIGEgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0gbXVsdGlwYXJ0VG9rZW4gVGhlIGlkZW50aWZpZXIgb2YgdGhlIG11bHRpcGFydCB1cGxvYWQgKHRva2VuKS5cbiAqIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIHRva2VuIHdoaWNoIHdoZW4gdGhlIG11bHRpcGFydCB1cGxvYWQgd2FzIGluaXRpYXRlZC5cbiAqL1xuZnVuY3Rpb24gY2FuY2VsTXVsdGlwYXJ0VXBsb2FkQnlLZXkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0va2V5c011bHRpcGFydC97bXVsdGlwYXJ0VG9rZW59XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie211bHRpcGFydFRva2VufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibXVsdGlwYXJ0VG9rZW5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNhbmNlbE11bHRpcGFydFVwbG9hZEJ5S2V5ID0gY2FuY2VsTXVsdGlwYXJ0VXBsb2FkQnlLZXk7XG4vKipcbiAqIENoZWNrcyBpZiBhIGJsb2IgZXhpc3RzIGZvciB0aGUgcmVxdWVzdGVkIGtleS5cbiAqXG4gKiBAc3VtbWFyeSBDaGVja3MgaWYgYSBrZXkgZXhpc3RzLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYidzIGNvbnRlbnRzLlxuICogS2V5IGNhbiBvbmx5IGNvbnRhaW4gYWxsb3dlZCBjaGFyYWN0ZXJzOiBhLXpBLVowLTkuW10oKXt9L18tJi5cbiAqL1xuZnVuY3Rpb24gY2hlY2tLZXlFeGlzdHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0va2V5cy97a2V5fVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntrZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJrZXlcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jaGVja0tleUV4aXN0cyA9IGNoZWNrS2V5RXhpc3RzO1xuLyoqXG4gKiBDYWxsIHRoaXMgQVBJIHdoZW4gYWxsIHBhcnRzIGhhdmUgYmVlbiB1cGxvYWRlZC5cbiAqXG4gKiBAc3VtbWFyeSBDb21wbGV0ZXMgYSBtdWx0aXBhcnQgdXBsb2FkLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBtdWx0aXBhcnRUb2tlbiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCAodG9rZW4pLlxuICogQ29udGVudCBvZiB0aGlzIHBhcmFtZXRlciBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgdG9rZW4gd2hpY2ggd2hlbiB0aGUgbXVsdGlwYXJ0IHVwbG9hZCB3YXMgaW5pdGlhdGVkLlxuICogQHBhcmFtIGJvZHkgVGhlIHBhcnQgSURzIHVwbG9hZGVkIGluIHRoaXMgbXVsdGlwYXJ0IHVwbG9hZCB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcmVzdWx0aW5nIGJsb2IuXG4gKi9cbmZ1bmN0aW9uIGNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkQnlLZXkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0va2V5c011bHRpcGFydC97bXVsdGlwYXJ0VG9rZW59XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie211bHRpcGFydFRva2VufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibXVsdGlwYXJ0VG9rZW5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuY29tcGxldGVNdWx0aXBhcnRVcGxvYWRCeUtleSA9IGNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkQnlLZXk7XG4vKipcbiAqIERlbGV0ZXMgYSBkYXRhIGJsb2IuXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlcyBhIGRhdGEgYmxvYi5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2IncyBjb250ZW50cy5cbiAqIEtleSBjYW4gb25seSBjb250YWluIGFsbG93ZWQgY2hhcmFjdGVyczogYS16QS1aMC05LltdJigpe30vXy0mLlxuICovXG5mdW5jdGlvbiBkZWxldGVCbG9iQnlLZXkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0va2V5cy97a2V5fVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntrZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJrZXlcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRlbGV0ZUJsb2JCeUtleSA9IGRlbGV0ZUJsb2JCeUtleTtcbi8qKlxuICogUmV0cmlldmVzIGEgYmxvYiBmcm9tIHN0b3JhZ2UuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBhIGJsb2IuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIGtleSBUaGUga2V5IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJ3MgY29udGVudHMuXG4gKiBLZXkgY2FuIG9ubHkgY29udGFpbiBhbGxvd2VkIGNoYXJhY3RlcnM6IGEtekEtWjAtOS5bXSYoKXt9L187LlxuICogQHBhcmFtIHJhbmdlIFVzZSB0aGlzIHBhcmFtZXRlciB0byByZXN1bWUgZG93bmxvYWQgb2YgYSBsYXJnZSByZXNwb25zZSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbiBpc3N1ZSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlcixcbiAqIG9yIHRvIGZldGNoIGEgc3BlY2lmaWMgc2xpY2Ugb2YgdGhlIGJsb2IuIFRvIHJlc3VtZSBkb3dubG9hZCBhZnRlciBhIGNvbm5lY3Rpb24gaXNzdWUsXG4gKiBzcGVjaWZ5IGEgc2luZ2xlIGJ5dGUgcmFuZ2Ugb2Zmc2V0IGFzIGZvbGxvd3M6IFJhbmdlOiBieXRlcyYxMDsuXG4gKiBUbyBmZXRjaCBhIHNwZWNpZmljIHNsaWNlIG9mIHRoZSBibG9iLCBzcGVjaWZ5IGEgc2xpY2UgYXMgZm9sbG93czpcbiAqIFJhbmdlOiBieXRlcyYxMC0xMDAuIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudCB3aXRoIFtSRkMgNzIzM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMpLFxuICogYnV0IG5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGJ5dGUgcmFuZ2UuXG4gKiBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgcmFuZ2UgcGFyYW1ldGVyIGFzIGEgcXVlcnkgcGFyYW1ldGVyLCBmb3IgZXhhbXBsZSByYW5nZSZieXRlcyYxMDsuXG4gKi9cbmZ1bmN0aW9uIGdldEJsb2JCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzL3trZXl9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2tleX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImtleVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wicmFuZ2VcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlJhbmdlXCJdID0gcGFyYW1zW1wicmFuZ2VcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEJsb2JCeUtleSA9IGdldEJsb2JCeUtleTtcbi8qKlxuICogR2V0cyB0aGUgc3RhdHVzIG9mIGEgbXVsdGlwYXJ0IHVwbG9hZC4gVGhlIHN0YXR1cyBjYW4gYmUgcmVjZWl2ZWQgb25seSB3aGVuIHRoZSB1cGxvYWQgaGFzIGJlZW4gY29tcGxldGVkLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgdGhlIHN0YXR1cyBvZiBhIG11bHRpcGFydCB1cGxvYWQuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIG11bHRpcGFydFRva2VuIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtdWx0aXBhcnQgdXBsb2FkICh0b2tlbikuXG4gKiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYSB2YWxpZCB0b2tlbiB3aGljaCB3aGVuIHRoZSBtdWx0aXBhcnQgdXBsb2FkIHdhcyBpbml0aWF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldE11bHRpcGFydFVwbG9hZFN0YXR1c0J5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXNNdWx0aXBhcnQve211bHRpcGFydFRva2VufVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInttdWx0aXBhcnRUb2tlbn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcIm11bHRpcGFydFRva2VuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldE11bHRpcGFydFVwbG9hZFN0YXR1c0J5S2V5ID0gZ2V0TXVsdGlwYXJ0VXBsb2FkU3RhdHVzQnlLZXk7XG4vKipcbiAqIExpc3QgdmlydHVhbCBkaXJlY3RvcnktbGlrZSBzdHJ1Y3R1cmUgY3JlYXRlZCBmcm9tIGtleXMgaW4gdGhlIHN0b3JhZ2Ugd2hlcmUgJy8nIGlzIHVzZWQgYXMgYSBzZXBhcmF0b3IuXG4gKlxuICogQHN1bW1hcnkgTGlzdCBrZXlzLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgYmxvYi5cbiAqIEBwYXJhbSBwYXJlbnQgQ29tbW9uIHByZWZpeCB0byBhIGxpc3QuXG4gKiBAcGFyYW0gcGFnZVRva2VuIElmIHNwZWNpZmllZCwgd2lsbCByZXR1cm4gdGhlIHNwZWNpZmljIHBhZ2UgYmFzZWQgb24gdGhlIHRva2VuLlxuICogQHBhcmFtIGxpbWl0IE51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybiBwZXIgcGFnZS5cbiAqIEBwYXJhbSBkZWVwIFVzZSBkZWVwIChyZWN1cnNpdmUpIGxpc3Rpbmcgb2Ygb2JqZWN0cyBpbnN0ZWFkIG9mIGhpZXJhcmNoaWNhbCBsaXN0aW5nLlxuICogRGVlcCBsaXN0aW5nIHdpbGwgbm90IHByb2R1Y2UgYW55IGNvbW1vbiBwcmVmaXhlcy5cbiAqL1xuZnVuY3Rpb24gbGlzdEtleXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0va2V5c1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYXJlbnRcIiwgcGFyYW1zW1wicGFyZW50XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZGVlcFwiLCBwYXJhbXNbXCJkZWVwXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5saXN0S2V5cyA9IGxpc3RLZXlzO1xuLyoqXG4gKiBQZXJzaXN0cyB0aGUgZGF0YSBibG9iIHVwIHRvIDE5MiBNQi4gV2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksXG4gKiB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgZGF0YSBibG9iIHdpbGwgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLCBhbHRob3VnaCBpbiBtb3N0IGNhc2VzLFxuICogaXQgd2lsbCBiZS4gVG8gY2hlY2sgaWYgdGhlIGRhdGEgYmxvYiBpcyBhdmFpbGFibGUsIHVzZSB0aGUgwrRIRUFEwrQgbWV0aG9kLiBUaGUgbWF4aW11bSBrZXkgbGVuZ3RoIGlzIDQ1MCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBzdW1tYXJ5IFB1Ymxpc2hlcyBhIGRhdGEgYmxvYiBvciBjb3BpZXMgYW4gZXhpc3RpbmcgYmxvYi5cbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGFyZW50IGxheWVyIGZvciB0aGlzIGJsb2IuXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2IncyBjb250ZW50cy5cbiAqIEtleSBjYW4gb25seSBjb250YWluIGFsbG93ZWQgY2hhcmFjdGVyczogYS16QS1aMC05LltdJigpe30vXzsuXG4gKiBAcGFyYW0gY29udGVudExlbmd0aCBTaXplIG9mIHRoZSBlbnRpdHktYm9keSwgaW4gYnl0ZXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgNzIzMCwgc2VjdGlvbiAzLjMuMjogQ29udGVudC1MZW5ndGhdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4zLjIpLlxuICogQHBhcmFtIGJvZHkgUmVxdWVzdCBib2R5LiBNdXN0IGJlIGVtcHR5IHdoZW4gY29weWluZyBhbiBvYmplY3QgdXNpbmcgdGhlIHNvdXJjZSBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gc291cmNlIENvcHkgYW4gYWxyZWFkeS1leGlzdGluZyBvYmplY3QsIGluc3RlYWQgb2YgdXBsb2FkaW5nIGEgbmV3IG9uZS4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgcHJlc2VudCxcbiAqIHRlaCByZXF1ZXN0IHBheWxvYWQgbXVzdCBiZSBlbXB0eS5cbiAqL1xuZnVuY3Rpb24gcHV0QmxvYkJ5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXMve2tleX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7a2V5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wia2V5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic291cmNlXCIsIHBhcmFtc1tcInNvdXJjZVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wiY29udGVudExlbmd0aFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSBgJHtwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnB1dEJsb2JCeUtleSA9IHB1dEJsb2JCeUtleTtcbi8qKlxuICogUHVibGlzaGVzIGxhcmdlIGRhdGEgYmxvYnMgd2hlcmUgdGhlIGRhdGEgcGF5bG9hZCBuZWVkcyB0byBiZSBzcGxpdCBpbnRvIG11bHRpcGxlIHBhcnRzLlxuICogVGhlIG11bHRpcGFydCB1cGxvYWQgc3RhcnQgaXMgdG8gYmUgZm9sbG93ZWQgYnkgdGhlIGluZGl2aWR1YWwgcGFydHMgdXBsb2FkIGFuZCBjb21wbGV0ZWRcbiAqIHdpdGggYSBjYWxsIHRvIGNvbXBsZXRlIHRoZSB1cGxvYWQuIFRoZSBsaW1pdCBvZiB0aGUgYmxvYiB1cGxvYWRlZCB0aGlzIHdheSBpcyA1MEdCLlxuICogTWF4IGtleSBsZW5ndGggaXMgNDUwIGNoYXJhY3RlcnMuXG4gKlxuICogQHN1bW1hcnkgU3RhcnRzIGEgbXVsdGlwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSBib2R5IEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIG1ldGFkYXRhIG9mIHRoZSB1cGxvYWRlZCBvYmplY3QuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIGtleSBUaGUga2V5IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBibG9iIHNvIHRoYXQgeW91IGNhbiBnZXQgdGhhdCBibG9iJ3MgY29udGVudHMuXG4gKiBLZXkgY2FuIG9ubHkgY29udGFpbiBhbGxvd2VkIGNoYXJhY3RlcnM6IGEtekEtWjAtOS5bXSYoKXt9L187LlxuICovXG5mdW5jdGlvbiBzdGFydE11bHRpcGFydFVwbG9hZEJ5S2V5KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2tleXMve2tleX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7a2V5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wia2V5XCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnN0YXJ0TXVsdGlwYXJ0VXBsb2FkQnlLZXkgPSBzdGFydE11bHRpcGFydFVwbG9hZEJ5S2V5O1xuLyoqXG4gKiBVcGxvYWQgb3IgY29weSBhIHNpbmdsZSBwYXJ0IG9mIGEgbXVsdGlwYXJ0IHVwbG9hZCBvciBtdWx0aXBhcnQgY29weSBmb3IgdGhlIGJsb2IuXG4gKiBFdmVyeSBwYXJ0IGV4Y2VwdCB0aGUgbGFzdCBvbmUgbXVzdCBoYXZlIGEgbWluaW11bSA1IE1CIG9mIGRhdGEgYW5kIG1heGltdW0gb2YgOTYgTUIuXG4gKiBUaGUgbGVuZ3RoIG9mIGV2ZXJ5IHBhcnQgZXhjZXB0IHRoZSBsYXN0IG9uZSBtdXN0IGJlIG11bHRpcGxlIG9mIDFNQiAoMTAyNEtCKS5cbiAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXJ0cyBpcyAxMCwwMDAuXG4gKlxuICogQHN1bW1hcnkgVXBsb2FkcyBhIHBhcnQgb3IgY3JlYXRlcyBhIG5ldyBwYXJ0IGZyb20gcGFydCBvZiBhbiBleGlzdGluZyBibG9iLlxuICogQHBhcmFtIGJvZHkgVGhlIGJvZHkgcmVsYXRlcyB0byB1cGxvYWQgb25seS4gVGhlIGRhdGEgdG8gdXBsb2FkIGFzIHBhcnQgb2YgdGhlIGJsb2IuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHBhcmVudCBsYXllciBmb3IgdGhpcyBibG9iLlxuICogQHBhcmFtIG11bHRpcGFydFRva2VuIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtdWx0aXBhcnQgdXBsb2FkICh0b2tlbikuXG4gKiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYSB2YWxpZCB0b2tlbiB3aGljaCB3aGVuIHRoZSBtdWx0aXBhcnQgdXBsb2FkIHdhcyBpbml0aWF0ZWQuXG4gKiBAcGFyYW0gcGFydE51bWJlciBUaGlzIHBhcmFtZXRlciByZWxhdGVzIHRvIHVwbG9hZCBhbmQgY29weS4gVGhlIG51bWJlciBvZiB0aGUgcGFydCBmb3IgdGhlIG11bHRpcGFydCB1cGxvYWQgb3IgY29weS5cbiAqIFRoZSBudW1iZXJzIG9mIHRoZSB1cGxvYWQgcGFydHMgbXVzdCBzdGFydCBmcm9tIDEsIGJlIG5vIGdyZWF0ZXIgdGhhbiAxMCwwMDAgYW5kIGJlIGNvbnNlY3V0aXZlLlxuICogUGFydHMgdXBsb2FkZWQgd2l0aCB0aGUgc2FtZSBwYXJ0TnVtYmVyIGFyZSBvdmVycmlkZGVuLiBEbyBub3QgcmV1c2UgdGhlIHNhbWUgcGFydE51bWJlciB3aGVuIHJldHJ5aW5nXG4gKiBhbiB1cGxvYWQgb3IgY29weSBpbiBhbiBlcnJvciBzaXR1YXRpb24gKG5ldHdvcmsgcHJvYmxlbXMsIDR4eCBvciA1eHggcmVzcG9uc2VzKS5cbiAqIFJldXNpbmcgdGhlIHNhbWUgcGFydE51bWJlciBpbiBhIHJldHJ5IG1heSBjYXVzZSB0aGUgcHVibGljYXRpb24gdG8gZmFpbC5cbiAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoaXMgaGVhZGVyIHJlbGF0ZXMgdG8gdXBsb2FkIG9ubHkuIFNpemUgb2YgdGhlIGVudGl0eS1ib2R5LCBpbiBieXRlcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyA3MjMwLCBzZWN0aW9uIDMuMy4yOiBDb250ZW50LUxlbmd0aF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMikuXG4gKiBAcGFyYW0gY29udGVudFR5cGUgVGhpcyBoZWFkZXIgcmVsYXRlcyB0byB1cGxvYWQgb25seS4gQSBzdGFuZGFyZCBNSU1FIHR5cGUgZGVzY3JpYmluZyB0aGUgZm9ybWF0IG9mIHRoZSBibG9iIGRhdGEuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMjYxNiwgc2VjdGlvbiAxNC4xNzogQ29udGVudC1UeXBlXShodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxNC5odG1sI3NlYzE0LjE3KS5cbiAqIFRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlciBtdXN0IG1hdGNoIHRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGluIHRoZSBjb250ZW50VHlwZSBmaWVsZCB3aGVuIHRoZSBtdWx0aXBhcnQgdXBsb2FkIHdhcyBpbml0aWFsaXplZCxcbiAqIGFuZCB0aGlzIGNvbnRlbnQgdHlwZSBtdXN0IGFsc28gbWF0Y2ggdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGxheWVyJ3MgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSBzb3VyY2UgQ29weSBwYXJ0IGZyb20gYW4gZXhpc3Rpbmcgb2JqZWN0LCB1c2UgcmFuZ2UgdG8gc3BlY2lmeSB3aGljaCBwYXJ0cyBvZiB0aGUgb2JqZWN0IHRvIGNvcHkuXG4gKiBAcGFyYW0gcmFuZ2UgVGhpcyBoZWFkZXIvcGFyYW1ldGVyIHJlbGF0ZXMgdG8gb2JqZWN0IGNvcHkgdXNpbmcgdGhlICdzb3VyY2UnIHBhcmFtZXRlci4gVXNlIHRoaXMgcGFyYW1ldGVyXG4gKiB0byBjb3B5IGEgc3BlY2lmaWMgc2xpY2Ugb2YgdGhlIGJsb2IgbGlrZSB0aGlzOiBSYW5nZTogYnl0ZXMmMC0xMDQ4NTc1LiBUaGlzIHBhcmFtZXRlciBpcyBjb21wbGlhbnRcbiAqIHdpdGggW1JGQyA3MjMzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMyksIGJ1dCBub3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgb25seSBzdXBwb3J0cyBhXG4gKiBzaW5nbGUgYnl0ZSByYW5nZSBhbmQgYm90aCBiZWdpbiBhbmQgZW5kIHZhbHVlcyBvZiB0aGUgcmFuZ2UgbXVzdCBiZSBzcGVjaWZpZWQuXG4gKiBUaGUgcmFuZ2UgYmVnaW4gdmFsdWUgbXVzdCBiZSBtdWx0aXBsZSBvZiAxTUIgKDEwMjRLQikuXG4gKiBUaGUgbGVuZ3RoIG9mIGV2ZXJ5IHBhcnQgZXhjZXB0IHRoZSBsYXN0IG9uZSBtdXN0IGJlIG11bHRpcGxlIG9mIDFNQiAoMTAyNEtCKS5cbiAqIFRoZSByYW5nZSBwYXJhbWV0ZXIgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGFzIGEgcXVlcnkgcGFyYW1ldGVyLCBmb3IgZXhhbXBsZSByYW5nZSZieXRlcyYwLTEwNDg1NzUuXG4gKi9cbmZ1bmN0aW9uIHVwbG9hZFBhcnRCeUtleShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9rZXlzTXVsdGlwYXJ0L3ttdWx0aXBhcnRUb2tlbn0vcGFydHNcIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bXVsdGlwYXJ0VG9rZW59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJtdWx0aXBhcnRUb2tlblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcnROdW1iZXJcIiwgcGFyYW1zW1wicGFydE51bWJlclwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzb3VyY2VcIiwgcGFyYW1zW1wic291cmNlXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBwYXJhbXNbXCJib2R5XCJdO1xuICAgICAgICBpZiAocGFyYW1zW1wiY29udGVudExlbmd0aFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSBgJHtwYXJhbXNbXCJjb250ZW50TGVuZ3RoXCJdfWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcImNvbnRlbnRUeXBlXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBwYXJhbXNbXCJjb250ZW50VHlwZVwiXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wicmFuZ2VcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlJhbmdlXCJdID0gcGFyYW1zW1wicmFuZ2VcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBsb2FkUGFydEJ5S2V5ID0gdXBsb2FkUGFydEJ5S2V5O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudXBkYXRlQ2F0YWxvZyA9IGV4cG9ydHMucGF0Y2hMYXllciA9IGV4cG9ydHMucGF0Y2hDYXRhbG9nID0gZXhwb3J0cy5nZXRDYXRhbG9ncyA9IGV4cG9ydHMuZ2V0Q2F0YWxvZ1N0YXR1cyA9IGV4cG9ydHMuZ2V0Q2F0YWxvZyA9IGV4cG9ydHMuZGlzYWJsZUF1dG9tYXRpY1ZlcnNpb25EZWxldGlvbiA9IGV4cG9ydHMuZGVsZXRlTGF5ZXIgPSBleHBvcnRzLmRlbGV0ZUNhdGFsb2cgPSBleHBvcnRzLmNyZWF0ZUNhdGFsb2cgPSBleHBvcnRzLmNhdGFsb2dFeGlzdHMgPSB2b2lkIDA7XG4vKipcbiAqIENvbmZpZyBBUEkgdjFcbiAqIFRoZSBgY29uZmlnYCBzZXJ2aWNlIHByb3ZpZGVzIGJhc2ljIGNhdGFsb2cgbWFuYWdlbWVudCBvcGVyYXRpb25zLlxuICogSXQgbWFuYWdlcyBhbGwgcGxhdGZvcm0gcmVzb3VyY2VzIG5lZWRlZCBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIGNhdGFsb2dzIGFuZCBvcGVyYXRpb25zIG9uIHRoZW0uXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMS43XG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uZmlnQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBjYXRhbG9nIHdpdGggdGhlIHNwZWNpZmllZCBIUk4gZXhpc3RzLlxuICpcbiAqIEBzdW1tYXJ5IENoZWNrcyB0aGUgZXhpc3RlbmNlIG9mIGEgY2F0YWxvZ1xuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nXG4gKiByZWNvcmRzIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGNhdGFsb2dFeGlzdHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzL3tjYXRhbG9nSHJufVwiLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiSEVBRFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuY2F0YWxvZ0V4aXN0cyA9IGNhdGFsb2dFeGlzdHM7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY2F0YWxvZyB3aXRoIHRoZSBzcGVjaWZpZWQgbGF5ZXJzLiBUaGUgY3JlYXRlIGNhdGFsb2cgb3BlcmF0aW9uIHJ1bnMgYXN5bmNocm9ub3VzbHkuXG4gKiBPbmNlIHlvdSd2ZSBzdWJtaXR0ZWQgdGhlIGNhdGFsb2cgZm9yIGNyZWF0aW9uLCB5b3UnbGwgcmVjZWl2ZSBhIHJhbmRvbWx5IGdlbmVyYXRlZCB0b2tlbiB0aGF0IHlvdSBjYW4gdXNlIHRvIG1vbml0b3JcbiAqIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgY2F0YWxvZ1xuICogQHBhcmFtIGJvZHkgQSBjYXRhbG9nIG9iamVjdCB0aGF0IGNvbnRhaW5zIG1ldGFkYXRhIGFuZCBsYXllciBkZWZpbml0aW9ucy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nXG4gKiByZWNvcmRzIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhdGFsb2coYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVDYXRhbG9nID0gY3JlYXRlQ2F0YWxvZztcbi8qKlxuICogRGVsZXRlcyBhIGNhdGFsb2cgYW5kIGFueSBsYXllcnMgd2l0aGluIHRoYXQgY2F0YWxvZy5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgY2F0YWxvZ1xuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZ1xuICogQHBhcmFtIGJpbGxpbmdUYWcgVGhlIGBiaWxsaW5nVGFnYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGdyb3VwIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqICBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUNhdGFsb2coYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzL3tjYXRhbG9nSHJufVwiLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRlbGV0ZUNhdGFsb2cgPSBkZWxldGVDYXRhbG9nO1xuLyoqXG4gKiBEZWxldGVzIGEgbGF5ZXIgb2YgdGhlIGNhdGFsb2cgaWYgaXQncyBvZiBsYXllclR5cGUgJ2luZGV4JywgJ3ZvbGF0aWxlJywgb3IgJ3N0cmVhbScuIE90aGVyIGBsYXllclR5cGVzYCBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlIGEgbGF5ZXJcbiAqIEBwYXJhbSBjYXRhbG9nSHJuIFRoZSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgb2YgdGhlIGNhdGFsb2dcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBsYXllciBJRFxuICovXG5mdW5jdGlvbiBkZWxldGVMYXllcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59L2xheWVycy97bGF5ZXJJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlTGF5ZXIgPSBkZWxldGVMYXllcjtcbi8qKlxuICogRGlzYWJsZSBhdXRvbWF0aWMgcmV0aXJlZCB2ZXJzaW9ucyBjbGVhbnVwLlxuICpcbiAqIEBzdW1tYXJ5IERpc2FibGUgYXV0b21hdGljIHZlcnNpb24gZGVsZXRpb25cbiAqIEBwYXJhbSBjYXRhbG9nSHJuIFRoZSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgb2YgdGhlIGNhdGFsb2cuXG4gKi9cbmZ1bmN0aW9uIGRpc2FibGVBdXRvbWF0aWNWZXJzaW9uRGVsZXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2NhdGFsb2dzL3tjYXRhbG9nSHJufS9hdXRvbWF0aWNWZXJzaW9uRGVsZXRpb25cIi5yZXBsYWNlKFwie2NhdGFsb2dIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJjYXRhbG9nSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRpc2FibGVBdXRvbWF0aWNWZXJzaW9uRGVsZXRpb24gPSBkaXNhYmxlQXV0b21hdGljVmVyc2lvbkRlbGV0aW9uO1xuLyoqXG4gKiBHZXRzIHRoZSBmdWxsIGNhdGFsb2cgY29uZmlndXJhdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBjYXRhbG9nLiBUaGUgY2F0YWxvZyBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGRlc2NyaXB0aXZlIGFuZFxuICogc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBzdWNoIGFzIGxheWVyIGRlZmluaXRpb25zIGFuZCBsYXllciB0eXBlcy5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBkZXRhaWxzIG9mIGEgY2F0YWxvZ1xuICogQHBhcmFtIGNhdGFsb2dIcm4gVGhlIEhFUkUgUmVzb3VyY2UgTmFtZSAoSFJOKSBvZiB0aGUgY2F0YWxvZ1xuICogQHBhcmFtIGJpbGxpbmdUYWcgVGhlIGBiaWxsaW5nVGFnYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB0aGF0IHlvdSBjYW4gdXNlIHRvIGdyb3VwIGJpbGxpbmdcbiAqIHJlY29yZHMgdG9nZXRoZXIuIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2F0YWxvZyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59XCIucmVwbGFjZShcIntjYXRhbG9nSHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiY2F0YWxvZ0hyblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0Q2F0YWxvZyA9IGdldENhdGFsb2c7XG4vKipcbiAqIFRha2VzIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgdG9rZW4gdGhhdCB5b3UgcmVjZWl2ZSB3aGVuIHlvdSBzdWJtaXQgYSBjYXRhbG9nIGZvciBjcmVhdGlvbi4gWW91IGNhbiB1c2UgaXQgdG8gbW9uaXRvciB0aGUgc3RhdHVzXG4gKiBvZiB5b3VyIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgR2V0cyB0aGUgc3RhdHVzIG9mIGEgY3JlYXRlLCB1cGRhdGUgb3IgZGVsZXRlIGNhdGFsb2cgcmVxdWVzdC5cbiAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gb2YgY2F0YWxvZyBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIGRlbGV0aW9uIHRhc2tcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nIHJlY29yZHNcbiAqIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGdldENhdGFsb2dTdGF0dXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3N0YXR1cy97dG9rZW59XCIucmVwbGFjZShcInt0b2tlbn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInRva2VuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRDYXRhbG9nU3RhdHVzID0gZ2V0Q2F0YWxvZ1N0YXR1cztcbi8qKlxuICogTGlzdHMgYWxsIGNhdGFsb2dzIHRoYXQgeW91ciBhY2NvdW50IGhhcyBhY2Nlc3MgdG8uIFRvIGdldCBhY2Nlc3MgdG8gYSBjYXRhbG9nLCB5b3VyIGFkbWluaXN0cmF0b3IgbXVzdCBhc3NvY2lhdGUgdGhpcyBjYXRhbG9nXG4gKiBpbiB5b3VyIEhFUkUgcGxhdGZvcm0gYWNjb3VudC4gQnkgZGVmYXVsdCwgdGhlIGxpc3QgcHJvdmlkZXMgc3VtbWFyeSBkYXRhIGZvciBlYWNoIGNhdGFsb2cgc3VjaCBhcyB0aGUgdGl0bGUsIHRoZSBjb25maWd1cmF0aW9uXG4gKiBVUkwsIGFuZCB0aGUgcmVzb3VyY2UgdHlwZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGEgbGlzdCBvZiBhbGwgY2F0YWxvZ3NcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIFRoZSBgYmlsbGluZ1RhZ2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdGhhdCB5b3UgY2FuIHVzZSB0byBncm91cCBiaWxsaW5nIHJlY29yZHNcbiAqIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCAgIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqIEBwYXJhbSB2ZXJib3NlIEluZGljYXRlcyBpZiB0aGUgcmVzcG9uc2Ugc2hvdWxkIGNvbnRhaW4gZnVsbHkgZXhwYW5kZWQgY2F0YWxvZyBjb25maWd1cmF0aW9ucy4gXCJ0cnVlXCIgfCBcImZhbHNlXCIuXG4gKiBAcGFyYW0gcSBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gVGhlIHJlc3VsdCBjb250YWlucyBvbmx5IHRob3NlIGl0ZW1zIHdoaWNoIGhhdmUgdGhlIGdpdmVuIHN0cmluZ1xuICogYXMgYSBwYXJ0IG9mIHRoZSB2YWx1ZSBvZiBvbmUgb3IgbW9yZSBzZWFyY2hhYmxlIGZpZWxkcyAoc3Vic3RyaW5nIGNvbXBhcmUpLiBJdCB3aWxsIHNlYXJjaCB0aGUgZm9sbG93aW5nIGNhdGFsb2cgZGV0YWlsc1xuICogZmllbGRzOiBpZCwgbmFtZSwgc3VtbWFyeSwgZGVzY3JpcHRpb24sIHRhZ3MgYW5kIGxheWVyIGRldGFpbHM6IGlkLCBuYW1lLCBzdW1tYXJ5LCBkZXNjcmlwdGlvbiwgdGFncywgc2NoZW1hLWhyblxuICogQHBhcmFtIG9yZ2FuaXNhdGlvbiBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gRmlsdGVycyBvbmx5IGNhdGFsb2dzIChsYXllcnMpIHRoYXQgYmVsb25nIHRvIGEgc3BlY2lmaWVkXG4gKiBvcmdhbmlzYXRpb24uIFlvdSBjYW4gZmlsdGVyIG9ubHkgYnkgY2F0YWxvZyAobGF5ZXIpIG93bmVyIG9yZ2FuaXNhdGlvbiBJRC4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFuIG9yZ2FuaXNhdGlvbiwgdGhlIHNlYXJjaFxuICogaXMgdW5maWx0ZXJlZC5cbiAqIEBwYXJhbSBvcmdhbmlzYXRpb25UeXBlIFdvcmtzIG9ubHkgd2hlbiB0aGUgdmVyYm9zZSBmbGFnIGlzIHNldCB0byB0cnVlLiBGaWx0ZXJzIG9ubHkgY2F0YWxvZ3MgdGhhdCBiZWxvbmcgdG8gYW4gb3JnYW5pc2F0aW9uLlxuICogSWYgc2V0IHRvIGBgbXlPcmdhbmlzYXRpb25gYCwgdGhlIHNlYXJjaCBpcyBmb3IgY2F0YWxvZ3MgKGxheWVycykgd2l0aCB0aGUgc2FtZSBvd25lciBvcmdhbmlzYXRpb24gSUQgbGlrZSB0aGVcbiAqIHJlcXVlc3RlcmBgcy4gSWYgc2V0IHRvIGBgaGVyZWBgLCB0aGUgc2VhcmNoIGlzIGZvciBjYXRhbG9ncyAobGF5ZXJzKSB3aXRoIHRoZSBzYW1lIG93bmVyIG9yZ2FuaXNhdGlvbiBJRFxuICogaXMgZXF1YWwgdG8gdGhlIEhlcmUgb3JnYW5pc2F0aW9uLiBJZiBzZXQgdG8gYGBvdGhlcmBgLCB0aGUgc2VhcmNoIGlzIGZvciBjYXRhbG9ncyAobGF5ZXJzKSB3aXRoIGFuIG93bmVyIG9yZ2FuaXNhdGlvblxuICogIElEIG5vdCBlcXVhbCB0byB0aGUgcmVxdWVzdGVyIG9yZ2FuaXNhdGlvbiBhbmQgbm90IGVxdWFsIHRvIEhFUkUgb3JnYW5pc2F0aW9uLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYW4gb3JnYW5pc2F0aW9uLFxuICogdGhlIHNlYXJjaCBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIGxheWVyVHlwZSBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGF5ZXIgdHlwZXMgKHdpdGggT1Igc2VtYW50aWMpIHRvIGxvb2sgZm9yXG4gKiBpbiB0aGUgbGF5ZXIgdHlwZS4gRmlsdGVycyBvbmx5IGNhdGFsb2dzIHRoYXQgY29udGFpbiBsYXllcnMgd2l0aCBsYXllciB0eXBlIHByZXNlbnRlZCBpbiBhIGdpdmVuIGxpc3QuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIGxheWVyXG4gKiAgdHlwZSwgdGhlIHNlYXJjaCBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIHJlZ2lvbiBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVnaW9ucyAod2l0aCBPUiBzZW1hbnRpYykgdG8gbG9vayBmb3JcbiAqICBpbiB0aGUgY2F0YWxvZyByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uLiBGaWx0ZXJzIG9ubHkgY2F0YWxvZ3MgdGhhdCBjb250YWluIHJlZ2lvbiBwcmVzZW50ZWQgaW4gZ2l2ZW4gbGlzdC5cbiAqIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHJlZ2lvbiwgdGhlIHNlYXJjaCBpcyB1bmZpbHRlcmVkLlxuICogQHBhcmFtIHNjaGVtYUhybiBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gRmlsdGVycyBvbmx5IGNhdGFsb2dzIChsYXllcnMpIGJ5IHRoZSBzcGVjaWZpZWQgbGF5ZXIgc2NoZW1hIEhSTi5cbiAqIFlvdSBjYW4gb25seSBmaWx0ZXIgYnkgbGF5ZXIgc2NoZW1hLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBzY2hlbWEsIHRoZSBzZWFyY2ggaXMgdW5maWx0ZXJlZC5cbiAqIEBwYXJhbSByZXNvdXJjZVR5cGUgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIFNwZWNpZmllcyBvdGhlciBmaWx0ZXJzIGJlaGF2aW9yLiBJZiBzZXQgdG8gYGNhdGFsb2dgLFxuICogdGhpcyBhcHBsaWVzIG90aGVyIGZpbHRlcnMgdG8gc2VhcmNoIGNhdGFsb2dzIChhbmQgbGF5ZXJzIGluc2lkZSkuIElmIHNldCB0byBgbGF5ZXJgLCB0aGlzIGFwcGxpZXMgb3RoZXIgZmlsdGVycyB0byBzZWFyY2ggbGF5ZXJzLlxuICogVGhlIHJldHVybmVkIGpzb24gc3RydWN0dXJlIGlzIHRoZSBzYW1lIGZvciBib3RoIGNhc2VzIChsaXN0IG9mIGNhdGFsb2dzIHdpdGggbGlzdCBvZiBsYXllcnMgaW5zaWRlIGVhY2ggY2F0YWxvZykuXG4gKiBAcGFyYW0gY292ZXJhZ2UgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvdW50cmllcyAod2l0aCBPUiBzZW1hbnRpYykgdG8gbG9vayBmb3JcbiAqIGluIHRoZSBjYXRhbG9nIChsYXllcikgY292ZXJhZ2UuIE9ubHkgY2F0YWxvZ3MgKGxheWVycykgY292ZXJpbmcgc3BlY2lmaWVkIGNvdW50cmllcyB3aWxsIGJlIHJldHVybmVkLiBUaGlzIGZpbGVkIGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgY292ZXJhZ2UsIHRoZSBzZWFyY2ggaW5jbHVkZXMgYWxsIGNvdW50cmllcy5cbiAqIEBwYXJhbSBhY2Nlc3MgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFjY2VzcyB0eXBlcyAod2l0aCBPUiBzZW1hbnRpYylcbiAqIHRvIGZpbHRlciByZXN1bHQuIElmIHNldCB0byBgZGVmYXVsdGAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBjYXRhbG9ncyB0aGUgdXNlciBoYXMgcmVhZCBvciBtYW5hZ2UgYWNjZXNzIHRvLiBJZiBzZXQgdG8gYGNyZWF0ZWAsXG4gKiB0aGUgcmVzcG9uc2UgaW5jbHVkZXMgY2F0YWxvZ3MgdGhlIHVzZXIgaGFzIGNyZWF0ZWQgYW5kIHdoaWNoIG1hdGNoIHRoZSBgb3duZXIuY3JlYXRvcmAgZmllbGQsIGlmIHNldCB0byBgbWFuYWdlYCxcbiAqIHRoZSByZXNwb25zZSBpbmNsdWRlcyBjYXRhbG9ncyB0aGUgdXNlciBoYXMgbWFuYWdlIGFjY2VzcyB0by4gSWYgc2V0IHRvIGBvcmdBZG1pbmAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBjYXRhbG9ncyB0aGUgYE9yZ0FkbWluYFxuICogdXNlciBoYXZlIGFjY2VzcyB0by5cbiAqIEBwYXJhbSBtYXJrZXRwbGFjZVJlYWR5IEluZGljYXRlcyBpZiB0aGUgcmVzcG9uc2Ugc2hvdWxkIGNvbnRhaW4gb25seSBNYXJrZXRwbGFjZS1yZWFkeSBjYXRhbG9ncy4gSWYgdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLFxuICogdGhlIHNlcnZpY2Ugd2lsbCByZXR1cm4gb25seSBjYXRhbG9ncyB3aXRoIHRoZSBgbWFya2V0cGxhY2VSZWFkeWAgZWxlbWVudCBzZXQgdG8gdHJ1ZS5cbiAqIEBwYXJhbSBsaW1pdCBXb3JrcyBvbmx5IHdoZW4gdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gV2hlbiBzcGVjaWZpZWQsIHJlc3VsdCBlbGVtZW50IGNvdW50IHdpbGwgYmUgbGltaXRlZCB0byB0aGlzIHZhbHVlLlxuICogTWluaW11bTogMS5cbiAqIEBwYXJhbSBzb3J0QnkgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIFNwZWNpZmllcyBzb3J0IGZpZWxkLiBJZiBzZXQgdG8gYG5hbWVgLCB0aGUgcmVzcG9uc2UgY29udGFpbnMgY2F0YWxvZ3NcbiAqIHNvcnRlZCBieSBjYXRhbG9nIG5hbWUuIElmIHNldCB0byBgY3JlYXRlZGAsIHRoZSB0aGUgcmVzcG9uc2UgY29udGFpbnMgY2F0YWxvZ3Mgc29ydGVkYnkgY2F0YWxvZyBjcmVhdGUgdGltZS4gTGF5ZXJzIGluc2lkZSBhIGNhdGFsb2dcbiAqIGFyZSBhbHdheXMgc29ydGVkIGJ5IGxheWVyIG5hbWUuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIGBzb3J0QnlgLCB0aGUgcmVzcG9uc2UgY29udGFpbnMgY2F0YWxvZ3Mgc29ydGVkIGJ5IGBuYW1lYC5cbiAqIEBwYXJhbSBzb3J0T3JkZXIgV29ya3Mgb25seSB3aGVuIHRoZSB2ZXJib3NlIGZsYWcgaXMgc2V0IHRvIHRydWUuIFNwZWNpZmllcyB0aGUgc29ydCBvcmRlci4gSWYgc2V0IHRvIGBhc2NgLFxuICogdGhlIHNvcnQgb3JkZXIgaXMgYXNjZW5kaW5nLiBJZiBzZXQgdG8gYGRlc2NgLCB0aGUgc29ydCBvcmRlciBpcyBkZXNjZW5kaW5nLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYHNvcnRPcmRlcmAsXG4gKiB0aGUgc29ydCBvcmRlciBpcyBhc2NlbmRpbmcuXG4gKiBAcGFyYW0gbGlua2FibGUgSW5kaWNhdGVzIGlmIHRoZSByZXNwb25zZSBzaG91bGQgb25seSByZXR1cm4gdGhlIGxpc3Qgb2YgbGlua2FibGUgY2F0YWxvZ3MuICBOb3RlOiAtIElmIHNldCB0b1xuICogYHRydWVgIGFuZCB0aGUgYWNjZXNzIHRva2VuIGhhcyBhIHByb2plY3Qgc2NvcGUsIHRoZW4gdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSB0aGUgY2F0YWxvZ3NcbiAqIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIGxpbmsgdG8gdGhlIHByb2plY3QgaW4gdGhlIHRva2VuYHMgcHJvamVjdCBzY29wZSBhbmQgSEVSRSBwdWJsaWMgY2F0YWxvZ3MuXG4gKiAtIElmIHNldCB0byBgdHJ1ZWAgYW5kIHRoZSBhY2Nlc3MgdG9rZW4gaGFzIG5vIHNjb3BlLCB0aGVuIHRoZSByZXNwb25zZSB3aWxsIGluY2x1ZGUgYWxsIEhFUkUgcHVibGljIGNhdGFsb2dzIG9ubHkuXG4gKi9cbmZ1bmN0aW9uIGdldENhdGFsb2dzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9jYXRhbG9nc1wiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ2ZXJib3NlXCIsIHBhcmFtc1tcInZlcmJvc2VcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicVwiLCBwYXJhbXNbXCJxXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm9yZ2FuaXNhdGlvblwiLCBwYXJhbXNbXCJvcmdhbmlzYXRpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwib3JnYW5pc2F0aW9uVHlwZVwiLCBwYXJhbXNbXCJvcmdhbmlzYXRpb25UeXBlXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxheWVyVHlwZVwiLCBwYXJhbXNbXCJsYXllclR5cGVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVnaW9uXCIsIHBhcmFtc1tcInJlZ2lvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzY2hlbWFIcm5cIiwgcGFyYW1zW1wic2NoZW1hSHJuXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlc291cmNlVHlwZVwiLCBwYXJhbXNbXCJyZXNvdXJjZVR5cGVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY292ZXJhZ2VcIiwgcGFyYW1zW1wiY292ZXJhZ2VcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWNjZXNzXCIsIHBhcmFtc1tcImFjY2Vzc1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtYXJrZXRwbGFjZVJlYWR5XCIsIHBhcmFtc1tcIm1hcmtldHBsYWNlUmVhZHlcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic29ydEJ5XCIsIHBhcmFtc1tcInNvcnRCeVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzb3J0T3JkZXJcIiwgcGFyYW1zW1wic29ydE9yZGVyXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbmthYmxlXCIsIHBhcmFtc1tcImxpbmthYmxlXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRDYXRhbG9ncyA9IGdldENhdGFsb2dzO1xuLyoqXG4gKiBNb2RpZnkgc29tZSBmaWVsZHMgb2YgdGhlIGNhdGFsb2cuIFRoZSBleGlzdGluZyBIVFRQIFBVVCBtZXRob2Qgb25seSBhbGxvd3MgYSBjb21wbGV0ZSByZXBsYWNlbWVudCBvZiBhIGNhdGFsb2cgY29uZmlndXJhdGlvbixcbiAqIEhUVFAgUEFUQ0ggbWV0aG9kIGlzIHVzZWQgdG8gbW9kaWZ5IHNvbWUgZmllbGRzIG9mIGV4aXN0aW5nIGNhdGFsb2cgY29uZmlndXJhdGlvbi4gQWxsIGZpZWxkcyBhcmUgb3B0aW9uYWwuXG4gKiBTcGVjaWZ5IGZpZWxkIHZhbHVlIHRvIG1vZGlmeSBpdCwgbm90IHNwZWNpZmllZCBmaWVsZHMgYXJlIGlnbm9yZWQuIFRvIHJlbW92ZSB0aGUgZmllbGQgdmFsdWUgdXNlIHRoZSBudWxsIHZhbHVlLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBSRkMgNzM5NiAtIEpTT04gTWVyZ2UgUGF0Y2guXG4gKlxuICogQHN1bW1hcnkgTW9kaWZ5IGEgY2F0YWxvZ1xuICogQHBhcmFtIGJvZHkgQSBjYXRhbG9nIG9iamVjdCB0aGF0IGNvbnRhaW5zIG1vZGlmaWNhdGlvbiBvZiBjYXRhbG9nIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSBjYXRhbG9nSHJuIFRoZSBIRVJFIFJlc291cmNlIE5hbWUgKEhSTikgb2YgdGhlIGNhdGFsb2dcbiAqL1xuZnVuY3Rpb24gcGF0Y2hDYXRhbG9nKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9jYXRhbG9ncy97Y2F0YWxvZ0hybn1cIi5yZXBsYWNlKFwie2NhdGFsb2dIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJjYXRhbG9nSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wYXRjaENhdGFsb2cgPSBwYXRjaENhdGFsb2c7XG4vKipcbiAqIE1vZGlmeSBzb21lIGZpZWxkcyBvZiB0aGUgY2F0YWxvZyBsYXllci4gSFRUUCBQQVRDSCBtZXRob2QgaXMgdXNlZCB0byBtb2RpZnkgc29tZSBmaWVsZHMgb2YgZXhpc3RpbmcgbGF5ZXIgY29uZmlndXJhdGlvbi5cbiAqIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTcGVjaWZ5IGZpZWxkIHZhbHVlIHRvIG1vZGlmeSBpdCwgbm90IHNwZWNpZmllZCBmaWVsZHMgYXJlIGlnbm9yZWQuIFRvIHJlbW92ZSB0aGUgZmllbGQgdmFsdWUgdXNlIHRoZSBudWxsXG4gKiB2YWx1ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIFJGQyA3Mzk2IC0gSlNPTiBNZXJnZSBQYXRjaC5cbiAqXG4gKiBAc3VtbWFyeSBNb2RpZnkgYSBjYXRhbG9nIGxheWVyXG4gKiBAcGFyYW0gYm9keSBBIGxheWVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIG1vZGlmaWNhdGlvbiBvZiBsYXllciBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgbGF5ZXIgSURcbiAqL1xuZnVuY3Rpb24gcGF0Y2hMYXllcihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvY2F0YWxvZ3Mve2NhdGFsb2dIcm59L2xheWVycy97bGF5ZXJJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7Y2F0YWxvZ0hybn1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImNhdGFsb2dIcm5cIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnBhdGNoTGF5ZXIgPSBwYXRjaExheWVyO1xuLyoqXG4gKiBVcGRhdGVzIGFueSBkZXNjcmlwdGl2ZSBhbmQgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBpbiB0aGUgY2F0YWxvZy4gVG8gdXBkYXRlIGEgY2F0YWxvZywgc2VuZCBhIG5ldyB2ZXJzaW9uIG9mIHlvdXIgY2F0YWxvZ1xuICogY29uZmlndXJhdGlvbiB3aXRoIHRoZSB1cGRhdGVkIGRhdGEgYW5kIGFueSByZXF1aXJlZCBmaWVsZHMuXG4gKlxuICogQHN1bW1hcnkgVXBkYXRlcyBhIGNhdGFsb2dcbiAqIEBwYXJhbSBib2R5IEEgY2F0YWxvZyBvYmplY3QgdGhhdCBjb250YWlucyBtZXRhZGF0YSBhbmQgbGF5ZXIgZGVmaW5pdGlvbnMuXG4gKiBAcGFyYW0gY2F0YWxvZ0hybiBUaGUgSEVSRSBSZXNvdXJjZSBOYW1lIChIUk4pIG9mIHRoZSBjYXRhbG9nXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBUaGUgYGJpbGxpbmdUYWdgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHRoYXQgeW91IGNhbiB1c2UgdG8gZ3JvdXAgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiB1cGRhdGVDYXRhbG9nKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9jYXRhbG9ncy97Y2F0YWxvZ0hybn1cIi5yZXBsYWNlKFwie2NhdGFsb2dIcm59XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJjYXRhbG9nSHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnVwZGF0ZUNhdGFsb2cgPSB1cGRhdGVDYXRhbG9nO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldERhdGFDb3ZlcmFnZVRpbWVNYXAgPSBleHBvcnRzLmdldERhdGFDb3ZlcmFnZVRpbGUgPSBleHBvcnRzLmdldERhdGFDb3ZlcmFnZVN1bW1hcnkgPSBleHBvcnRzLmdldERhdGFDb3ZlcmFnZVNpemVNYXAgPSBleHBvcnRzLmdldERhdGFDb3ZlcmFnZUFkbWluQXJlYXMgPSB2b2lkIDA7XG4vKipcbiAqIFN0YXRpc3RpY3MgQVBJXG4gKiBBUEkgdG8gcmV0cmlldmUgc3RhdGlzdGljcyBmb3IgdGhlIGRhdGEgY292ZXJhZ2Ugb2YgdGhlIEhFUkUgcGxhdGZvcm0gY2F0YWxvZ3MuXG4gKiAgSXQgc2hvd3Mgd2hlcmUgZGF0YSBleGlzdHMsIGZyZXNobmVzcyBvZiB0aGUgZGF0YSBhbmQgb3RoZXIgc3RhdGlzdGljc1xuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAyLjAuMFxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRGF0YUNvdmVyYWdlQ29yZUFQSXNBcGlcbiAqL1xuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIEFkbWluIEFyZWFzIHNob3dpbmcgRGF0YUNvdmVyYWdlIGluIHdvcmxkIGZvciBwcm92aWRlZCBsYXllciBJZCBhbmQgdmVyc2lvblxuICogQHBhcmFtIGxheWVySWQgVW5pcXVlIExheWVyIElkZW50aWZpZXJcbiAqIEBwYXJhbSBkYXRhbGV2ZWwgVGlsZSBsZXZlbC4gQ3VycmVudGx5LCBzaG91bGQgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGxldmVsIDExXG4gKi9cbmZ1bmN0aW9uIGdldERhdGFDb3ZlcmFnZUFkbWluQXJlYXMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vYWRtaW5hcmVhc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJkYXRhbGV2ZWxcIiwgcGFyYW1zW1wiZGF0YWxldmVsXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXREYXRhQ292ZXJhZ2VBZG1pbkFyZWFzID0gZ2V0RGF0YUNvdmVyYWdlQWRtaW5BcmVhcztcbi8qKlxuICpcbiAqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZSBTaXplTWFwIGRhdGEgc2hvd2luZyBEYXRhQ292ZXJhZ2UgaW4gd29ybGQgZm9yIHByb3ZpZGVkXG4gKiBsYXllciBpZCBhbmQgdmVyc2lvbi4gQVBJIHNob3dzIGhlYXRtYXAgYmFzZWQgb24gdGhlIHBhcnRpdGlvbiBzaXplXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgTGF5ZXIgSWRlbnRpZmllclxuICogQHBhcmFtIGRhdGFsZXZlbCBUaWxlIGxldmVsLiBDdXJyZW50bHksIHNob3VsZCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gbGV2ZWwgMTFcbiAqL1xuZnVuY3Rpb24gZ2V0RGF0YUNvdmVyYWdlU2l6ZU1hcChidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9oZWF0bWFwL3NpemVcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZGF0YWxldmVsXCIsIHBhcmFtc1tcImRhdGFsZXZlbFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldERhdGFDb3ZlcmFnZVNpemVNYXAgPSBnZXREYXRhQ292ZXJhZ2VTaXplTWFwO1xuLyoqXG4gKlxuICpcbiAqIEBzdW1tYXJ5IFJldHJpZXZlIExheWVyIHNpemUgZGF0YSBmb3IgcHJvdmlkZWQgbGF5ZXIgaWQgYW5kIHZlcnNpb25cbiAqIEBwYXJhbSBsYXllcklkIFVuaXF1ZSBMYXllciBJZGVudGlmaWVyXG4gKi9cbmZ1bmN0aW9uIGdldERhdGFDb3ZlcmFnZVN1bW1hcnkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc3VtbWFyeVwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlU3VtbWFyeSA9IGdldERhdGFDb3ZlcmFnZVN1bW1hcnk7XG4vKipcbiAqXG4gKlxuICogQHN1bW1hcnkgUmV0cmlldmUgQml0TWFwIHNob3dpbmcgRGF0YUNvdmVyYWdlIGluIHdvcmxkIGZvciBwcm92aWRlZCBsYXllciBpZCBhbmQgdmVyc2lvbi5cbiAqIEFQSSBzaG93cyBkYXRhIGNvdmVyYWdlIGJ5IHBhcnRpdGlvbnMsIHNvIHRoZSB1c2VyIGNhbiBzZWUgd2hlcmUgb24gdGhlIHdvcmxkIG1hcCB0aGVyZSBpcyBhIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgY2F0YWxvZyBsYXllclxuICogQHBhcmFtIGxheWVySWQgVW5pcXVlIExheWVyIElkZW50aWZpZXJcbiAqIEBwYXJhbSBkYXRhbGV2ZWwgVGlsZSBsZXZlbC4gQ3VycmVudGx5LCBzaG91bGQgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGxldmVsIDExXG4gKi9cbmZ1bmN0aW9uIGdldERhdGFDb3ZlcmFnZVRpbGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vdGlsZW1hcFwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJkYXRhbGV2ZWxcIiwgcGFyYW1zW1wiZGF0YWxldmVsXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlVGlsZSA9IGdldERhdGFDb3ZlcmFnZVRpbGU7XG4vKipcbiAqXG4gKlxuICogQHN1bW1hcnkgUmV0cmlldmUgVGltZU1hcCBzaG93aW5nIERhdGFDb3ZlcmFnZSBpbiB3b3JsZCBmb3IgcHJvdmlkZWQgbGF5ZXIgaWQgYW5kIHZlcnNpb25cbiAqIEBwYXJhbSBsYXllcklkIFVuaXF1ZSBMYXllciBJZGVudGlmaWVyXG4gKiBAcGFyYW0gZGF0YWxldmVsIFRpbGUgbGV2ZWwuIEN1cnJlbnRseSwgc2hvdWxkIGJlIGVxdWFsIG9yIGxlc3MgdGhhbiBsZXZlbCAxMVxuICovXG5mdW5jdGlvbiBnZXREYXRhQ292ZXJhZ2VUaW1lTWFwKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2hlYXRtYXAvYWdlXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImRhdGFsZXZlbFwiLCBwYXJhbXNbXCJkYXRhbGV2ZWxcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2F0YWxvZ0hSTlwiLCBwYXJhbXNbXCJjYXRhbG9nSFJOXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RGF0YUNvdmVyYWdlVGltZU1hcCA9IGdldERhdGFDb3ZlcmFnZVRpbWVNYXA7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGVyZm9ybVVwZGF0ZSA9IGV4cG9ydHMucGVyZm9ybVF1ZXJ5ID0gZXhwb3J0cy5pbnNlcnRJbmRleGVzID0gdm9pZCAwO1xuLyoqXG4gKiBJbmRleCBBUEkgdjFcbiAqIFVzZSB0aGUgYGluZGV4YCBzZXJ2aWNlIHRvIGdldCB0aGUgZGF0YSBoYW5kbGVzIG9mIHRoZSBwYXJ0aXRpb25zIHRoYXQgbWF0Y2ggYSBxdWVyeS5cbiAqIFRoZW4sIHVzZSB0aGUgZGF0YSBoYW5kbGVzIHdpdGggdGhlIGBibG9iYCBzZXJ2aWNlIHRvIGdldCB0aGUgZGF0YSBmcm9tIHRoZSBwYXJ0aXRpb25zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sXG4gKiBzZWUgW0dldCBEYXRhIGZyb20gYW4gSW5kZXggTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1zdG9yZS9kYXRhX2Rldl9ndWlkZS9yZXN0L2dldHRpbmctZGF0YS1pbmRleC5odG1sKS5cbiAqIFlvdSBjYW4gYWxzbyB1c2UgdGhlIGBpbmRleGAgc2VydmljZSB0byBwdWJsaXNoIGRhdGEgdG8gYW4gaW5kZXggbGF5ZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLFxuICogc2VlIFtQdWJsaXNoIHRvIGFuIEluZGV4IExheWVyXShodHRwczovL2RldmVsb3Blci5oZXJlLmNvbS9kb2N1bWVudGF0aW9uL2RhdGEtc3RvcmUvZGF0YV9kZXZfZ3VpZGUvcmVzdC9wdWJsaXNoaW5nLWRhdGEtaW5kZXguaHRtbCkuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC4wXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbmRleEFwaVxuICovXG4vKipcbiAqIEFkZHMgaW5kZXggZGF0YSBmb3IgYSBnaXZlbiBkYXRhIGJsb2IgdG8gYW4gaW5kZXggbGF5ZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLFxuICogc2VlIFtQdWJsaXNoIHRvIGFuIEluZGV4IExheWVyXShodHRwczovL2RldmVsb3Blci5oZXJlLmNvbS9kb2N1bWVudGF0aW9uL2RhdGEtc3RvcmUvZGF0YV9kZXZfZ3VpZGUvcmVzdC9wdWJsaXNoaW5nLWRhdGEtaW5kZXguaHRtbCkuXG4gKlxuICogQHN1bW1hcnkgSW5zZXJ0cyBpbmRleCBkYXRhIHRvIGFuIGluZGV4IGxheWVyXG4gKiBAcGFyYW0gaW5kZXhlcyBBbiBhcnJheSBvZiBpbmRleCBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0gbGF5ZXJJRCBUaGUgbGF5ZXIgSUQgb2YgdGhlIGluZGV4IGxheWVyLlxuICovXG5mdW5jdGlvbiBpbnNlcnRJbmRleGVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySUR9XCIucmVwbGFjZShcIntsYXllcklEfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJRFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiaW5kZXhlc1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJpbmRleGVzXCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5pbnNlcnRJbmRleGVzID0gaW5zZXJ0SW5kZXhlcztcbi8qKlxuICogUXVlcmllcyB0aGUgaW5kZXggbGF5ZXIgZm9yIHRoZSBwYXJ0aXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5LlxuICogUmV0dXJucyBlYWNoIHBhcnRpdGlvbiB0aGF0IG1hdGNoZXMgdGhlIHF1ZXJ5LCBpbmNsdWRpbmcgZWFjaCBwYXJ0aXRpb24ncyBkYXRhIGhhbmRsZSxcbiAqIHdoaWNoIHlvdSB1c2Ugd2l0aCB0aGUgYGJsb2JgIEFQSSB0byByZXRyaWV2ZSBkYXRhIGZvciBlYWNoIHBhcnRpdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBwYXJ0aXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5XG4gKiBAcGFyYW0gbGF5ZXJJRCBUaGUgSUQgb2YgdGhlIGluZGV4IGxheWVyIHlvdSB3YW50IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHF1ZXJ5IEFuIFJTUUwgcXVlcnkgdG8gdXNlIHRvIHJldHJpZXZlIHBhcnRpdGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4gKiBbR2V0IERhdGEgZnJvbSBhbiBJbmRleCBMYXllcl0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLXN0b3JlL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLWluZGV4Lmh0bWwpLlxuICogVGhlIHF1ZXJ5IG11c3QgdXNlIHRoZSBpbmRleGluZyBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhlIGluZGV4IGxheWVyLlxuICogQHBhcmFtIGh1Z2UgU2V0IHRvIHRydWUgZm9yIGh1Z2UgcXVlcnkuXG4gKi9cbmZ1bmN0aW9uIHBlcmZvcm1RdWVyeShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklEfVwiLnJlcGxhY2UoXCJ7bGF5ZXJJRH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySURcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJodWdlXCIsIHBhcmFtc1tcImh1Z2VcIl0gPyBcInRydWVcIiA6IFwiZmFsc2VcIik7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJxdWVyeVwiLCBwYXJhbXNbXCJxdWVyeVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucGVyZm9ybVF1ZXJ5ID0gcGVyZm9ybVF1ZXJ5O1xuLyoqXG4gKiBNb2RpZmllcyBwYXJ0aXRpb25zIGluIGFuIGluZGV4IGxheWVyLlxuICpcbiAqIEBzdW1tYXJ5IFVwZGF0ZXMgaW5kZXggbGF5ZXIgcGFydGl0aW9uc1xuICogQHBhcmFtIGxheWVySUQgVGhlIGxheWVyIElEIG9mIHRoZSBpbmRleCBsYXllci5cbiAqIEBwYXJhbSByZXF1ZXN0IENvbnRhaW5zIHRoZSBkYXRhIHlvdSB3YW50IHRvIGFkZCBvciByZW1vdmUgZnJvbSB0aGUgaW5kZXggbGF5ZXJcbiAqL1xuZnVuY3Rpb24gcGVyZm9ybVVwZGF0ZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklEfVwiLnJlcGxhY2UoXCJ7bGF5ZXJJRH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySURcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wicmVxdWVzdFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJyZXF1ZXN0XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wZXJmb3JtVXBkYXRlID0gcGVyZm9ybVVwZGF0ZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAyMSBIRVJFIEV1cm9wZSBCLlYuIGFuZCBpdHMgYWZmaWxpYXRlKHMpLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvZnR3YXJlIGFuZCBvdGhlciBtYXRlcmlhbHMgY29udGFpbiBwcm9wcmlldGFyeSBpbmZvcm1hdGlvblxuICogY29udHJvbGxlZCBieSBIRVJFIGFuZCBhcmUgcHJvdGVjdGVkIGJ5IGFwcGxpY2FibGUgY29weXJpZ2h0IGxlZ2lzbGF0aW9uLlxuICogQW55IHVzZSBhbmQgdXRpbGl6YXRpb24gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgb3RoZXIgbWF0ZXJpYWxzIGFuZFxuICogZGlzY2xvc3VyZSB0byBhbnkgdGhpcmQgcGFydGllcyBpcyBjb25kaXRpb25hbCB1cG9uIGhhdmluZyBhIHNlcGFyYXRlXG4gKiBhZ3JlZW1lbnQgd2l0aCBIRVJFIGZvciB0aGUgYWNjZXNzLCB1c2UsIHV0aWxpemF0aW9uIG9yIGRpc2Nsb3N1cmUgb2YgdGhpc1xuICogc29mdHdhcmUuIEluIHRoZSBhYnNlbmNlIG9mIHN1Y2ggYWdyZWVtZW50LCB0aGUgdXNlIG9mIHRoZSBzb2Z0d2FyZSBpcyBub3RcbiAqIGFsbG93ZWQuXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wdXRGZWF0dXJlcyA9IGV4cG9ydHMucHV0RmVhdHVyZSA9IGV4cG9ydHMucG9zdEZlYXR1cmVzID0gZXhwb3J0cy5wYXRjaEZlYXR1cmUgPSBleHBvcnRzLmRlbGV0ZUZlYXR1cmVzID0gZXhwb3J0cy5kZWxldGVGZWF0dXJlID0gZXhwb3J0cy5zZWFyY2hGZWF0dXJlcyA9IGV4cG9ydHMuaXRlcmF0ZUZlYXR1cmVzID0gZXhwb3J0cy5nZXRTdGF0aXN0aWNzID0gZXhwb3J0cy5nZXRGZWF0dXJlc0J5VGlsZSA9IGV4cG9ydHMuZ2V0RmVhdHVyZXNCeVNwYXRpYWxQb3N0ID0gZXhwb3J0cy5nZXRGZWF0dXJlc0J5U3BhdGlhbCA9IGV4cG9ydHMuZ2V0RmVhdHVyZXNCeUJCb3ggPSBleHBvcnRzLmdldEZlYXR1cmVzID0gZXhwb3J0cy5nZXRGZWF0dXJlID0gZXhwb3J0cy5nZXRIZWFsdGggPSBleHBvcnRzLmdldEFwaVZlcnNpb24gPSB2b2lkIDA7XG4vKipcbiAqIEludGVyYWN0aXZlIEFQSSB2MVxuICogSW50ZXJhY3RpdmUgQVBJIHYxIGlzIGEgUkVTVCBBUEkgZm9yIHNpbXBsZSBhY2Nlc3MgdG8gZ2VvIGRhdGEuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC4wXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlOmFycmF5LXR5cGVcbi8vIHRzbGludDpkaXNhYmxlOiB1bmlmaWVkLXNpZ25hdHVyZXNcbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qKlxuICogUmV0cmlldmVzIEFQSSBTcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdldEFwaVZlcnNpb24oYnVpbGRlcikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi92ZXJzaW9uXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEFwaVZlcnNpb24gPSBnZXRBcGlWZXJzaW9uO1xuLyoqXG4gKiBUZXN0cyBiYXNpYyBoZWFsdGggb2YgdGhlIHNlcnZpY2UuXG4gKi9cbmZ1bmN0aW9uIGdldEhlYWx0aChidWlsZGVyKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2hlYWx0aFwiO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRIZWFsdGggPSBnZXRIZWFsdGg7XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZmVhdHVyZSB3aXRoIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLlxuICpcbiAqIEBzdW1tYXJ5IEdldCBhIGZlYXR1cmUgYnkgSUQuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGZlYXR1cmVJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgYSBmZWF0dXJlIGluIHRoZSBsYXllci5cbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmZWF0dXJlcyByZXN1bHQgbGlzdC5cbiAqIE11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBieSB1c2luZyBjb21tYSgsKS5cbiAqIEV4YW1wbGU6IGA/c2VsZWN0aW9uPXAubmFtZSxwLmNhcGFjaXR5LHAuY29sb3JgLlxuICpcbiAqIEBwYXJhbSBmb3JjZTJEIElmIHNldCB0byBgdHJ1ZWAgdGhlIGZlYXR1cmVzIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgb25seSBYJ3MgYW5kIFkncyBhcyBjb29yZGluYXRlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RmVhdHVyZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9mZWF0dXJlcy97ZmVhdHVyZUlkfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntmZWF0dXJlSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJmZWF0dXJlSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzZWxlY3Rpb25cIiwgcGFyYW1zW1wic2VsZWN0aW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RmVhdHVyZSA9IGdldEZlYXR1cmU7XG4vKipcbiAqIFJldHVybnMgYWxsIG9mIHRoZSBmZWF0dXJlcyBmb3VuZCBmb3IgdGhlIHByb3ZpZGVkIGxpc3Qgb2YgaWRzLlxuICogVGhlIHJlc3BvbnNlIGlzIGFsd2F5cyBhIEZlYXR1cmVDb2xsZWN0aW9uLCBldmVuIGlmIHRoZXJlIGFyZSBubyBmZWF0dXJlcyB3aXRoIHRoZSBwcm92aWRlZCBpZHMuXG4gKlxuICogQHN1bW1hcnkgR2V0IGZlYXR1cmVzIGJ5IElELlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICpcbiAqIEBwYXJhbSBpZCBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHVuaXF1ZSBmZWF0dXJlIGlkZW50aWZpZXJzLlxuICogVGhlc2UgYXJlIHRoZSBhY2NlcHRhYmxlIGZvcm1hdHMgZm9yIHRoaXMgZmllbGQ6XG4gKiBgYGBcbiAqIGlkPXZhbHVlMSx2YWx1ZTJcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb24gQSBsaXN0IG9mIHByb3BlcnRpZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZlYXR1cmVzIHJlc3VsdCBsaXN0LlxuICogTXVsdGlwbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGNvbW1hKCwpLlxuICogRXhhbXBsZTogYD9zZWxlY3Rpb249cC5uYW1lLHAuY2FwYWNpdHkscC5jb2xvcmAuXG4gKlxuICogQHBhcmFtIGZvcmNlMkQgSWYgc2V0IHRvIGB0cnVlYCB0aGUgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlIHdpbGwgaGF2ZSBvbmx5IFgncyBhbmQgWSdzIGFzIGNvb3JkaW5hdGVzLlxuICovXG5mdW5jdGlvbiBnZXRGZWF0dXJlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9mZWF0dXJlc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJpZFwiLCBwYXJhbXNbXCJpZFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzZWxlY3Rpb25cIiwgcGFyYW1zW1wic2VsZWN0aW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RmVhdHVyZXMgPSBnZXRGZWF0dXJlcztcbmZ1bmN0aW9uIGdldEZlYXR1cmVzQnlCQm94KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2Jib3hcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmJveFwiLCBwYXJhbXNbXCJiYm94XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNsaXBcIiwgcGFyYW1zW1wiY2xpcFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsaW1pdFwiLCBwYXJhbXNbXCJsaW1pdFwiXSk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHBhcmFtcy5wYXJhbXM7XG4gICAgICAgIGlmIChzZWFyY2hQYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgc2VhcmNoUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkocGFyYW0ua2V5LCBwYXJhbS52YWx1ZSwgcGFyYW0ub3BlcmF0b3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB3aWxsIGJlIHJlbW92ZWQgMDYuMjAyMlxuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcmFtc1wiLCBwYXJhbXNbXCJwYXJhbXNcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzZWxlY3Rpb25cIiwgcGFyYW1zW1wic2VsZWN0aW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNraXBDYWNoZVwiLCBwYXJhbXNbXCJza2lwQ2FjaGVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2x1c3RlcmluZ1wiLCBwYXJhbXNbXCJjbHVzdGVyaW5nXCJdKTtcbiAgICAgICAgaWYgKHBhcmFtc1tcImNsdXN0ZXJpbmdQYXJhbXNcIl0pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2x1c3RlcmluZ1BhcmFtIGluIHBhcmFtc1tcImNsdXN0ZXJpbmdQYXJhbXNcIl0pIHtcbiAgICAgICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KGBjbHVzdGVyaW5nLiR7Y2x1c3RlcmluZ1BhcmFtfWAsIHBhcmFtc1tcImNsdXN0ZXJpbmdQYXJhbXNcIl1bY2x1c3RlcmluZ1BhcmFtXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RmVhdHVyZXNCeUJCb3ggPSBnZXRGZWF0dXJlc0J5QkJveDtcbmZ1bmN0aW9uIGdldEZlYXR1cmVzQnlTcGF0aWFsKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3NwYXRpYWxcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGF0XCIsIHBhcmFtc1tcImxhdFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJsbmdcIiwgcGFyYW1zW1wibG5nXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlZkNhdGFsb2dIcm5cIiwgcGFyYW1zW1wicmVmQ2F0YWxvZ0hyblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyZWZMYXllcklkXCIsIHBhcmFtc1tcInJlZkxheWVySWRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVmRmVhdHVyZUlkXCIsIHBhcmFtc1tcInJlZkZlYXR1cmVJZFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyYWRpdXNcIiwgcGFyYW1zW1wicmFkaXVzXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gcGFyYW1zLnBhcmFtcztcbiAgICAgICAgaWYgKHNlYXJjaFBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBzZWFyY2hQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShwYXJhbS5rZXksIHBhcmFtLnZhbHVlLCBwYXJhbS5vcGVyYXRvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdpbGwgYmUgcmVtb3ZlZCAwNi4yMDIyXG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFyYW1zXCIsIHBhcmFtc1tcInBhcmFtc1wiXSk7XG4gICAgICAgIH1cbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2tpcENhY2hlXCIsIHBhcmFtc1tcInNraXBDYWNoZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEZlYXR1cmVzQnlTcGF0aWFsID0gZ2V0RmVhdHVyZXNCeVNwYXRpYWw7XG5mdW5jdGlvbiBnZXRGZWF0dXJlc0J5U3BhdGlhbFBvc3QoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc3BhdGlhbFwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJyYWRpdXNcIiwgcGFyYW1zW1wicmFkaXVzXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gcGFyYW1zLnBhcmFtcztcbiAgICAgICAgaWYgKHNlYXJjaFBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBzZWFyY2hQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShwYXJhbS5rZXksIHBhcmFtLnZhbHVlLCBwYXJhbS5vcGVyYXRvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdpbGwgYmUgcmVtb3ZlZCAwNi4yMDIyXG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFyYW1zXCIsIHBhcmFtc1tcInBhcmFtc1wiXSk7XG4gICAgICAgIH1cbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2tpcENhY2hlXCIsIHBhcmFtc1tcInNraXBDYWNoZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJmb3JjZTJEXCIsIHBhcmFtc1tcImZvcmNlMkRcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEZlYXR1cmVzQnlTcGF0aWFsUG9zdCA9IGdldEZlYXR1cmVzQnlTcGF0aWFsUG9zdDtcbmZ1bmN0aW9uIGdldEZlYXR1cmVzQnlUaWxlKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3RpbGUve3RpbGVUeXBlfS97dGlsZUlkfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInt0aWxlVHlwZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInRpbGVUeXBlXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3RpbGVJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInRpbGVJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNsaXBcIiwgcGFyYW1zW1wiY2xpcFwiXSk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHBhcmFtcy5wYXJhbXM7XG4gICAgICAgIGlmIChzZWFyY2hQYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgc2VhcmNoUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkocGFyYW0ua2V5LCBwYXJhbS52YWx1ZSwgcGFyYW0ub3BlcmF0b3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB3aWxsIGJlIHJlbW92ZWQgMDYuMjAyMlxuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcmFtc1wiLCBwYXJhbXNbXCJwYXJhbXNcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzZWxlY3Rpb25cIiwgcGFyYW1zW1wic2VsZWN0aW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNraXBDYWNoZVwiLCBwYXJhbXNbXCJza2lwQ2FjaGVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiY2x1c3RlcmluZ1wiLCBwYXJhbXNbXCJjbHVzdGVyaW5nXCJdKTtcbiAgICAgICAgaWYgKHBhcmFtc1tcImNsdXN0ZXJpbmdQYXJhbXNcIl0pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2x1c3RlcmluZ1BhcmFtIGluIHBhcmFtc1tcImNsdXN0ZXJpbmdQYXJhbXNcIl0pIHtcbiAgICAgICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KGBjbHVzdGVyaW5nLiR7Y2x1c3RlcmluZ1BhcmFtfWAsIHBhcmFtc1tcImNsdXN0ZXJpbmdQYXJhbXNcIl1bY2x1c3RlcmluZ1BhcmFtXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm1hcmdpblwiLCBwYXJhbXNbXCJtYXJnaW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZm9yY2UyRFwiLCBwYXJhbXNbXCJmb3JjZTJEXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRGZWF0dXJlc0J5VGlsZSA9IGdldEZlYXR1cmVzQnlUaWxlO1xuLyoqXG4gKiBSZXR1cm5zIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbGF5ZXIuXG4gKlxuICogQHN1bW1hcnkgR2V0IHN0YXRpc3RpY3MuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIHNraXBDYWNoZSBJZiBzZXQgdG8gdHJ1ZSB0aGUgcmVzcG9uc2UgaXMgbm90IHJldHVybmVkIGZyb20gY2FjaGUuXG4gKiBEZWZhdWx0IGlzIGZhbHNlLlxuICovXG5mdW5jdGlvbiBnZXRTdGF0aXN0aWNzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3N0YXRpc3RpY3NcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2tpcENhY2hlXCIsIHBhcmFtc1tcInNraXBDYWNoZVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0U3RhdGlzdGljcyA9IGdldFN0YXRpc3RpY3M7XG4vKipcbiAqIEl0ZXJhdGVzIGFsbCBvZiB0aGUgZmVhdHVyZXMgaW4gdGhlIGxheWVyLiBUaGUgZmVhdHVyZXMgaW4gdGhlIHJlc3BvbnNlIGFyZSBvcmRlcmVkIHNvXG4gKiB0aGF0IG5vIGZlYXR1cmUgaXMgcmV0dXJuZWQgdHdpY2UuIElmIHRoZXJlIGFyZSBtb3JlIGZlYXR1cmVzLCB3aGljaCBjb3VsZCBiZSBsb2FkZWQsXG4gKiB0aGUgcmVzcG9uc2UgRmVhdHVyZUNvbGxlY3Rpb24gd2lsbCBjb250YWluIHRoZSByb290IGF0dHJpYnV0ZSBuZXh0UGFnZVRva2VuLlxuICogVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBwYXNzZWQgYXMgYSBxdWVyeSBwYXJhbWV0ZXIgZm9yIHRoZSBmb2xsb3dpbmcgcmVxdWVzdFxuICogaW4gb3JkZXIgdG8gY29udGludWUgdGhlIGl0ZXJhdGlvbiBmcm9tIHRoZSBtYXJrZWQgcG9zaXRpb24uXG4gKlxuICogQHN1bW1hcnkgSXRlcmF0ZSBmZWF0dXJlcyBpbiB0aGUgbGF5ZXIuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGxpbWl0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2UuIERlZmF1bHQgaXMgMzAwMDAuIEhhcmQgbGltaXQgaXMgMTAwMDAwLlxuICpcbiAqIEBwYXJhbSBwYWdlVG9rZW4gVGhlIHBhZ2UgdG9rZW4gd2hlcmUgdGhlIGl0ZXJhdGlvbiB3aWxsIGNvbnRpbnVlLlxuICpcbiAqIEBwYXJhbSBwYXJ0IFJlcXVlc3RzIGRpc2p1bmN0IHBhcnRzIG9mIGl0ZXJhdGlvbiByZXN1bHRzICh1c2VkIHdpdGggc29ydCkuXG4gKiBMaXN0IG9mIHR3byBpbnRlZ2VycyBcInBhcnQsdG90YWxcIi4gcGFydD0xLDQgcmVhZCBhcyBmaXJzdCBwYXJ0IG91dCBvZiA0LCAuLi4gdW50aWwgcGFydD00LDQgLlxuICogRXhhbXBsZTogP3BhcnQ9Nyw5XG4gKlxuICogQHBhcmFtIHNlbGVjdGlvbiBBIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmVhdHVyZXMgcmVzdWx0IGxpc3QuXG4gKiBNdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgY29tbWEoLCkuXG4gKiBFeGFtcGxlOiBgP3NlbGVjdGlvbj1wLm5hbWUscC5jYXBhY2l0eSxwLmNvbG9yYC5cbiAqXG4gKiBAcGFyYW0gc29ydCBTcGVjaWZpZXMgdGhlIHNvcnQgb3JkZXIgYnkgYSBsaXN0IG9mIHByb3BlcnRpZXMuXG4gKiBBc2NlbmRpbmcgYXNzdW1lZCBpZiBubyBzb3J0IGRpcmVjdGlvbiAoOmFzYywgOmRlc2MpIGlzIHNwZWNpZmllZC5cbiAqIEV4YW1wbGU6IHNvcnQgPSBbXCJwLm5hbWU6YXNjXCIsIFwicC5jb2xvcjpkZXNjXCJdID0+ID9zb3J0PXAubmFtZTphc2MscC5jb2xvcjpkZXNjLlxuICpcbiAqIEBwYXJhbSBza2lwQ2FjaGUgSWYgc2V0IHRvIHRydWUgdGhlIHJlc3BvbnNlIGlzIG5vdCByZXR1cm5lZCBmcm9tIGNhY2hlLiBEZWZhdWx0IGlzIGZhbHNlLlxuICpcbiAqIEBwYXJhbSBmb3JjZTJEIElmIHNldCB0byB0cnVlIHRoZSBmZWF0dXJlcyBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBoYXZlIG9ubHkgWCdzIGFuZCBZJ3MgYXMgY29vcmRpbmF0ZXMuXG4gKi9cbmZ1bmN0aW9uIGl0ZXJhdGVGZWF0dXJlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9pdGVyYXRlXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImxpbWl0XCIsIHBhcmFtc1tcImxpbWl0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhZ2VUb2tlblwiLCBwYXJhbXNbXCJwYWdlVG9rZW5cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicGFydFwiLCBwYXJhbXNbXCJwYXJ0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNlbGVjdGlvblwiLCBwYXJhbXNbXCJzZWxlY3Rpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic29ydFwiLCBwYXJhbXNbXCJzb3J0XCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInNraXBDYWNoZVwiLCBwYXJhbXNbXCJza2lwQ2FjaGVcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiZm9yY2UyRFwiLCBwYXJhbXNbXCJmb3JjZTJEXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5pdGVyYXRlRmVhdHVyZXMgPSBpdGVyYXRlRmVhdHVyZXM7XG5mdW5jdGlvbiBzZWFyY2hGZWF0dXJlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9zZWFyY2hcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibGltaXRcIiwgcGFyYW1zW1wibGltaXRcIl0pO1xuICAgICAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBwYXJhbXMucGFyYW1zO1xuICAgICAgICBpZiAoc2VhcmNoUGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KHBhcmFtLmtleSwgcGFyYW0udmFsdWUsIHBhcmFtLm9wZXJhdG9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gd2lsbCBiZSByZW1vdmVkIDA2LjIwMjJcbiAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYXJhbXNcIiwgcGFyYW1zW1wicGFyYW1zXCJdKTtcbiAgICAgICAgfVxuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2VsZWN0aW9uXCIsIHBhcmFtc1tcInNlbGVjdGlvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJza2lwQ2FjaGVcIiwgcGFyYW1zW1wic2tpcENhY2hlXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImZvcmNlMkRcIiwgcGFyYW1zW1wiZm9yY2UyRFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc2VhcmNoRmVhdHVyZXMgPSBzZWFyY2hGZWF0dXJlcztcbi8qKlxuICogRGVsZXRlcyBhbiBleGlzdGluZyBmZWF0dXJlLlxuICpcbiAqIEBzdW1tYXJ5IERlbGV0ZXMgYSBmZWF0dXJlLlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICpcbiAqIEBwYXJhbSBmZWF0dXJlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgZmVhdHVyZSBpbiB0aGUgbGF5ZXIuXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZlYXR1cmUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXMve2ZlYXR1cmVJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZmVhdHVyZUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmVhdHVyZUlkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVGZWF0dXJlID0gZGVsZXRlRmVhdHVyZTtcbi8qKlxuICogVGhlIHdpbGRjYXJkIHNpZ24oKikgY291bGQgYmUgdXNlZCB0byBkZWxldGUgYWxsIGZlYXR1cmVzIGluIHRoZSBsYXllci5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGUgbXVsdGlwbGUgZmVhdHVyZXMgZnJvbSB0aGUgbGF5ZXIuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKlxuICogQHBhcmFtIGlkIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdW5pcXVlIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gKiBUaGVzZSBhcmUgdGhlIGFjY2VwdGFibGUgZm9ybWF0cyBmb3IgdGhpcyBmaWVsZDpcbiAqIGBgYFxuICogaWQ9dmFsdWUxLHZhbHVlMlxuICogaWQ9dmFsdWUxLGlkPXZhbHVlMlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZlYXR1cmVzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2ZlYXR1cmVzXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImlkXCIsIHBhcmFtc1tcImlkXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlRmVhdHVyZXMgPSBkZWxldGVGZWF0dXJlcztcbi8qKlxuICogUGF0Y2hlcyBhbiBleGlzdGluZyBmZWF0dXJlLlxuICpcbiAqIEBzdW1tYXJ5IFBhdGNoIGEgZmVhdHVyZS5cbiAqXG4gKiBAcGFyYW0gYm9keSBBIGZlYXR1cmUgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZWQgZm9yIHRoZSBMYXllciBJRC5cbiAqXG4gKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhIGZlYXR1cmUgaW4gdGhlIGxheWVyLlxuICovXG5mdW5jdGlvbiBwYXRjaEZlYXR1cmUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXMve2ZlYXR1cmVJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZmVhdHVyZUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmVhdHVyZUlkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wYXRjaEZlYXR1cmUgPSBwYXRjaEZlYXR1cmU7XG4vKipcbiAqIENyZWF0ZSBvciBwYXRjaCBmZWF0dXJlcy5cbiAqXG4gKiBAc3VtbWFyeSBNb2RpZnkgZmVhdHVyZXMuXG4gKlxuICogQHBhcmFtIGJvZHkgQSBGZWF0dXJlQ29sbGVjdGlvbiBvYmplY3Qgb3IgYSBGZWF0dXJlTW9kaWZpY2F0aW9uTGlzdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGxheWVySWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVkIGZvciB0aGUgTGF5ZXIgSUQuXG4gKi9cbmZ1bmN0aW9uIHBvc3RGZWF0dXJlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9mZWF0dXJlc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucG9zdEZlYXR1cmVzID0gcG9zdEZlYXR1cmVzO1xuLyoqXG4gKiBDcmVhdGVzIG9yIHJlcGxhY2VzIGEgZmVhdHVyZSBpbiB0aGUgbGF5ZXIuXG4gKlxuICogQHN1bW1hcnkgQ3JlYXRlIG9yIHJlcGxhY2UgYSBmZWF0dXJlLlxuICpcbiAqIEBwYXJhbSBib2R5IEEgZmVhdHVyZSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICpcbiAqIEBwYXJhbSBmZWF0dXJlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgZmVhdHVyZSBpbiB0aGUgbGF5ZXIuXG4gKi9cbmZ1bmN0aW9uIHB1dEZlYXR1cmUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZmVhdHVyZXMve2ZlYXR1cmVJZH1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZmVhdHVyZUlkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZmVhdHVyZUlkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucHV0RmVhdHVyZSA9IHB1dEZlYXR1cmU7XG4vKipcbiAqIENyZWF0ZSBvciByZXBsYWNlIHRoZSBwcm92aWRlZCBmZWF0dXJlcy5cbiAqXG4gKiBAc3VtbWFyeSBDcmVhdGUgb3IgcmVwbGFjZSBtdWx0aXBsZSBmZWF0dXJlcy5cbiAqXG4gKiBAcGFyYW0gYm9keSBBIGZlYXR1cmUgY29sbGVjdGlvbiByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBsYXllcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllZCBmb3IgdGhlIExheWVyIElELlxuICovXG5mdW5jdGlvbiBwdXRGZWF0dXJlcyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9mZWF0dXJlc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wdXRGZWF0dXJlcyA9IHB1dEZlYXR1cmVzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFJlc291cmNlQVBJTGlzdCA9IGV4cG9ydHMucmVzb3VyY2VBUEkgPSBleHBvcnRzLmdldFBsYXRmb3JtQVBJTGlzdCA9IGV4cG9ydHMucGxhdGZvcm1BUEkgPSB2b2lkIDA7XG4vKipcbiAqIEFQSSBMb29rdXAgU2VydmljZSB2MVxuICogVGhlIEFQSSBMb29rdXAgU2VydmljZSBpcyBhIHBsYXRmb3JtIHNlcnZpY2Ugd2l0aCBmb2xsb3dpbmcgZ29hbHM6XG4gKiAtIFJlZGlyZWN0IHVzZXJzIHRvIFJFU1QgQVBJcyByZWxhdGVkIHRvIGEgcmVzb3VyY2UgaWRlbnRpZmllZCBieSBhbiBIUk5cbiAqIC0gR2l2ZW4gYW4gSFJOLCBwcm92aWRlIHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBpbiBSRVNUIEFQSXMgY2FsbHMuIC0gRGlzY292ZXJ5IG9mIG90aGVyIEhFUkUgQVBJcy5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wLjNcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFBsYXRmb3JtQXBpXG4gKi9cbi8qKlxuICogUmV0dXJuIGRldGFpbHMgb2YgYSBzaW5nbGUgcGxhdGZvcm0gQVBJLiBUaGlzIHJlc3BvbnNlIGlzIHZhbGlkIGZvciB0aGUgdGltZSBzcGVjaWZpZWQgYnkgJ0NhY2hlLUNvbnRyb2wnIGhlYWRlci5cbiAqXG4gKiBAc3VtbWFyeSBSZXR1cm4gZGV0YWlscyBvZiBhIHNpbmdsZSBwbGF0Zm9ybSBBUEkuXG4gKiBAcGFyYW0gYXBpIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBBUElcbiAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBBUElcbiAqL1xuZnVuY3Rpb24gcGxhdGZvcm1BUEkoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3BsYXRmb3JtL2FwaXMve2FwaX0ve3ZlcnNpb259XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2FwaX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFwaVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInt2ZXJzaW9ufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widmVyc2lvblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wbGF0Zm9ybUFQSSA9IHBsYXRmb3JtQVBJO1xuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3Qgb2YgdGhlIEhFUkUgQVBJcy4gVGhpcyByZXNwb25zZSBpcyB2YWxpZCBmb3IgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5ICdDYWNoZS1Db250cm9sJyBoZWFkZXIuXG4gKlxuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBsaXN0IG9mIHRoZSBIRVJFIEFQSXMuXG4gKi9cbmZ1bmN0aW9uIGdldFBsYXRmb3JtQVBJTGlzdChidWlsZGVyKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3BsYXRmb3JtL2FwaXNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFBsYXRmb3JtQVBJTGlzdCA9IGdldFBsYXRmb3JtQVBJTGlzdDtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc291cmNlc0FwaVxuICovXG4vKipcbiAqIFJldHVybiBkZXRhaWxzIG9mIGEgc2luZ2xlIEFQSSBmb3IgYSBnaXZlbiByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IGhybiwgYXBpIGFuZCB2ZXJzaW9uLlxuICogVGhpcyByZXNwb25zZSBpcyB2YWxpZCBmb3IgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5ICdDYWNoZS1Db250cm9sJyBoZWFkZXIuXG4gKlxuICogQHN1bW1hcnkgUmV0dXJuIGRldGFpbHMgb2YgYSBzaW5nbGUgQVBJIGZvciBhIGdpdmVuIHJlc291cmNlLlxuICogQHBhcmFtIGhybiBUaGUgSFJOIGlkZW50aWZ5aW5nIHRoZSByZXNvdXJjZVxuICogQHBhcmFtIGFwaSBUaGUgaWRlbnRpZmllciBvZiB0aGUgQVBJXG4gKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgQVBJXG4gKiBAcGFyYW0gcmVnaW9uIElmIHlvdSB3YW50IHRvIGxvb2sgdXAgYSBzcGVjaWZpYyByZWdpb24gZm9yIGEgZ2l2ZW4gcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIHJlc291cmNlQVBJKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve2hybn0vYXBpcy97YXBpfS97dmVyc2lvbn1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7aHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiaHJuXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2FwaX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImFwaVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInt2ZXJzaW9ufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widmVyc2lvblwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInJlZ2lvblwiLCBwYXJhbXNbXCJyZWdpb25cIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlc291cmNlQVBJID0gcmVzb3VyY2VBUEk7XG4vKipcbiAqIFJldHVybiB0aGUgbGlzdCBvZiBBUElzIGZvciBhIGdpdmVuIHJlc291cmNlIGlkZW50aWZpZWQgYnkgaHJuLiBUaGlzIHJlc3BvbnNlIGlzIHZhbGlkIGZvciB0aGUgdGltZSBzcGVjaWZpZWQgYnkgJ0NhY2hlLUNvbnRyb2wnIGhlYWRlci5cbiAqXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGxpc3Qgb2YgQVBJcyBmb3IgYSBnaXZlbiByZXNvdXJjZS5cbiAqIEBwYXJhbSBocm4gVGhlIEhSTiBpZGVudGlmeWluZyB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSByZWdpb24gSWYgeW91IHdhbnQgdG8gbG9vayB1cCBhIHNwZWNpZmljIHJlZ2lvbiBmb3IgYSBnaXZlbiByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzb3VyY2VBUElMaXN0KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9yZXNvdXJjZXMve2hybn0vYXBpc1wiLnJlcGxhY2UoXCJ7aHJufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiaHJuXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwicmVnaW9uXCIsIHBhcmFtc1tcInJlZ2lvblwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlc291cmNlQVBJTGlzdCA9IGdldFJlc291cmNlQVBJTGlzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxOSBIRVJFIEV1cm9wZSBCLlYuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKiBMaWNlbnNlLUZpbGVuYW1lOiBMSUNFTlNFXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5taW5pbXVtVmVyc2lvbiA9IGV4cG9ydHMubGlzdFZlcnNpb25zID0gZXhwb3J0cy5sYXRlc3RWZXJzaW9uID0gZXhwb3J0cy5nZXRQYXJ0aXRpb25zID0gZXhwb3J0cy5nZXRMYXllclZlcnNpb25zID0gZXhwb3J0cy5nZXRDaGFuZ2VzID0gdm9pZCAwO1xuLyoqXG4gKiBNZXRhZGF0YSBBUEkgdjFcbiAqIFRoZSBgbWV0YWRhdGFgIHNlcnZpY2UgcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IGluZm9ybWF0aW9uIChtZXRhZGF0YSkgYWJvdXQgbGF5ZXJzIGFuZCBwYXJ0aXRpb25zIHN0b3JlZCBpbiBhIGNhdGFsb2cuXG4gKiBUaGlzIHNlcnZpY2UgZXhwb3NlcyB0aGUgbWV0YWRhdGEgZm9yIGFsbCB0aGUgcGFydGl0aW9ucyBvciBhbGwgdGhlIGNoYW5nZWQgcGFydGl0aW9ucy4gRm9yIGEgY2F0YWxvZyB3aXRoIHZlcnNpb25lZCBsYXllcnMsXG4gKiB5b3UgY2FuIHJldHJpZXZlIG1ldGFkYXRhIGZvciBhIHBhcnRpY3VsYXIgdmVyc2lvbiBvciB2ZXJzaW9uIHJhbmdlIG9mIHRoZSBjYXRhbG9nLlxuICogWW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBmb3IgYSBjYXRhbG9nIHdpdGggdmVyc2lvbmVkIGxheWVyczpcbiAqIC0gTGlzdCB2ZXJzaW9ucyBvZiB0aGUgY2F0YWxvZyAtIEdldCBsYXRlc3QgYW5kIG1pbmltdW0gdmVyc2lvbiBvZiB0aGUgY2F0YWxvZ1xuICogLSBHZXQgbWV0YWRhdGEgb2YgdGhlIHNwZWNpZmljIGxheWVycyAgRm9yIGEgdm9sYXRpbGUgbGF5ZXIsIHlvdSBjYW4gZ2V0IG1ldGFkYXRhIGZvciBhbGwgb3IgYSBzdWJzZXQgb2YgcGFydGl0aW9ucyBvZiB0aGUgbGF5ZXIuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC4wXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBNZXRhZGF0YUFwaVxuICovXG4vKipcbiAqIEdldHMgdGhlIGxhdGVzdCBwYXJ0aXRpb24gbWV0YWRhdGEgaW4gYSB2ZXJzaW9uIHJhbmdlIGZvciBhIHZlcnNpb25lZCBsYXllciBvciBhIHRpbWUgcmFuZ2UgZm9yIGEgdm9sYXRpbGUgbGF5ZXIuXG4gKiBGb3IgdmVyc2lvbmVkIGxheWVycyB0aGUgcmFuZ2UgaXMgZXhwcmVzc2VkIGFzIGEgc3RhcnQgYW5kIGVuZCB2ZXJzaW9uIGFuZCBtaWdodCBub3QgcmV0dXJuIGFsbCBjaGFuZ2VzIGZvciB0aGUgcGFydGl0aW9uc1xuICogd2hpY2ggd2VyZSBhZGRlZCBhbmQgcmVtb3ZlZCBpbiBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RhcnQgYW5kIGVuZCB2ZXJzaW9ucy5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGNoYW5nZXMgZm9yIHRoZSB2ZXJzaW9uIHJhbmdlLlxuICogQHBhcmFtIGxheWVySWQgVW5pcXVlIGxheWVyIElELiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYSB2YWxpZCBsYXllciBJRC5cbiAqIEBwYXJhbSBzdGFydFZlcnNpb24gTWFuZGF0b3J5IGZvciB2ZXJzaW9uZWQgbGF5ZXJzOyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYW5nZSBvZiB2ZXJzaW9ucyB5b3Ugd2FudCB0byBnZXQgKGV4Y2x1c2l2ZSkuXG4gKiBCeSBjb252ZW50aW9uIC0xIGluZGljYXRlcyB0aGUgaW5pdGlhbCB2ZXJzaW9uIGJlZm9yZSB0aGUgZmlyc3QgcHVibGljYXRpb24uIEFmdGVyIHRoZSBmaXJzdCBwdWJsaWNhdGlvbiwgdGhlIGNhdGFsb2cgdmVyc2lvbiBpcyAwLlxuICogQHBhcmFtIGVuZFZlcnNpb24gTWFuZGF0b3J5IGZvciB2ZXJzaW9uZWQgbGF5ZXJzOyB0aGUgZW5kIG9mIHRoZSByYW5nZSBvZiB2ZXJzaW9ucyB5b3Ugd2FudCB0byBnZXQgKGluY2x1c2l2ZSkuXG4gKiBUaGlzIG11c3QgYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24gZ3JlYXRlciB0aGFuIHRoZSBzdGFydFZlcnNpb24uXG4gKiBAcGFyYW0gc2luY2VUaW1lIE1hbmRhdG9yeSBmb3Igdm9sYXRpbGUgbGF5ZXJzOyB3aWxsIHJldHVybiBwYXJ0aXRpb25zIHdob3NlIGRhdGEgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhpcyB0aW1lLFxuICogaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoLCBpbmNsdXNpdmUuXG4gKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBBZGRpdGlvbmFsIGZpZWxkcyAtICYjeDYwO2RhdGFTaXplJiN4NjA7LCAmI3g2MDtjaGVja3N1bSYjeDYwOywgJiN4NjA7Y29tcHJlc3NlZERhdGFTaXplJiN4NjA7XG4gKiBAcGFyYW0gcmFuZ2UgVXNlIHRoaXMgcGFyYW1ldGVyIHRvIHJlc3VtZSBkb3dubG9hZCBvZiBhIGxhcmdlIHJlc3BvbnNlIGZvciB2ZXJzaW9uZWQgbGF5ZXJzIHdoZW4gdGhlcmVcbiAqICBpcyBhIGNvbm5lY3Rpb24gaXNzdWUgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIuIFNwZWNpZnkgYSBzaW5nbGUgYnl0ZSByYW5nZSBvZmZzZXQgbGlrZSB0aGlzOiAmI3g2MDtSYW5nZTogYnl0ZXMmI3gzRDsxMC0mI3g2MDsuXG4gKiAgVGhpcyBwYXJhbWV0ZXIgaXMgY29tcGxpYW50IHdpdGggW1JGQyA3MjMzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMyksXG4gKiBidXQgbm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgYnl0ZSByYW5nZS5cbiAqIFRoZSAmI3g2MDtyYW5nZSYjeDYwOyBwYXJhbWV0ZXIgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGFzIGEgcXVlcnkgcGFyYW1ldGVyLCBpLmUuICYjeDYwO3JhbmdlJiN4M0Q7Ynl0ZXMmI3gzRDsxMC0mI3g2MDsuXG4gKiBGb3Igdm9sYXRpbGUgbGF5ZXJzIHVzZSB0aGUgcGFnaW5hdGlvbiBsaW5rcyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keS5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBnZXRDaGFuZ2VzKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2NoYW5nZXNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhcnRWZXJzaW9uXCIsIHBhcmFtc1tcInN0YXJ0VmVyc2lvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbmRWZXJzaW9uXCIsIHBhcmFtc1tcImVuZFZlcnNpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic2luY2VUaW1lXCIsIHBhcmFtc1tcInNpbmNlVGltZVwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJhZGRpdGlvbmFsRmllbGRzXCIsIHBhcmFtc1tcImFkZGl0aW9uYWxGaWVsZHNcIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zW1wicmFuZ2VcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlJhbmdlXCJdID0gcGFyYW1zW1wicmFuZ2VcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0Q2hhbmdlcyA9IGdldENoYW5nZXM7XG4vKipcbiAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgbGF5ZXIgdmVyc2lvbnMgZm9yIHRoZSBjYXRhbG9nIHZlcnNpb24uXG4gKiBJdCB3aWxsIHJldHVybiBhbiBlcnJvciBpZiB0aGUgY2F0YWxvZyBkb2VzIG5vdCBoYXZlIGFueSB2ZXJzaW9ucyBvciBpZiB0aGUgdmVyc2lvbiBwYXNzZWQgaW4gdGhlIHF1ZXJ5IHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC5cbiAqIElmIGEgbGF5ZXIgZG9lcyBub3QgaGF2ZSBhbnkgZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGl0IGlzIGV4Y2x1ZGVkIGZyb20gdGhlIHJlc3BvbnNlLlxuICpcbiAqIEBzdW1tYXJ5IEdldHMgbGF5ZXIgdmVyc2lvbnMgZm9yIGNhdGFsb2cgdmVyc2lvblxuICogQHBhcmFtIHZlcnNpb24gQ2F0YWxvZyB2ZXJzaW9uXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGdldExheWVyVmVyc2lvbnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVyVmVyc2lvbnNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ2ZXJzaW9uXCIsIHBhcmFtc1tcInZlcnNpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRMYXllclZlcnNpb25zID0gZ2V0TGF5ZXJWZXJzaW9ucztcbi8qKlxuICogR2V0cyB0aGUgbWV0YWRhdGEgZm9yIGFsbCBwYXJ0aXRpb25zIGluIGEgc3BlY2lmaWMgbGF5ZXIuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gbGF5ZXJJZCBVbmlxdWUgbGF5ZXIgSUQuIENvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZWZlciB0byBhIHZhbGlkIGxheWVyIElELlxuICogQHBhcmFtIHZlcnNpb24gSWYgeW91IGFyZSBnZXR0aW5nIG1ldGFkYXRhIGZyb20gYSB2ZXJzaW9uZWQgbGF5ZXIsIHNwZWNpZnkgdGhlIHZlcnNpb24gb2YgdGhlIGxheWVyIHlvdSB3YW50LlxuICogVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgZm9yIHZlcnNpb25lZCBsYXllcnMuIElmIHlvdSBhcmUgZ2V0dGluZyBtZXRhZGF0YSBmcm9tIGFub3RoZXIgbGF5ZXIgdHlwZSwgZG8gbm90IHNwZWNpZnkgdGhpcyBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBBZGRpdGlvbmFsIGZpZWxkcyAtICYjeDYwO2RhdGFTaXplJiN4NjA7LCAmI3g2MDtjaGVja3N1bSYjeDYwOywgJiN4NjA7Y29tcHJlc3NlZERhdGFTaXplJiN4NjA7XG4gKiBAcGFyYW0gcmFuZ2UgVXNlIHRoaXMgcGFyYW1ldGVyIHRvIHJlc3VtZSBkb3dubG9hZCBvZiBhIGxhcmdlIHJlc3BvbnNlIGZvciB2ZXJzaW9uZWQgbGF5ZXJzIHdoZW4gdGhlcmUgaXMgYSBjb25uZWN0aW9uXG4gKiBpc3N1ZSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4gU3BlY2lmeSBhIHNpbmdsZSBieXRlIHJhbmdlIG9mZnNldCBsaWtlIHRoaXM6ICYjeDYwO1JhbmdlOiBieXRlcyYjeDNEOzEwLSYjeDYwOy5cbiAqIFRoaXMgcGFyYW1ldGVyIGlzIGNvbXBsaWFudCB3aXRoIFtSRkMgNzIzM10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMpLFxuICogYnV0IG5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGJ5dGUgcmFuZ2UuXG4gKiBUaGUgJiN4NjA7cmFuZ2UmI3g2MDsgcGFyYW1ldGVyIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBhIHF1ZXJ5IHBhcmFtZXRlciwgaS5lLiAmI3g2MDtyYW5nZSYjeDNEO2J5dGVzJiN4M0Q7MTAtJiN4NjA7LlxuICogRm9yIHZvbGF0aWxlIGxheWVycyB1c2UgdGhlIHBhZ2luYXRpb24gbGlua3MgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBnZXRQYXJ0aXRpb25zKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3BhcnRpdGlvbnNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwidmVyc2lvblwiLCBwYXJhbXNbXCJ2ZXJzaW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImFkZGl0aW9uYWxGaWVsZHNcIiwgcGFyYW1zW1wiYWRkaXRpb25hbEZpZWxkc1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJyYW5nZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiUmFuZ2VcIl0gPSBwYXJhbXNbXCJyYW5nZVwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRQYXJ0aXRpb25zID0gZ2V0UGFydGl0aW9ucztcbi8qKlxuICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGF0ZXN0IHZlcnNpb24gZm9yIHRoZSBnaXZlbiBjYXRhbG9nLiBJZiB0aGUgY2F0YWxvZyBkb2Vzbid0IGNvbnRhaW4gYW55IHZlcnNpb25zIGEgNDA0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKlxuICogQHN1bW1hcnkgR2V0cyB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBjYXRhbG9nIHZlcnNpb25cbiAqIEBwYXJhbSBzdGFydFZlcnNpb24gVGhlIGNhdGFsb2cgdmVyc2lvbiByZXR1cm5lZCBmcm9tIGEgcHJpb3IgcmVxdWVzdCB0byAmI3g2MDsvdmVyc2lvbnMvbGF0ZXN0JiN4NjA7LlxuICogWW91IHNob3VsZCBzYXZlIHRoZSB2ZXJzaW9uIGZyb20gZWFjaCByZXF1ZXN0IHNvIHRoYXQgeW91IGNhbiB1c2UgaXQgaW4gdGhlICYjeDYwO3N0YXJ0VmVyc2lvbiYjeDYwOyBwYXJhbWV0ZXIgb2Ygc3Vic2VxdWVudCByZXF1ZXN0cy5cbiAqIElmIHlvdSBkb24mIzM5O3QgaGF2ZSB0aGUgdmVyc2lvbiBmcm9tIGEgcHJpb3IgcmVxdWVzdCwgc2V0IHRoZSBwYXJhbWV0ZXIgdG8gLTEuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gbGF0ZXN0VmVyc2lvbihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvdmVyc2lvbnMvbGF0ZXN0XCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhcnRWZXJzaW9uXCIsIHBhcmFtc1tcInN0YXJ0VmVyc2lvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxhdGVzdFZlcnNpb24gPSBsYXRlc3RWZXJzaW9uO1xuLyoqXG4gKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGNhdGFsb2cgdmVyc2lvbihzKS5cbiAqIElmIHRoZSBjYXRhbG9nIGRvZXNuJ3QgY29udGFpbiBhbnkgdmVyc2lvbnMgNDA0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBNYXhpbXVtIG51bWJlciBvZiB2ZXJzaW9ucyB0byBiZSByZXR1cm5lZCBwZXIgY2FsbCBpcyAxMDAwIHZlcnNpb25zLlxuICogSWYgcmVxdWVzdGVkIHJhbmdlIGlzIGJpZ2dlciB0aGFuIDEwMDAgdmVyc2lvbnMgNDAwIEJhZCBSZXF1ZXN0IHdpbGwgYmUgcmV0dXJuZWRcbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGNhdGFsb2cgdmVyc2lvbnNcbiAqIEBwYXJhbSBzdGFydFZlcnNpb24gVGhlIGJlZ2lubmluZyBvZiB0aGUgcmFuZ2Ugb2YgdmVyc2lvbnMgeW91IHdhbnQgdG8gZ2V0IChleGNsdXNpdmUpLlxuICogQnkgY29udmVudGlvbiAtMSBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uLiBBZnRlciB0aGUgZmlyc3QgcHVibGljYXRpb24sIHRoZSBjYXRhbG9nIHZlcnNpb24gaXMgMC5cbiAqIEBwYXJhbSBlbmRWZXJzaW9uIFRoZSBlbmQgb2YgdGhlIHJhbmdlIG9mIHZlcnNpb25zIHlvdSB3YW50IHRvIGdldCAoaW5jbHVzaXZlKS5cbiAqIFRoaXMgbXVzdCBiZSBhIHZhbGlkIGNhdGFsb2cgdmVyc2lvbiBncmVhdGVyIHRoYW4gdGhlIHN0YXJ0VmVyc2lvbi5cbiAqIFRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyByZXR1cm5lZCBmcm9tIHRoZSAmI3g2MDsvdmVyc2lvbnMvbGF0ZXN0JiN4NjA7IGVuZHBvaW50LlxuICogSWYgdGhpcyB2ZXJzaW9uIGRvZXMgbm90IGV4aXN0LCA0MDAgQmFkIFJlcXVlc3QgaXMgcmV0dXJuZWRcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBsaXN0VmVyc2lvbnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25zXCI7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwic3RhcnRWZXJzaW9uXCIsIHBhcmFtc1tcInN0YXJ0VmVyc2lvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJlbmRWZXJzaW9uXCIsIHBhcmFtc1tcImVuZFZlcnNpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5saXN0VmVyc2lvbnMgPSBsaXN0VmVyc2lvbnM7XG4vKipcbiAqIFJldHVybnMgbWluaW11bSB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gY2F0YWxvZy4gSWYgdGhlIGNhdGFsb2cgZG9lc24ndCBjb250YWluIGFueSB2ZXJzaW9ucyA0MDQgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIHRoZSBlYXJsaWVzdCBhdmFpbGFibGUgY2F0YWxvZyB2ZXJzaW9uXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gbWluaW11bVZlcnNpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3ZlcnNpb25zL21pbmltdW1cIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLm1pbmltdW1WZXJzaW9uID0gbWluaW11bVZlcnNpb247XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLiBhbmQgaXRzIGFmZmlsaWF0ZShzKS5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBhbmQgb3RoZXIgbWF0ZXJpYWxzIGNvbnRhaW4gcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25cbiAqIGNvbnRyb2xsZWQgYnkgSEVSRSBhbmQgYXJlIHByb3RlY3RlZCBieSBhcHBsaWNhYmxlIGNvcHlyaWdodCBsZWdpc2xhdGlvbi5cbiAqIEFueSB1c2UgYW5kIHV0aWxpemF0aW9uIG9mIHRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBhbmRcbiAqIGRpc2Nsb3N1cmUgdG8gYW55IHRoaXJkIHBhcnRpZXMgaXMgY29uZGl0aW9uYWwgdXBvbiBoYXZpbmcgYSBzZXBhcmF0ZVxuICogYWdyZWVtZW50IHdpdGggSEVSRSBmb3IgdGhlIGFjY2VzcywgdXNlLCB1dGlsaXphdGlvbiBvciBkaXNjbG9zdXJlIG9mIHRoaXNcbiAqIHNvZnR3YXJlLiBJbiB0aGUgYWJzZW5jZSBvZiBzdWNoIGFncmVlbWVudCwgdGhlIHVzZSBvZiB0aGUgc29mdHdhcmUgaXMgbm90XG4gKiBhbGxvd2VkLlxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudXBsb2FkUGFydGl0aW9ucyA9IGV4cG9ydHMuc3VibWl0UHVibGljYXRpb24gPSBleHBvcnRzLmluaXRQdWJsaWNhdGlvbiA9IGV4cG9ydHMuZ2V0UHVibGljYXRpb24gPSBleHBvcnRzLmNhbmNlbFB1YmxpY2F0aW9uID0gdm9pZCAwO1xuLyoqXG4gKiBQdWJsaXNoIEFQSSB2MlxuICogTm8gZGVzY3JpcHRpb24gcHJvdmlkZWQgKGdlbmVyYXRlZCBieSBTd2FnZ2VyIENvZGVnZW4gaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbilcbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMi4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdWJsaXNoQXBpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogQ2FuY2VscyBhIHB1YmxpY2F0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkLlxuICogV2lsbCBmYWlsIGlmIGF0dGVtcHRpbmcgdG8gY2FuY2VsIGEgc3VibWl0dGVkIHB1YmxpY2F0aW9uLlxuICogVGhpcyBhbGxvd3MgdGhlIHNwZWNpZmllZCBwdWJsaWNhdGlvbiB0byBiZSBhYmFuZG9uZWQuXG4gKiBTZWUgRGF0YSBBUEkgRGV2ZWxvcGVy4oCZcyBHdWlkZSBpbiB0aGUgRG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBwdWJsaWNhdGlvbiBzdGF0ZXMgZGlhZ3JhbVxuICogYW5kIGFsbCBwb3NzaWJsZSBwdWJsaWNhdGlvbiBzdGF0ZXMgdHJhbnNpdGlvbnMuXG4gKlxuICogQHN1bW1hcnkgQ2FuY2VscyBhIHB1YmxpY2F0aW9uXG4gKiBAcGFyYW0gcHVibGljYXRpb25JZCBUaGUgSUQgb2YgdGhlIHB1YmxpY2F0aW9uIHRvIGNhbmNlbC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gY2FuY2VsUHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH1cIi5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jYW5jZWxQdWJsaWNhdGlvbiA9IGNhbmNlbFB1YmxpY2F0aW9uO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBkZXRhaWxzIG9mIHRoZSBzcGVjaWZpZWQgcHVibGljYXRpb24uXG4gKlxuICogUHVibGljYXRpb24gY2FuIGJlIGluIG9uZSBvZiB0aGVzZSBzdGF0ZXM6XG4gKiAgLSBJbml0aWFsaXplZCxcbiAqICAtIFN1Ym1pdHRlZCxcbiAqICAtIENhbmNlbGxlZCxcbiAqICAtIEZhaWxlZCxcbiAqICAtIFN1Y2NlZWRlZCxcbiAqICAtIEV4cGlyZWQuXG4gKlxuICogU2VlIERhdGEgQVBJIERldmVsb3BlcuKAmXMgR3VpZGUgaW4gdGhlIERvY3VtZW50YXRpb24gc2VjdGlvbiBmb3IgdGhlIHB1YmxpY2F0aW9uIHN0YXRlIGRpYWdyYW0uXG4gKlxuICogQHN1bW1hcnkgR2V0cyBhIHB1YmxpY2F0aW9uXG4gKiBAcGFyYW0gcHVibGljYXRpb25JZCBUaGUgSUQgb2YgdGhlIHB1YmxpY2F0aW9uIHRvIHJldHJpZXZlLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBnZXRQdWJsaWNhdGlvbihidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvcHVibGljYXRpb25zL3twdWJsaWNhdGlvbklkfVwiLnJlcGxhY2UoXCJ7cHVibGljYXRpb25JZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcInB1YmxpY2F0aW9uSWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFB1YmxpY2F0aW9uID0gZ2V0UHVibGljYXRpb247XG4vKipcbiAqIEluaXRpYWxpemVzIGEgbmV3IHB1YmxpY2F0aW9uIGZvciBwdWJsaXNoaW5nIG1ldGFkYXRhLlxuICogRGV0ZXJtaW5lcyB0aGUgcHVibGljYXRpb24gdHlwZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbGF5ZXIgSURzLlxuICogQSBwdWJsaWNhdGlvbiBjYW4gb25seSBjb25zaXN0IG9mIGxheWVyIElEcyB0aGF0IGhhdmUgdGhlIHNhbWUgbGF5ZXIgdHlwZS5cbiAqIEZvciBleGFtcGxlLCB5b3UgY2FuIGhhdmUgYSBwdWJsaWNhdGlvbiBmb3IgbXVsdGlwbGUgbGF5ZXJzIG9mIHR5cGUgYHZlcnNpb25lZGAsXG4gKiBidXQgeW91IGNhbm5vdCBoYXZlIGEgc2luZ2xlIHB1YmxpY2F0aW9uIHRoYXQgcHVibGlzaGVzIHRvIGJvdGggYHZlcnNpb25lZGAgYW5kIGBzdHJlYW1gIGxheWVycy5cbiAqIEluIGFkZGl0aW9uLCB5b3UgbWF5IG9ubHkgaGF2ZSBvbmUgYHZlcnNpb25lZGAgb3IgYHZvbGF0aWxlYCBwdWJsaWNhdGlvbiBpbiBwcm9jZXNzIGF0IGEgdGltZS5cbiAqIFlvdSBjYW5ub3QgaGF2ZSBtdWx0aXBsZSBhY3RpdmUgcHVibGljYXRpb25zIHRvIHRoZSBzYW1lIGNhdGFsb2cgZm9yIGB2ZXJzaW9uZWRgIGFuZCBgdm9sYXRpbGVgIGxheWVyIHR5cGVzLlxuICogVGhlIGJvZHkgZmllbGQgYHZlcnNpb25EZXBlbmRlbmNpZXNgIGlzIG9wdGlvbmFsIGFuZCBpcyB1c2VkIGZvciBgdmVyc2lvbmVkYCBsYXllcnMgdG8gZGVjbGFyZSB2ZXJzaW9uIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAc3VtbWFyeSBJbml0aWFsaXplIGEgbmV3IHB1YmxpY2F0aW9uXG4gKiBAcGFyYW0gYm9keSBGaWVsZHMgdG8gaW5pdGlhbGl6ZSBhIHB1YmxpY2F0aW9uLlxuICogQHBhcmFtIGJpbGxpbmdUYWcgQmlsbGluZyBUYWcgaXMgYW4gb3B0aW9uYWwgZnJlZS1mb3JtIHRhZyB3aGljaCBpcyB1c2VkIGZvciBncm91cGluZyBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdFB1YmxpY2F0aW9uKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9wdWJsaWNhdGlvbnNcIjtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIGlmIChwYXJhbXNbXCJib2R5XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcImJvZHlcIl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmluaXRQdWJsaWNhdGlvbiA9IGluaXRQdWJsaWNhdGlvbjtcbi8qKlxuICogU3VibWl0cyB0aGUgcHVibGljYXRpb24gYW5kIGluaXRpYXRlcyBwb3N0IHByb2Nlc3NpbmcgaWYgbmVjZXNzYXJ5LlxuICogUHVibGljYXRpb24gc3RhdGUgYmVjb21lcyBgU3VibWl0dGVkYCBkaXJlY3RseSBhZnRlciBzdWJtaXNzaW9uIGFuZCBgU3VjY2VlZGVkYCBhZnRlciBzdWNjZXNzZnVsIHByb2Nlc3NpbmcuXG4gKiBTZWUgRGF0YSBBUEkgRGV2ZWxvcGVy4oCZcyBHdWlkZSBpbiB0aGUgRG9jdW1lbnRhdGlvbiBzZWN0aW9uIGZvciBjb21wbGV0ZSBwdWJsaWNhdGlvbiBzdGF0ZXMgZGlhZ3JhbS5cbiAqXG4gKiBAc3VtbWFyeSBTdWJtaXRzIGEgcHVibGljYXRpb25cbiAqIEBwYXJhbSBwdWJsaWNhdGlvbklkIElEIG9mIHB1YmxpY2F0aW9uIHRvIHN1Ym1pdC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gc3VibWl0UHVibGljYXRpb24oYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL3B1YmxpY2F0aW9ucy97cHVibGljYXRpb25JZH1cIi5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc3VibWl0UHVibGljYXRpb24gPSBzdWJtaXRQdWJsaWNhdGlvbjtcbi8qKlxuICogVXBsb2FkIHBhcnRpdGlvbnMgdG8gdGhlIGdpdmVuIGxheWVyLlxuICogRGVwZW5kZW5kaW5nIG9uIHRoZSBwdWJsaWNhdGlvbiB0eXBlLCBwb3N0IHByb2Nlc3NpbmcgbWF5IGJlIHJlcXVpcmVkIGJlZm9yZSB0aGUgcGFydGl0aW9ucyBhcmUgcHVibGlzaGVkLlxuICogRm9yIGJldHRlciBwZXJmb3JtYW5jZSBiYXRjaCB5b3VyIHBhcnRpdGlvbnMgKGUuZy4gMTAwMCBwZXIgcmVxdWVzdCksIHJhdGhlciB0aGFuIHVwbG9hZGluZyB0aGVtIGluZGl2aWR1YWxseS5cbiAqXG4gKiBAc3VtbWFyeSBVcGxvYWQgcGFydGl0aW9uc1xuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBwdWJsaXNoIHRvLlxuICogQHBhcmFtIHB1YmxpY2F0aW9uSWQgVGhlIElEIG9mIHB1YmxpY2F0aW9uIHRvIHB1Ymxpc2ggdG8uXG4gKiBAcGFyYW0gYm9keSBQdWJsaWNhdGlvbiBwYXJ0aXRpb25zLiBEYXRhIGFuZCBEYXRhSGFuZGxlIGZpZWxkcyBjYW5ub3QgYmUgcG9wdWxhdGVkIGF0IHRoZSBzYW1lIHRpbWUuXG4gKiBTZWUgUGFydGl0aW9uIG9iamVjdCBmb3IgbW9yZSBkZXRhaWxzIG9uIGJvZHkgZmllbGRzXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMgYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgQVNDSUkgY2hhcmFjdGVycyBbQS1aYS16MC05XS5cbiAqIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIHVwbG9hZFBhcnRpdGlvbnMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vcHVibGljYXRpb25zL3twdWJsaWNhdGlvbklkfS9wYXJ0aXRpb25zXCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3B1YmxpY2F0aW9uSWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJwdWJsaWNhdGlvbklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICBpZiAocGFyYW1zW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXNbXCJib2R5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBsb2FkUGFydGl0aW9ucyA9IHVwbG9hZFBhcnRpdGlvbnM7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgSEVSRSBFdXJvcGUgQi5WLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICogTGljZW5zZS1GaWxlbmFtZTogTElDRU5TRVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucXVhZFRyZWVJbmRleFZvbGF0aWxlID0gZXhwb3J0cy5xdWFkVHJlZUluZGV4ID0gZXhwb3J0cy5nZXRQYXJ0aXRpb25zQnlJZCA9IGV4cG9ydHMuZ2V0Q2hhbmdlc0J5SWQgPSB2b2lkIDA7XG4vKipcbiAqIFF1ZXJ5IEFQSSB2MVxuICogVGhlIGBxdWVyeWAgc2VydmljZSBwcm92aWRlcyBhIHdheSB0byBnZXQgaW5mb3JtYXRpb24gKG1ldGFkYXRhKSBhYm91dCBsYXllcnMgYW5kIHBhcnRpdGlvbnMgc3RvcmVkIGluIGEgY2F0YWxvZy5cbiAqIFRoaXMgc2VydmljZSBleHBvc2VzIHRoZSBtZXRhZGF0YSBmb3Igc2luZ2xlIHBhcnRpdGlvbnMgdGhhdCB1c2VycyBjYW4gcXVlcnkgb25lIGJ5IG9uZSBvciBieSBzcGVjaWZ5aW5nIGEgcGFyZW50IHRpbGUuXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMC4xXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKlxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5jb25zdCBSZXF1ZXN0QnVpbGRlcl8xID0gcmVxdWlyZShcIi4vUmVxdWVzdEJ1aWxkZXJcIik7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBRdWVyeUFwaVxuICovXG4vKipcbiAqIEdldHMgdGhlIGxhdGVzdCBwYXJ0aXRpb24gY2hhbmdlcyBmb3IgYSB2ZXJzaW9uIHJhbmdlIGluIGEgdmVyc2lvbmVkIGxheWVyIG9yIGEgdGltZSByYW5nZVxuICogZm9yIGEgdm9sYXRpbGUgbGF5ZXIuIE9ubHkgdGhlIGxhdGVzdCBjaGFuZ2UgZm9yIGVhY2ggY2hhbmdlZCBwYXJ0aXRpb24gaXMgcmV0dXJuZWQsIG5vdFxuICogIGludGVybWVkaWF0ZSBjaGFuZ2VzLiBJZiB0aGUgcmVzcG9uc2UgY29udGFpbnMgYSBwYXJ0aXRpb24gd2l0aCBhbiBlbXB0eSAnZGF0YUhhbmRsZScgdmFsdWUsXG4gKiAgdGhlIHBhcnRpdGlvbiB3YXMgZGVsZXRlZCBhdCB0aGUgdmVyc2lvbiBpbmRpY2F0ZWQgYnkgdGhlICd2ZXJzaW9uJyBmaWVsZCBvZiB0aGUgcGFydGl0aW9uIG9iamVjdC5cbiAqICBJZiBhIHBhcnRpdGlvbiB3YXMgY3JlYXRlZCBhbmQgZGVsZXRlZCBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyBzcGVjaWZpZWQgaW4gdGhlICdzdGFydFZlcnNpb24nIGFuZCAnZW5kVmVyc2lvbidcbiAqIHBhcmFtZXRlcnMsIHRoZSBwYXJ0aXRpb24gaXMgbm90IGluY2x1ZGVkIGluIHRoZSByZXNwb25zZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSByZXF1ZXN0IHZlcnNpb25zIDAgdG8gMTAsIGFuZCBhXG4gKiBwYXJ0aXRpb24gd2FzIGNyZWF0ZWQgaW4gdmVyc2lvbiAzIHRoZW4gZGVsZXRlZCBpbiB2ZXJzaW9uIDcsIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBjaGFuZ2VzIGZvciB0aGUgdmVyc2lvbiBvciB0aW1lIHJhbmdlIGZvciB0aGUgc3BlY2lmaWMgcGFydGl0aW9uKHMpLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuIFRoZSB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBtdXN0IHJlZmVyIHRvIGFcbiAqICB2YWxpZCBsYXllciBhbHJlYWR5IGNvbmZpZ3VyZWQgaW4gdGhlIGNhdGFsb2cgY29uZmlndXJhdGlvbi4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGxheWVycyBhcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0gcGFydGl0aW9uIFRoZSBwYXJ0aXRpb25zIHlvdSB3YW50IHRvIGluY2x1ZGUgaW4gdGhlIHJlc3BvbnNlLiBUaGlzIGFsbG93cyB5b3UgdG8gbGltaXQgdGhlIHJlc3BvbnNlIHRvXG4gKiBzcGVjaWZpYyBwYXJ0aXRpb25zLiBZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgcGFydGl0aW9ucyBieSB1c2luZyB0aGlzIHBhcmFtZXRlciBtdWx0aXBsZSB0aW1lcy4gVGhlIG1heGltdW1cbiAqICBudW1iZXIgb2YgcGFydGl0aW9ucyBwZXIgY2FsbCBpcyAxMDAuXG4gKiBAcGFyYW0gc3RhcnRWZXJzaW9uIFN0YXJ0IHZlcnNpb24gZm9yIHRoZSBjYXRhbG9nIChleGNsdXNpdmUpLiBCeSBjb252ZW50aW9uIC0xIGluZGljYXRlcyB0aGUgdmlydHVhbCBpbml0aWFsXG4gKiAgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IHB1YmxpY2F0aW9uIHdoaWNoIHdpbGwgaGF2ZSB2ZXJzaW9uIDAuXG4gKiBAcGFyYW0gZW5kVmVyc2lvbiBFbmQgdmVyc2lvbiAoaW5jbHVzaXZlKS4gVGhpcyBoYXMgdG8gYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24gZ3JlYXRlciB0aGFuIHRoZSBzdGFydFZlcnNpb24uXG4gKiBAcGFyYW0gc2luY2VUaW1lIFdpbGwgcmV0dXJuIHBhcnRpdGlvbnMgd2hvc2UgZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGlzIHRpbWUsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCwgaW5jbHVzaXZlLlxuICogQHBhcmFtIGFkZGl0aW9uYWxGaWVsZHMgQWRkaXRpb25hbCBmaWVsZHMgLSAmI3g2MDtkYXRhU2l6ZSYjeDYwOywgJiN4NjA7Y2hlY2tzdW0mI3g2MDssICYjeDYwO2NvbXByZXNzZWREYXRhU2l6ZSYjeDYwOy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgIFtBLVphLXowLTldLlxuICogR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGZ1dHVyZSByZWxlYXNlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2hhbmdlc0J5SWQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vY2hhbmdlc1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdGFydFZlcnNpb25cIiwgcGFyYW1zW1wic3RhcnRWZXJzaW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImVuZFZlcnNpb25cIiwgcGFyYW1zW1wiZW5kVmVyc2lvblwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzaW5jZVRpbWVcIiwgcGFyYW1zW1wic2luY2VUaW1lXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImFkZGl0aW9uYWxGaWVsZHNcIiwgcGFyYW1zW1wiYWRkaXRpb25hbEZpZWxkc1wiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJwYXJ0aXRpb25cIiwgcGFyYW1zW1wicGFydGl0aW9uXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0Q2hhbmdlc0J5SWQgPSBnZXRDaGFuZ2VzQnlJZDtcbi8qKlxuICogR2V0cyBtZXRhZGF0YSBmb3Igc3BlY2lmaWMgcGFydGl0aW9uIGlkcy4gSWYgdGhlIGxheWVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBleGlzdCwgdGhlIHJlcXVlc3QgcmVzdWx0cyBpbiBhbiBlcnJvci5cbiAqIElmIGEgcGFydGl0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBleGlzdCwgdGhlIHJlc3BvbnNlIGRvZXMgbm90IGluY2x1ZGUgdGhpcyBwYXJ0aXRpb24uXG4gKiAgTWF4aW11biBhbGxvd2VkIG51bWJlciBvZiBwYXJ0aXRpb25zIGlkcyBwZXIgY2FsbCBpcyAxMDAuXG4gKlxuICogQHN1bW1hcnkgR2V0cyBtZXRhZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4gVGhlIGNvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXJcbiAqICBtdXN0IHJlZmVyIHRvIGEgdmFsaWQgbGF5ZXIgYWxyZWFkeSBjb25maWd1cmVkIGluIHRoZSBjYXRhbG9nIGNvbmZpZ3VyYXRpb24uXG4gKiAgWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIHBhcnRpdGlvbnMgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuXG4gKiBAcGFyYW0gcGFydGl0aW9uIFBhcnRpdGlvbiBpZHMgdG8gdXNlIGZvciBmaWx0ZXJpbmcuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZVxuICogIHBhcnRpdGlvbnMgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuIE1heGltdW0gYWxsb3dlZCBwYXJ0aXRpb25zIGlkcyBwZXIgY2FsbCBpcyAxMDAuXG4gKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZyBhZ2FpbnN0IHdoaWNoIHRvIHJ1biB0aGUgcXVlcnkuIE11c3QgYmUgYSB2YWxpZCBjYXRhbG9nIHZlcnNpb24uXG4gKiBAcGFyYW0gYWRkaXRpb25hbEZpZWxkcyBBZGRpdGlvbmFsIGZpZWxkcyAtICYjeDYwO2RhdGFTaXplJiN4NjA7LCAmI3g2MDtjaGVja3N1bSYjeDYwOywgJiN4NjA7Y29tcHJlc3NlZERhdGFTaXplJiN4NjA7XG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmdcbiAqICByZWNvcmRzIHRvZ2V0aGVyLiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzLCBjb250YWluIG9ubHkgYWxwaGEvbnVtZXJpY1xuICogQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFBhcnRpdGlvbnNCeUlkKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3BhcnRpdGlvbnNcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBwYXJhbXNbXCJwYXJ0aXRpb25cIl0uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInBhcnRpdGlvblwiLCBpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJ2ZXJzaW9uXCIsIHBhcmFtc1tcInZlcnNpb25cIl0pO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0UGFydGl0aW9uc0J5SWQgPSBnZXRQYXJ0aXRpb25zQnlJZDtcbi8qKlxuICogR2V0cyBtZXRhZGF0YSBmb3IgdGhlIHJlcXVlc3RlZCBpbmRleC4gT25seSBhdmFpbGFibGUgZm9yIHZlcnNpb25lZCBsYXllcnMgd2hlcmUgdGhlIHBhcnRpdGlvbmluZyBzY2hlbWUgaXMgYGhlcmV0aWxlYC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGluZGV4IG1ldGFkYXRhIG9mIHZlcnNpb25lZFxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuIENvbnRlbnQgb2YgdGhpc1xuICogcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYSB2YWxpZCBsYXllciBhbHJlYWR5IGNvbmZpZ3VyZWQgaW4gdGhlIGNhdGFsb2cgY29uZmlndXJhdGlvbi4gRXhhY3RseSBvbmUgbGF5ZXIgSUQgbXVzdCBiZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBjYXRhbG9nIGFnYWluc3Qgd2hpY2ggdG8gcnVuIHRoZSBxdWVyeS4gTXVzdCBiZSBhIHZhbGlkIGNhdGFsb2cgdmVyc2lvbi5cbiAqIEBwYXJhbSBxdWFkS2V5IFRoZSBnZW9tZXRyaWMgYXJlYSBzcGVjaWZpZWQgYnkgYW4gaW5kZXggaW4gdGhlIHJlcXVlc3QsIHJlcHJlc2VudGVkIGFzIGEgSEVSRSB0aWxlXG4gKiBAcGFyYW0gZGVwdGggVGhlIHJlY3Vyc2lvbiBkZXB0aCBvZiB0aGUgcmVzcG9uc2UuIElmIHNldCB0byAwLCB0aGUgcmVzcG9uc2UgaW5jbHVkZXNcbiAqICBvbmx5IGRhdGEgZm9yIHRoZSBxdWFkS2V5IHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4gSW4gdGhpcyB3YXksIGRlcHRoIGRlc2NyaWJlcyB0aGVcbiAqIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdWJRdWFkS2V5cyBpbiB0aGUgcmVzcG9uc2UuIFRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgZm9yIHRoZSBkZXB0aCBwYXJhbWV0ZXIgaXMgNC5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFkZGl0aW9uYWwgZmllbGRzIC0gJiN4NjA7ZGF0YVNpemUmI3g2MDssICYjeDYwO2NoZWNrc3VtJiN4NjA7LCAmI3g2MDtjb21wcmVzc2VkRGF0YVNpemUmI3g2MDtcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdXNlZCB0byBncm91cCBiaWxsaW5nIHJlY29yZHNcbiAqICB0b2dldGhlci4gSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycyBhbmQgIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWNcbiAqICBBU0NJSSBjaGFyYWN0ZXJzICBbQS1aYS16MC05XS4gR3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIGJ5IGJpbGxpbmcgdGFnIHdpbGwgYmUgYXZhaWxhYmxlIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKi9cbmZ1bmN0aW9uIHF1YWRUcmVlSW5kZXgoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vdmVyc2lvbnMve3ZlcnNpb259L3F1YWRrZXlzL3txdWFkS2V5fS9kZXB0aHMve2RlcHRofVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcInt2ZXJzaW9ufVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1widmVyc2lvblwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntxdWFkS2V5fVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wicXVhZEtleVwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntkZXB0aH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRlcHRoXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucXVhZFRyZWVJbmRleCA9IHF1YWRUcmVlSW5kZXg7XG4vKipcbiAqIEdldHMgbWV0YWRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgaW5kZXguIE9ubHkgYXZhaWxhYmxlIGZvciB2b2xhdGlsZSBsYXllcnMgd2hlcmUgdGhlIHBhcnRpdGlvbmluZyBzY2hlbWUgaXMgYGhlcmV0aWxlYC5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGluZGV4IG1ldGFkYXRhIGZvciB2b2xhdGlsZSBsYXllcnNcbiAqIEBwYXJhbSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBDb250ZW50IG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgcmVmZXIgdG8gYVxuICogIHZhbGlkIGxheWVyIGFscmVhZHkgY29uZmlndXJlZCBpbiB0aGUgY2F0YWxvZyBjb25maWd1cmF0aW9uLiBFeGFjdGx5IG9uZSBsYXllciBJRCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQHBhcmFtIHF1YWRLZXkgVGhlIGdlb21ldHJpYyBhcmVhIHNwZWNpZmllZCBieSBhbiBpbmRleCBpbiB0aGUgcmVxdWVzdCwgcmVwcmVzZW50ZWQgYXMgYSBIRVJFIHRpbGVcbiAqIEBwYXJhbSBkZXB0aCBUaGUgcmVjdXJzaW9uIGRlcHRoIG9mIHRoZSByZXNwb25zZS4gSWYgc2V0IHRvIDAsIHRoZSByZXNwb25zZSBpbmNsdWRlcyBvbmx5IGRhdGEgZm9yXG4gKiAgdGhlIHF1YWRLZXkgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBJbiB0aGlzIHdheSwgZGVwdGggZGVzY3JpYmVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc3ViUXVhZEtleXNcbiAqICBpbiB0aGUgcmVzcG9uc2UuIFRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgZm9yIHRoZSBkZXB0aCBwYXJhbWV0ZXIgaXMgNC5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsRmllbGRzIEFkZGl0aW9uYWwgZmllbGRzIC0gJiN4NjA7ZGF0YVNpemUmI3g2MDssICYjeDYwO2NoZWNrc3VtJiN4NjA7LCAmI3g2MDtjb21wcmVzc2VkRGF0YVNpemUmI3g2MDtcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgdXNlZCB0byBncm91cCBiaWxsaW5nIHJlY29yZHMgdG9nZXRoZXIuXG4gKiBJZiBzdXBwbGllZCwgaXQgbXVzdCBiZSBiZXR3ZWVuIDQgLSAxNiBjaGFyYWN0ZXJzIGFuZCAgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBBU0NJSSBjaGFyYWN0ZXJzXG4gKiAgW0EtWmEtejAtOV0uIEdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyBieSBiaWxsaW5nIHRhZyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICovXG5mdW5jdGlvbiBxdWFkVHJlZUluZGV4Vm9sYXRpbGUoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vcXVhZGtleXMve3F1YWRLZXl9L2RlcHRocy97ZGVwdGh9XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3F1YWRLZXl9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJxdWFkS2V5XCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2RlcHRofVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGVwdGhcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIGlmIChwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKSB7XG4gICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYWRkaXRpb25hbEZpZWxkc1wiLCBwYXJhbXNbXCJhZGRpdGlvbmFsRmllbGRzXCJdKTtcbiAgICAgICAgfVxuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwiYmlsbGluZ1RhZ1wiLCBwYXJhbXNbXCJiaWxsaW5nVGFnXCJdKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5xdWFkVHJlZUluZGV4Vm9sYXRpbGUgPSBxdWFkVHJlZUluZGV4Vm9sYXRpbGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAgSEVSRSBFdXJvcGUgQi5WLiBhbmQgaXRzIGFmZmlsaWF0ZShzKS5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBhbmQgb3RoZXIgbWF0ZXJpYWxzIGNvbnRhaW4gcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25cbiAqIGNvbnRyb2xsZWQgYnkgSEVSRSBhbmQgYXJlIHByb3RlY3RlZCBieSBhcHBsaWNhYmxlIGNvcHlyaWdodCBsZWdpc2xhdGlvbi5cbiAqIEFueSB1c2UgYW5kIHV0aWxpemF0aW9uIG9mIHRoaXMgc29mdHdhcmUgYW5kIG90aGVyIG1hdGVyaWFscyBhbmRcbiAqIGRpc2Nsb3N1cmUgdG8gYW55IHRoaXJkIHBhcnRpZXMgaXMgY29uZGl0aW9uYWwgdXBvbiBoYXZpbmcgYSBzZXBhcmF0ZVxuICogYWdyZWVtZW50IHdpdGggSEVSRSBmb3IgdGhlIGFjY2VzcywgdXNlLCB1dGlsaXphdGlvbiBvciBkaXNjbG9zdXJlIG9mIHRoaXNcbiAqIHNvZnR3YXJlLiBJbiB0aGUgYWJzZW5jZSBvZiBzdWNoIGFncmVlbWVudCwgdGhlIHVzZSBvZiB0aGUgc29mdHdhcmUgaXMgbm90XG4gKiBhbGxvd2VkLlxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3Vic2NyaWJlID0gZXhwb3J0cy5zZWVrVG9PZmZzZXQgPSBleHBvcnRzLmVuZHBvaW50QnlDb25zdW1lciA9IGV4cG9ydHMuZW5kcG9pbnQgPSBleHBvcnRzLmRlbGV0ZVN1YnNjcmlwdGlvbiA9IGV4cG9ydHMuY29uc3VtZURhdGEgPSBleHBvcnRzLmRvQ29tbWl0T2Zmc2V0cyA9IHZvaWQgMDtcbi8qKlxuICogU3RyZWFtIEFQSSB2MlxuICogVGhlIGBzdHJlYW1gIHNlcnZpY2UgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gY29uc3VtZSBkYXRhIGZyb20gYSBzdHJlYW0gbGF5ZXIuXG4gKiBXaXRoIHRoaXMgc2VydmljZSB5b3UgY2FuIHN1YnNjcmliZSB0byBhIHN0cmVhbSBsYXllciBhbmQgY29uc3VtZSBtZXNzYWdlcy5cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMi4wLjBcbiAqXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmNvbnN0IFJlcXVlc3RCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9SZXF1ZXN0QnVpbGRlclwiKTtcbi8qKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1BcGlcbiAqL1xuLyoqXG4gKiBBZnRlciByZWFkaW5nIGRhdGEsIHlvdSBzaG91bGQgY29tbWl0IHRoZSBvZmZzZXQgb2YgdGhlIGxhc3QgbWVzc2FnZSByZWFkIGZyb20gZWFjaCBwYXJ0aXRpb24gc29cbiAqIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBjYW4gcmVzdW1lIHJlYWRpbmcgbmV3IG1lc3NhZ2VzIGZyb20gdGhlIGNvcnJlY3QgcGFydGl0aW9uIGluIHRoZSBldmVudCB0aGF0IHRoZXJlIGlzIGFcbiAqIGRpc3J1cHRpb24gdG8gdGhlIHN1YnNjcmlwdGlvbiwgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiBjcmFzaC4gQW4gb2Zmc2V0IGNhbiBhbHNvIGJlIHVzZWZ1bCBpZiB5b3UgZGVsZXRlIGEgc3Vic2NyaXB0aW9uXG4gKiB0aGVuIHJlY3JlYXRlIGEgc3Vic2NyaXB0aW9uIGZvciB0aGUgc2FtZSBsYXllciwgYmVjYXVzZSB0aGUgbmV3IHN1YnNjcmlwdGlvbiBjYW4gc3RhcnQgcmVhZGluZyBkYXRhIGZyb20gdGhlIG9mZnNldC5cbiAqIFRvIHJlYWQgbWVzc2FnZXMgYWxyZWFkeSBjb21taXR0ZWQsIHVzZSB0aGUgL3NlZWsgZW5kcG9pbnQsIHRoZW4gdXNlIC9wYXJ0aXRpb25zLlxuICogVGhlIGJhc2UgcGF0aCB0byB1c2UgaXMgdGhlIHZhbHVlIG9mICdub2RlQmFzZVVSTCcgcmV0dXJuZWQgZnJvbSAvc3Vic2NyaWJlIFBPU1QgcmVxdWVzdC5cbiAqXG4gKiBAc3VtbWFyeSBDb21taXRzIG9mZnNldHMgb2YgdGhlIGxhc3QgbWVzc2FnZSByZWFkXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSBjb21taXRPZmZzZXRzIFRoZSBvZmZzZXRzIHRvIGNvbW1pdC4gSXQgc2hvdWxkIGJlIHNhbWUgYXMgdGhlIG9mZnNldCBvZiB0aGUgbWVzc2FnZSB5b3Ugd2lzaCB0byBjb21taXQuXG4gKiBEbyBub3QgcGFzcyBvZmZzZXQgKyAxIGFzIG1lbnRpb25lZCBpbiBLYWZrYSBDb25zdW1lciBkb2N1bWVudGF0aW9uLiBUaGUgc2VydmljZSBhZGRzIG9uZSB0byB0aGUgb2Zmc2V0IHlvdSBzcGVjaWZ5LlxuICogQHBhcmFtIHN1YnNjcmlwdGlvbklkIFRoZSBzdWJzY3JpcHRpb25JZCByZWNlaXZlZCBpbiB0aGUgcmVzcG9uc2Ugb2YgdGhlIC9zdWJzY3JpYmUgcmVxdWVzdCAocmVxdWlyZWQgaWYgbW9kZSYjeDNEO3BhcmFsbGVsKS5cbiAqIEBwYXJhbSBtb2RlIFRoZSBzdWJzY3JpcHRpb24gbW9kZSBvZiB0aGlzIHN1YnNjcmlwdGlvbklkIChhcyBwcm92aWRlZCBpbiAvc3Vic2NyaWJlIFBPU1QgQVBJKS5cbiAqIEBwYXJhbSB4Q29ycmVsYXRpb25JZCBUaGUgY29ycmVsYXRpb24taWQgKHZhbHVlIG9mIFJlc3BvbnNlIEhlYWRlciAmIzM5O1gtQ29ycmVsYXRpb24tSWQmIzM5OykgZnJvbSBwcmlvciBzdGVwIGluIHByb2Nlc3MuXG4gKiAgU2VlIHRoZSBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9hcGktcmVmZXJlbmNlLmh0bWwpIGZvciB0aGUgJiN4NjA7c3RyZWFtJiN4NjA7IEFQSVxuICovXG5mdW5jdGlvbiBkb0NvbW1pdE9mZnNldHMoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vb2Zmc2V0c1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdWJzY3JpcHRpb25JZFwiLCBwYXJhbXNbXCJzdWJzY3JpcHRpb25JZFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtb2RlXCIsIHBhcmFtc1tcIm1vZGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImNvbW1pdE9mZnNldHNcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiY29tbWl0T2Zmc2V0c1wiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlkXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSWRcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRvQ29tbWl0T2Zmc2V0cyA9IGRvQ29tbWl0T2Zmc2V0cztcbi8qKlxuICogQ29uc3VtZXMgZGF0YSBmcm9tIGEgbGF5ZXIuIFJldHVybnMgbWVzc2FnZXMgZnJvbSBhIHN0cmVhbSBsYXllciBmb3JtYXR0ZWQgc2ltaWxhciB0byBhXG4gKiBbUGFydGl0aW9uIG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWNsaWVudC1saWJyYXJ5L2FwaV9yZWZlcmVuY2Vfc2NhbGEvaW5kZXguaHRtbC5QYXJ0aXRpb24pLlxuICogSWYgdGhlIGRhdGEgc2l6ZSBpcyBsZXNzIHRoYW4gMSBNQiwgdGhlIGBkYXRhYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZC5cbiAqIElmIHRoZSBkYXRhIHNpemUgaXMgZ3JlYXRlciB0aGFuIDEgTUIsIGEgZGF0YSBoYW5kbGUgd2lsbCBiZSByZXR1cm5lZCBwb2ludGluZyB0byB0aGUgb2JqZWN0IHN0b3JlZCBpbiB0aGUgQmxvYiBzdG9yZS5cbiAqIFRoZSBiYXNlIHBhdGggdG8gYmUgdXNlZCBpcyB0aGUgdmFsdWUgb2YgJ25vZGVCYXNlVVJMJyByZXR1cm5lZCBmcm9tIC9zdWJzY3JpYmUgUE9TVCByZXF1ZXN0LlxuICpcbiAqIEBzdW1tYXJ5IENvbnN1bWVzIGRhdGEgZnJvbSBhIGxheWVyXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSBzdWJzY3JpcHRpb25JZCBUaGUgc3Vic2NyaXB0aW9uSWQgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG9mIHRoZSAvc3Vic2NyaWJlIHJlcXVlc3QgKHJlcXVpcmVkIGlmIG1vZGUmI3gzRDtwYXJhbGxlbCkuXG4gKiBAcGFyYW0gbW9kZSBUaGUgc3Vic2NyaXB0aW9uIG1vZGUgb2YgdGhpcyBzdWJzY3JpcHRpb25JZCAoYXMgcHJvdmlkZWQgaW4gL3N1YnNjcmliZSBQT1NUIEFQSSkuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSWQgVGhlIGNvcnJlbGF0aW9uLWlkICh2YWx1ZSBvZiBSZXNwb25zZSBIZWFkZXIgJiMzOTtYLUNvcnJlbGF0aW9uLUlkJiMzOTspIGZyb20gcHJpb3Igc3RlcCBpbiBwcm9jZXNzLlxuICogU2VlIHRoZSBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9hcGktcmVmZXJlbmNlLmh0bWwpIGZvciB0aGUgJiN4NjA7c3RyZWFtJiN4NjA7IEFQSVxuICovXG5mdW5jdGlvbiBjb25zdW1lRGF0YShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9wYXJ0aXRpb25zXCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN1YnNjcmlwdGlvbklkXCIsIHBhcmFtc1tcInN1YnNjcmlwdGlvbklkXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcIm1vZGVcIiwgcGFyYW1zW1wibW9kZVwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNvcnJlbGF0aW9uLUlkXCJdID0gcGFyYW1zW1wieENvcnJlbGF0aW9uSWRcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdEJsb2IodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNvbnN1bWVEYXRhID0gY29uc3VtZURhdGE7XG4vKipcbiAqIERlbGV0ZXMgYSBzdWJzY3JpcHRpb24gdG8gYSBsYXllciAodG9waWMpLiBUaGlzIG9wZXJhdGlvbiByZW1vdmVzIHRoZSBzdWJzY3JpcHRpb24gZnJvbSB0aGUgc2VydmljZS5cbiAqIFRoZSBiYXNlIHBhdGggdG8gdXNlIGlzIHRoZSB2YWx1ZSBvZiAnbm9kZUJhc2VVUkwnIHJldHVybmVkIGZyb20gL3N1YnNjcmliZSBQT1NUIHJlcXVlc3QuXG4gKlxuICogQHN1bW1hcnkgRGVsZXRlIHN1YnNjcmlwdGlvbiB0byBhIGxheWVyXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSBzdWJzY3JpcHRpb25JZCBUaGUgc3Vic2NyaXB0aW9uSWQgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIG9mIHRoZSAvc3Vic2NyaWJlIHJlcXVlc3QgKHJlcXVpcmVkIGlmIG1vZGUmI3gzRDtwYXJhbGxlbCkuXG4gKiBAcGFyYW0gbW9kZSBUaGUgc3Vic2NyaXB0aW9uIG1vZGUgb2YgdGhpcyBzdWJzY3JpcHRpb25JZCAoYXMgcHJvdmlkZWQgaW4gL3N1YnNjcmliZSBQT1NUIEFQSSkuXG4gKiBAcGFyYW0geENvcnJlbGF0aW9uSWQgQSB0cmFjZSBJRCB0byB1c2UgdG8gYXNzb2NpYXRlIHRoaXMgcmVxdWVzdCB3aXRoIG90aGVyIHJlcXVlc3RzIGluIHlvdXIgcHJvY2Vzcy5cbiAqIFRoZSBjb3JyZWxhdGlvbiBJRCBpcyB0aGUgdmFsdWUgb2YgdGhlIHJlc3BvbnNlIGhlYWRlciAmI3g2MDtYLUNvcnJlbGF0aW9uLUlkJiN4NjA7IGZyb20gdGhlIHByaW9yIHJlcXVlc3QgaW4geW91ciBwcm9jZXNzLlxuICogT25jZSB5b3UgdXNlIGEgY29ycmVsYXRpb24gSUQgaW4gYSAmI3g2MDsvZGVsZXRlJiN4NjA7IHJlcXVlc3QsIGRvIG5vdCB1c2UgaXQgYWdhaW4gc2luY2UgJiN4NjA7L2RlbGV0ZSYjeDYwOyBtYXJrcyB0aGUgZW5kIG9mIGEgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlU3Vic2NyaXB0aW9uKGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L3N1YnNjcmliZVwiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdWJzY3JpcHRpb25JZFwiLCBwYXJhbXNbXCJzdWJzY3JpcHRpb25JZFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtb2RlXCIsIHBhcmFtc1tcIm1vZGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJhbXNbXCJ4Q29ycmVsYXRpb25JZFwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1Db3JyZWxhdGlvbi1JZFwiXSA9IHBhcmFtc1tcInhDb3JyZWxhdGlvbklkXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWxldGVTdWJzY3JpcHRpb24gPSBkZWxldGVTdWJzY3JpcHRpb247XG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIEthZmthIEJyb2tlciBVUkwncywgY2xpZW50IElEIChyZXF1aXJlZCB0byBlbmZvcmNlIHF1b3RhcyksIGFuZCBHcm91cCBJRCBwcmVmaXguIFR5cGUgaXMgc2V0IHRvIGEgY29uc3VtZXIuXG4gKlxuICogQHN1bW1hcnkgRXhwb3NlIHRoZSBlbmRwb2ludCB0byBjb25zdW1lIHRoZSBkYXRhIG9mIHRoZSBsYXllciBkaXJlY3RseVxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKi9cbmZ1bmN0aW9uIGVuZHBvaW50KGJ1aWxkZXIsIHBhcmFtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBcIi9sYXllcnMve2xheWVySWR9L2VuZHBvaW50XCIucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0KHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5lbmRwb2ludCA9IGVuZHBvaW50O1xuLyoqXG4gKiBFeHBvc2VzIHRoZSBlbmRwb2ludCB0byB1c2UgdG8gcHJvZHVjZSBhbmQgY29uc3VtZSB0aGUgZGF0YSBvZiB0aGUgbGF5ZXIgZGlyZWN0bHksIHBlciB0eXBlIG9mIHVzZXIgLSBjb25zdW1lciBvciBwcm9kdWNlci5cbiAqIEl0IHJldHVybnMgYSBsaXN0IG9mIEthZmthIEJyb2tlciBVUkwncywgY2xpZW50IElEIChyZXF1aXJlZCB0byBlbmZvcmNlIHF1b3RhcyksIGFuZCBHcm91cCBJRCBwcmVmaXguXG4gKlxuICogQHN1bW1hcnkgRXhwb3NlcyB0aGUgZW5kcG9pbnQgdG8gdXNlIHRvIHByb2R1Y2UgYW5kIGNvbnN1bWUgdGhlIGRhdGEgb2YgdGhlIGxheWVyIGRpcmVjdGx5XG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSB0eXBlIElkZW50aWZpZXMgd2hldGhlciB0aGUgcHJvcGVydGllcyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYXJlIGZvciBhIHByb2R1Y2VyIG9yIGNvbnN1bWVyLlxuICovXG5mdW5jdGlvbiBlbmRwb2ludEJ5Q29uc3VtZXIoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0ve3R5cGV9L2VuZHBvaW50XCJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3R5cGV9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJ0eXBlXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmVuZHBvaW50QnlDb25zdW1lciA9IGVuZHBvaW50QnlDb25zdW1lcjtcbi8qKlxuICogRW5hYmxlcyB5b3UgdG8gc3RhcnQgcmVhZGluZyBkYXRhIGZyb20gYSBzcGVjaWZpZWQgb2Zmc2V0LlxuICogWW91IGNhbiBtb3ZlIHRoZSBtZXNzYWdlIHBvaW50ZXIgdG8gYW55IG9mZnNldCBpbiB0aGUgbGF5ZXIgKHRvcGljKS5cbiAqIE1lc3NhZ2UgY29uc3VtcHRpb24gd2lsbCBzdGFydCBmcm9tIHRoYXQgb2Zmc2V0LlxuICogT25jZSB5b3Ugc2VlayB0byBhbiBvZmZzZXQsIHRoZXJlIGlzIG5vIHJldHVybmluZyB0byB0aGUgaW5pdGlhbCBvZmZzZXQsIHVubGVzcyB0aGUgaW5pdGlhbCBvZmZzZXQgaXMgc2F2ZWQuXG4gKiBUaGUgYmFzZSBwYXRoIHRvIHVzZSBpcyB0aGUgdmFsdWUgb2YgJ25vZGVCYXNlVVJMJyByZXR1cm5lZCBmcm9tIC9zdWJzY3JpYmUgUE9TVCByZXF1ZXN0LlxuICpcbiAqIEBzdW1tYXJ5IFNlZWsgdG8gcHJlZGVmaW5lZCBvZmZzZXQuXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIHN0cmVhbSBsYXllci5cbiAqIEBwYXJhbSBzZWVrT2Zmc2V0cyBMaXN0IG9mIG9mZnNldHMgYW5kIG9mZnNldCBwYXJ0aXRpb25zXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uSWQgVGhlIHN1YnNjcmlwdGlvbklkIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBvZiB0aGUgL3N1YnNjcmliZSByZXF1ZXN0IChyZXF1aXJlZCBpZiBtb2RlJiN4M0Q7cGFyYWxsZWwpLlxuICogQHBhcmFtIG1vZGUgVGhlIHN1YnNjcmlwdGlvbiBtb2RlIG9mIHRoaXMgc3Vic2NyaXB0aW9uSWQgKGFzIHByb3ZpZGVkIGluIC9zdWJzY3JpYmUgUE9TVCBBUEkpLlxuICogQHBhcmFtIHhDb3JyZWxhdGlvbklkIFRoZSBjb3JyZWxhdGlvbi1pZCAodmFsdWUgb2YgUmVzcG9uc2UgSGVhZGVyICYjMzk7WC1Db3JyZWxhdGlvbi1JZCYjMzk7KSBmcm9tIHByaW9yIHN0ZXAgaW4gcHJvY2Vzcy5cbiAqIFNlZSB0aGUgW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1zdG9yZS9hcGktcmVmZXJlbmNlLmh0bWwpIGZvciB0aGUgJiN4NjA7c3RyZWFtJiN4NjA7IEFQSVxuICovXG5mdW5jdGlvbiBzZWVrVG9PZmZzZXQoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vc2Vla1wiLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJzdWJzY3JpcHRpb25JZFwiLCBwYXJhbXNbXCJzdWJzY3JpcHRpb25JZFwiXSk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJtb2RlXCIsIHBhcmFtc1tcIm1vZGVcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcInNlZWtPZmZzZXRzXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtc1tcInNlZWtPZmZzZXRzXCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zW1wieENvcnJlbGF0aW9uSWRcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVyc1tcIlgtQ29ycmVsYXRpb24tSWRcIl0gPSBwYXJhbXNbXCJ4Q29ycmVsYXRpb25JZFwiXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc2Vla1RvT2Zmc2V0ID0gc2Vla1RvT2Zmc2V0O1xuLyoqXG4gKiBFbmFibGVzIG1lc3NhZ2UgY29uc3VtcHRpb24gZnJvbSBhIHNwZWNpZmljIHN0cmVhbSBsYXllciAodG9waWMpLlxuICogVXNlIHRoZSBiYXNlIHBhdGggcmV0dXJuZWQgZnJvbSB0aGUgQVBJIExvb2t1cCBzZXJ2aWNlLiBOb3RlOiBGb3IgKiptb2RlID0gcGFyYWxsZWwqKixcbiAqIG9uZSB1bml0IG9mIHBhcmFsbGVsaXNtIGN1cnJlbnRseSBlcXVhbHMgMSBNQnBzIGluYm91bmQgb3IgMiBNQnBzIG91dGJvdW5kLCB3aGljaGV2ZXIgaXMgZ3JlYXRlciwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxuICogVGhlIG51bWJlciBvZiBzdWJzY3JpcHRpb25zIHdpdGhpbiB0aGUgc2FtZSBncm91cCBjYW5ub3QgZXhjZWVkIHRoZSBwYXJhbGxlbGlzbSBhbGxvd2VkLlxuICogRm9yIG1vcmUgZGV0YWlscyBzZWVcbiAqIFtHZXQgRGF0YSBmcm9tIGEgU3RyZWFtIExheWVyXShodHRwczovL2RldmVsb3Blci5oZXJlLmNvbS9kb2N1bWVudGF0aW9uL2RhdGEtYXBpL2RhdGFfZGV2X2d1aWRlL3Jlc3QvZ2V0dGluZy1kYXRhLXN0cmVhbS5odG1sKS5cbiAqXG4gKiBAc3VtbWFyeSBFbmFibGUgbWVzc2FnZSBjb25zdW1wdGlvbiBmcm9tIGEgc3BlY2lmaWMgc3RyZWFtIGxheWVyLlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHJlYW0gbGF5ZXIuXG4gKiBAcGFyYW0gbW9kZSBTcGVjaWZpZXMgd2hldGhlciB0byB1c2Ugc2VyaWFsIG9yIHBhcmFsbGVsIHN1YnNjcmlwdGlvbiBtb2RlLiBGb3IgbW9yZSBkZXRhaWxzIHNlZVxuICogW0dldCBEYXRhIGZyb20gYSBTdHJlYW0gTGF5ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLmhlcmUuY29tL2RvY3VtZW50YXRpb24vZGF0YS1hcGkvZGF0YV9kZXZfZ3VpZGUvcmVzdC9nZXR0aW5nLWRhdGEtc3RyZWFtLmh0bWwpLlxuICogQHBhcmFtIHN1YnNjcmlwdGlvbklkIEluY2x1ZGUgdGhpcyBwYXJhbWV0ZXIgaWYgeW91IHdhbnQgdG8gbG9vayB1cCB0aGUgJiN4NjA7bm9kZUJhc2VVUkwmI3g2MDsgZm9yIGEgZ2l2ZW4gc3Vic2NyaXB0aW9uSWQuXG4gKiBAcGFyYW0gY29uc3VtZXJJZCBUaGUgSUQgdG8gdXNlIHRvIGlkZW50aWZ5IHRoaXMgY29uc3VtZXIuIEl0IG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgY29uc3VtZXIgZ3JvdXAuXG4gKiBJZiB5b3UgZG8gbm90IHByb3ZpZGUgb25lLCB0aGUgc3lzdGVtIHdpbGwgZ2VuZXJhdGUgb25lLlxuICogQHBhcmFtIHN1YnNjcmlwdGlvblByb3BlcnRpZXMgT25lIG9yIG1vcmUgS2Fma2EgQ29uc3VtZXIgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4gKiBbR2V0IERhdGEgZnJvbSBhIFN0cmVhbSBMYXllcl0oaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vZG9jdW1lbnRhdGlvbi9kYXRhLWFwaS9kYXRhX2Rldl9ndWlkZS9yZXN0L2dldHRpbmctZGF0YS1zdHJlYW0uaHRtbCkuXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9zdWJzY3JpYmVcIi5yZXBsYWNlKFwie2xheWVySWR9XCIsIFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlci50b1N0cmluZyhwYXJhbXNbXCJsYXllcklkXCJdKSk7XG4gICAgICAgIGNvbnN0IHVybEJ1aWxkZXIgPSBuZXcgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyKGJ1aWxkZXIuYmFzZVVybCArIGJhc2VVcmwpO1xuICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZFF1ZXJ5KFwibW9kZVwiLCBwYXJhbXNbXCJtb2RlXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcInN1YnNjcmlwdGlvbklkXCIsIHBhcmFtc1tcInN1YnNjcmlwdGlvbklkXCJdKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImNvbnN1bWVySWRcIiwgcGFyYW1zW1wiY29uc3VtZXJJZFwiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcInN1YnNjcmlwdGlvblByb3BlcnRpZXNcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGthZmthQ29uc3VtZXJQcm9wZXJ0aWVzOiBwYXJhbXNbXCJzdWJzY3JpcHRpb25Qcm9wZXJ0aWVzXCJdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5yZXF1ZXN0QmxvYih1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICogQ29weXJpZ2h0IChDKSAyMDE5IEhFUkUgRXVyb3BlIEIuVi5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqIExpY2Vuc2UtRmlsZW5hbWU6IExJQ0VOU0VcbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnB1dFZvbGF0aWxlQmxvYiA9IGV4cG9ydHMuZ2V0Vm9sYXRpbGVCbG9iID0gZXhwb3J0cy5kZWxldGVWb2xhdGlsZUJsb2IgPSBleHBvcnRzLmNoZWNrSGFuZGxlRXhpc3RzID0gdm9pZCAwO1xuLyoqXG4gKiBWb2xhdGlsZSBCbG9iIEFQSSB2MVxuICogVGhlIGB2b2xhdGlsZS1ibG9iYCBzZXJ2aWNlIHN1cHBvcnRzIHRoZSB1cGxvYWQgYW5kIHJldHJpZXZhbCBvZiB2b2xhdGlsZSBkYXRhIGZyb20gdGhlIHN0b3JhZ2Ugb2YgYSBjYXRhbG9nLlxuICogRWFjaCBkaXNjcmV0ZSBjaHVuayBvZiBkYXRhIGlzIHN0b3JlZCBhcyBhIGJsb2IgKEJpbmFyeSBMYXJnZSBPYmplY3QpLlxuICogRWFjaCBibG9iIGhhcyBpdHMgb3duIHVuaXF1ZSBpZCAoZGF0YSBoYW5kbGUpIHdoaWNoIGlzIHN0b3JlZCBhcyBwYXJ0aXRpb24gbWV0YWRhdGEuXG4gKiBUbyBnZXQgYSBwYXJ0aXRpb24ncyBkYXRhLCB5b3UgZmlyc3QgdXNlIGBtZXRhZGF0YWAgc2VydmljZSB0byByZXRyaWV2ZVxuICogdGhlIHBhcnRpdGlvbidzIG1ldGFkYXRhIChkYXRhIGhhbmRsZSkgd2l0aCB0aGUgYWRkcmVzc2VzIG9mIHRoZSByZWxldmFudCBibG9icy5cbiAqIFlvdSB0aGVuIHVzZSB0aG9zZSBhZGRyZXNzZXMgdG8gcHVsbCB0aGUgZGF0YSB1c2luZyB0aGUgYHZvbGF0aWxlLWJsb2JgIHNlcnZpY2UuXG4gKiBVbmxpa2UgdGhlIGBibG9iYCBzZXJ2aWNlLCBkYXRhIGhhbmRsZXMgY2FuIGJlIG92ZXJ3cml0dGVuLiBIZW5jZSB0aGUgdm9sYXRpbGUgYXNwZWN0LlxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjAuMVxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICpcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuY29uc3QgUmVxdWVzdEJ1aWxkZXJfMSA9IHJlcXVpcmUoXCIuL1JlcXVlc3RCdWlsZGVyXCIpO1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogVm9sYXRpbGVCbG9iQXBpXG4gKi9cbi8qKlxuICogQ2hlY2tzIGlmIGEgdm9sYXRpbGUgYmxvYiBleGlzdHMgZm9yIHRoZSByZXF1ZXN0ZWQgZGF0YSBoYW5kbGUuXG4gKlxuICogQHN1bW1hcnkgQ2hlY2tzIGlmIGEgZGF0YSBoYW5kbGUgZXhpc3RzXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIHZvbGF0aWxlIGJsb2IgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBkYXRhSGFuZGxlIFRoZSBkYXRhIGhhbmRsZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgdm9sYXRpbGUgYmxvYiBzbyB0aGF0IHlvdSBjYW4gZ2V0IHRoYXQgYmxvYiYjMzk7cyBjb250ZW50cy5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBjaGVja0hhbmRsZUV4aXN0cyhidWlsZGVyLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gXCIvbGF5ZXJzL3tsYXllcklkfS9kYXRhL3tkYXRhSGFuZGxlfVwiXG4gICAgICAgICAgICAucmVwbGFjZShcIntsYXllcklkfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wibGF5ZXJJZFwiXSkpXG4gICAgICAgICAgICAucmVwbGFjZShcIntkYXRhSGFuZGxlfVwiLCBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIudG9TdHJpbmcocGFyYW1zW1wiZGF0YUhhbmRsZVwiXSkpO1xuICAgICAgICBjb25zdCB1cmxCdWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyXzEuVXJsQnVpbGRlcihidWlsZGVyLmJhc2VVcmwgKyBiYXNlVXJsKTtcbiAgICAgICAgdXJsQnVpbGRlci5hcHBlbmRRdWVyeShcImJpbGxpbmdUYWdcIiwgcGFyYW1zW1wiYmlsbGluZ1RhZ1wiXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNoZWNrSGFuZGxlRXhpc3RzID0gY2hlY2tIYW5kbGVFeGlzdHM7XG4vKipcbiAqIERlbGV0ZXMgYSB2b2xhdGlsZSBkYXRhIGJsb2IgZnJvbSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSAodm9sdW1lKS5cbiAqXG4gKiBAc3VtbWFyeSBEZWxldGVzIGEgdm9sYXRpbGUgZGF0YSBibG9iXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIHZvbGF0aWxlIGRhdGEgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUgdm9sYXRpbGUgZGF0YSBibG9iIHdoaWNoIGNvbnRlbnRzIHdpbGwgYmUgZGVsZXRlZC5cbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBkZWxldGVWb2xhdGlsZUJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3QodXJsQnVpbGRlciwgb3B0aW9ucyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRlbGV0ZVZvbGF0aWxlQmxvYiA9IGRlbGV0ZVZvbGF0aWxlQmxvYjtcbi8qKlxuICogUmV0cmlldmVzIGEgdm9sYXRpbGUgZGF0YSBibG9iIGZyb20gc3RvcmFnZS5cbiAqXG4gKiBAc3VtbWFyeSBHZXRzIGEgdm9sYXRpbGUgYmxvYlxuICogQHBhcmFtIGxheWVySWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbGF5ZXIgZm9yIHRoaXMgdm9sYXRpbGUgZGF0YSBibG9iLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyB2b2xhdGlsZSBkYXRhIGJsb2Igc28gdGhhdCB5b3UgY2FuIGdldCB0aGF0IGJsb2ImIzM5O3MgY29udGVudHMuXG4gKiBAcGFyYW0gYmlsbGluZ1RhZyBCaWxsaW5nIFRhZyBpcyBhbiBvcHRpb25hbCBmcmVlLWZvcm0gdGFnIHdoaWNoIGlzIHVzZWQgZm9yIGdyb3VwaW5nIGJpbGxpbmcgcmVjb3JkcyB0b2dldGhlci5cbiAqIElmIHN1cHBsaWVkLCBpdCBtdXN0IGJlIGJldHdlZW4gNCAtIDE2IGNoYXJhY3RlcnMsIGNvbnRhaW4gb25seSBhbHBoYS9udW1lcmljIEFTQ0lJIGNoYXJhY3RlcnMgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBnZXRWb2xhdGlsZUJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBidWlsZGVyLnJlcXVlc3RCbG9iKHVybEJ1aWxkZXIsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRWb2xhdGlsZUJsb2IgPSBnZXRWb2xhdGlsZUJsb2I7XG4vKipcbiAqIFBlcnNpc3RzIHRoZSB2b2xhdGlsZSBkYXRhIGJsb2IgaW4gdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBtZWNoYW5pc20gKHZvbHVtZSkuXG4gKlxuICogQHN1bW1hcnkgUHVibGlzaGVzIGEgdm9sYXRpbGUgZGF0YSBibG9iXG4gKiBAcGFyYW0gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRoYXQgdGhlIHZvbGF0aWxlIGRhdGEgYmxvYiBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGRhdGFIYW5kbGUgVGhlIGRhdGEgaGFuZGxlIChJRCkgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUgdm9sYXRpbGUgZGF0YSBibG9iLlxuICogQHBhcmFtIGJvZHkgVGhlIGRhdGEgdG8gdXBsb2FkIGFzIHBhcnQgb2YgdGhlIGJsb2IuIFNpemUgbGltaXQ6IDIgTUJcbiAqIEBwYXJhbSBiaWxsaW5nVGFnIEJpbGxpbmcgVGFnIGlzIGFuIG9wdGlvbmFsIGZyZWUtZm9ybSB0YWcgd2hpY2ggaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYmlsbGluZyByZWNvcmRzIHRvZ2V0aGVyLlxuICogSWYgc3VwcGxpZWQsIGl0IG11c3QgYmUgYmV0d2VlbiA0IC0gMTYgY2hhcmFjdGVycywgY29udGFpbiBvbmx5IGFscGhhL251bWVyaWMgQVNDSUkgY2hhcmFjdGVycyAgW0EtWmEtejAtOV0uXG4gKiBHcm91cGluZyBiaWxsaW5nIHJlY29yZHMgYnkgYmlsbGluZyB0YWcgd2lsbCBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzLlxuICovXG5mdW5jdGlvbiBwdXRWb2xhdGlsZUJsb2IoYnVpbGRlciwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IFwiL2xheWVycy97bGF5ZXJJZH0vZGF0YS97ZGF0YUhhbmRsZX1cIlxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7bGF5ZXJJZH1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImxheWVySWRcIl0pKVxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7ZGF0YUhhbmRsZX1cIiwgUmVxdWVzdEJ1aWxkZXJfMS5VcmxCdWlsZGVyLnRvU3RyaW5nKHBhcmFtc1tcImRhdGFIYW5kbGVcIl0pKTtcbiAgICAgICAgY29uc3QgdXJsQnVpbGRlciA9IG5ldyBSZXF1ZXN0QnVpbGRlcl8xLlVybEJ1aWxkZXIoYnVpbGRlci5iYXNlVXJsICsgYmFzZVVybCk7XG4gICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kUXVlcnkoXCJiaWxsaW5nVGFnXCIsIHBhcmFtc1tcImJpbGxpbmdUYWdcIl0pO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKHBhcmFtc1tcImJvZHlcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zW1wiYm9keVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIucmVxdWVzdCh1cmxCdWlsZGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucHV0Vm9sYXRpbGVCbG9iID0gcHV0Vm9sYXRpbGVCbG9iO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==