text-to-map 1.1.28 → 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 (58) hide show
  1. package/dist/bin/address-points.js +1 -0
  2. package/dist/bin/cities.js +1 -0
  3. package/dist/bin/clear-all.js +8 -18
  4. package/dist/bin/constants.js +1 -0
  5. package/dist/bin/generate-syntax-diagrams.js +1 -0
  6. package/dist/bin/init-db.js +5 -15
  7. package/dist/bin/knex.js +6 -16
  8. package/dist/bin/parse-ordinance.js +60 -71
  9. package/dist/bin/polygons.js +23 -32
  10. package/dist/bin/regions.js +1 -0
  11. package/dist/bin/schools.js +1 -0
  12. package/dist/bin/streets.js +1 -0
  13. package/dist/bin/sync-all.js +1 -0
  14. package/dist/db/address-points.js +43 -54
  15. package/dist/db/cities.d.ts +5 -3
  16. package/dist/db/cities.js +56 -25
  17. package/dist/db/db.js +24 -32
  18. package/dist/db/founders.js +104 -91
  19. package/dist/db/meta.js +12 -20
  20. package/dist/db/migrations/20230704125715_initial.js +291 -303
  21. package/dist/db/migrations/20230731232915_city_positions.js +9 -21
  22. package/dist/db/migrations/20240106224603_city_polygon.js +7 -19
  23. package/dist/db/migrations/20240320200534_district_polygon.js +11 -0
  24. package/dist/db/migrations/20240729211323_ordinance_city.js +11 -0
  25. package/dist/db/regions.js +20 -28
  26. package/dist/db/schools.d.ts +1 -1
  27. package/dist/db/schools.js +18 -23
  28. package/dist/db/street-sync.js +13 -21
  29. package/dist/db/sync-log.js +25 -33
  30. package/dist/db/types.d.ts +3 -1
  31. package/dist/db/types.js +2 -1
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +12 -22
  34. package/dist/open-data-sync/address-points.js +21 -29
  35. package/dist/open-data-sync/cities.js +10 -18
  36. package/dist/open-data-sync/common.js +8 -16
  37. package/dist/open-data-sync/regions.js +13 -21
  38. package/dist/open-data-sync/schools.js +20 -28
  39. package/dist/open-data-sync/streets.js +40 -39
  40. package/dist/smd-to-csv/json-to-csv.js +1 -0
  41. package/dist/smd-to-csv/ordinance-to-csv-rules.js +4 -12
  42. package/dist/smd-to-csv/txt-to-json.js +59 -69
  43. package/dist/street-markdown/municipality.js +26 -28
  44. package/dist/street-markdown/polygons.d.ts +7 -4
  45. package/dist/street-markdown/polygons.js +190 -44
  46. package/dist/street-markdown/roman-numerals.js +1 -0
  47. package/dist/street-markdown/smd-line-parser.js +6 -8
  48. package/dist/street-markdown/smd-parser.js +2 -2
  49. package/dist/street-markdown/smd.d.ts +7 -1
  50. package/dist/street-markdown/smd.js +190 -164
  51. package/dist/street-markdown/token-definition.js +1 -0
  52. package/dist/street-markdown/types.d.ts +21 -11
  53. package/dist/street-markdown/types.js +3 -2
  54. package/dist/utils/atom.js +9 -17
  55. package/dist/utils/helpers.d.ts +3 -1
  56. package/dist/utils/helpers.js +12 -4
  57. package/dist/utils/jtsk2wgs84.js +1 -0
  58. 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,17 +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* () {
183
- 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* () {
172
+ };
173
+ const getAllStreets = async (cityCode) => {
187
174
  const knex = getKnexDb();
175
+ return await knex.pluck("name").from("street").where("city_code", cityCode);
176
+ };
177
+ export const findAddressPoints = async (params) => {
188
178
  const queryParams = getQueryParams(params);
189
179
  const streetJoinCondition = getStreetJoinCondition(params);
190
180
  const whereCondition = getWhereCondition(params);
191
- 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,
192
182
  a.orientational_number, a.orientational_number_letter, c.name AS city_name,
193
183
  d.name AS district_name, m.name AS municipality_part_name, p.name AS prague_district_name,
194
184
  a.postal_code, a.wgs84_latitude, a.wgs84_longitude
@@ -201,7 +191,7 @@ export const findAddressPoints = (params) => __awaiter(void 0, void 0, void 0, f
201
191
  LEFT JOIN prague_district p ON a.prague_district_code = p.code
202
192
  WHERE ${whereCondition}`, queryParams);
203
193
  return filterAddressPoints(queryResult.map(rowToAddressPoint), params);
204
- });
194
+ };
205
195
  export const filterAddressPoints = (addressPoints, params) => {
206
196
  if (params.type === "wholeMunicipality" ||
207
197
  params.type === "wholeMunicipalityNoStreetName" ||
@@ -230,11 +220,10 @@ const filterAddressPointsByRanges = (addressPoints, seriesSpec) => {
230
220
  const result = [];
231
221
  seriesSpec.ranges.forEach((range) => {
232
222
  result.push(...addressPoints.filter((addressPoint) => {
233
- var _a;
234
223
  if (isRange(range)) {
235
224
  const number = getNumberByType(seriesSpec.type, addressPoint);
236
225
  return (isInRange(number, seriesSpec.type !== SeriesType.Description
237
- ? (_a = addressPoint.orientationalNumberLetter) !== null && _a !== void 0 ? _a : null
226
+ ? addressPoint.orientationalNumberLetter ?? null
238
227
  : null, range) && fitsType(number, seriesSpec.type));
239
228
  }
240
229
  else {
@@ -310,10 +299,9 @@ export const equalsFullStreetNumber = (fullStreetNumber, addressPoint) => {
310
299
  addressPoint.orientationalNumberLetter));
311
300
  };
312
301
  const getNumberByType = (type, addressPoint) => {
313
- var _a;
314
302
  return type === SeriesType.Description
315
303
  ? addressPoint.houseNumber
316
- : (_a = addressPoint.orientationalNumber) !== null && _a !== void 0 ? _a : null;
304
+ : addressPoint.orientationalNumber ?? null;
317
305
  };
318
306
  const getMunicipalityWhere = (alias, municipality) => {
319
307
  return municipality.type === MunicipalityType.City
@@ -352,3 +340,4 @@ const rowToAddressPoint = (row) => {
352
340
  point.address = createSingleLineAddress(point);
353
341
  return point;
354
342
  };
343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy1wb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvYWRkcmVzcy1wb2ludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFLTCxVQUFVLEVBR1Ysb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxpQkFBaUIsR0FDbEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsY0FBYyxFQUNkLFFBQVEsR0FDVCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBQXlCLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWxFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUMvQixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztBQUVqQyxNQUFNLFdBQVcsR0FBRztJQUNsQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Q0FDdEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRztJQUNwQixPQUFPLEVBQUUsQ0FBQztJQUNWLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxZQUFZLEVBQUUsQ0FBQztJQUNmLFlBQVksRUFBRSxDQUFDO0lBQ2Ysa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLG9CQUFvQixFQUFFLENBQUM7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LG9CQUFvQixLQUFLLElBQUksRUFBRTtRQUNyQyxLQUFLLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztLQUNqRDtJQUNELEtBQUssQ0FBQyxPQUFPLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZGRyZXNzUG9pbnRUeXBlLCBjcmVhdGVTaW5nbGVMaW5lQWRkcmVzcyB9IGZyb20gXCJjemVjaC1hZGRyZXNzXCI7XHJcbmltcG9ydCB7XHJcbiAgQWRkcmVzc1BvaW50LFxyXG4gIEZ1bGxTdHJlZXROdW1iZXIsXHJcbiAgUmFuZ2VTcGVjLFxyXG4gIFNlcmllc1NwZWMsXHJcbiAgU2VyaWVzVHlwZSxcclxuICBTbWRFcnJvcixcclxuICBTbWRMaW5lLFxyXG4gIGlzTmVnYXRpdmVTZXJpZXNTcGVjLFxyXG4gIGlzUmFuZ2UsXHJcbiAgaXNTZXJpZXNTcGVjQXJyYXksXHJcbn0gZnJvbSBcIi4uL3N0cmVldC1tYXJrZG93bi90eXBlc1wiO1xyXG5pbXBvcnQgeyBmaW5kQ2xvc2VzdFN0cmluZyB9IGZyb20gXCIuLi91dGlscy9oZWxwZXJzXCI7XHJcbmltcG9ydCBqdHNrMndnczg0IGZyb20gXCIuLi91dGlscy9qdHNrMndnczg0XCI7XHJcbmltcG9ydCB7XHJcbiAgZXh0cmFjdEtleVZhbHVlc1BhaXJzLFxyXG4gIGdlbmVyYXRlMkRQbGFjZWhvbGRlcnMsXHJcbiAgZ2V0S25leERiLFxyXG4gIGluc2VydE11bHRpcGxlUm93cyxcclxuICBpc015c3FsLFxyXG4gIGlzU3FsaXRlLFxyXG4gIG5vbkVtcHR5T3JOdWxsLFxyXG4gIHJhd1F1ZXJ5LFxyXG59IGZyb20gXCIuL2RiXCI7XHJcbmltcG9ydCB7IGdldEZvdW5kZXJDaXR5Q29kZSB9IGZyb20gXCIuL2ZvdW5kZXJzXCI7XHJcbmltcG9ydCB7IEZvdW5kZXIsIE11bmljaXBhbGl0eSwgTXVuaWNpcGFsaXR5VHlwZSB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5jb25zdCBEZXNjcmlwdGl2ZVR5cGUgPSBcIsSNLnAuXCI7XHJcbmNvbnN0IFJlZ2lzdHJhdGlvblR5cGUgPSBcIsSNLmV2LlwiO1xyXG5cclxuY29uc3QgT2JqZWN0VHlwZXMgPSB7XHJcbiAgW0Rlc2NyaXB0aXZlVHlwZV06IDEsXHJcbiAgW1JlZ2lzdHJhdGlvblR5cGVdOiAyLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IENvbHVtbiA9IHtcclxuICBhZG1Db2RlOiAwLFxyXG4gIGNpdHlDb2RlOiAxLFxyXG4gIGNpdHlOYW1lOiAyLFxyXG4gIGRpc3RyaWN0Q29kZTogMyxcclxuICBkaXN0cmljdE5hbWU6IDQsXHJcbiAgcHJhZ3VlRGlzdHJpY3RDb2RlOiA1LFxyXG4gIHByYWd1ZURpc3RyaWN0TmFtZTogNixcclxuICBtdW5pY2lwYWxpdHlQYXJ0Q29kZTogNyxcclxuICBtdW5pY2lwYWxpdHlQYXJ0TmFtZTogOCxcclxuICBzdHJlZXRDb2RlOiA5LFxyXG4gIHN0cmVldE5hbWU6IDEwLFxyXG4gIG9iamVjdFR5cGU6IDExLFxyXG4gIGhvdXNlTnVtYmVyOiAxMixcclxuICBvcmllbnRhdGlvbmFsTnVtYmVyOiAxMyxcclxuICBvcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyOiAxNCxcclxuICBwb3N0YWxDb2RlOiAxNSxcclxuICB5Q29vcmRpbmF0ZTogMTYsXHJcbiAgeENvb3JkaW5hdGU6IDE3LFxyXG4gIHZhbGlkRnJvbTogMTgsXHJcbn07XHJcblxyXG5jb25zdCBjb2x1bW5OYW1lcyA9IFtcclxuICBcImlkXCIsXHJcbiAgXCJzdHJlZXRfY29kZVwiLFxyXG4gIFwib2JqZWN0X3R5cGVfaWRcIixcclxuICBcImRlc2NyaXB0aXZlX251bWJlclwiLFxyXG4gIFwib3JpZW50YXRpb25hbF9udW1iZXJcIixcclxuICBcIm9yaWVudGF0aW9uYWxfbnVtYmVyX2xldHRlclwiLFxyXG4gIFwiY2l0eV9jb2RlXCIsXHJcbiAgXCJjaXR5X2Rpc3RyaWN0X2NvZGVcIixcclxuICBcIm11bmljaXBhbGl0eV9wYXJ0X2NvZGVcIixcclxuICBcInByYWd1ZV9kaXN0cmljdF9jb2RlXCIsXHJcbiAgXCJwb3N0YWxfY29kZVwiLFxyXG4gIFwianRza194XCIsXHJcbiAgXCJqdHNrX3lcIixcclxuICBcIndnczg0X2xhdGl0dWRlXCIsXHJcbiAgXCJ3Z3M4NF9sb25naXR1ZGVcIixcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBjb21taXRBZGRyZXNzUG9pbnRzID0gYXN5bmMgKFxyXG4gIGJ1ZmZlcjogc3RyaW5nW11bXVxyXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcbiAgYXdhaXQgaW5zZXJ0Q2l0aWVzKGJ1ZmZlcik7XHJcbiAgYXdhaXQgaW5zZXJ0RGlzdHJpY3RzKGJ1ZmZlcik7XHJcbiAgYXdhaXQgaW5zZXJ0TXVuaWNpcGFsaXR5UGFydHMoYnVmZmVyKTtcclxuICBhd2FpdCBpbnNlcnRTdHJlZXRzKGJ1ZmZlcik7XHJcbiAgYXdhaXQgaW5zZXJ0UHJhZ3VlRGlzdHJpY3RzKGJ1ZmZlcik7XHJcblxyXG4gIGNvbnN0IHBhcmFtczogKHN0cmluZyB8IG51bGwpW10gPSBbXTtcclxuICBidWZmZXIuZm9yRWFjaCgoZGF0YSkgPT4ge1xyXG4gICAgbGV0IGxhdE9yTnVsbDogc3RyaW5nLCBsb25Pck51bGw6IHN0cmluZztcclxuICAgIGxhdE9yTnVsbCA9IG51bGw7XHJcbiAgICBsb25Pck51bGwgPSBudWxsO1xyXG4gICAgaWYgKGRhdGFbQ29sdW1uLnhDb29yZGluYXRlXSAmJiBkYXRhW0NvbHVtbi55Q29vcmRpbmF0ZV0pIHtcclxuICAgICAgY29uc3QgeyBsYXQsIGxvbiB9ID0ganRzazJ3Z3M4NChcclxuICAgICAgICBwYXJzZUZsb2F0KGRhdGFbQ29sdW1uLnhDb29yZGluYXRlXSksXHJcbiAgICAgICAgcGFyc2VGbG9hdChkYXRhW0NvbHVtbi55Q29vcmRpbmF0ZV0pXHJcbiAgICAgICk7XHJcbiAgICAgIFtsYXRPck51bGwsIGxvbk9yTnVsbF0gPSBbbGF0LnRvU3RyaW5nKCksIGxvbi50b1N0cmluZygpXTtcclxuICAgIH1cclxuICAgIHBhcmFtcy5wdXNoKFxyXG4gICAgICBkYXRhW0NvbHVtbi5hZG1Db2RlXSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4uc3RyZWV0Q29kZV0pLFxyXG4gICAgICBPYmplY3RUeXBlc1tkYXRhW0NvbHVtbi5vYmplY3RUeXBlXV0sXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLmhvdXNlTnVtYmVyXSksXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLm9yaWVudGF0aW9uYWxOdW1iZXJdKSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4ub3JpZW50YXRpb25hbE51bWJlckxldHRlcl0pLFxyXG4gICAgICBkYXRhW0NvbHVtbi5jaXR5Q29kZV0sXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLmRpc3RyaWN0Q29kZV0pLFxyXG4gICAgICBub25FbXB0eU9yTnVsbChkYXRhW0NvbHVtbi5tdW5pY2lwYWxpdHlQYXJ0Q29kZV0pLFxyXG4gICAgICBub25FbXB0eU9yTnVsbChkYXRhW0NvbHVtbi5wcmFndWVEaXN0cmljdENvZGVdKSxcclxuICAgICAgZGF0YVtDb2x1bW4ucG9zdGFsQ29kZV0sXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLnhDb29yZGluYXRlXSksXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLnlDb29yZGluYXRlXSksXHJcbiAgICAgIGxhdE9yTnVsbCxcclxuICAgICAgbG9uT3JOdWxsXHJcbiAgICApO1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBwbGFjZUhvbGRlcnMgPSBnZW5lcmF0ZTJEUGxhY2Vob2xkZXJzKFxyXG4gICAgY29sdW1uTmFtZXMubGVuZ3RoLFxyXG4gICAgYnVmZmVyLmxlbmd0aFxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICBhd2FpdCByYXdRdWVyeShcclxuICAgIGBJTlNFUlQgJHtcclxuICAgICAgaXNNeXNxbChrbmV4KSA/IFwiSUdOT1JFXCIgOiBcIlwiXHJcbiAgICB9IElOVE8gYWRkcmVzc19wb2ludCAoJHtjb2x1bW5OYW1lcy5qb2luKFwiLFwiKX0pIFZBTFVFUyAke3BsYWNlSG9sZGVyc30gJHtcclxuICAgICAgIWlzTXlzcWwoa25leCkgPyBcIk9OIENPTkZMSUNUIChpZCkgRE8gTk9USElOR1wiIDogXCJcIlxyXG4gICAgfWAsXHJcbiAgICBwYXJhbXNcclxuICApO1xyXG5cclxuICByZXR1cm4gYnVmZmVyLmxlbmd0aDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRDaXRpZXMgPSBhc3luYyAoYnVmZmVyOiBzdHJpbmdbXVtdKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgZXh0cmFjdEtleVZhbHVlc1BhaXJzKGJ1ZmZlciwgQ29sdW1uLmNpdHlDb2RlLCBbQ29sdW1uLmNpdHlOYW1lXSksXHJcbiAgICBcImNpdHlcIixcclxuICAgIFtcImNvZGVcIiwgXCJuYW1lXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnREaXN0cmljdHMgPSBhc3luYyAoYnVmZmVyOiBzdHJpbmdbXVtdKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgZXh0cmFjdEtleVZhbHVlc1BhaXJzKGJ1ZmZlciwgQ29sdW1uLmRpc3RyaWN0Q29kZSwgW1xyXG4gICAgICBDb2x1bW4uY2l0eUNvZGUsXHJcbiAgICAgIENvbHVtbi5kaXN0cmljdE5hbWUsXHJcbiAgICBdKSxcclxuICAgIFwiY2l0eV9kaXN0cmljdFwiLFxyXG4gICAgW1wiY29kZVwiLCBcImNpdHlfY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydE11bmljaXBhbGl0eVBhcnRzID0gYXN5bmMgKFxyXG4gIGJ1ZmZlcjogc3RyaW5nW11bXVxyXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIHJldHVybiBhd2FpdCBpbnNlcnRNdWx0aXBsZVJvd3MoXHJcbiAgICBleHRyYWN0S2V5VmFsdWVzUGFpcnMoYnVmZmVyLCBDb2x1bW4ubXVuaWNpcGFsaXR5UGFydENvZGUsIFtcclxuICAgICAgQ29sdW1uLm11bmljaXBhbGl0eVBhcnROYW1lLFxyXG4gICAgICBDb2x1bW4uY2l0eUNvZGUsXHJcbiAgICBdKSxcclxuICAgIFwibXVuaWNpcGFsaXR5X3BhcnRcIixcclxuICAgIFtcImNvZGVcIiwgXCJuYW1lXCIsIFwiY2l0eV9jb2RlXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRQcmFndWVEaXN0cmljdHMgPSBhc3luYyAoXHJcbiAgYnVmZmVyOiBzdHJpbmdbXVtdXHJcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIENvbHVtbi5wcmFndWVEaXN0cmljdENvZGUsIFtcclxuICAgICAgQ29sdW1uLnByYWd1ZURpc3RyaWN0TmFtZSxcclxuICAgIF0pLFxyXG4gICAgXCJwcmFndWVfZGlzdHJpY3RcIixcclxuICAgIFtcImNvZGVcIiwgXCJuYW1lXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRTdHJlZXRzID0gYXN5bmMgKGJ1ZmZlcjogc3RyaW5nW11bXSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIENvbHVtbi5zdHJlZXRDb2RlLCBbXHJcbiAgICAgIENvbHVtbi5jaXR5Q29kZSxcclxuICAgICAgQ29sdW1uLnN0cmVldE5hbWUsXHJcbiAgICBdKSxcclxuICAgIFwic3RyZWV0XCIsXHJcbiAgICBbXCJjb2RlXCIsIFwiY2l0eV9jb2RlXCIsIFwibmFtZVwiXVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgYXJlQWRkcmVzc1BvaW50c1N5bmNlZCA9IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRLbmV4RGIoKVxyXG4gICAgLmNvdW50KFwiKlwiLCB7IGFzOiBcImNvdW50QWxsXCIgfSlcclxuICAgIC5mcm9tKFwiYWRkcmVzc19wb2ludFwiKVxyXG4gICAgLmZpcnN0KCk7XHJcbiAgcmV0dXJuIE51bWJlcihyZXN1bHQuY291bnRBbGwpID49IDI5MDAwMDA7IC8vIHRvdGFsIGlzIGFsbW9zdCAzIG1pbGxpb25cclxufTtcclxuXHJcbmNvbnN0IGFkZHJlc3NQb2ludFNlbGVjdCA9IGBcclxuICBTRUxFQ1QgYS5pZCwgcy5uYW1lIEFTIHN0cmVldF9uYW1lLCBvLm5hbWUgQVMgb2JqZWN0X3R5cGVfbmFtZSwgYS5kZXNjcmlwdGl2ZV9udW1iZXIsXHJcbiAgICAgICAgYS5vcmllbnRhdGlvbmFsX251bWJlciwgYS5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXIsIGMubmFtZSBBUyBjaXR5X25hbWUsXHJcbiAgICAgICAgbS5uYW1lIEFTIG11bmljaXBhbGl0eV9wYXJ0X25hbWUsIHAubmFtZSBBUyBwcmFndWVfZGlzdHJpY3RfbmFtZSxcclxuICAgICAgICBkLm5hbWUgQVMgZGlzdHJpY3RfbmFtZSwgYS5wb3N0YWxfY29kZSwgYS53Z3M4NF9sYXRpdHVkZSwgYS53Z3M4NF9sb25naXR1ZGVcclxuICBGUk9NIGFkZHJlc3NfcG9pbnQgYVxyXG4gIExFRlQgSk9JTiBzdHJlZXQgcyBPTiBhLnN0cmVldF9jb2RlID0gcy5jb2RlXHJcbiAgSU5ORVIgSk9JTiBvYmplY3RfdHlwZSBvIE9OIG8uaWQgPSBhLm9iamVjdF90eXBlX2lkXHJcbiAgSU5ORVIgSk9JTiBjaXR5IGMgT04gYy5jb2RlID0gYS5jaXR5X2NvZGVcclxuICBMRUZUIEpPSU4gY2l0eV9kaXN0cmljdCBkIE9OIGEuY2l0eV9kaXN0cmljdF9jb2RlID0gZC5jb2RlXHJcbiAgTEVGVCBKT0lOIHByYWd1ZV9kaXN0cmljdCBwIE9OIGEucHJhZ3VlX2Rpc3RyaWN0X2NvZGUgPSBwLmNvZGVcclxuICBMRUZUIEpPSU4gbXVuaWNpcGFsaXR5X3BhcnQgbSBPTiBhLm11bmljaXBhbGl0eV9wYXJ0X2NvZGUgPSBtLmNvZGVgO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEFkZHJlc3NQb2ludEJ5SWQgPSBhc3luYyAoXHJcbiAgYWRkcmVzc1BvaW50SWQ6IG51bWJlclxyXG4pOiBQcm9taXNlPEFkZHJlc3NQb2ludCB8IG51bGw+ID0+IHtcclxuICBjb25zdCByb3cgPSBhd2FpdCByYXdRdWVyeShcclxuICAgIGAke2FkZHJlc3NQb2ludFNlbGVjdH1cclxuICAgICAgV0hFUkUgYS5pZCA9ID9gLFxyXG4gICAgW2FkZHJlc3NQb2ludElkXVxyXG4gICk7XHJcbiAgaWYgKHJvdy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICByZXR1cm4gcm93VG9BZGRyZXNzUG9pbnQocm93WzBdKTtcclxufTtcclxuXHJcbmxldCBsYXN0Rm91bmRlcjogRm91bmRlciB8IG51bGwgPSBudWxsO1xyXG5sZXQgYWxsU3RyZWV0czogc3RyaW5nW10gPSBbXTtcclxuXHJcbmV4cG9ydCBjb25zdCBjaGVja1N0cmVldEV4aXN0cyA9IGFzeW5jIChcclxuICBzdHJlZXROYW1lOiBzdHJpbmcsXHJcbiAgZm91bmRlcjogRm91bmRlclxyXG4pOiBQcm9taXNlPHsgZXhpc3RzOiBib29sZWFuOyBlcnJvcnM6IFNtZEVycm9yW10gfT4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICBjb25zdCBlcnJvcnM6IFNtZEVycm9yW10gPSBbXTtcclxuXHJcbiAgLy8gd2UgY2hlY2sgdGhlIHdob2xlIGNpdHlcclxuICBjb25zdCBjaXR5Q29kZSA9IGF3YWl0IGdldEZvdW5kZXJDaXR5Q29kZShmb3VuZGVyKTtcclxuICBjb25zdCByb3dMaXN0ID0gYXdhaXQgcmF3UXVlcnkoXHJcbiAgICBgU0VMRUNUIG5hbWUgQVMgc3RyZWV0X25hbWVcclxuICAgIEZST00gc3RyZWV0XHJcbiAgICBXSEVSRSBjaXR5X2NvZGUgPSA/IEFORCBuYW1lID0gPyAgJHtcclxuICAgICAgaXNTcWxpdGUoa25leCkgPyBcIkNPTExBVEUgTk9DQVNFXCIgOiBcIlwiXHJcbiAgICB9YCxcclxuICAgIFtjaXR5Q29kZSwgc3RyZWV0TmFtZV1cclxuICApO1xyXG5cclxuICBpZiAocm93TGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCByb3cgPSByb3dMaXN0WzBdO1xyXG4gICAgaWYgKHJvdy5zdHJlZXRfbmFtZSAhPT0gc3RyZWV0TmFtZSkge1xyXG4gICAgICAvLyBlcnJvcnMucHVzaChcclxuICAgICAgLy8gICBgU3RyZWV0ICcke3N0cmVldE5hbWV9JyBoYXMgd3JvbmcgY2FzZSwgY29ycmVjdCBjYXNlOiAnJHtyb3cuc3RyZWV0X25hbWV9Jy5gXHJcbiAgICAgIC8vICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBleGlzdHM6IHRydWUsIGVycm9ycyB9O1xyXG4gIH1cclxuXHJcbiAgaWYgKGxhc3RGb3VuZGVyICE9PSBmb3VuZGVyKSB7XHJcbiAgICBhbGxTdHJlZXRzID0gYXdhaXQgZ2V0QWxsU3RyZWV0cyhjaXR5Q29kZSk7XHJcbiAgICBsYXN0Rm91bmRlciA9IGZvdW5kZXI7XHJcbiAgfVxyXG5cclxuICBjb25zdCBtYXRjaCA9IGFsbFN0cmVldHMuZmluZChcclxuICAgIChzKSA9PlxyXG4gICAgICBzLnRvTG9jYWxlTG93ZXJDYXNlKFwiY3MtQ1pcIikgPT09IHN0cmVldE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoXCJjcy1DWlwiKVxyXG4gICk7XHJcbiAgbGV0IGV4aXN0cyA9IGZhbHNlO1xyXG4gIGlmIChtYXRjaCkge1xyXG4gICAgZXhpc3RzID0gdHJ1ZTtcclxuICAgIGlmIChzdHJlZXROYW1lICE9PSBtYXRjaCkge1xyXG4gICAgICAvLyBlcnJvcnMucHVzaChcclxuICAgICAgLy8gICBgU3RyZWV0ICcke3N0cmVldE5hbWV9JyBoYXMgd3JvbmcgY2FzZSwgY29ycmVjdCBjYXNlOiAnJHttYXRjaH0nLmBcclxuICAgICAgLy8gKTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgY2xvc2VzdCA9IGZpbmRDbG9zZXN0U3RyaW5nKHN0cmVldE5hbWUsIGFsbFN0cmVldHMpO1xyXG4gICAgZXJyb3JzLnB1c2goe1xyXG4gICAgICBtZXNzYWdlOiBgVWxpY2UgJyR7c3RyZWV0TmFtZX0nIHYgdMOpdG8gb2JjaSBuZWV4aXN0dWplLCBteXNsZWxpIGpzdGUgJyR7Y2xvc2VzdH0nP2AsXHJcbiAgICAgIHN0YXJ0T2Zmc2V0OiAwLFxyXG4gICAgICBlbmRPZmZzZXQ6IHN0cmVldE5hbWUubGVuZ3RoICsgMSxcclxuICAgIH0pO1xyXG4gIH1cclxuICByZXR1cm4geyBleGlzdHM6IGZhbHNlLCBlcnJvcnMgfTtcclxufTtcclxuXHJcbmNvbnN0IGdldEFsbFN0cmVldHMgPSBhc3luYyAoY2l0eUNvZGU6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcclxuICBjb25zdCBrbmV4ID0gZ2V0S25leERiKCk7XHJcbiAgcmV0dXJuIGF3YWl0IGtuZXgucGx1Y2soXCJuYW1lXCIpLmZyb20oXCJzdHJlZXRcIikud2hlcmUoXCJjaXR5X2NvZGVcIiwgY2l0eUNvZGUpO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgRmluZEFkZHJlc3NQb2ludHNQYXJhbXMgPVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcInNtZExpbmVcIjtcclxuICAgICAgc21kTGluZTogU21kTGluZTtcclxuICAgICAgbXVuaWNpcGFsaXR5OiBNdW5pY2lwYWxpdHk7XHJcbiAgICAgIG11bmljaXBhbGl0eVBhcnRDb2RlPzogbnVtYmVyO1xyXG4gICAgfVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcIndob2xlTXVuaWNpcGFsaXR5UGFydFwiO1xyXG4gICAgICBtdW5pY2lwYWxpdHlQYXJ0Q29kZTogbnVtYmVyO1xyXG4gICAgfVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcIndob2xlTXVuaWNpcGFsaXR5XCI7XHJcbiAgICAgIG11bmljaXBhbGl0eTogTXVuaWNpcGFsaXR5O1xyXG4gICAgfVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcIndob2xlTXVuaWNpcGFsaXR5Tm9TdHJlZXROYW1lXCI7XHJcbiAgICAgIG11bmljaXBhbGl0eTogTXVuaWNpcGFsaXR5O1xyXG4gICAgfTtcclxuXHJcbmV4cG9ydCBjb25zdCBmaW5kQWRkcmVzc1BvaW50cyA9IGFzeW5jIChcclxuICBwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zXHJcbik6IFByb21pc2U8QWRkcmVzc1BvaW50W10+ID0+IHtcclxuICBjb25zdCBxdWVyeVBhcmFtcyA9IGdldFF1ZXJ5UGFyYW1zKHBhcmFtcyk7XHJcbiAgY29uc3Qgc3RyZWV0Sm9pbkNvbmRpdGlvbiA9IGdldFN0cmVldEpvaW5Db25kaXRpb24ocGFyYW1zKTtcclxuXHJcbiAgY29uc3Qgd2hlcmVDb25kaXRpb24gPSBnZXRXaGVyZUNvbmRpdGlvbihwYXJhbXMpO1xyXG5cclxuICBjb25zdCBxdWVyeVJlc3VsdCA9IGF3YWl0IHJhd1F1ZXJ5KFxyXG4gICAgYFNFTEVDVCBhLmlkLCBzLm5hbWUgQVMgc3RyZWV0X25hbWUsIG8ubmFtZSBBUyBvYmplY3RfdHlwZV9uYW1lLCBhLmRlc2NyaXB0aXZlX251bWJlcixcclxuICAgICAgYS5vcmllbnRhdGlvbmFsX251bWJlciwgYS5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXIsIGMubmFtZSBBUyBjaXR5X25hbWUsXHJcbiAgICAgIGQubmFtZSBBUyBkaXN0cmljdF9uYW1lLCBtLm5hbWUgQVMgbXVuaWNpcGFsaXR5X3BhcnRfbmFtZSwgcC5uYW1lIEFTIHByYWd1ZV9kaXN0cmljdF9uYW1lLFxyXG4gICAgICBhLnBvc3RhbF9jb2RlLCBhLndnczg0X2xhdGl0dWRlLCBhLndnczg0X2xvbmdpdHVkZVxyXG4gICAgRlJPTSBhZGRyZXNzX3BvaW50IGFcclxuICAgICR7c3RyZWV0Sm9pbkNvbmRpdGlvbn1cclxuICAgIElOTkVSIEpPSU4gb2JqZWN0X3R5cGUgbyBPTiBvLmlkID0gYS5vYmplY3RfdHlwZV9pZFxyXG4gICAgSU5ORVIgSk9JTiBjaXR5IGMgT04gYy5jb2RlID0gYS5jaXR5X2NvZGVcclxuICAgIExFRlQgSk9JTiBjaXR5X2Rpc3RyaWN0IGQgT04gYS5jaXR5X2Rpc3RyaWN0X2NvZGUgPSBkLmNvZGVcclxuICAgIExFRlQgSk9JTiBtdW5pY2lwYWxpdHlfcGFydCBtIE9OIGEubXVuaWNpcGFsaXR5X3BhcnRfY29kZSA9IG0uY29kZVxyXG4gICAgTEVGVCBKT0lOIHByYWd1ZV9kaXN0cmljdCBwIE9OIGEucHJhZ3VlX2Rpc3RyaWN0X2NvZGUgPSBwLmNvZGVcclxuICAgIFdIRVJFICR7d2hlcmVDb25kaXRpb259YCxcclxuICAgIHF1ZXJ5UGFyYW1zXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIGZpbHRlckFkZHJlc3NQb2ludHMocXVlcnlSZXN1bHQubWFwKHJvd1RvQWRkcmVzc1BvaW50KSwgcGFyYW1zKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBmaWx0ZXJBZGRyZXNzUG9pbnRzID0gKFxyXG4gIGFkZHJlc3NQb2ludHM6IEFkZHJlc3NQb2ludFtdLFxyXG4gIHBhcmFtczogRmluZEFkZHJlc3NQb2ludHNQYXJhbXNcclxuKTogQWRkcmVzc1BvaW50W10gPT4ge1xyXG4gIGlmIChcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5XCIgfHxcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5Tm9TdHJlZXROYW1lXCIgfHxcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5UGFydFwiXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gYWRkcmVzc1BvaW50cztcclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogQWRkcmVzc1BvaW50W10gPSBbXTtcclxuICBjb25zdCBudW1iZXJTcGVjID0gcGFyYW1zLnNtZExpbmUubnVtYmVyU3BlYztcclxuICBpZiAoaXNTZXJpZXNTcGVjQXJyYXkobnVtYmVyU3BlYykpIHtcclxuICAgIG51bWJlclNwZWMuZm9yRWFjaCgoc2VyaWVzU3BlYykgPT4ge1xyXG4gICAgICByZXN1bHQucHVzaCguLi5maWx0ZXJBZGRyZXNzUG9pbnRzQnlSYW5nZXMoYWRkcmVzc1BvaW50cywgc2VyaWVzU3BlYykpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gd2hlbiBubyBudW1iZXIgc3BlY3MgYXJlIHByZXNlbnQsIHdlIHRha2UgZXZlcnl0aGluZ1xyXG4gICAgaWYgKG51bWJlclNwZWMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmFkZHJlc3NQb2ludHMpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoaXNOZWdhdGl2ZVNlcmllc1NwZWMobnVtYmVyU3BlYykpIHtcclxuICAgIC8vIG5lZ2F0aXZlIG51bWJlciBzcGVjIChlLmcuIG9kZCBudW1iZXJzIGV4Y2VwdCAxMy0xNylcclxuICAgIGNvbnN0IHRvRXhjbHVkZSA9IGZpbHRlckFkZHJlc3NQb2ludHNCeVJhbmdlcyhhZGRyZXNzUG9pbnRzLCBudW1iZXJTcGVjKTtcclxuICAgIHJlc3VsdC5wdXNoKFxyXG4gICAgICAuLi5hZGRyZXNzUG9pbnRzLmZpbHRlcihcclxuICAgICAgICAoYWRkcmVzc1BvaW50KSA9PiAhdG9FeGNsdWRlLmluY2x1ZGVzKGFkZHJlc3NQb2ludClcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG5jb25zdCBmaWx0ZXJBZGRyZXNzUG9pbnRzQnlSYW5nZXMgPSAoXHJcbiAgYWRkcmVzc1BvaW50czogQWRkcmVzc1BvaW50W10sXHJcbiAgc2VyaWVzU3BlYzogU2VyaWVzU3BlY1xyXG4pOiBBZGRyZXNzUG9pbnRbXSA9PiB7XHJcbiAgY29uc3QgcmVzdWx0OiBBZGRyZXNzUG9pbnRbXSA9IFtdO1xyXG4gIHNlcmllc1NwZWMucmFuZ2VzLmZvckVhY2goKHJhbmdlKSA9PiB7XHJcbiAgICByZXN1bHQucHVzaChcclxuICAgICAgLi4uYWRkcmVzc1BvaW50cy5maWx0ZXIoKGFkZHJlc3NQb2ludCkgPT4ge1xyXG4gICAgICAgIGlmIChpc1JhbmdlKHJhbmdlKSkge1xyXG4gICAgICAgICAgY29uc3QgbnVtYmVyID0gZ2V0TnVtYmVyQnlUeXBlKHNlcmllc1NwZWMudHlwZSwgYWRkcmVzc1BvaW50KTtcclxuICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIGlzSW5SYW5nZShcclxuICAgICAgICAgICAgICBudW1iZXIsXHJcbiAgICAgICAgICAgICAgc2VyaWVzU3BlYy50eXBlICE9PSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICA/IGFkZHJlc3NQb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyID8/IG51bGxcclxuICAgICAgICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICAgICAgICByYW5nZVxyXG4gICAgICAgICAgICApICYmIGZpdHNUeXBlKG51bWJlciwgc2VyaWVzU3BlYy50eXBlKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZnVsbFN0cmVldE51bWJlcjogRnVsbFN0cmVldE51bWJlciA9IHJhbmdlO1xyXG4gICAgICAgICAgcmV0dXJuIGVxdWFsc0Z1bGxTdHJlZXROdW1iZXIoZnVsbFN0cmVldE51bWJlciwgYWRkcmVzc1BvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH0pO1xyXG5cclxuICAvLyB3aGVuIG5vIHNlcmllcyBzcGVjcyBhcmUgcHJlc2VudCwgd2UgdGFrZSBldmVyeXRoaW5nIHRoYXQgZml0cyB0aGUgdHlwZVxyXG4gIGlmIChzZXJpZXNTcGVjLnJhbmdlcy5sZW5ndGggPT09IDApIHtcclxuICAgIHJlc3VsdC5wdXNoKFxyXG4gICAgICAuLi5hZGRyZXNzUG9pbnRzLmZpbHRlcigoYWRkcmVzc1BvaW50KSA9PlxyXG4gICAgICAgIGZpdHNUeXBlKFxyXG4gICAgICAgICAgZ2V0TnVtYmVyQnlUeXBlKHNlcmllc1NwZWMudHlwZSwgYWRkcmVzc1BvaW50KSxcclxuICAgICAgICAgIHNlcmllc1NwZWMudHlwZVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UXVlcnlQYXJhbXMgPSAoXHJcbiAgcGFyYW1zOiBGaW5kQWRkcmVzc1BvaW50c1BhcmFtc1xyXG4pOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0+IHtcclxuICBpZiAocGFyYW1zLnR5cGUgPT09IFwic21kTGluZVwiICYmIHBhcmFtcy5zbWRMaW5lLnR5cGUgPT09IFwic3RyZWV0XCIpIHtcclxuICAgIHJldHVybiBbcGFyYW1zLnNtZExpbmUuc3RyZWV0LCBwYXJhbXMubXVuaWNpcGFsaXR5LmNvZGVdO1xyXG4gIH1cclxuXHJcbiAgaWYgKFxyXG4gICAgKHBhcmFtcy50eXBlID09PSBcInNtZExpbmVcIiAmJiBwYXJhbXMuc21kTGluZS50eXBlID09PSBcIm11bmljaXBhbGl0eVBhcnRcIikgfHxcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5UGFydFwiXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gW3BhcmFtcy5tdW5pY2lwYWxpdHlQYXJ0Q29kZV07XHJcbiAgfVxyXG5cclxuICByZXR1cm4gW3BhcmFtcy5tdW5pY2lwYWxpdHkuY29kZV07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0U3RyZWV0Sm9pbkNvbmRpdGlvbiA9IChcclxuICBwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zXHJcbik6IHN0cmluZyA9PiB7XHJcbiAgaWYgKHBhcmFtcy50eXBlID09PSBcInNtZExpbmVcIiAmJiBwYXJhbXMuc21kTGluZS50eXBlID09PSBcInN0cmVldFwiKSB7XHJcbiAgICByZXR1cm4gYEpPSU4gc3RyZWV0IHMgT04gYS5zdHJlZXRfY29kZSA9IHMuY29kZSBBTkQgcy5uYW1lID0gPyAke1xyXG4gICAgICBpc1NxbGl0ZShnZXRLbmV4RGIoKSkgPyBcIkNPTExBVEUgTk9DQVNFXCIgOiBcIlwiXHJcbiAgICB9YDtcclxuICB9XHJcbiAgcmV0dXJuIFwiTEVGVCBKT0lOIHN0cmVldCBzIE9OIGEuc3RyZWV0X2NvZGUgPSBzLmNvZGVcIjtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRXaGVyZUNvbmRpdGlvbiA9IChwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zKTogc3RyaW5nID0+IHtcclxuICBpZiAoXHJcbiAgICAocGFyYW1zLnR5cGUgPT09IFwic21kTGluZVwiICYmIHBhcmFtcy5zbWRMaW5lLnR5cGUgPT09IFwibXVuaWNpcGFsaXR5UGFydFwiKSB8fFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlQYXJ0XCJcclxuICApIHtcclxuICAgIHJldHVybiBcImEubXVuaWNpcGFsaXR5X3BhcnRfY29kZSA9ID9cIjtcclxuICB9XHJcblxyXG4gIGlmIChwYXJhbXMudHlwZSA9PT0gXCJ3aG9sZU11bmljaXBhbGl0eU5vU3RyZWV0TmFtZVwiKSB7XHJcbiAgICByZXR1cm4gYCR7Z2V0TXVuaWNpcGFsaXR5V2hlcmUoXHJcbiAgICAgIFwiYVwiLFxyXG4gICAgICBwYXJhbXMubXVuaWNpcGFsaXR5XHJcbiAgICApfSBBTkQgYS5zdHJlZXRfY29kZSBJUyBOVUxMYDtcclxuICB9XHJcblxyXG4gIHJldHVybiBnZXRNdW5pY2lwYWxpdHlXaGVyZShcImFcIiwgcGFyYW1zLm11bmljaXBhbGl0eSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJblJhbmdlID0gKFxyXG4gIG51bWJlcjogbnVtYmVyIHwgbnVsbCxcclxuICBsZXR0ZXI6IHN0cmluZyB8IG51bGwsXHJcbiAgcmFuZ2U6IFJhbmdlU3BlY1xyXG4pOiBib29sZWFuID0+IHtcclxuICBpZiAobnVtYmVyID09PSBudWxsKSB7XHJcbiAgICByZXR1cm4gIXJhbmdlLmZyb20gJiYgIXJhbmdlLnRvO1xyXG4gIH1cclxuXHJcbiAgLy8gZXhwbGFpbmVyOiBlaXRoZXIgdGhlIGxvd2VyIGJvdW5kIGlzIG5vdCBzZXQsIG9yIGl0IGlzIGxvd2VyIHRoYW4gdGhlIG51bWJlclxyXG4gIC8vIGlmIGl0J3MgZXF1YWwgdG8gdGhlIG51bWJlciwgd2UgYWxzbyBoYXZlIHRvIGNoZWNrIHRoZSBsZXR0ZXIgLSBpZiBpdCdzIG5vdCBzZXQsIHdlIGRvbid0IGNhcmVcclxuICAvLyBpZiBmcm9tLmxldHRlciBpcyBzZXQsIHdlIG5lZWQgdG8gaGF2ZSBhIGxldHRlciBzZXQgYW5kIGl0IGhhcyB0byBiZSBncmVhdGVyIG9yIGVxdWFsOlxyXG4gIC8vIG51bWJlciB3aXRob3V0IGxldHRlciBjb3VudHMgbG93ZXIgdGhhbiBudW1iZXIgd2l0aCBsZXR0ZXIgJ2EnIChlLmcuIDIzIDwgMjNhKVxyXG4gIGNvbnN0IHNhdGlzZmllc0Zyb20gPVxyXG4gICAgIXJhbmdlLmZyb20gfHxcclxuICAgIG51bWJlciA+IHJhbmdlLmZyb20ubnVtYmVyIHx8XHJcbiAgICAobnVtYmVyID09PSByYW5nZS5mcm9tLm51bWJlciAmJlxyXG4gICAgICAoIXJhbmdlLmZyb20ubGV0dGVyIHx8ICghIWxldHRlciAmJiBsZXR0ZXIgPj0gcmFuZ2UuZnJvbS5sZXR0ZXIpKSk7XHJcblxyXG4gIGNvbnN0IHNhdGlzZmllc1RvID1cclxuICAgICFyYW5nZS50byB8fFxyXG4gICAgbnVtYmVyIDwgcmFuZ2UudG8ubnVtYmVyIHx8XHJcbiAgICAobnVtYmVyID09PSByYW5nZS50by5udW1iZXIgJiZcclxuICAgICAgKCFsZXR0ZXIgfHxcclxuICAgICAgICAoISFyYW5nZS50by5sZXR0ZXIgJiYgISFsZXR0ZXIgJiYgbGV0dGVyIDw9IHJhbmdlLnRvLmxldHRlcikpKTtcclxuXHJcbiAgcmV0dXJuIHNhdGlzZmllc0Zyb20gJiYgc2F0aXNmaWVzVG87XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZml0c1R5cGUgPSAobnVtYmVyOiBudW1iZXIgfCBudWxsLCB0eXBlOiBTZXJpZXNUeXBlKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIHR5cGUgPT09IFNlcmllc1R5cGUuRGVzY3JpcHRpb24gfHxcclxuICAgIHR5cGUgPT09IFNlcmllc1R5cGUuQWxsIHx8XHJcbiAgICAodHlwZSA9PT0gU2VyaWVzVHlwZS5PZGQgJiYgbnVtYmVyICUgMiA9PT0gMSkgfHxcclxuICAgICh0eXBlID09PSBTZXJpZXNUeXBlLkV2ZW4gJiYgbnVtYmVyICUgMiA9PT0gMClcclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGVxdWFsc0Z1bGxTdHJlZXROdW1iZXIgPSAoXHJcbiAgZnVsbFN0cmVldE51bWJlcjogRnVsbFN0cmVldE51bWJlcixcclxuICBhZGRyZXNzUG9pbnQ6IEFkZHJlc3NQb2ludFxyXG4pOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgZnVsbFN0cmVldE51bWJlci5kZXNjcmlwdGlvbk51bWJlci5udW1iZXIgPT09IGFkZHJlc3NQb2ludC5ob3VzZU51bWJlciAmJlxyXG4gICAgZnVsbFN0cmVldE51bWJlci5vcmllbnRhdGlvbmFsTnVtYmVyLm51bWJlciA9PT1cclxuICAgICAgYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXIgJiZcclxuICAgICgoIWZ1bGxTdHJlZXROdW1iZXIub3JpZW50YXRpb25hbE51bWJlci5sZXR0ZXIgJiZcclxuICAgICAgIWFkZHJlc3NQb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyKSB8fFxyXG4gICAgICBmdWxsU3RyZWV0TnVtYmVyLm9yaWVudGF0aW9uYWxOdW1iZXIubGV0dGVyID09PVxyXG4gICAgICAgIGFkZHJlc3NQb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyKVxyXG4gICk7XHJcbn07XHJcblxyXG5jb25zdCBnZXROdW1iZXJCeVR5cGUgPSAoXHJcbiAgdHlwZTogU2VyaWVzVHlwZSxcclxuICBhZGRyZXNzUG9pbnQ6IEFkZHJlc3NQb2ludFxyXG4pOiBudW1iZXIgfCBudWxsID0+IHtcclxuICByZXR1cm4gdHlwZSA9PT0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvblxyXG4gICAgPyBhZGRyZXNzUG9pbnQuaG91c2VOdW1iZXJcclxuICAgIDogYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXIgPz8gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGdldE11bmljaXBhbGl0eVdoZXJlID0gKFxyXG4gIGFsaWFzOiBzdHJpbmcsXHJcbiAgbXVuaWNpcGFsaXR5OiBNdW5pY2lwYWxpdHlcclxuKTogc3RyaW5nID0+IHtcclxuICByZXR1cm4gbXVuaWNpcGFsaXR5LnR5cGUgPT09IE11bmljaXBhbGl0eVR5cGUuQ2l0eVxyXG4gICAgPyBgJHthbGlhc30uY2l0eV9jb2RlID0gP2BcclxuICAgIDogYCR7YWxpYXN9LmNpdHlfZGlzdHJpY3RfY29kZSA9ID9gO1xyXG59O1xyXG5cclxuY29uc3Qgcm93VG9BZGRyZXNzUG9pbnQgPSAocm93OiBhbnkpOiBBZGRyZXNzUG9pbnQgPT4ge1xyXG4gIGNvbnN0IHBvaW50OiBBZGRyZXNzUG9pbnQgPSB7XHJcbiAgICBpZDogcm93LmlkLFxyXG4gICAgYWRkcmVzczogXCJcIixcclxuICAgIHR5cGU6XHJcbiAgICAgIHJvdy5vYmplY3RfdHlwZV9uYW1lID09PSBEZXNjcmlwdGl2ZVR5cGVcclxuICAgICAgICA/IEFkZHJlc3NQb2ludFR5cGUuRGVzY3JpcHRpb25cclxuICAgICAgICA6IEFkZHJlc3NQb2ludFR5cGUuUmVnaXN0cmF0aW9uLFxyXG4gICAgaG91c2VOdW1iZXI6IHJvdy5kZXNjcmlwdGl2ZV9udW1iZXIsXHJcbiAgICBjaXR5OiByb3cuY2l0eV9uYW1lLFxyXG4gICAgbXVuaWNpcGFsaXR5UGFydDogcm93Lm11bmljaXBhbGl0eV9wYXJ0X25hbWUsXHJcbiAgICBwb3N0YWxDb2RlOiByb3cucG9zdGFsX2NvZGUsXHJcbiAgICBsYXQ6IHJvdy53Z3M4NF9sYXRpdHVkZSxcclxuICAgIGxuZzogcm93Lndnczg0X2xvbmdpdHVkZSxcclxuICB9O1xyXG4gIGlmIChyb3cuc3RyZWV0X25hbWUgIT09IG51bGwpIHtcclxuICAgIHBvaW50LnN0cmVldCA9IHJvdy5zdHJlZXRfbmFtZTtcclxuICB9XHJcbiAgaWYgKHJvdy5vcmllbnRhdGlvbmFsX251bWJlciAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQub3JpZW50YXRpb25hbE51bWJlciA9IHJvdy5vcmllbnRhdGlvbmFsX251bWJlcjtcclxuICB9XHJcbiAgaWYgKHJvdy5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXIgIT09IG51bGwpIHtcclxuICAgIHBvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXIgPSByb3cub3JpZW50YXRpb25hbF9udW1iZXJfbGV0dGVyO1xyXG4gIH1cclxuICBpZiAocm93LmRpc3RyaWN0X25hbWUgIT09IG51bGwpIHtcclxuICAgIHBvaW50LmRpc3RyaWN0ID0gcm93LmRpc3RyaWN0X25hbWU7XHJcbiAgfVxyXG4gIGlmIChyb3cucHJhZ3VlX2Rpc3RyaWN0X25hbWUgIT09IG51bGwpIHtcclxuICAgIHBvaW50LnByYWd1ZURpc3RyaWN0ID0gcm93LnByYWd1ZV9kaXN0cmljdF9uYW1lO1xyXG4gIH1cclxuICBwb2ludC5hZGRyZXNzID0gY3JlYXRlU2luZ2xlTGluZUFkZHJlc3MocG9pbnQpO1xyXG4gIHJldHVybiBwb2ludDtcclxufTtcclxuIl19
@@ -1,5 +1,7 @@
1
- import { FeatureCollection, MultiPolygon, Polygon } from "@turf/helpers";
1
+ import { FeatureCollection } from "@turf/helpers";
2
+ import { PolygonsByCodes } from "./types";
2
3
  export declare const insertCityPositions: (data: string[][]) => Promise<number>;
3
4
  export declare const insertCities: (buffer: string[][]) => Promise<number>;
4
- export declare const setCityPolygonGeojson: (polygon: FeatureCollection, code: string) => Promise<void>;
5
- export declare const getCityPolygonGeojsons: (cityCodes: number[]) => Promise<Record<number, FeatureCollection<Polygon | MultiPolygon>>>;
5
+ export declare const setCityPolygonGeojson: (code: string, polygon: FeatureCollection, districtsPolygon?: FeatureCollection) => Promise<void>;
6
+ export declare const getCityPolygons: (cityCodes: Set<number>) => Promise<PolygonsByCodes>;
7
+ export declare const getDistrictPolygons: (districtCodes: Set<number>) => Promise<PolygonsByCodes>;
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,70 @@ 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 = (polygon, code) => __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({ polygon_geojson: JSON.stringify(polygon) })
43
+ .update({
44
+ polygon_geojson: JSON.stringify(polygon),
45
+ ...(districtsPolygon
46
+ ? { districts_polygon_geojson: JSON.stringify(districtsPolygon) }
47
+ : {}),
48
+ })
53
49
  .where({ code });
54
- });
55
- export const getCityPolygonGeojsons = (cityCodes) => __awaiter(void 0, void 0, void 0, function* () {
56
- const rows = yield getKnexDb()
50
+ };
51
+ export const getCityPolygons = async (cityCodes) => {
52
+ if (cityCodes.size === 0) {
53
+ return {};
54
+ }
55
+ const cityRows = await getKnexDb()
57
56
  .from("city")
58
57
  .select("code", "polygon_geojson")
59
- .whereIn("code", cityCodes);
60
- return rows.reduce((acc, row) => {
58
+ .whereIn("code", Array.from(cityCodes));
59
+ return cityRows.reduce((acc, row) => {
61
60
  acc[row.code] = JSON.parse(row.polygon_geojson);
62
61
  return acc;
63
62
  }, {});
64
- });
63
+ };
64
+ export const getDistrictPolygons = async (districtCodes) => {
65
+ if (districtCodes.size === 0) {
66
+ return {};
67
+ }
68
+ const cityCodes = (await getKnexDb()
69
+ .from("city_district")
70
+ .select("city_code")
71
+ .whereIn("code", Array.from(districtCodes))
72
+ .groupBy("city_code")).map((row) => row.city_code);
73
+ const cityRows = await getKnexDb()
74
+ .from("city")
75
+ .select("code", "districts_polygon_geojson")
76
+ .whereIn("code", cityCodes);
77
+ const districtPolygons = {};
78
+ for (const row of cityRows) {
79
+ if (row.districts_polygon_geojson) {
80
+ const polygons = JSON.parse(row.districts_polygon_geojson);
81
+ for (const feature of polygons.features) {
82
+ if (districtCodes.has(Number(feature.properties.KOD))) {
83
+ districtPolygons[feature.properties.KOD] = {
84
+ type: "FeatureCollection",
85
+ features: [
86
+ { ...feature, properties: { code: feature.properties.KOD } },
87
+ ],
88
+ };
89
+ }
90
+ }
91
+ }
92
+ }
93
+ return districtPolygons;
94
+ };
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2l0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RiL2NpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFDakMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLFFBQVEsR0FDVCxNQUFNLE1BQU0sQ0FBQztBQUlkLE1BQU0sWUFBWSxHQUFHO0lBQ25CLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsVUFBVSxFQUFFLENBQUM7SUFDYixVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7SUFDWCxTQUFTLEVBQUUsQ0FBQztDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEVBQ3RDLElBQWdCLEVBQ0MsRUFBRTtJQUNuQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFaEIsb0VBQW9FO0lBQ3BFLCtEQUErRDtJQUMvRCxPQUFPLElBQUksTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBRXJCLEtBQUssTUFBTSxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtRQUMxQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUU7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FDVixRQUFRLENBQ04sd0VBQXdFLEVBQ3hFO2dCQUNFLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUMxQixHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztnQkFDM0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFR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MkJBQTJCLENBQUM7U0FDM0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU5QixNQUFNLGdCQUFnQixHQUFvQixFQUFFLENBQUM7SUFDN0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUU7UUFDMUIsSUFBSSxHQUFHLENBQUMseUJBQXlCLEVBQUU7WUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDekIsR0FBRyxDQUFDLHlCQUF5QixDQUNlLENBQUM7WUFDL0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDckQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRzt3QkFDekMsSUFBSSxFQUFFLG1CQUFtQjt3QkFDekIsUUFBUSxFQUFFOzRCQUNSLEVBQUUsR0FBRyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUU7eUJBQzdEO3FCQUNGLENBQUM7aUJBQ0g7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaHVuayBmcm9tIFwibG9kYXNoL2NodW5rXCI7XHJcbmltcG9ydCB7XHJcbiAgZXh0cmFjdEtleVZhbHVlc1BhaXJzLFxyXG4gIGdldEtuZXhEYixcclxuICBpbnNlcnRNdWx0aXBsZVJvd3MsXHJcbiAgcmF3UXVlcnksXHJcbn0gZnJvbSBcIi4vZGJcIjtcclxuaW1wb3J0IHsgRmVhdHVyZUNvbGxlY3Rpb24sIE11bHRpUG9seWdvbiwgUG9seWdvbiB9IGZyb20gXCJAdHVyZi9oZWxwZXJzXCI7XHJcbmltcG9ydCB7IFBvbHlnb25zQnlDb2RlcyB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5jb25zdCBjaXRpZXNDb2x1bW4gPSB7XHJcbiAgY2l0eU5hbWU6IDAsXHJcbiAgY2l0eUNvZGU6IDEsXHJcbiAgY291bnR5TmFtZTogMixcclxuICBjb3VudHlDb2RlOiAzLFxyXG4gIHJlZ2lvbk5hbWU6IDQsXHJcbiAgcmVnaW9uQ29kZTogNSxcclxuICBwb3N0YWxDb2RlOiA2LFxyXG4gIGxhdGl0dWRlOiA3LFxyXG4gIGxvbmdpdHVkZTogOCxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRDaXR5UG9zaXRpb25zID0gYXN5bmMgKFxyXG4gIGRhdGE6IHN0cmluZ1tdW11cclxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICBsZXQgY2hhbmdlcyA9IDA7XHJcblxyXG4gIC8vIGNpdGllcyBhcmUgbW9zdCBsaWtlbHkgYWxyZWFkeSBpbnNlcnRlZCwgYnV0IGluIGNhc2UgdGhleSdyZSBub3QsXHJcbiAgLy8gd2UgbmVlZCB0byBpbnNlcnQgdGhlbSBiZWZvcmUgdXBkYXRpbmcgdGhlbSB3aXRoIHJlZ2lvbiBkYXRhXHJcbiAgY2hhbmdlcyArPSBhd2FpdCBpbnNlcnRDaXRpZXMoZGF0YSk7XHJcbiAgY29uc3QgcHJldiA9IGNoYW5nZXM7XHJcblxyXG4gIGZvciAoY29uc3QgYXJyYXlDaHVuayBvZiBjaHVuayhkYXRhLCAxMDAwKSkge1xyXG4gICAgY29uc3QgcXVlcmllcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCByb3cgb2YgYXJyYXlDaHVuaykge1xyXG4gICAgICBxdWVyaWVzLnB1c2goXHJcbiAgICAgICAgcmF3UXVlcnkoXHJcbiAgICAgICAgICBgVVBEQVRFIGNpdHkgU0VUIHdnczg0X2xhdGl0dWRlID0gPywgd2dzODRfbG9uZ2l0dWRlID0gPyBXSEVSRSBjb2RlID0gP2AsXHJcbiAgICAgICAgICBbXHJcbiAgICAgICAgICAgIHJvd1tjaXRpZXNDb2x1bW4ubGF0aXR1ZGVdLFxyXG4gICAgICAgICAgICByb3dbY2l0aWVzQ29sdW1uLmxvbmdpdHVkZV0sXHJcbiAgICAgICAgICAgIHJvd1tjaXRpZXNDb2x1bW4uY2l0eUNvZGVdLFxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpO1xyXG4gICAgY2hhbmdlcyArPSBxdWVyaWVzLmxlbmd0aDtcclxuICAgIGNvbnNvbGUubG9nKGBEb25lICR7Y2hhbmdlcyAtIHByZXZ9IC8gJHtkYXRhLmxlbmd0aH0gcm93cy4uLmApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNoYW5nZXM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaW5zZXJ0Q2l0aWVzID0gYXN5bmMgKGJ1ZmZlcjogc3RyaW5nW11bXSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIGNpdGllc0NvbHVtbi5jaXR5Q29kZSwgW1xyXG4gICAgICBjaXRpZXNDb2x1bW4uY2l0eU5hbWUsXHJcbiAgICBdKSxcclxuICAgIFwiY2l0eVwiLFxyXG4gICAgW1wiY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldENpdHlQb2x5Z29uR2VvanNvbiA9IGFzeW5jIChcclxuICBjb2RlOiBzdHJpbmcsXHJcbiAgcG9seWdvbjogRmVhdHVyZUNvbGxlY3Rpb24sXHJcbiAgZGlzdHJpY3RzUG9seWdvbj86IEZlYXR1cmVDb2xsZWN0aW9uXHJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuZnJvbShcImNpdHlcIilcclxuICAgIC51cGRhdGUoe1xyXG4gICAgICBwb2x5Z29uX2dlb2pzb246IEpTT04uc3RyaW5naWZ5KHBvbHlnb24pLFxyXG4gICAgICAuLi4oZGlzdHJpY3RzUG9seWdvblxyXG4gICAgICAgID8geyBkaXN0cmljdHNfcG9seWdvbl9nZW9qc29uOiBKU09OLnN0cmluZ2lmeShkaXN0cmljdHNQb2x5Z29uKSB9XHJcbiAgICAgICAgOiB7fSksXHJcbiAgICB9KVxyXG4gICAgLndoZXJlKHsgY29kZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRDaXR5UG9seWdvbnMgPSBhc3luYyAoXHJcbiAgY2l0eUNvZGVzOiBTZXQ8bnVtYmVyPlxyXG4pOiBQcm9taXNlPFBvbHlnb25zQnlDb2Rlcz4gPT4ge1xyXG4gIGlmIChjaXR5Q29kZXMuc2l6ZSA9PT0gMCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICBjb25zdCBjaXR5Um93cyA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuZnJvbShcImNpdHlcIilcclxuICAgIC5zZWxlY3QoXCJjb2RlXCIsIFwicG9seWdvbl9nZW9qc29uXCIpXHJcbiAgICAud2hlcmVJbihcImNvZGVcIiwgQXJyYXkuZnJvbShjaXR5Q29kZXMpKTtcclxuXHJcbiAgcmV0dXJuIGNpdHlSb3dzLnJlZHVjZSgoYWNjLCByb3cpID0+IHtcclxuICAgIGFjY1tyb3cuY29kZV0gPSBKU09OLnBhcnNlKHJvdy5wb2x5Z29uX2dlb2pzb24pO1xyXG4gICAgcmV0dXJuIGFjYztcclxuICB9LCB7fSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RGlzdHJpY3RQb2x5Z29ucyA9IGFzeW5jIChcclxuICBkaXN0cmljdENvZGVzOiBTZXQ8bnVtYmVyPlxyXG4pOiBQcm9taXNlPFBvbHlnb25zQnlDb2Rlcz4gPT4ge1xyXG4gIGlmIChkaXN0cmljdENvZGVzLnNpemUgPT09IDApIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcbiAgY29uc3QgY2l0eUNvZGVzID0gKFxyXG4gICAgYXdhaXQgZ2V0S25leERiKClcclxuICAgICAgLmZyb20oXCJjaXR5X2Rpc3RyaWN0XCIpXHJcbiAgICAgIC5zZWxlY3QoXCJjaXR5X2NvZGVcIilcclxuICAgICAgLndoZXJlSW4oXCJjb2RlXCIsIEFycmF5LmZyb20oZGlzdHJpY3RDb2RlcykpXHJcbiAgICAgIC5ncm91cEJ5KFwiY2l0eV9jb2RlXCIpXHJcbiAgKS5tYXAoKHJvdykgPT4gcm93LmNpdHlfY29kZSk7XHJcblxyXG4gIGNvbnN0IGNpdHlSb3dzID0gYXdhaXQgZ2V0S25leERiKClcclxuICAgIC5mcm9tKFwiY2l0eVwiKVxyXG4gICAgLnNlbGVjdChcImNvZGVcIiwgXCJkaXN0cmljdHNfcG9seWdvbl9nZW9qc29uXCIpXHJcbiAgICAud2hlcmVJbihcImNvZGVcIiwgY2l0eUNvZGVzKTtcclxuXHJcbiAgY29uc3QgZGlzdHJpY3RQb2x5Z29uczogUG9seWdvbnNCeUNvZGVzID0ge307XHJcbiAgZm9yIChjb25zdCByb3cgb2YgY2l0eVJvd3MpIHtcclxuICAgIGlmIChyb3cuZGlzdHJpY3RzX3BvbHlnb25fZ2VvanNvbikge1xyXG4gICAgICBjb25zdCBwb2x5Z29ucyA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgcm93LmRpc3RyaWN0c19wb2x5Z29uX2dlb2pzb25cclxuICAgICAgKSBhcyBGZWF0dXJlQ29sbGVjdGlvbjxQb2x5Z29uIHwgTXVsdGlQb2x5Z29uPjtcclxuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHBvbHlnb25zLmZlYXR1cmVzKSB7XHJcbiAgICAgICAgaWYgKGRpc3RyaWN0Q29kZXMuaGFzKE51bWJlcihmZWF0dXJlLnByb3BlcnRpZXMuS09EKSkpIHtcclxuICAgICAgICAgIGRpc3RyaWN0UG9seWdvbnNbZmVhdHVyZS5wcm9wZXJ0aWVzLktPRF0gPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcclxuICAgICAgICAgICAgZmVhdHVyZXM6IFtcclxuICAgICAgICAgICAgICB7IC4uLmZlYXR1cmUsIHByb3BlcnRpZXM6IHsgY29kZTogZmVhdHVyZS5wcm9wZXJ0aWVzLktPRCB9IH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRpc3RyaWN0UG9seWdvbnM7XHJcbn07XHJcbiJdfQ==
package/dist/db/db.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 { configDotenv } from "dotenv";
11
2
  import knex from "knex";
12
3
  import { dirname, join } from "path";
@@ -35,7 +26,7 @@ let _knexDb = undefined;
35
26
  let _knexDbConfig = undefined;
36
27
  export const getKnexDb = (config = {}) => {
37
28
  if (_knexDb === undefined) {
38
- _knexDbConfig = Object.assign(Object.assign(Object.assign({}, defaults), getEnvConfig()), config);
29
+ _knexDbConfig = { ...defaults, ...getEnvConfig(), ...config };
39
30
  if (_knexDbConfig.dbType === SupportedDbType.sqlite) {
40
31
  _knexDb = knex({
41
32
  client: DbClient[SupportedDbType.sqlite],
@@ -93,23 +84,23 @@ export const isMysql = (knex) => {
93
84
  const getMigrationConfig = () => {
94
85
  return { directory: join(__dirname, "migrations") };
95
86
  };
96
- export const initDb = (config = {}) => __awaiter(void 0, void 0, void 0, function* () {
87
+ export const initDb = async (config = {}) => {
97
88
  const knex = getKnexDb(config);
98
- yield knex.migrate.latest(getMigrationConfig());
89
+ await knex.migrate.latest(getMigrationConfig());
99
90
  return knex;
100
- });
101
- export const clearDb = (config = {}) => __awaiter(void 0, void 0, void 0, function* () {
91
+ };
92
+ export const clearDb = async (config = {}) => {
102
93
  const knex = getKnexDb(config);
103
- yield knex.migrate.rollback(getMigrationConfig(), true);
104
- yield knex.migrate.latest(getMigrationConfig());
94
+ await knex.migrate.rollback(getMigrationConfig(), true);
95
+ await knex.migrate.latest(getMigrationConfig());
105
96
  return knex;
106
- });
107
- export const disconnectKnex = () => __awaiter(void 0, void 0, void 0, function* () {
97
+ };
98
+ export const disconnectKnex = async () => {
108
99
  if (_knexDb) {
109
- yield _knexDb.destroy();
100
+ await _knexDb.destroy();
110
101
  _knexDb = undefined;
111
102
  }
112
- });
103
+ };
113
104
  const getEnvConfig = () => {
114
105
  configDotenv({ path: ".env.local" });
115
106
  const envConfig = {};
@@ -143,42 +134,42 @@ const getEnvConfig = () => {
143
134
  export const nonEmptyOrNull = (value) => {
144
135
  return value ? value : null;
145
136
  };
146
- export const rawQuery = (query, ...bindings) => __awaiter(void 0, void 0, void 0, function* () {
137
+ export const rawQuery = async (query, ...bindings) => {
147
138
  const knex = getKnexDb();
148
- const result = yield knex.raw(query, ...bindings);
139
+ const result = await knex.raw(query, ...bindings);
149
140
  return isMysql(knex) ? result[0] : result;
150
- });
141
+ };
151
142
  /**
152
143
  * Efficiently insert multiple rows. If preventDuplicatesByFirstColumn is true, the first
153
144
  * column should be unique (PK or UNIQUE).
154
145
  */
155
- export const insertMultipleRows = (rows, table, columnNames, preventDuplicates = true) => __awaiter(void 0, void 0, void 0, function* () {
146
+ export const insertMultipleRows = async (rows, table, columnNames, preventDuplicates = true) => {
156
147
  if (rows.length === 0) {
157
148
  return 0;
158
149
  }
159
150
  const insertPlaceholders = generate2DPlaceholders(columnNames.length, rows.length);
160
151
  const knex = getKnexDb();
161
152
  const onConfict = preventDuplicates && !isMysql(knex) ? `ON CONFLICT DO NOTHING` : "";
162
- yield rawQuery(`INSERT ${isMysql(knex) ? "IGNORE" : ""} INTO ${table} (${columnNames.join(",")}) VALUES ${insertPlaceholders} ${onConfict}`, rows.flat());
153
+ await rawQuery(`INSERT ${isMysql(knex) ? "IGNORE" : ""} INTO ${table} (${columnNames.join(",")}) VALUES ${insertPlaceholders} ${onConfict}`, rows.flat());
163
154
  return rows.length;
164
- });
155
+ };
165
156
  /**
166
157
  * Insert a single row and return the autoincremented ID.
167
158
  */
168
- export const insertAutoincrementRow = (row, table, columnNames) => __awaiter(void 0, void 0, void 0, function* () {
159
+ export const insertAutoincrementRow = async (row, table, columnNames) => {
169
160
  const data = columnNames.reduce((obj, columnName, index) => {
170
161
  obj[columnName] = row[index];
171
162
  return obj;
172
163
  }, {});
173
- const result = yield getKnexDb().insert(data).into(table);
164
+ const result = await getKnexDb().insert(data).into(table);
174
165
  return result ? Number(result) : null;
175
- });
176
- export const deleteMultipleRowsKnex = (keys, table, keyColumnName) => __awaiter(void 0, void 0, void 0, function* () {
166
+ };
167
+ export const deleteMultipleRowsKnex = async (keys, table, keyColumnName) => {
177
168
  if (keys.length === 0) {
178
169
  return;
179
170
  }
180
- yield getKnexDb().from(table).whereIn(keyColumnName, keys).del();
181
- });
171
+ await getKnexDb().from(table).whereIn(keyColumnName, keys).del();
172
+ };
182
173
  const generateRepetitiveString = (value, glue, n) => {
183
174
  return new Array(n).fill(value).join(glue);
184
175
  };
@@ -197,3 +188,4 @@ export const extractKeyValuesPairs = (array, keyIndex, valuesIndices) => {
197
188
  }, {});
198
189
  return Object.keys(object).map((key) => [key, ...object[key]]);
199
190
  };
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLElBQWMsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQVdwQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFFdEMsTUFBTSxDQUFOLElBQVksZUFJWDtBQUpELFdBQVksZUFBZTtJQUN6QixvQ0FBaUIsQ0FBQTtJQUNqQix3Q0FBcUIsQ0FBQTtJQUNyQixrQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxlQUFlLEtBQWYsZUFBZSxRQUkxQjtBQUVELE1BQU0sNEJBQTRCLEdBQUcseUNBQXlDLENBQUM7QUFFL0UsTUFBTSxRQUFRLEdBQUc7SUFDZixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDMUMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSTtJQUNoQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPO0NBQ2pDLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBYTtJQUN6QixNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU07SUFDOUIsUUFBUSxFQUFFLG1CQUFtQjtJQUM3QixZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLENBQUM7SUFDN0QsT0FBTyxFQUFFLEtBQUs7Q0FDZixDQUFDO0FBRUYsSUFBSSxPQUFPLEdBQVMsU0FBUyxDQUFDO0FBQzlCLElBQUks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Q0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25maWdEb3RlbnYgfSBmcm9tIFwiZG90ZW52XCI7XHJcbmltcG9ydCBrbmV4LCB7IEtuZXggfSBmcm9tIFwia25leFwiO1xyXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIjtcclxuXHJcbmludGVyZmFjZSBEYkNvbmZpZyB7XHJcbiAgZGJUeXBlOiBTdXBwb3J0ZWREYlR5cGU7XHJcbiAgcGdDb25uZWN0aW9uU3RyaW5nPzogc3RyaW5nO1xyXG4gIG15c3FsQ29ubmVjdGlvblN0cmluZz86IHN0cmluZztcclxuICBpbml0RmlsZVBhdGg6IHN0cmluZztcclxuICBmaWxlUGF0aD86IHN0cmluZztcclxuICB2ZXJib3NlOiBib29sZWFuO1xyXG59XHJcblxyXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xyXG5jb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKF9fZmlsZW5hbWUpO1xyXG5cclxuZXhwb3J0IGVudW0gU3VwcG9ydGVkRGJUeXBlIHtcclxuICBzcWxpdGUgPSBcInNxbGl0ZVwiLFxyXG4gIHBvc3RncmVzID0gXCJwb3N0Z3Jlc1wiLFxyXG4gIG15c3FsID0gXCJteXNxbFwiLFxyXG59XHJcblxyXG5jb25zdCBteXNxbENvbm5lY3Rpb25TdHJpbmdQYXR0ZXJuID0gL14oW146XSspOihcXGQrKTooW146XSspOihbXjpdKyk6KFteOl0rKSQvO1xyXG5cclxuY29uc3QgRGJDbGllbnQgPSB7XHJcbiAgW1N1cHBvcnRlZERiVHlwZS5zcWxpdGVdOiBcImJldHRlci1zcWxpdGUzXCIsXHJcbiAgW1N1cHBvcnRlZERiVHlwZS5wb3N0Z3Jlc106IFwicGdcIixcclxuICBbU3VwcG9ydGVkRGJUeXBlLm15c3FsXTogXCJteXNxbFwiLFxyXG59O1xyXG5cclxuY29uc3QgZGVmYXVsdHM6IERiQ29uZmlnID0ge1xyXG4gIGRiVHlwZTogU3VwcG9ydGVkRGJUeXBlLnNxbGl0ZSxcclxuICBmaWxlUGF0aDogXCJhZGRyZXNzX3BvaW50cy5kYlwiLFxyXG4gIGluaXRGaWxlUGF0aDogam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCJhZGRyZXNzX3BvaW50c19pbml0LmRiXCIpLFxyXG4gIHZlcmJvc2U6IGZhbHNlLFxyXG59O1xyXG5cclxubGV0IF9rbmV4RGI6IEtuZXggPSB1bmRlZmluZWQ7XHJcbmxldCBfa25leERiQ29uZmlnOiBEYkNvbmZpZyA9IHVuZGVmaW5lZDtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRLbmV4RGIgPSAoY29uZmlnOiBQYXJ0aWFsPERiQ29uZmlnPiA9IHt9KTogS25leCA9PiB7XHJcbiAgaWYgKF9rbmV4RGIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgX2tuZXhEYkNvbmZpZyA9IHsgLi4uZGVmYXVsdHMsIC4uLmdldEVudkNvbmZpZygpLCAuLi5jb25maWcgfTtcclxuXHJcbiAgICBpZiAoX2tuZXhEYkNvbmZpZy5kYlR5cGUgPT09IFN1cHBvcnRlZERiVHlwZS5zcWxpdGUpIHtcclxuICAgICAgX2tuZXhEYiA9IGtuZXgoe1xyXG4gICAgICAgIGNsaWVudDogRGJDbGllbnRbU3VwcG9ydGVkRGJUeXBlLnNxbGl0ZV0sXHJcbiAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgZmlsZW5hbWU6IF9rbmV4RGJDb25maWcuZmlsZVBhdGgsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwb29sOiB7XHJcbiAgICAgICAgICBhZnRlckNyZWF0ZTogKGRiOiBhbnksIGRvbmU6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIGRiLnByYWdtYShcImpvdXJuYWxfbW9kZSA9IFdBTDtcIik7XHJcbiAgICAgICAgICAgIGRvbmUoZmFsc2UsIGRvbmUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVzZU51bGxBc0RlZmF1bHQ6IHRydWUsXHJcbiAgICAgICAgZGVidWc6IF9rbmV4RGJDb25maWcudmVyYm9zZSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKF9rbmV4RGJDb25maWcuZGJUeXBlID09PSBTdXBwb3J0ZWREYlR5cGUucG9zdGdyZXMpIHtcclxuICAgICAgX2tuZXhEYiA9IGtuZXgoe1xyXG4gICAgICAgIGNsaWVudDogRGJDbGllbnRbU3VwcG9ydGVkRGJUeXBlLnBvc3RncmVzXSxcclxuICAgICAgICBjb25uZWN0aW9uOiBfa25leERiQ29uZmlnLnBnQ29ubmVjdGlvblN0cmluZyxcclxuICAgICAgICB1c2VOdWxsQXNEZWZhdWx0OiB0cnVlLFxyXG4gICAgICAgIGRlYnVnOiBfa25leERiQ29uZmlnLnZlcmJvc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChfa25leERiQ29uZmlnLmRiVHlwZSA9PT0gU3VwcG9ydGVkRGJUeXBlLm15c3FsKSB7XHJcbiAgICAgIGNvbnN0IFtob3N0LCBwb3J0LCB1c2VyLCBwYXNzd29yZCwgZGF0YWJhc2VdID1cclxuICAgICAgICBfa25leERiQ29uZmlnLm15c3FsQ29ubmVjdGlvblN0cmluZy5zcGxpdChcIjpcIik7XHJcbiAgICAgIF9rbmV4RGIgPSBrbmV4KHtcclxuICAgICAgICBjbGllbnQ6IERiQ2xpZW50W1N1cHBvcnRlZERiVHlwZS5teXNxbF0sXHJcbiAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgaG9zdCxcclxuICAgICAgICAgIHBvcnQ6IE51bWJlcihwb3J0KSxcclxuICAgICAgICAgIHVzZXIsXHJcbiAgICAgICAgICBwYXNzd29yZCxcclxuICAgICAgICAgIGRhdGFiYXNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXNlTnVsbEFzRGVmYXVsdDogdHJ1ZSxcclxuICAgICAgICBkZWJ1ZzogX2tuZXhEYkNvbmZpZy52ZXJib3NlLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgREIgdHlwZTogJHtfa25leERiQ29uZmlnLmRiVHlwZX1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBfa25leERiO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzUG9zdGdyZXMgPSAoa25leDogS25leCk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiBrbmV4LmNsaWVudC5jb25maWcuY2xpZW50ID09PSBEYkNsaWVudFtTdXBwb3J0ZWREYlR5cGUucG9zdGdyZXNdO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzU3FsaXRlID0gKGtuZXg6IEtuZXgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4ga25leC5jbGllbnQuY29uZmlnLmNsaWVudCA9PT0gRGJDbGllbnRbU3VwcG9ydGVkRGJUeXBlLnNxbGl0ZV07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNNeXNxbCA9IChrbmV4OiBLbmV4KTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIGtuZXguY2xpZW50LmNvbmZpZy5jbGllbnQgPT09IERiQ2xpZW50W1N1cHBvcnRlZERiVHlwZS5teXNxbF07XHJcbn07XHJcblxyXG5jb25zdCBnZXRNaWdyYXRpb25Db25maWcgPSAoKTogS25leC5NaWdyYXRvckNvbmZpZyA9PiB7XHJcbiAgcmV0dXJuIHsgZGlyZWN0b3J5OiBqb2luKF9fZGlybmFtZSwgXCJtaWdyYXRpb25zXCIpIH07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaW5pdERiID0gYXN5bmMgKGNvbmZpZzogUGFydGlhbDxEYkNvbmZpZz4gPSB7fSk6IFByb21pc2U8S25leD4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoY29uZmlnKTtcclxuICBhd2FpdCBrbmV4Lm1pZ3JhdGUubGF0ZXN0KGdldE1pZ3JhdGlvbkNvbmZpZygpKTtcclxuICByZXR1cm4ga25leDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBjbGVhckRiID0gYXN5bmMgKFxyXG4gIGNvbmZpZzogUGFydGlhbDxEYkNvbmZpZz4gPSB7fVxyXG4pOiBQcm9taXNlPEtuZXg+ID0+IHtcclxuICBjb25zdCBrbmV4ID0gZ2V0S25leERiKGNvbmZpZyk7XHJcbiAgYXdhaXQga25leC5taWdyYXRlLnJvbGxiYWNrKGdldE1pZ3JhdGlvbkNvbmZpZygpLCB0cnVlKTtcclxuICBhd2FpdCBrbmV4Lm1pZ3JhdGUubGF0ZXN0KGdldE1pZ3JhdGlvbkNvbmZpZygpKTtcclxuICByZXR1cm4ga25leDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkaXNjb25uZWN0S25leCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICBpZiAoX2tuZXhEYikge1xyXG4gICAgYXdhaXQgX2tuZXhEYi5kZXN0cm95KCk7XHJcbiAgICBfa25leERiID0gdW5kZWZpbmVkO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEVudkNvbmZpZyA9ICgpOiBQYXJ0aWFsPERiQ29uZmlnPiA9PiB7XHJcbiAgY29uZmlnRG90ZW52KHsgcGF0aDogXCIuZW52LmxvY2FsXCIgfSk7XHJcbiAgY29uc3QgZW52Q29uZmlnOiBQYXJ0aWFsPERiQ29uZmlnPiA9IHt9O1xyXG4gIGlmIChcclxuICAgIHByb2Nlc3MuZW52LlRFWFRUT01BUF9EQl9UWVBFICYmXHJcbiAgICBPYmplY3QudmFsdWVzKFN1cHBvcnRlZERiVHlwZSkuaW5jbHVkZXMoXHJcbiAgICAgIHByb2Nlc3MuZW52LlRFWFRUT01BUF9EQl9UWVBFIGFzIFN1cHBvcnRlZERiVHlwZVxyXG4gICAgKVxyXG4gICkge1xyXG4gICAgZW52Q29uZmlnLmRiVHlwZSA9IHByb2Nlc3MuZW52LlRFWFRUT01BUF9EQl9UWVBFIGFzIFN1cHBvcnRlZERiVHlwZTtcclxuICAgIGlmIChlbnZDb25maWcuZGJUeXBlID09PSBTdXBwb3J0ZWREYlR5cGUucG9zdGdyZXMpIHtcclxuICAgICAgaWYgKCFwcm9jZXNzLmVudi5URVhUVE9NQVBfUEdfQ09OTkVDVElPTl9TVFJJTkcpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBcIkVudmlyb25tZW50YWwgdmFyaWFibGUgJ1RFWFRUT01BUF9QR19DT05ORUNUSU9OX1NUUklORycgbXVzdCBiZSBzZXQgZm9yIFBvc3RncmVTUUwuXCJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGVudkNvbmZpZy5wZ0Nvbm5lY3Rpb25TdHJpbmcgPSBwcm9jZXNzLmVudi5URVhUVE9NQVBfUEdfQ09OTkVDVElPTl9TVFJJTkc7XHJcbiAgICB9IGVsc2UgaWYgKGVudkNvbmZpZy5kYlR5cGUgPT09IFN1cHBvcnRlZERiVHlwZS5teXNxbCkge1xyXG4gICAgICBpZiAoIXByb2Nlc3MuZW52LlRFWFRUT01BUF9NWVNRTF9DT05ORUNUSU9OX0RBVEEpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBcIkVudmlyb25tZW50YWwgdmFyaWFibGUgJ1RFWFRUT01BUF9NWVNRTF9DT05ORUNUSU9OX0RBVEEnIG11c3QgYmUgc2V0IGZvciBNeVNRTCBvciBNYXJpYURCLlwiXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgICFteXNxbENvbm5lY3Rpb25TdHJpbmdQYXR0ZXJuLnRlc3QoXHJcbiAgICAgICAgICBwcm9jZXNzLmVudi5URVhUVE9NQVBfTVlTUUxfQ09OTkVDVElPTl9EQVRBXHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBcIkVudmlyb25tZW50YWwgdmFyaWFibGUgJ1RFWFRUT01BUF9NWVNRTF9DT05ORUNUSU9OX0RBVEEnIG11c3QgYmUgaW4gZm9ybWF0ICdob3N0OnBvcnQ6dXNlcjpwYXNzd29yZDpkYXRhYmFzZScuXCJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGVudkNvbmZpZy5teXNxbENvbm5lY3Rpb25TdHJpbmcgPVxyXG4gICAgICAgIHByb2Nlc3MuZW52LlRFWFRUT01BUF9NWVNRTF9DT05ORUNUSU9OX0RBVEE7XHJcbiAgICB9IGVsc2UgaWYgKGVudkNvbmZpZy5kYlR5cGUgPT09IFN1cHBvcnRlZERiVHlwZS5zcWxpdGUpIHtcclxuICAgICAgaWYgKHByb2Nlc3MuZW52LlRFWFRUT01BUF9TUUxJVEVfUEFUSCkge1xyXG4gICAgICAgIGVudkNvbmZpZy5maWxlUGF0aCA9IHByb2Nlc3MuZW52LlRFWFRUT01BUF9TUUxJVEVfUEFUSDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gZW52Q29uZmlnO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IG5vbkVtcHR5T3JOdWxsID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcclxuICByZXR1cm4gdmFsdWUgPyB2YWx1ZSA6IG51bGw7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgcmF3UXVlcnkgPSBhc3luYyAoXHJcbiAgcXVlcnk6IHN0cmluZyxcclxuICAuLi5iaW5kaW5nczogcmVhZG9ubHkgS25leC5SYXdCaW5kaW5nW11cclxuKTogUHJvbWlzZTxhbnlbXT4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBrbmV4LnJhdyhxdWVyeSwgLi4uYmluZGluZ3MpO1xyXG4gIHJldHVybiBpc015c3FsKGtuZXgpID8gcmVzdWx0WzBdIDogcmVzdWx0O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEVmZmljaWVudGx5IGluc2VydCBtdWx0aXBsZSByb3dzLiBJZiBwcmV2ZW50RHVwbGljYXRlc0J5Rmlyc3RDb2x1bW4gaXMgdHJ1ZSwgdGhlIGZpcnN0XHJcbiAqIGNvbHVtbiBzaG91bGQgYmUgdW5pcXVlIChQSyBvciBVTklRVUUpLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGluc2VydE11bHRpcGxlUm93cyA9IGFzeW5jIChcclxuICByb3dzOiBzdHJpbmdbXVtdLFxyXG4gIHRhYmxlOiBzdHJpbmcsXHJcbiAgY29sdW1uTmFtZXM6IHN0cmluZ1tdLFxyXG4gIHByZXZlbnREdXBsaWNhdGVzOiBib29sZWFuID0gdHJ1ZVxyXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBpbnNlcnRQbGFjZWhvbGRlcnMgPSBnZW5lcmF0ZTJEUGxhY2Vob2xkZXJzKFxyXG4gICAgY29sdW1uTmFtZXMubGVuZ3RoLFxyXG4gICAgcm93cy5sZW5ndGhcclxuICApO1xyXG5cclxuICBjb25zdCBrbmV4ID0gZ2V0S25leERiKCk7XHJcblxyXG4gIGNvbnN0IG9uQ29uZmljdCA9XHJcbiAgICBwcmV2ZW50RHVwbGljYXRlcyAmJiAhaXNNeXNxbChrbmV4KSA/IGBPTiBDT05GTElDVCBETyBOT1RISU5HYCA6IFwiXCI7XHJcblxyXG4gIGF3YWl0IHJhd1F1ZXJ5KFxyXG4gICAgYElOU0VSVCAke2lzTXlzcWwoa25leCkgPyBcIklHTk9SRVwiIDogXCJcIn0gSU5UTyAke3RhYmxlfSAoJHtjb2x1bW5OYW1lcy5qb2luKFxyXG4gICAgICBcIixcIlxyXG4gICAgKX0pIFZBTFVFUyAke2luc2VydFBsYWNlaG9sZGVyc30gJHtvbkNvbmZpY3R9YCxcclxuICAgIHJvd3MuZmxhdCgpXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHJvd3MubGVuZ3RoO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEluc2VydCBhIHNpbmdsZSByb3cgYW5kIHJldHVybiB0aGUgYXV0b2luY3JlbWVudGVkIElELlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGluc2VydEF1dG9pbmNyZW1lbnRSb3cgPSBhc3luYyAoXHJcbiAgcm93OiBhbnlbXSxcclxuICB0YWJsZTogc3RyaW5nLFxyXG4gIGNvbHVtbk5hbWVzOiBzdHJpbmdbXVxyXG4pOiBQcm9taXNlPG51bWJlciB8IG51bGw+ID0+IHtcclxuICBjb25zdCBkYXRhID0gY29sdW1uTmFtZXMucmVkdWNlKChvYmosIGNvbHVtbk5hbWUsIGluZGV4KSA9PiB7XHJcbiAgICBvYmpbY29sdW1uTmFtZV0gPSByb3dbaW5kZXhdO1xyXG4gICAgcmV0dXJuIG9iajtcclxuICB9LCB7fSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEtuZXhEYigpLmluc2VydChkYXRhKS5pbnRvKHRhYmxlKTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdCA/IE51bWJlcihyZXN1bHQpIDogbnVsbDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWxldGVNdWx0aXBsZVJvd3NLbmV4ID0gYXN5bmMgKFxyXG4gIGtleXM6IHN0cmluZ1tdLFxyXG4gIHRhYmxlOiBzdHJpbmcsXHJcbiAga2V5Q29sdW1uTmFtZTogc3RyaW5nXHJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBhd2FpdCBnZXRLbmV4RGIoKS5mcm9tKHRhYmxlKS53aGVyZUluKGtleUNvbHVtbk5hbWUsIGtleXMpLmRlbCgpO1xyXG59O1xyXG5cclxuY29uc3QgZ2VuZXJhdGVSZXBldGl0aXZlU3RyaW5nID0gKFxyXG4gIHZhbHVlOiBzdHJpbmcsXHJcbiAgZ2x1ZTogc3RyaW5nLFxyXG4gIG46IG51bWJlclxyXG4pOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBuZXcgQXJyYXkobikuZmlsbCh2YWx1ZSkuam9pbihnbHVlKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVBsYWNlaG9sZGVycyA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBnZW5lcmF0ZVJlcGV0aXRpdmVTdHJpbmcoXCI/XCIsIFwiLFwiLCBuKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZW5lcmF0ZTJEUGxhY2Vob2xkZXJzID0gKFxyXG4gIGlubmVyOiBudW1iZXIsXHJcbiAgb3V0ZXI6IG51bWJlclxyXG4pOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBnZW5lcmF0ZVJlcGV0aXRpdmVTdHJpbmcoXHJcbiAgICBgKCR7Z2VuZXJhdGVQbGFjZWhvbGRlcnMoaW5uZXIpfSlgLFxyXG4gICAgXCIsXCIsXHJcbiAgICBvdXRlclxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZXh0cmFjdEtleVZhbHVlc1BhaXJzID0gKFxyXG4gIGFycmF5OiBzdHJpbmdbXVtdLFxyXG4gIGtleUluZGV4OiBudW1iZXIsXHJcbiAgdmFsdWVzSW5kaWNlczogbnVtYmVyW11cclxuKTogc3RyaW5nW11bXSA9PiB7XHJcbiAgY29uc3Qgb2JqZWN0ID0gYXJyYXkucmVkdWNlKChhY2M6IG9iamVjdCwgZGF0YTogc3RyaW5nW10pID0+IHtcclxuICAgIGlmIChkYXRhW2tleUluZGV4XSkge1xyXG4gICAgICBhY2NbZGF0YVtrZXlJbmRleF1dID0gdmFsdWVzSW5kaWNlcy5tYXAoKGluZGV4OiBudW1iZXIpID0+XHJcbiAgICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtpbmRleF0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWNjO1xyXG4gIH0sIHt9KTtcclxuXHJcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkubWFwKChrZXkpID0+IFtrZXksIC4uLm9iamVjdFtrZXldXSk7XHJcbn07XHJcbiJdfQ==