node-leek 1.0.0
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/README.md +109 -0
- package/dist/app.d.ts +1 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +1 -0
- package/dist/autofighter.d.ts +2 -0
- package/dist/autofighter.d.ts.map +1 -0
- package/dist/autofighter.js +27 -0
- package/dist/boss_farming.d.ts +2 -0
- package/dist/boss_farming.d.ts.map +1 -0
- package/dist/boss_farming.js +33 -0
- package/dist/codegen/api/apis.d.ts +12 -0
- package/dist/codegen/api/apis.d.ts.map +1 -0
- package/dist/codegen/api/apis.js +33 -0
- package/dist/codegen/api/defaultApi.d.ts +239 -0
- package/dist/codegen/api/defaultApi.d.ts.map +1 -0
- package/dist/codegen/api/defaultApi.js +1071 -0
- package/dist/codegen/api.d.ts +3 -0
- package/dist/codegen/api.d.ts.map +1 -0
- package/dist/codegen/api.js +19 -0
- package/dist/codegen/model/aicode.d.ts +34 -0
- package/dist/codegen/model/aicode.d.ts.map +1 -0
- package/dist/codegen/model/aicode.js +47 -0
- package/dist/codegen/model/buy200Response.d.ts +27 -0
- package/dist/codegen/model/buy200Response.d.ts.map +1 -0
- package/dist/codegen/model/buy200Response.js +35 -0
- package/dist/codegen/model/buyRequest.d.ts +27 -0
- package/dist/codegen/model/buyRequest.d.ts.map +1 -0
- package/dist/codegen/model/buyRequest.js +35 -0
- package/dist/codegen/model/createFile200Response.d.ts +27 -0
- package/dist/codegen/model/createFile200Response.d.ts.map +1 -0
- package/dist/codegen/model/createFile200Response.js +29 -0
- package/dist/codegen/model/createFile200ResponseAi.d.ts +30 -0
- package/dist/codegen/model/createFile200ResponseAi.d.ts.map +1 -0
- package/dist/codegen/model/createFile200ResponseAi.js +53 -0
- package/dist/codegen/model/createFileRequest.d.ts +31 -0
- package/dist/codegen/model/createFileRequest.d.ts.map +1 -0
- package/dist/codegen/model/createFileRequest.js +44 -0
- package/dist/codegen/model/createFolder200Response.d.ts +26 -0
- package/dist/codegen/model/createFolder200Response.d.ts.map +1 -0
- package/dist/codegen/model/createFolder200Response.js +29 -0
- package/dist/codegen/model/createFolderRequest.d.ts +27 -0
- package/dist/codegen/model/createFolderRequest.d.ts.map +1 -0
- package/dist/codegen/model/createFolderRequest.js +35 -0
- package/dist/codegen/model/credentials.d.ts +31 -0
- package/dist/codegen/model/credentials.d.ts.map +1 -0
- package/dist/codegen/model/credentials.js +44 -0
- package/dist/codegen/model/deleteFileRequest.d.ts +26 -0
- package/dist/codegen/model/deleteFileRequest.d.ts.map +1 -0
- package/dist/codegen/model/deleteFileRequest.js +29 -0
- package/dist/codegen/model/deleteFolderRequest.d.ts +26 -0
- package/dist/codegen/model/deleteFolderRequest.d.ts.map +1 -0
- package/dist/codegen/model/deleteFolderRequest.js +29 -0
- package/dist/codegen/model/farmer.d.ts +110 -0
- package/dist/codegen/model/farmer.d.ts.map +1 -0
- package/dist/codegen/model/farmer.js +299 -0
- package/dist/codegen/model/farmerOpponent.d.ts +35 -0
- package/dist/codegen/model/farmerOpponent.d.ts.map +1 -0
- package/dist/codegen/model/farmerOpponent.js +68 -0
- package/dist/codegen/model/fightResult.d.ts +38 -0
- package/dist/codegen/model/fightResult.d.ts.map +1 -0
- package/dist/codegen/model/fightResult.js +80 -0
- package/dist/codegen/model/fightResume.d.ts +95 -0
- package/dist/codegen/model/fightResume.d.ts.map +1 -0
- package/dist/codegen/model/fightResume.js +182 -0
- package/dist/codegen/model/fightResumeLeeks1Inner.d.ts +27 -0
- package/dist/codegen/model/fightResumeLeeks1Inner.d.ts.map +1 -0
- package/dist/codegen/model/fightResumeLeeks1Inner.js +35 -0
- package/dist/codegen/model/folder.d.ts +31 -0
- package/dist/codegen/model/folder.d.ts.map +1 -0
- package/dist/codegen/model/folder.js +44 -0
- package/dist/codegen/model/garden.d.ts +30 -0
- package/dist/codegen/model/garden.d.ts.map +1 -0
- package/dist/codegen/model/garden.js +32 -0
- package/dist/codegen/model/gardenGarden.d.ts +52 -0
- package/dist/codegen/model/gardenGarden.d.ts.map +1 -0
- package/dist/codegen/model/gardenGarden.js +113 -0
- package/dist/codegen/model/gardenGardenMyCompositionsInner.d.ts +38 -0
- package/dist/codegen/model/gardenGardenMyCompositionsInner.d.ts.map +1 -0
- package/dist/codegen/model/gardenGardenMyCompositionsInner.js +86 -0
- package/dist/codegen/model/gardenGardenMyTeam.d.ts +32 -0
- package/dist/codegen/model/gardenGardenMyTeam.d.ts.map +1 -0
- package/dist/codegen/model/gardenGardenMyTeam.js +50 -0
- package/dist/codegen/model/getFarmerOpponents200Response.d.ts +27 -0
- package/dist/codegen/model/getFarmerOpponents200Response.d.ts.map +1 -0
- package/dist/codegen/model/getFarmerOpponents200Response.js +29 -0
- package/dist/codegen/model/getFilesContentRequest.d.ts +29 -0
- package/dist/codegen/model/getFilesContentRequest.d.ts.map +1 -0
- package/dist/codegen/model/getFilesContentRequest.js +32 -0
- package/dist/codegen/model/getSoloOpponents200Response.d.ts +27 -0
- package/dist/codegen/model/getSoloOpponents200Response.d.ts.map +1 -0
- package/dist/codegen/model/getSoloOpponents200Response.js +29 -0
- package/dist/codegen/model/ia.d.ts +37 -0
- package/dist/codegen/model/ia.d.ts.map +1 -0
- package/dist/codegen/model/ia.js +80 -0
- package/dist/codegen/model/item.d.ts +35 -0
- package/dist/codegen/model/item.d.ts.map +1 -0
- package/dist/codegen/model/item.js +68 -0
- package/dist/codegen/model/leek.d.ts +172 -0
- package/dist/codegen/model/leek.d.ts.map +1 -0
- package/dist/codegen/model/leek.js +350 -0
- package/dist/codegen/model/logindump.d.ts +34 -0
- package/dist/codegen/model/logindump.d.ts.map +1 -0
- package/dist/codegen/model/logindump.js +41 -0
- package/dist/codegen/model/models.d.ts +87 -0
- package/dist/codegen/model/models.d.ts.map +1 -0
- package/dist/codegen/model/models.js +331 -0
- package/dist/codegen/model/opponent.d.ts +32 -0
- package/dist/codegen/model/opponent.d.ts.map +1 -0
- package/dist/codegen/model/opponent.js +50 -0
- package/dist/codegen/model/publicLeek.d.ts +225 -0
- package/dist/codegen/model/publicLeek.d.ts.map +1 -0
- package/dist/codegen/model/publicLeek.js +494 -0
- package/dist/codegen/model/publicLeekAi.d.ts +30 -0
- package/dist/codegen/model/publicLeekAi.d.ts.map +1 -0
- package/dist/codegen/model/publicLeekAi.js +53 -0
- package/dist/codegen/model/publicLeekChipsInner.d.ts +27 -0
- package/dist/codegen/model/publicLeekChipsInner.d.ts.map +1 -0
- package/dist/codegen/model/publicLeekChipsInner.js +35 -0
- package/dist/codegen/model/saveFile200Response.d.ts +29 -0
- package/dist/codegen/model/saveFile200Response.d.ts.map +1 -0
- package/dist/codegen/model/saveFile200Response.js +32 -0
- package/dist/codegen/model/saveFileRequest.d.ts +27 -0
- package/dist/codegen/model/saveFileRequest.d.ts.map +1 -0
- package/dist/codegen/model/saveFileRequest.js +35 -0
- package/dist/codegen/model/startFarmerFightRequest.d.ts +26 -0
- package/dist/codegen/model/startFarmerFightRequest.d.ts.map +1 -0
- package/dist/codegen/model/startFarmerFightRequest.js +29 -0
- package/dist/codegen/model/startSoloFight200Response.d.ts +26 -0
- package/dist/codegen/model/startSoloFight200Response.d.ts.map +1 -0
- package/dist/codegen/model/startSoloFight200Response.js +29 -0
- package/dist/codegen/model/startSoloFightRequest.d.ts +27 -0
- package/dist/codegen/model/startSoloFightRequest.d.ts.map +1 -0
- package/dist/codegen/model/startSoloFightRequest.js +35 -0
- package/dist/codegen/model/team.d.ts +34 -0
- package/dist/codegen/model/team.d.ts.map +1 -0
- package/dist/codegen/model/team.js +62 -0
- package/dist/codegen/model/tournamentResume.d.ts +36 -0
- package/dist/codegen/model/tournamentResume.d.ts.map +1 -0
- package/dist/codegen/model/tournamentResume.js +47 -0
- package/dist/credentials/credentials-manager.d.ts +19 -0
- package/dist/credentials/credentials-manager.d.ts.map +1 -0
- package/dist/credentials/credentials-manager.js +80 -0
- package/dist/leek-sync/filelist/cached-filelist.d.ts +13 -0
- package/dist/leek-sync/filelist/cached-filelist.d.ts.map +1 -0
- package/dist/leek-sync/filelist/cached-filelist.js +49 -0
- package/dist/leek-sync/filelist/filelist.d.ts +24 -0
- package/dist/leek-sync/filelist/filelist.d.ts.map +1 -0
- package/dist/leek-sync/filelist/filelist.js +77 -0
- package/dist/leek-sync/filelist/leekfile.d.ts +18 -0
- package/dist/leek-sync/filelist/leekfile.d.ts.map +1 -0
- package/dist/leek-sync/filelist/leekfile.js +54 -0
- package/dist/leek-sync/leek-sync-client.d.ts +13 -0
- package/dist/leek-sync/leek-sync-client.d.ts.map +1 -0
- package/dist/leek-sync/leek-sync-client.js +95 -0
- package/dist/leek-sync/leekfile-source/leekfile-source.d.ts +15 -0
- package/dist/leek-sync/leekfile-source/leekfile-source.d.ts.map +1 -0
- package/dist/leek-sync/leekfile-source/leekfile-source.js +37 -0
- package/dist/leek-sync/leekfile-source/leekwars-source.d.ts +22 -0
- package/dist/leek-sync/leekfile-source/leekwars-source.d.ts.map +1 -0
- package/dist/leek-sync/leekfile-source/leekwars-source.js +114 -0
- package/dist/leek-sync/leekfile-source/localfile-source.d.ts +22 -0
- package/dist/leek-sync/leekfile-source/localfile-source.d.ts.map +1 -0
- package/dist/leek-sync/leekfile-source/localfile-source.js +184 -0
- package/dist/leeksync.d.ts +2 -0
- package/dist/leeksync.d.ts.map +1 -0
- package/dist/leeksync.js +15 -0
- package/dist/login.d.ts +2 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +12 -0
- package/dist/node-leek-client/leek-wars-client.d.ts +46 -0
- package/dist/node-leek-client/leek-wars-client.d.ts.map +1 -0
- package/dist/node-leek-client/leek-wars-client.js +541 -0
- package/dist/node-leek-client/leekwars-frontend/Item.d.ts +80 -0
- package/dist/node-leek-client/leekwars-frontend/Item.d.ts.map +1 -0
- package/dist/node-leek-client/leekwars-frontend/Item.js +88 -0
- package/dist/node-leek-client/leekwars-frontend/Items.d.ts +5 -0
- package/dist/node-leek-client/leekwars-frontend/Items.d.ts.map +1 -0
- package/dist/node-leek-client/leekwars-frontend/Items.js +7077 -0
- package/dist/node-leek-client/leekwars-frontend/Notification.d.ts +41 -0
- package/dist/node-leek-client/leekwars-frontend/Notification.d.ts.map +1 -0
- package/dist/node-leek-client/leekwars-frontend/Notification.js +44 -0
- package/dist/node-leek-client/leekwars-frontend/SocketMessage.d.ts +76 -0
- package/dist/node-leek-client/leekwars-frontend/SocketMessage.d.ts.map +1 -0
- package/dist/node-leek-client/leekwars-frontend/SocketMessage.js +88 -0
- package/dist/node-leek-client/node-leek-client.d.ts +37 -0
- package/dist/node-leek-client/node-leek-client.d.ts.map +1 -0
- package/dist/node-leek-client/node-leek-client.js +203 -0
- package/package.json +25 -0
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LeekWarsClient = void 0;
|
|
4
|
+
const defaultApi_js_1 = require("../codegen/api/defaultApi.js");
|
|
5
|
+
const aicode_js_1 = require("../codegen/model/aicode.js");
|
|
6
|
+
const fightResult_js_1 = require("../codegen/model/fightResult.js");
|
|
7
|
+
const createFile200ResponseAi_js_1 = require("../codegen/model/createFile200ResponseAi.js");
|
|
8
|
+
const SocketMessage_js_1 = require("./leekwars-frontend/SocketMessage.js");
|
|
9
|
+
const Notification_js_1 = require("./leekwars-frontend/Notification.js");
|
|
10
|
+
const Items_js_1 = require("./leekwars-frontend/Items.js");
|
|
11
|
+
function getSetterOf(header, attribute) {
|
|
12
|
+
return header.find(cookie => cookie.trim().startsWith(`${attribute}=`) && !cookie.startsWith(`${attribute}=deleted;`)) ?? `${attribute}=;`;
|
|
13
|
+
}
|
|
14
|
+
function getCookieToken(header) {
|
|
15
|
+
const cookie = getSetterOf(header ?? [], "token");
|
|
16
|
+
if (!cookie.includes("token="))
|
|
17
|
+
return "";
|
|
18
|
+
const value = cookie.split(";")[0].split("token=")[1];
|
|
19
|
+
return value !== undefined ? value : "";
|
|
20
|
+
}
|
|
21
|
+
function getPhpsessidToken(header) {
|
|
22
|
+
const cookie = getSetterOf(header ?? [], "PHPSESSID");
|
|
23
|
+
if (!cookie.includes("PHPSESSID="))
|
|
24
|
+
return "";
|
|
25
|
+
const value = cookie.split(";")[0].split("PHPSESSID=")[1];
|
|
26
|
+
return value !== undefined ? value : "";
|
|
27
|
+
}
|
|
28
|
+
class LeekWarsClient {
|
|
29
|
+
apiClient;
|
|
30
|
+
ready = false;
|
|
31
|
+
username;
|
|
32
|
+
password;
|
|
33
|
+
readonly;
|
|
34
|
+
socket;
|
|
35
|
+
token = "";
|
|
36
|
+
phpsessid = "";
|
|
37
|
+
currentRoom = "";
|
|
38
|
+
constructor(username, password, readonly = false) {
|
|
39
|
+
this.readonly = readonly;
|
|
40
|
+
this.username = username;
|
|
41
|
+
this.password = password;
|
|
42
|
+
this.socket = null;
|
|
43
|
+
this.apiClient = new defaultApi_js_1.DefaultApi();
|
|
44
|
+
}
|
|
45
|
+
async loginOnLeekwars() {
|
|
46
|
+
return this.apiClient.login({
|
|
47
|
+
login: this.username,
|
|
48
|
+
password: this.password,
|
|
49
|
+
keepConnected: true
|
|
50
|
+
}).then(async (r) => {
|
|
51
|
+
this.token = getCookieToken(r.response.headers["set-cookie"]);
|
|
52
|
+
this.phpsessid = getPhpsessidToken(r.response.headers["set-cookie"]);
|
|
53
|
+
this.apiClient.setApiKey(defaultApi_js_1.DefaultApiApiKeys.cookieAuth, this.token);
|
|
54
|
+
this.apiClient.setApiKey(defaultApi_js_1.DefaultApiApiKeys.phpsessid, this.phpsessid);
|
|
55
|
+
this.ready = true;
|
|
56
|
+
await this.connectWebSocket();
|
|
57
|
+
// Add on purpose delay to avoid TOO_MANY_REQUEST
|
|
58
|
+
await this.sleep(100);
|
|
59
|
+
return r.body.farmer;
|
|
60
|
+
})
|
|
61
|
+
.catch(err => {
|
|
62
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
63
|
+
return this.sleep(15000).then(() => this.loginOnLeekwars());
|
|
64
|
+
}
|
|
65
|
+
console.error("Can't connect " + this.username + " -> [" + err.statusCode + "] " + err.body.error);
|
|
66
|
+
throw err;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async close() {
|
|
70
|
+
this.socket?.close();
|
|
71
|
+
}
|
|
72
|
+
async sleep(delay) {
|
|
73
|
+
return new Promise(resolve => setTimeout(resolve, delay));
|
|
74
|
+
}
|
|
75
|
+
async getLeek(leek_id) {
|
|
76
|
+
if (!this.ready)
|
|
77
|
+
return null;
|
|
78
|
+
return this.apiClient.getLeek(leek_id)
|
|
79
|
+
.then(result => {
|
|
80
|
+
return result.body;
|
|
81
|
+
})
|
|
82
|
+
.catch(err => {
|
|
83
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
84
|
+
return this.sleep(15000).then(() => this.getLeek(leek_id));
|
|
85
|
+
}
|
|
86
|
+
console.error("Can't get Leek " + leek_id + " -> [" + err.statusCode + "] " + err.body.error);
|
|
87
|
+
return null;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async buy(item_id, quantity = 1) {
|
|
91
|
+
if (!this.ready)
|
|
92
|
+
return null;
|
|
93
|
+
if (this.readonly) {
|
|
94
|
+
console.error("Readonly mode, can't buy items");
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
return this.apiClient.buy({
|
|
98
|
+
itemId: item_id,
|
|
99
|
+
quantity: quantity
|
|
100
|
+
})
|
|
101
|
+
.then(async (result) => {
|
|
102
|
+
// Add on purpose delay to avoid TOO_MANY_REQUEST
|
|
103
|
+
await this.sleep(100);
|
|
104
|
+
return result.body;
|
|
105
|
+
})
|
|
106
|
+
.catch(err => {
|
|
107
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
108
|
+
return this.sleep(15000)
|
|
109
|
+
.then(() => this.buy(item_id, quantity));
|
|
110
|
+
}
|
|
111
|
+
console.error("Can't buy " + item_id + " " + quantity + " times -> [" + err.statusCode + "] " + err.body.error);
|
|
112
|
+
return null;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async fetchFiles(requests) {
|
|
116
|
+
if (!this.ready)
|
|
117
|
+
return [new aicode_js_1.Aicode()];
|
|
118
|
+
return this.apiClient.getFilesContent({
|
|
119
|
+
ais: JSON.stringify(requests)
|
|
120
|
+
})
|
|
121
|
+
.then(result => result.body)
|
|
122
|
+
.catch(err => {
|
|
123
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
124
|
+
return this.sleep(15000)
|
|
125
|
+
.then(() => this.fetchFiles(requests));
|
|
126
|
+
}
|
|
127
|
+
console.error("fetchFiles(" + requests + ") -> [" + err.statusCode + "] " + err.body.error);
|
|
128
|
+
return [];
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async fetchFile(ai, timestamp) {
|
|
132
|
+
if (!this.ready)
|
|
133
|
+
return new aicode_js_1.Aicode();
|
|
134
|
+
const request = {};
|
|
135
|
+
request[ai] = timestamp;
|
|
136
|
+
return this.fetchFiles(request)
|
|
137
|
+
.then(result => result[0])
|
|
138
|
+
.catch(err => {
|
|
139
|
+
console.error("fetchFile -> [" + err.statusCode + "] " + err.body.error);
|
|
140
|
+
return new aicode_js_1.Aicode();
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
async saveFile(ai_id, code) {
|
|
144
|
+
if (!this.ready)
|
|
145
|
+
return 0;
|
|
146
|
+
if (this.readonly) {
|
|
147
|
+
console.error("Readonly mode, can't save file");
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
return this.apiClient.saveFile({
|
|
151
|
+
aiId: ai_id,
|
|
152
|
+
code: code
|
|
153
|
+
})
|
|
154
|
+
.then(result => result.body.modified)
|
|
155
|
+
.catch(err => {
|
|
156
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
157
|
+
return this.sleep(15000)
|
|
158
|
+
.then(() => this.saveFile(ai_id, code));
|
|
159
|
+
}
|
|
160
|
+
console.error("saveFile " + ai_id + " (" + code.substring(0, 20) + ") -> [" + err.statusCode + "] " + err.body.error);
|
|
161
|
+
return 0;
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async createFile(folder_id, name, version = 4) {
|
|
165
|
+
if (!this.ready)
|
|
166
|
+
return new createFile200ResponseAi_js_1.CreateFile200ResponseAi();
|
|
167
|
+
if (this.readonly) {
|
|
168
|
+
console.error("Readonly mode, can't create file");
|
|
169
|
+
return new createFile200ResponseAi_js_1.CreateFile200ResponseAi();
|
|
170
|
+
}
|
|
171
|
+
return this.apiClient.createFile({
|
|
172
|
+
folderId: folder_id,
|
|
173
|
+
name: name,
|
|
174
|
+
version: version
|
|
175
|
+
})
|
|
176
|
+
.then(result => result.body.ai)
|
|
177
|
+
.catch(err => {
|
|
178
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
179
|
+
return this.sleep(15000)
|
|
180
|
+
.then(() => this.createFile(folder_id, name, version));
|
|
181
|
+
}
|
|
182
|
+
console.error("createFile " + name + " (parent is " + folder_id + ") -> [" + err.statusCode + "] " + err.body.error);
|
|
183
|
+
return new createFile200ResponseAi_js_1.CreateFile200ResponseAi();
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async createFolder(folder_id, name) {
|
|
187
|
+
if (!this.ready)
|
|
188
|
+
return -1;
|
|
189
|
+
if (this.readonly) {
|
|
190
|
+
console.error("Readonly mode, can't create folder");
|
|
191
|
+
return -1;
|
|
192
|
+
}
|
|
193
|
+
return this.apiClient.createFolder({
|
|
194
|
+
folderId: folder_id,
|
|
195
|
+
name: name
|
|
196
|
+
})
|
|
197
|
+
.then(result => result.body.id)
|
|
198
|
+
.catch(err => {
|
|
199
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
200
|
+
return this.sleep(15000)
|
|
201
|
+
.then(() => this.createFolder(folder_id, name));
|
|
202
|
+
}
|
|
203
|
+
console.error("createFolder " + name + " (parent is " + folder_id + ") -> [" + err.statusCode + "] " + err.body.error);
|
|
204
|
+
return -1;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
async deleteFile(ai_id) {
|
|
208
|
+
if (!this.ready)
|
|
209
|
+
return;
|
|
210
|
+
if (this.readonly) {
|
|
211
|
+
console.error("Readonly mode, can't delete file");
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
return this.apiClient.deleteFile({
|
|
215
|
+
aiId: ai_id,
|
|
216
|
+
})
|
|
217
|
+
.then(result => { })
|
|
218
|
+
.catch(err => {
|
|
219
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
220
|
+
return this.sleep(15000)
|
|
221
|
+
.then(() => this.deleteFile(ai_id));
|
|
222
|
+
}
|
|
223
|
+
console.error("deleteFile " + ai_id + " -> [" + err.statusCode + "] " + err.body.error);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
async deleteFolder(folder_id) {
|
|
227
|
+
if (!this.ready)
|
|
228
|
+
return;
|
|
229
|
+
if (this.readonly) {
|
|
230
|
+
console.error("Readonly mode, can't delete folder");
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
return this.apiClient.deleteFolder({
|
|
234
|
+
folderId: folder_id,
|
|
235
|
+
})
|
|
236
|
+
.then(result => result.body)
|
|
237
|
+
.catch(err => {
|
|
238
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
239
|
+
return this.sleep(15000)
|
|
240
|
+
.then(() => this.deleteFolder(folder_id));
|
|
241
|
+
}
|
|
242
|
+
console.error("deleteFolder " + folder_id + " -> [" + err.statusCode + "] " + err.body.error);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
async getSoloOpponents(leek_id) {
|
|
246
|
+
return this.apiClient.getSoloOpponents(leek_id)
|
|
247
|
+
.then(result => result.body.opponents)
|
|
248
|
+
.catch(err => {
|
|
249
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
250
|
+
return this.sleep(15000)
|
|
251
|
+
.then(() => this.getSoloOpponents(leek_id));
|
|
252
|
+
}
|
|
253
|
+
console.error("getSoloOpponents " + leek_id + " -> [" + err.statusCode + "] " + err.body.error);
|
|
254
|
+
return [];
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
async startSoloFight(leek_id, target_id) {
|
|
258
|
+
if (!this.ready)
|
|
259
|
+
return -1;
|
|
260
|
+
if (this.readonly) {
|
|
261
|
+
console.error("Readonly mode, can't start fight");
|
|
262
|
+
return -1;
|
|
263
|
+
}
|
|
264
|
+
return this.apiClient.startSoloFight({
|
|
265
|
+
leekId: leek_id,
|
|
266
|
+
targetId: target_id
|
|
267
|
+
})
|
|
268
|
+
.then(async (result) => {
|
|
269
|
+
// Add on purpose delay to avoid TOO_MANY_REQUEST
|
|
270
|
+
await this.sleep(100);
|
|
271
|
+
return result.body.fight;
|
|
272
|
+
})
|
|
273
|
+
.catch(err => {
|
|
274
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
275
|
+
return this.sleep(15000)
|
|
276
|
+
.then(() => this.startSoloFight(leek_id, target_id));
|
|
277
|
+
}
|
|
278
|
+
console.error("startSoloFight " + leek_id + " vs " + target_id + " -> [" + err.statusCode + "] " + err.body);
|
|
279
|
+
return -1;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
async getFarmerOpponents() {
|
|
283
|
+
if (!this.ready)
|
|
284
|
+
return [];
|
|
285
|
+
return this.apiClient.getFarmerOpponents()
|
|
286
|
+
.then(result => result.body.opponents)
|
|
287
|
+
.catch(err => {
|
|
288
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
289
|
+
return this.sleep(15000)
|
|
290
|
+
.then(() => this.getFarmerOpponents());
|
|
291
|
+
}
|
|
292
|
+
console.error("getFarmerOpponents -> [" + err.statusCode + "] " + err.body.error);
|
|
293
|
+
return [];
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
async startFarmerFight(target_id) {
|
|
297
|
+
if (!this.ready)
|
|
298
|
+
return -1;
|
|
299
|
+
if (this.readonly) {
|
|
300
|
+
console.error("Readonly mode, can't start fight");
|
|
301
|
+
return -1;
|
|
302
|
+
}
|
|
303
|
+
return this.apiClient.startFarmerFight({
|
|
304
|
+
targetId: target_id
|
|
305
|
+
})
|
|
306
|
+
.then(result => result.body.fight)
|
|
307
|
+
.catch(err => {
|
|
308
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
309
|
+
return this.sleep(15000)
|
|
310
|
+
.then(() => this.startFarmerFight(target_id));
|
|
311
|
+
}
|
|
312
|
+
console.error("startFarmerFight vs " + target_id + " -> [" + err.statusCode + "] " + err.body);
|
|
313
|
+
return -1;
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
async getFight(fight_id) {
|
|
317
|
+
if (!this.ready)
|
|
318
|
+
return new fightResult_js_1.FightResult();
|
|
319
|
+
return this.apiClient.getFight(fight_id)
|
|
320
|
+
.then(async (result) => {
|
|
321
|
+
await this.sleep(75);
|
|
322
|
+
return result.body;
|
|
323
|
+
})
|
|
324
|
+
.catch(err => {
|
|
325
|
+
if (err.statusCode == 429) { // TOO MANY REQUEST
|
|
326
|
+
return this.sleep(15000)
|
|
327
|
+
.then(() => this.getFight(fight_id));
|
|
328
|
+
}
|
|
329
|
+
console.error("getFight " + fight_id + " -> [" + err.statusCode + "] " + err.body.error);
|
|
330
|
+
return new fightResult_js_1.FightResult();
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
async createBossRoom(bossId = 1, locked = false, leeks = []) {
|
|
334
|
+
const r = `[${SocketMessage_js_1.SocketMessage.GARDEN_BOSS_CREATE_SQUAD}, ${bossId}, ${locked}, [${leeks}]]`;
|
|
335
|
+
this.socket?.send(r);
|
|
336
|
+
console.log("Create room : ", r);
|
|
337
|
+
}
|
|
338
|
+
async joinBossRoom(roomId, leeks = []) {
|
|
339
|
+
const r = `[${SocketMessage_js_1.SocketMessage.GARDEN_BOSS_JOIN_SQUAD}, "${roomId}", [${leeks}]]`;
|
|
340
|
+
this.socket?.send(r);
|
|
341
|
+
console.log("Join room : ", r);
|
|
342
|
+
}
|
|
343
|
+
async startRoomFight() {
|
|
344
|
+
const r = `[${SocketMessage_js_1.SocketMessage.GARDEN_BOSS_ATTACK}]`;
|
|
345
|
+
this.socket?.send(r);
|
|
346
|
+
console.log("Start room : ", r);
|
|
347
|
+
}
|
|
348
|
+
async recieveNotification(message) {
|
|
349
|
+
switch (message.type) {
|
|
350
|
+
case Notification_js_1.NotificationType.TROPHY_UNLOCKED:
|
|
351
|
+
console.log(`[WS ${this.username}] Trophy unlocked :`, message);
|
|
352
|
+
break;
|
|
353
|
+
case Notification_js_1.NotificationType.UP_LEVEL:
|
|
354
|
+
console.log(`[WS ${this.username}] Leek ${message.parameters[0]} reached level ${message.parameters[1]} (${message.parameters[2]} capitals to spend)`, message);
|
|
355
|
+
this.on_level_up(message.parameters[0], message.parameters[1], message.parameters[2]);
|
|
356
|
+
break;
|
|
357
|
+
case Notification_js_1.NotificationType.BOSS_STARTED:
|
|
358
|
+
// console.log(`[WS ${this.username}] Boss fight started`);
|
|
359
|
+
break;
|
|
360
|
+
default:
|
|
361
|
+
console.log(`[WS ${this.username}] Notification :`, message);
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
async connectWebSocket() {
|
|
366
|
+
if (!this.ready)
|
|
367
|
+
return;
|
|
368
|
+
this.socket = new WebSocket('wss://leekwars.com/ws', [
|
|
369
|
+
'leek-wars',
|
|
370
|
+
this.token
|
|
371
|
+
]),
|
|
372
|
+
this.socket.onopen = () => {
|
|
373
|
+
console.log("Websocket connected !");
|
|
374
|
+
// o.M.commit('invalidate-chats'),
|
|
375
|
+
// o.M.commit('wsconnected'),
|
|
376
|
+
// this.retry_count = 10,
|
|
377
|
+
// this.retry_delay = 1000;
|
|
378
|
+
// for (const e of this.queue) this.send(e);
|
|
379
|
+
// this.queue = [],
|
|
380
|
+
// r.H.battleRoyale.init(),
|
|
381
|
+
// r.H.bossSquads.init()
|
|
382
|
+
},
|
|
383
|
+
this.socket.onclose = () => {
|
|
384
|
+
console.log("Websocket closed ! ");
|
|
385
|
+
// if (
|
|
386
|
+
// o.M.getters.admin ||
|
|
387
|
+
// r.H.LOCAL ||
|
|
388
|
+
// r.H.DEV ||
|
|
389
|
+
// window.__FARMER__ &&
|
|
390
|
+
// 1 === window.__FARMER__.farmer.id
|
|
391
|
+
// ) {
|
|
392
|
+
// const e = '[WS] fermée';
|
|
393
|
+
// console.error(e)
|
|
394
|
+
// }
|
|
395
|
+
// o.M.commit('wsclose'),
|
|
396
|
+
// this.retry()
|
|
397
|
+
},
|
|
398
|
+
this.socket.onerror = e => {
|
|
399
|
+
console.error(`[WS ${this.username}] erreur`, e);
|
|
400
|
+
},
|
|
401
|
+
this.socket.onmessage = msg => {
|
|
402
|
+
const json = JSON.parse(msg.data);
|
|
403
|
+
const id = json[0];
|
|
404
|
+
const data = json[1];
|
|
405
|
+
const request_id = json[2];
|
|
406
|
+
switch (id) {
|
|
407
|
+
case SocketMessage_js_1.SocketMessage.PONG: {
|
|
408
|
+
console.log(`"[WS ${this.username}] received PONG`, data);
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
case SocketMessage_js_1.SocketMessage.NOTIFICATION_RECEIVE: {
|
|
412
|
+
this.recieveNotification({ id: data[0], type: data[1], parameters: data[2], new: true });
|
|
413
|
+
break;
|
|
414
|
+
}
|
|
415
|
+
case SocketMessage_js_1.SocketMessage.LUCKY: {
|
|
416
|
+
// NOTHING TO DO
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
419
|
+
case SocketMessage_js_1.SocketMessage.FAKE_LUCKY: {
|
|
420
|
+
// CLICK ON LUCKY
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
case SocketMessage_js_1.SocketMessage.BATTLE_ROYALE_CHAT_NOTIF: {
|
|
424
|
+
console.log(`[WS ${this.username}] received BATTLE_ROYALE_CHAT_NOTIF`, data);
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
427
|
+
case SocketMessage_js_1.SocketMessage.BATTLE_ROYALE_UPDATE: {
|
|
428
|
+
console.log(`[WS ${this.username}] received BATTLE_ROYALE_UPDATE`, data);
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
case SocketMessage_js_1.SocketMessage.BATTLE_ROYALE_START: {
|
|
432
|
+
console.log(`[WS ${this.username}] received BATTLE_ROYALE_START`, data);
|
|
433
|
+
break;
|
|
434
|
+
}
|
|
435
|
+
case SocketMessage_js_1.SocketMessage.BATTLE_ROYALE_LEAVE: {
|
|
436
|
+
console.log(`[WS ${this.username}] received BATTLE_ROYALE_LEAVE`, data);
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
439
|
+
case SocketMessage_js_1.SocketMessage.GARDEN_QUEUE: {
|
|
440
|
+
console.log(`[WS ${this.username}] received GARDEN_QUEUE`, data);
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
case SocketMessage_js_1.SocketMessage.FIGHT_PROGRESS: {
|
|
444
|
+
console.log(`[WS ${this.username}] received FIGHT_PROGRESS`, data);
|
|
445
|
+
break;
|
|
446
|
+
}
|
|
447
|
+
case SocketMessage_js_1.SocketMessage.TOURNAMENT_UPDATE: {
|
|
448
|
+
console.log(`[WS ${this.username}] received TOURNAMENT_UPDATE`, data);
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
case SocketMessage_js_1.SocketMessage.UPDATE_HABS: {
|
|
452
|
+
console.log(`[WS ${this.username}] +` + data[0] + " 🪙");
|
|
453
|
+
break;
|
|
454
|
+
}
|
|
455
|
+
case SocketMessage_js_1.SocketMessage.UPDATE_LEEK_XP: {
|
|
456
|
+
console.log(`[WS ${this.username}] +` + data[1] + " xp");
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
case SocketMessage_js_1.SocketMessage.UPDATE_LEEK_TALENT: {
|
|
460
|
+
console.log(`[WS ${this.username}] ` + (data[1] > 0 ? "+" : "") + data[1] + " talents");
|
|
461
|
+
break;
|
|
462
|
+
}
|
|
463
|
+
case SocketMessage_js_1.SocketMessage.UPDATE_FARMER_TALENT: {
|
|
464
|
+
console.log(`[WS ${this.username}] ` + (data[1] > 0 ? "+" : "") + data[1] + " farmer talents");
|
|
465
|
+
break;
|
|
466
|
+
}
|
|
467
|
+
case SocketMessage_js_1.SocketMessage.UPDATE_TEAM_TALENT: {
|
|
468
|
+
console.log(`[WS ${this.username}] ` + (data[1] > 0 ? "+" : "") + data[1] + " team talents");
|
|
469
|
+
break;
|
|
470
|
+
}
|
|
471
|
+
case SocketMessage_js_1.SocketMessage.ADD_RESOURCE: {
|
|
472
|
+
// console.log(`[WS ${this.username}] received ADD_RESOURCE`, data);
|
|
473
|
+
console.log(`[WS ${this.username}] ` + (data[2] > 1 ? data[2] : "") + " " + Items_js_1.ITEMS[data[0]]?.name);
|
|
474
|
+
// console.log("add resource", data)
|
|
475
|
+
// const template = data[0]
|
|
476
|
+
// const id = data[1]
|
|
477
|
+
// const quantity = data[2]
|
|
478
|
+
// const item = "" // TODO LeekWars.items[data[0]]
|
|
479
|
+
// const time = data[3]
|
|
480
|
+
// if (item) {
|
|
481
|
+
// //store.commit('add-inventory', { type: item.type, template, id, quantity, time })
|
|
482
|
+
// }
|
|
483
|
+
break;
|
|
484
|
+
}
|
|
485
|
+
case SocketMessage_js_1.SocketMessage.GARDEN_BOSS_SQUADS: {
|
|
486
|
+
// console.log(`[WS ${this.username}] received GARDEN_BOSS_SQUADS`, data);
|
|
487
|
+
break;
|
|
488
|
+
}
|
|
489
|
+
case SocketMessage_js_1.SocketMessage.GARDEN_BOSS_SQUAD_JOINED: {
|
|
490
|
+
console.log(`[WS ${this.username}] received GARDEN_BOSS_SQUAD_JOINED`);
|
|
491
|
+
this.currentRoom = data.id;
|
|
492
|
+
break;
|
|
493
|
+
}
|
|
494
|
+
case SocketMessage_js_1.SocketMessage.GARDEN_BOSS_SQUAD: {
|
|
495
|
+
// console.log(`[WS ${this.username}] received GARDEN_BOSS_SQUAD`, data);
|
|
496
|
+
break;
|
|
497
|
+
}
|
|
498
|
+
case SocketMessage_js_1.SocketMessage.GARDEN_BOSS_NO_SUCH_SQUAD: {
|
|
499
|
+
console.log(`[WS ${this.username}] received GARDEN_BOSS_NO_SUCH_SQUAD`, data);
|
|
500
|
+
break;
|
|
501
|
+
}
|
|
502
|
+
case SocketMessage_js_1.SocketMessage.GARDEN_BOSS_STARTED: {
|
|
503
|
+
console.log(`[WS ${this.username}] received GARDEN_BOSS_STARTED`);
|
|
504
|
+
this.currentRoom = "";
|
|
505
|
+
break;
|
|
506
|
+
}
|
|
507
|
+
case SocketMessage_js_1.SocketMessage.GARDEN_BOSS_LEFT: {
|
|
508
|
+
console.log(`[WS ${this.username}] received GARDEN_BOSS_LEFT`, data);
|
|
509
|
+
break;
|
|
510
|
+
}
|
|
511
|
+
case SocketMessage_js_1.SocketMessage.CONSOLE_RESULT: {
|
|
512
|
+
console.log(`[WS ${this.username}] received CONSOLE_RESULT`, data);
|
|
513
|
+
break;
|
|
514
|
+
}
|
|
515
|
+
case SocketMessage_js_1.SocketMessage.CONSOLE_ERROR: {
|
|
516
|
+
console.log(`[WS ${this.username}] received CONSOLE_ERROR`, data);
|
|
517
|
+
break;
|
|
518
|
+
}
|
|
519
|
+
case SocketMessage_js_1.SocketMessage.CONSOLE_LOG: {
|
|
520
|
+
console.log(`[WS ${this.username}] received CONSOLE_LOG`, data);
|
|
521
|
+
break;
|
|
522
|
+
}
|
|
523
|
+
case SocketMessage_js_1.SocketMessage.EDITOR_ANALYZE: {
|
|
524
|
+
console.log(`[WS ${this.username}] received EDITOR_ANALYZE`, data);
|
|
525
|
+
break;
|
|
526
|
+
}
|
|
527
|
+
case SocketMessage_js_1.SocketMessage.EDITOR_HOVER: {
|
|
528
|
+
console.log(`[WS ${this.username}] received EDITOR_HOVER`, data);
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
case SocketMessage_js_1.SocketMessage.EDITOR_COMPLETE: {
|
|
532
|
+
console.log(`[WS ${this.username}] received EDITOR_COMPLETE`, data);
|
|
533
|
+
break;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
// Make this an observable
|
|
539
|
+
on_level_up = (_) => { };
|
|
540
|
+
}
|
|
541
|
+
exports.LeekWarsClient = LeekWarsClient;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
declare enum ItemType {
|
|
2
|
+
ALL = 0,
|
|
3
|
+
WEAPON = 1,
|
|
4
|
+
CHIP = 2,
|
|
5
|
+
POTION = 3,
|
|
6
|
+
HAT = 4,
|
|
7
|
+
POMP = 5,
|
|
8
|
+
FIGHT_PACK = 6,
|
|
9
|
+
RESOURCE = 7,
|
|
10
|
+
COMPONENT = 8,
|
|
11
|
+
SCHEME = 9
|
|
12
|
+
}
|
|
13
|
+
declare const ItemTypes: ItemType[];
|
|
14
|
+
export { ItemType, ItemTypes };
|
|
15
|
+
declare class Item {
|
|
16
|
+
id: number;
|
|
17
|
+
template: number;
|
|
18
|
+
quantity: number;
|
|
19
|
+
time: number;
|
|
20
|
+
}
|
|
21
|
+
declare class ItemTemplate {
|
|
22
|
+
id: number;
|
|
23
|
+
name: string;
|
|
24
|
+
type: ItemType;
|
|
25
|
+
price: number | null;
|
|
26
|
+
crystals: number | null;
|
|
27
|
+
sellable: boolean;
|
|
28
|
+
level: number;
|
|
29
|
+
params: any;
|
|
30
|
+
buyable: boolean;
|
|
31
|
+
public: boolean;
|
|
32
|
+
singleton: boolean;
|
|
33
|
+
trophy: number | null;
|
|
34
|
+
market: boolean;
|
|
35
|
+
buyable_crystals: boolean;
|
|
36
|
+
rarity: number;
|
|
37
|
+
leeks?: number[];
|
|
38
|
+
leek_count?: number;
|
|
39
|
+
farmer_count?: number;
|
|
40
|
+
sell_price?: number;
|
|
41
|
+
seen?: boolean;
|
|
42
|
+
}
|
|
43
|
+
declare const ITEM_CATEGORY_NAME: {
|
|
44
|
+
0: string;
|
|
45
|
+
1: string;
|
|
46
|
+
2: string;
|
|
47
|
+
3: string;
|
|
48
|
+
4: string;
|
|
49
|
+
5: string;
|
|
50
|
+
6: string;
|
|
51
|
+
7: string;
|
|
52
|
+
8: string;
|
|
53
|
+
9: string;
|
|
54
|
+
};
|
|
55
|
+
declare const ITEM_TYPE_NAME: {
|
|
56
|
+
0: string;
|
|
57
|
+
1: string;
|
|
58
|
+
2: string;
|
|
59
|
+
3: string;
|
|
60
|
+
4: string;
|
|
61
|
+
5: string;
|
|
62
|
+
6: string;
|
|
63
|
+
7: string;
|
|
64
|
+
8: string;
|
|
65
|
+
9: string;
|
|
66
|
+
};
|
|
67
|
+
declare const ITEM_TYPE_ICONS: {
|
|
68
|
+
0: string;
|
|
69
|
+
1: string;
|
|
70
|
+
2: string;
|
|
71
|
+
3: string;
|
|
72
|
+
4: string;
|
|
73
|
+
5: string;
|
|
74
|
+
6: string;
|
|
75
|
+
7: string;
|
|
76
|
+
8: string;
|
|
77
|
+
9: string;
|
|
78
|
+
};
|
|
79
|
+
export { Item, ItemTemplate, ITEM_CATEGORY_NAME, ITEM_TYPE_NAME, ITEM_TYPE_ICONS };
|
|
80
|
+
//# sourceMappingURL=Item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Item.d.ts","sourceRoot":"","sources":["../../../src/node-leek-client/leekwars-frontend/Item.ts"],"names":[],"mappings":"AAAA,aAAK,QAAQ;IACT,GAAG,IAAI;IACP,MAAM,IAAI;IACV,IAAI,IAAI;IACR,MAAM,IAAI;IACV,GAAG,IAAI;IACP,IAAI,IAAI;IACR,UAAU,IAAI;IACd,QAAQ,IAAI;IACZ,SAAS,IAAI;IACb,MAAM,IAAI;CACb;AACD,QAAA,MAAM,SAAS,YAA4K,CAAA;AAE3L,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;AAE9B,cAAM,IAAI;IACC,EAAE,EAAG,MAAM,CAAA;IACX,QAAQ,EAAG,MAAM,CAAA;IACjB,QAAQ,EAAG,MAAM,CAAA;IACjB,IAAI,EAAG,MAAM,CAAA;CACvB;AAED,cAAM,YAAY;IACP,EAAE,EAAG,MAAM,CAAA;IACX,IAAI,EAAG,MAAM,CAAA;IACb,IAAI,EAAG,QAAQ,CAAA;IACf,KAAK,EAAG,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,EAAG,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAG,OAAO,CAAA;IAClB,KAAK,EAAG,MAAM,CAAA;IACd,MAAM,EAAG,GAAG,CAAA;IACZ,OAAO,EAAG,OAAO,CAAA;IACjB,MAAM,EAAG,OAAO,CAAA;IAChB,SAAS,EAAG,OAAO,CAAA;IACnB,MAAM,EAAG,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAG,OAAO,CAAA;IAChB,gBAAgB,EAAG,OAAO,CAAA;IAC1B,MAAM,EAAG,MAAM,CAAA;IAEf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAEhB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,QAAA,MAAM,kBAAkB;;;;;;;;;;;CAWvB,CAAA;AAED,QAAA,MAAM,cAAc;;;;;;;;;;;CAWnB,CAAA;AAED,QAAA,MAAM,eAAe;;;;;;;;;;;CAWpB,CAAA;AAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,CAAA"}
|