Merge remote-tracking branch 'upstream/master'

This commit is contained in:
skelsoft
2021-08-20 06:34:48 +10:00
6 changed files with 300 additions and 178 deletions
+263 -141
View File
@@ -27400,154 +27400,276 @@
] ]
}, },
{ {
"default": [], "default": [
"charm": [], {
"minAmount": "1",
"weight": "1.0",
"id": "526",
"maxAmount": "1"
}
],
"charm": [
{
"minAmount": "1",
"weight": "20.0",
"id": "12158",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "70.0",
"id": "12159",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "12160",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "12163",
"maxAmount": "1"
}
],
"ids": "1622,1623,1626,1627,1628,1629,1630", "ids": "1622,1623,1626,1627,1628,1629,1630",
"description": "", "description": "",
"main": [ "main": [
{
"minAmount": "5",
"weight": "50.0",
"id": "557",
"maxAmount": "42"
},
{ {
"minAmount": "1", "minAmount": "1",
"weight": "50.0", "weight": "1.0",
"id": "1436",
"maxAmount": "1"
},
{
"minAmount": "2",
"weight": "25.0",
"id": "562",
"maxAmount": "25"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "438",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "436",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "2349",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "440",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "2351",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "453",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "447",
"maxAmount": "1"
},
{
"minAmount": "4",
"weight": "50.0",
"id": "5318",
"maxAmount": "4"
},
{
"minAmount": "4",
"weight": "50.0",
"id": "5319",
"maxAmount": "4"
},
{
"minAmount": "4",
"weight": "50.0",
"id": "5324",
"maxAmount": "4"
},
{
"minAmount": "3",
"weight": "25.0",
"id": "5322",
"maxAmount": "3"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5305",
"maxAmount": "4"
},
{
"minAmount": "3",
"weight": "25.0",
"id": "5320",
"maxAmount": "3"
},
{
"minAmount": "3",
"weight": "25.0",
"id": "5308",
"maxAmount": "3"
},
{
"minAmount": "2",
"weight": "5.0",
"id": "5323",
"maxAmount": "2"
},
{
"minAmount": "2",
"weight": "5.0",
"id": "5321",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "2347",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "1913",
"maxAmount": "1"
},
{
"minAmount": "23",
"weight": "25.0",
"id": "995",
"maxAmount": "23"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "4115",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "31", "id": "31",
"maxAmount": "1" "maxAmount": "1"
},
{
"minAmount": "1",
"weight": "19.0",
"id": "1069",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "8.0",
"id": "1355",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "1197",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "1161",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "1213",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "13290",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "4113",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "17.0",
"id": "563",
"maxAmount": "3"
},
{
"minAmount": "15",
"weight": "14.0",
"id": "561",
"maxAmount": "15"
},
{
"minAmount": "37",
"weight": "3.0",
"id": "561",
"maxAmount": "37"
},
{
"minAmount": "1",
"weight": "22.0",
"id": "199",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "16.0",
"id": "201",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "12.0",
"id": "203",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "9.0",
"id": "205",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "7.0",
"id": "207",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "209",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "4.0",
"id": "211",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "4.0",
"id": "213",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "215",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "2.0",
"id": "2485",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "2.0",
"id": "217",
"maxAmount": "3"
},
{
"minAmount": "44",
"weight": "77.0",
"id": "995",
"maxAmount": "44"
},
{
"minAmount": "132",
"weight": "32.0",
"id": "995",
"maxAmount": "132"
},
{
"minAmount": "440",
"weight": "3.0",
"id": "995",
"maxAmount": "440"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "5296",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "7.0",
"id": "5297",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "7.0",
"id": "5281",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "5106",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "5298",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "5299",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "2.0",
"id": "5300",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "2.0",
"id": "5301",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "5302",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "5303",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "5304",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "19.0",
"id": "225",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "5280",
"maxAmount": "1"
},
{
"minAmount": "45",
"weight": "1.0",
"id": "561",
"maxAmount": "45"
} }
] ]
}, },
@@ -69,11 +69,11 @@ public final class DrezelDialogue extends DialoguePlugin {
final Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); final Quest quest = player.getQuestRepository().getQuest("Priest in Peril");
switch (stage) { switch (stage) {
case 0: case 0:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh! You do not appear to be on of those Zamorkians", "who imprisoned me here! Who are you and why are", "you here?"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh! You do not appear to be on of those Zamorakians", "who imprisoned me here! Who are you and why are", "you here?");
stage = 1; stage = 1;
break; break;
case 1: case 1:
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "My name's " + player.getUsername() + ". King Roald sent me to find out", "what was going on at the temple. I take it you are", "Drezel?"); interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "My name's " + player.getUsername() + ". King Roald sent me to find", "out what was going on at the temple. I take it you are", "Drezel?");
stage = 2; stage = 2;
break; break;
case 2: case 2:
@@ -99,7 +99,7 @@ public final class DrezelDialogue extends DialoguePlugin {
case 7: case 7:
switch (buttonId) { switch (buttonId) {
case 1: case 1:
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me anyway."); interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me anyway. I'd like to know the full facts before","acting any further.");
stage = 8; stage = 8;
break; break;
case 2: case 2:
@@ -109,7 +109,7 @@ public final class DrezelDialogue extends DialoguePlugin {
} }
break; break;
case 8: case 8:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "d, Saradomin has granted you wisdom I see. Well, the", "story of the river Salve and of how it protects Mithsalin", "is the story of this temple,"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, Saradomin has granted you wisdom I see. Well, the", "story of the river Salve and of how it protects Mithsalin", "is the story of this temple,");
stage = 9; stage = 9;
break; break;
case 9: case 9:
@@ -137,7 +137,7 @@ public final class DrezelDialogue extends DialoguePlugin {
stage = 15; stage = 15;
break; break;
case 15: case 15:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "that he could find, and the seven of them rode here to", "make a final stand. The enemies swarmed across the", "Salve but they did not yield"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "that he could find, and the seven of them rode here to", "make a final stand. The enemies swarmed across the", "Salve but they did not yield.");
stage = 16; stage = 16;
break; break;
case 16: case 16:
@@ -145,7 +145,7 @@ public final class DrezelDialogue extends DialoguePlugin {
stage = 17; stage = 17;
break; break;
case 17: case 17:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "On the eleventh day they were to be joined by", "reinforcements from a neighbouring encampment, but", "then those reinforecements arrived all they found"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "On the eleventh day they were to be joined by", "reinforcements from a neighbouring encampment, but", "then those reinforcements arrived all they found");
stage = 18; stage = 18;
break; break;
case 18: case 18:
@@ -153,7 +153,7 @@ public final class DrezelDialogue extends DialoguePlugin {
stage = 19; stage = 19;
break; break;
case 19: case 19:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The men were saddend at the loss of such pure and", "mighty warriors, yet their sacrifice had not been in", "vain; for the water of the Salve"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The men were saddened at the loss of such pure and", "mighty warriors, yet their sacrifice had not been in", "vain; for the water of the Salve");
stage = 20; stage = 20;
break; break;
case 20: case 20:
@@ -189,32 +189,28 @@ public final class DrezelDialogue extends DialoguePlugin {
stage = 28; stage = 28;
break; break;
case 28: case 28:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I fear that should those Zamorakians somehow pollute", "the Salve and desecrate his blessing, his power might not", "be able to stop."); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I fear that should those Zamorakians somehow pollute", "the Salve and desecrate his blessing, his power might not", "be able to stop");
stage = 29; stage = 29;
break; break;
case 29: case 29:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "the army of evil that lurks to the east, longing for the", "opportunity to invade and destroy us all!"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "the army of evil that lurks to the east, longing for the", "opportunity to invade and destroy us all!");
stage = 30; stage = 30;
break; break;
case 31:
interpreter.sendOptions("Select an Option", "Yes.", "No.");
stage = 503;
break;
case 30: case 30:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So what do you say adventurer? Will you aid me and", "all of Misthalin in foiling this Zamorakian plot?"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So what do you say adventurer? Will you aid me and", "all of Misthalin in foiling this Zamorakian plot?");
stage = 31; stage = 31;
break; break;
case 31:
interpreter.sendOptions("Select an Option", "Yes.", "No.");
stage = 503;
break;
case 500: case 500:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, let's just say if we cannot undo whatever damage", "has been done here the entire land is in grave peril!"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, let's just say if we cannot undo whatever damage", "has been done here the entire land is in grave peril!");
stage = 501; stage = 501;
break; break;
case 501: case 501:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So what do you say adventurer? Will you aid me and", "all of Misthalin in foiling this Zamorakian plot?"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So what do you say adventurer? Will you aid me and", "all of Misthalin in foiling this Zamorakian plot?");
stage = 502; stage = 31;
break;
case 502:
interpreter.sendOptions("Select an Option", "Yes.", "No.");
stage = 503;
break; break;
case 503: case 503:
switch (buttonId) { switch (buttonId) {
@@ -236,11 +232,11 @@ public final class DrezelDialogue extends DialoguePlugin {
end(); end();
break; break;
case 506: case 506:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, the immediate problem is that I am trapped in this", "cell. I know that they key to free me is nearby, for none", "of the Zamorakians"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, the immediate problem is that I am trapped in this", "cell. I know that the key to free me is nearby, for none", "of the Zamorakians");
stage = 507; stage = 507;
break; break;
case 507: case 507:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "who imprisoned me here were ever gone for long", "periods of time, Should you find the key however, as", "you may have noticed,"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "who imprisoned me here were ever gone for long", "periods of time. Should you find the key however, as", "you may have noticed,");
stage = 508; stage = 508;
break; break;
case 508: case 508:
@@ -276,7 +272,7 @@ public final class DrezelDialogue extends DialoguePlugin {
stage = 516; stage = 516;
break; break;
case 516: case 516:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you have done both of those I will be able to", "inspect the damage which those Zamorakians have done", "to the purity of the Salve"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you have done both of those I will be able to", "inspect the damage which those Zamorakians have done", "to the purity of the Salve.");
stage = 517; stage = 517;
break; break;
case 517: case 517:
@@ -352,7 +348,7 @@ public final class DrezelDialogue extends DialoguePlugin {
player.getPacketDispatch().sendMessage("The priest blesses the water for you."); player.getPacketDispatch().sendMessage("The priest blesses the water for you.");
break; break;
case 730: case 730:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "well, the water of the salve should still have enough", "power to work against the vampie despite what those", "Zamorakians might have done to it..."); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "well, the water of the salve should still have enough", "power to work against the vampire despite what those", "Zamorakians might have done to it...");
stage = 731; stage = 731;
break; break;
case 731: case 731:
@@ -211,7 +211,7 @@ public final class DrezelMonumentDialogue extends DialoguePlugin {
stage = 901; stage = 901;
break; break;
case 901: case 901:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "From what I can tell, after you killed the guard dog", "who protected the entrance to the mouments, those", "Zamorakians forced the door into the main chamber"); interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "From what I can tell, after you killed the guard dog", "who protected the entrance to the monuments, those", "Zamorakians forced the door into the main chamber");
stage = 902; stage = 902;
break; break;
case 902: case 902:
@@ -136,8 +136,8 @@ public class PriestInPerilUsePlugin extends UseWithHandler {
Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); Quest quest = player.getQuestRepository().getQuest("Priest in Peril");
quest.setStage(player, 15); quest.setStage(player, 15);
player.getPacketDispatch().sendMessage("You have unlocked the cell door."); player.getPacketDispatch().sendMessage("You have unlocked the cell door.");
NPC npc = NPC.create(1047, player.getLocation()); NPC npc = NPC.create(7690, player.getLocation());
npc.setName("Dezel"); npc.setName("Drezel");
player.getDialogueInterpreter().sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh! Thank you! You have found the key!"); player.getDialogueInterpreter().sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh! Thank you! You have found the key!");
} }
} }
@@ -17,10 +17,10 @@ class KingRoaldPIPDialogue(val questStage: Int) : DialogueFile() {
when(stage){ when(stage){
1 -> player("I am looking for a quest!").also { stage++ } 1 -> player("I am looking for a quest!").also { stage++ }
2 -> npc("A quest you say? Hmm, what an odd request to make", "of the king. It's funny you should mention it though, as", "there is something you can do for me.").also { stage++ } 2 -> npc("A quest you say? Hmm, what an odd request to make", "of the king. It's funny you should mention it though, as", "there is something you can do for me.").also { stage++ }
3 -> npc("Are you aware of the temple easy of here? It stands on", "the river Salve and guards the entrance to the lands of", "Morytania?").also { stage++ } 3 -> npc("Are you aware of the temple east of here? It stands on", "the river Salve and guards the entrance to the lands of", "Morytania?").also { stage++ }
4 -> player("No, I don't think I know it...").also { stage++ } 4 -> player("No, I don't think I know it...").also { stage++ }
5 -> npc("Hmm, how strange that you don't. Well anyway, it has", "been some days since last I heard from Drezel, the", "priest who lives there.").also { stage++ } 5 -> npc("Hmm, how strange that you don't. Well anyway, it has", "been some days since last I heard from Drezel, the", "priest who lives there.").also { stage++ }
6 -> npc("Be a sport and go make sure that nothing untoward", "has happend to the silly old codger for me, would you?").also { stage++ } 6 -> npc("Be a sport and go make sure that nothing untoward", "has happened to the silly old codger for me, would you?").also { stage++ }
7 -> options("Sure.", "No, that sounds boring.").also { stage++ } 7 -> options("Sure.", "No, that sounds boring.").also { stage++ }
8 -> when(buttonID){ 8 -> when(buttonID){
1 -> { 1 -> {
@@ -49,11 +49,11 @@ class KingRoaldPIPDialogue(val questStage: Int) : DialogueFile() {
when(stage){ when(stage){
1 -> npc("You have news of Drezel for me?").also { stage++ } 1 -> npc("You have news of Drezel for me?").also { stage++ }
2 -> player("Yeah, I spoke to the guys at the temple and they said", "they were being bothered by that dog in the crypt, so I", "went and killed it for them. No problem.").also { stage++ } 2 -> player("Yeah, I spoke to the guys at the temple and they said", "they were being bothered by that dog in the crypt, so I", "went and killed it for them. No problem.").also { stage++ }
3 -> npc("YOU DID WHAT??").also { stage++ } 3 -> npc("YOU DID WHAT???").also { stage++ }
4 -> npc("Are you mentally deficient??? That guard dog was", "protecting the route to Morytania! Without it we could", "be in severe peril of attack!").also { stage++ } 4 -> npc("Are you mentally deficient??? That guard dog was", "protecting the route to Morytania! Without it we could", "be in severe peril of attack!").also { stage++ }
5 -> player("Did I make a mistake?").also { stage++ } 5 -> player("Did I make a mistake?").also { stage++ }
6 -> npc("YES YOU DID!!!!! You need to get there", "and find out what is happening! Before it is too late for", "us all!").also { stage++ } 6 -> npc("YES YOU DID!!!!! You need to get there right now", "and find out what is happening! Before it is too late for", "us all!").also { stage++ }
7 -> player("B-but Drezel TOLD me to..!").also { stage++ } 7 -> player("B-but Drezel TOLD me to...!").also { stage++ }
8 -> npc("No, you absolute cretin! Obviously some fiend has done", "something to Drezel and tricked your feeble intellect", "into helping them kill that guard dog!").also { stage++ } 8 -> npc("No, you absolute cretin! Obviously some fiend has done", "something to Drezel and tricked your feeble intellect", "into helping them kill that guard dog!").also { stage++ }
9 -> npc("You get back there and do whatever is necessary to", "safeguard my kingdom from attack, or I will see you", "beheaded for high treason!").also { stage++ } 9 -> npc("You get back there and do whatever is necessary to", "safeguard my kingdom from attack, or I will see you", "beheaded for high treason!").also { stage++ }
10 -> { 10 -> {
@@ -9,6 +9,7 @@ import core.game.node.entity.skill.summoning.SummoningScroll
import core.game.node.item.Item import core.game.node.item.Item
import core.game.world.map.zone.ZoneBorders import core.game.world.map.zone.ZoneBorders
import kotlin.math.ceil import kotlin.math.ceil
import kotlin.math.floor
/** /**
* Handles swapping pouches/scrolls for shards. * Handles swapping pouches/scrolls for shards.
@@ -49,21 +50,21 @@ object BogrogPouchSwapper {
private fun swap(player: Player, amount: Int, itemID: Int): Boolean{ private fun swap(player: Player, amount: Int, itemID: Int): Boolean{
var amt = amount var amt = amount
val value = getValue(itemID) val value = getValue(itemID)
if(value == 0){ if(value == 0.0){
return false return false
} }
val inInventory = player.inventory.getAmount(itemID) val inInventory = player.inventory.getAmount(itemID)
if(amount > inInventory) if(amount > inInventory)
amt = inInventory amt = inInventory
player.inventory.remove(Item(itemID,amt)) player.inventory.remove(Item(itemID,amt))
player.inventory.add(Item(SPIRIT_SHARD,value * amt)) player.inventory.add(Item(SPIRIT_SHARD, floor(value * amt).toInt()))
player.interfaceManager.close(Component(644)) player.interfaceManager.close(Component(644))
return true return true
} }
private fun sendValue(itemID: Int, player: Player): Boolean{ private fun sendValue(itemID: Int, player: Player): Boolean{
val value = getValue(itemID) val value = getValue(itemID)
if(value == 0){ if(value == 0.0){
return false return false
} }
@@ -71,11 +72,14 @@ object BogrogPouchSwapper {
return true return true
} }
private fun getValue(itemID: Int): Int{ private fun getValue(itemID: Int): Double{
var item = SummoningPouch.get(itemID) var item = SummoningPouch.get(itemID)
var isScroll = false
if(item == null) item = SummoningPouch.get(Item(itemID).noteChange) if(item == null) item = SummoningPouch.get(Item(itemID).noteChange)
if(item == null) item = SummoningPouch.get(SummoningScroll.forItemId(itemID)?.pouch ?: -1) if(item == null) item = SummoningPouch.get(SummoningScroll.forItemId(itemID)?.pouch ?: -1).also { isScroll = true }
item ?: return 0 item ?: return 0.0
return ceil(item.items[item.items.size - 1].amount * 0.7).toInt() var shardQuantity = item.items[item.items.size - 1].amount * 0.7
if(isScroll) shardQuantity /= 20.0
return shardQuantity
} }
} }