@hotstaq/admin-panel 0.2.1 → 0.2.3
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/.env +3 -2
- package/.vscode/launch.json +16 -23
- package/.vscode/tasks.json +11 -0
- package/HotSite.json +17 -4
- package/assets/html/admin-footer.hott +0 -4
- package/assets/html/admin-header.hott +7 -3
- package/assets/html/admin-sidebar.hott +13 -3
- package/build/src/WebExport.js +2 -2
- package/build/src/WebExport.js.map +1 -1
- package/build/src/cli.d.ts +2 -0
- package/build/src/cli.d.ts.map +1 -0
- package/{assets/components/admin-button.js → build/src/cli.js} +11 -41
- package/build/src/cli.js.map +1 -0
- package/build/src/components/admin-button.d.ts.map +1 -1
- package/build/src/components/admin-button.js.map +1 -1
- package/build/src/components/admin-dashboard.d.ts.map +1 -1
- package/build/src/components/admin-dashboard.js +2 -1
- package/build/src/components/admin-dashboard.js.map +1 -1
- package/build/src/components/admin-edit.d.ts +1 -1
- package/build/src/components/admin-edit.d.ts.map +1 -1
- package/build/src/components/admin-edit.js +2 -1
- package/build/src/components/admin-edit.js.map +1 -1
- package/build/src/components/admin-table-field.d.ts.map +1 -1
- package/build/src/components/admin-table-field.js +4 -2
- package/build/src/components/admin-table-field.js.map +1 -1
- package/build/src/components/admin-table-row.d.ts +3 -1
- package/build/src/components/admin-table-row.d.ts.map +1 -1
- package/build/src/components/admin-table-row.js +2 -6
- package/build/src/components/admin-table-row.js.map +1 -1
- package/build/src/components/admin-table.d.ts.map +1 -1
- package/build/src/components/admin-table.js +2 -1
- package/build/src/components/admin-table.js.map +1 -1
- package/build/src/components/admin-text.d.ts +1 -1
- package/build/src/components/admin-text.d.ts.map +1 -1
- package/build/src/components/admin-text.js +2 -1
- package/build/src/components/admin-text.js.map +1 -1
- package/build-web/AdminPanelComponents.js +2 -0
- package/build-web/AdminPanelWeb_AppAPI.js +238 -0
- package/docker-compose.yaml +39 -0
- package/env-example +1 -0
- package/package.json +5 -5
- package/src/WebExport.ts +2 -2
- package/src/cli.ts +7 -0
- package/src/components/admin-button.ts +3 -3
- package/src/components/admin-dashboard.ts +1 -2
- package/src/components/admin-edit.ts +3 -2
- package/src/components/admin-table-field.ts +3 -3
- package/src/components/admin-table-row.ts +4 -8
- package/src/components/admin-table.ts +1 -2
- package/src/components/admin-text.ts +2 -1
- package/start.sh +9 -0
- package/stop.sh +9 -0
- package/webpack.config.cjs +2 -4
- package/assets/components/admin-dashboard.js +0 -89
- package/assets/components/admin-edit.js +0 -124
- package/assets/components/admin-table-field.js +0 -91
- package/assets/components/admin-table-row.js +0 -104
- package/assets/components/admin-table.js +0 -190
- package/assets/components/admin-text.js +0 -94
- package/build-web/AdminPanel.js +0 -2
- package/build-web/admin-panel.yaml +0 -75
- package/public/index.hott +0 -16
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
-
function step(op) {
|
|
31
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
33
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
34
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
-
switch (op[0]) {
|
|
36
|
-
case 0: case 1: t = op; break;
|
|
37
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
-
default:
|
|
41
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
-
if (t[2]) _.ops.pop();
|
|
46
|
-
_.trys.pop(); continue;
|
|
47
|
-
}
|
|
48
|
-
op = body.call(thisArg, _);
|
|
49
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
-
exports.AdminText = void 0;
|
|
55
|
-
var hotstaq_1 = require("hotstaq");
|
|
56
|
-
var AdminText = /** @class */ (function (_super) {
|
|
57
|
-
__extends(AdminText, _super);
|
|
58
|
-
function AdminText(copy, api) {
|
|
59
|
-
var _this = _super.call(this, copy, api) || this;
|
|
60
|
-
_this.tag = "admin-text";
|
|
61
|
-
_this.field = "";
|
|
62
|
-
return _this;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Corrects the placement of the text elements for modals.
|
|
66
|
-
*/
|
|
67
|
-
AdminText.prototype.onParentPlace = function (parentHtmlElement, htmlElement) {
|
|
68
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
69
|
-
var placeHereArray, placeHere;
|
|
70
|
-
return __generator(this, function (_a) {
|
|
71
|
-
placeHereArray = parentHtmlElement.querySelectorAll("hot-place-here[type=\"modal\"]");
|
|
72
|
-
if (placeHereArray.length > 0) {
|
|
73
|
-
placeHere = placeHereArray[0];
|
|
74
|
-
parentHtmlElement.removeChild(htmlElement);
|
|
75
|
-
placeHere.appendChild(htmlElement);
|
|
76
|
-
// @ts-ignore
|
|
77
|
-
parentHtmlElement.hotComponent.fieldElements[this.field] = htmlElement.querySelector("input");
|
|
78
|
-
}
|
|
79
|
-
return [2 /*return*/];
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
};
|
|
83
|
-
AdminText.prototype.output = function () {
|
|
84
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
85
|
-
return __generator(this, function (_a) {
|
|
86
|
-
return [2 /*return*/, ("<div>\n\t\t\t<label class=\"form-label\">".concat(this.inner, "</label><input class=\"form-control\" type = \"text\" value = \"\" />\n\t\t</div>"))];
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
};
|
|
90
|
-
return AdminText;
|
|
91
|
-
}(hotstaq_1.HotComponent));
|
|
92
|
-
exports.AdminText = AdminText;
|
|
93
|
-
hotstaq_1.Hot.CurrentPage.processor.addComponent(AdminText);
|
|
94
|
-
//# sourceMappingURL=admin-text.js.map
|
package/build-web/AdminPanel.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var AdminPanelWeb;(()=>{"use strict";var t={1:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminText=e.AdminTableRow=e.AdminTableField=e.AdminTable=e.AdminEdit=e.AdminDashboard=e.AdminButton=e.buildAssets=void 0;const o=n(176);Object.defineProperty(e,"AdminButton",{enumerable:!0,get:function(){return o.AdminButton}});const a=n(50);Object.defineProperty(e,"AdminDashboard",{enumerable:!0,get:function(){return a.AdminDashboard}});const s=n(703);Object.defineProperty(e,"AdminEdit",{enumerable:!0,get:function(){return s.AdminEdit}});const d=n(952);Object.defineProperty(e,"AdminTable",{enumerable:!0,get:function(){return d.AdminTable}});const r=n(505);Object.defineProperty(e,"AdminTableField",{enumerable:!0,get:function(){return r.AdminTableField}});const l=n(412);Object.defineProperty(e,"AdminTableRow",{enumerable:!0,get:function(){return l.AdminTableRow}});const c=n(80);Object.defineProperty(e,"AdminText",{enumerable:!0,get:function(){return c.AdminText}}),e.buildAssets=function(){return i(this,void 0,void 0,(function*(){return{import:[{name:"bootstrap",files:["bootstrap.min.js","bootstrap.min.css"]},{name:"jquery",files:["jquery.min.js"]},"chart.js","feather-icons","@popperjs/core"],html:["./assets/html/*.*"],css:["./assets/css/*.*"],js:["./assets/js/*.*","./build-web/AdminPanel.js"],componentLibrary:"AdminPanelWeb",components:[o.AdminButton,a.AdminDashboard,s.AdminEdit,d.AdminTable,r.AdminTableField,l.AdminTableRow,c.AdminText]}}))}},176:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminButton=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-button"}buttonClicked(){return i(this,void 0,void 0,(function*(){}))}output(){return i(this,void 0,void 0,(function*(){return`<button id = "${this.htmlElements[0].id}" onclick = "this.buttonClicked ();"></button>`}))}}e.AdminButton=a},50:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminDashboard=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-dashboard",this.title="",this.base=""}onPostPlace(t,e){return i(this,void 0,void 0,(function*(){return""!=this.base&&(o.Hot.Data.baseUrl=this.base),e}))}output(){return i(this,void 0,void 0,(function*(){return`\n\t\t<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">\n\t\t\t<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">\n\t\t\t\t<h1 class="h2">${this.title}</h1>\n\t\t\t\t<div class="btn-toolbar mb-2 mb-md-0">\n\t\t\t\t\t<div class="btn-group me-2">\n\t\t\t\t\t\t<hot-place-here name = "buttons"></hot-place-here>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<hot-place-here name = "body"></hot-place-here>\n\t\t</main>`}))}}e.AdminDashboard=a},703:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminEdit=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-edit",this.title="",this.button_title="",this.attached_list="",this.schema="",this.fieldElements={},this.modalId=""}onSave(){return i(this,void 0,void 0,(function*(){let t={};for(let e in this.fieldElements){let n=this.fieldElements[e].value;t[e]=n}yield o.Hot.jsonRequest(`${o.Hot.Data.baseUrl}/v1/data/add`,{schema:this.schema,fields:t});let e=document.getElementById(this.attached_list);yield e.hotComponent.refreshList(),$(`#${this.modalId}`).modal("hide")}))}output(){return i(this,void 0,void 0,(function*(){if(""===this.name)throw new Error("You must specify a name for each admin-edit element!");return this.modalId=`${this.name}Modal`,[{html:`\n\t\t\t\x3c!-- ${this.title} Modal Start --\x3e\n\t\t\t<div class="modal fade" id="${this.modalId}" tabindex="-1" aria-labelledby="${this.name}ModalLabel" aria-hidden="true">\n\t\t\t\t<div class="modal-dialog">\n\t\t\t\t\t<div class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<h5 class="modal-title" id="${this.name}ModalLabel">${this.title}</h5>\n\t\t\t\t\t\t<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body">\n\t\t\t\t\t\t<hot-place-here name = "modalBody" type = "modal"></hot-place-here>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>\n\t\t\t\t\t\t<button type="button" class="btn btn-primary" onclick = "document.getElementById('${this.modalId}').onSave ();">${this.button_title}</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- ${this.title} Modal End --\x3e`,parentSelector:"body"},{html:`<button type="button" class="btn btn-sm btn-outline-secondary" data-bs-toggle="modal" onclick = "$('#${this.modalId}').modal ('show');">Add</button>`,parentSelector:'hot-place-here[name="buttons"]'}]}))}}e.AdminEdit=a},505:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTableField=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-table-field",this.field=0}onPostPlace(t,e){return i(this,void 0,void 0,(function*(){return t.parentNode.parentNode.parentNode.hotComponent.addHeaderDataOnly(this,e),e}))}output(){return i(this,void 0,void 0,(function*(){return[{html:`<th>${this.inner}</th>`,placeHereParent:"header"}]}))}}e.AdminTableField=a},412:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTableRow=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-table-row",this.fields=[]}onPostPlace(t,e){return i(this,void 0,void 0,(function*(){return t.parentNode.parentNode.parentNode.hotComponent.rowElements.push({fields:this.fields,element:e}),e}))}output(){return i(this,void 0,void 0,(function*(){let t="";for(let e=0;e<this.fields.length;e++){let n=this.fields[e];for(let e in n)t+=`<td>${n[e]}</td>`}return[{html:`<tr>${t}</tr>`,placeHereParent:"results"}]}))}}e.AdminTableRow=a},952:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTable=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.headerElements={},this.rowElements=[],this.tag="admin-table",this.title="",this.schema="",this.headerElements={},this.headerIndicies=[],this.rowElements=[]}addHeader(t){let e=this.htmlElements[0].getElementsByTagName("thead")[0];this.headerIndicies.push(t.hotComponent.field),e.appendChild(t)}addHeaderDataOnly(t,e){this.headerIndicies.push(t.field),this.headerElements[t.field]=e}addRow(t){let e=this.htmlElements[1].getElementsByTagName("tbody")[0],n="<tr>";for(let e=0;e<this.headerIndicies.length;e++){let i=this.headerIndicies[e],o=t[i];null!=this.headerElements[i]&&(n+=`<td>${o}</td>`)}n+="</tr>",o.HotStaq.addHtml(e,n)}clearRows(){return i(this,void 0,void 0,(function*(){this.htmlElements[1].getElementsByTagName("tbody")[0].innerHTML=""}))}refreshList(){return i(this,void 0,void 0,(function*(){let t=yield o.Hot.jsonRequest(`${o.Hot.Data.baseUrl}/v1/data/list`,{schema:this.schema});this.clearRows();for(let e=0;e<t.length;e++){let n=t[e];this.addRow(n)}}))}onPostPlace(t,e){return i(this,void 0,void 0,(function*(){return setTimeout((()=>i(this,void 0,void 0,(function*(){yield this.refreshList()}))),50),e}))}output(){return i(this,void 0,void 0,(function*(){return`\n\t\t<div id = "${this.htmlElements[0].id}">\n\t\t\t<h2>${this.title}</h2>\n\t\t\t<div class="table-responsive">\n\t\t\t<table class="table table-striped table-sm">\n\t\t\t\t<thead hot-place-here = "header">\n\t\t\t\t</thead>\n\t\t\t\t<tbody hot-place-here = "results">\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t</div>\n\t\t</div>`}))}}e.AdminTable=a},80:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminText=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-text",this.field=""}onParentPlace(t,e){return i(this,void 0,void 0,(function*(){let n=t.querySelectorAll('hot-place-here[type="modal"]');if(n.length>0){let i=n[0];t.removeChild(e),i.appendChild(e),t.hotComponent.fieldElements[this.field]=e.querySelector("input")}}))}output(){return i(this,void 0,void 0,(function*(){return`<div>\n\t\t\t<label class="form-label">${this.inner}</label><input class="form-control" type = "text" value = "" />\n\t\t</div>`}))}}e.AdminText=a},607:t=>{t.exports=HotStaqWeb}},e={},n=function n(i){var o=e[i];if(void 0!==o)return o.exports;var a=e[i]={exports:{}};return t[i].call(a.exports,a,a.exports,n),a.exports}(1);AdminPanelWeb=n})();
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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bWluUGFuZWxXZWIvLi9zcmMvY29tcG9uZW50cy9hZG1pbi1idXR0b24udHMiLCJ3ZWJwYWNrOi8vQWRtaW5QYW5lbFdlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLWRhc2hib2FyZC50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tZWRpdC50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tdGFibGUtZmllbGQudHMiLCJ3ZWJwYWNrOi8vQWRtaW5QYW5lbFdlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLXRhYmxlLXJvdy50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tdGFibGUudHMiLCJ3ZWJwYWNrOi8vQWRtaW5QYW5lbFdlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLXRleHQudHMiLCJ3ZWJwYWNrOi8vQWRtaW5QYW5lbFdlYi9leHRlcm5hbCB2YXIgXCJIb3RTdGFxV2ViXCIiLCJ3ZWJwYWNrOi8vQWRtaW5QYW5lbFdlYi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9BZG1pblBhbmVsV2ViL3dlYnBhY2svc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZG1pbkJ1dHRvbiB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tYnV0dG9uXCI7XG5pbXBvcnQgeyBBZG1pbkRhc2hib2FyZCB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tZGFzaGJvYXJkXCI7XG5pbXBvcnQgeyBBZG1pbkVkaXQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLWVkaXRcIjtcbmltcG9ydCB7IEFkbWluVGFibGUgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLXRhYmxlXCI7XG5pbXBvcnQgeyBBZG1pblRhYmxlRmllbGQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLXRhYmxlLWZpZWxkXCI7XG5pbXBvcnQgeyBBZG1pblRhYmxlUm93IH0gZnJvbSBcIi4vY29tcG9uZW50cy9hZG1pbi10YWJsZS1yb3dcIjtcbmltcG9ydCB7IEFkbWluVGV4dCB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tdGV4dFwiO1xuXG5hc3luYyBmdW5jdGlvbiBidWlsZEFzc2V0cyAoKTogUHJvbWlzZTxhbnk+XG57XG5cdHJldHVybiAoe1xuXHRcdFx0aW1wb3J0OiBbeyBuYW1lOiBcImJvb3RzdHJhcFwiLCBmaWxlczogW1wiYm9vdHN0cmFwLm1pbi5qc1wiLCBcImJvb3RzdHJhcC5taW4uY3NzXCJdIH0sIFxuXHRcdFx0XHR7IG5hbWU6IFwianF1ZXJ5XCIsIGZpbGVzOiBbXCJqcXVlcnkubWluLmpzXCJdIH0sIFxuXHRcdFx0XHRcImNoYXJ0LmpzXCIsIFxuXHRcdFx0XHRcImZlYXRoZXItaWNvbnNcIiwgXG5cdFx0XHRcdFwiQHBvcHBlcmpzL2NvcmVcIl0sXG5cdFx0XHRodG1sOiBbXCIuL2Fzc2V0cy9odG1sLyouKlwiXSxcblx0XHRcdGNzczogW1wiLi9hc3NldHMvY3NzLyouKlwiXSxcblx0XHRcdGpzOiBbXCIuL2Fzc2V0cy9qcy8qLipcIiwgXCIuL2J1aWxkLXdlYi9BZG1pblBhbmVsLmpzXCJdLFxuXHRcdFx0Y29tcG9uZW50TGlicmFyeTogXCJBZG1pblBhbmVsV2ViXCIsXG5cdFx0XHRjb21wb25lbnRzOiBbXG5cdFx0XHRcdEFkbWluQnV0dG9uLFxuXHRcdFx0XHRBZG1pbkRhc2hib2FyZCxcblx0XHRcdFx0QWRtaW5FZGl0LFxuXHRcdFx0XHRBZG1pblRhYmxlLFxuXHRcdFx0XHRBZG1pblRhYmxlRmllbGQsXG5cdFx0XHRcdEFkbWluVGFibGVSb3csXG5cdFx0XHRcdEFkbWluVGV4dF1cblx0XHR9KTtcbn1cblxuZXhwb3J0IHtcblx0XHRidWlsZEFzc2V0cyxcblx0XHRBZG1pbkJ1dHRvbixcblx0XHRBZG1pbkRhc2hib2FyZCxcblx0XHRBZG1pbkVkaXQsXG5cdFx0QWRtaW5UYWJsZSxcblx0XHRBZG1pblRhYmxlRmllbGQsXG5cdFx0QWRtaW5UYWJsZVJvdyxcblx0XHRBZG1pblRleHRcblx0fTsiLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50IH0gZnJvbSBcImhvdHN0YXFcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluQnV0dG9uIGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLWJ1dHRvblwiO1xuXHR9XG5cbiAgICBhc3luYyBidXR0b25DbGlja2VkICgpXG4gICAge1xuICAgIH1cblxuXHRhc3luYyBvdXRwdXQgKClcblx0e1xuXHRcdHJldHVybiAoYDxidXR0b24gaWQgPSBcIiR7dGhpcy5odG1sRWxlbWVudHNbMF0uaWR9XCIgb25jbGljayA9IFwidGhpcy5idXR0b25DbGlja2VkICgpO1wiPjwvYnV0dG9uPmApO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50IH0gZnJvbSBcImhvdHN0YXFcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluRGFzaGJvYXJkIGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgdGl0bGUgb2YgdGhpcyBkYXNoYm9hcmQuXG5cdCAqL1xuXHR0aXRsZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIHRvIHVzZSBmb3IgdGhpcyBkYXNoYm9hcmQuXG5cdCAqL1xuXHRiYXNlOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyA9IFwiYWRtaW4tZGFzaGJvYXJkXCI7XG5cdFx0dGhpcy50aXRsZSA9IFwiXCI7XG5cdFx0dGhpcy5iYXNlID0gXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgdGhpcyB0YWJsZSBmaWVsZCB0byB0aGUgdGFibGVcblx0ICovXG5cdGFzeW5jIG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IFByb21pc2U8SFRNTEVsZW1lbnQ+XG5cdHtcblx0XHQvLyBTZXQgdGhlIGJhc2UgQVBJIHVybCB0byB1c2UgZm9yIHRoaXMgZGFzaGJvYXJkLlxuXHRcdGlmICh0aGlzLmJhc2UgIT0gXCJcIilcblx0XHRcdEhvdC5EYXRhLmJhc2VVcmwgPSB0aGlzLmJhc2U7XG5cblx0XHRyZXR1cm4gKGh0bWxFbGVtZW50KTtcblx0fVxuXG5cdGFzeW5jIG91dHB1dCAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRyZXR1cm4gKGBcblx0XHQ8bWFpbiBjbGFzcz1cImNvbC1tZC05IG1zLXNtLWF1dG8gY29sLWxnLTEwIHB4LW1kLTRcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gZmxleC13cmFwIGZsZXgtbWQtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlciBwdC0zIHBiLTIgbWItMyBib3JkZXItYm90dG9tXCI+XG5cdFx0XHRcdDxoMSBjbGFzcz1cImgyXCI+JHt0aGlzLnRpdGxlfTwvaDE+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJidG4tdG9vbGJhciBtYi0yIG1iLW1kLTBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIG1lLTJcIj5cblx0XHRcdFx0XHRcdDxob3QtcGxhY2UtaGVyZSBuYW1lID0gXCJidXR0b25zXCI+PC9ob3QtcGxhY2UtaGVyZT5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxob3QtcGxhY2UtaGVyZSBuYW1lID0gXCJib2R5XCI+PC9ob3QtcGxhY2UtaGVyZT5cblx0XHQ8L21haW4+YCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEhvdFN0YXEsIEhvdCwgSG90QVBJLCBIb3RDb21wb25lbnQgfSBmcm9tIFwiaG90c3RhcVwiO1xuXG5leHBvcnQgY2xhc3MgQWRtaW5FZGl0IGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgdGl0bGUgb2YgdGhpcyBkYXNoYm9hcmQuXG5cdCAqL1xuXHR0aXRsZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJ1dHRvbiB0aXRsZS5cblx0ICovXG5cdGJ1dHRvbl90aXRsZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGF0dGFjaGVkIGxpc3QuXG5cdCAqL1xuXHRhdHRhY2hlZF9saXN0OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXR0YWNoZWQgc2NoZW1hLlxuXHQgKi9cblx0c2NoZW1hOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZmllbGQgZWxlbWVudHMgaW4gdGhlIGVkaXQgbW9kYWwuXG5cdCAqL1xuXHRmaWVsZEVsZW1lbnRzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnk7IH07XG5cdC8qKlxuXHQgKiBUaGUgbW9kYWwgaWQuXG5cdCAqL1xuXHRtb2RhbElkOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyA9IFwiYWRtaW4tZWRpdFwiO1xuXHRcdHRoaXMudGl0bGUgPSBcIlwiO1xuXHRcdHRoaXMuYnV0dG9uX3RpdGxlID0gXCJcIjtcblx0XHR0aGlzLmF0dGFjaGVkX2xpc3QgPSBcIlwiO1xuXHRcdHRoaXMuc2NoZW1hID0gXCJcIjtcblxuXHRcdHRoaXMuZmllbGRFbGVtZW50cyA9IHt9O1xuXG5cdFx0dGhpcy5tb2RhbElkID0gXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlIHRoaXMgZm9ybS5cblx0ICovXG5cdGFzeW5jIG9uU2F2ZSAoKVxuXHR7XG5cdFx0bGV0IHZhbHVlczogYW55ID0ge307XG5cblx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5maWVsZEVsZW1lbnRzKVxuXHRcdHtcblx0XHRcdGxldCBmaWVsZEVsZW1lbnQgPSB0aGlzLmZpZWxkRWxlbWVudHNba2V5XTtcblx0XHRcdGxldCB2YWx1ZSA9IGZpZWxkRWxlbWVudC52YWx1ZTtcblxuXHRcdFx0dmFsdWVzW2tleV0gPSB2YWx1ZTtcblx0XHR9XG5cblx0XHRhd2FpdCBIb3QuanNvblJlcXVlc3QgKGAke0hvdC5EYXRhLmJhc2VVcmx9L3YxL2RhdGEvYWRkYCwge1xuXHRcdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hLFxuXHRcdFx0XHRmaWVsZHM6IHZhbHVlc1xuXHRcdFx0fSk7XG5cblx0XHRsZXQgYXR0YWNoZWRMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKHRoaXMuYXR0YWNoZWRfbGlzdCk7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0YXdhaXQgYXR0YWNoZWRMaXN0LmhvdENvbXBvbmVudC5yZWZyZXNoTGlzdCAoKTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHQkKGAjJHt0aGlzLm1vZGFsSWR9YCkubW9kYWwgKFwiaGlkZVwiKTtcblx0fVxuXG5cdGFzeW5jIG91dHB1dCAoKVxuXHR7XG5cdFx0aWYgKHRoaXMubmFtZSA9PT0gXCJcIilcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFlvdSBtdXN0IHNwZWNpZnkgYSBuYW1lIGZvciBlYWNoIGFkbWluLWVkaXQgZWxlbWVudCFgKTtcblxuXHRcdHRoaXMubW9kYWxJZCA9IGAke3RoaXMubmFtZX1Nb2RhbGA7XG5cblx0XHRyZXR1cm4gKFt7XG5cdFx0XHRodG1sOiBgXG5cdFx0XHQ8IS0tICR7dGhpcy50aXRsZX0gTW9kYWwgU3RhcnQgLS0+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwgZmFkZVwiIGlkPVwiJHt0aGlzLm1vZGFsSWR9XCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cIiR7dGhpcy5uYW1lfU1vZGFsTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuXHRcdFx0XHRcdFx0PGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIiR7dGhpcy5uYW1lfU1vZGFsTGFiZWxcIj4ke3RoaXMudGl0bGV9PC9oNT5cblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuXHRcdFx0XHRcdFx0PGhvdC1wbGFjZS1oZXJlIG5hbWUgPSBcIm1vZGFsQm9keVwiIHR5cGUgPSBcIm1vZGFsXCI+PC9ob3QtcGxhY2UtaGVyZT5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgb25jbGljayA9IFwiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJyR7dGhpcy5tb2RhbElkfScpLm9uU2F2ZSAoKTtcIj4ke3RoaXMuYnV0dG9uX3RpdGxlfTwvYnV0dG9uPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PCEtLSAke3RoaXMudGl0bGV9IE1vZGFsIEVuZCAtLT5gLFxuXHRcdFx0cGFyZW50U2VsZWN0b3I6IFwiYm9keVwiXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRodG1sOmA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIG9uY2xpY2sgPSBcIiQoJyMke3RoaXMubW9kYWxJZH0nKS5tb2RhbCAoJ3Nob3cnKTtcIj5BZGQ8L2J1dHRvbj5gLFxuXHRcdFx0cGFyZW50U2VsZWN0b3I6IGBob3QtcGxhY2UtaGVyZVtuYW1lPVwiYnV0dG9uc1wiXWBcblx0XHR9XSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEhvdFN0YXEsIEhvdCwgSG90QVBJLCBIb3RDb21wb25lbnQgfSBmcm9tIFwiaG90c3RhcVwiO1xuXG5leHBvcnQgY2xhc3MgQWRtaW5UYWJsZUZpZWxkIGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgdGFibGUgZmllbGQuXG5cdCAqL1xuXHRmaWVsZDogbnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLXRhYmxlLWZpZWxkXCI7XG5cdFx0dGhpcy5maWVsZCA9IDA7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIHRoaXMgdGFibGUgZmllbGQgdG8gdGhlIHRhYmxlXG5cdCAqL1xuXHRhc3luYyBvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPEhUTUxFbGVtZW50PlxuXHR7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGxldCBob3RDb21wb25lbnQgPSBwYXJlbnRIdG1sRWxlbWVudC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ob3RDb21wb25lbnQ7XG5cblx0XHRob3RDb21wb25lbnQuYWRkSGVhZGVyRGF0YU9ubHkgKHRoaXMsIGh0bWxFbGVtZW50KTtcblxuXHRcdHJldHVybiAoaHRtbEVsZW1lbnQpO1xuXHR9XG5cblx0YXN5bmMgb3V0cHV0ICgpXG5cdHtcblx0XHRyZXR1cm4gKFt7XG5cdFx0XHRodG1sOiBgPHRoPiR7dGhpcy5pbm5lcn08L3RoPmAsXG5cdFx0XHRwbGFjZUhlcmVQYXJlbnQ6IFwiaGVhZGVyXCJcblx0XHR9XSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEhvdFN0YXEsIEhvdCwgSG90QVBJLCBIb3RDb21wb25lbnQgfSBmcm9tIFwiaG90c3RhcVwiO1xuXG5leHBvcnQgY2xhc3MgQWRtaW5UYWJsZVJvdyBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIHRhYmxlIHJvdyBmaWVsZHMuXG5cdCAqL1xuXHRmaWVsZHM6IGFueVtdO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLXRhYmxlLXJvd1wiO1xuXHRcdC8qKlxuXHRcdCAqIFRoZSBmaWVsZHMgYXJlIHN0b3JlZCBpbiBhIGtleS92YWx1ZSBvYmplY3QuXG5cdFx0ICogXG5cdFx0ICogQGV4YW1wbGUgeyBcIm5hbWVcIjogXCJKb2huIFNtaXRoXCIsIFwiZW1haWxcIjogXCJqb2huLnNtaXRoQGVtYWlsLmNvbVwiIH1cblx0XHQgKi9cblx0XHR0aGlzLmZpZWxkcyA9IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCB0aGlzIHRhYmxlIHJvdyB0byB0aGUgdGFibGVcblx0ICovXG5cdGFzeW5jIG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IFByb21pc2U8SFRNTEVsZW1lbnQ+XG5cdHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0cGFyZW50SHRtbEVsZW1lbnQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuaG90Q29tcG9uZW50LnJvd0VsZW1lbnRzLnB1c2ggKHsgZmllbGRzOiB0aGlzLmZpZWxkcywgZWxlbWVudDogaHRtbEVsZW1lbnR9KTtcblxuXHRcdHJldHVybiAoaHRtbEVsZW1lbnQpO1xuXHR9XG5cblx0YXN5bmMgb3V0cHV0ICgpXG5cdHtcblx0XHRsZXQgcm93SHRtbCA9IFwiXCI7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMuZmllbGRzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBmaWVsZE9iaiA9IHRoaXMuZmllbGRzW2lJZHhdO1xuXG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gZmllbGRPYmopXG5cdFx0XHR7XG5cdFx0XHRcdGxldCB2YWx1ZSA9IGZpZWxkT2JqW2tleV07XG5cblx0XHRcdFx0cm93SHRtbCArPSBgPHRkPiR7dmFsdWV9PC90ZD5gO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoW3tcblx0XHRcdGh0bWw6IGA8dHI+JHtyb3dIdG1sfTwvdHI+YCxcblx0XHRcdHBsYWNlSGVyZVBhcmVudDogXCJyZXN1bHRzXCJcblx0XHR9XSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEhvdFN0YXEsIEhvdCwgSG90QVBJLCBIb3RDb21wb25lbnQgfSBmcm9tIFwiaG90c3RhcVwiO1xuaW1wb3J0IHsgQWRtaW5UYWJsZUZpZWxkIH0gZnJvbSBcIi4vYWRtaW4tdGFibGUtZmllbGRcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluVGFibGUgZXh0ZW5kcyBIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSB0aXRsZSBvZiB0aGlzIHRhYmxlLlxuXHQgKi9cblx0dGl0bGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBhdHRhY2hlZCBzY2hlbWEuXG5cdCAqL1xuXHRzY2hlbWE6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBoZWFkZXJzIGFyZSBzdG9yZWQgaW4gYSBrZXkvdmFsdWUgb2JqZWN0LlxuXHQgKiBcblx0ICogQGV4YW1wbGUgeyBcIm5hbWVcIjogXCI8dGg+TmFtZTwvdGg+XCIsIFwiZW1haWxcIjogXCI8dGg+RW1haWw8L3RoPlwiIH1cblx0ICovXG5cdGhlYWRlckVsZW1lbnRzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnk7IH0gPSB7fTtcblx0LyoqXG5cdCAqIFRoZSBoZWFkZXIgaW5kaWNpZXMgYXJlIHN0b3JlZCBpbiBhIGtleS92YWx1ZSBvYmplY3QuXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSBjb25zb2xlLmxvZyAodGhpcy5oZWFkZXJJbmRpY2llc1tcIm5hbWVcIl0pOyAvLyBPdXRwdXRzIDBcblx0ICovXG5cdGhlYWRlckluZGljaWVzOiBudW1iZXJbXTtcblx0LyoqXG5cdCAqIFRoZSByb3cgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhbiBhcnJheSB3aXRoIGtleS92YWx1ZSBmaWVsZHMgYW5kIGl0J3MgYXR0YWNoZWQgaHRtbCBlbGVtZW50LlxuXHQgKiBcblx0ICogQGV4YW1wbGVcblx0ICoge1xuXHQgKiAgIFwiZmllbGRzXCI6IFtcblx0ICogICAgICAge1xuXHQgKiAgICAgICAgIFwibmFtZVwiOiBcIkpvaG4gU21pdGhcIixcblx0ICogICAgICAgICBcImVtYWlsXCI6IFwiam9obi5zbWl0aEB0ZXN0LmNvbVwiXG5cdCAqICAgICAgIH1cblx0ICogICAgIF0sXG5cdCAqICAgXCJodG1sXCI6IFwiPHRyPjx0ZD5Kb2huIFNtaXRoPC90ZD48dGQ+am9obi5zbWl0aEB0ZXN0LmNvbTwvdGQ+PC90cj5cIlxuXHQgKiB9XG5cdCAqL1xuXHRyb3dFbGVtZW50czogeyBmaWVsZHM6IGFueVtdOyBodG1sOiBzdHJpbmc7IH1bXSA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLXRhYmxlXCI7XG5cdFx0dGhpcy50aXRsZSA9IFwiXCI7XG5cdFx0dGhpcy5zY2hlbWEgPSBcIlwiO1xuXHRcdHRoaXMuaGVhZGVyRWxlbWVudHMgPSB7fTtcblx0XHR0aGlzLmhlYWRlckluZGljaWVzID0gW107XG5cdFx0dGhpcy5yb3dFbGVtZW50cyA9IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGhlYWRlciB0byB0aGUgdGFibGUuXG5cdCAqL1xuXHRhZGRIZWFkZXIgKHRhYmxlRmllbGRFbGVtZW50OiBIVE1MRWxlbWVudClcblx0e1xuXHRcdGxldCBoZWFkZXIgPSB0aGlzLmh0bWxFbGVtZW50c1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJ0aGVhZFwiKVswXTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHR0aGlzLmhlYWRlckluZGljaWVzLnB1c2ggKHRhYmxlRmllbGRFbGVtZW50LmhvdENvbXBvbmVudC5maWVsZCk7XG5cdFx0aGVhZGVyLmFwcGVuZENoaWxkICh0YWJsZUZpZWxkRWxlbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgaGVhZGVyIHRvIHRoZSB0YWJsZS5cblx0ICovXG5cdGFkZEhlYWRlckRhdGFPbmx5ICh0YWJsZUZpZWxkOiBBZG1pblRhYmxlRmllbGQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudClcblx0e1xuXHRcdHRoaXMuaGVhZGVySW5kaWNpZXMucHVzaCAodGFibGVGaWVsZC5maWVsZCk7XG5cdFx0dGhpcy5oZWFkZXJFbGVtZW50c1t0YWJsZUZpZWxkLmZpZWxkXSA9IGh0bWxFbGVtZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHJvdyB0byB0aGUgdGFibGUuXG5cdCAqIFxuXHQgKiBAcGFyYW0ge0FycmF5fSBmaWVsZHMgQSBsaXN0IG9mIHZhbHVlcyB0byBhcHBlbmQuXG5cdCAqL1xuXHRhZGRSb3cgKGZpZWxkczogeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSlcblx0e1xuXHRcdGxldCB0Ym9keSA9IHRoaXMuaHRtbEVsZW1lbnRzWzFdLmdldEVsZW1lbnRzQnlUYWdOYW1lIChcInRib2R5XCIpWzBdO1xuXHRcdGxldCByb3dTdHIgPSBcIjx0cj5cIjtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5oZWFkZXJJbmRpY2llcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQga2V5ID0gdGhpcy5oZWFkZXJJbmRpY2llc1tpSWR4XTtcblx0XHRcdGxldCB2YWx1ZSA9IGZpZWxkc1trZXldO1xuXG5cdFx0XHRpZiAodGhpcy5oZWFkZXJFbGVtZW50c1trZXldICE9IG51bGwpXG5cdFx0XHRcdHJvd1N0ciArPSBgPHRkPiR7dmFsdWV9PC90ZD5gO1xuXHRcdH1cblxuXHRcdHJvd1N0ciArPSBcIjwvdHI+XCI7XG5cblx0XHRIb3RTdGFxLmFkZEh0bWwgKHRib2R5LCByb3dTdHIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFyIHRoZSBsaXN0IG9mIHJvd3MuXG5cdCAqL1xuXHRhc3luYyBjbGVhclJvd3MgKClcblx0e1xuXHRcdGxldCB0Ym9keSA9IHRoaXMuaHRtbEVsZW1lbnRzWzFdLmdldEVsZW1lbnRzQnlUYWdOYW1lIChcInRib2R5XCIpWzBdO1xuXG5cdFx0dGJvZHkuaW5uZXJIVE1MID0gXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZyZXNoIHRoZSBsaXN0LlxuXHQgKi9cblx0YXN5bmMgcmVmcmVzaExpc3QgKClcblx0e1xuXHRcdGxldCBsaXN0ID0gYXdhaXQgSG90Lmpzb25SZXF1ZXN0IChgJHtIb3QuRGF0YS5iYXNlVXJsfS92MS9kYXRhL2xpc3RgLCB7XG5cdFx0XHRcdHNjaGVtYTogdGhpcy5zY2hlbWFcblx0XHRcdH0pO1xuXG5cdFx0dGhpcy5jbGVhclJvd3MgKCk7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGxpc3QubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGZpZWxkcyA9IGxpc3RbaUlkeF07XG5cblx0XHRcdHRoaXMuYWRkUm93IChmaWVsZHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2YgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhc3luYyBvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPEhUTUxFbGVtZW50PlxuXHR7XG5cdFx0c2V0VGltZW91dCAoYXN5bmMgKCkgPT5cblx0XHRcdHtcblx0XHRcdFx0YXdhaXQgdGhpcy5yZWZyZXNoTGlzdCAoKTtcblx0XHRcdH0sIDUwKTtcblxuXHRcdHJldHVybiAoaHRtbEVsZW1lbnQpO1xuXHR9XG5cblx0YXN5bmMgb3V0cHV0ICgpXG5cdHtcblx0XHRyZXR1cm4gKGBcblx0XHQ8ZGl2IGlkID0gXCIke3RoaXMuaHRtbEVsZW1lbnRzWzBdLmlkfVwiPlxuXHRcdFx0PGgyPiR7dGhpcy50aXRsZX08L2gyPlxuXHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cblx0XHRcdDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtc21cIj5cblx0XHRcdFx0PHRoZWFkIGhvdC1wbGFjZS1oZXJlID0gXCJoZWFkZXJcIj5cblx0XHRcdFx0PC90aGVhZD5cblx0XHRcdFx0PHRib2R5IGhvdC1wbGFjZS1oZXJlID0gXCJyZXN1bHRzXCI+XG5cdFx0XHRcdDwvdGJvZHk+XG5cdFx0XHQ8L3RhYmxlPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+YCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEhvdFN0YXEsIEhvdCwgSG90QVBJLCBIb3RDb21wb25lbnQgfSBmcm9tIFwiaG90c3RhcVwiO1xuXG5leHBvcnQgY2xhc3MgQWRtaW5UZXh0IGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBkYXRhYmFzZSBmaWVsZC5cblx0ICovXG5cdGZpZWxkOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyA9IFwiYWRtaW4tdGV4dFwiO1xuXHRcdHRoaXMuZmllbGQgPSBcIlwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvcnJlY3RzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHRleHQgZWxlbWVudHMgZm9yIG1vZGFscy5cblx0ICovXG5cdGFzeW5jIG9uUGFyZW50UGxhY2UgKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IHBsYWNlSGVyZUFycmF5ID0gcGFyZW50SHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCAoYGhvdC1wbGFjZS1oZXJlW3R5cGU9XCJtb2RhbFwiXWApO1xuXG5cdFx0aWYgKHBsYWNlSGVyZUFycmF5Lmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0bGV0IHBsYWNlSGVyZSA9IHBsYWNlSGVyZUFycmF5WzBdO1xuXHRcdFx0cGFyZW50SHRtbEVsZW1lbnQucmVtb3ZlQ2hpbGQgKGh0bWxFbGVtZW50KTtcblx0XHRcdHBsYWNlSGVyZS5hcHBlbmRDaGlsZCAoaHRtbEVsZW1lbnQpO1xuXG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRwYXJlbnRIdG1sRWxlbWVudC5ob3RDb21wb25lbnQuZmllbGRFbGVtZW50c1t0aGlzLmZpZWxkXSA9IGh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IgKFwiaW5wdXRcIik7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgb3V0cHV0ICgpXG5cdHtcblx0XHRyZXR1cm4gKGA8ZGl2PlxuXHRcdFx0PGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPiR7dGhpcy5pbm5lcn08L2xhYmVsPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGUgPSBcInRleHRcIiB2YWx1ZSA9IFwiXCIgLz5cblx0XHQ8L2Rpdj5gKTtcblx0fVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBIb3RTdGFxV2ViOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4iXSwibmFtZXMiOlsiQWRtaW5CdXR0b24iLCJBZG1pbkRhc2hib2FyZCIsIkFkbWluRWRpdCIsIkFkbWluVGFibGUiLCJBZG1pblRhYmxlRmllbGQiLCJBZG1pblRhYmxlUm93IiwiQWRtaW5UZXh0IiwiYnVpbGRBc3NldHMiLCJpbXBvcnQiLCJuYW1lIiwiZmlsZXMiLCJodG1sIiwiY3NzIiwianMiLCJjb21wb25lbnRMaWJyYXJ5IiwiY29tcG9uZW50cyIsIkhvdENvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwiY29weSIsImFwaSIsInN1cGVyIiwidGhpcyIsInRhZyIsImJ1dHRvbkNsaWNrZWQiLCJvdXRwdXQiLCJodG1sRWxlbWVudHMiLCJpZCIsInRpdGxlIiwiYmFzZSIsIm9uUG9zdFBsYWNlIiwicGFyZW50SHRtbEVsZW1lbnQiLCJodG1sRWxlbWVudCIsIkhvdCIsIkRhdGEiLCJiYXNlVXJsIiwiYnV0dG9uX3RpdGxlIiwiYXR0YWNoZWRfbGlzdCIsInNjaGVtYSIsImZpZWxkRWxlbWVudHMiLCJtb2RhbElkIiwib25TYXZlIiwidmFsdWVzIiwia2V5IiwidmFsdWUiLCJqc29uUmVxdWVzdCIsImZpZWxkcyIsImF0dGFjaGVkTGlzdCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJob3RDb21wb25lbnQiLCJyZWZyZXNoTGlzdCIsIiQiLCJtb2RhbCIsIkVycm9yIiwicGFyZW50U2VsZWN0b3IiLCJmaWVsZCIsInBhcmVudE5vZGUiLCJhZGRIZWFkZXJEYXRhT25seSIsImlubmVyIiwicGxhY2VIZXJlUGFyZW50Iiwicm93RWxlbWVudHMiLCJwdXNoIiwiZWxlbWVudCIsInJvd0h0bWwiLCJpSWR4IiwibGVuZ3RoIiwiZmllbGRPYmoiLCJoZWFkZXJFbGVtZW50cyIsImhlYWRlckluZGljaWVzIiwiYWRkSGVhZGVyIiwidGFibGVGaWVsZEVsZW1lbnQiLCJoZWFkZXIiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImFwcGVuZENoaWxkIiwidGFibGVGaWVsZCIsImFkZFJvdyIsInRib2R5Iiwicm93U3RyIiwiSG90U3RhcSIsImFkZEh0bWwiLCJjbGVhclJvd3MiLCJpbm5lckhUTUwiLCJsaXN0Iiwic2V0VGltZW91dCIsIm9uUGFyZW50UGxhY2UiLCJwbGFjZUhlcmVBcnJheSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJwbGFjZUhlcmUiLCJyZW1vdmVDaGlsZCIsInF1ZXJ5U2VsZWN0b3IiLCJtb2R1bGUiLCJleHBvcnRzIiwiSG90U3RhcVdlYiIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19leHBvcnRzX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJ1bmRlZmluZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiY2FsbCJdLCJzb3VyY2VSb290IjoiIn0=
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
openapi: 3.0.0
|
|
2
|
-
info:
|
|
3
|
-
title: admin-panel
|
|
4
|
-
version: admin-panel
|
|
5
|
-
description: ""
|
|
6
|
-
servers:
|
|
7
|
-
- url: http://127.0.0.1:3243
|
|
8
|
-
paths:
|
|
9
|
-
/v1/data/add:
|
|
10
|
-
post:
|
|
11
|
-
summary: Add results to the database.
|
|
12
|
-
responses:
|
|
13
|
-
"200":
|
|
14
|
-
description: Returns true if successful.
|
|
15
|
-
content:
|
|
16
|
-
application/json:
|
|
17
|
-
schema:
|
|
18
|
-
type: string
|
|
19
|
-
description: Returns true if successful.
|
|
20
|
-
requestBody:
|
|
21
|
-
required: true
|
|
22
|
-
content:
|
|
23
|
-
application/json:
|
|
24
|
-
schema:
|
|
25
|
-
$ref: "#/components/schemas/data_add"
|
|
26
|
-
/v1/data/list:
|
|
27
|
-
post:
|
|
28
|
-
summary: List results from a schema.
|
|
29
|
-
responses:
|
|
30
|
-
"200":
|
|
31
|
-
description: Returns the results from the schema.
|
|
32
|
-
content:
|
|
33
|
-
application/json:
|
|
34
|
-
schema:
|
|
35
|
-
type: string
|
|
36
|
-
description: Returns the results from the schema.
|
|
37
|
-
requestBody:
|
|
38
|
-
required: true
|
|
39
|
-
content:
|
|
40
|
-
application/json:
|
|
41
|
-
schema:
|
|
42
|
-
$ref: "#/components/schemas/data_list"
|
|
43
|
-
components:
|
|
44
|
-
schemas:
|
|
45
|
-
data_add:
|
|
46
|
-
type: object
|
|
47
|
-
required:
|
|
48
|
-
- schema
|
|
49
|
-
- fields
|
|
50
|
-
properties:
|
|
51
|
-
schema:
|
|
52
|
-
type: string
|
|
53
|
-
description: The schema to add data to.
|
|
54
|
-
fields:
|
|
55
|
-
type: string
|
|
56
|
-
description: 'The fields and their values to add to the database. A key/value
|
|
57
|
-
object must be passed. Example: { "name": "Test_User" }'
|
|
58
|
-
data_list:
|
|
59
|
-
type: object
|
|
60
|
-
required:
|
|
61
|
-
- schema
|
|
62
|
-
- fields
|
|
63
|
-
properties:
|
|
64
|
-
schema:
|
|
65
|
-
type: string
|
|
66
|
-
description: The schema to access.
|
|
67
|
-
fields:
|
|
68
|
-
type: array
|
|
69
|
-
description: The list of fields in the schema to access.
|
|
70
|
-
offset:
|
|
71
|
-
type: int
|
|
72
|
-
description: The offset.
|
|
73
|
-
limit:
|
|
74
|
-
type: int
|
|
75
|
-
description: The max number of results to return. Default is 20.
|
package/public/index.hott
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<*
|
|
2
|
-
await Hot.include ("./admin-header.hott");
|
|
3
|
-
*>
|
|
4
|
-
|
|
5
|
-
<admin-dashboard id = "users" hot-title = "Users" hot-base = "http://localhost:3243">
|
|
6
|
-
<admin-edit name = "modal" hot-type = "add" hot-title = "Add" hot-button_title = "Save" hot-schema = "users" hot-attached_list = "userList">
|
|
7
|
-
<admin-text hot-field = "name">Name</admin-text>
|
|
8
|
-
<admin-text hot-field = "email">Email</admin-text>
|
|
9
|
-
</admin-edit>
|
|
10
|
-
<admin-table id = "userList" hot-schema = "users">
|
|
11
|
-
<admin-table-field hot-field = "name">Name</admin-table-field>
|
|
12
|
-
<admin-table-field hot-field = "email">Email</admin-table-field>
|
|
13
|
-
</admin-table>
|
|
14
|
-
</admin-dashboard>
|
|
15
|
-
|
|
16
|
-
<* await Hot.include ("./admin-footer.hott"); *>
|