@nlabs/reaktor 0.1.12 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/config.js +138 -0
- package/lib/data/conversations.js +228 -0
- package/lib/data/dynamodb.js +172 -0
- package/lib/data/email.js +194 -0
- package/lib/data/files.js +463 -0
- package/lib/data/groups.js +401 -0
- package/lib/data/images.js +841 -0
- package/lib/data/index.js +234 -0
- package/lib/data/ios.js +327 -0
- package/lib/data/locations.js +148 -0
- package/lib/data/messages.js +281 -0
- package/lib/data/notifications.js +59 -0
- package/lib/data/payments.js +798 -0
- package/lib/data/posts.js +637 -0
- package/lib/data/reactions.js +243 -0
- package/lib/data/s3.js +133 -0
- package/lib/data/search.js +111 -0
- package/lib/data/sms.js +79 -0
- package/lib/data/subscription.js +311 -0
- package/lib/data/tags.js +343 -0
- package/lib/data/users.js +415 -0
- package/lib/index.js +42 -0
- package/lib/types/apps.js +2 -0
- package/lib/types/arangodb.js +2 -0
- package/lib/types/auth.js +2 -0
- package/lib/types/conversations.js +2 -0
- package/lib/types/email.js +2 -0
- package/lib/types/files.js +2 -0
- package/lib/types/google.js +2 -0
- package/lib/types/groups.js +2 -0
- package/lib/types/images.js +2 -0
- package/lib/types/index.js +210 -0
- package/lib/types/locations.js +2 -0
- package/lib/types/messages.js +2 -0
- package/lib/types/notifications.js +2 -0
- package/lib/types/payments.js +2 -0
- package/lib/types/posts.js +2 -0
- package/lib/types/reactions.js +2 -0
- package/lib/types/tags.js +2 -0
- package/lib/types/users.js +2 -0
- package/lib/utils/analytics.js +59 -0
- package/lib/utils/arangodb.d.ts +0 -1
- package/lib/utils/arangodb.js +122 -0
- package/lib/utils/auth.d.ts +0 -2
- package/lib/utils/auth.js +55 -0
- package/lib/utils/graphql.js +19 -0
- package/lib/utils/index.js +78 -0
- package/lib/utils/objects.js +54 -0
- package/lib/utils/redis.js +28 -0
- package/package.json +7 -7
package/lib/data/tags.js
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.extractTags = exports.linkTags = exports.createTagEdge = exports.createTag = exports.deleteTag = exports.updateTag = exports.tagPost = exports.addTag = exports.getTag = exports.getTagList = void 0;
|
|
7
|
+
|
|
8
|
+
var _utils = require("@nlabs/utils");
|
|
9
|
+
|
|
10
|
+
var _arangojs = require("arangojs");
|
|
11
|
+
|
|
12
|
+
var _words = _interopRequireDefault(require("lodash/words"));
|
|
13
|
+
|
|
14
|
+
var _utils2 = require("../utils");
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
17
|
+
|
|
18
|
+
function _templateObject5() {
|
|
19
|
+
var data = _taggedTemplateLiteral(["REMOVE {_key:", "} IN isTagged"]);
|
|
20
|
+
|
|
21
|
+
_templateObject5 = function _templateObject5() {
|
|
22
|
+
return data;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function _templateObject4() {
|
|
29
|
+
var data = _taggedTemplateLiteral(["UPSERT {_key: ", "}\n INSERT ", "\n UPDATE {}\n IN tags RETURN NEW"]);
|
|
30
|
+
|
|
31
|
+
_templateObject4 = function _templateObject4() {
|
|
32
|
+
return data;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function _templateObject3() {
|
|
39
|
+
var data = _taggedTemplateLiteral(["FOR t IN tags\n FILTER t._key == ", "\n REMOVE t IN tags\n RETURN OLD"]);
|
|
40
|
+
|
|
41
|
+
_templateObject3 = function _templateObject3() {
|
|
42
|
+
return data;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return data;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function _templateObject2() {
|
|
49
|
+
var data = _taggedTemplateLiteral(["UPSERT {_key: ", "}\n INSERT ", "\n UPDATE ", "\n IN tags RETURN NEW"]);
|
|
50
|
+
|
|
51
|
+
_templateObject2 = function _templateObject2() {
|
|
52
|
+
return data;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
return data;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
|
|
59
|
+
|
|
60
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
61
|
+
|
|
62
|
+
function _templateObject() {
|
|
63
|
+
var data = _taggedTemplateLiteral(["INSERT ", " IN tags RETURN NEW"]);
|
|
64
|
+
|
|
65
|
+
_templateObject = function _templateObject() {
|
|
66
|
+
return data;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return data;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
73
|
+
|
|
74
|
+
var eventCategory = 'tags';
|
|
75
|
+
|
|
76
|
+
var getTagList = function getTagList(context) {
|
|
77
|
+
var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
78
|
+
var to = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 30;
|
|
79
|
+
var action = 'getList';
|
|
80
|
+
var database = context.database,
|
|
81
|
+
sessionId = context.userId;
|
|
82
|
+
var limit = (0, _utils2.getLimit)(from, to);
|
|
83
|
+
var aqlQry = "FOR t IN tagList\n FILTER t.userId == \"".concat(sessionId, "\"\n ").concat(limit.aql, "\n SORT t.added\n RETURN t");
|
|
84
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
85
|
+
return cursor.all();
|
|
86
|
+
}).then(function () {
|
|
87
|
+
var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
88
|
+
return list;
|
|
89
|
+
})["catch"](function (error) {
|
|
90
|
+
return (0, _utils2.logError)({
|
|
91
|
+
action: action,
|
|
92
|
+
category: eventCategory,
|
|
93
|
+
label: 'db_error'
|
|
94
|
+
}, error, {}).then(function () {
|
|
95
|
+
return null;
|
|
96
|
+
})["catch"](function (error) {
|
|
97
|
+
return Promise.reject(error);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
exports.getTagList = getTagList;
|
|
103
|
+
|
|
104
|
+
var getTag = function getTag(context, tagId) {
|
|
105
|
+
var action = 'getItem';
|
|
106
|
+
var database = context.database;
|
|
107
|
+
var formatId = JSON.stringify((0, _utils.parseId)(tagId));
|
|
108
|
+
var aqlQry = "FOR t IN tags\n FILTER t._key == ".concat(formatId, "\n LIMIT 1\n RETURN t");
|
|
109
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
110
|
+
return cursor.next();
|
|
111
|
+
}).then(function () {
|
|
112
|
+
var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
113
|
+
return tag;
|
|
114
|
+
})["catch"](function (error) {
|
|
115
|
+
return (0, _utils2.logError)({
|
|
116
|
+
action: action,
|
|
117
|
+
category: eventCategory,
|
|
118
|
+
label: 'db_error'
|
|
119
|
+
}, error, {}).then(function () {
|
|
120
|
+
return null;
|
|
121
|
+
})["catch"](function (error) {
|
|
122
|
+
return Promise.reject(error);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
exports.getTag = getTag;
|
|
128
|
+
|
|
129
|
+
var addTag = function addTag(context, tag) {
|
|
130
|
+
var action = 'add';
|
|
131
|
+
var database = context.database,
|
|
132
|
+
sessionId = context.userId;
|
|
133
|
+
var now = Date.now();
|
|
134
|
+
var formatId = (0, _utils.createHash)("tag-".concat(sessionId));
|
|
135
|
+
var description = tag.description,
|
|
136
|
+
name = tag.name;
|
|
137
|
+
var insert = {
|
|
138
|
+
_key: formatId,
|
|
139
|
+
added: now,
|
|
140
|
+
description: (0, _utils.parseVarChar)(description, 64),
|
|
141
|
+
modified: now,
|
|
142
|
+
name: (0, _utils.parseVarChar)(name, 32)
|
|
143
|
+
};
|
|
144
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject(), insert);
|
|
145
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
146
|
+
return cursor.next();
|
|
147
|
+
}).then(function () {
|
|
148
|
+
var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
149
|
+
return tag;
|
|
150
|
+
})["catch"](function (error) {
|
|
151
|
+
return (0, _utils2.logError)({
|
|
152
|
+
action: action,
|
|
153
|
+
category: eventCategory,
|
|
154
|
+
label: 'db_error'
|
|
155
|
+
}, error, {}).then(function () {
|
|
156
|
+
return null;
|
|
157
|
+
})["catch"](function (error) {
|
|
158
|
+
return Promise.reject(error);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
exports.addTag = addTag;
|
|
164
|
+
|
|
165
|
+
var tagPost = function tagPost(context, tagId, postId) {
|
|
166
|
+
var action = 'tagPost';
|
|
167
|
+
var database = context.database,
|
|
168
|
+
sessionId = context.userId;
|
|
169
|
+
var added = Date.now();
|
|
170
|
+
var edgeId = (0, _utils.createHash)("tagPost-".concat(sessionId));
|
|
171
|
+
var edgeCollection = (0, _utils2.useDb)(database).edgeCollection('isTagged');
|
|
172
|
+
var edge = {
|
|
173
|
+
_key: edgeId,
|
|
174
|
+
added: added
|
|
175
|
+
};
|
|
176
|
+
return edgeCollection.save(edge, "tags/".concat(tagId), "posts/".concat(postId)).then(function () {
|
|
177
|
+
var post = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
178
|
+
return post;
|
|
179
|
+
})["catch"](function (error) {
|
|
180
|
+
return (0, _utils2.logError)({
|
|
181
|
+
action: action,
|
|
182
|
+
category: eventCategory,
|
|
183
|
+
label: 'db_error'
|
|
184
|
+
}, error, {}).then(function () {
|
|
185
|
+
return null;
|
|
186
|
+
})["catch"](function (error) {
|
|
187
|
+
return Promise.reject(error);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
exports.tagPost = tagPost;
|
|
193
|
+
|
|
194
|
+
var updateTag = function updateTag(context) {
|
|
195
|
+
var item = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
196
|
+
var action = 'update';
|
|
197
|
+
var database = context.database;
|
|
198
|
+
var now = Date.now();
|
|
199
|
+
var description = item.description,
|
|
200
|
+
id = item.id,
|
|
201
|
+
name = item.name;
|
|
202
|
+
var formatName = (0, _utils.parseVarChar)(name, 32);
|
|
203
|
+
var update = {
|
|
204
|
+
description: (0, _utils.parseVarChar)(description, 64),
|
|
205
|
+
modified: now,
|
|
206
|
+
name: formatName
|
|
207
|
+
};
|
|
208
|
+
var formatId = (0, _utils.parseId)(id);
|
|
209
|
+
var tagId = !formatId ? (0, _utils.createHash)("tag-".concat(formatName.toLowerCase()), null) : formatId;
|
|
210
|
+
|
|
211
|
+
var insert = _objectSpread({}, update, {
|
|
212
|
+
_key: tagId,
|
|
213
|
+
added: now
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject2(), tagId, insert, update);
|
|
217
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
218
|
+
return cursor.next();
|
|
219
|
+
}).then(function () {
|
|
220
|
+
var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
221
|
+
return tag;
|
|
222
|
+
})["catch"](function (error) {
|
|
223
|
+
return (0, _utils2.logError)({
|
|
224
|
+
action: action,
|
|
225
|
+
category: eventCategory,
|
|
226
|
+
label: 'db_error'
|
|
227
|
+
}, error, {}).then(function () {
|
|
228
|
+
return null;
|
|
229
|
+
})["catch"](function (error) {
|
|
230
|
+
return Promise.reject(error);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
exports.updateTag = updateTag;
|
|
236
|
+
|
|
237
|
+
var deleteTag = function deleteTag(context, tagId) {
|
|
238
|
+
var action = 'delete';
|
|
239
|
+
var database = context.database;
|
|
240
|
+
var formatTagId = (0, _utils.parseId)(tagId);
|
|
241
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject3(), formatTagId);
|
|
242
|
+
return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
|
|
243
|
+
return cursor.next();
|
|
244
|
+
}).then(function () {
|
|
245
|
+
var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
246
|
+
return tag;
|
|
247
|
+
})["catch"](function (error) {
|
|
248
|
+
return (0, _utils2.logError)({
|
|
249
|
+
action: action,
|
|
250
|
+
category: eventCategory,
|
|
251
|
+
label: 'db_error'
|
|
252
|
+
}, error, {}).then(function () {
|
|
253
|
+
return null;
|
|
254
|
+
})["catch"](function (error) {
|
|
255
|
+
return Promise.reject(error);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
exports.deleteTag = deleteTag;
|
|
261
|
+
|
|
262
|
+
var createTag = function createTag(db, tagName) {
|
|
263
|
+
var tagId = (0, _utils.createHash)("tag-".concat(tagName));
|
|
264
|
+
var insert = {
|
|
265
|
+
_key: tagId,
|
|
266
|
+
added: Date.now(),
|
|
267
|
+
name: tagName
|
|
268
|
+
};
|
|
269
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject4(), tagId, insert);
|
|
270
|
+
return db.query(aqlQry).then(function (cursor) {
|
|
271
|
+
return cursor.next();
|
|
272
|
+
}).then(function () {
|
|
273
|
+
var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
274
|
+
return tag;
|
|
275
|
+
})["catch"](function (error) {
|
|
276
|
+
throw error;
|
|
277
|
+
});
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
exports.createTag = createTag;
|
|
281
|
+
|
|
282
|
+
var createTagEdge = function createTagEdge(db, tag, itemType, itemId) {
|
|
283
|
+
var edgeCollection = db.edgeCollection('isTagged');
|
|
284
|
+
var tagId = tag._id,
|
|
285
|
+
tagKey = tag._key;
|
|
286
|
+
var edgeId = (0, _utils.createHash)("tag-".concat(itemType, "-").concat(tagKey, "-").concat(itemId));
|
|
287
|
+
var edge = {
|
|
288
|
+
_key: edgeId,
|
|
289
|
+
added: Date.now(),
|
|
290
|
+
type: itemType
|
|
291
|
+
};
|
|
292
|
+
return edgeCollection.save(edge, tagId, "".concat(itemType, "/").concat(itemId)).then(function () {
|
|
293
|
+
return tag;
|
|
294
|
+
});
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
exports.createTagEdge = createTagEdge;
|
|
298
|
+
|
|
299
|
+
var linkTags = function linkTags(db, tagNames, itemType, itemId) {
|
|
300
|
+
return Promise.all(tagNames.map(function (tagId) {
|
|
301
|
+
return createTag(db, tagId).then(function (tag) {
|
|
302
|
+
return createTagEdge(db, tag, itemType, itemId);
|
|
303
|
+
});
|
|
304
|
+
}));
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
exports.linkTags = linkTags;
|
|
308
|
+
|
|
309
|
+
var extractTags = function extractTags(db, itemType, itemId, content) {
|
|
310
|
+
var tags = (0, _words["default"])(content, /#[a-zA-Z\d-]+/g).map(function (tag) {
|
|
311
|
+
return (0, _utils.parseId)(tag);
|
|
312
|
+
});
|
|
313
|
+
var edgeCollection = db.edgeCollection('isTagged');
|
|
314
|
+
return edgeCollection.inEdges(itemId).then(function (edges) {
|
|
315
|
+
if (edges.length) {
|
|
316
|
+
// Remove linked edges
|
|
317
|
+
return Promise.all(edges.map(function (edge) {
|
|
318
|
+
var edgeKey = edge._key;
|
|
319
|
+
var aqlQry = (0, _arangojs.aql)(_templateObject5(), edgeKey);
|
|
320
|
+
return db.query(aqlQry)["catch"](function (error) {
|
|
321
|
+
throw error;
|
|
322
|
+
});
|
|
323
|
+
})).then(function () {
|
|
324
|
+
if (tags.length) {
|
|
325
|
+
// Create tags
|
|
326
|
+
return linkTags(db, tags, itemType, itemId);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return [];
|
|
330
|
+
});
|
|
331
|
+
} else if (tags.length) {
|
|
332
|
+
// Create tags
|
|
333
|
+
return linkTags(db, tags, itemType, itemId);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return [];
|
|
337
|
+
})["catch"](function (error) {
|
|
338
|
+
throw error;
|
|
339
|
+
});
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
exports.extractTags = extractTags;
|
|
343
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3RhZ3MudHMiXSwibmFtZXMiOlsiZXZlbnRDYXRlZ29yeSIsImdldFRhZ0xpc3QiLCJjb250ZXh0IiwiZnJvbSIsInRvIiwiYWN0aW9uIiwiZGF0YWJhc2UiLCJzZXNzaW9uSWQiLCJ1c2VySWQiLCJsaW1pdCIsImFxbFFyeSIsImFxbCIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsImFsbCIsImxpc3QiLCJlcnJvciIsImNhdGVnb3J5IiwibGFiZWwiLCJQcm9taXNlIiwicmVqZWN0IiwiZ2V0VGFnIiwidGFnSWQiLCJmb3JtYXRJZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJuZXh0IiwidGFnIiwiYWRkVGFnIiwibm93IiwiRGF0ZSIsImRlc2NyaXB0aW9uIiwibmFtZSIsImluc2VydCIsIl9rZXkiLCJhZGRlZCIsIm1vZGlmaWVkIiwidGFnUG9zdCIsInBvc3RJZCIsImVkZ2VJZCIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZSIsInNhdmUiLCJwb3N0IiwidXBkYXRlVGFnIiwiaXRlbSIsImlkIiwiZm9ybWF0TmFtZSIsInVwZGF0ZSIsInRvTG93ZXJDYXNlIiwiZGVsZXRlVGFnIiwiZm9ybWF0VGFnSWQiLCJjcmVhdGVUYWciLCJkYiIsInRhZ05hbWUiLCJjcmVhdGVUYWdFZGdlIiwiaXRlbVR5cGUiLCJpdGVtSWQiLCJfaWQiLCJ0YWdLZXkiLCJ0eXBlIiwibGlua1RhZ3MiLCJ0YWdOYW1lcyIsIm1hcCIsImV4dHJhY3RUYWdzIiwiY29udGVudCIsInRhZ3MiLCJpbkVkZ2VzIiwiZWRnZXMiLCJsZW5ndGgiLCJlZGdlS2V5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBSUE7O0FBQ0E7O0FBR0E7O0FBTUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLGFBQXFCLEdBQUcsTUFBOUI7O0FBRU8sSUFBTUMsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQ0MsT0FB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KiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VWYXJDaGFyfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWwsIERhdGFiYXNlLCBFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvbGliL2Nqcy9hcWwtcXVlcnknO1xuaW1wb3J0IHtBcnJheUN1cnNvcn0gZnJvbSAnYXJhbmdvanMvbGliL2Nqcy9jdXJzb3InO1xuaW1wb3J0IHdvcmRzIGZyb20gJ2xvZGFzaC93b3Jkcyc7XG5cbmltcG9ydCB7QXJhbmdvREJMaW1pdH0gZnJvbSAnLi4vdHlwZXMvYXJhbmdvZGInO1xuaW1wb3J0IHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoJztcbmltcG9ydCB7UG9zdFR5cGV9IGZyb20gJy4uL3R5cGVzL3Bvc3RzJztcbmltcG9ydCB7VGFnVHlwZX0gZnJvbSAnLi4vdHlwZXMvdGFncyc7XG5pbXBvcnQge2dldExpbWl0LCBsb2dFcnJvciwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3RhZ3MnO1xuXG5leHBvcnQgY29uc3QgZ2V0VGFnTGlzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBmcm9tOiBudW1iZXIgPSAwLCB0bzogbnVtYmVyID0gMzApOiBQcm9taXNlPFRhZ1R5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0JztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCBsaW1pdDogQXJhbmdvREJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHQgSU4gdGFnTGlzdFxuICAgICAgRklMVEVSIHQudXNlcklkID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICR7bGltaXQuYXFsfVxuICAgICAgU09SVCB0LmFkZGVkXG4gICAgICBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigobGlzdCA9IFtdKSA9PiBsaXN0KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHt9KS50aGVuKCgpID0+IG51bGwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGFnID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRhZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocGFyc2VJZCh0YWdJZCkpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdCBJTiB0YWdzXG4gICAgICBGSUxURVIgdC5fa2V5ID09ICR7Zm9ybWF0SWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHRhZyA9IHt9KSA9PiB0YWcpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRUYWcgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdGFnOiBUYWdUeXBlKTogUHJvbWlzZTxUYWdUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgdGFnLSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCB7ZGVzY3JpcHRpb24sIG5hbWV9ID0gdGFnO1xuXG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIF9rZXk6IGZvcm1hdElkLFxuICAgIGFkZGVkOiBub3csXG4gICAgZGVzY3JpcHRpb246IHBhcnNlVmFyQ2hhcihkZXNjcmlwdGlvbiwgNjQpLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VWYXJDaGFyKG5hbWUsIDMyKVxuICB9O1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiB0YWdzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh0YWc6IFRhZ1R5cGUgPSB7fSkgPT4gdGFnKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHt9KS50aGVuKCgpID0+IG51bGwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdGFnUG9zdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0YWdJZCwgcG9zdElkKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICd0YWdQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCBhZGRlZDogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGB0YWdQb3N0LSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSB1c2VEYihkYXRhYmFzZSkuZWRnZUNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG4gIGNvbnN0IGVkZ2U6IGFueSA9IHtfa2V5OiBlZGdlSWQsIGFkZGVkfTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCBgdGFncy8ke3RhZ0lkfWAsIGBwb3N0cy8ke3Bvc3RJZH1gKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiBwb3N0KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHt9KS50aGVuKCgpID0+IG51bGwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVGFnID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW06IFRhZ1R5cGUgPSB7fSk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICd1cGRhdGUnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCB7ZGVzY3JpcHRpb24sIGlkLCBuYW1lfSA9IGl0ZW07XG4gIGNvbnN0IGZvcm1hdE5hbWU6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihuYW1lLCAzMik7XG5cbiAgY29uc3QgdXBkYXRlOiBUYWdUeXBlID0ge1xuICAgIGRlc2NyaXB0aW9uOiBwYXJzZVZhckNoYXIoZGVzY3JpcHRpb24sIDY0KSxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IGZvcm1hdE5hbWVcbiAgfTtcblxuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gcGFyc2VJZChpZCk7XG4gIGNvbnN0IHRhZ0lkOiBzdHJpbmcgPSAhZm9ybWF0SWQgPyBjcmVhdGVIYXNoKGB0YWctJHtmb3JtYXROYW1lLnRvTG93ZXJDYXNlKCl9YCwgbnVsbCkgOiBmb3JtYXRJZDtcblxuICBjb25zdCBpbnNlcnQ6IFRhZ1R5cGUgPSB7XG4gICAgLi4udXBkYXRlLFxuICAgIF9rZXk6IHRhZ0lkLFxuICAgIGFkZGVkOiBub3dcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQge19rZXk6ICR7dGFnSWR9fVxuICAgICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgICAgVVBEQVRFICR7dXBkYXRlfVxuICAgICAgSU4gdGFncyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodGFnID0ge30pID0+IHRhZylcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCB7fSkudGhlbigoKSA9PiBudWxsKS5jYXRjaCgoZXJyb3IpID0+IFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVRhZyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0YWdJZDogc3RyaW5nKTogUHJvbWlzZTxUYWdUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRUYWdJZDogc3RyaW5nID0gcGFyc2VJZCh0YWdJZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHQgSU4gdGFnc1xuICAgIEZJTFRFUiB0Ll9rZXkgPT0gJHtmb3JtYXRUYWdJZH1cbiAgICBSRU1PVkUgdCBJTiB0YWdzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHRhZzogVGFnVHlwZSA9IHt9KSA9PiB0YWcpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUYWcgPSAoZGI6IERhdGFiYXNlLCB0YWdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgdGFnSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYHRhZy0ke3RhZ05hbWV9YCk7XG4gIGNvbnN0IGluc2VydDogVGFnVHlwZSA9IHtcbiAgICBfa2V5OiB0YWdJZCxcbiAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICBuYW1lOiB0YWdOYW1lXG4gIH07XG5cbiAgY29uc3QgYXFsUXJ5ID0gYXFsYFVQU0VSVCB7X2tleTogJHt0YWdJZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSB7fVxuICAgIElOIHRhZ3MgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodGFnID0ge30pID0+IHRhZylcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlVGFnRWRnZSA9IChkYjogRGF0YWJhc2UsIHRhZzogVGFnVHlwZSwgaXRlbVR5cGU6IHN0cmluZywgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSBkYi5lZGdlQ29sbGVjdGlvbignaXNUYWdnZWQnKTtcbiAgY29uc3Qge19pZDogdGFnSWQsIF9rZXk6IHRhZ0tleX0gPSB0YWc7XG4gIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYHRhZy0ke2l0ZW1UeXBlfS0ke3RhZ0tleX0tJHtpdGVtSWR9YCk7XG4gIGNvbnN0IGVkZ2U6IGFueSA9IHtcbiAgICBfa2V5OiBlZGdlSWQsXG4gICAgYWRkZWQ6IERhdGUubm93KCksXG4gICAgdHlwZTogaXRlbVR5cGVcbiAgfTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCB0YWdJZCwgYCR7aXRlbVR5cGV9LyR7aXRlbUlkfWApLnRoZW4oKCkgPT4gdGFnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBsaW5rVGFncyA9IChkYjogRGF0YWJhc2UsIHRhZ05hbWVzOiBzdHJpbmdbXSwgaXRlbVR5cGU6IHN0cmluZywgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGVbXT4gPT5cbiAgUHJvbWlzZS5hbGwoXG4gICAgdGFnTmFtZXMubWFwKCh0YWdJZDogc3RyaW5nKSA9PiBjcmVhdGVUYWcoZGIsIHRhZ0lkKVxuICAgICAgLnRoZW4oKHRhZzogVGFnVHlwZSkgPT4gY3JlYXRlVGFnRWRnZShkYiwgdGFnLCBpdGVtVHlwZSwgaXRlbUlkKSkpXG4gICk7XG5cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RUYWdzID0gKGRiOiBEYXRhYmFzZSwgaXRlbVR5cGU6IHN0cmluZywgaXRlbUlkLCBjb250ZW50KTogUHJvbWlzZTxUYWdUeXBlW10+ID0+IHtcbiAgY29uc3QgdGFnczogc3RyaW5nW10gPSB3b3Jkcyhjb250ZW50LCAvI1thLXpBLVpcXGQtXSsvZykubWFwKCh0YWc6IHN0cmluZykgPT4gcGFyc2VJZCh0YWcpKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSBkYi5lZGdlQ29sbGVjdGlvbignaXNUYWdnZWQnKTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uaW5FZGdlcyhpdGVtSWQpXG4gICAgLnRoZW4oKGVkZ2VzKSA9PiB7XG4gICAgICBpZihlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGxpbmtlZCBlZGdlc1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZWRnZXMubWFwKChlZGdlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7X2tleTogZWRnZUtleX0gPSBlZGdlO1xuICAgICAgICAgICAgY29uc3QgYXFsUXJ5ID0gYXFsYFJFTU9WRSB7X2tleToke2VkZ2VLZXl9fSBJTiBpc1RhZ2dlZGA7XG4gICAgICAgICAgICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KS5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYodGFncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRhZ3NcbiAgICAgICAgICAgICAgcmV0dXJuIGxpbmtUYWdzKGRiLCB0YWdzLCBpdGVtVHlwZSwgaXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZih0YWdzLmxlbmd0aCkge1xuICAgICAgICAvLyBDcmVhdGUgdGFnc1xuICAgICAgICByZXR1cm4gbGlua1RhZ3MoZGIsIHRhZ3MsIGl0ZW1UeXBlLCBpdGVtSWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdfQ==
|