Jump to content

Recommended Posts

Posted
3 minutes ago, Fraying9981 said:

whats the difference between deb_msg and msg notify?

 

All logging output goes to your Skyrim logging folder, appended to "sl-triggers.log". The file "sl-triggers.log" gets truncated (emptied) each time you run Skyrim, so it shouldn't "get too big" in the sense of only ever appending. If you want to save any output, you'll need to copy it before your next game launch.

 

deb_msg:

- primarily intended for purely back-end development; you as a scripter can use it as well

- prepends any text it outputs with "DebMsg> "

- concatenates all parameters as strings

- sends it to the plugin for DEBUG logging

 

msg_notify

- primarily intended to display messages in-game to the notification area (using https://ck.uesp.net/wiki/Notification_-_Debug)

- does not prepend anything to text

- concatenates all parameters as strings

- calls Debug.Notification() with the output

- sends it to the plugin for INFO logging

 

=================

 

Also, v125 is posted. @alain31, the bug with FormID resolution should be fixed. 

 

Speaking of FormIDs, I have created a wiki page about how Forms and FormIDs can be used: https://github.com/lynnpye/sl_triggers/wiki/Forms-and-FormIDs

 

It also includes a couple of new system variables, $system.forms.gold and $system.core.is_player.in_combat. The first returns the Form for gold/septims. Useful (for me) for some simple testing. The second returns true/false depending on the player's combat state (in/out of combat).

 

And finally... the new triggers for "Player Location Change", "Player Equipment Change", "Player Combat State Change", and "Player On Hit" are added. I have not had a chance to test them much, as I wanted to push the FormID resolution bugfix out, but the events *should* be wired up, the MCMs *should* be capable of setting up the triggers, and while I did not test it as much as I wanted, I did get some testing in with the first two.

 

Finally, let me know if you are still experiencing problems with the ghost chaser getting involved in defeat scenarios.

Posted (edited)
19 minutes ago, hextun said:

deb_msg:

- primarily intended for purely back-end development; you as a scripter can use it as well

- prepends any text it outputs with "DebMsg> "

- concatenates all parameters as strings

- sends it to the plugin for DEBUG logging

 

so this is not visible in game right?

 

19 minutes ago, hextun said:

the new triggers for "Player Location Change", "Player Equipment Change", "Player Combat State Change", and "Player On Hit" are added

 

this is amazing. is it possible to get the weapon used to hit/the actor hitting the player?

 

also wanted to ask: is there a way to get the tag without doing sl_hastag -> true/false? this can lead to forests of ifs...

Edited by Fraying9981
Posted

The "deb_msg" output would not be visible in-game at all, no. It is only output to the sl-triggers.log.

 

4 minutes ago, Fraying9981 said:

this is amazing. is it possible to get the weapon used to hit/the actor hitting the player?

 

also wanted to ask: is there a way to get the tag without doing sl_hastag -> true/false? this can lead to forests of ifs...

 

"Amazing". We like "amazing". Yes, "amazing" works. And not adding the weapon/projectile to the request context was an oversight. Noted for next update.

 

There can be multiple tags, so anything that returns them would either need to return a count and have an accessor, like GetNthTag()... or I need to suck it up and set up list support. :) 

Posted
53 minutes ago, alain31 said:

Hello,

It still doesn't work for me. Here's my JSON file plus the log.
Can you tell me where i went wrong?
Thanks in advance.

 

sl-triggers.log 58.17 kB · 0 downloads Face Cum SMP.json 373 B · 0 downloads

 

Ah! Welcome to SLTR! First, consider having a look at the wiki. Relevant here is the Scripts page, particularly the section on 'system' scoped variables. Well, and the fact that we have scopes for our variables now

 

In your case, as part of the move to SLTR, you'll need to convert uses of "$player" to "$system.player". 

 

However, I want to point out that I had left in JSON support but it's been deprecated in preference to SLTScript, which is just a text file instead of JSON. I have created regression tests that I run to make sure features continue to work; but I never created them for JSON, nor have I tried to run a JSON script in some time.

 

I see in your logs the following output which tells me that JSON support, without me attending to it, is now officially very, very broken:

 

[2025-07-14 15:11:25.794] [log] [warning] [util.cpp:472] GetForm: invalid form specifier ()
[2025-07-14 15:11:25.795] [log] [error] [sl_triggers.cpp:344] SLTR:(../sl_triggers/commands/Anal Cum SMP.json)[3]: Form not found ()
[2025-07-14 15:11:25.795] [log] [error] [sl_triggers.cpp:344] SLTR:(../sl_triggers/commands/Anal Cum SMP.json)[3]: unable to resolve ITEM with FormId ($1)

 

Note: this isn't your fault; I'm saying what you wrote is valid JSON and without having tested it, and with the change to use '$system.player', I would have expected it to work but can see now that it won't.

Basically, where you attempt to call 'item_equip' with variable '$1', my parser (which again, I've not been testing against JSON) is now treating that as a string literal, and not as a variable name. I'll take a look to see how easy it will be to make it work or whether to declare JSON support ended, but in the meantime, I've converted your script to the new SLTScript format:

 

; line comments
set $predator_item_804 "[predator] liquid pack v2.esp:0x804" ; also at the end of a line

; it looks like you never used this variable in your original script
set $predator_item_811 "[predator] liquid pack v2.esp:0x811"

item_equip $system.player $1 0 1

; this is the new label format, you don't need this for your script, just showing you
goto [skip_the_bad_goto_loop]
[a label]
; and a goto using that label
goto [a label]
[skip_the_bad_goto_loop]

; whitespace is ignored
actor_qnnu                   $system.player

util_wait 600

item_unequipex $system.player $predator_item_804 0
item_remove $system.player $predator_item_804 1 1


I have not tested it, but it looks fit for purpose. Remove the extra bit in the middle with the labels. The script will ignore it but still would process it, so removing it is necessary for efficiency. I only added it because it's one of the more non-obvious changes (label format) between JSON and SLTScript.

 

But basically you would take what you ordinarily would do for JSON, remove the JSON parts, leave "proper strings" in quotes but otherwise leave variable names, ints, floats, bools bare. If you happen to choose Notepad++ or VSCode to edit SLTScript, I have provided some support files to provide syntax highlighting and simple code folding .

Posted
52 minutes ago, hextun said:

I've converted your script to the new SLTScript format:

It's nice of you to take the time to answer me :)
Yes, i did add an element, 811, that wasn't there originally.
It's a JSON file i got from the SL Trigger forum.
I don't understand anything about scripting )=
Can you make me a ready-to-use file for the two elements of the JSON?
I'll try to use that as an example with the other two i have left.

 

I cant share the .sltscript format here...

; line comments
set $predator_item_804 "[predator] liquid pack v2.esp:0x804" ; also at the end of a line

; it looks like you never used this variable in your original script
set $predator_item_811 "[predator] liquid pack v2.esp:0x811"

item_equip $system.player $1 0 1

; whitespace is ignored
actor_qnnu                   $system.player

util_wait 600

item_unequipex $system.player $predator_item_804 0
item_remove $system.player $predator_item_804 1 1

Posted
51 minutes ago, Fraying9981 said:

how do you add xp that counts towards a certain skill tree? I'm not looking for adding perk points.
let's say i want to add 14xp, counting as speechraft exp

 

actor_advskill (which wraps Game.AdvanceSkill) is what you want. Per the CK docs it only works on the Player and has this to say:

  • asSkillName: The Skill to progress.
  • afMagnitude: The amount by which the skill progress will be advanced. This is in Skill Usage amounts, so it will count towards skill progression but won't necessarily change the Skill itself. The amount must be positive. If the new amount exceeds the skill's level threshold, the skill will advance, and possibly level up. This amount is automatically modified by any active effects such as a Guardian Stone.

 

There is also actor_incskill (which wraps Game.IncrementSkillBy) which also says it only works on the Player and which, if I'm not mistaken, literally adds directly to the skill (i.e. from Enchanting 14 to Enchanting 15) vs, as with advskill, "skill usage amounts":

  • asSkillName: The Skill to teach to the player.
  • aiCount: The number of points to advance the skill.
Posted
5 minutes ago, hextun said:

 

actor_advskill (which wraps Game.AdvanceSkill) is what you want. Per the CK docs it only works on the Player and has this to say:

  • asSkillName: The Skill to progress.
  • afMagnitude: The amount by which the skill progress will be advanced. This is in Skill Usage amounts, so it will count towards skill progression but won't necessarily change the Skill itself. The amount must be positive. If the new amount exceeds the skill's level threshold, the skill will advance, and possibly level up. This amount is automatically modified by any active effects such as a Guardian Stone.

 

There is also actor_incskill (which wraps Game.IncrementSkillBy) which also says it only works on the Player and which, if I'm not mistaken, literally adds directly to the skill (i.e. from Enchanting 14 to Enchanting 15) vs, as with advskill, "skill usage amounts":

  • asSkillName: The Skill to teach to the player.
  • aiCount: The number of points to advance the skill.

 

thanks I'm looking for sth like this (I need xp, not points). is it available?

 

image.png.aae2a5d442a9f893b1665d59008caf28.png

 

 

Posted

@guliguliradish moving 

this discussion to my forum to not spam Fotogen with support for something they aren't responsible for.

 

Here is a quick conversion I whipped up. Note the section where I point out I lack enough FormIDs. You can complete that section's comments and then follow the same pattern for anim2-anim8, changing the value that is being set into $formID.

 

Spoiler
sl_animname
set $animname $$
		
if $animname == "Kziitd_Missionary"		[anim1]
if $animname == "Kziitd_Doggy"			[anim2]
if $animname == "Kziitd_Cowgirl"		[anim3]
if $animname == "Kziitd_Laying"			[anim4]
if $animname == "Kziitd_Laying2"		[anim5]
if $animname == "Kziitd_Stand"			[anim6]
if $animname == "Kziitd_Missionary2"	[anim7]
if $animname == "Kziitd_Laying3" 		[anim8]

goto [done]

; What are the FormIDs for the items you want worn, and which animation goes with which item?
; 0x00??? - KFT???
; 0x00??? - KFT???
; 0x0088C - KFTlegrope 
; 0x00??? - KFT???
; 0x00??? - KFT???
; 0x00??? - KFT???
; 0x00??? - KFT???
; 0x00??? - KFT???

[anim1]
; KFTlegrope? I don't know which goes where? plus the list above is incomplete or I'm missing something
set $formID 0x0088C
set $newWornItem $"KXT-GuliExtensions.esp:{formID}"
goto [dowork]

[anim2]
; so here, do you want something other than KFTlegrope? Is it matched per animation?
; if you want different items for each animation, you need to set the formID for each block of code
; but this whole script should be changed if all animations will always apply the same item
set $formID 0x0088C
set $newWornItem $"KXT-GuliExtensions.esp:{formID}"
goto [dowork]

[anim3]
; so here, do you want something other than KFTlegrope? Is it matched per animation?
; if you want different items for each animation, you need to set the formID for each block of code
; but this whole script should be changed if all animations will always apply the same item
set $formID 0x0088C
set $newWornItem $"KXT-GuliExtensions.esp:{formID}"
goto [dowork]

[anim4]
; so here, do you want something other than KFTlegrope? Is it matched per animation?
; if you want different items for each animation, you need to set the formID for each block of code
; but this whole script should be changed if all animations will always apply the same item
set $formID 0x0088C
set $newWornItem $"KXT-GuliExtensions.esp:{formID}"
goto [dowork]

[anim5]
; so here, do you want something other than KFTlegrope? Is it matched per animation?
; if you want different items for each animation, you need to set the formID for each block of code
; but this whole script should be changed if all animations will always apply the same item
set $formID 0x0088C
set $newWornItem $"KXT-GuliExtensions.esp:{formID}"
goto [dowork]

[anim6]
; so here, do you want something other than KFTlegrope? Is it matched per animation?
; if you want different items for each animation, you need to set the formID for each block of code
; but this whole script should be changed if all animations will always apply the same item
set $formID 0x0088C
set $newWornItem $"KXT-GuliExtensions.esp:{formID}"
goto [dowork]

[anim7]
; so here, do you want something other than KFTlegrope? Is it matched per animation?
; if you want different items for each animation, you need to set the formID for each block of code
; but this whole script should be changed if all animations will always apply the same item
set $formID 0x0088C
set $newWornItem $"KXT-GuliExtensions.esp:{formID}"
goto [dowork]

[anim8]
; so here, do you want something other than KFTlegrope? Is it matched per animation?
; if you want different items for each animation, you need to set the formID for each block of code
; but this whole script should be changed if all animations will always apply the same item
set $formID 0x0088C
set $newWornItem $"KXT-GuliExtensions.esp:{formID}"
goto [dowork]


[dowork]
item_adduse $system.self $newWornItem 0 0
util_waitforend
item_remove $system.self $newWornItem 1 1


[done]

 

 

And welcome aboard! :)

Posted
12 minutes ago, Fraying9981 said:

 

thanks I'm looking for sth like this (I need xp, not points). is it available?

 

image.png.aae2a5d442a9f893b1665d59008caf28.png

 

 

 

 

Well, from the Creation Kit documentation for Game.AdvanceSkill:

 

Function AdvanceSkill(string asSkillName, float afMagnitude) native global

 

So that second parameter is definitely expecting a float.

 

Ironically, it turns out there is currently a bug in my code (which I have just fixed and it will go out next release) where, in fact, that parameter gets translated into a int instead of a float, which is frankly pretty hilarious. But the actual API call is expecting a float. In the meantime, however, I think it would probably still work for you even with the 'int' coercion (i.e. unless you intended to add skill xp in increments less than 1), and given these are "skill usage" increments, where it can take hundreds or thousands to gain a rank depending on which skill and which level you are in it, for now the int coercion will probably not be noticeable.

Posted
1 hour ago, alain31 said:

It's nice of you to take the time to answer me :)
Yes, i did add an element, 811, that wasn't there originally.
It's a JSON file i got from the SL Trigger forum.
I don't understand anything about scripting )=
Can you make me a ready-to-use file for the two elements of the JSON?
I'll try to use that as an example with the other two i have left.

 

I cant share the .sltscript format here...

; line comments
set $predator_item_804 "[predator] liquid pack v2.esp:0x804" ; also at the end of a line

; it looks like you never used this variable in your original script
set $predator_item_811 "[predator] liquid pack v2.esp:0x811"

item_equip $system.player $1 0 1

; whitespace is ignored
actor_qnnu                   $system.player

util_wait 600

item_unequipex $system.player $predator_item_804 0
item_remove $system.player $predator_item_804 1 1

 

Here are 3 options:

 

Option 1: Hard-coded

Spoiler
;;;;;;;;;;;;;;;;;;;
; Option 1: hard coded
; In this scenario, save this script as e.g. "pred_804.sltscript"
; Then for other predator items, copy the script, rename it, and edit this line
set $predator_item "[predator] liquid pack v2.esp:0x804"

; the rest remains the unchanged
item_equip $system.player $predator_item 0 1
actor_qnnu $system.player
util_wait 600
item_unequipex $system.player $predator_item 0
item_remove $system.player $predator_item 1 1

 

 

Option 2: Randomized (not sure you want this)

Spoiler
;;;;;;;;;;;;;;;;;;;
; Option 2: random
; In this scenario, save this script as e.g. "pred_random.sltscript"
; When used it will choose from a random list
set $predator_item_804 "[predator] liquid pack v2.esp:0x804"
set $predator_item_811 "[predator] liquid pack v2.esp:0x811"
; add more here if you like
set $predator_item resultfrom rnd_list $predator_item_804 $predator_item_811 ; etc..

; the rest remains the unchanged
item_equip $system.player $predator_item 0 1
actor_qnnu $system.player
util_wait 600
item_unequipex $system.player $predator_item 0
item_remove $system.player $predator_item 1 1

 

 

Option 3: Use "call" in a separate script, to keep all of the "predator_items" in one script.

In this option, you save the main script to something like "pred_call.sltscript" and won't actually use that script from triggers. Instead you would be able to target other scripts from the trigger and in those scripts "call" 'pred_call'.  Useful if you might want to apply this logic from multiple other scripts and want to keep it all in one place.

 

Spoiler
;;;;;;;;;;;;;;;;;;;
; Option 3: called script
; In this scenario, save this script as e.g. "pred_call.sltscript"
; You won't use it directly. Instead, in other scripts you can "call" 'pred_call' and it will 
; use the requested item and perform the action.
set $predator_item_804 "[predator] liquid pack v2.esp:0x804"
set $predator_item_811 "[predator] liquid pack v2.esp:0x811"
; add more here if you like

; set a default, just in case
set $predator_item $predator_item_804

callarg 0 $pred_item_index
if $pred_item_index == 804
	set $predator_item $predator_item_804
elseif $pred_item_index == 811
	set $predator_item $predator_item_811
; elseif ... etc.
endif

; the rest remains the unchanged
item_equip $system.player $predator_item 0 1
actor_qnnu $system.player
util_wait 600
item_unequipex $system.player $predator_item 0
item_remove $system.player $predator_item 1 1

 

 

Then in another "calling" script, e.g. "maybe_I_do_pred_stuff.sltscript"

Spoiler
;; then, in an ENTIRELY DIFFERENT SCRIPT, e.g. from, say, "maybe_calls_pred.sltscript"
set $pred_index 811 ; different default than 'pred_call'
; do something that might set $pred_index
; then call 'pred_call'
call "pred_call" $pred_index
; this should load 'pred_call.sltscript', passing $pred_index as callarg 0, and setting $predator_item appropriately

 

 

If your case really is just "there are 8 different triggers I may want to set up one-to-one with each item" then stick with Option 1 as it is by far the most efficient; you'll just have one script per item. In small bunches like this, it's not likely to lead to things getting out of sync. :)

Posted
50 minutes ago, hextun said:

 

 

Well, from the Creation Kit documentation for Game.AdvanceSkill:

 

Function AdvanceSkill(string asSkillName, float afMagnitude) native global

 

So that second parameter is definitely expecting a float.

 

Ironically, it turns out there is currently a bug in my code (which I have just fixed and it will go out next release) where, in fact, that parameter gets translated into a int instead of a float, which is frankly pretty hilarious. But the actual API call is expecting a float. In the meantime, however, I think it would probably still work for you even with the 'int' coercion (i.e. unless you intended to add skill xp in increments less than 1), and given these are "skill usage" increments, where it can take hundreds or thousands to gain a rank depending on which skill and which level you are in it, for now the int coercion will probably not be noticeable.

 

 

thanks. i was confused actually but your great documentation cleared the ambiguity that this was xp points and not skill tree points

 

; Advance the given skill progress (Skill XP) on the player by the provided amount
Game.AdvanceSkill("Marksman", 50.0)
Posted
47 minutes ago, hextun said:
What are the FormIDs for the items you want worn, and which animation goes with which item?

Yes, all animations only correspond to one item, and from anim1 to anim8, select 'legrope'

 

58 minutes ago, hextun said:
KFTlegrope? I don't know which goes where? plus the list above is incomplete or I'm missing something

Please allow me to provide a more specific description. KxtGuliExtension is my mod, and "legrope" is the item I created for the "kziitd animation" because all eight animations feature "frog leg poses". So, I hope this item only appears when playing these eight animations and disappears after the animation ends.

SkyrimSpecialEdition2025_7_151_51_26.png.b6f4011b6269432ca9500771d3540f08.png

 

 

So the only item is:KXT-GuliExtensions.esp (C66B199B) \ Armor \ 0800088C <KFTlegrope>

 

And...If possible, please also let me know how to set up MCM (forgive my poor understanding)

Posted
36 minutes ago, guliguliradish said:

Yes, all animations only correspond to one item, and from anim1 to anim8, select 'legrope'

 

Please allow me to provide a more specific description. KxtGuliExtension is my mod, and "legrope" is the item I created for the "kziitd animation" because all eight animations feature "frog leg poses". So, I hope this item only appears when playing these eight animations and disappears after the animation ends.

SkyrimSpecialEdition2025_7_151_51_26.png.b6f4011b6269432ca9500771d3540f08.png

 

 

So the only item is:KXT-GuliExtensions.esp (C66B199B) \ Armor \ 0800088C <KFTlegrope>

 

And...If possible, please also let me know how to set up MCM (forgive my poor understanding)

 

No worries, we're working together to figure it out. :)

 

So, here is the script I think you want. It compares the animation name to each of the animations you are interested in. If it matches any of them, it jumps to the work section with a hard coded item FormID. If it doesn't match any, it returns, leaving the script.

 

Spoiler
sl_animname
set $animname $$
		
if $animname == "Kziitd_Missionary"		[dowork]
if $animname == "Kziitd_Doggy"			[dowork]
if $animname == "Kziitd_Cowgirl"		[dowork]
if $animname == "Kziitd_Laying"			[dowork]
if $animname == "Kziitd_Laying2"		[dowork]
if $animname == "Kziitd_Stand"			[dowork]
if $animname == "Kziitd_Missionary2"	[dowork]
if $animname == "Kziitd_Laying3" 		[dowork]

; not any of those animations, leave
return


[dowork]
set $newWornItem $"KXT-GuliExtensions.esp:0x0088C"
item_adduse $system.self $newWornItem 0 0
util_waitforend
item_remove $system.self $newWornItem 1 1

 

 

Posted

hey, what do you think is the best option to do the following: keystroke triggers bonus enjoyment/stamina points reduction?

 

1. sexlab start trigger -> wait until using util_waitforkbd

for example:

[hotkey_loop]

; Wait for specified keys - Using mouse buttons, arrow key and K/L
; Left Mouse=256, Right Mouse=257, Up Arrow=72, K=37, L=38
util_waitforkbd 256 257 72 37 38

2. use keystroke trigger -> check if player in SL scene

Posted

For that case, I'd say the first option.

 

util_waitforkbd is implemented by registering for the keys, then sitting in a loop, waiting 0.5 seconds at a time, until one of the keys you registered was pressed (or until the scene ends in the context of SexLab). You can spam the keys in question and all that will happen is in 0.5 seconds, if you pressed one of the correct keys, that key stroke will be processed. The overhead for loading a script has been performed and you're just doing processing.

 

In the second option, you accrue the script load overhead for every single keystroke. Not good for things you think you might spam (which, hey, in the thick of things, who knows how quickly you might tap the enjoyment modification keys?).

 

 

Posted
1 hour ago, Fraying9981 said:

how do you activate logging?
I can't find the SLT log file to check for errors

Go to your documents folder. There should be a My Games folder. Then Skyrim Special Edition folder. Then a SKSE folder. sl-triggers.log should be there

Posted (edited)
10 hours ago, hextun said:

Go to your documents folder. There should be a My Games folder. Then Skyrim Special Edition folder. Then a SKSE folder. sl-triggers.log should be there

 

thanks. I was looking to activate it. I guess I needed to check enable debugging in the options first.

 

I had another question regarding triggers:

What's the normal way of setting up a trigger for:

- SL start

- consensual

- female PC

 

Here is what I'm doing:

- Begin

- Player: Player

- Role: not part of a rape (I'm using this because I have one for noncon, for which I'm using victim => I need to differentiate scripts depending on whether its consensual or noncon)

 

asking this because i'm a bit confused while using system.partner and system.player.

for example, if i take "player partner" then to target the partner of my player during the script, i should use self right? or partner?

Edited by Fraying9981
Posted
17 hours ago, hextun said:

 

No worries, we're working together to figure it out. :)
不用担心,我们正在一起解决这个问题。 :)

 

So, here is the script I think you want. It compares the animation name to each of the animations you are interested in. If it matches any of them, it jumps to the work section with a hard coded item FormID. If it doesn't match any, it returns, leaving the script.
那么,这是我认为你需要脚本来。它比较动画名称与你感兴趣的所有动画。如果匹配任何一个,它就会跳转到工作部分,并使用硬编码的项目 FormID。如果不匹配任何,它就会返回,并离开脚本。

 

  Reveal hidden contents
显示隐藏内容
sl_animname
set $animname $$
		
if $animname == "Kziitd_Missionary"		[dowork]
if $animname == "Kziitd_Doggy"			[dowork]
if $animname == "Kziitd_Cowgirl"		[dowork]
if $animname == "Kziitd_Laying"			[dowork]
if $animname == "Kziitd_Laying2"		[dowork]
if $animname == "Kziitd_Stand"			[dowork]
if $animname == "Kziitd_Missionary2"	[dowork]
if $animname == "Kziitd_Laying3" 		[dowork]

; not any of those animations, leave
return


[dowork]
set $newWornItem $"KXT-GuliExtensions.esp:0x0088C"
item_adduse $system.self $newWornItem 0 0
util_waitforend
item_remove $system.self $newWornItem 1 1

 

 

thank you!
How can I turn the current 'ini' into an 'STL script'?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   1 member

×
×
  • Create New...