@decaf-ts/core 0.2.1 → 0.3.1

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 (107) hide show
  1. package/dist/core.bundle.min.js +1 -1
  2. package/dist/esm/core.bundle.min.esm.js +1 -1
  3. package/lib/esm/identity/decorators.d.ts +2 -1
  4. package/lib/esm/identity/decorators.js +4 -3
  5. package/lib/esm/identity/index.d.ts +1 -0
  6. package/lib/esm/identity/index.js +2 -1
  7. package/lib/esm/identity/utils.d.ts +3 -2
  8. package/lib/esm/identity/utils.js +15 -3
  9. package/lib/esm/index.d.ts +1 -1
  10. package/lib/esm/index.js +2 -2
  11. package/lib/esm/interfaces/Paginatable.d.ts +4 -0
  12. package/lib/esm/interfaces/Paginatable.js +3 -0
  13. package/lib/esm/interfaces/index.d.ts +0 -1
  14. package/lib/esm/interfaces/index.js +1 -2
  15. package/lib/esm/model/BaseModel.d.ts +4 -2
  16. package/lib/esm/model/BaseModel.js +10 -3
  17. package/lib/esm/model/User.d.ts +8 -0
  18. package/lib/esm/model/User.js +35 -0
  19. package/lib/esm/model/construction.d.ts +15 -0
  20. package/lib/esm/model/construction.js +205 -0
  21. package/lib/esm/model/decorators.d.ts +51 -3
  22. package/lib/esm/model/decorators.js +91 -5
  23. package/lib/esm/model/index.d.ts +2 -0
  24. package/lib/esm/model/index.js +3 -1
  25. package/lib/esm/model/types.d.ts +6 -0
  26. package/lib/esm/model/types.js +3 -0
  27. package/lib/esm/persistence/Adapter.d.ts +8 -4
  28. package/lib/esm/persistence/Adapter.js +13 -11
  29. package/lib/esm/persistence/Sequence.d.ts +22 -0
  30. package/lib/esm/persistence/Sequence.js +11 -0
  31. package/lib/esm/persistence/constants.d.ts +13 -1
  32. package/lib/esm/persistence/constants.js +16 -1
  33. package/lib/esm/persistence/index.d.ts +1 -0
  34. package/lib/esm/persistence/index.js +2 -1
  35. package/lib/esm/query/Clause.d.ts +8 -1
  36. package/lib/esm/query/Clause.js +8 -1
  37. package/lib/esm/query/Paginator.d.ts +22 -0
  38. package/lib/esm/query/Paginator.js +39 -0
  39. package/lib/esm/query/Query.d.ts +1 -1
  40. package/lib/esm/query/Query.js +1 -1
  41. package/lib/esm/query/Statement.d.ts +6 -0
  42. package/lib/esm/query/Statement.js +7 -2
  43. package/lib/esm/query/errors.d.ts +3 -0
  44. package/lib/esm/query/errors.js +6 -1
  45. package/lib/esm/query/index.d.ts +1 -0
  46. package/lib/esm/query/index.js +2 -1
  47. package/lib/esm/query/options.d.ts +4 -3
  48. package/lib/esm/query/options.js +1 -1
  49. package/lib/esm/repository/Repository.d.ts +10 -6
  50. package/lib/esm/repository/Repository.js +85 -62
  51. package/lib/esm/repository/decorators.js +2 -2
  52. package/lib/esm/repository/injectables.js +3 -1
  53. package/lib/identity/decorators.cjs +4 -3
  54. package/lib/identity/decorators.d.ts +2 -1
  55. package/lib/identity/index.cjs +2 -1
  56. package/lib/identity/index.d.ts +1 -0
  57. package/lib/identity/utils.cjs +16 -3
  58. package/lib/identity/utils.d.ts +3 -2
  59. package/lib/index.cjs +2 -2
  60. package/lib/index.d.ts +1 -1
  61. package/lib/interfaces/Paginatable.cjs +4 -0
  62. package/lib/interfaces/Paginatable.d.ts +4 -0
  63. package/lib/interfaces/index.cjs +1 -2
  64. package/lib/interfaces/index.d.ts +0 -1
  65. package/lib/model/BaseModel.cjs +10 -3
  66. package/lib/model/BaseModel.d.ts +4 -2
  67. package/lib/model/User.cjs +38 -0
  68. package/lib/model/User.d.ts +8 -0
  69. package/lib/model/construction.cjs +218 -0
  70. package/lib/model/construction.d.ts +15 -0
  71. package/lib/model/decorators.cjs +95 -3
  72. package/lib/model/decorators.d.ts +51 -3
  73. package/lib/model/index.cjs +3 -1
  74. package/lib/model/index.d.ts +2 -0
  75. package/lib/model/types.cjs +4 -0
  76. package/lib/model/types.d.ts +6 -0
  77. package/lib/persistence/Adapter.cjs +12 -10
  78. package/lib/persistence/Adapter.d.ts +8 -4
  79. package/lib/persistence/Sequence.cjs +15 -0
  80. package/lib/persistence/Sequence.d.ts +22 -0
  81. package/lib/persistence/constants.cjs +17 -2
  82. package/lib/persistence/constants.d.ts +13 -1
  83. package/lib/persistence/index.cjs +2 -1
  84. package/lib/persistence/index.d.ts +1 -0
  85. package/lib/query/Clause.cjs +8 -1
  86. package/lib/query/Clause.d.ts +8 -1
  87. package/lib/query/Paginator.cjs +43 -0
  88. package/lib/query/Paginator.d.ts +22 -0
  89. package/lib/query/Query.cjs +1 -1
  90. package/lib/query/Query.d.ts +1 -1
  91. package/lib/query/Statement.cjs +7 -2
  92. package/lib/query/Statement.d.ts +6 -0
  93. package/lib/query/errors.cjs +8 -2
  94. package/lib/query/errors.d.ts +3 -0
  95. package/lib/query/index.cjs +2 -1
  96. package/lib/query/index.d.ts +1 -0
  97. package/lib/query/options.cjs +1 -1
  98. package/lib/query/options.d.ts +4 -3
  99. package/lib/repository/Repository.cjs +85 -62
  100. package/lib/repository/Repository.d.ts +10 -6
  101. package/lib/repository/decorators.cjs +2 -2
  102. package/lib/repository/injectables.cjs +3 -1
  103. package/package.json +1 -1
  104. package/lib/esm/interfaces/Sequence.d.ts +0 -17
  105. package/lib/esm/interfaces/Sequence.js +0 -10
  106. package/lib/interfaces/Sequence.cjs +0 -11
  107. package/lib/interfaces/Sequence.d.ts +0 -17
@@ -2,14 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Repository = void 0;
4
4
  const db_decorators_1 = require("@decaf-ts/db-decorators");
5
- const errors_1 = require("./errors.cjs");
6
5
  const Adapter_1 = require("../persistence/Adapter.cjs");
7
6
  const decorator_validation_1 = require("@decaf-ts/decorator-validation");
8
7
  const constants_1 = require("../persistence/constants.cjs");
9
- const query_1 = require("../query/index.cjs");
8
+ const Query_1 = require("../query/Query.cjs");
10
9
  const constants_2 = require("./constants.cjs");
11
- const utils_1 = require("../identity/utils.cjs");
12
10
  const reflection_1 = require("@decaf-ts/reflection");
11
+ const Sequence_1 = require("../persistence/Sequence.cjs");
12
+ const db_decorators_2 = require("@decaf-ts/db-decorators");
13
+ const utils_1 = require("../identity/utils.cjs");
14
+ const persistence_1 = require("../persistence/index.cjs");
13
15
  class Repository extends db_decorators_1.Repository {
14
16
  static { this._cache = {}; }
15
17
  get adapter() {
@@ -22,21 +24,28 @@ class Repository extends db_decorators_1.Repository {
22
24
  this._tableName = Repository.table(this.class);
23
25
  return this._tableName;
24
26
  }
25
- get pk() {
26
- if (!this._pk)
27
- this._pk = (0, db_decorators_1.findPrimaryKey)(new this.class()).id;
28
- return this._pk;
29
- }
30
27
  constructor(adapter, clazz) {
31
28
  super(clazz);
32
29
  this.observers = [];
33
30
  if (adapter)
34
31
  this._adapter = adapter;
32
+ if (clazz) {
33
+ Repository.register(clazz, this);
34
+ if (adapter) {
35
+ const flavour = Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.ADAPTER), clazz);
36
+ if (flavour && flavour !== adapter.flavour)
37
+ throw new db_decorators_1.InternalError("Incompatible flavours");
38
+ (0, persistence_1.uses)(adapter.flavour)(clazz);
39
+ }
40
+ }
35
41
  [this.createAll, this.readAll, this.updateAll, this.deleteAll].forEach((m) => {
36
42
  const name = m.name;
37
- (0, db_decorators_1.wrapMethod)(this, this[name + "Prefix"], m, this[name + "Suffix"]);
43
+ (0, db_decorators_1.wrapMethodWithContext)(this, this[name + "Prefix"], m, this[name + "Suffix"]);
38
44
  });
39
45
  }
46
+ async context(operation) {
47
+ return this.adapter.context(operation, this.class);
48
+ }
40
49
  async create(model, ...args) {
41
50
  // eslint-disable-next-line prefer-const
42
51
  let { record, id } = this.adapter.prepare(model, this.pk);
@@ -53,20 +62,20 @@ class Repository extends db_decorators_1.Repository {
53
62
  return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, ids[i]));
54
63
  }
55
64
  async createAllPrefix(models, ...args) {
65
+ const contextArgs = await db_decorators_2.Context.args(this, db_decorators_1.OperationKeys.CREATE, this.class, args);
56
66
  if (!models.length)
57
- return [models, ...args];
67
+ return [models, ...contextArgs.args];
58
68
  const opts = Repository.getSequenceOptions(models[0]);
59
69
  let ids = [];
60
70
  if (opts.type) {
61
71
  if (!opts.name)
62
- opts.name = (0, utils_1.sequenceNameForModel)(models[0], "pk");
72
+ opts.name = Sequence_1.Sequence.pk(models[0]);
63
73
  ids = await (await this.adapter.Sequence(opts)).range(models.length);
64
74
  }
65
- const pk = (0, db_decorators_1.findPrimaryKey)(models[0]).id;
66
75
  models = await Promise.all(models.map(async (m, i) => {
67
76
  m = new this.class(m);
68
- m[pk] = ids[i];
69
- await (0, db_decorators_1.enforceDBDecorators)(this, m, db_decorators_1.OperationKeys.CREATE, db_decorators_1.OperationKeys.ON);
77
+ m[this.pk] = ids[i];
78
+ await (0, db_decorators_1.enforceDBDecorators)(this, contextArgs.context, m, db_decorators_1.OperationKeys.CREATE, db_decorators_1.OperationKeys.ON);
70
79
  return m;
71
80
  }));
72
81
  const errors = models
@@ -81,7 +90,7 @@ class Repository extends db_decorators_1.Repository {
81
90
  }, undefined);
82
91
  if (errors)
83
92
  throw new db_decorators_1.ValidationError(errors);
84
- return [models, ...args];
93
+ return [models, ...contextArgs.args];
85
94
  }
86
95
  async read(id, ...args) {
87
96
  const m = await this.adapter.read(this.tableName, id, ...args);
@@ -89,27 +98,36 @@ class Repository extends db_decorators_1.Repository {
89
98
  }
90
99
  async update(model, ...args) {
91
100
  // eslint-disable-next-line prefer-const
92
- let { record, id } = await this.adapter.prepare(model, this.pk);
101
+ let { record, id } = this.adapter.prepare(model, this.pk);
93
102
  record = await this.adapter.update(this.tableName, id, record, ...args);
94
103
  return this.adapter.revert(record, this.class, this.pk, id);
95
104
  }
96
105
  async updatePrefix(model, ...args) {
97
- const pk = (0, db_decorators_1.findModelId)(model);
98
- const oldModel = await this.read(pk);
106
+ const contextArgs = await db_decorators_2.Context.args(this, db_decorators_1.OperationKeys.UPDATE, this.class, args);
107
+ const pk = model[this.pk];
108
+ if (!pk)
109
+ throw new db_decorators_1.InternalError(`No value for the Id is defined under the property ${this.pk}`);
110
+ const oldModel = await this.read(pk, ...contextArgs.args);
99
111
  model = this.merge(oldModel, model);
100
- await (0, db_decorators_1.enforceDBDecorators)(this, model, db_decorators_1.OperationKeys.UPDATE, db_decorators_1.OperationKeys.ON, oldModel);
101
- const errors = model.hasErrors(oldModel);
112
+ await (0, db_decorators_1.enforceDBDecorators)(this, contextArgs.context, model, db_decorators_1.OperationKeys.UPDATE, db_decorators_1.OperationKeys.ON, oldModel);
113
+ const errors = model.hasErrors(oldModel, ...Repository.relations(this.class));
102
114
  if (errors)
103
115
  throw new db_decorators_1.ValidationError(errors.toString());
104
116
  if (Repository.getMetadata(oldModel)) {
105
117
  if (!Repository.getMetadata(model))
106
118
  Repository.setMetadata(model, Repository.getMetadata(oldModel));
107
119
  }
108
- return [model, ...args];
120
+ return [model, ...contextArgs.args];
109
121
  }
110
122
  async updateAllPrefix(models, ...args) {
111
- const ids = models.map((m) => (0, db_decorators_1.findModelId)(m));
112
- const oldModels = await this.readAll(ids);
123
+ const contextArgs = await db_decorators_2.Context.args(this, db_decorators_1.OperationKeys.UPDATE, this.class, args);
124
+ const ids = models.map((m) => {
125
+ const id = m[this.pk];
126
+ if (!id)
127
+ throw new db_decorators_1.InternalError("missing id on update operation");
128
+ return id;
129
+ });
130
+ const oldModels = await this.readAll(ids, ...contextArgs.args);
113
131
  models = models.map((m, i) => {
114
132
  m = this.merge(oldModels[i], m);
115
133
  if (Repository.getMetadata(oldModels[i])) {
@@ -118,7 +136,7 @@ class Repository extends db_decorators_1.Repository {
118
136
  }
119
137
  return m;
120
138
  });
121
- await Promise.all(models.map((m, i) => (0, db_decorators_1.enforceDBDecorators)(this, m, db_decorators_1.OperationKeys.UPDATE, db_decorators_1.OperationKeys.ON, oldModels[i])));
139
+ await Promise.all(models.map((m, i) => (0, db_decorators_1.enforceDBDecorators)(this, contextArgs.context, m, db_decorators_1.OperationKeys.UPDATE, db_decorators_1.OperationKeys.ON, oldModels[i])));
122
140
  const errors = models
123
141
  .map((m, i) => m.hasErrors(oldModels[i], m))
124
142
  .reduce((accum, e, i) => {
@@ -131,14 +149,14 @@ class Repository extends db_decorators_1.Repository {
131
149
  }, undefined);
132
150
  if (errors)
133
151
  throw new db_decorators_1.ValidationError(errors);
134
- return [models, ...args];
152
+ return [models, ...contextArgs.args];
135
153
  }
136
154
  async delete(id, ...args) {
137
155
  const m = await this.adapter.delete(this.tableName, id, ...args);
138
156
  return this.adapter.revert(m, this.class, this.pk, id);
139
157
  }
140
158
  select(selector) {
141
- return new query_1.Query(this.adapter).select(selector).from(this.class);
159
+ return new Query_1.Query(this.adapter).select(selector).from(this.class);
142
160
  }
143
161
  async query(condition, orderBy, order = constants_2.OrderDirection.ASC, limit, skip) {
144
162
  const sort = [orderBy, order];
@@ -149,6 +167,9 @@ class Repository extends db_decorators_1.Repository {
149
167
  query.offset(skip);
150
168
  return query.execute();
151
169
  }
170
+ async timestamp() {
171
+ return this.adapter.timestamp();
172
+ }
152
173
  /**
153
174
  * @summary Registers an {@link Observer}
154
175
  * @param {Observer} observer
@@ -178,45 +199,40 @@ class Repository extends db_decorators_1.Repository {
178
199
  * @param {any[]} [args] optional arguments to be passed to the {@link Observer#refresh} method
179
200
  */
180
201
  async updateObservers(...args) {
181
- return new Promise((resolve, reject) => {
182
- Promise.all(this.observers.map((o) => o.refresh(...args)))
183
- .then(() => {
184
- resolve();
185
- })
186
- .catch((e) => reject(new errors_1.ObserverError(e)));
202
+ const results = await Promise.allSettled(this.observers.map((o) => o.refresh(...args)));
203
+ results.forEach((result, i) => {
204
+ if (result.status === "rejected")
205
+ console.warn(`Failed to update observable ${this.observers[i]}: ${result.reason}`);
187
206
  });
188
207
  }
189
208
  static forModel(model) {
190
- const repoName = Reflect.getMetadata(Repository.key(db_decorators_1.DBKeys.REPOSITORY), model);
191
- let flavour = Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.ADAPTER), model);
192
- let adapter = flavour
193
- ? Adapter_1.Adapter.get(flavour)
194
- : undefined;
195
- let repoConstructor;
196
- if (!repoName) {
197
- if (!adapter)
198
- throw new db_decorators_1.InternalError(`Cannot boot a standard repository without an adapter definition. Did you @use on the model ${model.name}`);
199
- repoConstructor = Repository;
209
+ let repo;
210
+ try {
211
+ repo = this.get(model);
212
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
200
213
  }
201
- else {
202
- repoConstructor = this.get(repoName);
203
- flavour =
204
- flavour ||
205
- Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.ADAPTER), repoConstructor);
206
- if (!flavour)
207
- throw new db_decorators_1.InternalError(`No registered persistence adapter found for model ${model.name}`);
208
- adapter = Adapter_1.Adapter.get(flavour);
214
+ catch (e) {
215
+ repo = Repository;
209
216
  }
217
+ if (repo instanceof Repository)
218
+ return repo;
219
+ const flavour = Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.ADAPTER), model) ||
220
+ Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.ADAPTER), repo);
221
+ const adapter = flavour
222
+ ? Adapter_1.Adapter.get(flavour)
223
+ : undefined;
210
224
  if (!adapter)
211
225
  throw new db_decorators_1.InternalError(`No registered persistence adapter found flavour ${flavour}`);
212
- return new repoConstructor(adapter, model);
226
+ return new repo(adapter, model);
213
227
  }
214
- static get(name) {
228
+ static get(model) {
229
+ const name = this.table(model);
215
230
  if (name in this._cache)
216
231
  return this._cache[name];
217
232
  throw new db_decorators_1.InternalError(`Could not find repository registered under ${name}`);
218
233
  }
219
- static register(name, repo) {
234
+ static register(model, repo) {
235
+ const name = this.table(model);
220
236
  if (name in this._cache)
221
237
  throw new db_decorators_1.InternalError(`${name} already registered as a repository`);
222
238
  this._cache[name] = repo;
@@ -259,15 +275,22 @@ class Repository extends db_decorators_1.Repository {
259
275
  return accum;
260
276
  }, {});
261
277
  }
262
- static table(model) {
263
- const metadata = Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.TABLE), model instanceof decorator_validation_1.Model ? model.constructor : model);
264
- if (metadata) {
265
- return metadata;
266
- }
267
- if (model instanceof decorator_validation_1.Model) {
268
- return model.constructor.name;
278
+ static relations(model) {
279
+ const result = [];
280
+ let prototype = model instanceof decorator_validation_1.Model
281
+ ? Object.getPrototypeOf(model)
282
+ : model.prototype;
283
+ while (prototype != null) {
284
+ const props = prototype[constants_1.PersistenceKeys.RELATIONS];
285
+ if (props) {
286
+ result.push(...props);
287
+ }
288
+ prototype = Object.getPrototypeOf(prototype);
269
289
  }
270
- return model.name;
290
+ return result;
291
+ }
292
+ static table(model) {
293
+ return (0, utils_1.getTableName)(model);
271
294
  }
272
295
  static column(model, attribute) {
273
296
  const metadata = Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.COLUMN), model, attribute);
@@ -276,4 +299,4 @@ class Repository extends db_decorators_1.Repository {
276
299
  }
277
300
  exports.Repository = Repository;
278
301
 
279
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L1JlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBVWlDO0FBQ2pDLHFDQUF5QztBQUd6QyxvREFBaUQ7QUFDakQseUVBQW9FO0FBQ3BFLHdEQUEyRDtBQUMzRCxvQ0FNa0I7QUFDbEIsMkNBQTZDO0FBRTdDLDZDQUF5RDtBQUV6RCxxREFBZ0U7QUFHaEUsTUFBYSxVQUNYLFNBQVEsMEJBQU07YUFHQyxXQUFNLEdBQ25CLEVBRG1CLEFBQ2pCLENBQUM7SUFRTCxJQUFJLE9BQU87UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDaEIsTUFBTSxJQUFJLDZCQUFhLENBQ3JCLHNHQUFzRyxDQUN2RyxDQUFDO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFjLFNBQVM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQWMsRUFBRTtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztZQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBQSw4QkFBYyxFQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsWUFBWSxPQUF5QixFQUFFLEtBQXNCO1FBQzNELEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQXpCUCxjQUFTLEdBQWUsRUFBRSxDQUFDO1FBMEJqQyxJQUFJLE9BQU87WUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUNyQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQ3BFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDSixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3BCLElBQUEsMEJBQVUsRUFDUixJQUFJLEVBQ0gsSUFBWSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsRUFDOUIsQ0FBQyxFQUNBLElBQVksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQy9CLENBQUM7UUFDSixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQVEsRUFBRSxHQUFHLElBQVc7UUFDbkMsd0NBQXdDO1FBQ3hDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN4RSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBVyxFQUFFLEdBQUcsSUFBVztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDcEMsSUFBSSxDQUFDLFNBQVMsRUFDZCxHQUEwQixFQUMxQixPQUFPLEVBQ1AsR0FBRyxJQUFJLENBQ1IsQ0FBQztRQUNGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQW9CLENBQUMsQ0FDdkUsQ0FBQztJQUNKLENBQUM7SUFFUyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQVcsRUFBRSxHQUFHLElBQVc7UUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLEdBQUcsR0FBNkMsRUFBRSxDQUFDO1FBQ3ZELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2dCQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBQSw0QkFBb0IsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBQSw4QkFBYyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUV4QyxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixDQUF5QixDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxNQUFNLElBQUEsbUNBQW1CLEVBQ3ZCLElBQUksRUFDSixDQUFDLEVBQ0QsNkJBQWEsQ0FBQyxNQUFNLEVBQ3BCLDZCQUFhLENBQUMsRUFBRSxDQUNqQixDQUFDO1lBQ0YsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTTthQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUN6QixNQUFNLENBQUMsQ0FBQyxLQUF5QixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUM7Z0JBQ0gsS0FBSztvQkFDSCxPQUFPLEtBQUssS0FBSyxRQUFRO3dCQUN2QixDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTt3QkFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hCLElBQUksTUFBTTtZQUFFLE1BQU0sSUFBSSwrQkFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUE0QixFQUFFLEdBQUcsSUFBVztRQUNyRCxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDL0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQVEsRUFBRSxHQUFHLElBQVc7UUFDbkMsd0NBQXdDO1FBQ3hDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRVMsS0FBSyxDQUFDLFlBQVksQ0FDMUIsS0FBUSxFQUNSLEdBQUcsSUFBVztRQUVkLE1BQU0sRUFBRSxHQUFHLElBQUEsMkJBQVcsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sSUFBQSxtQ0FBbUIsRUFDdkIsSUFBSSxFQUNKLEtBQUssRUFDTCw2QkFBYSxDQUFDLE1BQU0sRUFDcEIsNkJBQWEsQ0FBQyxFQUFFLEVBQ2hCLFFBQVEsQ0FDVCxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxJQUFJLE1BQU07WUFBRSxNQUFNLElBQUksK0JBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hDLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFUyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQVcsRUFBRSxHQUFHLElBQVc7UUFDekQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBQSwyQkFBVyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNCLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUM1QixVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNsQixJQUFBLG1DQUFtQixFQUNqQixJQUFJLEVBQ0osQ0FBQyxFQUNELDZCQUFhLENBQUMsTUFBTSxFQUNwQiw2QkFBYSxDQUFDLEVBQUUsRUFDaEIsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNiLENBQ0YsQ0FDRixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTTthQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMzQyxNQUFNLENBQUMsQ0FBQyxLQUF5QixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUM7Z0JBQ0gsS0FBSztvQkFDSCxPQUFPLEtBQUssS0FBSyxRQUFRO3dCQUN2QixDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTt3QkFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hCLElBQUksTUFBTTtZQUFFLE1BQU0sSUFBSSwrQkFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTlDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUE0QixFQUFFLEdBQUcsSUFBVztRQUN2RCxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNLENBQUMsUUFBeUI7UUFDOUIsT0FBTyxJQUFJLGFBQUssQ0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQ1QsU0FBb0IsRUFDcEIsT0FBZSxFQUNmLFFBQXdCLDBCQUFjLENBQUMsR0FBRyxFQUMxQyxLQUFjLEVBQ2QsSUFBYTtRQUViLE1BQU0sSUFBSSxHQUFvQixDQUFDLE9BQWlCLEVBQUUsS0FBdUIsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksS0FBSztZQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxJQUFJO1lBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPLENBQUMsUUFBa0I7UUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQUUsTUFBTSxJQUFJLDZCQUFhLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsUUFBa0I7UUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQUUsTUFBTSxJQUFJLDZCQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFXO1FBQ2xDLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ2pFLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxzQkFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUNiLEtBQXFCO1FBRXJCLE1BQU0sUUFBUSxHQUF1QixPQUFPLENBQUMsV0FBVyxDQUN0RCxVQUFVLENBQUMsR0FBRyxDQUFDLHNCQUFNLENBQUMsVUFBVSxDQUFDLEVBQ2pDLEtBQUssQ0FDTixDQUFDO1FBQ0YsSUFBSSxPQUFPLEdBQXVCLE9BQU8sQ0FBQyxXQUFXLENBQ25ELGlCQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsT0FBTyxDQUFDLEVBQ3BDLEtBQUssQ0FDTixDQUFDO1FBQ0YsSUFBSSxPQUFPLEdBQWtDLE9BQU87WUFDbEQsQ0FBQyxDQUFDLGlCQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUN0QixDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWQsSUFBSSxlQUErQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxPQUFPO2dCQUNWLE1BQU0sSUFBSSw2QkFBYSxDQUNyQiw4RkFBOEYsS0FBSyxDQUFDLElBQUksRUFBRSxDQUMzRyxDQUFDO1lBQ0osZUFBZSxHQUFHLFVBQXVDLENBQUM7UUFDNUQsQ0FBQzthQUFNLENBQUM7WUFDTixlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQThCLENBQUM7WUFDbEUsT0FBTztnQkFDTCxPQUFPO29CQUNQLE9BQU8sQ0FBQyxXQUFXLENBQ2pCLGlCQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsT0FBTyxDQUFDLEVBQ3BDLGVBQWUsQ0FDaEIsQ0FBQztZQUNKLElBQUksQ0FBQyxPQUFPO2dCQUNWLE1BQU0sSUFBSSw2QkFBYSxDQUNyQixxREFBcUQsS0FBSyxDQUFDLElBQUksRUFBRSxDQUNsRSxDQUFDO1lBRUosT0FBTyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTztZQUNWLE1BQU0sSUFBSSw2QkFBYSxDQUNyQixtREFBbUQsT0FBTyxFQUFFLENBQzdELENBQUM7UUFFSixPQUFPLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU8sTUFBTSxDQUFDLEdBQUcsQ0FDaEIsSUFBWTtRQUVaLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQStCLENBQUM7UUFDekQsTUFBTSxJQUFJLDZCQUFhLENBQ3JCLDhDQUE4QyxJQUFJLEVBQUUsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUNiLElBQVksRUFDWixJQUFxQztRQUVyQyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTTtZQUNyQixNQUFNLElBQUksNkJBQWEsQ0FBQyxHQUFHLElBQUkscUNBQXFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBa0IsS0FBUSxFQUFFLFFBQWE7UUFDekQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsMkJBQWUsQ0FBQyxRQUFRLEVBQUU7WUFDckQsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLEtBQUs7WUFDZixLQUFLLEVBQUUsUUFBUTtTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBa0IsS0FBUTtRQUMxQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQ2hELEtBQUssRUFDTCwyQkFBZSxDQUFDLFFBQVEsQ0FDekIsQ0FBQztRQUNGLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkQsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQWtCLEtBQVE7UUFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUNoRCxLQUFLLEVBQ0wsMkJBQWUsQ0FBQyxRQUFRLENBQ3pCLENBQUM7UUFDRixJQUFJLFVBQVU7WUFBRSxPQUFRLEtBQWEsQ0FBQywyQkFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQWtCLEtBQVE7UUFDakQsTUFBTSxFQUFFLEdBQUcsSUFBQSw4QkFBYyxFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsc0JBQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFFBQVE7WUFDWCxNQUFNLElBQUksNkJBQWEsQ0FDckIsdUVBQXVFLENBQ3hFLENBQUM7UUFDSixPQUFPLFFBQTJCLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFPLENBQWtCLEtBQXlCO1FBQ3ZELE1BQU0sZUFBZSxHQUFHLElBQUEscUNBQXdCLEVBQzlDLEtBQUssWUFBWSw0QkFBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLEVBQzVDLHNCQUFNLENBQUMsT0FBTyxDQUNmLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDakQsQ0FBQyxLQUFvRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUU7WUFDakUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsMkJBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUM7b0JBQzNCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUMxQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBc0IsQ0FBQztnQkFDekMsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFrQixLQUF5QjtRQUNyRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUNsQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQywyQkFBZSxDQUFDLEtBQUssQ0FBQyxFQUNsQyxLQUFLLFlBQVksNEJBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNuRCxDQUFDO1FBQ0YsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLEtBQUssWUFBWSw0QkFBSyxFQUFFLENBQUM7WUFDM0IsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUNoQyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTSxDQUFrQixLQUFRLEVBQUUsU0FBaUI7UUFDeEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDbEMsaUJBQU8sQ0FBQyxHQUFHLENBQUMsMkJBQWUsQ0FBQyxNQUFNLENBQUMsRUFDbkMsS0FBSyxFQUNMLFNBQVMsQ0FDVixDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3pDLENBQUM7O0FBaFlILGdDQWlZQyIsImZpbGUiOiJyZXBvc2l0b3J5L1JlcG9zaXRvcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEQktleXMsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIGZpbmRNb2RlbElkLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeSBhcyBSZXAsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgd3JhcE1ldGhvZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBPYnNlcnZlckVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDb25kaXRpb24sXG4gIE9yZGVyQnlTZWxlY3RvcixcbiAgUXVlcnksXG4gIFNlbGVjdFNlbGVjdG9yLFxuICBXaGVyZU9wdGlvbixcbn0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IHNlcXVlbmNlTmFtZUZvck1vZGVsIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyBRdWVyaWFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9RdWVyaWFibGVcIjtcbmltcG9ydCB7IGdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbCwgUSA9IGFueT5cbiAgZXh0ZW5kcyBSZXA8TT5cbiAgaW1wbGVtZW50cyBPYnNlcnZhYmxlLCBRdWVyaWFibGVcbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PE1vZGVsLCBhbnk+Pj4gPVxuICAgIHt9O1xuXG4gIHByaXZhdGUgb2JzZXJ2ZXJzOiBPYnNlcnZlcltdID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWRhcHRlciE6IEFkYXB0ZXI8YW55LCBRPjtcbiAgcHJpdmF0ZSBfdGFibGVOYW1lITogc3RyaW5nO1xuICBwcml2YXRlIF9wayE6IHN0cmluZztcblxuICBnZXQgYWRhcHRlcigpIHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIGFkYXB0ZXIgZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeS4gZGlkIHlvdSB1c2UgdGhlIEB1c2VzIGRlY29yYXRvciBvciBwYXNzIGl0IGluIHRoZSBjb25zdHJ1Y3Rvcj9gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgaWYgKCF0aGlzLl90YWJsZU5hbWUpIHRoaXMuX3RhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5jbGFzcyk7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTmFtZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcGsoKSB7XG4gICAgaWYgKCF0aGlzLl9waykgdGhpcy5fcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGFzcygpKS5pZDtcbiAgICByZXR1cm4gdGhpcy5fcGs7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQWRhcHRlcjxhbnksIFE+LCBjbGF6ej86IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgc3VwZXIoY2xhenopO1xuICAgIGlmIChhZGFwdGVyKSB0aGlzLl9hZGFwdGVyID0gYWRhcHRlcjtcbiAgICBbdGhpcy5jcmVhdGVBbGwsIHRoaXMucmVhZEFsbCwgdGhpcy51cGRhdGVBbGwsIHRoaXMuZGVsZXRlQWxsXS5mb3JFYWNoKFxuICAgICAgKG0pID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG0ubmFtZTtcbiAgICAgICAgd3JhcE1ldGhvZChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgICh0aGlzIGFzIGFueSlbbmFtZSArIFwiUHJlZml4XCJdLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJTdWZmaXhcIl1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkIH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIHJlY29yZHMsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkc1tpXSBhcyBzdHJpbmcgfCBudW1iZXIpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gW21vZGVscywgLi4uYXJnc107XG4gICAgY29uc3Qgb3B0cyA9IFJlcG9zaXRvcnkuZ2V0U2VxdWVuY2VPcHRpb25zKG1vZGVsc1swXSk7XG4gICAgbGV0IGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZClbXSA9IFtdO1xuICAgIGlmIChvcHRzLnR5cGUpIHtcbiAgICAgIGlmICghb3B0cy5uYW1lKSBvcHRzLm5hbWUgPSBzZXF1ZW5jZU5hbWVGb3JNb2RlbChtb2RlbHNbMF0sIFwicGtcIik7XG4gICAgICBpZHMgPSBhd2FpdCAoYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKG9wdHMpKS5yYW5nZShtb2RlbHMubGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShtb2RlbHNbMF0pLmlkO1xuXG4gICAgbW9kZWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtLCBpKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgKG0gYXMgUmVjb3JkPHN0cmluZywgYW55PilbcGtdID0gaWRzW2ldO1xuICAgICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IGVycm9ycyA9IG1vZGVsc1xuICAgICAgLm1hcCgobSkgPT4gbS5oYXNFcnJvcnMoKSlcbiAgICAgIC5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUpXG4gICAgICAgICAgYWNjdW0gPVxuICAgICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB1bmRlZmluZWQpO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uYXJnc107XG4gIH1cblxuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQobSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkIH0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFyZ3M6IGFueVtdXT4ge1xuICAgIGNvbnN0IHBrID0gZmluZE1vZGVsSWQobW9kZWwpO1xuICAgIGNvbnN0IG9sZE1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHBrKTtcbiAgICBtb2RlbCA9IHRoaXMubWVyZ2Uob2xkTW9kZWwsIG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgb2xkTW9kZWxcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWwuaGFzRXJyb3JzKG9sZE1vZGVsKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcbiAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpIHtcbiAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtb2RlbCkpXG4gICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobW9kZWwsIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uYXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBpZHMgPSBtb2RlbHMubWFwKChtKSA9PiBmaW5kTW9kZWxJZChtKSk7XG4gICAgY29uc3Qgb2xkTW9kZWxzID0gYXdhaXQgdGhpcy5yZWFkQWxsKGlkcyk7XG4gICAgbW9kZWxzID0gbW9kZWxzLm1hcCgobSwgaSkgPT4ge1xuICAgICAgbSA9IHRoaXMubWVyZ2Uob2xkTW9kZWxzW2ldLCBtKTtcbiAgICAgIGlmIChSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpIHtcbiAgICAgICAgaWYgKCFSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG0pKVxuICAgICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobSwgUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtO1xuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgICAgICBvbGRNb2RlbHNbaV1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0sIGkpID0+IG0uaGFzRXJyb3JzKG9sZE1vZGVsc1tpXSwgbSkpXG4gICAgICAucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlKVxuICAgICAgICAgIGFjY3VtID1cbiAgICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IGFjY3VtICsgYFxcbiAtICR7aX06ICR7ZS50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycyk7XG5cbiAgICByZXR1cm4gW21vZGVscywgLi4uYXJnc107XG4gIH1cblxuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIHNlbGVjdChzZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yKTogV2hlcmVPcHRpb24ge1xuICAgIHJldHVybiBuZXcgUXVlcnk8USwgTT4odGhpcy5hZGFwdGVyKS5zZWxlY3Qoc2VsZWN0b3IpLmZyb20odGhpcy5jbGFzcyk7XG4gIH1cblxuICBhc3luYyBxdWVyeTxWPihcbiAgICBjb25kaXRpb246IENvbmRpdGlvbixcbiAgICBvcmRlckJ5OiBzdHJpbmcsXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIGxpbWl0PzogbnVtYmVyLFxuICAgIHNraXA/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxWPiB7XG4gICAgY29uc3Qgc29ydDogT3JkZXJCeVNlbGVjdG9yID0gW29yZGVyQnkgYXMgc3RyaW5nLCBvcmRlciBhcyBPcmRlckRpcmVjdGlvbl07XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlbGVjdCgpLndoZXJlKGNvbmRpdGlvbikub3JkZXJCeShzb3J0KTtcbiAgICBpZiAobGltaXQpIHF1ZXJ5LmxpbWl0KGxpbWl0KTtcbiAgICBpZiAoc2tpcCkgcXVlcnkub2Zmc2V0KHNraXApO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlPFY+KCk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIHtAbGluayBPYnNlcnZlcn1cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICpcbiAgICogQHNlZSB7T2JzZXJ2YWJsZSNvYnNlcnZlfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiT2JzZXJ2ZXIgYWxyZWFkeSByZWdpc3RlcmVkXCIpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFVucmVnaXN0ZXJzIGFuIHtAbGluayBPYnNlcnZlcn1cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICpcbiAgICogQHNlZSB7T2JzZXJ2YWJsZSN1bk9ic2VydmV9XG4gICAqL1xuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkZhaWxlZCB0byBmaW5kIE9ic2VydmVyXCIpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgY2FsbHMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIE9ic2VydmVyfXMgdG8gdXBkYXRlIHRoZW1zZWx2ZXNcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayBPYnNlcnZlciNyZWZyZXNofSBtZXRob2RcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBQcm9taXNlLmFsbCh0aGlzLm9ic2VydmVycy5tYXAoKG86IE9ic2VydmVyKSA9PiBvLnJlZnJlc2goLi4uYXJncykpKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGU6IGFueSkgPT4gcmVqZWN0KG5ldyBPYnNlcnZlckVycm9yKGUpKSk7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZm9yTW9kZWw8TSBleHRlbmRzIE1vZGVsLCBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+PihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbiAgKTogUiB7XG4gICAgY29uc3QgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuUkVQT1NJVE9SWSksXG4gICAgICBtb2RlbFxuICAgICk7XG4gICAgbGV0IGZsYXZvdXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICBtb2RlbFxuICAgICk7XG4gICAgbGV0IGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBhbnk+IHwgdW5kZWZpbmVkID0gZmxhdm91clxuICAgICAgPyBBZGFwdGVyLmdldChmbGF2b3VyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgcmVwb0NvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxSPjtcbiAgICBpZiAoIXJlcG9OYW1lKSB7XG4gICAgICBpZiAoIWFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgYm9vdCBhIHN0YW5kYXJkIHJlcG9zaXRvcnkgd2l0aG91dCBhbiBhZGFwdGVyIGRlZmluaXRpb24uIERpZCB5b3UgQHVzZSBvbiB0aGUgbW9kZWwgJHttb2RlbC5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIHJlcG9Db25zdHJ1Y3RvciA9IFJlcG9zaXRvcnkgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxSPjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVwb0NvbnN0cnVjdG9yID0gdGhpcy5nZXQocmVwb05hbWUpIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gICAgICBmbGF2b3VyID1cbiAgICAgICAgZmxhdm91ciB8fFxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICByZXBvQ29uc3RydWN0b3JcbiAgICAgICAgKTtcbiAgICAgIGlmICghZmxhdm91cilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UgYWRhcHRlciBmb3VuZCBmb3IgbW9kZWwgJHttb2RlbC5uYW1lfWBcbiAgICAgICAgKTtcblxuICAgICAgYWRhcHRlciA9IEFkYXB0ZXIuZ2V0KGZsYXZvdXIpO1xuICAgIH1cblxuICAgIGlmICghYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmVnaXN0ZXJlZCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZvdW5kIGZsYXZvdXIgJHtmbGF2b3VyfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gbmV3IHJlcG9Db25zdHJ1Y3RvcihhZGFwdGVyLCBtb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBuYW1lOiBzdHJpbmdcbiAgKTogQ29uc3RydWN0b3I8UmVwb3NpdG9yeTxNPj4ge1xuICAgIGlmIChuYW1lIGluIHRoaXMuX2NhY2hlKVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlW25hbWVdIGFzIENvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TT4+O1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBmaW5kIHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCB1bmRlciAke25hbWV9YFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgcmVnaXN0ZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcmVwbzogQ29uc3RydWN0b3I8UmVwb3NpdG9yeTxNLCBhbnk+PlxuICApIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLl9jYWNoZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGAke25hbWV9IGFscmVhZHkgcmVnaXN0ZXJlZCBhcyBhIHJlcG9zaXRvcnlgKTtcbiAgICB0aGlzLl9jYWNoZVtuYW1lXSA9IHJlcG87XG4gIH1cblxuICBzdGF0aWMgc2V0TWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSwgbWV0YWRhdGE6IGFueSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZU1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIG1vZGVsLFxuICAgICAgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXG4gICAgKTtcbiAgICBpZiAoZGVzY3JpcHRvcikgZGVsZXRlIChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV07XG4gIH1cblxuICBzdGF0aWMgZ2V0U2VxdWVuY2VPcHRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKSwgbW9kZWwsIHBrKTtcbiAgICBpZiAoIW1ldGFkYXRhKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiTm8gc2VxdWVuY2Ugb3B0aW9ucyBkZWZpbmVkIGZvciBtb2RlbC4gZGlkIHlvdSB1c2UgdGhlIEBwayBkZWNvcmF0b3I/XCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1ldGFkYXRhIGFzIFNlcXVlbmNlT3B0aW9ucztcbiAgfVxuXG4gIHN0YXRpYyBpbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IGluZGV4RGVjb3JhdG9ycyA9IGdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbCA6IG5ldyBtb2RlbCgpLFxuICAgICAgREJLZXlzLlJFRkxFQ1RcbiAgICApO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhpbmRleERlY29yYXRvcnMgfHwge30pLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4+LCBbaywgdmFsXSkgPT4ge1xuICAgICAgICBjb25zdCBkZWNzID0gdmFsLmZpbHRlcigodikgPT4gdi5rZXkuc3RhcnRzV2l0aChQZXJzaXN0ZW5jZUtleXMuSU5ERVgpKTtcbiAgICAgICAgaWYgKGRlY3MgJiYgZGVjcy5sZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGRlYyBvZiBkZWNzKSB7XG4gICAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcHMgfSA9IGRlYztcbiAgICAgICAgICAgIGFjY3VtW2tdID0gYWNjdW1ba10gfHwge307XG4gICAgICAgICAgICBhY2N1bVtrXVtrZXldID0gcHJvcHMgYXMgSW5kZXhNZXRhZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyB0YWJsZTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpLFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yIDogbW9kZWxcbiAgICApO1xuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgIH1cbiAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBNb2RlbCkge1xuICAgICAgcmV0dXJuIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbC5uYW1lO1xuICB9XG5cbiAgc3RhdGljIGNvbHVtbjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pLFxuICAgICAgbW9kZWwsXG4gICAgICBhdHRyaWJ1dGVcbiAgICApO1xuICAgIHJldHVybiBtZXRhZGF0YSA/IG1ldGFkYXRhIDogYXR0cmlidXRlO1xuICB9XG59XG4iXX0=
302
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L1JlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBU2lDO0FBR2pDLG9EQUFpRDtBQUNqRCx5RUFBb0U7QUFDcEUsd0RBQTJEO0FBQzNELDBDQUF1QztBQUN2QywyQ0FBNkM7QUFHN0MscURBQWdFO0FBRWhFLHNEQUFtRDtBQUNuRCwyREFBa0Q7QUFJbEQsNkNBQWlEO0FBQ2pELGdEQUFzQztBQUV0QyxNQUFhLFVBQ1gsU0FBUSwwQkFBTTthQUdDLFdBQU0sR0FHakIsRUFIaUIsQUFHZixDQUFDO0lBT1AsSUFBSSxPQUFPO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQ2hCLE1BQU0sSUFBSSw2QkFBYSxDQUNyQixzR0FBc0csQ0FDdkcsQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBYyxTQUFTO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxZQUFZLE9BQXlCLEVBQUUsS0FBc0I7UUFDM0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBbkJQLGNBQVMsR0FBZSxFQUFFLENBQUM7UUFvQmpDLElBQUksT0FBTztZQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3JDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQ2pDLGlCQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsT0FBTyxDQUFDLEVBQ3BD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QUFNLENBQUMsTUFBTSxDQUFrQixLQUFRLEVBQUUsU0FBaUI7UUFDeEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDbEMsaUJBQU8sQ0FBQyxHQUFHLENBQUMsMkJBQWUsQ0FBQyxNQUFNLENBQUMsRUFDbkMsS0FBSyxFQUNMLFNBQVMsQ0FDVixDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3pDLENBQUM7O0FBN2FILGdDQThhQyIsImZpbGUiOiJyZXBvc2l0b3J5L1JlcG9zaXRvcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEQktleXMsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBSZXBvc2l0b3J5IGFzIFJlcCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICB3cmFwTWV0aG9kV2l0aENvbnRleHQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmFibGVcIjtcbmltcG9ydCB7IE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiLi4vcXVlcnkvUXVlcnlcIjtcbmltcG9ydCB7IE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7IFF1ZXJpYWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1F1ZXJpYWJsZVwiO1xuaW1wb3J0IHsgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcXVlcnkvQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBXaGVyZU9wdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9vcHRpb25zXCI7XG5pbXBvcnQgeyBPcmRlckJ5U2VsZWN0b3IsIFNlbGVjdFNlbGVjdG9yIH0gZnJvbSBcIi4uL3F1ZXJ5L3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyB1c2VzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbCwgUSA9IGFueT5cbiAgZXh0ZW5kcyBSZXA8TT5cbiAgaW1wbGVtZW50cyBPYnNlcnZhYmxlLCBRdWVyaWFibGVcbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIENvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TW9kZWwsIGFueT4+IHwgUmVwb3NpdG9yeTxNb2RlbCwgYW55PlxuICA+ID0ge307XG5cbiAgcHJpdmF0ZSBvYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hZGFwdGVyITogQWRhcHRlcjxhbnksIFE+O1xuICBwcml2YXRlIF90YWJsZU5hbWUhOiBzdHJpbmc7XG5cbiAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBhZGFwdGVyIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnkuIGRpZCB5b3UgdXNlIHRoZSBAdXNlcyBkZWNvcmF0b3Igb3IgcGFzcyBpdCBpbiB0aGUgY29uc3RydWN0b3I/YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdGFibGVOYW1lKCkge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQWRhcHRlcjxhbnksIFE+LCBjbGF6ej86IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgc3VwZXIoY2xhenopO1xuICAgIGlmIChhZGFwdGVyKSB0aGlzLl9hZGFwdGVyID0gYWRhcHRlcjtcbiAgICBpZiAoY2xhenopIHtcbiAgICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoY2xhenosIHRoaXMpO1xuICAgICAgaWYgKGFkYXB0ZXIpIHtcbiAgICAgICAgY29uc3QgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgIGNsYXp6XG4gICAgICAgICk7XG4gICAgICAgIGlmIChmbGF2b3VyICYmIGZsYXZvdXIgIT09IGFkYXB0ZXIuZmxhdm91cilcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkluY29tcGF0aWJsZSBmbGF2b3Vyc1wiKTtcbiAgICAgICAgdXNlcyhhZGFwdGVyLmZsYXZvdXIpKGNsYXp6KTtcbiAgICAgIH1cbiAgICB9XG4gICAgW3RoaXMuY3JlYXRlQWxsLCB0aGlzLnJlYWRBbGwsIHRoaXMudXBkYXRlQWxsLCB0aGlzLmRlbGV0ZUFsbF0uZm9yRWFjaChcbiAgICAgIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBtLm5hbWU7XG4gICAgICAgIHdyYXBNZXRob2RXaXRoQ29udGV4dChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgICh0aGlzIGFzIGFueSlbbmFtZSArIFwiUHJlZml4XCJdLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJTdWZmaXhcIl1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY29udGV4dChcbiAgICBvcGVyYXRpb246XG4gICAgICB8IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuUkVBRFxuICAgICAgfCBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLkRFTEVURVxuICApOiBQcm9taXNlPENvbnRleHQ8TT4+IHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmNvbnRleHQob3BlcmF0aW9uLCB0aGlzLmNsYXNzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gbW9kZWxzO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgbGV0IHJlY29yZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgaWRzIGFzIChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICByZWNvcmRzLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZHNbaV0gYXMgc3RyaW5nIHwgbnVtYmVyKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgdGhpcyxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICAgIGNvbnN0IG9wdHMgPSBSZXBvc2l0b3J5LmdldFNlcXVlbmNlT3B0aW9ucyhtb2RlbHNbMF0pO1xuICAgIGxldCBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgfCB1bmRlZmluZWQpW10gPSBbXTtcbiAgICBpZiAob3B0cy50eXBlKSB7XG4gICAgICBpZiAoIW9wdHMubmFtZSkgb3B0cy5uYW1lID0gU2VxdWVuY2UucGsobW9kZWxzWzBdKTtcbiAgICAgIGlkcyA9IGF3YWl0IChhd2FpdCB0aGlzLmFkYXB0ZXIuU2VxdWVuY2Uob3B0cykpLnJhbmdlKG1vZGVscy5sZW5ndGgpO1xuICAgIH1cblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSwgaSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIChtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3RoaXMucGtdID0gaWRzW2ldO1xuICAgICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWxzXG4gICAgICAubWFwKChtKSA9PiBtLmhhc0Vycm9ycygpKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBhc3luYyB1cGRhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVQcmVmaXgoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxbTSwgLi4uYXJnczogYW55W11dPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICB0aGlzLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgY29uc3QgcGsgPSAobW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55PilbdGhpcy5wa107XG4gICAgaWYgKCFwaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gdmFsdWUgZm9yIHRoZSBJZCBpcyBkZWZpbmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSAke3RoaXMucGt9YFxuICAgICAgKTtcbiAgICBjb25zdCBvbGRNb2RlbCA9IGF3YWl0IHRoaXMucmVhZChwaywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgbW9kZWwgPSB0aGlzLm1lcmdlKG9sZE1vZGVsLCBtb2RlbCk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICBvbGRNb2RlbFxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbC5oYXNFcnJvcnMoXG4gICAgICBvbGRNb2RlbCxcbiAgICAgIC4uLlJlcG9zaXRvcnkucmVsYXRpb25zKHRoaXMuY2xhc3MpXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcbiAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpIHtcbiAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtb2RlbCkpXG4gICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobW9kZWwsIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIHRoaXMsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCBpZHMgPSBtb2RlbHMubWFwKChtKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IChtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3RoaXMucGtdO1xuICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJtaXNzaW5nIGlkIG9uIHVwZGF0ZSBvcGVyYXRpb25cIik7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSk7XG4gICAgY29uc3Qgb2xkTW9kZWxzID0gYXdhaXQgdGhpcy5yZWFkQWxsKGlkcywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgbW9kZWxzID0gbW9kZWxzLm1hcCgobSwgaSkgPT4ge1xuICAgICAgbSA9IHRoaXMubWVyZ2Uob2xkTW9kZWxzW2ldLCBtKTtcbiAgICAgIGlmIChSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpIHtcbiAgICAgICAgaWYgKCFSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG0pKVxuICAgICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobSwgUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtO1xuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgICAgIG9sZE1vZGVsc1tpXVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IG1vZGVsc1xuICAgICAgLm1hcCgobSwgaSkgPT4gbS5oYXNFcnJvcnMob2xkTW9kZWxzW2ldLCBtKSlcbiAgICAgIC5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUpXG4gICAgICAgICAgYWNjdW0gPVxuICAgICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB1bmRlZmluZWQpO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKTtcblxuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQobSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgc2VsZWN0KHNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3IpOiBXaGVyZU9wdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeTxRLCBNPih0aGlzLmFkYXB0ZXIpLnNlbGVjdChzZWxlY3RvcikuZnJvbSh0aGlzLmNsYXNzKTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5PFY+KFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uLFxuICAgIG9yZGVyQnk6IHN0cmluZyxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgc2tpcD86IG51bWJlclxuICApOiBQcm9taXNlPFY+IHtcbiAgICBjb25zdCBzb3J0OiBPcmRlckJ5U2VsZWN0b3IgPSBbb3JkZXJCeSBhcyBzdHJpbmcsIG9yZGVyIGFzIE9yZGVyRGlyZWN0aW9uXTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VsZWN0KCkud2hlcmUoY29uZGl0aW9uKS5vcmRlckJ5KHNvcnQpO1xuICAgIGlmIChsaW1pdCkgcXVlcnkubGltaXQobGltaXQpO1xuICAgIGlmIChza2lwKSBxdWVyeS5vZmZzZXQoc2tpcCk7XG4gICAgcmV0dXJuIHF1ZXJ5LmV4ZWN1dGU8Vj4oKTtcbiAgfVxuXG4gIGFzeW5jIHRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnRpbWVzdGFtcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjb2JzZXJ2ZX1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk9ic2VydmVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGNhbGxzIGFsbCByZWdpc3RlcmVkIHtAbGluayBPYnNlcnZlcn1zIHRvIHVwZGF0ZSB0aGVtc2VsdmVzXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSBvcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgT2JzZXJ2ZXIjcmVmcmVzaH0gbWV0aG9kXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLnJlZnJlc2goLi4uYXJncykpXG4gICAgKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIG9ic2VydmFibGUgJHt0aGlzLm9ic2VydmVyc1tpXX06ICR7cmVzdWx0LnJlYXNvbn1gXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZm9yTW9kZWw8TSBleHRlbmRzIE1vZGVsLCBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+PihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbiAgKTogUiB7XG4gICAgbGV0IHJlcG86IFJlcG9zaXRvcnk8TT4gfCBDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PE0+PjtcbiAgICB0cnkge1xuICAgICAgcmVwbyA9IHRoaXMuZ2V0KG1vZGVsKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJlcG8gPSBSZXBvc2l0b3J5O1xuICAgIH1cblxuICAgIGlmIChyZXBvIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIHJlcG8gYXMgUjtcblxuICAgIGNvbnN0IGZsYXZvdXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgcmVwbyk7XG4gICAgY29uc3QgYWRhcHRlcjogQWRhcHRlcjxhbnksIGFueT4gfCB1bmRlZmluZWQgPSBmbGF2b3VyXG4gICAgICA/IEFkYXB0ZXIuZ2V0KGZsYXZvdXIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmVnaXN0ZXJlZCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZvdW5kIGZsYXZvdXIgJHtmbGF2b3VyfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gbmV3IHJlcG8oYWRhcHRlciwgbW9kZWwpIGFzIFI7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbiAgKTogQ29uc3RydWN0b3I8UmVwb3NpdG9yeTxNPj4gfCBSZXBvc2l0b3J5PE0+IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy50YWJsZShtb2RlbCk7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVbbmFtZV0gYXMgQ29uc3RydWN0b3I8UmVwb3NpdG9yeTxNPj4gfCBSZXBvc2l0b3J5PE0+O1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBmaW5kIHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCB1bmRlciAke25hbWV9YFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgcmVnaXN0ZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgcmVwbzogQ29uc3RydWN0b3I8UmVwb3NpdG9yeTxNLCBhbnk+PiB8IFJlcG9zaXRvcnk8TSwgYW55PlxuICApIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy50YWJsZShtb2RlbCk7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWQgYXMgYSByZXBvc2l0b3J5YCk7XG4gICAgdGhpcy5fY2FjaGVbbmFtZV0gPSByZXBvO1xuICB9XG5cbiAgc3RhdGljIHNldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIG1ldGFkYXRhOiBhbnkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogbWV0YWRhdGEsXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0TWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgbW9kZWwsXG4gICAgICBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFcbiAgICApO1xuICAgIHJldHVybiBkZXNjcmlwdG9yID8gZGVzY3JpcHRvci52YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIGRlbGV0ZSAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICB9XG5cbiAgc3RhdGljIGdldFNlcXVlbmNlT3B0aW9uczxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShtb2RlbCkuaWQ7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5JRCksIG1vZGVsLCBwayk7XG4gICAgaWYgKCFtZXRhZGF0YSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk5vIHNlcXVlbmNlIG9wdGlvbnMgZGVmaW5lZCBmb3IgbW9kZWwuIGRpZCB5b3UgdXNlIHRoZSBAcGsgZGVjb3JhdG9yP1wiXG4gICAgICApO1xuICAgIHJldHVybiBtZXRhZGF0YSBhcyBTZXF1ZW5jZU9wdGlvbnM7XG4gIH1cblxuICBzdGF0aWMgaW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICBjb25zdCBpbmRleERlY29yYXRvcnMgPSBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwgOiBuZXcgbW9kZWwoKSxcbiAgICAgIERCS2V5cy5SRUZMRUNUXG4gICAgKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoaW5kZXhEZWNvcmF0b3JzIHx8IHt9KS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEluZGV4TWV0YWRhdGE+PiwgW2ssIHZhbF0pID0+IHtcbiAgICAgICAgY29uc3QgZGVjcyA9IHZhbC5maWx0ZXIoKHYpID0+IHYua2V5LnN0YXJ0c1dpdGgoUGVyc2lzdGVuY2VLZXlzLklOREVYKSk7XG4gICAgICAgIGlmIChkZWNzICYmIGRlY3MubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgZGVjcykge1xuICAgICAgICAgICAgY29uc3QgeyBrZXksIHByb3BzIH0gPSBkZWM7XG4gICAgICAgICAgICBhY2N1bVtrXSA9IGFjY3VtW2tdIHx8IHt9O1xuICAgICAgICAgICAgYWNjdW1ba11ba2V5XSA9IHByb3BzIGFzIEluZGV4TWV0YWRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgcmVsYXRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcHJvdG90eXBlID1cbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWxcbiAgICAgICAgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpXG4gICAgICAgIDogKG1vZGVsIGFzIGFueSkucHJvdG90eXBlO1xuICAgIHdoaWxlIChwcm90b3R5cGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcHM6IHN0cmluZ1tdID0gcHJvdG90eXBlW1BlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlNdO1xuICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnByb3BzKTtcbiAgICAgIH1cbiAgICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHRhYmxlPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHJldHVybiBnZXRUYWJsZU5hbWUobW9kZWwpO1xuICB9XG5cbiAgc3RhdGljIGNvbHVtbjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pLFxuICAgICAgbW9kZWwsXG4gICAgICBhdHRyaWJ1dGVcbiAgICApO1xuICAgIHJldHVybiBtZXRhZGF0YSA/IG1ldGFkYXRhIDogYXR0cmlidXRlO1xuICB9XG59XG4iXX0=
@@ -1,23 +1,25 @@
1
- import { Repository as Rep } from "@decaf-ts/db-decorators";
1
+ import { OperationKeys, Repository as Rep } from "@decaf-ts/db-decorators";
2
2
  import { Observable } from "../interfaces/Observable";
3
3
  import { Observer } from "../interfaces/Observer";
4
4
  import { Adapter } from "../persistence/Adapter";
5
5
  import { Constructor, Model } from "@decaf-ts/decorator-validation";
6
- import { Condition, SelectSelector, WhereOption } from "../query";
7
6
  import { OrderDirection } from "./constants";
8
- import { SequenceOptions } from "../interfaces";
7
+ import { SequenceOptions } from "../interfaces/SequenceOptions";
9
8
  import { Queriable } from "../interfaces/Queriable";
10
9
  import { IndexMetadata } from "./types";
10
+ import { Context } from "@decaf-ts/db-decorators";
11
+ import { Condition } from "../query/Condition";
12
+ import { WhereOption } from "../query/options";
13
+ import { SelectSelector } from "../query/selectors";
11
14
  export declare class Repository<M extends Model, Q = any> extends Rep<M> implements Observable, Queriable {
12
15
  private static _cache;
13
16
  private observers;
14
17
  private readonly _adapter;
15
18
  private _tableName;
16
- private _pk;
17
19
  get adapter(): Adapter<any, Q>;
18
20
  protected get tableName(): string;
19
- protected get pk(): string;
20
21
  constructor(adapter?: Adapter<any, Q>, clazz?: Constructor<M>);
22
+ context(operation: OperationKeys.CREATE | OperationKeys.READ | OperationKeys.UPDATE | OperationKeys.DELETE): Promise<Context<M>>;
21
23
  create(model: M, ...args: any[]): Promise<M>;
22
24
  createAll(models: M[], ...args: any[]): Promise<M[]>;
23
25
  protected createAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
@@ -28,6 +30,7 @@ export declare class Repository<M extends Model, Q = any> extends Rep<M> impleme
28
30
  delete(id: string | number | bigint, ...args: any[]): Promise<M>;
29
31
  select(selector?: SelectSelector): WhereOption;
30
32
  query<V>(condition: Condition, orderBy: string, order?: OrderDirection, limit?: number, skip?: number): Promise<V>;
33
+ timestamp(): Promise<Date>;
31
34
  /**
32
35
  * @summary Registers an {@link Observer}
33
36
  * @param {Observer} observer
@@ -49,12 +52,13 @@ export declare class Repository<M extends Model, Q = any> extends Rep<M> impleme
49
52
  updateObservers(...args: any[]): Promise<void>;
50
53
  static forModel<M extends Model, R extends Repository<M, any>>(model: Constructor<M>): R;
51
54
  private static get;
52
- static register<M extends Model>(name: string, repo: Constructor<Repository<M, any>>): void;
55
+ static register<M extends Model>(model: Constructor<M>, repo: Constructor<Repository<M, any>> | Repository<M, any>): void;
53
56
  static setMetadata<M extends Model>(model: M, metadata: any): void;
54
57
  static getMetadata<M extends Model>(model: M): any;
55
58
  static removeMetadata<M extends Model>(model: M): void;
56
59
  static getSequenceOptions<M extends Model>(model: M): SequenceOptions;
57
60
  static indexes<M extends Model>(model: M | Constructor<M>): Record<string, Record<string, IndexMetadata>>;
61
+ static relations<M extends Model>(model: M | Constructor<M>): string[];
58
62
  static table<M extends Model>(model: M | Constructor<M>): any;
59
63
  static column<M extends Model>(model: M, attribute: string): any;
60
64
  }
@@ -11,7 +11,7 @@ function repository(model, nameOverride) {
11
11
  return (0, injectable_decorators_1.inject)(nameOverride || model.name)(original, propertyKey);
12
12
  }
13
13
  (0, reflection_1.metadata)(Repository_1.Repository.key(db_decorators_1.DBKeys.REPOSITORY), nameOverride || original.name)(model);
14
- Repository_1.Repository.register(nameOverride || original.name, original);
14
+ Repository_1.Repository.register(model, original);
15
15
  return (0, injectable_decorators_1.injectable)(nameOverride || original.name, true, (instance) => {
16
16
  Object.defineProperty(instance, db_decorators_1.DBKeys.CLASS, {
17
17
  enumerable: false,
@@ -23,4 +23,4 @@ function repository(model, nameOverride) {
23
23
  });
24
24
  }
25
25
 
26
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSxnQ0EyQkM7QUFqQ0QsMkVBQXFFO0FBQ3JFLDJEQUE4RDtBQUM5RCxxREFBZ0Q7QUFFaEQsNkNBQTBDO0FBRTFDLFNBQWdCLFVBQVUsQ0FDeEIsS0FBcUIsRUFDckIsWUFBcUI7SUFFckIsT0FBTyxDQUFDLENBQUMsUUFBYSxFQUFFLFdBQWlCLEVBQUUsRUFBRTtRQUMzQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBQSw4QkFBTSxFQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxJQUFBLHFCQUFRLEVBQ04sdUJBQVUsQ0FBQyxHQUFHLENBQUMsc0JBQU0sQ0FBQyxVQUFVLENBQUMsRUFDakMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQzlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDVCx1QkFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3RCxPQUFPLElBQUEsa0NBQVUsRUFDZixZQUFZLElBQUksUUFBUSxDQUFDLElBQUksRUFDN0IsSUFBSSxFQUNKLENBQUMsUUFBd0IsRUFBRSxFQUFFO1lBQzNCLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLHNCQUFNLENBQUMsS0FBSyxFQUFFO2dCQUM1QyxVQUFVLEVBQUUsS0FBSztnQkFDakIsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLFFBQVEsRUFBRSxLQUFLO2dCQUNmLEtBQUssRUFBRSxLQUFLO2FBQ2IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUNGLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDZCxDQUFDLENBQVEsQ0FBQztBQUNaLENBQUMiLCJmaWxlIjoicmVwb3NpdG9yeS9kZWNvcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IERCS2V5cywgSVJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8VD4sXG4gIG5hbWVPdmVycmlkZT86IHN0cmluZ1xuKTogYW55IHtcbiAgcmV0dXJuICgob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBpZiAocHJvcGVydHlLZXkpIHtcbiAgICAgIHJldHVybiBpbmplY3QobmFtZU92ZXJyaWRlIHx8IG1vZGVsLm5hbWUpKG9yaWdpbmFsLCBwcm9wZXJ0eUtleSk7XG4gICAgfVxuXG4gICAgbWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuUkVQT1NJVE9SWSksXG4gICAgICBuYW1lT3ZlcnJpZGUgfHwgb3JpZ2luYWwubmFtZVxuICAgICkobW9kZWwpO1xuICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIobmFtZU92ZXJyaWRlIHx8IG9yaWdpbmFsLm5hbWUsIG9yaWdpbmFsKTtcbiAgICByZXR1cm4gaW5qZWN0YWJsZShcbiAgICAgIG5hbWVPdmVycmlkZSB8fCBvcmlnaW5hbC5uYW1lLFxuICAgICAgdHJ1ZSxcbiAgICAgIChpbnN0YW5jZTogSVJlcG9zaXRvcnk8VD4pID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBEQktleXMuQ0xBU1MsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogbW9kZWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICkob3JpZ2luYWwpO1xuICB9KSBhcyBhbnk7XG59XG4iXX0=
26
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSxnQ0EyQkM7QUFqQ0QsMkVBQXFFO0FBQ3JFLDJEQUE4RDtBQUM5RCxxREFBZ0Q7QUFFaEQsNkNBQTBDO0FBRTFDLFNBQWdCLFVBQVUsQ0FDeEIsS0FBcUIsRUFDckIsWUFBcUI7SUFFckIsT0FBTyxDQUFDLENBQUMsUUFBYSxFQUFFLFdBQWlCLEVBQUUsRUFBRTtRQUMzQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBQSw4QkFBTSxFQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxJQUFBLHFCQUFRLEVBQ04sdUJBQVUsQ0FBQyxHQUFHLENBQUMsc0JBQU0sQ0FBQyxVQUFVLENBQUMsRUFDakMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQzlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDVCx1QkFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFBLGtDQUFVLEVBQ2YsWUFBWSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQzdCLElBQUksRUFDSixDQUFDLFFBQXdCLEVBQUUsRUFBRTtZQUMzQixNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxzQkFBTSxDQUFDLEtBQUssRUFBRTtnQkFDNUMsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLFlBQVksRUFBRSxLQUFLO2dCQUNuQixRQUFRLEVBQUUsS0FBSztnQkFDZixLQUFLLEVBQUUsS0FBSzthQUNiLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FDRixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2QsQ0FBQyxDQUFRLENBQUM7QUFDWixDQUFDIiwiZmlsZSI6InJlcG9zaXRvcnkvZGVjb3JhdG9ycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBEQktleXMsIElSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuL1JlcG9zaXRvcnlcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPFQ+LFxuICBuYW1lT3ZlcnJpZGU/OiBzdHJpbmdcbik6IGFueSB7XG4gIHJldHVybiAoKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgaWYgKHByb3BlcnR5S2V5KSB7XG4gICAgICByZXR1cm4gaW5qZWN0KG5hbWVPdmVycmlkZSB8fCBtb2RlbC5uYW1lKShvcmlnaW5hbCwgcHJvcGVydHlLZXkpO1xuICAgIH1cblxuICAgIG1ldGFkYXRhKFxuICAgICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLFxuICAgICAgbmFtZU92ZXJyaWRlIHx8IG9yaWdpbmFsLm5hbWVcbiAgICApKG1vZGVsKTtcbiAgICBSZXBvc2l0b3J5LnJlZ2lzdGVyKG1vZGVsLCBvcmlnaW5hbCk7XG4gICAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgICBuYW1lT3ZlcnJpZGUgfHwgb3JpZ2luYWwubmFtZSxcbiAgICAgIHRydWUsXG4gICAgICAoaW5zdGFuY2U6IElSZXBvc2l0b3J5PFQ+KSA9PiB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwgREJLZXlzLkNMQVNTLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IG1vZGVsLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApKG9yaWdpbmFsKTtcbiAgfSkgYXMgYW55O1xufVxuIl19
@@ -19,6 +19,8 @@ class InjectablesRegistry extends injectable_decorators_1.InjectableRegistryImp
19
19
  if (m)
20
20
  injectable = Repository_1.Repository.forModel(m);
21
21
  if (injectable) {
22
+ if (injectable instanceof Repository_1.Repository)
23
+ return injectable;
22
24
  const flavour = Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.ADAPTER), injectable.constructor) ||
23
25
  Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.ADAPTER), m);
24
26
  injectable_decorators_1.Injectables.register(injectable, (0, utils_1.generateInjectableNameForRepository)(m, flavour));
@@ -33,4 +35,4 @@ class InjectablesRegistry extends injectable_decorators_1.InjectableRegistryImp
33
35
  }
34
36
  exports.InjectablesRegistry = InjectablesRegistry;
35
37
 
36
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L2luamVjdGFibGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJFQUd5QztBQUN6Qyw2Q0FBMEM7QUFDMUMseUVBQXlFO0FBQ3pFLG1DQUE4RDtBQUM5RCx3REFBMkQ7QUFDM0Qsb0RBQWlEO0FBRWpELE1BQWEsbUJBQW9CLFNBQVEsNkNBQXFCO0lBQzVEO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBRUQsR0FBRyxDQUFJLElBQVk7UUFDakIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVTtZQUNiLElBQUksQ0FBQztnQkFDSCxNQUFNLENBQUMsR0FBRyw0QkFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDO29CQUFFLFVBQVUsR0FBRyx1QkFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDZixNQUFNLE9BQU8sR0FDWCxPQUFPLENBQUMsV0FBVyxDQUNqQixpQkFBTyxDQUFDLEdBQUcsQ0FBQywyQkFBZSxDQUFDLE9BQU8sQ0FBQyxFQUNwQyxVQUFVLENBQUMsV0FBVyxDQUN2Qjt3QkFDRCxPQUFPLENBQUMsV0FBVyxDQUNqQixpQkFBTyxDQUFDLEdBQUcsQ0FBQywyQkFBZSxDQUFDLE9BQU8sQ0FBQyxFQUNwQyxDQUEwQixDQUMzQixDQUFDO29CQUNKLG1DQUFXLENBQUMsUUFBUSxDQUNsQixVQUFVLEVBQ1YsSUFBQSwyQ0FBbUMsRUFDakMsQ0FBMEIsRUFDMUIsT0FBTyxDQUNSLENBQ0YsQ0FBQztnQkFDSixDQUFDO2dCQUNELDZEQUE2RDtZQUMvRCxDQUFDO1lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztRQUNILE9BQU8sVUFBMkIsQ0FBQztJQUNyQyxDQUFDO0NBQ0Y7QUFuQ0Qsa0RBbUNDIiwiZmlsZSI6InJlcG9zaXRvcnkvaW5qZWN0YWJsZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlUmVnaXN0cnlJbXAsXG4gIEluamVjdGFibGVzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuL1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnkgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5IGV4dGVuZHMgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldDxUPihuYW1lOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaW5qZWN0YWJsZSA9IHN1cGVyLmdldChuYW1lKTtcbiAgICBpZiAoIWluamVjdGFibGUpXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtID0gTW9kZWwuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAobSkgaW5qZWN0YWJsZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG4gICAgICAgIGlmIChpbmplY3RhYmxlKSB7XG4gICAgICAgICAgY29uc3QgZmxhdm91ciA9XG4gICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIGluamVjdGFibGUuY29uc3RydWN0b3JcbiAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgICAgbSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgSW5qZWN0YWJsZXMucmVnaXN0ZXIoXG4gICAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICAgICAgZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnkoXG4gICAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgICAgICAgICAgICBmbGF2b3VyXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICByZXR1cm4gaW5qZWN0YWJsZSBhcyBUIHwgdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
38
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L2luamVjdGFibGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJFQUd5QztBQUN6Qyw2Q0FBMEM7QUFDMUMseUVBQXlFO0FBQ3pFLG1DQUE4RDtBQUM5RCx3REFBMkQ7QUFDM0Qsb0RBQWlEO0FBRWpELE1BQWEsbUJBQW9CLFNBQVEsNkNBQXFCO0lBQzVEO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBRUQsR0FBRyxDQUFJLElBQVk7UUFDakIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVTtZQUNiLElBQUksQ0FBQztnQkFDSCxNQUFNLENBQUMsR0FBRyw0QkFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDO29CQUFFLFVBQVUsR0FBRyx1QkFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDZixJQUFJLFVBQVUsWUFBWSx1QkFBVTt3QkFBRSxPQUFPLFVBQWUsQ0FBQztvQkFDN0QsTUFBTSxPQUFPLEdBQ1gsT0FBTyxDQUFDLFdBQVcsQ0FDakIsaUJBQU8sQ0FBQyxHQUFHLENBQUMsMkJBQWUsQ0FBQyxPQUFPLENBQUMsRUFDcEMsVUFBVSxDQUFDLFdBQVcsQ0FDdkI7d0JBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FDakIsaUJBQU8sQ0FBQyxHQUFHLENBQUMsMkJBQWUsQ0FBQyxPQUFPLENBQUMsRUFDcEMsQ0FBMEIsQ0FDM0IsQ0FBQztvQkFDSixtQ0FBVyxDQUFDLFFBQVEsQ0FDbEIsVUFBVSxFQUNWLElBQUEsMkNBQW1DLEVBQ2pDLENBQTBCLEVBQzFCLE9BQU8sQ0FDUixDQUNGLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCw2REFBNkQ7WUFDL0QsQ0FBQztZQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7UUFDSCxPQUFPLFVBQTJCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBcENELGtEQW9DQyIsImZpbGUiOiJyZXBvc2l0b3J5L2luamVjdGFibGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wLFxuICBJbmplY3RhYmxlcyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZXNSZWdpc3RyeSBleHRlbmRzIEluamVjdGFibGVSZWdpc3RyeUltcCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQ8VD4obmFtZTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGluamVjdGFibGUgPSBzdXBlci5nZXQobmFtZSk7XG4gICAgaWYgKCFpbmplY3RhYmxlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbSA9IE1vZGVsLmdldChuYW1lKTtcbiAgICAgICAgaWYgKG0pIGluamVjdGFibGUgPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuICAgICAgICBpZiAoaW5qZWN0YWJsZSkge1xuICAgICAgICAgIGlmIChpbmplY3RhYmxlIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIGluamVjdGFibGUgYXMgVDtcbiAgICAgICAgICBjb25zdCBmbGF2b3VyID1cbiAgICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZS5jb25zdHJ1Y3RvclxuICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihcbiAgICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICAgICBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeShcbiAgICAgICAgICAgICAgbSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgICAgIGZsYXZvdXJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIHJldHVybiBpbmplY3RhYmxlIGFzIFQgfCB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decaf-ts/core",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "template for ts projects",
5
5
  "type": "module",
6
6
  "exports": {
@@ -1,17 +0,0 @@
1
- /**
2
- * @summary Sequence
3
- *
4
- * @interface Sequence
5
- *
6
- * @category Sequences
7
- */
8
- export interface Sequence {
9
- /**
10
- * @summary generates the next value in the sequence
11
- *
12
- * @method
13
- */
14
- next(): Promise<string | number | bigint>;
15
- current(): Promise<string | number | bigint>;
16
- range(count: number): Promise<(number | string | bigint)[]>;
17
- }
@@ -1,10 +0,0 @@
1
- /**
2
- * @summary Sequence
3
- *
4
- * @interface Sequence
5
- *
6
- * @category Sequences
7
- */
8
- export {};
9
-
10
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9pbnRlcmZhY2VzL1NlcXVlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRyIsImZpbGUiOiJpbnRlcmZhY2VzL1NlcXVlbmNlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAc3VtbWFyeSBTZXF1ZW5jZVxuICpcbiAqIEBpbnRlcmZhY2UgU2VxdWVuY2VcbiAqXG4gKiBAY2F0ZWdvcnkgU2VxdWVuY2VzXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBTZXF1ZW5jZSB7XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBnZW5lcmF0ZXMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqXG4gICAqIEBtZXRob2RcbiAgICovXG4gIG5leHQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+O1xuICBjdXJyZW50KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PjtcbiAgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8KG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXT47XG59XG4iXX0=
@@ -1,11 +0,0 @@
1
- "use strict";
2
- /**
3
- * @summary Sequence
4
- *
5
- * @interface Sequence
6
- *
7
- * @category Sequences
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
-
11
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9pbnRlcmZhY2VzL1NlcXVlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUciLCJmaWxlIjoiaW50ZXJmYWNlcy9TZXF1ZW5jZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHN1bW1hcnkgU2VxdWVuY2VcbiAqXG4gKiBAaW50ZXJmYWNlIFNlcXVlbmNlXG4gKlxuICogQGNhdGVnb3J5IFNlcXVlbmNlc1xuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VxdWVuY2Uge1xuICAvKipcbiAgICogQHN1bW1hcnkgZ2VuZXJhdGVzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZVxuICAgKlxuICAgKiBAbWV0aG9kXG4gICAqL1xuICBuZXh0KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PjtcbiAgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD47XG4gIHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+O1xufVxuIl19
@@ -1,17 +0,0 @@
1
- /**
2
- * @summary Sequence
3
- *
4
- * @interface Sequence
5
- *
6
- * @category Sequences
7
- */
8
- export interface Sequence {
9
- /**
10
- * @summary generates the next value in the sequence
11
- *
12
- * @method
13
- */
14
- next(): Promise<string | number | bigint>;
15
- current(): Promise<string | number | bigint>;
16
- range(count: number): Promise<(number | string | bigint)[]>;
17
- }