@discordeno/rest 19.0.0-next.40c19da → 19.0.0-next.4142946

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +15 -1
  2. package/dist/cjs/index.cjs +25 -0
  3. package/dist/cjs/invalidBucket.cjs +86 -0
  4. package/dist/cjs/manager.cjs +1445 -0
  5. package/dist/cjs/queue.cjs +165 -0
  6. package/dist/cjs/routes.cjs +550 -0
  7. package/dist/cjs/types.cjs +6 -0
  8. package/dist/cjs/typings/routes.cjs +6 -0
  9. package/dist/esm/index.js +8 -0
  10. package/dist/esm/invalidBucket.js +82 -0
  11. package/dist/esm/manager.js +1403 -0
  12. package/dist/esm/queue.js +155 -0
  13. package/dist/esm/routes.js +540 -0
  14. package/dist/esm/types.js +3 -0
  15. package/dist/esm/typings/routes.js +3 -0
  16. package/dist/{index.d.ts → types/index.d.ts} +1 -0
  17. package/dist/types/index.d.ts.map +1 -0
  18. package/dist/{invalidBucket.d.ts → types/invalidBucket.d.ts} +11 -7
  19. package/dist/types/invalidBucket.d.ts.map +1 -0
  20. package/dist/types/manager.d.ts +12 -0
  21. package/dist/types/manager.d.ts.map +1 -0
  22. package/dist/{queue.d.ts → types/queue.d.ts} +12 -1
  23. package/dist/types/queue.d.ts.map +1 -0
  24. package/dist/types/routes.d.ts +3 -0
  25. package/dist/types/routes.d.ts.map +1 -0
  26. package/dist/{types.d.ts → types/types.d.ts} +696 -299
  27. package/dist/types/types.d.ts.map +1 -0
  28. package/dist/{typings → types/typings}/routes.d.ts +46 -7
  29. package/dist/types/typings/routes.d.ts.map +1 -0
  30. package/package.json +33 -30
  31. package/dist/index.d.ts.map +0 -1
  32. package/dist/index.js +0 -7
  33. package/dist/index.js.map +0 -1
  34. package/dist/invalidBucket.d.ts.map +0 -1
  35. package/dist/invalidBucket.js +0 -84
  36. package/dist/invalidBucket.js.map +0 -1
  37. package/dist/manager.d.ts +0 -3
  38. package/dist/manager.d.ts.map +0 -1
  39. package/dist/manager.js +0 -1464
  40. package/dist/manager.js.map +0 -1
  41. package/dist/queue.d.ts.map +0 -1
  42. package/dist/queue.js +0 -153
  43. package/dist/queue.js.map +0 -1
  44. package/dist/types.d.ts.map +0 -1
  45. package/dist/types.js +0 -3
  46. package/dist/types.js.map +0 -1
  47. package/dist/typings/routes.d.ts.map +0 -1
  48. package/dist/typings/routes.js +0 -3
  49. package/dist/typings/routes.js.map +0 -1
package/README.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # Discordeno Rest
2
2
 
3
- A standalone and server-less REST module with functionality of REST, independently.
3
+ <img align="right" src="https://raw.githubusercontent.com/discordeno/discordeno/main/website/static/img/logo.png" height="150px" />
4
+
5
+ Discord API library for [Node.JS](https://nodejs.org), [Deno](https://deno.land) & [Bun](https://bun.sh/)
6
+
7
+ [![Discord](https://img.shields.io/discord/785384884197392384?color=7289da&logo=discord&logoColor=dark)](https://discord.com/invite/5vBgXk3UcZ)
8
+ [![codecov](https://codecov.io/gh/discordeno/discordeno/branch/main/graph/badge.svg?token=SQI9OYJ7AK)](https://codecov.io/gh/discordeno/discordeno)
9
+ ![action status](https://github.com/discordeno/discordeno/actions/workflows/lib-check.yml/badge.svg?event=push)
10
+
11
+ A standalone REST module with functionality of REST, independently.
4
12
 
5
13
  - Easily host on any serverless infrastructure.
6
14
  - Easy to use and setup with Cloudflare Workers (FREE for 100K requests per day!)
@@ -14,3 +22,9 @@ A standalone and server-less REST module with functionality of REST, independent
14
22
  - Seamless updates! When you want to update and reboot the bot, you could potentially lose tons of messages or
15
23
  responses that are in queue. Using this you could restart your bot without ever worrying about losing any responses.
16
24
  - Scalability! Scalability! Scalability!
25
+
26
+ ## Links
27
+
28
+ - [Website](https://discordeno.js.org/)
29
+ - [Documentation](https://doc.deno.land/https/deno.land/x/discordeno/mod.ts)
30
+ - [Discord](https://discord.com/invite/5vBgXk3UcZ)
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _export_star(require("./typings/routes.cjs"), exports);
6
+ _export_star(require("./invalidBucket.cjs"), exports);
7
+ _export_star(require("./manager.cjs"), exports);
8
+ _export_star(require("./queue.cjs"), exports);
9
+ _export_star(require("./routes.cjs"), exports);
10
+ _export_star(require("./types.cjs"), exports);
11
+ function _export_star(from, to) {
12
+ Object.keys(from).forEach(function(k) {
13
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
14
+ Object.defineProperty(to, k, {
15
+ enumerable: true,
16
+ get: function() {
17
+ return from[k];
18
+ }
19
+ });
20
+ }
21
+ });
22
+ return from;
23
+ }
24
+
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3R5cGluZ3Mvcm91dGVzLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9pbnZhbGlkQnVja2V0LmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZS5qcydcbmV4cG9ydCAqIGZyb20gJy4vcm91dGVzLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy5qcydcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUFjO3FCQUNBO3FCQUNBO3FCQUNBO3FCQUNBO3FCQUNBIn0=
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "createInvalidRequestBucket", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createInvalidRequestBucket;
9
+ }
10
+ });
11
+ const _utils = require("@discordeno/utils");
12
+ function createInvalidRequestBucket(options) {
13
+ const bucket = {
14
+ invalidRequests: options.current ?? 0,
15
+ max: options.max ?? 10000,
16
+ interval: options.interval ?? 600_000,
17
+ resetAt: options.resetAt,
18
+ safety: options.safety ?? 1,
19
+ errorStatuses: options.errorStatuses ?? [
20
+ 401,
21
+ 403,
22
+ 429
23
+ ],
24
+ activeRequests: options.requested ?? 0,
25
+ processing: false,
26
+ logger: options.logger ?? _utils.logger,
27
+ waiting: [],
28
+ requestsAllowed: function() {
29
+ if (bucket.resetAt !== undefined && Date.now() >= bucket.resetAt) {
30
+ bucket.invalidRequests = 0;
31
+ bucket.resetAt = Date.now() + bucket.interval;
32
+ }
33
+ return bucket.max - bucket.invalidRequests - bucket.activeRequests - bucket.safety;
34
+ },
35
+ isRequestAllowed: function() {
36
+ return bucket.requestsAllowed() > 0;
37
+ },
38
+ waitUntilRequestAvailable: async function() {
39
+ return await new Promise(async (resolve)=>{
40
+ // If whatever amount of requests is left is more than the safety margin, allow the request
41
+ if (bucket.isRequestAllowed()) {
42
+ bucket.activeRequests += 1;
43
+ resolve();
44
+ } else {
45
+ bucket.waiting.push(resolve);
46
+ await bucket.processWaiting();
47
+ }
48
+ });
49
+ },
50
+ processWaiting: async function() {
51
+ // If already processing, that loop will handle all waiting requests.
52
+ if (bucket.processing) return;
53
+ // Mark as processing so other loops don't start
54
+ bucket.processing = true;
55
+ while(bucket.waiting.length > 0){
56
+ bucket.logger.info(`[InvalidBucket] processing waiting queue while loop ran with ${bucket.waiting.length} pending requests to be made. ${JSON.stringify(bucket)}`);
57
+ if (!bucket.isRequestAllowed() && bucket.resetAt !== undefined) {
58
+ bucket.logger.warn(`[InvalidBucket] processing waiting queue is now paused until more requests are available. ${bucket.waiting.length} pending requests. ${JSON.stringify(bucket)}`);
59
+ await (0, _utils.delay)(bucket.resetAt - Date.now());
60
+ }
61
+ bucket.activeRequests += 1;
62
+ // Resolve the next item in the queue
63
+ bucket.waiting.shift()?.();
64
+ }
65
+ // Mark as false so next pending request can be triggered by new loop.
66
+ bucket.processing = false;
67
+ },
68
+ handleCompletedRequest: function(code, sharedScope) {
69
+ // Since request is complete, we can remove one from requested.
70
+ bucket.activeRequests -= 1;
71
+ // Since it is as a valid request, we don't need to do anything
72
+ if (!bucket.errorStatuses.includes(code)) return;
73
+ // Shared scope is not considered invalid
74
+ if (code === 429 && sharedScope) return;
75
+ // INVALID REQUEST WAS MADE
76
+ if (bucket.resetAt === undefined) {
77
+ bucket.resetAt = Date.now() + bucket.interval;
78
+ }
79
+ bucket.invalidRequests += 1;
80
+ bucket.logger.warn(`[InvalidBucket] an invalid request was made. Increasing invalidRequests count to ${bucket.invalidRequests}`);
81
+ }
82
+ };
83
+ return bucket;
84
+ }
85
+
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnZhbGlkQnVja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlbGF5LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcblxuLyoqXG4gKiBBIGludmFsaWQgcmVxdWVzdCBidWNrZXQgaXMgdXNlZCBpbiBhIHNpbWlsYXIgbWFubmVyIGFzIGEgbGVha3kgYnVja2V0IGJ1dCBhIGludmFsaWQgcmVxdWVzdCBidWNrZXQgY2FuIGJlIHJlZmlsbGVkIGFzIG5lZWRlZC5cbiAqIEl0J3MgcHVycG9zZSBpcyB0byBtYWtlIHN1cmUgdGhlIGJvdCBkb2VzIG5vdCBoaXQgdGhlIGxpbWl0IHRvIGdldHRpbmcgYSAxIGhyIGJhbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGlzIGJ1Y2tldC5cbiAqIEByZXR1cm5zIFJlZmlsbGluZ0J1Y2tldFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQob3B0aW9uczogSW52YWxpZFJlcXVlc3RCdWNrZXRPcHRpb25zKTogSW52YWxpZFJlcXVlc3RCdWNrZXQge1xuICBjb25zdCBidWNrZXQ6IEludmFsaWRSZXF1ZXN0QnVja2V0ID0ge1xuICAgIGludmFsaWRSZXF1ZXN0czogb3B0aW9ucy5jdXJyZW50ID8/IDAsXG4gICAgbWF4OiBvcHRpb25zLm1heCA/PyAxMDAwMCxcbiAgICBpbnRlcnZhbDogb3B0aW9ucy5pbnRlcnZhbCA/PyA2MDBfMDAwLCAvLyAxMCBtaW51dGVzXG4gICAgcmVzZXRBdDogb3B0aW9ucy5yZXNldEF0LFxuICAgIHNhZmV0eTogb3B0aW9ucy5zYWZldHkgPz8gMSxcbiAgICBlcnJvclN0YXR1c2VzOiBvcHRpb25zLmVycm9yU3RhdHVzZXMgPz8gWzQwMSwgNDAzLCA0MjldLFxuICAgIGFjdGl2ZVJlcXVlc3RzOiBvcHRpb25zLnJlcXVlc3RlZCA/PyAwLFxuICAgIHByb2Nlc3Npbmc6IGZhbHNlLFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuXG4gICAgd2FpdGluZzogW10sXG5cbiAgICByZXF1ZXN0c0FsbG93ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChidWNrZXQucmVzZXRBdCAhPT0gdW5kZWZpbmVkICYmIERhdGUubm93KCkgPj0gYnVja2V0LnJlc2V0QXQpIHtcbiAgICAgICAgYnVja2V0LmludmFsaWRSZXF1ZXN0cyA9IDBcbiAgICAgICAgYnVja2V0LnJlc2V0QXQgPSBEYXRlLm5vdygpICsgYnVja2V0LmludGVydmFsXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWNrZXQubWF4IC0gYnVja2V0LmludmFsaWRSZXF1ZXN0cyAtIGJ1Y2tldC5hY3RpdmVSZXF1ZXN0cyAtIGJ1Y2tldC5zYWZldHlcbiAgICB9LFxuXG4gICAgaXNSZXF1ZXN0QWxsb3dlZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGJ1Y2tldC5yZXF1ZXN0c0FsbG93ZWQoKSA+IDBcbiAgICB9LFxuXG4gICAgd2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZTogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgIC8vIElmIHdoYXRldmVyIGFtb3VudCBvZiByZXF1ZXN0cyBpcyBsZWZ0IGlzIG1vcmUgdGhhbiB0aGUgc2FmZXR5IG1hcmdpbiwgYWxsb3cgdGhlIHJlcXVlc3RcbiAgICAgICAgaWYgKGJ1Y2tldC5pc1JlcXVlc3RBbGxvd2VkKCkpIHtcbiAgICAgICAgICBidWNrZXQuYWN0aXZlUmVxdWVzdHMgKz0gMVxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1Y2tldC53YWl0aW5nLnB1c2gocmVzb2x2ZSlcbiAgICAgICAgICBhd2FpdCBidWNrZXQucHJvY2Vzc1dhaXRpbmcoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBwcm9jZXNzV2FpdGluZzogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gSWYgYWxyZWFkeSBwcm9jZXNzaW5nLCB0aGF0IGxvb3Agd2lsbCBoYW5kbGUgYWxsIHdhaXRpbmcgcmVxdWVzdHMuXG4gICAgICBpZiAoYnVja2V0LnByb2Nlc3NpbmcpIHJldHVyblxuXG4gICAgICAvLyBNYXJrIGFzIHByb2Nlc3Npbmcgc28gb3RoZXIgbG9vcHMgZG9uJ3Qgc3RhcnRcbiAgICAgIGJ1Y2tldC5wcm9jZXNzaW5nID0gdHJ1ZVxuXG4gICAgICB3aGlsZSAoYnVja2V0LndhaXRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICBidWNrZXQubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFtJbnZhbGlkQnVja2V0XSBwcm9jZXNzaW5nIHdhaXRpbmcgcXVldWUgd2hpbGUgbG9vcCByYW4gd2l0aCAke2J1Y2tldC53YWl0aW5nLmxlbmd0aH0gcGVuZGluZyByZXF1ZXN0cyB0byBiZSBtYWRlLiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgYnVja2V0LFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICghYnVja2V0LmlzUmVxdWVzdEFsbG93ZWQoKSAmJiBidWNrZXQucmVzZXRBdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnVja2V0LmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFtJbnZhbGlkQnVja2V0XSBwcm9jZXNzaW5nIHdhaXRpbmcgcXVldWUgaXMgbm93IHBhdXNlZCB1bnRpbCBtb3JlIHJlcXVlc3RzIGFyZSBhdmFpbGFibGUuICR7XG4gICAgICAgICAgICAgIGJ1Y2tldC53YWl0aW5nLmxlbmd0aFxuICAgICAgICAgICAgfSBwZW5kaW5nIHJlcXVlc3RzLiAke0pTT04uc3RyaW5naWZ5KGJ1Y2tldCl9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgYXdhaXQgZGVsYXkoYnVja2V0LnJlc2V0QXQgLSBEYXRlLm5vdygpKVxuICAgICAgICB9XG5cbiAgICAgICAgYnVja2V0LmFjdGl2ZVJlcXVlc3RzICs9IDFcbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgbmV4dCBpdGVtIGluIHRoZSBxdWV1ZVxuICAgICAgICBidWNrZXQud2FpdGluZy5zaGlmdCgpPy4oKVxuICAgICAgfVxuXG4gICAgICAvLyBNYXJrIGFzIGZhbHNlIHNvIG5leHQgcGVuZGluZyByZXF1ZXN0IGNhbiBiZSB0cmlnZ2VyZWQgYnkgbmV3IGxvb3AuXG4gICAgICBidWNrZXQucHJvY2Vzc2luZyA9IGZhbHNlXG4gICAgfSxcblxuICAgIGhhbmRsZUNvbXBsZXRlZFJlcXVlc3Q6IGZ1bmN0aW9uIChjb2RlLCBzaGFyZWRTY29wZSkge1xuICAgICAgLy8gU2luY2UgcmVxdWVzdCBpcyBjb21wbGV0ZSwgd2UgY2FuIHJlbW92ZSBvbmUgZnJvbSByZXF1ZXN0ZWQuXG4gICAgICBidWNrZXQuYWN0aXZlUmVxdWVzdHMgLT0gMVxuICAgICAgLy8gU2luY2UgaXQgaXMgYXMgYSB2YWxpZCByZXF1ZXN0LCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgICBpZiAoIWJ1Y2tldC5lcnJvclN0YXR1c2VzLmluY2x1ZGVzKGNvZGUpKSByZXR1cm5cbiAgICAgIC8vIFNoYXJlZCBzY29wZSBpcyBub3QgY29uc2lkZXJlZCBpbnZhbGlkXG4gICAgICBpZiAoY29kZSA9PT0gNDI5ICYmIHNoYXJlZFNjb3BlKSByZXR1cm5cblxuICAgICAgLy8gSU5WQUxJRCBSRVFVRVNUIFdBUyBNQURFXG4gICAgICBpZiAoYnVja2V0LnJlc2V0QXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBidWNrZXQucmVzZXRBdCA9IERhdGUubm93KCkgKyBidWNrZXQuaW50ZXJ2YWxcbiAgICAgIH1cblxuICAgICAgYnVja2V0LmludmFsaWRSZXF1ZXN0cyArPSAxXG4gICAgICBidWNrZXQubG9nZ2VyLndhcm4oYFtJbnZhbGlkQnVja2V0XSBhbiBpbnZhbGlkIHJlcXVlc3Qgd2FzIG1hZGUuIEluY3JlYXNpbmcgaW52YWxpZFJlcXVlc3RzIGNvdW50IHRvICR7YnVja2V0LmludmFsaWRSZXF1ZXN0c31gKVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gYnVja2V0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZFJlcXVlc3RCdWNrZXRPcHRpb25zIHtcbiAgLyoqIGN1cnJlbnQgaW52YWxpZCBhbW91bnQgKi9cbiAgY3VycmVudD86IG51bWJlclxuICAvKiogbWF4IGludmFsaWQgcmVxdWVzdHMgYWxsb3dlZCB1bnRpbCBiYW4uIERlZmF1bHRzIHRvIDEwLDAwMCAqL1xuICBtYXg/OiBudW1iZXJcbiAgLyoqIFRoZSB0aW1lIHRoYXQgZGlzY29yZCBhbGxvd3MgdG8gbWFrZSB0aGUgbWF4IG51bWJlciBvZiBpbnZhbGlkIHJlcXVlc3RzLiBEZWZhdWx0cyB0byAxMCBtaW51dGVzICovXG4gIGludGVydmFsPzogbnVtYmVyXG4gIC8qKiBXaGVuIHRoZSB0aW1lb3V0IGZvciB0aGUgYnVja2V0IGhhcyBzdGFydGVkIGF0LiAqL1xuICByZXNldEF0PzogbnVtYmVyXG4gIC8qKiBob3cgc2FmZSB0byBiZSBmcm9tIG1heC4gRGVmYXVsdHMgdG8gMSAqL1xuICBzYWZldHk/OiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0IHN0YXR1c2VzIHRoYXQgY291bnQgYXMgYW4gaW52YWxpZCByZXF1ZXN0LiAqL1xuICBlcnJvclN0YXR1c2VzPzogbnVtYmVyW11cbiAgLyoqIFRoZSBhbW91bnQgb2YgcmVxdWVzdHMgdGhhdCB3ZXJlIHJlcXVlc3RlZCBmcm9tIHRoaXMgYnVja2V0LiAqL1xuICByZXF1ZXN0ZWQ/OiBudW1iZXJcbiAgLyoqIFRoZSBsb2dnZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBidWNrZXQgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZFJlcXVlc3RCdWNrZXQge1xuICAvKiogY3VycmVudCBpbnZhbGlkIGFtb3VudCAqL1xuICBpbnZhbGlkUmVxdWVzdHM6IG51bWJlclxuICAvKiogbWF4IGludmFsaWQgcmVxdWVzdHMgYWxsb3dlZCB1bnRpbCBiYW4uIERlZmF1bHRzIHRvIDEwLDAwMCAqL1xuICBtYXg6IG51bWJlclxuICAvKiogVGhlIHRpbWUgdGhhdCBkaXNjb3JkIGFsbG93cyB0byBtYWtlIHRoZSBtYXggbnVtYmVyIG9mIGludmFsaWQgcmVxdWVzdHMuIERlZmF1bHRzIHRvIDEwIG1pbnV0ZXMgKi9cbiAgaW50ZXJ2YWw6IG51bWJlclxuICAvKiogV2hlbiB0aGUgdGltZW91dCBmb3IgdGhpcyBidWNrZXQgaGFzIHN0YXJ0ZWQgYXQuICovXG4gIHJlc2V0QXQ6IG51bWJlciB8IHVuZGVmaW5lZFxuICAvKiogaG93IHNhZmUgdG8gYmUgZnJvbSBtYXguIERlZmF1bHRzIHRvIDEgKi9cbiAgc2FmZXR5OiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0IHN0YXR1c2VzIHRoYXQgY291bnQgYXMgYW4gaW52YWxpZCByZXF1ZXN0LiAqL1xuICBlcnJvclN0YXR1c2VzOiBudW1iZXJbXVxuICAvKiogVGhlIGFtb3VudCBvZiByZXF1ZXN0cyB0aGF0IHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBidWNrZXQuICovXG4gIGFjdGl2ZVJlcXVlc3RzOiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0cyB0aGF0IGFyZSBjdXJyZW50bHkgcGVuZGluZy4gKi9cbiAgd2FpdGluZzogQXJyYXk8KHZhbHVlOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4pID0+IHZvaWQ+XG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgd2FpdGluZyBxdWV1ZSBpcyBhbHJlYWR5IHByb2Nlc3NpbmcuICovXG4gIHByb2Nlc3Npbmc6IGJvb2xlYW5cbiAgLyoqIFRoZSBsb2dnZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBidWNrZXQgKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cblxuICAvKiogR2l2ZXMgdGhlIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGFyZSBjdXJyZW50bHkgYWxsb3dlZC4gKi9cbiAgcmVxdWVzdHNBbGxvd2VkOiAoKSA9PiBudW1iZXJcbiAgLyoqIENoZWNrcyBpZiBhIHJlcXVlc3QgaXMgYWxsb3dlZCBhdCB0aGlzIHRpbWUuICovXG4gIGlzUmVxdWVzdEFsbG93ZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqIFdhaXRzIHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUgKi9cbiAgd2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZTogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogQmVnaW5zIHByb2Nlc3NpbmcgdGhlIHdhaXRpbmcgcXVldWUgb2YgcmVxdWVzdHMuICovXG4gIHByb2Nlc3NXYWl0aW5nOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBIYW5kbGVyIGZvciB3aGVuZXZlciBhIHJlcXVlc3QgaXMgdmFsaWRhdGVkLiBUaGlzIHNob3VsZCB1cGRhdGUgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgb3IgdHJpZ2dlciBhbnkgb3RoZXIgbmVjZXNzYXJ5IHN0dWZmLiAqL1xuICBoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0OiAoY29kZTogbnVtYmVyLCBzaGFyZWRTY29wZTogYm9vbGVhbikgPT4gdm9pZFxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0Iiwib3B0aW9ucyIsImJ1Y2tldCIsImludmFsaWRSZXF1ZXN0cyIsImN1cnJlbnQiLCJtYXgiLCJpbnRlcnZhbCIsInJlc2V0QXQiLCJzYWZldHkiLCJlcnJvclN0YXR1c2VzIiwiYWN0aXZlUmVxdWVzdHMiLCJyZXF1ZXN0ZWQiLCJwcm9jZXNzaW5nIiwibG9nZ2VyIiwid2FpdGluZyIsInJlcXVlc3RzQWxsb3dlZCIsInVuZGVmaW5lZCIsIkRhdGUiLCJub3ciLCJpc1JlcXVlc3RBbGxvd2VkIiwid2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicHVzaCIsInByb2Nlc3NXYWl0aW5nIiwibGVuZ3RoIiwiaW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3YXJuIiwiZGVsYXkiLCJzaGlmdCIsImhhbmRsZUNvbXBsZXRlZFJlcXVlc3QiLCJjb2RlIiwic2hhcmVkU2NvcGUiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFTZ0JBOzs7ZUFBQUE7Ozt1QkFUYztBQVN2QixTQUFTQSwyQkFBMkJDLE9BQW9DO0lBQzdFLE1BQU1DLFNBQStCO1FBQ25DQyxpQkFBaUJGLFFBQVFHLE9BQU8sSUFBSTtRQUNwQ0MsS0FBS0osUUFBUUksR0FBRyxJQUFJO1FBQ3BCQyxVQUFVTCxRQUFRSyxRQUFRLElBQUk7UUFDOUJDLFNBQVNOLFFBQVFNLE9BQU87UUFDeEJDLFFBQVFQLFFBQVFPLE1BQU0sSUFBSTtRQUMxQkMsZUFBZVIsUUFBUVEsYUFBYSxJQUFJO1lBQUM7WUFBSztZQUFLO1NBQUk7UUFDdkRDLGdCQUFnQlQsUUFBUVUsU0FBUyxJQUFJO1FBQ3JDQyxZQUFZO1FBQ1pDLFFBQVFaLFFBQVFZLE1BQU0sSUFBSUEsYUFBTTtRQUVoQ0MsU0FBUyxFQUFFO1FBRVhDLGlCQUFpQjtZQUNmLElBQUliLE9BQU9LLE9BQU8sS0FBS1MsYUFBYUMsS0FBS0MsR0FBRyxNQUFNaEIsT0FBT0ssT0FBTyxFQUFFO2dCQUNoRUwsT0FBT0MsZUFBZSxHQUFHO2dCQUN6QkQsT0FBT0ssT0FBTyxHQUFHVSxLQUFLQyxHQUFHLEtBQUtoQixPQUFPSSxRQUFRO1lBQy9DO1lBRUEsT0FBT0osT0FBT0csR0FBRyxHQUFHSCxPQUFPQyxlQUFlLEdBQUdELE9BQU9RLGNBQWMsR0FBR1IsT0FBT00sTUFBTTtRQUNwRjtRQUVBVyxrQkFBa0I7WUFDaEIsT0FBT2pCLE9BQU9hLGVBQWUsS0FBSztRQUNwQztRQUVBSywyQkFBMkI7WUFDekIsT0FBTyxNQUFNLElBQUlDLFFBQVEsT0FBT0M7Z0JBQzlCLDJGQUEyRjtnQkFDM0YsSUFBSXBCLE9BQU9pQixnQkFBZ0IsSUFBSTtvQkFDN0JqQixPQUFPUSxjQUFjLElBQUk7b0JBQ3pCWTtnQkFDRixPQUFPO29CQUNMcEIsT0FBT1ksT0FBTyxDQUFDUyxJQUFJLENBQUNEO29CQUNwQixNQUFNcEIsT0FBT3NCLGNBQWM7Z0JBQzdCO1lBQ0Y7UUFDRjtRQUVBQSxnQkFBZ0I7WUFDZCxxRUFBcUU7WUFDckUsSUFBSXRCLE9BQU9VLFVBQVUsRUFBRTtZQUV2QixnREFBZ0Q7WUFDaERWLE9BQU9VLFVBQVUsR0FBRztZQUVwQixNQUFPVixPQUFPWSxPQUFPLENBQUNXLE1BQU0sR0FBRyxFQUFHO2dCQUNoQ3ZCLE9BQU9XLE1BQU0sQ0FBQ2EsSUFBSSxDQUNoQixDQUFDLDZEQUE2RCxFQUFFeEIsT0FBT1ksT0FBTyxDQUFDVyxNQUFNLENBQUMsOEJBQThCLEVBQUVFLEtBQUtDLFNBQVMsQ0FDbEkxQixRQUNBLENBQUM7Z0JBR0wsSUFBSSxDQUFDQSxPQUFPaUIsZ0JBQWdCLE1BQU1qQixPQUFPSyxPQUFPLEtBQUtTLFdBQVc7b0JBQzlEZCxPQUFPVyxNQUFNLENBQUNnQixJQUFJLENBQ2hCLENBQUMsMEZBQTBGLEVBQ3pGM0IsT0FBT1ksT0FBTyxDQUFDVyxNQUFNLENBQ3RCLG1CQUFtQixFQUFFRSxLQUFLQyxTQUFTLENBQUMxQixRQUFRLENBQUM7b0JBRWhELE1BQU00QixJQUFBQSxZQUFLLEVBQUM1QixPQUFPSyxPQUFPLEdBQUdVLEtBQUtDLEdBQUc7Z0JBQ3ZDO2dCQUVBaEIsT0FBT1EsY0FBYyxJQUFJO2dCQUN6QixxQ0FBcUM7Z0JBQ3JDUixPQUFPWSxPQUFPLENBQUNpQixLQUFLO1lBQ3RCO1lBRUEsc0VBQXNFO1lBQ3RFN0IsT0FBT1UsVUFBVSxHQUFHO1FBQ3RCO1FBRUFvQix3QkFBd0IsU0FBVUMsSUFBSSxFQUFFQyxXQUFXO1lBQ2pELCtEQUErRDtZQUMvRGhDLE9BQU9RLGNBQWMsSUFBSTtZQUN6QiwrREFBK0Q7WUFDL0QsSUFBSSxDQUFDUixPQUFPTyxhQUFhLENBQUMwQixRQUFRLENBQUNGLE9BQU87WUFDMUMseUNBQXlDO1lBQ3pDLElBQUlBLFNBQVMsT0FBT0MsYUFBYTtZQUVqQywyQkFBMkI7WUFDM0IsSUFBSWhDLE9BQU9LLE9BQU8sS0FBS1MsV0FBVztnQkFDaENkLE9BQU9LLE9BQU8sR0FBR1UsS0FBS0MsR0FBRyxLQUFLaEIsT0FBT0ksUUFBUTtZQUMvQztZQUVBSixPQUFPQyxlQUFlLElBQUk7WUFDMUJELE9BQU9XLE1BQU0sQ0FBQ2dCLElBQUksQ0FBQyxDQUFDLGlGQUFpRixFQUFFM0IsT0FBT0MsZUFBZSxDQUFDLENBQUM7UUFDakk7SUFDRjtJQUVBLE9BQU9EO0FBQ1QifQ==