:Namespace wpfXamlDemo

⍝ === VARIABLES ===

    L←⎕av[3+⎕io]

    Copy_b64       ←'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAaVBMVEX///8AAAC2tra2tra2tra2trb////+/v62trb9/f309PT7+/vExMSurq6Hh4f4+Pj8/Pz5+fnMzMyenp6/zduoqKilpaXNzc2xsbHu7u6Li4vk5OTa2tro6Oj6+vrm5uaMjIympqby8vJPA9lJAAAABnRSTlMAAM8Q7zCjkYU+AAAAiklEQVR4XoXM2Q7CMAxE0bqAk+7s+/7/H4mJMGNXQdzXo5mCiKK2X01nlCpSkbXdspxk4VCLOHBvDvwbYPSWgxu/JQMn5rotMzA8L+d24wAFB+tvzEeFIGDr/0LlrjwEE2D+CxoZ4aoCLASQgau8mQAsb7hqFLp7L28mBSKKPJgS0AdcgO6xtQm8AN3LEZUq6MiXAAAAAElFTkSuQmCC'
    Cut_b64        ←'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADcElEQVRIiZ2VX2gcVRjFz52d3TYmWW+6q02y1m4bEPOiE6T+K8gWNArFtqB9EIRuUBGKsEbR1zYoiL5UH6uYrAF9KGpWTFFEmLRapW2M26ZNuq3JbksLppvsbqY7O3dm7p3xoV1N3K6Z8Xu6zJzv/L4z93IHruvCdV14rQ9GvqPvfZzJr6Wr+8qenW+VLAdV1+Fxz3pCiGfz9NHTBzva71CuF4veB/KsBLAuFExt3bQRpcXF274/MjFDHQcqce3nAcwBgOTVvKTbcTkg0c5IGIFAY+qvjs9SQqA6rquYptlWf+4ZsKE1WJAlgqBMIEurAeO/5GhAIurGjrBCHBvasjbnGwAAcoAgJEurEnx/6hKVCFE7I2Eleud6LBaL06+98GT1/wMC/yRQp/6gsgS1M9qu9G6+CzMX8zBqtfdX9fgBAAAhBCDAj5OXKEDUrmi70hOL4ufJWVy99mf67Zd3f75S7yuBLVxY3IELCVxAjdJW5f5778apbA7nc/Nfvp58duDfPb4AXLjQGUcbjSJC25StsSiOn57BuVw+nUru2nu7Hl8AZtoYV09C16vY0h3BT5OzOHthPr3/xZ0Nk/sGbNs/lVgoLiEoy1haKuHEb7OYvpBPp/Y1fpaV1bDJA99YCUc4KXaDUWPZOKaX9AzT2CFTNxNciqDGqgiG1mPu8rXMWy/t+k/zBsDe4VLS0IwRhztZUzepqZsJbvID3OYQtqh8rfL0A0907bmSPR+/OL1wzEtyqX6t9r+bp7Vy7ZBe0gePDHT0GctGH9MYrJoFYYosgC2/fvL4oBXePCR19QLAbk+A+oJVWVIv65VvU90fAoC2oFFWZbANO+sIZ8fvww9XAEBwMRFsaUEgFFJ6+g/v8Q7QGDXKBgDgoVcmqc3sMbtmZwUXO6Y+3Vap60afaymsaw2j95mnaezBvrH7dg7ne/oPx9cEWDWrYOpmXEmezHOL521mQ9ji78lXFrc4AKkS7o4Nhbs3UQAH1gRk04+kucXT3OQFYYmPzo4+1ndm9NEG8zrAEc7A+GDsoOtiEECiGWDVKTr3xfY1jx0AcJPj6Jv3ZADAFW4BAG2agBACP79N4GaCp96Zj9+EsX0AJpoCfDnfKmGJAjf52PY3zowwrZwE8Fkzre/rGgC4xYfMG9pI+XJOERYbmvvh1Uwz7V8tIZ5QE98wygAAAABJRU5ErkJggg=='
    HandCursor_b64 ←'AAACAAEAICAAAAgAAACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH8AAP//AAD//wAA/38AAP9/AAD/fwAA/38AAP9/AAD/fwAA/38AAP8AAAD/gIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAfwAA//8AAP//AAD/fwAA/38AAP9/AAD/fwAA/38AAP9/AAD/fwAA/wAAAP+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAAB/AAD//wAA//8AAP9/AAD/fwAA/38AAP9/AAD/fwAA/38AAP9/AAD/AAAA/4CAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH8AAP//AAD//wAA/38AAP9/AAD/fwAA/38AAP9/AAD/fwAA/38AAP8AAAD/gIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAfwAA//8AAP//AAD/fwAA/38AAP9/AAD/fwAA/38AAP9/AAD/fwAA/wAAAP+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAfwAA/38AAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/gIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAAB/f3//nM7//5zO//+czv//nM7//5zO//+czv//v7+//wAAAP+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH9/f/+czv//nM7//5zO//+czv//nM7//5zO//+/v7//AAAA/4CAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAAB/f3//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+/v7//AAAA/4CAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAf39//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//7+/v/8AAAD/gIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH9/f/+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//7+/v/8AAAD/gIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAf39//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//v7+//wAAAP+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH9/f/+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+/v7//AAAA/4CAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAf39//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+/v7//AAAA/4CAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH9/f/+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//7+/v/8AAAD/gIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAf39//5zO//+czv//v7+//7+/v/+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//v7+//wAAAP+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH9/f/+czv//nM7//7+/v/8AAAD/AAAA/5zO//+czv//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//+/v7//AAAA/4CAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAf39//5zO//+/v7//AAAA/4CAAAB/f3//nM7//5zO//+czv//nM7//5zO//+czv//nM7//5zO//9/f3//nM7//7+/v/8AAAD/gIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH9/f/+czv//v7+//wAAAP+AgAAAgIAAAH9/f/+czv//nM7//39/f/+czv//nM7//39/f/+czv//v7+//wAAAP+czv//v7+//wAAAP+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAf39//39/f/8AAAD/gIAAAICAAACAgAAAf39//5zO//+/v7//AAAA/5zO//+/v7//AAAA/5zO//+/v7//AAAA/5zO//+/v7//AAAA/4CAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAAB/f3//nM7//7+/v/8AAAD/nM7//7+/v/8AAAD/nM7//7+/v/8AAAD/f39//39/f/+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH9/f/+czv//v7+//wAAAP+czv//v7+//wAAAP+czv//v7+//wAAAP+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAf39//5zO//+/v7//AAAA/5zO//+/v7//AAAA/39/f/9/f3//gIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAAB/f3//nM7//7+/v/8AAAD/f39//39/f/+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH9/f/+czv//v7+//wAAAP+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAf39//5zO//+/v7//AAAA/4CAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAAB/f3//nM7//7+/v/8AAAD/gIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH9/f/+czv//v7+//wAAAP+AgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAH9/f/9/f3//gIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAAgIAAAICAAACAgAAA///////////+AD///gA///4AP//+AD///gA///8Af///AH///wB///4AP//8AD//+AAf//gAH//wAB//8AAP/+AAD//gAA//wAAP/8IAD/+GAA//jgAP//4AH//+AH///gD///4H///+H////h////4f///+H////z////////8='
    Paste_b64      ←'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAeFBMVEUAAAB7e3ucnJy1tbXOpUrOpVLOrVrnzpz39/f////OrWPn5+fOzs7WtWvWvXuEhITnzqXn1qWUlJRaWlq1nGO9zt6MjIyle0KlhDmljFqlpaXWrWOthEKtlFrW1tbexoTnzpS1hDG1lGOUc0KMYxjv7++9vb3GrXO+vRrUAAAAAXRSTlMAQObYZgAAAKNJREFUeF6NzVcOwyAQRVHTi3tL73X/OwzjeISxiZT7hXT0huRbCSVhV4hQSskDXhOo66pqCSFtp5QK4FwUDXTIiwCqPLfv7nbcbqScgXUxjDKGYAcwY2kGEgGdGZAlmJMGQZAeUpa9EKR04HumuwGkC6DHjFkBKADhYFI5ghBREFBwygPnkcVlz3kchiKn1ndoscCY0b4Z9Jj+a/H7j6aclnwANmEWNaPqN4UAAAAASUVORK5CYII='
    Print_b64      ←'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAEUUlEQVR4nN2UTWwUZRzGf/O+szPUlo8tRaGK3aQpmJZ+kTSGSEQ4GBCacOSi1AMHExPxYuJJTkajBxKPHkQ9eDKp0QQMdNMaE+SirXyUFmt2+6Ww3ZbZmd2d2feddzy0NqWCARIv/pM5TZ7n9/94ZuA/LutRBTcnJt/z/eCMMeac4ziDtm2Pdu5pz98Yn+iO43iLlAIhxOhzu3d5APZjNDVgjEEIMSClGLBtyeSt31ZeJcRxzNTU7xnAAxCP4vzr1esntdYZHcdYloVlWQghkNJGSokQAmPMYP+xV/J/ax5pgiAIBoQQkCQkK48xhjiOqdUijDHkcvnBtZqHvsH57y8ekFIOC0vgOClc1yWVSiGlJAxDlFLUauruoYMvptfqHmqCoexw9+07hQHHcZBSYtsS13URlkBrjUkMwhL4vn9uvfaBgKHscDdwGjgehuGWDa5LoVBgQ10dxhgcx0EIC8sSFO7cJt24FaVqZ9f7WOtMW4ABYKCmVCbwfRaXllBKUy6XKRYXqK+vx3VckiTBcV20VuzYvp1dbW3s3PkM1TDM+X4w3NvT9foqYHpm9q0oil6anp45Xir5eJ6HHwT3dBLHMeM3rmOMASBJEjKZDL29PfR0dxMEZcIopFypUiwu0n/0sLW6oiiKzm7etJGRkRGU0gghwFoezsTxKkQIidaK9vYO9u9/gaebmyn5PjOzcyilCIIyUa222sQqQGtNYaHIxMQEQghs2yaVSuE4y0lJpVIYY9i373n6+vpobGzEdR0Wi0t4XomS76OUwsSGxBiSJFkHUMtJmJuZftDNcRyHkydfxXUcUvZyNmqqhtYarRSxjjHGoNdMvApQSmESw+LCwn3NTRyDZXHh8nn2tu6lo70D25aoWg2tFErrFUBMHMdYQt4LiKIQkyREYfgP8w1aYycJSgqKO4vMl+dpDVuxpSSMIqIoQkU1dKxXvmpDKgWtLZk0ULMBqtUqxhha29qYyecRlQpNlQrpsIoWgtC28R2XzmIXT21/kkq5jLQl1UqFMAwJw5A4Xl7R3Nys9+MPI++u9FexAcrlytk41qe7enp5OdNMd2GYoaFFclVIgG2WRbHuCWZnZ3CcFA319UgpCYKAcjmgUikThqEeG/1ldCSbPQNcmMrn4tUV9fcfffvLDz+oO9VcOtXWOSjCux5dNyE/Ad8C15KEhqatWEDJ8/A2bkRKQcnz8P2AW5OTxeylix+XPO+TqXyufM+RkyQ5UK1W36n76I1XqB+E3R51P0OdDZtZ/p8fAuqbmriyaRMAxeICUgjm//hTDWez390cH39zKp+bv19ALIDWlow8fORI59Fjx17ryF3e/+ztq32c+wYzC5UE1IkTd97f0XxpbGxs85Z0utd1nMD3S6PXrl77dCqfu3Tf6K0FrK3WlkxLx549vae6uw62NzS0j6fT17++/NNXn33x+ZV/M3powBpQGtgGFKbyuaXHMf9/1F8Bcja9IXWf7wAAAABJRU5ErkJggg=='
    Quit_b64       ←'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHUSURBVEiJzZWxaxNhGMZ/z7VEQXBzbpYsDi5myx/g1II4FAwmNoMQOknXom2nDu7SxdxpjEPIH9CtOCd7ix3q3E2wbSr0dbjXWs19l5xa8IGDg+d9nh/fdx/fycy4TkVFhhPpWSy1rg1g8Bho/FNALN38E286QFIi1SPYzwnvJ1IdSYUAe9J8AgOga3AQCrvXTWCwJ83PBOhLc0fQBZaAVtPsQQjgXgtYOoJuX5qbCjiFFcGyYLVp1gmVX4F0BKuC5VNYyQX0pRKwbrDbMNuZVv5DDbMdg11g3TuyASewaLAAbM9afkXbBgsnsBgEAPeAs8/wsWi7Z868Iwi4Cxy+NLsI9LwV9LIMzxx6x6V+P1rfgBIBPTV7E/JcJe+41C8rEAyBynvp9pSiCXmm4h3ZAEtNnUO1KMAzsjxABCPgOIKtTWnmi3BTiiLY8uwoCHhi9hVoA7UyPJ8V4LM1oO0dP2VmE08MvRjGMaxtQJQ1Y2ZsQBTDms/2smYyL6gxtG+kr6/K8LAjvSjBsG72BdIPeg7VcrotNeDDOF35hJT3y0ykR8Br4A5gwCe3KoCAY6DdNBuEOnIBAO+kWxdwX1A1P12CocEwgtHEnhcF/K0K/ZP/S8B30crIq93trIsAAAAASUVORK5CYII='
    Settings_b64   ←'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'


    _←⍬
    _,←'<Window'
    _,←L,'   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"'
    _,←L,'   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">'
    _,←L,'</Window>'
    NewWindow←_

    _←⍬
    _,←'<Window'
    _,←L,'   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"'
    _,←L,'   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"'
    _,←L,'   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"'
    _,←L,'   Height="200"'
    _,←L,'   Width="250"'
    _,←L,'   Title="MainWindow"'
    _,←L,'   WindowStartupLocation="CenterScreen">'
    _,←L,'   <Grid>'
    _,←L,'      <Grid.RowDefinitions>'
    _,←L,'         <RowDefinition Height="0.5*"/>'
    _,←L,'         <RowDefinition Height="0.5*"/>'
    _,←L,'      </Grid.RowDefinitions>'
    _,←L,'      <TextBox'
    _,←L,'         x:Name="textBox1"'
    _,←L,'         Width="130"'
    _,←L,'         HorizontalAlignment="Center"'
    _,←L,'         VerticalAlignment="Center"'
    _,←L,'         Text="TextBox"'
    _,←L,'         TextAlignment="Center"/>'
    _,←L,'      <Button'
    _,←L,'         x:Name="button1"'
    _,←L,'         Height="40"'
    _,←L,'         Width="120"'
    _,←L,'         Grid.Row="1"'
    _,←L,'         HorizontalAlignment="Center"'
    _,←L,'         VerticalAlignment="Center"'
    _,←L,'         Content="Click Me !"/>'
    _,←L,'   </Grid>'
    _,←L,'</Window>'
    sample1←_

    _←⍬
    _,←'<Window'
    _,←L,'   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"'
    _,←L,'   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"'
    _,←L,'   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"'
    _,←L,'   x:Class="WpfApplication3.MainWindow"'
    _,←L,'   Height="200"'
    _,←L,'   Width="250"'
    _,←L,'   Title="MainWindow"'
    _,←L,'   WindowStartupLocation="CenterScreen">'
    _,←L,'   <Grid>'
    _,←L,'      <Grid.RowDefinitions>'
    _,←L,'         <RowDefinition Height="0.5*"/>'
    _,←L,'         <RowDefinition Height="0.5*"/>'
    _,←L,'      </Grid.RowDefinitions>'
    _,←L,'      <TextBox'
    _,←L,'         x:Name="textBox1"'
    _,←L,'         Width="130"'
    _,←L,'         HorizontalAlignment="Center"'
    _,←L,'         VerticalAlignment="Center"'
    _,←L,'         Text="TextBox"'
    _,←L,'         TextAlignment="Center"/>'
    _,←L,'      <Button'
    _,←L,'         x:Name="button1"'
    _,←L,'         Click="__Button_Click"'
    _,←L,'         Height="40"'
    _,←L,'         Width="120"'
    _,←L,'         Grid.Row="1"'
    _,←L,'         HorizontalAlignment="Center"'
    _,←L,'         VerticalAlignment="Center"'
    _,←L,'         Content="Click Me !"/>'
    _,←L,'   </Grid>'
    _,←L,'</Window>'
    sample2←_

    _←⍬
    _,←'<Window'
    _,←L,'  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"'
    _,←L,'  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"'
    _,←L,'  Width="640"'
    _,←L,'  Height="480"'
    _,←L,'  Title="PuttingItAllTogether"'
    _,←L,'  WindowStartupLocation="CenterScreen">'
    _,←L,'  <DockPanel Width="Auto" Height="Auto" LastChildFill="True">'
    _,←L,'    <!--Top Menu Area-->'
    _,←L,'    <Menu'
    _,←L,'      Width="Auto"'
    _,←L,'      Height="20"'
    _,←L,'      Background="#FFA9D1F4"'
    _,←L,'      DockPanel.Dock="Top">'
    _,←L,'      <!-- File Menu -->'
    _,←L,'      <MenuItem Header="_File">'
    _,←L,'        <MenuItem Header="_Cut" Name="mnuCut">'
    _,←L,'          <MenuItem.Icon>'
    _,←L,'            <Image Name="Cut_b64" Width="16" Height="16"/>'
    _,←L,'          </MenuItem.Icon>'
    _,←L,'        </MenuItem>'
    _,←L,'        <MenuItem Header="_Copy" Name="mnuCopy">'
    _,←L,'          <MenuItem.Icon>'
    _,←L,'            <Image Name="Copy_b64" Width="16" Height="16"/>'
    _,←L,'          </MenuItem.Icon>'
    _,←L,'        </MenuItem>'
    _,←L,'        <MenuItem Header="_Paste" Name="mnuPaste">'
    _,←L,'          <MenuItem.Icon>'
    _,←L,'            <Image Name="Paste_b64" Width="16" Height="16"/>'
    _,←L,'          </MenuItem.Icon>'
    _,←L,'        </MenuItem>'
    _,←L,'        <Separator/>'
    _,←L,'        <MenuItem Header="_Print" Name="mnuPrint">'
    _,←L,'          <MenuItem.Icon>'
    _,←L,'            <Image Name="Print_b64" Width="16" Height="16"/>'
    _,←L,'          </MenuItem.Icon>'
    _,←L,'        </MenuItem>'
    _,←L,'        <Separator/>'
    _,←L,'        <MenuItem Header="_Quit" Name="mnuQuit">'
    _,←L,'          <MenuItem.Icon>'
    _,←L,'            <Image Name="Quit_b64" Width="16" Height="16"/>'
    _,←L,'          </MenuItem.Icon>'
    _,←L,'        </MenuItem>'
    _,←L,'      </MenuItem>'
    _,←L,'      <!-- About Menu -->'
    _,←L,'      <MenuItem Header="_Help">'
    _,←L,'        <MenuItem Header="_About" Name="mnuAbout"/>'
    _,←L,'      </MenuItem>'
    _,←L,'    </Menu>'
    _,←L,'    <!--Bottom Status Bar area, declared before middle section,  '
    _,←L,'   as I want it to fill entire bottom of Window,  '
    _,←L,'   which it wouldn''t if there was a Left docked panel before it -->'
    _,←L,'    <StackPanel'
    _,←L,'      Width="Auto"'
    _,←L,'      Height="31"'
    _,←L,'      Background="#FFCAC5C5"'
    _,←L,'      DockPanel.Dock="Bottom"'
    _,←L,'      Orientation="Horizontal">'
    _,←L,'      <Label'
    _,←L,'        Name="lStatusBar"'
    _,←L,'        Width="200"'
    _,←L,'        Height="23"'
    _,←L,'        Content="Status Bar Message...."'
    _,←L,'        FontFamily="Arial"'
    _,←L,'        FontSize="12"/>'
    _,←L,'    </StackPanel>'
    _,←L,'    <!--Left Main Content area-->'
    _,←L,'    <StackPanel'
    _,←L,'      Name="buttonPanel"'
    _,←L,'      Width="136"'
    _,←L,'      Height="Auto"'
    _,←L,'      Background="White">'
    _,←L,'      <Button'
    _,←L,'        Name="btnButton1"'
    _,←L,'        Width="Auto"'
    _,←L,'        Height="26"'
    _,←L,'        Margin="5,5,5,5">'
    _,←L,'        <WrapPanel>'
    _,←L,'          <Image Name="Settings_b64" Height="16" Width="16"/>'
    _,←L,'          <TextBlock Text="Button1" Margin="5,0,0,0"/>'
    _,←L,'        </WrapPanel>'
    _,←L,'      </Button>'
    _,←L,'      <Button'
    _,←L,'        Name="btnButton2"'
    _,←L,'        Width="126"'
    _,←L,'        Height="26"'
    _,←L,'        Margin="5,5,5,5"'
    _,←L,'        Content="Button2"/>'
    _,←L,'      <Button'
    _,←L,'        Name="btnButton3"'
    _,←L,'        Width="126"'
    _,←L,'        Height="26"'
    _,←L,'        Margin="5,5,5,5"'
    _,←L,'        Content="Button3"/>'
    _,←L,'    </StackPanel>'
    _,←L,'    <!--Right Main Content area, NOTE HOW this Grid is the last child'
    _,←L,'    so takes all the remaining room -->'
    _,←L,'    <Grid Width="Auto" Height="Auto" Background="#FFCC9393">'
    _,←L,'      <Grid.ColumnDefinitions>'
    _,←L,'        <ColumnDefinition Width="*"/>'
    _,←L,'        <ColumnDefinition Width="*"/>'
    _,←L,'      </Grid.ColumnDefinitions>'
    _,←L,'      <Grid.RowDefinitions>'
    _,←L,'        <RowDefinition Height="*"/>'
    _,←L,'        <RowDefinition Height="*"/>'
    _,←L,'      </Grid.RowDefinitions>'
    _,←L,'      <Rectangle'
    _,←L,'        Grid.Column="0"'
    _,←L,'        Grid.Row="0"'
    _,←L,'        Margin="10,10,10,10"'
    _,←L,'        Fill="Aqua"/>'
    _,←L,'      <Rectangle'
    _,←L,'        Grid.Column="1"'
    _,←L,'        Grid.Row="0"'
    _,←L,'        Margin="10,10,10,10"'
    _,←L,'        Fill="Aqua"/>'
    _,←L,'      <Rectangle'
    _,←L,'        Grid.Column="0"'
    _,←L,'        Grid.Row="1"'
    _,←L,'        Margin="10,10,10,10"'
    _,←L,'        Fill="Aqua"/>'
    _,←L,'      <Rectangle'
    _,←L,'        Grid.Column="1"'
    _,←L,'        Grid.Row="1"'
    _,←L,'        Margin="10,10,10,10"'
    _,←L,'        Fill="Aqua"/>'
    _,←L,'    </Grid>'
    _,←L,'  </DockPanel>'
    _,←L,'</Window>'
    sample3←_

    ⎕ex¨ 'L' '_'

⍝ === End of variables definition ===

    (⎕IO ⎕ML ⎕WX)←1 3 3

    ∇ cursor←CursorFromBase64String base64String;imageBytes;MS;⎕USING
     ⍝ Convert a Base64String to a cursor.
     
      ⎕USING←'System.IO,mscorlib.dll' 'System,mscorlib.dll' 'System.Windows,WPF/PresentationCore.dll'
     
     ⍝ Convert Base64 String to byte[]
      imageBytes←Convert.FromBase64String(⊂base64String)
     
     ⍝ Create a new MemoryStream with the byte[]
      MS←⎕NEW MemoryStream(⊂imageBytes)
     
     ⍝ Create the icon
      cursor←⎕NEW Input.Cursor MS
     
     ⍝ Erase the MemoryStream
      MS.Close ⋄ MS.Dispose ⋄ MS←⎕NULL
    ∇

    ∇ DemoSample3;imgNames
     
     ⍝ Parse the xaml of the variable sample3
      win←FixSimpleXaml sample3
     
      ⍝ Get the names of all the 'Image' object that has been fixed in rootObj
      imgNames←{((⊂'Image')≡¨(⍵.⍎¨(⍵.⎕NL-9)).GetType.Name)/(⍵.⎕NL-9)}win
     
     ⍝ Set the Source of all the 'Image'. Each 'Image' must have a Base64 variable of the same name.
      win{(⍺.⍎⍵).Source←ImageFromBase64String⍎⍵}¨imgNames
     
     ⍝ Fix manually the Icon of the main window.
      win.Icon←ImageFromBase64String Settings_b64
     
     ⍝ Fix manually the Cursor of the main window.
      win.Cursor←CursorFromBase64String HandCursor_b64
     
     ⍝ Set Routed Events on the whole Window for ClickEvent when a MenuItem or a Button are clicked.
      ⎕USING←'System.Windows,WPF/PresentationCore.dll' 'System.Windows.Controls.Primitives,WPF/PresentationFramework.dll'
      win.AddHandler(Controls.MenuItem.ClickEvent)(⎕NEW RoutedEventHandler(⎕OR'__EventHandler'))
      win.AddHandler(ButtonBase.ClickEvent)(⎕NEW RoutedEventHandler(⎕OR'__EventHandler'))
     
     ⍝ Show the window.
      win.Show
    ∇

    ∇ base64String←FileToBase64String fileName;bytes;⎕USING
     ⍝ Converts a file to a Base64 String.
     
      ⎕USING←'System,mscorlib.dll'
     
     ⍝ Read the file
      bytes←IO.File.ReadAllBytes(⊂,fileName)
     
     ⍝ Convert to a Base64 string
      base64String←Convert.ToBase64String(⊂bytes)
    ∇

    ∇ rootObj←FixSimpleXaml xamlString;names;⎕USING
     ⍝ Parse simple and correctly formed Xaml that contains only names to fix (no events).
     ⍝ Each named element(s) object will be attached to rootObject.
     ⍝ You can see the list of attached elements by doing rootObject.⎕NL -9
     ⍝ It is recommended to do not name the root object in the xaml (to prevent a recursive call).
     ⍝ For 3rd party dll, ⎕USING must be properly initiated before calling this function.
     ⍝ For Xaml with event callbacks and error trapping see the function: FixXaml.
     ⍝
     ⍝ xamlString = Vector of Characters representing a XAML string
     ⍝ rootObj    = WPF Root Element Object if no error
     ⍝            = ⎕NULL if error
     
      :Trap 0
     
        ⍝ Parse the simple Xaml and obtain the root element object:
          ⎕USING←'System.Windows.Markup,WPF/PresentationFramework.dll'
          rootObj←XamlReader.Parse(⊂xamlString)
     
        ⍝ Extract the names beginning with 'x:Name' or 'Name'
          names←{{(,⊃0≠⍴¨⍵)/⍵}{1⊃(((⍵[;1]∊⊂'x:Name')∨(⍵[;1]∊⊂'Name'))/⍵[;2]),⊂''}¨(⎕XML ⍵)[;4]}xamlString
     
        ⍝ Assign the value of each names to the root object:
          :If 0≠⍴names
              rootObj{⍎'⍺.',⍵,'←⍺.FindName(⊂,⍵)'}¨names
          :Else
              ⍝ Do nothing, there is no names.
          :End
     
      :Else
        ⍝ There is an error.
          rootObj←⎕NULL
     
      :EndTrap
    ∇

    ∇ rootObj←FixXaml xamlString;attribs;caller;data;err;event;events;expr;inter;name;names;ref;⎕USING
     ⍝ Creates a WPF Object From an APL Character Vector Representing XAML.
     ⍝ Each named element(s) object will be attached to rootObject.
     ⍝ You can see the list of attached elements by doing rootObject.⎕NL -9
     ⍝ The callback functions of events must begin with '__' (ex.: Click="__Button_Click")
     ⍝ For 3rd party dll, ⎕USING must be properly initiated before calling this function.
     ⍝ If there is an error parsing the Xaml, the function will return ⎕NULL with an explanation of the error.
     ⍝ Parts of code is taken from Dyalog.
     ⍝
     ⍝ xamlString = Vector of Characters representing a XAML string
     ⍝ rootObj    = WPF Root Element Object if no error
     ⍝            = ⎕NULL (explanation of error) if error
     ⍝
     ⍝ If an Element has an event attribute that begins with '__' and is named, it will be fixed.
     ⍝ If an Element has an event attribute that begins with '__' and is not named, it will not be fixed and make a warning.
     ⍝ If an Element has an event attribute that does not begins with '__', it will make an error and return a ⎕NULL rootObj.
     ⍝ Function of an event attribute must be defined in the WS otherwise it will not be fixed and make a warning.
     ⍝ Root element with an event must be named, otherwise it is recommended to be nameless.
     ⍝ Root element name is removed in all cases. Use the rootObj variable directly to access its properties/methods.
     
      :Trap 0
         ⍝ Check if Valid XML
         ⍝ The following line will bug with an explanation if there is a syntax error in xamlString.
          ⎕USING←'System.Xml,System.Xml.dll'
          (⎕NEW XmlDocument).LoadXml(⊂xamlString)
     
         ⍝ The string is valid XML. Clean-it before 'compiling'.
          data←⎕XML xamlString                                               ⍝ Convert the characters to APL representation of Xml
          attribs←data[;4]                                                   ⍝ Attributes of all the nodes
          names←{1⊃(((⍵[;1]∊⊂'x:Name')∨(⍵[;1]∊⊂'Name'))/⍵[;2]),⊂''}¨attribs  ⍝ Find all 'x:Name' and 'Name' attributes
          events←⊃⍪/names{(⊂⍺),((⊂'__')≡¨2↑¨⊃¨⍵[;2])⌿⍵}¨attribs              ⍝ Events are all attributes with values beginning with '__'
          data[;4]←{(~(⊂'__')≡¨2↑¨⊃¨⍵[;2])⌿⍵}¨attribs                        ⍝ Remove the events: attribute definition beginning with '__'
          data[1;4]←⊂{(~(⊂'x:Class')≡¨7↑¨⊃¨⍵[;1])⌿⍵}⊃data[1;4]               ⍝ Remove the x:Class attribute if present in first node
          xamlString←⎕XML data                                               ⍝ Convert the APL representation of Xml to characters
      :Else
         ⍝ There is an Error. Exit.
          →ERROR
     
      :EndTrap
     
     ⍝ Obtain the Root Element Object of the clean-up XAML String.
     ⍝ You can get an error here if, for example, there is an event that does not begin with '__' and was not remove in Xaml Clean-up.
      :Trap 0
          ⎕USING←'System.Windows.Markup,WPF/PresentationFramework.dll'
          rootObj←XamlReader.Parse(⊂xamlString)
     
        ⍝ ↓↓↓ Alternative way of doing the same thing.
        ⍝ ⎕USING ← '' 'System.IO' 'System.Xml,system.xml.dll' 'System.Windows,WPF/PresentationFramework.dll' 'System.Windows.Markup'
        ⍝ rootObj ← XamlReader.Load ⎕NEW XmlTextReader (⎕NEW StringReader (⊂xamlString))
     
          rootObj.∆Events←events  ⍝ Optional: List the events in the property ∆Events
      :Else
         ⍝ There is an error. Exit.
          →ERROR
     
      :EndTrap
     
     ⍝ Fix the events of the rootObj before removing its name:
     ⍝ Will bug if the rootObj does not have a name.
      :Trap 0
          :If 1∊events[;1]∊⊂rootObj.Name                                    ⍝ Check if the rootObj has an event
              :For (ref event expr) :In ↓(events[;1]∊⊂rootObj.Name)⌿events  ⍝ Loop through the events
                  caller←(1⊃⎕NSI),'.'                                       ⍝ Namespace that is calling this function
                  expr←((~'#'∊expr)/caller),expr                            ⍝ Add the namespace of the caller to the name of the event
                  ⍎'rootObj.on',event,'←''',expr,''''                       ⍝ Hook-up the event
              :EndFor
          :EndIf
      :Else
         ⍝ Do nothing. rootObj does not have a name or events to fix.
     
      :EndTrap
     
     ⍝ Create refs to all named child objects
      :Trap 0
          names←(,⊃0≠⍴¨names)/names                  ⍝ Keep only the not empty names
          names←(0=rootObj.⎕NC↑names)/names          ⍝ Only names which do not already have a meaning
          names←(~names∊⊂rootObj.Name)/names         ⍝ Remove the name of the rootObj to prevent a recursive entry.
          events←(~events[;1]∊⊂rootObj.Name)⌿events  ⍝ Remove the event(s) of the rootObj from the list now that they have been fixed.
      :Else
         ⍝ Do nothing. The previous 2 lines will bug if rootObj does not have a name.
     
      :EndTrap
     
     ⍝ Add a reference of all the named object to the rootObj.
     ⍝ FindName will not find the names on certain object (like template),
     ⍝  so we need to iterate and Trap the error when the name is not found.
      :For name :In names
          :Trap 0
              ⍎'rootObj.(',name,')←rootObj.FindName ⊂name'
     
          :Else
              ⎕←'FixXaml Warning - Name Not found: ',name
     
          :EndTrap
      :EndFor
     
     ⍝ Show a Warning for Events that begins with '__' that will not be fixed because they are nameless:
      :If 0≠↑⍴inter←(~events[;1]∊names)⌿events
          ⎕←(⎕UCS 13),'FixXaml Warning - Following Nameless Event(s) Are Not Fixed:'
          ⎕←inter
      :End
     
     ⍝ Hook-up events
      events←(events[;1]∊names)⌿events ⍝ Named objects only
      caller←(1⊃⎕NSI),'.'              ⍝ Namespace that is calling this function
     
      :For (ref event expr) :In ↓events
          :Trap 0
            ⍝ Add the namespace of the caller to the name of the event
              expr←((~'#'∊expr)/caller),expr
     
              :If 0≠⎕NC expr
                ⍝ Callback function exist. Hook-up the event.
                  ⍎'rootObj.',ref,'.on',event,'←''',expr,''''
              :Else
                ⍝ Callback function does not exist. Show warning and do not fix the event.
                  ⎕←'FixXaml Warning - Function ',expr,' does not exist. The Event ''',event,''' of ''',ref,''' is not fixed.'
              :End
     
          :Else
            ⍝ There is an error. Exit.
              →ERROR
     
          :EndTrap
      :EndFor
     
      →0  ⍝ rootObj is returned here if there is no error.
     
     ERROR:
      ⍝ Build the Error Message
      :If 90≠⎕EN
         ⍝ APL Error
          err←(1⊃⎕DM),': ',{(' '=1↑⍵)↓((1↓a,0)∨a←' '≠⍵)/⍵}(2⊃⎕DM),(⎕UCS 13)
     
      :Else
         ⍝ .Net Error
          :Trap 0
            ⍝ Show the value of ⎕EXCEPTION.Message if not ⎕NULL.
              err←('EXCEPTION: ',⎕EXCEPTION.Message),(⎕UCS 13)
          :Else
            ⍝ Sometimes ⎕EXCEPTION is (NULL) and will bug here.
              err←'Exception (NULL): Unknown error',(⎕UCS 13)
     
          :EndTrap
     
      :End
     
      rootObj←⎕NULL err
    ∇

    ∇ winParent←GetWindowParent object
     ⍝ Obtain the Windows Parent (Root Object) of a children's element.
     
      winParent←object
     
      :While 'System.Windows.Window'≢winParent.GetType.ToString
          winParent←winParent.Parent
      :EndWhile
    ∇

    ∇ bmpimg←ImageFromBase64String base64String;imageBytes;MS;⎕USING
     ⍝ Convert a Base64String to a System.Windows.Media.Imaging.WriteableBitmap
     
      ⎕USING←'System.IO,mscorlib.dll' 'System,mscorlib.dll' 'System.Windows.Media.Imaging,WPF/PresentationCore.dll'
     
     ⍝ Convert Base64 String to byte[] as numbers.
      imageBytes←Convert.FromBase64String(⊂base64String)
     
     ⍝ Create a new MemoryStream with the byte[]
      MS←⎕NEW MemoryStream(⊂imageBytes)
     
     ⍝ Create a BitmapImage Object from the Memory Stream
      bmpimg←⎕NEW BitmapImage
      bmpimg.BeginInit
      bmpimg.StreamSource←MS
      bmpimg.EndInit
     
     ⍝ Create a WriteableBitmap that does not need the MemoryStream to persist
     ⍝ That way it is possible to erase the MemoryStream after creating the Image
      bmpimg←⎕NEW WriteableBitmap bmpimg
     
     ⍝ Erase the MemoryStream
      MS.Close ⋄ MS.Dispose ⋄ MS←⎕NULL
    ∇

    ∇ __Button_Click(sender event);rootObject;⎕USING
     ⍝ Click Event Handler for the Button
     
     ⍝ Get the Root Object from the Button object (sender)
      rootObject←GetWindowParent sender
     
     ⍝ Assign the new text to the TextBox.
      rootObject.textBox1.Text←'I Was Clicked !'
     
     ⍝ Change some colors of the TextBox
      ⎕USING←'System.Windows.Media,WPF/PresentationCore.dll' 'System.Windows,WPF/PresentationFramework.dll'
      rootObject.textBox1.Background←⎕NEW SolidColorBrush(Colors.Yellow)
      rootObject.textBox1.BorderBrush←⎕NEW SolidColorBrush(Colors.Red)
      rootObject.textBox1.BorderThickness←⎕NEW Thickness 3
    ∇

    ∇ rootObj←ScrubAndFix xamlString;err;names;nodeNumber;reader;stringReader;writer;⎕USING
    ⍝ Function to remove the Class and Events elements of Xaml and fix the resulting Xaml.
    ⍝ Each named element(s) object will be attached to rootObject.
    ⍝ Root element name is removed in all cases. Use the rootObj directly to access its properties/methods.
    ⍝ This function is most usefull when experimenting with Xaml taken directly from the Web but is slower than FixXaml.
    ⍝ Inspired from the code of XAMLPAD2009.
    ⍝
    ⍝ XamlString = Vector of Characters representing a XAML string
    ⍝ rootObj    = WPF Root Element Object if no error
    ⍝            = ⎕NULL (explanation of error) if error
     
      :Trap 0
     
          ⎕USING←'System.IO' 'System.Windows.Markup,WPF/PresentationFramework.dll' 'System.Xaml,System.Xaml.dll'
          stringReader←⎕NEW StringReader(⊂xamlString)
          reader←⎕NEW XamlXmlReader(stringReader XamlReader.GetWpfSchemaContext)
          writer←⎕NEW XamlObjectWriter(reader.SchemaContext)
     
          ⎕USING←0⍴⊂''
          names←''         ⍝ Initial value of the names to fix.
          nodeNumber←0     ⍝ Initial value of the node number.
     
          :While reader.Read
     
              :If 'StartObject'≡⍕reader.NodeType
                ⍝ Will increment of 1 each time a new node (with a new object) begins.
                  nodeNumber+←1
              :End
     
              :If 'StartMember'≡⍕reader.NodeType
              :AndIf reader.Member.Name≡'Class'
                  {}reader.Read
                  {}reader.Read
     
              :ElseIf 'StartMember'≡⍕reader.NodeType
              :AndIf reader.Member.IsEvent
                  {}reader.Read
                  {}reader.Read
     
              :ElseIf 'StartMember'≡⍕reader.NodeType
              :AndIf reader.Member.Name≡'Name'
                  writer.WriteNode(reader)
                  {}reader.Read
                  writer.WriteNode(reader)
     
                ⍝ Check if reader is on first node
                  :If 1≠nodeNumber
                    ⍝ reader is not on first node. Keep the name.
                      names,←⊂reader.Value
                  :Else
                    ⍝ reader is on first node. Don't keep the name.
                  :End
     
                  {}reader.Read
                  writer.WriteNode(reader)
     
              :Else
                  writer.WriteNode(reader)
     
              :End
     
          :EndWhile
     
          rootObj←writer.Result
     
         ⍝ Assign the value of each names found to the root object:
          :If 0≠⍴names
              rootObj{⍎'⍺.',⍵,'←⍺.FindName(⊂,⍵)'}¨names
          :Else
             ⍝ Do nothing, there is no names.
          :End
     
      :Else
        ⍝ Build the Error Message
          :If 90≠⎕EN
            ⍝ APL Error
              err←(1⊃⎕DM),': ',{(' '=1↑⍵)↓((1↓a,0)∨a←' '≠⍵)/⍵}(2⊃⎕DM),(⎕UCS 13)
     
          :Else
             ⍝ .Net Error
              :Trap 0
                ⍝ Show the value of ⎕EXCEPTION.Message if not ⎕NULL.
                  err←('EXCEPTION: ',⎕EXCEPTION.Message),(⎕UCS 13)
              :Else
                ⍝ Sometimes ⎕EXCEPTION is (NULL) and will bug here.
                  err←'Exception (NULL): Unknown error',(⎕UCS 13)
     
              :EndTrap
     
          :End
     
          rootObj←⎕NULL err
     
      :EndTrap
    ∇

    ∇ __EventHandler(sender event);name
     ⍝ Single Event Handler for the Window
     
     ⍝ Get name of the control that was clicked
      name←event.Source.Name
     
     ⍝ sender is the Root Object in this case because
     ⍝ the routed event was attached to it.
      sender.lStatusBar.Content←'I Was Clicked: ',name
     
     ⍝ Select the code to be executed:
      :Select name
      :Case 'mnuCut'
     
      :Case 'mnuCopy'
     
      :Case 'mnuPaste'
     
      :Case 'mnuPrint'
     
      :Case 'mnuQuit'
     
      :Case 'mnuAbout'
     
      :Case 'btnButton1'
     
      :Case 'btnButton2'
     
      :Case 'btnButton3'
     
      :Else
          'Error: Unknow Name'
      :EndSelect
    ∇

:EndNamespace