xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Sub-forum to lay a basic framework for future expansion and/or modifications to OXT
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by OpenXTalkPaul »

xTalk EVERYWHERE! LET'S MAKE A "XTML"(?) INTERCHANGEABLE STACK FORMAT STANDARD

I've been thinking about this a lot since looking at a few different xTalk implementations lately that it would be great if there was some sort of STAK/xTalk-metaphor based markup language.

I would like to start a "working group" to do this, with a goal of making a standard (W3C or ISO or whatever), some sort of, at least a minimum implementation set, for an official spec for xTalk interchangeability.

My thinking is that this would do for xTalk what the ScriptOnly.livecpdescript stack did for version control + LCScript, but this is meant for replacing other half, the binary UI Stack/Cards/Groups/Background/Substacks, entirely eliminating binary formats. Which is good for several reasons:
  • Binary files that aren't graphics files are a problem when using GitHub for viewing changes or a problem all text based version control system.
  • This could be a mechanism for entirely changing out the xTalk engine the stack is run on!
    Having a set standard would allow there to be converter utilities to easily convert a project's to stack files into a format easily read and converted by a corresponding utilities written for some other xTalk engine. Additionally an xTalk to xTalk dialect trans-piler for conversion of scripts, for at least most of the basics controls, of the stack's object's scripts, for example converting the side-ways L ¬ symbol within a script tagged object (which was used in HyperCard for line-continuation, but throws an error in LCC/OXT), would get automatically converted to a backslash & cr on during transpiling the STAK/xTalk Markup to LCC/OXT STAK.
FourthWorld
Posts: 296
Joined: Sat Sep 11, 2021 4:37 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by FourthWorld »

How many xTalk engines are there?

What is the combined audience size of current users of them?

What is the size of the subset who would be moving projects between them?
xAction
Posts: 285
Joined: Thu Sep 16, 2021 1:40 pm
Contact:

Re: xTalk EVERYWHERE! LET'S MAKE A "XTML"(?) INTERCHANGEABLE STACK FORMAT STANDARD

Post by xAction »

Why not just stick space in where the line continuation symbol is?
Isn't it there because of HyperCard's text width limit, you know because it was made on a 9 inch screen? You're not going to be reading any of this data back into Hypercard, so that limit won't be an issue.

a .livecodescript file is just a .txt file with a long extension
We could do the same with text files:

Name.stackproperties
Name.cardproperties
Name.buttonproperties

Name.stackscript
Name.cardscript
Name.buttonscript

have another file for more verbos properties
field.htmlText
svgWidget.svgPath

"ML" indicates a mark up what kind of mark up would be needed that HTML and XML don't already handle?

Without binary the files will become huge won't they? Especially with XML.
ControlsHarvestv6.zip
(76.45 KiB) Downloaded 351 times
Here's a stack full of test controls, has some substacks and scripted buttons, and the stack script has a bunch of code for extracting properties and writing files.

The XTML button is an empty for you to experiment with.
Dump that stack and it's substacks into some format prototype you think might work.

This is a .cxx file out of FLTK FLuid, the world's ugliest UI maker. But .cxx is native to C++ so with the header file it should render a UI in C++ program easy.
This is a UI with a window, tabbed group, group, buttons, scrollbar, text edit field
I totally forget to how to add scripts to these things, but scripts and raw C++ coding is possible within this file type as well..because its C++ code.

It's interesing it writes out the structure in the reverse order the items were created and displayed in the treeview of the Fluid editor.

Code: Select all

// generated by Fast Light User Interface Designer (fluid) version 1.0302

#include "AFluidFile.h"

/**
   //FLTK window
*/
Fl_Double_Window* make_window() {
  Fl_Double_Window* w;
  printf("Hello, World!\n");
// my comment text within code
  { Fl_Double_Window* o = new Fl_Double_Window(321, 179);
    w = o;
    { Fl_Group* o = new Fl_Group(15, 25, 150, 100, "FLTK_GROUP");
      { new Fl_Scrollbar(15, 84, 135, 15, "FLTK_SCROLLBAR");
      } // Fl_Scrollbar* o
      { new Fl_Button(35, 47, 64, 20, "FLTK_BUTTON");
      } // Fl_Button* o
      o->end();
    } // Fl_Group* o
    { Fl_Tabs* o = new Fl_Tabs(149, 25, 80, 85, "FLTK_TABS");
      o->tooltip("Tabs tooltip");
      o->end();
    } // Fl_Tabs* o
    { new Fl_Text_Editor(160, 53, 102, 104, "FLTK_TEXT_EDITOR");
    } // Fl_Text_Editor* o
    o->end();
  } // Fl_Double_Window* o
  return w;
}
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by OpenXTalkPaul »

A rough idea example for the sort of markup for stack/card/backgrnd-groups/btn/fld/ I was thinking about, presented as XML, but something else comparable such as JSON, or YAML should be fine to use instead of XML.

Code: Select all


<Stack stackPreviewImage="./Images/MyStack.png">
  <mainStack> </stackRect>
  <stackRect> 0,0,1000,720 </stackRect>
  <stackForeGroundColor> 120,60,90 </stackForeGroundColor>
  <stackBackgroundColor> 90,60,30 </stackBackgroundColor>

  <Card name="This is Card One" ID=1>

  <Group name="Hello Card Numero Uno!">
    <showName>false</showName>
    -- Some html style text in a fld and button grouped together
    <Field>
      <htmlText> <b> Welcome to OpenXTalk </b> </htmlText>
    </Field>
    <Button>
      <xTalkScript>
        on mouseUp
          answer "Hello World" with "Hello" with "Hello" or "OK"
          put it into the message box
        end mouseUp
      </xTalkScript>
    </Button>
  </Group>

  </Card>

  <Card name="This is Card Two" ID=2>
  -- -- two dashes is a comment indicator, the text following it up until
  -- ----- a new line is encountered, should be ignored
  --------------------------------------------------------
    <backgroundGroup name="MyBackgroundGrp">
    -- A grouped that with it's backgroundBehavior group set to true (in LCC / OXT DPE),
    --  that can be placed on multiple cards
      <Widget kind="org.oxt.widget.coolwidget.paulmcclernan">
          <Rect> 20,20,1002,748 </Rect>
          <Disbled> true </Disbled>
          <Opaque> true </Opaque>
      </Widget>

       <Button name="Test Button">
          <showName> true </showName>
          <xTalkScript>
            on mouseUp
              answer "Hello World" with "Hello"
              put the result into fld "Output Fld"
            end mouseUp
          </xTalkScript>
       </Button>

       <Field name="Output Fld">
         <foreGroundColor> 120,60,90 </foreGroundColor>
         <backgroundColor> 90,60,30 </backgroundColor>
       </Field>

    </backgroundGroup>

  </Card>

  <Card>
    <Field>
        <text> Just some plain old text </text>
    </Field>
  </Card>

  <subStack name="MyGroovyPalette">
    <stackRect> 0,0,150,240 </stackRect>
    <stackForeGroundColor> 120,60,90 </stackForeGroundColor>
    <stackBackgroundColor> 90,60,30 </stackBackgroundColor>
    <Card>
      <Widget kind="org.oxt.widget.coolwidget.paulmcclernan">
         <disbled> true </disbled>
         <dpaque> true </dpaque>
        <xTalkScript>
          on coolWidgetMouseDown
            put "Mouse is within Widget"
          end coolWidgetMouseDown
        </xTalkScript>
      </Widget>
    </Card>
  </subStack>

</Stack>

Now imagine that the the stack author wants this to run on this stack with _hyperscript, a JS based xTalk engine, and the stack will be rendered into a WebBrowser window, perhaps,<group> tags became html <div> tags along the way, but the stack xml is converted into an appropriate format for _hyperscript and should relatively match content layout and basic xTalkScript functionality. For examples the Answer dialog and Ask Dialog objects, and their syntax and properties should be in the minimal requirement list for xTalk Interface objects, and go card "myCard1", go stack, go URL "https://..." etc. should be supported in a minimal basic syntax requirement.
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by OpenXTalkPaul »

FourthWorld wrote: Fri Nov 19, 2021 10:12 pm How many xTalk engines are there?
There's actually several that I've found, actively or semi actively in developement.

Last night I found an xTalkScript JS lib called _hyperscript that has some very interesting properties that can be used in a web or a client side React Native or Node.js context.
I find it very interesting:
https://hyperscript.org

There's also WyldCard that's an engine that's JAVA based, I believe but can compile to LLVM bytecode (not sure) ,
could modify the grammar, for instance quick look at the parsing setup, I see where to add the grammar syntax "top" (as in a synonym for the "HyperCard" keyword, 'exit to top' = 'exit to hypercard', used in LC)
https://github.com/defano/wyldcard

There's stackSmith, that's a C++ engine that's set to be extensible, Objective C on macOS but I imagine could be compiled to use GTK or the like as platform alternatives (you can read about the framework for doing that on his website), A stackSmith related project ca convert an XML based file format with a CLI HyperCard to XML converter that outputs to a stackSmith compatible XML. This is what go me thinking about an XML framework that can generate stacks on the fly from a tagging system.

This allows a standard to ease take stacks to anywhere THEY COULD go, even some further xTalk that hasn't been created (yet). Who knows maybe I become a _hyperscript enthusiast and work on an IDE for that that runs on React Native with some C library that talks to my Music gear? And have features that can convert Stacks/Cards into HTML/DIVS with _hyperscript wiring to some JS and WEBGL 3D Rendering It's about the opportunities and possibilities that having a standardized interchange format could enable.
What is the combined audience size of current users of them?
Why? I don't care, if there's any base of people interested in furthering an xTalkScript in any form, then that's some people I want to talk to.
What is the size of the subset who would be moving projects between them?
That depends on unknown future circumstances, perhaps one day it becomes a huge flood of users due to a mass stack exodus for whatever reasons. I hear tell that the SuperCard folks are working on a modern rewrite of their xTalk engine.

My thinking is a 'Second Foundation', or rather the long over due first open standardization of xTalk, hopefully in collaborative way.
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by OpenXTalkPaul »

It’s also about freeing xTalk from ownership by any particular entity / company, whether thats SuperCard, LC running on WebASM, OXT or someone running an old xTalk on an emulator or vintage Apple ][ hardware... for whatever reason, this would be a base interchange format.

Take the thing with binary being smaller than a bunch of xml markup. That maybe true but I can easily read through the xml changes, in a highlighted split comparison, on my phone! I could create the xml in a GItHUB GiST snippet, go home and paste it into a converter and it’s spits out a matching stack, complete with positioned objects, bins, flds, text, fills colors , multiple cards, sub stacks, instantly created from the tagged elements in the Markup.

Some retro enthusiast could have HC utility that spits out a very similar HyperCard Stack built from that same marked up data. ImageData or even Binary stacks (and builder extensions) could be embedded as Base64 data (which is what my SVGlib-Maker does, when the library opens it converts those already encoded SVG files from B64 into an Array in memory where they’re basically image objects I can use to quickly fill an image box with extremely quickly in succession, 52 card color SVG deck displayed in random orders takes 10s of millsecs max). That Black Jack stack I actually started as a HyperCard project as a teen, I used a custom playing card font for HC rendering, I converted it with LCC 6.x, it looks great running on Android!

Also consider something like that self-indexing RecourceCenter that we've talked about, a Dev sub category / Game Dev Technics could have a very basic example snippet, where just a few tags of STAKML would enough to generate that stack in memory. Perhaps loading a common background with a common background-behavior, and a single card with an image, some fld text, and maybe a button to copy a script or object group for pasting into another stack.

Maybe we could have could proportionally layout standards too <center> <fld name="MyFeild"><text> Hello World </text></fld></center > would center position a field "MyFeild" in the center of the stack/card, or background/group?

Among having other use cases that I'm sure I could think of, this could be used as a Stack Template format for example.

Just spittin' out ideas here.

This could be a long term xTalk community goal, with some sort of working group that discusses general technical aspects of a markup (or markdown).
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

Re: xTalk EVERYWHERE! LET'S MAKE A "XTML"(?) INTERCHANGEABLE STACK FORMAT STANDARD

Post by OpenXTalkPaul »

xAction wrote: Fri Nov 19, 2021 10:26 pm Why not just stick space in where the line continuation symbol is?
Isn't it there because of HyperCard's text width limit, you know because it was made on a 9 inch screen? You're not going to be reading any of this data back into Hypercard, so that limit won't be an issue.
Yes with this format I'm imagining, you absolutely would be able to make a HyperCard Script that reads the STACKML (or whatever name) and generates a HC Stack from the intechangable data that is has equivalent objects for, so theoretically Cards and backgrounds be created with relatively the same look, with text, perhaps including Base64 embedded BMP, PNG or GIF image data for extraction.
a .livecodescript file is just a .txt file with a long extension
We could do the same with text files:
Actually, it can be slightly more than that, there is some format, as well as for in-line documentation to be parsed for Dictionary entries. There's a few other things to know like "default script" .livecodescript has to be named/labeled a certain way in order to work with extension builder as a widgets Default scripts for the left side pane of the Script Editor, for example.
Name.stackproperties
Name.cardproperties
Name.buttonproperties

Name.stackscript
Name.cardscript
Name.buttonscript
I don't like the whole 'thing.property' style naming pattern
have another file for more verbos properties
field.htmlText
svgWidget.svgPath
I was actually thinking the other way, embedding assets like svgPath or imageData binary data encoded into a ascii friendly encoding like Base64.
"ML" indicates a mark up what kind of mark up would be needed that HTML and XML don't already handle?[/code]
Event handling for one thing. This _hyperscript has "wait" built right in, in fact the most interesting thing may be the CallBack-LESS callback as support for a "Promise" type is baked in (that's where your app gets a promise that it will get the data when it gets it, then it should do continue that script, this is all WHILE other things are going on async)

Without binary the files will become huge won't they? Especially with XML.
Not necessarily, no I don't see why they would, most objects in a lot of stacks have only 1 or 2 default props set on them.

The IDE ALREADY generates parts of itself from script/template stack, this could be used as a markup for doing that.

Or it maybe could be used in part for object styleSheet properties-sets records that could be applied to any object the supports the props stored in that style sheet ( for using consistant color schemes across a project for example ).
ControlsHarvestv6.zip
Here's a stack full of test controls, has some substacks and scripted buttons, and the stack script has a bunch of code for extracting properties and writing files.

The XTML button is an empty for you to experiment with.
Dump that stack and it's substacks into some format prototype you think might work.

This is a .cxx file out of FLTK FLuid, the world's ugliest UI maker. But .cxx is native to C++ so with the header file it should render a UI in C++ program easy.
This is a UI with a window, tabbed group, group, buttons, scrollbar, text edit field
I totally forget to how to add scripts to these things, but scripts and raw C++ coding is possible within this file type as well..because its C++ code.

It's interesing it writes out the structure in the reverse order the items were created and displayed in the treeview of the Fluid editor.

Code: Select all

// generated by Fast Light User Interface Designer (fluid) version 1.0302

#include "AFluidFile.h"

/**
   //FLTK window
*/
Fl_Double_Window* make_window() {
  Fl_Double_Window* w;
  printf("Hello, World!\n");
// my comment text within code
  { Fl_Double_Window* o = new Fl_Double_Window(321, 179);
    w = o;
    { Fl_Group* o = new Fl_Group(15, 25, 150, 100, "FLTK_GROUP");
      { new Fl_Scrollbar(15, 84, 135, 15, "FLTK_SCROLLBAR");
      } // Fl_Scrollbar* o
      { new Fl_Button(35, 47, 64, 20, "FLTK_BUTTON");
      } // Fl_Button* o
      o->end();
    } // Fl_Group* o
    { Fl_Tabs* o = new Fl_Tabs(149, 25, 80, 85, "FLTK_TABS");
      o->tooltip("Tabs tooltip");
      o->end();
    } // Fl_Tabs* o
    { new Fl_Text_Editor(160, 53, 102, 104, "FLTK_TEXT_EDITOR");
    } // Fl_Text_Editor* o
    o->end();
  } // Fl_Double_Window* o
  return w;
}
OK Cool, thanks, I'll check it out!
xAction
Posts: 285
Joined: Thu Sep 16, 2021 1:40 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by xAction »

I just opened 30 livecodescripts they are just text files.
Not even a hidden special character of any kind.

With inconsistant commenting too.
Line breaks where there doesn't need to be line breaks...they code this in Hypercard?

Code: Select all

/* Properties must only be defined against the element with no
			 * name. */
drawing.livecodescript has XML reading functions btw
LiveCode Community9.6.1\Extensions\com.livecode.library.drawing\drawing.livecodescript

The api_Livecode_builder/builder.js is as the extension suggests javascript
revextensionbuilder.livecode is binary of course
revextensionbuilderbehavior.livecodescript is just text
That's it for builder in the LC directory
<Stack stackPreviewImage="./Images/MyStack.png">
Assuming a preview image exists is asking for trouble.
Unless this is specifcally a file building the resources/sample stacks type thing.
But expectations of extra features/data should be separate from raw data
<mainStack>
Should be a property flagged within a stack descript ie
<mainstack>"A stack name"</mainstack>
Since it's something that can change.
xAction
Posts: 285
Joined: Thu Sep 16, 2021 1:40 pm
Contact:

Re: xTalk EVERYWHERE! AN XTML Prototype

Post by xAction »

Code: Select all

<XTML>
<Stack>
   <ID>1002</ID>
  <Name>"Basic stack"</Name>
  <Title>"The basic stack title version 0.0.1"</Title>
  <mainStack>ID = 1002 name = "Basic stack"</mainStack>
  <Rect> 0,0,1000,720 </Rect>
  <Fullscreen>false</Fullscreen>
  <Color0>120,60,90</Color0>
  <Color1>0,60,30</Color1>
  <OtherProperty> "bla bla bla"</OtherProperty>

  <Cards>
  <index>ID=1002 name="First card"</index>
  <index>ID=1003 name="Second Card"</index>
  </Cards>
  
  <substacks>
  <index>ID = 1002 name="First Substack"</index>
  <index>ID = 1003 name="Second Substack"</index>
  <index>ID=1004 name="Another Substack></index>
  </substacks>
  
  <customProperties>
  <index>ID=1002 name="SomeArray"</index> 
  <index>ID=1003 name="SomeList"</index> 
   <index>ID=1003 name="Preferences"</index>
  </customProperties>
  
  <Extensions>
  <index>SomeWidget.lce</index>
  <index>AwesomeLib.lce</index>
  </Extensions>
  
    <Externals>
  <index>DeprecatedByFools.dll</index>
  <index>ThisShouldWorkButDoesnt.dll</index>
  </Externals>
  
<Handlers>
  <index>name="OpenStack"</index>
  <index>name="CloseStack</index>
  <index>name="DoSomeJavascript"</index>
</Handlers>

<Functions>
  <index>name="GetProp"</index>
  <index>name="SetProp</index>
  <index>name="LoadXTML"</index>
</Functions>

<handler>
<language>OpenXTalk</language>
<requires>OpenXTalkLib</requires>
<label>OpenStack</label>
<script>
put the short name of this stack into theMessage
if exists(stack "MessageBox") then put theMessage into field 1 of stack "MessageBox"
</script>
</handler>

-- let the parser/app do the work with encapsulating the script body with 'on/end' etc

<handler>
<language>Javascript</language>
<requires>-Node.js for instance</requires>
<label>OpenStack</label>
<script>
Javascript definition of the same kind of process of opening a 'stack' just as an example, probably a bad example
</script>
</handler>

<handler>
<language>Hyperscript</language>
<requires> library URL goes here</requires>
<label>OpenStack</label>
<script>
 --Hyperscriptdefinition of the same kind of process of opening a 'stack' just as an example, probably a bad example
</script>
</handler>

  -- Same process for functions, going to need :
  -- <argument>type=float name="varName"<argument> tags 
  -- in functions and handlers
  
  -- we've indexed some properties, extensions above
  -- so then they get defined below but that's going to take a lot of space 
  -- so use your imagination here
  
  <property>
  <name>SomeArray</name>
  <type>array</type>
  
  <content>
  <key>KeyIndex
  <value>"First Index value"</value>
   </key>
   
  --etc, etc however we figure this stuff out. Seems complicated
  </content>
  </property>
  
  </Stack>
  </XTML>
  
That started out real small until I started adding some real world stack contents/properties.

So this is an example of a base stack file, where only the stack's existance it's properties and it's dependencies are defined.

Then Cards and Substacks are defined in their own files and act as external dependencies in the same way C uses #include , python uses Import, Lua and Ruby use Require.

When XTML files says <Cards> or <Substacks> the parser says "Oh I'll iterate over the index and go look at the rest of this file for more <stack> or <card> definitions, if I don't find them then I'll dig around in the file paths I know about for files of that ID and/or that name"

Not sure ID is relevant until containers/objects are actually in use, you can change the load order of your containers/objects arbitrarily so maybe ID's only happen when they are actually being used at runtime. Have to parse a bunch of scripts and see if ID's come into play to a point they become absolutely necessary to predefine in every XTML file.

Then we have a card XTML that can be independent of any one stack
At the operating system level it just looks like "Name.xtml" , for user sanity could keep all those in a "cards" subfolder of the project, the stack file as described above will go looking for it first in it's own path, then the cards subfolder, maybe even a giant internet repository.

The parser would check for the card property to decide how it wants to then load it. Optionally one could have a command like

Code: Select all

Open Card "myCard.xtml" as substack of this stack.

Code: Select all

<XTML>
<Card>
   <ID>1002</ID>   <<< Again that might be runtime dependent on load order
  <Name>"Basic Card"</Name>
  <Rect> 0,0,1000,720 </Rect>
  <Color0>120,60,90</Color0>
  <Color1>0,60,30</Color1>
  <OtherProperty> "bla bla bla"</OtherProperty>

  <Groups>
  <index>ID=1002 name="First group"</index>
  <index>ID=1003 name="Second group"</index>
  <index>ID=1004 name="Group Three"</index>
  </Groups>

  <customProperties>
  <index>ID=1002 name="First Property"</index>
  <index>ID=1003 name="Second Property"</index>
  <index>ID=1004 name="Property Three"</index>
  </customProperties>
 
<Scripts>
  <index>ID=1002 name="OpenCard"</index>
  <index>ID=1003 name="CloseCard</index>
  <index>ID=1004 name="DoJavascript"</index>
</Scripts>

 </Card>
 
-- the card is defined...then below the card definition
-- Repeat the same pattern of defining objects as above 
-- with the idea that the definitions of each subContainer object
-- work on the principle of of #include, require, import etc
-- and are acting as an index of what to load into the card/container
-- However now we reached the card level it'll all be one file generally
-- could have the parser load things from files to keep it modular

-- in this way everything can be indexed first, then defined indepedently
-- you could have a thin project file that just has an index
-- then load everything from individual files if you have massive data
-- or are trying to dynamically mix and match some stacks and cards like the Reference Stack
-------------------------------------------------------------------------------------------

<group>
<name>"First Group"</name>
<rect>0,0,100,300</rect>
<color0>255,255,50</color0>
<opaque>true</opaque>
<behavoir>background</behavoir>

<controls>
<index>Id=1002 "First button" object="button"</index>
<index>Id=1003 "Second button" object="button"</index>
<index>Id=1004 "A field" object="field"</index>
</controls>

-- properties, scripts, etc it can get thick in here
<button>
<id>1002</id> -- might have 100 buttons named "button"...
<name>"First Button"</name>
<rect>10,10,100,30</rect>
<color0>0,0,0</color0>
<color1>250,250,250</color1>

<handlers>
<index>MouseUp</index>
</handlers>

<functions>
<index>GetFile</index>
</functions>

<handler>
<language>Hyperscript</language>
<requires> library URL goes here</requires>
<label>MouseUp</label>
<script>
 --Hyperscriptdefinition mouseUp triggers "GetFile" function
</script>
</handler>

<function>
<language>OpenXTalk</language>
<requires>OpenXTalkLib</requires>
<label>GetFile</label>
<script>
 answer file "Pick a file, any file"
 if it is not empty then put URL ("file" & it") into tText
 if exists (field "filetext" of this stack) then put tText into field "filetext" of this stack
</script>
</function>

</button>

-- etc for all the controls in the group
</group>
 
-- etc for all loose items on card
-- maybe should start with  complete card index of controls on card?  
-- some extra property definition like 'parent='???
</XTML>
Mostly want to be generic as possible, ie, Color0, Color1 then let the parser decide how uses that index. I was thinking

<color>Id=0 rgb=128,128,128</color>

But that seems to get muddy.
The backgroundColor of a LC stack is empty by default.

<colors>
<index>255,255,255</index>
<index>155,155,155</index>
</colors>

Might be another way to do it. Could work under a default assumption that there is a foregroundColor,backgroundColor,focusColor, etc pattern.

Hell when you are talking about Hypercard you don't even have colors.

Well that was fun.
xAction
Posts: 285
Joined: Thu Sep 16, 2021 1:40 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by xAction »

ugh.
XTML, stackML, hyperML, are all taken.
OpenStack is taken. CardFile is taken.

Man we should have started this in the 90s before they stole all the good names.

How about XXXFiles? Wooops don't look that up online it's exactly what it you'd think it was.
XT files are music tracker files. HXML is haxey file
  • Hyper Open Stack Exchange = HOSE files?
    Parse Any Stack That Exists = PASTE files?
    xTalk Everywhere = XTE files? , taken by some DNA analyzer
    XML for Stacks = XMLFS damnit <-- looks handy.
    Hyper Language EXchange= HLEX
    Elegant Scripting Language Ecapsulated By Ugly Markup = ESLEBUM files?
    Exchange Stacks Controls And Properties Equally = ESCAPE
    Extensible Stack Markup Language...ESML taken by earth scientists...
    XSML is audio data
    Elegant Scripting Language Exchange = ESLE isn't taken
    Hyper Type Script Exchange = HTSE
    No Stack Left Behind = NSLB
    Xtalk Markup Exchange Node = XMEN
    Xtalk File Exchange Markup Syntax = XFEMS
    Properties And Syntax Of Xtalks = PASOX
    Lets Exchange xTalk Stacks = LEXS
Universal xTalk Meta Language = UXML
UXML files are text files that define the logical structure of the user interface. The format used in UXML files is inspired by HTML (HyperText Markup Language), XAML (eXtensible Application Markup Language), and XML (eXtensible Markup Language)
Looks like Javascript..blech!

Looks like XAML might already fill the need. A 'simple" window with button in XAML

Code: Select all

<Window x:Class = "FirstStepDemo.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   xmlns:local = "clr-namespace:FirstStepDemo" 
   mc:Ignorable = "d" Title = "MainWindow" Height = "350" Width = "604"> 
	
   <Grid> 
      <Button Content = "First Button" Height = "30" Width = "80"/> 
      <TextBlock Text = "Congratulations you have successfully build your first app" 
         Height = "30" Margin = "162,180,122,109"/> 
   </Grid> 
	
</Window> 
All those URLs look like bad news.

Back to some names, let's see
Open X Exchange Syntax = OXES
Xtalk Exchange Markup Language = XEML it's unused!
Universal Stack Exchange Dialect = USED is unused, how ironic
All Out Of Ideas = AOOI
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by OpenXTalkPaul »

XTALK COMMUNITY MARKUP LANGUAGE (XTC-ML)!

Encapsulated Stack .estk ?

Anyway I had a play around with making some of one half of the problem, creating the MarkUp.

I also found, on the share site (I think), someone else had already made a stack that did a StackToXML thing, using base64 for ascii safe binary encoding the same way I was for resource elements.

Notice they binary64Encoded the scripts too (in order to preserve line breaks) output from that (minus base64 binary data):

Code: Select all

<stack>
<rect>231,1157,1141,1788</rect>
<destroyStack>false</destroyStack>
<maxWidth>65535</maxWidth>
<visible>true</visible>
<maxHeight>65535</maxHeight>
<editMenus>false</editMenus>
<iconic>false</iconic>
<cantAbort>false</cantAbort>
<minWidth>32</minWidth>
<liveResizing>true</liveResizing>
<cantModify>false</cantModify>
<minHeight>32</minHeight>
<foreColor>0,0,0</foreColor>
<alwaysBuffer>false</alwaysBuffer>
<shadowOffset>4</shadowOffset>
<systemWindow>false</systemWindow>
<hcAddressing>false</hcAddressing>
<startUpIconic>false</startUpIconic>
<name>stack "Test Markup"</name>
<windowManagerPlace>false</windowManagerPlace>
<shadow>true</shadow>
<cantDelete>false</cantDelete>
<scalefactor>1</scalefactor>
<altId>0</altId>
<fullscreen>false</fullscreen>
<icon>0</icon>
<decorations>title,menu,minimize,maximize,close</decorations>
<style>toplevel</style>
<resizable>true</resizable>
<metal>false</metal>
<id>8970</id>
<dynamicPaths>false</dynamicPaths>
<windowShape>0</windowShape>
<blendLevel>0</blendLevel>
<destroyWindow>false</destroyWindow>
<fileName>/Users/pmcclernan/Desktop/OpenXTalk/OpenXtalk-IDE-DontPanicEdition/XTML_tagging_tests.livecode</fileName>
<formatForPrinting>false</formatForPrinting>
	<card>
	<borderWidth>2</borderWidth>
	<ink>srcCopy</ink>
	<showBorder>false</showBorder>
	<name>card "This is the main card"</name>
	<blendLevel>0</blendLevel>
	<mark>false</mark>
	<dontSearch>false</dontSearch>
	<shadowOffset>4</shadowOffset>
	<altId>0</altId>
	<id>1002</id>
	<layer>1</layer>
	<cantDelete>false</cantDelete>
	<threeD>true</threeD>
		<image>
		<rect>351,-104,776,396</rect>
		<threeD>true</threeD>
		<text>xmlbase64decode( "/9j/4AA/D7q6urfgx//Z")</text>
		<visible>true</visible>
		<xHot>1</xHot>
		<cantSelect>false</cantSelect>
		<lockLoc>false</lockLoc>
		<alwaysBuffer>true</alwaysBuffer>
		<showFocusBorder>true</showFocusBorder>
		<layerMode>static</layerMode>
		<angle>0</angle>
		<shadowOffset>4</shadowOffset>
		<opaque>true</opaque>
		<currentFrame>1</currentFrame>
		<ink>srcCopy</ink>
		<showBorder>false</showBorder>
		<name>image "davinci_vman.jpg"</name>
		<hotSpot>1,1</hotSpot>
		<disabled>false</disabled>
		<altId>0</altId>
		<dontDither>false</dontDither>
		<palindromeFrames>false</palindromeFrames>
		<repeatCount>-1</repeatCount>
		<id>7921</id>
		<resizeQuality>normal</resizeQuality>
		<yHot>1</yHot>
		<blendLevel>0</blendLevel>
		<constantMask>false</constantMask>
		<traversalOn>false</traversalOn>
		<layer>1</layer>
		<borderWidth>0</borderWidth>
</image>
	<button>
	<rect>45,107,275,130</rect>
	<menuHistory>1</menuHistory>
	<menuMouseButton>1</menuMouseButton>
	<hoverIcon>0</hoverIcon>
	<visible>true</visible>
	<hilited>false</hilited>
	<hiliteIcon>0</hiliteIcon>
	<disabledIcon>0</disabledIcon>
	<borderWidth>2</borderWidth>
	<menuLines>5</menuLines>
	<armFill>false</armFill>
	<lockLoc>false</lockLoc>
	<foreColor>0,0,0</foreColor>
	<cantSelect>false</cantSelect>
	<autoArm>false</autoArm>
	<showIcon>false</showIcon>
	<layerMode>static</layerMode>
	<visitedIcon>0</visitedIcon>
	<shadowOffset>4</shadowOffset>
	<titleWidth>0</titleWidth>
	<showName>true</showName>
	<showFocusBorder>true</showFocusBorder>
	<opaque>true</opaque>
	<showHilite>false</showHilite>
	<sharedHilite>true</sharedHilite>
	<ink>srcCopy</ink>
	<labelWidth>0</labelWidth>
	<showBorder>true</showBorder>
	<name>button "Test Convert This Stack to XML:"</name>
	<shadow>false</shadow>
	<disabled>false</disabled>
	<default>false</default>
	<altId>0</altId>
	<icon>0</icon>
	<armed>false</armed>
	<style>standard</style>
	<family>0</family>
	<hiliteBorder>true</hiliteBorder>
	<id>1003</id>
	<blendLevel>0</blendLevel>
	<armBorder>true</armBorder>
	<mnemonic>0</mnemonic>
	<hiliteFill>true</hiliteFill>
	<traversalOn>false</traversalOn>
	<armedIcon>0</armedIcon>
	<textAlign>center</textAlign>
	<autoHilite>true</autoHilite>
	<threeD>true</threeD>
	<margins>4</margins>
	<layer>2</layer>
	<script>xmlbase64decode( "CmTFhNTAplbmQgbW91c2VVcAoK")</script>
</button>
<field>
<rect>25,155,599,533</rect>
<hScroll>0</hScroll>
<vScroll>0</vScroll>
<borderWidth>2</borderWidth>
<hScrollbar>true</hScrollbar>
<hGrid>false</hGrid>
<visible>true</visible>
<listBehavior>false</listBehavior>
<textDirection>auto</textDirection>
<dontSearch>false</dontSearch>
<backColor>117,119,119</backColor>
<lockLoc>false</lockLoc>
<foreColor>0,0,0</foreColor>
<cursorMovement>default</cursorMovement>
<lockText>false</lockText>
<cantSelect>false</cantSelect>
<htmlText><p></p></htmlText>
<layerMode>static</layerMode>
<showFocusBorder>true</showFocusBorder>
<shadowOffset>4</shadowOffset>
<opaque>true</opaque>
<scrollbarWidth>16</scrollbarWidth>
<showLines>false</showLines>
<ink>srcCopy</ink>
<showBorder>true</showBorder>
<name>field "Out"</name>
<firstIndent>0</firstIndent>
<shadow>false</shadow>
<disabled>false</disabled>
<dontWrap>false</dontWrap>
<altId>0</altId>
<vGrid>false</vGrid>
<multipleHilites>false</multipleHilites>
<style>scrolling</style>
<threeDHilite>false</threeDHilite>
<sharedText>false</sharedText>
<id>1004</id>
<blendLevel>0</blendLevel>
<noncontiguousHilites>false</noncontiguousHilites>
<traversalOn>true</traversalOn>
<vScrollbar>true</vScrollbar>
<fixedLineHeight>false</fixedLineHeight>
<textAlign>left</textAlign>
<autoHilite>true</autoHilite>
<autoTab>false</autoTab>
<toggleHilites>false</toggleHilites>
<threeD>true</threeD>
<margins>8</margins>
<layer>3</layer>
<custompropertyset name= "cRevTable">
<cellFormat>false</cellFormat>
<cellEdit>false</cellEdit>
</custompropertyset>
</field>
<button>
<rect>347,550,577,573</rect>
<menuHistory>1</menuHistory>
<menuMouseButton>1</menuMouseButton>
<hoverIcon>0</hoverIcon>
<visible>true</visible>
<hilited>false</hilited>
<hiliteIcon>0</hiliteIcon>
<disabledIcon>0</disabledIcon>
<borderWidth>2</borderWidth>
<menuLines>5</menuLines>
<armFill>false</armFill>
<lockLoc>false</lockLoc>
<foreColor>0,0,0</foreColor>
<cantSelect>false</cantSelect>
<autoArm>false</autoArm>
<showIcon>false</showIcon>
<layerMode>static</layerMode>
<visitedIcon>0</visitedIcon>
<shadowOffset>4</shadowOffset>
<titleWidth>0</titleWidth>
<showName>true</showName>
<showFocusBorder>true</showFocusBorder>
<opaque>true</opaque>
<showHilite>false</showHilite>
<sharedHilite>true</sharedHilite>
<ink>srcCopy</ink>
<labelWidth>0</labelWidth>
<showBorder>true</showBorder>
<name>button "XML to STACK"</name>
<shadow>false</shadow>
<disabled>false</disabled>
<default>false</default>
<altId>0</altId>
<icon>0</icon>
<armed>false</armed>
<style>standard</style>
<family>0</family>
<hiliteBorder>true</hiliteBorder>
<id>1409</id>
<blendLevel>0</blendLevel>
<armBorder>true</armBorder>
<mnemonic>0</mnemonic>
<hiliteFill>true</hiliteFill>
<traversalOn>false</traversalOn>
<armedIcon>0</armedIcon>
<textAlign>center</textAlign>
<autoHilite>true</autoHilite>
<threeD>true</threeD>
<margins>4</margins>
<layer>4</layer>
<script>xmlbase64decode( "Cm9uIGJ1aWxkWFRNTFhNTAogIAogIHB1dCAoIjxTVEFDSyBuYW1lPSIgJiBxdW90ZSAmICgg
c2hvcnQgbmFtZSBvZiB0aGlzIHN0YWNrICkgJiBxdW90ZSAgKSBpbnRvIHRYTUxTdGFja0hl
YWQKICBwdXQgIiBJRD0iICYgaWQgb2YgdGhpcyBzdGFjayBhZnRlciB0WE1MU3RhY2tIZWFk
IAogIGdldCBiYWNrZ3JvdW5kQ29sb3Igb2YgdGhpcyBzdGFjawogIGlmIGl0IGlzIG5vdCBl
bXB0eSB0aGVuCiAgICBwdXQgIiBiYWNrR3JvdW5kQ29sb3I9IiAmIGl0ZW0gMSBvZiBpdCwg
aXRlbSAyIG9mIGl0LCBpdGVtIDMgb2YgaXQgYWZ0ZXIgdFhNTFN0YWNrSGVhZAogIGVuZCBp
ZgogIGdldCBmb3JlZ3JvdW5kQ29sb3Igb2YgdGhpcyBzdGFjawogIGlmIGl0IGlzIG5vdCBl
bXB0eSB0aGVuCiAgICBwdXQgIiBmb3JlZ3JvdW5kQ29sb3I9IiAmIGl0ZW0gMSBvZiBpdCwg
aXRlbSAyIG9mIGl0LCBpdGVtIDMgb2YgaXQgYWZ0ZXIgdFhNTFN0YWNrSGVhZAogIGVuZCBp
ZgogIHB1dCAiIFJFQ1Q9IiAmIHRoZSByZWN0IG9mIHRoaXMgc3RhY2sgJiAiPiIgJiBjciBh
ZnRlciB0WE1MU3RhY2tIZWFkCiAgCiAgcHV0ICI8L1NUQUNLPiIgaW50byB0WE1MU3RhY2tU
YWlsCiAgCiAgcHV0IHRoZSBudW1iZXIgb2YgY2FyZHMgb2YgdGhpcyBzdGFjayBpbnRvIHRD
YXJkQ291bnQKICByZXBlYXQgd2l0aCB0Q2FyZCA9IDEgdG8gdENhcmRDb3VudAogICAgcHV0
ICI8Q0FSRCBuYW1lPSIgJiBxdW90ZSAmIHRoZSBzaG9ydCBuYW1lIG9mIGNhcmQgdENhcmQg
b2YgdGhpcyBzdGFjayAmIHF1b3RlIGFmdGVyIHRDYXJkTGlzdAogICAgcHV0ICIgSUQ9IiAm
IHRoZSBpZCBvZiBjYXJkIHRDYXJkIG9mIHRoaXMgc3RhY2sgJiAiPiImIGNyIGFmdGVyIHRD
YXJkTGlzdAogICAgCiAgICBwdXQgdGhlIG51bWJlciBvZiBjb250cm9scyBvZiBjYXJkIHRD
YXJkIG9mIHRoaXMgc3RhY2sgaW50byB0Q29udHJvbHMKICAgIHJlcGVhdCB3aXRoIHRDb250
cm9sID0gMSB0byB0Q29udHJvbHMgCiAgICAgIAogICAgICBwdXQgIjxDT05UUk9MICIgJiB0
aGUgbmFtZSBvZiBjb250cm9sIHRDb250cm9sIG9mIGNhcmQgdENhcmQgb2YgdGhpcyBzdGFj
ayBhZnRlciB0Q2FyZExpc3QKICAgICAgcHV0ICIgSUQ9IiAmIHRoZSBJRCBvZiBjb250cm9s
IHRDb250cm9sIG9mIHRoaXMgc3RhY2sgYWZ0ZXIgdENhcmRMaXN0CiAgICAgIHB1dCAiIFJF
Q1Q9IiAmIHRoZSByZWN0IG9mIGNvbnRyb2wgdENvbnRyb2wgb2YgY2FyZCB0Q2FyZCBvZiB0
aGlzIHN0YWNrIGFmdGVyIHRDYXJkTGlzdAogICAgICBwdXQgY3IgJiAiPC9DT05UUk9MPiIg
JiBjciBhZnRlciB0Q2FyZExpc3QKICAgIGVuZCByZXBlYXQKICAgIAogICAgLS0gICAgcHV0
IHRoZSBudW1iZXIgb2YgQnRucyBvZiBjYXJkIHRDYXJkIG9mIHRoaXMgc3RhY2sgaW50byB0
QnRucwogICAgLS0gICAgcmVwZWF0IHdpdGggdEJ0biA9IDEgdG8gdEJ0bnMgCiAgICAKICAg
IC0tICAgICAgcHV0ICI8QlVUVE9OIE5hbWU9IiAmIHRoZSBzaG9ydCBuYW1lIG9mIGJ0biB0
QnRuIG9mIGNhcmQgdENhcmQgb2YgdGhpcyBzdGFjayBhZnRlciB0Q2FyZExpc3QKICAgIC0t
ICAgICAgcHV0ICIgSUQ9IiAmIHRoZSBJRCBvZiBidG4gdEJ0biBvZiBvZiBjYXJkIHRDYXJk
IG9mIHRoaXMgc3RhY2sgYWZ0ZXIgdENhcmRMaXN0CiAgICAtLSAgICAgIHB1dCAiIFJFQ1Q9
IiAmIHRoZSByZWN0IG9mIGJ0biB0QnRuIG9mIG9mIGNhcmQgdENhcmQgb2YgdGhpcyBzdGFj
ayAmICI+IiAmIGNyIGFmdGVyIHRDYXJkTGlzdAogICAgCiAgICAtLSAgICAgIHB1dCBjciAm
ICI8L0JVVFRPTj4iIGFmdGVyIHRDYXJkTGlzdAogICAgLS0gICAgZW5kIHJlcGVhdAogICAg
CiAgICBwdXQgY3IgJiAiPC9DQVJEPiIgJiBjciBhZnRlciB0Q2FyZExpc3QKICBlbmQgcmVw
ZWF0CiAgCiAgcHV0IHRYTUxTdGFja0hlYWQgJiBjciAmIHRDYXJkTGlzdCAmIGNyICYgdFhN
TFN0YWNrVGFpbCBpbnRvIGZsZCAiT3V0IgplbmQgYnVpbGRYVE1MWE1MCgpvbiBtb3VzZVVw
IHBNb3VzZUJ1dHRvbgogIGJ1aWxkWFRNTFhNTAplbmQgbW91c2VVcAo=")</script>
</button>
<graphic>
<rect>648,90,854,411</rect>
<borderWidth>2</borderWidth>
<visible>true</visible>
<markerLineSize>1</markerLineSize>
<startArrow>false</startArrow>
<filled>false</filled>
<markerDrawn>false</markerDrawn>
<arcAngle>360</arcAngle>
<lockLoc>false</lockLoc>
<foreColor>190,0,0</foreColor>
<cantSelect>false</cantSelect>
<showFocusBorder>true</showFocusBorder>
<layerMode>static</layerMode>
<showName>false</showName>
<shadowOffset>4</shadowOffset>
<angle>0</angle>
<opaque>false</opaque>
<roundRadius>15</roundRadius>
<dontResize>false</dontResize>
<ink>srcCopy</ink>
<showBorder>false</showBorder>
<name>graphic "Red Triangle"</name>
<disabled>false</disabled>
<altId>0</altId>
<antialiased>true</antialiased>
<endArrow>false</endArrow>
<roundEnds>true</roundEnds>
<miterLimit>10</miterLimit>
<joinStyle>round</joinStyle>
<style>polygon</style>
<lineSize>8</lineSize>
<arrowSize>3</arrowSize>
<startAngle>0</startAngle>
<capStyle>round</capStyle>
<points>xmlbase64decode( "NjU2LDk2Cjg0OSwzMzAKNjU4LDQwNgo2NTMsOTU=")</points>
<id>1472</id>
<polySides>4</polySides>
<fillRule>none</fillRule>
<blendLevel>0</blendLevel>
<editMode>none</editMode>
<markerFilled>false</markerFilled>
<traversalOn>false</traversalOn>
<threeD>true</threeD>
<margins>4</margins>
<layer>5</layer>
</graphic>
<widget>
</widget>
<button>
<rect>651,502,733,525</rect>
<menuHistory>1</menuHistory>
<menuMouseButton>1</menuMouseButton>
<hoverIcon>0</hoverIcon>
<visible>true</visible>
<hilited>true</hilited>
<hiliteIcon>0</hiliteIcon>
<disabledIcon>0</disabledIcon>
<borderWidth>2</borderWidth>
<menuLines>5</menuLines>
<armFill>false</armFill>
<lockLoc>false</lockLoc>
<foreColor>255,255,255</foreColor>
<cantSelect>false</cantSelect>
<autoArm>false</autoArm>
<showIcon>false</showIcon>
<layerMode>static</layerMode>
<visitedIcon>0</visitedIcon>
<shadowOffset>4</shadowOffset>
<titleWidth>0</titleWidth>
<showName>true</showName>
<showFocusBorder>true</showFocusBorder>
<opaque>false</opaque>
<showHilite>false</showHilite>
<sharedHilite>false</sharedHilite>
<ink>srcCopy</ink>
<labelWidth>0</labelWidth>
<showBorder>false</showBorder>
<name>button "Radio"</name>
<shadow>false</shadow>
<disabled>false</disabled>
<default>false</default>
<altId>0</altId>
<icon>0</icon>
<armed>false</armed>
<style>radiobutton</style>
<family>0</family>
<hiliteBorder>false</hiliteBorder>
<id>1609</id>
<blendLevel>0</blendLevel>
<armBorder>true</armBorder>
<mnemonic>0</mnemonic>
<hiliteFill>true</hiliteFill>
<traversalOn>true</traversalOn>
<armedIcon>0</armedIcon>
<textAlign>left</textAlign>
<autoHilite>true</autoHilite>
<threeD>true</threeD>
<margins>4</margins>
<layer>7</layer>
</button>
<button>
<rect>632,471,759,500</rect>
<menuHistory>1</menuHistory>
<text>xmlbase64decode( "Q2hvaWNlIDEKQ2hvaWNlIDIKQ2hvaWNlIDM=")</text>
<menuMode>popup</menuMode>
<menuMouseButton>1</menuMouseButton>
<hoverIcon>0</hoverIcon>
<visible>true</visible>
<hilited>false</hilited>
<hiliteIcon>0</hiliteIcon>
<disabledIcon>0</disabledIcon>
<borderWidth>6</borderWidth>
<menuLines>5</menuLines>
<armFill>false</armFill>
<backColor>100,94,111</backColor>
<lockLoc>false</lockLoc>
<foreColor>255,255,255</foreColor>
<cantSelect>false</cantSelect>
<autoArm>false</autoArm>
<showIcon>false</showIcon>
<layerMode>static</layerMode>
<visitedIcon>0</visitedIcon>
<shadowOffset>4</shadowOffset>
<titleWidth>0</titleWidth>
<showName>true</showName>
<showFocusBorder>true</showFocusBorder>
<opaque>true</opaque>
<showHilite>false</showHilite>
<sharedHilite>true</sharedHilite>
<ink>srcCopy</ink>
<labelWidth>0</labelWidth>
<showBorder>true</showBorder>
<name>button "PopUp Menu  >"</name>
<shadow>false</shadow>
<disabled>false</disabled>
<default>false</default>
<altId>0</altId>
<icon>0</icon>
<armed>false</armed>
<style>menu</style>
<family>0</family>
<hiliteBorder>true</hiliteBorder>
<id>1631</id>
<blendLevel>0</blendLevel>
<armBorder>true</armBorder>
<mnemonic>0</mnemonic>
<hiliteFill>true</hiliteFill>
<traversalOn>true</traversalOn>
<armedIcon>0</armedIcon>
<textAlign>center</textAlign>
<autoHilite>true</autoHilite>
<threeD>true</threeD>
<margins>4</margins>
<layer>8</layer>
</button>
<scrollbar>
<rect>632,559,832,573</rect>
<threeD>true</threeD>
<topColor>160,163,163</topColor>
<visible>true</visible>
<backColor>0,0,0</backColor>
<lineInc>0</lineInc>
<cantSelect>false</cantSelect>
<lockLoc>false</lockLoc>
<showFocusBorder>true</showFocusBorder>
<layerMode>static</layerMode>
<shadowOffset>4</shadowOffset>
<shadowColor>0,0,0</shadowColor>
<thumbPosition>50</thumbPosition>
<opaque>true</opaque>
<range></range>


<ink>srcCopy</ink>
<showBorder>true</showBorder>
<name>scrollbar "Progress Scrollbar"</name>
<disabled>false</disabled>
<altId>0</altId>
<showValue>false</showValue>
<borderColor>255,255,255</borderColor>
<style>progress</style>
<distance></distance>


<id>1712</id>
<endValue>100</endValue>
<pageInc>0</pageInc>
<blendLevel>0</blendLevel>
<traversalOn>true</traversalOn>
<startValue>0</startValue>
<thumbSize>0</thumbSize>
<bottomColor>69,66,76</bottomColor>
<layer>9</layer>
<borderWidth>2</borderWidth>
</scrollbar>
<image>
<rect>713,11,862,130</rect>
<threeD>false</threeD>
<visible>true</visible>
<xHot>1</xHot>
<cantSelect>false</cantSelect>
<lockLoc>true</lockLoc>
<alwaysBuffer>false</alwaysBuffer>
<showFocusBorder>true</showFocusBorder>
<layerMode>static</layerMode>
<angle>0</angle>
<shadowOffset>4</shadowOffset>
<opaque>true</opaque>
<currentFrame>1</currentFrame>
<ink>srcCopy</ink>
<showBorder>true</showBorder>
<name>image "1-12121495914tsn.jpg"</name>
<hotSpot>1,1</hotSpot>
<disabled>false</disabled>
<altId>0</altId>
<dontDither>false</dontDither>
<palindromeFrames>false</palindromeFrames>
<repeatCount>0</repeatCount>
<id>8246</id>
<resizeQuality>normal</resizeQuality>
<yHot>1</yHot>
<blendLevel>0</blendLevel>
<constantMask>false</constantMask>
<traversalOn>false</traversalOn>
<fileName>/Volumes/Storage/__Works/_ART/  Public Domain Images/1-12121495914tsn.jpg</fileName>
<layer>10</layer>
<borderWidth>0</borderWidth>
</image>
<graphic>
<rect>673,122,741,205</rect>
<borderWidth>2</borderWidth>
<visible>true</visible>
<markerLineSize>1</markerLineSize>
<startArrow>false</startArrow>
<filled>true</filled>
<markerDrawn>false</markerDrawn>
<arcAngle>360</arcAngle>
<lockLoc>false</lockLoc>
<cantSelect>false</cantSelect>
<showFocusBorder>true</showFocusBorder>
<layerMode>static</layerMode>
<showName>false</showName>
<shadowOffset>4</shadowOffset>
<angle>0</angle>
<opaque>true</opaque>
<roundRadius>15</roundRadius>
<dontResize>false</dontResize>
<ink>srcCopy</ink>
<showBorder>false</showBorder>
<name>graphic "Round Rectangle"</name>
<disabled>false</disabled>
<altId>0</altId>
<antialiased>true</antialiased>
<endArrow>false</endArrow>
<roundEnds>true</roundEnds>
<miterLimit>10</miterLimit>
<joinStyle>round</joinStyle>
<style>roundrect</style>
<lineSize>1</lineSize>
<arrowSize>3</arrowSize>
<startAngle>0</startAngle>
<capStyle>round</capStyle>
<id>1473</id>
<polySides>4</polySides>
<fillRule>none</fillRule>
<blendLevel>0</blendLevel>
<editMode>none</editMode>
<markerFilled>false</markerFilled>
<traversalOn>false</traversalOn>
<threeD>true</threeD>
<margins>8</margins>
<layer>11</layer>
</graphic>
<image>
<rect>691,147,723,179</rect>
<threeD>true</threeD>
<text>xmlbase64decode( "i")</text>
<visible>true</visible>
<xHot>1</xHot>
<cantSelect>false</cantSelect>
<lockLoc>false</lockLoc>
<alwaysBuffer>true</alwaysBuffer>
<showFocusBorder>true</showFocusBorder>
<layerMode>static</layerMode>
<angle>0</angle>
<shadowOffset>4</shadowOffset>
<opaque>true</opaque>
<currentFrame>1</currentFrame>
<ink>srcCopy</ink>
<showBorder>false</showBorder>
<name>image "OXT_tiny_32px_v2.png"</name>
<hotSpot>1,1</hotSpot>
<disabled>false</disabled>
<altId>0</altId>
<dontDither>false</dontDither>
<palindromeFrames>false</palindromeFrames>
<repeatCount>-1</repeatCount>
<id>7777</id>
<resizeQuality>normal</resizeQuality>
<yHot>1</yHot>
<blendLevel>0</blendLevel>
<constantMask>false</constantMask>
<traversalOn>false</traversalOn>
<layer>12</layer>
<borderWidth>0</borderWidth>
</image>
</card>
<card>
<borderWidth>2</borderWidth>
<ink>srcCopy</ink>
<showBorder>false</showBorder>
<name>card id 1083</name>
<blendLevel>0</blendLevel>
<mark>false</mark>
<dontSearch>false</dontSearch>
<shadowOffset>4</shadowOffset>
<altId>0</altId>
<id>1083</id>
<layer>2</layer>
<cantDelete>false</cantDelete>
<threeD>true</threeD>
<button>
<rect>278,240,682,263</rect>
<menuHistory>1</menuHistory>
<menuMouseButton>1</menuMouseButton>
<hoverIcon>0</hoverIcon>
<visible>true</visible>
<hilited>false</hilited>
<hiliteIcon>0</hiliteIcon>
<disabledIcon>0</disabledIcon>
<borderWidth>2</borderWidth>
<menuLines>5</menuLines>
<armFill>false</armFill>
<lockLoc>false</lockLoc>
<cantSelect>false</cantSelect>
<autoArm>false</autoArm>
<showIcon>false</showIcon>
<layerMode>static</layerMode>
<visitedIcon>0</visitedIcon>
<shadowOffset>4</shadowOffset>
<titleWidth>0</titleWidth>
<showName>true</showName>
<showFocusBorder>true</showFocusBorder>
<opaque>true</opaque>
<showHilite>false</showHilite>
<sharedHilite>true</sharedHilite>
<ink>srcCopy</ink>
<labelWidth>0</labelWidth>
<showBorder>true</showBorder>
<name>button "Card 2 test!"</name>
<shadow>false</shadow>
<disabled>false</disabled>
<default>true</default>
<altId>0</altId>
<icon>0</icon>
<armed>false</armed>
<style>standard</style>
<family>0</family>
<hiliteBorder>true</hiliteBorder>
<id>1371</id>
<blendLevel>0</blendLevel>
<armBorder>true</armBorder>
<mnemonic>0</mnemonic>
<hiliteFill>true</hiliteFill>
<traversalOn>true</traversalOn>
<armedIcon>0</armedIcon>
<textAlign>center</textAlign>
<autoHilite>true</autoHilite>
<threeD>true</threeD>
<margins>4</margins>
<layer>1</layer>
<script>xmlbase64decode( "b24gbW91c2VVcCBwQnV0dG9uTnVtYmVyCiBnbyBmaXJzdCAgCmVuZCBtb3VzZVVwCg==")</script>
</button>
<button>
<rect>85,66,187,88</rect>
<menuHistory>2</menuHistory>
<text>xmlbase64decode( "TGV2ZWwgMQpMZXZlbCA0Mg==")</text>
<menuMode>option</menuMode>
<menuMouseButton>1</menuMouseButton>
<hoverIcon>0</hoverIcon>
<visible>true</visible>
<hilited>false</hilited>
<hiliteIcon>0</hiliteIcon>
<disabledIcon>0</disabledIcon>
<borderWidth>2</borderWidth>
<menuLines>5</menuLines>
<armFill>false</armFill>
<label>Level 42</label>
<lockLoc>false</lockLoc>
<cantSelect>false</cantSelect>
<autoArm>false</autoArm>
<showIcon>false</showIcon>
<layerMode>static</layerMode>
<visitedIcon>0</visitedIcon>
<shadowOffset>4</shadowOffset>
<titleWidth>0</titleWidth>
<showName>true</showName>
<showFocusBorder>true</showFocusBorder>
<opaque>true</opaque>
<showHilite>false</showHilite>
<sharedHilite>true</sharedHilite>
<ink>srcCopy</ink>
<labelWidth>0</labelWidth>
<showBorder>true</showBorder>
<name>button "OXTLevel"</name>
<shadow>false</shadow>
<disabled>false</disabled>
<default>false</default>
<altId>0</altId>
<icon>0</icon>
<armed>false</armed>
<style>menu</style>
<family>0</family>
<hiliteBorder>true</hiliteBorder>
<id>1471</id>
<blendLevel>0</blendLevel>
<armBorder>false</armBorder>
<mnemonic>0</mnemonic>
<hiliteFill>true</hiliteFill>
<traversalOn>false</traversalOn>
<armedIcon>0</armedIcon>
<textAlign>center</textAlign>
<autoHilite>false</autoHilite>
<threeD>true</threeD>
<margins>4</margins>
<layer>2</layer>
</button>
</card>
</stack>


Obviously not every single property is going to set to anything other than 'default' so why tag something that's the value default when it will inherit some of it's traits of it's parent Object and not be rendered in the color you might expect, so why include a tag for backgroundColor if it's using the default inherited from a mainStack backgroundColor? So I added some checks to my script to only insert an attribute if it's actually set to something (other than default value) before creating a tag for it.
Here is my current markup made from with the same stack (minus the base 64 image data for size):

Code: Select all


<STACK name="Test Markup" ID="8970" foregroundColor="0,0,0" RECT="437,990,1347,1621">

<CARD name="This is the main card" ID="1002">
<CONTROL image="davinci_vman.jpg" ID="7921" RECT="351,-104,776,396">
<IMAGETEXT>
QkFTRTY0REFUQQ==
</IMAGETEXT>
</CONTROL>
<CONTROL button="Test Convert This Stack to XML:" ID="1003" RECT="45,107,275,130">
</CONTROL>
<CONTROL field="Out" ID="1004" RECT="25,155,599,533">
<TEXT>
Test
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Text);}}
{\colortbl;\red0\green0\blue0;\red0\green0\blue0;}
\pard \f0 \fs24 \cf2 Test
}
</RTFTEXT>

<HTMLTEXT>
<p>Test</p>
</HTMLTEXT>

</CONTROL>
<CONTROL button="XML to STACK" ID="1409" RECT="347,550,577,573">
</CONTROL>
<CONTROL graphic="Red Triangle" ID="1472" RECT="648,90,854,411" Points="656,96
849,330
658,406
653,95">
</CONTROL>
<CONTROL widget="SVG Icon" ID="1588" RECT="616,-7,698,70">
<SVGPATH>"M1664 698Q1664 720 1638 746L1275 1100 1361 1600Q1362 1607 1362 1620 1362 1641 1351.5 1655.5 1341 1670 1321 1670 1302 1670 1281 1658L832 1422 383 1658Q361 1670 343 1670 322 1670 311.5 1655.5 301 1641 301 1620 301 1614 303 1600L389 1100 25 746Q0 719 0 698 0 661 56 652L558 579 783 124Q802 83 832 83 862 83 881 124L1106 579 1608 652Q1664 661 1664 698Z"</SVGPATH>
</CONTROL>
<CONTROL button="Radio" ID="1609" RECT="651,502,733,525">
</CONTROL>
<CONTROL button="PopUp Menu  >" ID="1631" RECT="632,471,759,500">
<TEXT>
Choice 1
Choice 2
Choice 3
</TEXT>
</CONTROL>
<CONTROL scrollbar="Progress Scrollbar" ID="1712" RECT="632,559,832,573" startValue="0" endValue="100" thumbPosition="50">
</CONTROL>
<CONTROL image="1-12121495914tsn.jpg" ID="8246" RECT="713,11,862,130" fileName="/Volumes/Storage/__Works/_ART/  Public Domain Images/1-12121495914tsn.jpg">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL graphic="Round Rectangle" ID="1473" RECT="673,122,741,205">
</CONTROL>
<CONTROL image="OXT_tiny_32px_v2.png" ID="7777" RECT="691,147,723,179">
<IMAGETEXT>
QkFTRTY0REFUQQ==
</IMAGETEXT>
</CONTROL>

</CARD>
<CARD name="card id 1083" ID="1083">
<CONTROL button="Card 2 test!" ID="7921" RECT="278,240,682,263">
</CONTROL>
<CONTROL button="OXTLevel" ID="1003" RECT="85,66,187,88">
<TEXT>
Level 1
Level 42
</TEXT>
</CONTROL>

</CARD>

</STACK>

So my structure stores a ScriptObject's properties inside a tag's attributes section, any major subcomponent of a script object gets it's own child tag, so all objects have some form of "the objects text property", Field text could have three or four of them just representing the same field text contents (Text,Styled/RTFText,HTMLText,UnicodeText). A Markup parsing interpreter could pick the one that best suits it's needs, or have it based on user selected preference. So the tagging would be like:

Code: Select all

<Control Field="My Text Fld">
	<HTMLTEXT>
		[b] My HTML Style Text here! [/b]
	</HTMLTEXT>
	<TEXT>
		My HTML Style Text here!
	</TEXT>
</Control>
xAction
Posts: 285
Joined: Thu Sep 16, 2021 1:40 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by xAction »

Okay, now for custom property and array? Base64 for those?

Not storing default value properties is definately the way to go, That first listing was madness. Maybe handy if you were making your own stack making app from scratch and needed a one time list of all the available properties.
Probably useful for making a comparison library between the various stack formats.
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by OpenXTalkPaul »

xAction wrote: Mon Nov 22, 2021 10:56 pm Okay, now for custom property and array? Base64 for those?

Not storing default value properties is definately the way to go, That first listing was madness. Maybe handy if you were making your own stack making app from scratch and needed a one time list of all the available properties.
Probably useful for making a comparison library between the various stack formats.
Well it would be good to have some documentation of the properties sets for Stack/Card/Group-Background/substack/controls/custom, preferably for all of it ( eat least including widgets such as SVGIcon that are used in the IDE), at minimum a complete set of properties for "tier one", the base "classic controls" set.

Here is your ControlsHarvest stack tagged up by the script I'm working on:

Code: Select all

<STACK name="ControlsHarvest" ID="1469" foregroundColor="64,0,64" RECT="270,742,1242,1316">

<CARD name="card id 1002" ID="1002">
<CONTROL button="Tab_Menu" ID="1022" RECT="364,52,531,229">
<TEXT>
Tab 1
Tab 2
Tab 3
</TEXT>
</CONTROL>
<CONTROL button="Tab_Menu2" ID="1023" RECT="544,52,711,229">
<TEXT>
Tab 1
Tab 2
Tab 3
</TEXT>
</CONTROL>
<CONTROL field="Label_Field" ID="1024" RECT="6,264,105,285">
<TEXT>
Label:
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red0\green0\blue0;\red64\green0\blue64;}
\pard \qr \f0 \fs26 \cf2 Label:
}
</RTFTEXT>

<HTMLTEXT>
<p>Label:</p>
</HTMLTEXT>

</CONTROL>
<CONTROL field="Field1" ID="1025" RECT="4,302,104,323"
<RTFTEXT>
{\rtf1\mac {\colortbl;\red0\green0\blue0;}
\pard 
}
</RTFTEXT>

<HTMLTEXT>
<p></p>
</HTMLTEXT>
>
</CONTROL>
<CONTROL field="Field2" ID="1026" RECT="2,333,103,376"
<RTFTEXT>
{\rtf1\mac {\colortbl;\red0\green0\blue0;}
\pard 
}
</RTFTEXT>

<HTMLTEXT>
<p></p>
</HTMLTEXT>
>
</CONTROL>
<CONTROL field="Table_Field" ID="1028" RECT="133,271,351,344">
<TEXT>
column1	column2	column3
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Text);}}
{\colortbl;\red0\green0\blue0;\red64\green0\blue64;}
\pard \f0 \fs24 \cf2 column1\'09column2\'09column3
}
</RTFTEXT>

<HTMLTEXT>
<p>column1&#9;column2&#9;column3</p>
</HTMLTEXT>

</CONTROL>
<CONTROL field="Scrolling_List_Field" ID="1030" RECT="2,383,100,439">
<TEXT>
Choice 1
Choice 2
Choice 3
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red0\green0\blue0;\red64\green0\blue64;}
\pard \f0 \fs26 \cf2 Choice 1
\par \pard Choice 2
\par \pard Choice 3
}
</RTFTEXT>

<HTMLTEXT>
<p>Choice 1</p>
<p>Choice 2</p>
<p>Choice 3</p>
</HTMLTEXT>

</CONTROL>
<CONTROL group="DataGrid_1" ID="1032" RECT="136,358,351,449"<CONTROL button="dgTrackDragDrop" ID="1033" RECT="60,587,175,610">
</CONTROL>
<CONTROL image="dgAlternatingRows" ID="1034" RECT="421,557,422,599">
<IMAGETEXT>
QkFTRTY0REFUQQ==
</IMAGETEXT>
</CONTROL>
<CONTROL button="dgEventCatcher" ID="1035" RECT="137,359,350,448">
</CONTROL>
<CONTROL graphic="dgBackground" ID="1036" RECT="137,359,350,448">
</CONTROL>
<CONTROL group="dgAlternatingRowsMask" ID="1037" RECT="137,378,335,433"<CONTROL graphic="dgAlternatingRows" ID="1038" RECT="137,378,335,454">
</CONTROL>
<CONTROL group="dgListMask" ID="1039" RECT="137,378,335,433"<CONTROL group="dgHighlights" ID="1040" RECT="422,271,422,271"<CONTROL graphic="hilite 0001" ID="1458" RECT="137,378,452,399">
</CONTROL>
<CONTROL graphic="hilite 0002" ID="1459" RECT="137,399,452,420">
</CONTROL>
<CONTROL graphic="hilite 0003" ID="1460" RECT="137,420,452,441">
</CONTROL>
<CONTROL group="dgList" ID="1041" RECT="137,378,452,433"<CONTROL group="Col 1" ID="1452" RECT="137,378,237,433"<CONTROL field="Col 1 0001" ID="1461" RECT="137,378,237,399">
<TEXT>
this data
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red64\green64\blue64;\red64\green0\blue64;}
\pard \f0 \fs26 \cf2 this data
}
</RTFTEXT>

<HTMLTEXT>
<p>this data</p>
</HTMLTEXT>

</CONTROL>
<CONTROL field="Col 1 0002" ID="1462" RECT="137,399,237,420">
<TEXT>
 other data
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red64\green64\blue64;\red64\green0\blue64;}
\pard \f0 \fs26 \cf2  other data
}
</RTFTEXT>

<HTMLTEXT>
<p> other data</p>
</HTMLTEXT>

</CONTROL>
<CONTROL field="Col 1 0003" ID="1463" RECT="137,420,237,441"
<RTFTEXT>
{\rtf1\mac {\colortbl;\red64\green64\blue64;}
\pard 
}
</RTFTEXT>

<HTMLTEXT>
<p></p>
</HTMLTEXT>
>
</CONTROL>
<CONTROL group="Col 2" ID="1454" RECT="237,378,337,433"<CONTROL field="Col 2 0001" ID="1464" RECT="237,378,337,399">
<TEXT>
that data
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red64\green64\blue64;\red64\green0\blue64;}
\pard \f0 \fs26 \cf2 that data
}
</RTFTEXT>

<HTMLTEXT>
<p>that data</p>
</HTMLTEXT>

</CONTROL>
<CONTROL field="Col 2 0002" ID="1465" RECT="237,399,337,420">
<TEXT>
etc
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red64\green64\blue64;\red64\green0\blue64;}
\pard \f0 \fs26 \cf2 etc
}
</RTFTEXT>

<HTMLTEXT>
<p>etc</p>
</HTMLTEXT>

</CONTROL>
<CONTROL field="Col 2 0003" ID="1466" RECT="237,420,337,441"
<RTFTEXT>
{\rtf1\mac {\colortbl;\red64\green64\blue64;}
\pard 
}
</RTFTEXT>

<HTMLTEXT>
<p></p>
</HTMLTEXT>
>
</CONTROL>
<CONTROL group="Col 3" ID="1456" RECT="337,378,437,433"<CONTROL field="Col 3 0001" ID="1467" RECT="337,378,437,399">
<TEXT>
more data
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red64\green64\blue64;\red64\green0\blue64;}
\pard \f0 \fs26 \cf2 more data
}
</RTFTEXT>

<HTMLTEXT>
<p>more data</p>
</HTMLTEXT>

</CONTROL>
<CONTROL field="Col 3 0002" ID="1468" RECT="337,399,437,420"
<RTFTEXT>
{\rtf1\mac {\colortbl;\red64\green64\blue64;}
\pard 
}
</RTFTEXT>

<HTMLTEXT>
<p></p>
</HTMLTEXT>
>
</CONTROL>
<CONTROL field="Col 3 0003" ID="1469" RECT="337,420,437,441"
<RTFTEXT>
{\rtf1\mac {\colortbl;\red64\green64\blue64;}
\pard 
}
</RTFTEXT>

<HTMLTEXT>
<p></p>
</HTMLTEXT>
>
</CONTROL>
<CONTROL group="dgDividers" ID="1042" RECT="236,378,337,433"<CONTROL graphic=id 1453 ID="1453" RECT="236,378,237,433">
</CONTROL>
<CONTROL graphic=id 1455 ID="1455" RECT="336,378,337,433">
</CONTROL>
<CONTROL graphic=id 1457 ID="1457" RECT="436,378,437,433">
</CONTROL>
<CONTROL group="dgDropIndicator" ID="1043" RECT="-14,598,803,609"<CONTROL graphic="dgOval" ID="1044" RECT="-14,598,-3,609">
</CONTROL>
<CONTROL graphic="dgLine" ID="1045" RECT="-7,602,803,606" Points="-5,604
801,604">
</CONTROL>
<CONTROL group="dgHeaderComponents" ID="1046" RECT="137,359,350,378"<CONTROL group="dgHeaderMask" ID="1047" RECT="137,359,350,378"<CONTROL graphic="dgBackground" ID="1048" RECT="137,359,452,378">
</CONTROL>
<CONTROL group="dgHeader" ID="1049" RECT="137,359,437,378"<CONTROL group="Col 1" ID="1434" RECT="137,359,237,378"<CONTROL graphic="Background" ID="1435" RECT="137,359,237,378">
</CONTROL>
<CONTROL field="HeaderLabel" ID="1436" RECT="137,359,237,378">
<TEXT>
Col 1
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red64\green64\blue64;\red64\green0\blue64;}
\pard \f0 \fs26 \cf2 Col 1
}
</RTFTEXT>

<HTMLTEXT>
<p>Col 1</p>
</HTMLTEXT>

</CONTROL>
<CONTROL graphic="LeftHilite" ID="1437" RECT="137,359,138,378">
</CONTROL>
<CONTROL graphic="RightHilite" ID="1438" RECT="236,359,237,378">
</CONTROL>
<CONTROL button="SortArrow" ID="1439" RECT="223,364,232,372">
</CONTROL>
<CONTROL group="Col 2" ID="1440" RECT="237,359,337,378"<CONTROL graphic="Background" ID="1441" RECT="237,359,337,378">
</CONTROL>
<CONTROL field="HeaderLabel" ID="1442" RECT="237,359,337,378">
<TEXT>
Col 2
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red64\green64\blue64;\red64\green0\blue64;}
\pard \f0 \fs26 \cf2 Col 2
}
</RTFTEXT>

<HTMLTEXT>
<p>Col 2</p>
</HTMLTEXT>

</CONTROL>
<CONTROL graphic="LeftHilite" ID="1443" RECT="237,359,238,378">
</CONTROL>
<CONTROL graphic="RightHilite" ID="1444" RECT="336,359,337,378">
</CONTROL>
<CONTROL button="SortArrow" ID="1445" RECT="323,364,332,372">
</CONTROL>
<CONTROL group="Col 3" ID="1446" RECT="337,359,437,378"<CONTROL graphic="Background" ID="1447" RECT="337,359,437,378">
</CONTROL>
<CONTROL field="HeaderLabel" ID="1448" RECT="337,359,437,378">
<TEXT>
Col 3
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red64\green64\blue64;\red64\green0\blue64;}
\pard \f0 \fs26 \cf2 Col 3
}
</RTFTEXT>

<HTMLTEXT>
<p>Col 3</p>
</HTMLTEXT>

</CONTROL>
<CONTROL graphic="LeftHilite" ID="1449" RECT="337,359,338,378">
</CONTROL>
<CONTROL graphic="RightHilite" ID="1450" RECT="436,359,437,378">
</CONTROL>
<CONTROL button="SortArrow" ID="1451" RECT="423,364,432,372">
</CONTROL>
<CONTROL graphic="dgHeaderBottomBorder" ID="1050" RECT="137,377,452,378">
</CONTROL>
<CONTROL group="dgHorizontalComponents" ID="1051" RECT="137,433,350,448"<CONTROL scrollbar="dgHScrollbar" ID="1052" RECT="137,433,335,448" endValue="300" thumbPosition="0">
</CONTROL>
<CONTROL graphic="dgCornerPiece" ID="1053" RECT="335,433,350,448">
</CONTROL>
<CONTROL scrollbar="dgScrollbar" ID="1054" RECT="335,378,350,433" endValue="55" thumbPosition="0">
</CONTROL>
<CONTROL button="Option_Menu" ID="1127" RECT="361,274,500,296">
<TEXT>
Choice 1
Choice 2
Choice 3
</TEXT>
</CONTROL>
<CONTROL button="Pulldown_Menu" ID="1128" RECT="518,274,657,296">
<TEXT>
Choice 1
Choice 2
Choice 3
</TEXT>
</CONTROL>
<CONTROL button="ComboBox_Menu" ID="1129" RECT="675,274,814,296">
<TEXT>
Choice 1
Choice 2
Choice 3
</TEXT>
</CONTROL>
<CONTROL button="PopUp_Menu" ID="1130" RECT="819,275,953,297">
<TEXT>
Choice 1
Choice 2
Choice 3
</TEXT>
</CONTROL>
<CONTROL scrollbar="Progress_Scrollbar" ID="1131" RECT="359,320,494,336" startValue="0" endValue="100" thumbPosition="50">
</CONTROL>
<CONTROL scrollbar="Scrollbar_Style_scale" ID="1132" RECT="516,319,654,335" startValue="1" endValue="100" thumbPosition="1">
</CONTROL>
<CONTROL scrollbar="Scrollbar_style_scrollbar" ID="1133" RECT="673,317,688,340" thumbPosition="0">
</CONTROL>
<CONTROL scrollbar="Scrollbar" ID="1134" RECT="704,320,904,336" thumbPosition="0">
</CONTROL>
<CONTROL image="image_id_1135" ID="1135" RECT="382,373,445,427" fileName="defaultImage.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL player="player_id_1136" ID="1136" RECT="770,69,951,203"<CONTROL graphic="Regular_Polygon" ID="1137" RECT="1,482,65,546">
</CONTROL>
<CONTROL graphic="Oval" ID="1138" RECT="73,482,137,546">
</CONTROL>
<CONTROL graphic="Round_Rectangle" ID="1139" RECT="150,482,214,546">
</CONTROL>
<CONTROL graphic="Rectangle" ID="1140" RECT="227,482,291,546">
</CONTROL>
<CONTROL graphic="Rectangle_with_gradient" ID="1141" RECT="304,482,368,546">
</CONTROL>
<CONTROL graphic="Rectangle" ID="1142" RECT="381,482,445,546">
</CONTROL>
<CONTROL graphic="Line_Graphic" ID="1143" RECT="461,489,513,544" Points="462,543
512,490">
</CONTROL>
<CONTROL graphic="Line" ID="1144" RECT="157,619,160,621" Points="159,620
158,620">
</CONTROL>
<CONTROL graphic="Curve_Graphic" ID="1146" RECT="717,498,789,554" Points="720,533
753,551
775,542
775,541
775,539
775,538
775,538
775,537
775,537
775,536
775,536
775,534
775,534
775,533
775,533
775,532
775,532
775,531
775,530
775,530
775,529
775,529
775,528
775,528
775,527
775,526
775,526
775,525
775,525
775,524
775,523
775,523
775,522
775,522
775,521
775,521
775,520
775,519
775,519
775,518
775,518
775,517
776,517
777,516
779,515
780,514
781,513
783,513
784,513
785,512
786,511
786,511
786,510
785,510
784,509
784,509
783,508
783,507
781,507
780,506
779,505
777,505
776,503
774,503
773,503
772,502
770,502
770,501
769,501
768,501
767,501
766,501
766,501
765,501
765,501
764,501
764,501
763,501
762,501
762,501
761,501
761,501
760,501
759,501
759,501
759,501
759,502
759,502
759,503
758,503
758,504
758,505
758,505
757,506
757,507
755,507
754,508
754,509
753,509
753,510
752,510
751,510
749,511
748,511
748,511
747,511
746,512
746,512
745,512
744,512
744,512
743,512
743,512
742,512
741,512
740,511
739,511
739,511
738,511
737,511
737,510
736,510
736,510
735,510
735,510
734,510
733,510
733,510
732,510
731,510
731,511
729,511
729,512
728,513
728,514
728,515
728,515
727,517
726,517
726,518
725,520
725,521
725,522
724,522
724,522
723,522
722,522
722,522
721,522
721,522">
</CONTROL>
<CONTROL graphic="Line_Graphic" ID="1148" RECT="536,489,614,549" Points="542,543
608,495">
</CONTROL>
<CONTROL graphic="Line_Graphic" ID="1149" RECT="626,489,704,549" Points="632,543
698,495">
</CONTROL>
<CONTROL graphic="Polygon_Graphic" ID="1150" RECT="808,473,896,567" Points="820,553
883,554
877,485
848,529
830,488
821,553
823,551
820,553">
</CONTROL>
<CONTROL graphic="Polygon" ID="1153" RECT="-137,291,-129,299" Points="-133,295
-133,295">
</CONTROL>
<CONTROL image="image_id_1154_" ID="1154" RECT="473,367,563,439">
<IMAGETEXT>
QkFTRTY0REFUQQ==
</IMAGETEXT>
</CONTROL>
<CONTROL image="image_id_1155" ID="1155" RECT="581,367,671,439">
<IMAGETEXT>
QkFTRTY0REFUQQ==
</IMAGETEXT>
</CONTROL>
<CONTROL image="image_id_1156" ID="1156" RECT="677,365,757,438">
<IMAGETEXT>
QkFTRTY0REFUQQ==
</IMAGETEXT>
</CONTROL>
<CONTROL image="image_id_1157" ID="1157" RECT="773,373,860,467">
<IMAGETEXT>
QkFTRTY0REFUQQ==
</IMAGETEXT>
</CONTROL>
<CONTROL group="group_id_1160" ID="1160" RECT="139,57,245,251"<CONTROL button="Check" ID="1008" RECT="143,74,241,97">
</CONTROL>
<CONTROL button="2" ID="1009" RECT="143,104,241,127">
</CONTROL>
<CONTROL button="Check3" ID="1010" RECT="143,134,241,157">
</CONTROL>
<CONTROL button="Check4" ID="1011" RECT="143,164,241,187">
</CONTROL>
<CONTROL button="Check5" ID="1012" RECT="143,194,241,217">
</CONTROL>
<CONTROL button="Check6" ID="1014" RECT="143,224,241,247">
</CONTROL>
<CONTROL button="Check5" ID="1016" RECT="143,194,241,217">
</CONTROL>
<CONTROL group="group_id_1161" ID="1161" RECT="2,50,131,230"<CONTROL button="Button1" ID="1003" RECT="3,66,120,89">
</CONTROL>
<CONTROL button="Button2" ID="1004" RECT="3,99,120,122">
</CONTROL>
<CONTROL button="Button3" ID="1005" RECT="3,131,120,154">
</CONTROL>
<CONTROL button="Button4" ID="1006" RECT="3,164,120,187">
</CONTROL>
<CONTROL button="Button5" ID="1007" RECT="3,196,120,219">
</CONTROL>
<CONTROL group="group_id_1159" ID="1159" RECT="257,56,347,250"<CONTROL button="Radio1" ID="1015" RECT="261,73,343,96">
</CONTROL>
<CONTROL button="Radio2" ID="1017" RECT="261,103,343,126">
</CONTROL>
<CONTROL button="Radio2" ID="1018" RECT="261,133,343,156">
</CONTROL>
<CONTROL button="Radio2" ID="1019" RECT="261,163,343,186">
</CONTROL>
<CONTROL button="Radio2" ID="1020" RECT="261,193,343,216">
</CONTROL>
<CONTROL button="Radio2" ID="1021" RECT="261,223,343,246">
</CONTROL>
<CONTROL button="Nuke" ID="1281" RECT="777,5,866,28">
</CONTROL>
<CONTROL widget="Tree_View" ID="1318" RECT="776,207,943,269"<CONTROL graphic="Regular_Polygon_Toggle_View" ID="1319" RECT="-2,3,22,27">
</CONTROL>
<CONTROL field="Label_Field" ID="1320" RECT="25,8,86,29">
<TEXT>
Toggle View
</TEXT>

<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red0\green0\blue0;\red64\green0\blue64;}
\pard \qr \f0 \fs18 \cf2 Toggle View
}
</RTFTEXT>

<HTMLTEXT>
<p>Toggle View</p>
</HTMLTEXT>

</CONTROL>
<CONTROL button="Button" ID="1321" RECT="693,5,775,28">
</CONTROL>
<CONTROL button="Button" ID="1322" RECT="863,5,945,28">
</CONTROL>
<CONTROL button="XTML EXPORT" ID="1433" RECT="129,9,286,32">
</CONTROL>

</CARD>

</STACK>
Need to make the reverse script, STACK XML back into being a Stack, as well.

We probably should make something that indicates encoding for any binary data that needs to be stored, then it could could be array-encoded, UUEnc, Base64., Rot13, whatever.
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by OpenXTalkPaul »

this is the revTools palette in this markup (so far):

Code: Select all

<STACK name="revTools" ID="101748" RECT="177,391,315,955">

<CARD name="card id 1002" ID="1002">
<CONTROL group="background" ID="1003" RECT="-4,-4,142,25"<CONTROL widget="header_background" ID="1004" RECT="0,0,138,21"<CONTROL group="contents" ID="1005" RECT="-2,19,139,566"<CONTROL graphic="tool_hover" ID="1006" RECT="111,489,131,509">
</CONTROL>
<CONTROL graphic="tool_hilite" ID="1007" RECT="16,27,36,47">
</CONTROL>
<CONTROL group="images" ID="1008" RECT="64,112,72,120"<CONTROL image="com.livecode.widget.native.android.button.icon.png" ID="101550" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/images/extension-widget.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.native.android.field.icon.png" ID="101553" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/images/extension-widget.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.browser.icon.png" ID="101556" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/images/extension-widget.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.clock.icon.png" ID="101559" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Extensions/com.livecode.widget.clock/support/icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.headerbar.icon.png" ID="101562" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Extensions/com.livecode.widget.headerbar/support/icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.native.emscripten.button.icon.png" ID="101565" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/images/extension-widget.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.native.ios.button.icon.png" ID="101568" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/images/extension-widget.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.linegraph.icon.png" ID="101571" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Extensions/com.livecode.widget.linegraph/support/icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.native.mac.button.icon.png" ID="101574" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/images/extension-widget.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.native.mac.textfield.icon.png" ID="101577" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/images/extension-widget.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.navbar.icon.png" ID="101580" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Extensions/com.livecode.widget.navbar/support/icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.segmented.icon.png" ID="101583" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Extensions/com.livecode.widget.segmented/support/icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.spinner.icon.png" ID="101586" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/images/extension-widget.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.svgpath.icon.png" ID="101589" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Extensions/com.livecode.widget.svgpath/support/icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.switchbutton.icon.png" ID="101592" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Extensions/com.livecode.widget.switchbutton/support/icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.widget.treeview.icon.png" ID="101595" RECT="43,5,83,25" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/images/extension-widget.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.Pencil.icon.png" ID="101600" RECT="58,7,67,23" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.Pencil.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.Brush.icon.png" ID="101603" RECT="55,7,70,23" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.Brush.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.Bucket.icon.png" ID="101606" RECT="54,7,70,23" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.Bucket.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.SprayCan.icon.png" ID="101609" RECT="56,7,68,23" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.SprayCan.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.Polygon.icon.png" ID="101612" RECT="55,9,69,21" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.Polygon.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.Curve.icon.png" ID="101615" RECT="56,9,67,21" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.Curve.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.Select.icon.png" ID="101618" RECT="54,9,68,21" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.Select.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.Eraser.icon.png" ID="101621" RECT="53,8,68,22" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.Eraser.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.CurveGraphic.icon.png" ID="101626" RECT="55,9,66,21" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.CurveGraphic.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.PolygonGraphic.icon.png" ID="101629" RECT="53,9,67,21" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.PolygonGraphic.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.LineGraphic.icon.png" ID="101632" RECT="54,9,65,20" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.LineGraphic.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.FillColor.icon.png" ID="101636" RECT="54,9,65,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.FillColor.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.LineColor.icon.png" ID="101639" RECT="55,9,64,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.LineColor.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.LineSize.icon.png" ID="101642" RECT="55,9,64,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.LineSize.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.BrushPattern.icon.png" ID="101645" RECT="54,9,64,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.BrushPattern.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.PolygonSides.icon.png" ID="101648" RECT="54,9,64,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.PolygonSides.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.Browse.icon.png" ID="101652" RECT="53,5,65,22" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.Browse.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.Pointer.icon.png" ID="101655" RECT="50,5,68,22" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.Pointer.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.RegularGraphic.icon.png" ID="101660" RECT="52,6,66,20" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.RegularGraphic.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.OvalGraphic.icon.png" ID="101663" RECT="53,7,65,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.OvalGraphic.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.RoundRectGraphic.icon.png" ID="101666" RECT="52,7,66,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.RoundRectGraphic.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.RectangleGraphic.icon.png" ID="101669" RECT="52,7,66,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.RectangleGraphic.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.FillColor.icon.png" ID="101673" RECT="53,8,64,18" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.FillColor.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.LineColor.icon.png" ID="101676" RECT="54,8,63,18" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.LineColor.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.tool.LineSize.icon.png" ID="101679" RECT="54,8,63,18" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.tool.LineSize.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.Button.icon.png" ID="101684" RECT="41,3,75,22" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.Button.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.Checkbox.icon.png" ID="101687" RECT="49,4,67,21" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.Checkbox.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.DefaultButton.icon.png" ID="101690" RECT="41,3,75,22" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.DefaultButton.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.RadioButton.icon.png" ID="101693" RECT="49,4,67,21" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.RadioButton.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.RectangleButton.icon.png" ID="101696" RECT="41,3,75,22" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.RectangleButton.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.TabPanel.icon.png" ID="101699" RECT="39,-8,58,12" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.TabPanel.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.LabelField.icon.png" ID="101702" RECT="41,2,75,21" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.LabelField.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.Field.icon.png" ID="101705" RECT="39,2,77,21" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.Field.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.TextArea.icon.png" ID="101708" RECT="41,-1,69,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.TextArea.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.TableField.icon.png" ID="101711" RECT="39,-1,71,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.TableField.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.ListField.icon.png" ID="101714" RECT="41,-1,69,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.ListField.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.DataGrid.icon.png" ID="101717" RECT="42,0,71,20" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.DataGrid.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.OptionMenu.icon.png" ID="101720" RECT="41,1,75,20" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.OptionMenu.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.PulldownMenu.icon.png" ID="101723" RECT="39,-3,68,17" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.PulldownMenu.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.ComboBox.icon.png" ID="101726" RECT="41,0,75,19" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.ComboBox.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.PopupMenu.icon.png" ID="101729" RECT="39,-4,67,16" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.PopupMenu.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.Progressbar.icon.png" ID="101732" RECT="41,1,75,17" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.Progressbar.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.Slider.icon.png" ID="101735" RECT="39,0,77,17" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.Slider.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.LittleArrows.icon.png" ID="101738" RECT="50,-3,64,17" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.LittleArrows.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.Scrollbar.icon.png" ID="101741" RECT="30,-1,70,12" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.Scrollbar.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.Image.icon.png" ID="101744" RECT="46,-4,64,16" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.Image.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL image="com.livecode.interface.classic.Player.icon.png" ID="101747" RECT="46,-4,64,16" fileName="/Users/pmcclernan/Desktop/OpenXTalk/OpenXTalk.app/Contents/Tools/Toolset/resources/supporting_files/themes/com.livecode.theme.mac.10.0/com.livecode.interface.classic.Player.icon.png">
<IMAGEDATA>
QkFTRTY0REFUQQ==
</IMAGEDATA>
</CONTROL>
<CONTROL group="widget" ID="1009" RECT="2,55,134,198"<CONTROL widget="com.livecode.widget.native.android.button" ID="101551" RECT="6,59,46,79">
<SVGPATH>"M25.34,0H2.1A2.1,2.1,0,0,0,0,2.1V13.19a2.1,2.1,0,0,0,2.1,2.1H25.34a2.1,2.1,0,0,0,2.1-2.1V2.1A2.1,2.1,0,0,0,25.34,0Zm-15,9.49a.76.76,0,0,1-1.51.15.85.85,0,0,1,0-.15q0-1.58,0-3.16a.76.76,0,0,1,1.51-.12.91.91,0,0,1,0,.13q0,.78,0,1.57T10.35,9.49Zm7.08,1.11a.8.8,0,0,1-.4.71.78.78,0,0,1-.42.12h-.49c-.05,0-.05,0-.05.05,0,.54,0,1.08,0,1.62a.76.76,0,0,1-1.51.13.75.75,0,0,1,0-.14q0-.81,0-1.62s0,0,0,0h-.94s0,0,0,0c0,.55,0,1.09,0,1.64a.76.76,0,0,1-1.51.12.76.76,0,0,1,0-.14q0-.81,0-1.62s0,0,0,0h-.5a.82.82,0,0,1-.81-.64.8.8,0,0,1,0-.18q0-2.44,0-4.88s0,0,0,0h6.71s0,0,0,0Q17.43,8.17,17.43,10.6Zm0-5.18H10.68s0,0,0,0a2.93,2.93,0,0,1,.14-.86,3,3,0,0,1,.49-.92,3.27,3.27,0,0,1,.89-.79l.18-.1s0,0,0,0l-.51-.92a.11.11,0,0,1,0-.16.11.11,0,0,1,.16,0l.17.3.35.64s0,0,.06,0a3.5,3.5,0,0,1,.93-.26,3.67,3.67,0,0,1,1.89.24h0c.07,0,.07,0,.1,0l.5-.9a.11.11,0,0,1,.12-.07.11.11,0,0,1,.09.08.12.12,0,0,1,0,.09l-.51.91s0,0,0,.07a3.23,3.23,0,0,1,1.35,1.34,2.91,2.91,0,0,1,.33,1.08c0,.09,0,.17,0,.26S17.43,5.42,17.41,5.42Zm1.82,2.49q0,.79,0,1.59a.76.76,0,0,1-1.51.11.85.85,0,0,1,0-.12q0-1.58,0-3.15a.76.76,0,0,1,1.51-.15.88.88,0,0,1,0,.16Q19.24,7.12,19.24,7.91Zm-3.35-4a.28.28,0,1,1-.28-.28A.29.29,0,0,1,15.89,3.89Zm-3.14,0a.28.28,0,1,1-.28-.28A.28.28,0,0,1,12.75,3.89Z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.native.android.field" ID="101554" RECT="48,59,88,79">
<SVGPATH>"M28.06,4.95a.34.34,0,1,1,.34.34A.34.34,0,0,1,28.06,4.95Zm-3.45.34a.34.34,0,1,0-.34-.34A.34.34,0,0,0,24.6,5.29ZM36.25,2V17.24a2,2,0,0,1-2,2H2a2,2,0,0,1-2-2V2A2,2,0,0,1,2,0h32.3A2,2,0,0,1,36.25,2ZM22.39,6.8h8.23a3.76,3.76,0,0,0-2.1-3.31l.65-1.17a.13.13,0,0,0-.05-.18l-.06,0a.13.13,0,0,0-.11.07l-.66,1.19a4.43,4.43,0,0,0-3.56,0l-.66-1.19a.13.13,0,1,0-.23.13l.65,1.17A3.76,3.76,0,0,0,22.39,6.8ZM9.57,2.57H5v1.5H6.53v11H5v1.5H9.57v-1.5H8v-11H9.57ZM22,7.89a.92.92,0,0,0-1.84,0v3.84a.92.92,0,1,0,1.84,0Zm8.57-.76H22.39v6a1,1,0,0,0,1,1H24v2a.92.92,0,1,0,1.84,0v-2h1.23v2a.92.92,0,1,0,1.84,0v-2h.66a1,1,0,0,0,1-1Zm2.19.76a.92.92,0,0,0-1.84,0v3.84a.92.92,0,1,0,1.84,0Z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.browser" ID="101557" RECT="90,59,130,79">
<SVGPATH>"M21.7,12c0,5.4-4.4,9.7-9.7,9.7S2.3,17.4,2.3,12S6.6,2.3,12,2.3S21.7,6.6,21.7,12z M11.9,16.6c0-0.2-0.1-0.3-0.3-0.4  C11,16,10.4,16,9.9,15.5c-0.1-0.2-0.1-0.4-0.2-0.6c-0.2-0.2-0.7-0.3-1-0.4c-0.4,0-0.8,0-1.3,0c-0.2,0-0.5,0-0.7,0  c-0.3-0.1-0.5-0.5-0.7-0.8C6,13.6,6,13.4,5.8,13.4c-0.2-0.1-0.4,0.1-0.6,0c-0.1-0.1-0.1-0.2-0.1-0.3c0-0.3,0.2-0.6,0.4-0.8  c0.3-0.2,0.6,0.1,0.9,0.1c0.1,0,0.1,0,0.2,0.1C6.9,12.6,7,13,7,13.3c0,0.1,0,0.2,0,0.2c0,0.1,0.1,0.1,0.2,0.1c0.1-0.5,0.1-1,0.2-1.5  c0-0.6,0.6-1.2,1.1-1.4c0.2-0.1,0.3,0.1,0.5,0c0.6-0.2,2.1-0.8,1.8-1.6C10.6,8.4,10,7.7,9.2,7.8C9,7.9,8.9,8,8.7,8.1  C8.4,8.3,7.8,8.9,7.5,8.9C7,8.8,7,8.1,7.1,7.8c0.1-0.4,1-1.7,1.6-1.5C8.8,6.4,9,6.6,9.1,6.7c0.2,0.1,0.5,0.1,0.8,0.1  c0.1,0,0.2,0,0.3-0.1c0.1-0.1,0.1-0.1,0.1-0.2c0-0.3-0.3-0.6-0.5-0.8C9.6,5.5,9.3,5.3,9,5.2C8,4.9,6.4,5.3,5.6,6  C4.8,6.7,4.2,7.9,3.8,8.9C3.6,9.5,3.4,10.3,3.3,11c-0.1,0.5-0.2,0.9,0.1,1.4C3.7,13,4.3,13.6,4.9,14c0.4,0.3,1.2,0.3,1.6,0.8  c0.3,0.4,0.2,0.9,0.2,1.4c0,0.6,0.4,1.1,0.6,1.6c0.1,0.3,0.2,0.7,0.3,1c0,0.1,0.1,0.7,0.1,0.8c0.6,0.3,1.1,0.6,1.8,0.8  c0.1,0,0.5-0.6,0.5-0.7c0.3-0.3,0.5-0.7,0.8-0.9c0.2-0.1,0.4-0.2,0.6-0.4c0.2-0.2,0.3-0.6,0.4-0.9C11.9,17.3,12,16.9,11.9,16.6z   M12.1,7.4c0.1,0,0.2-0.1,0.4-0.2c0.3-0.2,0.6-0.5,0.9-0.7c0.3-0.2,0.6-0.5,0.8-0.7c0.3-0.2,0.5-0.6,0.6-0.9  c0.1-0.2,0.4-0.6,0.3-0.9c-0.1-0.2-0.6-0.3-0.8-0.4c-0.8-0.2-1.5-0.3-2.3-0.3c-0.3,0-0.7,0.1-0.8,0.4c-0.1,0.5,0.3,0.4,0.7,0.5  c0,0,0.1,0.8,0.1,0.9c0.1,0.5-0.2,0.8-0.2,1.3c0,0.3,0,0.8,0.2,1C12,7.4,12.1,7.4,12.1,7.4z M20.5,14.4c0.1-0.2,0.1-0.5,0.2-0.7  c0.1-0.5,0.1-1,0.1-1.5c0-1-0.1-2-0.4-2.9C20.2,9,20.1,8.7,20,8.4c-0.2-0.5-0.5-1-0.9-1.4c-0.4-0.5-0.9-1.9-1.8-1.5  c-0.3,0.1-0.5,0.5-0.7,0.7c-0.2,0.3-0.4,0.6-0.6,0.9c-0.1,0.1-0.2,0.3-0.1,0.4c0,0.1,0.1,0.1,0.2,0.1c0.2,0.1,0.3,0.1,0.5,0.2  c0.1,0,0.2,0.1,0.1,0.2c0,0,0,0.1-0.1,0.1c-0.5,0.5-1,0.9-1.5,1.4c-0.1,0.1-0.2,0.3-0.2,0.4c0,0.1,0.1,0.1,0.1,0.2  c0,0.1-0.1,0.1-0.2,0.2c-0.2,0.1-0.4,0.2-0.5,0.3c-0.1,0.2,0,0.5-0.1,0.7c-0.1,0.5-0.4,0.9-0.6,1.4c-0.2,0.3-0.3,0.6-0.5,0.9  c0,0.4-0.1,0.7,0.1,1c0.5,0.7,1.4,0.3,2.1,0.6c0.2,0.1,0.4,0.1,0.5,0.3c0.3,0.3,0.3,0.8,0.4,1.1c0.1,0.4,0.2,0.8,0.4,1.2  c0.1,0.5,0.3,1,0.4,1.4c0.9-0.7,1.7-1.5,2.3-2.5C19.9,16,20.2,15.2,20.5,14.4z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.clock" ID="101560" RECT="6,82,46,102">
<SVGPATH>"M31.7,0C14.2,0,0,14.2,0,31.7s14.2,31.7,31.7,31.7s31.7-14.2,31.7-31.7S49.2,0,31.7,0z M30.2,3.2h2.8v7.3h-2.8V3.2zM10.4,33.1H3.1v-2.8h7.3V33.1z M12.5,52.9l-2-2l5.2-5.2l2,2L12.5,52.9z M15.7,17.7l-5.2-5.2l2-2l5.2,5.2L15.7,17.7z M33.1,60.2h-2.8v-7.3h2.8V60.2z M42.3,45.4L31.8,34.9c0,0-0.1,0-0.1,0c-1.7,0-3-1.3-3-3c0-1.1,0.6-2.1,1.6-2.6V12.9h2.8v16.3c0.9,0.5,1.6,1.5,1.6,2.6c0,0.2,0,0.4-0.1,0.5L45,42.8L42.3,45.4z M50.8,52.9l-5.2-5.2l2-2l5.2,5.2L50.8,52.9z M47.7,17.7l-2-2l5.2-5.2l2,2L47.7,17.7z M52.9,33.1v-2.8h7.3v2.8H52.9z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.headerbar" ID="101563" RECT="48,82,88,102">
<SVGPATH>"M0,0v29.5h80.2V0H0z M13.2,20.6l-1.8,1.8l-7.5-7.5l0.1-0.1l-0.1-0.1l7.5-7.5l1.8,1.8l-5.8,5.8L13.2,20.6z M31.2,10.9h-3.8v10.3h-2.6V10.9H21V8.7h10.2V10.9z M34.7,21.2h-2.5v-9.3h2.5V21.2z M34.7,10.8h-2.5V8.6h2.5V10.8z M41.3,13.7h-1.5v4.9c0,0.4,0,0.6,0.1,0.7c0.1,0.1,0.4,0.1,0.9,0.1c0.1,0,0.2,0,0.2,0s0.2,0,0.2,0v1.8l-1.1,0c-1.1,0-1.9-0.2-2.3-0.6c-0.3-0.3-0.4-0.7-0.4-1.3v-5.7h-1.3V12h1.3V9.4h2.4V12h1.5V13.7z M45.4,21.2h-2.4V8.7h2.4V21.2z M56.2,17.3h-6.8c0,0.9,0.4,1.6,1,2c0.4,0.2,0.8,0.3,1.3,0.3c0.6,0,1-0.1,1.3-0.4c0.2-0.2,0.4-0.4,0.5-0.6h2.5c-0.1,0.6-0.4,1.1-0.9,1.7c-0.8,0.9-2,1.4-3.5,1.4c-1.2,0-2.3-0.4-3.3-1.1c-0.9-0.8-1.4-2-1.4-3.7c0-1.6,0.4-2.8,1.3-3.7c0.9-0.9,2-1.3,3.3-1.3c0.8,0,1.5,0.1,2.2,0.4c0.6,0.3,1.2,0.7,1.6,1.4c0.4,0.6,0.6,1.2,0.7,1.9c0,0,0,0.1,0,0.1h-2.5c-0.1-0.6-0.3-1-0.6-1.4c-0.4-0.3-0.9-0.5-1.4-0.5c-0.6,0-1.1,0.2-1.4,0.5c-0.3,0.4-0.6,0.8-0.6,1.4h3.1h1.1h2.5C56.2,16.1,56.2,16.6,56.2,17.3z M76.1,16.2h-4.6v4.6h-3v-4.6h-4.6v-3h4.6V8.7h3v4.6h4.6V16.2z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.native.emscripten.button" ID="101566" RECT="90,82,130,102">
<SVGPATH>"M 397,551.25195 a 2.1,2.1 0 0 0 -2.09961,2.09961 v 11.08985 A 2.1,2.1 0 0 0 397,566.54297 h 23.24023 a 2.1,2.1 0 0 0 2.09961,-2.10156 v -11.08985 a 2.1,2.1 0 0 0 -2.09961,-2.09961 z m 7.11328,2.52344 h 9.01367 l -0.81836,9.20703 -3.70117,1.03711 -3.67383,-1.03711 z m 1.67774,1.88281 0.30078,3.41797 h 3.91797 l -0.14063,1.46094 -1.26172,0.33789 -1.2539,-0.33789 -0.084,-0.89649 h -1.12109 l 0.14258,1.7793 2.3164,0.64063 h 0.0274 v -0.008 l 2.29882,-0.63476 0.31836,-3.48242 h -4.12304 l -0.0957,-1.15821 h 4.31446 l 0.10351,-1.11914 Z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.native.ios.button" ID="101569" RECT="6,105,46,125">
<SVGPATH>"M 535.66797 241.55273 C 491.1077 241.55273 455.23438 277.42605 455.23438 321.98633 L 455.23438 913.65039 C 455.23438 958.21066 491.1077 994.08398 535.66797 994.08398 L 2014.5762 994.08398 C 2059.1364 994.08398 2095.0098 958.21066 2095.0098 913.65039 L 2095.0098 321.98633 C 2095.0098 277.42605 2059.1364 241.55273 2014.5762 241.55273 L 535.66797 241.55273 z M 1155.1543 304.32422 C 1293.7311 304.30837 1399.8223 413.6262 1399.8223 613.28906 C 1399.8223 831.92443 1278.4507 931.3125 1145.5957 931.3125 C 1009.8798 931.3125 899.97656 823.80972 899.97656 622.33203 C 899.97656 415.4574 1013.7086 304.32422 1155.1543 304.32422 z M 1637.668 305.20508 C 1689.1647 305.20508 1728.013 319.66027 1746.082 332.30859 L 1738.9023 347.9043 C 1723.5436 337.0708 1682.0317 323.26562 1636.875 323.26562 C 1535.6646 323.26562 1491.5781 399.7417 1491.5781 456.04102 C 1491.5781 533.80129 1551.8559 559.80417 1629.5527 596.8457 C 1719.89 641.10692 1767.7656 680.13793 1767.7656 765.07031 C 1767.7656 856.31896 1702.7239 930.38477 1587.082 930.38477 C 1539.1912 930.38477 1484.0899 914.13108 1456.9863 893.34375 L 1465.0605 875.2832 C 1494.8824 895.15914 1546.3559 914.35352 1590.625 914.35352 C 1674.646 914.35352 1749.3711 855.57405 1749.3711 769.05664 C 1749.3711 688.7683 1699.5944 646.87616 1615.082 610.88867 C 1539.4457 578.68139 1471.4414 543.72442 1471.4414 457.89648 C 1471.4414 368.46267 1541.9021 305.20508 1637.668 305.20508 z M 1156.1758 325.58008 C 999.78351 325.58008 917.99023 456.01743 917.99023 617.80664 C 917.99023 783.58214 998.33285 912.36328 1146.4355 912.36328 C 1295.5685 912.36328 1381.1035 779.61907 1381.1035 615.91992 C 1381.1035 464.11624 1312.5681 325.58008 1156.1758 325.58008 z M 799.93164 336.48438 C 810.31342 336.48438 816.91406 344.97176 816.91406 355.35352 C 816.91406 366.19495 810.31315 374.21484 798.98828 374.21484 C 789.55751 374.21484 782.48047 366.19495 782.48047 355.35352 C 782.48047 344.97176 790.02537 336.48438 799.93164 336.48438 z M 790.80859 488.61328 L 808.58398 488.61328 L 808.58398 922.26953 L 790.80859 922.26953 L 790.80859 488.61328 z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.linegraph" ID="101572" RECT="48,105,88,125">
<SVGPATH>"M50.6,27.2h-2.2v-3.3l0.8-0.5l-0.2-0.3h2.9v-1h-3.5v-5h3.5v-1h-3.5v-5h3.5v-1h-3.5v-5h3.5v-1h-3.5V1.8h-1v2.4h-10V1.8h-1v2.4h-10V1.8h-1v2.4h-10V1.8h-1v2.4H5V2.5C5,1.1,3.9,0,2.5,0S0,1.1,0,2.5v29.7h50.6c1.4,0,2.5-1.1,2.5-2.5C53.1,28.4,52,27.2,50.6,27.2z M47.4,27.2h-10v-4.1h8l1.2,1.9l0.8-0.5V27.2z M15.4,15.2l1.4,0.9h-1.4V15.2z M14.4,17.1v5h-4.2l3.6-5H14.4z M15.4,17.1h2.9l7.1,4.6v0.4h-10V17.1z M26.4,17.1h0.1l-0.1,0.2V17.1z M25.4,18.1l-1.6-1h1.6V18.1z M26.4,22l4-4.9h6v5h-10V22z M37.4,17.1h4.2l3.2,5h-7.4V17.1z M37.4,16.1v-5h0.4l3.2,5H37.4z M36.4,10.1h-0.1l0.1-0.2V10.1z M36.4,11.1v5h-5.1l4.2-5H36.4z M27.4,16.1h-1v-5h5.1L27.4,16.1z M25.4,16.1h-3.1l-6.9-4.5v-0.5h10V16.1z M14.4,11.3l-3.5,4.9H5v-5h9.4V11.3z M10.1,17.1l-3.6,5H5v-5H10.1z M5.7,23.1l-0.7,1v-1H5.7z M9.5,23.1h4.9v4.1H6.5L9.5,23.1z M15.4,23.1h10v4.1h-10V23.1z M26.4,23.1h10v4.1h-10V23.1z M47.4,20.7l-2.3-3.6h2.3V20.7z M47.4,16.1h-2.9l-3.2-5h6.1V16.1z M47.4,10.1h-6.7l-3.2-5h9.9V10.1z M36.4,5.1v0.1l-4,4.9h-6v-5H36.4z M25.4,5.1v5h-10v-5H25.4z M14.4,5.1v5H5v-5H14.4z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.native.mac.button" ID="101575" RECT="90,105,130,125">
<SVGPATH>"m -19.375905,-4.8110434 c -1.108001,0 -2,0.892 -2,2 l 0,15.4453124 c 0,1.108 0.891999,2 2,2 l 27.5722648,0 c 1.108,0 2.0000002,-0.892 2.0000002,-2 l 0,-15.4453124 c 0,-1.108 -0.8920002,-2 -2.0000002,-2 l -27.5722648,0 z m 6.857421,2.3847656 13.8593751,0 c 0.588,0 1.0664531,0.4812187 1.0644531,1.0742188 l 0,9.8437501 c 0,0.594 -0.4764531,1.074219 -1.0644531,1.074219 l -5.3203125,0 c 0,0 0.5936093,2.1484369 3.22460934,2.1484369 l 0,0.537109 -3.49218744,0 -4.5683598,0 -1.8789057,0 0,-0.537109 c 2.5589997,0 3.4921873,-2.1484369 3.4921873,-2.1484369 l -5.3164063,0 c -0.589,-10e-7 -1.066406,-0.480219 -1.066406,-1.074219 l 0,-9.8437501 c 0,-0.593 0.477406,-1.0742188 1.066406,-1.0742188 z m 0.07617,1.1425781 0,9.1074219 13.7070312,0 0,-9.1074219 -13.7070312,0 z m 7.8105468,1.12890629 c 0.04,0.364 -0.1062656,0.7291875 -0.3222656,0.9921875 -0.217,0.26200001 -0.5709219,0.46450001 -0.9199219,0.43750001 -0.047,-0.35600001 0.128125,-0.72598441 0.328125,-0.95898441 0.225,-0.262 0.6020625,-0.4577031 0.9140625,-0.4707031 z m -0.00586,1.50195311 c 0.202,0.008 0.7707688,0.080281 1.1347656,0.6132813 -0.028,0.019 -0.6779219,0.3956406 -0.6699219,1.1816406 0.009,0.938 0.8220313,1.2508594 0.8320313,1.2558594 -0.008,0.021 -0.1296882,0.4448126 -0.4296876,0.8828125 -0.2579999,0.3770001 -0.5262187,0.7537187 -0.9492187,0.7617187 -0.415,0.008 -0.5474375,-0.2460937 -1.0234375,-0.2460937 -0.475,0 -0.6245782,0.2379062 -1.0175781,0.2539062 -0.4080001,0.015 -0.7185154,-0.4081561 -0.9785159,-0.7851562 -0.533,-0.7709999 -0.941531,-2.1769532 -0.394531,-3.1269532 0.272,-0.471 0.7581563,-0.7693437 1.2851562,-0.7773437 0.4,-0.007 0.7794376,0.2695313 1.0234376,0.2695313 0.246,0 0.7054999,-0.3322032 1.1875,-0.2832032 z M -5.5887964,8.147941 c -0.331,0 -0.5996094,0.2676561 -0.5996094,0.5976561 0,0.331 0.2686093,0.599609 0.5996094,0.599609 0.33,10e-7 0.5986093,-0.268609 0.5996093,-0.599609 10e-8,-0.33 -0.2696093,-0.5976561 -0.5996093,-0.5976561 z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.native.mac.textfield" ID="101578" RECT="6,128,46,148">
<SVGPATH>"m 0.4112036,8.147941 c -0.331,0 -0.5996094,0.2676561 -0.5996094,0.5976561 0,0.331 0.2686093,0.599609 0.5996094,0.599609 0.33,10e-7 0.5986093,-0.268609 0.5996093,-0.599609 1e-7,-0.33 -0.2696093,-0.5976561 -0.5996093,-0.5976561 z M 1.3623728,1.3471597 c 0.202,0.008 0.7707688,0.080281 1.1347656,0.6132813 -0.028,0.019 -0.6779219,0.3956406 -0.6699219,1.1816406 0.009,0.938 0.8220313,1.2508594 0.8320313,1.2558594 -0.008,0.021 -0.1296882,0.4448126 -0.4296876,0.8828125 -0.2579999,0.3770001 -0.5262187,0.7537187 -0.9492187,0.7617187 -0.415,0.008 -0.5474375,-0.2460937 -1.0234375,-0.2460937 -0.475,0 -0.6245782,0.2379062 -1.0175781,0.2539062 -0.4080001,0.015 -0.7185154,-0.4081561 -0.9785159,-0.7851562 -0.533,-0.7709999 -0.941531,-2.1769532 -0.394531,-3.1269532 0.272,-0.471 0.7581563,-0.7693437 1.2851562,-0.7773437 0.4,-0.007 0.7794376,0.2695313 1.0234376,0.2695313 0.246,0 0.7054999,-0.3322032 1.1875,-0.2832032 z m 0.00586,-1.50195311 c 0.04,0.364 -0.1062656,0.7291875 -0.3222656,0.9921875 -0.217,0.26200001 -0.5709219,0.46450001 -0.9199219,0.43750001 -0.047,-0.35600001 0.128125,-0.72598441 0.328125,-0.95898441 0.225,-0.262 0.6020625,-0.4577031 0.9140625,-0.4707031 z m -7.8105468,-1.12890629 0,9.1074219 13.7070312,0 0,-9.1074219 z m -0.07617,-1.1425781 13.8593751,0 c 0.588,0 1.0664531,0.4812187 1.0644531,1.0742188 l 0,9.8437501 c 0,0.594 -0.4764531,1.074219 -1.0644531,1.074219 l -5.3203125,0 c 0,0 0.5936093,2.1484369 3.2246093,2.1484369 l 0,0.537109 -3.4921874,0 -4.5683598,0 -1.8789057,0 0,-0.537109 c 2.5589997,0 3.4921873,-2.1484369 3.4921873,-2.1484369 l -5.3164063,0 c -0.589,0 -1.066406,-0.480219 -1.066406,-1.074219 l 0,-9.8437501 c 0,-0.593 0.477406,-1.0742188 1.066406,-1.0742188 z M -19.375,-4.8105469 c -1.108001,0 -2,0.892 -2,2 l 0,15.4453129 c 0,1.108 0.891999,2 2,2 l 27.5722656,0 c 1.108,0 2.0000004,-0.892 2.0000004,-2 l 0,-15.4453129 c 0,-1.108 -0.8920004,-2 -2.0000004,-2 l -27.5722656,0 z m 0.753906,2.5605469 4.570313,0 0,1.5 -1.570313,0 0,11 1.570313,0 0,1.5 -4.570313,0 0,-1.5 1.53125,0 0,-11 -1.53125,0 0,-1.5 z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.navbar" ID="101581" RECT="48,128,88,148">
<SVGPATH>"M0,0v29.5h80.2V0H0z M21.1,21.5c-0.2-0.1-0.4-0.2-0.4-0.2c-0.5-0.2-0.9-0.3-1.4-0.4c-0.7-0.1-0.9-0.4-0.9-1.1c0-0.1-0.1-0.9,0-1c0.4-0.2,0.5-0.9,0.5-1.3c0-0.3,0.2-0.5,0.3-0.7c0.2-0.3,0.2-0.6,0.3-0.9c0.1-0.2,0.2-0.6,0.1-0.8c0-0.2-0.2-0.4-0.2-0.6c0-0.3,0.1-0.6,0.1-0.9c0-0.5,0-0.9,0-1.4c-0.2-1.2-1.4-1.6-2.5-1.9c-1-0.2-2.2,0.3-2.9,1c-0.3,0.3-0.6,0.7-0.7,1.1c-0.1,0.4,0,0.9,0,1.2c0,0.2,0,0.4,0.1,0.6c0,0.2,0.1,0.3,0.1,0.5c0,0.1-0.1,0.2-0.1,0.3c-0.2,0.4,0,1,0.2,1.4c0.1,0.2,0.2,0.4,0.3,0.5c0.2,0.2,0.2,0.3,0.2,0.6c0,0.4,0.1,1.2,0.6,1.4c0.1,0.1,0,0.8-0.1,0.9c0,0.7,0,1-0.6,1.1c-0.5,0.1-0.9,0.2-1.4,0.4c-0.2,0.1-0.4,0.2-0.7,0.3c-2-1.4-3.4-3.8-3.4-6.4c0-4.3,3.5-7.8,7.8-7.8s7.8,3.5,7.8,7.8C24.3,17.8,23,20.1,21.1,21.5z M45.1,22.7l-4.9-3.6v-0.7l0.2,0.2l3.6,2.6L42.6,17l-0.1-0.4l0.3-0.3l3.4-2.5H42h-0.4l-0.1-0.4l-1.4-4.2l-1.4,4.2l-0.1,0.4h-0.4h-4.3l3.4,2.5l0.3,0.3L37.5,17l-1.4,4.2l3.6-2.6l0.2-0.2v0.7L35,22.7l1.9-5.9l-4.9-3.6h6.1l1.9-5.9l1.9,5.9h6.1l-4.9,3.6L45.1,22.7z M71.1,23.1l-4.9-4.9c-1,0.9-2.4,1.4-3.9,1.5V19c3-0.1,5.4-2.5,5.4-5.5c0-3.1-2.5-5.5-5.5-5.5c-3.1,0-5.5,2.5-5.5,5.5c0,3,2.4,5.4,5.4,5.5v0.7c-3.4-0.1-6-2.8-6-6.2c0-3.4,2.8-6.2,6.2-6.2c3.4,0,6.2,2.8,6.2,6.2c0,1.5-0.6,2.9-1.5,4l4.9,4.9L71.1,23.1z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.segmented" ID="101584" RECT="90,128,130,148">
<SVGPATH>"M72.6,0H7.7C3.4,0,0,3.4,0,7.7v14c0,4.2,3.4,7.7,7.7,7.7h64.9c4.2,0,7.7-3.4,7.7-7.7v-14C80.2,3.4,76.8,0,72.6,0z M7.8,13.5h8v2.3h-8V13.5z M19.7,20.6h-12v-2.3h12V20.6z M19.7,11h-12V8.8h12V11z M27.8,25.5h-1V3.8h1V25.5z M46.1,20.6h-12v-2.3h12V20.6zM36.1,15.7v-2.3h8v2.3H36.1z M46.1,11h-12V8.8h12V11z M54.4,25.5h-1V3.8h1V25.5z M72.7,20.6h-12v-2.3h12V20.6z M72.7,15.7h-8v-2.3h8V15.7z M72.7,11h-12V8.8h12V11z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.spinner" ID="101587" RECT="6,151,46,171">
<SVGPATH>"M496 1408Q496 1468 453.5 1510 411 1552 352 1552 292 1552 250 1510 208 1468 208 1408 208 1348 250 1306 292 1264 352 1264 411 1264 453.5 1306 496 1348 496 1408ZM928 1600Q928 1653 890.5 1690.5 853 1728 800 1728 747 1728 709.5 1690.5 672 1653 672 1600 672 1547 709.5 1509.5 747 1472 800 1472 853 1472 890.5 1509.5 928 1547 928 1600ZM320 960Q320 1026 273 1073 226 1120 160 1120 94 1120 47 1073 0 1026 0 960 0 894 47 847 94 800 160 800 226 800 273 847 320 894 320 960ZM1360 1408Q1360 1454 1327 1487 1294 1520 1248 1520 1202 1520 1169 1487 1136 1454 1136 1408 1136 1362 1169 1329 1202 1296 1248 1296 1294 1296 1327 1329 1360 1362 1360 1408ZM528 512Q528 585 476.5 636.5 425 688 352 688 279 688 227.5 636.5 176 585 176 512 176 439 227.5 387.5 279 336 352 336 425 336 476.5 387.5 528 439 528 512ZM992 320Q992 400 936 456 880 512 800 512 720 512 664 456 608 400 608 320 608 240 664 184 720 128 800 128 880 128 936 184 992 240 992 320ZM1536 960Q1536 1000 1508 1028 1480 1056 1440 1056 1400 1056 1372 1028 1344 1000 1344 960 1344 920 1372 892 1400 864 1440 864 1480 864 1508 892 1536 920 1536 960ZM1328 512Q1328 545 1304.5 568.5 1281 592 1248 592 1215 592 1191.5 568.5 1168 545 1168 512 1168 479 1191.5 455.5 1215 432 1248 432 1281 432 1304.5 455.5 1328 479 1328 512Z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.svgpath" ID="101590" RECT="48,151,88,171">
<SVGPATH>"M61.8,0H4C1.8,0,0,1.8,0,4v27.8c0,2.2,1.8,4,4,4h57.8c2.2,0,4-1.8,4-4V4C65.8,1.8,64,0,61.8,0z M20.9,25.3c-1.2,0.9-2.8,1.4-4.9,1.4c-0.8,0-1.6-0.1-2.2-0.2c-0.7-0.1-1.3-0.3-1.9-0.5c-0.1,0.2-0.3,0.4-0.5,0.5s-0.5,0.2-0.8,0.2c-0.6,0-1-0.1-1.2-0.3c-0.2-0.2-0.4-0.6-0.4-1.2l-0.1-3.2v-0.2c0-0.6,0.1-1,0.3-1.3c0.2-0.2,0.6-0.4,1.2-0.4c0.6,0,1.1,0.4,1.5,1.3c0.1,0.2,0.2,0.4,0.2,0.5c0.4,0.7,0.9,1.2,1.5,1.6c0.6,0.4,1.4,0.5,2.4,0.5c0.8,0,1.5-0.2,2-0.5c0.5-0.4,0.7-0.8,0.7-1.5c0-1-1.1-1.7-3.2-2.2c-0.6-0.1-1.1-0.3-1.5-0.4c-1.8-0.5-3-1.1-3.7-1.8c-0.7-0.7-1-1.7-1-2.9c0-1.6,0.6-2.9,1.8-3.9c1.2-1,2.7-1.5,4.6-1.5c0.6,0,1.2,0.1,1.8,0.2c0.6,0.1,1.2,0.3,1.8,0.6c0.1-0.3,0.3-0.5,0.5-0.6c0.2-0.1,0.4-0.2,0.8-0.2c0.5,0,0.9,0.1,1,0.3c0.2,0.2,0.2,0.6,0.3,1.2l0.1,2.7v0.2c0,0.5-0.1,0.9-0.3,1.1c-0.2,0.2-0.6,0.3-1.1,0.3c-0.7,0-1.1-0.4-1.5-1.1c0-0.1-0.1-0.2-0.1-0.2c-0.3-0.6-0.7-1-1.2-1.3c-0.5-0.3-1.1-0.4-1.7-0.4c-0.8,0-1.5,0.2-2,0.6s-0.8,0.9-0.8,1.5c0,0.8,1.2,1.5,3.5,2c0.4,0.1,0.7,0.1,0.9,0.2c1.8,0.4,3.1,1,3.8,1.8c0.8,0.8,1.2,1.9,1.2,3.2C22.6,23.1,22,24.4,20.9,25.3zM40.9,12.5c-0.3,0.3-0.6,0.4-1.1,0.4h-0.2l-4.2,12c-0.2,0.6-0.4,1-0.6,1.1s-0.6,0.2-1.1,0.2h-1.7c-0.8,0-1.4-0.4-1.7-1.3l0-0.1l-4.3-12h-0.2c-0.5,0-0.8-0.1-1.1-0.4s-0.4-0.6-0.4-1.1c0-0.6,0.1-0.9,0.4-1.2s0.7-0.4,1.3-0.4H30c0.6,0,1,0.1,1.3,0.4c0.3,0.2,0.4,0.6,0.4,1.2c0,0.5-0.1,0.9-0.4,1.2c-0.3,0.2-0.7,0.4-1.3,0.4h-0.4l3.3,9.8l3.4-9.8H36c-0.6,0-1-0.1-1.3-0.4c-0.3-0.2-0.4-0.6-0.4-1.2c0-0.5,0.1-0.9,0.4-1.2c0.3-0.2,0.7-0.4,1.3-0.4h3.5c0.6,0,1.1,0.1,1.3,0.4c0.3,0.2,0.4,0.6,0.4,1.2C41.3,11.9,41.2,12.2,40.9,12.5z M57.8,20.6c-0.3,0.3-0.6,0.4-1.1,0.4h-0.2v3.3v0.2c0,0.3,0,0.5-0.1,0.6s-0.2,0.2-0.4,0.4c-0.5,0.3-1.4,0.6-2.5,0.8c-1.1,0.2-2.3,0.4-3.5,0.4c-2.4,0-4.4-0.8-5.9-2.4c-1.5-1.6-2.2-3.7-2.2-6.2c0-2.5,0.8-4.5,2.3-6.2c1.5-1.6,3.4-2.5,5.8-2.5c0.6,0,1.3,0.1,1.9,0.2s1.3,0.4,2,0.7c0.2-0.3,0.4-0.6,0.6-0.7c0.2-0.1,0.4-0.2,0.7-0.2c0.5,0,0.8,0.1,1,0.4c0.2,0.2,0.3,0.6,0.3,1.2l0,3.6c0,0.6-0.1,1.1-0.3,1.3c-0.2,0.2-0.6,0.3-1.1,0.3c-0.4,0-0.7-0.1-0.9-0.3c-0.2-0.2-0.4-0.5-0.5-1C53.3,14,53,13.4,52.5,13s-1.2-0.6-2.2-0.6c-1.4,0-2.5,0.5-3.3,1.4c-0.8,1-1.1,2.3-1.1,4.2s0.4,3.2,1.2,4.2c0.8,1,1.9,1.5,3.4,1.5c0.3,0,0.7,0,1.1-0.1c0.4-0.1,0.9-0.2,1.5-0.4V21h-1.6c-0.6,0-1.1-0.1-1.3-0.3c-0.3-0.2-0.4-0.6-0.4-1.1c0-0.6,0.1-0.9,0.4-1.2s0.7-0.4,1.3-0.4h5c0.6,0,1.1,0.1,1.4,0.3s0.4,0.6,0.4,1.2C58.2,20,58.1,20.4,57.8,20.6z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.switchbutton" ID="101593" RECT="90,151,130,171">
<SVGPATH>"M47.3,0H18.5C8.3,0,0,8.3,0,18.5v0C0,28.7,8.3,37,18.5,37h28.8c10.2,0,18.5-8.3,18.5-18.5v0C65.8,8.3,57.5,0,47.3,0zM19.8,33.5c-8.3,0-15-6.7-15-15c0-8.3,6.7-15,15-15s15,6.7,15,15C34.8,26.8,28,33.5,19.8,33.5z"</SVGPATH>
</CONTROL>
<CONTROL widget="com.livecode.widget.treeview" ID="101596" RECT="6,174,46,194">
<SVGPATH>"M152.4,249.7c-6.4,0-11.8,4.3-13.5,10.1h-10v-26.7h10c1.7,5.8,7.1,10.1,13.5,10.1c7.8,0,14.1-6.3,14.1-14.1s-6.3-14.1-14.1-14.1c-6.4,0-11.8,4.3-13.5,10.1h-10v-16.1c8.4-1.8,14.8-9.3,14.8-18.3c0-10.4-8.4-18.8-18.8-18.8s-18.8,8.4-18.8,18.8c0,9,6.3,16.5,14.7,18.3v58.8h18c1.7,5.8,7.1,10.1,13.5,10.1c7.8,0,14.1-6.3,14.1-14.1S160.2,249.7,152.4,249.7z M128.7,202h-7.5v-7.5h-7.5V187h7.5v-7.5h7.5v7.5h7.5v7.5h-7.5V202z"</SVGPATH>
</CONTROL>
<CONTROL graphic="widget" ID="1010" RECT="6,53,130,54">
</CONTROL>
<CONTROL group="paint" ID="101597" RECT="2,485,135,536"<CONTROL button="com.livecode.tool.Pencil" ID="101601" RECT="6,489,26,509">
</CONTROL>
<CONTROL button="com.livecode.tool.Brush" ID="101604" RECT="27,489,47,509">
</CONTROL>
<CONTROL button="com.livecode.tool.Bucket" ID="101607" RECT="48,489,68,509">
</CONTROL>
<CONTROL button="com.livecode.tool.SprayCan" ID="101610" RECT="69,489,89,509">
</CONTROL>
<CONTROL button="com.livecode.tool.Polygon" ID="101613" RECT="90,489,110,509">
</CONTROL>
<CONTROL button="com.livecode.tool.Curve" ID="101616" RECT="111,489,131,509">
</CONTROL>
<CONTROL button="com.livecode.tool.Select" ID="101619" RECT="6,512,26,532">
</CONTROL>
<CONTROL button="com.livecode.tool.Eraser" ID="101622" RECT="27,512,47,532">
</CONTROL>
<CONTROL graphic="paint" ID="101598" RECT="6,483,131,484">
</CONTROL>
<CONTROL group="graphictools" ID="101623" RECT="2,427,72,455"<CONTROL button="com.livecode.interface.classic.CurveGraphic" ID="101627" RECT="6,431,26,451">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.PolygonGraphic" ID="101630" RECT="27,431,47,451">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.LineGraphic" ID="101633" RECT="48,431,68,451">
</CONTROL>
<CONTROL graphic="graphictools" ID="101624" RECT="6,425,131,426">
</CONTROL>
<CONTROL group="paintcontrols" ID="101634" RECT="2,534,114,562"<CONTROL button="com.livecode.tool.FillColor" ID="101637" RECT="6,538,26,558">
</CONTROL>
<CONTROL button="com.livecode.tool.LineColor" ID="101640" RECT="27,538,47,558">
</CONTROL>
<CONTROL button="com.livecode.tool.LineSize" ID="101643" RECT="48,538,68,558">
</CONTROL>
<CONTROL button="com.livecode.tool.BrushPattern" ID="101646" RECT="69,538,89,558">
</CONTROL>
<CONTROL button="com.livecode.tool.PolygonSides" ID="101649" RECT="90,538,110,558">
</CONTROL>
<CONTROL group="runedit" ID="101650" RECT="2,23,92,51"<CONTROL button="com.livecode.tool.Browse" ID="101653" RECT="6,27,46,47">
</CONTROL>
<CONTROL button="com.livecode.tool.Pointer" ID="101656" RECT="48,27,88,47">
</CONTROL>
<CONTROL group="graphic" ID="101657" RECT="2,395,93,423"<CONTROL button="com.livecode.interface.classic.RegularGraphic" ID="101661" RECT="6,399,26,419">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.OvalGraphic" ID="101664" RECT="27,399,47,419">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.RoundRectGraphic" ID="101667" RECT="48,399,68,419">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.RectangleGraphic" ID="101670" RECT="69,399,89,419">
</CONTROL>
<CONTROL graphic="graphic" ID="101658" RECT="6,393,131,394">
</CONTROL>
<CONTROL group="graphictoolscontrols" ID="101671" RECT="2,453,72,481"<CONTROL button="com.livecode.tool.FillColor" ID="101674" RECT="6,457,26,477">
</CONTROL>
<CONTROL button="com.livecode.tool.LineColor" ID="101677" RECT="27,457,47,477">
</CONTROL>
<CONTROL button="com.livecode.tool.LineSize" ID="101680" RECT="48,457,68,477">
</CONTROL>
<CONTROL group="classic" ID="101681" RECT="2,202,134,391"<CONTROL button="com.livecode.interface.classic.Button" ID="101685" RECT="6,206,46,226">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.Checkbox" ID="101688" RECT="48,206,88,226">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.DefaultButton" ID="101691" RECT="90,206,130,226">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.RadioButton" ID="101694" RECT="6,229,46,249">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.RectangleButton" ID="101697" RECT="48,229,88,249">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.TabPanel" ID="101700" RECT="90,229,130,249">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.LabelField" ID="101703" RECT="6,252,46,272">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.Field" ID="101706" RECT="48,252,88,272">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.TextArea" ID="101709" RECT="90,252,130,272">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.TableField" ID="101712" RECT="6,275,46,295">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.ListField" ID="101715" RECT="48,275,88,295">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.DataGrid" ID="101718" RECT="90,275,130,295">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.OptionMenu" ID="101721" RECT="6,298,46,318">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.PulldownMenu" ID="101724" RECT="48,298,88,318">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.ComboBox" ID="101727" RECT="90,298,130,318">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.PopupMenu" ID="101730" RECT="6,321,46,341">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.Progressbar" ID="101733" RECT="48,321,88,341">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.Slider" ID="101736" RECT="90,321,130,341">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.LittleArrows" ID="101739" RECT="6,344,46,364">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.Scrollbar" ID="101742" RECT="48,344,88,364">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.Image" ID="101745" RECT="90,344,130,364">
</CONTROL>
<CONTROL button="com.livecode.interface.classic.Player" ID="101748" RECT="6,367,46,387">
</CONTROL>
<CONTROL graphic="classic" ID="101682" RECT="6,200,130,201">
</CONTROL>

</CARD>

</STACK>
I see some errors, I don't have code for

Code: Select all

 <CONTROL group= 
control type... I thought that would be a main parent node like <STACK> / SUBSTACK and <CARD>, I was thinking it should be like

Code: Select all

<GROUP><CONTROL button="1"></CONTROL> <CONTROL button="2"></CONTROL> </GROUP">
I did add substacks though.
xAction
Posts: 285
Joined: Thu Sep 16, 2021 1:40 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by xAction »

Where is RTFText coming from?
<RTFTEXT>
{\rtf1\mac {\fonttbl{\f0\fnil \fcharset77 (Message);}}
{\colortbl;\red0\green0\blue0;\red64\green0\blue64;}
\pard \f0 \fs26 \cf2 Choice 1
\par \pard Choice 2
\par \pard Choice 3
}
</RTFTEXT>
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by OpenXTalkPaul »

xAction wrote: Tue Nov 23, 2021 1:07 am Where is RTFText coming from?
The RTFText property of a text container (in this case it's a colored list of choices)
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by OpenXTalkPaul »

Apparently Heizer Software (well known in early xTalk for making CompileIt! the xcmd/xfcn byte code compiler that used a superset of HyperTalk, pretty much 1989's 'Extension Builder') had a Windows 3 utility that would convert HyperCard stacks to an SGML (standard generalized markup language) based container format, that seems it was intended as a general xTalk/HyperMedia format (remember, the web wasn't even a thing back then). It was called Hypermedia Interchange File Format 'HIFF' (RiFF container formats were all the rage back then). It's only ever real world application of this format was in Heizer's ConvertIt! HyperCard to Toolbook (like Toolbook v.1.5, Win 16 bit version)/HyperCard to HyperNeWS (apparently it's another xTalk Engine that I'd never heard of that ran on SUN's NeWS Window System. I can't find an abandonware/archive download for it or I'd make a DosBox Win3 install to check it out the format for myself. Can't find much info about the specification, other than it's can wrap the ui and resources up in markup and then convert that into a format of a different system (Toolbook, or HyperNeWS, others?).

Wow that NeWS window system was entirely built with PostScript with extensions for interactivity! I sometimes forget that PostScript IS actually a programming language!
https://en.wikipedia.org/wiki/NeWS
https://www.tuhs.org/Usenet/comp.sys.su ... 02611.html
FourthWorld
Posts: 296
Joined: Sat Sep 11, 2021 4:37 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by FourthWorld »

A rather large chunk of my career was spent converting xTalk things from one format to another. The few others with a similar career pattern are among my friends. I am familiar with practical aspects of porting as actually done in the real world to a degree not easily found elsewhere among this planet's population.

I recap my relevant credentials here in the hope that my words may be read:

Interchange formats are easy to make, plentiful, and provide psychological comfort, but yield little practical value.

In an environment with limited resources (which, in this universe, is every project environment), a documented process for successfully building standalones is the highest priority, so high that without it nothing else can matter.

Without the engine, stack file are inert disk space.

If resources are not available for that, the second priority becomes the first: evangelizing this project's vision to attract the specific types of human resources capable of deep engine work.

Interchange formats speak to the past. The mind(s) needed will be focused on the future. Meet people where they are.
User avatar
OpenXTalkPaul
Posts: 1787
Joined: Sat Sep 11, 2021 4:19 pm
Contact:

Re: xTalk EVERYWHERE! Lets Make An "XTML"(?) Interchange STACK Format Standard!

Post by OpenXTalkPaul »

FourthWorld wrote: Fri Jan 21, 2022 3:55 pm A rather large chunk of my career was spent converting xTalk things from one format to another. The few others with a similar career pattern are among my friends. I am familiar with practical aspects of porting as actually done in the real world to a degree not easily found elsewhere among this planet's population.

I recap my relevant credentials here in the hope that my words may be read:

Interchange formats are easy to make, plentiful, and provide psychological comfort, but yield little practical value.

In an environment with limited resources (which, in this universe, is every project environment), a documented process for successfully building standalones is the highest priority, so high that without it nothing else can matter.

Without the engine, stack file are inert disk space.

If resources are not available for that, the second priority becomes the first: evangelizing this project's vision to attract the specific types of human resources capable of deep engine work.

Interchange formats speak to the past. The mind(s) needed will be focused on the future. Meet people where they are.
I understand you have a lot real-world experience with converting from one xTalk environment to another, it would be great if you could post any relevant information, like how to get a complete list of every function, command, property name, expression names, keywords, reserved words, etc. via script (I already have a script that does most, but not all of it).

Conversion from one file format to another is something I too have done a significant amount of throughout my career (as well as in the course of my hobbies ). In fact I'll currently be dealing with that task at the day job for the foreseeable future due to a major change by an essential proprietary software package. But that's good right? At a minimum it keeps people employed, creates jobs, careers even, as evidenced by us!

I haven't done much conversions of xTalk stack/script formats (I did 'port'/update a few of my own old HC stacks to LC), but various other file formats I've dealt with intimately for sure. MIDI I know just about every inch of the SMF file format, SoundFont & DLSI formats I know fairly well too. Sometimes I'm only interested in partially parsing files to extract data of interest. Handlers – that extracts any embedded images from any file – and similar functions I've made come to mind. Those scripts originated as part of my early-1990s attempt to create a "PreFlight" app, built as a HyperCard-engine based standalone app that used a TON of XCMD/XFCNs (HyperCard needed an XCMD just to read/write NULL bytes! But at least it COULD do that if you really wanted it to AND you scowered the AOL HyperCard forums for the right external to do it!). That PreFlight stack could extract EPS file(s) that were, extremely annoyingly at the time, embedded into an ALDUS Freehand file, in a way that certain OPI systems could not handle properly. Open PrePress Interface (OPI) was (apparently someone is still interested in OPI: https://stackoverflow.com/questions/602 ... resolution) a system that swapped low-resolution images for high-resolution images in PostScript streams as they were interpreted.

I believe you have mistakenly gotten the idea that my interest in file format details and various controls/layout mark-up specs are related only to things from the past (although xTalk history is a good thing to maintain IMO), but it's not at all my only motivation!

Most major creative applications have some sort of import/export to/from various other related formats, and there's a reason for that. The reason is to allow the user the freedom to do whatever they want/need to do with the content that they've generated. Many of these formats have used BOM-safe ASCII plain text formats for safe travels, and often it's some sort of XML based format, this includes MANY Development systems (Qt's QML, MS' UML, Apple's xib, etc.), and graphics layout applications (Indesign IDML, Scribdus, HTML). Which is great for making template systems, and as add-on packages. In contrast, I don't think there's even a way to easily get embedded sound files out of the stack from the IDE so that it can be edited in a sound editor app. In fact a quick check of the dictionary reveals that imageData (NOT SVG compiled 'image text', nor a widget's SVGPath data), currently is the ONLY data that can be exported from a stack file by the IDE.

Take my current usage use case, I want to redesign the tools palette, I wanted to see everything about the layout in a structured way. I pass the long ID of the "revTools" palette stack and I get back a markup of it which contains, depending on options I passed to it, a mark-up of various elements and properties of the entire stack file, complete with subStacks and background/groups linked up, scripts/linked behaviorScripts, SVGPath or imageData, all included if, and only if, the appropriate flags are passed to the exporter. I can then turn this XML into JSON or into a script Array for quick access from the IDE. Now I can do all sorts of things with that serialized data. I could for example, generate a basic representation of the just the basic UI layout and color properties for output to Qt QML markup for example, or examine just the script elements of specific object types for use in some dev / IDE utility... A parsing importer routine can do the same with this data, ignoring elements that it either doesn't understand or is otherwise not interested in.

Here's a (partially) theoretical example... Perhaps we have an add-on palette, maybe it gets download into the IDE from an online repository via an IDE package manager that decompresses the 7z compressed markup, and then use that to ephemerally recreate the orginal stack in memory within the IDE... This theoretical palette can list any color properties that are set on all objects related to 'this tack', or defaultStack, or topStack, allowing a layout designer to quickly edit all of the color properties without manually click on objects and then right-click-opening the property inspector and then mousing over to and clicking on the colors tab of that window, it's a bit ridiculous currently. Perhaps it this palette could also do the same for Text Style / Fonts, or other property types. Maybe this palette has a custom style sheets tab where you can save properties of selectedObects as a named style that can then be applied to other objects by clicking or dragging onto them, like a drawing or page layout application, ya know?

Anyway, again, it certainly is NOT all about the past for me, other than trying to learn from it. The past for OXT is the 'LCC Engine'. I'd argue that an interchangeable format is about moving forward FAR more than it is about the past. The LCC built Engine currently used by the OXT IDE, when you boil it down, is an xTalk scripting lexical parser/tokenizer that interprets syntax and, dynamically compiles it into executable bitcode on the fly, and it's not the only thing that can do that (in fact 'the Engine' is actually multiple Engines). The Engine is NOT the scripting language. I want to abstract and obscure away the Engine part, in a way similar to how introducing a Script-Only/behaviorScripts format abstracted away the binary data of GUI and Stack objects. And I want it to be in a format that I can view that layout structure in a text/code editor or version control system, the same reason LC did that for 'Stack' with Script-Only.

At any rate, this markup format idea is NOT a priority project goal so much as it is likely to be a result of me working on the IDE and thinking about all of it's MANY (IMO) shortcomings and about how I'd do a package management or a template and styles-sheets - like system.

But I'm all for attracting the sort of developers that can help with the engine as well. Perhaps using the xTalk environment to help develop things for other projects is a way to attract the attention it needs. I'm currently deeply interested in the helloSystem project, which currently uses copious amounts of Qt5 QML and Python. I could see OXT IDE being useful in creating QML and things for such a great fledgling project. I'm looking into creating an OXT AppImage to run the IDE on helloSystem (which is FreeBSD/GNUStep based but does have a Debian subsystem available for running *buntu apps). The HyperCardesque icon will look great on that Mac-like system :) .
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest