warframe-worldstate-parser 5.2.16 → 5.2.18
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/dist/{Calendar-CRM0XhAy.d.mts → Calendar-C-rbmV_t.d.mts} +1 -1
- package/dist/{CambionCycle-OI3v1knd.d.mts → CambionCycle-BzR_MfPH.d.mts} +2 -2
- package/dist/{CetusCycle-DQ4n05vO.d.mts → CetusCycle-DaqfF4J1.d.mts} +1 -1
- package/dist/{ConstructionProgress-DG2KzS0X.d.mts → ConstructionProgress-BRxmro3-.d.mts} +1 -1
- package/dist/{DarkSectorBattle-CiSe3kFm.d.mts → DarkSectorBattle-DHRl5tG1.d.mts} +1 -1
- package/dist/{Dependency-CNqXngHD.d.mts → Dependency-Cd-TxBJy.d.mts} +1 -1
- package/dist/{EarthCycle-CxtijnVV.d.mts → EarthCycle-C_oB5gDc.d.mts} +1 -1
- package/dist/{MidrathCycle-E0gMF3AR.d.mts → MidrathCycle-CxveqDtx.d.mts} +1 -1
- package/dist/{News-DxEm-q6V.d.mts → News-CJ3lD7_g.d.mts} +1 -1
- package/dist/{Nightwave-CPqMSqGK.d.mts → Nightwave-BLHH02ht.d.mts} +2 -2
- package/dist/{NightwaveChallenge-CG3uychc.d.mts → NightwaveChallenge-j_m4hVQU.d.mts} +1 -1
- package/dist/{PersistentEnemy-DnnnreSz.d.mts → PersistentEnemy-BJ4twtUY.d.mts} +1 -1
- package/dist/{VallisCycle-6DCaWFoR.d.mts → VallisCycle-as7DM4a-.d.mts} +1 -1
- package/dist/{ZarimanCycle-BrSLIWhD.d.mts → ZarimanCycle-DyYiVfyG.d.mts} +1 -1
- package/dist/{index-Bgx8kIDy.d.mts → index-C4EJ_Mpd.d.mts} +6 -6
- package/dist/lib/WorldState.d.mts +16 -19
- package/dist/lib/WorldState.mjs +32 -48
- package/dist/lib/models/Alert.d.mts +1 -17
- package/dist/lib/models/Alert.mjs +49 -7
- package/dist/lib/models/Archimedea.d.mts +1 -17
- package/dist/lib/models/Archimedea.mjs +88 -4
- package/dist/lib/models/Calendar.d.mts +1 -2
- package/dist/lib/models/Calendar.mjs +79 -4
- package/dist/lib/models/CambionCycle.d.mts +1 -3
- package/dist/lib/models/CambionCycle.mjs +28 -4
- package/dist/lib/models/CetusCycle.d.mts +1 -2
- package/dist/lib/models/CetusCycle.mjs +87 -4
- package/dist/lib/models/ChallengeInstance.d.mts +1 -17
- package/dist/lib/models/ChallengeInstance.mjs +46 -3
- package/dist/lib/models/ConclaveChallenge.d.mts +1 -17
- package/dist/lib/models/ConclaveChallenge.mjs +77 -4
- package/dist/lib/models/ConstructionProgress.d.mts +1 -2
- package/dist/lib/models/ConstructionProgress.mjs +23 -4
- package/dist/lib/models/DailyDeal.d.mts +1 -17
- package/dist/lib/models/DailyDeal.mjs +64 -4
- package/dist/lib/models/DarkSector.d.mts +1 -17
- package/dist/lib/models/DarkSector.mjs +136 -8
- package/dist/lib/models/DarkSectorBattle.d.mts +1 -2
- package/dist/lib/models/DarkSectorBattle.mjs +49 -3
- package/dist/lib/models/DuviriCycle.d.mts +1 -17
- package/dist/lib/models/DuviriCycle.mjs +55 -4
- package/dist/lib/models/EarthCycle.d.mts +1 -2
- package/dist/lib/models/EarthCycle.mjs +73 -4
- package/dist/lib/models/Fissure.d.mts +1 -17
- package/dist/lib/models/Fissure.mjs +83 -4
- package/dist/lib/models/FlashSale.d.mts +1 -17
- package/dist/lib/models/FlashSale.mjs +73 -4
- package/dist/lib/models/GlobalUpgrade.d.mts +1 -17
- package/dist/lib/models/GlobalUpgrade.mjs +56 -4
- package/dist/lib/models/Invasion.d.mts +1 -17
- package/dist/lib/models/Invasion.mjs +106 -6
- package/dist/lib/models/Kinepage.d.mts +1 -1
- package/dist/lib/models/Kinepage.mjs +23 -3
- package/dist/lib/models/Kuva.d.mts +1 -17
- package/dist/lib/models/Kuva.mjs +85 -3
- package/dist/lib/models/MidrathCycle.d.mts +1 -2
- package/dist/lib/models/MidrathCycle.mjs +66 -4
- package/dist/lib/models/Mission.d.mts +1 -17
- package/dist/lib/models/Mission.mjs +138 -5
- package/dist/lib/models/News.d.mts +1 -2
- package/dist/lib/models/News.mjs +116 -4
- package/dist/lib/models/Nightwave.d.mts +1 -3
- package/dist/lib/models/Nightwave.mjs +58 -5
- package/dist/lib/models/NightwaveChallenge.d.mts +1 -2
- package/dist/lib/models/NightwaveChallenge.mjs +51 -4
- package/dist/lib/models/PersistentEnemy.d.mts +1 -2
- package/dist/lib/models/PersistentEnemy.mjs +74 -4
- package/dist/lib/models/Reward.d.mts +1 -17
- package/dist/lib/models/Reward.mjs +71 -4
- package/dist/lib/models/SentientOutpost.d.mts +1 -17
- package/dist/lib/models/SentientOutpost.mjs +63 -3
- package/dist/lib/models/Simaris.d.mts +1 -17
- package/dist/lib/models/Simaris.mjs +33 -3
- package/dist/lib/models/Sortie.d.mts +1 -17
- package/dist/lib/models/Sortie.mjs +71 -8
- package/dist/lib/models/SortieVariant.d.mts +1 -17
- package/dist/lib/models/SortieVariant.mjs +49 -3
- package/dist/lib/models/SteelPathOffering.d.mts +1 -1
- package/dist/lib/models/SteelPathOffering.mjs +81 -3
- package/dist/lib/models/SyndicateJob.d.mts +1 -17
- package/dist/lib/models/SyndicateJob.mjs +161 -7
- package/dist/lib/models/SyndicateMission.d.mts +1 -17
- package/dist/lib/models/SyndicateMission.mjs +64 -8
- package/dist/lib/models/Tmp.d.mts +1 -17
- package/dist/lib/models/Tmp.mjs +28 -4
- package/dist/lib/models/VallisCycle.d.mts +1 -2
- package/dist/lib/models/VallisCycle.mjs +72 -4
- package/dist/lib/models/VoidTrader.d.mts +1 -17
- package/dist/lib/models/VoidTrader.mjs +76 -6
- package/dist/lib/models/VoidTraderItem.d.mts +1 -17
- package/dist/lib/models/VoidTraderItem.mjs +36 -3
- package/dist/lib/models/VoidTraderSchedule.d.mts +1 -17
- package/dist/lib/models/VoidTraderSchedule.mjs +12 -3
- package/dist/lib/models/WeeklyChallenge.d.mts +1 -17
- package/dist/lib/models/WeeklyChallenge.mjs +19 -5
- package/dist/lib/models/WorldEvent.d.mts +1 -17
- package/dist/lib/models/WorldEvent.mjs +211 -9
- package/dist/lib/models/WorldStateObject.d.mts +1 -1
- package/dist/lib/models/WorldStateObject.mjs +52 -3
- package/dist/lib/models/ZarimanCycle.d.mts +1 -2
- package/dist/lib/models/ZarimanCycle.mjs +77 -4
- package/dist/lib/models/index.d.mts +17 -18
- package/dist/lib/models/index.mjs +43 -47
- package/dist/lib/supporting/Dependency.d.mts +1 -1
- package/dist/lib/supporting/Dependency.mjs +1 -1
- package/dist/lib/supporting/DuviriChoice.d.mts +1 -17
- package/dist/lib/supporting/DuviriChoice.mjs +24 -3
- package/dist/lib/supporting/ExternalMission.d.mts +1 -1
- package/dist/lib/supporting/ExternalMission.mjs +1 -1
- package/dist/lib/supporting/FetchProxy.d.mts +1 -1
- package/dist/lib/supporting/FetchProxy.mjs +45 -3
- package/dist/lib/supporting/ImgCdn.d.mts +1 -1
- package/dist/lib/supporting/ImgCdn.mjs +6 -3
- package/dist/lib/supporting/KuvaLogEntry.d.mts +1 -1
- package/dist/lib/supporting/KuvaLogEntry.mjs +1 -1
- package/dist/lib/supporting/RewardData.d.mts +1 -1
- package/dist/lib/supporting/RewardData.mjs +75 -3
- package/dist/lib/supporting/RewardTypes.d.mts +1 -1
- package/dist/lib/supporting/RewardTypes.mjs +326 -3
- package/dist/lib/supporting/index.d.mts +8 -23
- package/dist/lib/supporting/index.mjs +6 -8
- package/dist/main.d.mts +24 -24
- package/dist/main.mjs +48 -51
- package/package.json +1 -1
- package/dist/Alert-CPT2sBmd.mjs +0 -51
- package/dist/Archimedea-Vo36QE99.mjs +0 -90
- package/dist/Calendar-_gEQ9BEd.mjs +0 -81
- package/dist/CambionCycle-B1pqIgks.mjs +0 -30
- package/dist/CetusCycle-Ct51M2pd.mjs +0 -89
- package/dist/ChallengeInstance-BOu_e7ML.mjs +0 -48
- package/dist/ConclaveChallenge-BTN6UyV6.mjs +0 -79
- package/dist/ConstructionProgress-BoF2P9fx.mjs +0 -25
- package/dist/DailyDeal-aoNeCFWT.mjs +0 -66
- package/dist/DarkSector-D0uJWCg7.mjs +0 -138
- package/dist/DarkSectorBattle-CqRYeNpe.mjs +0 -51
- package/dist/Dependency-BR-dAeHI.mjs +0 -1
- package/dist/DuviriChoice-BEBiWA-g.mjs +0 -25
- package/dist/DuviriCycle-Do7mMnoC.mjs +0 -57
- package/dist/EarthCycle-BOAlcAuQ.mjs +0 -75
- package/dist/ExternalMission-D3MSZgnN.mjs +0 -1
- package/dist/FetchProxy-Bkdk15SX.mjs +0 -46
- package/dist/Fissure-diM4hyi3.mjs +0 -85
- package/dist/FlashSale-CNfRaZhM.mjs +0 -75
- package/dist/GlobalUpgrade-CUtZw05z.mjs +0 -58
- package/dist/ImgCdn-BJOdWAbU.mjs +0 -7
- package/dist/Invasion-Corx1lxf.mjs +0 -108
- package/dist/Kinepage-CbSzge67.mjs +0 -24
- package/dist/Kuva-Ijy2ZGBL.mjs +0 -87
- package/dist/KuvaLogEntry-D_VzIT3W.mjs +0 -1
- package/dist/MidrathCycle-XD2T8Dx5.mjs +0 -68
- package/dist/Mission-b8KP-YDf.mjs +0 -140
- package/dist/News-zAK-sYRg.mjs +0 -118
- package/dist/Nightwave-cTRmlbwH.mjs +0 -60
- package/dist/NightwaveChallenge-C8ARG7LC.mjs +0 -53
- package/dist/PersistentEnemy-3Sw5E8AN.mjs +0 -76
- package/dist/Reward-3FBJF_hS.mjs +0 -73
- package/dist/RewardData-C_9b8Yhi.mjs +0 -76
- package/dist/RewardTypes-DUrR7H3G.mjs +0 -328
- package/dist/SentientOutpost-Cadk-pIW.mjs +0 -65
- package/dist/Simaris-D6etEQp_.mjs +0 -35
- package/dist/Sortie-rSBgJc6U.mjs +0 -73
- package/dist/SortieVariant-CnuLkkNZ.mjs +0 -51
- package/dist/SteelPathOffering--wm-7hwb.mjs +0 -83
- package/dist/SyndicateJob-R89tWqvT.mjs +0 -162
- package/dist/SyndicateMission-CKZDWNyf.mjs +0 -66
- package/dist/Tmp-BYL_mYIG.mjs +0 -30
- package/dist/VallisCycle-BW2g49wB.mjs +0 -74
- package/dist/VoidTrader-DtjtVUgR.mjs +0 -78
- package/dist/VoidTraderItem-Cz6x1KTF.mjs +0 -38
- package/dist/VoidTraderSchedule-BsJLu50V.mjs +0 -14
- package/dist/WeeklyChallenge-Dl2ekl6X.mjs +0 -21
- package/dist/WorldEvent-C-LaV2ug.mjs +0 -213
- package/dist/WorldStateObject-45dbRgp7.mjs +0 -54
- package/dist/ZarimanCycle-DoAPwgaM.mjs +0 -79
- package/dist/supporting-BLSXhlWM.mjs +0 -1
- /package/dist/{ExternalMission-C82w4uMq.d.mts → ExternalMission-CT__oi7Q.d.mts} +0 -0
- /package/dist/{FetchProxy-DfSTUgkf.d.mts → FetchProxy-DHSI4JPP.d.mts} +0 -0
- /package/dist/{ImgCdn-D0hSGSB1.d.mts → ImgCdn-DIhZrwap.d.mts} +0 -0
- /package/dist/{Kinepage-B-Ym_VW5.d.mts → Kinepage-CKBuvbv5.d.mts} +0 -0
- /package/dist/{KuvaLogEntry-cftxhjfU.d.mts → KuvaLogEntry-f4ZBn2Xf.d.mts} +0 -0
- /package/dist/{RewardData-DWCgJ3UT.d.mts → RewardData-BdtdUFnh.d.mts} +0 -0
- /package/dist/{RewardTypes-Y3tHrtIJ.d.mts → RewardTypes-BnGaD7VF.d.mts} +0 -0
- /package/dist/{SteelPathOffering-CQkoKi5T.d.mts → SteelPathOffering-DYjZ29sT.d.mts} +0 -0
- /package/dist/{WorldStateObject-C1HEDkH7.d.mts → WorldStateObject-C2KjQZjd.d.mts} +0 -0
|
@@ -1,4 +1,87 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { WorldStateObject } from "./WorldStateObject.mjs";
|
|
2
|
+
import { fromNow, timeDeltaToString } from "warframe-worldstate-data/utilities";
|
|
3
|
+
//#region lib/models/CetusCycle.ts
|
|
4
|
+
const nightTime = 3e3;
|
|
5
|
+
const maximums = {
|
|
6
|
+
day: 6e6,
|
|
7
|
+
night: 3e6
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Represents the current Earth Day/Night Cycle
|
|
11
|
+
* @augments {WorldStateObject}
|
|
12
|
+
*/
|
|
13
|
+
var CetusCycle = class extends WorldStateObject {
|
|
14
|
+
/**
|
|
15
|
+
* The end of the Ostron bounties timer (marks the end of night)
|
|
16
|
+
*/
|
|
17
|
+
#bountiesEndDate;
|
|
18
|
+
/**
|
|
19
|
+
* The current cetus cycle, for calculating the other fields
|
|
20
|
+
*/
|
|
21
|
+
#ec;
|
|
22
|
+
/**
|
|
23
|
+
* Whether it's daytime
|
|
24
|
+
*/
|
|
25
|
+
isDay;
|
|
26
|
+
/**
|
|
27
|
+
* Current cycle state. One of `day`, `night`
|
|
28
|
+
*/
|
|
29
|
+
state;
|
|
30
|
+
/**
|
|
31
|
+
* Time remaining string
|
|
32
|
+
*/
|
|
33
|
+
timeLeft;
|
|
34
|
+
/**
|
|
35
|
+
* Whether this is for Cetus Cycle
|
|
36
|
+
*/
|
|
37
|
+
isCetus;
|
|
38
|
+
/**
|
|
39
|
+
* @param bountiesEndDate The end date for Ostron bounties
|
|
40
|
+
*/
|
|
41
|
+
constructor(bountiesEndDate) {
|
|
42
|
+
super({ _id: { $oid: "cetusCycle0" } });
|
|
43
|
+
this.#bountiesEndDate = bountiesEndDate;
|
|
44
|
+
this.#ec = this.getCurrentCetusCycle();
|
|
45
|
+
this.expiry = this.#ec.expiry;
|
|
46
|
+
this.activation = new Date(this.#ec.start);
|
|
47
|
+
this.isDay = this.#ec.dayTime;
|
|
48
|
+
this.state = this.#ec.state;
|
|
49
|
+
this.timeLeft = this.#ec.timeLeft;
|
|
50
|
+
this.isCetus = true;
|
|
51
|
+
this.id = `cetusCycle${this.expiry.getTime()}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Whether or not the event has expired
|
|
55
|
+
*/
|
|
56
|
+
get expired() {
|
|
57
|
+
return fromNow(this.expiry) < 0;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Short summary of the current state
|
|
61
|
+
*/
|
|
62
|
+
get shortString() {
|
|
63
|
+
return `${this.timeLeft.replace(/\s\d*s/gi, "")} to ${this.isDay ? "Night" : "Day"}`;
|
|
64
|
+
}
|
|
65
|
+
getCurrentCetusCycle() {
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
const bountiesClone = this.#bountiesEndDate;
|
|
68
|
+
bountiesClone.setSeconds(0);
|
|
69
|
+
let millisLeft = fromNow(bountiesClone);
|
|
70
|
+
const secondsToNightEnd = Number((millisLeft / 1e3).toFixed(0));
|
|
71
|
+
const dayTime = secondsToNightEnd > nightTime;
|
|
72
|
+
millisLeft = (dayTime ? secondsToNightEnd - nightTime : secondsToNightEnd) * 1e3;
|
|
73
|
+
const minutesCoef = 1e3 * 60;
|
|
74
|
+
const expiry = new Date(Math.round((now + millisLeft) / minutesCoef) * minutesCoef);
|
|
75
|
+
const state = dayTime ? "day" : "night";
|
|
76
|
+
return {
|
|
77
|
+
dayTime,
|
|
78
|
+
timeLeft: timeDeltaToString(millisLeft),
|
|
79
|
+
expiry,
|
|
80
|
+
expiresIn: millisLeft,
|
|
81
|
+
state,
|
|
82
|
+
start: expiry.getTime() - maximums[state]
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
//#endregion
|
|
87
|
+
export { CetusCycle };
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { K as ChallengeInstance, q as RawChallengeInstance } from "../../index-Bgx8kIDy.mjs";
|
|
3
|
-
import "../../WorldStateObject-C1HEDkH7.mjs";
|
|
4
|
-
import "../../Calendar-CRM0XhAy.mjs";
|
|
5
|
-
import "../../CetusCycle-DQ4n05vO.mjs";
|
|
6
|
-
import "../../CambionCycle-OI3v1knd.mjs";
|
|
7
|
-
import "../../ConstructionProgress-DG2KzS0X.mjs";
|
|
8
|
-
import "../../DarkSectorBattle-CiSe3kFm.mjs";
|
|
9
|
-
import "../../EarthCycle-CxtijnVV.mjs";
|
|
10
|
-
import "../../MidrathCycle-E0gMF3AR.mjs";
|
|
11
|
-
import "../../News-DxEm-q6V.mjs";
|
|
12
|
-
import "../../NightwaveChallenge-CG3uychc.mjs";
|
|
13
|
-
import "../../Nightwave-CPqMSqGK.mjs";
|
|
14
|
-
import "../../PersistentEnemy-DnnnreSz.mjs";
|
|
15
|
-
import "../../SteelPathOffering-CQkoKi5T.mjs";
|
|
16
|
-
import "../../VallisCycle-6DCaWFoR.mjs";
|
|
17
|
-
import "../../ZarimanCycle-BrSLIWhD.mjs";
|
|
1
|
+
import { K as ChallengeInstance, q as RawChallengeInstance } from "../../index-C4EJ_Mpd.mjs";
|
|
18
2
|
export { ChallengeInstance, RawChallengeInstance };
|
|
@@ -1,3 +1,46 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { languageString } from "warframe-worldstate-data/utilities";
|
|
2
|
+
//#region lib/models/ChallengeInstance.ts
|
|
3
|
+
/**
|
|
4
|
+
* Describes a world challenge instance
|
|
5
|
+
*/
|
|
6
|
+
var ChallengeInstance = class {
|
|
7
|
+
/**
|
|
8
|
+
* Type of challenge
|
|
9
|
+
*/
|
|
10
|
+
type;
|
|
11
|
+
/**
|
|
12
|
+
* Minimum enemy level to fulfill challenge
|
|
13
|
+
*/
|
|
14
|
+
minEnemyLevel;
|
|
15
|
+
/**
|
|
16
|
+
* Required number of units to complete challenge
|
|
17
|
+
*/
|
|
18
|
+
requiredAmount;
|
|
19
|
+
/**
|
|
20
|
+
* Waypoint for amount of units between progression updates
|
|
21
|
+
*/
|
|
22
|
+
progressAmount;
|
|
23
|
+
/**
|
|
24
|
+
* Required damage type
|
|
25
|
+
*/
|
|
26
|
+
damageType;
|
|
27
|
+
/**
|
|
28
|
+
* Target to fulfill challenge
|
|
29
|
+
*/
|
|
30
|
+
target;
|
|
31
|
+
/**
|
|
32
|
+
* @param data The challenge instance data
|
|
33
|
+
* @param deps The dependencies object
|
|
34
|
+
* @param deps.locale Locale to use for translations
|
|
35
|
+
*/
|
|
36
|
+
constructor(data, { locale = "en" } = { locale: "en" }) {
|
|
37
|
+
this.type = languageString(data.Type, locale);
|
|
38
|
+
this.minEnemyLevel = Number(data.MinimumEnemyLevel);
|
|
39
|
+
this.requiredAmount = Number(data.RequiredCount);
|
|
40
|
+
this.progressAmount = Number(data.ProgressIndicatorFreq);
|
|
41
|
+
this.damageType = data.DamageType ? languageString(data.DamageType, locale) : void 0;
|
|
42
|
+
this.target = data.VictimType?.[0] ? languageString(data.VictimType[0], locale) : data.Script?._faction;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
//#endregion
|
|
46
|
+
export { ChallengeInstance };
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { G as RawChallenge, W as ConclaveChallenge } from "../../index-Bgx8kIDy.mjs";
|
|
3
|
-
import "../../WorldStateObject-C1HEDkH7.mjs";
|
|
4
|
-
import "../../Calendar-CRM0XhAy.mjs";
|
|
5
|
-
import "../../CetusCycle-DQ4n05vO.mjs";
|
|
6
|
-
import "../../CambionCycle-OI3v1knd.mjs";
|
|
7
|
-
import "../../ConstructionProgress-DG2KzS0X.mjs";
|
|
8
|
-
import "../../DarkSectorBattle-CiSe3kFm.mjs";
|
|
9
|
-
import "../../EarthCycle-CxtijnVV.mjs";
|
|
10
|
-
import "../../MidrathCycle-E0gMF3AR.mjs";
|
|
11
|
-
import "../../News-DxEm-q6V.mjs";
|
|
12
|
-
import "../../NightwaveChallenge-CG3uychc.mjs";
|
|
13
|
-
import "../../Nightwave-CPqMSqGK.mjs";
|
|
14
|
-
import "../../PersistentEnemy-DnnnreSz.mjs";
|
|
15
|
-
import "../../SteelPathOffering-CQkoKi5T.mjs";
|
|
16
|
-
import "../../VallisCycle-6DCaWFoR.mjs";
|
|
17
|
-
import "../../ZarimanCycle-BrSLIWhD.mjs";
|
|
1
|
+
import { G as RawChallenge, W as ConclaveChallenge } from "../../index-C4EJ_Mpd.mjs";
|
|
18
2
|
export { ConclaveChallenge, RawChallenge };
|
|
@@ -1,4 +1,77 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { WorldStateObject } from "./WorldStateObject.mjs";
|
|
2
|
+
import { conclaveCategory, conclaveChallenge, conclaveMode, fromNow, parseDate, timeDeltaToString } from "warframe-worldstate-data/utilities";
|
|
3
|
+
//#region lib/models/ConclaveChallenge.ts
|
|
4
|
+
/**
|
|
5
|
+
* Represents a Conclave challenge
|
|
6
|
+
* @augments {WorldStateObject}
|
|
7
|
+
*/
|
|
8
|
+
var ConclaveChallenge = class extends WorldStateObject {
|
|
9
|
+
/**
|
|
10
|
+
* The number of times that the challenge's objective needs to be completed
|
|
11
|
+
*/
|
|
12
|
+
amount;
|
|
13
|
+
/**
|
|
14
|
+
* The PVP mode that the challenge must be completed in
|
|
15
|
+
*/
|
|
16
|
+
mode;
|
|
17
|
+
/**
|
|
18
|
+
* The challenge's category (daily, weekly...)
|
|
19
|
+
*/
|
|
20
|
+
category;
|
|
21
|
+
/**
|
|
22
|
+
* The challenge category unlocalized
|
|
23
|
+
*/
|
|
24
|
+
categoryKey;
|
|
25
|
+
/**
|
|
26
|
+
* The challenge's description text
|
|
27
|
+
*/
|
|
28
|
+
description;
|
|
29
|
+
/**
|
|
30
|
+
* Title of the challenge
|
|
31
|
+
*/
|
|
32
|
+
title;
|
|
33
|
+
/**
|
|
34
|
+
* Standing granted by completing challenge.
|
|
35
|
+
*/
|
|
36
|
+
standing;
|
|
37
|
+
/**
|
|
38
|
+
* Whether or not this is a daily conclave challenge.
|
|
39
|
+
*/
|
|
40
|
+
daily;
|
|
41
|
+
/**
|
|
42
|
+
* Whether or not this is the root challenge
|
|
43
|
+
*/
|
|
44
|
+
rootChallenge;
|
|
45
|
+
/**
|
|
46
|
+
* @param {object} data The challenge data
|
|
47
|
+
* @param {object} deps The dependencies object
|
|
48
|
+
* @param {string} deps.locale Locale to use for translations
|
|
49
|
+
*/
|
|
50
|
+
constructor(data, { locale = "en" } = { locale: "en" }) {
|
|
51
|
+
super(data);
|
|
52
|
+
this.expiry = parseDate(data.endDate);
|
|
53
|
+
this.activation = parseDate(data.startDate);
|
|
54
|
+
this.amount = data.params[0].v;
|
|
55
|
+
this.mode = conclaveMode(data.PVPMode, locale);
|
|
56
|
+
this.category = conclaveCategory(data.Category, locale);
|
|
57
|
+
this.categoryKey = conclaveCategory(data.Category, "en");
|
|
58
|
+
this.daily = this.categoryKey.toLowerCase() === "day";
|
|
59
|
+
this.rootChallenge = this.categoryKey.toLowerCase() === "week_root";
|
|
60
|
+
const challenge = conclaveChallenge(data.challengeTypeRefID, locale);
|
|
61
|
+
({title: this.title, description: this.description, standing: this.standing} = challenge);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Whether or not this is expired (at time of object creation)
|
|
65
|
+
*/
|
|
66
|
+
get expired() {
|
|
67
|
+
return fromNow(this.expiry) < 0;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* ETA string (at time of object creation)
|
|
71
|
+
*/
|
|
72
|
+
get eta() {
|
|
73
|
+
return timeDeltaToString(fromNow(this.expiry));
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
//#endregion
|
|
77
|
+
export { ConclaveChallenge };
|
|
@@ -1,4 +1,23 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { WorldStateObject } from "./WorldStateObject.mjs";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
//#region lib/models/ConstructionProgress.ts
|
|
4
|
+
/**
|
|
5
|
+
* Represents enemy construction progress
|
|
6
|
+
* @augments {WorldStateObject}
|
|
7
|
+
*/
|
|
8
|
+
var ConstructionProgress = class extends WorldStateObject {
|
|
9
|
+
fomorianProgress;
|
|
10
|
+
razorbackProgress;
|
|
11
|
+
unknownProgress;
|
|
12
|
+
/**
|
|
13
|
+
* @param data The construction data
|
|
14
|
+
*/
|
|
15
|
+
constructor(data) {
|
|
16
|
+
super({ _id: { $oid: createHash("md5").update(JSON.stringify(data), "utf8").digest("hex") } });
|
|
17
|
+
this.fomorianProgress = (data[0] ?? 0).toFixed(2);
|
|
18
|
+
this.razorbackProgress = (data[1] ?? 0).toFixed(2);
|
|
19
|
+
this.unknownProgress = (data[2] ?? 0).toFixed(2);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
export { ConstructionProgress };
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { H as DailyDeal, U as RawDailyDeal } from "../../index-Bgx8kIDy.mjs";
|
|
3
|
-
import "../../WorldStateObject-C1HEDkH7.mjs";
|
|
4
|
-
import "../../Calendar-CRM0XhAy.mjs";
|
|
5
|
-
import "../../CetusCycle-DQ4n05vO.mjs";
|
|
6
|
-
import "../../CambionCycle-OI3v1knd.mjs";
|
|
7
|
-
import "../../ConstructionProgress-DG2KzS0X.mjs";
|
|
8
|
-
import "../../DarkSectorBattle-CiSe3kFm.mjs";
|
|
9
|
-
import "../../EarthCycle-CxtijnVV.mjs";
|
|
10
|
-
import "../../MidrathCycle-E0gMF3AR.mjs";
|
|
11
|
-
import "../../News-DxEm-q6V.mjs";
|
|
12
|
-
import "../../NightwaveChallenge-CG3uychc.mjs";
|
|
13
|
-
import "../../Nightwave-CPqMSqGK.mjs";
|
|
14
|
-
import "../../PersistentEnemy-DnnnreSz.mjs";
|
|
15
|
-
import "../../SteelPathOffering-CQkoKi5T.mjs";
|
|
16
|
-
import "../../VallisCycle-6DCaWFoR.mjs";
|
|
17
|
-
import "../../ZarimanCycle-BrSLIWhD.mjs";
|
|
1
|
+
import { H as DailyDeal, U as RawDailyDeal } from "../../index-C4EJ_Mpd.mjs";
|
|
18
2
|
export { DailyDeal, RawDailyDeal };
|
|
@@ -1,4 +1,64 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { WorldStateObject } from "./WorldStateObject.mjs";
|
|
2
|
+
import { fromNow, languageString, timeDeltaToString } from "warframe-worldstate-data/utilities";
|
|
3
|
+
//#region lib/models/DailyDeal.ts
|
|
4
|
+
/**
|
|
5
|
+
* Represents a daily deal
|
|
6
|
+
*/
|
|
7
|
+
var DailyDeal = class extends WorldStateObject {
|
|
8
|
+
/**
|
|
9
|
+
* The item that is being offered in the sale
|
|
10
|
+
*/
|
|
11
|
+
item;
|
|
12
|
+
/**
|
|
13
|
+
* The uniqueName for the item on sale
|
|
14
|
+
*/
|
|
15
|
+
uniqueName;
|
|
16
|
+
/**
|
|
17
|
+
* The item's original price
|
|
18
|
+
*/
|
|
19
|
+
originalPrice;
|
|
20
|
+
/**
|
|
21
|
+
* The item's discounted price
|
|
22
|
+
*/
|
|
23
|
+
salePrice;
|
|
24
|
+
/**
|
|
25
|
+
* The number of available items on sale
|
|
26
|
+
*/
|
|
27
|
+
total;
|
|
28
|
+
/**
|
|
29
|
+
* The number of items that have already been sold
|
|
30
|
+
*/
|
|
31
|
+
sold;
|
|
32
|
+
/**
|
|
33
|
+
* Unique identifier for this deal built from the end time and item
|
|
34
|
+
*/
|
|
35
|
+
id;
|
|
36
|
+
/**
|
|
37
|
+
* Percent discount
|
|
38
|
+
*/
|
|
39
|
+
discount;
|
|
40
|
+
/**
|
|
41
|
+
* @param data The deal data
|
|
42
|
+
* @param deps The dependencies object
|
|
43
|
+
* @param deps.locale Locale to use for translations
|
|
44
|
+
*/
|
|
45
|
+
constructor(data, { locale = "en" } = { locale: "en" }) {
|
|
46
|
+
super(data);
|
|
47
|
+
this.item = languageString(data.StoreItem, locale);
|
|
48
|
+
this.uniqueName = data.StoreItem;
|
|
49
|
+
this.originalPrice = data.OriginalPrice;
|
|
50
|
+
this.salePrice = data.SalePrice;
|
|
51
|
+
this.total = data.AmountTotal;
|
|
52
|
+
this.sold = data.AmountSold;
|
|
53
|
+
this.id = `${data.StoreItem.split("/").slice(-1)[0]}${this.expiry.getTime()}`;
|
|
54
|
+
this.discount = data.Discount;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get a string indicating how much time is left before the deal expires
|
|
58
|
+
*/
|
|
59
|
+
get eta() {
|
|
60
|
+
return timeDeltaToString(fromNow(this.expiry));
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//#endregion
|
|
64
|
+
export { DailyDeal };
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { B as DefenderInfo, V as RawDarkSector, z as DarkSector } from "../../index-Bgx8kIDy.mjs";
|
|
3
|
-
import "../../WorldStateObject-C1HEDkH7.mjs";
|
|
4
|
-
import "../../Calendar-CRM0XhAy.mjs";
|
|
5
|
-
import "../../CetusCycle-DQ4n05vO.mjs";
|
|
6
|
-
import "../../CambionCycle-OI3v1knd.mjs";
|
|
7
|
-
import "../../ConstructionProgress-DG2KzS0X.mjs";
|
|
8
|
-
import "../../DarkSectorBattle-CiSe3kFm.mjs";
|
|
9
|
-
import "../../EarthCycle-CxtijnVV.mjs";
|
|
10
|
-
import "../../MidrathCycle-E0gMF3AR.mjs";
|
|
11
|
-
import "../../News-DxEm-q6V.mjs";
|
|
12
|
-
import "../../NightwaveChallenge-CG3uychc.mjs";
|
|
13
|
-
import "../../Nightwave-CPqMSqGK.mjs";
|
|
14
|
-
import "../../PersistentEnemy-DnnnreSz.mjs";
|
|
15
|
-
import "../../SteelPathOffering-CQkoKi5T.mjs";
|
|
16
|
-
import "../../VallisCycle-6DCaWFoR.mjs";
|
|
17
|
-
import "../../ZarimanCycle-BrSLIWhD.mjs";
|
|
1
|
+
import { B as DefenderInfo, V as RawDarkSector, z as DarkSector } from "../../index-C4EJ_Mpd.mjs";
|
|
18
2
|
export { DarkSector, DefenderInfo, RawDarkSector };
|
|
@@ -1,8 +1,136 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import "
|
|
3
|
-
import "
|
|
4
|
-
import "
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { Mission } from "./Mission.mjs";
|
|
2
|
+
import { WorldStateObject } from "./WorldStateObject.mjs";
|
|
3
|
+
import { DarkSectorBattle } from "./DarkSectorBattle.mjs";
|
|
4
|
+
import { languageString, parseDate } from "warframe-worldstate-data/utilities";
|
|
5
|
+
//#region lib/models/DarkSector.ts
|
|
6
|
+
/**
|
|
7
|
+
* Represents a dark sector
|
|
8
|
+
* @augments {WorldStateObject}
|
|
9
|
+
*/
|
|
10
|
+
var DarkSector = class extends WorldStateObject {
|
|
11
|
+
/**
|
|
12
|
+
* The dark sector credit tax rate
|
|
13
|
+
*/
|
|
14
|
+
creditTaxRate;
|
|
15
|
+
/**
|
|
16
|
+
* The dark sector credit tax rate for clan/alliance members
|
|
17
|
+
*/
|
|
18
|
+
memberCreditsTaxRate;
|
|
19
|
+
/**
|
|
20
|
+
* The dark sector resource tax rate
|
|
21
|
+
*/
|
|
22
|
+
itemsTaxRate;
|
|
23
|
+
/**
|
|
24
|
+
* The dark sector resource tax rate for clan/alliance members
|
|
25
|
+
*/
|
|
26
|
+
memberItemsTaxRate;
|
|
27
|
+
/**
|
|
28
|
+
* Whether the dark sector holder is an alliance or not
|
|
29
|
+
*/
|
|
30
|
+
isAlliance;
|
|
31
|
+
/**
|
|
32
|
+
* The current holder of the dark sector
|
|
33
|
+
*/
|
|
34
|
+
defenderName;
|
|
35
|
+
/**
|
|
36
|
+
* The remaining health of the current solar rail
|
|
37
|
+
*/
|
|
38
|
+
defenderPoolRemaining;
|
|
39
|
+
/**
|
|
40
|
+
* The maximum health of the solar rail
|
|
41
|
+
*/
|
|
42
|
+
defenderMaxPool;
|
|
43
|
+
/**
|
|
44
|
+
* The date and time at which the rail was deployed
|
|
45
|
+
*/
|
|
46
|
+
defenderDeployemntActivation;
|
|
47
|
+
/**
|
|
48
|
+
* The solar rail type
|
|
49
|
+
*/
|
|
50
|
+
railType;
|
|
51
|
+
/**
|
|
52
|
+
* The MOTD set by the dark sector holder
|
|
53
|
+
*/
|
|
54
|
+
defenderMOTD;
|
|
55
|
+
/**
|
|
56
|
+
* The player who deployed the solar rail
|
|
57
|
+
*/
|
|
58
|
+
deployerName;
|
|
59
|
+
/**
|
|
60
|
+
* The clan of the player who deployed the solar rail
|
|
61
|
+
*/
|
|
62
|
+
deployerClan;
|
|
63
|
+
defenderRailHealReserve;
|
|
64
|
+
healRate;
|
|
65
|
+
damagePerMission;
|
|
66
|
+
/**
|
|
67
|
+
* The dark sector's mission
|
|
68
|
+
*/
|
|
69
|
+
mission;
|
|
70
|
+
battlePayReserve;
|
|
71
|
+
/**
|
|
72
|
+
* The battle pay per mission offered to players
|
|
73
|
+
* @type {number}
|
|
74
|
+
*/
|
|
75
|
+
perMissionBattlePay;
|
|
76
|
+
/**
|
|
77
|
+
* The player who set the battle pay
|
|
78
|
+
* @type {string}
|
|
79
|
+
*/
|
|
80
|
+
battlePaySetBy;
|
|
81
|
+
/**
|
|
82
|
+
* The clan of the player who set the battle pay
|
|
83
|
+
* @type {string}
|
|
84
|
+
*/
|
|
85
|
+
battlePaySetByClan;
|
|
86
|
+
/**
|
|
87
|
+
* The player who changed the tax
|
|
88
|
+
* @type {string}
|
|
89
|
+
*/
|
|
90
|
+
taxChangedBy;
|
|
91
|
+
/**
|
|
92
|
+
* The clan of the player who set the tax
|
|
93
|
+
* @type {string}
|
|
94
|
+
*/
|
|
95
|
+
taxChangedByClan;
|
|
96
|
+
/**
|
|
97
|
+
* The history of the dark sector
|
|
98
|
+
* @type {Array.<DarkSectorBattle>}
|
|
99
|
+
*/
|
|
100
|
+
history;
|
|
101
|
+
/**
|
|
102
|
+
* @param {object} data The dark sector data
|
|
103
|
+
* @param {object} deps The dependencies object
|
|
104
|
+
* @param {string} deps.locale Locale to use for translations
|
|
105
|
+
*/
|
|
106
|
+
constructor(data, { locale = "en" } = { locale: "en" }) {
|
|
107
|
+
super(data);
|
|
108
|
+
const deps = { locale };
|
|
109
|
+
this.creditTaxRate = data.DefenderInfo.CreditsTaxRate;
|
|
110
|
+
this.memberCreditsTaxRate = data.DefenderInfo.MemberCreditsTax;
|
|
111
|
+
this.itemsTaxRate = data.DefenderInfo.ItemsTaxRate;
|
|
112
|
+
this.memberItemsTaxRate = data.DefenderInfo.MemberItemsTaxRate;
|
|
113
|
+
this.isAlliance = data.DefenderInfo.IsAlliance;
|
|
114
|
+
this.defenderName = data.DefenderInfo.Name;
|
|
115
|
+
this.defenderPoolRemaining = Number.parseFloat(data.DefenderInfo.StrengthRemaining);
|
|
116
|
+
this.defenderMaxPool = Number.parseFloat(data.DefenderInfo.MaxStrength);
|
|
117
|
+
this.defenderDeployemntActivation = data.DefenderInfo.DeploymentActivationTime ? parseDate(data.DefenderInfo.DeploymentActivationTime) : 0;
|
|
118
|
+
this.railType = languageString(data.DefenderInfo.RailType, locale);
|
|
119
|
+
this.defenderMOTD = data.DefenderInfo.MOTD;
|
|
120
|
+
this.deployerName = data.DefenderInfo.DeployerName;
|
|
121
|
+
this.deployerClan = data.DefenderInfo.DeployerClan;
|
|
122
|
+
this.defenderRailHealReserve = data.DefenderInfo.RailHealReserve;
|
|
123
|
+
this.healRate = Number.parseFloat(data.DefenderInfo.healRate);
|
|
124
|
+
this.damagePerMission = data.DefenderInfo.DamagePerMission;
|
|
125
|
+
this.mission = data.DefenderInfo.MissionInfo ? new Mission(data.DefenderInfo.MissionInfo, deps) : void 0;
|
|
126
|
+
this.battlePayReserve = data.DefenderInfo.BattlePayReserve;
|
|
127
|
+
this.perMissionBattlePay = data.DefenderInfo.MissionBattlePay;
|
|
128
|
+
this.battlePaySetBy = data.DefenderInfo.BattlePaySetBy;
|
|
129
|
+
this.battlePaySetByClan = data.DefenderInfo.BattlePaySetByClan;
|
|
130
|
+
this.taxChangedBy = data.DefenderInfo.TaxLastChangedBy;
|
|
131
|
+
this.taxChangedByClan = data.DefenderInfo.TaxLastChangedByClan;
|
|
132
|
+
this.history = data.History ? data.History.map((b) => new DarkSectorBattle(b)) : [];
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
//#endregion
|
|
136
|
+
export { DarkSector };
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { n as RawDarkSectorBattle, t as DarkSectorBattle } from "../../DarkSectorBattle-CiSe3kFm.mjs";
|
|
1
|
+
import { n as RawDarkSectorBattle, t as DarkSectorBattle } from "../../DarkSectorBattle-DHRl5tG1.mjs";
|
|
3
2
|
export { DarkSectorBattle, RawDarkSectorBattle };
|
|
@@ -1,3 +1,49 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { parseDate } from "warframe-worldstate-data/utilities";
|
|
2
|
+
//#region lib/models/DarkSectorBattle.ts
|
|
3
|
+
/**
|
|
4
|
+
* Represents a battle over a dark sector
|
|
5
|
+
*/
|
|
6
|
+
var DarkSectorBattle = class {
|
|
7
|
+
/**
|
|
8
|
+
* The defenders of the dark sector
|
|
9
|
+
*/
|
|
10
|
+
defender;
|
|
11
|
+
/**
|
|
12
|
+
* Whether the defenders are an alliance or not
|
|
13
|
+
*/
|
|
14
|
+
defenderIsAlliance;
|
|
15
|
+
/**
|
|
16
|
+
* The attackers of the dark sector
|
|
17
|
+
*/
|
|
18
|
+
attacker;
|
|
19
|
+
/**
|
|
20
|
+
* Whether the attackers are an alliance or not
|
|
21
|
+
*/
|
|
22
|
+
attackerIsAlliance;
|
|
23
|
+
/**
|
|
24
|
+
* The winner of the battle
|
|
25
|
+
*/
|
|
26
|
+
winner;
|
|
27
|
+
/**
|
|
28
|
+
* The date and time at which the battle started
|
|
29
|
+
*/
|
|
30
|
+
start;
|
|
31
|
+
/**
|
|
32
|
+
* The date and time at which the battle ended
|
|
33
|
+
*/
|
|
34
|
+
end;
|
|
35
|
+
/**
|
|
36
|
+
* @param data The battle data
|
|
37
|
+
*/
|
|
38
|
+
constructor(data) {
|
|
39
|
+
this.defender = data.Def;
|
|
40
|
+
this.defenderIsAlliance = data.DefAli;
|
|
41
|
+
this.attacker = data.Att;
|
|
42
|
+
this.attackerIsAlliance = data.AttAli;
|
|
43
|
+
this.winner = (data.DefId.$oid || data.DefId.$id) === (data.WinId.$oid || data.WinId.$id) ? this.defender : this.attacker;
|
|
44
|
+
this.start = parseDate(data.Start);
|
|
45
|
+
this.end = parseDate(data.End);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
//#endregion
|
|
49
|
+
export { DarkSectorBattle };
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { R as DuviriCycle } from "../../index-Bgx8kIDy.mjs";
|
|
3
|
-
import "../../WorldStateObject-C1HEDkH7.mjs";
|
|
4
|
-
import "../../Calendar-CRM0XhAy.mjs";
|
|
5
|
-
import "../../CetusCycle-DQ4n05vO.mjs";
|
|
6
|
-
import "../../CambionCycle-OI3v1knd.mjs";
|
|
7
|
-
import "../../ConstructionProgress-DG2KzS0X.mjs";
|
|
8
|
-
import "../../DarkSectorBattle-CiSe3kFm.mjs";
|
|
9
|
-
import "../../EarthCycle-CxtijnVV.mjs";
|
|
10
|
-
import "../../MidrathCycle-E0gMF3AR.mjs";
|
|
11
|
-
import "../../News-DxEm-q6V.mjs";
|
|
12
|
-
import "../../NightwaveChallenge-CG3uychc.mjs";
|
|
13
|
-
import "../../Nightwave-CPqMSqGK.mjs";
|
|
14
|
-
import "../../PersistentEnemy-DnnnreSz.mjs";
|
|
15
|
-
import "../../SteelPathOffering-CQkoKi5T.mjs";
|
|
16
|
-
import "../../VallisCycle-6DCaWFoR.mjs";
|
|
17
|
-
import "../../ZarimanCycle-BrSLIWhD.mjs";
|
|
1
|
+
import { R as DuviriCycle } from "../../index-C4EJ_Mpd.mjs";
|
|
18
2
|
export { DuviriCycle };
|