@uql/core 0.4.81 → 0.4.84

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 (49) hide show
  1. package/README.md +36 -51
  2. package/dialect/abstractSqlDialect-spec.d.ts +49 -0
  3. package/dialect/abstractSqlDialect-spec.js +765 -0
  4. package/dialect/mysqlDialect.spec.d.ts +6 -0
  5. package/dialect/mysqlDialect.spec.js +33 -0
  6. package/dialect/postgresDialect.spec.d.ts +1 -0
  7. package/dialect/postgresDialect.spec.js +139 -0
  8. package/dialect/sqliteDialect.spec.d.ts +1 -0
  9. package/dialect/sqliteDialect.spec.js +12 -0
  10. package/entity/decorator/definition.js +18 -18
  11. package/entity/decorator/definition.spec.d.ts +1 -0
  12. package/entity/decorator/definition.spec.js +725 -0
  13. package/entity/decorator/relation.spec.d.ts +1 -0
  14. package/entity/decorator/relation.spec.js +55 -0
  15. package/options.spec.d.ts +1 -0
  16. package/options.spec.js +50 -0
  17. package/package.json +3 -3
  18. package/querier/abstractQuerier-it.d.ts +41 -0
  19. package/querier/abstractQuerier-it.js +410 -0
  20. package/querier/abstractSqlQuerier-it.d.ts +9 -0
  21. package/querier/abstractSqlQuerier-it.js +19 -0
  22. package/querier/abstractSqlQuerier-spec.d.ts +53 -0
  23. package/querier/abstractSqlQuerier-spec.js +607 -0
  24. package/querier/decorator/injectQuerier.spec.d.ts +1 -0
  25. package/querier/decorator/injectQuerier.spec.js +108 -0
  26. package/querier/decorator/transactional.spec.d.ts +1 -0
  27. package/querier/decorator/transactional.spec.js +241 -0
  28. package/repository/genericRepository.spec.d.ts +1 -0
  29. package/repository/genericRepository.spec.js +86 -0
  30. package/test/entityMock.d.ts +180 -0
  31. package/test/entityMock.js +451 -0
  32. package/test/index.d.ts +3 -0
  33. package/test/index.js +7 -0
  34. package/test/it.util.d.ts +4 -0
  35. package/test/it.util.js +60 -0
  36. package/test/spec.util.d.ts +13 -0
  37. package/test/spec.util.js +54 -0
  38. package/type/entity.d.ts +15 -20
  39. package/type/entity.js +1 -1
  40. package/type/utility.d.ts +1 -1
  41. package/type/utility.js +1 -1
  42. package/util/dialect.util.spec.d.ts +1 -0
  43. package/util/dialect.util.spec.js +23 -0
  44. package/util/object.util.spec.d.ts +1 -0
  45. package/util/object.util.spec.js +26 -0
  46. package/util/sql.util.spec.d.ts +1 -0
  47. package/util/sql.util.spec.js +164 -0
  48. package/util/string.util.spec.d.ts +1 -0
  49. package/util/string.util.spec.js +26 -0
@@ -0,0 +1,6 @@
1
+ import { AbstractSqlDialectSpec } from './abstractSqlDialect-spec';
2
+ export declare class MySqlDialectSpec extends AbstractSqlDialectSpec {
3
+ constructor();
4
+ shouldBeginTransaction(): void;
5
+ shouldFind$text(): void;
6
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MySqlDialectSpec = void 0;
4
+ const test_1 = require("@uql/core/test");
5
+ const abstractSqlDialect_spec_1 = require("./abstractSqlDialect-spec");
6
+ const mysqlDialect_1 = require("./mysqlDialect");
7
+ class MySqlDialectSpec extends abstractSqlDialect_spec_1.AbstractSqlDialectSpec {
8
+ constructor() {
9
+ super(new mysqlDialect_1.MySqlDialect());
10
+ }
11
+ shouldBeginTransaction() {
12
+ expect(this.dialect.beginTransactionCommand).toBe('START TRANSACTION');
13
+ }
14
+ shouldFind$text() {
15
+ expect(this.dialect.find(test_1.Item, {
16
+ $project: ['id'],
17
+ $filter: { $text: { $fields: ['name', 'description'], $value: 'some text' }, creatorId: 1 },
18
+ $limit: 30,
19
+ })).toBe("SELECT `id` FROM `Item` WHERE MATCH(`name`, `description`) AGAINST('some text') AND `creatorId` = 1 LIMIT 30");
20
+ expect(this.dialect.find(test_1.User, {
21
+ $project: { id: true },
22
+ $filter: {
23
+ $text: { $fields: ['name'], $value: 'something' },
24
+ name: { $ne: 'other unwanted' },
25
+ creatorId: 1,
26
+ },
27
+ $limit: 10,
28
+ })).toBe("SELECT `id` FROM `User` WHERE MATCH(`name`) AGAINST('something') AND `name` <> 'other unwanted' AND `creatorId` = 1 LIMIT 10");
29
+ }
30
+ }
31
+ exports.MySqlDialectSpec = MySqlDialectSpec;
32
+ (0, test_1.createSpec)(new MySqlDialectSpec());
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXlzcWxEaWFsZWN0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlhbGVjdC9teXNxbERpYWxlY3Quc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBd0Q7QUFDeEQsdUVBQW1FO0FBQ25FLGlEQUE4QztBQUU5QyxNQUFhLGdCQUFpQixTQUFRLGdEQUFzQjtJQUMxRDtRQUNFLEtBQUssQ0FBQyxJQUFJLDJCQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFUSxzQkFBc0I7UUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRVEsZUFBZTtRQUN0QixNQUFNLENBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBSSxFQUFFO1lBQ3RCLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNoQixPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7WUFDM0YsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDLENBQ0gsQ0FBQyxJQUFJLENBQUMsOEdBQThHLENBQUMsQ0FBQztRQUV2SCxNQUFNLENBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBSSxFQUFFO1lBQ3RCLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUU7WUFDdEIsT0FBTyxFQUFFO2dCQUNQLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUU7Z0JBQ2pELElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDL0IsU0FBUyxFQUFFLENBQUM7YUFDYjtZQUNELE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQyxDQUNILENBQUMsSUFBSSxDQUFDLDhIQUE4SCxDQUFDLENBQUM7SUFDekksQ0FBQztDQUNGO0FBOUJELDRDQThCQztBQUVELElBQUEsaUJBQVUsRUFBQyxJQUFJLGdCQUFnQixFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVNwZWMsIEl0ZW0sIFVzZXIgfSBmcm9tICdAdXFsL2NvcmUvdGVzdCc7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbERpYWxlY3RTcGVjIH0gZnJvbSAnLi9hYnN0cmFjdFNxbERpYWxlY3Qtc3BlYyc7XG5pbXBvcnQgeyBNeVNxbERpYWxlY3QgfSBmcm9tICcuL215c3FsRGlhbGVjdCc7XG5cbmV4cG9ydCBjbGFzcyBNeVNxbERpYWxlY3RTcGVjIGV4dGVuZHMgQWJzdHJhY3RTcWxEaWFsZWN0U3BlYyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKG5ldyBNeVNxbERpYWxlY3QoKSk7XG4gIH1cblxuICBvdmVycmlkZSBzaG91bGRCZWdpblRyYW5zYWN0aW9uKCkge1xuICAgIGV4cGVjdCh0aGlzLmRpYWxlY3QuYmVnaW5UcmFuc2FjdGlvbkNvbW1hbmQpLnRvQmUoJ1NUQVJUIFRSQU5TQUNUSU9OJyk7XG4gIH1cblxuICBvdmVycmlkZSBzaG91bGRGaW5kJHRleHQoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoSXRlbSwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICR0ZXh0OiB7ICRmaWVsZHM6IFsnbmFtZScsICdkZXNjcmlwdGlvbiddLCAkdmFsdWU6ICdzb21lIHRleHQnIH0sIGNyZWF0b3JJZDogMSB9LFxuICAgICAgICAkbGltaXQ6IDMwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBJdGVtYCBXSEVSRSBNQVRDSChgbmFtZWAsIGBkZXNjcmlwdGlvbmApIEFHQUlOU1QoJ3NvbWUgdGV4dCcpIEFORCBgY3JlYXRvcklkYCA9IDEgTElNSVQgMzBcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICAkdGV4dDogeyAkZmllbGRzOiBbJ25hbWUnXSwgJHZhbHVlOiAnc29tZXRoaW5nJyB9LFxuICAgICAgICAgIG5hbWU6IHsgJG5lOiAnb3RoZXIgdW53YW50ZWQnIH0sXG4gICAgICAgICAgY3JlYXRvcklkOiAxLFxuICAgICAgICB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBNQVRDSChgbmFtZWApIEFHQUlOU1QoJ3NvbWV0aGluZycpIEFORCBgbmFtZWAgPD4gJ290aGVyIHVud2FudGVkJyBBTkQgYGNyZWF0b3JJZGAgPSAxIExJTUlUIDEwXCIpO1xuICB9XG59XG5cbmNyZWF0ZVNwZWMobmV3IE15U3FsRGlhbGVjdFNwZWMoKSk7XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_1 = require("@uql/core/test");
4
+ const postgresDialect_1 = require("./postgresDialect");
5
+ class PostgresDialectSpec {
6
+ constructor() {
7
+ this.dialect = new postgresDialect_1.PostgresDialect();
8
+ }
9
+ shouldBeValidEscapeCharacter() {
10
+ expect(this.dialect.escapeIdChar).toBe('"');
11
+ }
12
+ shouldBeginTransaction() {
13
+ expect(this.dialect.beginTransactionCommand).toBe('BEGIN TRANSACTION');
14
+ }
15
+ shouldInsertMany() {
16
+ expect(this.dialect.insert(test_1.User, [
17
+ {
18
+ name: 'Some name 1',
19
+ email: 'someemail1@example.com',
20
+ createdAt: 123,
21
+ },
22
+ {
23
+ name: 'Some name 2',
24
+ email: 'someemail2@example.com',
25
+ createdAt: 456,
26
+ },
27
+ {
28
+ name: 'Some name 3',
29
+ email: 'someemail3@example.com',
30
+ createdAt: 789,
31
+ },
32
+ ])).toBe('INSERT INTO "User" ("name", "email", "createdAt") VALUES' +
33
+ " ('Some name 1', 'someemail1@example.com', 123)" +
34
+ ", ('Some name 2', 'someemail2@example.com', 456)" +
35
+ ", ('Some name 3', 'someemail3@example.com', 789)" +
36
+ ' RETURNING "id" "id"');
37
+ }
38
+ shouldInsertOne() {
39
+ expect(this.dialect.insert(test_1.User, {
40
+ name: 'Some Name',
41
+ email: 'someemail@example.com',
42
+ createdAt: 123,
43
+ })).toBe(`INSERT INTO "User" ("name", "email", "createdAt") VALUES ('Some Name', 'someemail@example.com', 123) RETURNING "id" "id"`);
44
+ }
45
+ shouldInsertWithOnInsertId() {
46
+ expect(this.dialect.insert(test_1.TaxCategory, {
47
+ name: 'Some Name',
48
+ createdAt: 123,
49
+ })).toMatch(/^INSERT INTO "TaxCategory" \("name", "createdAt", "pk"\) VALUES \('Some Name', 123, '.+'\) RETURNING "pk" "id"$/);
50
+ }
51
+ shouldFind$istartsWith() {
52
+ expect(this.dialect.find(test_1.User, {
53
+ $project: ['id'],
54
+ $filter: { name: { $istartsWith: 'Some' } },
55
+ $sort: { name: 1, id: -1 },
56
+ $skip: 0,
57
+ $limit: 50,
58
+ })).toBe(`SELECT "id" FROM "User" WHERE "name" ILIKE 'Some%' ORDER BY "name", "id" DESC LIMIT 50 OFFSET 0`);
59
+ expect(this.dialect.find(test_1.User, {
60
+ $project: { id: true },
61
+ $filter: { name: { $istartsWith: 'Some', $ne: 'Something' } },
62
+ $sort: { name: 1, id: -1 },
63
+ $skip: 0,
64
+ $limit: 50,
65
+ })).toBe(`SELECT "id" FROM "User" WHERE ("name" ILIKE 'Some%' AND "name" <> 'Something') ORDER BY "name", "id" DESC LIMIT 50 OFFSET 0`);
66
+ }
67
+ shouldFind$iendsWith() {
68
+ expect(this.dialect.find(test_1.User, {
69
+ $project: ['id'],
70
+ $filter: { name: { $iendsWith: 'Some' } },
71
+ $sort: { name: 1, id: -1 },
72
+ $skip: 0,
73
+ $limit: 50,
74
+ })).toBe(`SELECT "id" FROM "User" WHERE "name" ILIKE '%Some' ORDER BY "name", "id" DESC LIMIT 50 OFFSET 0`);
75
+ expect(this.dialect.find(test_1.User, {
76
+ $project: { id: true },
77
+ $filter: { name: { $iendsWith: 'Some', $ne: 'Something' } },
78
+ $sort: { name: 1, id: -1 },
79
+ $skip: 0,
80
+ $limit: 50,
81
+ })).toBe(`SELECT "id" FROM "User" WHERE ("name" ILIKE '%Some' AND "name" <> 'Something') ORDER BY "name", "id" DESC LIMIT 50 OFFSET 0`);
82
+ }
83
+ shouldFind$iincludes() {
84
+ expect(this.dialect.find(test_1.User, {
85
+ $project: ['id'],
86
+ $filter: { name: { $iincludes: 'Some' } },
87
+ $sort: { name: 1, id: -1 },
88
+ $skip: 0,
89
+ $limit: 50,
90
+ })).toBe(`SELECT "id" FROM "User" WHERE "name" ILIKE '%Some%' ORDER BY "name", "id" DESC LIMIT 50 OFFSET 0`);
91
+ expect(this.dialect.find(test_1.User, {
92
+ $project: { id: true },
93
+ $filter: { name: { $iincludes: 'Some', $ne: 'Something' } },
94
+ $sort: { name: 1, id: -1 },
95
+ $skip: 0,
96
+ $limit: 50,
97
+ })).toBe(`SELECT "id" FROM "User" WHERE ("name" ILIKE '%Some%' AND "name" <> 'Something') ORDER BY "name", "id" DESC LIMIT 50 OFFSET 0`);
98
+ }
99
+ shouldFind$ilike() {
100
+ expect(this.dialect.find(test_1.User, {
101
+ $project: ['id'],
102
+ $filter: { name: { $ilike: 'Some' } },
103
+ $sort: { name: 1, id: -1 },
104
+ $skip: 0,
105
+ $limit: 50,
106
+ })).toBe(`SELECT "id" FROM "User" WHERE "name" ILIKE 'Some' ORDER BY "name", "id" DESC LIMIT 50 OFFSET 0`);
107
+ expect(this.dialect.find(test_1.User, {
108
+ $project: { id: true },
109
+ $filter: { name: { $ilike: 'Some', $ne: 'Something' } },
110
+ $sort: { name: 1, id: -1 },
111
+ $skip: 0,
112
+ $limit: 50,
113
+ })).toBe(`SELECT "id" FROM "User" WHERE ("name" ILIKE 'Some' AND "name" <> 'Something') ORDER BY "name", "id" DESC LIMIT 50 OFFSET 0`);
114
+ }
115
+ shouldFind$regex() {
116
+ expect(this.dialect.find(test_1.User, {
117
+ $project: { id: true },
118
+ $filter: { name: { $regex: '^some' } },
119
+ })).toBe(`SELECT "id" FROM "User" WHERE "name" ~ '^some'`);
120
+ }
121
+ shouldFind$text() {
122
+ expect(this.dialect.find(test_1.Item, {
123
+ $project: { id: true },
124
+ $filter: { $text: { $fields: ['name', 'description'], $value: 'some text' }, code: '1' },
125
+ $limit: 30,
126
+ })).toBe(`SELECT "id" FROM "Item" WHERE to_tsvector("name" || ' ' || "description") @@ to_tsquery('some text') AND "code" = '1' LIMIT 30`);
127
+ expect(this.dialect.find(test_1.User, {
128
+ $project: { id: true },
129
+ $filter: {
130
+ $text: { $fields: ['name'], $value: 'something' },
131
+ name: { $ne: 'other unwanted' },
132
+ creatorId: 1,
133
+ },
134
+ $limit: 10,
135
+ })).toBe(`SELECT "id" FROM "User" WHERE to_tsvector("name") @@ to_tsquery('something') AND "name" <> 'other unwanted' AND "creatorId" = 1 LIMIT 10`);
136
+ }
137
+ }
138
+ (0, test_1.createSpec)(new PostgresDialectSpec());
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNEaWFsZWN0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlhbGVjdC9wb3N0Z3Jlc0RpYWxlY3Quc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFxRTtBQUNyRSx1REFBb0Q7QUFFcEQsTUFBTSxtQkFBbUI7SUFBekI7UUFDVyxZQUFPLEdBQUcsSUFBSSxpQ0FBZSxFQUFFLENBQUM7SUFpTDNDLENBQUM7SUEvS0MsNEJBQTRCO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE1BQU0sQ0FDSixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFJLEVBQUU7WUFDeEI7Z0JBQ0UsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLEtBQUssRUFBRSx3QkFBd0I7Z0JBQy9CLFNBQVMsRUFBRSxHQUFHO2FBQ2Y7WUFDRDtnQkFDRSxJQUFJLEVBQUUsYUFBYTtnQkFDbkIsS0FBSyxFQUFFLHdCQUF3QjtnQkFDL0IsU0FBUyxFQUFFLEdBQUc7YUFDZjtZQUNEO2dCQUNFLElBQUksRUFBRSxhQUFhO2dCQUNuQixLQUFLLEVBQUUsd0JBQXdCO2dCQUMvQixTQUFTLEVBQUUsR0FBRzthQUNmO1NBQ0YsQ0FBQyxDQUNILENBQUMsSUFBSSxDQUNKLDBEQUEwRDtZQUN4RCxpREFBaUQ7WUFDakQsa0RBQWtEO1lBQ2xELGtEQUFrRDtZQUNsRCxzQkFBc0IsQ0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxDQUNKLElBQUksQ0FBQyxPQUFPLENBQUMsTUFB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QUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFO2dCQUNqRCxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQy9CLFNBQVMsRUFBRSxDQUFDO2FBQ2I7WUFDRCxNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUMsQ0FDSCxDQUFDLElBQUksQ0FDSiwwSUFBMEksQ0FDM0ksQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELElBQUEsaUJBQVUsRUFBQyxJQUFJLG1CQUFtQixFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVzZXIsIEl0ZW0sIGNyZWF0ZVNwZWMsIFRheENhdGVnb3J5IH0gZnJvbSAnQHVxbC9jb3JlL3Rlc3QnO1xuaW1wb3J0IHsgUG9zdGdyZXNEaWFsZWN0IH0gZnJvbSAnLi9wb3N0Z3Jlc0RpYWxlY3QnO1xuXG5jbGFzcyBQb3N0Z3Jlc0RpYWxlY3RTcGVjIHtcbiAgcmVhZG9ubHkgZGlhbGVjdCA9IG5ldyBQb3N0Z3Jlc0RpYWxlY3QoKTtcblxuICBzaG91bGRCZVZhbGlkRXNjYXBlQ2hhcmFjdGVyKCkge1xuICAgIGV4cGVjdCh0aGlzLmRpYWxlY3QuZXNjYXBlSWRDaGFyKS50b0JlKCdcIicpO1xuICB9XG5cbiAgc2hvdWxkQmVnaW5UcmFuc2FjdGlvbigpIHtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmJlZ2luVHJhbnNhY3Rpb25Db21tYW5kKS50b0JlKCdCRUdJTiBUUkFOU0FDVElPTicpO1xuICB9XG5cbiAgc2hvdWxkSW5zZXJ0TWFueSgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KFVzZXIsIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMScsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwxQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMicsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwyQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDQ1NixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMycsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwzQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDc4OSxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS50b0JlKFxuICAgICAgJ0lOU0VSVCBJTlRPIFwiVXNlclwiIChcIm5hbWVcIiwgXCJlbWFpbFwiLCBcImNyZWF0ZWRBdFwiKSBWQUxVRVMnICtcbiAgICAgICAgXCIgKCdTb21lIG5hbWUgMScsICdzb21lZW1haWwxQGV4YW1wbGUuY29tJywgMTIzKVwiICtcbiAgICAgICAgXCIsICgnU29tZSBuYW1lIDInLCAnc29tZWVtYWlsMkBleGFtcGxlLmNvbScsIDQ1NilcIiArXG4gICAgICAgIFwiLCAoJ1NvbWUgbmFtZSAzJywgJ3NvbWVlbWFpbDNAZXhhbXBsZS5jb20nLCA3ODkpXCIgK1xuICAgICAgICAnIFJFVFVSTklORyBcImlkXCIgXCJpZFwiJ1xuICAgICk7XG4gIH1cblxuICBzaG91bGRJbnNlcnRPbmUoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0Lmluc2VydChVc2VyLCB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUnLFxuICAgICAgICBlbWFpbDogJ3NvbWVlbWFpbEBleGFtcGxlLmNvbScsXG4gICAgICAgIGNyZWF0ZWRBdDogMTIzLFxuICAgICAgfSlcbiAgICApLnRvQmUoYElOU0VSVCBJTlRPIFwiVXNlclwiIChcIm5hbWVcIiwgXCJlbWFpbFwiLCBcImNyZWF0ZWRBdFwiKSBWQUxVRVMgKCdTb21lIE5hbWUnLCAnc29tZWVtYWlsQGV4YW1wbGUuY29tJywgMTIzKSBSRVRVUk5JTkcgXCJpZFwiIFwiaWRcImApO1xuICB9XG5cbiAgc2hvdWxkSW5zZXJ0V2l0aE9uSW5zZXJ0SWQoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0Lmluc2VydChUYXhDYXRlZ29yeSwge1xuICAgICAgICBuYW1lOiAnU29tZSBOYW1lJyxcbiAgICAgICAgY3JlYXRlZEF0OiAxMjMsXG4gICAgICB9KVxuICAgICkudG9NYXRjaCgvXklOU0VSVCBJTlRPIFwiVGF4Q2F0ZWdvcnlcIiBcXChcIm5hbWVcIiwgXCJjcmVhdGVkQXRcIiwgXCJwa1wiXFwpIFZBTFVFUyBcXCgnU29tZSBOYW1lJywgMTIzLCAnLisnXFwpIFJFVFVSTklORyBcInBrXCIgXCJpZFwiJC8pO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpc3RhcnRzV2l0aCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaXN0YXJ0c1dpdGg6ICdTb21lJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKGBTRUxFQ1QgXCJpZFwiIEZST00gXCJVc2VyXCIgV0hFUkUgXCJuYW1lXCIgSUxJS0UgJ1NvbWUlJyBPUkRFUiBCWSBcIm5hbWVcIiwgXCJpZFwiIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBgKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IHRydWUgfSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpc3RhcnRzV2l0aDogJ1NvbWUnLCAkbmU6ICdTb21ldGhpbmcnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoYFNFTEVDVCBcImlkXCIgRlJPTSBcIlVzZXJcIiBXSEVSRSAoXCJuYW1lXCIgSUxJS0UgJ1NvbWUlJyBBTkQgXCJuYW1lXCIgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIFwibmFtZVwiLCBcImlkXCIgREVTQyBMSU1JVCA1MCBPRkZTRVQgMGApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpZW5kc1dpdGgoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGllbmRzV2l0aDogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoYFNFTEVDVCBcImlkXCIgRlJPTSBcIlVzZXJcIiBXSEVSRSBcIm5hbWVcIiBJTElLRSAnJVNvbWUnIE9SREVSIEJZIFwibmFtZVwiLCBcImlkXCIgREVTQyBMSU1JVCA1MCBPRkZTRVQgMGApO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGllbmRzV2l0aDogJ1NvbWUnLCAkbmU6ICdTb21ldGhpbmcnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoYFNFTEVDVCBcImlkXCIgRlJPTSBcIlVzZXJcIiBXSEVSRSAoXCJuYW1lXCIgSUxJS0UgJyVTb21lJyBBTkQgXCJuYW1lXCIgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIFwibmFtZVwiLCBcImlkXCIgREVTQyBMSU1JVCA1MCBPRkZTRVQgMGApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpaW5jbHVkZXMoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGlpbmNsdWRlczogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoYFNFTEVDVCBcImlkXCIgRlJPTSBcIlVzZXJcIiBXSEVSRSBcIm5hbWVcIiBJTElLRSAnJVNvbWUlJyBPUkRFUiBCWSBcIm5hbWVcIiwgXCJpZFwiIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBgKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IHRydWUgfSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpaW5jbHVkZXM6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKGBTRUxFQ1QgXCJpZFwiIEZST00gXCJVc2VyXCIgV0hFUkUgKFwibmFtZVwiIElMSUtFICclU29tZSUnIEFORCBcIm5hbWVcIiA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgXCJuYW1lXCIsIFwiaWRcIiBERVNDIExJTUlUIDUwIE9GRlNFVCAwYCk7XG4gIH1cblxuICBzaG91bGRGaW5kJGlsaWtlKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpbGlrZTogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoYFNFTEVDVCBcImlkXCIgRlJPTSBcIlVzZXJcIiBXSEVSRSBcIm5hbWVcIiBJTElLRSAnU29tZScgT1JERVIgQlkgXCJuYW1lXCIsIFwiaWRcIiBERVNDIExJTUlUIDUwIE9GRlNFVCAwYCk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaWxpa2U6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKGBTRUxFQ1QgXCJpZFwiIEZST00gXCJVc2VyXCIgV0hFUkUgKFwibmFtZVwiIElMSUtFICdTb21lJyBBTkQgXCJuYW1lXCIgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIFwibmFtZVwiLCBcImlkXCIgREVTQyBMSU1JVCA1MCBPRkZTRVQgMGApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRyZWdleCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkcmVnZXg6ICdec29tZScgfSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoYFNFTEVDVCBcImlkXCIgRlJPTSBcIlVzZXJcIiBXSEVSRSBcIm5hbWVcIiB+ICdec29tZSdgKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkdGV4dCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJHRleHQ6IHsgJGZpZWxkczogWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ10sICR2YWx1ZTogJ3NvbWUgdGV4dCcgfSwgY29kZTogJzEnIH0sXG4gICAgICAgICRsaW1pdDogMzAsXG4gICAgICB9KVxuICAgICkudG9CZShgU0VMRUNUIFwiaWRcIiBGUk9NIFwiSXRlbVwiIFdIRVJFIHRvX3RzdmVjdG9yKFwibmFtZVwiIHx8ICcgJyB8fCBcImRlc2NyaXB0aW9uXCIpIEBAIHRvX3RzcXVlcnkoJ3NvbWUgdGV4dCcpIEFORCBcImNvZGVcIiA9ICcxJyBMSU1JVCAzMGApO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7XG4gICAgICAgICAgJHRleHQ6IHsgJGZpZWxkczogWyduYW1lJ10sICR2YWx1ZTogJ3NvbWV0aGluZycgfSxcbiAgICAgICAgICBuYW1lOiB7ICRuZTogJ290aGVyIHVud2FudGVkJyB9LFxuICAgICAgICAgIGNyZWF0b3JJZDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgJGxpbWl0OiAxMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgYFNFTEVDVCBcImlkXCIgRlJPTSBcIlVzZXJcIiBXSEVSRSB0b190c3ZlY3RvcihcIm5hbWVcIikgQEAgdG9fdHNxdWVyeSgnc29tZXRoaW5nJykgQU5EIFwibmFtZVwiIDw+ICdvdGhlciB1bndhbnRlZCcgQU5EIFwiY3JlYXRvcklkXCIgPSAxIExJTUlUIDEwYFxuICAgICk7XG4gIH1cbn1cblxuY3JlYXRlU3BlYyhuZXcgUG9zdGdyZXNEaWFsZWN0U3BlYygpKTtcbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_1 = require("@uql/core/test");
4
+ const abstractSqlDialect_spec_1 = require("./abstractSqlDialect-spec");
5
+ const sqliteDialect_1 = require("./sqliteDialect");
6
+ class SqliteDialectSpec extends abstractSqlDialect_spec_1.AbstractSqlDialectSpec {
7
+ constructor() {
8
+ super(new sqliteDialect_1.SqliteDialect());
9
+ }
10
+ }
11
+ (0, test_1.createSpec)(new SqliteDialectSpec());
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsaXRlRGlhbGVjdC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3Qvc3FsaXRlRGlhbGVjdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQXdEO0FBQ3hELHVFQUFtRTtBQUNuRSxtREFBZ0Q7QUFFaEQsTUFBTSxpQkFBa0IsU0FBUSxnREFBc0I7SUFDcEQ7UUFDRSxLQUFLLENBQUMsSUFBSSw2QkFBYSxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUFFRCxJQUFBLGlCQUFVLEVBQUMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVTcGVjLCBJdGVtLCBVc2VyIH0gZnJvbSAnQHVxbC9jb3JlL3Rlc3QnO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxEaWFsZWN0U3BlYyB9IGZyb20gJy4vYWJzdHJhY3RTcWxEaWFsZWN0LXNwZWMnO1xuaW1wb3J0IHsgU3FsaXRlRGlhbGVjdCB9IGZyb20gJy4vc3FsaXRlRGlhbGVjdCc7XG5cbmNsYXNzIFNxbGl0ZURpYWxlY3RTcGVjIGV4dGVuZHMgQWJzdHJhY3RTcWxEaWFsZWN0U3BlYyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKG5ldyBTcWxpdGVEaWFsZWN0KCkpO1xuICB9XG59XG5cbmNyZWF0ZVNwZWMobmV3IFNxbGl0ZURpYWxlY3RTcGVjKCkpO1xuIl19
@@ -13,9 +13,6 @@ function defineField(entity, key, opts = {}) {
13
13
  const type = inferType(entity, key);
14
14
  opts = { ...opts, type };
15
15
  }
16
- if (typeof opts.reference === 'function') {
17
- opts = { ...opts, reference: { entity: opts.reference } };
18
- }
19
16
  meta.fields[key] = { ...meta.fields[key], ...{ name: key, ...opts } };
20
17
  return meta;
21
18
  }
@@ -135,31 +132,32 @@ function fillInverseSideRelations(relOpts) {
135
132
  const relEntity = relOpts.entity();
136
133
  const relMeta = getMeta(relEntity);
137
134
  relOpts.mappedBy = getMappedByRelationKey(relOpts);
138
- // reversing references here makes the SQL generation simpler (no need to check for `mappedBy`)
139
- const { cardinality, references, through } = relMeta.relations[relOpts.mappedBy];
140
- if (cardinality === '11' || cardinality === 'm1') {
141
- relOpts.references = references.map(({ local, foreign }) => ({
142
- local: foreign,
143
- foreign: local,
144
- }));
135
+ if (relMeta.fields[relOpts.mappedBy]) {
136
+ relOpts.references = [{ local: relMeta.id, foreign: relOpts.mappedBy }];
137
+ return;
145
138
  }
146
- else {
147
- relOpts.references = references.slice().reverse();
148
- relOpts.through = through;
139
+ const mappedByRelation = relMeta.relations[relOpts.mappedBy];
140
+ if (relOpts.cardinality === 'm1' || relOpts.cardinality === 'mm') {
141
+ relOpts.references = mappedByRelation.references.slice().reverse();
142
+ relOpts.through = mappedByRelation.through;
143
+ return;
149
144
  }
145
+ relOpts.references = mappedByRelation.references.map(({ local, foreign }) => ({
146
+ local: foreign,
147
+ foreign: local,
148
+ }));
150
149
  }
151
150
  function fillThroughRelations(entity) {
152
151
  const meta = ensureMeta(entity);
153
152
  meta.relations = (0, util_1.getKeys)(meta.fields).reduce((relations, key) => {
154
153
  const { reference } = meta.fields[key];
155
154
  if (reference) {
156
- const relEntityGetter = reference.entity;
157
- const relEntity = relEntityGetter();
155
+ const relEntity = reference();
158
156
  const relMeta = ensureMeta(relEntity);
159
157
  const relKey = key.slice(0, -relMeta.id.length);
160
158
  const relOpts = {
159
+ entity: reference,
161
160
  cardinality: 'm1',
162
- entity: relEntityGetter,
163
161
  references: [{ local: key, foreign: relMeta.id }],
164
162
  };
165
163
  relations[relKey] = relOpts;
@@ -177,7 +175,9 @@ function getMappedByRelationKey(relOpts) {
177
175
  return relOpts.mappedBy;
178
176
  }
179
177
  function getRelationKeyMap(meta) {
180
- return (0, util_1.getKeys)(meta.relations).reduce((acc, key) => {
178
+ return (0, util_1.getKeys)(meta.fields)
179
+ .concat((0, util_1.getKeys)(meta.relations))
180
+ .reduce((acc, key) => {
181
181
  acc[key] = key;
182
182
  return acc;
183
183
  }, {});
@@ -220,4 +220,4 @@ function isValidEntityType(type) {
220
220
  type !== Object);
221
221
  }
222
222
  exports.isValidEntityType = isValidEntityType;
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnRpdHkvZGVjb3JhdG9yL2RlZmluaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNEJBQTBCO0FBQzFCLHlDQUEwRTtBQWMxRSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUM7QUFDMUIsTUFBTSxPQUFPLEdBQUcsNEJBQTRCLENBQUM7QUFDN0MsTUFBTSxLQUFLLEdBQW9DLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQzVFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUM7QUFFeEIsU0FBZ0IsV0FBVyxDQUFJLE1BQWUsRUFBRSxHQUFXLEVBQUUsT0FBcUIsRUFBRTtJQUNsRixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDZCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0tBQzFCO0lBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFO1FBQ3hDLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztLQUMzRDtJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQ3RFLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQVhELGtD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Q0QsTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxTQUFTLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDbEUsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFJLE1BQWUsRUFBRSxHQUFXO0lBQ2hELE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUksTUFBZSxFQUFFLEdBQVc7SUFDdEQsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM1QyxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwRCxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ2hCLE1BQU0sU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLCtDQUErQyxZQUFZLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztLQUM3RztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFnQixpQkFBaUIsQ0FBQyxJQUFTO0lBQ3pDLE9BQU8sQ0FDTCxPQUFPLElBQUksS0FBSyxVQUFVO1FBQzFCLElBQUksS0FBSyxPQUFPO1FBQ2hCLElBQUksS0FBSyxNQUFNO1FBQ2YsSUFBSSxLQUFLLE1BQU07UUFDZixJQUFJLEtBQUssTUFBTTtRQUNmLElBQUksS0FBSyxJQUFJO1FBQ2IsSUFBSSxLQUFLLE1BQU07UUFDZixJQUFJLEtBQUssTUFBTSxDQUNoQixDQUFDO0FBQ0osQ0FBQztBQVhELDhDQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcbmltcG9ydCB7IGhhc0tleXMsIGxvd2VyRmlyc3QsIGdldEtleXMsIHVwcGVyRmlyc3QgfSBmcm9tICdAdXFsL2NvcmUvdXRpbCc7XG5pbXBvcnQge1xuICBSZWxhdGlvbk9wdGlvbnMsXG4gIEZpZWxkT3B0aW9ucyxcbiAgRW50aXR5T3B0aW9ucyxcbiAgRW50aXR5TWV0YSxcbiAgVHlwZSxcbiAgUmVsYXRpb25LZXlNYXAsXG4gIFJlZmVyZW5jZU9wdGlvbnMsXG4gIFJlbGF0aW9uS2V5LFxuICBGaWVsZEtleSxcbiAgSWRLZXksXG59IGZyb20gJ0B1cWwvY29yZS90eXBlJztcblxuY29uc3QgaG9sZGVyID0gZ2xvYmFsVGhpcztcbmNvbnN0IG1ldGFLZXkgPSAnQHVxbC9jb3JlL2VudGl0eS9kZWNvcmF0b3InO1xuY29uc3QgbWV0YXM6IE1hcDxUeXBlPGFueT4sIEVudGl0eU1ldGE8YW55Pj4gPSBob2xkZXJbbWV0YUtleV0gPz8gbmV3IE1hcCgpO1xuaG9sZGVyW21ldGFLZXldID0gbWV0YXM7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVGaWVsZDxFPihlbnRpdHk6IFR5cGU8RT4sIGtleTogc3RyaW5nLCBvcHRzOiBGaWVsZE9wdGlvbnMgPSB7fSk6IEVudGl0eU1ldGE8RT4ge1xuICBjb25zdCBtZXRhID0gZW5zdXJlTWV0YShlbnRpdHkpO1xuICBpZiAoIW9wdHMudHlwZSkge1xuICAgIGNvbnN0IHR5cGUgPSBpbmZlclR5cGUoZW50aXR5LCBrZXkpO1xuICAgIG9wdHMgPSB7IC4uLm9wdHMsIHR5cGUgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMucmVmZXJlbmNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb3B0cyA9IHsgLi4ub3B0cywgcmVmZXJlbmNlOiB7IGVudGl0eTogb3B0cy5yZWZlcmVuY2UgfSB9O1xuICB9XG4gIG1ldGEuZmllbGRzW2tleV0gPSB7IC4uLm1ldGEuZmllbGRzW2tleV0sIC4uLnsgbmFtZToga2V5LCAuLi5vcHRzIH0gfTtcbiAgcmV0dXJuIG1ldGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVJZDxFPihlbnRpdHk6IFR5cGU8RT4sIGtleTogc3RyaW5nLCBvcHRzOiBGaWVsZE9wdGlvbnMpOiBFbnRpdHlNZXRhPEU+IHtcbiAgY29uc3QgbWV0YSA9IGVuc3VyZU1ldGEoZW50aXR5KTtcbiAgY29uc3QgaWQgPSBnZXRJZEtleShtZXRhKTtcbiAgaWYgKGlkKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKGAnJHtlbnRpdHkubmFtZX0nIG11c3QgaGF2ZSBhIHNpbmdsZSBmaWVsZCBkZWNvcmF0ZWQgd2l0aCBASWRgKTtcbiAgfVxuICByZXR1cm4gZGVmaW5lRmllbGQoZW50aXR5LCBrZXksIHsgLi4ub3B0cywgaXNJZDogdHJ1ZSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlbGF0aW9uPEU+KGVudGl0eTogVHlwZTxFPiwga2V5OiBzdHJpbmcsIG9wdHM6IFJlbGF0aW9uT3B0aW9uczxFPik6IEVudGl0eU1ldGE8RT4ge1xuICBpZiAoIW9wdHMuZW50aXR5KSB7XG4gICAgY29uc3QgaW5mZXJyZWRUeXBlID0gaW5mZXJFbnRpdHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICBvcHRzLmVudGl0eSA9ICgpID0+IGluZmVycmVkVHlwZTtcbiAgfVxuICBjb25zdCBtZXRhID0gZW5zdXJlTWV0YShlbnRpdHkpO1xuICBtZXRhLnJlbGF0aW9uc1trZXldID0geyAuLi5tZXRhLnJlbGF0aW9uc1trZXldLCAuLi5vcHRzIH07XG4gIHJldHVybiBtZXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRW50aXR5PEU+KGVudGl0eTogVHlwZTxFPiwgb3B0czogRW50aXR5T3B0aW9ucyA9IHt9KTogRW50aXR5TWV0YTxFPiB7XG4gIGNvbnN0IG1ldGEgPSBlbnN1cmVNZXRhKGVudGl0eSk7XG5cbiAgaWYgKCFoYXNLZXlzKG1ldGEuZmllbGRzKSkge1xuICAgIHRocm93IFR5cGVFcnJvcihgJyR7ZW50aXR5Lm5hbWV9JyBtdXN0IGhhdmUgZmllbGRzYCk7XG4gIH1cblxuICBjb25zdCBvbkRlbGV0ZUtleXMgPSBnZXRLZXlzKG1ldGEuZmllbGRzKS5maWx0ZXIoKGtleSkgPT4gbWV0YS5maWVsZHNba2V5XS5vbkRlbGV0ZSkgYXMgRmllbGRLZXk8RT5bXTtcblxuICBpZiAob25EZWxldGVLZXlzLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoYCcke2VudGl0eS5uYW1lfScgbXVzdCBoYXZlIG9uZSBmaWVsZCB3aXRoICdvbkRlbGV0ZScgYXMgbWF4aW11bWApO1xuICB9XG5cbiAgaWYgKG9wdHMuc29mdERlbGV0ZSkge1xuICAgIGlmICghb25EZWxldGVLZXlzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKGAnJHtlbnRpdHkubmFtZX0nIG11c3QgaGF2ZSBvbmUgZmllbGQgd2l0aCAnb25EZWxldGUnIHRvIGVuYWJsZSAnc29mdERlbGV0ZSdgKTtcbiAgICB9XG4gICAgbWV0YS5zb2Z0RGVsZXRlID0gb25EZWxldGVLZXlzWzBdO1xuICB9XG5cbiAgbWV0YS5uYW1lID0gb3B0cy5uYW1lID8/IGVudGl0eS5uYW1lO1xuICBsZXQgcHJvdG86IEZ1bmN0aW9uQ29uc3RydWN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZW50aXR5LnByb3RvdHlwZSk7XG5cbiAgd2hpbGUgKHByb3RvLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpIHtcbiAgICBjb25zdCBwYXJlbnRNZXRhID0gZW5zdXJlTWV0YShwcm90by5jb25zdHJ1Y3RvciBhcyBUeXBlPEU+KTtcbiAgICBleHRlbmRNZXRhKG1ldGEsIHBhcmVudE1ldGEpO1xuICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuXG4gIGNvbnN0IGlkID0gZ2V0SWRLZXkobWV0YSk7XG4gIGlmICghaWQpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoYCcke2VudGl0eS5uYW1lfScgbXVzdCBoYXZlIG9uZSBmaWVsZCBkZWNvcmF0ZWQgd2l0aCBASWRgKTtcbiAgfVxuICBtZXRhLmlkID0gaWQ7XG5cbiAgcmV0dXJuIG1ldGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnRpdGllcygpOiBUeXBlPGFueT5bXSB7XG4gIHJldHVybiBbLi4ubWV0YXMuZW50cmllcygpXS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsXSkgPT4ge1xuICAgIGlmICh2YWwuaWQpIHtcbiAgICAgIGFjYy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlTWV0YTxFPihlbnRpdHk6IFR5cGU8RT4pOiBFbnRpdHlNZXRhPEU+IHtcbiAgbGV0IG1ldGEgPSBtZXRhcy5nZXQoZW50aXR5KTtcbiAgaWYgKG1ldGEpIHtcbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuICBtZXRhID0geyBlbnRpdHksIGZpZWxkczoge30sIHJlbGF0aW9uczoge30gfTtcbiAgbWV0YXMuc2V0KGVudGl0eSwgbWV0YSk7XG4gIHJldHVybiBtZXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWV0YTxFPihlbnRpdHk6IFR5cGU8RT4pOiBFbnRpdHlNZXRhPEU+IHtcbiAgY29uc3QgbWV0YSA9IG1ldGFzLmdldChlbnRpdHkpO1xuICBpZiAoIW1ldGEpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoYCcke2VudGl0eS5uYW1lfScgaXMgbm90IGFuIGVudGl0eWApO1xuICB9XG4gIGlmIChtZXRhLnByb2Nlc3NlZCkge1xuICAgIHJldHVybiBtZXRhO1xuICB9XG4gIG1ldGEucHJvY2Vzc2VkID0gdHJ1ZTtcbiAgcmV0dXJuIGZpbGxSZWxhdGlvbnMobWV0YSk7XG59XG5cbmZ1bmN0aW9uIGZpbGxSZWxhdGlvbnM8RT4obWV0YTogRW50aXR5TWV0YTxFPik6IEVudGl0eU1ldGE8RT4ge1xuICBmb3IgKGNvbnN0IHJlbEtleSBpbiBtZXRhLnJlbGF0aW9ucykge1xuICAgIGNvbnN0IHJlbE9wdHMgPSBtZXRhLnJlbGF0aW9uc1tyZWxLZXkgYXMgUmVsYXRpb25LZXk8RT5dO1xuXG4gICAgaWYgKHJlbE9wdHMucmVmZXJlbmNlcykge1xuICAgICAgLy8gcmVmZXJlbmNlcyB3ZXJlIG1hbnVhbGx5IHNwZWNpZmllZFxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHJlbE9wdHMubWFwcGVkQnkpIHtcbiAgICAgIGZpbGxJbnZlcnNlU2lkZVJlbGF0aW9ucyhyZWxPcHRzKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbEVudGl0eSA9IHJlbE9wdHMuZW50aXR5KCk7XG4gICAgY29uc3QgcmVsTWV0YSA9IGVuc3VyZU1ldGEocmVsRW50aXR5KTtcblxuICAgIGlmIChyZWxPcHRzLmNhcmRpbmFsaXR5ID09PSAnbW0nKSB7XG4gICAgICBjb25zdCBpZE5hbWUgPSBtZXRhLmZpZWxkc1ttZXRhLmlkXS5uYW1lO1xuICAgICAgY29uc3QgcmVsSWROYW1lID0gcmVsTWV0YS5maWVsZHNbcmVsTWV0YS5pZF0ubmFtZTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGxvd2VyRmlyc3QobWV0YS5uYW1lKSArIHVwcGVyRmlyc3QoaWROYW1lKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGxvd2VyRmlyc3QocmVsTWV0YS5uYW1lKSArIHVwcGVyRmlyc3QocmVsSWROYW1lKTtcbiAgICAgIHJlbE9wdHMucmVmZXJlbmNlcyA9IFtcbiAgICAgICAgeyBsb2NhbDogc291cmNlLCBmb3JlaWduOiBtZXRhLmlkIH0sXG4gICAgICAgIHsgbG9jYWw6IHRhcmdldCwgZm9yZWlnbjogcmVsTWV0YS5pZCB9LFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVsT3B0cy5yZWZlcmVuY2VzID0gW3sgbG9jYWw6IGAke3JlbEtleX1JZGAsIGZvcmVpZ246IHJlbE1ldGEuaWQgfV07XG4gICAgfVxuXG4gICAgaWYgKHJlbE9wdHMudGhyb3VnaCkge1xuICAgICAgZmlsbFRocm91Z2hSZWxhdGlvbnMocmVsT3B0cy50aHJvdWdoKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXRhO1xufVxuXG5mdW5jdGlvbiBmaWxsSW52ZXJzZVNpZGVSZWxhdGlvbnM8RT4ocmVsT3B0czogUmVsYXRpb25PcHRpb25zPEU+KTogdm9pZCB7XG4gIGNvbnN0IHJlbEVudGl0eSA9IHJlbE9wdHMuZW50aXR5KCk7XG4gIGNvbnN0IHJlbE1ldGEgPSBnZXRNZXRhKHJlbEVudGl0eSk7XG4gIHJlbE9wdHMubWFwcGVkQnkgPSBnZXRNYXBwZWRCeVJlbGF0aW9uS2V5KHJlbE9wdHMpO1xuXG4gIC8vIHJldmVyc2luZyByZWZlcmVuY2VzIGhlcmUgbWFrZXMgdGhlIFNRTCBnZW5lcmF0aW9uIHNpbXBsZXIgKG5vIG5lZWQgdG8gY2hlY2sgZm9yIGBtYXBwZWRCeWApXG4gIGNvbnN0IHsgY2FyZGluYWxpdHksIHJlZmVyZW5jZXMsIHRocm91Z2ggfSA9IHJlbE1ldGEucmVsYXRpb25zW3JlbE9wdHMubWFwcGVkQnldO1xuICBpZiAoY2FyZGluYWxpdHkgPT09ICcxMScgfHwgY2FyZGluYWxpdHkgPT09ICdtMScpIHtcbiAgICByZWxPcHRzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzLm1hcCgoeyBsb2NhbCwgZm9yZWlnbiB9KSA9PiAoe1xuICAgICAgbG9jYWw6IGZvcmVpZ24sXG4gICAgICBmb3JlaWduOiBsb2NhbCxcbiAgICB9KSk7XG4gIH0gZWxzZSB7XG4gICAgcmVsT3B0cy5yZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5zbGljZSgpLnJldmVyc2UoKTtcbiAgICByZWxPcHRzLnRocm91Z2ggPSB0aHJvdWdoO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbGxUaHJvdWdoUmVsYXRpb25zPEU+KGVudGl0eTogVHlwZTxFPik6IHZvaWQge1xuICBjb25zdCBtZXRhID0gZW5zdXJlTWV0YShlbnRpdHkpO1xuICBtZXRhLnJlbGF0aW9ucyA9IGdldEtleXMobWV0YS5maWVsZHMpLnJlZHVjZSgocmVsYXRpb25zLCBrZXkpID0+IHtcbiAgICBjb25zdCB7IHJlZmVyZW5jZSB9ID0gbWV0YS5maWVsZHNba2V5XTtcbiAgICBpZiAocmVmZXJlbmNlKSB7XG4gICAgICBjb25zdCByZWxFbnRpdHlHZXR0ZXIgPSAocmVmZXJlbmNlIGFzIFJlZmVyZW5jZU9wdGlvbnMpLmVudGl0eTtcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IHJlbEVudGl0eUdldHRlcigpO1xuICAgICAgY29uc3QgcmVsTWV0YSA9IGVuc3VyZU1ldGEocmVsRW50aXR5KTtcbiAgICAgIGNvbnN0IHJlbEtleSA9IGtleS5zbGljZSgwLCAtcmVsTWV0YS5pZC5sZW5ndGgpO1xuICAgICAgY29uc3QgcmVsT3B0czogUmVsYXRpb25PcHRpb25zID0ge1xuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgZW50aXR5OiByZWxFbnRpdHlHZXR0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IFt7IGxvY2FsOiBrZXksIGZvcmVpZ246IHJlbE1ldGEuaWQgfV0sXG4gICAgICB9O1xuICAgICAgcmVsYXRpb25zW3JlbEtleV0gPSByZWxPcHRzO1xuICAgIH1cbiAgICByZXR1cm4gcmVsYXRpb25zO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGdldE1hcHBlZEJ5UmVsYXRpb25LZXk8RT4ocmVsT3B0czogUmVsYXRpb25PcHRpb25zPEU+KTogUmVsYXRpb25LZXk8RT4ge1xuICBpZiAodHlwZW9mIHJlbE9wdHMubWFwcGVkQnkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCByZWxFbnRpdHkgPSByZWxPcHRzLmVudGl0eSgpO1xuICAgIGNvbnN0IHJlbE1ldGEgPSBlbnN1cmVNZXRhKHJlbEVudGl0eSk7XG4gICAgY29uc3Qga2V5TWFwID0gZ2V0UmVsYXRpb25LZXlNYXAocmVsTWV0YSk7XG4gICAgcmV0dXJuIHJlbE9wdHMubWFwcGVkQnkoa2V5TWFwKTtcbiAgfVxuICByZXR1cm4gcmVsT3B0cy5tYXBwZWRCeTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVsYXRpb25LZXlNYXA8RT4obWV0YTogRW50aXR5TWV0YTxFPik6IFJlbGF0aW9uS2V5TWFwPEU+IHtcbiAgcmV0dXJuIGdldEtleXMobWV0YS5yZWxhdGlvbnMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICBhY2Nba2V5XSA9IGtleTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBSZWxhdGlvbktleU1hcDxFPik7XG59XG5cbmZ1bmN0aW9uIGdldElkS2V5PEU+KG1ldGE6IEVudGl0eU1ldGE8RT4pOiBJZEtleTxFPiB7XG4gIGNvbnN0IGlkID0gZ2V0S2V5cyhtZXRhLmZpZWxkcykuZmluZCgoa2V5KSA9PiBtZXRhLmZpZWxkc1trZXldPy5pc0lkKTtcbiAgcmV0dXJuIGlkIGFzIElkS2V5PEU+O1xufVxuXG5mdW5jdGlvbiBleHRlbmRNZXRhPEU+KHRhcmdldDogRW50aXR5TWV0YTxFPiwgc291cmNlOiBFbnRpdHlNZXRhPEU+KTogdm9pZCB7XG4gIGNvbnN0IHNvdXJjZUZpZWxkcyA9IHsgLi4uc291cmNlLmZpZWxkcyB9O1xuICBjb25zdCB0YXJnZXRJZCA9IGdldElkS2V5KHRhcmdldCk7XG4gIGlmICh0YXJnZXRJZCkge1xuICAgIGNvbnN0IHNvdXJjZUlkID0gZ2V0SWRLZXkoc291cmNlKTtcbiAgICBpZiAoc291cmNlSWQpIHtcbiAgICAgIGRlbGV0ZSBzb3VyY2VGaWVsZHNbc291cmNlSWRdO1xuICAgIH1cbiAgfVxuICB0YXJnZXQuZmllbGRzID0geyAuLi5zb3VyY2VGaWVsZHMsIC4uLnRhcmdldC5maWVsZHMgfTtcbiAgdGFyZ2V0LnJlbGF0aW9ucyA9IHsgLi4uc291cmNlLnJlbGF0aW9ucywgLi4udGFyZ2V0LnJlbGF0aW9ucyB9O1xufVxuXG5mdW5jdGlvbiBpbmZlclR5cGU8RT4oZW50aXR5OiBUeXBlPEU+LCBrZXk6IHN0cmluZyk6IGFueSB7XG4gIHJldHVybiBSZWZsZWN0LmdldE1ldGFkYXRhKCdkZXNpZ246dHlwZScsIGVudGl0eS5wcm90b3R5cGUsIGtleSk7XG59XG5cbmZ1bmN0aW9uIGluZmVyRW50aXR5VHlwZTxFPihlbnRpdHk6IFR5cGU8RT4sIGtleTogc3RyaW5nKTogVHlwZTxhbnk+IHtcbiAgY29uc3QgaW5mZXJyZWRUeXBlID0gaW5mZXJUeXBlKGVudGl0eSwga2V5KTtcbiAgY29uc3QgaXNWYWxpZFR5cGUgPSBpc1ZhbGlkRW50aXR5VHlwZShpbmZlcnJlZFR5cGUpO1xuICBpZiAoIWlzVmFsaWRUeXBlKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKGAnJHtlbnRpdHkubmFtZX0uJHtrZXl9JyB0eXBlIHdhcyBhdXRvLWluZmVycmVkIHdpdGggaW52YWxpZCB0eXBlICcke2luZmVycmVkVHlwZT8ubmFtZX0nYCk7XG4gIH1cbiAgcmV0dXJuIGluZmVycmVkVHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRFbnRpdHlUeXBlKHR5cGU6IGFueSk6IHR5cGUgaXMgVHlwZTxhbnk+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGUgIT09IEJvb2xlYW4gJiZcbiAgICB0eXBlICE9PSBTdHJpbmcgJiZcbiAgICB0eXBlICE9PSBOdW1iZXIgJiZcbiAgICB0eXBlICE9PSBCaWdJbnQgJiZcbiAgICB0eXBlICE9PSBEYXRlICYmXG4gICAgdHlwZSAhPT0gU3ltYm9sICYmXG4gICAgdHlwZSAhPT0gT2JqZWN0XG4gICk7XG59XG4iXX0=
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnRpdHkvZGVjb3JhdG9yL2RlZmluaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNEJBQTBCO0FBQzFCLHlDQUEwRTtBQWUxRSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUM7QUFDMUIsTUFBTSxPQUFPLEdBQUcsNEJBQTRCLENBQUM7QUFDN0MsTUFBTSxLQUFLLEdBQW9DLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQzVFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUM7QUFFeEIsU0FBZ0IsV0FBVyxDQUFJLE1BQWUsRUFBRSxHQUFXLEVBQUUsT0FBcUIsRUFBRTtJQUNsRixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDZCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0tBQzFCO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUM7SUFDdEUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBUkQsa0NBUUM7QUFFRCxTQUFnQixRQUFRLENBQUksTUFBZSxFQUFFLEdBQVcsRUFBRSxJQUFrQjtJQUMxRSxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFD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dGVudCI6WyJpbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuaW1wb3J0IHsgaGFzS2V5cywgbG93ZXJGaXJzdCwgZ2V0S2V5cywgdXBwZXJGaXJzdCB9IGZyb20gJ0B1cWwvY29yZS91dGlsJztcbmltcG9ydCB7XG4gIFJlbGF0aW9uT3B0aW9ucyxcbiAgRmllbGRPcHRpb25zLFxuICBFbnRpdHlPcHRpb25zLFxuICBFbnRpdHlNZXRhLFxuICBUeXBlLFxuICBSZWxhdGlvbktleU1hcCxcbiAgUmVsYXRpb25LZXksXG4gIFJlbGF0aW9uQ2FyZGluYWxpdHksXG4gIEtleSxcbiAgRmllbGRLZXksXG4gIElkS2V5LFxufSBmcm9tICdAdXFsL2NvcmUvdHlwZSc7XG5cbmNvbnN0IGhvbGRlciA9IGdsb2JhbFRoaXM7XG5jb25zdCBtZXRhS2V5ID0gJ0B1cWwvY29yZS9lbnRpdHkvZGVjb3JhdG9yJztcbmNvbnN0IG1ldGFzOiBNYXA8VHlwZTxhbnk+LCBFbnRpdHlNZXRhPGFueT4+ID0gaG9sZGVyW21ldGFLZXldID8/IG5ldyBNYXAoKTtcbmhvbGRlclttZXRhS2V5XSA9IG1ldGFzO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRmllbGQ8RT4oZW50aXR5OiBUeXBlPEU+LCBrZXk6IHN0cmluZywgb3B0czogRmllbGRPcHRpb25zID0ge30pOiBFbnRpdHlNZXRhPEU+IHtcbiAgY29uc3QgbWV0YSA9IGVuc3VyZU1ldGEoZW50aXR5KTtcbiAgaWYgKCFvcHRzLnR5cGUpIHtcbiAgICBjb25zdCB0eXBlID0gaW5mZXJUeXBlKGVudGl0eSwga2V5KTtcbiAgICBvcHRzID0geyAuLi5vcHRzLCB0eXBlIH07XG4gIH1cbiAgbWV0YS5maWVsZHNba2V5XSA9IHsgLi4ubWV0YS5maWVsZHNba2V5XSwgLi4ueyBuYW1lOiBrZXksIC4uLm9wdHMgfSB9O1xuICByZXR1cm4gbWV0YTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUlkPEU+KGVudGl0eTogVHlwZTxFPiwga2V5OiBzdHJpbmcsIG9wdHM6IEZpZWxkT3B0aW9ucyk6IEVudGl0eU1ldGE8RT4ge1xuICBjb25zdCBtZXRhID0gZW5zdXJlTWV0YShlbnRpdHkpO1xuICBjb25zdCBpZCA9IGdldElkS2V5KG1ldGEpO1xuICBpZiAoaWQpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoYCcke2VudGl0eS5uYW1lfScgbXVzdCBoYXZlIGEgc2luZ2xlIGZpZWxkIGRlY29yYXRlZCB3aXRoIEBJZGApO1xuICB9XG4gIHJldHVybiBkZWZpbmVGaWVsZChlbnRpdHksIGtleSwgeyAuLi5vcHRzLCBpc0lkOiB0cnVlIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUmVsYXRpb248RT4oZW50aXR5OiBUeXBlPEU+LCBrZXk6IHN0cmluZywgb3B0czogUmVsYXRpb25PcHRpb25zPEU+KTogRW50aXR5TWV0YTxFPiB7XG4gIGlmICghb3B0cy5lbnRpdHkpIHtcbiAgICBjb25zdCBpbmZlcnJlZFR5cGUgPSBpbmZlckVudGl0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgIG9wdHMuZW50aXR5ID0gKCkgPT4gaW5mZXJyZWRUeXBlO1xuICB9XG4gIGNvbnN0IG1ldGEgPSBlbnN1cmVNZXRhKGVudGl0eSk7XG4gIG1ldGEucmVsYXRpb25zW2tleV0gPSB7IC4uLm1ldGEucmVsYXRpb25zW2tleV0sIC4uLm9wdHMgfTtcbiAgcmV0dXJuIG1ldGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVFbnRpdHk8RT4oZW50aXR5OiBUeXBlPEU+LCBvcHRzOiBFbnRpdHlPcHRpb25zID0ge30pOiBFbnRpdHlNZXRhPEU+IHtcbiAgY29uc3QgbWV0YSA9IGVuc3VyZU1ldGEoZW50aXR5KTtcblxuICBpZiAoIWhhc0tleXMobWV0YS5maWVsZHMpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKGAnJHtlbnRpdHkubmFtZX0nIG11c3QgaGF2ZSBmaWVsZHNgKTtcbiAgfVxuXG4gIGNvbnN0IG9uRGVsZXRlS2V5cyA9IGdldEtleXMobWV0YS5maWVsZHMpLmZpbHRlcigoa2V5KSA9PiBtZXRhLmZpZWxkc1trZXldLm9uRGVsZXRlKSBhcyBGaWVsZEtleTxFPltdO1xuXG4gIGlmIChvbkRlbGV0ZUtleXMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IFR5cGVFcnJvcihgJyR7ZW50aXR5Lm5hbWV9JyBtdXN0IGhhdmUgb25lIGZpZWxkIHdpdGggJ29uRGVsZXRlJyBhcyBtYXhpbXVtYCk7XG4gIH1cblxuICBpZiAob3B0cy5zb2Z0RGVsZXRlKSB7XG4gICAgaWYgKCFvbkRlbGV0ZUtleXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoYCcke2VudGl0eS5uYW1lfScgbXVzdCBoYXZlIG9uZSBmaWVsZCB3aXRoICdvbkRlbGV0ZScgdG8gZW5hYmxlICdzb2Z0RGVsZXRlJ2ApO1xuICAgIH1cbiAgICBtZXRhLnNvZnREZWxldGUgPSBvbkRlbGV0ZUtleXNbMF07XG4gIH1cblxuICBtZXRhLm5hbWUgPSBvcHRzLm5hbWUgPz8gZW50aXR5Lm5hbWU7XG4gIGxldCBwcm90bzogRnVuY3Rpb25Db25zdHJ1Y3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihlbnRpdHkucHJvdG90eXBlKTtcblxuICB3aGlsZSAocHJvdG8uY29uc3RydWN0b3IgIT09IE9iamVjdCkge1xuICAgIGNvbnN0IHBhcmVudE1ldGEgPSBlbnN1cmVNZXRhKHByb3RvLmNvbnN0cnVjdG9yIGFzIFR5cGU8RT4pO1xuICAgIGV4dGVuZE1ldGEobWV0YSwgcGFyZW50TWV0YSk7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG5cbiAgY29uc3QgaWQgPSBnZXRJZEtleShtZXRhKTtcbiAgaWYgKCFpZCkge1xuICAgIHRocm93IFR5cGVFcnJvcihgJyR7ZW50aXR5Lm5hbWV9JyBtdXN0IGhhdmUgb25lIGZpZWxkIGRlY29yYXRlZCB3aXRoIEBJZGApO1xuICB9XG4gIG1ldGEuaWQgPSBpZDtcblxuICByZXR1cm4gbWV0YTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudGl0aWVzKCk6IFR5cGU8YW55PltdIHtcbiAgcmV0dXJuIFsuLi5tZXRhcy5lbnRyaWVzKCldLnJlZHVjZSgoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgaWYgKHZhbC5pZCkge1xuICAgICAgYWNjLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10pO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVNZXRhPEU+KGVudGl0eTogVHlwZTxFPik6IEVudGl0eU1ldGE8RT4ge1xuICBsZXQgbWV0YSA9IG1ldGFzLmdldChlbnRpdHkpO1xuICBpZiAobWV0YSkge1xuICAgIHJldHVybiBtZXRhO1xuICB9XG4gIG1ldGEgPSB7IGVudGl0eSwgZmllbGRzOiB7fSwgcmVsYXRpb25zOiB7fSB9O1xuICBtZXRhcy5zZXQoZW50aXR5LCBtZXRhKTtcbiAgcmV0dXJuIG1ldGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXRhPEU+KGVudGl0eTogVHlwZTxFPik6IEVudGl0eU1ldGE8RT4ge1xuICBjb25zdCBtZXRhID0gbWV0YXMuZ2V0KGVudGl0eSk7XG4gIGlmICghbWV0YSkge1xuICAgIHRocm93IFR5cGVFcnJvcihgJyR7ZW50aXR5Lm5hbWV9JyBpcyBub3QgYW4gZW50aXR5YCk7XG4gIH1cbiAgaWYgKG1ldGEucHJvY2Vzc2VkKSB7XG4gICAgcmV0dXJuIG1ldGE7XG4gIH1cbiAgbWV0YS5wcm9jZXNzZWQgPSB0cnVlO1xuICByZXR1cm4gZmlsbFJlbGF0aW9ucyhtZXRhKTtcbn1cblxuZnVuY3Rpb24gZmlsbFJlbGF0aW9uczxFPihtZXRhOiBFbnRpdHlNZXRhPEU+KTogRW50aXR5TWV0YTxFPiB7XG4gIGZvciAoY29uc3QgcmVsS2V5IGluIG1ldGEucmVsYXRpb25zKSB7XG4gICAgY29uc3QgcmVsT3B0cyA9IG1ldGEucmVsYXRpb25zW3JlbEtleSBhcyBSZWxhdGlvbktleTxFPl07XG5cbiAgICBpZiAocmVsT3B0cy5yZWZlcmVuY2VzKSB7XG4gICAgICAvLyByZWZlcmVuY2VzIHdlcmUgbWFudWFsbHkgc3BlY2lmaWVkXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocmVsT3B0cy5tYXBwZWRCeSkge1xuICAgICAgZmlsbEludmVyc2VTaWRlUmVsYXRpb25zKHJlbE9wdHMpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsRW50aXR5ID0gcmVsT3B0cy5lbnRpdHkoKTtcbiAgICBjb25zdCByZWxNZXRhID0gZW5zdXJlTWV0YShyZWxFbnRpdHkpO1xuXG4gICAgaWYgKHJlbE9wdHMuY2FyZGluYWxpdHkgPT09ICdtbScpIHtcbiAgICAgIGNvbnN0IGlkTmFtZSA9IG1ldGEuZmllbGRzW21ldGEuaWRdLm5hbWU7XG4gICAgICBjb25zdCByZWxJZE5hbWUgPSByZWxNZXRhLmZpZWxkc1tyZWxNZXRhLmlkXS5uYW1lO1xuICAgICAgY29uc3Qgc291cmNlID0gbG93ZXJGaXJzdChtZXRhLm5hbWUpICsgdXBwZXJGaXJzdChpZE5hbWUpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gbG93ZXJGaXJzdChyZWxNZXRhLm5hbWUpICsgdXBwZXJGaXJzdChyZWxJZE5hbWUpO1xuICAgICAgcmVsT3B0cy5yZWZlcmVuY2VzID0gW1xuICAgICAgICB7IGxvY2FsOiBzb3VyY2UsIGZvcmVpZ246IG1ldGEuaWQgfSxcbiAgICAgICAgeyBsb2NhbDogdGFyZ2V0LCBmb3JlaWduOiByZWxNZXRhLmlkIH0sXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWxPcHRzLnJlZmVyZW5jZXMgPSBbeyBsb2NhbDogYCR7cmVsS2V5fUlkYCwgZm9yZWlnbjogcmVsTWV0YS5pZCB9XTtcbiAgICB9XG5cbiAgICBpZiAocmVsT3B0cy50aHJvdWdoKSB7XG4gICAgICBmaWxsVGhyb3VnaFJlbGF0aW9ucyhyZWxPcHRzLnRocm91Z2goKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1ldGE7XG59XG5cbmZ1bmN0aW9uIGZpbGxJbnZlcnNlU2lkZVJlbGF0aW9uczxFPihyZWxPcHRzOiBSZWxhdGlvbk9wdGlvbnM8RT4pOiB2b2lkIHtcbiAgY29uc3QgcmVsRW50aXR5ID0gcmVsT3B0cy5lbnRpdHkoKTtcbiAgY29uc3QgcmVsTWV0YSA9IGdldE1ldGEocmVsRW50aXR5KTtcbiAgcmVsT3B0cy5tYXBwZWRCeSA9IGdldE1hcHBlZEJ5UmVsYXRpb25LZXkocmVsT3B0cyk7XG5cbiAgaWYgKHJlbE1ldGEuZmllbGRzW3JlbE9wdHMubWFwcGVkQnkgYXMgRmllbGRLZXk8RT5dKSB7XG4gICAgcmVsT3B0cy5yZWZlcmVuY2VzID0gW3sgbG9jYWw6IHJlbE1ldGEuaWQsIGZvcmVpZ246IHJlbE9wdHMubWFwcGVkQnkgfV07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbWFwcGVkQnlSZWxhdGlvbiA9IHJlbE1ldGEucmVsYXRpb25zW3JlbE9wdHMubWFwcGVkQnkgYXMgUmVsYXRpb25LZXk8RT5dO1xuXG4gIGlmIChyZWxPcHRzLmNhcmRpbmFsaXR5ID09PSAnbTEnIHx8IHJlbE9wdHMuY2FyZGluYWxpdHkgPT09ICdtbScpIHtcbiAgICByZWxPcHRzLnJlZmVyZW5jZXMgPSBtYXBwZWRCeVJlbGF0aW9uLnJlZmVyZW5jZXMuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgcmVsT3B0cy50aHJvdWdoID0gbWFwcGVkQnlSZWxhdGlvbi50aHJvdWdoO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlbE9wdHMucmVmZXJlbmNlcyA9IG1hcHBlZEJ5UmVsYXRpb24ucmVmZXJlbmNlcy5tYXAoKHsgbG9jYWwsIGZvcmVpZ24gfSkgPT4gKHtcbiAgICBsb2NhbDogZm9yZWlnbixcbiAgICBmb3JlaWduOiBsb2NhbCxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBmaWxsVGhyb3VnaFJlbGF0aW9uczxFPihlbnRpdHk6IFR5cGU8RT4pOiB2b2lkIHtcbiAgY29uc3QgbWV0YSA9IGVuc3VyZU1ldGEoZW50aXR5KTtcbiAgbWV0YS5yZWxhdGlvbnMgPSBnZXRLZXlzKG1ldGEuZmllbGRzKS5yZWR1Y2UoKHJlbGF0aW9ucywga2V5KSA9PiB7XG4gICAgY29uc3QgeyByZWZlcmVuY2UgfSA9IG1ldGEuZmllbGRzW2tleSBhcyBGaWVsZEtleTxFPl07XG4gICAgaWYgKHJlZmVyZW5jZSkge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gcmVmZXJlbmNlKCk7XG4gICAgICBjb25zdCByZWxNZXRhID0gZW5zdXJlTWV0YShyZWxFbnRpdHkpO1xuICAgICAgY29uc3QgcmVsS2V5ID0ga2V5LnNsaWNlKDAsIC1yZWxNZXRhLmlkLmxlbmd0aCk7XG4gICAgICBjb25zdCByZWxPcHRzOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgIGVudGl0eTogcmVmZXJlbmNlLFxuICAgICAgICBjYXJkaW5hbGl0eTogJ20xJyxcbiAgICAgICAgcmVmZXJlbmNlczogW3sgbG9jYWw6IGtleSwgZm9yZWlnbjogcmVsTWV0YS5pZCB9XSxcbiAgICAgIH07XG4gICAgICByZWxhdGlvbnNbcmVsS2V5XSA9IHJlbE9wdHM7XG4gICAgfVxuICAgIHJldHVybiByZWxhdGlvbnM7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFwcGVkQnlSZWxhdGlvbktleTxFPihyZWxPcHRzOiBSZWxhdGlvbk9wdGlvbnM8RT4pOiBLZXk8RT4ge1xuICBpZiAodHlwZW9mIHJlbE9wdHMubWFwcGVkQnkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCByZWxFbnRpdHkgPSByZWxPcHRzLmVudGl0eSgpO1xuICAgIGNvbnN0IHJlbE1ldGEgPSBlbnN1cmVNZXRhKHJlbEVudGl0eSk7XG4gICAgY29uc3Qga2V5TWFwID0gZ2V0UmVsYXRpb25LZXlNYXAocmVsTWV0YSk7XG4gICAgcmV0dXJuIHJlbE9wdHMubWFwcGVkQnkoa2V5TWFwKTtcbiAgfVxuICByZXR1cm4gcmVsT3B0cy5tYXBwZWRCeTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVsYXRpb25LZXlNYXA8RT4obWV0YTogRW50aXR5TWV0YTxFPik6IFJlbGF0aW9uS2V5TWFwPEU+IHtcbiAgcmV0dXJuIGdldEtleXMobWV0YS5maWVsZHMpXG4gICAgLmNvbmNhdChnZXRLZXlzKG1ldGEucmVsYXRpb25zKSlcbiAgICAucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBrZXk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9IGFzIFJlbGF0aW9uS2V5TWFwPEU+KTtcbn1cblxuZnVuY3Rpb24gZ2V0SWRLZXk8RT4obWV0YTogRW50aXR5TWV0YTxFPik6IElkS2V5PEU+IHtcbiAgY29uc3QgaWQgPSBnZXRLZXlzKG1ldGEuZmllbGRzKS5maW5kKChrZXkpID0+IG1ldGEuZmllbGRzW2tleV0/LmlzSWQpO1xuICByZXR1cm4gaWQgYXMgSWRLZXk8RT47XG59XG5cbmZ1bmN0aW9uIGV4dGVuZE1ldGE8RT4odGFyZ2V0OiBFbnRpdHlNZXRhPEU+LCBzb3VyY2U6IEVudGl0eU1ldGE8RT4pOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlRmllbGRzID0geyAuLi5zb3VyY2UuZmllbGRzIH07XG4gIGNvbnN0IHRhcmdldElkID0gZ2V0SWRLZXkodGFyZ2V0KTtcbiAgaWYgKHRhcmdldElkKSB7XG4gICAgY29uc3Qgc291cmNlSWQgPSBnZXRJZEtleShzb3VyY2UpO1xuICAgIGlmIChzb3VyY2VJZCkge1xuICAgICAgZGVsZXRlIHNvdXJjZUZpZWxkc1tzb3VyY2VJZF07XG4gICAgfVxuICB9XG4gIHRhcmdldC5maWVsZHMgPSB7IC4uLnNvdXJjZUZpZWxkcywgLi4udGFyZ2V0LmZpZWxkcyB9O1xuICB0YXJnZXQucmVsYXRpb25zID0geyAuLi5zb3VyY2UucmVsYXRpb25zLCAuLi50YXJnZXQucmVsYXRpb25zIH07XG59XG5cbmZ1bmN0aW9uIGluZmVyVHlwZTxFPihlbnRpdHk6IFR5cGU8RT4sIGtleTogc3RyaW5nKTogYW55IHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0TWV0YWRhdGEoJ2Rlc2lnbjp0eXBlJywgZW50aXR5LnByb3RvdHlwZSwga2V5KTtcbn1cblxuZnVuY3Rpb24gaW5mZXJFbnRpdHlUeXBlPEU+KGVudGl0eTogVHlwZTxFPiwga2V5OiBzdHJpbmcpOiBUeXBlPGFueT4ge1xuICBjb25zdCBpbmZlcnJlZFR5cGUgPSBpbmZlclR5cGUoZW50aXR5LCBrZXkpO1xuICBjb25zdCBpc1ZhbGlkVHlwZSA9IGlzVmFsaWRFbnRpdHlUeXBlKGluZmVycmVkVHlwZSk7XG4gIGlmICghaXNWYWxpZFR5cGUpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoYCcke2VudGl0eS5uYW1lfS4ke2tleX0nIHR5cGUgd2FzIGF1dG8taW5mZXJyZWQgd2l0aCBpbnZhbGlkIHR5cGUgJyR7aW5mZXJyZWRUeXBlPy5uYW1lfSdgKTtcbiAgfVxuICByZXR1cm4gaW5mZXJyZWRUeXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEVudGl0eVR5cGUodHlwZTogYW55KTogdHlwZSBpcyBUeXBlPGFueT4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZSAhPT0gQm9vbGVhbiAmJlxuICAgIHR5cGUgIT09IFN0cmluZyAmJlxuICAgIHR5cGUgIT09IE51bWJlciAmJlxuICAgIHR5cGUgIT09IEJpZ0ludCAmJlxuICAgIHR5cGUgIT09IERhdGUgJiZcbiAgICB0eXBlICE9PSBTeW1ib2wgJiZcbiAgICB0eXBlICE9PSBPYmplY3RcbiAgKTtcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};