text-to-map 1.1.29 → 1.1.30

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.
Files changed (42) hide show
  1. package/dist/bin/clear-all.js +8 -19
  2. package/dist/bin/init-db.js +5 -16
  3. package/dist/bin/knex.js +6 -17
  4. package/dist/bin/parse-ordinance.js +60 -71
  5. package/dist/bin/polygons.js +22 -33
  6. package/dist/db/address-points.js +43 -54
  7. package/dist/db/cities.js +25 -31
  8. package/dist/db/db.js +24 -33
  9. package/dist/db/founders.js +101 -89
  10. package/dist/db/meta.js +12 -21
  11. package/dist/db/migrations/20230704125715_initial.js +291 -304
  12. package/dist/db/migrations/20230731232915_city_positions.js +9 -22
  13. package/dist/db/migrations/20240106224603_city_polygon.js +7 -20
  14. package/dist/db/migrations/20240320200534_district_polygon.js +7 -20
  15. package/dist/db/migrations/20240729211323_ordinance_city.js +11 -0
  16. package/dist/db/regions.js +20 -29
  17. package/dist/db/schools.d.ts +1 -1
  18. package/dist/db/schools.js +18 -24
  19. package/dist/db/street-sync.js +13 -22
  20. package/dist/db/sync-log.js +25 -34
  21. package/dist/index.js +10 -21
  22. package/dist/open-data-sync/address-points.js +21 -30
  23. package/dist/open-data-sync/cities.js +10 -19
  24. package/dist/open-data-sync/common.js +8 -17
  25. package/dist/open-data-sync/regions.js +13 -22
  26. package/dist/open-data-sync/schools.js +20 -29
  27. package/dist/open-data-sync/streets.js +29 -35
  28. package/dist/smd-to-csv/ordinance-to-csv-rules.js +4 -13
  29. package/dist/smd-to-csv/txt-to-json.js +59 -70
  30. package/dist/street-markdown/municipality.js +26 -29
  31. package/dist/street-markdown/polygons.d.ts +4 -4
  32. package/dist/street-markdown/polygons.js +127 -70
  33. package/dist/street-markdown/smd-line-parser.js +6 -9
  34. package/dist/street-markdown/smd-parser.js +2 -3
  35. package/dist/street-markdown/smd.d.ts +7 -1
  36. package/dist/street-markdown/smd.js +180 -152
  37. package/dist/street-markdown/types.d.ts +19 -10
  38. package/dist/street-markdown/types.js +1 -1
  39. package/dist/utils/atom.js +9 -18
  40. package/dist/utils/helpers.d.ts +1 -1
  41. package/dist/utils/helpers.js +10 -5
  42. package/package.json +5 -1
@@ -1,12 +1,3 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import { AddressPointType, createSingleLineAddress } from "czech-address";
11
2
  import { SeriesType, isNegativeSeriesSpec, isRange, isSeriesSpecArray, } from "../street-markdown/types";
12
3
  import { findClosestString } from "../utils/helpers";
@@ -58,15 +49,15 @@ const columnNames = [
58
49
  "wgs84_latitude",
59
50
  "wgs84_longitude",
60
51
  ];
61
- export const commitAddressPoints = (buffer) => __awaiter(void 0, void 0, void 0, function* () {
52
+ export const commitAddressPoints = async (buffer) => {
62
53
  if (buffer.length === 0) {
63
54
  return 0;
64
55
  }
65
- yield insertCities(buffer);
66
- yield insertDistricts(buffer);
67
- yield insertMunicipalityParts(buffer);
68
- yield insertStreets(buffer);
69
- yield insertPragueDistricts(buffer);
56
+ await insertCities(buffer);
57
+ await insertDistricts(buffer);
58
+ await insertMunicipalityParts(buffer);
59
+ await insertStreets(buffer);
60
+ await insertPragueDistricts(buffer);
70
61
  const params = [];
71
62
  buffer.forEach((data) => {
72
63
  let latOrNull, lonOrNull;
@@ -80,42 +71,42 @@ export const commitAddressPoints = (buffer) => __awaiter(void 0, void 0, void 0,
80
71
  });
81
72
  const placeHolders = generate2DPlaceholders(columnNames.length, buffer.length);
82
73
  const knex = getKnexDb();
83
- yield rawQuery(`INSERT ${isMysql(knex) ? "IGNORE" : ""} INTO address_point (${columnNames.join(",")}) VALUES ${placeHolders} ${!isMysql(knex) ? "ON CONFLICT (id) DO NOTHING" : ""}`, params);
74
+ await rawQuery(`INSERT ${isMysql(knex) ? "IGNORE" : ""} INTO address_point (${columnNames.join(",")}) VALUES ${placeHolders} ${!isMysql(knex) ? "ON CONFLICT (id) DO NOTHING" : ""}`, params);
84
75
  return buffer.length;
85
- });
86
- export const insertCities = (buffer) => __awaiter(void 0, void 0, void 0, function* () {
87
- return yield insertMultipleRows(extractKeyValuesPairs(buffer, Column.cityCode, [Column.cityName]), "city", ["code", "name"]);
88
- });
89
- export const insertDistricts = (buffer) => __awaiter(void 0, void 0, void 0, function* () {
90
- return yield insertMultipleRows(extractKeyValuesPairs(buffer, Column.districtCode, [
76
+ };
77
+ export const insertCities = async (buffer) => {
78
+ return await insertMultipleRows(extractKeyValuesPairs(buffer, Column.cityCode, [Column.cityName]), "city", ["code", "name"]);
79
+ };
80
+ export const insertDistricts = async (buffer) => {
81
+ return await insertMultipleRows(extractKeyValuesPairs(buffer, Column.districtCode, [
91
82
  Column.cityCode,
92
83
  Column.districtName,
93
84
  ]), "city_district", ["code", "city_code", "name"]);
94
- });
95
- export const insertMunicipalityParts = (buffer) => __awaiter(void 0, void 0, void 0, function* () {
96
- return yield insertMultipleRows(extractKeyValuesPairs(buffer, Column.municipalityPartCode, [
85
+ };
86
+ export const insertMunicipalityParts = async (buffer) => {
87
+ return await insertMultipleRows(extractKeyValuesPairs(buffer, Column.municipalityPartCode, [
97
88
  Column.municipalityPartName,
98
89
  Column.cityCode,
99
90
  ]), "municipality_part", ["code", "name", "city_code"]);
100
- });
101
- export const insertPragueDistricts = (buffer) => __awaiter(void 0, void 0, void 0, function* () {
102
- return yield insertMultipleRows(extractKeyValuesPairs(buffer, Column.pragueDistrictCode, [
91
+ };
92
+ export const insertPragueDistricts = async (buffer) => {
93
+ return await insertMultipleRows(extractKeyValuesPairs(buffer, Column.pragueDistrictCode, [
103
94
  Column.pragueDistrictName,
104
95
  ]), "prague_district", ["code", "name"]);
105
- });
106
- export const insertStreets = (buffer) => __awaiter(void 0, void 0, void 0, function* () {
107
- return yield insertMultipleRows(extractKeyValuesPairs(buffer, Column.streetCode, [
96
+ };
97
+ export const insertStreets = async (buffer) => {
98
+ return await insertMultipleRows(extractKeyValuesPairs(buffer, Column.streetCode, [
108
99
  Column.cityCode,
109
100
  Column.streetName,
110
101
  ]), "street", ["code", "city_code", "name"]);
111
- });
112
- export const areAddressPointsSynced = () => __awaiter(void 0, void 0, void 0, function* () {
113
- const result = yield getKnexDb()
102
+ };
103
+ export const areAddressPointsSynced = async () => {
104
+ const result = await getKnexDb()
114
105
  .count("*", { as: "countAll" })
115
106
  .from("address_point")
116
107
  .first();
117
108
  return Number(result.countAll) >= 2900000; // total is almost 3 million
118
- });
109
+ };
119
110
  const addressPointSelect = `
120
111
  SELECT a.id, s.name AS street_name, o.name AS object_type_name, a.descriptive_number,
121
112
  a.orientational_number, a.orientational_number_letter, c.name AS city_name,
@@ -128,22 +119,22 @@ const addressPointSelect = `
128
119
  LEFT JOIN city_district d ON a.city_district_code = d.code
129
120
  LEFT JOIN prague_district p ON a.prague_district_code = p.code
130
121
  LEFT JOIN municipality_part m ON a.municipality_part_code = m.code`;
131
- export const getAddressPointById = (addressPointId) => __awaiter(void 0, void 0, void 0, function* () {
132
- const row = yield rawQuery(`${addressPointSelect}
122
+ export const getAddressPointById = async (addressPointId) => {
123
+ const row = await rawQuery(`${addressPointSelect}
133
124
  WHERE a.id = ?`, [addressPointId]);
134
125
  if (row.length === 0) {
135
126
  return null;
136
127
  }
137
128
  return rowToAddressPoint(row[0]);
138
- });
129
+ };
139
130
  let lastFounder = null;
140
131
  let allStreets = [];
141
- export const checkStreetExists = (streetName, founder) => __awaiter(void 0, void 0, void 0, function* () {
132
+ export const checkStreetExists = async (streetName, founder) => {
142
133
  const knex = getKnexDb();
143
134
  const errors = [];
144
135
  // we check the whole city
145
- const cityCode = yield getFounderCityCode(founder);
146
- const rowList = yield rawQuery(`SELECT name AS street_name
136
+ const cityCode = await getFounderCityCode(founder);
137
+ const rowList = await rawQuery(`SELECT name AS street_name
147
138
  FROM street
148
139
  WHERE city_code = ? AND name = ? ${isSqlite(knex) ? "COLLATE NOCASE" : ""}`, [cityCode, streetName]);
149
140
  if (rowList.length > 0) {
@@ -156,7 +147,7 @@ export const checkStreetExists = (streetName, founder) => __awaiter(void 0, void
156
147
  return { exists: true, errors };
157
148
  }
158
149
  if (lastFounder !== founder) {
159
- allStreets = yield getAllStreets(cityCode);
150
+ allStreets = await getAllStreets(cityCode);
160
151
  lastFounder = founder;
161
152
  }
162
153
  const match = allStreets.find((s) => s.toLocaleLowerCase("cs-CZ") === streetName.toLocaleLowerCase("cs-CZ"));
@@ -178,16 +169,16 @@ export const checkStreetExists = (streetName, founder) => __awaiter(void 0, void
178
169
  });
179
170
  }
180
171
  return { exists: false, errors };
181
- });
182
- const getAllStreets = (cityCode) => __awaiter(void 0, void 0, void 0, function* () {
172
+ };
173
+ const getAllStreets = async (cityCode) => {
183
174
  const knex = getKnexDb();
184
- return yield knex.pluck("name").from("street").where("city_code", cityCode);
185
- });
186
- export const findAddressPoints = (params) => __awaiter(void 0, void 0, void 0, function* () {
175
+ return await knex.pluck("name").from("street").where("city_code", cityCode);
176
+ };
177
+ export const findAddressPoints = async (params) => {
187
178
  const queryParams = getQueryParams(params);
188
179
  const streetJoinCondition = getStreetJoinCondition(params);
189
180
  const whereCondition = getWhereCondition(params);
190
- const queryResult = yield rawQuery(`SELECT a.id, s.name AS street_name, o.name AS object_type_name, a.descriptive_number,
181
+ const queryResult = await rawQuery(`SELECT a.id, s.name AS street_name, o.name AS object_type_name, a.descriptive_number,
191
182
  a.orientational_number, a.orientational_number_letter, c.name AS city_name,
192
183
  d.name AS district_name, m.name AS municipality_part_name, p.name AS prague_district_name,
193
184
  a.postal_code, a.wgs84_latitude, a.wgs84_longitude
@@ -200,7 +191,7 @@ export const findAddressPoints = (params) => __awaiter(void 0, void 0, void 0, f
200
191
  LEFT JOIN prague_district p ON a.prague_district_code = p.code
201
192
  WHERE ${whereCondition}`, queryParams);
202
193
  return filterAddressPoints(queryResult.map(rowToAddressPoint), params);
203
- });
194
+ };
204
195
  export const filterAddressPoints = (addressPoints, params) => {
205
196
  if (params.type === "wholeMunicipality" ||
206
197
  params.type === "wholeMunicipalityNoStreetName" ||
@@ -229,11 +220,10 @@ const filterAddressPointsByRanges = (addressPoints, seriesSpec) => {
229
220
  const result = [];
230
221
  seriesSpec.ranges.forEach((range) => {
231
222
  result.push(...addressPoints.filter((addressPoint) => {
232
- var _a;
233
223
  if (isRange(range)) {
234
224
  const number = getNumberByType(seriesSpec.type, addressPoint);
235
225
  return (isInRange(number, seriesSpec.type !== SeriesType.Description
236
- ? (_a = addressPoint.orientationalNumberLetter) !== null && _a !== void 0 ? _a : null
226
+ ? addressPoint.orientationalNumberLetter ?? null
237
227
  : null, range) && fitsType(number, seriesSpec.type));
238
228
  }
239
229
  else {
@@ -309,10 +299,9 @@ export const equalsFullStreetNumber = (fullStreetNumber, addressPoint) => {
309
299
  addressPoint.orientationalNumberLetter));
310
300
  };
311
301
  const getNumberByType = (type, addressPoint) => {
312
- var _a;
313
302
  return type === SeriesType.Description
314
303
  ? addressPoint.houseNumber
315
- : (_a = addressPoint.orientationalNumber) !== null && _a !== void 0 ? _a : null;
304
+ : addressPoint.orientationalNumber ?? null;
316
305
  };
317
306
  const getMunicipalityWhere = (alias, municipality) => {
318
307
  return municipality.type === MunicipalityType.City
@@ -351,4 +340,4 @@ const rowToAddressPoint = (row) => {
351
340
  point.address = createSingleLineAddress(point);
352
341
  return point;
353
342
  };
354
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy1wb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvYWRkcmVzcy1wb2ludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFLTCxVQUFVLEVBR1Ysb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxpQkFBaUIsR0FDbEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsY0FBYyxFQUNkLFFBQVEsR0FDVCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBQXlCLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWxFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUMvQixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztBQUVqQyxNQUFNLFdBQVcsR0FBRztJQUNsQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Q0FDdEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRztJQUNwQixPQUFPLEVBQUUsQ0FBQztJQUNWLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxZQUFZLEVBQUUsQ0FBQztJQUNmLFlBQVksRUFBRSxDQUFDO0lBQ2Ysa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLG9CQUFvQixF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Q3BDO0lBQ0QsSUFBSSxHQUFHLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO1FBQ3JDLEtBQUssQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDO0tBQ2pEO0lBQ0QsS0FBSyxDQUFDLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFkZHJlc3NQb2ludFR5cGUsIGNyZWF0ZVNpbmdsZUxpbmVBZGRyZXNzIH0gZnJvbSBcImN6ZWNoLWFkZHJlc3NcIjtcclxuaW1wb3J0IHtcclxuICBBZGRyZXNzUG9pbnQsXHJcbiAgRnVsbFN0cmVldE51bWJlcixcclxuICBSYW5nZVNwZWMsXHJcbiAgU2VyaWVzU3BlYyxcclxuICBTZXJpZXNUeXBlLFxyXG4gIFNtZEVycm9yLFxyXG4gIFNtZExpbmUsXHJcbiAgaXNOZWdhdGl2ZVNlcmllc1NwZWMsXHJcbiAgaXNSYW5nZSxcclxuICBpc1Nlcmllc1NwZWNBcnJheSxcclxufSBmcm9tIFwiLi4vc3RyZWV0LW1hcmtkb3duL3R5cGVzXCI7XHJcbmltcG9ydCB7IGZpbmRDbG9zZXN0U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2hlbHBlcnNcIjtcclxuaW1wb3J0IGp0c2syd2dzODQgZnJvbSBcIi4uL3V0aWxzL2p0c2syd2dzODRcIjtcclxuaW1wb3J0IHtcclxuICBleHRyYWN0S2V5VmFsdWVzUGFpcnMsXHJcbiAgZ2VuZXJhdGUyRFBsYWNlaG9sZGVycyxcclxuICBnZXRLbmV4RGIsXHJcbiAgaW5zZXJ0TXVsdGlwbGVSb3dzLFxyXG4gIGlzTXlzcWwsXHJcbiAgaXNTcWxpdGUsXHJcbiAgbm9uRW1wdHlPck51bGwsXHJcbiAgcmF3UXVlcnksXHJcbn0gZnJvbSBcIi4vZGJcIjtcclxuaW1wb3J0IHsgZ2V0Rm91bmRlckNpdHlDb2RlIH0gZnJvbSBcIi4vZm91bmRlcnNcIjtcclxuaW1wb3J0IHsgRm91bmRlciwgTXVuaWNpcGFsaXR5LCBNdW5pY2lwYWxpdHlUeXBlIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuXHJcbmNvbnN0IERlc2NyaXB0aXZlVHlwZSA9IFwixI0ucC5cIjtcclxuY29uc3QgUmVnaXN0cmF0aW9uVHlwZSA9IFwixI0uZXYuXCI7XHJcblxyXG5jb25zdCBPYmplY3RUeXBlcyA9IHtcclxuICBbRGVzY3JpcHRpdmVUeXBlXTogMSxcclxuICBbUmVnaXN0cmF0aW9uVHlwZV06IDIsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgQ29sdW1uID0ge1xyXG4gIGFkbUNvZGU6IDAsXHJcbiAgY2l0eUNvZGU6IDEsXHJcbiAgY2l0eU5hbWU6IDIsXHJcbiAgZGlzdHJpY3RDb2RlOiAzLFxyXG4gIGRpc3RyaWN0TmFtZTogNCxcclxuICBwcmFndWVEaXN0cmljdENvZGU6IDUsXHJcbiAgcHJhZ3VlRGlzdHJpY3ROYW1lOiA2LFxyXG4gIG11bmljaXBhbGl0eVBhcnRDb2RlOiA3LFxyXG4gIG11bmljaXBhbGl0eVBhcnROYW1lOiA4LFxyXG4gIHN0cmVldENvZGU6IDksXHJcbiAgc3RyZWV0TmFtZTogMTAsXHJcbiAgb2JqZWN0VHlwZTogMTEsXHJcbiAgaG91c2VOdW1iZXI6IDEyLFxyXG4gIG9yaWVudGF0aW9uYWxOdW1iZXI6IDEzLFxyXG4gIG9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXI6IDE0LFxyXG4gIHBvc3RhbENvZGU6IDE1LFxyXG4gIHlDb29yZGluYXRlOiAxNixcclxuICB4Q29vcmRpbmF0ZTogMTcsXHJcbiAgdmFsaWRGcm9tOiAxOCxcclxufTtcclxuXHJcbmNvbnN0IGNvbHVtbk5hbWVzID0gW1xyXG4gIFwiaWRcIixcclxuICBcInN0cmVldF9jb2RlXCIsXHJcbiAgXCJvYmplY3RfdHlwZV9pZFwiLFxyXG4gIFwiZGVzY3JpcHRpdmVfbnVtYmVyXCIsXHJcbiAgXCJvcmllbnRhdGlvbmFsX251bWJlclwiLFxyXG4gIFwib3JpZW50YXRpb25hbF9udW1iZXJfbGV0dGVyXCIsXHJcbiAgXCJjaXR5X2NvZGVcIixcclxuICBcImNpdHlfZGlzdHJpY3RfY29kZVwiLFxyXG4gIFwibXVuaWNpcGFsaXR5X3BhcnRfY29kZVwiLFxyXG4gIFwicHJhZ3VlX2Rpc3RyaWN0X2NvZGVcIixcclxuICBcInBvc3RhbF9jb2RlXCIsXHJcbiAgXCJqdHNrX3hcIixcclxuICBcImp0c2tfeVwiLFxyXG4gIFwid2dzODRfbGF0aXR1ZGVcIixcclxuICBcIndnczg0X2xvbmdpdHVkZVwiLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IGNvbW1pdEFkZHJlc3NQb2ludHMgPSBhc3luYyAoXHJcbiAgYnVmZmVyOiBzdHJpbmdbXVtdXHJcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuICBhd2FpdCBpbnNlcnRDaXRpZXMoYnVmZmVyKTtcclxuICBhd2FpdCBpbnNlcnREaXN0cmljdHMoYnVmZmVyKTtcclxuICBhd2FpdCBpbnNlcnRNdW5pY2lwYWxpdHlQYXJ0cyhidWZmZXIpO1xyXG4gIGF3YWl0IGluc2VydFN0cmVldHMoYnVmZmVyKTtcclxuICBhd2FpdCBpbnNlcnRQcmFndWVEaXN0cmljdHMoYnVmZmVyKTtcclxuXHJcbiAgY29uc3QgcGFyYW1zOiAoc3RyaW5nIHwgbnVsbClbXSA9IFtdO1xyXG4gIGJ1ZmZlci5mb3JFYWNoKChkYXRhKSA9PiB7XHJcbiAgICBsZXQgbGF0T3JOdWxsOiBzdHJpbmcsIGxvbk9yTnVsbDogc3RyaW5nO1xyXG4gICAgbGF0T3JOdWxsID0gbnVsbDtcclxuICAgIGxvbk9yTnVsbCA9IG51bGw7XHJcbiAgICBpZiAoZGF0YVtDb2x1bW4ueENvb3JkaW5hdGVdICYmIGRhdGFbQ29sdW1uLnlDb29yZGluYXRlXSkge1xyXG4gICAgICBjb25zdCB7IGxhdCwgbG9uIH0gPSBqdHNrMndnczg0KFxyXG4gICAgICAgIHBhcnNlRmxvYXQoZGF0YVtDb2x1bW4ueENvb3JkaW5hdGVdKSxcclxuICAgICAgICBwYXJzZUZsb2F0KGRhdGFbQ29sdW1uLnlDb29yZGluYXRlXSlcclxuICAgICAgKTtcclxuICAgICAgW2xhdE9yTnVsbCwgbG9uT3JOdWxsXSA9IFtsYXQudG9TdHJpbmcoKSwgbG9uLnRvU3RyaW5nKCldO1xyXG4gICAgfVxyXG4gICAgcGFyYW1zLnB1c2goXHJcbiAgICAgIGRhdGFbQ29sdW1uLmFkbUNvZGVdLFxyXG4gICAgICBub25FbXB0eU9yTnVsbChkYXRhW0NvbHVtbi5zdHJlZXRDb2RlXSksXHJcbiAgICAgIE9iamVjdFR5cGVzW2RhdGFbQ29sdW1uLm9iamVjdFR5cGVdXSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4uaG91c2VOdW1iZXJdKSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4ub3JpZW50YXRpb25hbE51bWJlcl0pLFxyXG4gICAgICBub25FbXB0eU9yTnVsbChkYXRhW0NvbHVtbi5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyXSksXHJcbiAgICAgIGRhdGFbQ29sdW1uLmNpdHlDb2RlXSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4uZGlzdHJpY3RDb2RlXSksXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLm11bmljaXBhbGl0eVBhcnRDb2RlXSksXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLnByYWd1ZURpc3RyaWN0Q29kZV0pLFxyXG4gICAgICBkYXRhW0NvbHVtbi5wb3N0YWxDb2RlXSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4ueENvb3JkaW5hdGVdKSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4ueUNvb3JkaW5hdGVdKSxcclxuICAgICAgbGF0T3JOdWxsLFxyXG4gICAgICBsb25Pck51bGxcclxuICAgICk7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBsYWNlSG9sZGVycyA9IGdlbmVyYXRlMkRQbGFjZWhvbGRlcnMoXHJcbiAgICBjb2x1bW5OYW1lcy5sZW5ndGgsXHJcbiAgICBidWZmZXIubGVuZ3RoXHJcbiAgKTtcclxuXHJcbiAgY29uc3Qga25leCA9IGdldEtuZXhEYigpO1xyXG4gIGF3YWl0IHJhd1F1ZXJ5KFxyXG4gICAgYElOU0VSVCAke1xyXG4gICAgICBpc015c3FsKGtuZXgpID8gXCJJR05PUkVcIiA6IFwiXCJcclxuICAgIH0gSU5UTyBhZGRyZXNzX3BvaW50ICgke2NvbHVtbk5hbWVzLmpvaW4oXCIsXCIpfSkgVkFMVUVTICR7cGxhY2VIb2xkZXJzfSAke1xyXG4gICAgICAhaXNNeXNxbChrbmV4KSA/IFwiT04gQ09ORkxJQ1QgKGlkKSBETyBOT1RISU5HXCIgOiBcIlwiXHJcbiAgICB9YCxcclxuICAgIHBhcmFtc1xyXG4gICk7XHJcblxyXG4gIHJldHVybiBidWZmZXIubGVuZ3RoO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydENpdGllcyA9IGFzeW5jIChidWZmZXI6IHN0cmluZ1tdW10pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIHJldHVybiBhd2FpdCBpbnNlcnRNdWx0aXBsZVJvd3MoXHJcbiAgICBleHRyYWN0S2V5VmFsdWVzUGFpcnMoYnVmZmVyLCBDb2x1bW4uY2l0eUNvZGUsIFtDb2x1bW4uY2l0eU5hbWVdKSxcclxuICAgIFwiY2l0eVwiLFxyXG4gICAgW1wiY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydERpc3RyaWN0cyA9IGFzeW5jIChidWZmZXI6IHN0cmluZ1tdW10pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIHJldHVybiBhd2FpdCBpbnNlcnRNdWx0aXBsZVJvd3MoXHJcbiAgICBleHRyYWN0S2V5VmFsdWVzUGFpcnMoYnVmZmVyLCBDb2x1bW4uZGlzdHJpY3RDb2RlLCBbXHJcbiAgICAgIENvbHVtbi5jaXR5Q29kZSxcclxuICAgICAgQ29sdW1uLmRpc3RyaWN0TmFtZSxcclxuICAgIF0pLFxyXG4gICAgXCJjaXR5X2Rpc3RyaWN0XCIsXHJcbiAgICBbXCJjb2RlXCIsIFwiY2l0eV9jb2RlXCIsIFwibmFtZVwiXVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaW5zZXJ0TXVuaWNpcGFsaXR5UGFydHMgPSBhc3luYyAoXHJcbiAgYnVmZmVyOiBzdHJpbmdbXVtdXHJcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIENvbHVtbi5tdW5pY2lwYWxpdHlQYXJ0Q29kZSwgW1xyXG4gICAgICBDb2x1bW4ubXVuaWNpcGFsaXR5UGFydE5hbWUsXHJcbiAgICAgIENvbHVtbi5jaXR5Q29kZSxcclxuICAgIF0pLFxyXG4gICAgXCJtdW5pY2lwYWxpdHlfcGFydFwiLFxyXG4gICAgW1wiY29kZVwiLCBcIm5hbWVcIiwgXCJjaXR5X2NvZGVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydFByYWd1ZURpc3RyaWN0cyA9IGFzeW5jIChcclxuICBidWZmZXI6IHN0cmluZ1tdW11cclxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgZXh0cmFjdEtleVZhbHVlc1BhaXJzKGJ1ZmZlciwgQ29sdW1uLnByYWd1ZURpc3RyaWN0Q29kZSwgW1xyXG4gICAgICBDb2x1bW4ucHJhZ3VlRGlzdHJpY3ROYW1lLFxyXG4gICAgXSksXHJcbiAgICBcInByYWd1ZV9kaXN0cmljdFwiLFxyXG4gICAgW1wiY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydFN0cmVldHMgPSBhc3luYyAoYnVmZmVyOiBzdHJpbmdbXVtdKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgZXh0cmFjdEtleVZhbHVlc1BhaXJzKGJ1ZmZlciwgQ29sdW1uLnN0cmVldENvZGUsIFtcclxuICAgICAgQ29sdW1uLmNpdHlDb2RlLFxyXG4gICAgICBDb2x1bW4uc3RyZWV0TmFtZSxcclxuICAgIF0pLFxyXG4gICAgXCJzdHJlZXRcIixcclxuICAgIFtcImNvZGVcIiwgXCJjaXR5X2NvZGVcIiwgXCJuYW1lXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBhcmVBZGRyZXNzUG9pbnRzU3luY2VkID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuY291bnQoXCIqXCIsIHsgYXM6IFwiY291bnRBbGxcIiB9KVxyXG4gICAgLmZyb20oXCJhZGRyZXNzX3BvaW50XCIpXHJcbiAgICAuZmlyc3QoKTtcclxuICByZXR1cm4gTnVtYmVyKHJlc3VsdC5jb3VudEFsbCkgPj0gMjkwMDAwMDsgLy8gdG90YWwgaXMgYWxtb3N0IDMgbWlsbGlvblxyXG59O1xyXG5cclxuY29uc3QgYWRkcmVzc1BvaW50U2VsZWN0ID0gYFxyXG4gIFNFTEVDVCBhLmlkLCBzLm5hbWUgQVMgc3RyZWV0X25hbWUsIG8ubmFtZSBBUyBvYmplY3RfdHlwZV9uYW1lLCBhLmRlc2NyaXB0aXZlX251bWJlcixcclxuICAgICAgICBhLm9yaWVudGF0aW9uYWxfbnVtYmVyLCBhLm9yaWVudGF0aW9uYWxfbnVtYmVyX2xldHRlciwgYy5uYW1lIEFTIGNpdHlfbmFtZSxcclxuICAgICAgICBtLm5hbWUgQVMgbXVuaWNpcGFsaXR5X3BhcnRfbmFtZSwgcC5uYW1lIEFTIHByYWd1ZV9kaXN0cmljdF9uYW1lLFxyXG4gICAgICAgIGQubmFtZSBBUyBkaXN0cmljdF9uYW1lLCBhLnBvc3RhbF9jb2RlLCBhLndnczg0X2xhdGl0dWRlLCBhLndnczg0X2xvbmdpdHVkZVxyXG4gIEZST00gYWRkcmVzc19wb2ludCBhXHJcbiAgTEVGVCBKT0lOIHN0cmVldCBzIE9OIGEuc3RyZWV0X2NvZGUgPSBzLmNvZGVcclxuICBJTk5FUiBKT0lOIG9iamVjdF90eXBlIG8gT04gby5pZCA9IGEub2JqZWN0X3R5cGVfaWRcclxuICBJTk5FUiBKT0lOIGNpdHkgYyBPTiBjLmNvZGUgPSBhLmNpdHlfY29kZVxyXG4gIExFRlQgSk9JTiBjaXR5X2Rpc3RyaWN0IGQgT04gYS5jaXR5X2Rpc3RyaWN0X2NvZGUgPSBkLmNvZGVcclxuICBMRUZUIEpPSU4gcHJhZ3VlX2Rpc3RyaWN0IHAgT04gYS5wcmFndWVfZGlzdHJpY3RfY29kZSA9IHAuY29kZVxyXG4gIExFRlQgSk9JTiBtdW5pY2lwYWxpdHlfcGFydCBtIE9OIGEubXVuaWNpcGFsaXR5X3BhcnRfY29kZSA9IG0uY29kZWA7XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0QWRkcmVzc1BvaW50QnlJZCA9IGFzeW5jIChcclxuICBhZGRyZXNzUG9pbnRJZDogbnVtYmVyXHJcbik6IFByb21pc2U8QWRkcmVzc1BvaW50IHwgbnVsbD4gPT4ge1xyXG4gIGNvbnN0IHJvdyA9IGF3YWl0IHJhd1F1ZXJ5KFxyXG4gICAgYCR7YWRkcmVzc1BvaW50U2VsZWN0fVxyXG4gICAgICBXSEVSRSBhLmlkID0gP2AsXHJcbiAgICBbYWRkcmVzc1BvaW50SWRdXHJcbiAgKTtcclxuICBpZiAocm93Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIHJldHVybiByb3dUb0FkZHJlc3NQb2ludChyb3dbMF0pO1xyXG59O1xyXG5cclxubGV0IGxhc3RGb3VuZGVyOiBGb3VuZGVyIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbGxTdHJlZXRzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuZXhwb3J0IGNvbnN0IGNoZWNrU3RyZWV0RXhpc3RzID0gYXN5bmMgKFxyXG4gIHN0cmVldE5hbWU6IHN0cmluZyxcclxuICBmb3VuZGVyOiBGb3VuZGVyXHJcbik6IFByb21pc2U8eyBleGlzdHM6IGJvb2xlYW47IGVycm9yczogU21kRXJyb3JbXSB9PiA9PiB7XHJcbiAgY29uc3Qga25leCA9IGdldEtuZXhEYigpO1xyXG4gIGNvbnN0IGVycm9yczogU21kRXJyb3JbXSA9IFtdO1xyXG5cclxuICAvLyB3ZSBjaGVjayB0aGUgd2hvbGUgY2l0eVxyXG4gIGNvbnN0IGNpdHlDb2RlID0gYXdhaXQgZ2V0Rm91bmRlckNpdHlDb2RlKGZvdW5kZXIpO1xyXG4gIGNvbnN0IHJvd0xpc3QgPSBhd2FpdCByYXdRdWVyeShcclxuICAgIGBTRUxFQ1QgbmFtZSBBUyBzdHJlZXRfbmFtZVxyXG4gICAgRlJPTSBzdHJlZXRcclxuICAgIFdIRVJFIGNpdHlfY29kZSA9ID8gQU5EIG5hbWUgPSA/ICAke1xyXG4gICAgICBpc1NxbGl0ZShrbmV4KSA/IFwiQ09MTEFURSBOT0NBU0VcIiA6IFwiXCJcclxuICAgIH1gLFxyXG4gICAgW2NpdHlDb2RlLCBzdHJlZXROYW1lXVxyXG4gICk7XHJcblxyXG4gIGlmIChyb3dMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgIGNvbnN0IHJvdyA9IHJvd0xpc3RbMF07XHJcbiAgICBpZiAocm93LnN0cmVldF9uYW1lICE9PSBzdHJlZXROYW1lKSB7XHJcbiAgICAgIC8vIGVycm9ycy5wdXNoKFxyXG4gICAgICAvLyAgIGBTdHJlZXQgJyR7c3RyZWV0TmFtZX0nIGhhcyB3cm9uZyBjYXNlLCBjb3JyZWN0IGNhc2U6ICcke3Jvdy5zdHJlZXRfbmFtZX0nLmBcclxuICAgICAgLy8gKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IGV4aXN0czogdHJ1ZSwgZXJyb3JzIH07XHJcbiAgfVxyXG5cclxuICBpZiAobGFzdEZvdW5kZXIgIT09IGZvdW5kZXIpIHtcclxuICAgIGFsbFN0cmVldHMgPSBhd2FpdCBnZXRBbGxTdHJlZXRzKGNpdHlDb2RlKTtcclxuICAgIGxhc3RGb3VuZGVyID0gZm91bmRlcjtcclxuICB9XHJcblxyXG4gIGNvbnN0IG1hdGNoID0gYWxsU3RyZWV0cy5maW5kKFxyXG4gICAgKHMpID0+XHJcbiAgICAgIHMudG9Mb2NhbGVMb3dlckNhc2UoXCJjcy1DWlwiKSA9PT0gc3RyZWV0TmFtZS50b0xvY2FsZUxvd2VyQ2FzZShcImNzLUNaXCIpXHJcbiAgKTtcclxuICBsZXQgZXhpc3RzID0gZmFsc2U7XHJcbiAgaWYgKG1hdGNoKSB7XHJcbiAgICBleGlzdHMgPSB0cnVlO1xyXG4gICAgaWYgKHN0cmVldE5hbWUgIT09IG1hdGNoKSB7XHJcbiAgICAgIC8vIGVycm9ycy5wdXNoKFxyXG4gICAgICAvLyAgIGBTdHJlZXQgJyR7c3RyZWV0TmFtZX0nIGhhcyB3cm9uZyBjYXNlLCBjb3JyZWN0IGNhc2U6ICcke21hdGNofScuYFxyXG4gICAgICAvLyApO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBjbG9zZXN0ID0gZmluZENsb3Nlc3RTdHJpbmcoc3RyZWV0TmFtZSwgYWxsU3RyZWV0cyk7XHJcbiAgICBlcnJvcnMucHVzaCh7XHJcbiAgICAgIG1lc3NhZ2U6IGBVbGljZSAnJHtzdHJlZXROYW1lfScgdiB0w6l0byBvYmNpIG5lZXhpc3R1amUsIG15c2xlbGkganN0ZSAnJHtjbG9zZXN0fSc/YCxcclxuICAgICAgc3RhcnRPZmZzZXQ6IDAsXHJcbiAgICAgIGVuZE9mZnNldDogc3RyZWV0TmFtZS5sZW5ndGggKyAxLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiB7IGV4aXN0czogZmFsc2UsIGVycm9ycyB9O1xyXG59O1xyXG5cclxuY29uc3QgZ2V0QWxsU3RyZWV0cyA9IGFzeW5jIChjaXR5Q29kZTogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICByZXR1cm4gYXdhaXQga25leC5wbHVjayhcIm5hbWVcIikuZnJvbShcInN0cmVldFwiKS53aGVyZShcImNpdHlfY29kZVwiLCBjaXR5Q29kZSk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBGaW5kQWRkcmVzc1BvaW50c1BhcmFtcyA9XHJcbiAgfCB7XHJcbiAgICAgIHR5cGU6IFwic21kTGluZVwiO1xyXG4gICAgICBzbWRMaW5lOiBTbWRMaW5lO1xyXG4gICAgICBtdW5pY2lwYWxpdHk6IE11bmljaXBhbGl0eTtcclxuICAgICAgbXVuaWNpcGFsaXR5UGFydENvZGU/OiBudW1iZXI7XHJcbiAgICB9XHJcbiAgfCB7XHJcbiAgICAgIHR5cGU6IFwid2hvbGVNdW5pY2lwYWxpdHlQYXJ0XCI7XHJcbiAgICAgIG11bmljaXBhbGl0eVBhcnRDb2RlOiBudW1iZXI7XHJcbiAgICB9XHJcbiAgfCB7XHJcbiAgICAgIHR5cGU6IFwid2hvbGVNdW5pY2lwYWxpdHlcIjtcclxuICAgICAgbXVuaWNpcGFsaXR5OiBNdW5pY2lwYWxpdHk7XHJcbiAgICB9XHJcbiAgfCB7XHJcbiAgICAgIHR5cGU6IFwid2hvbGVNdW5pY2lwYWxpdHlOb1N0cmVldE5hbWVcIjtcclxuICAgICAgbXVuaWNpcGFsaXR5OiBNdW5pY2lwYWxpdHk7XHJcbiAgICB9O1xyXG5cclxuZXhwb3J0IGNvbnN0IGZpbmRBZGRyZXNzUG9pbnRzID0gYXN5bmMgKFxyXG4gIHBhcmFtczogRmluZEFkZHJlc3NQb2ludHNQYXJhbXNcclxuKTogUHJvbWlzZTxBZGRyZXNzUG9pbnRbXT4gPT4ge1xyXG4gIGNvbnN0IHF1ZXJ5UGFyYW1zID0gZ2V0UXVlcnlQYXJhbXMocGFyYW1zKTtcclxuICBjb25zdCBzdHJlZXRKb2luQ29uZGl0aW9uID0gZ2V0U3RyZWV0Sm9pbkNvbmRpdGlvbihwYXJhbXMpO1xyXG5cclxuICBjb25zdCB3aGVyZUNvbmRpdGlvbiA9IGdldFdoZXJlQ29uZGl0aW9uKHBhcmFtcyk7XHJcblxyXG4gIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gYXdhaXQgcmF3UXVlcnkoXHJcbiAgICBgU0VMRUNUIGEuaWQsIHMubmFtZSBBUyBzdHJlZXRfbmFtZSwgby5uYW1lIEFTIG9iamVjdF90eXBlX25hbWUsIGEuZGVzY3JpcHRpdmVfbnVtYmVyLFxyXG4gICAgICBhLm9yaWVudGF0aW9uYWxfbnVtYmVyLCBhLm9yaWVudGF0aW9uYWxfbnVtYmVyX2xldHRlciwgYy5uYW1lIEFTIGNpdHlfbmFtZSxcclxuICAgICAgZC5uYW1lIEFTIGRpc3RyaWN0X25hbWUsIG0ubmFtZSBBUyBtdW5pY2lwYWxpdHlfcGFydF9uYW1lLCBwLm5hbWUgQVMgcHJhZ3VlX2Rpc3RyaWN0X25hbWUsXHJcbiAgICAgIGEucG9zdGFsX2NvZGUsIGEud2dzODRfbGF0aXR1ZGUsIGEud2dzODRfbG9uZ2l0dWRlXHJcbiAgICBGUk9NIGFkZHJlc3NfcG9pbnQgYVxyXG4gICAgJHtzdHJlZXRKb2luQ29uZGl0aW9ufVxyXG4gICAgSU5ORVIgSk9JTiBvYmplY3RfdHlwZSBvIE9OIG8uaWQgPSBhLm9iamVjdF90eXBlX2lkXHJcbiAgICBJTk5FUiBKT0lOIGNpdHkgYyBPTiBjLmNvZGUgPSBhLmNpdHlfY29kZVxyXG4gICAgTEVGVCBKT0lOIGNpdHlfZGlzdHJpY3QgZCBPTiBhLmNpdHlfZGlzdHJpY3RfY29kZSA9IGQuY29kZVxyXG4gICAgTEVGVCBKT0lOIG11bmljaXBhbGl0eV9wYXJ0IG0gT04gYS5tdW5pY2lwYWxpdHlfcGFydF9jb2RlID0gbS5jb2RlXHJcbiAgICBMRUZUIEpPSU4gcHJhZ3VlX2Rpc3RyaWN0IHAgT04gYS5wcmFndWVfZGlzdHJpY3RfY29kZSA9IHAuY29kZVxyXG4gICAgV0hFUkUgJHt3aGVyZUNvbmRpdGlvbn1gLFxyXG4gICAgcXVlcnlQYXJhbXNcclxuICApO1xyXG5cclxuICByZXR1cm4gZmlsdGVyQWRkcmVzc1BvaW50cyhxdWVyeVJlc3VsdC5tYXAocm93VG9BZGRyZXNzUG9pbnQpLCBwYXJhbXMpO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGZpbHRlckFkZHJlc3NQb2ludHMgPSAoXHJcbiAgYWRkcmVzc1BvaW50czogQWRkcmVzc1BvaW50W10sXHJcbiAgcGFyYW1zOiBGaW5kQWRkcmVzc1BvaW50c1BhcmFtc1xyXG4pOiBBZGRyZXNzUG9pbnRbXSA9PiB7XHJcbiAgaWYgKFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlcIiB8fFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlOb1N0cmVldE5hbWVcIiB8fFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlQYXJ0XCJcclxuICApIHtcclxuICAgIHJldHVybiBhZGRyZXNzUG9pbnRzO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgcmVzdWx0OiBBZGRyZXNzUG9pbnRbXSA9IFtdO1xyXG4gIGNvbnN0IG51bWJlclNwZWMgPSBwYXJhbXMuc21kTGluZS5udW1iZXJTcGVjO1xyXG4gIGlmIChpc1Nlcmllc1NwZWNBcnJheShudW1iZXJTcGVjKSkge1xyXG4gICAgbnVtYmVyU3BlYy5mb3JFYWNoKChzZXJpZXNTcGVjKSA9PiB7XHJcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmZpbHRlckFkZHJlc3NQb2ludHNCeVJhbmdlcyhhZGRyZXNzUG9pbnRzLCBzZXJpZXNTcGVjKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyB3aGVuIG5vIG51bWJlciBzcGVjcyBhcmUgcHJlc2VudCwgd2UgdGFrZSBldmVyeXRoaW5nXHJcbiAgICBpZiAobnVtYmVyU3BlYy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmVzdWx0LnB1c2goLi4uYWRkcmVzc1BvaW50cyk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChpc05lZ2F0aXZlU2VyaWVzU3BlYyhudW1iZXJTcGVjKSkge1xyXG4gICAgLy8gbmVnYXRpdmUgbnVtYmVyIHNwZWMgKGUuZy4gb2RkIG51bWJlcnMgZXhjZXB0IDEzLTE3KVxyXG4gICAgY29uc3QgdG9FeGNsdWRlID0gZmlsdGVyQWRkcmVzc1BvaW50c0J5UmFuZ2VzKGFkZHJlc3NQb2ludHMsIG51bWJlclNwZWMpO1xyXG4gICAgcmVzdWx0LnB1c2goXHJcbiAgICAgIC4uLmFkZHJlc3NQb2ludHMuZmlsdGVyKFxyXG4gICAgICAgIChhZGRyZXNzUG9pbnQpID0+ICF0b0V4Y2x1ZGUuaW5jbHVkZXMoYWRkcmVzc1BvaW50KVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbmNvbnN0IGZpbHRlckFkZHJlc3NQb2ludHNCeVJhbmdlcyA9IChcclxuICBhZGRyZXNzUG9pbnRzOiBBZGRyZXNzUG9pbnRbXSxcclxuICBzZXJpZXNTcGVjOiBTZXJpZXNTcGVjXHJcbik6IEFkZHJlc3NQb2ludFtdID0+IHtcclxuICBjb25zdCByZXN1bHQ6IEFkZHJlc3NQb2ludFtdID0gW107XHJcbiAgc2VyaWVzU3BlYy5yYW5nZXMuZm9yRWFjaCgocmFuZ2UpID0+IHtcclxuICAgIHJlc3VsdC5wdXNoKFxyXG4gICAgICAuLi5hZGRyZXNzUG9pbnRzLmZpbHRlcigoYWRkcmVzc1BvaW50KSA9PiB7XHJcbiAgICAgICAgaWYgKGlzUmFuZ2UocmFuZ2UpKSB7XHJcbiAgICAgICAgICBjb25zdCBudW1iZXIgPSBnZXROdW1iZXJCeVR5cGUoc2VyaWVzU3BlYy50eXBlLCBhZGRyZXNzUG9pbnQpO1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgaXNJblJhbmdlKFxyXG4gICAgICAgICAgICAgIG51bWJlcixcclxuICAgICAgICAgICAgICBzZXJpZXNTcGVjLnR5cGUgIT09IFNlcmllc1R5cGUuRGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgID8gYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXIgPz8gbnVsbFxyXG4gICAgICAgICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgICAgICAgIHJhbmdlXHJcbiAgICAgICAgICAgICkgJiYgZml0c1R5cGUobnVtYmVyLCBzZXJpZXNTcGVjLnR5cGUpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBmdWxsU3RyZWV0TnVtYmVyOiBGdWxsU3RyZWV0TnVtYmVyID0gcmFuZ2U7XHJcbiAgICAgICAgICByZXR1cm4gZXF1YWxzRnVsbFN0cmVldE51bWJlcihmdWxsU3RyZWV0TnVtYmVyLCBhZGRyZXNzUG9pbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfSk7XHJcblxyXG4gIC8vIHdoZW4gbm8gc2VyaWVzIHNwZWNzIGFyZSBwcmVzZW50LCB3ZSB0YWtlIGV2ZXJ5dGhpbmcgdGhhdCBmaXRzIHRoZSB0eXBlXHJcbiAgaWYgKHNlcmllc1NwZWMucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmVzdWx0LnB1c2goXHJcbiAgICAgIC4uLmFkZHJlc3NQb2ludHMuZmlsdGVyKChhZGRyZXNzUG9pbnQpID0+XHJcbiAgICAgICAgZml0c1R5cGUoXHJcbiAgICAgICAgICBnZXROdW1iZXJCeVR5cGUoc2VyaWVzU3BlYy50eXBlLCBhZGRyZXNzUG9pbnQpLFxyXG4gICAgICAgICAgc2VyaWVzU3BlYy50eXBlXHJcbiAgICAgICAgKVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRRdWVyeVBhcmFtcyA9IChcclxuICBwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zXHJcbik6IChzdHJpbmcgfCBudW1iZXIpW10gPT4ge1xyXG4gIGlmIChwYXJhbXMudHlwZSA9PT0gXCJzbWRMaW5lXCIgJiYgcGFyYW1zLnNtZExpbmUudHlwZSA9PT0gXCJzdHJlZXRcIikge1xyXG4gICAgcmV0dXJuIFtwYXJhbXMuc21kTGluZS5zdHJlZXQsIHBhcmFtcy5tdW5pY2lwYWxpdHkuY29kZV07XHJcbiAgfVxyXG5cclxuICBpZiAoXHJcbiAgICAocGFyYW1zLnR5cGUgPT09IFwic21kTGluZVwiICYmIHBhcmFtcy5zbWRMaW5lLnR5cGUgPT09IFwibXVuaWNpcGFsaXR5UGFydFwiKSB8fFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlQYXJ0XCJcclxuICApIHtcclxuICAgIHJldHVybiBbcGFyYW1zLm11bmljaXBhbGl0eVBhcnRDb2RlXTtcclxuICB9XHJcblxyXG4gIHJldHVybiBbcGFyYW1zLm11bmljaXBhbGl0eS5jb2RlXTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRTdHJlZXRKb2luQ29uZGl0aW9uID0gKFxyXG4gIHBhcmFtczogRmluZEFkZHJlc3NQb2ludHNQYXJhbXNcclxuKTogc3RyaW5nID0+IHtcclxuICBpZiAocGFyYW1zLnR5cGUgPT09IFwic21kTGluZVwiICYmIHBhcmFtcy5zbWRMaW5lLnR5cGUgPT09IFwic3RyZWV0XCIpIHtcclxuICAgIHJldHVybiBgSk9JTiBzdHJlZXQgcyBPTiBhLnN0cmVldF9jb2RlID0gcy5jb2RlIEFORCBzLm5hbWUgPSA/ICR7XHJcbiAgICAgIGlzU3FsaXRlKGdldEtuZXhEYigpKSA/IFwiQ09MTEFURSBOT0NBU0VcIiA6IFwiXCJcclxuICAgIH1gO1xyXG4gIH1cclxuICByZXR1cm4gXCJMRUZUIEpPSU4gc3RyZWV0IHMgT04gYS5zdHJlZXRfY29kZSA9IHMuY29kZVwiO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFdoZXJlQ29uZGl0aW9uID0gKHBhcmFtczogRmluZEFkZHJlc3NQb2ludHNQYXJhbXMpOiBzdHJpbmcgPT4ge1xyXG4gIGlmIChcclxuICAgIChwYXJhbXMudHlwZSA9PT0gXCJzbWRMaW5lXCIgJiYgcGFyYW1zLnNtZExpbmUudHlwZSA9PT0gXCJtdW5pY2lwYWxpdHlQYXJ0XCIpIHx8XHJcbiAgICBwYXJhbXMudHlwZSA9PT0gXCJ3aG9sZU11bmljaXBhbGl0eVBhcnRcIlxyXG4gICkge1xyXG4gICAgcmV0dXJuIFwiYS5tdW5pY2lwYWxpdHlfcGFydF9jb2RlID0gP1wiO1xyXG4gIH1cclxuXHJcbiAgaWYgKHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5Tm9TdHJlZXROYW1lXCIpIHtcclxuICAgIHJldHVybiBgJHtnZXRNdW5pY2lwYWxpdHlXaGVyZShcclxuICAgICAgXCJhXCIsXHJcbiAgICAgIHBhcmFtcy5tdW5pY2lwYWxpdHlcclxuICAgICl9IEFORCBhLnN0cmVldF9jb2RlIElTIE5VTExgO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdldE11bmljaXBhbGl0eVdoZXJlKFwiYVwiLCBwYXJhbXMubXVuaWNpcGFsaXR5KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpc0luUmFuZ2UgPSAoXHJcbiAgbnVtYmVyOiBudW1iZXIgfCBudWxsLFxyXG4gIGxldHRlcjogc3RyaW5nIHwgbnVsbCxcclxuICByYW5nZTogUmFuZ2VTcGVjXHJcbik6IGJvb2xlYW4gPT4ge1xyXG4gIGlmIChudW1iZXIgPT09IG51bGwpIHtcclxuICAgIHJldHVybiAhcmFuZ2UuZnJvbSAmJiAhcmFuZ2UudG87XHJcbiAgfVxyXG5cclxuICAvLyBleHBsYWluZXI6IGVpdGhlciB0aGUgbG93ZXIgYm91bmQgaXMgbm90IHNldCwgb3IgaXQgaXMgbG93ZXIgdGhhbiB0aGUgbnVtYmVyXHJcbiAgLy8gaWYgaXQncyBlcXVhbCB0byB0aGUgbnVtYmVyLCB3ZSBhbHNvIGhhdmUgdG8gY2hlY2sgdGhlIGxldHRlciAtIGlmIGl0J3Mgbm90IHNldCwgd2UgZG9uJ3QgY2FyZVxyXG4gIC8vIGlmIGZyb20ubGV0dGVyIGlzIHNldCwgd2UgbmVlZCB0byBoYXZlIGEgbGV0dGVyIHNldCBhbmQgaXQgaGFzIHRvIGJlIGdyZWF0ZXIgb3IgZXF1YWw6XHJcbiAgLy8gbnVtYmVyIHdpdGhvdXQgbGV0dGVyIGNvdW50cyBsb3dlciB0aGFuIG51bWJlciB3aXRoIGxldHRlciAnYScgKGUuZy4gMjMgPCAyM2EpXHJcbiAgY29uc3Qgc2F0aXNmaWVzRnJvbSA9XHJcbiAgICAhcmFuZ2UuZnJvbSB8fFxyXG4gICAgbnVtYmVyID4gcmFuZ2UuZnJvbS5udW1iZXIgfHxcclxuICAgIChudW1iZXIgPT09IHJhbmdlLmZyb20ubnVtYmVyICYmXHJcbiAgICAgICghcmFuZ2UuZnJvbS5sZXR0ZXIgfHwgKCEhbGV0dGVyICYmIGxldHRlciA+PSByYW5nZS5mcm9tLmxldHRlcikpKTtcclxuXHJcbiAgY29uc3Qgc2F0aXNmaWVzVG8gPVxyXG4gICAgIXJhbmdlLnRvIHx8XHJcbiAgICBudW1iZXIgPCByYW5nZS50by5udW1iZXIgfHxcclxuICAgIChudW1iZXIgPT09IHJhbmdlLnRvLm51bWJlciAmJlxyXG4gICAgICAoIWxldHRlciB8fFxyXG4gICAgICAgICghIXJhbmdlLnRvLmxldHRlciAmJiAhIWxldHRlciAmJiBsZXR0ZXIgPD0gcmFuZ2UudG8ubGV0dGVyKSkpO1xyXG5cclxuICByZXR1cm4gc2F0aXNmaWVzRnJvbSAmJiBzYXRpc2ZpZXNUbztcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBmaXRzVHlwZSA9IChudW1iZXI6IG51bWJlciB8IG51bGwsIHR5cGU6IFNlcmllc1R5cGUpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgdHlwZSA9PT0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvbiB8fFxyXG4gICAgdHlwZSA9PT0gU2VyaWVzVHlwZS5BbGwgfHxcclxuICAgICh0eXBlID09PSBTZXJpZXNUeXBlLk9kZCAmJiBudW1iZXIgJSAyID09PSAxKSB8fFxyXG4gICAgKHR5cGUgPT09IFNlcmllc1R5cGUuRXZlbiAmJiBudW1iZXIgJSAyID09PSAwKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZXF1YWxzRnVsbFN0cmVldE51bWJlciA9IChcclxuICBmdWxsU3RyZWV0TnVtYmVyOiBGdWxsU3RyZWV0TnVtYmVyLFxyXG4gIGFkZHJlc3NQb2ludDogQWRkcmVzc1BvaW50XHJcbik6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiAoXHJcbiAgICBmdWxsU3RyZWV0TnVtYmVyLmRlc2NyaXB0aW9uTnVtYmVyLm51bWJlciA9PT0gYWRkcmVzc1BvaW50LmhvdXNlTnVtYmVyICYmXHJcbiAgICBmdWxsU3RyZWV0TnVtYmVyLm9yaWVudGF0aW9uYWxOdW1iZXIubnVtYmVyID09PVxyXG4gICAgICBhZGRyZXNzUG9pbnQub3JpZW50YXRpb25hbE51bWJlciAmJlxyXG4gICAgKCghZnVsbFN0cmVldE51bWJlci5vcmllbnRhdGlvbmFsTnVtYmVyLmxldHRlciAmJlxyXG4gICAgICAhYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXIpIHx8XHJcbiAgICAgIGZ1bGxTdHJlZXROdW1iZXIub3JpZW50YXRpb25hbE51bWJlci5sZXR0ZXIgPT09XHJcbiAgICAgICAgYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXIpXHJcbiAgKTtcclxufTtcclxuXHJcbmNvbnN0IGdldE51bWJlckJ5VHlwZSA9IChcclxuICB0eXBlOiBTZXJpZXNUeXBlLFxyXG4gIGFkZHJlc3NQb2ludDogQWRkcmVzc1BvaW50XHJcbik6IG51bWJlciB8IG51bGwgPT4ge1xyXG4gIHJldHVybiB0eXBlID09PSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uXHJcbiAgICA/IGFkZHJlc3NQb2ludC5ob3VzZU51bWJlclxyXG4gICAgOiBhZGRyZXNzUG9pbnQub3JpZW50YXRpb25hbE51bWJlciA/PyBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0TXVuaWNpcGFsaXR5V2hlcmUgPSAoXHJcbiAgYWxpYXM6IHN0cmluZyxcclxuICBtdW5pY2lwYWxpdHk6IE11bmljaXBhbGl0eVxyXG4pOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBtdW5pY2lwYWxpdHkudHlwZSA9PT0gTXVuaWNpcGFsaXR5VHlwZS5DaXR5XHJcbiAgICA/IGAke2FsaWFzfS5jaXR5X2NvZGUgPSA/YFxyXG4gICAgOiBgJHthbGlhc30uY2l0eV9kaXN0cmljdF9jb2RlID0gP2A7XHJcbn07XHJcblxyXG5jb25zdCByb3dUb0FkZHJlc3NQb2ludCA9IChyb3c6IGFueSk6IEFkZHJlc3NQb2ludCA9PiB7XHJcbiAgY29uc3QgcG9pbnQ6IEFkZHJlc3NQb2ludCA9IHtcclxuICAgIGlkOiByb3cuaWQsXHJcbiAgICBhZGRyZXNzOiBcIlwiLFxyXG4gICAgdHlwZTpcclxuICAgICAgcm93Lm9iamVjdF90eXBlX25hbWUgPT09IERlc2NyaXB0aXZlVHlwZVxyXG4gICAgICAgID8gQWRkcmVzc1BvaW50VHlwZS5EZXNjcmlwdGlvblxyXG4gICAgICAgIDogQWRkcmVzc1BvaW50VHlwZS5SZWdpc3RyYXRpb24sXHJcbiAgICBob3VzZU51bWJlcjogcm93LmRlc2NyaXB0aXZlX251bWJlcixcclxuICAgIGNpdHk6IHJvdy5jaXR5X25hbWUsXHJcbiAgICBtdW5pY2lwYWxpdHlQYXJ0OiByb3cubXVuaWNpcGFsaXR5X3BhcnRfbmFtZSxcclxuICAgIHBvc3RhbENvZGU6IHJvdy5wb3N0YWxfY29kZSxcclxuICAgIGxhdDogcm93Lndnczg0X2xhdGl0dWRlLFxyXG4gICAgbG5nOiByb3cud2dzODRfbG9uZ2l0dWRlLFxyXG4gIH07XHJcbiAgaWYgKHJvdy5zdHJlZXRfbmFtZSAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQuc3RyZWV0ID0gcm93LnN0cmVldF9uYW1lO1xyXG4gIH1cclxuICBpZiAocm93Lm9yaWVudGF0aW9uYWxfbnVtYmVyICE9PSBudWxsKSB7XHJcbiAgICBwb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyID0gcm93Lm9yaWVudGF0aW9uYWxfbnVtYmVyO1xyXG4gIH1cclxuICBpZiAocm93Lm9yaWVudGF0aW9uYWxfbnVtYmVyX2xldHRlciAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQub3JpZW50YXRpb25hbE51bWJlckxldHRlciA9IHJvdy5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXI7XHJcbiAgfVxyXG4gIGlmIChyb3cuZGlzdHJpY3RfbmFtZSAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQuZGlzdHJpY3QgPSByb3cuZGlzdHJpY3RfbmFtZTtcclxuICB9XHJcbiAgaWYgKHJvdy5wcmFndWVfZGlzdHJpY3RfbmFtZSAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQucHJhZ3VlRGlzdHJpY3QgPSByb3cucHJhZ3VlX2Rpc3RyaWN0X25hbWU7XHJcbiAgfVxyXG4gIHBvaW50LmFkZHJlc3MgPSBjcmVhdGVTaW5nbGVMaW5lQWRkcmVzcyhwb2ludCk7XHJcbiAgcmV0dXJuIHBvaW50O1xyXG59O1xyXG4iXX0=
343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy1wb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvYWRkcmVzcy1wb2ludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFLTCxVQUFVLEVBR1Ysb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxpQkFBaUIsR0FDbEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsY0FBYyxFQUNkLFFBQVEsR0FDVCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBQXlCLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWxFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUMvQixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztBQUVqQyxNQUFNLFdBQVcsR0FBRztJQUNsQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Q0FDdEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRztJQUNwQixPQUFPLEVBQUUsQ0FBQztJQUNWLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxZQUFZLEVBQUUsQ0FBQztJQUNmLFlBQVksRUFBRSxDQUFDO0lBQ2Ysa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLG9CQUFvQixFQUFFLENBQUM7SUFDdkIsb0JBQW9CLEVBQUUsQ0FBQztJQUN2QixVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxFQUFFO0lBQ2QsVUFBVSxFQUFFLEVBQUU7SUFDZCxXQUFXLEVBQUUsRUFBRTtJQUNmLG1CQUFtQixFQUFFLEVBQUU7SUFDdkIseUJBQXlCLEVBQUUsRUFBRTtJQUM3QixVQUFVLEVBQUUsRUFBRTtJQUNkLFdBQVcsRUFBRSxFQUFFO0lBQ2YsV0FBVyxFQUFFLEVBQUU7SUFDZixTQUFTLEVBQUUsRUFBRTtDQUNkLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRztJQUNsQixJQUFJO0lBQ0osYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsc0JBQXNCO0lBQ3RCLDZCQUE2QjtJQUM3QixXQUFXO0lBQ1gsb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4QixzQkFBc0I7SUFDdEIsYUFBYTtJQUNiLFFBQVE7SUFDUixRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtDQUNsQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxFQUN0QyxNQUFrQixFQUNELEVBQUU7SUFDbkIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN2QixPQUFPLENBQUMsQ0FBQztLQUNWO0lBQ0QsTUFBTSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsTUFBTSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsTUFBTSx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixNQUFNLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXBDLE1BQU0sTUFBTSxHQUFzQixFQUFFLENBQUM7SUFDckMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3RCLElBQUksU0FBaUIsRUFBRSxTQUFpQixDQUFDO1FBQ3pDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUN4RCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FDN0IsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsRUFDcEMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FDckMsQ0FBQztZQUNGLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FDVCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUNwQixjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUN2QyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUNwQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUN4QyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQ2hELGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFDckIsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDekMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUNqRCxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQ3ZCLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQ3hDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQ3hDLFNBQVMsRUFDVCxTQUFTLENBQ1YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQ3pDLFdBQVcsQ0FBQyxNQUFNLEVBQ2xCLE1BQU0sQ0FBQyxNQUFNLENBQ2QsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQ3pCLE1BQU0sUUFBUSxDQUNaLFVBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQzdCLHdCQUF3QixXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLFlBQVksSUFDbkUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxFQUNuRCxFQUFFLEVBQ0YsTUFBTSxDQUNQLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDdkIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxNQUFrQixFQUFtQixFQUFFO0lBQ3hFLE9BQU8sTUFBTSxrQkFBa0IsQ0FDN0IscUJBQXFCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFDakUsTUFBTSxFQUNOLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUNqQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEtBQUssRUFBRSxNQUFrQixFQUFtQixFQUFFO0lBQzNFLE9BQU8sTUFBTSxrQkFBa0IsQ0FDN0IscUJBQXFCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUU7UUFDakQsTUFBTSxDQUFDLFFBQVE7UUFDZixNQUFNLENBQUMsWUFBWTtLQUNwQixDQUFDLEVBQ0YsZUFBZSxFQUNmLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FDOUIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEtBQUssRUFDMUMsTUFBa0IsRUFDRCxFQUFFO0lBQ25CLE9BQU8sTUFBTSxrQkFBa0IsQ0FDN0IscUJBQXFCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRTtRQUN6RCxNQUFNLENBQUMsb0JBQW9CO1FBQzNCLE1BQU0sQ0FBQyxRQUFRO0tBQ2hCLENBQUMsRUFDRixtQkFBbUIsRUFDbkIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUM5QixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxFQUN4QyxNQUFrQixFQUNELEVBQUU7SUFDbkIsT0FBTyxNQUFNLGtCQUFrQixDQUM3QixxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixFQUFFO1FBQ3ZELE1BQU0sQ0FBQyxrQkFBa0I7S0FDMUIsQ0FBQyxFQUNGLGlCQUFpQixFQUNqQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FDakIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsTUFBa0IsRUFBbUIsRUFBRTtJQUN6RSxPQUFPLE1BQU0sa0JBQWtCLENBQzdCLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO1FBQy9DLE1BQU0sQ0FBQyxRQUFRO1FBQ2YsTUFBTSxDQUFDLFVBQVU7S0FDbEIsQ0FBQyxFQUNGLFFBQVEsRUFDUixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQzlCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLElBQXNCLEVBQUU7SUFDakUsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLEVBQUU7U0FDN0IsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQztTQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDO1NBQ3JCLEtBQUssRUFBRSxDQUFDO0lBQ1gsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLDRCQUE0QjtBQUN6RSxDQUFDLENBQUM7QUFFRixNQUFNLGtCQUFrQixHQUFHOzs7Ozs7Ozs7OztxRUFXMEMsQ0FBQztBQUV0RSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEVBQ3RDLGNBQXNCLEVBQ1EsRUFBRTtJQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FDeEIsR0FBRyxrQkFBa0I7cUJBQ0osRUFDakIsQ0FBQyxjQUFjLENBQUMsQ0FDakIsQ0FBQztJQUNGLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELE9BQU8saUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBRUYsSUFBSSxXQUFXLEdBQW1CLElBQUksQ0FBQztBQUN2QyxJQUFJLFVBQVUsR0FBYSxFQUFFLENBQUM7QUFFOUIsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUNwQyxVQUFrQixFQUNsQixPQUFnQixFQUNrQyxFQUFFO0lBQ3BELE1BQU0sSUFBSSxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQ3pCLE1BQU0sTUFBTSxHQUFlLEVBQUUsQ0FBQztJQUU5QiwwQkFBMEI7SUFDMUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRCxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FDNUI7O3dDQUdFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQ3RDLEVBQUUsRUFDRixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FDdkIsQ0FBQztJQUVGLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksR0FBRyxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUU7WUFDbEMsZUFBZTtZQUNmLGlGQUFpRjtZQUNqRixLQUFLO1NBQ047UUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztLQUNqQztJQUVELElBQUksV0FBVyxLQUFLLE9BQU8sRUFBRTtRQUMzQixVQUFVLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsV0FBVyxHQUFHLE9BQU8sQ0FBQztLQUN2QjtJQUVELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQzNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssVUFBVSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUN6RSxDQUFDO0lBQ0YsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLElBQUksS0FBSyxFQUFFO1FBQ1QsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNkLElBQUksVUFBVSxLQUFLLEtBQUssRUFBRTtZQUN4QixlQUFlO1lBQ2YsdUVBQXVFO1lBQ3ZFLEtBQUs7U0FDTjtLQUNGO1NBQU07UUFDTCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNWLE9BQU8sRUFBRSxVQUFVLFVBQVUsMkNBQTJDLE9BQU8sSUFBSTtZQUNuRixXQUFXLEVBQUUsQ0FBQztZQUNkLFNBQVMsRUFBRSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUM7U0FDakMsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNuQyxDQUFDLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsUUFBZ0IsRUFBcUIsRUFBRTtJQUNsRSxNQUFNLElBQUksR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUN6QixPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM5RSxDQUFDLENBQUM7QUFzQkYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUNwQyxNQUErQixFQUNOLEVBQUU7SUFDM0IsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sbUJBQW1CLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0QsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFakQsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQ2hDOzs7OztNQUtFLG1CQUFtQjs7Ozs7O1lBTWIsY0FBYyxFQUFFLEVBQ3hCLFdBQVcsQ0FDWixDQUFDO0lBRUYsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FDakMsYUFBNkIsRUFDN0IsTUFBK0IsRUFDZixFQUFFO0lBQ2xCLElBQ0UsTUFBTSxDQUFDLElBQUksS0FBSyxtQkFBbUI7UUFDbkMsTUFBTSxDQUFDLElBQUksS0FBSywrQkFBK0I7UUFDL0MsTUFBTSxDQUFDLElBQUksS0FBSyx1QkFBdUIsRUFDdkM7UUFDQSxPQUFPLGFBQWEsQ0FBQztLQUN0QjtJQUVELE1BQU0sTUFBTSxHQUFtQixFQUFFLENBQUM7SUFDbEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFDN0MsSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUNqQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLDJCQUEyQixDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsdURBQXVEO1FBQ3ZELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1NBQy9CO0tBQ0Y7U0FBTSxJQUFJLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQzNDLHVEQUF1RDtRQUN2RCxNQUFNLFNBQVMsR0FBRywyQkFBMkIsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekUsTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQ3JCLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQ3BELENBQ0YsQ0FBQztLQUNIO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSwyQkFBMkIsR0FBRyxDQUNsQyxhQUE2QixFQUM3QixVQUFzQixFQUNOLEVBQUU7SUFDbEIsTUFBTSxNQUFNLEdBQW1CLEVBQUUsQ0FBQztJQUNsQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQ1QsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDdkMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2xCLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUM5RCxPQUFPLENBQ0wsU0FBUyxDQUNQLE1BQU0sRUFDTixVQUFVLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxXQUFXO29CQUN4QyxDQUFDLENBQUMsWUFBWSxDQUFDLHlCQUF5QixJQUFJLElBQUk7b0JBQ2hELENBQUMsQ0FBQyxJQUFJLEVBQ1IsS0FBSyxDQUNOLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQ3ZDLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxNQUFNLGdCQUFnQixHQUFxQixLQUFLLENBQUM7Z0JBQ2pELE9BQU8sc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDL0Q7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCwwRUFBMEU7SUFDMUUsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUN2QyxRQUFRLENBQ04sZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQzlDLFVBQVUsQ0FBQyxJQUFJLENBQ2hCLENBQ0YsQ0FDRixDQUFDO0tBQ0g7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsTUFBK0IsRUFDVixFQUFFO0lBQ3ZCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQ2pFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzFEO0lBRUQsSUFDRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGtCQUFrQixDQUFDO1FBQ3pFLE1BQU0sQ0FBQyxJQUFJLEtBQUssdUJBQXVCLEVBQ3ZDO1FBQ0EsT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0tBQ3RDO0lBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FDcEMsTUFBK0IsRUFDdkIsRUFBRTtJQUNWLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQ2pFLE9BQU8sMERBQ0wsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUM3QyxFQUFFLENBQUM7S0FDSjtJQUNELE9BQU8sOENBQThDLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUErQixFQUFVLEVBQUU7SUFDM0UsSUFDRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGtCQUFrQixDQUFDO1FBQ3pFLE1BQU0sQ0FBQyxJQUFJLEtBQUssdUJBQXVCLEVBQ3ZDO1FBQ0EsT0FBTyw4QkFBOEIsQ0FBQztLQUN2QztJQUVELElBQUksTUFBTSxDQUFDLElBQUksS0FBSywrQkFBK0IsRUFBRTtRQUNuRCxPQUFPLEdBQUcsb0JBQW9CLENBQzVCLEdBQUcsRUFDSCxNQUFNLENBQUMsWUFBWSxDQUNwQiw0QkFBNEIsQ0FBQztLQUMvQjtJQUVELE9BQU8sb0JBQW9CLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FDdkIsTUFBcUIsRUFDckIsTUFBcUIsRUFDckIsS0FBZ0IsRUFDUCxFQUFFO0lBQ1gsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO1FBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztLQUNqQztJQUVELCtFQUErRTtJQUMvRSxpR0FBaUc7SUFDakcseUZBQXlGO0lBQ3pGLGlGQUFpRjtJQUNqRixNQUFNLGFBQWEsR0FDakIsQ0FBQyxLQUFLLENBQUMsSUFBSTtRQUNYLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU07UUFDMUIsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQzNCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sV0FBVyxHQUNmLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDVCxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNO1FBQ3hCLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTTtZQUN6QixDQUFDLENBQUMsTUFBTTtnQkFDTixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyRSxPQUFPLGFBQWEsSUFBSSxXQUFXLENBQUM7QUFDdEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBcUIsRUFBRSxJQUFnQixFQUFXLEVBQUU7SUFDM0UsT0FBTyxDQUNMLElBQUksS0FBSyxVQUFVLENBQUMsV0FBVztRQUMvQixJQUFJLEtBQUssVUFBVSxDQUFDLEdBQUc7UUFDdkIsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLEdBQUcsSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsSUFBSSxJQUFJLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQy9DLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUNwQyxnQkFBa0MsRUFDbEMsWUFBMEIsRUFDakIsRUFBRTtJQUNYLE9BQU8sQ0FDTCxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLFdBQVc7UUFDdEUsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsTUFBTTtZQUN6QyxZQUFZLENBQUMsbUJBQW1CO1FBQ2xDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLE1BQU07WUFDNUMsQ0FBQyxZQUFZLENBQUMseUJBQXlCLENBQUM7WUFDeEMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsTUFBTTtnQkFDekMsWUFBWSxDQUFDLHlCQUF5QixDQUFDLENBQzVDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxDQUN0QixJQUFnQixFQUNoQixZQUEwQixFQUNYLEVBQUU7SUFDakIsT0FBTyxJQUFJLEtBQUssVUFBVSxDQUFDLFdBQVc7UUFDcEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXO1FBQzFCLENBQUMsQ0FBQyxZQUFZLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUVGLE1BQU0sb0JBQW9CLEdBQUcsQ0FDM0IsS0FBYSxFQUNiLFlBQTBCLEVBQ2xCLEVBQUU7SUFDVixPQUFPLFlBQVksQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUMsSUFBSTtRQUNoRCxDQUFDLENBQUMsR0FBRyxLQUFLLGdCQUFnQjtRQUMxQixDQUFDLENBQUMsR0FBRyxLQUFLLHlCQUF5QixDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFRLEVBQWdCLEVBQUU7SUFDbkQsTUFBTSxLQUFLLEdBQWlCO1FBQzFCLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtRQUNWLE9BQU8sRUFBRSxFQUFFO1FBQ1gsSUFBSSxFQUNGLEdBQUcsQ0FBQyxnQkFBZ0IsS0FBSyxlQUFlO1lBQ3RDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXO1lBQzlCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZO1FBQ25DLFdBQVcsRUFBRSxHQUFHLENBQUMsa0JBQWtCO1FBQ25DLElBQUksRUFBRSxHQUFHLENBQUMsU0FBUztRQUNuQixnQkFBZ0IsRUFBRSxHQUFHLENBQUMsc0JBQXNCO1FBQzVDLFVBQVUsRUFBRSxHQUFHLENBQUMsV0FBVztRQUMzQixHQUFHLEVBQUUsR0FBRyxDQUFDLGNBQWM7UUFDdkIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxlQUFlO0tBQ3pCLENBQUM7SUFDRixJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO1FBQzVCLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztLQUNoQztJQUNELElBQUksR0FBRyxDQUFDLG9CQUFvQixLQUFLLElBQUksRUFBRTtRQUNyQyxLQUFLLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDO0tBQ3REO0lBQ0QsSUFBSSxHQUFHLENBQUMsMkJBQTJCLEtBQUssSUFBSSxFQUFFO1FBQzVDLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxHQUFHLENBQUMsMkJBQTJCLENBQUM7S0FDbkU7SUFDRCxJQUFJLEdBQUcsQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1FBQzlCLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztLQUNwQztJQUNELElBQUksR0FBRyxDQUFDLG9CQUFvQixLQUFLLElBQUksRUFBRTtRQUNyQyxLQUFLLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztLQUNqRDtJQUNELEtBQUssQ0FBQyxPQUFPLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZGRyZXNzUG9pbnRUeXBlLCBjcmVhdGVTaW5nbGVMaW5lQWRkcmVzcyB9IGZyb20gXCJjemVjaC1hZGRyZXNzXCI7XHJcbmltcG9ydCB7XHJcbiAgQWRkcmVzc1BvaW50LFxyXG4gIEZ1bGxTdHJlZXROdW1iZXIsXHJcbiAgUmFuZ2VTcGVjLFxyXG4gIFNlcmllc1NwZWMsXHJcbiAgU2VyaWVzVHlwZSxcclxuICBTbWRFcnJvcixcclxuICBTbWRMaW5lLFxyXG4gIGlzTmVnYXRpdmVTZXJpZXNTcGVjLFxyXG4gIGlzUmFuZ2UsXHJcbiAgaXNTZXJpZXNTcGVjQXJyYXksXHJcbn0gZnJvbSBcIi4uL3N0cmVldC1tYXJrZG93bi90eXBlc1wiO1xyXG5pbXBvcnQgeyBmaW5kQ2xvc2VzdFN0cmluZyB9IGZyb20gXCIuLi91dGlscy9oZWxwZXJzXCI7XHJcbmltcG9ydCBqdHNrMndnczg0IGZyb20gXCIuLi91dGlscy9qdHNrMndnczg0XCI7XHJcbmltcG9ydCB7XHJcbiAgZXh0cmFjdEtleVZhbHVlc1BhaXJzLFxyXG4gIGdlbmVyYXRlMkRQbGFjZWhvbGRlcnMsXHJcbiAgZ2V0S25leERiLFxyXG4gIGluc2VydE11bHRpcGxlUm93cyxcclxuICBpc015c3FsLFxyXG4gIGlzU3FsaXRlLFxyXG4gIG5vbkVtcHR5T3JOdWxsLFxyXG4gIHJhd1F1ZXJ5LFxyXG59IGZyb20gXCIuL2RiXCI7XHJcbmltcG9ydCB7IGdldEZvdW5kZXJDaXR5Q29kZSB9IGZyb20gXCIuL2ZvdW5kZXJzXCI7XHJcbmltcG9ydCB7IEZvdW5kZXIsIE11bmljaXBhbGl0eSwgTXVuaWNpcGFsaXR5VHlwZSB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5jb25zdCBEZXNjcmlwdGl2ZVR5cGUgPSBcIsSNLnAuXCI7XHJcbmNvbnN0IFJlZ2lzdHJhdGlvblR5cGUgPSBcIsSNLmV2LlwiO1xyXG5cclxuY29uc3QgT2JqZWN0VHlwZXMgPSB7XHJcbiAgW0Rlc2NyaXB0aXZlVHlwZV06IDEsXHJcbiAgW1JlZ2lzdHJhdGlvblR5cGVdOiAyLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IENvbHVtbiA9IHtcclxuICBhZG1Db2RlOiAwLFxyXG4gIGNpdHlDb2RlOiAxLFxyXG4gIGNpdHlOYW1lOiAyLFxyXG4gIGRpc3RyaWN0Q29kZTogMyxcclxuICBkaXN0cmljdE5hbWU6IDQsXHJcbiAgcHJhZ3VlRGlzdHJpY3RDb2RlOiA1LFxyXG4gIHByYWd1ZURpc3RyaWN0TmFtZTogNixcclxuICBtdW5pY2lwYWxpdHlQYXJ0Q29kZTogNyxcclxuICBtdW5pY2lwYWxpdHlQYXJ0TmFtZTogOCxcclxuICBzdHJlZXRDb2RlOiA5LFxyXG4gIHN0cmVldE5hbWU6IDEwLFxyXG4gIG9iamVjdFR5cGU6IDExLFxyXG4gIGhvdXNlTnVtYmVyOiAxMixcclxuICBvcmllbnRhdGlvbmFsTnVtYmVyOiAxMyxcclxuICBvcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyOiAxNCxcclxuICBwb3N0YWxDb2RlOiAxNSxcclxuICB5Q29vcmRpbmF0ZTogMTYsXHJcbiAgeENvb3JkaW5hdGU6IDE3LFxyXG4gIHZhbGlkRnJvbTogMTgsXHJcbn07XHJcblxyXG5jb25zdCBjb2x1bW5OYW1lcyA9IFtcclxuICBcImlkXCIsXHJcbiAgXCJzdHJlZXRfY29kZVwiLFxyXG4gIFwib2JqZWN0X3R5cGVfaWRcIixcclxuICBcImRlc2NyaXB0aXZlX251bWJlclwiLFxyXG4gIFwib3JpZW50YXRpb25hbF9udW1iZXJcIixcclxuICBcIm9yaWVudGF0aW9uYWxfbnVtYmVyX2xldHRlclwiLFxyXG4gIFwiY2l0eV9jb2RlXCIsXHJcbiAgXCJjaXR5X2Rpc3RyaWN0X2NvZGVcIixcclxuICBcIm11bmljaXBhbGl0eV9wYXJ0X2NvZGVcIixcclxuICBcInByYWd1ZV9kaXN0cmljdF9jb2RlXCIsXHJcbiAgXCJwb3N0YWxfY29kZVwiLFxyXG4gIFwianRza194XCIsXHJcbiAgXCJqdHNrX3lcIixcclxuICBcIndnczg0X2xhdGl0dWRlXCIsXHJcbiAgXCJ3Z3M4NF9sb25naXR1ZGVcIixcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBjb21taXRBZGRyZXNzUG9pbnRzID0gYXN5bmMgKFxyXG4gIGJ1ZmZlcjogc3RyaW5nW11bXVxyXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcbiAgYXdhaXQgaW5zZXJ0Q2l0aWVzKGJ1ZmZlcik7XHJcbiAgYXdhaXQgaW5zZXJ0RGlzdHJpY3RzKGJ1ZmZlcik7XHJcbiAgYXdhaXQgaW5zZXJ0TXVuaWNpcGFsaXR5UGFydHMoYnVmZmVyKTtcclxuICBhd2FpdCBpbnNlcnRTdHJlZXRzKGJ1ZmZlcik7XHJcbiAgYXdhaXQgaW5zZXJ0UHJhZ3VlRGlzdHJpY3RzKGJ1ZmZlcik7XHJcblxyXG4gIGNvbnN0IHBhcmFtczogKHN0cmluZyB8IG51bGwpW10gPSBbXTtcclxuICBidWZmZXIuZm9yRWFjaCgoZGF0YSkgPT4ge1xyXG4gICAgbGV0IGxhdE9yTnVsbDogc3RyaW5nLCBsb25Pck51bGw6IHN0cmluZztcclxuICAgIGxhdE9yTnVsbCA9IG51bGw7XHJcbiAgICBsb25Pck51bGwgPSBudWxsO1xyXG4gICAgaWYgKGRhdGFbQ29sdW1uLnhDb29yZGluYXRlXSAmJiBkYXRhW0NvbHVtbi55Q29vcmRpbmF0ZV0pIHtcclxuICAgICAgY29uc3QgeyBsYXQsIGxvbiB9ID0ganRzazJ3Z3M4NChcclxuICAgICAgICBwYXJzZUZsb2F0KGRhdGFbQ29sdW1uLnhDb29yZGluYXRlXSksXHJcbiAgICAgICAgcGFyc2VGbG9hdChkYXRhW0NvbHVtbi55Q29vcmRpbmF0ZV0pXHJcbiAgICAgICk7XHJcbiAgICAgIFtsYXRPck51bGwsIGxvbk9yTnVsbF0gPSBbbGF0LnRvU3RyaW5nKCksIGxvbi50b1N0cmluZygpXTtcclxuICAgIH1cclxuICAgIHBhcmFtcy5wdXNoKFxyXG4gICAgICBkYXRhW0NvbHVtbi5hZG1Db2RlXSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4uc3RyZWV0Q29kZV0pLFxyXG4gICAgICBPYmplY3RUeXBlc1tkYXRhW0NvbHVtbi5vYmplY3RUeXBlXV0sXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLmhvdXNlTnVtYmVyXSksXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLm9yaWVudGF0aW9uYWxOdW1iZXJdKSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4ub3JpZW50YXRpb25hbE51bWJlckxldHRlcl0pLFxyXG4gICAgICBkYXRhW0NvbHVtbi5jaXR5Q29kZV0sXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLmRpc3RyaWN0Q29kZV0pLFxyXG4gICAgICBub25FbXB0eU9yTnVsbChkYXRhW0NvbHVtbi5tdW5pY2lwYWxpdHlQYXJ0Q29kZV0pLFxyXG4gICAgICBub25FbXB0eU9yTnVsbChkYXRhW0NvbHVtbi5wcmFndWVEaXN0cmljdENvZGVdKSxcclxuICAgICAgZGF0YVtDb2x1bW4ucG9zdGFsQ29kZV0sXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLnhDb29yZGluYXRlXSksXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLnlDb29yZGluYXRlXSksXHJcbiAgICAgIGxhdE9yTnVsbCxcclxuICAgICAgbG9uT3JOdWxsXHJcbiAgICApO1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBwbGFjZUhvbGRlcnMgPSBnZW5lcmF0ZTJEUGxhY2Vob2xkZXJzKFxyXG4gICAgY29sdW1uTmFtZXMubGVuZ3RoLFxyXG4gICAgYnVmZmVyLmxlbmd0aFxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICBhd2FpdCByYXdRdWVyeShcclxuICAgIGBJTlNFUlQgJHtcclxuICAgICAgaXNNeXNxbChrbmV4KSA/IFwiSUdOT1JFXCIgOiBcIlwiXHJcbiAgICB9IElOVE8gYWRkcmVzc19wb2ludCAoJHtjb2x1bW5OYW1lcy5qb2luKFwiLFwiKX0pIFZBTFVFUyAke3BsYWNlSG9sZGVyc30gJHtcclxuICAgICAgIWlzTXlzcWwoa25leCkgPyBcIk9OIENPTkZMSUNUIChpZCkgRE8gTk9USElOR1wiIDogXCJcIlxyXG4gICAgfWAsXHJcbiAgICBwYXJhbXNcclxuICApO1xyXG5cclxuICByZXR1cm4gYnVmZmVyLmxlbmd0aDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRDaXRpZXMgPSBhc3luYyAoYnVmZmVyOiBzdHJpbmdbXVtdKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgZXh0cmFjdEtleVZhbHVlc1BhaXJzKGJ1ZmZlciwgQ29sdW1uLmNpdHlDb2RlLCBbQ29sdW1uLmNpdHlOYW1lXSksXHJcbiAgICBcImNpdHlcIixcclxuICAgIFtcImNvZGVcIiwgXCJuYW1lXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnREaXN0cmljdHMgPSBhc3luYyAoYnVmZmVyOiBzdHJpbmdbXVtdKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgZXh0cmFjdEtleVZhbHVlc1BhaXJzKGJ1ZmZlciwgQ29sdW1uLmRpc3RyaWN0Q29kZSwgW1xyXG4gICAgICBDb2x1bW4uY2l0eUNvZGUsXHJcbiAgICAgIENvbHVtbi5kaXN0cmljdE5hbWUsXHJcbiAgICBdKSxcclxuICAgIFwiY2l0eV9kaXN0cmljdFwiLFxyXG4gICAgW1wiY29kZVwiLCBcImNpdHlfY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydE11bmljaXBhbGl0eVBhcnRzID0gYXN5bmMgKFxyXG4gIGJ1ZmZlcjogc3RyaW5nW11bXVxyXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIHJldHVybiBhd2FpdCBpbnNlcnRNdWx0aXBsZVJvd3MoXHJcbiAgICBleHRyYWN0S2V5VmFsdWVzUGFpcnMoYnVmZmVyLCBDb2x1bW4ubXVuaWNpcGFsaXR5UGFydENvZGUsIFtcclxuICAgICAgQ29sdW1uLm11bmljaXBhbGl0eVBhcnROYW1lLFxyXG4gICAgICBDb2x1bW4uY2l0eUNvZGUsXHJcbiAgICBdKSxcclxuICAgIFwibXVuaWNpcGFsaXR5X3BhcnRcIixcclxuICAgIFtcImNvZGVcIiwgXCJuYW1lXCIsIFwiY2l0eV9jb2RlXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRQcmFndWVEaXN0cmljdHMgPSBhc3luYyAoXHJcbiAgYnVmZmVyOiBzdHJpbmdbXVtdXHJcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIENvbHVtbi5wcmFndWVEaXN0cmljdENvZGUsIFtcclxuICAgICAgQ29sdW1uLnByYWd1ZURpc3RyaWN0TmFtZSxcclxuICAgIF0pLFxyXG4gICAgXCJwcmFndWVfZGlzdHJpY3RcIixcclxuICAgIFtcImNvZGVcIiwgXCJuYW1lXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRTdHJlZXRzID0gYXN5bmMgKGJ1ZmZlcjogc3RyaW5nW11bXSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIENvbHVtbi5zdHJlZXRDb2RlLCBbXHJcbiAgICAgIENvbHVtbi5jaXR5Q29kZSxcclxuICAgICAgQ29sdW1uLnN0cmVldE5hbWUsXHJcbiAgICBdKSxcclxuICAgIFwic3RyZWV0XCIsXHJcbiAgICBbXCJjb2RlXCIsIFwiY2l0eV9jb2RlXCIsIFwibmFtZVwiXVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgYXJlQWRkcmVzc1BvaW50c1N5bmNlZCA9IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRLbmV4RGIoKVxyXG4gICAgLmNvdW50KFwiKlwiLCB7IGFzOiBcImNvdW50QWxsXCIgfSlcclxuICAgIC5mcm9tKFwiYWRkcmVzc19wb2ludFwiKVxyXG4gICAgLmZpcnN0KCk7XHJcbiAgcmV0dXJuIE51bWJlcihyZXN1bHQuY291bnRBbGwpID49IDI5MDAwMDA7IC8vIHRvdGFsIGlzIGFsbW9zdCAzIG1pbGxpb25cclxufTtcclxuXHJcbmNvbnN0IGFkZHJlc3NQb2ludFNlbGVjdCA9IGBcclxuICBTRUxFQ1QgYS5pZCwgcy5uYW1lIEFTIHN0cmVldF9uYW1lLCBvLm5hbWUgQVMgb2JqZWN0X3R5cGVfbmFtZSwgYS5kZXNjcmlwdGl2ZV9udW1iZXIsXHJcbiAgICAgICAgYS5vcmllbnRhdGlvbmFsX251bWJlciwgYS5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXIsIGMubmFtZSBBUyBjaXR5X25hbWUsXHJcbiAgICAgICAgbS5uYW1lIEFTIG11bmljaXBhbGl0eV9wYXJ0X25hbWUsIHAubmFtZSBBUyBwcmFndWVfZGlzdHJpY3RfbmFtZSxcclxuICAgICAgICBkLm5hbWUgQVMgZGlzdHJpY3RfbmFtZSwgYS5wb3N0YWxfY29kZSwgYS53Z3M4NF9sYXRpdHVkZSwgYS53Z3M4NF9sb25naXR1ZGVcclxuICBGUk9NIGFkZHJlc3NfcG9pbnQgYVxyXG4gIExFRlQgSk9JTiBzdHJlZXQgcyBPTiBhLnN0cmVldF9jb2RlID0gcy5jb2RlXHJcbiAgSU5ORVIgSk9JTiBvYmplY3RfdHlwZSBvIE9OIG8uaWQgPSBhLm9iamVjdF90eXBlX2lkXHJcbiAgSU5ORVIgSk9JTiBjaXR5IGMgT04gYy5jb2RlID0gYS5jaXR5X2NvZGVcclxuICBMRUZUIEpPSU4gY2l0eV9kaXN0cmljdCBkIE9OIGEuY2l0eV9kaXN0cmljdF9jb2RlID0gZC5jb2RlXHJcbiAgTEVGVCBKT0lOIHByYWd1ZV9kaXN0cmljdCBwIE9OIGEucHJhZ3VlX2Rpc3RyaWN0X2NvZGUgPSBwLmNvZGVcclxuICBMRUZUIEpPSU4gbXVuaWNpcGFsaXR5X3BhcnQgbSBPTiBhLm11bmljaXBhbGl0eV9wYXJ0X2NvZGUgPSBtLmNvZGVgO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEFkZHJlc3NQb2ludEJ5SWQgPSBhc3luYyAoXHJcbiAgYWRkcmVzc1BvaW50SWQ6IG51bWJlclxyXG4pOiBQcm9taXNlPEFkZHJlc3NQb2ludCB8IG51bGw+ID0+IHtcclxuICBjb25zdCByb3cgPSBhd2FpdCByYXdRdWVyeShcclxuICAgIGAke2FkZHJlc3NQb2ludFNlbGVjdH1cclxuICAgICAgV0hFUkUgYS5pZCA9ID9gLFxyXG4gICAgW2FkZHJlc3NQb2ludElkXVxyXG4gICk7XHJcbiAgaWYgKHJvdy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICByZXR1cm4gcm93VG9BZGRyZXNzUG9pbnQocm93WzBdKTtcclxufTtcclxuXHJcbmxldCBsYXN0Rm91bmRlcjogRm91bmRlciB8IG51bGwgPSBudWxsO1xyXG5sZXQgYWxsU3RyZWV0czogc3RyaW5nW10gPSBbXTtcclxuXHJcbmV4cG9ydCBjb25zdCBjaGVja1N0cmVldEV4aXN0cyA9IGFzeW5jIChcclxuICBzdHJlZXROYW1lOiBzdHJpbmcsXHJcbiAgZm91bmRlcjogRm91bmRlclxyXG4pOiBQcm9taXNlPHsgZXhpc3RzOiBib29sZWFuOyBlcnJvcnM6IFNtZEVycm9yW10gfT4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICBjb25zdCBlcnJvcnM6IFNtZEVycm9yW10gPSBbXTtcclxuXHJcbiAgLy8gd2UgY2hlY2sgdGhlIHdob2xlIGNpdHlcclxuICBjb25zdCBjaXR5Q29kZSA9IGF3YWl0IGdldEZvdW5kZXJDaXR5Q29kZShmb3VuZGVyKTtcclxuICBjb25zdCByb3dMaXN0ID0gYXdhaXQgcmF3UXVlcnkoXHJcbiAgICBgU0VMRUNUIG5hbWUgQVMgc3RyZWV0X25hbWVcclxuICAgIEZST00gc3RyZWV0XHJcbiAgICBXSEVSRSBjaXR5X2NvZGUgPSA/IEFORCBuYW1lID0gPyAgJHtcclxuICAgICAgaXNTcWxpdGUoa25leCkgPyBcIkNPTExBVEUgTk9DQVNFXCIgOiBcIlwiXHJcbiAgICB9YCxcclxuICAgIFtjaXR5Q29kZSwgc3RyZWV0TmFtZV1cclxuICApO1xyXG5cclxuICBpZiAocm93TGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCByb3cgPSByb3dMaXN0WzBdO1xyXG4gICAgaWYgKHJvdy5zdHJlZXRfbmFtZSAhPT0gc3RyZWV0TmFtZSkge1xyXG4gICAgICAvLyBlcnJvcnMucHVzaChcclxuICAgICAgLy8gICBgU3RyZWV0ICcke3N0cmVldE5hbWV9JyBoYXMgd3JvbmcgY2FzZSwgY29ycmVjdCBjYXNlOiAnJHtyb3cuc3RyZWV0X25hbWV9Jy5gXHJcbiAgICAgIC8vICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBleGlzdHM6IHRydWUsIGVycm9ycyB9O1xyXG4gIH1cclxuXHJcbiAgaWYgKGxhc3RGb3VuZGVyICE9PSBmb3VuZGVyKSB7XHJcbiAgICBhbGxTdHJlZXRzID0gYXdhaXQgZ2V0QWxsU3RyZWV0cyhjaXR5Q29kZSk7XHJcbiAgICBsYXN0Rm91bmRlciA9IGZvdW5kZXI7XHJcbiAgfVxyXG5cclxuICBjb25zdCBtYXRjaCA9IGFsbFN0cmVldHMuZmluZChcclxuICAgIChzKSA9PlxyXG4gICAgICBzLnRvTG9jYWxlTG93ZXJDYXNlKFwiY3MtQ1pcIikgPT09IHN0cmVldE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoXCJjcy1DWlwiKVxyXG4gICk7XHJcbiAgbGV0IGV4aXN0cyA9IGZhbHNlO1xyXG4gIGlmIChtYXRjaCkge1xyXG4gICAgZXhpc3RzID0gdHJ1ZTtcclxuICAgIGlmIChzdHJlZXROYW1lICE9PSBtYXRjaCkge1xyXG4gICAgICAvLyBlcnJvcnMucHVzaChcclxuICAgICAgLy8gICBgU3RyZWV0ICcke3N0cmVldE5hbWV9JyBoYXMgd3JvbmcgY2FzZSwgY29ycmVjdCBjYXNlOiAnJHttYXRjaH0nLmBcclxuICAgICAgLy8gKTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgY2xvc2VzdCA9IGZpbmRDbG9zZXN0U3RyaW5nKHN0cmVldE5hbWUsIGFsbFN0cmVldHMpO1xyXG4gICAgZXJyb3JzLnB1c2goe1xyXG4gICAgICBtZXNzYWdlOiBgVWxpY2UgJyR7c3RyZWV0TmFtZX0nIHYgdMOpdG8gb2JjaSBuZWV4aXN0dWplLCBteXNsZWxpIGpzdGUgJyR7Y2xvc2VzdH0nP2AsXHJcbiAgICAgIHN0YXJ0T2Zmc2V0OiAwLFxyXG4gICAgICBlbmRPZmZzZXQ6IHN0cmVldE5hbWUubGVuZ3RoICsgMSxcclxuICAgIH0pO1xyXG4gIH1cclxuICByZXR1cm4geyBleGlzdHM6IGZhbHNlLCBlcnJvcnMgfTtcclxufTtcclxuXHJcbmNvbnN0IGdldEFsbFN0cmVldHMgPSBhc3luYyAoY2l0eUNvZGU6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcclxuICBjb25zdCBrbmV4ID0gZ2V0S25leERiKCk7XHJcbiAgcmV0dXJuIGF3YWl0IGtuZXgucGx1Y2soXCJuYW1lXCIpLmZyb20oXCJzdHJlZXRcIikud2hlcmUoXCJjaXR5X2NvZGVcIiwgY2l0eUNvZGUpO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgRmluZEFkZHJlc3NQb2ludHNQYXJhbXMgPVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcInNtZExpbmVcIjtcclxuICAgICAgc21kTGluZTogU21kTGluZTtcclxuICAgICAgbXVuaWNpcGFsaXR5OiBNdW5pY2lwYWxpdHk7XHJcbiAgICAgIG11bmljaXBhbGl0eVBhcnRDb2RlPzogbnVtYmVyO1xyXG4gICAgfVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcIndob2xlTXVuaWNpcGFsaXR5UGFydFwiO1xyXG4gICAgICBtdW5pY2lwYWxpdHlQYXJ0Q29kZTogbnVtYmVyO1xyXG4gICAgfVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcIndob2xlTXVuaWNpcGFsaXR5XCI7XHJcbiAgICAgIG11bmljaXBhbGl0eTogTXVuaWNpcGFsaXR5O1xyXG4gICAgfVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcIndob2xlTXVuaWNpcGFsaXR5Tm9TdHJlZXROYW1lXCI7XHJcbiAgICAgIG11bmljaXBhbGl0eTogTXVuaWNpcGFsaXR5O1xyXG4gICAgfTtcclxuXHJcbmV4cG9ydCBjb25zdCBmaW5kQWRkcmVzc1BvaW50cyA9IGFzeW5jIChcclxuICBwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zXHJcbik6IFByb21pc2U8QWRkcmVzc1BvaW50W10+ID0+IHtcclxuICBjb25zdCBxdWVyeVBhcmFtcyA9IGdldFF1ZXJ5UGFyYW1zKHBhcmFtcyk7XHJcbiAgY29uc3Qgc3RyZWV0Sm9pbkNvbmRpdGlvbiA9IGdldFN0cmVldEpvaW5Db25kaXRpb24ocGFyYW1zKTtcclxuXHJcbiAgY29uc3Qgd2hlcmVDb25kaXRpb24gPSBnZXRXaGVyZUNvbmRpdGlvbihwYXJhbXMpO1xyXG5cclxuICBjb25zdCBxdWVyeVJlc3VsdCA9IGF3YWl0IHJhd1F1ZXJ5KFxyXG4gICAgYFNFTEVDVCBhLmlkLCBzLm5hbWUgQVMgc3RyZWV0X25hbWUsIG8ubmFtZSBBUyBvYmplY3RfdHlwZV9uYW1lLCBhLmRlc2NyaXB0aXZlX251bWJlcixcclxuICAgICAgYS5vcmllbnRhdGlvbmFsX251bWJlciwgYS5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXIsIGMubmFtZSBBUyBjaXR5X25hbWUsXHJcbiAgICAgIGQubmFtZSBBUyBkaXN0cmljdF9uYW1lLCBtLm5hbWUgQVMgbXVuaWNpcGFsaXR5X3BhcnRfbmFtZSwgcC5uYW1lIEFTIHByYWd1ZV9kaXN0cmljdF9uYW1lLFxyXG4gICAgICBhLnBvc3RhbF9jb2RlLCBhLndnczg0X2xhdGl0dWRlLCBhLndnczg0X2xvbmdpdHVkZVxyXG4gICAgRlJPTSBhZGRyZXNzX3BvaW50IGFcclxuICAgICR7c3RyZWV0Sm9pbkNvbmRpdGlvbn1cclxuICAgIElOTkVSIEpPSU4gb2JqZWN0X3R5cGUgbyBPTiBvLmlkID0gYS5vYmplY3RfdHlwZV9pZFxyXG4gICAgSU5ORVIgSk9JTiBjaXR5IGMgT04gYy5jb2RlID0gYS5jaXR5X2NvZGVcclxuICAgIExFRlQgSk9JTiBjaXR5X2Rpc3RyaWN0IGQgT04gYS5jaXR5X2Rpc3RyaWN0X2NvZGUgPSBkLmNvZGVcclxuICAgIExFRlQgSk9JTiBtdW5pY2lwYWxpdHlfcGFydCBtIE9OIGEubXVuaWNpcGFsaXR5X3BhcnRfY29kZSA9IG0uY29kZVxyXG4gICAgTEVGVCBKT0lOIHByYWd1ZV9kaXN0cmljdCBwIE9OIGEucHJhZ3VlX2Rpc3RyaWN0X2NvZGUgPSBwLmNvZGVcclxuICAgIFdIRVJFICR7d2hlcmVDb25kaXRpb259YCxcclxuICAgIHF1ZXJ5UGFyYW1zXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIGZpbHRlckFkZHJlc3NQb2ludHMocXVlcnlSZXN1bHQubWFwKHJvd1RvQWRkcmVzc1BvaW50KSwgcGFyYW1zKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBmaWx0ZXJBZGRyZXNzUG9pbnRzID0gKFxyXG4gIGFkZHJlc3NQb2ludHM6IEFkZHJlc3NQb2ludFtdLFxyXG4gIHBhcmFtczogRmluZEFkZHJlc3NQb2ludHNQYXJhbXNcclxuKTogQWRkcmVzc1BvaW50W10gPT4ge1xyXG4gIGlmIChcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5XCIgfHxcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5Tm9TdHJlZXROYW1lXCIgfHxcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5UGFydFwiXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gYWRkcmVzc1BvaW50cztcclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogQWRkcmVzc1BvaW50W10gPSBbXTtcclxuICBjb25zdCBudW1iZXJTcGVjID0gcGFyYW1zLnNtZExpbmUubnVtYmVyU3BlYztcclxuICBpZiAoaXNTZXJpZXNTcGVjQXJyYXkobnVtYmVyU3BlYykpIHtcclxuICAgIG51bWJlclNwZWMuZm9yRWFjaCgoc2VyaWVzU3BlYykgPT4ge1xyXG4gICAgICByZXN1bHQucHVzaCguLi5maWx0ZXJBZGRyZXNzUG9pbnRzQnlSYW5nZXMoYWRkcmVzc1BvaW50cywgc2VyaWVzU3BlYykpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gd2hlbiBubyBudW1iZXIgc3BlY3MgYXJlIHByZXNlbnQsIHdlIHRha2UgZXZlcnl0aGluZ1xyXG4gICAgaWYgKG51bWJlclNwZWMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmFkZHJlc3NQb2ludHMpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoaXNOZWdhdGl2ZVNlcmllc1NwZWMobnVtYmVyU3BlYykpIHtcclxuICAgIC8vIG5lZ2F0aXZlIG51bWJlciBzcGVjIChlLmcuIG9kZCBudW1iZXJzIGV4Y2VwdCAxMy0xNylcclxuICAgIGNvbnN0IHRvRXhjbHVkZSA9IGZpbHRlckFkZHJlc3NQb2ludHNCeVJhbmdlcyhhZGRyZXNzUG9pbnRzLCBudW1iZXJTcGVjKTtcclxuICAgIHJlc3VsdC5wdXNoKFxyXG4gICAgICAuLi5hZGRyZXNzUG9pbnRzLmZpbHRlcihcclxuICAgICAgICAoYWRkcmVzc1BvaW50KSA9PiAhdG9FeGNsdWRlLmluY2x1ZGVzKGFkZHJlc3NQb2ludClcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG5jb25zdCBmaWx0ZXJBZGRyZXNzUG9pbnRzQnlSYW5nZXMgPSAoXHJcbiAgYWRkcmVzc1BvaW50czogQWRkcmVzc1BvaW50W10sXHJcbiAgc2VyaWVzU3BlYzogU2VyaWVzU3BlY1xyXG4pOiBBZGRyZXNzUG9pbnRbXSA9PiB7XHJcbiAgY29uc3QgcmVzdWx0OiBBZGRyZXNzUG9pbnRbXSA9IFtdO1xyXG4gIHNlcmllc1NwZWMucmFuZ2VzLmZvckVhY2goKHJhbmdlKSA9PiB7XHJcbiAgICByZXN1bHQucHVzaChcclxuICAgICAgLi4uYWRkcmVzc1BvaW50cy5maWx0ZXIoKGFkZHJlc3NQb2ludCkgPT4ge1xyXG4gICAgICAgIGlmIChpc1JhbmdlKHJhbmdlKSkge1xyXG4gICAgICAgICAgY29uc3QgbnVtYmVyID0gZ2V0TnVtYmVyQnlUeXBlKHNlcmllc1NwZWMudHlwZSwgYWRkcmVzc1BvaW50KTtcclxuICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIGlzSW5SYW5nZShcclxuICAgICAgICAgICAgICBudW1iZXIsXHJcbiAgICAgICAgICAgICAgc2VyaWVzU3BlYy50eXBlICE9PSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICA/IGFkZHJlc3NQb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyID8/IG51bGxcclxuICAgICAgICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICAgICAgICByYW5nZVxyXG4gICAgICAgICAgICApICYmIGZpdHNUeXBlKG51bWJlciwgc2VyaWVzU3BlYy50eXBlKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZnVsbFN0cmVldE51bWJlcjogRnVsbFN0cmVldE51bWJlciA9IHJhbmdlO1xyXG4gICAgICAgICAgcmV0dXJuIGVxdWFsc0Z1bGxTdHJlZXROdW1iZXIoZnVsbFN0cmVldE51bWJlciwgYWRkcmVzc1BvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH0pO1xyXG5cclxuICAvLyB3aGVuIG5vIHNlcmllcyBzcGVjcyBhcmUgcHJlc2VudCwgd2UgdGFrZSBldmVyeXRoaW5nIHRoYXQgZml0cyB0aGUgdHlwZVxyXG4gIGlmIChzZXJpZXNTcGVjLnJhbmdlcy5sZW5ndGggPT09IDApIHtcclxuICAgIHJlc3VsdC5wdXNoKFxyXG4gICAgICAuLi5hZGRyZXNzUG9pbnRzLmZpbHRlcigoYWRkcmVzc1BvaW50KSA9PlxyXG4gICAgICAgIGZpdHNUeXBlKFxyXG4gICAgICAgICAgZ2V0TnVtYmVyQnlUeXBlKHNlcmllc1NwZWMudHlwZSwgYWRkcmVzc1BvaW50KSxcclxuICAgICAgICAgIHNlcmllc1NwZWMudHlwZVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UXVlcnlQYXJhbXMgPSAoXHJcbiAgcGFyYW1zOiBGaW5kQWRkcmVzc1BvaW50c1BhcmFtc1xyXG4pOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0+IHtcclxuICBpZiAocGFyYW1zLnR5cGUgPT09IFwic21kTGluZVwiICYmIHBhcmFtcy5zbWRMaW5lLnR5cGUgPT09IFwic3RyZWV0XCIpIHtcclxuICAgIHJldHVybiBbcGFyYW1zLnNtZExpbmUuc3RyZWV0LCBwYXJhbXMubXVuaWNpcGFsaXR5LmNvZGVdO1xyXG4gIH1cclxuXHJcbiAgaWYgKFxyXG4gICAgKHBhcmFtcy50eXBlID09PSBcInNtZExpbmVcIiAmJiBwYXJhbXMuc21kTGluZS50eXBlID09PSBcIm11bmljaXBhbGl0eVBhcnRcIikgfHxcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5UGFydFwiXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gW3BhcmFtcy5tdW5pY2lwYWxpdHlQYXJ0Q29kZV07XHJcbiAgfVxyXG5cclxuICByZXR1cm4gW3BhcmFtcy5tdW5pY2lwYWxpdHkuY29kZV07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0U3RyZWV0Sm9pbkNvbmRpdGlvbiA9IChcclxuICBwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zXHJcbik6IHN0cmluZyA9PiB7XHJcbiAgaWYgKHBhcmFtcy50eXBlID09PSBcInNtZExpbmVcIiAmJiBwYXJhbXMuc21kTGluZS50eXBlID09PSBcInN0cmVldFwiKSB7XHJcbiAgICByZXR1cm4gYEpPSU4gc3RyZWV0IHMgT04gYS5zdHJlZXRfY29kZSA9IHMuY29kZSBBTkQgcy5uYW1lID0gPyAke1xyXG4gICAgICBpc1NxbGl0ZShnZXRLbmV4RGIoKSkgPyBcIkNPTExBVEUgTk9DQVNFXCIgOiBcIlwiXHJcbiAgICB9YDtcclxuICB9XHJcbiAgcmV0dXJuIFwiTEVGVCBKT0lOIHN0cmVldCBzIE9OIGEuc3RyZWV0X2NvZGUgPSBzLmNvZGVcIjtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRXaGVyZUNvbmRpdGlvbiA9IChwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zKTogc3RyaW5nID0+IHtcclxuICBpZiAoXHJcbiAgICAocGFyYW1zLnR5cGUgPT09IFwic21kTGluZVwiICYmIHBhcmFtcy5zbWRMaW5lLnR5cGUgPT09IFwibXVuaWNpcGFsaXR5UGFydFwiKSB8fFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlQYXJ0XCJcclxuICApIHtcclxuICAgIHJldHVybiBcImEubXVuaWNpcGFsaXR5X3BhcnRfY29kZSA9ID9cIjtcclxuICB9XHJcblxyXG4gIGlmIChwYXJhbXMudHlwZSA9PT0gXCJ3aG9sZU11bmljaXBhbGl0eU5vU3RyZWV0TmFtZVwiKSB7XHJcbiAgICByZXR1cm4gYCR7Z2V0TXVuaWNpcGFsaXR5V2hlcmUoXHJcbiAgICAgIFwiYVwiLFxyXG4gICAgICBwYXJhbXMubXVuaWNpcGFsaXR5XHJcbiAgICApfSBBTkQgYS5zdHJlZXRfY29kZSBJUyBOVUxMYDtcclxuICB9XHJcblxyXG4gIHJldHVybiBnZXRNdW5pY2lwYWxpdHlXaGVyZShcImFcIiwgcGFyYW1zLm11bmljaXBhbGl0eSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJblJhbmdlID0gKFxyXG4gIG51bWJlcjogbnVtYmVyIHwgbnVsbCxcclxuICBsZXR0ZXI6IHN0cmluZyB8IG51bGwsXHJcbiAgcmFuZ2U6IFJhbmdlU3BlY1xyXG4pOiBib29sZWFuID0+IHtcclxuICBpZiAobnVtYmVyID09PSBudWxsKSB7XHJcbiAgICByZXR1cm4gIXJhbmdlLmZyb20gJiYgIXJhbmdlLnRvO1xyXG4gIH1cclxuXHJcbiAgLy8gZXhwbGFpbmVyOiBlaXRoZXIgdGhlIGxvd2VyIGJvdW5kIGlzIG5vdCBzZXQsIG9yIGl0IGlzIGxvd2VyIHRoYW4gdGhlIG51bWJlclxyXG4gIC8vIGlmIGl0J3MgZXF1YWwgdG8gdGhlIG51bWJlciwgd2UgYWxzbyBoYXZlIHRvIGNoZWNrIHRoZSBsZXR0ZXIgLSBpZiBpdCdzIG5vdCBzZXQsIHdlIGRvbid0IGNhcmVcclxuICAvLyBpZiBmcm9tLmxldHRlciBpcyBzZXQsIHdlIG5lZWQgdG8gaGF2ZSBhIGxldHRlciBzZXQgYW5kIGl0IGhhcyB0byBiZSBncmVhdGVyIG9yIGVxdWFsOlxyXG4gIC8vIG51bWJlciB3aXRob3V0IGxldHRlciBjb3VudHMgbG93ZXIgdGhhbiBudW1iZXIgd2l0aCBsZXR0ZXIgJ2EnIChlLmcuIDIzIDwgMjNhKVxyXG4gIGNvbnN0IHNhdGlzZmllc0Zyb20gPVxyXG4gICAgIXJhbmdlLmZyb20gfHxcclxuICAgIG51bWJlciA+IHJhbmdlLmZyb20ubnVtYmVyIHx8XHJcbiAgICAobnVtYmVyID09PSByYW5nZS5mcm9tLm51bWJlciAmJlxyXG4gICAgICAoIXJhbmdlLmZyb20ubGV0dGVyIHx8ICghIWxldHRlciAmJiBsZXR0ZXIgPj0gcmFuZ2UuZnJvbS5sZXR0ZXIpKSk7XHJcblxyXG4gIGNvbnN0IHNhdGlzZmllc1RvID1cclxuICAgICFyYW5nZS50byB8fFxyXG4gICAgbnVtYmVyIDwgcmFuZ2UudG8ubnVtYmVyIHx8XHJcbiAgICAobnVtYmVyID09PSByYW5nZS50by5udW1iZXIgJiZcclxuICAgICAgKCFsZXR0ZXIgfHxcclxuICAgICAgICAoISFyYW5nZS50by5sZXR0ZXIgJiYgISFsZXR0ZXIgJiYgbGV0dGVyIDw9IHJhbmdlLnRvLmxldHRlcikpKTtcclxuXHJcbiAgcmV0dXJuIHNhdGlzZmllc0Zyb20gJiYgc2F0aXNmaWVzVG87XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZml0c1R5cGUgPSAobnVtYmVyOiBudW1iZXIgfCBudWxsLCB0eXBlOiBTZXJpZXNUeXBlKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIHR5cGUgPT09IFNlcmllc1R5cGUuRGVzY3JpcHRpb24gfHxcclxuICAgIHR5cGUgPT09IFNlcmllc1R5cGUuQWxsIHx8XHJcbiAgICAodHlwZSA9PT0gU2VyaWVzVHlwZS5PZGQgJiYgbnVtYmVyICUgMiA9PT0gMSkgfHxcclxuICAgICh0eXBlID09PSBTZXJpZXNUeXBlLkV2ZW4gJiYgbnVtYmVyICUgMiA9PT0gMClcclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGVxdWFsc0Z1bGxTdHJlZXROdW1iZXIgPSAoXHJcbiAgZnVsbFN0cmVldE51bWJlcjogRnVsbFN0cmVldE51bWJlcixcclxuICBhZGRyZXNzUG9pbnQ6IEFkZHJlc3NQb2ludFxyXG4pOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgZnVsbFN0cmVldE51bWJlci5kZXNjcmlwdGlvbk51bWJlci5udW1iZXIgPT09IGFkZHJlc3NQb2ludC5ob3VzZU51bWJlciAmJlxyXG4gICAgZnVsbFN0cmVldE51bWJlci5vcmllbnRhdGlvbmFsTnVtYmVyLm51bWJlciA9PT1cclxuICAgICAgYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXIgJiZcclxuICAgICgoIWZ1bGxTdHJlZXROdW1iZXIub3JpZW50YXRpb25hbE51bWJlci5sZXR0ZXIgJiZcclxuICAgICAgIWFkZHJlc3NQb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyKSB8fFxyXG4gICAgICBmdWxsU3RyZWV0TnVtYmVyLm9yaWVudGF0aW9uYWxOdW1iZXIubGV0dGVyID09PVxyXG4gICAgICAgIGFkZHJlc3NQb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyKVxyXG4gICk7XHJcbn07XHJcblxyXG5jb25zdCBnZXROdW1iZXJCeVR5cGUgPSAoXHJcbiAgdHlwZTogU2VyaWVzVHlwZSxcclxuICBhZGRyZXNzUG9pbnQ6IEFkZHJlc3NQb2ludFxyXG4pOiBudW1iZXIgfCBudWxsID0+IHtcclxuICByZXR1cm4gdHlwZSA9PT0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvblxyXG4gICAgPyBhZGRyZXNzUG9pbnQuaG91c2VOdW1iZXJcclxuICAgIDogYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXIgPz8gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGdldE11bmljaXBhbGl0eVdoZXJlID0gKFxyXG4gIGFsaWFzOiBzdHJpbmcsXHJcbiAgbXVuaWNpcGFsaXR5OiBNdW5pY2lwYWxpdHlcclxuKTogc3RyaW5nID0+IHtcclxuICByZXR1cm4gbXVuaWNpcGFsaXR5LnR5cGUgPT09IE11bmljaXBhbGl0eVR5cGUuQ2l0eVxyXG4gICAgPyBgJHthbGlhc30uY2l0eV9jb2RlID0gP2BcclxuICAgIDogYCR7YWxpYXN9LmNpdHlfZGlzdHJpY3RfY29kZSA9ID9gO1xyXG59O1xyXG5cclxuY29uc3Qgcm93VG9BZGRyZXNzUG9pbnQgPSAocm93OiBhbnkpOiBBZGRyZXNzUG9pbnQgPT4ge1xyXG4gIGNvbnN0IHBvaW50OiBBZGRyZXNzUG9pbnQgPSB7XHJcbiAgICBpZDogcm93LmlkLFxyXG4gICAgYWRkcmVzczogXCJcIixcclxuICAgIHR5cGU6XHJcbiAgICAgIHJvdy5vYmplY3RfdHlwZV9uYW1lID09PSBEZXNjcmlwdGl2ZVR5cGVcclxuICAgICAgICA/IEFkZHJlc3NQb2ludFR5cGUuRGVzY3JpcHRpb25cclxuICAgICAgICA6IEFkZHJlc3NQb2ludFR5cGUuUmVnaXN0cmF0aW9uLFxyXG4gICAgaG91c2VOdW1iZXI6IHJvdy5kZXNjcmlwdGl2ZV9udW1iZXIsXHJcbiAgICBjaXR5OiByb3cuY2l0eV9uYW1lLFxyXG4gICAgbXVuaWNpcGFsaXR5UGFydDogcm93Lm11bmljaXBhbGl0eV9wYXJ0X25hbWUsXHJcbiAgICBwb3N0YWxDb2RlOiByb3cucG9zdGFsX2NvZGUsXHJcbiAgICBsYXQ6IHJvdy53Z3M4NF9sYXRpdHVkZSxcclxuICAgIGxuZzogcm93Lndnczg0X2xvbmdpdHVkZSxcclxuICB9O1xyXG4gIGlmIChyb3cuc3RyZWV0X25hbWUgIT09IG51bGwpIHtcclxuICAgIHBvaW50LnN0cmVldCA9IHJvdy5zdHJlZXRfbmFtZTtcclxuICB9XHJcbiAgaWYgKHJvdy5vcmllbnRhdGlvbmFsX251bWJlciAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQub3JpZW50YXRpb25hbE51bWJlciA9IHJvdy5vcmllbnRhdGlvbmFsX251bWJlcjtcclxuICB9XHJcbiAgaWYgKHJvdy5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXIgIT09IG51bGwpIHtcclxuICAgIHBvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXIgPSByb3cub3JpZW50YXRpb25hbF9udW1iZXJfbGV0dGVyO1xyXG4gIH1cclxuICBpZiAocm93LmRpc3RyaWN0X25hbWUgIT09IG51bGwpIHtcclxuICAgIHBvaW50LmRpc3RyaWN0ID0gcm93LmRpc3RyaWN0X25hbWU7XHJcbiAgfVxyXG4gIGlmIChyb3cucHJhZ3VlX2Rpc3RyaWN0X25hbWUgIT09IG51bGwpIHtcclxuICAgIHBvaW50LnByYWd1ZURpc3RyaWN0ID0gcm93LnByYWd1ZV9kaXN0cmljdF9uYW1lO1xyXG4gIH1cclxuICBwb2ludC5hZGRyZXNzID0gY3JlYXRlU2luZ2xlTGluZUFkZHJlc3MocG9pbnQpO1xyXG4gIHJldHVybiBwb2ludDtcclxufTtcclxuIl19
package/dist/db/cities.js CHANGED
@@ -1,12 +1,3 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import chunk from "lodash/chunk";
11
2
  import { extractKeyValuesPairs, getKnexDb, insertMultipleRows, rawQuery, } from "./db";
12
3
  const citiesColumn = {
@@ -20,11 +11,11 @@ const citiesColumn = {
20
11
  latitude: 7,
21
12
  longitude: 8,
22
13
  };
23
- export const insertCityPositions = (data) => __awaiter(void 0, void 0, void 0, function* () {
14
+ export const insertCityPositions = async (data) => {
24
15
  let changes = 0;
25
16
  // cities are most likely already inserted, but in case they're not,
26
17
  // we need to insert them before updating them with region data
27
- changes += yield insertCities(data);
18
+ changes += await insertCities(data);
28
19
  const prev = changes;
29
20
  for (const arrayChunk of chunk(data, 1000)) {
30
21
  const queries = [];
@@ -35,30 +26,33 @@ export const insertCityPositions = (data) => __awaiter(void 0, void 0, void 0, f
35
26
  row[citiesColumn.cityCode],
36
27
  ]));
37
28
  }
38
- yield Promise.all(queries);
29
+ await Promise.all(queries);
39
30
  changes += queries.length;
40
31
  console.log(`Done ${changes - prev} / ${data.length} rows...`);
41
32
  }
42
33
  return changes;
43
- });
44
- export const insertCities = (buffer) => __awaiter(void 0, void 0, void 0, function* () {
45
- return yield insertMultipleRows(extractKeyValuesPairs(buffer, citiesColumn.cityCode, [
34
+ };
35
+ export const insertCities = async (buffer) => {
36
+ return await insertMultipleRows(extractKeyValuesPairs(buffer, citiesColumn.cityCode, [
46
37
  citiesColumn.cityName,
47
38
  ]), "city", ["code", "name"]);
48
- });
49
- export const setCityPolygonGeojson = (code, polygon, districtsPolygon) => __awaiter(void 0, void 0, void 0, function* () {
50
- yield getKnexDb()
39
+ };
40
+ export const setCityPolygonGeojson = async (code, polygon, districtsPolygon) => {
41
+ await getKnexDb()
51
42
  .from("city")
52
- .update(Object.assign({ polygon_geojson: JSON.stringify(polygon) }, (districtsPolygon
53
- ? { districts_polygon_geojson: JSON.stringify(districtsPolygon) }
54
- : {})))
43
+ .update({
44
+ polygon_geojson: JSON.stringify(polygon),
45
+ ...(districtsPolygon
46
+ ? { districts_polygon_geojson: JSON.stringify(districtsPolygon) }
47
+ : {}),
48
+ })
55
49
  .where({ code });
56
- });
57
- export const getCityPolygons = (cityCodes) => __awaiter(void 0, void 0, void 0, function* () {
50
+ };
51
+ export const getCityPolygons = async (cityCodes) => {
58
52
  if (cityCodes.size === 0) {
59
53
  return {};
60
54
  }
61
- const cityRows = yield getKnexDb()
55
+ const cityRows = await getKnexDb()
62
56
  .from("city")
63
57
  .select("code", "polygon_geojson")
64
58
  .whereIn("code", Array.from(cityCodes));
@@ -66,17 +60,17 @@ export const getCityPolygons = (cityCodes) => __awaiter(void 0, void 0, void 0,
66
60
  acc[row.code] = JSON.parse(row.polygon_geojson);
67
61
  return acc;
68
62
  }, {});
69
- });
70
- export const getDistrictPolygons = (districtCodes) => __awaiter(void 0, void 0, void 0, function* () {
63
+ };
64
+ export const getDistrictPolygons = async (districtCodes) => {
71
65
  if (districtCodes.size === 0) {
72
66
  return {};
73
67
  }
74
- const cityCodes = (yield getKnexDb()
68
+ const cityCodes = (await getKnexDb()
75
69
  .from("city_district")
76
70
  .select("city_code")
77
71
  .whereIn("code", Array.from(districtCodes))
78
72
  .groupBy("city_code")).map((row) => row.city_code);
79
- const cityRows = yield getKnexDb()
73
+ const cityRows = await getKnexDb()
80
74
  .from("city")
81
75
  .select("code", "districts_polygon_geojson")
82
76
  .whereIn("code", cityCodes);
@@ -89,7 +83,7 @@ export const getDistrictPolygons = (districtCodes) => __awaiter(void 0, void 0,
89
83
  districtPolygons[feature.properties.KOD] = {
90
84
  type: "FeatureCollection",
91
85
  features: [
92
- Object.assign(Object.assign({}, feature), { properties: { code: feature.properties.KOD } }),
86
+ { ...feature, properties: { code: feature.properties.KOD } },
93
87
  ],
94
88
  };
95
89
  }
@@ -97,5 +91,5 @@ export const getDistrictPolygons = (districtCodes) => __awaiter(void 0, void 0,
97
91
  }
98
92
  }
99
93
  return districtPolygons;
100
- });
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2l0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RiL2NpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFDakMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLFFBQVEsR0FDVCxNQUFNLE1BQU0sQ0FBQztBQUlkLE1BQU0sWUFBWSxHQUFHO0lBQ25CLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsVUFBVSxFQUFFLENBQUM7SUFDYixVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7SUFDWCxTQUFTLEVBQUUsQ0FBQztDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUNqQyxJQUFnQixFQUNDLEVBQUU7SUFDbkIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBRWhCLG9FQUFvRTtJQUNwRSwrREFBK0Q7SUFDL0QsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUVyQixLQUFLLE1BQU0sVUFBVSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7UUFDMUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQUssTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFO1lBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsUUFBUSxDQUNOLHdFQUF3RSxFQUN4RTtnQkFDRSxHQUFHLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztnQkFDMUIsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7Z0JBQzNCLEdBQUcsQ0FBQyxZQUFZLENBQUMs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QztTQUMzQyxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTlCLE1BQU0sZ0JBQWdCLEdBQW9CLEVBQUUsQ0FBQztJQUM3QyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRTtRQUMxQixJQUFJLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRTtZQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN6QixHQUFHLENBQUMseUJBQXlCLENBQ2UsQ0FBQztZQUMvQyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZDLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUNyRCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHO3dCQUN6QyxJQUFJLEVBQUUsbUJBQW1CO3dCQUN6QixRQUFRLEVBQUU7NERBQ0gsT0FBTyxLQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTt5QkFDM0Q7cUJBQ0YsQ0FBQztpQkFDSDthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQyxDQUFBLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2h1bmsgZnJvbSBcImxvZGFzaC9jaHVua1wiO1xyXG5pbXBvcnQge1xyXG4gIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyxcclxuICBnZXRLbmV4RGIsXHJcbiAgaW5zZXJ0TXVsdGlwbGVSb3dzLFxyXG4gIHJhd1F1ZXJ5LFxyXG59IGZyb20gXCIuL2RiXCI7XHJcbmltcG9ydCB7IEZlYXR1cmVDb2xsZWN0aW9uLCBNdWx0aVBvbHlnb24sIFBvbHlnb24gfSBmcm9tIFwiQHR1cmYvaGVscGVyc1wiO1xyXG5pbXBvcnQgeyBQb2x5Z29uc0J5Q29kZXMgfSBmcm9tIFwiLi90eXBlc1wiO1xyXG5cclxuY29uc3QgY2l0aWVzQ29sdW1uID0ge1xyXG4gIGNpdHlOYW1lOiAwLFxyXG4gIGNpdHlDb2RlOiAxLFxyXG4gIGNvdW50eU5hbWU6IDIsXHJcbiAgY291bnR5Q29kZTogMyxcclxuICByZWdpb25OYW1lOiA0LFxyXG4gIHJlZ2lvbkNvZGU6IDUsXHJcbiAgcG9zdGFsQ29kZTogNixcclxuICBsYXRpdHVkZTogNyxcclxuICBsb25naXR1ZGU6IDgsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaW5zZXJ0Q2l0eVBvc2l0aW9ucyA9IGFzeW5jIChcclxuICBkYXRhOiBzdHJpbmdbXVtdXHJcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgbGV0IGNoYW5nZXMgPSAwO1xyXG5cclxuICAvLyBjaXRpZXMgYXJlIG1vc3QgbGlrZWx5IGFscmVhZHkgaW5zZXJ0ZWQsIGJ1dCBpbiBjYXNlIHRoZXkncmUgbm90LFxyXG4gIC8vIHdlIG5lZWQgdG8gaW5zZXJ0IHRoZW0gYmVmb3JlIHVwZGF0aW5nIHRoZW0gd2l0aCByZWdpb24gZGF0YVxyXG4gIGNoYW5nZXMgKz0gYXdhaXQgaW5zZXJ0Q2l0aWVzKGRhdGEpO1xyXG4gIGNvbnN0IHByZXYgPSBjaGFuZ2VzO1xyXG5cclxuICBmb3IgKGNvbnN0IGFycmF5Q2h1bmsgb2YgY2h1bmsoZGF0YSwgMTAwMCkpIHtcclxuICAgIGNvbnN0IHF1ZXJpZXMgPSBbXTtcclxuICAgIGZvciAoY29uc3Qgcm93IG9mIGFycmF5Q2h1bmspIHtcclxuICAgICAgcXVlcmllcy5wdXNoKFxyXG4gICAgICAgIHJhd1F1ZXJ5KFxyXG4gICAgICAgICAgYFVQREFURSBjaXR5IFNFVCB3Z3M4NF9sYXRpdHVkZSA9ID8sIHdnczg0X2xvbmdpdHVkZSA9ID8gV0hFUkUgY29kZSA9ID9gLFxyXG4gICAgICAgICAgW1xyXG4gICAgICAgICAgICByb3dbY2l0aWVzQ29sdW1uLmxhdGl0dWRlXSxcclxuICAgICAgICAgICAgcm93W2NpdGllc0NvbHVtbi5sb25naXR1ZGVdLFxyXG4gICAgICAgICAgICByb3dbY2l0aWVzQ29sdW1uLmNpdHlDb2RlXSxcclxuICAgICAgICAgIF1cclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKTtcclxuICAgIGNoYW5nZXMgKz0gcXVlcmllcy5sZW5ndGg7XHJcbiAgICBjb25zb2xlLmxvZyhgRG9uZSAke2NoYW5nZXMgLSBwcmV2fSAvICR7ZGF0YS5sZW5ndGh9IHJvd3MuLi5gKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBjaGFuZ2VzO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydENpdGllcyA9IGFzeW5jIChidWZmZXI6IHN0cmluZ1tdW10pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIHJldHVybiBhd2FpdCBpbnNlcnRNdWx0aXBsZVJvd3MoXHJcbiAgICBleHRyYWN0S2V5VmFsdWVzUGFpcnMoYnVmZmVyLCBjaXRpZXNDb2x1bW4uY2l0eUNvZGUsIFtcclxuICAgICAgY2l0aWVzQ29sdW1uLmNpdHlOYW1lLFxyXG4gICAgXSksXHJcbiAgICBcImNpdHlcIixcclxuICAgIFtcImNvZGVcIiwgXCJuYW1lXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRDaXR5UG9seWdvbkdlb2pzb24gPSBhc3luYyAoXHJcbiAgY29kZTogc3RyaW5nLFxyXG4gIHBvbHlnb246IEZlYXR1cmVDb2xsZWN0aW9uLFxyXG4gIGRpc3RyaWN0c1BvbHlnb24/OiBGZWF0dXJlQ29sbGVjdGlvblxyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICBhd2FpdCBnZXRLbmV4RGIoKVxyXG4gICAgLmZyb20oXCJjaXR5XCIpXHJcbiAgICAudXBkYXRlKHtcclxuICAgICAgcG9seWdvbl9nZW9qc29uOiBKU09OLnN0cmluZ2lmeShwb2x5Z29uKSxcclxuICAgICAgLi4uKGRpc3RyaWN0c1BvbHlnb25cclxuICAgICAgICA/IHsgZGlzdHJpY3RzX3BvbHlnb25fZ2VvanNvbjogSlNPTi5zdHJpbmdpZnkoZGlzdHJpY3RzUG9seWdvbikgfVxyXG4gICAgICAgIDoge30pLFxyXG4gICAgfSlcclxuICAgIC53aGVyZSh7IGNvZGUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Q2l0eVBvbHlnb25zID0gYXN5bmMgKFxyXG4gIGNpdHlDb2RlczogU2V0PG51bWJlcj5cclxuKTogUHJvbWlzZTxQb2x5Z29uc0J5Q29kZXM+ID0+IHtcclxuICBpZiAoY2l0eUNvZGVzLnNpemUgPT09IDApIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcbiAgY29uc3QgY2l0eVJvd3MgPSBhd2FpdCBnZXRLbmV4RGIoKVxyXG4gICAgLmZyb20oXCJjaXR5XCIpXHJcbiAgICAuc2VsZWN0KFwiY29kZVwiLCBcInBvbHlnb25fZ2VvanNvblwiKVxyXG4gICAgLndoZXJlSW4oXCJjb2RlXCIsIEFycmF5LmZyb20oY2l0eUNvZGVzKSk7XHJcblxyXG4gIHJldHVybiBjaXR5Um93cy5yZWR1Y2UoKGFjYywgcm93KSA9PiB7XHJcbiAgICBhY2Nbcm93LmNvZGVdID0gSlNPTi5wYXJzZShyb3cucG9seWdvbl9nZW9qc29uKTtcclxuICAgIHJldHVybiBhY2M7XHJcbiAgfSwge30pO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldERpc3RyaWN0UG9seWdvbnMgPSBhc3luYyAoXHJcbiAgZGlzdHJpY3RDb2RlczogU2V0PG51bWJlcj5cclxuKTogUHJvbWlzZTxQb2x5Z29uc0J5Q29kZXM+ID0+IHtcclxuICBpZiAoZGlzdHJpY3RDb2Rlcy5zaXplID09PSAwKSB7XHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG4gIGNvbnN0IGNpdHlDb2RlcyA9IChcclxuICAgIGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAgIC5mcm9tKFwiY2l0eV9kaXN0cmljdFwiKVxyXG4gICAgICAuc2VsZWN0KFwiY2l0eV9jb2RlXCIpXHJcbiAgICAgIC53aGVyZUluKFwiY29kZVwiLCBBcnJheS5mcm9tKGRpc3RyaWN0Q29kZXMpKVxyXG4gICAgICAuZ3JvdXBCeShcImNpdHlfY29kZVwiKVxyXG4gICkubWFwKChyb3cpID0+IHJvdy5jaXR5X2NvZGUpO1xyXG5cclxuICBjb25zdCBjaXR5Um93cyA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuZnJvbShcImNpdHlcIilcclxuICAgIC5zZWxlY3QoXCJjb2RlXCIsIFwiZGlzdHJpY3RzX3BvbHlnb25fZ2VvanNvblwiKVxyXG4gICAgLndoZXJlSW4oXCJjb2RlXCIsIGNpdHlDb2Rlcyk7XHJcblxyXG4gIGNvbnN0IGRpc3RyaWN0UG9seWdvbnM6IFBvbHlnb25zQnlDb2RlcyA9IHt9O1xyXG4gIGZvciAoY29uc3Qgcm93IG9mIGNpdHlSb3dzKSB7XHJcbiAgICBpZiAocm93LmRpc3RyaWN0c19wb2x5Z29uX2dlb2pzb24pIHtcclxuICAgICAgY29uc3QgcG9seWdvbnMgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgIHJvdy5kaXN0cmljdHNfcG9seWdvbl9nZW9qc29uXHJcbiAgICAgICkgYXMgRmVhdHVyZUNvbGxlY3Rpb248UG9seWdvbiB8IE11bHRpUG9seWdvbj47XHJcbiAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBwb2x5Z29ucy5mZWF0dXJlcykge1xyXG4gICAgICAgIGlmIChkaXN0cmljdENvZGVzLmhhcyhOdW1iZXIoZmVhdHVyZS5wcm9wZXJ0aWVzLktPRCkpKSB7XHJcbiAgICAgICAgICBkaXN0cmljdFBvbHlnb25zW2ZlYXR1cmUucHJvcGVydGllcy5LT0RdID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXHJcbiAgICAgICAgICAgIGZlYXR1cmVzOiBbXHJcbiAgICAgICAgICAgICAgeyAuLi5mZWF0dXJlLCBwcm9wZXJ0aWVzOiB7IGNvZGU6IGZlYXR1cmUucHJvcGVydGllcy5LT0QgfSB9LFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBkaXN0cmljdFBvbHlnb25zO1xyXG59O1xyXG4iXX0=
94
+ };
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2l0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RiL2NpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFDakMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLFFBQVEsR0FDVCxNQUFNLE1BQU0sQ0FBQztBQUlkLE1BQU0sWUFBWSxHQUFHO0lBQ25CLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsVUFBVSxFQUFFLENBQUM7SUFDYixVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7SUFDWCxTQUFTLEVBQUUsQ0FBQztDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEVBQ3RDLElBQWdCLEVBQ0MsRUFBRTtJQUNuQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFaEIsb0VBQW9FO0lBQ3BFLCtEQUErRDtJQUMvRCxPQUFPLElBQUksTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBRXJCLEtBQUssTUFBTSxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtRQUMxQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUU7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FDVixRQUFRLENBQ04sd0VBQXdFLEVBQ3hFO2dCQUNFLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUMxQixHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztnQkFDM0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFR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MkJBQTJCLENBQUM7U0FDM0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU5QixNQUFNLGdCQUFnQixHQUFvQixFQUFFLENBQUM7SUFDN0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUU7UUFDMUIsSUFBSSxHQUFHLENBQUMseUJBQXlCLEVBQUU7WUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDekIsR0FBRyxDQUFDLHlCQUF5QixDQUNlLENBQUM7WUFDL0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDckQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRzt3QkFDekMsSUFBSSxFQUFFLG1CQUFtQjt3QkFDekIsUUFBUSxFQUFFOzRCQUNSLEVBQUUsR0FBRyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUU7eUJBQzdEO3FCQUNGLENBQUM7aUJBQ0g7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaHVuayBmcm9tIFwibG9kYXNoL2NodW5rXCI7XHJcbmltcG9ydCB7XHJcbiAgZXh0cmFjdEtleVZhbHVlc1BhaXJzLFxyXG4gIGdldEtuZXhEYixcclxuICBpbnNlcnRNdWx0aXBsZVJvd3MsXHJcbiAgcmF3UXVlcnksXHJcbn0gZnJvbSBcIi4vZGJcIjtcclxuaW1wb3J0IHsgRmVhdHVyZUNvbGxlY3Rpb24sIE11bHRpUG9seWdvbiwgUG9seWdvbiB9IGZyb20gXCJAdHVyZi9oZWxwZXJzXCI7XHJcbmltcG9ydCB7IFBvbHlnb25zQnlDb2RlcyB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5jb25zdCBjaXRpZXNDb2x1bW4gPSB7XHJcbiAgY2l0eU5hbWU6IDAsXHJcbiAgY2l0eUNvZGU6IDEsXHJcbiAgY291bnR5TmFtZTogMixcclxuICBjb3VudHlDb2RlOiAzLFxyXG4gIHJlZ2lvbk5hbWU6IDQsXHJcbiAgcmVnaW9uQ29kZTogNSxcclxuICBwb3N0YWxDb2RlOiA2LFxyXG4gIGxhdGl0dWRlOiA3LFxyXG4gIGxvbmdpdHVkZTogOCxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRDaXR5UG9zaXRpb25zID0gYXN5bmMgKFxyXG4gIGRhdGE6IHN0cmluZ1tdW11cclxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICBsZXQgY2hhbmdlcyA9IDA7XHJcblxyXG4gIC8vIGNpdGllcyBhcmUgbW9zdCBsaWtlbHkgYWxyZWFkeSBpbnNlcnRlZCwgYnV0IGluIGNhc2UgdGhleSdyZSBub3QsXHJcbiAgLy8gd2UgbmVlZCB0byBpbnNlcnQgdGhlbSBiZWZvcmUgdXBkYXRpbmcgdGhlbSB3aXRoIHJlZ2lvbiBkYXRhXHJcbiAgY2hhbmdlcyArPSBhd2FpdCBpbnNlcnRDaXRpZXMoZGF0YSk7XHJcbiAgY29uc3QgcHJldiA9IGNoYW5nZXM7XHJcblxyXG4gIGZvciAoY29uc3QgYXJyYXlDaHVuayBvZiBjaHVuayhkYXRhLCAxMDAwKSkge1xyXG4gICAgY29uc3QgcXVlcmllcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCByb3cgb2YgYXJyYXlDaHVuaykge1xyXG4gICAgICBxdWVyaWVzLnB1c2goXHJcbiAgICAgICAgcmF3UXVlcnkoXHJcbiAgICAgICAgICBgVVBEQVRFIGNpdHkgU0VUIHdnczg0X2xhdGl0dWRlID0gPywgd2dzODRfbG9uZ2l0dWRlID0gPyBXSEVSRSBjb2RlID0gP2AsXHJcbiAgICAgICAgICBbXHJcbiAgICAgICAgICAgIHJvd1tjaXRpZXNDb2x1bW4ubGF0aXR1ZGVdLFxyXG4gICAgICAgICAgICByb3dbY2l0aWVzQ29sdW1uLmxvbmdpdHVkZV0sXHJcbiAgICAgICAgICAgIHJvd1tjaXRpZXNDb2x1bW4uY2l0eUNvZGVdLFxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpO1xyXG4gICAgY2hhbmdlcyArPSBxdWVyaWVzLmxlbmd0aDtcclxuICAgIGNvbnNvbGUubG9nKGBEb25lICR7Y2hhbmdlcyAtIHByZXZ9IC8gJHtkYXRhLmxlbmd0aH0gcm93cy4uLmApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNoYW5nZXM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaW5zZXJ0Q2l0aWVzID0gYXN5bmMgKGJ1ZmZlcjogc3RyaW5nW11bXSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIGNpdGllc0NvbHVtbi5jaXR5Q29kZSwgW1xyXG4gICAgICBjaXRpZXNDb2x1bW4uY2l0eU5hbWUsXHJcbiAgICBdKSxcclxuICAgIFwiY2l0eVwiLFxyXG4gICAgW1wiY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldENpdHlQb2x5Z29uR2VvanNvbiA9IGFzeW5jIChcclxuICBjb2RlOiBzdHJpbmcsXHJcbiAgcG9seWdvbjogRmVhdHVyZUNvbGxlY3Rpb24sXHJcbiAgZGlzdHJpY3RzUG9seWdvbj86IEZlYXR1cmVDb2xsZWN0aW9uXHJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuZnJvbShcImNpdHlcIilcclxuICAgIC51cGRhdGUoe1xyXG4gICAgICBwb2x5Z29uX2dlb2pzb246IEpTT04uc3RyaW5naWZ5KHBvbHlnb24pLFxyXG4gICAgICAuLi4oZGlzdHJpY3RzUG9seWdvblxyXG4gICAgICAgID8geyBkaXN0cmljdHNfcG9seWdvbl9nZW9qc29uOiBKU09OLnN0cmluZ2lmeShkaXN0cmljdHNQb2x5Z29uKSB9XHJcbiAgICAgICAgOiB7fSksXHJcbiAgICB9KVxyXG4gICAgLndoZXJlKHsgY29kZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRDaXR5UG9seWdvbnMgPSBhc3luYyAoXHJcbiAgY2l0eUNvZGVzOiBTZXQ8bnVtYmVyPlxyXG4pOiBQcm9taXNlPFBvbHlnb25zQnlDb2Rlcz4gPT4ge1xyXG4gIGlmIChjaXR5Q29kZXMuc2l6ZSA9PT0gMCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICBjb25zdCBjaXR5Um93cyA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuZnJvbShcImNpdHlcIilcclxuICAgIC5zZWxlY3QoXCJjb2RlXCIsIFwicG9seWdvbl9nZW9qc29uXCIpXHJcbiAgICAud2hlcmVJbihcImNvZGVcIiwgQXJyYXkuZnJvbShjaXR5Q29kZXMpKTtcclxuXHJcbiAgcmV0dXJuIGNpdHlSb3dzLnJlZHVjZSgoYWNjLCByb3cpID0+IHtcclxuICAgIGFjY1tyb3cuY29kZV0gPSBKU09OLnBhcnNlKHJvdy5wb2x5Z29uX2dlb2pzb24pO1xyXG4gICAgcmV0dXJuIGFjYztcclxuICB9LCB7fSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RGlzdHJpY3RQb2x5Z29ucyA9IGFzeW5jIChcclxuICBkaXN0cmljdENvZGVzOiBTZXQ8bnVtYmVyPlxyXG4pOiBQcm9taXNlPFBvbHlnb25zQnlDb2Rlcz4gPT4ge1xyXG4gIGlmIChkaXN0cmljdENvZGVzLnNpemUgPT09IDApIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcbiAgY29uc3QgY2l0eUNvZGVzID0gKFxyXG4gICAgYXdhaXQgZ2V0S25leERiKClcclxuICAgICAgLmZyb20oXCJjaXR5X2Rpc3RyaWN0XCIpXHJcbiAgICAgIC5zZWxlY3QoXCJjaXR5X2NvZGVcIilcclxuICAgICAgLndoZXJlSW4oXCJjb2RlXCIsIEFycmF5LmZyb20oZGlzdHJpY3RDb2RlcykpXHJcbiAgICAgIC5ncm91cEJ5KFwiY2l0eV9jb2RlXCIpXHJcbiAgKS5tYXAoKHJvdykgPT4gcm93LmNpdHlfY29kZSk7XHJcblxyXG4gIGNvbnN0IGNpdHlSb3dzID0gYXdhaXQgZ2V0S25leERiKClcclxuICAgIC5mcm9tKFwiY2l0eVwiKVxyXG4gICAgLnNlbGVjdChcImNvZGVcIiwgXCJkaXN0cmljdHNfcG9seWdvbl9nZW9qc29uXCIpXHJcbiAgICAud2hlcmVJbihcImNvZGVcIiwgY2l0eUNvZGVzKTtcclxuXHJcbiAgY29uc3QgZGlzdHJpY3RQb2x5Z29uczogUG9seWdvbnNCeUNvZGVzID0ge307XHJcbiAgZm9yIChjb25zdCByb3cgb2YgY2l0eVJvd3MpIHtcclxuICAgIGlmIChyb3cuZGlzdHJpY3RzX3BvbHlnb25fZ2VvanNvbikge1xyXG4gICAgICBjb25zdCBwb2x5Z29ucyA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgcm93LmRpc3RyaWN0c19wb2x5Z29uX2dlb2pzb25cclxuICAgICAgKSBhcyBGZWF0dXJlQ29sbGVjdGlvbjxQb2x5Z29uIHwgTXVsdGlQb2x5Z29uPjtcclxuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHBvbHlnb25zLmZlYXR1cmVzKSB7XHJcbiAgICAgICAgaWYgKGRpc3RyaWN0Q29kZXMuaGFzKE51bWJlcihmZWF0dXJlLnByb3BlcnRpZXMuS09EKSkpIHtcclxuICAgICAgICAgIGRpc3RyaWN0UG9seWdvbnNbZmVhdHVyZS5wcm9wZXJ0aWVzLktPRF0gPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcclxuICAgICAgICAgICAgZmVhdHVyZXM6IFtcclxuICAgICAgICAgICAgICB7IC4uLmZlYXR1cmUsIHByb3BlcnRpZXM6IHsgY29kZTogZmVhdHVyZS5wcm9wZXJ0aWVzLktPRCB9IH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRpc3RyaWN0UG9seWdvbnM7XHJcbn07XHJcbiJdfQ==