<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Garfield+Linden</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Garfield+Linden"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Garfield_Linden"/>
	<updated>2026-07-26T10:44:45Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Main_Page/Creation&amp;diff=1218207</id>
		<title>Template:Main Page/Creation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Main_Page/Creation&amp;diff=1218207"/>
		<updated>2025-04-26T21:51:17Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: Add link to PBR Materials page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;[[Creation Portal]]&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Information about building and designing in Second Life&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Clothing Tutorials|Clothing]] | [[Machinima]] | [[Live_Performance_Home|Music]] | [[Texture Tools|Textures]] | [[PBR Materials|PBR]] | [[Mesh]] | [[Environmental Enhancement Project|Environment]] | [[Video Tutorials]] | [[Good Building Practices]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Main_Page/Creation&amp;diff=1218206</id>
		<title>Template:Main Page/Creation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Main_Page/Creation&amp;diff=1218206"/>
		<updated>2025-04-26T21:47:32Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: Point to the Video Tutorials wiki page instead of secondlife.com/video, as the latter is rather lacking in content.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;[[Creation Portal]]&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Information about building and designing in Second Life&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Clothing Tutorials|Clothing]] | [[Machinima]] | [[Live_Performance_Home|Music]] | [[Texture Tools|Textures]] | [[Mesh]] | [[Environmental Enhancement Project|Environment]] | [[Video Tutorials]] | [[Good Building Practices]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Main_Page/Creation&amp;diff=1218205</id>
		<title>Template:Main Page/Creation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Main_Page/Creation&amp;diff=1218205"/>
		<updated>2025-04-26T21:45:08Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: Sculpted Prims -&amp;gt; Mesh&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;[[Creation Portal]]&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Information about building and designing in Second Life&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Clothing Tutorials|Clothing]] | [[Machinima]] | [[Live_Performance_Home|Music]] | [[Texture Tools|Textures]] | [[Mesh]] | [[Environmental Enhancement Project|Environment]] | [http://secondlife.com/video Video Tutorials] | [[Good Building Practices]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Main_Page/Creation&amp;diff=1218204</id>
		<title>Template:Main Page/Creation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Main_Page/Creation&amp;diff=1218204"/>
		<updated>2025-04-26T21:43:13Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: WindLight -&amp;gt; Environment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;[[Creation Portal]]&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Information about building and designing in Second Life&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Clothing Tutorials|Clothing]] | [[Machinima]] | [[Live_Performance_Home|Music]] | [[Texture Tools|Textures]] | [[Sculpted Prims]] | [[Environmental Enhancement Project|Environment]] | [http://secondlife.com/video Video Tutorials] | [[Good Building Practices]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Linden_Lab_Official:Reg_API_Examples&amp;diff=1217546</id>
		<title>Linden Lab Official:Reg API Examples</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Linden_Lab_Official:Reg_API_Examples&amp;diff=1217546"/>
		<updated>2024-10-20T00:36:20Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: Add syntax highlighting for code examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Supported API}}&lt;br /&gt;
{{:API Portal/navigation|reg}}&lt;br /&gt;
&lt;br /&gt;
The following examples illustrate using the Reg API to register a new user with a specified Second Life first name and last name.  The example code first checks to determine the availability of the selected first and last name, and either registers the user or returns an error message if the name is already taken.&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LLSD library downloads ==&lt;br /&gt;
&lt;br /&gt;
To use a library:&lt;br /&gt;
# Remove the -lib suffix from the file name.&lt;br /&gt;
# Put the file in the same directory as the application code, such as the examples below.&lt;br /&gt;
&lt;br /&gt;
* [https://secure-web10.secondlife.com/developers/third_party_reg/llsd_libs/llsd.rb-lib Ruby LLSD library] (version 1.3)&lt;br /&gt;
* [https://secure-web10.secondlife.com/developers/third_party_reg/llsd_libs/llsd.php-lib PHP LLSD library] (version 1.0)&lt;br /&gt;
* [https://secure-web10.secondlife.com/developers/third_party_reg/llsd_libs/llsd.py-lib Python LLSD library] (version 1.2)&lt;br /&gt;
* [https://secure-web10.secondlife.com/developers/third_party_reg/llsd_libs/llsd.pm-lib Perl LLSD library] (version 1.0)&lt;br /&gt;
&lt;br /&gt;
NOTE: The PHP scripts only work with PHP4. &lt;br /&gt;
&lt;br /&gt;
An externally developed Java implementation of LLSD and RegAPI is available at http://mimuve.cs.st-andrews.ac.uk/llsd-java/src/llsd-java-0.2.1.zip . Code written by Xugu Madison, copyright held by University of St Andrews, and made available under the BSD license. Tested with Java 1.5.&lt;br /&gt;
&lt;br /&gt;
Question: what version of each language is required?&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
&lt;br /&gt;
=== Ruby ===&lt;br /&gt;
&lt;br /&gt;
This ruby example shows how to use the Registration API. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &#039;llsd&#039;&lt;br /&gt;
&lt;br /&gt;
# 0 - get capability urls&lt;br /&gt;
# 1 - get error codes&lt;br /&gt;
# 2 - get the available last names&lt;br /&gt;
# 3 - check to see of a username + last name combo is taken&lt;br /&gt;
# 4 - register the user with this username + last name combo&lt;br /&gt;
&lt;br /&gt;
get_capabilities_url = &amp;quot;https://cap.secondlife.com/get_reg_capabilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# grab command line args&lt;br /&gt;
if ARGV.length == 3&lt;br /&gt;
  first_name = ARGV[0]&lt;br /&gt;
  last_name = ARGV[1]&lt;br /&gt;
  password = ARGV[2]&lt;br /&gt;
else&lt;br /&gt;
  puts &amp;quot;Please pass in your second life first name, last name, and password as arguments.&amp;quot;&lt;br /&gt;
  puts &amp;quot;For example: ruby registration_api.rb joe linden 1234&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  exit&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# 0 - Get Capability URLS  ##############################################&lt;br /&gt;
puts &amp;quot;========== Getting capabilities ===========\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
post_body = &amp;quot;first_name=#{first_name}&amp;amp;last_name=#{last_name}&amp;amp;password=#{password}&amp;quot; &lt;br /&gt;
# create a url-encoded string to POST&lt;br /&gt;
response_xml = LLSD.post_urlencoded_data get_capabilities_url, post_body &lt;br /&gt;
# POST the capability url to get capabilities&lt;br /&gt;
&lt;br /&gt;
puts &amp;quot;xml response:&amp;quot; # Print out response xml&lt;br /&gt;
puts response_xml&lt;br /&gt;
&lt;br /&gt;
puts &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
capability_urls = LLSD.parse(response_xml) # Parse the xml&lt;br /&gt;
&lt;br /&gt;
capability_urls.each { |k,v| puts &amp;quot;#{k} =&amp;gt; #{v}&amp;quot;} # print out capabilities&lt;br /&gt;
&lt;br /&gt;
# 1 - Print out error codes  ##############################################&lt;br /&gt;
puts &amp;quot;\n\n========== Get Error Codes Example ===========\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if capability_urls[&#039;get_error_codes&#039;]  &lt;br /&gt;
  response_xml = LLSD.http_raw capability_urls[&#039;get_error_codes&#039;] &lt;br /&gt;
  # GET the capability url for getting error codes&lt;br /&gt;
  &lt;br /&gt;
  puts &amp;quot;xml response:&amp;quot; # Print out response xml&lt;br /&gt;
  puts response_xml&lt;br /&gt;
  &lt;br /&gt;
  error_codes = LLSD.parse(response_xml) # Parse the xml&lt;br /&gt;
&lt;br /&gt;
  error_codes.each {|error| puts &amp;quot;#{error[0]} =&amp;gt; #{error[1]}&amp;quot;} &lt;br /&gt;
  # print out all error codes&lt;br /&gt;
else&lt;br /&gt;
  puts &amp;quot;Get_error_codes capability not granted to #{first_name} #{last_name}.  Exiting Prematurely ...&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# 2 - Get Last Names Example  ##############################################&lt;br /&gt;
puts &amp;quot;\n\n========== Get Last Names Example ===========\n&amp;quot;&lt;br /&gt;
if capability_urls[&#039;get_last_names&#039;]&lt;br /&gt;
  response_xml = LLSD.http_raw capability_urls[&#039;get_last_names&#039;] &lt;br /&gt;
  # GET the capability url for getting last names and ids&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;xml response:&amp;quot; # Print out response xml&lt;br /&gt;
  puts response_xml&lt;br /&gt;
  &lt;br /&gt;
  last_names = LLSD.parse(response_xml) # Parse the xml&lt;br /&gt;
&lt;br /&gt;
  last_names.each {|k,v| puts &amp;quot;#{k} =&amp;gt; #{v}&amp;quot;} # print out last names&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # 3 - Check Name Example  ##############################################&lt;br /&gt;
  print &amp;quot;\n\n========== Check Name Example ===========\n&amp;quot;&lt;br /&gt;
  if capability_urls[&#039;check_name&#039;]&lt;br /&gt;
    random_username = &#039;tester&#039; + Kernel.rand(10000).to_s # Generate a random username&lt;br /&gt;
    valid_last_name_id = last_names.keys.first # Get the first valid last name id&lt;br /&gt;
    params_hash = {&amp;quot;username&amp;quot; =&amp;gt; random_username, &amp;quot;last_name_id&amp;quot; =&amp;gt; valid_last_name_id } &lt;br /&gt;
    # put it in a hash&lt;br /&gt;
&lt;br /&gt;
    xml_to_post = LLSD.to_xml(params_hash) # convert it to llsd xml&lt;br /&gt;
&lt;br /&gt;
    response_xml = LLSD.post_xml(capability_urls[&#039;check_name&#039;], xml_to_post)&lt;br /&gt;
&lt;br /&gt;
    puts &amp;quot;posted xml:&amp;quot; # Print out response xml&lt;br /&gt;
    puts xml_to_post&lt;br /&gt;
&lt;br /&gt;
    puts &amp;quot;xml response:&amp;quot; # Print out response xml&lt;br /&gt;
    puts response_xml&lt;br /&gt;
&lt;br /&gt;
    is_name_available = LLSD.parse(response_xml) # Parse the xml&lt;br /&gt;
&lt;br /&gt;
    puts &amp;quot;Result (is name available?): #{is_name_available}&amp;quot; # Print the result&lt;br /&gt;
    &lt;br /&gt;
    # 4 - Create User Example  ##############################################&lt;br /&gt;
    puts &amp;quot;\n\n========== Create User Example ===========\n&amp;quot;&lt;br /&gt;
    if is_name_available and capability_urls[&#039;create_user&#039;]:&lt;br /&gt;
      # fill in the rest of the hash we started in example 2 with valid data&lt;br /&gt;
      params_hash[&amp;quot;email&amp;quot;] = random_username + &amp;quot;@ben.com&amp;quot;&lt;br /&gt;
      params_hash[&amp;quot;password&amp;quot;] = &amp;quot;123123abc&amp;quot;&lt;br /&gt;
      params_hash[&amp;quot;dob&amp;quot;] = &amp;quot;1980-01-01&amp;quot;&lt;br /&gt;
      &lt;br /&gt;
      xml_to_post = LLSD.to_xml(params_hash) # convert it to llsd xml&lt;br /&gt;
&lt;br /&gt;
      response_xml = LLSD.post_xml(capability_urls[&#039;create_user&#039;], xml_to_post)&lt;br /&gt;
&lt;br /&gt;
      puts &amp;quot;posted xml:&amp;quot; # Print out response xml&lt;br /&gt;
      puts xml_to_post&lt;br /&gt;
&lt;br /&gt;
      puts &amp;quot;xml response:&amp;quot; # Print out response xml&lt;br /&gt;
      puts response_xml&lt;br /&gt;
&lt;br /&gt;
      result_hash = LLSD.parse(response_xml) # Parse the xml&lt;br /&gt;
&lt;br /&gt;
      puts &amp;quot;New agent id: #{result_hash[&#039;agent_id&#039;]}&amp;quot; # Print the result&lt;br /&gt;
      &lt;br /&gt;
      # ALL DONE!!&lt;br /&gt;
    else&lt;br /&gt;
      puts &amp;quot;Create_user capability not granted to #{first_name} #{last_name}. Exiting Prematurely ...&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    puts &amp;quot;Check_name capability not granted to #{first_name} #{last_name}. Exiting Prematurely ...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
else&lt;br /&gt;
  puts &amp;quot;Get_last_names capability not granted to #{first_name} #{last_name}. Exiting Prematurely...&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import llsd&lt;br /&gt;
import urllib2, random, sys&lt;br /&gt;
&lt;br /&gt;
# This python example shows how to use the Registration API. The example goes as follows:&lt;br /&gt;
&lt;br /&gt;
# 0 - get capability urls&lt;br /&gt;
# 1 - get error codes&lt;br /&gt;
# 2 - get the available last names&lt;br /&gt;
# 3 - check to see of a username + last name combo is taken&lt;br /&gt;
# 4 - register the user with this username + last name combo&lt;br /&gt;
&lt;br /&gt;
get_capabilities_url = &amp;quot;https://cap.secondlife.com/get_reg_capabilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# grab command line args&lt;br /&gt;
if len(sys.argv) == 4:&lt;br /&gt;
  first_name = sys.argv[1]&lt;br /&gt;
  last_name = sys.argv[2]&lt;br /&gt;
  password = sys.argv[3]&lt;br /&gt;
else:&lt;br /&gt;
  print &amp;quot;Please pass in your second life first name, last name, and password as arguments. For example:&amp;quot;&lt;br /&gt;
  print &amp;quot;python registration_api.py registration mackay 1234&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  sys.exit()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 0 - Get Capability URLS #################################################################&lt;br /&gt;
print &amp;quot;========== Getting capabilities ===========&amp;quot;&lt;br /&gt;
&lt;br /&gt;
post_body = &amp;quot;first_name=%s&amp;amp;last_name=%s&amp;amp;password=%s&amp;quot; % (first_name, last_name, password) # create a url-encoded string to POST&lt;br /&gt;
response_xml = urllib2.urlopen(get_capabilities_url, post_body).read() # POST the capability url to get capabilities&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;xml response:&amp;quot; # Print out response xml&lt;br /&gt;
print response_xml&lt;br /&gt;
&lt;br /&gt;
capability_urls = llsd.parse(response_xml) # Parse the xml&lt;br /&gt;
&lt;br /&gt;
for id, name in capability_urls.items(): # Print out capabilities&lt;br /&gt;
    print &amp;quot;%s =&amp;gt; %s&amp;quot; % (id, name)&lt;br /&gt;
    &lt;br /&gt;
# 1 - Print out error codes ###############################################################&lt;br /&gt;
if &#039;get_error_codes&#039; in capability_urls:&lt;br /&gt;
    print &amp;quot;\n\n========== Get Error Codes Example ===========\n&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
    response_xml = urllib2.urlopen(capability_urls[&#039;get_error_codes&#039;]).read() # GET the capability url for getting error codes&lt;br /&gt;
  &lt;br /&gt;
    print &amp;quot;xml response:&amp;quot; # Print out response xml&lt;br /&gt;
    print response_xml&lt;br /&gt;
  &lt;br /&gt;
    error_codes = llsd.parse(response_xml) # Parse the xml&lt;br /&gt;
&lt;br /&gt;
    for error in error_codes: # Print out capabilities&lt;br /&gt;
        print &amp;quot;%s =&amp;gt; %s&amp;quot; % (error[0], error[1])&lt;br /&gt;
else:&lt;br /&gt;
    print &amp;quot;Get_error_codes capability not granted to %s %s. Now Exiting Prematurely ...&amp;quot; % (first_name, last_name)&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
# 2 - Get Last Names Example ##############################################################&lt;br /&gt;
if &#039;get_last_names&#039; in capability_urls:&lt;br /&gt;
    print &amp;quot;\n\n========== Get Last Names Example ===========&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    response_xml = urllib2.urlopen(capability_urls[&#039;get_last_names&#039;]).read() # GET the capability url for getting last names and ids&lt;br /&gt;
&lt;br /&gt;
    print &amp;quot;xml response:&amp;quot; # Print out response xml&lt;br /&gt;
    print response_xml&lt;br /&gt;
    &lt;br /&gt;
    last_names = llsd.parse(response_xml) # Parse the xml&lt;br /&gt;
&lt;br /&gt;
    for id, name in last_names.items(): # Print out last names&lt;br /&gt;
        print &amp;quot;%s =&amp;gt; %s&amp;quot; % (id, name)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # 3 - Check Name Example ##################################################################&lt;br /&gt;
    if &#039;check_name&#039; in capability_urls:&lt;br /&gt;
        print &amp;quot;\n\n========== Check Name Example ===========&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        random_username = &#039;benny&#039; + str(random.randrange(100,10000)) # Generate a random username&lt;br /&gt;
        valid_last_name_id = last_names.keys()[0] # Get the first valid last name id&lt;br /&gt;
        params_hash = {&amp;quot;username&amp;quot;: random_username, &amp;quot;last_name_id&amp;quot;: valid_last_name_id } # put it in a hash&lt;br /&gt;
&lt;br /&gt;
        xml_to_post = llsd.toXML(params_hash) # convert it to llsd xml&lt;br /&gt;
&lt;br /&gt;
        response_xml = urllib2.urlopen(capability_urls[&#039;check_name&#039;], xml_to_post).read() &lt;br /&gt;
&lt;br /&gt;
        print &amp;quot;posted xml &amp;quot; # Print out response xml&lt;br /&gt;
        print xml_to_post&lt;br /&gt;
&lt;br /&gt;
        print &amp;quot;xml response:&amp;quot; # Print out response xml&lt;br /&gt;
        print response_xml&lt;br /&gt;
&lt;br /&gt;
        is_name_available = llsd.parse(response_xml) # Parse the xml&lt;br /&gt;
&lt;br /&gt;
        print &amp;quot;Result (is name available?): %s&amp;quot; % (is_name_available) # Print the result&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        # 4 - Create User Example #################################################################&lt;br /&gt;
        if is_name_available and &#039;create_user&#039; in capability_urls:&lt;br /&gt;
            print &amp;quot;\n\n========== Create User Example ===========&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            xml_to_post = llsd.toXML(params_hash) # convert it to llsd xml&lt;br /&gt;
&lt;br /&gt;
            response_xml = urllib2.urlopen(capability_urls[&#039;create_user&#039;], xml_to_post).read() &lt;br /&gt;
&lt;br /&gt;
            print &amp;quot;posted xml &amp;quot; # Print out response xml&lt;br /&gt;
            print xml_to_post&lt;br /&gt;
&lt;br /&gt;
            print &amp;quot;xml response:&amp;quot; # Print out response xml&lt;br /&gt;
            print response_xml&lt;br /&gt;
&lt;br /&gt;
            result_hash = llsd.parse(response_xml) # Parse the xml&lt;br /&gt;
&lt;br /&gt;
            print &amp;quot;New agent id: %s&amp;quot; % (result_hash[&amp;quot;agent_id&amp;quot;])&lt;br /&gt;
            print &amp;quot;Finalize this user at: %s&amp;quot; % (result_hash[&amp;quot;complete_reg_url&amp;quot;])&lt;br /&gt;
    &lt;br /&gt;
            &lt;br /&gt;
            # ALL DONE!!&lt;br /&gt;
        else:&lt;br /&gt;
            print &amp;quot;create_user capability not granted to %s %s. Now Exiting Prematurely ...&amp;quot; % (first_name, last_name)&lt;br /&gt;
            &lt;br /&gt;
    else:&lt;br /&gt;
        print &amp;quot;check_name capability not granted to %s %s. Now Exiting Prematurely ...&amp;quot; % (first_name, last_name)&lt;br /&gt;
        &lt;br /&gt;
else:&lt;br /&gt;
    print &amp;quot;get_last_names capability not granted to %s %s. Now Exiting Prematurely ...&amp;quot; % (first_name, last_name)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHP ===&lt;br /&gt;
NOTE: This uses PHP4.  See also [[Registration_API#Guidelines_and_tips|Guidelines and tips]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once(&#039;llsd.php&#039;);&lt;br /&gt;
&lt;br /&gt;
// FILL THESE IN WITH YOUR OWN CAPABILITY URLS&lt;br /&gt;
define(&#039;URI_CREATE_USER&#039;, &#039;?????????&#039;);&lt;br /&gt;
define(&#039;URI_GET_LAST_NAMES&#039;, &#039;?????????&#039;);&lt;br /&gt;
define(&#039;URI_CHECK_NAME&#039;, &#039;?????????&#039;);&lt;br /&gt;
&lt;br /&gt;
if ($_SERVER[&#039;REQUEST_METHOD&#039;] == &#039;POST&#039;)&lt;br /&gt;
{&lt;br /&gt;
    if (is_name_available($_POST[&#039;username&#039;], $_POST[&#039;last_name_id&#039;]))&lt;br /&gt;
    {&lt;br /&gt;
        $user = array&lt;br /&gt;
        (&lt;br /&gt;
            &#039;username&#039;     =&amp;gt; $_POST[&#039;username&#039;],&lt;br /&gt;
            &#039;last_name_id&#039; =&amp;gt; (int)$_POST[&#039;last_name_id&#039;],&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        $result = llsd_post(URI_CREATE_USER, $user);&lt;br /&gt;
        header( &amp;quot;Location: &amp;quot; . $result[&#039;complete_reg_url&#039;] ); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        print &#039;SL name not available.&#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Create Second Life Account&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;&amp;lt;?php print $_SERVER[&#039;PHP_SELF&#039;]; ?&amp;gt;&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;First name:&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;username&amp;quot; size=&amp;quot;25&amp;quot; maxlength=&amp;quot;31&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Last name:&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&lt;br /&gt;
  &amp;lt;select name=&amp;quot;last_name_id&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;?php&lt;br /&gt;
  $last_names = llsd_get(URI_GET_LAST_NAMES);&lt;br /&gt;
  foreach ($last_names as $last_name_id =&amp;gt; $name)&lt;br /&gt;
  {&lt;br /&gt;
      print &#039;&amp;lt;option value=&amp;quot;&#039;.$last_name_id.&#039;&amp;quot;&amp;gt;&#039;.$name.&#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  ?&amp;gt;&lt;br /&gt;
  &amp;lt;/select&amp;gt;&lt;br /&gt;
  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Create SL Account&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function get_months()&lt;br /&gt;
{&lt;br /&gt;
    $months = array();&lt;br /&gt;
    for ($i = 1; $i &amp;lt;= 12; $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $key = date(&#039;n&#039;, mktime(0, 0, 0, $i, 1, 2000));&lt;br /&gt;
        $value = date(&#039;M.&#039;, mktime(0, 0, 0, $i, 1, 2000));&lt;br /&gt;
        $months[sprintf(&amp;quot;%02d&amp;quot;, $key)] = $value;&lt;br /&gt;
    }&lt;br /&gt;
    return $months;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function get_years()&lt;br /&gt;
{&lt;br /&gt;
    $today = getdate();&lt;br /&gt;
    $max_year = $today[&#039;year&#039;] - 90;&lt;br /&gt;
    $min_year = $today[&#039;year&#039;] - 13;&lt;br /&gt;
&lt;br /&gt;
    $years = array();&lt;br /&gt;
    for ($i = $min_year; $i &amp;gt;= $max_year; $i--)&lt;br /&gt;
    {&lt;br /&gt;
        $years[$i] = $i;&lt;br /&gt;
    }&lt;br /&gt;
    return $years;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function get_days()&lt;br /&gt;
{&lt;br /&gt;
    $days = array();&lt;br /&gt;
    for ($i = 1; $i &amp;lt;= 31; $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $days[sprintf(&amp;quot;%02d&amp;quot;, $i)] = sprintf(&amp;quot;%02d&amp;quot;, $i);&lt;br /&gt;
    }&lt;br /&gt;
    return $days;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function is_name_available($username, $last_name_id)&lt;br /&gt;
{&lt;br /&gt;
    $params = array(&#039;username&#039; =&amp;gt; $username, &#039;last_name_id&#039; =&amp;gt; (int)$last_name_id);&lt;br /&gt;
    if (llsd_post(URI_CHECK_NAME, $params) == &#039;true&#039;)&lt;br /&gt;
    {&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:RegAPI|Sample Code]]&lt;br /&gt;
[[Category:Web Service APIs]]&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSO&amp;diff=1217197</id>
		<title>LSO</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSO&amp;diff=1217197"/>
		<updated>2024-08-28T00:20:08Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: openmetaverse.co is gone, and so is its wiki article on LSO. An older version of this page linked to a similar page on libsecondlife.org&amp;#039;s wiki, which archive.org thankfully indexed. Let&amp;#039;s link to that!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
Second Life has two LSL compilers, one which compiles into LSO bytecode and is executed by the simulator in the LSO {{Abbr|VM|Virtual machine}}, the other which compiles to {{Wikipedia|Common Intermediate Language|CIL}} and is executed by the simulator in the [[Mono]] VM. This article is about the LSO bytecode.&lt;br /&gt;
&lt;br /&gt;
LSO is mostly a stack-based language with a reference-counted heap and a very odd function calling convention in which the caller allocates storage for the callee&#039;s local variables. All the gory details can be found at https://web.archive.org/web/20080430044527/https://www.libsecondlife.org/wiki/LSO, including some opcodes that are implemented in the interpreter but never outputted by the compiler (such as the handy DUP family of instructions for Forth-style programming, and PUSHIP/POPIP for implementing custom function calls/function pointers, jumptable-based switch statements and the like).&lt;br /&gt;
&lt;br /&gt;
It&#039;s actually a reasonably powerful instruction set in some ways, but the compiler doesn&#039;t make use of it very well.&lt;br /&gt;
&lt;br /&gt;
With the release of the Mono VM, LSO has been maintained for backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
=Bytecodes=&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;text-align: center;&amp;quot;|&#039;&#039;&#039;Argument Types&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot;|&#039;&#039;&#039;Variable type codes&#039;&#039;&#039;&lt;br /&gt;
|- vAlign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
! Type&lt;br /&gt;
! title=&amp;quot;Size in Bytes&amp;quot; | Size&lt;br /&gt;
! &lt;br /&gt;
|-&lt;br /&gt;
| dword&lt;br /&gt;
| 4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| short&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| byte&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| 1&lt;br /&gt;
| upper 4 bits are type.Left &amp;lt;br/&amp;gt; lower 4 bits are type.Right&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
! Value&lt;br /&gt;
! Type&lt;br /&gt;
! title=&amp;quot;Size in Bytes&amp;quot; | Size&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| void&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| integer&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| float&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| string&lt;br /&gt;
| 4&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
! Value&lt;br /&gt;
! Type&lt;br /&gt;
! title=&amp;quot;Size in Bytes&amp;quot; | Size&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| key&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| vector&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| rotation&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| list&lt;br /&gt;
| 4&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
==By Task==&lt;br /&gt;
=== Pop Value ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/pop-value}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Duplicate Value ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
{{LSO Bytecodes/duplicate}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Store to Local ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/store-local}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Store to Global ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/store-global}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Load to Local ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/load-local}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Load to Global ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/load-global}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Push Local ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/push-local}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Push Global ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/push-global}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Push into List ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/push-list}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Push Zero Values ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/push-zeros}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Operators ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/operators}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Jump ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg1 size&lt;br /&gt;
{{LSO Bytecodes/jump}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Return ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/return}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Stack to Heap ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/stack-to-heap}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Call Functions ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/functions}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Special Registers ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
{{LSO Bytecodes/push-register}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/pop-register}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;|arg0 size&lt;br /&gt;
{{LSO Bytecodes/misc}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== All Bytecodes ==&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Name&lt;br /&gt;
!Value&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;{{!}}Description&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;{{!}}arg0 size&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;{{!}}arg1 size&lt;br /&gt;
{{LSO Bytecodes/misc}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/pop-value}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/pop-register}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/duplicate}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/store-local}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/store-global}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/load-local}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/load-global}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/push-local}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/push-global}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/push-register}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/push-list}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/push-zeros}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/operators}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/jump}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/return}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/stack-to-heap}}&lt;br /&gt;
|-&lt;br /&gt;
{{LSO Bytecodes/functions}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Assets]]&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Main_Page/Featured_Pages&amp;diff=1216996</id>
		<title>Template:Main Page/Featured Pages</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Main_Page/Featured_Pages&amp;diff=1216996"/>
		<updated>2024-08-02T20:01:30Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: Remove featured link to the Authorized Linden Dollar Reseller pilot program, which has been closed as per https://community.secondlife.com/blogs/entry/1621-concluding-the-authorized-l-reseller-pilot-program/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;&#039;&#039;&#039;News &amp;amp; Featured Pages&#039;&#039;&#039;&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;[[Linden_Lab_Official:User_Groups|User Groups]]:&#039;&#039;&#039; Meet the Lindens and discuss Second Life developments&lt;br /&gt;
* &#039;&#039;&#039;[[Good Building Practices]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[Pathfinding in Second Life]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[Mesh]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[Second Life Marketplace Direct Delivery FAQ|Direct Delivery FAQ]]&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlWorldPosToHUD&amp;diff=1216100</id>
		<title>LlWorldPosToHUD</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlWorldPosToHUD&amp;diff=1216100"/>
		<updated>2024-01-24T21:51:26Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: Removing extraneous semicolon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function/permission|PERMISSION_TRACK_CAMERA}}{{LSL_Function&lt;br /&gt;
|func=llWorldPosToHUD&lt;br /&gt;
|sort=WorldPosToHUD&lt;br /&gt;
|func_id=547&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|return_type=vector&lt;br /&gt;
|p1_type=vector|p1_name=world_pos&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=position in HUD frame that would place the center of the HUD object directly over &#039;&#039;&#039;world_pos&#039;&#039;&#039; as viewed by the current camera.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=Only works for HUD attachments.  The vector&#039;s X component will be 1.0 when &#039;&#039;&#039;world_pos&#039;&#039;&#039; is in front of camera and -1.0 when it is behind.  Returns zero vector when no permissions have been granted.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// llWorldPosToHUD() example&lt;br /&gt;
//&lt;br /&gt;
// Put this script on a HUD attachment (which attachment point doesn&#039;t matter).&lt;br /&gt;
// Touch to toggle &#039;tracking&#039; on/off.&lt;br /&gt;
// Put an object at world_pos as reference for where the HUD should move when &#039;tracking&#039;.&lt;br /&gt;
&lt;br /&gt;
vector not_tracking_color = &amp;lt;1.0, 1.0, 1.0&amp;gt;; // white&lt;br /&gt;
vector tracking_front_color = &amp;lt;0.5, 0.0, 0.5&amp;gt;; // magenta&lt;br /&gt;
vector tracking_behind_color = &amp;lt;0.0, 0.5, 0.5&amp;gt;; // cyan&lt;br /&gt;
&lt;br /&gt;
vector world_pos = &amp;lt;32,32,24&amp;gt;; // change this position as necessary, put a ref object here&lt;br /&gt;
integer tracking = FALSE;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch HUD to toggle tracking&amp;quot;);&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TRACK_CAMERA);&lt;br /&gt;
        llSetAlpha(0.5, ALL_SIDES); // make object semi transparent&lt;br /&gt;
        llSetColor(not_tracking_color, ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TRACK_CAMERA);&lt;br /&gt;
        tracking = !tracking;&lt;br /&gt;
        if (tracking)&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(0.01);&lt;br /&gt;
            llSetColor(tracking_front_color, ALL_SIDES);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
            llSetPos(&amp;lt;0,0,0&amp;gt;);&lt;br /&gt;
            llSetColor(not_tracking_color, ALL_SIDES);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    attach(key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (id != NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            llSetPos(&amp;lt;0,0,0&amp;gt;);&lt;br /&gt;
            tracking = FALSE;&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer attachment_point = llGetAttached();&lt;br /&gt;
        if (attachment_point &amp;gt;= ATTACH_HUD_CENTER_2 &amp;amp;&amp;amp; attachment_point &amp;lt;= ATTACH_HUD_BOTTOM_RIGHT)&lt;br /&gt;
        {&lt;br /&gt;
            vector hud_pos = llWorldPosToHUD(world_pos);&lt;br /&gt;
            if (hud_pos.x &amp;gt; 0.0)&lt;br /&gt;
            {&lt;br /&gt;
                // world-pos is in front of camera&lt;br /&gt;
                llSetColor(tracking_front_color, ALL_SIDES);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                // world_pos is behind camera&lt;br /&gt;
                llSetColor(tracking_behind_color, ALL_SIDES);&lt;br /&gt;
            }&lt;br /&gt;
            // update HUD position&lt;br /&gt;
            llSetPos(hud_pos);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||{{LSLG|llGetCameraAspect}}|}}&lt;br /&gt;
{{LSL DefineRow||{{LSLG|llGetCameraFOV}}|}}&lt;br /&gt;
{{LSL DefineRow||{{LSLG|llGetCameraPos}}|}}&lt;br /&gt;
{{LSL DefineRow||{{LSLG|llGetCameraRot}}|}}&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Camera&lt;br /&gt;
|cat2=Attachment&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Garfield_Linden&amp;diff=1215835</id>
		<title>User:Garfield Linden</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Garfield_Linden&amp;diff=1215835"/>
		<updated>2023-12-10T00:01:12Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: Created page with &amp;quot;Hello? How did I get here? I&amp;#039;m not good at computers.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello? How did I get here? I&#039;m not good at computers.&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSHA1String&amp;diff=1215834</id>
		<title>LlSHA1String</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSHA1String&amp;diff=1215834"/>
		<updated>2023-12-09T23:59:46Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: Direct residents to LSL&amp;#039;s built-in llSHA256String and away from script implementations.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-1={{LSL Function/warning|Security|The SHA-1 hashing algorithm is considered broken but the attacks are largely still theoretical and not very practical. Consider the more secure [[llSHA256String]]. {{Wikipedia|SHA-1#Comparison_of_SHA_functions|Comparison of SHA functions}}}}&lt;br /&gt;
|func_id=343|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSHA1String|return_type=string|p1_type=string|p1_name=src&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=of 40 hex characters that is the {{Wikipedia|SHA-1|SHA-1}} security hash of {{LSLP|src}}.&lt;br /&gt;
|spec=LSL strings are stored in the UTF-8 format.&lt;br /&gt;
|caveats=There&#039;s no way to input a zero-byte value into this function, nor any byte value from 128-255, therefore it&#039;s currently broken for many purposes (like HMAC-SHA1). The reason is because LSL strings cannot have a unicode null character (U+0000) in them, and LSL has no escape code for the null character (many programming languages use \0 but LSL does not have this feature). llEscapeURL(&amp;quot;%00&amp;quot;) yields an empty string. As well, inside this function, each character with a Unicode integer value over U+0127 / 007F are dealt with in UTF-8 fashion: in the hex values, 0xC2 is appended to the byte value (hence 0x0080-0x00FF become 0xC280-0xC2FF inside the llSHA1String() routine). A JIRA has been filed for this.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llSay(0, llSHA1String(&amp;quot;Hello, Avatar!&amp;quot;)); // returns 2E73318E547AF1B28CC0C96F95DDC9B1EE906B8D&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Linux Example====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ echo -n &#039;Hello, Avatar!&#039; | openssl sha1&lt;br /&gt;
2E73318E547AF1B28CC0C96F95DDC9B1EE906B8D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llMD5String]]}}&lt;br /&gt;
{{LSL DefineRow||[[llSHA256String]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[SHA-1]] (script implementation)}}&lt;br /&gt;
|notes&lt;br /&gt;
|deepnotes=&lt;br /&gt;
Prior to this, the only way to get the SHA-1 hash was to use the LSL SHA-1 port: [[SHA-1]]&lt;br /&gt;
|history=&lt;br /&gt;
*{{SVN|1291|rev=98903|trunk=*|anchor=file13|ver=1.21.5.97417|ser=1.24.9.98650}} Initial introduction.&lt;br /&gt;
*{{SVN|1298|rev=99021|branch=OpenAL|ver=1.21.5.97417|ser=1.24.9.98650|path=branches/openal/indra/lscript/lscript_library/lscript_library.cpp}} &lt;br /&gt;
Integration into OpenAL branch.&lt;br /&gt;
* Date of Release [[ Release_Notes/Second_Life_Beta_Server/1.25#Server_Release_Notes.2C_Second_Life_Beta_Server_1.25.0 | 2008-10-31 ]]&lt;br /&gt;
|cat1=Hash&lt;br /&gt;
|cat2=Encoding&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}{{LSLC{{#var:lang}}|Encryption|llSHA1String}}&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=SHA-1&amp;diff=1215833</id>
		<title>SHA-1</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=SHA-1&amp;diff=1215833"/>
		<updated>2023-12-09T23:52:23Z</updated>

		<summary type="html">&lt;p&gt;Garfield Linden: Direct residents to built-in SHA functions; tweak wording.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{LSL Function/warning|inline=*|Security|There are dire security implications to changing the K constants (these are the hex values near the end of the lines marked with &amp;quot;//k&amp;quot; comments). https://malicioussha1.github.io/}}&lt;br /&gt;
&lt;br /&gt;
{{LSL New}} LSL now includes its own (faster) [[llSHA1String]] function, which removes the need for the UTF8_SHA1 variant from this library. Also consider the more secure [[llSHA256String]].&lt;br /&gt;
&lt;br /&gt;
Performs a SHA-1 hash on the text. This is similar to an [[MD5]] hash, but is &#039;&#039;slightly&#039;&#039; more secure. Two versions of the function are provided: one for UTF-8 strings (all strings in LSL are UTF-8) and another for Base64 strings (for which you need to specify the data length in bits).&lt;br /&gt;
&lt;br /&gt;
There are also two [[SHA-2]] script implementations ([[SHA-2#SHA-256|SHA-256]] &amp;amp; [[SHA-2#SHA-224|SHA-224]]), though consider the faster [[llSHA256String]] provided by LSL itself.&lt;br /&gt;
&lt;br /&gt;
View {{Wikipedia|SHA-1}} for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
//	UTF-8 SHA-1 160&lt;br /&gt;
//	Version 1.3 &lt;br /&gt;
//	ESL Compiled: &amp;quot;Nov 26 2013&amp;quot;, &amp;quot;00:11:59&amp;quot;&lt;br /&gt;
//	Copyright (C) 2013  Strife Onizuka&lt;br /&gt;
//	Based on Pseudo-code from http://en.wikipedia.org/wiki/SHA-1&lt;br /&gt;
//	https://wiki.secondlife.com/wiki/SHA-1&lt;br /&gt;
//&lt;br /&gt;
//	This library is free software; you can redistribute it and/or&lt;br /&gt;
//	modify it under the terms of the GNU Lesser General Public License&lt;br /&gt;
//	as published by the Free Software Foundation;&lt;br /&gt;
//	version 3 of the License.&lt;br /&gt;
//	&lt;br /&gt;
//	This library is distributed in the hope that it will be useful,&lt;br /&gt;
//	but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
//	GNU Lesser General Public License for more details.&lt;br /&gt;
//	&lt;br /&gt;
//	You should have received a copy of the GNU Lesser General Public License&lt;br /&gt;
//	along with this library.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;&lt;br /&gt;
//	or write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,&lt;br /&gt;
//	Boston, MA  02111-1307  USA&lt;br /&gt;
//	&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//===================================================//&lt;br /&gt;
//               Combined Library v1.0               //&lt;br /&gt;
//             &amp;quot;Nov 26 2013&amp;quot;, &amp;quot;00:11:59&amp;quot;             //&lt;br /&gt;
//  Copyright (C) 2004-2012, Strife Onizuka (cc-by)  //&lt;br /&gt;
//    http://creativecommons.org/licenses/by/3.0/    //&lt;br /&gt;
//===================================================//&lt;br /&gt;
//{&lt;br /&gt;
&lt;br /&gt;
string hexc=&amp;quot;0123456789ABCDEF&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//} Combined Library&lt;br /&gt;
&lt;br /&gt;
string Base64_SHA1(string plain, integer bit_length) { &lt;br /&gt;
    integer H1 = 0x67452301;&lt;br /&gt;
    integer H2 = 0xefcdab89;&lt;br /&gt;
    integer H3 = 0x98badcfe;&lt;br /&gt;
    integer H4 = 0x10325476;&lt;br /&gt;
    integer H5 = 0xc3d2e1f0;&lt;br /&gt;
&lt;br /&gt;
    integer b = ((bit_length + 40) &amp;gt;&amp;gt; 5) | 15;//this works because we want the value to be one less than the next appropriate multiple of 16.&lt;br /&gt;
    string buf = &amp;quot;AAA&amp;quot;;&lt;br /&gt;
    integer i = -5;&lt;br /&gt;
    do buf += buf; while((i = -~i));&lt;br /&gt;
    integer S = (6 * llSubStringIndex((plain)+&amp;quot;=&amp;quot;, &amp;quot;=&amp;quot;));&lt;br /&gt;
    integer T = 0x80000000;&lt;br /&gt;
    if(bit_length) {&lt;br /&gt;
        if(S &amp;lt; bit_length) {&lt;br /&gt;
            plain = llDeleteSubString(plain, S, 0x7FFFFFF0);&lt;br /&gt;
            i = ((bit_length + 23) / 24) * 24;&lt;br /&gt;
            do &lt;br /&gt;
                plain += buf;&lt;br /&gt;
            while((S += 576) &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
        T = 23 - ((~-(bit_length)) % 24);&lt;br /&gt;
        T = (llBase64ToInteger(llGetSubString((llGetSubString(plain = llGetSubString(plain, 0, (bit_length / 6) | 3), -4, (~-(S / 6)))) + &amp;quot;AAAAA&amp;quot;, 0, 5)) &amp;amp; (0xFFFFFF00 &amp;lt;&amp;lt; T)) | (0x00000080 &amp;lt;&amp;lt; T);&lt;br /&gt;
    }&lt;br /&gt;
    //llOwnerSay(llList2CSV([b,j, llStringLength(buf), llIntegerToBase64(j &amp;lt;&amp;lt; (6 - ((b % 3) &amp;lt;&amp;lt; 1)))]));&lt;br /&gt;
    plain = llInsertString( llDeleteSubString(plain, -4, -1) + &lt;br /&gt;
                            llGetSubString(llIntegerToBase64(T), 0, 5) + buf, (-~((b &amp;lt;&amp;lt; 4) / 3)), &lt;br /&gt;
                            llGetSubString(llIntegerToBase64(bit_length &amp;lt;&amp;lt; (6 - ((b % 3) &amp;lt;&amp;lt; 1))), 0, 5));&lt;br /&gt;
    //llOwnerSay(llList2CSV([llStringLength(plain), Base64ToHex(plain), T]));&lt;br /&gt;
    list x;&lt;br /&gt;
    i = 0;&lt;br /&gt;
    do {&lt;br /&gt;
        integer A = H1;&lt;br /&gt;
        integer B = H2;&lt;br /&gt;
        integer C = H3;&lt;br /&gt;
        integer D = H4;&lt;br /&gt;
        integer E = H5;&lt;br /&gt;
        x = (list)(bit_length = 0);//the zero gets flushed off the stack by the later loops&lt;br /&gt;
        do {&lt;br /&gt;
            T = llBase64ToInteger(buf = llGetSubString(plain, T = ((i + bit_length) &amp;lt;&amp;lt; 4) / 3, T+6)) &amp;lt;&amp;lt; (S = ((i + bit_length) % 3) &amp;lt;&amp;lt; 1);&lt;br /&gt;
            if(S)&lt;br /&gt;
                T = T | (llBase64ToInteger(&amp;quot;A&amp;quot; + (llDeleteSubString(buf, 0, 1))) &amp;gt;&amp;gt; (6 - S));&lt;br /&gt;
//            llOwnerSay(&amp;quot;W[&amp;quot;+(string)j+&amp;quot;]=&amp;quot;+hex(T));&lt;br /&gt;
            x += T;&lt;br /&gt;
            T += ((A &amp;lt;&amp;lt; 5) | ((A &amp;gt;&amp;gt; 27) &amp;amp; 0x1F)) + (D ^ (B &amp;amp; (C ^ D))) + E + 0x5a827999;//k&lt;br /&gt;
            E = D;&lt;br /&gt;
            D = C;&lt;br /&gt;
            C = ((B &amp;lt;&amp;lt; 30) | ((B &amp;gt;&amp;gt; 2) &amp;amp; 0x3FFFFFFF));&lt;br /&gt;
            B = A;&lt;br /&gt;
            A = T;&lt;br /&gt;
        } while(16 &amp;gt; (bit_length = -~bit_length));&lt;br /&gt;
//		llOwnerSay(llList2CSV(hexm(x)));&lt;br /&gt;
        do {&lt;br /&gt;
            S = llList2Integer(x,  -3) ^ llList2Integer(x,  -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16);&lt;br /&gt;
            x = llList2List(x + (T = ((S &amp;lt;&amp;lt; 1) | !!(S &amp;amp; 0x80000000))), -16, -1);&lt;br /&gt;
//            llOwnerSay(&amp;quot;W[&amp;quot;+(string)j+&amp;quot;]=&amp;quot;+hex(T));&lt;br /&gt;
            T += ((A &amp;lt;&amp;lt; 5) | ((A &amp;gt;&amp;gt; 27) &amp;amp; 0x1F)) + (D ^ (B &amp;amp; (C ^ D))) + E + 0x5a827999;//k&lt;br /&gt;
            E = D;&lt;br /&gt;
            D = C;&lt;br /&gt;
            C = ((B &amp;lt;&amp;lt; 30) | ((B &amp;gt;&amp;gt; 2) &amp;amp; 0x3FFFFFFF));&lt;br /&gt;
            B = A;&lt;br /&gt;
            A = T;&lt;br /&gt;
        } while(20 &amp;gt; (bit_length = -~bit_length));&lt;br /&gt;
        do {&lt;br /&gt;
            S = llList2Integer(x,  -3) ^ llList2Integer(x,  -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16);&lt;br /&gt;
            x = llList2List(x + (T = ((S &amp;lt;&amp;lt; 1) | !!(S &amp;amp; 0x80000000))), -16, -1);&lt;br /&gt;
//            llOwnerSay(&amp;quot;W[&amp;quot;+(string)j+&amp;quot;]=&amp;quot;+hex(T));&lt;br /&gt;
            T += ((A &amp;lt;&amp;lt; 5) | ((A &amp;gt;&amp;gt; 27) &amp;amp; 0x1F)) + (B ^ C ^ D) + E + 0x6ed9eba1;//k&lt;br /&gt;
            E = D;&lt;br /&gt;
            D = C;&lt;br /&gt;
            C = ((B &amp;lt;&amp;lt; 30) | ((B &amp;gt;&amp;gt; 2) &amp;amp; 0x3FFFFFFF));&lt;br /&gt;
            B = A;&lt;br /&gt;
            A = T;&lt;br /&gt;
        } while(40 &amp;gt; (bit_length = -~bit_length));&lt;br /&gt;
        do {&lt;br /&gt;
            S = llList2Integer(x,  -3) ^ llList2Integer(x,  -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16);&lt;br /&gt;
            x = llList2List(x + (T = ((S &amp;lt;&amp;lt; 1) | !!(S &amp;amp; 0x80000000))), -16, -1);&lt;br /&gt;
//            llOwnerSay(&amp;quot;W[&amp;quot;+(string)j+&amp;quot;]=&amp;quot;+hex(T));&lt;br /&gt;
            T += ((A &amp;lt;&amp;lt; 5) | ((A &amp;gt;&amp;gt; 27) &amp;amp; 0x1F)) + ((B &amp;amp; C) | (B &amp;amp; D) | (C &amp;amp; D)) + E + 0x8f1bbcdc;//k&lt;br /&gt;
            E = D;&lt;br /&gt;
            D = C;&lt;br /&gt;
            C = ((B &amp;lt;&amp;lt; 30) | ((B &amp;gt;&amp;gt; 2) &amp;amp; 0x3FFFFFFF));&lt;br /&gt;
            B = A;&lt;br /&gt;
            A = T;&lt;br /&gt;
        } while(60 &amp;gt; (bit_length = -~bit_length));&lt;br /&gt;
        do {&lt;br /&gt;
            S = llList2Integer(x,  -3) ^ llList2Integer(x,  -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16);&lt;br /&gt;
            x = llList2List(x + (T = ((S &amp;lt;&amp;lt; 1) | !!(S &amp;amp; 0x80000000))), -16, -1);&lt;br /&gt;
//            llOwnerSay(&amp;quot;W[&amp;quot;+(string)j+&amp;quot;]=&amp;quot;+hex(T));&lt;br /&gt;
            T += ((A &amp;lt;&amp;lt; 5) | ((A &amp;gt;&amp;gt; 27) &amp;amp; 0x1F)) + (B ^ C ^ D) + E + 0xca62c1d6;//k&lt;br /&gt;
            E = D;&lt;br /&gt;
            D = C;&lt;br /&gt;
            C = ((B &amp;lt;&amp;lt; 30) | ((B &amp;gt;&amp;gt; 2) &amp;amp; 0x3FFFFFFF));&lt;br /&gt;
            B = A;&lt;br /&gt;
            A = T;&lt;br /&gt;
        } while(80 &amp;gt; (bit_length = -~bit_length));&lt;br /&gt;
        H1 += A;&lt;br /&gt;
        H2 += B;&lt;br /&gt;
        H3 += C;&lt;br /&gt;
        H4 += D;&lt;br /&gt;
        H5 += E;&lt;br /&gt;
    } while(b &amp;gt; (i += 16));&lt;br /&gt;
    x = [H1, H2, H3, H4, H5];&lt;br /&gt;
    i = -5;&lt;br /&gt;
    buf = &amp;quot;&amp;quot;;&lt;br /&gt;
    do {&lt;br /&gt;
        T = llList2Integer(x,i);&lt;br /&gt;
        bit_length = 32;&lt;br /&gt;
        do {&lt;br /&gt;
            buf += llGetSubString(hexc, b = ((T &amp;gt;&amp;gt; (bit_length -= 4)) &amp;amp; 0xF), b);&lt;br /&gt;
        } while (bit_length);&lt;br /&gt;
    } while ((i = -~i));&lt;br /&gt;
    return buf;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string UTF8_SHA1(string plain) { &lt;br /&gt;
    integer H1 = 0x67452301;&lt;br /&gt;
    integer H2 = 0xefcdab89;&lt;br /&gt;
    integer H3 = 0x98badcfe;&lt;br /&gt;
    integer H4 = 0x10325476;&lt;br /&gt;
    integer H5 = 0xc3d2e1f0;&lt;br /&gt;
&lt;br /&gt;
    //ORing on the extra bit. Since we are working in base64 the byte bounderies aren&#039;t where we want them.&lt;br /&gt;
    //So we get the last byte group and append our extra bit onto it. It contains either 1, 2, or 3 bytes.&lt;br /&gt;
    integer j = llSubStringIndex((plain = llStringToBase64(plain))+&amp;quot;=&amp;quot;, &amp;quot;=&amp;quot;);&lt;br /&gt;
    integer T = 0x80000000;&lt;br /&gt;
    if(j) {&lt;br /&gt;
        j = (6 * (T = j)) &amp;amp; -8;//length in bits&lt;br /&gt;
        T = llBase64ToInteger(llGetSubString((llGetSubString(plain, -4, (~-(T)))) + &amp;quot;AAAA&amp;quot;, 0, 5)) | (0x00000080 &amp;lt;&amp;lt; ((j % 3) &amp;lt;&amp;lt; 3));&lt;br /&gt;
    }&lt;br /&gt;
    integer b = ((j + 40) &amp;gt;&amp;gt; 5) | 15;//this works because we want the value to be one less than the next appropriate multiple of 16.&lt;br /&gt;
    string buf = &amp;quot;AAA&amp;quot;;&lt;br /&gt;
    integer i = -5;&lt;br /&gt;
    do buf += buf; while((i = -~i));//We need 85, 96 is close enough&lt;br /&gt;
    //llOwnerSay(llList2CSV([b,j, llStringLength(buf), llIntegerToBase64(j &amp;lt;&amp;lt; (6 - ((b % 3) &amp;lt;&amp;lt; 1)))]));&lt;br /&gt;
    plain = llInsertString( llDeleteSubString(plain, -4, -1) + &lt;br /&gt;
                            llGetSubString(llIntegerToBase64(T), 0, 5) + buf, (b &amp;lt;&amp;lt; 4) / 3, &lt;br /&gt;
                            llGetSubString(llIntegerToBase64(j &amp;gt;&amp;gt; ((b % 3) &amp;lt;&amp;lt; 1)), 0, 5));&lt;br /&gt;
    //llOwnerSay(llList2CSV([llStringLength(plain), Base64ToHex(plain)]));&lt;br /&gt;
    list x;&lt;br /&gt;
    integer S = 0;&lt;br /&gt;
    do {&lt;br /&gt;
        integer A = H1;&lt;br /&gt;
        integer B = H2;&lt;br /&gt;
        integer C = H3;&lt;br /&gt;
        integer D = H4;&lt;br /&gt;
        integer E = H5;&lt;br /&gt;
        x = (list)(j = 0);//the zero gets flushed off the stack by the later loops&lt;br /&gt;
        do {&lt;br /&gt;
            T = llBase64ToInteger(buf = llGetSubString(plain, T = ((i + j) &amp;lt;&amp;lt; 4) / 3, T+6)) &amp;lt;&amp;lt; (S = ((i + j) % 3) &amp;lt;&amp;lt; 1);&lt;br /&gt;
            if(S)&lt;br /&gt;
                T = T | (llBase64ToInteger(&amp;quot;A&amp;quot; + (llDeleteSubString(buf, 0, 1))) &amp;gt;&amp;gt; (6 - S));&lt;br /&gt;
//            llOwnerSay(&amp;quot;W[&amp;quot;+(string)j+&amp;quot;]=&amp;quot;+hex(T));&lt;br /&gt;
            x += T;&lt;br /&gt;
            T += ((A &amp;lt;&amp;lt; 5) | ((A &amp;gt;&amp;gt; 27) &amp;amp; 0x1F)) + (D ^ (B &amp;amp; (C ^ D))) + E + 0x5a827999;//k&lt;br /&gt;
            E = D;&lt;br /&gt;
            D = C;&lt;br /&gt;
            C = ((B &amp;lt;&amp;lt; 30) | ((B &amp;gt;&amp;gt; 2) &amp;amp; 0x3FFFFFFF));&lt;br /&gt;
            B = A;&lt;br /&gt;
            A = T;&lt;br /&gt;
        } while(16 &amp;gt; (j = -~j));&lt;br /&gt;
//		llOwnerSay(llList2CSV(hexm(x)));&lt;br /&gt;
        do {&lt;br /&gt;
            S = llList2Integer(x,  -3) ^ llList2Integer(x,  -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16);&lt;br /&gt;
            x = llList2List(x + (T = ((S &amp;lt;&amp;lt; 1) | !!(S &amp;amp; 0x80000000))), -16, -1);&lt;br /&gt;
//            llOwnerSay(&amp;quot;W[&amp;quot;+(string)j+&amp;quot;]=&amp;quot;+hex(T));&lt;br /&gt;
            T += ((A &amp;lt;&amp;lt; 5) | ((A &amp;gt;&amp;gt; 27) &amp;amp; 0x1F)) + (D ^ (B &amp;amp; (C ^ D))) + E + 0x5a827999;//k&lt;br /&gt;
            E = D;&lt;br /&gt;
            D = C;&lt;br /&gt;
            C = ((B &amp;lt;&amp;lt; 30) | ((B &amp;gt;&amp;gt; 2) &amp;amp; 0x3FFFFFFF));&lt;br /&gt;
            B = A;&lt;br /&gt;
            A = T;&lt;br /&gt;
        } while(20 &amp;gt; (j = -~j));&lt;br /&gt;
        do {&lt;br /&gt;
            S = llList2Integer(x,  -3) ^ llList2Integer(x,  -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16);&lt;br /&gt;
            x = llList2List(x + (T = ((S &amp;lt;&amp;lt; 1) | !!(S &amp;amp; 0x80000000))), -16, -1);&lt;br /&gt;
//            llOwnerSay(&amp;quot;W[&amp;quot;+(string)j+&amp;quot;]=&amp;quot;+hex(T));&lt;br /&gt;
            T += ((A &amp;lt;&amp;lt; 5) | ((A &amp;gt;&amp;gt; 27) &amp;amp; 0x1F)) + (B ^ C ^ D) + E + 0x6ed9eba1;//k&lt;br /&gt;
            E = D;&lt;br /&gt;
            D = C;&lt;br /&gt;
            C = ((B &amp;lt;&amp;lt; 30) | ((B &amp;gt;&amp;gt; 2) &amp;amp; 0x3FFFFFFF));&lt;br /&gt;
            B = A;&lt;br /&gt;
            A = T;&lt;br /&gt;
        } while(40 &amp;gt; (j = -~j));&lt;br /&gt;
        do {&lt;br /&gt;
            S = llList2Integer(x,  -3) ^ llList2Integer(x,  -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16);&lt;br /&gt;
            x = llList2List(x + (T = ((S &amp;lt;&amp;lt; 1) | !!(S &amp;amp; 0x80000000))), -16, -1);&lt;br /&gt;
//            llOwnerSay(&amp;quot;W[&amp;quot;+(string)j+&amp;quot;]=&amp;quot;+hex(T));&lt;br /&gt;
            T += ((A &amp;lt;&amp;lt; 5) | ((A &amp;gt;&amp;gt; 27) &amp;amp; 0x1F)) + ((B &amp;amp; C) | (B &amp;amp; D) | (C &amp;amp; D)) + E + 0x8f1bbcdc;//k&lt;br /&gt;
            E = D;&lt;br /&gt;
            D = C;&lt;br /&gt;
            C = ((B &amp;lt;&amp;lt; 30) | ((B &amp;gt;&amp;gt; 2) &amp;amp; 0x3FFFFFFF));&lt;br /&gt;
            B = A;&lt;br /&gt;
            A = T;&lt;br /&gt;
        } while(60 &amp;gt; (j = -~j));&lt;br /&gt;
        do {&lt;br /&gt;
            S = llList2Integer(x,  -3) ^ llList2Integer(x,  -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16);&lt;br /&gt;
            x = llList2List(x + (T = ((S &amp;lt;&amp;lt; 1) | !!(S &amp;amp; 0x80000000))), -16, -1);&lt;br /&gt;
//            llOwnerSay(&amp;quot;W[&amp;quot;+(string)j+&amp;quot;]=&amp;quot;+hex(T));&lt;br /&gt;
            T += ((A &amp;lt;&amp;lt; 5) | ((A &amp;gt;&amp;gt; 27) &amp;amp; 0x1F)) + (B ^ C ^ D) + E + 0xca62c1d6;//k&lt;br /&gt;
            E = D;&lt;br /&gt;
            D = C;&lt;br /&gt;
            C = ((B &amp;lt;&amp;lt; 30) | ((B &amp;gt;&amp;gt; 2) &amp;amp; 0x3FFFFFFF));&lt;br /&gt;
            B = A;&lt;br /&gt;
            A = T;&lt;br /&gt;
        } while(80 &amp;gt; (j = -~j));&lt;br /&gt;
        H1 += A;&lt;br /&gt;
        H2 += B;&lt;br /&gt;
        H3 += C;&lt;br /&gt;
        H4 += D;&lt;br /&gt;
        H5 += E;&lt;br /&gt;
    } while(b &amp;gt; (i += 16));&lt;br /&gt;
    x = [H1, H2, H3, H4, H5];&lt;br /&gt;
    i = -5;&lt;br /&gt;
    buf = &amp;quot;&amp;quot;;&lt;br /&gt;
    do {&lt;br /&gt;
        T = llList2Integer(x,i);&lt;br /&gt;
        j = 32;&lt;br /&gt;
        do {&lt;br /&gt;
            buf += llGetSubString(hexc, b = ((T &amp;gt;&amp;gt; (j -= 4)) &amp;amp; 0xF), b);&lt;br /&gt;
        } while (j);&lt;br /&gt;
    } while ((i = -~i));&lt;br /&gt;
    return buf;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer go(string in, string answer) {&lt;br /&gt;
    llOwnerSay(&amp;quot;&amp;quot;);&lt;br /&gt;
    string b = llStringToBase64(in);&lt;br /&gt;
    integer len = (6 * llSubStringIndex((b)+&amp;quot;=&amp;quot;, &amp;quot;=&amp;quot;)) &amp;amp; -8;&lt;br /&gt;
    llResetTime();&lt;br /&gt;
    string outu = UTF8_SHA1(in);&lt;br /&gt;
    float tu = llGetTime();&lt;br /&gt;
    llOwnerSay(llList2CSV(([outu, tu, len])));&lt;br /&gt;
    llResetTime();&lt;br /&gt;
    string outb = Base64_SHA1(b, len);&lt;br /&gt;
    float tb = llGetTime();&lt;br /&gt;
    llOwnerSay(llList2CSV(([outb, tb, len])));&lt;br /&gt;
    if(answer) {&lt;br /&gt;
        llOwnerSay(llList2CSV(([answer, (answer == outu),(answer == outb)])));&lt;br /&gt;
        return (answer == outb) &amp;amp;&amp;amp; (answer == outu);&lt;br /&gt;
    }&lt;br /&gt;
    return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        if(Base64_SHA1(&amp;quot;AAAA&amp;quot;, 24) != &amp;quot;29E2DCFBB16F63BB0254DF7585A15BB6FB5E927D&amp;quot;)&lt;br /&gt;
            llOwnerSay(&amp;quot;Failed Base64_SHA1(\&amp;quot;AAAA\&amp;quot;, 24)&amp;quot;);&lt;br /&gt;
        if(go(&amp;quot;&amp;quot;, &amp;quot;DA39A3EE5E6B4B0D3255BFEF95601890AFD80709&amp;quot;))&lt;br /&gt;
        if(go(&amp;quot;abc&amp;quot;, &amp;quot;A9993E364706816ABA3E25717850C26C9CD0D89D&amp;quot;))&lt;br /&gt;
        if(go(&amp;quot;The quick brown fox jumps over the lazy dog&amp;quot;, &amp;quot;2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12&amp;quot;))&lt;br /&gt;
            llOwnerSay(&amp;quot;All Tests Passed!&amp;quot;);&lt;br /&gt;
//        llOwnerSay((string)llGetTime());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;br /&gt;
 [[Category: LSL Encryption]]&lt;/div&gt;</summary>
		<author><name>Garfield Linden</name></author>
	</entry>
</feed>