Qhimm.com Forums

Final Fantasy 7 => Gameplay => Releases => Topic started by: Gemini on 2009-01-10 16:18:51

Title: [FF7PSX NTSC-U/C/PAL-UK] MDef bug fix
Post by: Gemini on 2009-01-10 16:18:51
Yesterday I made a very small patch (http://www.romhacking.net/hacks/501/) that corrects one of the most infamous bugs on this game: the spirit+m.def bug. Works for both NTSC U/C and PAL UK versions (see readme for specific compatibility).

Notice the difference? :-)
(http://i239.photobucket.com/albums/ff233/Geminimewtwo/Final%20Fantasy%20VII/bug-a-nugen.png)
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Kudistos Megistos on 2009-01-10 16:39:03
This looks promising; I'm going to try it. Of course, one can use wall market to add spirit to armour, but this way is much nicer and neater ;-)
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Gemini on 2009-01-10 16:48:20
But that's not hacking or fixing, it's cheating. :evil:
Title: Re: FFVII Psx bug fix? Here I provide
Post by: nfitc1 on 2009-01-12 17:00:25
But that's not hacking or fixing, it's cheating. :evil:

Boooo! I resent that. . . . . Actually, no I don't. You're absolutely right. :) This is a great development. Something that's been needed for a while. Can this be done for the PC version(s) as well?
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Gemini on 2009-01-12 18:25:21
Can this be done for the PC version(s) as well?
I think so, but since I'm no x86 hacker, I'll leave that to somebody else. :-P
Title: Re: FFVII Psx bug fix? Here I provide
Post by: gjoerulv on 2009-01-12 19:45:24
But that's not hacking or fixing, it's cheating. :evil:

You're right. It's not hacking or fixing, but making the exact same spr on equipment as mdef will have the exact same effect as this patch (unless I'm missing something :P). Good to see someone actually fixing this annoying bug!
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Tsetra on 2009-01-14 18:59:33
Same effect, really. This is just more of a... "proper?" way to do it, and looks cleaner since it doesn't jack your spirit up in the stat screen. Technically it can lead to a higher overall magic defense since you can stack M.Def over top of 255 spirit (if you collect the boosters), if for whatever reason you wanted to do that.

For those wanting a fix for the PC *cough* better *cough* version, Wall Market CAN be used without having to get into the nuts and bolts of the game, but it's a poor man's method. Spirit's only function is magic defense. M. Def is basically a second Spirit stat that combines with it for your over all defense against magic.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Kudistos Megistos on 2009-01-14 19:16:34
So, has anyone worked out how to make a PC version of this yet? I forgot to make ISOs of my FF7 PSX discs when I was home over Christmas *facepalm* and I don't take my PSX games to uni, so I can't really find out what it changes. Would making a PC fix be as easy as comparing the modded and unmodded files from the PSX game in a hex editor and then searching for the hex values that were changed in the PSX version in ff7.exe, or is that stupid, n00bish nonsense?
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Gemini on 2009-01-14 21:33:49
Psx and PC code are encoded into two entirely different binary languages (MIPS R3000 vs x86)... There is no way a simple search could lead to *anything*.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Kudistos Megistos on 2009-01-14 23:26:50
Oh dear. I was worried that something like that would be the case :-(
Title: Re: FFVII Psx bug fix? Here I provide
Post by: nfitc1 on 2009-01-15 13:22:29
The easiest way to find out how to fix it for the PC is to figure out where the armor is being equipped and follow that logic. Only thing is, I don't even know how to use debuggers. Can anyone suggest one? I've got one called IDA, but it's confusing.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Jonnylossus on 2009-01-15 19:23:15
The easiest way to find out how to fix it for the PC is to figure out where the armor is being equipped and follow that logic. Only thing is, I don't even know how to use debuggers. Can anyone suggest one? I've got one called IDA, but it's confusing.

Ollydbg?

http://www.ollydbg.de/

Afaik, it is used for cr...ing of programs.. Not sure though. :P
Title: Re: FFVII Psx bug fix? Here I provide
Post by: nfitc1 on 2009-01-15 20:38:01
I'm getting closer to finding the routine that updates the stats. I found the one that switches the Armor index for the character and the memory address that that's stored at, but now I have to find the actual MDef memory address and see what SHOULD be writing to that.

EDIT: The problem exists around binary address 0x1CE8F7. That's where it calls the function that (should) applies armors' MDef to the character. It uses that same function for Def, Def%, and MDef%. So the problem is probably in the set up or saving. That is between 0x1CE8F0 and the command at 0x1CE8FF where it writes memory to the word located at 0xBF7F3A.

That's as far as I got today. I'll try a little more later now that I found the location of the errant call (I think).
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Gemini on 2009-01-16 09:39:17
So the problem is probably in the set up or saving.
The function that applies M.Def takes 2 parameters, a first one that I never cared to look into, and a second one that determines which value to retrieve. 0 returns a strenght bonus, 1 is for vitality, while 2 and 3 return 0 no matter what. 2 is the one that corresponds to M.Def, so you have to add a case for that, and the procedure is pretty much similar to case 1. Taken from the readme of my patch:
Code: [Select]
.org 0x800104C4
spirit_fix:
  sll     v0, a3, 2
  addu    v0, a0
  lw      v1, 0(v0)       ; character id
  nop
  sll     v0, v1, 5       ; *132
  addu    v0, v1          ; --
  sll     v0, 2           ; --
  la      at, 0x8009C621  ; armor pointer
  addu    at, v0
  lbu     v1, 0(at)       ; armor id
  nop
  sll     v0, v1, 3       ; *36
  addu    v0, v1          ; --
  sll     v0, 2           ; --
  la      at, 0x80071D2B  ; pointer to spirit value
  addu    at, v0
  lbu     a2, 0(at)       ; load spirit
  j       @@return
  move    v0, a2
Title: Re: FFVII Psx bug fix? Here I provide
Post by: nfitc1 on 2009-01-16 12:09:09
It's the 2 that's causing the problem? I was focusing on the 1. This may be a problem with how it's stored in the armor data and displayed on the menu. In the menu it goes Def, Def%, MDef, then MDef% while in the data it's stored Def, MDef, Def%, MDef%.  It looked to me that the 0, 1, 2, and 3 were getting the data stored at (armormemoryaddress + ArmorIndex + EquippedArmorIndex * 36 + 2 + x)  then applying it to characterIDmemory + something. I'm still not sure what that something was. The function was often returning 0 in some AX register that doesn't show up in the general registers in my debugger. I'll try to follow it more closely today. I'll be able to look at it again in about an hour so I'll check it out then.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Gemini on 2009-01-16 12:37:55
It looked to me that the 0, 1, 2, and 3 were getting the data stored at (armormemoryaddress + ArmorIndex + EquippedArmorIndex * 36 + 2 + x)  then applying it to characterIDmemory + something.
0 takes data from just weapons, 1 from armors, 2 and 3 return a NULL value no matter what. Unless they changed the code for that function during the port process, but I doubt so.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: nfitc1 on 2009-01-16 15:08:55
It looked to me that the 0, 1, 2, and 3 were getting the data stored at (armormemoryaddress + ArmorIndex + EquippedArmorIndex * 36 + 2 + x)  then applying it to characterIDmemory + something.
0 takes data from just weapons, 1 from armors, 2 and 3 return a NULL value no matter what. Unless they changed the code for that function during the port process, but I doubt so.

OK, I see what you're saying now. What happens in this function is that it adds the weapon's atk to the character's strength to get the new attack power and stores it...somewhere (haven't looked into that yet). Then it takes the armor's Def and adds it to the players Vit to get the defense, but it never even looks at the MDef of the armor. For the other things, Atk%, Def%, and MDef% it just uses whatever the weapon/armor has for those values during damage calculation so those never really get stored anywhere on the characters' data. It's starting to make me wonder if there is even a place for "adjusted MDef" on the character's immediate data... That's something else to look into. *sigh* and I was hoping that it was just an incorrect pointer. :( It looks like just a small injection might work, but that gets hairy because all the absolute addresses would be changed.
You're right though. Passing 2 or 3 just makes it 0 it's other argument and return. Weird. Maybe at one point there were two accessory slots?

UPDATE: I've narrowed the problem down! The problem IS with that function. That function applies Equipment changes to the variables that damage calculation use for Atk, Def, MAtk, MDef and happens every time a weapon/armor/accessory is equipped.
This is what happens:

1. Character ID and update type (0-Atk; 1-Def; 2-MAtk; 3-MDef) is passed to this function
2. The function does one of four things depending on the update type:
      0. It gets the Weapon's Atk and assigns that number to a temporary Atk based on character ID which is later added to str to get the final attack
      1. It gets the Armor's Def and assigns that number to a temporary Def based on, etc.
      2. It does NOTHING. This is where MAtk WOULD get updated, but since no equipment modifies MAtk (might modify Magic stat instead) this is just skipped and always returns a 0.
      3. Same as #2

The case for update type 1 does this:
Code: [Select]
.text:006C51AD loc_6C51AD:                             ; CODE XREF: ApplyBonusStats+2Aj
.text:006C51AD                 mov     eax, [ebp+var_8]
.text:006C51B0                 mov     ecx, dword_919928[eax*4]
.text:006C51B7                 imul    ecx, 84h
.text:006C51BD                 xor     edx, edx
.text:006C51BF                 mov     dl, byte_DBFDA9[ecx]
.text:006C51C5                 imul    edx, 24h
.text:006C51C8                 xor     eax, eax
.text:006C51CA                 mov     al, byte_DBCCE2[edx]
.text:006C51D0                 mov     [ebp+var_4], eax
.text:006C51D3                 jmp     short loc_6C51E5

The case for update type 3 SHOULD be this: (ignore the addresses, it shouldn't overwrite condition 1)
Code: [Select]
.text:006C51AD loc_6C51AD:                             ; CODE XREF: ApplyBonusStats+2Aj
.text:006C51AD                 mov     eax, [ebp+var_8]
.text:006C51B0                 mov     ecx, dword_919928[eax*4]
.text:006C51B7                 imul    ecx, 84h
.text:006C51BD                 xor     edx, edx
.text:006C51BF                 mov     dl, byte_DBFDAE[ecx]
.text:006C51C5                 imul    edx, 24h
.text:006C51C8                 xor     eax, eax
.text:006C51CA                 mov     al, byte_DBCCE3[edx]
.text:006C51D0                 mov     [ebp+var_4], eax
.text:006C51D3                 jmp     short loc_6C51E5
but of course, it's not. This would require replacing a 7-byte statement with a 40 byte block. I don't know how to safely inject code so it might be better to do it your way, Gemini. An absolute jump to anywhere takes 5 bytes so either followed by two no-ops, or a re-targeted relative jump. So point me to an unused spot in the executable and I can fix it for ya. XD Of course, I'll have to test this theory out.


NEW UPDATE: I have successfully patched the PC executable to account for the MDef of the Armor! See proof (http://img49.imageshack.us/img49/5681/ff7sprfixaz3.png). I have submitted my changes to dziugo who will make it compatible with YAMP. Hopefully, it'll be done this weekend.
I did end up using Gemini's method because code injection's a pain to attempt and this worked just fine. I haven't tested it in battle yet because I don't have a very suitable save to test it. Anyone want to donate a save with the airship and normal stats so I CAN test it?
Title: Re: FFVII Psx bug fix? Here I provide
Post by: The Seer of Shadows on 2009-01-18 01:09:05
@ Gemini and NFITC1: Wonderful!  This'll be great!  Though imo, unless you've modded the scene to make the enemies harder, this just makes an already-too-easy game even easier.  Still, at least now there's actually a good reason to equip certain armor such as that Wizard Bracelet.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: nfitc1 on 2009-01-18 03:13:16
@ Gemini and NFITC1: Wonderful!  This'll be great!  Though imo, unless you've modded the scene to make the enemies harder, this just makes an already-too-easy game even easier.  Still, at least now there's actually a good reason now to equip certain armor such as that Wizard Bracelet.

I was thinking this too after I got it to work. There was a difference done, but it wasn't great. The magic attack has to be powerful in order for it to be very devastating. Barret with 34 Spirit was attacked with Fire3 by Cloud who had a magic of 255 (teehee). He took around 7300 damage wearing the Bronze Bangle (0 MDef) and around 6200 dmg wearing the Wizard Bracelet (85 MDef). I thought the patch wasn't working right until I remembered that the Wizard Bracelet and most weapons increase the Magic stat. :) So now the PC version (at least the v1.02 US version) has a fix for it!
I just left a message with dziugo saying that his YAMP patch worked. So we'll probably get an additional patch for it soon. I've got a link, but I don't know if he wants me to share that one or not. We'll know soon, I hope.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: s-h-a-d-o-w on 2009-02-04 13:24:52
Hi @ all,

First of all i must thank you for the great work!

Second one is a favour i ask for, becouse i`m from germany i use the PAL/German version of the game and the patch PAL/US didn`t work. The game simply ignore it....
Well to simply ask you people to make it work for me isnt me style so i hope you can help me a little to try it my self eg. let me know whot file i have to edit ore some hintes for the adress to look for it.

Many thx in advance to you guy`s

Shadow
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Chrysalis on 2009-05-09 04:13:21
guys no idea on the yamp patch yet? code done months ago.

Would love this fix.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: nfitc1 on 2009-05-11 04:55:37
guys no idea on the yamp patch yet? code done months ago.

Would love this fix.

Topic for YAMP patch made months ago (http://forums.qhimm.com/index.php?topic=8158.0).
Title: Re: FFVII Psx bug fix? Here I provide
Post by: learner on 2011-06-14 09:50:31
Yesterday I made a very small patch (http://www.romhacking.net/hacks/501/) that corrects one of the most infamous bugs on this game: the spirit+m.def bug. Works for both NTSC U/C and PAL UK versions (see readme for specific compatibility).

Notice the difference? :-)
(http://i239.photobucket.com/albums/ff233/Geminimewtwo/Final%20Fantasy%20VII/bug-a-nugen.png)

from what i see you didn't make a very small patch. you have the ntsc u/c and pal, yet you don't have for ntsc -j! you gotta be kidding me!! for a playstation guru like you that would leave a missing piece behind is something very unusual i say. yeah it is a good patch but we all knew you can do much better. it was very easy for you to make this kind of patch and yet being lazy to do the patch for the international version is somehow very downgrading on your part. i don't like to be antagonistic but if anyone here is as smart as you, we would put a waste on our part do have it complete. why? first of all we all breathe the same air. yes you are greatly smart but if you don't be humble enough i say you making a fool out of yourself. i don't care if the admins kick me in this forum or what. you can't be proud of something that is incomplete.

that's all!
Title: Re: FFVII Psx bug fix? Here I provide
Post by: obesebear on 2011-06-14 10:03:37
from what i see you didn't make a very small patch. you have the ntsc u/c and pal, yet you don't have for ntsc -j! you gotta be kidding me!! for a playstation guru like you that would leave a missing piece behind is something very unusual i say. yeah it is a good patch but we all knew you can do much better. it was very easy for you to make this kind of patch and yet being lazy to do the patch for the international version is somehow very downgrading on your part. i don't like to be antagonistic but if anyone here is as smart as you, we would put a waste on our part do have it complete. why? first of all we all breathe the same air. yes you are greatly smart but if you don't be humble enough i say you making a fool out of yourself. i don't care if the admins kick me in this forum or what. you can't be proud of something that is incomplete.

that's all!
Quit whining, you're only embarassing yourself.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: learner on 2011-06-14 11:33:11
Quit whining, you're only embarassing yourself.

what do u expect on a 12 year old? who has been bullied by that so called playstation guru
Title: Re: FFVII Psx bug fix? Here I provide
Post by: ultima espio on 2011-06-14 12:49:04
If you're 12 then you shouldnt be on forums in the first place.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: learner on 2011-06-14 14:05:58
Edit: Crap! Edited rather than quoted AGAIN - Bosola

hate being discriminated by people with the same interest because i'm young...

well if that's so let the admin ban me from this forum... that so called playstation guru is nothing but i think a italiano liar. i bet someone else made that patch. if it's truly his why can't he teach me how or make the patch complete at the very first place? instead he replied to me as if he is a deity or something. well he was a crap to be exact.

at the very first place i join this forum to learn how to fix bugs and editing final fantasy vii game. well if that's not ok then the admin should have not let me join this forum.

it looks like whoever espio you are make your own rules. or if you are one of the admins, i say that you guys made a forum and don't know what synergy means!

shame on this forum!
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Raestloz on 2011-06-14 14:28:57
>:(

hate being discriminated by people with the same interest because i'm young...

You ever seen kids being a world leader?

Thought so

There's a reason why the old are the rulers kid. They know how to read Terms of Service

(http://i232.photobucket.com/albums/ee187/Raestloz/Capture-7.jpg)
otherwise known as Common Sense


It's not like your problem with whomever it is you have problem with is THAT interesting. Take your personal problems somewhere personal. If you have to revive a 2 years old thread just to piss someone off you need to rethink the whole idea. Extra points if he didn't realize that you posted something here
Title: Re: FFVII Psx bug fix? Here I provide
Post by: sl1982 on 2011-06-14 15:57:28
>:(

hate being discriminated by people with the same interest because i'm young...

well if that's so let the admin ban me from this forum... that so called playstation guru is nothing but i think a italiano liar. i bet someone else made that patch. if it's truly his why can't he teach me how or make the patch complete at the very first place? instead he replied to me as if he is a deity or something. well he was a crap to be exact.

at the very first place i join this forum to learn how to fix bugs and editing final fantasy vii game. well if that's not ok then the admin should have not let me join this forum.

it looks like whoever espio you are make your own rules. or if you are one of the admins, i say that you guys made a forum and don't know what synergy means!

shame on this forum!

Stop trying to cause trouble. Gemini is under no obligation to provide you with anything, be it assistance or programs. I dont care if you are 12 or not. We hold everyone here to a certain standard. Now enjoy your stay, stop being an ass and everything will be fine. If not your stay will be short. Last warning.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Bosola on 2011-06-14 18:13:20
Quote
well if that's so let the admin ban me from this forum...

I have no time for 'ban me if you dare' antics. Don't even bother.

Quote
that so called playstation guru is nothing but i think a italiano liar. i bet someone else made that patch. if it's truly his why can't he teach me how or make the patch complete at the very first place?

Because he's tired of being accosted by clueless newbies who can't do their own research and expect him to teach them ASM development from scratch?

Quote
at the very first place i join this forum to learn how to fix bugs and editing final fantasy vii game. well if that's not ok then the admin should have not let me join this forum.

That is fine. Bumping threads for BAWWW is not. Cut it out.

Quote
shame on this forum!

If you have a problem with this forum, the 'logout' button is on the right hand side of your main control bar. If you don't log out, I'll assume that means you've settled down and learned to deal with people like Gemini being rude to you from time to time.

Now, as for learning what to do, I would suggest using google to gain some resources on learning how to develop in assembly language. I would work on the PC build, as that's written in x86, which a lot of tutorials will cater for.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: -Ric- on 2011-06-14 19:54:25
from what i see you didn't make a very small patch. you have the ntsc u/c and pal, yet you don't have for ntsc -j! you gotta be kidding me!! for a playstation guru like you that would leave a missing piece behind is something very unusual i say. yeah it is a good patch but we all knew you can do much better. it was very easy for you to make this kind of patch and yet being lazy to do the patch for the international version is somehow very downgrading on your part. i don't like to be antagonistic but if anyone here is as smart as you, we would put a waste on our part do have it complete. why? first of all we all breathe the same air. yes you are greatly smart but if you don't be humble enough i say you making a fool out of yourself. i don't care if the admins kick me in this forum or what. you can't be proud of something that is incomplete.

that's all!

instead of bumping 2 years old topic and bitching about something being "incomplete" u could either create a new topic or pm the creator and properly request for a fix on the ntsc-j version... u should be thankful that a PAL/NTSC version is released.. since he has no obligation of releasing anything.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: Gemini on 2011-06-15 01:03:33
Guys, he's been posting the same bullshit for over 6 months. Do yourself a favor and put him in ignore list, your eyes will appreciate a lot.
Title: Re: FFVII Psx bug fix? Here I provide
Post by: learner on 2011-06-25 22:09:14
Guys, he's been posting the same bullsh*t for over 6 months. Do yourself a favor and put him in ignore list, your eyes will appreciate a lot.

LIAR!

i was here "2011-02-16 16:17:15" ! 6 months you make me laugh. don't worry i got a glimpse on your readme at your translation package and i more understand what you said on your package.rar than giving me the codes and cursing me here and there.

hope that your happy now.

you should give me that package.rar in the very first place if your attitude stinks.

Another content-free, antagonistic post. Warned. - Bosola
Title: Re: [REL/FF7/PSX] FFVII Psx bug fix
Post by: vayneruel on 2011-11-12 18:51:33
This patch does not work in the Spanish version. Someone could tell me how to create it? Gemini did not bother to answer.
Title: Re: [REL/FF7/PSX] FFVII Psx bug fix
Post by: Gemini on 2011-11-13 10:24:03
Enough of people not reading the goddamn readme. The thing is there for a f*cking reason, even with documentation and explanations. If you can't understand this simple concept then you won't be able to create a patch for it, EVER.
Title: Re: [REL/FF7/PSX] FFVII Psx bug fix
Post by: DLPB_ on 2011-11-13 12:53:53
 8)  I have tried everything but readme's don't get read.  I will ignore people from now on.  let someone else waste their time.
Title: Re: [REL/FF7/PSX] FFVII Psx bug fix
Post by: vayneruel on 2011-11-13 13:44:05
I understand, but which  is the file and what program uses to open that file?. I HAVE READ THE README and do not specify much, just like putting the patch and a text with what needs to change
change, that file must be changed?, which program should I use?I sent several mp, But only answered one to say that the patch will stay that way, you says , I was alone, that is the help that you lent
Title: Re: [REL/FF7/PSX] FFVII Psx bug fix
Post by: Gemini on 2011-11-13 22:21:17
I will ignore people from now on.
Same for me, every single request on how to make patches for other regions will be ignored. I have enough of people who don't even get how assembly hacks work and want to create patches out of their magical butts. Plus, if moderators could please lock this topic forever I'd appreciate, there isn't really anything else to be stated here.
Title: Re: [REL/FF7/PSX] FFVII Psx bug fix
Post by: vayneruel on 2011-11-13 22:30:27
Just ask for some help. Only want to know what program to use to open the file SCES_009.00, is so hard to tell me that?
Title: Re: [REL/FF7/PSX] FFVII Psx bug fix
Post by: Vgr on 2011-11-13 22:42:43
Personnally, I try to be as nice as possible with newbies, but this isn't always easy. Recently I got ruder because I really got annoyed of them. I did not release anything but I still get requests for some stuff...

Also, while regular members like the Staff members, DLPB or myself see these kinds of requests, we are wondering if they are kidding us, sometimes.

And now, I will put up an answer for everything people ask :

To edit anything, use an hex-editor.
To answer any question, ask Google.
To make any request, use your eyes, not your fingers.
Title: Re: [REL/FF7/PSX] FFVII Psx bug fix
Post by: vayneruel on 2011-11-13 22:59:27
Ok Vgr , I will not ask nothing, congratulations for your patch Gemini.
Title: Re: [REL/FF7/PSX] FFVII Psx bug fix
Post by: sl1982 on 2011-11-14 01:33:50
Same for me, every single request on how to make patches for other regions will be ignored. I have enough of people who don't even get how assembly hacks work and want to create patches out of their magical butts. Plus, if moderators could please lock this topic forever I'd appreciate, there isn't really anything else to be stated here.

Granted.